Token 0xUniverse

 

Overview [ERC-20]

Max Total Supply:
403,028 PLANET

Holders:
10,837 (0.00%)

Transfers:
-

 
Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

OVERVIEW

0xUniverse is the next generation blockchain game where players can build spaceships, explore the galaxy, and colonize planets.

# Exchange Pair Price  24H Volume % Volume
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
UniverseGalaxy

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 2019-09-22
*/

pragma solidity 0.4.24;

// File: contracts/Auction/ISaleClockAuction.sol

contract ISaleClockAuction {

    function isSaleClockAuction() public returns(bool);


    /// @dev Creates and begins a new auction.
    /// @param _tokenId - ID of token to auction, sender must be owner.
    /// @param _startingPrice - Price of item (in wei) at beginning of auction.
    /// @param _endingPrice - Price of item (in wei) at end of auction.
    /// @param _duration - Length of auction (in seconds).
    /// @param _seller - Seller, if not the message sender
    function createAuction(
        uint256 _tokenId,
        uint256 _startingPrice,
        uint256 _endingPrice,
        uint256 _duration,
        address _seller
    )
    external;

    /// @dev Updates lastSalePrice if seller is the nft contract
    /// Otherwise, works the same as default bid method.
    function bid(uint256 _tokenId)
    external
    payable;

    function cancelAuction(uint256 _tokenId)
    external;

    // cancel all old auctions
    function clearAll(address _seller, uint planetLimitation)
    external;

    // cancel an old auction for the token id
    function clearOne(address _seller, uint256 _tokenId)
    external;

    function averageExpansionSalePrice(uint256 _rarity) external view returns (uint256);

    function withdrawBalance() external;
}

// File: contracts/Common/ArrayArchiveTools.sol

contract ArrayArchiveTools {

    function _splitUint40ToArray(uint256 _hash) internal pure returns (uint256[5] _array) {
        for (uint i = 0; i < 5; i++) {
            _array[i] = uint256(uint8(_hash >> (8 * i)));
        }
    }

    function _mergeArrayToUint40(uint256[5] _array) internal pure returns (uint256 _hash) {
        for (uint i = 0; i < 5; i++) {
            _hash |= (_array[i] << (8 * i));
        }
    }

    function _splitUint80ToArray(uint256 _hash) internal pure returns (uint256[5] _array) {
        for (uint i = 0; i < 5; i++) {
            _array[i] = uint256(uint16(_hash >> (16 * i)));
        }
    }

    function _mergeArrayToUint80(uint256[5] _array) internal pure returns (uint256 _hash) {
        for (uint i = 0; i < 5; i++) {
            _hash |= (_array[i] << (16 * i));
        }
    }
}

// File: contracts/Common/MathTools.sol

contract MathTools {
    function _divisionWithRound(uint _numerator, uint _denominator) internal pure returns (uint _r) {
        _r = _numerator / _denominator;
        if (_numerator % _denominator >= _denominator / 2) {
            _r++;
        }
    }
}

// File: contracts/Discovery/UniverseDiscoveryConstant.sol

//TODO: run as separate contract
contract UniverseDiscoveryConstant {
    //ships
    uint256 internal constant MAX_RANKS_COUNT = 20;

    //resources
    uint256 internal constant MAX_ID_LIST_LENGTH = 5;
}

// File: contracts/PlanetExploration/IUniversePlanetExploration.sol

contract IUniversePlanetExploration is UniverseDiscoveryConstant {

    function isUniversePlanetExploration() external returns(bool);

    function explorePlanet(uint256 _rarity)
    external
    returns (
        uint[MAX_ID_LIST_LENGTH] resourcesId,
        uint[MAX_ID_LIST_LENGTH] resourcesVelocity
    );
}

// File: openzeppelin-solidity/contracts/ownership/Ownable.sol

/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 */
contract Ownable {
  address public owner;


  event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);


  /**
   * @dev The Ownable constructor sets the original `owner` of the contract to the sender
   * account.
   */
  function Ownable() public {
    owner = msg.sender;
  }

  /**
   * @dev Throws if called by any account other than the owner.
   */
  modifier onlyOwner() {
    require(msg.sender == owner);
    _;
  }

  /**
   * @dev Allows the current owner to transfer control of the contract to a newOwner.
   * @param newOwner The address to transfer ownership to.
   */
  function transferOwnership(address newOwner) public onlyOwner {
    require(newOwner != address(0));
    emit OwnershipTransferred(owner, newOwner);
    owner = newOwner;
  }

}

// File: contracts/Access/Treasurer.sol

contract Treasurer is Ownable {
    address public treasurer;

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyTreasurer() {
        require(msg.sender == treasurer, "Only treasurer");
        _;
    }

    function transferTreasurer(address _treasurer) public onlyOwner {
        if (_treasurer != address(0)) {
            treasurer = _treasurer;
        }
    }
}

// File: openzeppelin-solidity/contracts/lifecycle/Pausable.sol

/**
 * @title Pausable
 * @dev Base contract which allows children to implement an emergency stop mechanism.
 */
contract Pausable is Ownable {
  event Pause();
  event Unpause();

  bool public paused = false;


  /**
   * @dev Modifier to make a function callable only when the contract is not paused.
   */
  modifier whenNotPaused() {
    require(!paused);
    _;
  }

  /**
   * @dev Modifier to make a function callable only when the contract is paused.
   */
  modifier whenPaused() {
    require(paused);
    _;
  }

  /**
   * @dev called by the owner to pause, triggers stopped state
   */
  function pause() onlyOwner whenNotPaused public {
    paused = true;
    emit Pause();
  }

  /**
   * @dev called by the owner to unpause, returns to normal state
   */
  function unpause() onlyOwner whenPaused public {
    paused = false;
    emit Unpause();
  }
}

// File: contracts/Access/AccessControl.sol

contract AccessControl is Ownable, Treasurer, Pausable {

    modifier onlyTeam() {
        require(
            msg.sender == owner ||
            msg.sender == treasurer
        , "Only owner and treasure have access"
        );
        _;
    }

    function pause() public onlyTeam {
        return super.pause();
    }
}

// File: contracts/Common/Random.sol

//TODO: Should be moved to separate library
contract Random {
    uint internal saltForRandom;

    function _rand() internal returns (uint256) {
        uint256 lastBlockNumber = block.number - 1;

        uint256 hashVal = uint256(blockhash(lastBlockNumber));

        // This turns the input data into a 100-sided die
        // by dividing by ceil(2 ^ 256 / 100).
        uint256 factor = 1157920892373161954235709850086879078532699846656405640394575840079131296399;

        saltForRandom += uint256(msg.sender) % 100 + uint256(uint256(hashVal) / factor);

        return saltForRandom;
    }

    function _randRange(uint256 min, uint256 max) internal returns (uint256) {
        return uint256(keccak256(_rand())) % (max - min + 1) + min;
    }

    function _randChance(uint percent) internal returns (bool) {
        return _randRange(0, 100) < percent;
    }

    function _now() internal view returns (uint256) {
        return now;
    }
}

// File: contracts/Settings/IUniverseBalance.sol

contract IUniverseBalance {
    function isUniverseBalance() external returns(bool);

    function autoClearAuction() external returns(bool);

    function getUIntValue(uint record) external view returns (uint);
    function getUIntArray2Value(uint record) external view returns (uint[2]);
    function getUIntArray3Value(uint record) external view returns (uint[3]);
    function getUIntArray4Value(uint record) external view returns (uint[4]);

    function getRankParamsValue(uint rankId) external view returns (uint[3]);
    function getRankResourcesCountByRarity(uint rankId) external view returns (uint[4]);

    function getGroupId(uint _x, uint _y) external view returns (uint);

    function getResourcesQuantityByRarity(uint256 rarity) external pure returns (uint256[2]);
}

// File: contracts/Galaxy/UniverseGalaxyConstant.sol

//TODO: run as separate contract
contract UniverseGalaxyConstant {
    //map
    uint256 internal constant SECTOR_X_MAX = 25;
    uint256 internal constant SECTOR_Y_MAX = 40;

    uint256 internal constant PLANETS_COUNT = 1000000;

    uint256 internal constant SECTORS_COUNT = SECTOR_X_MAX * SECTOR_Y_MAX; // 1000

    uint256 internal constant PLANETS_COUNT_PER_SECTOR = PLANETS_COUNT / SECTORS_COUNT; // 1000000 / 1000 = 1000

    //resources
    uint256 internal constant MAX_ID_LIST_LENGTH = 5;
}

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

/**
 * @title ERC721 Non-Fungible Token Standard basic interface
 * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
contract ERC721Basic {
  event Transfer(address indexed _from, address indexed _to, uint256 _tokenId);
  event Approval(address indexed _owner, address indexed _approved, uint256 _tokenId);
  event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);

  function balanceOf(address _owner) public view returns (uint256 _balance);
  function ownerOf(uint256 _tokenId) public view returns (address _owner);
  function exists(uint256 _tokenId) public view returns (bool _exists);

  function approve(address _to, uint256 _tokenId) public;
  function getApproved(uint256 _tokenId) public view returns (address _operator);

  function setApprovalForAll(address _operator, bool _approved) public;
  function isApprovedForAll(address _owner, address _operator) public view returns (bool);

  function transferFrom(address _from, address _to, uint256 _tokenId) public;
  function safeTransferFrom(address _from, address _to, uint256 _tokenId) public;
  function safeTransferFrom(
    address _from,
    address _to,
    uint256 _tokenId,
    bytes _data
  )
    public;
}

// File: contracts/Galaxy/IUniverseGalaxy.sol

contract IUniverseGalaxy is ERC721Basic, UniverseGalaxyConstant{

    function getPlanet(uint256 _id) external view
    returns (
        uint256 rarity,
        uint256 discovered,
        uint256 sectorX,
        uint256 sectorY,
        uint256[MAX_ID_LIST_LENGTH] resourcesId,
        uint256[MAX_ID_LIST_LENGTH] resourcesVelocity
    );

    function createSaleAuction(uint256 _planetId, uint256 _startingPrice, uint256 _endingPrice, uint256 _duration) external;

    function findAvailableResource(address _owner, uint _rarity) external returns (int8);
    function getDiscoveredPlanetsDensity(uint sectorX, uint sectorY) external view returns (uint);

    function createPlanet(
        address _owner,
        uint256 _rarity,
        uint256 _sectorX,
        uint256 _sectorY,
        uint256 _startPopulation
    ) external returns(uint256);

    function spendResources(address _owner, uint[MAX_ID_LIST_LENGTH] _resourcesId, uint[MAX_ID_LIST_LENGTH] _resourcesNeeded) external;

    function spendResourceOnPlanet(address _owner, uint _planetId, uint _resourceId, uint _resourceValue) external;

    function spendKnowledge(address _owner, uint _spentKnowledge) external;

    function recountPlanetResourcesAndUserKnowledge(address _owner, uint256 _planetId) external;

    function countPlanetsByRarityInGroup(uint _groupIndex, uint _rarity) external view returns (uint);

    function countPlanetsByRarity(uint _rarity) external view returns (uint);

    function checkWhetherEnoughPromoPlanet() external;
}

// File: openzeppelin-solidity/contracts/ownership/Whitelist.sol

/**
 * @title Whitelist
 * @dev The Whitelist contract has a whitelist of addresses, and provides basic authorization control functions.
 * @dev This simplifies the implementation of "user permissions".
 */
contract Whitelist is Ownable {
  mapping(address => bool) public whitelist;

  event WhitelistedAddressAdded(address addr);
  event WhitelistedAddressRemoved(address addr);

  /**
   * @dev Throws if called by any account that's not whitelisted.
   */
  modifier onlyWhitelisted() {
    require(whitelist[msg.sender]);
    _;
  }

  /**
   * @dev add an address to the whitelist
   * @param addr address
   * @return true if the address was added to the whitelist, false if the address was already in the whitelist
   */
  function addAddressToWhitelist(address addr) onlyOwner public returns(bool success) {
    if (!whitelist[addr]) {
      whitelist[addr] = true;
      emit WhitelistedAddressAdded(addr);
      success = true;
    }
  }

  /**
   * @dev add addresses to the whitelist
   * @param addrs addresses
   * @return true if at least one address was added to the whitelist,
   * false if all addresses were already in the whitelist
   */
  function addAddressesToWhitelist(address[] addrs) onlyOwner public returns(bool success) {
    for (uint256 i = 0; i < addrs.length; i++) {
      if (addAddressToWhitelist(addrs[i])) {
        success = true;
      }
    }
  }

  /**
   * @dev remove an address from the whitelist
   * @param addr address
   * @return true if the address was removed from the whitelist,
   * false if the address wasn't in the whitelist in the first place
   */
  function removeAddressFromWhitelist(address addr) onlyOwner public returns(bool success) {
    if (whitelist[addr]) {
      whitelist[addr] = false;
      emit WhitelistedAddressRemoved(addr);
      success = true;
    }
  }

  /**
   * @dev remove addresses from the whitelist
   * @param addrs addresses
   * @return true if at least one address was removed from the whitelist,
   * false if all addresses weren't in the whitelist in the first place
   */
  function removeAddressesFromWhitelist(address[] addrs) onlyOwner public returns(bool success) {
    for (uint256 i = 0; i < addrs.length; i++) {
      if (removeAddressFromWhitelist(addrs[i])) {
        success = true;
      }
    }
  }

}

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

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
contract ERC721Enumerable is ERC721Basic {
  function totalSupply() public view returns (uint256);
  function tokenOfOwnerByIndex(address _owner, uint256 _index) public view returns (uint256 _tokenId);
  function tokenByIndex(uint256 _index) public view returns (uint256);
}


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


/**
 * @title ERC-721 Non-Fungible Token Standard, full implementation interface
 * @dev See https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
contract ERC721 is ERC721Basic, ERC721Enumerable, ERC721Metadata {
}

// File: openzeppelin-solidity/contracts/AddressUtils.sol

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

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

}

// 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) {
    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: openzeppelin-solidity/contracts/token/ERC721/ERC721Receiver.sol

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 *  from ERC721 asset contracts.
 */
contract ERC721Receiver {
  /**
   * @dev Magic value to be returned upon successful reception of an NFT
   *  Equals to `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`,
   *  which can be also obtained as `ERC721Receiver(0).onERC721Received.selector`
   */
  bytes4 constant ERC721_RECEIVED = 0xf0b9e5ba;

  /**
   * @notice Handle the receipt of an NFT
   * @dev The ERC721 smart contract calls this function on the recipient
   *  after a `safetransfer`. This function MAY throw to revert and reject the
   *  transfer. This function MUST use 50,000 gas or less. Return of other
   *  than the magic value MUST result in the transaction being reverted.
   *  Note: the contract address is always the message sender.
   * @param _from The sending address
   * @param _tokenId The NFT identifier which is being transfered
   * @param _data Additional data with no specified format
   * @return `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`
   */
  function onERC721Received(address _from, uint256 _tokenId, bytes _data) public returns(bytes4);
}

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

