ETH Price: $3,475.24 (+0.69%)

Contract

0xA57E126B341B18c262aD25B86bb4F65b5e2AdE45
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Set Approval For...144751932022-03-28 14:28:12998 days ago1648477692IN
0xA57E126B...b5e2AdE45
0 ETH0.0014382856.76830696
Set Approval For...144751352022-03-28 14:16:35998 days ago1648476995IN
0xA57E126B...b5e2AdE45
0 ETH0.0034777572.97777293

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
LANDRegistry

Compiler Version
v0.4.24+commit.e67f0147

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-07-17
*/

pragma solidity ^0.4.24;

// File: contracts/upgradable/ProxyStorage.sol

contract ProxyStorage {

  /**
   * Current contract to which we are proxing
   */
  address public currentContract;
  address public proxyOwner;
}

// File: contracts/upgradable/OwnableStorage.sol

contract OwnableStorage {

  address public owner;

  constructor() internal {
    owner = msg.sender;
  }

}

// File: erc821/contracts/AssetRegistryStorage.sol

contract AssetRegistryStorage {

  string internal _name;
  string internal _symbol;
  string internal _description;

  /**
   * Stores the total count of assets managed by this registry
   */
  uint256 internal _count;

  /**
   * Stores an array of assets owned by a given account
   */
  mapping(address => uint256[]) internal _assetsOf;

  /**
   * Stores the current holder of an asset
   */
  mapping(uint256 => address) internal _holderOf;

  /**
   * Stores the index of an asset in the `_assetsOf` array of its holder
   */
  mapping(uint256 => uint256) internal _indexOfAsset;

  /**
   * Stores the data associated with an asset
   */
  mapping(uint256 => string) internal _assetData;

  /**
   * For a given account, for a given operator, store whether that operator is
   * allowed to transfer and modify assets on behalf of them.
   */
  mapping(address => mapping(address => bool)) internal _operators;

  /**
   * Approval array
   */
  mapping(uint256 => address) internal _approval;
}

// File: contracts/estate/IEstateRegistry.sol

contract IEstateRegistry {
  function mint(address to, string metadata) external returns (uint256);
  function ownerOf(uint256 _tokenId) public view returns (address _owner); // from ERC721

  // Events

  event CreateEstate(
    address indexed _owner,
    uint256 indexed _estateId,
    string _data
  );

  event AddLand(
    uint256 indexed _estateId,
    uint256 indexed _landId
  );

  event RemoveLand(
    uint256 indexed _estateId,
    uint256 indexed _landId,
    address indexed _destinatary
  );

  event Update(
    uint256 indexed _assetId,
    address indexed _holder,
    address indexed _operator,
    string _data
  );

  event UpdateOperator(
    uint256 indexed _estateId,
    address indexed _operator
  );

  event UpdateManager(
    address indexed _owner,
    address indexed _operator,
    address indexed _caller,
    bool _approved
  );

  event SetLANDRegistry(
    address indexed _registry
  );

  event SetEstateLandBalanceToken(
    address indexed _previousEstateLandBalance,
    address indexed _newEstateLandBalance
  );
}

// File: contracts/minimeToken/IMinimeToken.sol

interface IMiniMeToken {
////////////////
// Generate and destroy tokens
////////////////

    /// @notice Generates `_amount` tokens that are assigned to `_owner`
    /// @param _owner The address that will be assigned the new tokens
    /// @param _amount The quantity of tokens generated
    /// @return True if the tokens are generated correctly
    function generateTokens(address _owner, uint _amount) external returns (bool);


    /// @notice Burns `_amount` tokens from `_owner`
    /// @param _owner The address that will lose the tokens
    /// @param _amount The quantity of tokens to burn
    /// @return True if the tokens are burned correctly
    function destroyTokens(address _owner, uint _amount) external returns (bool);

    /// @param _owner The address that's balance is being requested
    /// @return The balance of `_owner` at the current block
    function balanceOf(address _owner) external view returns (uint256 balance);

    event Transfer(address indexed _from, address indexed _to, uint256 _amount);
}

// File: contracts/land/LANDStorage.sol

contract LANDStorage {
  mapping (address => uint) public latestPing;

  uint256 constant clearLow = 0xffffffffffffffffffffffffffffffff00000000000000000000000000000000;
  uint256 constant clearHigh = 0x00000000000000000000000000000000ffffffffffffffffffffffffffffffff;
  uint256 constant factor = 0x100000000000000000000000000000000;

  mapping (address => bool) internal _deprecated_authorizedDeploy;

  mapping (uint256 => address) public updateOperator;

  IEstateRegistry public estateRegistry;

  mapping (address => bool) public authorizedDeploy;

  mapping(address => mapping(address => bool)) public updateManager;

  // Land balance minime token
  IMiniMeToken public landBalance;

  // Registered balance accounts
  mapping(address => bool) public registeredBalance;
}

// File: contracts/Storage.sol

contract Storage is ProxyStorage, OwnableStorage, AssetRegistryStorage, LANDStorage {
}

// File: contracts/upgradable/Ownable.sol

contract Ownable is Storage {

  event OwnerUpdate(address _prevOwner, address _newOwner);

  modifier onlyOwner {
    assert(msg.sender == owner);
    _;
  }

  function transferOwnership(address _newOwner) public onlyOwner {
    require(_newOwner != owner, "Cannot transfer to yourself");
    owner = _newOwner;
  }
}

// File: contracts/upgradable/IApplication.sol

contract IApplication {
  function initialize(bytes data) public;
}

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

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

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

    c = _a * _b;
    assert(c / _a == _b);
    return c;
  }

  /**
  * @dev Integer division of two numbers, truncating the quotient.
  */
  function div(uint256 _a, uint256 _b) internal pure returns (uint256) {
    // assert(_b > 0); // Solidity automatically throws when dividing by 0
    // uint256 c = _a / _b;
    // assert(_a == _b * c + _a % _b); // There is no case in which this doesn't hold
    return _a / _b;
  }

  /**
  * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
  */
  function sub(uint256 _a, uint256 _b) internal pure returns (uint256) {
    assert(_b <= _a);
    return _a - _b;
  }

  /**
  * @dev Adds two numbers, throws on overflow.
  */
  function add(uint256 _a, uint256 _b) internal pure returns (uint256 c) {
    c = _a + _b;
    assert(c >= _a);
    return c;
  }
}

// File: erc821/contracts/IERC721Base.sol

interface IERC721Base {
  function totalSupply() external view returns (uint256);

  // function exists(uint256 assetId) external view returns (bool);
  function ownerOf(uint256 assetId) external view returns (address);

  function balanceOf(address holder) external view returns (uint256);

  function safeTransferFrom(address from, address to, uint256 assetId) external;
  function safeTransferFrom(address from, address to, uint256 assetId, bytes userData) external;

  function transferFrom(address from, address to, uint256 assetId) external;

  function approve(address operator, uint256 assetId) external;
  function setApprovalForAll(address operator, bool authorized) external;

  function getApprovedAddress(uint256 assetId) external view returns (address);
  function isApprovedForAll(address assetHolder, address operator) external view returns (bool);

  function isAuthorized(address operator, uint256 assetId) external view returns (bool);

  /**
  * @dev Deprecated transfer event. Now we use the standard with three parameters
  * It is only used in the ABI to get old transfer events. Do not remove
  */
  event Transfer(
    address indexed from,
    address indexed to,
    uint256 indexed assetId,
    address operator,
    bytes userData,
    bytes operatorData
  );
  /**
   * @dev Deprecated transfer event. Now we use the standard with three parameters
   * It is only used in the ABI to get old transfer events. Do not remove
   */
  event Transfer(
    address indexed from,
    address indexed to,
    uint256 indexed assetId,
    address operator,
    bytes userData
  );
  event Transfer(
    address indexed from,
    address indexed to,
    uint256 indexed assetId
  );
  event ApprovalForAll(
    address indexed holder,
    address indexed operator,
    bool authorized
  );
  event Approval(
    address indexed owner,
    address indexed operator,
    uint256 indexed assetId
  );
}

// File: erc821/contracts/IERC721Receiver.sol

interface IERC721Receiver {
  function onERC721Received(
    address _operator,
    address _from,
    uint256 _tokenId,
    bytes   _userData
  ) external returns (bytes4);
}

// File: erc821/contracts/ERC165.sol

interface ERC165 {
  function supportsInterface(bytes4 interfaceID) external view returns (bool);
}

// File: erc821/contracts/ERC721Base.sol

contract ERC721Base is AssetRegistryStorage, IERC721Base, ERC165 {
  using SafeMath for uint256;

  // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
  bytes4 private constant ERC721_RECEIVED = 0x150b7a02;

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

  bytes4 private constant Old_InterfaceId_ERC721 = 0x7c0633c6;
  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)'))
   */

  //
  // Global Getters
  //

  /**
   * @dev Gets the total amount of assets stored by the contract
   * @return uint256 representing the total amount of assets
   */
  function totalSupply() external view returns (uint256) {
    return _totalSupply();
  }
  function _totalSupply() internal view returns (uint256) {
    return _count;
  }

  //
  // Asset-centric getter functions
  //

  /**
   * @dev Queries what address owns an asset. This method does not throw.
   * In order to check if the asset exists, use the `exists` function or check if the
   * return value of this call is `0`.
   * @return uint256 the assetId
   */
  function ownerOf(uint256 assetId) external view returns (address) {
    return _ownerOf(assetId);
  }
  function _ownerOf(uint256 assetId) internal view returns (address) {
    return _holderOf[assetId];
  }

  //
  // Holder-centric getter functions
  //
  /**
   * @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) external view returns (uint256) {
    return _balanceOf(owner);
  }
  function _balanceOf(address owner) internal view returns (uint256) {
    return _assetsOf[owner].length;
  }

  //
  // Authorization getters
  //

  /**
   * @dev Query whether an address has been authorized to move any assets on behalf of someone else
   * @param operator the address that might be authorized
   * @param assetHolder the address that provided the authorization
   * @return bool true if the operator has been authorized to move any assets
   */
  function isApprovedForAll(address assetHolder, address operator)
    external view returns (bool)
  {
    return _isApprovedForAll(assetHolder, operator);
  }
  function _isApprovedForAll(address assetHolder, address operator)
    internal view returns (bool)
  {
    return _operators[assetHolder][operator];
  }

  /**
   * @dev Query what address has been particularly authorized to move an asset
   * @param assetId the asset to be queried for
   * @return bool true if the asset has been approved by the holder
   */
  function getApproved(uint256 assetId) external view returns (address) {
    return _getApprovedAddress(assetId);
  }
  function getApprovedAddress(uint256 assetId) external view returns (address) {
    return _getApprovedAddress(assetId);
  }
  function _getApprovedAddress(uint256 assetId) internal view returns (address) {
    return _approval[assetId];
  }

  /**
   * @dev Query if an operator can move an asset.
   * @param operator the address that might be authorized
   * @param assetId the asset that has been `approved` for transfer
   * @return bool true if the asset has been approved by the holder
   */
  function isAuthorized(address operator, uint256 assetId) external view returns (bool) {
    return _isAuthorized(operator, assetId);
  }
  function _isAuthorized(address operator, uint256 assetId) internal view returns (bool)
  {
    require(operator != 0);
    address owner = _ownerOf(assetId);
    if (operator == owner) {
      return true;
    }
    return _isApprovedForAll(owner, operator) || _getApprovedAddress(assetId) == operator;
  }

  //
  // Authorization
  //

  /**
   * @dev Authorize a third party operator to manage (send) msg.sender's asset
   * @param operator address to be approved
   * @param authorized bool set to true to authorize, false to withdraw authorization
   */
  function setApprovalForAll(address operator, bool authorized) external {
    return _setApprovalForAll(operator, authorized);
  }
  function _setApprovalForAll(address operator, bool authorized) internal {
    if (authorized) {
      require(!_isApprovedForAll(msg.sender, operator));
      _addAuthorization(operator, msg.sender);
    } else {
      require(_isApprovedForAll(msg.sender, operator));
      _clearAuthorization(operator, msg.sender);
    }
    emit ApprovalForAll(msg.sender, operator, authorized);
  }

  /**
   * @dev Authorize a third party operator to manage one particular asset
   * @param operator address to be approved
   * @param assetId asset to approve
   */
  function approve(address operator, uint256 assetId) external {
    address holder = _ownerOf(assetId);
    require(msg.sender == holder || _isApprovedForAll(msg.sender, holder));
    require(operator != holder);

    if (_getApprovedAddress(assetId) != operator) {
      _approval[assetId] = operator;
      emit Approval(holder, operator, assetId);
    }
  }

  function _addAuthorization(address operator, address holder) private {
    _operators[holder][operator] = true;
  }

  function _clearAuthorization(address operator, address holder) private {
    _operators[holder][operator] = false;
  }

  //
  // Internal Operations
  //

  function _addAssetTo(address to, uint256 assetId) internal {
    _holderOf[assetId] = to;

    uint256 length = _balanceOf(to);

    _assetsOf[to].push(assetId);

    _indexOfAsset[assetId] = length;

    _count = _count.add(1);
  }

  function _removeAssetFrom(address from, uint256 assetId) internal {
    uint256 assetIndex = _indexOfAsset[assetId];
    uint256 lastAssetIndex = _balanceOf(from).sub(1);
    uint256 lastAssetId = _assetsOf[from][lastAssetIndex];

    _holderOf[assetId] = 0;

    // Insert the last asset into the position previously occupied by the asset to be removed
    _assetsOf[from][assetIndex] = lastAssetId;

    // Resize the array
    _assetsOf[from][lastAssetIndex] = 0;
    _assetsOf[from].length--;

    // Remove the array if no more assets are owned to prevent pollution
    if (_assetsOf[from].length == 0) {
      delete _assetsOf[from];
    }

    // Update the index of positions for the asset
    _indexOfAsset[assetId] = 0;
    _indexOfAsset[lastAssetId] = assetIndex;

    _count = _count.sub(1);
  }

  function _clearApproval(address holder, uint256 assetId) internal {
    if (_ownerOf(assetId) == holder && _approval[assetId] != 0) {
      _approval[assetId] = 0;
      emit Approval(holder, 0, assetId);
    }
  }

  //
  // Supply-altering functions
  //

  function _generate(uint256 assetId, address beneficiary) internal {
    require(_holderOf[assetId] == 0);

    _addAssetTo(beneficiary, assetId);

    emit Transfer(0, beneficiary, assetId);
  }

  function _destroy(uint256 assetId) internal {
    address holder = _holderOf[assetId];
    require(holder != 0);

    _removeAssetFrom(holder, assetId);

    emit Transfer(holder, 0, assetId);
  }

  //
  // Transaction related operations
  //

  modifier onlyHolder(uint256 assetId) {
    require(_ownerOf(assetId) == msg.sender);
    _;
  }

  modifier onlyAuthorized(uint256 assetId) {
    require(_isAuthorized(msg.sender, assetId));
    _;
  }

  modifier isCurrentOwner(address from, uint256 assetId) {
    require(_ownerOf(assetId) == from);
    _;
  }

  modifier isDestinataryDefined(address destinatary) {
    require(destinatary != 0);
    _;
  }

  modifier destinataryIsNotHolder(uint256 assetId, address to) {
    require(_ownerOf(assetId) != to);
    _;
  }

  /**
   * @dev Alias of `safeTransferFrom(from, to, assetId, '')`
   *
   * @param from address that currently owns an asset
   * @param to address to receive the ownership of the asset
   * @param assetId uint256 ID of the asset to be transferred
   */
  function safeTransferFrom(address from, address to, uint256 assetId) external {
    return _doTransferFrom(from, to, assetId, '', true);
  }

  /**
   * @dev Securely transfers the ownership of a given asset from one address to
   * another address, calling the method `onNFTReceived` on the target address if
   * there's code associated with it
   *
   * @param from address that currently owns an asset
   * @param to address to receive the ownership of the asset
   * @param assetId uint256 ID of the asset to be transferred
   * @param userData bytes arbitrary user information to attach to this transfer
   */
  function safeTransferFrom(address from, address to, uint256 assetId, bytes userData) external {
    return _doTransferFrom(from, to, assetId, userData, true);
  }

  /**
   * @dev Transfers the ownership of a given asset from one address to another address
   * Warning! This function does not attempt to verify that the target address can send
   * tokens.
   *
   * @param from address sending the asset
   * @param to address to receive the ownership of the asset
   * @param assetId uint256 ID of the asset to be transferred
   */
  function transferFrom(address from, address to, uint256 assetId) external {
    return _doTransferFrom(from, to, assetId, '', false);
  }

  function _doTransferFrom(
    address from,
    address to,
    uint256 assetId,
    bytes userData,
    bool doCheck
  )
    onlyAuthorized(assetId)
    internal
  {
    _moveToken(from, to, assetId, userData, doCheck);
  }

  function _moveToken(
    address from,
    address to,
    uint256 assetId,
    bytes userData,
    bool doCheck
  )
    isDestinataryDefined(to)
    destinataryIsNotHolder(assetId, to)
    isCurrentOwner(from, assetId)
    private
  {
    address holder = _holderOf[assetId];
    _clearApproval(holder, assetId);
    _removeAssetFrom(holder, assetId);
    _addAssetTo(to, assetId);
    emit Transfer(holder, to, assetId);

    if (doCheck && _isContract(to)) {
      // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))
      require(
        IERC721Receiver(to).onERC721Received(
          msg.sender, holder, assetId, userData
        ) == ERC721_RECEIVED
      );
    }
  }

  /**
   * Internal function that moves an asset from one holder to another
   */

  /**
   * @dev Returns `true` if the contract implements `interfaceID` and `interfaceID` is not 0xffffffff, `false` otherwise
   * @param  _interfaceID The interface identifier, as specified in ERC-165
   */
  function supportsInterface(bytes4 _interfaceID) external view returns (bool) {

    if (_interfaceID == 0xffffffff) {
      return false;
    }
    return _interfaceID == InterfaceId_ERC165 || _interfaceID == Old_InterfaceId_ERC721 || _interfaceID == InterfaceId_ERC721;
  }

  //
  // Utilities
  //

  function _isContract(address addr) internal view returns (bool) {
    uint size;
    assembly { size := extcodesize(addr) }
    return size > 0;
  }
}

// File: erc821/contracts/IERC721Enumerable.sol

contract IERC721Enumerable {

  /**
   * @notice Enumerate active tokens
   * @dev Throws if `index` >= `totalSupply()`, otherwise SHALL NOT throw.
   * @param index A counter less than `totalSupply()`
   * @return The identifier for the `index`th asset, (sort order not
   *  specified)
   */
  // TODO (eordano): Not implemented
  // function tokenByIndex(uint256 index) public view returns (uint256 _assetId);

  /**
   * @notice Count of owners which own at least one asset
   *  Must not throw.
   * @return A count of the number of owners which own asset
   */
  // TODO (eordano): Not implemented
  // function countOfOwners() public view returns (uint256 _count);

  /**
   * @notice Enumerate owners
   * @dev Throws if `index` >= `countOfOwners()`, otherwise must not throw.
   * @param index A counter less than `countOfOwners()`
   * @return The address of the `index`th owner (sort order not specified)
   */
  // TODO (eordano): Not implemented
  // function ownerByIndex(uint256 index) public view returns (address owner);

  /**
   * @notice Get all tokens of a given address
   * @dev This is not intended to be used on-chain
   * @param owner address of the owner to query
   * @return a list of all assetIds of a user
   */
  function tokensOf(address owner) external view returns (uint256[]);

  /**
   * @notice Enumerate tokens assigned to an owner
   * @dev Throws if `index` >= `balanceOf(owner)` or if
   *  `owner` is the zero address, representing invalid assets.
   *  Otherwise this must not throw.
   * @param owner An address where we are interested in assets owned by them
   * @param index A counter less than `balanceOf(owner)`
   * @return The identifier for the `index`th asset assigned to `owner`,
   *   (sort order not specified)
   */
  function tokenOfOwnerByIndex(
    address owner, uint256 index
  ) external view returns (uint256 tokenId);
}