/**
 * @title ERC721 Non-Fungible Token Standard basic implementation
 * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
contract ERC721BasicToken is ERC721Basic {
  using SafeMath for uint256;
  using AddressUtils for address;

  // Equals to `bytes4(keccak256("onERC721Received(address,uint256,bytes)"))`
  // which can be also obtained as `ERC721Receiver(0).onERC721Received.selector`
  bytes4 constant ERC721_RECEIVED = 0xf0b9e5ba;

  // Mapping from token ID to owner
  mapping (uint256 => address) internal tokenOwner;

  // Mapping from token ID to approved address
  mapping (uint256 => address) internal tokenApprovals;

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

  // Mapping from owner to operator approvals
  mapping (address => mapping (address => bool)) internal operatorApprovals;

  /**
   * @dev Guarantees msg.sender is owner of the given token
   * @param _tokenId uint256 ID of the token to validate its ownership belongs to msg.sender
   */
  modifier onlyOwnerOf(uint256 _tokenId) {
    require(ownerOf(_tokenId) == msg.sender);
    _;
  }

  /**
   * @dev Checks msg.sender can transfer a token, by being owner, approved, or operator
   * @param _tokenId uint256 ID of the token to validate
   */
  modifier canTransfer(uint256 _tokenId) {
    require(isApprovedOrOwner(msg.sender, _tokenId));
    _;
  }

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

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

  /**
   * @dev Returns whether the specified token exists
   * @param _tokenId uint256 ID of the token to query the existance of
   * @return whether the token exists
   */
  function exists(uint256 _tokenId) public view returns (bool) {
    address owner = tokenOwner[_tokenId];
    return owner != address(0);
  }

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

    if (getApproved(_tokenId) != address(0) || _to != address(0)) {
      tokenApprovals[_tokenId] = _to;
      emit Approval(owner, _to, _tokenId);
    }
  }

  /**
   * @dev Gets the approved address for a token ID, or zero if no address set
   * @param _tokenId uint256 ID of the token to query the approval of
   * @return address currently approved for a the given token ID
   */
  function getApproved(uint256 _tokenId) public view returns (address) {
    return tokenApprovals[_tokenId];
  }

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

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

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

    clearApproval(_from, _tokenId);
    removeTokenFrom(_from, _tokenId);
    addTokenTo(_to, _tokenId);

    emit Transfer(_from, _to, _tokenId);
  }

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

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

  /**
   * @dev Returns whether the given spender can transfer a given token ID
   * @param _spender address of the spender to query
   * @param _tokenId uint256 ID of the token to be transferred
   * @return bool whether the msg.sender is approved for the given token ID,
   *  is an operator of the owner, or is the owner of the token
   */
  function isApprovedOrOwner(address _spender, uint256 _tokenId) internal view returns (bool) {
    address owner = ownerOf(_tokenId);
    return _spender == owner || getApproved(_tokenId) == _spender || isApprovedForAll(owner, _spender);
  }

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

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

  /**
   * @dev Internal function to clear current approval of a given token ID
   * @dev Reverts if the given address is not indeed the owner of the token
   * @param _owner owner of the token
   * @param _tokenId uint256 ID of the token to be transferred
   */
  function clearApproval(address _owner, uint256 _tokenId) internal {
    require(ownerOf(_tokenId) == _owner);
    if (tokenApprovals[_tokenId] != address(0)) {
      tokenApprovals[_tokenId] = address(0);
      emit Approval(_owner, address(0), _tokenId);
    }
  }

  /**
   * @dev Internal function to add a token ID to the list of a given address
   * @param _to address representing the new owner of the given token ID
   * @param _tokenId uint256 ID of the token to be added to the tokens list of the given address
   */
  function addTokenTo(address _to, uint256 _tokenId) internal {
    require(tokenOwner[_tokenId] == address(0));
    tokenOwner[_tokenId] = _to;
    ownedTokensCount[_to] = ownedTokensCount[_to].add(1);
  }

  /**
   * @dev Internal function to remove a token ID from the list of a given address
   * @param _from address representing the previous owner of the given token ID
   * @param _tokenId uint256 ID of the token to be removed from the tokens list of the given address
   */
  function removeTokenFrom(address _from, uint256 _tokenId) internal {
    require(ownerOf(_tokenId) == _from);
    ownedTokensCount[_from] = ownedTokensCount[_from].sub(1);
    tokenOwner[_tokenId] = address(0);
  }

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

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

/**
 * @title Full ERC721 Token
 * This implementation includes all the required and some optional functionality of the ERC721 standard
 * Moreover, it includes approve all functionality using operator terminology
 * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
 */
contract ERC721Token is ERC721, ERC721BasicToken {
  // Token name
  string internal name_;

  // Token symbol
  string internal symbol_;

  // Mapping from owner to list of owned token IDs
  mapping (address => uint256[]) internal ownedTokens;

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

  // Array with all token ids, used for enumeration
  uint256[] internal allTokens;

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

  // Optional mapping for token URIs
  mapping(uint256 => string) internal tokenURIs;

  /**
   * @dev Constructor function
   */
  function ERC721Token(string _name, string _symbol) public {
    name_ = _name;
    symbol_ = _symbol;
  }

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

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

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

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

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

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

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

  /**
   * @dev Internal function to add a token ID to the list of a given address
   * @param _to address representing the new owner of the given token ID
   * @param _tokenId uint256 ID of the token to be added to the tokens list of the given address
   */
  function addTokenTo(address _to, uint256 _tokenId) internal {
    super.addTokenTo(_to, _tokenId);
    uint256 length = ownedTokens[_to].length;
    ownedTokens[_to].push(_tokenId);
    ownedTokensIndex[_tokenId] = length;
  }

  /**
   * @dev Internal function to remove a token ID from the list of a given address
   * @param _from address representing the previous owner of the given token ID
   * @param _tokenId uint256 ID of the token to be removed from the tokens list of the given address
   */
  function removeTokenFrom(address _from, uint256 _tokenId) internal {
    super.removeTokenFrom(_from, _tokenId);

    uint256 tokenIndex = ownedTokensIndex[_tokenId];
    uint256 lastTokenIndex = ownedTokens[_from].length.sub(1);
    uint256 lastToken = ownedTokens[_from][lastTokenIndex];

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

    ownedTokens[_from].length--;
    ownedTokensIndex[_tokenId] = 0;
    ownedTokensIndex[lastToken] = tokenIndex;
  }

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

    allTokensIndex[_tokenId] = allTokens.length;
    allTokens.push(_tokenId);
  }

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

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

    // Reorg all tokens array
    uint256 tokenIndex = allTokensIndex[_tokenId];
    uint256 lastTokenIndex = allTokens.length.sub(1);
    uint256 lastToken = allTokens[lastTokenIndex];

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

    allTokens.length--;
    allTokensIndex[_tokenId] = 0;
    allTokensIndex[lastToken] = tokenIndex;
  }

}

// File: contracts/Galaxy/UniverseGalaxyStore.sol

contract UniverseGalaxyStore is IUniverseGalaxy, ERC721Token, Whitelist, AccessControl, Random, MathTools, ArrayArchiveTools {
    /*** EVENTS ***/
    event PlanetCreated(
        address indexed owner,
        uint256 indexed planetId,
        uint256 sectorX,
        uint256 sectorY,
        uint256 rarity,
        uint256[MAX_ID_LIST_LENGTH] resourcesId,
        uint256[MAX_ID_LIST_LENGTH] resourcesVelocity,
        uint256 startPopulation
    );

    /*** DATA TYPES ***/

    struct Planet {
        uint256 rarity;
        uint256 discovered;
        uint256 updated;
        uint256 sectorX;
        uint256 sectorY;
        uint[MAX_ID_LIST_LENGTH] resourcesId;
        uint[MAX_ID_LIST_LENGTH] resourcesVelocity;
        uint[MAX_ID_LIST_LENGTH] resourcesUpdated;
    }

    /*** STORAGE ***/

    //    struct Planet {
    //        uint48 discovered;
    //        uint40 resourcesId;
    //        uint40 resourcesVelocity;
    //        uint8 sectorX;
    //        uint8 sectorY;
    //        uint8 rarity;
    //    }
    uint256[] public planets;

    //    struct PlanetState {
    //        uint48 updated;
    //        uint40 resourcesId;
    //        uint80 resourcesUpdated;
    //    }
    mapping (uint256 => uint256) planetStates;

    // x => (y => discovered_planet_count)
    mapping (uint => mapping ( uint => uint )) discoveredPlanetsCountMap;

    // group index => rarity => discovered planet count
    mapping (uint => mapping (uint => uint)) planetCountByRarityInGroups;

    // rarity => discovered planet count in galaxy
    mapping (uint => uint) planetCountByRarity;

    IUniverseBalance public universeBalance;
    IUniversePlanetExploration public universePlanetExploration;

    function UniverseGalaxyStore() ERC721Token("0xUniverse", "PLANET")
    public { }

    function _getPlanet(uint256 _id)
    internal view
    returns(Planet memory _planet)
    {
        uint256 planet = planets[_id];
        uint256 planetState = planetStates[_id];

        _planet.discovered = uint256(uint48(planet));
        _planet.resourcesId = _splitUint40ToArray(uint40(planet >> 48));
        _planet.resourcesVelocity = _splitUint40ToArray(uint40(planet >> 88));
        _planet.sectorX = uint256(uint8(planet >> 128));
        _planet.sectorY = uint256(uint8(planet >> 136));
        _planet.rarity = uint256(uint8(planet >> 144));

        _planet.updated = uint256(uint48(planetState));
        _planet.resourcesUpdated = _splitUint80ToArray(uint80(planetState >> 88));
    }

    function _convertPlanetToPlanetHash(Planet memory _planet)
    internal
    pure
    returns(uint256 _planetHash)
    {
        _planetHash = _planet.discovered;
        _planetHash |= _mergeArrayToUint40(_planet.resourcesId) << 48;
        _planetHash |= _mergeArrayToUint40(_planet.resourcesVelocity) << 88;
        _planetHash |= _planet.sectorX << 128;
        _planetHash |= _planet.sectorY << 136;
        _planetHash |= uint256(_planet.rarity) << 144;
    }

    function _convertPlanetToPlanetStateHash(Planet memory _planet)
    internal
    pure
    returns(uint256 _planetStateHash)
    {
        _planetStateHash = _planet.updated;
        _planetStateHash |= _mergeArrayToUint40(_planet.resourcesId) << 48;
        _planetStateHash |= _mergeArrayToUint80(_planet.resourcesUpdated) << 88;
    }

    function getDiscoveredPlanetsDensity(uint sectorX, uint sectorY) external view returns (uint) {
        uint discoveredPlanetsCount = discoveredPlanetsCountMap[sectorX][sectorY];
        // жёсткая проверка на количество планет в секторе и защита от переполнения переменной
        if (discoveredPlanetsCount >= PLANETS_COUNT_PER_SECTOR) {
            return 0;
        }
        return 100 - (discoveredPlanetsCount * 100) / PLANETS_COUNT_PER_SECTOR;
    }

    function countPlanetsByRarityInGroup(uint _groupIndex, uint _rarity) external view returns (uint){
        return planetCountByRarityInGroups[_groupIndex][_rarity];
    }

    function countPlanetsByRarity(uint _rarity) external view returns (uint){
        return planetCountByRarity[_rarity];
    }

    function setUniverseBalanceAddress(address _address) external onlyOwner {
        IUniverseBalance candidateContract = IUniverseBalance(_address);

        // NOTE: verify that a contract is what we expect
        // https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117
        require(candidateContract.isUniverseBalance(), "Incorrect address param");

        // Set the new contract address
        universeBalance = candidateContract;
    }

    function setUniversePlanetExplorationAddress(address _address) external onlyOwner {
        IUniversePlanetExploration candidateContract = IUniversePlanetExploration(_address);

        // NOTE: verify that a contract is what we expect
        // https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117
        require(candidateContract.isUniversePlanetExploration(), "Incorrect address param");

        // Set the new contract address
        universePlanetExploration = candidateContract;
    }

    function getPlanet(uint256 _id)
    external
    view
    returns (
        uint256 rarity,
        uint256 discovered,
        uint256 sectorX,
        uint256 sectorY,
        uint256[MAX_ID_LIST_LENGTH] resourcesId,
        uint256[MAX_ID_LIST_LENGTH] resourcesVelocity
    ) {
        Planet memory pl = _getPlanet(_id);

        rarity = pl.rarity;
        discovered = pl.discovered;
        sectorX = pl.sectorX;
        sectorY = pl.sectorY;
        resourcesId = pl.resourcesId;
        resourcesVelocity = pl.resourcesVelocity;
    }

    function _getOwnedTokensCount(address _owner) internal view returns (uint256){
        return ownedTokens[_owner].length;
    }

    function _getOwnedTokensByIndex(address _owner, uint256 _ownerTokenIndex) internal view returns (uint256){
        return ownedTokens[_owner][_ownerTokenIndex];
    }

    function findAvailableResource(address _owner, uint _rarity) external returns (int8) {
        uint ownedPlanetsCount = _getOwnedTokensCount(_owner);

        uint[] memory resourceList = new uint[](ownedPlanetsCount * MAX_ID_LIST_LENGTH);

        uint[2] memory resourcesOrderByRarity = universeBalance.getResourcesQuantityByRarity(_rarity);
        uint firstResourceId = resourcesOrderByRarity[0];
        uint lastResourceId = resourcesOrderByRarity[0] + resourcesOrderByRarity[1] - 1;

        uint maxResourceListElement = 0;
        for (uint i = 0; i < ownedPlanetsCount; i++) {
            Planet memory planet = _getPlanet( _getOwnedTokensByIndex(_owner, i) );

            for (uint k = 1; k < planet.resourcesId.length; k++) {
                uint resourceId = planet.resourcesId[k];
                if(resourceId == 0) break;

                if(resourceId >= firstResourceId && resourceId <= lastResourceId) {
                    resourceList[maxResourceListElement] = resourceId; // замена resourceList.push(j);
                    maxResourceListElement++;
                }
            }
        }

        if (maxResourceListElement > 0) { // выбираем из них один случайный
            return int8(resourceList[_randRange(0, maxResourceListElement - 1)]);
        } else {
            return -1;
        }
    }

    function createPlanet(
        address _owner,
        uint256 _rarity,
        uint256 _sectorX,
        uint256 _sectorY,
        uint256 _startPopulation
    )
    external
    onlyWhitelisted
    returns (uint256)
    {
        Planet memory planet = _createPlanetWithRandomResources(_rarity, _sectorX, _sectorY, _startPopulation);
        return _savePlanet(_owner, planet);
    }

    function _savePlanet(
        address _owner,
        Planet _planet
    )
    internal
    returns (uint)
    {
        uint256 planet = _convertPlanetToPlanetHash(_planet);
        uint256 planetState = _convertPlanetToPlanetStateHash(_planet);

        uint256 newPlanetId = planets.push(planet) - 1;
        planetStates[newPlanetId] = planetState;

        require(newPlanetId < PLANETS_COUNT, "No more planets");

        emit PlanetCreated(
            _owner,
            newPlanetId,
            _planet.sectorX,
            _planet.sectorY,
            _planet.rarity,
            _planet.resourcesId,
            _planet.resourcesVelocity,
            _planet.resourcesUpdated[0]
        );

        discoveredPlanetsCountMap[_planet.sectorX][_planet.sectorY] += 1;

        if (_planet.rarity == 3) {
            uint groupIndex = universeBalance.getGroupId(_planet.sectorX, _planet.sectorY);
            planetCountByRarityInGroups[groupIndex][3] += 1;
        }

        if (_planet.rarity == 4) {
            planetCountByRarity[4] += 1;
        }

        _mint(_owner, newPlanetId);

        return newPlanetId;
    }

    function _createPlanetWithRandomResources(uint _rarity, uint _sectorX, uint _sectorY, uint _startPopulation)
    internal
    returns (Planet memory _planet)
    {
        uint[MAX_ID_LIST_LENGTH] memory resourcesId;
        uint[MAX_ID_LIST_LENGTH] memory resourcesVelocity;
        (resourcesId, resourcesVelocity) = universePlanetExploration.explorePlanet(_rarity);

        uint[MAX_ID_LIST_LENGTH] memory resourcesUpdated;
        resourcesUpdated[0] = _startPopulation;

        _planet = Planet({
            rarity: _rarity,
            discovered: uint256(now),
            updated: uint256(now),
            sectorX: _sectorX,
            sectorY: _sectorY,
            resourcesId: resourcesId,
            resourcesVelocity: resourcesVelocity,
            resourcesUpdated: resourcesUpdated
            });
    }
}

// File: contracts/Galaxy/UniverseAuction.sol

contract UniverseAuction is UniverseGalaxyStore {

    ISaleClockAuction public saleAuction;

    function setSaleAuctionAddress(address _address) external onlyOwner {
        ISaleClockAuction candidateContract = ISaleClockAuction(_address);

        // NOTE: verify that a contract is what we expect - https://github.com/Lunyr/crowdsale-contracts/blob/cfadd15986c30521d8ba7d5b6f57b4fefcc7ac38/contracts/LunyrToken.sol#L117
        require(candidateContract.isSaleClockAuction(), "Incorrect address param");

        // Set the new contract address
        saleAuction = candidateContract;
    }

    function createSaleAuction(
        uint256 _planetId,
        uint256 _startingPrice,
        uint256 _endingPrice,
        uint256 _duration
    )
    external
    whenNotPaused
    {
        if (universeBalance.autoClearAuction()) saleAuction.clearOne(msg.sender, _planetId);
        // Auction contract checks input sizes
        // If planet is already on any auction, this will throw
        // because it will be owned by the auction contract.
        require(ownerOf(_planetId) == msg.sender, "Not owner");

        approve(saleAuction, _planetId);
        // Sale auction throws if inputs are invalid and clears
        // transfer approval after escrowing the planet.
        saleAuction.createAuction(
            _planetId,
            _startingPrice,
            _endingPrice,
            _duration,
            msg.sender
        );
    }

    function withdrawAuctionBalances() external onlyTeam {
        saleAuction.withdrawBalance();
    }
}

// File: contracts/Galaxy/UniverseGalaxyState.sol

contract UniverseGalaxyState is UniverseAuction {

    uint internal constant SECONDS_IN_DAY = 60 * 60 * 24;

    mapping (address => uint) public ownerToKnowledge;
    mapping (address => uint) public lastKnowledgeSpentDateByOwner;

    function getPlanetUpdatedResources(uint256 _id)
    external
    view
    returns (
        uint256 updated,
        uint256[MAX_ID_LIST_LENGTH] resourcesId,
        uint256[MAX_ID_LIST_LENGTH] resourcesUpdated
    ) {
        Planet memory pl = _getPlanet(_id);

        updated = pl.updated;
        resourcesId = pl.resourcesId;
        resourcesUpdated = pl.resourcesUpdated;
    }

    function spendResourceOnPlanet(
        address _owner,
        uint _planetId,
        uint _resourceId,
        uint _resourceValue
    )
    external
    onlyWhitelisted
    {
        require(_owner != address(0), "Owner param should be defined");
        require(_resourceValue > 0, "ResourceValue param should be bigger that zero");

        Planet memory planet = _getPlanet(_planetId);
        planet = _recountPlanetStateAndUpdateUserKnowledge(_owner, planet);

        require(planet.resourcesUpdated[_resourceId] >= _resourceValue, "Resource current should be bigger that ResourceValue");

        planet.resourcesUpdated[_resourceId] -= _resourceValue;
        _updatePlanetStateHash(_planetId, planet);
    }

    function spendResources(
        address _owner,
        uint[MAX_ID_LIST_LENGTH] _resourcesId,
        uint[MAX_ID_LIST_LENGTH] _resourcesNeeded
    ) external onlyWhitelisted {
        uint ownedPlanetsCount = _getOwnedTokensCount(_owner);

        for (uint j = 0; j < _resourcesId.length; j++) { // 0-4
            uint resourceId = _resourcesId[j];
            uint resourceNeeded = _resourcesNeeded[j];

            if (resourceNeeded == 0) { continue; }

            for (uint i = 0; i < ownedPlanetsCount; i++) { // 0-n
                if (resourceNeeded == 0) { break; }

                uint planetId = _getOwnedTokensByIndex(_owner, i);
                Planet memory planet = _getPlanet(planetId);

                uint foundResourceIndex = 9999;

                for (uint k = 0; k < planet.resourcesId.length; k++) { //0-4
                    if (resourceId == planet.resourcesId[k]) {
                        foundResourceIndex = k;
                        break;
                    }
                }

                if(foundResourceIndex == 9999) {continue;}

                planet = _recountPlanetStateAndUpdateUserKnowledge(_owner, planet);
                if (planet.resourcesUpdated[foundResourceIndex] > 0) {
                    if (planet.resourcesUpdated[foundResourceIndex] >= resourceNeeded) {
                        planet.resourcesUpdated[foundResourceIndex] -= resourceNeeded;
                        resourceNeeded = 0;
                    } else {
                        resourceNeeded -= planet.resourcesUpdated[foundResourceIndex];
                        planet.resourcesUpdated[foundResourceIndex] = 0;
                    }
                }
                _updatePlanetStateHash(planetId, planet);

            }

            if (resourceNeeded > 0) {
                revert("NotEnoughResources");
            }
        }
    }

    function spendKnowledge(address _owner, uint _spentKnowledge) external onlyWhitelisted {
        if (ownerToKnowledge[_owner] < _spentKnowledge) {
            uint balanceVelocity = universeBalance.getUIntValue(/* "settings_time_velocity" */ 34);

            uint spentKnowledge = _spentKnowledge * SECONDS_IN_DAY; // защита от потерь при округлении

            uint knowledge = ownerToKnowledge[_owner] * SECONDS_IN_DAY;

            uint ownedPlanetsCount = _getOwnedTokensCount(_owner);

            bool enoughKnowledge = false;

            for (uint i = 0; i < ownedPlanetsCount; i++) {
                Planet memory planet = _getPlanet( _getOwnedTokensByIndex(_owner, i) );

                uint interval = (_now() - _getLastKnowledgeUpdateForPlanet(_owner, planet)) * balanceVelocity;
                knowledge += (planet.resourcesUpdated[0] + _divisionWithRound(planet.resourcesVelocity[0] * interval, 2 * SECONDS_IN_DAY))
                    * universeBalance.getUIntValue(/* "planets_knowledgePerPeoplePerDay" */17)
                    * interval;

                if (knowledge >= spentKnowledge) {
                    enoughKnowledge = true;
                    break;
                }
            }

            if(!enoughKnowledge) {
                revert("NotEnoughKnowledge");
            }
        }

        ownerToKnowledge[_owner] = 0;
        lastKnowledgeSpentDateByOwner[_owner] = _now();
    }

    // Only for test purpose
    function getCurrentKnowledgeOfOwner(address _owner) external view returns(uint) {
        uint balanceVelocity = universeBalance.getUIntValue(/* "settings_time_velocity" */ 34);

        uint knowledge = ownerToKnowledge[_owner] * SECONDS_IN_DAY;

        uint ownedPlanetsCount = _getOwnedTokensCount(_owner);

        for (uint i = 0; i < ownedPlanetsCount; i++) {
            Planet memory planet = _getPlanet( _getOwnedTokensByIndex(_owner, i) );

            uint interval = (_now() - _getLastKnowledgeUpdateForPlanet(_owner, planet)) * balanceVelocity;
            knowledge += (planet.resourcesUpdated[0] + _divisionWithRound(planet.resourcesVelocity[0] * interval, 2 * SECONDS_IN_DAY))
                * universeBalance.getUIntValue(/* "planets_knowledgePerPeoplePerDay" */17)
                * interval;
        }

        return _divisionWithRound(knowledge, SECONDS_IN_DAY);
    }

    function recountPlanetResourcesAndUserKnowledge(address _owner, uint256 _planetId) external onlyWhitelisted {
        Planet memory planet = _getPlanet(_planetId);
        planet = _recountPlanetStateAndUpdateUserKnowledge(_owner, planet);
        _updatePlanetStateHash(_planetId, planet);
    }

    function _updatePlanetStateHash(uint256 _planetID, Planet memory _planet) internal {
        _planet.updated = _now();

        uint256 planetState = _convertPlanetToPlanetStateHash(_planet);
        planetStates[_planetID] = planetState;
    }

    function _getLastKnowledgeUpdateForPlanet(address _owner, Planet memory _planet) internal view returns (uint256) {
        return ((_planet.updated > lastKnowledgeSpentDateByOwner[_owner]) ? _planet.updated : lastKnowledgeSpentDateByOwner[_owner]);
    }

    function _recountPlanetStateAndUpdateUserKnowledge(address _owner, Planet memory _planet) internal returns (Planet) {
        uint balanceVelocity = universeBalance.getUIntValue(/* "settings_time_velocity" */ 34);

        // update knowledge
        uint intervalForKnowledge = (_now() - _getLastKnowledgeUpdateForPlanet(_owner, _planet)) * balanceVelocity;
        uint knowledge = (_planet.resourcesUpdated[0] + _divisionWithRound(_planet.resourcesVelocity[0] * intervalForKnowledge, 2 * SECONDS_IN_DAY))
            * universeBalance.getUIntValue(/* "planets_knowledgePerPeoplePerDay" */ 17)
            * intervalForKnowledge;

        ownerToKnowledge[_owner] += _divisionWithRound(knowledge, SECONDS_IN_DAY);


        // update resources
        uint interval = (_now() - _planet.updated) * balanceVelocity;

        uint resourcesMultiplierMAX = universeBalance.getUIntValue(/* "planets_resourcesMaxModifier" */ 18);

        // начал j с 0, чтобы и на людей ограничение распространялось. -1 вроде был лишним, там строго меньше сравнение
        for (uint j = 0; j < _planet.resourcesVelocity.length; j++) {
            if (_planet.resourcesVelocity[j] == 0) { continue; }

            _planet.resourcesUpdated[j] += _divisionWithRound(_planet.resourcesVelocity[j] * interval, SECONDS_IN_DAY);

            uint maxResourceAmount = _planet.resourcesVelocity[j] * resourcesMultiplierMAX;
            if (_planet.resourcesUpdated[j] > maxResourceAmount) {
                _planet.resourcesUpdated[j] = maxResourceAmount;
            }
        }

        return _planet;
    }

    function getPlanetCurrentResources(uint _planetId) external view returns (uint[MAX_ID_LIST_LENGTH]) {
        uint balanceVelocity = universeBalance.getUIntValue(/* "settings_time_velocity" */ 34);

        Planet memory planet = _getPlanet(_planetId);

        uint interval = (_now() - planet.updated) * balanceVelocity;

        uint[MAX_ID_LIST_LENGTH] memory velocities = planet.resourcesVelocity;

        uint resourcesMultiplierMAX = universeBalance.getUIntValue(/* "planets_resourcesMaxModifier" */ 18);

        // начал j с 0, чтобы и на людей ограничение распространялось. -1 вроде был лишним, там строго меньше сравнение
        for (uint j = 0; j < velocities.length; j++) {
            if (velocities[j] == 0) { continue; }

            planet.resourcesUpdated[j] += _divisionWithRound(planet.resourcesVelocity[j] * interval, SECONDS_IN_DAY);

            uint maxResourceAmount = planet.resourcesVelocity[j] * resourcesMultiplierMAX;
            if (planet.resourcesUpdated[j] > maxResourceAmount) {
                planet.resourcesUpdated[j] = maxResourceAmount;
            }
        }

        return planet.resourcesUpdated;
    }
}

// File: contracts/Galaxy/UniverseGalaxy.sol

contract UniverseGalaxy is UniverseGalaxyState {

    uint256 public constant PROMO_PLANETS_LIMIT = 10000;

    uint256 public promoCreatedCount;

    function UniverseGalaxy() public {
        paused = true;
        transferTreasurer(owner);
    }

    function initialize(address _earthOwner) external onlyOwner {
        require(planets.length == 0, "Earth was created");

        uint[2] memory earthSector = universeBalance.getUIntArray2Value(/* "earth_planet_sector" */ 20);

        uint[3] memory earthResourcesId = universeBalance.getUIntArray3Value(/* "earth_planet_resources_m_keys" */ 21);
        uint[3] memory earthResourcesVelocity = universeBalance.getUIntArray3Value(/* "earth_planet_resources_m_values" */ 22);
        uint[3] memory earthResourcesUpdated = universeBalance.getUIntArray3Value(/* "earth_planet_resourcesUpdated_m_values" */ 24);

        Planet memory earth = Planet({
            rarity: 3,
            discovered: uint256(now),
            updated: uint256(now),
            sectorX: earthSector[0],
            sectorY: earthSector[1],
            resourcesId: [earthResourcesId[0], earthResourcesId[1], earthResourcesId[2], 0, 0],
            resourcesVelocity: [earthResourcesVelocity[0], earthResourcesVelocity[1], earthResourcesVelocity[2], 0, 0],
            resourcesUpdated: [earthResourcesUpdated[0], earthResourcesUpdated[1], earthResourcesUpdated[2], 0, 0]
            });

        _savePlanet(_earthOwner, earth);
    }

    function checkWhetherEnoughPromoPlanet()
    external
    onlyWhitelisted
    {
        promoCreatedCount++;

        require( promoCreatedCount < PROMO_PLANETS_LIMIT, "Promo planet limit is reached" );
    }

    function() external payable onlyWhitelisted {
    }

    function unpause() public onlyOwner whenPaused {
        require(saleAuction != address(0), "SaleClock contract should be defined");
        require(universeBalance != address(0), "Balance contract should be defined");

        // Actually unpause the contract.
        super.unpause();
    }

    function withdrawBalance() external onlyTreasurer {
        uint256 balance = address(this).balance;

        treasurer.transfer(balance);
    }
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[],"name":"promoCreatedCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_owner","type":"address"},{"name":"_planetId","type":"uint256"},{"name":"_resourceId","type":"uint256"},{"name":"_resourceValue","type":"uint256"}],"name":"spendResourceOnPlanet","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"addrs","type":"address[]"}],"name":"removeAddressesFromWhitelist","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"planets","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"addr","type":"address"}],"name":"removeAddressFromWhitelist","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"universePlanetExploration","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_id","type":"uint256"}],"name":"getPlanet","outputs":[{"name":"rarity","type":"uint256"},{"name":"discovered","type":"uint256"},{"name":"sectorX","type":"uint256"},{"name":"sectorY","type":"uint256"},{"name":"resourcesId","type":"uint256[5]"},{"name":"resourcesVelocity","type":"uint256[5]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"ownerToKnowledge","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_planetId","type":"uint256"},{"name":"_startingPrice","type":"uint256"},{"name":"_endingPrice","type":"uint256"},{"name":"_duration","type":"uint256"}],"name":"createSaleAuction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_planetId","type":"uint256"}],"name":"getPlanetCurrentResources","outputs":[{"name":"","type":"uint256[5]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_rarity","type":"uint256"}],"name":"countPlanetsByRarity","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"}],"name":"setUniverseBalanceAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"exists","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"getCurrentKnowledgeOfOwner","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"withdrawBalance","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_treasurer","type":"address"}],"name":"transferTreasurer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"lastKnowledgeSpentDateByOwner","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"sectorX","type":"uint256"},{"name":"sectorY","type":"uint256"}],"name":"getDiscoveredPlanetsDensity","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"}],"name":"setSaleAuctionAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"addr","type":"address"}],"name":"addAddressToWhitelist","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"universeBalance","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_owner","type":"address"},{"name":"_rarity","type":"uint256"}],"name":"findAvailableResource","outputs":[{"name":"","type":"int8"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"withdrawAuctionBalances","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"}],"name":"setUniversePlanetExplorationAddress","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":"address"}],"name":"whitelist","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_owner","type":"address"},{"name":"_planetId","type":"uint256"}],"name":"recountPlanetResourcesAndUserKnowledge","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_id","type":"uint256"}],"name":"getPlanetUpdatedResources","outputs":[{"name":"updated","type":"uint256"},{"name":"resourcesId","type":"uint256[5]"},{"name":"resourcesUpdated","type":"uint256[5]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_tokenId","type":"uint256"},{"name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"PROMO_PLANETS_LIMIT","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_earthOwner","type":"address"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_owner","type":"address"},{"name":"_rarity","type":"uint256"},{"name":"_sectorX","type":"uint256"},{"name":"_sectorY","type":"uint256"},{"name":"_startPopulation","type":"uint256"}],"name":"createPlanet","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_owner","type":"address"},{"name":"_resourcesId","type":"uint256[5]"},{"name":"_resourcesNeeded","type":"uint256[5]"}],"name":"spendResources","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"addrs","type":"address[]"}],"name":"addAddressesToWhitelist","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"saleAuction","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_groupIndex","type":"uint256"},{"name":"_rarity","type":"uint256"}],"name":"countPlanetsByRarityInGroup","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"checkWhetherEnoughPromoPlanet","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_owner","type":"address"},{"name":"_spentKnowledge","type":"uint256"}],"name":"spendKnowledge","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"treasurer","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"planetId","type":"uint256"},{"indexed":false,"name":"sectorX","type":"uint256"},{"indexed":false,"name":"sectorY","type":"uint256"},{"indexed":false,"name":"rarity","type":"uint256"},{"indexed":false,"name":"resourcesId","type":"uint256[5]"},{"indexed":false,"name":"resourcesVelocity","type":"uint256[5]"},{"indexed":false,"name":"startPopulation","type":"uint256"}],"name":"PlanetCreated","type":"event"},{"anonymous":false,"inputs":[],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpause","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"addr","type":"address"}],"name":"WhitelistedAddressAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"addr","type":"address"}],"name":"WhitelistedAddressRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"},{"indexed":false,"name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_approved","type":"address"},{"indexed":false,"name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_operator","type":"address"},{"indexed":false,"name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"}]