// File: erc821/contracts/ERC721Enumerable.sol

contract ERC721Enumerable is AssetRegistryStorage, IERC721Enumerable {

  /**
   * @notice Get all tokens of a given address
   * @dev This is not intended to be used on-chain
   * @param owner address of the owner to query
   * @return a list of all assetIds of a user
   */
  function tokensOf(address owner) external view returns (uint256[]) {
    return _assetsOf[owner];
  }

  /**
   * @notice Enumerate tokens assigned to an owner
   * @dev Throws if `index` >= `balanceOf(owner)` or if
   *  `owner` is the zero address, representing invalid assets.
   *  Otherwise this must not throw.
   * @param owner An address where we are interested in assets owned by them
   * @param index A counter less than `balanceOf(owner)`
   * @return The identifier for the `index`th asset assigned to `owner`,
   *   (sort order not specified)
   */
  function tokenOfOwnerByIndex(
    address owner, uint256 index
  )
    external
    view
    returns (uint256 assetId)
  {
    require(index < _assetsOf[owner].length);
    require(index < (1<<127));
    return _assetsOf[owner][index];
  }

}

// File: erc821/contracts/IERC721Metadata.sol

contract IERC721Metadata {

  /**
   * @notice A descriptive name for a collection of NFTs in this contract
   */
  function name() external view returns (string);

  /**
   * @notice An abbreviated name for NFTs in this contract
   */
  function symbol() external view returns (string);

  /**
   * @notice A description of what this DAR is used for
   */
  function description() external view returns (string);

  /**
   * Stores arbitrary info about a token
   */
  function tokenMetadata(uint256 assetId) external view returns (string);
}

// File: erc821/contracts/ERC721Metadata.sol

contract ERC721Metadata is AssetRegistryStorage, IERC721Metadata {
  function name() external view returns (string) {
    return _name;
  }
  function symbol() external view returns (string) {
    return _symbol;
  }
  function description() external view returns (string) {
    return _description;
  }
  function tokenMetadata(uint256 assetId) external view returns (string) {
    return _assetData[assetId];
  }
  function _update(uint256 assetId, string data) internal {
    _assetData[assetId] = data;
  }
}

// File: erc821/contracts/FullAssetRegistry.sol

contract FullAssetRegistry is ERC721Base, ERC721Enumerable, ERC721Metadata {
  constructor() public {
  }

  /**
   * @dev Method to check if an asset identified by the given id exists under this DAR.
   * @return uint256 the assetId
   */
  function exists(uint256 assetId) external view returns (bool) {
    return _exists(assetId);
  }
  function _exists(uint256 assetId) internal view returns (bool) {
    return _holderOf[assetId] != 0;
  }

  function decimals() external pure returns (uint256) {
    return 0;
  }
}

// File: contracts/land/ILANDRegistry.sol

interface ILANDRegistry {

  // LAND can be assigned by the owner
  function assignNewParcel(int x, int y, address beneficiary) external;
  function assignMultipleParcels(int[] x, int[] y, address beneficiary) external;

  // After one year, LAND can be claimed from an inactive public key
  function ping() external;

  // LAND-centric getters
  function encodeTokenId(int x, int y) external pure returns (uint256);
  function decodeTokenId(uint value) external pure returns (int, int);
  function exists(int x, int y) external view returns (bool);
  function ownerOfLand(int x, int y) external view returns (address);
  function ownerOfLandMany(int[] x, int[] y) external view returns (address[]);
  function landOf(address owner) external view returns (int[], int[]);
  function landData(int x, int y) external view returns (string);

  // Transfer LAND
  function transferLand(int x, int y, address to) external;
  function transferManyLand(int[] x, int[] y, address to) external;

  // Update LAND
  function updateLandData(int x, int y, string data) external;
  function updateManyLandData(int[] x, int[] y, string data) external;

  // Authorize an updateManager to manage parcel data
  function setUpdateManager(address _owner, address _operator, bool _approved) external;

  // Events

  event Update(
    uint256 indexed assetId,
    address indexed holder,
    address indexed operator,
    string data
  );

  event UpdateOperator(
    uint256 indexed assetId,
    address indexed operator
  );

  event UpdateManager(
    address indexed _owner,
    address indexed _operator,
    address indexed _caller,
    bool _approved
  );

  event DeployAuthorized(
    address indexed _caller,
    address indexed _deployer
  );

  event DeployForbidden(
    address indexed _caller,
    address indexed _deployer
  );

  event SetLandBalanceToken(
    address indexed _previousLandBalance,
    address indexed _newLandBalance
  );
}

// File: contracts/metadata/IMetadataHolder.sol

contract IMetadataHolder is ERC165 {
  function getMetadata(uint256 /* assetId */) external view returns (string);
}

// File: contracts/land/LANDRegistry.sol

/* solium-disable function-order */
contract LANDRegistry is Storage, Ownable, FullAssetRegistry, ILANDRegistry {
  bytes4 constant public GET_METADATA = bytes4(keccak256("getMetadata(uint256)"));

  function initialize(bytes) external {
    _name = "Decentraland LAND";
    _symbol = "LAND";
    _description = "Contract that stores the Decentraland LAND registry";
  }

  modifier onlyProxyOwner() {
    require(msg.sender == proxyOwner, "This function can only be called by the proxy owner");
    _;
  }

  modifier onlyDeployer() {
    require(
      msg.sender == proxyOwner || authorizedDeploy[msg.sender],
      "This function can only be called by an authorized deployer"
    );
    _;
  }

  modifier onlyOwnerOf(uint256 assetId) {
    require(
      msg.sender == _ownerOf(assetId),
      "This function can only be called by the owner of the asset"
    );
    _;
  }

  modifier onlyUpdateAuthorized(uint256 tokenId) {
    require(
      msg.sender == _ownerOf(tokenId) ||
      _isAuthorized(msg.sender, tokenId) ||
      _isUpdateAuthorized(msg.sender, tokenId),
      "msg.sender is not authorized to update"
    );
    _;
  }

  modifier canSetUpdateOperator(uint256 tokenId) {
    address owner = _ownerOf(tokenId);
    require(
      _isAuthorized(msg.sender, tokenId) || updateManager[owner][msg.sender],
      "unauthorized user"
    );
    _;
  }

  //
  // Authorization
  //

  function isUpdateAuthorized(address operator, uint256 assetId) external view returns (bool) {
    return _isUpdateAuthorized(operator, assetId);
  }

  function _isUpdateAuthorized(address operator, uint256 assetId) internal view returns (bool) {
    address owner = _ownerOf(assetId);

    return owner == operator  ||
      updateOperator[assetId] == operator ||
      updateManager[owner][operator];
  }

  function authorizeDeploy(address beneficiary) external onlyProxyOwner {
    require(beneficiary != address(0), "invalid address");
    require(authorizedDeploy[beneficiary] == false, "address is already authorized");

    authorizedDeploy[beneficiary] = true;
    emit DeployAuthorized(msg.sender, beneficiary);
  }

  function forbidDeploy(address beneficiary) external onlyProxyOwner {
    require(beneficiary != address(0), "invalid address");
    require(authorizedDeploy[beneficiary], "address is already forbidden");

    authorizedDeploy[beneficiary] = false;
    emit DeployForbidden(msg.sender, beneficiary);
  }

  //
  // LAND Create
  //

  function assignNewParcel(int x, int y, address beneficiary) external onlyDeployer {
    _generate(_encodeTokenId(x, y), beneficiary);
    _updateLandBalance(address(0), beneficiary);
  }

  function assignMultipleParcels(int[] x, int[] y, address beneficiary) external onlyDeployer {
    for (uint i = 0; i < x.length; i++) {
      _generate(_encodeTokenId(x[i], y[i]), beneficiary);
      _updateLandBalance(address(0), beneficiary);
    }
  }

  //
  // Inactive keys after 1 year lose ownership
  //

  function ping() external {
    // solium-disable-next-line security/no-block-members
    latestPing[msg.sender] = block.timestamp;
  }

  function setLatestToNow(address user) external {
    require(msg.sender == proxyOwner || _isApprovedForAll(msg.sender, user), "Unauthorized user");
    // solium-disable-next-line security/no-block-members
    latestPing[user] = block.timestamp;
  }

  //
  // LAND Getters
  //

  function encodeTokenId(int x, int y) external pure returns (uint) {
    return _encodeTokenId(x, y);
  }

  function _encodeTokenId(int x, int y) internal pure returns (uint result) {
    require(
      -1000000 < x && x < 1000000 && -1000000 < y && y < 1000000,
      "The coordinates should be inside bounds"
    );
    return _unsafeEncodeTokenId(x, y);
  }

  function _unsafeEncodeTokenId(int x, int y) internal pure returns (uint) {
    return ((uint(x) * factor) & clearLow) | (uint(y) & clearHigh);
  }

  function decodeTokenId(uint value) external pure returns (int, int) {
    return _decodeTokenId(value);
  }

  function _unsafeDecodeTokenId(uint value) internal pure returns (int x, int y) {
    x = expandNegative128BitCast((value & clearLow) >> 128);
    y = expandNegative128BitCast(value & clearHigh);
  }

  function _decodeTokenId(uint value) internal pure returns (int x, int y) {
    (x, y) = _unsafeDecodeTokenId(value);
    require(
      -1000000 < x && x < 1000000 && -1000000 < y && y < 1000000,
      "The coordinates should be inside bounds"
    );
  }

  function expandNegative128BitCast(uint value) internal pure returns (int) {
    if (value & (1<<127) != 0) {
      return int(value | clearLow);
    }
    return int(value);
  }

  function exists(int x, int y) external view returns (bool) {
    return _exists(x, y);
  }

  function _exists(int x, int y) internal view returns (bool) {
    return _exists(_encodeTokenId(x, y));
  }

  function ownerOfLand(int x, int y) external view returns (address) {
    return _ownerOfLand(x, y);
  }

  function _ownerOfLand(int x, int y) internal view returns (address) {
    return _ownerOf(_encodeTokenId(x, y));
  }

  function ownerOfLandMany(int[] x, int[] y) external view returns (address[]) {
    require(x.length > 0, "You should supply at least one coordinate");
    require(x.length == y.length, "The coordinates should have the same length");

    address[] memory addrs = new address[](x.length);
    for (uint i = 0; i < x.length; i++) {
      addrs[i] = _ownerOfLand(x[i], y[i]);
    }

    return addrs;
  }

  function landOf(address owner) external view returns (int[], int[]) {
    uint256 len = _assetsOf[owner].length;
    int[] memory x = new int[](len);
    int[] memory y = new int[](len);

    int assetX;
    int assetY;
    for (uint i = 0; i < len; i++) {
      (assetX, assetY) = _decodeTokenId(_assetsOf[owner][i]);
      x[i] = assetX;
      y[i] = assetY;
    }

    return (x, y);
  }

  function tokenMetadata(uint256 assetId) external view returns (string) {
    return _tokenMetadata(assetId);
  }

  function _tokenMetadata(uint256 assetId) internal view returns (string) {
    address _owner = _ownerOf(assetId);
    if (_isContract(_owner) && _owner != address(estateRegistry)) {
      if ((ERC165(_owner)).supportsInterface(GET_METADATA)) {
        return IMetadataHolder(_owner).getMetadata(assetId);
      }
    }
    return _assetData[assetId];
  }

  function landData(int x, int y) external view returns (string) {
    return _tokenMetadata(_encodeTokenId(x, y));
  }

  //
  // LAND Transfer
  //

  function transferFrom(address from, address to, uint256 assetId) external {
    require(to != address(estateRegistry), "EstateRegistry unsafe transfers are not allowed");
    return _doTransferFrom(
      from,
      to,
      assetId,
      "",
      false
    );
  }

  function transferLand(int x, int y, address to) external {
    uint256 tokenId = _encodeTokenId(x, y);
    _doTransferFrom(
      _ownerOf(tokenId),
      to,
      tokenId,
      "",
      true
    );
  }

  function transferManyLand(int[] x, int[] y, address to) external {
    require(x.length > 0, "You should supply at least one coordinate");
    require(x.length == y.length, "The coordinates should have the same length");

    for (uint i = 0; i < x.length; i++) {
      uint256 tokenId = _encodeTokenId(x[i], y[i]);
      _doTransferFrom(
        _ownerOf(tokenId),
        to,
        tokenId,
        "",
        true
      );
    }
  }

  function transferLandToEstate(int x, int y, uint256 estateId) external {
    require(
      estateRegistry.ownerOf(estateId) == msg.sender,
      "You must own the Estate you want to transfer to"
    );

    uint256 tokenId = _encodeTokenId(x, y);
    _doTransferFrom(
      _ownerOf(tokenId),
      address(estateRegistry),
      tokenId,
      toBytes(estateId),
      true
    );
  }

  function transferManyLandToEstate(int[] x, int[] y, uint256 estateId) external {
    require(x.length > 0, "You should supply at least one coordinate");
    require(x.length == y.length, "The coordinates should have the same length");
    require(
      estateRegistry.ownerOf(estateId) == msg.sender,
      "You must own the Estate you want to transfer to"
    );

    for (uint i = 0; i < x.length; i++) {
      uint256 tokenId = _encodeTokenId(x[i], y[i]);
      _doTransferFrom(
        _ownerOf(tokenId),
        address(estateRegistry),
        tokenId,
        toBytes(estateId),
        true
      );
    }
  }

  /**
   * @notice Set LAND updateOperator
   * @param assetId - LAND id
   * @param operator - address of the account to be set as the updateOperator
   */
  function setUpdateOperator(
    uint256 assetId,
    address operator
  )
    public
    canSetUpdateOperator(assetId)
  {
    updateOperator[assetId] = operator;
    emit UpdateOperator(assetId, operator);
  }

  /**
   * @notice Set many LAND updateOperator
   * @param _assetIds - LAND ids
   * @param _operator - address of the account to be set as the updateOperator
   */
  function setManyUpdateOperator(
    uint256[] _assetIds,
    address _operator
  )
    public
  {
    for (uint i = 0; i < _assetIds.length; i++) {
      setUpdateOperator(_assetIds[i], _operator);
    }
  }

  /**
  * @dev Set an updateManager for an account
  * @param _owner - address of the account to set the updateManager
  * @param _operator - address of the account to be set as the updateManager
  * @param _approved - bool whether the address will be approved or not
  */
  function setUpdateManager(address _owner, address _operator, bool _approved) external {
    require(_operator != msg.sender, "The operator should be different from owner");
    require(
      _owner == msg.sender ||
      _isApprovedForAll(_owner, msg.sender),
      "Unauthorized user"
    );

    updateManager[_owner][_operator] = _approved;

    emit UpdateManager(
      _owner,
      _operator,
      msg.sender,
      _approved
    );
  }

  //
  // Estate generation
  //

  event EstateRegistrySet(address indexed registry);

  function setEstateRegistry(address registry) external onlyProxyOwner {
    estateRegistry = IEstateRegistry(registry);
    emit EstateRegistrySet(registry);
  }

  function createEstate(int[] x, int[] y, address beneficiary) external returns (uint256) {
    // solium-disable-next-line arg-overflow
    return _createEstate(x, y, beneficiary, "");
  }

  function createEstateWithMetadata(
    int[] x,
    int[] y,
    address beneficiary,
    string metadata
  )
    external
    returns (uint256)
  {
    // solium-disable-next-line arg-overflow
    return _createEstate(x, y, beneficiary, metadata);
  }

  function _createEstate(
    int[] x,
    int[] y,
    address beneficiary,
    string metadata
  )
    internal
    returns (uint256)
  {
    require(x.length > 0, "You should supply at least one coordinate");
    require(x.length == y.length, "The coordinates should have the same length");
    require(address(estateRegistry) != 0, "The Estate registry should be set");

    uint256 estateTokenId = estateRegistry.mint(beneficiary, metadata);
    bytes memory estateTokenIdBytes = toBytes(estateTokenId);

    for (uint i = 0; i < x.length; i++) {
      uint256 tokenId = _encodeTokenId(x[i], y[i]);
      _doTransferFrom(
        _ownerOf(tokenId),
        address(estateRegistry),
        tokenId,
        estateTokenIdBytes,
        true
      );
    }

    return estateTokenId;
  }

  function toBytes(uint256 x) internal pure returns (bytes b) {
    b = new bytes(32);
    // solium-disable-next-line security/no-inline-assembly
    assembly { mstore(add(b, 32), x) }
  }

  //
  // LAND Update
  //

  function updateLandData(
    int x,
    int y,
    string data
  )
    external
  {
    return _updateLandData(x, y, data);
  }

  function _updateLandData(
    int x,
    int y,
    string data
  )
    internal
    onlyUpdateAuthorized(_encodeTokenId(x, y))
  {
    uint256 assetId = _encodeTokenId(x, y);
    address owner = _holderOf[assetId];

    _update(assetId, data);

    emit Update(
      assetId,
      owner,
      msg.sender,
      data
    );
  }

  function updateManyLandData(int[] x, int[] y, string data) external {
    require(x.length > 0, "You should supply at least one coordinate");
    require(x.length == y.length, "The coordinates should have the same length");
    for (uint i = 0; i < x.length; i++) {
      _updateLandData(x[i], y[i], data);
    }
  }

  /**
   * @dev Set a new land balance minime token
   * @notice Set new land balance token: `_newLandBalance`
   * @param _newLandBalance address of the new land balance token
   */
  function setLandBalanceToken(address _newLandBalance) onlyProxyOwner external {
    require(_newLandBalance != address(0), "New landBalance should not be zero address");
    emit SetLandBalanceToken(landBalance, _newLandBalance);
    landBalance = IMiniMeToken(_newLandBalance);
  }

   /**
   * @dev Register an account balance
   * @notice Register land Balance
   */
  function registerBalance() external {
    require(!registeredBalance[msg.sender], "Register Balance::The user is already registered");

    // Get balance of the sender
    uint256 currentBalance = landBalance.balanceOf(msg.sender);
    if (currentBalance > 0) {
      require(
        landBalance.destroyTokens(msg.sender, currentBalance),
        "Register Balance::Could not destroy tokens"
      );
    }

    // Set balance as registered
    registeredBalance[msg.sender] = true;

    // Get LAND balance
    uint256 newBalance = _balanceOf(msg.sender);

    // Generate Tokens
    require(
      landBalance.generateTokens(msg.sender, newBalance),
      "Register Balance::Could not generate tokens"
    );
  }

  /**
   * @dev Unregister an account balance
   * @notice Unregister land Balance
   */
  function unregisterBalance() external {
    require(registeredBalance[msg.sender], "Unregister Balance::The user not registered");

    // Set balance as unregistered
    registeredBalance[msg.sender] = false;

    // Get balance
    uint256 currentBalance = landBalance.balanceOf(msg.sender);

    // Destroy Tokens
    require(
      landBalance.destroyTokens(msg.sender, currentBalance),
      "Unregister Balance::Could not destroy tokens"
    );
  }

  function _doTransferFrom(
    address from,
    address to,
    uint256 assetId,
    bytes userData,
    bool doCheck
  )
    internal
  {
    updateOperator[assetId] = address(0);
    _updateLandBalance(from, to);
    super._doTransferFrom(
      from,
      to,
      assetId,
      userData,
      doCheck
    );
  }

  function _isContract(address addr) internal view returns (bool) {
    uint size;
    // solium-disable-next-line security/no-inline-assembly
    assembly { size := extcodesize(addr) }
    return size > 0;
  }

  /**
   * @dev Update account balances
   * @param _from account
   * @param _to account
   */
  function _updateLandBalance(address _from, address _to) internal {
    if (registeredBalance[_from]) {
      landBalance.destroyTokens(_from, 1);
    }

    if (registeredBalance[_to]) {
      landBalance.generateTokens(_to, 1);
    }
  }
}

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":"proxyOwner","outputs":[{"name":"","type":"address"}],"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":"","type":"address"},{"name":"","type":"address"}],"name":"updateManager","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"assetId","type":"uint256"}],"name":"getApproved","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"operator","type":"address"},{"name":"assetId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"x","type":"int256"},{"name":"y","type":"int256"}],"name":"ownerOfLand","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"user","type":"address"}],"name":"setLatestToNow","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unregisterBalance","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"x","type":"int256"},{"name":"y","type":"int256"},{"name":"beneficiary","type":"address"}],"name":"assignNewParcel","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"x","type":"int256[]"},{"name":"y","type":"int256[]"}],"name":"ownerOfLandMany","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"latestPing","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"x","type":"int256[]"},{"name":"y","type":"int256[]"},{"name":"data","type":"string"}],"name":"updateManyLandData","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"assetId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"operator","type":"address"},{"name":"assetId","type":"uint256"}],"name":"isAuthorized","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"authorizedDeploy","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"name":"assetId","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"beneficiary","type":"address"}],"name":"authorizeDeploy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"x","type":"int256"},{"name":"y","type":"int256"},{"name":"to","type":"address"}],"name":"transferLand","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"assetId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"","type":"bytes"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"x","type":"int256"},{"name":"y","type":"int256"}],"name":"landData","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"x","type":"int256[]"},{"name":"y","type":"int256[]"},{"name":"to","type":"address"}],"name":"transferManyLand","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"assetId","type":"uint256"}],"name":"exists","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"}],"name":"tokensOf","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"ping","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"registeredBalance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newLandBalance","type":"address"}],"name":"setLandBalanceToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"assetId","type":"uint256"}],"name":"ownerOf","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"GET_METADATA","outputs":[{"name":"","type":"bytes4"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"operator","type":"address"},{"name":"assetId","type":"uint256"}],"name":"isUpdateAuthorized","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"assetId","type":"uint256"}],"name":"tokenMetadata","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"x","type":"int256"},{"name":"y","type":"int256"}],"name":"encodeTokenId","outputs":[{"name":"","type":"uint256"}],"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":true,"inputs":[],"name":"currentContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_assetIds","type":"uint256[]"},{"name":"_operator","type":"address"}],"name":"setManyUpdateOperator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"description","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"value","type":"uint256"}],"name":"decodeTokenId","outputs":[{"name":"","type":"int256"},{"name":"","type":"int256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"landBalance","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"x","type":"int256[]"},{"name":"y","type":"int256[]"},{"name":"beneficiary","type":"address"}],"name":"assignMultipleParcels","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"x","type":"int256[]"},{"name":"y","type":"int256[]"},{"name":"beneficiary","type":"address"},{"name":"metadata","type":"string"}],"name":"createEstateWithMetadata","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"}],"name":"landOf","outputs":[{"name":"","type":"int256[]"},{"name":"","type":"int256[]"}],"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":"registry","type":"address"}],"name":"setEstateRegistry","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"updateOperator","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"operator","type":"address"},{"name":"authorized","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"x","type":"int256"},{"name":"y","type":"int256"}],"name":"exists","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"assetId","type":"uint256"},{"name":"operator","type":"address"}],"name":"setUpdateOperator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"from","type":"address"},{"name":"to","type":"address"},{"name":"assetId","type":"uint256"},{"name":"userData","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"registerBalance","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"x","type":"int256[]"},{"name":"y","type":"int256[]"},{"name":"beneficiary","type":"address"}],"name":"createEstate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"x","type":"int256"},{"name":"y","type":"int256"},{"name":"data","type":"string"}],"name":"updateLandData","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"estateRegistry","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"assetHolder","type":"address"},{"name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"assetId","type":"uint256"}],"name":"getApprovedAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_owner","type":"address"},{"name":"_operator","type":"address"},{"name":"_approved","type":"bool"}],"name":"setUpdateManager","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"x","type":"int256[]"},{"name":"y","type":"int256[]"},{"name":"estateId","type":"uint256"}],"name":"transferManyLandToEstate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"x","type":"int256"},{"name":"y","type":"int256"},{"name":"estateId","type":"uint256"}],"name":"transferLandToEstate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"beneficiary","type":"address"}],"name":"forbidDeploy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"registry","type":"address"}],"name":"EstateRegistrySet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"assetId","type":"uint256"},{"indexed":true,"name":"holder","type":"address"},{"indexed":true,"name":"operator","type":"address"},{"indexed":false,"name":"data","type":"string"}],"name":"Update","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"assetId","type":"uint256"},{"indexed":true,"name":"operator","type":"address"}],"name":"UpdateOperator","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_operator","type":"address"},{"indexed":true,"name":"_caller","type":"address"},{"indexed":false,"name":"_approved","type":"bool"}],"name":"UpdateManager","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_caller","type":"address"},{"indexed":true,"name":"_deployer","type":"address"}],"name":"DeployAuthorized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_caller","type":"address"},{"indexed":true,"name":"_deployer","type":"address"}],"name":"DeployForbidden","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_previousLandBalance","type":"address"},{"indexed":true,"name":"_newLandBalance","type":"address"}],"name":"SetLandBalanceToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":true,"name":"assetId","type":"uint256"},{"indexed":false,"name":"operator","type":"address"},{"indexed":false,"name":"userData","type":"bytes"},{"indexed":false,"name":"operatorData","type":"bytes"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":true,"name":"assetId","type":"uint256"},{"indexed":false,"name":"operator","type":"address"},{"indexed":false,"name":"userData","type":"bytes"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":true,"name":"assetId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"holder","type":"address"},{"indexed":true,"name":"operator","type":"address"},{"indexed":false,"name":"authorized","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"operator","type":"address"},{"indexed":true,"name":"assetId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_prevOwner","type":"address"},{"indexed":false,"name":"_newOwner","type":"address"}],"name":"OwnerUpdate","type":"event"}]

608060405260028054600160a060020a031916331790556143bd806100256000396000f3006080604052600436106102d15763ffffffff60e060020a60003504166301ffc9a781146102d6578063025313a21461030c57806306fdde031461033d57806307ecec3e146103c7578063081812fc146103ee578063095ea7b3146104065780631080f2511461042c578063133cbe3a1461044757806318160ddd146104685780631c07cac51461048f5780631cc69ac1146104a45780631d4b11e4146104cb5780631e375901146105475780631e4c77361461056857806323b872dd146105a05780632972b0f0146105ca57806329ffab3b146105ee5780632f745c591461060f578063313ce56714610633578063341f13f21461064857806335e64aaa1461066957806342842e0e14610690578063439fab91146106ba5780634c4bf936146106da5780634dad9003146106f55780634f558e791461072d5780635a3f2672146107455780635c36b186146107665780636087de1b1461077b57806361a822f91461079c5780636352211e146107bd57806365181ad3146107d557806365937ab9146108075780636914db601461082b5780636fb7e5881461084357806370a082311461085e578063721d7d8e1461087f57806372554ff5146108945780637284e416146108f45780637efd91121461090957806384b800041461093a5780638668a4161461094f578063881eeaa514610987578063885363eb146109cc5780638da5cb5b14610a865780638de74aa114610a9b57806395d89b4114610abc5780639d40b85014610ad1578063a22cb46514610ae9578063a8d8812714610b0f578063b0b02c6014610b2a578063b88d4fde14610b4e578063c2cf1cdc14610b87578063ca8a2c0814610b9c578063d4dd159414610bd4578063e387d31a14610bfc578063e985e9c514610c11578063eca4742a146103ee578063ef1db76214610c38578063f2fde38b14610c64578063f5f83a6114610c85578063f9cbec4314610cb4578063fd7a1b0014610cd2575b600080fd5b3480156102e257600080fd5b506102f8600160e060020a031960043516610cf3565b604080519115158252519081900360200190f35b34801561031857600080fd5b50610321610dac565b60408051600160a060020a039092168252519081900360200190f35b34801561034957600080fd5b50610352610dbb565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561038c578181015183820152602001610374565b50505050905090810190601f1680156103b95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103d357600080fd5b506102f8600160a060020a0360043581169060243516610e52565b3480156103fa57600080fd5b50610321600435610e72565b34801561041257600080fd5b5061042a600160a060020a0360043516602435610e7d565b005b34801561043857600080fd5b50610321600435602435610f48565b34801561045357600080fd5b5061042a600160a060020a0360043516610f5b565b34801561047457600080fd5b5061047d610feb565b60408051918252519081900360200190f35b34801561049b57600080fd5b5061042a610ffa565b3480156104b057600080fd5b5061042a600435602435600160a060020a036044351661124c565b3480156104d757600080fd5b506104f760246004803582810192908201359181359182019101356112fc565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561053357818101518382015260200161051b565b505050509050019250505060405180910390f35b34801561055357600080fd5b5061047d600160a060020a0360043516611453565b34801561057457600080fd5b5061042a6024600480358281019290820135918135808301929082013591604435918201910135611465565b3480156105ac57600080fd5b5061042a600160a060020a0360043581169060243516604435611597565b3480156105d657600080fd5b506102f8600160a060020a0360043516602435611641565b3480156105fa57600080fd5b506102f8600160a060020a036004351661164d565b34801561061b57600080fd5b5061047d600160a060020a0360043516602435611662565b34801561063f57600080fd5b5061047d6116d9565b34801561065457600080fd5b5061042a600160a060020a03600435166116de565b34801561067557600080fd5b5061042a600435602435600160a060020a0360443516611860565b34801561069c57600080fd5b5061042a600160a060020a036004358116906024351660443561189a565b3480156106c657600080fd5b5061042a60048035602481019101356118b8565b3480156106e657600080fd5b506103526004356024356119ac565b34801561070157600080fd5b5061042a6024600480358281019290820135918135918201910135600160a060020a03604435166119c0565b34801561073957600080fd5b506102f8600435611ae5565b34801561075157600080fd5b506104f7600160a060020a0360043516611af0565b34801561077257600080fd5b5061042a611b5c565b34801561078757600080fd5b506102f8600160a060020a0360043516611b70565b3480156107a857600080fd5b5061042a600160a060020a0360043516611b85565b3480156107c957600080fd5b50610321600435611ccb565b3480156107e157600080fd5b506107ea611cd6565b60408051600160e060020a03199092168252519081900360200190f35b34801561081357600080fd5b506102f8600160a060020a0360043516602435611d0b565b34801561083757600080fd5b50610352600435611d17565b34801561084f57600080fd5b5061047d600435602435611d22565b34801561086a57600080fd5b5061047d600160a060020a0360043516611d2e565b34801561088b57600080fd5b50610321611d39565b3480156108a057600080fd5b506040805160206004803580820135838102808601850190965280855261042a9536959394602494938501929182918501908490808284375094975050509235600160a060020a03169350611d4892505050565b34801561090057600080fd5b50610352611d7d565b34801561091557600080fd5b50610921600435611dde565b6040805192835260208301919091528051918290030190f35b34801561094657600080fd5b50610321611df4565b34801561095b57600080fd5b5061042a6024600480358281019290820135918135918201910135600160a060020a0360443516611e03565b34801561099357600080fd5b5061047d6024600480358281019290820135918135808301929082013591600160a060020a036044351691606435908101910135611ed7565b3480156109d857600080fd5b506109ed600160a060020a0360043516611f76565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015610a31578181015183820152602001610a19565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015610a70578181015183820152602001610a58565b5050505090500194505050505060405180910390f35b348015610a9257600080fd5b5061032161208c565b348015610aa757600080fd5b5061042a600160a060020a036004351661209b565b348015610ac857600080fd5b50610352612149565b348015610add57600080fd5b506103216004356121aa565b348015610af557600080fd5b5061042a600160a060020a036004351660243515156121c5565b348015610b1b57600080fd5b506102f86004356024356121d3565b348015610b3657600080fd5b5061042a600435600160a060020a03602435166121df565b348015610b5a57600080fd5b5061042a600160a060020a03600480358216916024803590911691604435916064359081019101356122d6565b348015610b9357600080fd5b5061042a61231c565b348015610ba857600080fd5b5061047d6024600480358281019290820135918135918201910135600160a060020a0360443516612699565b348015610be057600080fd5b5061042a60048035906024803591604435918201910135612718565b348015610c0857600080fd5b50610321612753565b348015610c1d57600080fd5b506102f8600160a060020a0360043581169060243516612762565b348015610c4457600080fd5b5061042a600160a060020a0360043581169060243516604435151561276e565b348015610c7057600080fd5b5061042a600160a060020a03600435166128d8565b348015610c9157600080fd5b5061042a6024600480358281019290820135918135918201910135604435612974565b348015610cc057600080fd5b5061042a600435602435604435612b91565b348015610cde57600080fd5b5061042a600160a060020a0360043516612cda565b6000600160e060020a03198083161415610d0f57506000610da7565b600160e060020a031982167f01ffc9a7000000000000000000000000000000000000000000000000000000001480610d705750600160e060020a031982167f7c0633c600000000000000000000000000000000000000000000000000000000145b80610da45750600160e060020a031982167f80ac58cd00000000000000000000000000000000000000000000000000000000145b90505b919050565b600154600160a060020a031681565b60038054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610e475780601f10610e1c57610100808354040283529160200191610e47565b820191906000526020600020905b815481529060010190602001808311610e2a57829003601f168201915b505050505090505b90565b601260209081526000928352604080842090915290825290205460ff1681565b6000610da482612e5a565b6000610e8882612e75565b905033600160a060020a0382161480610ea65750610ea63382612e90565b1515610eb157600080fd5b600160a060020a038381169082161415610eca57600080fd5b82600160a060020a0316610edd83612e5a565b600160a060020a031614610f43576000828152600c60205260408082208054600160a060020a031916600160a060020a0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a45b505050565b6000610f548383612ebe565b9392505050565b600154600160a060020a0316331480610f795750610f793382612e90565b1515610fcf576040805160e560020a62461bcd02815260206004820152601160248201527f556e617574686f72697a65642075736572000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a03166000908152600d60205260409020429055565b6000610ff5612ed2565b905090565b3360009081526014602052604081205460ff161515611089576040805160e560020a62461bcd02815260206004820152602b60248201527f556e72656769737465722042616c616e63653a3a5468652075736572206e6f7460448201527f2072656769737465726564000000000000000000000000000000000000000000606482015290519081900360840190fd5b336000818152601460209081526040808320805460ff1916905560135481517f70a0823100000000000000000000000000000000000000000000000000000000815260048101959095529051600160a060020a03909116936370a082319360248083019493928390030190829087803b15801561110557600080fd5b505af1158015611119573d6000803e3d6000fd5b505050506040513d602081101561112f57600080fd5b5051601354604080517fd3ce77fe000000000000000000000000000000000000000000000000000000008152336004820152602481018490529051929350600160a060020a039091169163d3ce77fe916044808201926020929091908290030181600087803b1580156111a157600080fd5b505af11580156111b5573d6000803e3d6000fd5b505050506040513d60208110156111cb57600080fd5b50511515611249576040805160e560020a62461bcd02815260206004820152602c60248201527f556e72656769737465722042616c616e63653a3a436f756c64206e6f7420646560448201527f7374726f7920746f6b656e730000000000000000000000000000000000000000606482015290519081900360840190fd5b50565b600154600160a060020a031633148061127457503360009081526011602052604090205460ff165b15156112de576040805160e560020a62461bcd02815260206004820152603a602482015260008051602061433283398151915260448201527f20627920616e20617574686f72697a6564206465706c6f796572000000000000606482015290519081900360840190fd5b6112f16112eb8484612ed8565b82612f92565b610f43600082612ffb565b606080600080861161135a576040805160e560020a62461bcd02815260206004820152602960248201526000805160206143528339815191526044820152600080516020614372833981519152606482015290519081900360840190fd5b8584146113b3576040805160e560020a62461bcd02815260206004820152602b60248201526000805160206142f28339815191526044820152600080516020614312833981519152606482015290519081900360840190fd5b6040805187815260208089028201019091528680156113dc578160200160208202803883390190505b509150600090505b858110156114495761141c8787838181106113fb57fe5b90506020020135868684818110151561141057fe5b90506020020135612ebe565b828281518110151561142a57fe5b600160a060020a039092166020928302909101909101526001016113e4565b5095945050505050565b600d6020526000908152604090205481565b60008086116114c0576040805160e560020a62461bcd02815260206004820152602960248201526000805160206143528339815191526044820152600080516020614372833981519152606482015290519081900360840190fd5b858414611519576040805160e560020a62461bcd02815260206004820152602b60248201526000805160206142f28339815191526044820152600080516020614312833981519152606482015290519081900360840190fd5b5060005b8581101561158e5761158687878381811061153457fe5b90506020020135868684818110151561154957fe5b9050602002013585858080601f01602080910402602001604051908101604052809392919081815260200183838082843750613172945050505050565b60010161151d565b50505050505050565b601054600160a060020a0383811691161415611623576040805160e560020a62461bcd02815260206004820152602f60248201527f457374617465526567697374727920756e73616665207472616e73666572732060448201527f617265206e6f7420616c6c6f7765640000000000000000000000000000000000606482015290519081900360840190fd5b610f438383836020604051908101604052806000815250600061331f565b6000610f548383613352565b60116020526000908152604090205460ff1681565b600160a060020a038216600090815260076020526040812054821061168657600080fd5b6f8000000000000000000000000000000082106116a257600080fd5b600160a060020a03831660009081526007602052604090208054839081106116c657fe5b9060005260206000200154905092915050565b600090565b600154600160a060020a03163314611742576040805160e560020a62461bcd028152602060048201526033602482015260008051602061433283398151915260448201526000805160206142d2833981519152606482015290519081900360840190fd5b600160a060020a03811615156117a2576040805160e560020a62461bcd02815260206004820152600f60248201527f696e76616c696420616464726573730000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a03811660009081526011602052604090205460ff1615611813576040805160e560020a62461bcd02815260206004820152601d60248201527f6164647265737320697320616c726561647920617574686f72697a6564000000604482015290519081900360640190fd5b600160a060020a038116600081815260116020526040808220805460ff191660011790555133917f9e237638dcd1b2be1fc623ab6a47409b34dc8a62196448dd2d6b9045b2c3315791a350565b600061186c8484612ed8565b905061189461187a82612e75565b83836020604051908101604052806000815250600161331f565b50505050565b610f438383836020604051908101604052806000815250600161331f565b6040805180820190915260118082527f446563656e7472616c616e64204c414e4400000000000000000000000000000060209092019182526118fc916003916141ff565b506040805180820190915260048082527f4c414e4400000000000000000000000000000000000000000000000000000000602090920191825261193f91816141ff565b506040805160608101825260338082527f436f6e747261637420746861742073746f7265732074686520446563656e7472602083019081527f616c616e64204c414e44207265676973747279000000000000000000000000009290930191909152610f43916005916141ff565b6060610f546119bb8484612ed8565b6133d0565b600080808611611a1c576040805160e560020a62461bcd02815260206004820152602960248201526000805160206143528339815191526044820152600080516020614372833981519152606482015290519081900360840190fd5b858414611a75576040805160e560020a62461bcd02815260206004820152602b60248201526000805160206142f28339815191526044820152600080516020614312833981519152606482015290519081900360840190fd5b600091505b8582101561158e57611ab2878784818110611a9157fe5b905060200201358686858181101515611aa657fe5b90506020020135612ed8565b9050611ada611ac082612e75565b84836020604051908101604052806000815250600161331f565b600190910190611a7a565b6000610da48261364a565b600160a060020a038116600090815260076020908152604091829020805483518184028101840190945280845260609392830182828015611b5057602002820191906000526020600020905b815481526020019060010190808311611b3c575b50505050509050919050565b336000908152600d60205260409020429055565b60146020526000908152604090205460ff1681565b600154600160a060020a03163314611be9576040805160e560020a62461bcd028152602060048201526033602482015260008051602061433283398151915260448201526000805160206142d2833981519152606482015290519081900360840190fd5b600160a060020a0381161515611c6f576040805160e560020a62461bcd02815260206004820152602a60248201527f4e6577206c616e6442616c616e63652073686f756c64206e6f74206265207a6560448201527f726f206164647265737300000000000000000000000000000000000000000000606482015290519081900360840190fd5b601354604051600160a060020a038084169216907f72d675e4d2f5ce2deafcb203f4dacdeee8be536626817bc87833e716ef73942d90600090a360138054600160a060020a031916600160a060020a0392909216919091179055565b6000610da482612e75565b604080517f6765744d657461646174612875696e74323536290000000000000000000000008152905190819003601401902081565b6000610f548383613667565b6060610da4826133d0565b6000610f548383612ed8565b6000610da4826136e6565b600054600160a060020a031681565b60005b8251811015610f4357611d758382815181101515611d6557fe5b90602001906020020151836121df565b600101611d4b565b60058054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610e475780601f10610e1c57610100808354040283529160200191610e47565b600080611dea83613701565b915091505b915091565b601354600160a060020a031681565b600154600090600160a060020a0316331480611e2e57503360009081526011602052604090205460ff165b1515611e98576040805160e560020a62461bcd02815260206004820152603a602482015260008051602061433283398151915260448201527f20627920616e20617574686f72697a6564206465706c6f796572000000000000606482015290519081900360840190fd5b5060005b84811015611ecf57611ebc611eb6878784818110611a9157fe5b83612f92565b611ec7600083612ffb565b600101611e9c565b505050505050565b6000611f6a8888808060200260200160405190810160405280939291908181526020018383602002808284375050604080516020808e0282810182019093528d82529095508d94508c93508392508501908490808284375050604080516020601f8c018190048102820181019092528a81528c955093508a925089915081908401838280828437506137c0945050505050565b98975050505050505050565b600160a060020a0381166000908152600760209081526040808320548151818152818402810190930190915260609283928391829181908190868015611fc6578160200160208202803883390190505b50945085604051908082528060200260200182016040528015611ff3578160200160208202803883390190505b509350600090505b8581101561207d57600160a060020a0389166000908152600760205260409020805461203c91908390811061202c57fe5b9060005260206000200154613701565b86519194509250839086908390811061205157fe5b602090810290910101528351829085908390811061206b57fe5b60209081029091010152600101611ffb565b50929791965090945050505050565b600254600160a060020a031681565b600154600160a060020a031633146120ff576040805160e560020a62461bcd028152602060048201526033602482015260008051602061433283398151915260448201526000805160206142d2833981519152606482015290519081900360840190fd5b60108054600160a060020a031916600160a060020a0383169081179091556040517f5b3ad80e09ce4c88735037542891c02fdc63b85e96a579d9260a403153c2775590600090a250565b60048054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610e475780601f10610e1c57610100808354040283529160200191610e47565b600f60205260009081526040902054600160a060020a031681565b6121cf8282613a93565b5050565b6000610f548383613b21565b8160006121eb82612e75565b90506121f73383613352565b806122255750600160a060020a038116600090815260126020908152604080832033845290915290205460ff165b151561227b576040805160e560020a62461bcd02815260206004820152601160248201527f756e617574686f72697a65642075736572000000000000000000000000000000604482015290519081900360640190fd5b6000848152600f60205260408082208054600160a060020a031916600160a060020a0387169081179091559051909186917f9d9dd80a56a16f715df6eb40b771e24ff8cbea6eed9de28473ce0f28fe5602a99190a350505050565b61231585858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437506001945061331f9350505050565b5050505050565b33600090815260146020526040812054819060ff16156123ac576040805160e560020a62461bcd02815260206004820152603060248201527f52656769737465722042616c616e63653a3a546865207573657220697320616c60448201527f7265616479207265676973746572656400000000000000000000000000000000606482015290519081900360840190fd5b601354604080517f70a082310000000000000000000000000000000000000000000000000000000081523360048201529051600160a060020a03909216916370a08231916024808201926020929091908290030181600087803b15801561241257600080fd5b505af1158015612426573d6000803e3d6000fd5b505050506040513d602081101561243c57600080fd5b50519150600082111561255e57601354604080517fd3ce77fe000000000000000000000000000000000000000000000000000000008152336004820152602481018590529051600160a060020a039092169163d3ce77fe916044808201926020929091908290030181600087803b1580156124b657600080fd5b505af11580156124ca573d6000803e3d6000fd5b505050506040513d60208110156124e057600080fd5b5051151561255e576040805160e560020a62461bcd02815260206004820152602a60248201527f52656769737465722042616c616e63653a3a436f756c64206e6f74206465737460448201527f726f7920746f6b656e7300000000000000000000000000000000000000000000606482015290519081900360840190fd5b336000818152601460205260409020805460ff19166001179055612581906136e6565b601354604080517f827f32c0000000000000000000000000000000000000000000000000000000008152336004820152602481018490529051929350600160a060020a039091169163827f32c0916044808201926020929091908290030181600087803b1580156125f157600080fd5b505af1158015612605573d6000803e3d6000fd5b505050506040513d602081101561261b57600080fd5b505115156121cf576040805160e560020a62461bcd02815260206004820152602b60248201527f52656769737465722042616c616e63653a3a436f756c64206e6f742067656e6560448201527f7261746520746f6b656e73000000000000000000000000000000000000000000606482015290519081900360840190fd5b600061270e8686808060200260200160405190810160405280939291908181526020018383602002808284375050604080516020808c0282810182019093528b82529095508b94508a9350839250850190849080828437505060408051602081019091526000815289945092506137c0915050565b9695505050505050565b611894848484848080601f01602080910402602001604051908101604052809392919081815260200183838082843750613172945050505050565b601054600160a060020a031681565b6000610f548383612e90565b600160a060020a0382163314156127f5576040805160e560020a62461bcd02815260206004820152602b60248201527f546865206f70657261746f722073686f756c6420626520646966666572656e7460448201527f2066726f6d206f776e6572000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a03831633148061281157506128118333612e90565b1515612867576040805160e560020a62461bcd02815260206004820152601160248201527f556e617574686f72697a65642075736572000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a03838116600081815260126020908152604080832094871680845294825291829020805460ff191686151590811790915582519081529151339493927fd79fbfe1644c022b9150727d871532bfcc3e27ffee86fc596a062770ac97b04292908290030190a4505050565b600254600160a060020a031633146128ec57fe5b600254600160a060020a0382811691161415612952576040805160e560020a62461bcd02815260206004820152601b60248201527f43616e6e6f74207472616e7366657220746f20796f757273656c660000000000604482015290519081900360640190fd5b60028054600160a060020a031916600160a060020a0392909216919091179055565b6000808086116129d0576040805160e560020a62461bcd02815260206004820152602960248201526000805160206143528339815191526044820152600080516020614372833981519152606482015290519081900360840190fd5b858414612a29576040805160e560020a62461bcd02815260206004820152602b60248201526000805160206142f28339815191526044820152600080516020614312833981519152606482015290519081900360840190fd5b601054604080517f6352211e0000000000000000000000000000000000000000000000000000000081526004810186905290513392600160a060020a031691636352211e9160248083019260209291908290030181600087803b158015612a8f57600080fd5b505af1158015612aa3573d6000803e3d6000fd5b505050506040513d6020811015612ab957600080fd5b5051600160a060020a031614612b3f576040805160e560020a62461bcd02815260206004820152602f60248201527f596f75206d757374206f776e207468652045737461746520796f752077616e7460448201527f20746f207472616e7366657220746f0000000000000000000000000000000000606482015290519081900360840190fd5b600091505b8582101561158e57612b5b878784818110611a9157fe5b9050612b86612b6982612e75565b601054600160a060020a031683612b7f87613b35565b600161331f565b600190910190612b44565b601054604080517f6352211e0000000000000000000000000000000000000000000000000000000081526004810184905290516000923392600160a060020a0390911691636352211e9160248082019260209290919082900301818887803b158015612bfc57600080fd5b505af1158015612c10573d6000803e3d6000fd5b505050506040513d6020811015612c2657600080fd5b5051600160a060020a031614612cac576040805160e560020a62461bcd02815260206004820152602f60248201527f596f75206d757374206f776e207468652045737461746520796f752077616e7460448201527f20746f207472616e7366657220746f0000000000000000000000000000000000606482015290519081900360840190fd5b612cb68484612ed8565b9050611894612cc482612e75565b601054600160a060020a031683612b7f86613b35565b600154600160a060020a03163314612d3e576040805160e560020a62461bcd028152602060048201526033602482015260008051602061433283398151915260448201526000805160206142d2833981519152606482015290519081900360840190fd5b600160a060020a0381161515612d9e576040805160e560020a62461bcd02815260206004820152600f60248201527f696e76616c696420616464726573730000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a03811660009081526011602052604090205460ff161515612e10576040805160e560020a62461bcd02815260206004820152601c60248201527f6164647265737320697320616c726561647920666f7262696464656e00000000604482015290519081900360640190fd5b600160a060020a038116600081815260116020526040808220805460ff191690555133917f7883da318e7694f396f400092b07b701a4eccb02aee0d28266adc659cca044da91a350565b6000908152600c6020526040902054600160a060020a031690565b600090815260086020526040902054600160a060020a031690565b600160a060020a039182166000908152600b6020908152604080832093909416825291909152205460ff1690565b6000610f54612ecd8484612ed8565b612e75565b60065490565b600082620f423f19128015612eef5750620f424083125b8015612efe575081620f423f19125b8015612f0c5750620f424082125b1515612f88576040805160e560020a62461bcd02815260206004820152602760248201527f54686520636f6f7264696e617465732073686f756c6420626520696e7369646560448201527f20626f756e647300000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b610f548383613b60565b600082815260086020526040902054600160a060020a031615612fb457600080fd5b612fbe8183613ba1565b8181600160a060020a031660007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600160a060020a03821660009081526014602052604090205460ff16156130b857601354604080517fd3ce77fe000000000000000000000000000000000000000000000000000000008152600160a060020a038581166004830152600160248301529151919092169163d3ce77fe9160448083019260209291908290030181600087803b15801561308b57600080fd5b505af115801561309f573d6000803e3d6000fd5b505050506040513d60208110156130b557600080fd5b50505b600160a060020a03811660009081526014602052604090205460ff16156121cf57601354604080517f827f32c0000000000000000000000000000000000000000000000000000000008152600160a060020a038481166004830152600160248301529151919092169163827f32c09160448083019260209291908290030181600087803b15801561314857600080fd5b505af115801561315c573d6000803e3d6000fd5b505050506040513d602081101561189457600080fd5b60008061317f8585612ed8565b61318881612e75565b600160a060020a031633600160a060020a031614806131ac57506131ac3382613352565b806131bc57506131bc3382613667565b1515613238576040805160e560020a62461bcd02815260206004820152602660248201527f6d73672e73656e646572206973206e6f7420617574686f72697a656420746f2060448201527f7570646174650000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6132428686612ed8565b600081815260086020526040902054909350600160a060020a031691506132698385613c2b565b33600160a060020a031682600160a060020a0316847f47c705b9219229ad762fca605f08fb024a3415d0ae78af5d319820c72e510414876040518080602001828103825283818151815260200191508051906020019080838360005b838110156132dd5781810151838201526020016132c5565b50505050905090810190601f16801561330a5780820380516001836020036101000a031916815260200191505b509250505060405180910390a4505050505050565b6000838152600f602052604090208054600160a060020a03191690556133458585612ffb565b6123158585858585613c4a565b600080600160a060020a038416151561336a57600080fd5b61337383612e75565b905080600160a060020a031684600160a060020a0316141561339857600191506133c9565b6133a28185612e90565b806133c6575083600160a060020a03166133bb84612e5a565b600160a060020a0316145b91505b5092915050565b606060006133dd83612e75565b90506133e881613c6d565b80156134025750601054600160a060020a03828116911614155b156135a957604080517f6765744d657461646174612875696e7432353629000000000000000000000000815281519081900360140181207f01ffc9a7000000000000000000000000000000000000000000000000000000008252600160e060020a03191660048201529051600160a060020a038316916301ffc9a79160248083019260209291908290030181600087803b15801561349f57600080fd5b505af11580156134b3573d6000803e3d6000fd5b505050506040513d60208110156134c957600080fd5b5051156135a95780600160a060020a031663a574cea4846040518263ffffffff1660e060020a02815260040180828152602001915050600060405180830381600087803b15801561351957600080fd5b505af115801561352d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561355657600080fd5b81019080805164010000000081111561356e57600080fd5b8201602081018481111561358157600080fd5b815164010000000081118282018710171561359b57600080fd5b509095506136449350505050565b6000838152600a602090815260409182902080548351601f60026000196101006001861615020190931692909204918201849004840281018401909452808452909183018282801561363c5780601f106136115761010080835404028352916020019161363c565b820191906000526020600020905b81548152906001019060200180831161361f57829003601f168201915b505050505091505b50919050565b600090815260086020526040902054600160a060020a0316151590565b60008061367383612e75565b905083600160a060020a031681600160a060020a031614806136ae57506000838152600f6020526040902054600160a060020a038581169116145b806133c65750600160a060020a0380821660009081526012602090815260408083209388168352929052205460ff1691505092915050565b600160a060020a031660009081526007602052604090205490565b60008061370d83613c75565b9092509050620f423f19821380156137275750620f424082125b8015613736575080620f423f19125b80156137445750620f424081125b1515611def576040805160e560020a62461bcd02815260206004820152602760248201527f54686520636f6f7264696e617465732073686f756c6420626520696e7369646560448201527f20626f756e647300000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600080606060008060008951111515613825576040805160e560020a62461bcd02815260206004820152602960248201526000805160206143528339815191526044820152600080516020614372833981519152606482015290519081900360840190fd5b8751895114613880576040805160e560020a62461bcd02815260206004820152602b60248201526000805160206142f28339815191526044820152600080516020614312833981519152606482015290519081900360840190fd5b601054600160a060020a03161515613908576040805160e560020a62461bcd02815260206004820152602160248201527f546865204573746174652072656769737472792073686f756c6420626520736560448201527f7400000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b601054604080517fd0def521000000000000000000000000000000000000000000000000000000008152600160a060020a038a811660048301908152602483019384528a5160448401528a51919094169363d0def521938c938c93606490910190602085019080838360005b8381101561398c578181015183820152602001613974565b50505050905090810190601f1680156139b95780820380516001836020036101000a031916815260200191505b509350505050602060405180830381600087803b1580156139d957600080fd5b505af11580156139ed573d6000803e3d6000fd5b505050506040513d6020811015613a0357600080fd5b50519350613a1084613b35565b9250600091505b8851821015613a8657613a588983815181101515613a3157fe5b906020019060200201518984815181101515613a4957fe5b90602001906020020151612ed8565b9050613a7b613a6682612e75565b601054600160a060020a03168386600161331f565b600190910190613a17565b5091979650505050505050565b8015613abc57613aa33383612e90565b15613aad57600080fd5b613ab78233613ccb565b613adb565b613ac63383612e90565b1515613ad157600080fd5b613adb8233613d00565b6040805182151581529051600160a060020a0384169133917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319181900360200190a35050565b6000610f54613b308484612ed8565b61364a565b6040805160208082528183019092526060918082016104008038833950505060208101929092525090565b70010000000000000000000000000000000082026fffffffffffffffffffffffffffffffff19166fffffffffffffffffffffffffffffffff82161792915050565b60008181526008602052604081208054600160a060020a031916600160a060020a038516179055613bd1836136e6565b600160a060020a0384166000908152600760209081526040808320805460018181018355918552838520018790558684526009909252909120829055600654919250613c23919063ffffffff613d3216565b600655505050565b6000828152600a602090815260409091208251610f43928401906141ff565b82613c553382613352565b1515613c6057600080fd5b611ecf8686868686613d45565b6000903b1190565b600080613ca77001000000000000000000000000000000006fffffffffffffffffffffffffffffffff19851604613f9b565b9150613cc46fffffffffffffffffffffffffffffffff8416613f9b565b9050915091565b600160a060020a039081166000908152600b60209081526040808320949093168252929092529020805460ff19166001179055565b600160a060020a039081166000908152600b60209081526040808320949093168252929092529020805460ff19169055565b81810182811015613d3f57fe5b92915050565b600084600160a060020a0381161515613d5d57600080fd5b848680600160a060020a0316613d7283612e75565b600160a060020a03161415613d8657600080fd5b888781600160a060020a0316613d9b82612e75565b600160a060020a031614613dae57600080fd5b600089815260086020526040902054600160a060020a03169550613dd2868a613fd3565b613ddc868a61406c565b613de68a8a613ba1565b888a600160a060020a031687600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4868015613e385750613e388a613c6d565b15613f8e5763150b7a0260e060020a027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168a600160a060020a031663150b7a0233898d8d6040518563ffffffff1660e060020a0281526004018085600160a060020a0316600160a060020a0316815260200184600160a060020a0316600160a060020a0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015613eff578181015183820152602001613ee7565b50505050905090810190601f168015613f2c5780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b158015613f4e57600080fd5b505af1158015613f62573d6000803e3d6000fd5b505050506040513d6020811015613f7857600080fd5b5051600160e060020a03191614613f8e57600080fd5b5050505050505050505050565b60006f80000000000000000000000000000000821615613fcf57506fffffffffffffffffffffffffffffffff198117610da7565b5090565b81600160a060020a0316613fe682612e75565b600160a060020a031614801561401257506000818152600c6020526040902054600160a060020a031615155b156121cf576000818152600c60205260408082208054600160a060020a031916905551829190600160a060020a038516907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925908390a45050565b6000818152600960205260408120549080614097600161408b876136e6565b9063ffffffff6141ed16565b600160a060020a0386166000908152600760205260409020805491935090839081106140bf57fe5b60009182526020808320909101548683526008825260408084208054600160a060020a0319169055600160a060020a038916845260079092529120805491925082918590811061410b57fe5b6000918252602080832090910192909255600160a060020a038716815260079091526040812080548490811061413d57fe5b6000918252602080832090910192909255600160a060020a0387168152600790915260409020805490614174906000198301614279565b50600160a060020a03851660009081526007602052604090205415156141b557600160a060020a03851660009081526007602052604081206141b59161429d565b60008481526009602052604080822082905582825290208390556006546141e390600163ffffffff6141ed16565b6006555050505050565b6000828211156141f957fe5b50900390565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061424057805160ff191683800117855561426d565b8280016001018555821561426d579182015b8281111561426d578251825591602001919060010190614252565b50613fcf9291506142b7565b815481835581811115610f4357600083815260209020610f439181019083016142b7565b508054600082559060005260206000209081019061124991905b610e4f91905b80821115613fcf57600081556001016142bd5600206279207468652070726f7879206f776e65720000000000000000000000000054686520636f6f7264696e617465732073686f756c642068617665207468652073616d65206c656e677468000000000000000000000000000000000000000000546869732066756e6374696f6e2063616e206f6e6c792062652063616c6c6564596f752073686f756c6420737570706c79206174206c65617374206f6e6520636f6f7264696e6174650000000000000000000000000000000000000000000000a165627a7a7230582060dd553b8b9313990355b3a660fdf52c893d125560ffa4ca954f3f3ecd4818ef0029

Deployed Bytecode

0x6080604052600436106102d15763ffffffff60e060020a60003504166301ffc9a781146102d6578063025313a21461030c57806306fdde031461033d57806307ecec3e146103c7578063081812fc146103ee578063095ea7b3146104065780631080f2511461042c578063133cbe3a1461044757806318160ddd146104685780631c07cac51461048f5780631cc69ac1146104a45780631d4b11e4146104cb5780631e375901146105475780631e4c77361461056857806323b872dd146105a05780632972b0f0146105ca57806329ffab3b146105ee5780632f745c591461060f578063313ce56714610633578063341f13f21461064857806335e64aaa1461066957806342842e0e14610690578063439fab91146106ba5780634c4bf936146106da5780634dad9003146106f55780634f558e791461072d5780635a3f2672146107455780635c36b186146107665780636087de1b1461077b57806361a822f91461079c5780636352211e146107bd57806365181ad3146107d557806365937ab9146108075780636914db601461082b5780636fb7e5881461084357806370a082311461085e578063721d7d8e1461087f57806372554ff5146108945780637284e416146108f45780637efd91121461090957806384b800041461093a5780638668a4161461094f578063881eeaa514610987578063885363eb146109cc5780638da5cb5b14610a865780638de74aa114610a9b57806395d89b4114610abc5780639d40b85014610ad1578063a22cb46514610ae9578063a8d8812714610b0f578063b0b02c6014610b2a578063b88d4fde14610b4e578063c2cf1cdc14610b87578063ca8a2c0814610b9c578063d4dd159414610bd4578063e387d31a14610bfc578063e985e9c514610c11578063eca4742a146103ee578063ef1db76214610c38578063f2fde38b14610c64578063f5f83a6114610c85578063f9cbec4314610cb4578063fd7a1b0014610cd2575b600080fd5b3480156102e257600080fd5b506102f8600160e060020a031960043516610cf3565b604080519115158252519081900360200190f35b34801561031857600080fd5b50610321610dac565b60408051600160a060020a039092168252519081900360200190f35b34801561034957600080fd5b50610352610dbb565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561038c578181015183820152602001610374565b50505050905090810190601f1680156103b95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103d357600080fd5b506102f8600160a060020a0360043581169060243516610e52565b3480156103fa57600080fd5b50610321600435610e72565b34801561041257600080fd5b5061042a600160a060020a0360043516602435610e7d565b005b34801561043857600080fd5b50610321600435602435610f48565b34801561045357600080fd5b5061042a600160a060020a0360043516610f5b565b34801561047457600080fd5b5061047d610feb565b60408051918252519081900360200190f35b34801561049b57600080fd5b5061042a610ffa565b3480156104b057600080fd5b5061042a600435602435600160a060020a036044351661124c565b3480156104d757600080fd5b506104f760246004803582810192908201359181359182019101356112fc565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561053357818101518382015260200161051b565b505050509050019250505060405180910390f35b34801561055357600080fd5b5061047d600160a060020a0360043516611453565b34801561057457600080fd5b5061042a6024600480358281019290820135918135808301929082013591604435918201910135611465565b3480156105ac57600080fd5b5061042a600160a060020a0360043581169060243516604435611597565b3480156105d657600080fd5b506102f8600160a060020a0360043516602435611641565b3480156105fa57600080fd5b506102f8600160a060020a036004351661164d565b34801561061b57600080fd5b5061047d600160a060020a0360043516602435611662565b34801561063f57600080fd5b5061047d6116d9565b34801561065457600080fd5b5061042a600160a060020a03600435166116de565b34801561067557600080fd5b5061042a600435602435600160a060020a0360443516611860565b34801561069c57600080fd5b5061042a600160a060020a036004358116906024351660443561189a565b3480156106c657600080fd5b5061042a60048035602481019101356118b8565b3480156106e657600080fd5b506103526004356024356119ac565b34801561070157600080fd5b5061042a6024600480358281019290820135918135918201910135600160a060020a03604435166119c0565b34801561073957600080fd5b506102f8600435611ae5565b34801561075157600080fd5b506104f7600160a060020a0360043516611af0565b34801561077257600080fd5b5061042a611b5c565b34801561078757600080fd5b506102f8600160a060020a0360043516611b70565b3480156107a857600080fd5b5061042a600160a060020a0360043516611b85565b3480156107c957600080fd5b50610321600435611ccb565b3480156107e157600080fd5b506107ea611cd6565b60408051600160e060020a03199092168252519081900360200190f35b34801561081357600080fd5b506102f8600160a060020a0360043516602435611d0b565b34801561083757600080fd5b50610352600435611d17565b34801561084f57600080fd5b5061047d600435602435611d22565b34801561086a57600080fd5b5061047d600160a060020a0360043516611d2e565b34801561088b57600080fd5b50610321611d39565b3480156108a057600080fd5b506040805160206004803580820135838102808601850190965280855261042a9536959394602494938501929182918501908490808284375094975050509235600160a060020a03169350611d4892505050565b34801561090057600080fd5b50610352611d7d565b34801561091557600080fd5b50610921600435611dde565b6040805192835260208301919091528051918290030190f35b34801561094657600080fd5b50610321611df4565b34801561095b57600080fd5b5061042a6024600480358281019290820135918135918201910135600160a060020a0360443516611e03565b34801561099357600080fd5b5061047d6024600480358281019290820135918135808301929082013591600160a060020a036044351691606435908101910135611ed7565b3480156109d857600080fd5b506109ed600160a060020a0360043516611f76565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015610a31578181015183820152602001610a19565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015610a70578181015183820152602001610a58565b5050505090500194505050505060405180910390f35b348015610a9257600080fd5b5061032161208c565b348015610aa757600080fd5b5061042a600160a060020a036004351661209b565b348015610ac857600080fd5b50610352612149565b348015610add57600080fd5b506103216004356121aa565b348015610af557600080fd5b5061042a600160a060020a036004351660243515156121c5565b348015610b1b57600080fd5b506102f86004356024356121d3565b348015610b3657600080fd5b5061042a600435600160a060020a03602435166121df565b348015610b5a57600080fd5b5061042a600160a060020a03600480358216916024803590911691604435916064359081019101356122d6565b348015610b9357600080fd5b5061042a61231c565b348015610ba857600080fd5b5061047d6024600480358281019290820135918135918201910135600160a060020a0360443516612699565b348015610be057600080fd5b5061042a60048035906024803591604435918201910135612718565b348015610c0857600080fd5b50610321612753565b348015610c1d57600080fd5b506102f8600160a060020a0360043581169060243516612762565b348015610c4457600080fd5b5061042a600160a060020a0360043581169060243516604435151561276e565b348015610c7057600080fd5b5061042a600160a060020a03600435166128d8565b348015610c9157600080fd5b5061042a6024600480358281019290820135918135918201910135604435612974565b348015610cc057600080fd5b5061042a600435602435604435612b91565b348015610cde57600080fd5b5061042a600160a060020a0360043516612cda565b6000600160e060020a03198083161415610d0f57506000610da7565b600160e060020a031982167f01ffc9a7000000000000000000000000000000000000000000000000000000001480610d705750600160e060020a031982167f7c0633c600000000000000000000000000000000000000000000000000000000145b80610da45750600160e060020a031982167f80ac58cd00000000000000000000000000000000000000000000000000000000145b90505b919050565b600154600160a060020a031681565b60038054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610e475780601f10610e1c57610100808354040283529160200191610e47565b820191906000526020600020905b815481529060010190602001808311610e2a57829003601f168201915b505050505090505b90565b601260209081526000928352604080842090915290825290205460ff1681565b6000610da482612e5a565b6000610e8882612e75565b905033600160a060020a0382161480610ea65750610ea63382612e90565b1515610eb157600080fd5b600160a060020a038381169082161415610eca57600080fd5b82600160a060020a0316610edd83612e5a565b600160a060020a031614610f43576000828152600c60205260408082208054600160a060020a031916600160a060020a0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a45b505050565b6000610f548383612ebe565b9392505050565b600154600160a060020a0316331480610f795750610f793382612e90565b1515610fcf576040805160e560020a62461bcd02815260206004820152601160248201527f556e617574686f72697a65642075736572000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a03166000908152600d60205260409020429055565b6000610ff5612ed2565b905090565b3360009081526014602052604081205460ff161515611089576040805160e560020a62461bcd02815260206004820152602b60248201527f556e72656769737465722042616c616e63653a3a5468652075736572206e6f7460448201527f2072656769737465726564000000000000000000000000000000000000000000606482015290519081900360840190fd5b336000818152601460209081526040808320805460ff1916905560135481517f70a0823100000000000000000000000000000000000000000000000000000000815260048101959095529051600160a060020a03909116936370a082319360248083019493928390030190829087803b15801561110557600080fd5b505af1158015611119573d6000803e3d6000fd5b505050506040513d602081101561112f57600080fd5b5051601354604080517fd3ce77fe000000000000000000000000000000000000000000000000000000008152336004820152602481018490529051929350600160a060020a039091169163d3ce77fe916044808201926020929091908290030181600087803b1580156111a157600080fd5b505af11580156111b5573d6000803e3d6000fd5b505050506040513d60208110156111cb57600080fd5b50511515611249576040805160e560020a62461bcd02815260206004820152602c60248201527f556e72656769737465722042616c616e63653a3a436f756c64206e6f7420646560448201527f7374726f7920746f6b656e730000000000000000000000000000000000000000606482015290519081900360840190fd5b50565b600154600160a060020a031633148061127457503360009081526011602052604090205460ff165b15156112de576040805160e560020a62461bcd02815260206004820152603a602482015260008051602061433283398151915260448201527f20627920616e20617574686f72697a6564206465706c6f796572000000000000606482015290519081900360840190fd5b6112f16112eb8484612ed8565b82612f92565b610f43600082612ffb565b606080600080861161135a576040805160e560020a62461bcd02815260206004820152602960248201526000805160206143528339815191526044820152600080516020614372833981519152606482015290519081900360840190fd5b8584146113b3576040805160e560020a62461bcd02815260206004820152602b60248201526000805160206142f28339815191526044820152600080516020614312833981519152606482015290519081900360840190fd5b6040805187815260208089028201019091528680156113dc578160200160208202803883390190505b509150600090505b858110156114495761141c8787838181106113fb57fe5b90506020020135868684818110151561141057fe5b90506020020135612ebe565b828281518110151561142a57fe5b600160a060020a039092166020928302909101909101526001016113e4565b5095945050505050565b600d6020526000908152604090205481565b60008086116114c0576040805160e560020a62461bcd02815260206004820152602960248201526000805160206143528339815191526044820152600080516020614372833981519152606482015290519081900360840190fd5b858414611519576040805160e560020a62461bcd02815260206004820152602b60248201526000805160206142f28339815191526044820152600080516020614312833981519152606482015290519081900360840190fd5b5060005b8581101561158e5761158687878381811061153457fe5b90506020020135868684818110151561154957fe5b9050602002013585858080601f01602080910402602001604051908101604052809392919081815260200183838082843750613172945050505050565b60010161151d565b50505050505050565b601054600160a060020a0383811691161415611623576040805160e560020a62461bcd02815260206004820152602f60248201527f457374617465526567697374727920756e73616665207472616e73666572732060448201527f617265206e6f7420616c6c6f7765640000000000000000000000000000000000606482015290519081900360840190fd5b610f438383836020604051908101604052806000815250600061331f565b6000610f548383613352565b60116020526000908152604090205460ff1681565b600160a060020a038216600090815260076020526040812054821061168657600080fd5b6f8000000000000000000000000000000082106116a257600080fd5b600160a060020a03831660009081526007602052604090208054839081106116c657fe5b9060005260206000200154905092915050565b600090565b600154600160a060020a03163314611742576040805160e560020a62461bcd028152602060048201526033602482015260008051602061433283398151915260448201526000805160206142d2833981519152606482015290519081900360840190fd5b600160a060020a03811615156117a2576040805160e560020a62461bcd02815260206004820152600f60248201527f696e76616c696420616464726573730000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a03811660009081526011602052604090205460ff1615611813576040805160e560020a62461bcd02815260206004820152601d60248201527f6164647265737320697320616c726561647920617574686f72697a6564000000604482015290519081900360640190fd5b600160a060020a038116600081815260116020526040808220805460ff191660011790555133917f9e237638dcd1b2be1fc623ab6a47409b34dc8a62196448dd2d6b9045b2c3315791a350565b600061186c8484612ed8565b905061189461187a82612e75565b83836020604051908101604052806000815250600161331f565b50505050565b610f438383836020604051908101604052806000815250600161331f565b6040805180820190915260118082527f446563656e7472616c616e64204c414e4400000000000000000000000000000060209092019182526118fc916003916141ff565b506040805180820190915260048082527f4c414e4400000000000000000000000000000000000000000000000000000000602090920191825261193f91816141ff565b506040805160608101825260338082527f436f6e747261637420746861742073746f7265732074686520446563656e7472602083019081527f616c616e64204c414e44207265676973747279000000000000000000000000009290930191909152610f43916005916141ff565b6060610f546119bb8484612ed8565b6133d0565b600080808611611a1c576040805160e560020a62461bcd02815260206004820152602960248201526000805160206143528339815191526044820152600080516020614372833981519152606482015290519081900360840190fd5b858414611a75576040805160e560020a62461bcd02815260206004820152602b60248201526000805160206142f28339815191526044820152600080516020614312833981519152606482015290519081900360840190fd5b600091505b8582101561158e57611ab2878784818110611a9157fe5b905060200201358686858181101515611aa657fe5b90506020020135612ed8565b9050611ada611ac082612e75565b84836020604051908101604052806000815250600161331f565b600190910190611a7a565b6000610da48261364a565b600160a060020a038116600090815260076020908152604091829020805483518184028101840190945280845260609392830182828015611b5057602002820191906000526020600020905b815481526020019060010190808311611b3c575b50505050509050919050565b336000908152600d60205260409020429055565b60146020526000908152604090205460ff1681565b600154600160a060020a03163314611be9576040805160e560020a62461bcd028152602060048201526033602482015260008051602061433283398151915260448201526000805160206142d2833981519152606482015290519081900360840190fd5b600160a060020a0381161515611c6f576040805160e560020a62461bcd02815260206004820152602a60248201527f4e6577206c616e6442616c616e63652073686f756c64206e6f74206265207a6560448201527f726f206164647265737300000000000000000000000000000000000000000000606482015290519081900360840190fd5b601354604051600160a060020a038084169216907f72d675e4d2f5ce2deafcb203f4dacdeee8be536626817bc87833e716ef73942d90600090a360138054600160a060020a031916600160a060020a0392909216919091179055565b6000610da482612e75565b604080517f6765744d657461646174612875696e74323536290000000000000000000000008152905190819003601401902081565b6000610f548383613667565b6060610da4826133d0565b6000610f548383612ed8565b6000610da4826136e6565b600054600160a060020a031681565b60005b8251811015610f4357611d758382815181101515611d6557fe5b90602001906020020151836121df565b600101611d4b565b60058054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610e475780601f10610e1c57610100808354040283529160200191610e47565b600080611dea83613701565b915091505b915091565b601354600160a060020a031681565b600154600090600160a060020a0316331480611e2e57503360009081526011602052604090205460ff165b1515611e98576040805160e560020a62461bcd02815260206004820152603a602482015260008051602061433283398151915260448201527f20627920616e20617574686f72697a6564206465706c6f796572000000000000606482015290519081900360840190fd5b5060005b84811015611ecf57611ebc611eb6878784818110611a9157fe5b83612f92565b611ec7600083612ffb565b600101611e9c565b505050505050565b6000611f6a8888808060200260200160405190810160405280939291908181526020018383602002808284375050604080516020808e0282810182019093528d82529095508d94508c93508392508501908490808284375050604080516020601f8c018190048102820181019092528a81528c955093508a925089915081908401838280828437506137c0945050505050565b98975050505050505050565b600160a060020a0381166000908152600760209081526040808320548151818152818402810190930190915260609283928391829181908190868015611fc6578160200160208202803883390190505b50945085604051908082528060200260200182016040528015611ff3578160200160208202803883390190505b509350600090505b8581101561207d57600160a060020a0389166000908152600760205260409020805461203c91908390811061202c57fe5b9060005260206000200154613701565b86519194509250839086908390811061205157fe5b602090810290910101528351829085908390811061206b57fe5b60209081029091010152600101611ffb565b50929791965090945050505050565b600254600160a060020a031681565b600154600160a060020a031633146120ff576040805160e560020a62461bcd028152602060048201526033602482015260008051602061433283398151915260448201526000805160206142d2833981519152606482015290519081900360840190fd5b60108054600160a060020a031916600160a060020a0383169081179091556040517f5b3ad80e09ce4c88735037542891c02fdc63b85e96a579d9260a403153c2775590600090a250565b60048054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610e475780601f10610e1c57610100808354040283529160200191610e47565b600f60205260009081526040902054600160a060020a031681565b6121cf8282613a93565b5050565b6000610f548383613b21565b8160006121eb82612e75565b90506121f73383613352565b806122255750600160a060020a038116600090815260126020908152604080832033845290915290205460ff165b151561227b576040805160e560020a62461bcd02815260206004820152601160248201527f756e617574686f72697a65642075736572000000000000000000000000000000604482015290519081900360640190fd5b6000848152600f60205260408082208054600160a060020a031916600160a060020a0387169081179091559051909186917f9d9dd80a56a16f715df6eb40b771e24ff8cbea6eed9de28473ce0f28fe5602a99190a350505050565b61231585858585858080601f016020809104026020016040519081016040528093929190818152602001838380828437506001945061331f9350505050565b5050505050565b33600090815260146020526040812054819060ff16156123ac576040805160e560020a62461bcd02815260206004820152603060248201527f52656769737465722042616c616e63653a3a546865207573657220697320616c60448201527f7265616479207265676973746572656400000000000000000000000000000000606482015290519081900360840190fd5b601354604080517f70a082310000000000000000000000000000000000000000000000000000000081523360048201529051600160a060020a03909216916370a08231916024808201926020929091908290030181600087803b15801561241257600080fd5b505af1158015612426573d6000803e3d6000fd5b505050506040513d602081101561243c57600080fd5b50519150600082111561255e57601354604080517fd3ce77fe000000000000000000000000000000000000000000000000000000008152336004820152602481018590529051600160a060020a039092169163d3ce77fe916044808201926020929091908290030181600087803b1580156124b657600080fd5b505af11580156124ca573d6000803e3d6000fd5b505050506040513d60208110156124e057600080fd5b5051151561255e576040805160e560020a62461bcd02815260206004820152602a60248201527f52656769737465722042616c616e63653a3a436f756c64206e6f74206465737460448201527f726f7920746f6b656e7300000000000000000000000000000000000000000000606482015290519081900360840190fd5b336000818152601460205260409020805460ff19166001179055612581906136e6565b601354604080517f827f32c0000000000000000000000000000000000000000000000000000000008152336004820152602481018490529051929350600160a060020a039091169163827f32c0916044808201926020929091908290030181600087803b1580156125f157600080fd5b505af1158015612605573d6000803e3d6000fd5b505050506040513d602081101561261b57600080fd5b505115156121cf576040805160e560020a62461bcd02815260206004820152602b60248201527f52656769737465722042616c616e63653a3a436f756c64206e6f742067656e6560448201527f7261746520746f6b656e73000000000000000000000000000000000000000000606482015290519081900360840190fd5b600061270e8686808060200260200160405190810160405280939291908181526020018383602002808284375050604080516020808c0282810182019093528b82529095508b94508a9350839250850190849080828437505060408051602081019091526000815289945092506137c0915050565b9695505050505050565b611894848484848080601f01602080910402602001604051908101604052809392919081815260200183838082843750613172945050505050565b601054600160a060020a031681565b6000610f548383612e90565b600160a060020a0382163314156127f5576040805160e560020a62461bcd02815260206004820152602b60248201527f546865206f70657261746f722073686f756c6420626520646966666572656e7460448201527f2066726f6d206f776e6572000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a03831633148061281157506128118333612e90565b1515612867576040805160e560020a62461bcd02815260206004820152601160248201527f556e617574686f72697a65642075736572000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a03838116600081815260126020908152604080832094871680845294825291829020805460ff191686151590811790915582519081529151339493927fd79fbfe1644c022b9150727d871532bfcc3e27ffee86fc596a062770ac97b04292908290030190a4505050565b600254600160a060020a031633146128ec57fe5b600254600160a060020a0382811691161415612952576040805160e560020a62461bcd02815260206004820152601b60248201527f43616e6e6f74207472616e7366657220746f20796f757273656c660000000000604482015290519081900360640190fd5b60028054600160a060020a031916600160a060020a0392909216919091179055565b6000808086116129d0576040805160e560020a62461bcd02815260206004820152602960248201526000805160206143528339815191526044820152600080516020614372833981519152606482015290519081900360840190fd5b858414612a29576040805160e560020a62461bcd02815260206004820152602b60248201526000805160206142f28339815191526044820152600080516020614312833981519152606482015290519081900360840190fd5b601054604080517f6352211e0000000000000000000000000000000000000000000000000000000081526004810186905290513392600160a060020a031691636352211e9160248083019260209291908290030181600087803b158015612a8f57600080fd5b505af1158015612aa3573d6000803e3d6000fd5b505050506040513d6020811015612ab957600080fd5b5051600160a060020a031614612b3f576040805160e560020a62461bcd02815260206004820152602f60248201527f596f75206d757374206f776e207468652045737461746520796f752077616e7460448201527f20746f207472616e7366657220746f0000000000000000000000000000000000606482015290519081900360840190fd5b600091505b8582101561158e57612b5b878784818110611a9157fe5b9050612b86612b6982612e75565b601054600160a060020a031683612b7f87613b35565b600161331f565b600190910190612b44565b601054604080517f6352211e0000000000000000000000000000000000000000000000000000000081526004810184905290516000923392600160a060020a0390911691636352211e9160248082019260209290919082900301818887803b158015612bfc57600080fd5b505af1158015612c10573d6000803e3d6000fd5b505050506040513d6020811015612c2657600080fd5b5051600160a060020a031614612cac576040805160e560020a62461bcd02815260206004820152602f60248201527f596f75206d757374206f776e207468652045737461746520796f752077616e7460448201527f20746f207472616e7366657220746f0000000000000000000000000000000000606482015290519081900360840190fd5b612cb68484612ed8565b9050611894612cc482612e75565b601054600160a060020a031683612b7f86613b35565b600154600160a060020a03163314612d3e576040805160e560020a62461bcd028152602060048201526033602482015260008051602061433283398151915260448201526000805160206142d2833981519152606482015290519081900360840190fd5b600160a060020a0381161515612d9e576040805160e560020a62461bcd02815260206004820152600f60248201527f696e76616c696420616464726573730000000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a03811660009081526011602052604090205460ff161515612e10576040805160e560020a62461bcd02815260206004820152601c60248201527f6164647265737320697320616c726561647920666f7262696464656e00000000604482015290519081900360640190fd5b600160a060020a038116600081815260116020526040808220805460ff191690555133917f7883da318e7694f396f400092b07b701a4eccb02aee0d28266adc659cca044da91a350565b6000908152600c6020526040902054600160a060020a031690565b600090815260086020526040902054600160a060020a031690565b600160a060020a039182166000908152600b6020908152604080832093909416825291909152205460ff1690565b6000610f54612ecd8484612ed8565b612e75565b60065490565b600082620f423f19128015612eef5750620f424083125b8015612efe575081620f423f19125b8015612f0c5750620f424082125b1515612f88576040805160e560020a62461bcd02815260206004820152602760248201527f54686520636f6f7264696e617465732073686f756c6420626520696e7369646560448201527f20626f756e647300000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b610f548383613b60565b600082815260086020526040902054600160a060020a031615612fb457600080fd5b612fbe8183613ba1565b8181600160a060020a031660007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600160a060020a03821660009081526014602052604090205460ff16156130b857601354604080517fd3ce77fe000000000000000000000000000000000000000000000000000000008152600160a060020a038581166004830152600160248301529151919092169163d3ce77fe9160448083019260209291908290030181600087803b15801561308b57600080fd5b505af115801561309f573d6000803e3d6000fd5b505050506040513d60208110156130b557600080fd5b50505b600160a060020a03811660009081526014602052604090205460ff16156121cf57601354604080517f827f32c0000000000000000000000000000000000000000000000000000000008152600160a060020a038481166004830152600160248301529151919092169163827f32c09160448083019260209291908290030181600087803b15801561314857600080fd5b505af115801561315c573d6000803e3d6000fd5b505050506040513d602081101561189457600080fd5b60008061317f8585612ed8565b61318881612e75565b600160a060020a031633600160a060020a031614806131ac57506131ac3382613352565b806131bc57506131bc3382613667565b1515613238576040805160e560020a62461bcd02815260206004820152602660248201527f6d73672e73656e646572206973206e6f7420617574686f72697a656420746f2060448201527f7570646174650000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6132428686612ed8565b600081815260086020526040902054909350600160a060020a031691506132698385613c2b565b33600160a060020a031682600160a060020a0316847f47c705b9219229ad762fca605f08fb024a3415d0ae78af5d319820c72e510414876040518080602001828103825283818151815260200191508051906020019080838360005b838110156132dd5781810151838201526020016132c5565b50505050905090810190601f16801561330a5780820380516001836020036101000a031916815260200191505b509250505060405180910390a4505050505050565b6000838152600f602052604090208054600160a060020a03191690556133458585612ffb565b6123158585858585613c4a565b600080600160a060020a038416151561336a57600080fd5b61337383612e75565b905080600160a060020a031684600160a060020a0316141561339857600191506133c9565b6133a28185612e90565b806133c6575083600160a060020a03166133bb84612e5a565b600160a060020a0316145b91505b5092915050565b606060006133dd83612e75565b90506133e881613c6d565b80156134025750601054600160a060020a03828116911614155b156135a957604080517f6765744d657461646174612875696e7432353629000000000000000000000000815281519081900360140181207f01ffc9a7000000000000000000000000000000000000000000000000000000008252600160e060020a03191660048201529051600160a060020a038316916301ffc9a79160248083019260209291908290030181600087803b15801561349f57600080fd5b505af11580156134b3573d6000803e3d6000fd5b505050506040513d60208110156134c957600080fd5b5051156135a95780600160a060020a031663a574cea4846040518263ffffffff1660e060020a02815260040180828152602001915050600060405180830381600087803b15801561351957600080fd5b505af115801561352d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561355657600080fd5b81019080805164010000000081111561356e57600080fd5b8201602081018481111561358157600080fd5b815164010000000081118282018710171561359b57600080fd5b509095506136449350505050565b6000838152600a602090815260409182902080548351601f60026000196101006001861615020190931692909204918201849004840281018401909452808452909183018282801561363c5780601f106136115761010080835404028352916020019161363c565b820191906000526020600020905b81548152906001019060200180831161361f57829003601f168201915b505050505091505b50919050565b600090815260086020526040902054600160a060020a0316151590565b60008061367383612e75565b905083600160a060020a031681600160a060020a031614806136ae57506000838152600f6020526040902054600160a060020a038581169116145b806133c65750600160a060020a0380821660009081526012602090815260408083209388168352929052205460ff1691505092915050565b600160a060020a031660009081526007602052604090205490565b60008061370d83613c75565b9092509050620f423f19821380156137275750620f424082125b8015613736575080620f423f19125b80156137445750620f424081125b1515611def576040805160e560020a62461bcd02815260206004820152602760248201527f54686520636f6f7264696e617465732073686f756c6420626520696e7369646560448201527f20626f756e647300000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600080606060008060008951111515613825576040805160e560020a62461bcd02815260206004820152602960248201526000805160206143528339815191526044820152600080516020614372833981519152606482015290519081900360840190fd5b8751895114613880576040805160e560020a62461bcd02815260206004820152602b60248201526000805160206142f28339815191526044820152600080516020614312833981519152606482015290519081900360840190fd5b601054600160a060020a03161515613908576040805160e560020a62461bcd02815260206004820152602160248201527f546865204573746174652072656769737472792073686f756c6420626520736560448201527f7400000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b601054604080517fd0def521000000000000000000000000000000000000000000000000000000008152600160a060020a038a811660048301908152602483019384528a5160448401528a51919094169363d0def521938c938c93606490910190602085019080838360005b8381101561398c578181015183820152602001613974565b50505050905090810190601f1680156139b95780820380516001836020036101000a031916815260200191505b509350505050602060405180830381600087803b1580156139d957600080fd5b505af11580156139ed573d6000803e3d6000fd5b505050506040513d6020811015613a0357600080fd5b50519350613a1084613b35565b9250600091505b8851821015613a8657613a588983815181101515613a3157fe5b906020019060200201518984815181101515613a4957fe5b90602001906020020151612ed8565b9050613a7b613a6682612e75565b601054600160a060020a03168386600161331f565b600190910190613a17565b5091979650505050505050565b8015613abc57613aa33383612e90565b15613aad57600080fd5b613ab78233613ccb565b613adb565b613ac63383612e90565b1515613ad157600080fd5b613adb8233613d00565b6040805182151581529051600160a060020a0384169133917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319181900360200190a35050565b6000610f54613b308484612ed8565b61364a565b6040805160208082528183019092526060918082016104008038833950505060208101929092525090565b70010000000000000000000000000000000082026fffffffffffffffffffffffffffffffff19166fffffffffffffffffffffffffffffffff82161792915050565b60008181526008602052604081208054600160a060020a031916600160a060020a038516179055613bd1836136e6565b600160a060020a0384166000908152600760209081526040808320805460018181018355918552838520018790558684526009909252909120829055600654919250613c23919063ffffffff613d3216565b600655505050565b6000828152600a602090815260409091208251610f43928401906141ff565b82613c553382613352565b1515613c6057600080fd5b611ecf8686868686613d45565b6000903b1190565b600080613ca77001000000000000000000000000000000006fffffffffffffffffffffffffffffffff19851604613f9b565b9150613cc46fffffffffffffffffffffffffffffffff8416613f9b565b9050915091565b600160a060020a039081166000908152600b60209081526040808320949093168252929092529020805460ff19166001179055565b600160a060020a039081166000908152600b60209081526040808320949093168252929092529020805460ff19169055565b81810182811015613d3f57fe5b92915050565b600084600160a060020a0381161515613d5d57600080fd5b848680600160a060020a0316613d7283612e75565b600160a060020a03161415613d8657600080fd5b888781600160a060020a0316613d9b82612e75565b600160a060020a031614613dae57600080fd5b600089815260086020526040902054600160a060020a03169550613dd2868a613fd3565b613ddc868a61406c565b613de68a8a613ba1565b888a600160a060020a031687600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4868015613e385750613e388a613c6d565b15613f8e5763150b7a0260e060020a027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168a600160a060020a031663150b7a0233898d8d6040518563ffffffff1660e060020a0281526004018085600160a060020a0316600160a060020a0316815260200184600160a060020a0316600160a060020a0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015613eff578181015183820152602001613ee7565b50505050905090810190601f168015613f2c5780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b158015613f4e57600080fd5b505af1158015613f62573d6000803e3d6000fd5b505050506040513d6020811015613f7857600080fd5b5051600160e060020a03191614613f8e57600080fd5b5050505050505050505050565b60006f80000000000000000000000000000000821615613fcf57506fffffffffffffffffffffffffffffffff198117610da7565b5090565b81600160a060020a0316613fe682612e75565b600160a060020a031614801561401257506000818152600c6020526040902054600160a060020a031615155b156121cf576000818152600c60205260408082208054600160a060020a031916905551829190600160a060020a038516907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925908390a45050565b6000818152600960205260408120549080614097600161408b876136e6565b9063ffffffff6141ed16565b600160a060020a0386166000908152600760205260409020805491935090839081106140bf57fe5b60009182526020808320909101548683526008825260408084208054600160a060020a0319169055600160a060020a038916845260079092529120805491925082918590811061410b57fe5b6000918252602080832090910192909255600160a060020a038716815260079091526040812080548490811061413d57fe5b6000918252602080832090910192909255600160a060020a0387168152600790915260409020805490614174906000198301614279565b50600160a060020a03851660009081526007602052604090205415156141b557600160a060020a03851660009081526007602052604081206141b59161429d565b60008481526009602052604080822082905582825290208390556006546141e390600163ffffffff6141ed16565b6006555050505050565b6000828211156141f957fe5b50900390565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061424057805160ff191683800117855561426d565b8280016001018555821561426d579182015b8281111561426d578251825591602001919060010190614252565b50613fcf9291506142b7565b815481835581811115610f4357600083815260209020610f439181019083016142b7565b508054600082559060005260206000209081019061124991905b610e4f91905b80821115613fcf57600081556001016142bd5600206279207468652070726f7879206f776e65720000000000000000000000000054686520636f6f7264696e617465732073686f756c642068617665207468652073616d65206c656e677468000000000000000000000000000000000000000000546869732066756e6374696f6e2063616e206f6e6c792062652063616c6c6564596f752073686f756c6420737570706c79206174206c65617374206f6e6520636f6f7264696e6174650000000000000000000000000000000000000000000000a165627a7a7230582060dd553b8b9313990355b3a660fdf52c893d125560ffa4ca954f3f3ecd4818ef0029

Deployed Bytecode Sourcemap

28232:15629:0:-;;;;;;;;;-1:-1:-1;;;28232:15629:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20495:280;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;20495:280:0;-1:-1:-1;;;;;;20495:280:0;;;;;;;;;;;;;;;;;;;;;;;203:25;;8:9:-1;5:2;;;30:1;27;20:12;5:2;203:25:0;;;;;;;;-1:-1:-1;;;;;203:25:0;;;;;;;;;;;;;;24870:72;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24870: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;24870:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4394:65;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;4394:65:0;-1:-1:-1;;;;;4394:65:0;;;;;;;;;;12522:118;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;12522:118:0;;;;;14587:368;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;14587:368:0;-1:-1:-1;;;;;14587:368:0;;;;;;;;;33220:105;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;33220:105:0;;;;;;;31409:253;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;31409:253:0;-1:-1:-1;;;;;31409:253:0;;;;;10453:89;;8:9:-1;5:2;;;30:1;27;20:12;5:2;10453:89:0;;;;;;;;;;;;;;;;;;;;42475:468;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42475:468:0;;;;30744:189;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;30744:189:0;;;;;-1:-1:-1;;;;;30744:189:0;;;;;33455:411;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;33455:411: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;33455:411:0;;;;;;;;;;;;;;;;;3850:43;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;3850:43:0;-1:-1:-1;;;;;3850:43:0;;;;;40739:322;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;40739:322:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34929:277;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;34929:277:0;-1:-1:-1;;;;;34929:277:0;;;;;;;;;;;;13157:138;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;13157:138:0;-1:-1:-1;;;;;13157:138:0;;;;;;;4338:49;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;4338:49:0;-1:-1:-1;;;;;4338:49:0;;;;;23877:249;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;23877:249:0;-1:-1:-1;;;;;23877:249:0;;;;;;;25847:73;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25847:73:0;;;;30071:321;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;30071:321:0;-1:-1:-1;;;;;30071:321:0;;;;;35212:214;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;35212:214:0;;;;;-1:-1:-1;;;;;35212:214:0;;;;;17888:142;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;17888:142:0;-1:-1:-1;;;;;17888:142:0;;;;;;;;;;;;28399:174;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;28399:174:0;;;;;;;;;;;;34770:119;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;34770:119:0;;;;;;;35432:452;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;35432:452:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;35432:452:0;;;;;25633:98;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;25633:98:0;;;;;23297:103;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;23297:103:0;-1:-1:-1;;;;;23297:103:0;;;;;31266:137;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31266:137:0;;;;4570:49;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;4570:49:0;-1:-1:-1;;;;;4570:49:0;;;;;41255:286;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;41255:286:0;-1:-1:-1;;;;;41255:286:0;;;;;10935:103;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;10935:103:0;;;;;28313:79;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28313:79:0;;;;;;;;-1:-1:-1;;;;;;28313:79:0;;;;;;;;;;;;;;29649:150;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;29649:150:0;-1:-1:-1;;;;;29649:150:0;;;;;;;34282:114;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;34282:114:0;;;;;31701:106;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;31701:106:0;;;;;;;11395:103;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;11395:103:0;-1:-1:-1;;;;;11395:103:0;;;;;168:30;;8:9:-1;5:2;;;30:1;27;20:12;5:2;168:30:0;;;;37496:216;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;37496:216:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37496:216:0;;-1:-1:-1;;;37496:216:0;;-1:-1:-1;;;;;37496:216:0;;-1:-1:-1;37496:216:0;;-1:-1:-1;;;37496:216:0;25026:86;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25026:86:0;;;;32231:109;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;32231:109:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;4498:31;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4498:31:0;;;;30939:259;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;30939:259:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30939:259:0;;;;;38923:263;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;38923:263:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38923:263:0;;;;;;;;;;;;;;33872:404;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;33872:404:0;-1:-1:-1;;;;;33872:404: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;33872:404: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;33872:404:0;;;;;;;;;;;;;;;;;;;319:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;319:20:0;;;;38558:163;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;38558:163:0;-1:-1:-1;;;;;38558:163:0;;;;;24946:76;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24946:76:0;;;;4237:50;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;4237:50:0;;;;;13879:131;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;13879:131:0;-1:-1:-1;;;;;13879:131:0;;;;;;;;;33007:92;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;33007:92:0;;;;;;;37100:219;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;37100:219:0;;;-1:-1:-1;;;;;37100:219:0;;;;;18520:164;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;18520:164:0;-1:-1:-1;;;;;18520:164:0;;;;;;;;;;;;;;;;;;;;;;;;;;41637:739;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41637:739:0;;;;38727:190;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;38727:190:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38727:190:0;;;;;40243:135;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;40243:135:0;;;;;;;;;;;;;;;;;;;4294:37;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4294:37:0;;;;11982:162;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;11982:162:0;-1:-1:-1;;;;;11982:162:0;;;;;;;;;;37997:461;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;37997:461:0;-1:-1:-1;;;;;37997:461:0;;;;;;;;;;;;;;4969:158;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;4969:158:0;-1:-1:-1;;;;;4969:158:0;;;;;36296:636;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;36296:636:0;;;;;;;;;;;;;;;;;;;;;;;;;;35890:400;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;35890:400:0;;;;;;;;;30398:308;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;30398:308:0;-1:-1:-1;;;;;30398:308:0;;;;;20495:280;20566:4;-1:-1:-1;;;;;;20585:26:0;;;;20581:61;;;-1:-1:-1;20629:5:0;20622:12;;20581:61;-1:-1:-1;;;;;;20655:34:0;;20671:18;20655:34;;:76;;-1:-1:-1;;;;;;;20693:38:0;;20709:22;20693:38;20655:76;:114;;;-1:-1:-1;;;;;;;20735:34:0;;20751:18;20735:34;20655:114;20648:121;;20495:280;;;;:::o;203:25::-;;;-1:-1:-1;;;;;203:25:0;;:::o;24870:72::-;24931:5;24924:12;;;;;;;;-1:-1:-1;;24924:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24909:6;;24924:12;;24931:5;;24924:12;;24931:5;24924:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24870:72;;:::o;4394:65::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;12522:118::-;12583:7;12606:28;12626:7;12606:19;:28::i;14587:368::-;14655:14;14672:17;14681:7;14672:8;:17::i;:::-;14655:34;-1:-1:-1;14704:10:0;-1:-1:-1;;;;;14704:20:0;;;;:61;;;14728:37;14746:10;14758:6;14728:17;:37::i;:::-;14696:70;;;;;;;;-1:-1:-1;;;;;14781:18:0;;;;;;;;14773:27;;;;;;14845:8;-1:-1:-1;;;;;14813:40:0;:28;14833:7;14813:19;:28::i;:::-;-1:-1:-1;;;;;14813:40:0;;14809:141;;14864:18;;;;:9;:18;;;;;;:29;;-1:-1:-1;;;;;;14864:29:0;-1:-1:-1;;;;;14864:29:0;;;;;;;;;14907:35;;14864:18;;14907:35;;;;;;;14809:141;14587:368;;;:::o;33220:105::-;33278:7;33301:18;33314:1;33317;33301:12;:18::i;:::-;33294:25;33220:105;-1:-1:-1;;;33220:105:0:o;31409:253::-;31485:10;;-1:-1:-1;;;;;31485:10:0;31471;:24;;:63;;;31499:35;31517:10;31529:4;31499:17;:35::i;:::-;31463:93;;;;;;;-1:-1:-1;;;;;31463:93:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31622:16:0;;;;;:10;:16;;;;;31641:15;31622:34;;31409:253::o;10453:89::-;10499:7;10522:14;:12;:14::i;:::-;10515:21;;10453:89;:::o;42475:468::-;42546:10;42716:22;42528:29;;;:17;:29;;;;;;;;42520:85;;;;;;;-1:-1:-1;;;;;42520:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42668:10;42682:5;42650:29;;;:17;:29;;;;;;;;:37;;-1:-1:-1;;42650:37:0;;;42741:11;;:33;;;;;;;;;;;;;;-1:-1:-1;;;;;42741:11:0;;;;:21;;:33;;;;;42650:29;42741:33;;;;;;;;:11;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;42741:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42741:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42741:33:0;42822:11;;:53;;;;;;42848:10;42822:53;;;;;;;;;;;;42741:33;;-1:-1:-1;;;;;;42822:11:0;;;;:25;;:53;;;;;42741:33;;42822:53;;;;;;;;:11;;:53;;;5:2:-1;;;;30:1;27;20:12;5:2;42822:53:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42822:53:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42822:53:0;42806:131;;;;;;;-1:-1:-1;;;;;42806:131:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42475:468;:::o;30744:189::-;28781:10;;-1:-1:-1;;;;;28781:10:0;28767;:24;;:56;;-1:-1:-1;28812:10:0;28795:28;;;;:16;:28;;;;;;;;28767:56;28751:148;;;;;;;-1:-1:-1;;;;;28751:148:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;28751:148:0;;;;;;;;;;;;;;;;;;;;30833:44;30843:20;30858:1;30861;30843:14;:20::i;:::-;30865:11;30833:9;:44::i;:::-;30884:43;30911:1;30915:11;30884:18;:43::i;33455:411::-;33521:9;;33757:6;33547:12;;;33539:66;;;;;-1:-1:-1;;;;;33539:66:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;33539:66:0;;;;-1:-1:-1;;;;;;;;;;;33539:66:0;;;;;;;;;;;;;;;33620:20;;;33612:76;;;;;-1:-1:-1;;;;;33612:76:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;33612:76:0;;;;-1:-1:-1;;;;;;;;;;;33612:76:0;;;;;;;;;;;;;;;33722:23;;;;;;;;;;;;;;;;33736:1;33722:23;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;33722:23:0;;33697:48;;33766:1;33757:10;;33752:88;33769:12;;;33752:88;;;33808:24;33821:1;;33823;33821:4;;;;;;;;;;;;;33827:1;;33829;33827:4;;;;;;;;;;;;;;;33808:12;:24::i;:::-;33797:5;33803:1;33797:8;;;;;;;;;;-1:-1:-1;;;;;33797:35:0;;;:8;;;;;;;;;;:35;33783:3;;33752:88;;;-1:-1:-1;33855:5:0;33455:411;-1:-1:-1;;;;;33455:411:0:o;3850:43::-;;;;;;;;;;;;;:::o;40739:322::-;40975:6;40822:12;;;40814:66;;;;;-1:-1:-1;;;;;40814:66:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;40814:66:0;;;;-1:-1:-1;;;;;;;;;;;40814:66:0;;;;;;;;;;;;;;;40895:20;;;40887:76;;;;;-1:-1:-1;;;;;40887:76:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;40887:76:0;;;;-1:-1:-1;;;;;;;;;;;40887:76:0;;;;;;;;;;;;;;;-1:-1:-1;40984:1:0;40970:86;40987:12;;;40970:86;;;41015:33;41031:1;;41033;41031:4;;;;;;;;;;;;;41037:1;;41039;41037:4;;;;;;;;;;;;;;;41043;;41015:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41015:15:0;;-1:-1:-1;;;;;41015:33:0:i;:::-;41001:3;;40970:86;;;40739:322;;;;;;;:::o;34929:277::-;35032:14;;-1:-1:-1;;;;;35018:29:0;;;35032:14;;35018:29;;35010:89;;;;;-1:-1:-1;;;;;35010:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35113:87;35137:4;35150:2;35161:7;35113:87;;;;;;;;;;;;;35188:5;35113:15;:87::i;13157:138::-;13237:4;13257:32;13271:8;13281:7;13257:13;:32::i;4338:49::-;;;;;;;;;;;;;;;:::o;23877:249::-;-1:-1:-1;;;;;24027:16:0;;23984:15;24027:16;;;:9;:16;;;;;:23;24019:31;;24011:40;;;;;;24075:6;24066:16;;24058:25;;;;;;-1:-1:-1;;;;;24097:16:0;;;;;;:9;:16;;;;;:23;;24114:5;;24097:23;;;;;;;;;;;;;;24090:30;;23877:249;;;;:::o;25847:73::-;25890:7;25847:73;:::o;30071:321::-;28634:10;;-1:-1:-1;;;;;28634:10:0;28620;:24;28612:88;;;;;-1:-1:-1;;;;;28612:88:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;28612:88:0;;;;-1:-1:-1;;;;;;;;;;;28612:88:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;30156:25:0;;;;30148:53;;;;;-1:-1:-1;;;;;30148:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30216:29:0;;;;;;:16;:29;;;;;;;;:38;30208:80;;;;;-1:-1:-1;;;;;30208:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30297:29:0;;;;;;:16;:29;;;;;;:36;;-1:-1:-1;;30297:36:0;30329:4;30297:36;;;30345:41;30362:10;;30345:41;;;30071:321;:::o;35212:214::-;35276:15;35294:20;35309:1;35312;35294:14;:20::i;:::-;35276:38;;35321:99;35345:17;35354:7;35345:8;:17::i;:::-;35371:2;35382:7;35321:99;;;;;;;;;;;;;35409:4;35321:15;:99::i;:::-;35212:214;;;;:::o;17888:142::-;17980:44;17996:4;18002:2;18006:7;17980:44;;;;;;;;;;;;;18019:4;17980:15;:44::i;28399:174::-;28442:27;;;;;;;;;;;;;;;;;;;;;;;:5;;:27;:::i;:::-;-1:-1:-1;28476:16:0;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;28499:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:12;;:68;:::i;34770:119::-;34825:6;34847:36;34862:20;34877:1;34880;34862:14;:20::i;:::-;34847:14;:36::i;35432:452::-;35667:6;;35512:12;;;35504:66;;;;;-1:-1:-1;;;;;35504:66:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;35504:66:0;;;;-1:-1:-1;;;;;;;;;;;35504:66:0;;;;;;;;;;;;;;;35585:20;;;35577:76;;;;;-1:-1:-1;;;;;35577:76:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;35577:76:0;;;;-1:-1:-1;;;;;;;;;;;35577:76:0;;;;;;;;;;;;;;;35676:1;35667:10;;35662:217;35679:12;;;35662:217;;;35725:26;35740:1;;35742;35740:4;;;;;;;;;;;;;35746:1;;35748;35746:4;;;;;;;;;;;;;;;35725:14;:26::i;:::-;35707:44;;35760:111;35786:17;35795:7;35786:8;:17::i;:::-;35814:2;35827:7;35760:111;;;;;;;;;;;;;35858:4;35760:15;:111::i;:::-;35693:3;;;;;35662:217;;25633:98;25689:4;25709:16;25717:7;25709;:16::i;23297:103::-;-1:-1:-1;;;;;23378:16:0;;;;;;:9;:16;;;;;;;;;23371:23;;;;;;;;;;;;;;;;;23353:9;;23371:23;;;23378:16;23371:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23297:103;;;:::o;31266:137::-;31368:10;31357:22;;;;:10;:22;;;;;31382:15;31357:40;;31266:137::o;4570:49::-;;;;;;;;;;;;;;;:::o;41255:286::-;28634:10;;-1:-1:-1;;;;;28634:10:0;28620;:24;28612:88;;;;;-1:-1:-1;;;;;28612:88:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;28612:88:0;;;;-1:-1:-1;;;;;;;;;;;28612:88:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;41348:29:0;;;;41340:84;;;;;-1:-1:-1;;;;;41340:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41456:11;;41436:49;;-1:-1:-1;;;;;41436:49:0;;;;41456:11;;41436:49;;41456:11;;41436:49;41492:11;:43;;-1:-1:-1;;;;;;41492:43:0;-1:-1:-1;;;;;41492:43:0;;;;;;;;;;41255:286::o;10935:103::-;10992:7;11015:17;11024:7;11015:8;:17::i;28313:79::-;28358:33;;;;;;;;;;;;;;;;28313:79;:::o;29649:150::-;29735:4;29755:38;29775:8;29785:7;29755:19;:38::i;34282:114::-;34345:6;34367:23;34382:7;34367:14;:23::i;31701:106::-;31761:4;31781:20;31796:1;31799;31781:14;:20::i;11395:103::-;11452:7;11475:17;11486:5;11475:10;:17::i;168:30::-;;;-1:-1:-1;;;;;168:30:0;;:::o;37496:216::-;37609:6;37604:103;37625:9;:16;37621:1;:20;37604:103;;;37657:42;37675:9;37685:1;37675:12;;;;;;;;;;;;;;;;;;37689:9;37657:17;:42::i;:::-;37643:3;;37604:103;;25026:86;25094:12;25087:19;;;;;;;;-1:-1:-1;;25087:19:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25072:6;;25087:19;;25094:12;;25087:19;;25094:12;25087:19;;;;;;;;;;;;;;;;;;;;;;;;32231:109;32289:3;32294;32313:21;32328:5;32313:14;:21::i;:::-;32306:28;;;;32231:109;;;;:::o;4498:31::-;;;-1:-1:-1;;;;;4498:31:0;;:::o;30939:259::-;28781:10;;31043:6;;-1:-1:-1;;;;;28781:10:0;28767;:24;;:56;;-1:-1:-1;28812:10:0;28795:28;;;;:16;:28;;;;;;;;28767:56;28751:148;;;;;;;-1:-1:-1;;;;;28751:148:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;28751:148:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31052:1:0;31038:155;31055:12;;;31038:155;;;31083:50;31093:26;31108:1;;31110;31108:4;;;;;;31093:26;31121:11;31083:9;:50::i;:::-;31142:43;31169:1;31173:11;31142:18;:43::i;:::-;31069:3;;31038:155;;;30939:259;;;;;;:::o;38923:263::-;39066:7;39138:42;39152:1;;39138:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;39138:42:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39155:1:0;;-1:-1:-1;39155:1:0;;-1:-1:-1;39155:1:0;;-1:-1:-1;39138:42:0;;;39155:1;;39138:42;39155:1;39138:42;;-1:-1:-1;;39138:42:0;;;;;;;;;;;;;;;;;;;;;;39158:11;;-1:-1:-1;39138:42:0;-1:-1:-1;39171:8:0;;-1:-1:-1;39171:8:0;;-1:-1:-1;39171:8:0;;39138:42;;39171:8;;;;39138:42;;-1:-1:-1;39138:13:0;;-1:-1:-1;;;;;39138:42:0:i;:::-;39131:49;38923:263;-1:-1:-1;;;;;;;;38923:263:0:o;33872:404::-;-1:-1:-1;;;;;33961:16:0;;33947:11;33961:16;;;:9;:16;;;;;;;;:23;34008:14;;;;;;;;;;;;;;;;33926:5;;;;;;;;33947:11;;;;33961:23;34008:14;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;34008:14:0;;33991:31;;34056:3;34046:14;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;34046:14:0;;34029:31;;34117:1;34108:10;;34103:146;34124:3;34120:1;:7;34103:146;;;-1:-1:-1;;;;;34177:16:0;;;;;;:9;:16;;;;;:19;;34162:35;;34177:16;34194:1;;34177:19;;;;;;;;;;;;;;34162:14;:35::i;:::-;34206:4;;34143:54;;-1:-1:-1;34143:54:0;-1:-1:-1;34143:54:0;;34206:1;;34208;;34206:4;;;;;;;;;;;;;;:13;34228:4;;34235:6;;34228:1;;34230;;34228:4;;;;;;;;;;;;;;:13;34129:3;;34103:146;;;-1:-1:-1;34265:1:0;;34268;;-1:-1:-1;33872:404:0;;-1:-1:-1;;;;;33872:404:0:o;319:20::-;;;-1:-1:-1;;;;;319:20:0;;:::o;38558:163::-;28634:10;;-1:-1:-1;;;;;28634:10:0;28620;:24;28612:88;;;;;-1:-1:-1;;;;;28612:88:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;28612:88:0;;;;-1:-1:-1;;;;;;;;;;;28612:88:0;;;;;;;;;;;;;;;38634:14;:42;;-1:-1:-1;;;;;;38634:42:0;-1:-1:-1;;;;;38634:42:0;;;;;;;;38688:27;;;;-1:-1:-1;;38688:27:0;38558:163;:::o;24946:76::-;25009:7;25002:14;;;;;;;;-1:-1:-1;;25002:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24987:6;;25002:14;;25009:7;;25002:14;;25009:7;25002:14;;;;;;;;;;;;;;;;;;;;;;;;4237:50;;;;;;;;;;;;-1:-1:-1;;;;;4237:50:0;;:::o;13879:131::-;13964:40;13983:8;13993:10;13964:18;:40::i;:::-;13879:131;;:::o;33007:92::-;33060:4;33080:13;33088:1;33091;33080:7;:13::i;37100:219::-;37215:7;29434:13;29450:17;29459:7;29450:8;:17::i;:::-;29434:33;;29490:34;29504:10;29516:7;29490:13;:34::i;:::-;:70;;;-1:-1:-1;;;;;;29528:20:0;;;;;;:13;:20;;;;;;;;29549:10;29528:32;;;;;;;;;;29490:70;29474:121;;;;;;;-1:-1:-1;;;;;29474:121:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;37234:23;;;;:14;:23;;;;;;:34;;-1:-1:-1;;;;;;37234:34:0;-1:-1:-1;;;;;37234:34:0;;;;;;;;37280:33;;37234:34;;:23;;37280:33;;37234:23;37280:33;37100:219;;;;:::o;18520:164::-;18628:50;18644:4;18650:2;18654:7;18663:8;;18628:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;18673:4:0;;-1:-1:-1;18628:15:0;;-1:-1:-1;;;;18628:50:0:i;:::-;18520:164;;;;;:::o;41637:739::-;41707:10;41814:22;41689:29;;;:17;:29;;;;;;41814:22;;41689:29;;41688:30;41680:91;;;;;-1:-1:-1;;;;;41680:91:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41839:11;;:33;;;;;;41861:10;41839:33;;;;;;-1:-1:-1;;;;;41839:11:0;;;;:21;;:33;;;;;;;;;;;;;;;:11;;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;41839:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41839:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41839:33:0;;-1:-1:-1;41900:1:0;41883:18;;41879:176;;;41930:11;;:53;;;;;;41956:10;41930:53;;;;;;;;;;;;-1:-1:-1;;;;;41930:11:0;;;;:25;;:53;;;;;;;;;;;;;;;:11;;:53;;;5:2:-1;;;;30:1;27;20:12;5:2;41930:53:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41930:53:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41930:53:0;41912:135;;;;;;;-1:-1:-1;;;;;41912:135:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42115:10;42097:29;;;;:17;:29;;;;;:36;;-1:-1:-1;;42097:36:0;42129:4;42097:36;;;42188:22;;:10;:22::i;:::-;42259:11;;:50;;;;;;42286:10;42259:50;;;;;;;;;;;;42167:43;;-1:-1:-1;;;;;;42259:11:0;;;;:26;;:50;;;;;;;;;;;;;;;:11;;:50;;;5:2:-1;;;;30:1;27;20:12;5:2;42259:50:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42259:50:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42259:50:0;42243:127;;;;;;;-1:-1:-1;;;;;42243:127:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38727:190;38806:7;38875:36;38889:1;;38875:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;38875:36:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38892:1:0;;-1:-1:-1;38892:1:0;;-1:-1:-1;38892:1:0;;-1:-1:-1;38875:36:0;;;38892:1;;38875:36;38892:1;38875:36;;-1:-1:-1;;38875:36:0;;;;;;;;;-1:-1:-1;38875:36:0;;38895:11;;-1:-1:-1;38875:36:0;-1:-1:-1;38875:13:0;;-1:-1:-1;;38875:36:0:i;:::-;38868:43;38727:190;-1:-1:-1;;;;;;38727:190:0:o;40243:135::-;40345:27;40361:1;40364;40367:4;;40345:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40345:15:0;;-1:-1:-1;;;;;40345:27:0:i;4294:37::-;;;-1:-1:-1;;;;;4294:37:0;;:::o;11982:162::-;12075:4;12098:40;12116:11;12129:8;12098:17;:40::i;37997:461::-;-1:-1:-1;;;;;38098:23:0;;38111:10;38098:23;;38090:79;;;;;-1:-1:-1;;;;;38090:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38192:20:0;;38202:10;38192:20;;:68;;;38223:37;38241:6;38249:10;38223:17;:37::i;:::-;38176:119;;;;;;;-1:-1:-1;;;;;38176:119:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38304:21:0;;;;;;;:13;:21;;;;;;;;:32;;;;;;;;;;;;;:44;;-1:-1:-1;;38304:44:0;;;;;;;;;;38362:90;;;;;;;38417:10;;38304:32;:21;38362:90;;;;;;;;;37997:461;;;:::o;4969:158::-;4943:5;;-1:-1:-1;;;;;4943:5:0;4929:10;:19;4922:27;;;;5060:5;;-1:-1:-1;;;;;5047:18:0;;;5060:5;;5047:18;;5039:58;;;;;-1:-1:-1;;;;;5039:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;5104:5;:17;;-1:-1:-1;;;;;;5104:17:0;-1:-1:-1;;;;;5104:17:0;;;;;;;;;;4969:158::o;36296:636::-;36679:6;;36390:12;;;36382:66;;;;;-1:-1:-1;;;;;36382:66:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36382:66:0;;;;-1:-1:-1;;;;;;;;;;;36382:66:0;;;;;;;;;;;;;;;36463:20;;;36455:76;;;;;-1:-1:-1;;;;;36455:76:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;36455:76:0;;;;-1:-1:-1;;;;;;;;;;;36455:76:0;;;;;;;;;;;;;;;36554:14;;:32;;;;;;;;;;;;;;36590:10;;-1:-1:-1;;;;;36554:14:0;;:22;;:32;;;;;;;;;;;;;;:14;;:32;;;5:2:-1;;;;30:1;27;20:12;5:2;36554:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36554:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36554:32:0;-1:-1:-1;;;;;36554:46:0;;36538:127;;;;;-1:-1:-1;;;;;36538:127:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36688:1;36679:10;;36674:253;36691:12;;;36674:253;;;36737:26;36752:1;;36754;36752:4;;;;;;36737:26;36719:44;;36772:147;36798:17;36807:7;36798:8;:17::i;:::-;36834:14;;-1:-1:-1;;;;;36834:14:0;36860:7;36878:17;36886:8;36878:7;:17::i;:::-;36906:4;36772:15;:147::i;:::-;36705:3;;;;;36674:253;;35890:400;35984:14;;:32;;;;;;;;;;;;;;-1:-1:-1;;36020:10:0;;-1:-1:-1;;;;;35984:14:0;;;;:22;;:32;;;;;;;;;;;;;;;-1:-1:-1;35984:14:0;:32;;;5:2:-1;;;;30:1;27;20:12;5:2;35984:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35984:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35984:32:0;-1:-1:-1;;;;;35984:46:0;;35968:127;;;;;-1:-1:-1;;;;;35968:127:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36122:20;36137:1;36140;36122:14;:20::i;:::-;36104:38;;36149:135;36173:17;36182:7;36173:8;:17::i;:::-;36207:14;;-1:-1:-1;;;;;36207:14:0;36231:7;36247:17;36255:8;36247:7;:17::i;30398:308::-;28634:10;;-1:-1:-1;;;;;28634:10:0;28620;:24;28612:88;;;;;-1:-1:-1;;;;;28612:88:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;28612:88:0;;;;-1:-1:-1;;;;;;;;;;;28612:88:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;30480:25:0;;;;30472:53;;;;;-1:-1:-1;;;;;30472:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30540:29:0;;;;;;:16;:29;;;;;;;;30532:70;;;;;;;-1:-1:-1;;;;;30532:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30611:29:0;;30643:5;30611:29;;;:16;:29;;;;;;:37;;-1:-1:-1;;30611:37:0;;;30660:40;30676:10;;30660:40;;;30398:308;:::o;12773:116::-;12842:7;12865:18;;;:9;:18;;;;;;-1:-1:-1;;;;;12865:18:0;;12773:116::o;11042:105::-;11100:7;11123:18;;;:9;:18;;;;;;-1:-1:-1;;;;;11123:18:0;;11042:105::o;12148:156::-;-1:-1:-1;;;;;12265:23:0;;;12242:4;12265:23;;;:10;:23;;;;;;;;:33;;;;;;;;;;;;;;;12148:156::o;33331:118::-;33390:7;33413:30;33422:20;33437:1;33440;33422:14;:20::i;:::-;33413:8;:30::i;10546:82::-;10616:6;;10546:82;:::o;31813:258::-;31874:11;31921:1;-1:-1:-1;;31910:12:0;:27;;;;;31930:7;31926:1;:11;31910:27;:43;;;;;31952:1;-1:-1:-1;;31941:12:0;31910:43;:58;;;;;31961:7;31957:1;:11;31910:58;31894:131;;;;;;;-1:-1:-1;;;;;31894:131:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32039:26;32060:1;32063;32039:20;:26::i;16606:200::-;16687:18;;;;:9;:18;;;;;;-1:-1:-1;;;;;16687:18:0;:23;16679:32;;;;;;16720:33;16732:11;16745:7;16720:11;:33::i;:::-;16792:7;16779:11;-1:-1:-1;;;;;16767:33:0;16776:1;16767:33;;;;;;;;;;16606:200;;:::o;43612:246::-;-1:-1:-1;;;;;43688:24:0;;;;;;:17;:24;;;;;;;;43684:82;;;43723:11;;:35;;;;;;-1:-1:-1;;;;;43723:35:0;;;;;;;:11;:35;;;;;;:11;;;;;:25;;:35;;;;;;;;;;;;;;:11;;:35;;;5:2:-1;;;;30:1;27;20:12;5:2;43723:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43723:35:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;43684:82:0;-1:-1:-1;;;;;43778:22:0;;;;;;:17;:22;;;;;;;;43774:79;;;43811:11;;:34;;;;;;-1:-1:-1;;;;;43811:34:0;;;;;;;:11;:34;;;;;;:11;;;;;:26;;:34;;;;;;;;;;;;;;:11;;:34;;;5:2:-1;;;;30:1;27;20:12;5:2;43811:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43811:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;40384:349:0;40528:15;40573:13;40496:20;40511:1;40514;40496:14;:20::i;:::-;29191:17;29200:7;29191:8;:17::i;:::-;-1:-1:-1;;;;;29177:31:0;:10;-1:-1:-1;;;;;29177:31:0;;:76;;;;29219:34;29233:10;29245:7;29219:13;:34::i;:::-;29177:127;;;;29264:40;29284:10;29296:7;29264:19;:40::i;:::-;29161:199;;;;;;;-1:-1:-1;;;;;29161:199:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40546:20;40561:1;40564;40546:14;:20::i;:::-;40589:18;;;;:9;:18;;;;;;40528:38;;-1:-1:-1;;;;;;40589:18:0;;-1:-1:-1;40616:22:0;40528:38;40633:4;40616:7;:22::i;:::-;40697:10;-1:-1:-1;;;;;40652:75:0;40683:5;-1:-1:-1;;;;;40652:75:0;40667:7;40652:75;40716:4;40652:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;40652:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40384:349;;;;;;:::o;42949:337::-;43135:1;43101:23;;;:14;:23;;;;;:36;;-1:-1:-1;;;;;;43101:36:0;;;43144:28;43163:4;43169:2;43144:18;:28::i;:::-;43179:101;43209:4;43222:2;43233:7;43249:8;43266:7;43179:21;:101::i;13299:314::-;13380:4;;-1:-1:-1;;;;;13404:13:0;;;;13396:22;;;;;;13441:17;13450:7;13441:8;:17::i;:::-;13425:33;;13481:5;-1:-1:-1;;;;;13469:17:0;:8;-1:-1:-1;;;;;13469:17:0;;13465:51;;;13504:4;13497:11;;;;13465:51;13529:34;13547:5;13554:8;13529:17;:34::i;:::-;:78;;;;13599:8;-1:-1:-1;;;;;13567:40:0;:28;13587:7;13567:19;:28::i;:::-;-1:-1:-1;;;;;13567:40:0;;13529:78;13522:85;;13299:314;;;;;;:::o;34402:362::-;34466:6;34481:14;34498:17;34507:7;34498:8;:17::i;:::-;34481:34;;34526:19;34538:6;34526:11;:19::i;:::-;:56;;;;-1:-1:-1;34567:14:0;;-1:-1:-1;;;;;34549:33:0;;;34567:14;;34549:33;;34526:56;34522:204;;;28358:33;;;;;;;;;;;;;;;;34597:48;;;-1:-1:-1;;;;;;34597:48:0;;;;;;;-1:-1:-1;;;;;34597:34:0;;;;;:48;;;;;;;;;;;;;;-1:-1:-1;34597:34:0;:48;;;5:2:-1;;;;30:1;27;20:12;5:2;34597:48:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34597:48:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34597:48:0;34593:126;;;34681:6;-1:-1:-1;;;;;34665:35:0;;34701:7;34665:44;;;;;-1:-1:-1;;;34665:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34665:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34665:44:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;34665:44:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;34665:44:0;;;;;;20:11:-1;15:3;12:20;9:2;;;45:1;42;35:12;9:2;64:21;;126:4;117:14;;142:31;;;139:2;;;186:1;183;176:12;139:2;218:10;;268:11;251:29;;293:43;;;290:58;-1:-1;239:118;236:2;;;370:1;367;360:12;236:2;-1:-1;34665:44:0;;-1:-1:-1;34658:51:0;;-1:-1:-1;;;;34658:51:0;34593:126;34739:19;;;;:10;:19;;;;;;;;;34732:26;;;;;;-1:-1:-1;;34732:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34739:19;;34732:26;;34739:19;34732:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34402:362;;;;;:::o;25735:106::-;25792:4;25812:18;;;:9;:18;;;;;;-1:-1:-1;;;;;25812:18:0;:23;;;25735:106::o;29805:260::-;29892:4;29905:13;29921:17;29930:7;29921:8;:17::i;:::-;29905:33;;29963:8;-1:-1:-1;;;;;29954:17:0;:5;-1:-1:-1;;;;;29954:17:0;;:64;;;-1:-1:-1;29983:23:0;;;;:14;:23;;;;;;-1:-1:-1;;;;;29983:35:0;;;:23;;:35;29954:64;:105;;;-1:-1:-1;;;;;;30029:20:0;;;;;;;:13;:20;;;;;;;;:30;;;;;;;;;;;;29947:112;;29805:260;;;;;:::o;11502:110::-;-1:-1:-1;;;;;11583:16:0;11560:7;11583:16;;;:9;:16;;;;;:23;;11502:110::o;32553:260::-;32612:5;32619;32642:27;32663:5;32642:20;:27::i;:::-;32633:36;;-1:-1:-1;32633:36:0;-1:-1:-1;;;32692:12:0;-1:-1:-1;32692:27:0;;;;;32712:7;32708:1;:11;32692:27;:43;;;;;32734:1;-1:-1:-1;;32723:12:0;32692:43;:58;;;;;32743:7;32739:1;:11;32692:58;32676:131;;;;;;;-1:-1:-1;;;;;32676:131:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39192:816;39324:7;39582:21;39655:31;39725:6;39765:15;39362:1;39351;:8;:12;39343:66;;;;;;;-1:-1:-1;;;;;39343:66:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;39343:66:0;;;;-1:-1:-1;;;;;;;;;;;39343:66:0;;;;;;;;;;;;;;;39436:8;;39424;;:20;39416:76;;;;;-1:-1:-1;;;;;39416:76:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;39416:76:0;;;;-1:-1:-1;;;;;;;;;;;39416:76:0;;;;;;;;;;;;;;;39515:14;;-1:-1:-1;;;;;39515:14:0;39507:28;;39499:74;;;;;-1:-1:-1;;;;;39499:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39606:14;;:42;;;;;;-1:-1:-1;;;;;39606:42:0;;;;;;;;;;;;;;;;;;;;;;;:14;;;;;:19;;39626:11;;39639:8;;39606:42;;;;;;;;;;;;:14;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;39606:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39606:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39606:42:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39606:42:0;;-1:-1:-1;39689:22:0;39606:42;39689:7;:22::i;:::-;39655:56;;39734:1;39725:10;;39720:254;39741:1;:8;39737:1;:12;39720:254;;;39783:26;39798:1;39800;39798:4;;;;;;;;;;;;;;;;;;39804:1;39806;39804:4;;;;;;;;;;;;;;;;;;39783:14;:26::i;:::-;39765:44;;39818:148;39844:17;39853:7;39844:8;:17::i;:::-;39880:14;;-1:-1:-1;;;;;39880:14:0;39906:7;39924:18;39880:14;39818:15;:148::i;:::-;39751:3;;;;;39720:254;;;-1:-1:-1;39989:13:0;;39192:816;-1:-1:-1;;;;;;;39192:816:0:o;14014:395::-;14097:10;14093:251;;;14127:39;14145:10;14157:8;14127:17;:39::i;:::-;14126:40;14118:49;;;;;;14176:39;14194:8;14204:10;14176:17;:39::i;:::-;14093:251;;;14246:39;14264:10;14276:8;14246:17;:39::i;:::-;14238:48;;;;;;;;14295:41;14315:8;14325:10;14295:19;:41::i;:::-;14355:48;;;;;;;;;;-1:-1:-1;;;;;14355:48:0;;;14370:10;;14355:48;;;;;;;;;14014:395;;:::o;33105:109::-;33159:4;33179:29;33187:20;33202:1;33205;33187:14;:20::i;:::-;33179:7;:29::i;40014:191::-;40085:13;;;40095:2;40085:13;;;;;;;;;40065:7;;40085:13;;;17:15:-1;;105:10;40085:13:0;88:34:-1;-1:-1;;;40191:2:0;40184:10;;40177:21;;;;-1:-1:-1;40184:10:0;40175:25::o;32077:148::-;4125:35;32166:16;;-1:-1:-1;;32165:29:0;4028:66;32199:19;;32164:55;32077:148;;;;:::o;15250:242::-;15348:14;15316:18;;;:9;:18;;;;;:23;;-1:-1:-1;;;;;;15316:23:0;-1:-1:-1;;;;;15316:23:0;;;;;15365:14;15316:23;15365:10;:14::i;:::-;-1:-1:-1;;;;;15388:13:0;;;;;;:9;:13;;;;;;;;27:10:-1;;39:1;23:18;;;45:23;;15388:27:0;;;;;;;;;;15424:22;;;:13;:22;;;;;;:31;;;15473:6;;15348:31;;-1:-1:-1;15473:13:0;;:6;:13;:10;:13;:::i;:::-;15464:6;:22;-1:-1:-1;;;15250:242:0:o;25230:95::-;25293:19;;;;:10;:19;;;;;;;;:26;;;;;;;;:::i;19215:235::-;19363:7;17232:34;17246:10;17258:7;17232:13;:34::i;:::-;17224:43;;;;;;;;19396:48;19407:4;19413:2;19417:7;19426:8;19436:7;19396:10;:48::i;43292:213::-;43350:4;43459:17;;43491:8;;43292:213::o;32346:201::-;32411:5;;32436:51;32461:25;-1:-1:-1;;32462:16:0;;32461:25;32436:24;:51::i;:::-;32432:55;;32498:43;4028:66;32523:5;:17;32498:24;:43::i;:::-;32494:47;;32346:201;;;:::o;14961:117::-;-1:-1:-1;;;;;15037:18:0;;;;;;;:10;:18;;;;;;;;:28;;;;;;;;;;;;:35;;-1:-1:-1;;15037:35:0;15068:4;15037:35;;;14961:117::o;15084:120::-;-1:-1:-1;;;;;15162:18:0;;;15193:5;15162:18;;;:10;:18;;;;;;;;:28;;;;;;;;;;;;:36;;-1:-1:-1;;15162:36:0;;;15084:120::o;6573:132::-;6655:7;;;6676;;;;6669:15;;;;6573:132;;;;:::o;19456:733::-;19708:14;19605:2;-1:-1:-1;;;;;17469:16:0;;;;17461:25;;;;;;19637:7;19646:2;17603;-1:-1:-1;;;;;17582:23:0;:17;17591:7;17582:8;:17::i;:::-;-1:-1:-1;;;;;17582:23:0;;;17574:32;;;;;;19670:4;19676:7;17378:4;-1:-1:-1;;;;;17357:25:0;:17;17366:7;17357:8;:17::i;:::-;-1:-1:-1;;;;;17357:25:0;;17349:34;;;;;;19725:18;;;;:9;:18;;;;;;-1:-1:-1;;;;;19725:18:0;;-1:-1:-1;19750:31:0;19725:18;19735:7;19750:14;:31::i;:::-;19788:33;19805:6;19813:7;19788:16;:33::i;:::-;19828:24;19840:2;19844:7;19828:11;:24::i;:::-;19885:7;19881:2;-1:-1:-1;;;;;19864:29:0;19873:6;-1:-1:-1;;;;;19864:29:0;;;;;;;;;;;19906:7;:26;;;;;19917:15;19929:2;19917:11;:15::i;:::-;19902:282;;;9394:10;-1:-1:-1;;;20152:15:0;20051:116;;;20067:2;-1:-1:-1;;;;;20051:36:0;;20100:10;20112:6;20120:7;20129:8;20051:97;;;;;-1:-1:-1;;;20051:97:0;;;;;;;-1:-1:-1;;;;;20051:97:0;-1:-1:-1;;;;;20051:97:0;;;;;;-1:-1:-1;;;;;20051:97:0;-1:-1:-1;;;;;20051:97: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;20051:97:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20051:97:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20051:97:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20051:97:0;-1:-1:-1;;;;;;20051:116:0;;20033:143;;;;;;17613:1;;17493;;19456:733;;;;;;;:::o;32819:182::-;32888:3;32913:6;32904:16;;:21;32900:72;;-1:-1:-1;;;32947:16:0;;32936:28;;32900:72;-1:-1:-1;32989:5:0;32819:182::o;16335:219::-;16433:6;-1:-1:-1;;;;;16412:27:0;:17;16421:7;16412:8;:17::i;:::-;-1:-1:-1;;;;;16412:27:0;;:54;;;;-1:-1:-1;16443:18:0;;;;:9;:18;;;;;;-1:-1:-1;;;;;16443:18:0;:23;;16412:54;16408:141;;;16498:1;16477:18;;;:9;:18;;;;;;:22;;-1:-1:-1;;;;;;16477:22:0;;;16513:28;16487:7;;16498:1;-1:-1:-1;;;;;16513:28:0;;;;;16498:1;;16513:28;16335:219;;:::o;15498:831::-;15571:18;15592:22;;;:13;:22;;;;;;;15571:18;15646:23;15667:1;15646:16;15657:4;15646:10;:16::i;:::-;:20;:23;:20;:23;:::i;:::-;-1:-1:-1;;;;;15698:15:0;;;;;;:9;:15;;;;;:31;;15621:48;;-1:-1:-1;15698:15:0;15621:48;;15698:31;;;;;;;;;;;;;;;;;;15738:18;;;:9;:18;;;;;;:22;;-1:-1:-1;;;;;;15738:22:0;;;-1:-1:-1;;;;;15864:15:0;;;;:9;:15;;;;;:27;;15698:31;;-1:-1:-1;15698:31:0;;15880:10;;15864:27;;;;;;;;;;;;;;;;;:41;;;;-1:-1:-1;;;;;15939:15:0;;;;:9;:15;;;;;;:31;;15955:14;;15939:31;;;;;;;;;;;;;;;;;:35;;;;-1:-1:-1;;;;;15981:15:0;;;;:9;:15;;;;;;:24;;;;;-1:-1:-1;;15981:24:0;;;:::i;:::-;-1:-1:-1;;;;;;16092:15:0;;;;;;:9;:15;;;;;:22;:27;16088:72;;;-1:-1:-1;;;;;16137:15:0;;;;;;:9;:15;;;;;16130:22;;;:::i;:::-;16245:1;16220:22;;;:13;:22;;;;;;:26;;;16253;;;;;:39;;;16310:6;;:13;;16321:1;16310:13;:10;:13;:::i;:::-;16301:6;:22;-1:-1:-1;;;;;15498:831:0:o;6387:119::-;6447:7;6470:8;;;;6463:16;;;;-1:-1:-1;6493:7:0;;;6387:119::o;28232:15629::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28232:15629:0;;;-1:-1:-1;28232:15629:0;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Swarm Source

bzzr://60dd553b8b9313990355b3a660fdf52c893d125560ffa4ca954f3f3ecd4818ef

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.