6080604052600d805460a060020a60ff02191690553480156200002157600080fd5b50604080518082018252600a81527f3078556e6976657273650000000000000000000000000000000000000000000060208083019182528351808501909452600684527f504c414e455400000000000000000000000000000000000000000000000000009084015281519192916200009c916004916200015a565b508051620000b29060059060208401906200015a565b5050600b8054600160a060020a031916331790819055600d805460a060020a60ff021916740100000000000000000000000000000000000000001790556200010d9150600160a060020a031664010000000062000113810204565b620001ff565b600b54600160a060020a031633146200012b57600080fd5b600160a060020a038116156200015757600d8054600160a060020a031916600160a060020a0383161790555b50565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200019d57805160ff1916838001178555620001cd565b82800160010185558215620001cd579182015b82811115620001cd578251825591602001919060010190620001b0565b50620001db929150620001df565b5090565b620001fc91905b80821115620001db5760008155600101620001e6565b90565b614315806200020f6000396000f30060806040526004361061028f5763ffffffff60e060020a60003504166305e4554681146102af57806306fdde03146102d6578063081812fc14610360578063095ea7b31461039457806318160ddd146103b8578063189052f1146103cd57806323b872dd146103f757806324953eaa1461042157806326c1e7501461048a578063286dd3f5146104a25780632f745c59146104c357806330f18fb7146104e757806334efcb8e146104fc57806335bde22c146105975780633d7d3f5a146105b85780633e573168146105d95780633f4ba83a14610629578063414b50641461063e57806342842e0e146106565780634bbe9547146106805780634f558e79146106a15780634f6ccce7146106b95780635a71e6d3146106d15780635c975abb146106f25780635fd8c71014610707578063611e68d41461071c5780636352211e1461073d57806364384a9914610755578063672815c2146107765780636fbde40d1461079157806370a08231146107b25780637b9417c8146107d35780637c0f0ac9146107f45780638456cb59146108095780638b17b33b1461081e5780638da5cb5b1461085b57806391876e57146108705780639272eb8b1461088557806395d89b41146108a65780639b19251a146108bb578063a22cb465146108dc578063aac0b77614610902578063b568ee2b14610926578063b88d4fde146109a9578063bdf22c6614610a18578063c4d66de814610a2d578063c58b1bdd14610a4e578063c87b56dd14610a7b578063cd216f0e14610a93578063e2ec6ec314610ab8578063e6cbe35114610b0d578063e985e9c514610b22578063eb822fe514610b49578063f2fde38b14610b64578063f6d016dc14610b85578063f97fd58a14610b9a578063fda49eb414610bbe575b336000908152600c602052604090205460ff1615156102ad57600080fd5b005b3480156102bb57600080fd5b506102c4610bd3565b60408051918252519081900360200190f35b3480156102e257600080fd5b506102eb610bd9565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561032557818101518382015260200161030d565b50505050905090810190601f1680156103525780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561036c57600080fd5b50610378600435610c70565b60408051600160a060020a039092168252519081900360200190f35b3480156103a057600080fd5b506102ad600160a060020a0360043516602435610c8e565b3480156103c457600080fd5b506102c4610d73565b3480156103d957600080fd5b506102ad600160a060020a0360043516602435604435606435610d79565b34801561040357600080fd5b506102ad600160a060020a0360043581169060243516604435610f57565b34801561042d57600080fd5b5060408051602060048035808201358381028086018501909652808552610476953695939460249493850192918291850190849080828437509497506110069650505050505050565b604080519115158252519081900360200190f35b34801561049657600080fd5b506102c4600435611067565b3480156104ae57600080fd5b50610476600160a060020a0360043516611086565b3480156104cf57600080fd5b506102c4600160a060020a036004351660243561111e565b3480156104f357600080fd5b5061037861116c565b34801561050857600080fd5b5061051460043561117b565b6040518087815260200186815260200185815260200184815260200183600560200280838360005b8381101561055457818101518382015260200161053c565b5050505090500182600560200280838360005b8381101561057f578181015183820152602001610567565b50505050905001965050505050505060405180910390f35b3480156105a357600080fd5b506102c4600160a060020a03600435166111d3565b3480156105c457600080fd5b506102ad6004356024356044356064356111e5565b3480156105e557600080fd5b506105f1600435611422565b604051808260a080838360005b838110156106165781810151838201526020016105fe565b5050505090500191505060405180910390f35b34801561063557600080fd5b506102ad61164b565b34801561064a57600080fd5b506102c4600435611793565b34801561066257600080fd5b506102ad600160a060020a03600435811690602435166044356117a5565b34801561068c57600080fd5b506102ad600160a060020a03600435166117dd565b3480156106ad57600080fd5b506104766004356118dd565b3480156106c557600080fd5b506102c46004356118fa565b3480156106dd57600080fd5b506102c4600160a060020a036004351661192f565b3480156106fe57600080fd5b50610476611afd565b34801561071357600080fd5b506102ad611b0d565b34801561072857600080fd5b506102ad600160a060020a0360043516611bb2565b34801561074957600080fd5b50610378600435611bf7565b34801561076157600080fd5b506102c4600160a060020a0360043516611c1b565b34801561078257600080fd5b506102c4600435602435611c2d565b34801561079d57600080fd5b506102ad600160a060020a0360043516611c6e565b3480156107be57600080fd5b506102c4600160a060020a0360043516611d6e565b3480156107df57600080fd5b50610476600160a060020a0360043516611da1565b34801561080057600080fd5b50610378611e3d565b34801561081557600080fd5b506102ad611e4c565b34801561082a57600080fd5b50610842600160a060020a0360043516602435611ef3565b60408051600092830b90920b8252519081900360200190f35b34801561086757600080fd5b506103786120db565b34801561087c57600080fd5b506102ad6120ea565b34801561089157600080fd5b506102ad600160a060020a03600435166121f0565b3480156108b257600080fd5b506102eb6122f0565b3480156108c757600080fd5b50610476600160a060020a0360043516612351565b3480156108e857600080fd5b506102ad600160a060020a03600435166024351515612366565b34801561090e57600080fd5b506102ad600160a060020a03600435166024356123ea565b34801561093257600080fd5b5061093e600435612431565b604051838152602081018360a080838360005b83811015610969578181015183820152602001610951565b5050505090500182600560200280838360005b8381101561099457818101518382015260200161097c565b50505050905001935050505060405180910390f35b3480156109b557600080fd5b50604080516020601f6064356004818101359283018490048402850184019095528184526102ad94600160a060020a0381358116956024803590921695604435953695608494019181908401838280828437509497506124719650505050505050565b348015610a2457600080fd5b506102c46124a9565b348015610a3957600080fd5b506102ad600160a060020a03600435166124af565b348015610a5a57600080fd5b506102c4600160a060020a03600435166024356044356064356084356128b2565b348015610a8757600080fd5b506102eb6004356128fd565b348015610a9f57600080fd5b506102ad600160a060020a0360043516602460c46129b2565b348015610ac457600080fd5b506040805160206004803580820135838102808601850190965280855261047695369593946024949385019291829185019084908082843750949750612bd29650505050505050565b348015610b1957600080fd5b50610378612c2d565b348015610b2e57600080fd5b50610476600160a060020a0360043581169060243516612c3c565b348015610b5557600080fd5b506102c4600435602435612c6a565b348015610b7057600080fd5b506102ad600160a060020a0360043516612c87565b348015610b9157600080fd5b506102ad612d0f565b348015610ba657600080fd5b506102ad600160a060020a0360043516602435612d90565b348015610bca57600080fd5b5061037861302d565b60195481565b60048054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610c655780601f10610c3a57610100808354040283529160200191610c65565b820191906000526020600020905b815481529060010190602001808311610c4857829003601f168201915b505050505090505b90565b600081815260016020526040902054600160a060020a03165b919050565b6000610c9982611bf7565b9050600160a060020a038381169082161415610cb457600080fd5b33600160a060020a0382161480610cd05750610cd08133612c3c565b1515610cdb57600080fd5b6000610ce683610c70565b600160a060020a0316141580610d045750600160a060020a03831615155b15610d6e576000828152600160209081526040918290208054600160a060020a031916600160a060020a03878116918217909255835186815293519093918516927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a35b505050565b60085490565b610d816141fc565b336000908152600c602052604090205460ff161515610d9f57600080fd5b600160a060020a0385161515610dff576040805160e560020a62461bcd02815260206004820152601d60248201527f4f776e657220706172616d2073686f756c6420626520646566696e6564000000604482015290519081900360640190fd5b60008211610e7d576040805160e560020a62461bcd02815260206004820152602e60248201527f5265736f7572636556616c756520706172616d2073686f756c6420626520626960448201527f676765722074686174207a65726f000000000000000000000000000000000000606482015290519081900360840190fd5b610e868461303c565b9050610e928582613157565b9050818160e0015184600581101515610ea757fe5b60200201511015610f28576040805160e560020a62461bcd02815260206004820152603460248201527f5265736f757263652063757272656e742073686f756c6420626520626967676560448201527f722074686174205265736f7572636556616c7565000000000000000000000000606482015290519081900360840190fd5b60e081015182908460058110610f3a57fe5b602002018051919091039052610f50848261343e565b5050505050565b80610f62338261346d565b1515610f6d57600080fd5b600160a060020a0384161515610f8257600080fd5b600160a060020a0383161515610f9757600080fd5b610fa184836134cc565b610fab848361356c565b610fb583836136a5565b82600160a060020a031684600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a350505050565b600b546000908190600160a060020a0316331461102257600080fd5b5060005b82518110156110615761104f838281518110151561104057fe5b90602001906020020151611086565b1561105957600191505b600101611026565b50919050565b600f80548290811061107557fe5b600091825260209091200154905081565b600b54600090600160a060020a031633146110a057600080fd5b600160a060020a0382166000908152600c602052604090205460ff1615610c8957600160a060020a0382166000818152600c6020908152604091829020805460ff19169055815192835290517ff1abf01a1043b7c244d128e8595cf0c1d10743b022b03a02dffd8ca3bf729f5a9281900390910190a1506001919050565b600061112983611d6e565b821061113457600080fd5b600160a060020a038316600090815260066020526040902080548390811061115857fe5b906000526020600020015490505b92915050565b601554600160a060020a031681565b600080600080611189614253565b611191614253565b6111996141fc565b6111a28861303c565b805160208201516060830151608084015160a085015160c090950151939d929c50909a509850919650945092505050565b60176020526000908152604090205481565b600d5460a060020a900460ff16156111fc57600080fd5b601460009054906101000a9004600160a060020a0316600160a060020a03166355909f876040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561124f57600080fd5b505af1158015611263573d6000803e3d6000fd5b505050506040513d602081101561127957600080fd5b50511561130557601654604080517f0b7edea3000000000000000000000000000000000000000000000000000000008152336004820152602481018790529051600160a060020a0390921691630b7edea39160448082019260009290919082900301818387803b1580156112ec57600080fd5b505af1158015611300573d6000803e3d6000fd5b505050505b3361130f85611bf7565b600160a060020a03161461136d576040805160e560020a62461bcd02815260206004820152600960248201527f4e6f74206f776e65720000000000000000000000000000000000000000000000604482015290519081900360640190fd5b60165461138390600160a060020a031685610c8e565b601654604080517f27ebe40a000000000000000000000000000000000000000000000000000000008152600481018790526024810186905260448101859052606481018490523360848201529051600160a060020a03909216916327ebe40a9160a48082019260009290919082900301818387803b15801561140457600080fd5b505af1158015611418573d6000803e3d6000fd5b5050505050505050565b61142a614253565b60006114346141fc565b600061143e614253565b6014546040805160e060020a6364c6639502815260226004820152905160009283928392600160a060020a03909216916364c663959160248082019260209290919082900301818787803b15801561149557600080fd5b505af11580156114a9573d6000803e3d6000fd5b505050506040513d60208110156114bf57600080fd5b505196506114cc8961303c565b95508686604001516114dc6136ee565b030294508560c001519350601460009054906101000a9004600160a060020a0316600160a060020a03166364c6639560126040518263ffffffff1660e060020a02815260040180828152602001915050602060405180830381600087803b15801561154657600080fd5b505af115801561155a573d6000803e3d6000fd5b505050506040513d602081101561157057600080fd5b50519250600091505b60058210156116395783826005811061158e57fe5b6020020151151561159e5761162e565b6115c3858760c00151846005811015156115b457fe5b602002015102620151806136f2565b60e087015183600581106115d357fe5b602002018051909101905260c0860151839083600581106115f057fe5b6020020151029050808660e001518360058110151561160b57fe5b6020020151111561162e5760e08601518190836005811061162857fe5b60200201525b600190910190611579565b50505060e09092015195945050505050565b600b54600160a060020a0316331461166257600080fd5b600d5460a060020a900460ff16151561167a57600080fd5b601654600160a060020a03161515611701576040805160e560020a62461bcd028152602060048201526024808201527f53616c65436c6f636b20636f6e74726163742073686f756c642062652064656660448201527f696e656400000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b601454600160a060020a03161515611789576040805160e560020a62461bcd02815260206004820152602260248201527f42616c616e636520636f6e74726163742073686f756c6420626520646566696e60448201527f6564000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b611791613720565b565b60009081526013602052604090205490565b806117b0338261346d565b15156117bb57600080fd5b6117d78484846020604051908101604052806000815250612471565b50505050565b600b54600090600160a060020a031633146117f757600080fd5b81905080600160a060020a031663051f403f6040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561183857600080fd5b505af115801561184c573d6000803e3d6000fd5b505050506040513d602081101561186257600080fd5b505115156118ba576040805160e560020a62461bcd02815260206004820152601760248201527f496e636f7272656374206164647265737320706172616d000000000000000000604482015290519081900360640190fd5b60148054600160a060020a031916600160a060020a039290921691909117905550565b600090815260208190526040902054600160a060020a0316151590565b6000611904610d73565b821061190f57600080fd5b600880548390811061191d57fe5b90600052602060002001549050919050565b600080600080600061193f6141fc565b6014546040805160e060020a6364c66395028152602260048201529051600092600160a060020a0316916364c6639591602480830192602092919082900301818787803b15801561198f57600080fd5b505af11580156119a3573d6000803e3d6000fd5b505050506040513d60208110156119b957600080fd5b5051600160a060020a038916600090815260176020526040902054909650620151800294506119e788613798565b9350600092505b83831015611ae457611a08611a0389856137b3565b61303c565b915085611a1589846137d7565b611a1d6136ee565b0302905080601460009054906101000a9004600160a060020a0316600160a060020a03166364c6639560116040518263ffffffff1660e060020a02815260040180828152602001915050602060405180830381600087803b158015611a8157600080fd5b505af1158015611a95573d6000803e3d6000fd5b505050506040513d6020811015611aab57600080fd5b505160c0840151611aca90849060005b6020020151026202a3006136f2565b60e0850151510102029490940193600192909201916119ee565b611af185620151806136f2565b98975050505050505050565b600d5460a060020a900460ff1681565b600d54600090600160a060020a03163314611b72576040805160e560020a62461bcd02815260206004820152600e60248201527f4f6e6c7920747265617375726572000000000000000000000000000000000000604482015290519081900360640190fd5b50600d54604051303191600160a060020a03169082156108fc029083906000818181858888f19350505050158015611bae573d6000803e3d6000fd5b5050565b600b54600160a060020a03163314611bc957600080fd5b600160a060020a03811615611bf457600d8054600160a060020a031916600160a060020a0383161790555b50565b600081815260208190526040812054600160a060020a031680151561116657600080fd5b60186020526000908152604090205481565b60008281526011602090815260408083208484529091528120546103e88110611c595760009150611c67565b6103e8606482020460640391505b5092915050565b600b54600090600160a060020a03163314611c8857600080fd5b81905080600160a060020a03166385b861886040518163ffffffff1660e060020a028152600401602060405180830381600087803b158015611cc957600080fd5b505af1158015611cdd573d6000803e3d6000fd5b505050506040513d6020811015611cf357600080fd5b50511515611d4b576040805160e560020a62461bcd02815260206004820152601760248201527f496e636f7272656374206164647265737320706172616d000000000000000000604482015290519081900360640190fd5b60168054600160a060020a031916600160a060020a039290921691909117905550565b6000600160a060020a0382161515611d8557600080fd5b50600160a060020a031660009081526002602052604090205490565b600b54600090600160a060020a03163314611dbb57600080fd5b600160a060020a0382166000908152600c602052604090205460ff161515610c8957600160a060020a0382166000818152600c6020908152604091829020805460ff19166001179055815192835290517fd1bba68c128cc3f427e5831b3c6f99f480b6efa6b9e80c757768f6124158cc3f9281900390910190a1506001919050565b601454600160a060020a031681565b600b54600160a060020a0316331480611e6f5750600d54600160a060020a031633145b1515611eeb576040805160e560020a62461bcd02815260206004820152602360248201527f4f6e6c79206f776e657220616e6420747265617375726520686176652061636360448201527f6573730000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b611791613825565b6000806060611f00614272565b600080600080611f0e6141fc565b600080611f1a8d613798565b995060058a02604051908082528060200260200182016040528015611f49578160200160208202803883390190505b509850601460009054906101000a9004600160a060020a0316600160a060020a031663ccf9bbb68d6040518263ffffffff1660e060020a028152600401808281526020019150506040805180830381600087803b158015611fa957600080fd5b505af1158015611fbd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506040811015611fe257600080fd5b508051602082015191995097508701600019019550600094508493505b8984101561209257612014611a038e866137b3565b9250600191505b60058210156120875760a0830151826005811061203457fe5b6020020151905080151561204757612087565b8681101580156120575750858111155b1561207c5780898681518110151561206b57fe5b602090810290910101526001909401935b60019091019061201b565b600190930192611fff565b60008511156120c557886120aa6000600188036138a2565b815181106120b457fe5b906020019060200201519a506120cb565b6000199a505b5050505050505050505092915050565b600b54600160a060020a031681565b600b54600160a060020a031633148061210d5750600d54600160a060020a031633145b1515612189576040805160e560020a62461bcd02815260206004820152602360248201527f4f6e6c79206f776e657220616e6420747265617375726520686176652061636360448201527f6573730000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b601660009054906101000a9004600160a060020a0316600160a060020a0316635fd8c7106040518163ffffffff1660e060020a028152600401600060405180830381600087803b1580156121dc57600080fd5b505af11580156117d7573d6000803e3d6000fd5b600b54600090600160a060020a0316331461220a57600080fd5b81905080600160a060020a0316639bd593e36040518163ffffffff1660e060020a028152600401602060405180830381600087803b15801561224b57600080fd5b505af115801561225f573d6000803e3d6000fd5b505050506040513d602081101561227557600080fd5b505115156122cd576040805160e560020a62461bcd02815260206004820152601760248201527f496e636f7272656374206164647265737320706172616d000000000000000000604482015290519081900360640190fd5b60158054600160a060020a031916600160a060020a039290921691909117905550565b60058054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610c655780601f10610c3a57610100808354040283529160200191610c65565b600c6020526000908152604090205460ff1681565b600160a060020a03821633141561237c57600080fd5b336000818152600360209081526040808320600160a060020a03871680855290835292819020805460ff1916861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b6123f26141fc565b336000908152600c602052604090205460ff16151561241057600080fd5b6124198261303c565b90506124258382613157565b9050610d6e828261343e565b600061243b614253565b612443614253565b61244b6141fc565b6124548561303c565b604081015160a082015160e0909201519097919650945092505050565b8161247c338261346d565b151561248757600080fd5b612492858585610f57565b61249e858585856138d6565b1515610f5057600080fd5b61271081565b6124b7614272565b6124bf61428d565b6124c761428d565b6124cf61428d565b6124d76141fc565b600b54600160a060020a031633146124ee57600080fd5b600f5415612546576040805160e560020a62461bcd02815260206004820152601160248201527f4561727468207761732063726561746564000000000000000000000000000000604482015290519081900360640190fd5b60148054604080517fbe8fb1c100000000000000000000000000000000000000000000000000000000815260048101939093528051600160a060020a039092169263be8fb1c192602480830193928290030181600087803b1580156125aa57600080fd5b505af11580156125be573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525060408110156125e357600080fd5b50601454604080517fe4c5efe9000000000000000000000000000000000000000000000000000000008152601560048201529051929750600160a060020a039091169163e4c5efe9916024808201926060929091908290030181600087803b15801561264e57600080fd5b505af1158015612662573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250606081101561268757600080fd5b50601454604080517fe4c5efe9000000000000000000000000000000000000000000000000000000008152601660048201529051929650600160a060020a039091169163e4c5efe9916024808201926060929091908290030181600087803b1580156126f257600080fd5b505af1158015612706573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250606081101561272b57600080fd5b50601454604080517fe4c5efe9000000000000000000000000000000000000000000000000000000008152601860048201529051929550600160a060020a039091169163e4c5efe9916024808201926060929091908290030181600087803b15801561279657600080fd5b505af11580156127aa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525060608110156127cf57600080fd5b5060408051610100810182526003815242602080830182905282840191909152885160608084019190915289820151608080850191909152845160a080820187528b5182528b850151828601528b87015182880152600082850181905282840181905281870192909252865180820188528b5181528b860151818701528b8801518189015280850183905280840183905260c087015286519081018752875181528785015194810194909452868601519584019590955290820184905281019290925260e081019190915290925090506128a98682613a46565b50505050505050565b60006128bc6141fc565b336000908152600c602052604090205460ff1615156128da57600080fd5b6128e686868686613d2f565b90506128f28782613a46565b979650505050505050565b6060612908826118dd565b151561291357600080fd5b6000828152600a602090815260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845290918301828280156129a65780601f1061297b576101008083540402835291602001916129a6565b820191906000526020600020905b81548152906001019060200180831161298957829003601f168201915b50505050509050919050565b6000806000806000806129c36141fc565b336000908152600c6020526040812054819060ff1615156129e357600080fd5b6129ec8c613798565b9850600097505b6005881015612bc4578a8860058110612a0857fe5b60200201359650898860058110612a1b57fe5b60200201359550851515612a2e57612bb9565b600094505b88851015612b6057851515612a4757612b60565b612a518c866137b3565b9350612a5c8461303c565b925061270f9150600090505b6005811015612a9d5760a08301518160058110612a8157fe5b6020020151871415612a9557809150612a9d565b600101612a68565b8161270f1415612aac57612b55565b612ab68c84613157565b925060008360e0015183600581101515612acc57fe5b60200201511115612b4b5760e083015186908360058110612ae957fe5b602002015110612b1a5760e083015186908360058110612b0557fe5b60200201805191909103905260009550612b4b565b60e08301518260058110612b2a57fe5b602002015160e08401519603956000908360058110612b4557fe5b60200201525b612b55848461343e565b600190940193612a33565b6000861115612bb9576040805160e560020a62461bcd02815260206004820152601260248201527f4e6f74456e6f7567685265736f75726365730000000000000000000000000000604482015290519081900360640190fd5b6001909701966129f3565b505050505050505050505050565b600b546000908190600160a060020a03163314612bee57600080fd5b5060005b825181101561106157612c1b8382815181101515612c0c57fe5b90602001906020020151611da1565b15612c2557600191505b600101612bf2565b601654600160a060020a031681565b600160a060020a03918216600090815260036020908152604080832093909416825291909152205460ff1690565b600091825260126020908152604080842092845291905290205490565b600b54600160a060020a03163314612c9e57600080fd5b600160a060020a0381161515612cb357600080fd5b600b54604051600160a060020a038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600b8054600160a060020a031916600160a060020a0392909216919091179055565b336000908152600c602052604090205460ff161515612d2d57600080fd5b601980546001019081905561271011611791576040805160e560020a62461bcd02815260206004820152601d60248201527f50726f6d6f20706c616e6574206c696d69742069732072656163686564000000604482015290519081900360640190fd5b600080600080600080612da16141fc565b336000908152600c602052604081205460ff161515612dbf57600080fd5b600160a060020a038a16600090815260176020526040902054891115612fe4576014546040805160e060020a6364c66395028152602260048201529051600160a060020a03909216916364c66395916024808201926020929091908290030181600087803b158015612e3057600080fd5b505af1158015612e44573d6000803e3d6000fd5b505050506040513d6020811015612e5a57600080fd5b5051600160a060020a038b16600090815260176020526040902054909850620151808a81029850029550612e8d8a613798565b945060009350600092505b84831015612f8d57612ead611a038b856137b3565b915087612eba8b846137d7565b612ec26136ee565b0302905080601460009054906101000a9004600160a060020a0316600160a060020a03166364c6639560116040518263ffffffff1660e060020a02815260040180828152602001915050602060405180830381600087803b158015612f2657600080fd5b505af1158015612f3a573d6000803e3d6000fd5b505050506040513d6020811015612f5057600080fd5b505160c0840151612f649084906000611abb565b60e0850151510102029590950194868610612f825760019350612f8d565b600190920191612e98565b831515612fe4576040805160e560020a62461bcd02815260206004820152601260248201527f4e6f74456e6f7567684b6e6f776c656467650000000000000000000000000000604482015290519081900360640190fd5b600160a060020a038a166000908152601760205260408120556130056136ee565b600160a060020a03909a16600090815260186020526040902099909955505050505050505050565b600d54600160a060020a031681565b6130446141fc565b600080600f8481548110151561305657fe5b60009182526020808320909101548683526010825260409092205465ffffffffffff831691860191909152909250905061309f64ffffffffff6601000000000000840416613e38565b60a08401526130c264ffffffffff6b010000000000000000000000840416613e38565b60c084015260ff700100000000000000000000000000000000830481166060850152710100000000000000000000000000000000008304811660808501527201000000000000000000000000000000000000830416835265ffffffffffff8116604084015261314a69ffffffffffffffffffff6b010000000000000000000000830416613e71565b60e0840152509092915050565b61315f6141fc565b6014546040805160e060020a6364c66395028152602260048201529051600092839283928392839283928392600160a060020a0316916364c6639591602480830192602092919082900301818787803b1580156131bb57600080fd5b505af11580156131cf573d6000803e3d6000fd5b505050506040513d60208110156131e557600080fd5b50519650866131f48b8b6137d7565b6131fc6136ee565b0302955085601460009054906101000a9004600160a060020a0316600160a060020a03166364c6639560116040518263ffffffff1660e060020a02815260040180828152602001915050602060405180830381600087803b15801561326057600080fd5b505af1158015613274573d6000803e3d6000fd5b505050506040513d602081101561328a57600080fd5b505160c08b015161329e9089906000611abb565b60e08c01515101020294506132b685620151806136f2565b600160a060020a038b1660009081526017602052604090819020805490920190915589015187906132e56136ee565b03029350601460009054906101000a9004600160a060020a0316600160a060020a03166364c6639560126040518263ffffffff1660e060020a02815260040180828152602001915050602060405180830381600087803b15801561334857600080fd5b505af115801561335c573d6000803e3d6000fd5b505050506040513d602081101561337257600080fd5b50519250600091505b60058210156134305760c0890151826005811061339457fe5b602002015115156133a457613425565b6133ba848a60c00151846005811015156115b457fe5b60e08a015183600581106133ca57fe5b602002018051909101905260c0890151839083600581106133e757fe5b6020020151029050808960e001518360058110151561340257fe5b602002015111156134255760e08901518190836005811061341f57fe5b60200201525b60019091019061337b565b509698975050505050505050565b60006134486136ee565b604083015261345682613eab565b600093845260106020526040909320929092555050565b60008061347983611bf7565b905080600160a060020a031684600160a060020a031614806134b4575083600160a060020a03166134a984610c70565b600160a060020a0316145b806134c457506134c48185612c3c565b949350505050565b81600160a060020a03166134df82611bf7565b600160a060020a0316146134f257600080fd5b600081815260016020526040902054600160a060020a031615611bae5760008181526001602090815260408083208054600160a060020a031916905580518481529051600160a060020a038616927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a35050565b600080600061357b8585613ee6565b600084815260076020908152604080832054600160a060020a03891684526006909252909120549093506135b690600163ffffffff613f6e16565b600160a060020a0386166000908152600660205260409020805491935090839081106135de57fe5b90600052602060002001549050806006600087600160a060020a0316600160a060020a031681526020019081526020016000208481548110151561361e57fe5b6000918252602080832090910192909255600160a060020a038716815260069091526040812080548490811061365057fe5b6000918252602080832090910192909255600160a060020a03871681526006909152604090208054906136879060001983016142ac565b50600093845260076020526040808520859055908452909220555050565b60006136b18383613f80565b50600160a060020a039091166000908152600660209081526040808320805460018101825590845282842081018590559383526007909152902055565b4290565b600081838115156136ff57fe5b04905060028204828481151561371157fe5b06106111665760010192915050565b600b54600160a060020a0316331461373757600080fd5b600d5460a060020a900460ff16151561374f57600080fd5b600d805474ff0000000000000000000000000000000000000000191690556040517f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3390600090a1565b600160a060020a031660009081526006602052604090205490565b600160a060020a038216600090815260066020526040812080548390811061115857fe5b600160a060020a03821660009081526018602052604080822054908301511161381857600160a060020a03831660009081526018602052604090205461381e565b81604001515b9392505050565b600b54600160a060020a0316331461383c57600080fd5b600d5460a060020a900460ff161561385357600080fd5b600d805474ff0000000000000000000000000000000000000000191660a060020a1790556040517f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62590600090a1565b6000828383036001016138b3614002565b60408051918252519081900360200190208115156138cd57fe5b06019392505050565b6000806138eb85600160a060020a031661403b565b15156138fa5760019150613a3d565b84600160a060020a031663f0b9e5ba8786866040518463ffffffff1660e060020a0281526004018084600160a060020a0316600160a060020a0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015613979578181015183820152602001613961565b50505050905090810190601f1680156139a65780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b1580156139c757600080fd5b505af11580156139db573d6000803e3d6000fd5b505050506040513d60208110156139f157600080fd5b50517fffffffff0000000000000000000000000000000000000000000000000000000081167ff0b9e5ba0000000000000000000000000000000000000000000000000000000014925090505b50949350505050565b6000806000806000613a5786614043565b9350613a6286613eab565b600f8054600181019091557f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac802810186905560008181526010602052604090208290559093509150620f42408210613b03576040805160e560020a62461bcd02815260206004820152600f60248201527f4e6f206d6f726520706c616e6574730000000000000000000000000000000000604482015290519081900360640190fd5b8187600160a060020a03167ff54657dd54b8d60149296317ff8dd81a5f9d0ed22aa82d92db76bc5ce97973c4886060015189608001518a600001518b60a001518c60c001518d60e001516000600581101515613b5b57fe5b60200201516040518087815260200186815260200185815260200184600560200280838360005b83811015613b9a578181015183820152602001613b82565b5050505090500183600560200280838360005b83811015613bc5578181015183820152602001613bad565b50505050905001828152602001965050505050505060405180910390a36060860151600090815260116020908152604080832060808a01518452909152902080546001019055855160031415613cde5760145460608701516080880151604080517f7944013a0000000000000000000000000000000000000000000000000000000081526004810193909352602483019190915251600160a060020a0390921691637944013a916044808201926020929091908290030181600087803b158015613c8e57600080fd5b505af1158015613ca2573d6000803e3d6000fd5b505050506040513d6020811015613cb857600080fd5b505160008181526012602090815260408083206003845290915290208054600101905590505b855160041415613d1b57600460005260136020527f01413ff7a3b1d5b6c016c061d48e2c7014700c777a29fcd068fff04265813d5d805460010190555b613d2587836140d0565b5095945050505050565b613d376141fc565b613d3f614253565b613d47614253565b613d4f614253565b601554604080517f570bb139000000000000000000000000000000000000000000000000000000008152600481018b90529051600160a060020a039092169163570bb13991602480820192610140929091908290030181600087803b158015613db757600080fd5b505af1158015613dcb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610140811015613df157600080fd5b5094815260408051610100810182529889524260208a01819052908901526060880196909652505050608084019190915260a08381018290520160c083015260e082015290565b613e40614253565b60005b60058110156110615760ff6008820260020a840416828260058110613e6457fe5b6020020152600101613e43565b613e79614253565b60005b60058110156110615761ffff6010820260020a840416828260058110613e9e57fe5b6020020152600101613e7c565b604081015160a0820151603090613ec19061411f565b9060020a02811790506058613ed98360e00151614155565b60029190910a0217919050565b81600160a060020a0316613ef982611bf7565b600160a060020a031614613f0c57600080fd5b600160a060020a038216600090815260026020526040902054613f3690600163ffffffff613f6e16565b600160a060020a0390921660009081526002602090815260408083209490945591815290819052208054600160a060020a0319169055565b600082821115613f7a57fe5b50900390565b600081815260208190526040902054600160a060020a031615613fa257600080fd5b6000818152602081815260408083208054600160a060020a031916600160a060020a03871690811790915583526002909152902054613fe290600161418b565b600160a060020a0390921660009081526002602052604090209190915550565b600e8054606433067f028f5c28f5c28f5c28f5c28f5c28f5c28f5c28f5c28f5c28f5c28f5c28f5c28f4360001901400401019081905590565b6000903b1190565b602081015160a08201516030906140599061411f565b9060020a028117905060586140718360c0015161411f565b6060840151608085015194517201000000000000000000000000000000000000027101000000000000000000000000000000000090950270010000000000000000000000000000000090910260029390930a9091029290921717171790565b6140da8282614198565b600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3015550565b6000805b6005811015611061576008810283826005811061413c57fe5b602002015160029190910a029190911790600101614123565b6000805b6005811015611061576010810283826005811061417257fe5b602002015160029190910a029190911790600101614159565b8181018281101561116657fe5b600160a060020a03821615156141ad57600080fd5b6141b782826136a5565b604080518281529051600160a060020a038416916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b610280604051908101604052806000815260200160008152602001600081526020016000815260200160008152602001614234614253565b8152602001614241614253565b815260200161424e614253565b905290565b60a0604051908101604052806005906020820280388339509192915050565b60408051808201825290600290829080388339509192915050565b6060604051908101604052806003906020820280388339509192915050565b815481835581811115610d6e57600083815260209020610d6e918101908301610c6d91905b808211156142e557600081556001016142d1565b50905600a165627a7a72305820cc930dfb63da67c2f11234443ecfc4eb23d21eebbbcec6ea66063eba28a673cb0029

Deployed ByteCode Sourcemap

58011:2248:0:-;;;;;;;;;-1:-1:-1;;;58011:2248:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12233:10;12223:21;;;;:9;:21;;;;;;;;12215:30;;;;;;;;58011:2248;58127:32;;8:9:-1;5:2;;;30:1;27;20:12;5:2;58127:32:0;;;;;;;;;;;;;;;;;;;;31328:70;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31328:70: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;31328:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22484:113;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;22484:113:0;;;;;;;;;-1:-1:-1;;;;;22484:113:0;;;;;;;;;;;;;;21884:364;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;21884:364:0;-1:-1:-1;;;;;21884:364:0;;;;;;;32609:89;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32609:89:0;;;;49056:739;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;49056:739:0;-1:-1:-1;;;;;49056:739:0;;;;;;;;;;;23998:325;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;23998:325:0;-1:-1:-1;;;;;23998:325:0;;;;;;;;;;;;13840:242;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;13840:242:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13840:242:0;;-1:-1:-1;13840:242:0;;-1:-1:-1;;;;;;;13840:242:0;;;;;;;;;;;;;;;;;;;37649:24;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;37649:24:0;;;;;13366:230;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;13366:230:0;-1:-1:-1;;;;;13366:230:0;;;;;32281:180;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;32281:180:0;-1:-1:-1;;;;;32281:180:0;;;;;;;38287:59;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38287:59:0;;;;41972:562;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;41972:562: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;41972:562: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;41972:562:0;;;;;;;;;;;;;;;;;;;;;48523:49;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;48523:49:0;-1:-1:-1;;;;;48523:49:0;;;;;47359:877;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;47359:877:0;;;;;;;;;;;56698:1258;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;56698:1258: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;56698:1258:0;;;;;;;;;;;;;;;;59802:298;;8:9:-1;5:2;;;30:1;27;20:12;5:2;59802:298:0;;;;40730:126;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;40730:126:0;;;;;24952:235;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;24952:235:0;-1:-1:-1;;;;;24952:235:0;;;;;;;;;;;;40864:521;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;40864:521:0;-1:-1:-1;;;;;40864:521:0;;;;;21311:143;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;21311:143:0;;;;;33035;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;33035:143:0;;;;;53249:908;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;53249:908:0;-1:-1:-1;;;;;53249:908:0;;;;;5118:26;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5118:26:0;;;;60108:148;;8:9:-1;5:2;;;30:1;27;20:12;5:2;60108:148:0;;;;4692:161;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;4692:161:0;-1:-1:-1;;;;;4692:161:0;;;;;20958:168;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;20958:168:0;;;;;48579:62;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;48579:62:0;-1:-1:-1;;;;;48579:62:0;;;;;40006:536;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;40006:536:0;;;;;;;46845:506;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;46845:506:0;-1:-1:-1;;;;;46845:506:0;;;;;20593:145;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;20593:145:0;-1:-1:-1;;;;;20593:145:0;;;;;12460:223;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;12460:223:0;-1:-1:-1;;;;;12460:223:0;;;;;38241:39;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38241:39:0;;;;6152:72;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6152:72:0;;;;42855:1391;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;42855:1391:0;-1:-1:-1;;;;;42855:1391:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3573:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3573:20:0;;;;48244:101;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48244:101:0;;;;41393:571;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;41393:571:0;-1:-1:-1;;;;;41393:571:0;;;;;31502:74;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31502:74:0;;;;11952:41;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;11952:41:0;-1:-1:-1;;;;;11952:41:0;;;;;22890:209;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;22890:209:0;-1:-1:-1;;;;;22890:209:0;;;;;;;;;54165:300;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;54165:300:0;-1:-1:-1;;;;;54165:300:0;;;;;;;48650:398;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;48650:398: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;48650:398: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;48650:398:0;;;;;;;;;;;;;;;;;;25888:314;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;25888:314:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25888:314:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25888:314:0;;-1:-1:-1;25888:314:0;;-1:-1:-1;;;;;;;25888:314:0;58067:51;;8:9:-1;5:2;;;30:1;27;20:12;5:2;58067:51:0;;;;58276:1235;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;58276:1235:0;-1:-1:-1;;;;;58276:1235:0;;;;;44254:398;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;44254:398:0;-1:-1:-1;;;;;44254:398:0;;;;;;;;;;;;;31776:136;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;31776:136:0;;;;;49803:1918;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;49803:1918:0;-1:-1:-1;;;;;49803:1918:0;;;;;;;12904:232;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;12904:232:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12904:232:0;;-1:-1:-1;12904:232:0;;-1:-1:-1;;;;;;;12904:232:0;46800:36;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46800:36:0;;;;23416:144;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;23416:144:0;-1:-1:-1;;;;;23416:144:0;;;;;;;;;;40550:172;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;40550:172:0;;;;;;;4193:178;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;4193:178:0;-1:-1:-1;;;;;4193:178:0;;;;;59519:215;;8:9:-1;5:2;;;30:1;27;20:12;5:2;59519:215:0;;;;51729:1482;;8:9:-1;5:2;;;30:1;27;20:12;5:2;-1:-1;51729:1482:0;-1:-1:-1;;;;;51729:1482:0;;;;;;;4460:24;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4460:24:0;;;;58127:32;;;;:::o;31328:70::-;31387:5;31380:12;;;;;;;;-1:-1:-1;;31380:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31365:6;;31380:12;;31387:5;;31380:12;;31387:5;31380:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31328:70;;:::o;22484:113::-;22544:7;22567:24;;;:14;:24;;;;;;-1:-1:-1;;;;;22567:24:0;22484:113;;;;:::o;21884:364::-;21946:13;21962:17;21970:8;21962:7;:17::i;:::-;21946:33;-1:-1:-1;;;;;;21994:12:0;;;;;;;;21986:21;;;;;;22022:10;-1:-1:-1;;;;;22022:19:0;;;;:58;;;22045:35;22062:5;22069:10;22045:16;:35::i;:::-;22014:67;;;;;;;;22127:1;22094:21;22106:8;22094:11;:21::i;:::-;-1:-1:-1;;;;;22094:35:0;;;:56;;;-1:-1:-1;;;;;;22133:17:0;;;;22094:56;22090:153;;;22161:24;;;;:14;:24;;;;;;;;;:30;;-1:-1:-1;;;;;;22161:30:0;-1:-1:-1;;;;;22161:30:0;;;;;;;;;22205;;;;;;;22161;;22205;;;;;;;;;;;;22090:153;21884:364;;;:::o;32609:89::-;32676:9;:16;32609:89;:::o;49056:739::-;49415:20;;:::i;:::-;12233:10;12223:21;;;;:9;:21;;;;;;;;12215:30;;;;;;;;-1:-1:-1;;;;;49260:20:0;;;;49252:62;;;;;-1:-1:-1;;;;;49252:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;49350:1;49333:18;;49325:77;;;;;-1:-1:-1;;;;;49325:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49438:21;49449:9;49438:10;:21::i;:::-;49415:44;;49479:57;49521:6;49529;49479:41;:57::i;:::-;49470:66;;49597:14;49557:6;:23;;;49581:11;49557:36;;;;;;;;;;;;;:54;;49549:119;;;;;-1:-1:-1;;;;;49549:119:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49681:23;;;;49721:14;;49705:11;49681:36;;;;;;;;;;:54;;;;;;;;49746:41;49769:9;49780:6;49746:22;:41::i;:::-;49056:739;;;;;:::o;23998:325::-;24085:8;20340:39;20358:10;20370:8;20340:17;:39::i;:::-;20332:48;;;;;;;;-1:-1:-1;;;;;24110:19:0;;;;24102:28;;;;;;-1:-1:-1;;;;;24145:17:0;;;;24137:26;;;;;;24172:30;24186:5;24193:8;24172:13;:30::i;:::-;24209:32;24225:5;24232:8;24209:15;:32::i;:::-;24248:25;24259:3;24264:8;24248:10;:25::i;:::-;24303:3;-1:-1:-1;;;;;24287:30:0;24296:5;-1:-1:-1;;;;;24287:30:0;;24308:8;24287:30;;;;;;;;;;;;;;;;;;23998:325;;;;:::o;13840:242::-;4006:5;;13920:12;;;;-1:-1:-1;;;;;4006:5:0;3992:10;:19;3984:28;;;;;;-1:-1:-1;13958:1:0;13941:136;13965:5;:12;13961:1;:16;13941:136;;;13997:36;14024:5;14030:1;14024:8;;;;;;;;;;;;;;;;;;13997:26;:36::i;:::-;13993:77;;;14056:4;14046:14;;13993:77;13979:3;;13941:136;;;13840:242;;;;:::o;37649:24::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37649:24:0;:::o;13366:230::-;4006:5;;13441:12;;-1:-1:-1;;;;;4006:5:0;3992:10;:19;3984:28;;;;;;-1:-1:-1;;;;;13466:15:0;;;;;;:9;:15;;;;;;;;13462:129;;;-1:-1:-1;;;;;13492:15:0;;13510:5;13492:15;;;:9;:15;;;;;;;;;:23;;-1:-1:-1;;13492:23:0;;;13529:31;;;;;;;;;;;;;;;;;-1:-1:-1;13579:4:0;13366:230;;;:::o;32281:180::-;32363:7;32396:17;32406:6;32396:9;:17::i;:::-;32387:26;;32379:35;;;;;;-1:-1:-1;;;;;32428:19:0;;;;;;:11;:19;;;;;:27;;32448:6;;32428:27;;;;;;;;;;;;;;32421:34;;32281:180;;;;;:::o;38287:59::-;;;-1:-1:-1;;;;;38287:59:0;;:::o;41972:562::-;42052:14;42077:18;42106:15;42132;42158:39;;:::i;:::-;42208:45;;:::i;:::-;42272:16;;:::i;:::-;42291:15;42302:3;42291:10;:15::i;:::-;42328:9;;42361:13;;;;42395:10;;;;42426;;;;42461:14;;;;42506:20;;;;;42328:9;;42361:13;;-1:-1:-1;42395:10:0;;-1:-1:-1;42426:10:0;-1:-1:-1;42461:14:0;;-1:-1:-1;42506:20:0;-1:-1:-1;41972:562:0;-1:-1:-1;;;41972:562:0:o;48523:49::-;;;;;;;;;;;;;:::o;47359:877::-;5294:6;;-1:-1:-1;;;5294:6:0;;;;5293:7;5285:16;;;;;;47566:15;;;;;;;;;-1:-1:-1;;;;;47566:15:0;-1:-1:-1;;;;;47566:32:0;;:34;;;;;-1:-1:-1;;;47566:34:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47566:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47566:34:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47566:34:0;47562:83;;;47602:11;;:43;;;;;;47623:10;47602:43;;;;;;;;;;;;-1:-1:-1;;;;;47602:11:0;;;;:20;;:43;;;;;:11;;:43;;;;;;;;:11;;:43;;;5:2:-1;;;;30:1;27;20:12;5:2;47602:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47602:43:0;;;;47562:83;47861:10;47839:18;47847:9;47839:7;:18::i;:::-;-1:-1:-1;;;;;47839:32:0;;47831:54;;;;;-1:-1:-1;;;;;47831:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;47906:11;;47898:31;;-1:-1:-1;;;;;47906:11:0;47919:9;47898:7;:31::i;:::-;48063:11;;:165;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48207:10;48063:165;;;;;;-1:-1:-1;;;;;48063:11:0;;;;:25;;:165;;;;;:11;;:165;;;;;;;;:11;;:165;;;5:2:-1;;;;30:1;27;20:12;5:2;48063:165:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;48063:165:0;;;;47359:877;;;;:::o;56698:1258::-;56772:24;;:::i;:::-;56809:20;56908;;:::i;:::-;56965:13;57037:42;;:::i;:::-;56832:15;;:63;;;-1:-1:-1;;;;;56832:63:0;;56892:2;56832:63;;;;;;57119:27;;;;;;-1:-1:-1;;;;;56832:15:0;;;;:28;;:63;;;;;;;;;;;;;;;57119:27;56832:15;:63;;;5:2:-1;;;;30:1;27;20:12;5:2;56832:63:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;56832:63:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;56832:63:0;;-1:-1:-1;56931:21:0;56942:9;56931:10;:21::i;:::-;56908:44;;57009:15;56991:6;:14;;;56982:6;:4;:6::i;:::-;:23;56981:43;56965:59;;57082:6;:24;;;57037:69;;57149:15;;;;;;;;;-1:-1:-1;;;;;57149:15:0;-1:-1:-1;;;;;57149:28:0;;57215:2;57149:69;;;;;-1:-1:-1;;;57149:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;57149:69:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;57149:69:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;57149:69:0;;-1:-1:-1;57450:1:0;;-1:-1:-1;57436:470:0;57457:17;57453:1;:21;57436:470;;;57500:10;57511:1;57500:13;;;;;;;;;;;:18;57496:37;;;57522:8;;57496:37;57579:74;57628:8;57598:6;:24;;;57623:1;57598:27;;;;;;;;;;;;;:38;48502:12;57579:18;:74::i;:::-;57549:23;;;;57573:1;57549:26;;;;;;;;;;:104;;;;;;;57695:24;;;;57725:22;;57720:1;57695:27;;;;;;;;;;;:52;57670:77;;57795:17;57766:6;:23;;;57790:1;57766:26;;;;;;;;;;;;;:46;57762:133;;;57833:23;;;;57862:17;;57857:1;57833:26;;;;;;;;;;:46;57762:133;57476:3;;;;;57436:470;;;-1:-1:-1;;;57925:23:0;;;;;;56698:1258;-1:-1:-1;;;;;56698:1258:0:o;59802:298::-;4006:5;;-1:-1:-1;;;;;4006:5:0;3992:10;:19;3984:28;;;;;;5454:6;;-1:-1:-1;;;5454:6:0;;;;5446:15;;;;;;;;59868:11;;-1:-1:-1;;;;;59868:11:0;:25;;59860:74;;;;;-1:-1:-1;;;;;59860:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59953:15;;-1:-1:-1;;;;;59953:15:0;:29;;59945:76;;;;;-1:-1:-1;;;;;59945:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60077:15;:13;:15::i;:::-;59802:298::o;40730:126::-;40797:4;40820:28;;;:19;:28;;;;;;;40730:126::o;24952:235::-;25073:8;20340:39;20358:10;20370:8;20340:17;:39::i;:::-;20332:48;;;;;;;;25139:42;25156:5;25163:3;25168:8;25139:42;;;;;;;;;;;;;:16;:42::i;:::-;24952:235;;;;:::o;40864:521::-;4006:5;;40947:34;;-1:-1:-1;;;;;4006:5:0;3992:10;:19;3984:28;;;;;;41001:8;40947:63;;41223:17;-1:-1:-1;;;;;41223:35:0;;:37;;;;;-1:-1:-1;;;41223:37:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41223:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41223:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41223:37:0;41215:73;;;;;;;-1:-1:-1;;;;;41215:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;41342:15;:35;;-1:-1:-1;;;;;;41342:35:0;-1:-1:-1;;;;;41342:35:0;;;;;;;;;;-1:-1:-1;40864:521:0:o;21311:143::-;21366:4;21395:20;;;;;;;;;;;-1:-1:-1;;;;;21395:20:0;21429:19;;;21311:143::o;33035:::-;33094:7;33127:13;:11;:13::i;:::-;33118:22;;33110:31;;;;;;33155:9;:17;;33165:6;;33155:17;;;;;;;;;;;;;;33148:24;;33035:143;;;:::o;53249:908::-;53323:4;53340:20;53439:14;53510:22;53581:6;53636:20;;:::i;:::-;53363:15;;:63;;;-1:-1:-1;;;;;53363:63:0;;53423:2;53363:63;;;;;;53723:13;;-1:-1:-1;;;;;53363:15:0;;:28;;:63;;;;;;;;;;;;;;53723:13;53363:15;:63;;;5:2:-1;;;;30:1;27;20:12;5:2;53363:63:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53363:63:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;53363:63:0;-1:-1:-1;;;;;53456:24:0;;;;;;:16;53363:63;53456:24;;;;;53363:63;;-1:-1:-1;48502:12:0;53456:41;;-1:-1:-1;53535:28:0;53473:6;53535:20;:28::i;:::-;53510:53;;53590:1;53581:10;;53576:509;53597:17;53593:1;:21;53576:509;;;53659:47;53671:33;53694:6;53702:1;53671:22;:33::i;:::-;53659:10;:47::i;:::-;53636:70;;53801:15;53749:48;53782:6;53790;53749:32;:48::i;:::-;53740:6;:4;:6::i;:::-;:57;53739:77;53723:93;;54065:8;53973:15;;;;;;;;;-1:-1:-1;;;;;53973:15:0;-1:-1:-1;;;;;53973:28:0;;54042:2;53973:72;;;;;-1:-1:-1;;;53973:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53973:72:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;53973:72:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;53973:72:0;53893:24;;;;53874:78;;53923:8;;53918:1;53893:27;;;;;:38;53933:18;53874;:78::i;:::-;53845:23;;;;:26;:107;53844:201;:229;53831:242;;;;;53616:3;;;;;;53576:509;;;54104:45;54123:9;48502:12;54104:18;:45::i;:::-;54097:52;53249:908;-1:-1:-1;;;;;;;;53249:908:0:o;5118:26::-;;;-1:-1:-1;;;5118:26:0;;;;;:::o;60108:148::-;4636:9;;60169:15;;-1:-1:-1;;;;;4636:9:0;4622:10;:23;4614:50;;;;;-1:-1:-1;;;;;4614:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60221:9:0;;:27;;60195:4;60187:21;;-1:-1:-1;;;;;60221:9:0;;:27;;;;;60187:21;;60221:9;:27;:9;:27;60187:21;60221:9;:27;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;60221:27:0;60108:148;:::o;4692:161::-;4006:5;;-1:-1:-1;;;;;4006:5:0;3992:10;:19;3984:28;;;;;;-1:-1:-1;;;;;4771:24:0;;;4767:79;;4812:9;:22;;-1:-1:-1;;;;;;4812:22:0;-1:-1:-1;;;;;4812:22:0;;;;;4767:79;4692:161;:::o;20958:168::-;21014:7;21046:20;;;;;;;;;;;-1:-1:-1;;;;;21046:20:0;21081:19;;;21073:28;;;;;48579:62;;;;;;;;;;;;;:::o;40006:536::-;40094:4;40141:34;;;:25;:34;;;;;;;;:43;;;;;;;;;8452:27;40367:50;;40363:91;;40441:1;40434:8;;;;40363:91;8452:27;40503:3;40478:28;;40477:57;40471:3;:63;40464:70;;40006:536;;;;;;:::o;46845:506::-;4006:5;;46924:35;;-1:-1:-1;;;;;4006:5:0;3992:10;:19;3984:28;;;;;;46980:8;46924:65;;47192:17;-1:-1:-1;;;;;47192:36:0;;:38;;;;;-1:-1:-1;;;47192:38:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;47192:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;47192:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;47192:38:0;47184:74;;;;;;;-1:-1:-1;;;;;47184:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;47312:11;:31;;-1:-1:-1;;;;;;47312:31:0;-1:-1:-1;;;;;47312:31:0;;;;;;;;;;-1:-1:-1;46845:506:0:o;20593:145::-;20649:7;-1:-1:-1;;;;;20673:20:0;;;;20665:29;;;;;;-1:-1:-1;;;;;;20708:24:0;;;;;:16;:24;;;;;;;20593:145::o;12460:223::-;4006:5;;12530:12;;-1:-1:-1;;;;;4006:5:0;3992:10;:19;3984:28;;;;;;-1:-1:-1;;;;;12556:15:0;;;;;;:9;:15;;;;;;;;12555:16;12551:127;;;-1:-1:-1;;;;;12582:15:0;;;;;;:9;:15;;;;;;;;;:22;;-1:-1:-1;;12582:22:0;12600:4;12582:22;;;12618:29;;;;;;;;;;;;;;;;;-1:-1:-1;12666:4:0;12460:223;;;:::o;38241:39::-;;;-1:-1:-1;;;;;38241:39:0;;:::o;6152:72::-;6019:5;;-1:-1:-1;;;;;6019:5:0;6005:10;:19;;:59;;-1:-1:-1;6055:9:0;;-1:-1:-1;;;;;6055:9:0;6041:10;:23;6005:59;5983:141;;;;;;;-1:-1:-1;;;;;5983:141:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6203:13;:11;:13::i;42855:1391::-;42934:4;42951:22;43017:26;43109:37;;:::i;:::-;43213:20;43272:19;43364:27;43411:6;43466:20;;:::i;:::-;43558:6;43625:15;42976:28;42997:6;42976:20;:28::i;:::-;42951:53;;8676:1;43057:17;:38;43046:50;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;43046:50:0;;43017:79;;43149:15;;;;;;;;;-1:-1:-1;;;;;43149:15:0;-1:-1:-1;;;;;43149:44:0;;43194:7;43149:53;;;;;-1:-1:-1;;;43149:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43149:53:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43149:53:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;13:2;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43236:25:0;;;43322;;;43236;;-1:-1:-1;43236:25:0;-1:-1:-1;43294:53:0;;-1:-1:-1;;43294:57:0;;-1:-1:-1;43259:1:0;;-1:-1:-1;43259:1:0;;-1:-1:-1;43406:592:0;43427:17;43423:1;:21;43406:592;;;43489:47;43501:33;43524:6;43532:1;43501:22;:33::i;43489:47::-;43466:70;;43567:1;43558:10;;43553:434;43574:25;43570:29;;43553:434;;;43643:18;;;;43662:1;43643:21;;;;;;;;;;;;-1:-1:-1;43686:15:0;;43683:25;;;43703:5;;43683:25;43746:15;43732:10;:29;;:61;;;;;43779:14;43765:10;:28;;43732:61;43729:243;;;43857:10;43818:12;43831:22;43818:36;;;;;;;;;;;;;;;;;;:49;43928:24;;;;;43729:243;43601:3;;;;;43553:434;;;43446:3;;;;;43406:592;;;44039:1;44014:22;:26;44010:229;;;44129:12;44142:41;44153:1;44181;44156:22;:26;44142:10;:41::i;:::-;44129:55;;;;;;;;;;;;;;;;44117:68;;;;44010:229;-1:-1:-1;;44218:9:0;;44010:229;42855:1391;;;;;;;;;;;;;;:::o;3573:20::-;;;-1:-1:-1;;;;;3573:20:0;;:::o;48244:101::-;6019:5;;-1:-1:-1;;;;;6019:5:0;6005:10;:19;;:59;;-1:-1:-1;6055:9:0;;-1:-1:-1;;;;;6055:9:0;6041:10;:23;6005:59;5983:141;;;;;;;-1:-1:-1;;;;;5983:141:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48308:11;;;;;;;;;-1:-1:-1;;;;;48308:11:0;-1:-1:-1;;;;;48308:27:0;;:29;;;;;-1:-1:-1;;;48308:29:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;48308:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;41393:571:0;4006:5;;41486:44;;-1:-1:-1;;;;;4006:5:0;3992:10;:19;3984:28;;;;;;41560:8;41486:83;;41782:17;-1:-1:-1;;;;;41782:45:0;;:47;;;;;-1:-1:-1;;;41782:47:0;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41782:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41782:47:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41782:47:0;41774:83;;;;;;;-1:-1:-1;;;;;41774:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;41911:25;:45;;-1:-1:-1;;;;;;41911:45:0;-1:-1:-1;;;;;41911:45:0;;;;;;;;;;-1:-1:-1;41393:571:0:o;31502:74::-;31563:7;31556:14;;;;;;;;-1:-1:-1;;31556:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31541:6;;31556:14;;31563:7;;31556:14;;31563:7;31556:14;;;;;;;;;;;;;;;;;;;;;;;;11952:41;;;;;;;;;;;;;;;:::o;22890:209::-;-1:-1:-1;;;;;22968:17:0;;22975:10;22968:17;;22960:26;;;;;;23011:10;22993:29;;;;:17;:29;;;;;;;;-1:-1:-1;;;;;22993:34:0;;;;;;;;;;;;:46;;-1:-1:-1;;22993:46:0;;;;;;;;;;23051:42;;;;;;;22993:34;;23011:10;23051:42;;;;;;;;;;;22890:209;;:::o;54165:300::-;54284:20;;:::i;:::-;12233:10;12223:21;;;;:9;:21;;;;;;;;12215:30;;;;;;;;54307:21;54318:9;54307:10;:21::i;:::-;54284:44;;54348:57;54390:6;54398;54348:41;:57::i;:::-;54339:66;;54416:41;54439:9;54450:6;54416:22;:41::i;48650:398::-;48746:15;48772:39;;:::i;:::-;48822:44;;:::i;:::-;48885:16;;:::i;:::-;48904:15;48915:3;48904:10;:15::i;:::-;48942:10;;;;48977:14;;;;49021:19;;;;;48942:10;;48977:14;;-1:-1:-1;49021:19:0;-1:-1:-1;48650:398:0;-1:-1:-1;;;48650:398:0:o;25888:314::-;26027:8;20340:39;20358:10;20370:8;20340:17;:39::i;:::-;20332:48;;;;;;;;26047:34;26060:5;26067:3;26072:8;26047:12;:34::i;:::-;26142:53;26167:5;26174:3;26179:8;26189:5;26142:24;:53::i;:::-;26134:62;;;;;;;58067:51;58113:5;58067:51;:::o;58276:1235::-;58409:26;;:::i;:::-;58517:31;;:::i;:::-;58638:37;;:::i;:::-;58767:36;;:::i;:::-;58904:19;;:::i;:::-;4006:5;;-1:-1:-1;;;;;4006:5:0;3992:10;:19;3984:28;;;;;;58355:7;:14;:19;58347:49;;;;;-1:-1:-1;;;;;58347:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;58438:15;;;:66;;;;;;;;;;;;;;;-1:-1:-1;;;;;58438:15:0;;;;:34;;:66;;;;;;;;;;;:15;;:66;;;5:2:-1;;;;30:1;27;20:12;5:2;58438:66:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;58438:66:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;13:2;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;58551:15:0;;:76;;;;;;58624:2;58551:76;;;;;;58438:66;;-1:-1:-1;;;;;;58551:15:0;;;;:34;;:76;;;;;;;;;;;;;;;:15;;:76;;;5:2:-1;;;;30:1;27;20:12;5:2;58551:76:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;58551:76:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;13:2;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;58678:15:0;;:78;;;;;;58753:2;58678:78;;;;;;58551:76;;-1:-1:-1;;;;;;58678:15:0;;;;:34;;:78;;;;;;;;;;;;;;;:15;;:78;;;5:2:-1;;;;30:1;27;20:12;5:2;58678:78:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;58678:78:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;13:2;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;58806:15:0;;:85;;;;;;58888:2;58806:85;;;;;;58678:78;;-1:-1:-1;;;;;;58806:15:0;;;;:34;;:85;;;;;;;;;;;;;;;:15;;:85;;;5:2:-1;;;;30:1;27;20:12;5:2;58806:85:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;58806:85:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;13:2;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;58926:533:0;;;;;;;;58956:1;58926:533;;58992:3;58926:533;;;;;;;;;;;;;;59056:14;;58926:533;;;;;;;;59094:14;;;;58926:533;;;;;;;;;;;;;;;;59137:19;;58926:533;;59158:19;;;;58926:533;;;;59179:19;;;;58926:533;;;;-1:-1:-1;58926:533:0;;;;;;;;;;;;;;;;;;;;;;;;;;59240:25;;58926:533;;59267:25;;;;58926:533;;;;59294:25;;;;58926:533;;;;;;;;;;;;;;;;;;;;;;;;;;;59360:24;;58926:533;;59386:24;;;;58926:533;;;;;;;59412:24;;;;58926:533;;;;;;;;;;;;;;;;;;;;;;;;;;58806:85;;-1:-1:-1;58926:533:0;-1:-1:-1;59472:31:0;59484:11;58926:533;59472:11;:31::i;:::-;;58276:1235;;;;;;:::o;44254:398::-;44472:7;44497:20;;:::i;:::-;12233:10;12223:21;;;;:9;:21;;;;;;;;12215:30;;;;;;;;44520:79;44553:7;44562:8;44572;44582:16;44520:32;:79::i;:::-;44497:102;;44617:27;44629:6;44637;44617:11;:27::i;:::-;44610:34;44254:398;-1:-1:-1;;;;;;;44254:398:0:o;31776:136::-;31833:6;31856:16;31863:8;31856:6;:16::i;:::-;31848:25;;;;;;;;31887:19;;;;:9;:19;;;;;;;;;31880:26;;;;;;-1:-1:-1;;31880:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31887:19;;31880:26;;31887:19;31880:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31776:136;;;:::o;49803:1918::-;49995:22;50066:6;50130:15;50178:19;50295:6;50416:13;50484:20;;:::i;:::-;12233:10;50548:23;12223:21;;;:9;:21;;;;;;50548:23;;12223:21;;12215:30;;;;;;;;50020:28;50041:6;50020:20;:28::i;:::-;49995:53;;50075:1;50066:10;;50061:1653;50082:19;50078:1;:23;50061:1653;;;50148:12;50161:1;50148:15;;;;;;;;;;;;-1:-1:-1;50200:16:0;50217:1;50200:19;;;;;;;;;;;;-1:-1:-1;50240:19:0;;50236:38;;;50263:8;;50236:38;50304:1;50295:10;;50290:1310;50311:17;50307:1;:21;50290:1310;;;50365:19;;50361:35;;;50388:5;;50361:35;50432:33;50455:6;50463:1;50432:22;:33::i;:::-;50416:49;;50507:20;50518:8;50507:10;:20::i;:::-;50484:43;;50574:4;50548:30;;50613:1;50604:10;;50599:247;50620:25;50616:29;;50599:247;;;50699:18;;;;50718:1;50699:21;;;;;;;;;;;50685:10;:35;50681:146;;;50770:1;50749:22;;50798:5;;50681:146;50647:3;;50599:247;;;50869:18;50891:4;50869:26;50866:42;;;50898:8;;50866:42;50937:57;50979:6;50987;50937:41;:57::i;:::-;50928:66;;51063:1;51017:6;:23;;;51041:18;51017:43;;;;;;;;;;;;;:47;51013:511;;;51093:23;;;;51140:14;;51117:18;51093:43;;;;;;;;;;;:61;51089:416;;51183:23;;;;51230:14;;51207:18;51183:43;;;;;;;;;;:61;;;;;;;;-1:-1:-1;;;51089:416:0;;;51364:23;;;;51388:18;51364:43;;;;;;;;;;;51434:23;;;;51346:61;;;51480:1;;51458:18;51434:43;;;;;;;;;;:47;51089:416;51542:40;51565:8;51575:6;51542:22;:40::i;:::-;50330:3;;;;;50290:1310;;;51637:1;51620:14;:18;51616:87;;;51659:28;;;-1:-1:-1;;;;;51659:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;51616:87;50103:3;;;;;50061:1653;;;49803:1918;;;;;;;;;;;;:::o;12904:232::-;4006:5;;12979:12;;;;-1:-1:-1;;;;;4006:5:0;3992:10;:19;3984:28;;;;;;-1:-1:-1;13017:1:0;13000:131;13024:5;:12;13020:1;:16;13000:131;;;13056:31;13078:5;13084:1;13078:8;;;;;;;;;;;;;;;;;;13056:21;:31::i;:::-;13052:72;;;13110:4;13100:14;;13052:72;13038:3;;13000:131;;46800:36;;;-1:-1:-1;;;;;46800:36:0;;:::o;23416:144::-;-1:-1:-1;;;;;23518:25:0;;;23498:4;23518:25;;;:17;:25;;;;;;;;:36;;;;;;;;;;;;;;;23416:144::o;40550:172::-;40642:4;40665:40;;;:27;:40;;;;;;;;:49;;;;;;;;;;40550:172::o;4193:178::-;4006:5;;-1:-1:-1;;;;;4006:5:0;3992:10;:19;3984:28;;;;;;-1:-1:-1;;;;;4270:22:0;;;;4262:31;;;;;;4326:5;;4305:37;;-1:-1:-1;;;;;4305:37:0;;;;4326:5;;4305:37;;4326:5;;4305:37;4349:5;:16;;-1:-1:-1;;;;;;4349:16:0;-1:-1:-1;;;;;4349:16:0;;;;;;;;;;4193:178::o;59519:215::-;12233:10;12223:21;;;;:9;:21;;;;;;;;12215:30;;;;;;;;59611:17;:19;;;;;;;;58113:5;-1:-1:-1;59643:83:0;;;;;-1:-1:-1;;;;;59643:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;51729:1482;51890:20;51993:19;52126:14;52201:22;52271:20;52321:6;52380:20;;:::i;:::-;12233:10;52471:13;12223:21;;;:9;:21;;;;;;;;12215:30;;;;;;;;-1:-1:-1;;;;;51831:24:0;;;;;;:16;:24;;;;;;:42;-1:-1:-1;51827:1279:0;;;51913:15;;:63;;;-1:-1:-1;;;;;51913:63:0;;51973:2;51913:63;;;;;;-1:-1:-1;;;;;51913:15:0;;;;:28;;:63;;;;;;;;;;;;;;;:15;;:63;;;5:2:-1;;;;30:1;27;20:12;5:2;51913:63:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51913:63:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;51913:63:0;-1:-1:-1;;;;;52143:24:0;;;;;;:16;51913:63;52143:24;;;;;51913:63;;-1:-1:-1;48502:12:0;52015:32;;;;-1:-1:-1;52143:41:0;;-1:-1:-1;52226:28:0;52160:6;52226:20;:28::i;:::-;52201:53;;52294:5;52271:28;;52330:1;52321:10;;52316:679;52337:17;52333:1;:21;52316:679;;;52403:47;52415:33;52438:6;52446:1;52415:22;:33::i;52403:47::-;52380:70;;52549:15;52497:48;52530:6;52538;52497:32;:48::i;:::-;52488:6;:4;:6::i;:::-;:57;52487:77;52471:93;;52825:8;52729:15;;;;;;;;;-1:-1:-1;;;;;52729:15:0;-1:-1:-1;;;;;52729:28:0;;52798:2;52729:72;;;;;-1:-1:-1;;;52729:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;52729:72:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;52729:72:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;52729:72:0;52645:24;;;;52626:78;;52675:8;;52670:1;52645:27;;52626:78;52597:23;;;;:26;:107;52596:205;:237;52583:250;;;;;52858:27;;;52854:126;;52928:4;52910:22;;52955:5;;52854:126;52356:3;;;;;52316:679;;;53015:15;53014:16;53011:84;;;53051:28;;;-1:-1:-1;;;;;53051:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;53011:84;-1:-1:-1;;;;;53118:24:0;;53145:1;53118:24;;;:16;:24;;;;;:28;53197:6;:4;:6::i;:::-;-1:-1:-1;;;;;53157:37:0;;;;;;;:29;:37;;;;;:46;;;;-1:-1:-1;;;;;;;;;51729:1482:0:o;4460:24::-;;;-1:-1:-1;;;;;4460:24:0;;:::o;38445:718::-;38510:21;;:::i;:::-;38549:14;38589:19;38566:7;38574:3;38566:12;;;;;;;;;;;;;;;;;;;;;;38611:17;;;:12;:17;;;;;;;38662:23;;;38641:18;;;:44;;;;38566:12;;-1:-1:-1;38611:17:0;-1:-1:-1;38718:41:0;;38745:12;;;38718:41;:19;:41::i;:::-;38696:19;;;:63;38798:41;;38825:12;;;38798:41;:19;:41::i;:::-;38770:25;;;:69;38868:29;38882:13;;;38868:29;;38850:15;;;:47;38940:13;;;38926:29;;38892:3;38908:15;;:47;38997:13;;;38983:29;38966:46;;39043:28;;;-1:-1:-1;39025:15:0;;:46;39109;;39136:17;;;39109:46;:19;:46::i;:::-;39082:24;;;:73;-1:-1:-1;39082:7:0;;38445:718;-1:-1:-1;;38445:718:0:o;54994:1696::-;55102:6;;:::i;:::-;55144:15;;:63;;;-1:-1:-1;;;;;55144:63:0;;55204:2;55144:63;;;;;;55121:20;;;;;;;;;;;;;;-1:-1:-1;;;;;55144:15:0;;:28;;:63;;;;;;;;;;;;;;55121:20;55144:15;:63;;;5:2:-1;;;;30:1;27;20:12;5:2;55144:63:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55144:63:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;55144:63:0;;-1:-1:-1;55144:63:0;55287:49;55320:6;55328:7;55287:32;:49::i;:::-;55278:6;:4;:6::i;:::-;:58;55277:78;55249:106;;55611:20;55522:15;;;;;;;;;-1:-1:-1;;;;;55522:15:0;-1:-1:-1;;;;;55522:28:0;;55592:2;55522:73;;;;;-1:-1:-1;;;55522:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55522:73:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55522:73:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;55522:73:0;55433:25;;;;55414:91;;55464:20;;55459:1;55433:28;;55414:91;55384:24;;;;:27;:121;55383:212;:248;;-1:-1:-1;55672:45:0;55383:248;48502:12;55672:18;:45::i;:::-;-1:-1:-1;;;;;55644:24:0;;;;;;:16;:24;;;;;;;:73;;;;;;;;55787:15;;;55806;;55778:6;:4;:6::i;:::-;:24;55777:44;55761:60;;55864:15;;;;;;;;;-1:-1:-1;;;;;55864:15:0;-1:-1:-1;;;;;55864:28:0;;55930:2;55864:69;;;;;-1:-1:-1;;;55864:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;55864:69:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;55864:69:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;55864:69:0;;-1:-1:-1;56165:1:0;;-1:-1:-1;56151:505:0;56172:32;56168:36;;56151:505;;;56230:25;;;;56256:1;56230:28;;;;;;;;;;;:33;56226:52;;;56267:8;;56226:52;56325:75;56375:8;56344:7;:25;;;56370:1;56344:28;;;;;;;;56325:75;56294:24;;;;56319:1;56294:27;;;;;;;;;;:106;;;;;;;56442:25;;;;56473:22;;56468:1;56442:28;;;;;;;;;;;:53;56417:78;;56544:17;56514:7;:24;;;56539:1;56514:27;;;;;;;;;;;;;:47;56510:135;;;56582:24;;;;56612:17;;56607:1;56582:27;;;;;;;;;;:47;56510:135;56206:3;;;;;56151:505;;;-1:-1:-1;56675:7:0;;54994:1696;-1:-1:-1;;;;;;;;54994:1696:0:o;54473:249::-;54604:19;54585:6;:4;:6::i;:::-;54567:15;;;:24;54626:40;54567:7;54626:31;:40::i;:::-;54677:23;;;;:12;:23;;;;;;:37;;;;-1:-1:-1;;54473:249:0:o;26558:243::-;26644:4;26657:13;26673:17;26681:8;26673:7;:17::i;:::-;26657:33;;26716:5;-1:-1:-1;;;;;26704:17:0;:8;-1:-1:-1;;;;;26704:17:0;;:54;;;;26750:8;-1:-1:-1;;;;;26725:33:0;:21;26737:8;26725:11;:21::i;:::-;-1:-1:-1;;;;;26725:33:0;;26704:54;:91;;;;26762:33;26779:5;26786:8;26762:16;:33::i;:::-;26697:98;26558:243;-1:-1:-1;;;;26558:243:0:o;27901:271::-;28003:6;-1:-1:-1;;;;;27982:27:0;:17;27990:8;27982:7;:17::i;:::-;-1:-1:-1;;;;;27982:27:0;;27974:36;;;;;;28057:1;28021:24;;;:14;:24;;;;;;-1:-1:-1;;;;;28021:24:0;:38;28017:150;;28105:1;28070:24;;;:14;:24;;;;;;;;:37;;-1:-1:-1;;;;;;28070:37:0;;;28121:38;;;;;;;-1:-1:-1;;;;;28121:38:0;;;;;;;;;;;27901:271;;:::o;34336:872::-;34457:18;34511:22;34575:17;34410:38;34432:5;34439:8;34410:21;:38::i;:::-;34478:26;;;;:16;:26;;;;;;;;;-1:-1:-1;;;;;34536:18:0;;;;:11;:18;;;;;;:25;34478:26;;-1:-1:-1;34536:32:0;;34566:1;34536:32;:29;:32;:::i;:::-;-1:-1:-1;;;;;34595:18:0;;;;;;:11;:18;;;;;:34;;34511:57;;-1:-1:-1;34595:18:0;34511:57;;34595:34;;;;;;;;;;;;;;34575:54;;34671:9;34638:11;:18;34650:5;-1:-1:-1;;;;;34638:18:0;-1:-1:-1;;;;;34638:18:0;;;;;;;;;;;;34657:10;34638:30;;;;;;;;;;;;;;;;;;;;;:42;;;;-1:-1:-1;;;;;34687:18:0;;;;:11;:18;;;;;;:34;;34706:14;;34687:34;;;;;;;;;;;;;;;;;:38;;;;-1:-1:-1;;;;;35091:18:0;;;;:11;:18;;;;;;:27;;;;;-1:-1:-1;;35091:27:0;;;:::i;:::-;-1:-1:-1;35154:1:0;35125:26;;;:16;:26;;;;;;:30;;;35162:27;;;;;;:40;-1:-1:-1;;34336:872:0:o;33819:231::-;33924:14;33886:31;33903:3;33908:8;33886:16;:31::i;:::-;-1:-1:-1;;;;;;33941:16:0;;;;;;;:11;:16;;;;;;;;:23;;39:1:-1;23:18;;45:23;;33971:31:0;;;;;;;;;;;34009:26;;;:16;:26;;;;;:35;33819:231::o;7171:77::-;7237:3;7171:77;:::o;2370:237::-;2457:7;2495:12;2482:10;:25;;;;;;;;;-1:-1:-1;2566:1:0;2551:12;:16;2535:12;2522:10;:25;;;;;;;;:45;2518:82;;2584:4;;2370:237;;;;:::o;5739:95::-;4006:5;;-1:-1:-1;;;;;4006:5:0;3992:10;:19;3984:28;;;;;;5454:6;;-1:-1:-1;;;5454:6:0;;;;5446:15;;;;;;;;5793:6;:14;;-1:-1:-1;;5793:14:0;;;5819:9;;;;5802:5;;5819:9;5739:95::o;42542:129::-;-1:-1:-1;;;;;42637:19:0;42611:7;42637:19;;;:11;:19;;;;;:26;;42542:129::o;42679:168::-;-1:-1:-1;;;;;42802:19:0;;42776:7;42802:19;;;:11;:19;;;;;:37;;42822:16;;42802:37;;;;;54730:256;-1:-1:-1;;;;;54881:37:0;;54834:7;54881:37;;;:29;:37;;;;;;;54863:15;;;;:55;54862:115;;-1:-1:-1;;;;;54940:37:0;;;;;;:29;:37;;;;;;54862:115;;;54922:7;:15;;;54862:115;54854:124;54730:256;-1:-1:-1;;;54730:256:0:o;5559:93::-;4006:5;;-1:-1:-1;;;;;4006:5:0;3992:10;:19;3984:28;;;;;;5294:6;;-1:-1:-1;;;5294:6:0;;;;5293:7;5285:16;;;;;;5614:6;:13;;-1:-1:-1;;5614:13:0;-1:-1:-1;;;5614:13:0;;;5639:7;;;;5614:13;;5639:7;5559:93::o;6892:150::-;6956:7;7031:3;7020;7014;:9;7026:1;7014:13;7001:7;:5;:7::i;:::-;6991:18;;;;;;;;;;;;;;;6983:45;;;;;;;;:51;;6892:150;-1:-1:-1;;;6892:150:0:o;29676:342::-;29822:4;29895:13;29843:16;:3;-1:-1:-1;;;;;29843:14:0;;:16::i;:::-;29842:17;29838:51;;;29877:4;29870:11;;;;29838:51;29926:3;-1:-1:-1;;;;;29911:36:0;;29948:5;29955:8;29965:5;29911:60;;;;;-1:-1:-1;;;29911:60:0;;;;;;;-1:-1:-1;;;;;29911:60:0;-1:-1:-1;;;;;29911:60: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;29911:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29911:60:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29911:60:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29911:60:0;29986:25;;;29996:15;29986:25;;-1:-1:-1;29911:60:0;-1:-1:-1;29676:342:0;;;;;;;;:::o;44660:1174::-;44766:4;44788:14;44851:19;44926;45514:15;44805:35;44832:7;44805:26;:35::i;:::-;44788:52;;44873:40;44905:7;44873:31;:40::i;:::-;44948:7;27:10:-1;;44971:1:0;23:18:-1;;45:23;;;44948:20:0;;;;;;-1:-1:-1;44983:25:0;;;:12;44948:20;44983:25;;;;:39;;;44851:62;;-1:-1:-1;27:10;-1:-1;8394:7:0;45043:27;;45035:55;;;;;-1:-1:-1;;;;;45035:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;45157:11;45136:6;-1:-1:-1;;;;;45108:276:0;;45183:7;:15;;;45213:7;:15;;;45243:7;:14;;;45272:7;:19;;;45306:7;:25;;;45346:7;:24;;;45371:1;45346:27;;;;;;;;;;;;;45108:276;;;;;;;;;;;;;;;;;;;;;;;;;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;45108:276: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;45108:276:0;;;;;;;;;;;;;;;;;;;;;;;;;;45423:15;;;;45397:42;;;;:25;:42;;;;;;;;45440:15;;;;45397:59;;;;;;;:64;;45460:1;45397:64;;;45478:14;;45496:1;45478:19;45474:192;;;45532:15;;45559;;;;45576;;;;45532:60;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;45532:15:0;;;;:26;;:60;;;;;;;;;;;;;;;:15;;:60;;;5:2:-1;;;;30:1;27;20:12;5:2;45532:60:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45532:60:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;45532:60:0;45607:39;;;;:27;45532:60;45607:39;;;;;;;45647:1;45607:42;;;;;;;:47;;45653:1;45607:47;;;45532:60;-1:-1:-1;45474:192:0;45682:14;;45700:1;45682:19;45678:79;;;45738:1;45718:22;;:19;:22;;;:27;;45744:1;45718:27;;;45678:79;45769:26;45775:6;45783:11;45769:5;:26::i;:::-;-1:-1:-1;45815:11:0;44660:1174;-1:-1:-1;;;;;44660:1174:0:o;45842:845::-;45979:21;;:::i;:::-;46018:43;;:::i;:::-;46072:49;;:::i;:::-;46228:48;;:::i;:::-;46167:25;;:48;;;;;;;;;;;;;;-1:-1:-1;;;;;46167:25:0;;;;:39;;:48;;;;;;;;;;;;;;;:25;;:48;;;5:2:-1;;;;30:1;27;20:12;5:2;46167:48:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;46167:48:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;13:3;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;46287:38:0;;;46348:331;;;;;;;;;;;46420:3;46287:19;46348:331;;;;;;;;;;;;;;;;-1:-1:-1;;;46348:331:0;;;;;;;46167:48;46348:331;;;;;;46167:48;46348:331;;;;;;;;;45842:845::o;1477:204::-;1544:17;;:::i;:::-;1579:6;1574:100;1595:1;1591;:5;1574:100;;;1630:32;1654:1;:5;;1644:16;;;;1630:32;1618:6;1658:1;1618:9;;;;;;;;;;:44;1598:3;;1574:100;;1888:206;1955:17;;:::i;:::-;1990:6;1985:102;2006:1;2002;:5;1985:102;;;2041:34;2066:2;:6;;2056:17;;;;2041:34;2029:6;2071:1;2029:9;;;;;;;;;;:46;2009:3;;1985:102;;39654:344;39816:15;;;;39882:19;;;;39906:2;;39862:40;;:19;:40::i;:::-;:46;;;;39842:66;;;;39988:2;39939:45;39959:7;:24;;;39939:19;:45::i;:::-;:51;;;;;;39919:71;;39654:344;-1:-1:-1;39654:344:0:o;28936:218::-;29039:5;-1:-1:-1;;;;;29018:26:0;:17;29026:8;29018:7;:17::i;:::-;-1:-1:-1;;;;;29018:26:0;;29010:35;;;;;;-1:-1:-1;;;;;29078:23:0;;;;;;:16;:23;;;;;;:30;;29106:1;29078:30;:27;:30;:::i;:::-;-1:-1:-1;;;;;29052:23:0;;;;;;;:16;:23;;;;;;;;:56;;;;29115:20;;;;;;;;:33;;-1:-1:-1;;;;;;29115:33:0;;;28936:218::o;17206:113::-;17264:7;17287:6;;;;17280:14;;;;-1:-1:-1;17308:5:0;;;17206:113::o;28442:208::-;28549:1;28517:20;;;;;;;;;;;-1:-1:-1;;;;;28517:20:0;:34;28509:43;;;;;;28559:10;:20;;;;;;;;;;;:26;;-1:-1:-1;;;;;;28559:26:0;-1:-1:-1;;;;;28559:26:0;;;;;;;;28616:21;;:16;:21;;;;;;:28;;-1:-1:-1;28616:25:0;:28::i;:::-;-1:-1:-1;;;;;28592:21:0;;;;;;;:16;:21;;;;;:52;;;;-1:-1:-1;28442:208:0:o;6375:509::-;6764:13;:79;;6803:3;6789:10;6781:25;6675:76;6456:12;-1:-1:-1;;6456:16:0;6511:26;6817:25;6781:62;6764:79;;;;;;6375:509::o;15717:578::-;15774:4;16197:17;;16281:8;;15717:578::o;39171:475::-;39318:18;;;;39382:19;;;;39406:2;;39362:40;;:19;:40::i;:::-;:46;;;;39347:61;;;;39484:2;39434:46;39454:7;:25;;;39434:19;:46::i;:::-;39512:15;;;;39531:3;39560:15;;;39616:14;;39608:30;;39560:22;;;;39512;;;;39434:52;;;;;;;;39419:67;;;;39497:37;39545;39593:45;;39171:475::o;35482:177::-;35544:26;35556:3;35561:8;35544:11;:26::i;:::-;35606:9;:16;;35579:24;;;;:14;:24;;;;;:43;;;39:1:-1;23:18;;45:23;;35629:24:0;;;;;;;-1:-1:-1;35482:177:0:o;1689:191::-;1760:13;;1786:87;1807:1;1803;:5;1786:87;;;1854:1;:5;;1840:6;1858:1;1840:9;;;;;;;;;;;:20;;;;;;1830:31;;;;;1810:3;;1786:87;;2102:192;2173:13;;2199:88;2220:1;2216;:5;2199:88;;;2267:2;:6;;2253;2272:1;2253:9;;;;;;;;;;;:21;;;;;;2243:32;;;;;2223:3;;2199:88;;17386:127;17466:5;;;17485:6;;;;17478:14;;;27063:173;-1:-1:-1;;;;;27133:17:0;;;;27125:26;;;;;;27158:25;27169:3;27174:8;27158:10;:25::i;:::-;27195:35;;;;;;;;-1:-1:-1;;;;;27195:35:0;;;27212:1;;27195:35;;;;;;;;;27063:173;;:::o;58011:2248::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;:::o;:::-;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;-1:-1;58011:2248:0;;;-1:-1:-1;;58011:2248:0:o;:::-;;;;;;;;;;;;;;;105:10:-1;58011:2248:0;88:34:-1;-1:-1;58011:2248:0;;;-1:-1:-1;;58011:2248:0:o;:::-;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;-1:-1;58011:2248:0;;;-1:-1:-1;;58011:2248:0:o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

Swarm Source

bzzr://cc930dfb63da67c2f11234443ecfc4eb23d21eebbbcec6ea66063eba28a673cb

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.