Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
Etherland
Compiler Version
v0.6.2+commit.bacdbe57
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-12-02 */ // SPDX-License-Identifier: UNLICENSED pragma solidity 0.6.2; /** * @title IERC165 * @dev https://eips.ethereum.org/EIPS/eip-165 * @dev source : openzeppelin-solidity/contracts/introspection/IERC165.sol */ interface IERC165 { /** * @notice Query if a contract implements an interface * @param interfaceId The interface identifier, as specified in ERC-165 * @dev Interface identification is specified in ERC-165. This function * uses less than 30,000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } /** * @title SafeMath * @dev Unsigned math operations with safety checks that revert on error * @dev source : openzeppelin-solidity/contracts/math/SafeMath.sol */ library SafeMath { /** * @dev Multiplies two unsigned integers, reverts on overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "error"); return c; } /** * @dev Integer division of two unsigned integers truncating the quotient, reverts on division by zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, "cannot divide by 0 or negative"); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Subtracts two unsigned integers, reverts on overflow (i.e. if subtrahend is greater than minuend). */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "result cannot be lower than 0"); uint256 c = a - b; return c; } /** * @dev Adds two unsigned integers, reverts on overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "both numbers have to be positive"); return c; } /** * @dev Divides two unsigned integers and returns the remainder (unsigned integer modulo), * reverts when dividing by zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b != 0, "cannot divide by 0"); return a % b; } } /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids * * Include with `using Counters for Counters.Counter;` * Since it is not possible to overflow a 256 bit integer with increments of one, `increment` can skip the SafeMath * overflow check, thereby saving gas. This does assume however correct usage, in that the underlying `_value` is never * directly accessed. * @dev source : openzeppelin-solidity/contracts/drafts/Counters.sol */ library Counters { using SafeMath for uint256; struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { counter._value += 1; } function decrement(Counter storage counter) internal { counter._value = counter._value.sub(1); } } contract Storage { using Counters for Counters.Counter; // Token name string internal _name; // Token symbol string internal _symbol; // Token base uri string internal _baseTokenURI; // ERC165 supported interfaces bytes4 internal constant _INTERFACE_ID_ERC165 = 0x01ffc9a7; bytes4 internal constant _ERC721_RECEIVED = 0x150b7a02; bytes4 internal constant _INTERFACE_ID_ERC721 = 0x80ac58cd; bytes4 internal constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63; bytes4 internal constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f; // OpenSea proxy registry address public proxyRegistryAddress; // token id tracker uint256 internal _currentTokenId = 0; // Array with all token ids, used for enumeration uint256[] internal _allTokens; // mapping of interface id to whether or not it's supported mapping(bytes4 => bool) internal _supportedInterfaces; // 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 => Counters.Counter) internal _ownedTokensCount; // Mapping from owner to operator approvals mapping (address => mapping (address => bool)) internal _operatorApprovals; // Optional mapping for token URIs mapping(uint256 => string) internal _tokenURIs; // 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; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) internal _allTokensIndex; } /** * @title ERC165 * @author Matt Condon (@shrugs) * @dev Implements ERC165 using a lookup table. * @dev source : openzeppelin-solidity/contracts/introspection/ERC165.sol */ contract ERC165 is IERC165, Storage { /** * @dev implement supportsInterface(bytes4) using a lookup table */ function supportsInterface(bytes4 interfaceId) external override view returns (bool) { return _supportedInterfaces[interfaceId]; } /** * @dev internal method for registering an interface */ function _registerInterface(bytes4 interfaceId) internal { require(interfaceId != 0xffffffff, "bad interface"); _supportedInterfaces[interfaceId] = true; } } /** * @title ERC721 Non-Fungible Token Standard basic interface * @dev see https://eips.ethereum.org/EIPS/eip-721 * @dev source : openzeppelin-solidity/contracts/token/ERC721/IERC721.sol */ interface IERC721 is IERC165 { event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); event ApprovalForAll(address indexed owner, address indexed operator, bool approved); function balanceOf(address owner) external view returns (uint256 balance); function ownerOf(uint256 tokenId) external view returns (address owner); function approve(address to, uint256 tokenId) external; function getApproved(uint256 tokenId) external view returns (address operator); function setApprovalForAll(address operator, bool _approved) external; function isApprovedForAll(address owner, address operator) external view returns (bool); function transferFrom(address from, address to, uint256 tokenId) external; function safeTransferFrom(address from, address to, uint256 tokenId) external; function safeTransferFromWithData(address from, address to, uint256 tokenId, bytes calldata data) external; } /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. * @dev source : openzeppelin-solidity/contracts/token/ERC721/IERC721Receiver.sol */ interface IERC721Receiver { /** * @notice Handle the receipt of an NFT * @dev The ERC721 smart contract calls this function on the recipient * after a `safeTransfer`. This function MUST return the function selector, * otherwise the caller will revert the transaction. The selector to be * returned can be obtained as `this.onERC721Received.selector`. This * function MAY throw to revert and reject the transfer. * Note: the ERC721 contract address is always the message sender. * @param operator The address which called `safeTransferFrom` function * @param from The address which previously owned the token * @param tokenId The NFT identifier which is being transferred * @param data Additional data with no specified format * @return bytes4 `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` */ function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4); } /** * Utility library of inline functions on addresses * @dev source : openzeppelin-solidity/contracts/utils/Address.sol */ library Address { /** * Returns whether the target address is a contract * @dev This function will return false if invoked during the constructor of a contract, * as the code is not actually created until after the constructor finishes. * @param account address of the account to check * @return whether the target address is a contract */ function isContract(address account) internal view returns (bool) { uint256 size; // XXX Currently there is no better way to check if there is a contract in an address // than to check the size of the code at that address. // See https://ethereum.stackexchange.com/a/14016/36603 // for more details about how this works. // contracts then. // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } } /** * @title ERC721 Non-Fungible Token Standard basic implementation * @dev see https://eips.ethereum.org/EIPS/eip-721 * @dev source : openzeppelin-solidity/contracts/token/ERC721/ERC721.sol */ contract ERC721 is ERC165, IERC721 { using SafeMath for uint256; using Address for address; /** * @dev Event emitting when a NFT transfer occured */ event Transfer(address indexed from, address indexed to, uint256 tokenId); /** * @dev Event emitting when an address has been approved by an owner for spending a specific NFT */ event Approval(address indexed owner, address indexed approved, uint256 tokenId); /** * @dev Event emitting when an address has been approved by an owner for spending any of its NFT */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @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 override view returns (uint256) { require(owner != address(0), "owner cannot be address 0"); return _ownedTokensCount[owner].current(); } /** * @dev Gets the owner of the specified token ID * @param tokenId uint256 ID of the token to query the owner of * @return address currently marked as the owner of the given token ID */ function ownerOf(uint256 tokenId) public override view returns (address) { address owner = _tokenOwner[tokenId]; require(owner != address(0), "owner cannot be address 0"); return owner; } /** * @dev Approves another address to transfer the given token ID * The zero address indicates there is no approved address. * There can only be one approved address per token at a given time. * Can only be called by the token owner or an approved operator. * @param to address to be approved for the given token ID * @param tokenId uint256 ID of the token to be approved */ function approve(address to, uint256 tokenId) public override { address owner = ownerOf(tokenId); require(to != owner, "cannot approve yourself"); require(msg.sender == owner || isApprovedForAll(owner, msg.sender), "permission denied"); _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Gets the approved address for a token ID, or zero if no address set * Reverts if the token ID does not exist. * @param tokenId uint256 ID of the token to query the approval of * @return address currently approved for the given token ID */ function getApproved(uint256 tokenId) public override view returns (address) { require(_exists(tokenId), "tokenID doesn't exist"); return _tokenApprovals[tokenId]; } /** * @dev Sets or unsets the approval of a given operator * An operator is allowed to transfer all tokens of the sender on their behalf * @param to operator address to set the approval * @param approved representing the status of the approval to be set */ function setApprovalForAll(address to, bool approved) public override { require(to != msg.sender, "cannot approve yourself"); _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 override virtual view returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev Transfers the ownership of a given token ID to another address * Usage of this method is discouraged, use `safeTransferFrom` whenever possible * Requires the msg.sender to be the owner, approved, or operator * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 ID of the token to be transferred */ function transferFrom(address from, address to, uint256 tokenId) public override { require(_isApprovedOrOwner(msg.sender, tokenId), "spender is not approved"); _transferFrom(from, to, tokenId); } /** * @dev Safely transfers the ownership of a given token ID to another address * If the target address is a contract, it must implement `onERC721Received`, * which is called upon a safe transfer, and return the magic value * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise, * the transfer is reverted. * Requires the msg.sender to be the owner, approved, or operator * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 ID of the token to be transferred */ function safeTransferFrom(address from, address to, uint256 tokenId) public override { safeTransferFromWithData(from, to, tokenId, ""); } /** * @dev Safely transfers the ownership of a given token ID to another address * If the target address is a contract, it must implement `onERC721Received`, * which is called upon a safe transfer, and return the magic value * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise, * the transfer is reverted. * Requires the msg.sender to be the owner, approved, or operator * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 ID of the token to be transferred * @param _data bytes data to send along with a safe transfer check */ function safeTransferFromWithData(address from, address to, uint256 tokenId, bytes memory _data) public override { transferFrom(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "data check is not ok"); } /** * @dev Returns whether the specified token exists * @param tokenId uint256 ID of the token to query the existence of * @return bool whether the token exists */ function _exists(uint256 tokenId) internal view returns (bool) { address owner = _tokenOwner[tokenId]; return owner != address(0); } /** * @dev Returns whether the given spender can transfer a given token ID * @param spender address of the spender to query * @param tokenId uint256 ID of the token to be transferred * @return bool whether the msg.sender is approved for the given token ID, * is an operator of the owner, or is the owner of the token */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view returns (bool) { address owner = ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Internal function to mint a new token * Reverts if the given token ID already exists * @param to The address that will own the minted token * @param tokenId uint256 ID of the token to be minted */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "cannot mint to address 0"); require(!_exists(tokenId), "token already exists"); _tokenOwner[tokenId] = to; _ownedTokensCount[to].increment(); emit Transfer(address(0), to, tokenId); } /** * @dev Internal function to burn a specific token * Reverts if the token does not exist * Deprecated, use _burn(uint256) instead. * @param owner owner of the token to burn * @param tokenId uint256 ID of the token being burned */ function _burn(address owner, uint256 tokenId) internal virtual { require(ownerOf(tokenId) == owner, "address is not owner of tokenID"); _clearApproval(tokenId); _ownedTokensCount[owner].decrement(); _tokenOwner[tokenId] = address(0); emit Transfer(owner, address(0), tokenId); } /** * @dev Internal function to burn a specific token * Reverts if the token does not exist * @param tokenId uint256 ID of the token being burned */ function _burn(uint256 tokenId) internal { _burn(ownerOf(tokenId), tokenId); } /** * @dev Internal function to transfer ownership of a given token ID to another address. * As opposed to transferFrom, this imposes no restrictions on msg.sender. * @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) internal virtual { require(ownerOf(tokenId) == from, "sender is not owner of the token"); require(to != address(0), "cannot send to 0 address"); _clearApproval(tokenId); _ownedTokensCount[from].decrement(); _ownedTokensCount[to].increment(); _tokenOwner[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Internal function to invoke `onERC721Received` on a target address * The call is not executed if the target address is not a contract * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data) internal returns (bool) { if (!to.isContract()) { return true; } bytes4 retval = IERC721Receiver(to).onERC721Received(msg.sender, from, tokenId, _data); return (retval == _ERC721_RECEIVED); } /** * @dev Private function to clear current approval of a given token ID * @param tokenId uint256 ID of the token to be transferred */ function _clearApproval(uint256 tokenId) private { if (_tokenApprovals[tokenId] != address(0)) { _tokenApprovals[tokenId] = address(0); } } } /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 * @dev source : openzeppelin-solidity/contracts/token/ERC721/IERC721Full.sol */ interface IERC721Full is IERC721 { function totalSupply() external view returns (uint256); function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); function tokenByIndex(uint256 index) external view returns (uint256); function name() external view returns (string memory); function symbol() external view returns (string memory); } /** * @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://eips.ethereum.org/EIPS/eip-721 * @dev source : openzeppelin-solidity/contracts/token/ERC721/ERC721Full.sol */ contract ERC721Full is ERC721, IERC721Full { using SafeMath for uint256; /** * @dev Constructor function */ function init (string memory name, string memory symbol) internal { _name = name; _symbol = symbol; } /** * @dev Gets the token name * @return string representing the token name */ function name() external override view returns (string memory) { return _name; } /** * @dev Gets the token symbol * @return string representing the token symbol */ function symbol() external override view returns (string memory) { return _symbol; } /** * @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 override view returns (uint256) { require(index < balanceOf(owner), "index is too high"); 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 override view returns (uint256) { return _allTokens.length; } /** * @dev Gets the token ID at a given index of all the tokens in this contract * Reverts if the index is greater or equal to the total number of tokens * @param index uint256 representing the index to be accessed of the tokens list * @return uint256 token ID at the given index of the tokens list */ function tokenByIndex(uint256 index) public override view returns (uint256) { require(index < totalSupply(), "index is too high"); return _allTokens[index]; } /** * @dev Internal function to transfer ownership of a given token ID to another address. * As opposed to transferFrom, this imposes no restrictions on msg.sender. * @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) internal override { super._transferFrom(from, to, tokenId); _removeTokenFromOwnerEnumeration(from, tokenId); _addTokenToOwnerEnumeration(to, tokenId); } /** * @dev Internal function to mint a new token * Reverts if the given token ID already exists * @param to address the beneficiary that will own the minted token * @param tokenId uint256 ID of the token to be minted */ function _mint(address to, uint256 tokenId) internal override { super._mint(to, tokenId); _addTokenToOwnerEnumeration(to, tokenId); _addTokenToAllTokensEnumeration(tokenId); } /** * @dev Internal function to burn a specific token * Reverts if the token does not exist * Deprecated, use _burn(uint256) instead * @param owner owner of the token to burn * @param tokenId uint256 ID of the token being burned */ function _burn(address owner, uint256 tokenId) internal override { super._burn(owner, tokenId); _removeTokenFromOwnerEnumeration(owner, tokenId); // Since tokenId will be deleted, we can clear its slot in _ownedTokensIndex to trigger a gas refund _ownedTokensIndex[tokenId] = 0; _removeTokenFromAllTokensEnumeration(tokenId); } /** * @dev Gets the list of token IDs of the requested owner * @param owner address owning the tokens * @return uint256[] List of token IDs owned by the requested address */ function _tokensOfOwner(address owner) internal view returns (uint256[] storage) { return _ownedTokens[owner]; } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @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 _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { _ownedTokensIndex[tokenId] = _ownedTokens[to].length; _ownedTokens[to].push(tokenId); } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the _ownedTokensIndex mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @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 _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { uint256 lastTokenIndex = _ownedTokens[from].length.sub(1); uint256 tokenIndex = _ownedTokensIndex[tokenId]; if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; _ownedTokensIndex[lastTokenId] = tokenIndex; } _ownedTokens[from].pop(); } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { uint256 lastTokenIndex = _allTokens.length.sub(1); uint256 tokenIndex = _allTokensIndex[tokenId]; uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; _allTokensIndex[lastTokenId] = tokenIndex; _allTokens.pop(); _allTokensIndex[tokenId] = 0; } /** * @dev * @notice Non-Standard method to retrieve all NFTs that specific owner owns * @return uint[] containing all NFTs that owner owns */ function tokensOf(address owner) public view returns (uint[] memory) { return _tokensOfOwner(owner); } } /** * @title Ownable * @dev The Ownable contract has an owner address, and provides basic authorization control * functions, this simplifies the implementation of "user permissions". * @dev source : openzeppelin-solidity/contracts/ownership/Ownable.sol */ contract Ownable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @return the address of the owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(isOwner(), "sender is not owner"); _; } /** * @return true if `msg.sender` is the owner of the contract. */ function isOwner() public view returns (bool) { return msg.sender == _owner; } /** * @dev Allows the current owner to relinquish control of the contract. * It will not be possible to call the functions with the `onlyOwner` * modifier anymore. * @notice Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Allows the current owner to transfer control of the contract to a newOwner. * @param newOwner The address to transfer ownership to. */ function transferOwnership(address newOwner) public onlyOwner { _transferOwnership(newOwner); } /** * @dev Transfers control of the contract to a newOwner. * @param newOwner The address to transfer ownership to. */ function _transferOwnership(address newOwner) internal { require(newOwner != address(0), "new owner cannot be address 0"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } /** * @title Administrable * @dev Handle allowances for NFTs administration : * - minting * - burning * - access to admin web interfaces * @dev ADMINS STORAGE * @dev rights are integer(int16) defined as follow : * 1 : address can only mint tokens * 2 : address can mint AND burn tokens */ contract Administrable is Ownable { mapping(address => int16) private admins; event AdminRightsGranted(address indexed newAdmin, int16 adminRights); event AdminRightsRevoked(address indexed noAdmin); /** * @dev know if an address has admin rights and its type of rights * @param _admin the address to find admin rights of * @return int16 the admin right for _admin : * 1 : address can only mint tokens * 2 : address can mint AND burn tokens */ function adminRightsOf(address _admin) public view returns(int16) { if (_admin == owner()) return 2; else return admins[_admin]; } /** * @dev verifiy if an address can mint new tokens * @param _admin : the address to verify minting rights of * @return a boolean, truthy when _admin has rights to mint new tokens */ function isMinter(address _admin) public view returns (bool) { if (_admin == owner()) return true; else return( admins[_admin] > 0 ); } /** * @dev verifiy if an address has rights to mint and burn new tokens * @param _admin : the address to verify minter-burner rights of * @return a boolean, truthy when _admin has rights to mint and burn new tokens */ function isMinterBurner(address _admin) public view returns (bool) { if (_admin == owner()) return true; else return( admins[_admin] == 2 ); } /** * @dev canMint external * @return bool : truthy if msg.sender has admin rights to mint new tokens */ function canMint() public view returns(bool) { return( isMinter(msg.sender) ); } /** * @dev canBurn external * @return bool : truthy if msg.sender has admin rights to mint new tokens and burn existing tokens */ function canMintBurn() public view returns(bool) { return( isMinterBurner(msg.sender) ); } /** * @dev onlyMinter internal */ modifier onlyMinter() { require( canMint(), "denied : no admin minting rights" ); _; } /** * @dev onlyBurner internal */ modifier onlyMinterBurner() { require( canMintBurn(), "denied : no admin burning rights" ); _; } modifier validAddress(address _admin) { require(_admin != address(0), "invalid admin address"); _; } /** * @dev owner can grant admin access to allow any address to mint new tokens * @dev Restricted to CONTRACT OWNER ONLY * @param _admin : address to grant admin minter rights to */ function grantMinterRights(address _admin) external onlyOwner validAddress(_admin) { admins[_admin] = 1; emit AdminRightsGranted(_admin, 1); } /** * @dev owner can grant admin access to allow any address to mint new tokens and to burn existing tokens * @dev Restricted to CONTRACT OWNER ONLY * @param _admin : address to grant admin minter and burner rights to */ function grantMinterBurnerRights(address _admin) external onlyOwner validAddress(_admin) { admins[_admin] = 2; emit AdminRightsGranted(_admin, 2); } /** * @dev owner can revoke admin right of any admin address * @dev Restricted to CONTRACT OWNER ONLY * @param _admin : address to revoke admin access to */ function revokeAdminRights(address _admin) external onlyOwner validAddress(_admin) { admins[_admin] = 0; emit AdminRightsRevoked(_admin); } } library Strings { // via https://github.com/oraclize/ethereum-api/blob/master/oraclizeAPI_0.5.sol function strConcat(string memory _a, string memory _b, string memory _c, string memory _d, string memory _e) internal pure returns (string memory) { bytes memory _ba = bytes(_a); bytes memory _bb = bytes(_b); bytes memory _bc = bytes(_c); bytes memory _bd = bytes(_d); bytes memory _be = bytes(_e); string memory abcde = new string(_ba.length + _bb.length + _bc.length + _bd.length + _be.length); bytes memory babcde = bytes(abcde); uint k = 0; for (uint i = 0; i < _ba.length; i++) babcde[k++] = _ba[i]; for (uint i = 0; i < _bb.length; i++) babcde[k++] = _bb[i]; for (uint i = 0; i < _bc.length; i++) babcde[k++] = _bc[i]; for (uint i = 0; i < _bd.length; i++) babcde[k++] = _bd[i]; for (uint i = 0; i < _be.length; i++) babcde[k++] = _be[i]; return string(babcde); } function strConcat(string memory _a, string memory _b, string memory _c, string memory _d) internal pure returns (string memory) { return strConcat(_a, _b, _c, _d, ""); } function strConcat(string memory _a, string memory _b, string memory _c) internal pure returns (string memory) { return strConcat(_a, _b, _c, "", ""); } function strConcat(string memory _a, string memory _b) internal pure returns (string memory) { return strConcat(_a, _b, "", "", ""); } function uint2str(uint _i) internal pure returns (string memory _uintAsString) { if (_i == 0) { return "0"; } uint j = _i; uint len; while (j != 0) { len++; j /= 10; } bytes memory bstr = new bytes(len); uint k = len - 1; while (_i != 0) { bstr[k--] = byte(uint8(48 + _i % 10)); _i /= 10; } return string(bstr); } function fromAddress(address addr) internal pure returns(string memory) { bytes20 addrBytes = bytes20(addr); bytes16 hexAlphabet = "0123456789abcdef"; bytes memory result = new bytes(42); result[0] = "0"; result[1] = "x"; for (uint i = 0; i < 20; i++) { result[i * 2 + 2] = hexAlphabet[uint8(addrBytes[i] >> 4)]; result[i * 2 + 3] = hexAlphabet[uint8(addrBytes[i] & 0x0f)]; } return string(result); } } /** * @title OwnableDelegateProxy * @dev OpenSea compliant feature */ contract OwnableDelegateProxy { } /** * @title ProxyRegistry * @dev OpenSea compliant feature */ contract ProxyRegistry { mapping(address => OwnableDelegateProxy) public proxies; } /** * @title TradeableERC721Token * ERC721 contract that whitelists a trading address, and has minting functionalities. * @notice an external 'burn' function restricted to owner as been added */ contract TradeableERC721Token is ERC721Full, Administrable { using Strings for string; using SafeMath for uint256; function init(string memory _name, string memory _symbol, address _proxyRegistryAddress) internal { ERC721Full.init(_name, _symbol); proxyRegistryAddress = _proxyRegistryAddress; } /** * @dev Mints a token to an address. * @param _to address of the future owner of the token */ function mintTo(address _to) public onlyMinter { require(_to != address(0), "cannot mint to address 0"); uint256 newTokenId = _getNextTokenId(); _mint(_to, newTokenId); _incrementTokenId(); } /** * @dev Mint several tokens to an address. * @param _total total number of NFT to mint (reverts if <= 0) * @param _to default owner of the new created NFT (reverts if a zero address) */ function batchMintTo(uint _total, address _to) public onlyMinter { require(_total > 0, "mint minimum 1 token"); for (uint i = 0; i < _total; i++) mintTo(_to); } /** * @dev External Burn NFT method */ function burn(uint _tokenId) public onlyMinterBurner { super._burn(_tokenId); } /** * @dev calculates the next token ID based on value of _currentTokenId * @return uint256 for the next token ID */ function _getNextTokenId() private view returns (uint256) { return _currentTokenId.add(1); } /** * @dev increments the value of _currentTokenId */ function _incrementTokenId() private { _currentTokenId++; } /** * Override isApprovedForAll to whitelist user's OpenSea proxy accounts to enable gas-less listings. */ function isApprovedForAll( address owner, address operator ) public override view returns (bool) { // Whitelist OpenSea proxy contract for easy trading. ProxyRegistry proxyRegistry = ProxyRegistry(proxyRegistryAddress); if (address(proxyRegistry.proxies(owner)) == operator) { return true; } return super.isApprovedForAll(owner, operator); } } /** * @title IpfsHashs * @dev Provide methods to store and retrieve tokens IPFS CIDs */ contract IpfsHashs is Administrable { mapping (uint => mapping(string => string)) internal ipfsHashs; function setIpfsHash(uint tokenId, string memory docType, string memory _hash) public onlyMinter { require(tokenId > 0, "denied : token zero cant be used"); ipfsHashs[tokenId][docType] = _hash; } function removeIpfsHash(uint tokenId, string memory docType) public onlyMinterBurner { ipfsHashs[tokenId][docType] = ""; } function getIpfsHash(uint tokenId, string memory docType) public view returns (string memory) { return ipfsHashs[tokenId][docType]; } } /** * @title Proxiable * @dev Etherland - EIP-1822 Proxiable contract implementation * @dev https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1822.md */ contract Proxiable { // Code position in storage is keccak256("PROXIABLE") = "0xc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf7" function updateCodeAddress(address newAddress) internal { require( bytes32(0xc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf7) == Proxiable(newAddress).proxiableUUID(), "Not compatible" ); assembly { // solium-disable-line sstore(0xc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf7, newAddress) } } function proxiableUUID() public pure returns (bytes32) { return 0xc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf7; } } /** * @title Etherland NFT Assets * @author Mathieu Lecoq * september 3rd 2020 * * @dev Property * all rights are reserved to EtherLand ltd * * @dev deployed with compiler version 0.6.2 */ contract Etherland is TradeableERC721Token, IpfsHashs, Proxiable { /** * @dev initialized state MUST remain set to false on Implementation Contract */ bool public initialized = false; /** * @dev event emitting when the `_baseTokenUri` is updated by owner */ event BaseTokenUriUpdated(string newUri); /** * @dev Logic code implementation contact constructor * @dev MUST be called by deployer only if contract has not been initialized before */ function init( string memory _name, string memory _symbol, address _proxyRegistryAddress, string memory baseURI, address _owner ) public { if (initialized != true) { initialized = true; TradeableERC721Token.init(_name, _symbol, _proxyRegistryAddress); _baseTokenURI = baseURI; // register the supported interfaces to conform to ERC721 via ERC165 _registerInterface(_INTERFACE_ID_ERC165); _registerInterface(_INTERFACE_ID_ERC721_METADATA); _registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE); _registerInterface(_INTERFACE_ID_ERC721); _transferOwnership(_owner); } } /** * @dev Retrieve all NFTs base token uri */ function baseTokenURI() public view returns (string memory) { return _baseTokenURI; } /** * @dev Set the base token uri for all NFTs */ function setBaseTokenURI(string memory uri) public onlyOwner { _baseTokenURI = uri; emit BaseTokenUriUpdated(uri); } /** * @dev Retrieve the uri of a specific token * @param _tokenId the id of the token to retrieve the uri of * @return computed uri string pointing to a specific _tokenId */ function tokenURI(uint256 _tokenId) external view returns (string memory) { return Strings.strConcat( baseTokenURI(), Strings.uint2str(_tokenId) ); } /** * @dev EIP-1822 feature * @dev Realize an update of the Etherland logic code * @dev calls the proxy contract to update stored logic code contract address at keccak256("PROXIABLE") */ function updateCode(address newCode) public onlyOwner { updateCodeAddress(newCode); } /** * @dev Mint a new token with document hash corresponding to an IPFS CID * @param _to address of the future owner of the token * @param docType string representing the type of document that is stored to IPFS (can be "pdf" or any other token related document) * @param _hash string representing the hash of a document with type equals to `docType` */ function mintWithIpfsHash(address _to, string memory docType, string memory _hash) public onlyMinter { mintTo(_to); setIpfsHash(_currentTokenId, docType, _hash); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAdmin","type":"address"},{"indexed":false,"internalType":"int16","name":"adminRights","type":"int16"}],"name":"AdminRightsGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"noAdmin","type":"address"}],"name":"AdminRightsRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"newUri","type":"string"}],"name":"BaseTokenUriUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"_admin","type":"address"}],"name":"adminRightsOf","outputs":[{"internalType":"int16","name":"","type":"int16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_total","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"batchMintTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"canMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"canMintBurn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"docType","type":"string"}],"name":"getIpfsHash","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_admin","type":"address"}],"name":"grantMinterBurnerRights","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_admin","type":"address"}],"name":"grantMinterRights","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"address","name":"_proxyRegistryAddress","type":"address"},{"internalType":"string","name":"baseURI","type":"string"},{"internalType":"address","name":"_owner","type":"address"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_admin","type":"address"}],"name":"isMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_admin","type":"address"}],"name":"isMinterBurner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"}],"name":"mintTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"string","name":"docType","type":"string"},{"internalType":"string","name":"_hash","type":"string"}],"name":"mintWithIpfsHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"proxyRegistryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"docType","type":"string"}],"name":"removeIpfsHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_admin","type":"address"}],"name":"revokeAdminRights","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFromWithData","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"docType","type":"string"},{"internalType":"string","name":"_hash","type":"string"}],"name":"setIpfsHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOf","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newCode","type":"address"}],"name":"updateCode","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405260006004556012805460ff1916905534801561001f57600080fd5b506132c48061002f6000396000f3fe608060405234801561001057600080fd5b50600436106102695760003560e01c806360a11672116101515780639adfecf9116100c3578063c87b56dd11610087578063c87b56dd14610c3c578063cd7c032614610c59578063d547cfb714610c61578063e985e9c514610c69578063f2fde38b14610c97578063faa0650b14610cbd57610269565b80639adfecf914610b7b578063a22cb46514610bba578063a2e4d23914610be8578063aa271e1a14610c0e578063beb9716d14610c3457610269565b8063715018a611610115578063715018a614610b09578063755edd1714610b115780638d0f5b7014610b375780638da5cb5b14610b635780638f32d59b14610b6b57806395d89b4114610b7357610269565b806360a11672146108a35780636352211e1461096757806368afee9b146109845780636a68119014610abd57806370a0823114610ae357610269565b80632f745c59116101ea57806342966c68116101ae57806342966c681461071a57806346951954146107375780634f6ccce71461075d57806352d1902d1461077a578063598b34aa146107825780635a3f26721461082d57610269565b80632f745c591461054357806330176e131461056f5780633b25f6a01461061357806342679683146106be57806342842e0e146106e457610269565b8063158ef93e11610231578063158ef93e146103b357806318160ddd146103bb5780631f6eeb68146103d557806323b872dd146103dd5780632a4b48ed1461041357610269565b806301ffc9a71461026e57806305d52d09146102a957806306fdde03146102d1578063081812fc1461034e578063095ea7b314610387575b600080fd5b6102956004803603602081101561028457600080fd5b50356001600160e01b031916610e87565b604080519115158252519081900360200190f35b6102cf600480360360208110156102bf57600080fd5b50356001600160a01b0316610eaa565b005b6102d9610f98565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103135781810151838201526020016102fb565b50505050905090810190601f1680156103405780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61036b6004803603602081101561036457600080fd5b503561102f565b604080516001600160a01b039092168252519081900360200190f35b6102cf6004803603604081101561039d57600080fd5b506001600160a01b03813516906020013561109f565b6102956111d7565b6103c36111e0565b60408051918252519081900360200190f35b6102956111e6565b6102cf600480360360608110156103f357600080fd5b506001600160a01b038135811691602081013590911690604001356111f6565b6102cf6004803603606081101561042957600080fd5b81359190810190604081016020820135600160201b81111561044a57600080fd5b82018360208201111561045c57600080fd5b803590602001918460018302840111600160201b8311171561047d57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b8111156104cf57600080fd5b8201836020820111156104e157600080fd5b803590602001918460018302840111600160201b8311171561050257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611261945050505050565b6103c36004803603604081101561055957600080fd5b506001600160a01b038135169060200135611388565b6102cf6004803603602081101561058557600080fd5b810190602081018135600160201b81111561059f57600080fd5b8201836020820111156105b157600080fd5b803590602001918460018302840111600160201b831117156105d257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611412945050505050565b6102d96004803603604081101561062957600080fd5b81359190810190604081016020820135600160201b81111561064a57600080fd5b82018360208201111561065c57600080fd5b803590602001918460018302840111600160201b8311171561067d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611511945050505050565b610295600480360360208110156106d457600080fd5b50356001600160a01b0316611617565b6102cf600480360360608110156106fa57600080fd5b506001600160a01b0381358116916020810135909116906040013561166b565b6102cf6004803603602081101561073057600080fd5b5035611686565b6102cf6004803603602081101561074d57600080fd5b50356001600160a01b03166116eb565b6103c36004803603602081101561077357600080fd5b5035611743565b6103c36117b3565b6102cf6004803603604081101561079857600080fd5b81359190810190604081016020820135600160201b8111156107b957600080fd5b8201836020820111156107cb57600080fd5b803590602001918460018302840111600160201b831117156107ec57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506117d7945050505050565b6108536004803603602081101561084357600080fd5b50356001600160a01b03166118c4565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561088f578181015183820152602001610877565b505050509050019250505060405180910390f35b6102cf600480360360808110156108b957600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b8111156108f357600080fd5b82018360208201111561090557600080fd5b803590602001918460018302840111600160201b8311171561092657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611925945050505050565b61036b6004803603602081101561097d57600080fd5b5035611984565b6102cf6004803603606081101561099a57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b8111156109c457600080fd5b8201836020820111156109d657600080fd5b803590602001918460018302840111600160201b831117156109f757600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b811115610a4957600080fd5b820183602082011115610a5b57600080fd5b803590602001918460018302840111600160201b83111715610a7c57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506119ea945050505050565b6102cf60048036036020811015610ad357600080fd5b50356001600160a01b0316611a47565b6103c360048036036020811015610af957600080fd5b50356001600160a01b0316611b4a565b6102cf611bc4565b6102cf60048036036020811015610b2757600080fd5b50356001600160a01b0316611c5d565b6102cf60048036036040811015610b4d57600080fd5b50803590602001356001600160a01b0316611d1c565b61036b611dcb565b610295611dda565b6102d9611deb565b610ba160048036036020811015610b9157600080fd5b50356001600160a01b0316611e4b565b60408051600192830b90920b8252519081900360200190f35b6102cf60048036036040811015610bd057600080fd5b506001600160a01b0381351690602001351515611e98565b6102cf60048036036020811015610bfe57600080fd5b50356001600160a01b0316611f5e565b61029560048036036020811015610c2457600080fd5b50356001600160a01b0316612061565b6102956120b3565b6102d960048036036020811015610c5257600080fd5b50356120be565b61036b6120d9565b6102d96120e8565b61029560048036036040811015610c7f57600080fd5b506001600160a01b0381358116916020013516612146565b6102cf60048036036020811015610cad57600080fd5b50356001600160a01b03166121f1565b6102cf600480360360a0811015610cd357600080fd5b810190602081018135600160201b811115610ced57600080fd5b820183602082011115610cff57600080fd5b803590602001918460018302840111600160201b83111715610d2057600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b811115610d7257600080fd5b820183602082011115610d8457600080fd5b803590602001918460018302840111600160201b83111715610da557600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092956001600160a01b03853516959094909350604081019250602001359050600160201b811115610e0857600080fd5b820183602082011115610e1a57600080fd5b803590602001918460018302840111600160201b83111715610e3b57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550505090356001600160a01b031691506122499050565b6001600160e01b0319811660009081526006602052604090205460ff165b919050565b610eb2611dda565b610ef9576040805162461bcd60e51b815260206004820152601360248201527239b2b73232b91034b9903737ba1037bbb732b960691b604482015290519081900360640190fd5b806001600160a01b038116610f4d576040805162461bcd60e51b8152602060048201526015602482015274696e76616c69642061646d696e206164647265737360581b604482015290519081900360640190fd5b6001600160a01b038216600081815260106020526040808220805461ffff19169055517f75063598bb424244ef6461ff8e1e0a1836998c3c84ef9e591015fbe8d94fa71f9190a25050565b60008054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156110245780601f10610ff957610100808354040283529160200191611024565b820191906000526020600020905b81548152906001019060200180831161100757829003601f168201915b505050505090505b90565b600061103a826122d4565b611083576040805162461bcd60e51b81526020600482015260156024820152741d1bdad95b925108191bd95cdb89dd08195e1a5cdd605a1b604482015290519081900360640190fd5b506000908152600860205260409020546001600160a01b031690565b60006110aa82611984565b9050806001600160a01b0316836001600160a01b0316141561110d576040805162461bcd60e51b815260206004820152601760248201527631b0b73737ba1030b8383937bb32903cb7bab939b2b63360491b604482015290519081900360640190fd5b336001600160a01b038216148061112957506111298133612146565b61116e576040805162461bcd60e51b81526020600482015260116024820152701c195c9b5a5cdcda5bdb8819195b9a5959607a1b604482015290519081900360640190fd5b60008281526008602090815260409182902080546001600160a01b0319166001600160a01b03878116918217909255835186815293519093918516927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a3505050565b60125460ff1681565b60055490565b60006111f133611617565b905090565b61120033826122f1565b611251576040805162461bcd60e51b815260206004820152601760248201527f7370656e646572206973206e6f7420617070726f766564000000000000000000604482015290519081900360640190fd5b61125c838383612348565b505050565b6112696120b3565b6112a8576040805162461bcd60e51b8152602060048201819052602482015260008051602061326f833981519152604482015290519081900360640190fd5b600083116112fd576040805162461bcd60e51b815260206004820181905260248201527f64656e696564203a20746f6b656e207a65726f2063616e742062652075736564604482015290519081900360640190fd5b8060116000858152602001908152602001600020836040518082805190602001908083835b602083106113415780518252601f199092019160209182019101611322565b51815160209384036101000a6000190180199092169116179052920194855250604051938490038101909320845161138295919491909101925090506131d6565b50505050565b600061139383611b4a565b82106113da576040805162461bcd60e51b81526020600482015260116024820152700d2dcc8caf040d2e640e8dede40d0d2ced607b1b604482015290519081900360640190fd5b6001600160a01b0383166000908152600c602052604090208054839081106113fe57fe5b906000526020600020015490505b92915050565b61141a611dda565b611461576040805162461bcd60e51b815260206004820152601360248201527239b2b73232b91034b9903737ba1037bbb732b960691b604482015290519081900360640190fd5b80516114749060029060208401906131d6565b507fe0b4aa3a614e11365fec002edc82449b5849402d025b31c4770f0e270286e690816040518080602001828103825283818151815260200191508051906020019080838360005b838110156114d45781810151838201526020016114bc565b50505050905090810190601f1680156115015780820380516001836020036101000a031916815260200191505b509250505060405180910390a150565b606060116000848152602001908152602001600020826040518082805190602001908083835b602083106115565780518252601f199092019160209182019101611537565b518151600019602094850361010090810a820192831692199390931691909117909252949092019687526040805197889003820188208054601f600260018316159098029095011695909504928301829004820288018201905281875292945092505083018282801561160a5780601f106115df5761010080835404028352916020019161160a565b820191906000526020600020905b8154815290600101906020018083116115ed57829003601f168201915b5050505050905092915050565b6000611621611dcb565b6001600160a01b0316826001600160a01b0316141561164257506001610ea5565b506001600160a01b038116600090815260106020526040902054600190810b900b600214610ea5565b61125c83838360405180602001604052806000815250611925565b61168e6111e6565b6116df576040805162461bcd60e51b815260206004820181905260248201527f64656e696564203a206e6f2061646d696e206275726e696e6720726967687473604482015290519081900360640190fd5b6116e881612367565b50565b6116f3611dda565b61173a576040805162461bcd60e51b815260206004820152601360248201527239b2b73232b91034b9903737ba1037bbb732b960691b604482015290519081900360640190fd5b6116e881612379565b600061174d6111e0565b8210611794576040805162461bcd60e51b81526020600482015260116024820152700d2dcc8caf040d2e640e8dede40d0d2ced607b1b604482015290519081900360640190fd5b600582815481106117a157fe5b90600052602060002001549050919050565b7fc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf790565b6117df6111e6565b611830576040805162461bcd60e51b815260206004820181905260248201527f64656e696564203a206e6f2061646d696e206275726e696e6720726967687473604482015290519081900360640190fd5b6040518060200160405280600081525060116000848152602001908152602001600020826040518082805190602001908083835b602083106118835780518252601f199092019160209182019101611864565b51815160209384036101000a6000190180199092169116179052920194855250604051938490038101909320845161125c95919491909101925090506131d6565b60606118cf82612466565b80548060200260200160405190810160405280929190818152602001828054801561191957602002820191906000526020600020905b815481526020019060010190808311611905575b50505050509050919050565b6119308484846111f6565b61193c84848484612480565b611382576040805162461bcd60e51b81526020600482015260146024820152736461746120636865636b206973206e6f74206f6b60601b604482015290519081900360640190fd5b6000818152600760205260408120546001600160a01b03168061140c576040805162461bcd60e51b815260206004820152601960248201527806f776e65722063616e6e6f742062652061646472657373203603c1b604482015290519081900360640190fd5b6119f26120b3565b611a31576040805162461bcd60e51b8152602060048201819052602482015260008051602061326f833981519152604482015290519081900360640190fd5b611a3a83611c5d565b61125c6004548383611261565b611a4f611dda565b611a96576040805162461bcd60e51b815260206004820152601360248201527239b2b73232b91034b9903737ba1037bbb732b960691b604482015290519081900360640190fd5b806001600160a01b038116611aea576040805162461bcd60e51b8152602060048201526015602482015274696e76616c69642061646d696e206164647265737360581b604482015290519081900360640190fd5b6001600160a01b038216600081815260106020908152604091829020805461ffff19166001908117909155825190815291517fc9650477e67b3b00a3cf84fb7f5e1c3c95d7271a855253a09dde0a403695a3679281900390910190a25050565b60006001600160a01b038216611ba3576040805162461bcd60e51b815260206004820152601960248201527806f776e65722063616e6e6f742062652061646472657373203603c1b604482015290519081900360640190fd5b6001600160a01b038216600090815260096020526040902061140c906125b3565b611bcc611dda565b611c13576040805162461bcd60e51b815260206004820152601360248201527239b2b73232b91034b9903737ba1037bbb732b960691b604482015290519081900360640190fd5b600f546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600f80546001600160a01b0319169055565b611c656120b3565b611ca4576040805162461bcd60e51b8152602060048201819052602482015260008051602061326f833981519152604482015290519081900360640190fd5b6001600160a01b038116611cfa576040805162461bcd60e51b8152602060048201526018602482015277063616e6e6f74206d696e7420746f206164647265737320360441b604482015290519081900360640190fd5b6000611d046125b7565b9050611d1082826125ce565b611d186125eb565b5050565b611d246120b3565b611d63576040805162461bcd60e51b8152602060048201819052602482015260008051602061326f833981519152604482015290519081900360640190fd5b60008211611daf576040805162461bcd60e51b815260206004820152601460248201527336b4b73a1036b4b734b6bab69018903a37b5b2b760611b604482015290519081900360640190fd5b60005b8281101561125c57611dc382611c5d565b600101611db2565b600f546001600160a01b031690565b600f546001600160a01b0316331490565b60018054604080516020601f600260001961010087891615020190951694909404938401819004810282018101909252828152606093909290918301828280156110245780601f10610ff957610100808354040283529160200191611024565b6000611e55611dcb565b6001600160a01b0316826001600160a01b03161415611e7657506002610ea5565b506001600160a01b03811660009081526010602052604090205460010b610ea5565b6001600160a01b038216331415611ef0576040805162461bcd60e51b815260206004820152601760248201527631b0b73737ba1030b8383937bb32903cb7bab939b2b63360491b604482015290519081900360640190fd5b336000818152600a602090815260408083206001600160a01b03871680855290835292819020805460ff1916861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b611f66611dda565b611fad576040805162461bcd60e51b815260206004820152601360248201527239b2b73232b91034b9903737ba1037bbb732b960691b604482015290519081900360640190fd5b806001600160a01b038116612001576040805162461bcd60e51b8152602060048201526015602482015274696e76616c69642061646d696e206164647265737360581b604482015290519081900360640190fd5b6001600160a01b038216600081815260106020908152604091829020805461ffff19166002908117909155825190815291517fc9650477e67b3b00a3cf84fb7f5e1c3c95d7271a855253a09dde0a403695a3679281900390910190a25050565b600061206b611dcb565b6001600160a01b0316826001600160a01b0316141561208c57506001610ea5565b506001600160a01b038116600090815260106020526040812054600190810b900b13610ea5565b60006111f133612061565b606061140c6120cb6120e8565b6120d4846125f6565b6126b7565b6003546001600160a01b031681565b60028054604080516020601f60001961010060018716150201909416859004938401819004810282018101909252828152606093909290918301828280156110245780601f10610ff957610100808354040283529160200191611024565b6003546040805163c455279160e01b81526001600160a01b0385811660048301529151600093831692851691839163c455279191602480820192602092909190829003018186803b15801561219a57600080fd5b505afa1580156121ae573d6000803e3d6000fd5b505050506040513d60208110156121c457600080fd5b50516001600160a01b031614156121df57600191505061140c565b6121e984846126fa565b949350505050565b6121f9611dda565b612240576040805162461bcd60e51b815260206004820152601360248201527239b2b73232b91034b9903737ba1037bbb732b960691b604482015290519081900360640190fd5b6116e881612728565b60125460ff1615156001146122cd576012805460ff191660011790556122708585856127df565b81516122839060029060208501906131d6565b506122946301ffc9a760e01b61280d565b6122a4635b5e139f60e01b61280d565b6122b463780e9d6360e01b61280d565b6122c46380ac58cd60e01b61280d565b6122cd81612728565b5050505050565b6000908152600760205260409020546001600160a01b0316151590565b6000806122fd83611984565b9050806001600160a01b0316846001600160a01b031614806123385750836001600160a01b031661232d8461102f565b6001600160a01b0316145b806121e957506121e98185612146565b612353838383612881565b61235d83826129fe565b61125c8282612b00565b6116e861237382611984565b82612b3e565b806001600160a01b03166352d1902d6040518163ffffffff1660e01b815260040160206040518083038186803b1580156123b257600080fd5b505afa1580156123c6573d6000803e3d6000fd5b505050506040513d60208110156123dc57600080fd5b50517fc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf714612442576040805162461bcd60e51b815260206004820152600e60248201526d4e6f7420636f6d70617469626c6560901b604482015290519081900360640190fd5b7fc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf755565b6001600160a01b03166000908152600c6020526040902090565b6000612494846001600160a01b0316612b6a565b6124a0575060016121e9565b604051630a85bd0160e11b815233600482018181526001600160a01b03888116602485015260448401879052608060648501908152865160848601528651600095928a169463150b7a029490938c938b938b939260a4019060208501908083838e5b8381101561251a578181015183820152602001612502565b50505050905090810190601f1680156125475780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b15801561256957600080fd5b505af115801561257d573d6000803e3d6000fd5b505050506040513d602081101561259357600080fd5b50516001600160e01b031916630a85bd0160e11b14915050949350505050565b5490565b6004546000906111f190600163ffffffff612b7016565b6125d88282612bca565b6125e28282612b00565b611d1881612cf6565b600480546001019055565b60608161261b57506040805180820190915260018152600360fc1b6020820152610ea5565b8160005b811561263357600101600a8204915061261f565b6060816040519080825280601f01601f191660200182016040528015612660576020820181803883390190505b50905060001982015b85156126ae57600a860660300160f81b8282806001900393508151811061268c57fe5b60200101906001600160f81b031916908160001a905350600a86049550612669565b50949350505050565b60606126f38383604051806020016040528060008152506040518060200160405280600081525060405180602001604052806000815250612d3a565b9392505050565b6001600160a01b039182166000908152600a6020908152604080832093909416825291909152205460ff1690565b6001600160a01b038116612783576040805162461bcd60e51b815260206004820152601d60248201527f6e6577206f776e65722063616e6e6f7420626520616464726573732030000000604482015290519081900360640190fd5b600f546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600f80546001600160a01b0319166001600160a01b0392909216919091179055565b6127e98383612f4e565b600380546001600160a01b0319166001600160a01b03929092169190911790555050565b6001600160e01b0319808216141561285c576040805162461bcd60e51b815260206004820152600d60248201526c62616420696e7465726661636560981b604482015290519081900360640190fd5b6001600160e01b0319166000908152600660205260409020805460ff19166001179055565b826001600160a01b031661289482611984565b6001600160a01b0316146128ef576040805162461bcd60e51b815260206004820181905260248201527f73656e646572206973206e6f74206f776e6572206f662074686520746f6b656e604482015290519081900360640190fd5b6001600160a01b03821661294a576040805162461bcd60e51b815260206004820152601860248201527f63616e6e6f742073656e6420746f203020616464726573730000000000000000604482015290519081900360640190fd5b61295381612f75565b6001600160a01b038316600090815260096020526040902061297490612fb0565b6001600160a01b038216600090815260096020526040902061299590612fc7565b60008181526007602090815260409182902080546001600160a01b0319166001600160a01b03868116918217909255835185815293519093918716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef928290030190a3505050565b6001600160a01b0382166000908152600c6020526040812054612a2890600163ffffffff612fd016565b6000838152600d6020526040902054909150808214612ac3576001600160a01b0384166000908152600c60205260408120805484908110612a6557fe5b9060005260206000200154905080600c6000876001600160a01b03166001600160a01b031681526020019081526020016000208381548110612aa357fe5b6000918252602080832090910192909255918252600d9052604090208190555b6001600160a01b0384166000908152600c60205260409020805480612ae457fe5b6001900381819060005260206000200160009055905550505050565b6001600160a01b039091166000908152600c602081815260408084208054868652600d84529185208290559282526001810183559183529091200155565b612b48828261302d565b612b5282826129fe565b6000818152600d6020526040812055611d1881613122565b3b151590565b6000828201838110156126f3576040805162461bcd60e51b815260206004820181905260248201527f626f7468206e756d62657273206861766520746f20626520706f736974697665604482015290519081900360640190fd5b6001600160a01b038216612c20576040805162461bcd60e51b8152602060048201526018602482015277063616e6e6f74206d696e7420746f206164647265737320360441b604482015290519081900360640190fd5b612c29816122d4565b15612c72576040805162461bcd60e51b8152602060048201526014602482015273746f6b656e20616c72656164792065786973747360601b604482015290519081900360640190fd5b600081815260076020908152604080832080546001600160a01b0319166001600160a01b038716908117909155835260099091529020612cb190612fc7565b6040805182815290516001600160a01b038416916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b600580546000838152600e60205260408120829055600182018355919091527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00155565b6060808690506060869050606086905060608690506060869050606081518351855187518951010101016040519080825280601f01601f191660200182016040528015612d8e576020820181803883390190505b509050806000805b8851811015612de757888181518110612dab57fe5b602001015160f81c60f81b838380600101945081518110612dc857fe5b60200101906001600160f81b031916908160001a905350600101612d96565b5060005b8751811015612e3c57878181518110612e0057fe5b602001015160f81c60f81b838380600101945081518110612e1d57fe5b60200101906001600160f81b031916908160001a905350600101612deb565b5060005b8651811015612e9157868181518110612e5557fe5b602001015160f81c60f81b838380600101945081518110612e7257fe5b60200101906001600160f81b031916908160001a905350600101612e40565b5060005b8551811015612ee657858181518110612eaa57fe5b602001015160f81c60f81b838380600101945081518110612ec757fe5b60200101906001600160f81b031916908160001a905350600101612e95565b5060005b8451811015612f3b57848181518110612eff57fe5b602001015160f81c60f81b838380600101945081518110612f1c57fe5b60200101906001600160f81b031916908160001a905350600101612eea565b50909d9c50505050505050505050505050565b8151612f619060009060208501906131d6565b50805161125c9060019060208401906131d6565b6000818152600860205260409020546001600160a01b0316156116e857600090815260086020526040902080546001600160a01b0319169055565b8054612fc390600163ffffffff612fd016565b9055565b80546001019055565b600082821115613027576040805162461bcd60e51b815260206004820152601d60248201527f726573756c742063616e6e6f74206265206c6f776572207468616e2030000000604482015290519081900360640190fd5b50900390565b816001600160a01b031661304082611984565b6001600160a01b03161461309b576040805162461bcd60e51b815260206004820152601f60248201527f61646472657373206973206e6f74206f776e6572206f6620746f6b656e494400604482015290519081900360640190fd5b6130a481612f75565b6001600160a01b03821660009081526009602052604090206130c590612fb0565b600081815260076020908152604080832080546001600160a01b0319169055805184815290516001600160a01b038616927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef928290030190a35050565b60055460009061313990600163ffffffff612fd016565b6000838152600e60205260408120546005805493945090928490811061315b57fe5b90600052602060002001549050806005838154811061317657fe5b6000918252602080832090910192909255828152600e9091526040902082905560058054806131a157fe5b600190038181906000526020600020016000905590556000600e60008681526020019081526020016000208190555050505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061321757805160ff1916838001178555613244565b82800160010185558215613244579182015b82811115613244578251825591602001919060010190613229565b50613250929150613254565b5090565b61102c91905b80821115613250576000815560010161325a56fe64656e696564203a206e6f2061646d696e206d696e74696e6720726967687473a26469706673582212206704363571e345380667e8d1842009e3e9ac55dcdeb93ffb507cd3ae79c4503464736f6c63430006020033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102695760003560e01c806360a11672116101515780639adfecf9116100c3578063c87b56dd11610087578063c87b56dd14610c3c578063cd7c032614610c59578063d547cfb714610c61578063e985e9c514610c69578063f2fde38b14610c97578063faa0650b14610cbd57610269565b80639adfecf914610b7b578063a22cb46514610bba578063a2e4d23914610be8578063aa271e1a14610c0e578063beb9716d14610c3457610269565b8063715018a611610115578063715018a614610b09578063755edd1714610b115780638d0f5b7014610b375780638da5cb5b14610b635780638f32d59b14610b6b57806395d89b4114610b7357610269565b806360a11672146108a35780636352211e1461096757806368afee9b146109845780636a68119014610abd57806370a0823114610ae357610269565b80632f745c59116101ea57806342966c68116101ae57806342966c681461071a57806346951954146107375780634f6ccce71461075d57806352d1902d1461077a578063598b34aa146107825780635a3f26721461082d57610269565b80632f745c591461054357806330176e131461056f5780633b25f6a01461061357806342679683146106be57806342842e0e146106e457610269565b8063158ef93e11610231578063158ef93e146103b357806318160ddd146103bb5780631f6eeb68146103d557806323b872dd146103dd5780632a4b48ed1461041357610269565b806301ffc9a71461026e57806305d52d09146102a957806306fdde03146102d1578063081812fc1461034e578063095ea7b314610387575b600080fd5b6102956004803603602081101561028457600080fd5b50356001600160e01b031916610e87565b604080519115158252519081900360200190f35b6102cf600480360360208110156102bf57600080fd5b50356001600160a01b0316610eaa565b005b6102d9610f98565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103135781810151838201526020016102fb565b50505050905090810190601f1680156103405780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61036b6004803603602081101561036457600080fd5b503561102f565b604080516001600160a01b039092168252519081900360200190f35b6102cf6004803603604081101561039d57600080fd5b506001600160a01b03813516906020013561109f565b6102956111d7565b6103c36111e0565b60408051918252519081900360200190f35b6102956111e6565b6102cf600480360360608110156103f357600080fd5b506001600160a01b038135811691602081013590911690604001356111f6565b6102cf6004803603606081101561042957600080fd5b81359190810190604081016020820135600160201b81111561044a57600080fd5b82018360208201111561045c57600080fd5b803590602001918460018302840111600160201b8311171561047d57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b8111156104cf57600080fd5b8201836020820111156104e157600080fd5b803590602001918460018302840111600160201b8311171561050257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611261945050505050565b6103c36004803603604081101561055957600080fd5b506001600160a01b038135169060200135611388565b6102cf6004803603602081101561058557600080fd5b810190602081018135600160201b81111561059f57600080fd5b8201836020820111156105b157600080fd5b803590602001918460018302840111600160201b831117156105d257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611412945050505050565b6102d96004803603604081101561062957600080fd5b81359190810190604081016020820135600160201b81111561064a57600080fd5b82018360208201111561065c57600080fd5b803590602001918460018302840111600160201b8311171561067d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611511945050505050565b610295600480360360208110156106d457600080fd5b50356001600160a01b0316611617565b6102cf600480360360608110156106fa57600080fd5b506001600160a01b0381358116916020810135909116906040013561166b565b6102cf6004803603602081101561073057600080fd5b5035611686565b6102cf6004803603602081101561074d57600080fd5b50356001600160a01b03166116eb565b6103c36004803603602081101561077357600080fd5b5035611743565b6103c36117b3565b6102cf6004803603604081101561079857600080fd5b81359190810190604081016020820135600160201b8111156107b957600080fd5b8201836020820111156107cb57600080fd5b803590602001918460018302840111600160201b831117156107ec57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506117d7945050505050565b6108536004803603602081101561084357600080fd5b50356001600160a01b03166118c4565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561088f578181015183820152602001610877565b505050509050019250505060405180910390f35b6102cf600480360360808110156108b957600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b8111156108f357600080fd5b82018360208201111561090557600080fd5b803590602001918460018302840111600160201b8311171561092657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611925945050505050565b61036b6004803603602081101561097d57600080fd5b5035611984565b6102cf6004803603606081101561099a57600080fd5b6001600160a01b038235169190810190604081016020820135600160201b8111156109c457600080fd5b8201836020820111156109d657600080fd5b803590602001918460018302840111600160201b831117156109f757600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b811115610a4957600080fd5b820183602082011115610a5b57600080fd5b803590602001918460018302840111600160201b83111715610a7c57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506119ea945050505050565b6102cf60048036036020811015610ad357600080fd5b50356001600160a01b0316611a47565b6103c360048036036020811015610af957600080fd5b50356001600160a01b0316611b4a565b6102cf611bc4565b6102cf60048036036020811015610b2757600080fd5b50356001600160a01b0316611c5d565b6102cf60048036036040811015610b4d57600080fd5b50803590602001356001600160a01b0316611d1c565b61036b611dcb565b610295611dda565b6102d9611deb565b610ba160048036036020811015610b9157600080fd5b50356001600160a01b0316611e4b565b60408051600192830b90920b8252519081900360200190f35b6102cf60048036036040811015610bd057600080fd5b506001600160a01b0381351690602001351515611e98565b6102cf60048036036020811015610bfe57600080fd5b50356001600160a01b0316611f5e565b61029560048036036020811015610c2457600080fd5b50356001600160a01b0316612061565b6102956120b3565b6102d960048036036020811015610c5257600080fd5b50356120be565b61036b6120d9565b6102d96120e8565b61029560048036036040811015610c7f57600080fd5b506001600160a01b0381358116916020013516612146565b6102cf60048036036020811015610cad57600080fd5b50356001600160a01b03166121f1565b6102cf600480360360a0811015610cd357600080fd5b810190602081018135600160201b811115610ced57600080fd5b820183602082011115610cff57600080fd5b803590602001918460018302840111600160201b83111715610d2057600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b811115610d7257600080fd5b820183602082011115610d8457600080fd5b803590602001918460018302840111600160201b83111715610da557600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092956001600160a01b03853516959094909350604081019250602001359050600160201b811115610e0857600080fd5b820183602082011115610e1a57600080fd5b803590602001918460018302840111600160201b83111715610e3b57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550505090356001600160a01b031691506122499050565b6001600160e01b0319811660009081526006602052604090205460ff165b919050565b610eb2611dda565b610ef9576040805162461bcd60e51b815260206004820152601360248201527239b2b73232b91034b9903737ba1037bbb732b960691b604482015290519081900360640190fd5b806001600160a01b038116610f4d576040805162461bcd60e51b8152602060048201526015602482015274696e76616c69642061646d696e206164647265737360581b604482015290519081900360640190fd5b6001600160a01b038216600081815260106020526040808220805461ffff19169055517f75063598bb424244ef6461ff8e1e0a1836998c3c84ef9e591015fbe8d94fa71f9190a25050565b60008054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156110245780601f10610ff957610100808354040283529160200191611024565b820191906000526020600020905b81548152906001019060200180831161100757829003601f168201915b505050505090505b90565b600061103a826122d4565b611083576040805162461bcd60e51b81526020600482015260156024820152741d1bdad95b925108191bd95cdb89dd08195e1a5cdd605a1b604482015290519081900360640190fd5b506000908152600860205260409020546001600160a01b031690565b60006110aa82611984565b9050806001600160a01b0316836001600160a01b0316141561110d576040805162461bcd60e51b815260206004820152601760248201527631b0b73737ba1030b8383937bb32903cb7bab939b2b63360491b604482015290519081900360640190fd5b336001600160a01b038216148061112957506111298133612146565b61116e576040805162461bcd60e51b81526020600482015260116024820152701c195c9b5a5cdcda5bdb8819195b9a5959607a1b604482015290519081900360640190fd5b60008281526008602090815260409182902080546001600160a01b0319166001600160a01b03878116918217909255835186815293519093918516927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a3505050565b60125460ff1681565b60055490565b60006111f133611617565b905090565b61120033826122f1565b611251576040805162461bcd60e51b815260206004820152601760248201527f7370656e646572206973206e6f7420617070726f766564000000000000000000604482015290519081900360640190fd5b61125c838383612348565b505050565b6112696120b3565b6112a8576040805162461bcd60e51b8152602060048201819052602482015260008051602061326f833981519152604482015290519081900360640190fd5b600083116112fd576040805162461bcd60e51b815260206004820181905260248201527f64656e696564203a20746f6b656e207a65726f2063616e742062652075736564604482015290519081900360640190fd5b8060116000858152602001908152602001600020836040518082805190602001908083835b602083106113415780518252601f199092019160209182019101611322565b51815160209384036101000a6000190180199092169116179052920194855250604051938490038101909320845161138295919491909101925090506131d6565b50505050565b600061139383611b4a565b82106113da576040805162461bcd60e51b81526020600482015260116024820152700d2dcc8caf040d2e640e8dede40d0d2ced607b1b604482015290519081900360640190fd5b6001600160a01b0383166000908152600c602052604090208054839081106113fe57fe5b906000526020600020015490505b92915050565b61141a611dda565b611461576040805162461bcd60e51b815260206004820152601360248201527239b2b73232b91034b9903737ba1037bbb732b960691b604482015290519081900360640190fd5b80516114749060029060208401906131d6565b507fe0b4aa3a614e11365fec002edc82449b5849402d025b31c4770f0e270286e690816040518080602001828103825283818151815260200191508051906020019080838360005b838110156114d45781810151838201526020016114bc565b50505050905090810190601f1680156115015780820380516001836020036101000a031916815260200191505b509250505060405180910390a150565b606060116000848152602001908152602001600020826040518082805190602001908083835b602083106115565780518252601f199092019160209182019101611537565b518151600019602094850361010090810a820192831692199390931691909117909252949092019687526040805197889003820188208054601f600260018316159098029095011695909504928301829004820288018201905281875292945092505083018282801561160a5780601f106115df5761010080835404028352916020019161160a565b820191906000526020600020905b8154815290600101906020018083116115ed57829003601f168201915b5050505050905092915050565b6000611621611dcb565b6001600160a01b0316826001600160a01b0316141561164257506001610ea5565b506001600160a01b038116600090815260106020526040902054600190810b900b600214610ea5565b61125c83838360405180602001604052806000815250611925565b61168e6111e6565b6116df576040805162461bcd60e51b815260206004820181905260248201527f64656e696564203a206e6f2061646d696e206275726e696e6720726967687473604482015290519081900360640190fd5b6116e881612367565b50565b6116f3611dda565b61173a576040805162461bcd60e51b815260206004820152601360248201527239b2b73232b91034b9903737ba1037bbb732b960691b604482015290519081900360640190fd5b6116e881612379565b600061174d6111e0565b8210611794576040805162461bcd60e51b81526020600482015260116024820152700d2dcc8caf040d2e640e8dede40d0d2ced607b1b604482015290519081900360640190fd5b600582815481106117a157fe5b90600052602060002001549050919050565b7fc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf790565b6117df6111e6565b611830576040805162461bcd60e51b815260206004820181905260248201527f64656e696564203a206e6f2061646d696e206275726e696e6720726967687473604482015290519081900360640190fd5b6040518060200160405280600081525060116000848152602001908152602001600020826040518082805190602001908083835b602083106118835780518252601f199092019160209182019101611864565b51815160209384036101000a6000190180199092169116179052920194855250604051938490038101909320845161125c95919491909101925090506131d6565b60606118cf82612466565b80548060200260200160405190810160405280929190818152602001828054801561191957602002820191906000526020600020905b815481526020019060010190808311611905575b50505050509050919050565b6119308484846111f6565b61193c84848484612480565b611382576040805162461bcd60e51b81526020600482015260146024820152736461746120636865636b206973206e6f74206f6b60601b604482015290519081900360640190fd5b6000818152600760205260408120546001600160a01b03168061140c576040805162461bcd60e51b815260206004820152601960248201527806f776e65722063616e6e6f742062652061646472657373203603c1b604482015290519081900360640190fd5b6119f26120b3565b611a31576040805162461bcd60e51b8152602060048201819052602482015260008051602061326f833981519152604482015290519081900360640190fd5b611a3a83611c5d565b61125c6004548383611261565b611a4f611dda565b611a96576040805162461bcd60e51b815260206004820152601360248201527239b2b73232b91034b9903737ba1037bbb732b960691b604482015290519081900360640190fd5b806001600160a01b038116611aea576040805162461bcd60e51b8152602060048201526015602482015274696e76616c69642061646d696e206164647265737360581b604482015290519081900360640190fd5b6001600160a01b038216600081815260106020908152604091829020805461ffff19166001908117909155825190815291517fc9650477e67b3b00a3cf84fb7f5e1c3c95d7271a855253a09dde0a403695a3679281900390910190a25050565b60006001600160a01b038216611ba3576040805162461bcd60e51b815260206004820152601960248201527806f776e65722063616e6e6f742062652061646472657373203603c1b604482015290519081900360640190fd5b6001600160a01b038216600090815260096020526040902061140c906125b3565b611bcc611dda565b611c13576040805162461bcd60e51b815260206004820152601360248201527239b2b73232b91034b9903737ba1037bbb732b960691b604482015290519081900360640190fd5b600f546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600f80546001600160a01b0319169055565b611c656120b3565b611ca4576040805162461bcd60e51b8152602060048201819052602482015260008051602061326f833981519152604482015290519081900360640190fd5b6001600160a01b038116611cfa576040805162461bcd60e51b8152602060048201526018602482015277063616e6e6f74206d696e7420746f206164647265737320360441b604482015290519081900360640190fd5b6000611d046125b7565b9050611d1082826125ce565b611d186125eb565b5050565b611d246120b3565b611d63576040805162461bcd60e51b8152602060048201819052602482015260008051602061326f833981519152604482015290519081900360640190fd5b60008211611daf576040805162461bcd60e51b815260206004820152601460248201527336b4b73a1036b4b734b6bab69018903a37b5b2b760611b604482015290519081900360640190fd5b60005b8281101561125c57611dc382611c5d565b600101611db2565b600f546001600160a01b031690565b600f546001600160a01b0316331490565b60018054604080516020601f600260001961010087891615020190951694909404938401819004810282018101909252828152606093909290918301828280156110245780601f10610ff957610100808354040283529160200191611024565b6000611e55611dcb565b6001600160a01b0316826001600160a01b03161415611e7657506002610ea5565b506001600160a01b03811660009081526010602052604090205460010b610ea5565b6001600160a01b038216331415611ef0576040805162461bcd60e51b815260206004820152601760248201527631b0b73737ba1030b8383937bb32903cb7bab939b2b63360491b604482015290519081900360640190fd5b336000818152600a602090815260408083206001600160a01b03871680855290835292819020805460ff1916861515908117909155815190815290519293927f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31929181900390910190a35050565b611f66611dda565b611fad576040805162461bcd60e51b815260206004820152601360248201527239b2b73232b91034b9903737ba1037bbb732b960691b604482015290519081900360640190fd5b806001600160a01b038116612001576040805162461bcd60e51b8152602060048201526015602482015274696e76616c69642061646d696e206164647265737360581b604482015290519081900360640190fd5b6001600160a01b038216600081815260106020908152604091829020805461ffff19166002908117909155825190815291517fc9650477e67b3b00a3cf84fb7f5e1c3c95d7271a855253a09dde0a403695a3679281900390910190a25050565b600061206b611dcb565b6001600160a01b0316826001600160a01b0316141561208c57506001610ea5565b506001600160a01b038116600090815260106020526040812054600190810b900b13610ea5565b60006111f133612061565b606061140c6120cb6120e8565b6120d4846125f6565b6126b7565b6003546001600160a01b031681565b60028054604080516020601f60001961010060018716150201909416859004938401819004810282018101909252828152606093909290918301828280156110245780601f10610ff957610100808354040283529160200191611024565b6003546040805163c455279160e01b81526001600160a01b0385811660048301529151600093831692851691839163c455279191602480820192602092909190829003018186803b15801561219a57600080fd5b505afa1580156121ae573d6000803e3d6000fd5b505050506040513d60208110156121c457600080fd5b50516001600160a01b031614156121df57600191505061140c565b6121e984846126fa565b949350505050565b6121f9611dda565b612240576040805162461bcd60e51b815260206004820152601360248201527239b2b73232b91034b9903737ba1037bbb732b960691b604482015290519081900360640190fd5b6116e881612728565b60125460ff1615156001146122cd576012805460ff191660011790556122708585856127df565b81516122839060029060208501906131d6565b506122946301ffc9a760e01b61280d565b6122a4635b5e139f60e01b61280d565b6122b463780e9d6360e01b61280d565b6122c46380ac58cd60e01b61280d565b6122cd81612728565b5050505050565b6000908152600760205260409020546001600160a01b0316151590565b6000806122fd83611984565b9050806001600160a01b0316846001600160a01b031614806123385750836001600160a01b031661232d8461102f565b6001600160a01b0316145b806121e957506121e98185612146565b612353838383612881565b61235d83826129fe565b61125c8282612b00565b6116e861237382611984565b82612b3e565b806001600160a01b03166352d1902d6040518163ffffffff1660e01b815260040160206040518083038186803b1580156123b257600080fd5b505afa1580156123c6573d6000803e3d6000fd5b505050506040513d60208110156123dc57600080fd5b50517fc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf714612442576040805162461bcd60e51b815260206004820152600e60248201526d4e6f7420636f6d70617469626c6560901b604482015290519081900360640190fd5b7fc5f16f0fcc639fa48a6947836d9850f504798523bf8c9a3a87d5876cf622bcf755565b6001600160a01b03166000908152600c6020526040902090565b6000612494846001600160a01b0316612b6a565b6124a0575060016121e9565b604051630a85bd0160e11b815233600482018181526001600160a01b03888116602485015260448401879052608060648501908152865160848601528651600095928a169463150b7a029490938c938b938b939260a4019060208501908083838e5b8381101561251a578181015183820152602001612502565b50505050905090810190601f1680156125475780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b15801561256957600080fd5b505af115801561257d573d6000803e3d6000fd5b505050506040513d602081101561259357600080fd5b50516001600160e01b031916630a85bd0160e11b14915050949350505050565b5490565b6004546000906111f190600163ffffffff612b7016565b6125d88282612bca565b6125e28282612b00565b611d1881612cf6565b600480546001019055565b60608161261b57506040805180820190915260018152600360fc1b6020820152610ea5565b8160005b811561263357600101600a8204915061261f565b6060816040519080825280601f01601f191660200182016040528015612660576020820181803883390190505b50905060001982015b85156126ae57600a860660300160f81b8282806001900393508151811061268c57fe5b60200101906001600160f81b031916908160001a905350600a86049550612669565b50949350505050565b60606126f38383604051806020016040528060008152506040518060200160405280600081525060405180602001604052806000815250612d3a565b9392505050565b6001600160a01b039182166000908152600a6020908152604080832093909416825291909152205460ff1690565b6001600160a01b038116612783576040805162461bcd60e51b815260206004820152601d60248201527f6e6577206f776e65722063616e6e6f7420626520616464726573732030000000604482015290519081900360640190fd5b600f546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600f80546001600160a01b0319166001600160a01b0392909216919091179055565b6127e98383612f4e565b600380546001600160a01b0319166001600160a01b03929092169190911790555050565b6001600160e01b0319808216141561285c576040805162461bcd60e51b815260206004820152600d60248201526c62616420696e7465726661636560981b604482015290519081900360640190fd5b6001600160e01b0319166000908152600660205260409020805460ff19166001179055565b826001600160a01b031661289482611984565b6001600160a01b0316146128ef576040805162461bcd60e51b815260206004820181905260248201527f73656e646572206973206e6f74206f776e6572206f662074686520746f6b656e604482015290519081900360640190fd5b6001600160a01b03821661294a576040805162461bcd60e51b815260206004820152601860248201527f63616e6e6f742073656e6420746f203020616464726573730000000000000000604482015290519081900360640190fd5b61295381612f75565b6001600160a01b038316600090815260096020526040902061297490612fb0565b6001600160a01b038216600090815260096020526040902061299590612fc7565b60008181526007602090815260409182902080546001600160a01b0319166001600160a01b03868116918217909255835185815293519093918716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef928290030190a3505050565b6001600160a01b0382166000908152600c6020526040812054612a2890600163ffffffff612fd016565b6000838152600d6020526040902054909150808214612ac3576001600160a01b0384166000908152600c60205260408120805484908110612a6557fe5b9060005260206000200154905080600c6000876001600160a01b03166001600160a01b031681526020019081526020016000208381548110612aa357fe5b6000918252602080832090910192909255918252600d9052604090208190555b6001600160a01b0384166000908152600c60205260409020805480612ae457fe5b6001900381819060005260206000200160009055905550505050565b6001600160a01b039091166000908152600c602081815260408084208054868652600d84529185208290559282526001810183559183529091200155565b612b48828261302d565b612b5282826129fe565b6000818152600d6020526040812055611d1881613122565b3b151590565b6000828201838110156126f3576040805162461bcd60e51b815260206004820181905260248201527f626f7468206e756d62657273206861766520746f20626520706f736974697665604482015290519081900360640190fd5b6001600160a01b038216612c20576040805162461bcd60e51b8152602060048201526018602482015277063616e6e6f74206d696e7420746f206164647265737320360441b604482015290519081900360640190fd5b612c29816122d4565b15612c72576040805162461bcd60e51b8152602060048201526014602482015273746f6b656e20616c72656164792065786973747360601b604482015290519081900360640190fd5b600081815260076020908152604080832080546001600160a01b0319166001600160a01b038716908117909155835260099091529020612cb190612fc7565b6040805182815290516001600160a01b038416916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b600580546000838152600e60205260408120829055600182018355919091527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00155565b6060808690506060869050606086905060608690506060869050606081518351855187518951010101016040519080825280601f01601f191660200182016040528015612d8e576020820181803883390190505b509050806000805b8851811015612de757888181518110612dab57fe5b602001015160f81c60f81b838380600101945081518110612dc857fe5b60200101906001600160f81b031916908160001a905350600101612d96565b5060005b8751811015612e3c57878181518110612e0057fe5b602001015160f81c60f81b838380600101945081518110612e1d57fe5b60200101906001600160f81b031916908160001a905350600101612deb565b5060005b8651811015612e9157868181518110612e5557fe5b602001015160f81c60f81b838380600101945081518110612e7257fe5b60200101906001600160f81b031916908160001a905350600101612e40565b5060005b8551811015612ee657858181518110612eaa57fe5b602001015160f81c60f81b838380600101945081518110612ec757fe5b60200101906001600160f81b031916908160001a905350600101612e95565b5060005b8451811015612f3b57848181518110612eff57fe5b602001015160f81c60f81b838380600101945081518110612f1c57fe5b60200101906001600160f81b031916908160001a905350600101612eea565b50909d9c50505050505050505050505050565b8151612f619060009060208501906131d6565b50805161125c9060019060208401906131d6565b6000818152600860205260409020546001600160a01b0316156116e857600090815260086020526040902080546001600160a01b0319169055565b8054612fc390600163ffffffff612fd016565b9055565b80546001019055565b600082821115613027576040805162461bcd60e51b815260206004820152601d60248201527f726573756c742063616e6e6f74206265206c6f776572207468616e2030000000604482015290519081900360640190fd5b50900390565b816001600160a01b031661304082611984565b6001600160a01b03161461309b576040805162461bcd60e51b815260206004820152601f60248201527f61646472657373206973206e6f74206f776e6572206f6620746f6b656e494400604482015290519081900360640190fd5b6130a481612f75565b6001600160a01b03821660009081526009602052604090206130c590612fb0565b600081815260076020908152604080832080546001600160a01b0319169055805184815290516001600160a01b038616927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef928290030190a35050565b60055460009061313990600163ffffffff612fd016565b6000838152600e60205260408120546005805493945090928490811061315b57fe5b90600052602060002001549050806005838154811061317657fe5b6000918252602080832090910192909255828152600e9091526040902082905560058054806131a157fe5b600190038181906000526020600020016000905590556000600e60008681526020019081526020016000208190555050505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061321757805160ff1916838001178555613244565b82800160010185558215613244579182015b82811115613244578251825591602001919060010190613229565b50613250929150613254565b5090565b61102c91905b80821115613250576000815560010161325a56fe64656e696564203a206e6f2061646d696e206d696e74696e6720726967687473a26469706673582212206704363571e345380667e8d1842009e3e9ac55dcdeb93ffb507cd3ae79c4503464736f6c63430006020033
Deployed Bytecode Sourcemap
42575:2966:0:-:0;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42575:2966:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6328:144;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;6328:144:0;-1:-1:-1;;;;;;6328:144:0;;:::i;:::-;;;;;;;;;;;;;;;;;;35296:162;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35296:162:0;-1:-1:-1;;;;;35296:162:0;;:::i;:::-;;22547:94;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;22547:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13106:188;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13106:188:0;;:::i;:::-;;;;-1:-1:-1;;;;;13106:188:0;;;;;;;;;;;;;;12462:356;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;12462:356:0;;;;;;;;:::i;42747:31::-;;;:::i;23596:105::-;;;:::i;:::-;;;;;;;;;;;;;;;;33632:126;;;:::i;14767:220::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;14767:220:0;;;;;;;;;;;;;;;;;:::i;40950:218::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;40950:218:0;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;40950:218:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;40950:218:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;40950:218:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;40950:218:0;;;;;;;;-1:-1:-1;40950:218:0;;-1:-1:-1;;;;;5:28;;2:2;;;46:1;43;36:12;2:2;40950:218:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;40950:218:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;40950:218:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;40950:218:0;;-1:-1:-1;40950:218:0;;-1:-1:-1;;;;;40950:218:0:i;23226:215::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;23226:215:0;;;;;;;;:::i;44094:139::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;44094:139:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;44094:139:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;44094:139:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;44094:139:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;44094:139:0;;-1:-1:-1;44094:139:0;;-1:-1:-1;;;;;44094:139:0:i;41320:147::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;41320:147:0;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;41320:147:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;41320:147:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;41320:147:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;41320:147:0;;-1:-1:-1;41320:147:0;;-1:-1:-1;;;;;41320:147:0:i;33033:187::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33033:187:0;-1:-1:-1;;;;;33033:187:0;;:::i;15623:151::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;15623:151:0;;;;;;;;;;;;;;;;;:::i;39641:93::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39641:93:0;;:::i;44860:99::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44860:99:0;-1:-1:-1;;;;;44860:99:0;;:::i;24041:181::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24041:181:0;;:::i;42211:147::-;;;:::i;41176:136::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;41176:136:0;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;41176:136:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;41176:136:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;41176:136:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;41176:136:0;;-1:-1:-1;41176:136:0;;-1:-1:-1;;;;;41176:136:0:i;29177:116::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29177:116:0;-1:-1:-1;;;;;29177:116:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;29177:116:0;;;;;;;;;;;;;;;;;16482:255;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;16482:255:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;16482:255:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;16482:255:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;16482:255:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;16482:255:0;;-1:-1:-1;16482:255:0;;-1:-1:-1;;;;;16482:255:0:i;11817:219::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;11817:219:0;;:::i;45350:186::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;45350:186:0;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;45350:186:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;45350:186:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;45350:186:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;45350:186:0;;;;;;;;-1:-1:-1;45350:186:0;;-1:-1:-1;;;;;5:28;;2:2;;;46:1;43;36:12;2:2;45350:186:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;45350:186:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;45350:186:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;45350:186:0;;-1:-1:-1;45350:186:0;;-1:-1:-1;;;;;45350:186:0:i;34516:165::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34516:165:0;-1:-1:-1;;;;;34516:165:0;;:::i;11395:201::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;11395:201:0;-1:-1:-1;;;;;11395:201:0;;:::i;30572:140::-;;;:::i;38938:232::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38938:232:0;-1:-1:-1;;;;;38938:232:0;;:::i;39396:183::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39396:183:0;;;;;;-1:-1:-1;;;;;39396:183:0;;:::i;29769:79::-;;;:::i;30123:92::-;;;:::i;22752:98::-;;;:::i;32230:153::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32230:153:0;-1:-1:-1;;;;;32230:153:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;13589:253;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;13589:253:0;;;;;;;;;;:::i;34935:171::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34935:171:0;-1:-1:-1;;;;;34935:171:0;;:::i;32600:180::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32600:180:0;-1:-1:-1;;;;;32600:180:0;;:::i;33356:116::-;;;:::i;44441:198::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44441:198:0;;:::i;4739:35::-;;;:::i;43922:99::-;;;:::i;40286:449::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;40286:449:0;;;;;;;;;;:::i;30886:109::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30886:109:0;-1:-1:-1;;;;;30886:109:0;;:::i;43088:763::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;43088:763:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;43088:763:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;43088:763:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;43088:763:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;43088:763:0;;;;;;;;-1:-1:-1;43088:763:0;;-1:-1:-1;;;;;5:28;;2:2;;;46:1;43;36:12;2:2;43088:763:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;43088:763:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;43088:763:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;43088:763:0;;-1:-1:-1;;;;;43088:763:0;;;;;;;;-1:-1:-1;43088:763:0;;;;-1:-1:-1;43088:763:0;;;;-1:-1:-1;;;;5:28;;2:2;;;46:1;43;36:12;2:2;43088:763:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;43088:763:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;43088:763:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;43088:763:0;;-1:-1:-1;;;43088:763:0;;-1:-1:-1;;;;;43088:763:0;;-1:-1:-1;43088:763:0;;-1:-1:-1;43088:763:0:i;6328:144::-;-1:-1:-1;;;;;;6431:33:0;;6407:4;6431:33;;;:20;:33;;;;;;;;6328:144;;;;:::o;35296:162::-;29979:9;:7;:9::i;:::-;29971:41;;;;;-1:-1:-1;;;29971:41:0;;;;;;;;;;;;-1:-1:-1;;;29971:41:0;;;;;;;;;;;;;;;35371:6;-1:-1:-1;;;;;34235:20:0;::::1;34227:54;;;::::0;;-1:-1:-1;;;34227:54:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;34227:54:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;35390:14:0;::::2;35407:1;35390:14:::0;;;:6:::2;:14;::::0;;;;;:18;;-1:-1:-1;;35390:18:0::2;::::0;;35424:26;::::2;::::0;35407:1;35424:26:::2;30023:1:::1;35296:162:::0;:::o;22547:94::-;22628:5;22621:12;;;;;;;;-1:-1:-1;;22621:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22595:13;;22621:12;;22628:5;;22621:12;;22628:5;22621:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22547:94;;:::o;13106:188::-;13174:7;13202:16;13210:7;13202;:16::i;:::-;13194:50;;;;;-1:-1:-1;;;13194:50:0;;;;;;;;;;;;-1:-1:-1;;;13194:50:0;;;;;;;;;;;;;;;-1:-1:-1;13262:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;13262:24:0;;13106:188::o;12462:356::-;12535:13;12551:16;12559:7;12551;:16::i;:::-;12535:32;;12592:5;-1:-1:-1;;;;;12586:11:0;:2;-1:-1:-1;;;;;12586:11:0;;;12578:47;;;;;-1:-1:-1;;;12578:47:0;;;;;;;;;;;;-1:-1:-1;;;12578:47:0;;;;;;;;;;;;;;;12644:10;-1:-1:-1;;;;;12644:19:0;;;;:58;;;12667:35;12684:5;12691:10;12667:16;:35::i;:::-;12636:88;;;;;-1:-1:-1;;;12636:88:0;;;;;;;;;;;;-1:-1:-1;;;12636:88:0;;;;;;;;;;;;;;;12737:24;;;;:15;:24;;;;;;;;;:29;;-1:-1:-1;;;;;;12737:29:0;-1:-1:-1;;;;;12737:29:0;;;;;;;;;12782:28;;;;;;;12737:29;;12782:28;;;;;;;;;;;;12462:356;;;:::o;42747:31::-;;;;;;:::o;23596:105::-;23676:10;:17;23596:105;:::o;33632:126::-;33675:4;33713:26;33728:10;33713:14;:26::i;:::-;33692:58;;33632:126;:::o;14767:220::-;14867:39;14886:10;14898:7;14867:18;:39::i;:::-;14859:75;;;;;-1:-1:-1;;;14859:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;14947:32;14961:4;14967:2;14971:7;14947:13;:32::i;:::-;14767:220;;;:::o;40950:218::-;33870:9;:7;:9::i;:::-;33848:91;;;;;-1:-1:-1;;;33848:91:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;33848:91:0;;;;;;;;;;;;;;;41076:1:::1;41066:7;:11;41058:56;;;::::0;;-1:-1:-1;;;41058:56:0;;::::1;;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;41155:5;41125:9;:18;41135:7;41125:18;;;;;;;;;;;41144:7;41125:27;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10:::0;;164:23;;-1:-1;;139:12;;;;98:2:::1;89:12:::0;;::::1;::::0;114::::1;36:153;;;299:10:::0;344;;263:2:::1;259:12:::0;;::::1;254:3;250:22;-1:-1:::0;;246:30;311:9;::::1;295:26:::0;;::::1;340:21:::0;::::1;377:20;365:33:::0;;41125:27:0;::::1;::::0;;;-1:-1:-1;41125:27:0::1;::::0;;;;;;;;;;:35;;::::1;::::0;:27;;:35;;;::::1;::::0;-1:-1:-1;41125:35:0;-1:-1:-1;41125:35:0::1;:::i;:::-;;40950:218:::0;;;:::o;23226:215::-;23315:7;23351:16;23361:5;23351:9;:16::i;:::-;23343:5;:24;23335:54;;;;;-1:-1:-1;;;23335:54:0;;;;;;;;;;;;-1:-1:-1;;;23335:54:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;23407:19:0;;;;;;:12;:19;;;;;:26;;23427:5;;23407:26;;;;;;;;;;;;;;23400:33;;23226:215;;;;;:::o;44094:139::-;29979:9;:7;:9::i;:::-;29971:41;;;;;-1:-1:-1;;;29971:41:0;;;;;;;;;;;;-1:-1:-1;;;29971:41:0;;;;;;;;;;;;;;;44166:19;;::::1;::::0;:13:::1;::::0;:19:::1;::::0;::::1;::::0;::::1;:::i;:::-;;44201:24;44221:3;44201:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11:::0;;::::1;84:18:::0;71:11;;::::1;64:39:::0;52:2:::1;45:10;8:100;;;12:14;44201:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44094:139:::0;:::o;41320:147::-;41399:13;41432:9;:18;41442:7;41432:18;;;;;;;;;;;41451:7;41432:27;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;-1:-1;;263:2;259:12;;;254:3;250:22;;;246:30;;340:21;;;311:9;;295:26;;;;377:20;;;;365:33;;;41432:27:0;;;;;;;;;;;;;;;;;;41425:34;;;;274:1:-1;41425:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41432:27;;-1:-1:-1;41425:34:0;-1:-1:-1;;41425:34:0;;41432:27;41425:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41320:147;;;;:::o;33033:187::-;33094:4;33125:7;:5;:7::i;:::-;-1:-1:-1;;;;;33115:17:0;:6;-1:-1:-1;;;;;33115:17:0;;33111:101;;;-1:-1:-1;33141:4:0;33134:11;;33111:101;-1:-1:-1;;;;;;33182:14:0;;;;;;:6;:14;;;;;;;;;;:19;;33200:1;33182:19;33161:51;;15623:151;15719:47;15744:4;15750:2;15754:7;15719:47;;;;;;;;;;;;:24;:47::i;39641:93::-;34077:13;:11;:13::i;:::-;34055:95;;;;;-1:-1:-1;;;34055:95:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39705:21:::1;39717:8;39705:11;:21::i;:::-;39641:93:::0;:::o;44860:99::-;29979:9;:7;:9::i;:::-;29971:41;;;;;-1:-1:-1;;;29971:41:0;;;;;;;;;;;;-1:-1:-1;;;29971:41:0;;;;;;;;;;;;;;;44925:26:::1;44943:7;44925:17;:26::i;24041:181::-:0;24108:7;24144:13;:11;:13::i;:::-;24136:5;:21;24128:51;;;;;-1:-1:-1;;;24128:51:0;;;;;;;;;;;;-1:-1:-1;;;24128:51:0;;;;;;;;;;;;;;;24197:10;24208:5;24197:17;;;;;;;;;;;;;;;;24190:24;;24041:181;;;:::o;42211:147::-;42284:66;42211:147;:::o;41176:136::-;34077:13;:11;:13::i;:::-;34055:95;;;;;-1:-1:-1;;;34055:95:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41272:32:::1;;;;;;;;;;;::::0;:9:::1;:18;41282:7;41272:18;;;;;;;;;;;41291:7;41272:27;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10:::0;;164:23;;-1:-1;;139:12;;;;98:2:::1;89:12:::0;;::::1;::::0;114::::1;36:153;;;299:10:::0;344;;263:2:::1;259:12:::0;;::::1;254:3;250:22;-1:-1:::0;;246:30;311:9;::::1;295:26:::0;;::::1;340:21:::0;::::1;377:20;365:33:::0;;41272:27:0;::::1;::::0;;;-1:-1:-1;41272:27:0::1;::::0;;;;;;;;;;:32;;::::1;::::0;:27;;:32;;;::::1;::::0;-1:-1:-1;41272:32:0;-1:-1:-1;41272:32:0::1;:::i;29177:116::-:0;29231:13;29264:21;29279:5;29264:14;:21::i;:::-;29257:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29177:116;;;:::o;16482:255::-;16606:31;16619:4;16625:2;16629:7;16606:12;:31::i;:::-;16656:48;16679:4;16685:2;16689:7;16698:5;16656:22;:48::i;:::-;16648:81;;;;;-1:-1:-1;;;16648:81:0;;;;;;;;;;;;-1:-1:-1;;;16648:81:0;;;;;;;;;;;;;;11817:219;11881:7;11917:20;;;:11;:20;;;;;;-1:-1:-1;;;;;11917:20:0;11956:19;11948:57;;;;;-1:-1:-1;;;11948:57:0;;;;;;;;;;;;-1:-1:-1;;;11948:57:0;;;;;;;;;;;;;;45350:186;33870:9;:7;:9::i;:::-;33848:91;;;;;-1:-1:-1;;;33848:91:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;33848:91:0;;;;;;;;;;;;;;;45462:11:::1;45469:3;45462:6;:11::i;:::-;45484:44;45496:15;;45513:7;45522:5;45484:11;:44::i;34516:165::-:0;29979:9;:7;:9::i;:::-;29971:41;;;;;-1:-1:-1;;;29971:41:0;;;;;;;;;;;;-1:-1:-1;;;29971:41:0;;;;;;;;;;;;;;;34591:6;-1:-1:-1;;;;;34235:20:0;::::1;34227:54;;;::::0;;-1:-1:-1;;;34227:54:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;34227:54:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;34610:14:0;::::2;;::::0;;;:6:::2;:14;::::0;;;;;;;;:18;;-1:-1:-1;;34610:18:0::2;34627:1;34610:18:::0;;::::2;::::0;;;34644:29;;;;;;;::::2;::::0;;;;;;;;::::2;30023:1:::1;34516:165:::0;:::o;11395:201::-;11459:7;-1:-1:-1;;;;;11487:19:0;;11479:57;;;;;-1:-1:-1;;;11479:57:0;;;;;;;;;;;;-1:-1:-1;;;11479:57:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;11554:24:0;;;;;;:17;:24;;;;;:34;;:32;:34::i;30572:140::-;29979:9;:7;:9::i;:::-;29971:41;;;;;-1:-1:-1;;;29971:41:0;;;;;;;;;;;;-1:-1:-1;;;29971:41:0;;;;;;;;;;;;;;;30655:6:::1;::::0;30634:40:::1;::::0;30671:1:::1;::::0;-1:-1:-1;;;;;30655:6:0::1;::::0;30634:40:::1;::::0;30671:1;;30634:40:::1;30685:6;:19:::0;;-1:-1:-1;;;;;;30685:19:0::1;::::0;;30572:140::o;38938:232::-;33870:9;:7;:9::i;:::-;33848:91;;;;;-1:-1:-1;;;33848:91:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;33848:91:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;39004:17:0;::::1;38996:54;;;::::0;;-1:-1:-1;;;38996:54:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;38996:54:0;;;;;;;;;;;;;::::1;;39061:18;39082:17;:15;:17::i;:::-;39061:38;;39110:22;39116:3;39121:10;39110:5;:22::i;:::-;39143:19;:17;:19::i;:::-;33950:1;38938:232:::0;:::o;39396:183::-;33870:9;:7;:9::i;:::-;33848:91;;;;;-1:-1:-1;;;33848:91:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;33848:91:0;;;;;;;;;;;;;;;39489:1:::1;39480:6;:10;39472:43;;;::::0;;-1:-1:-1;;;39472:43:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;39472:43:0;;;;;;;;;;;;;::::1;;39531:6;39526:45;39547:6;39543:1;:10;39526:45;;;39560:11;39567:3;39560:6;:11::i;:::-;39555:3;;39526:45;;29769:79:::0;29834:6;;-1:-1:-1;;;;;29834:6:0;29769:79;:::o;30123:92::-;30201:6;;-1:-1:-1;;;;;30201:6:0;30187:10;:20;;30123:92::o;22752:98::-;22835:7;22828:14;;;;;;;;-1:-1:-1;;22828:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22802:13;;22828:14;;22835:7;;22828:14;;22835:7;22828:14;;;;;;;;;;;;;;;;;;;;;;;;32230:153;32289:5;32321:7;:5;:7::i;:::-;-1:-1:-1;;;;;32311:17:0;:6;-1:-1:-1;;;;;32311:17:0;;32307:68;;;-1:-1:-1;32337:1:0;32330:8;;32307:68;-1:-1:-1;;;;;;32361:14:0;;;;;;:6;:14;;;;;;;;32354:21;;13589:253;-1:-1:-1;;;;;13678:16:0;;13684:10;13678:16;;13670:52;;;;;-1:-1:-1;;;13670:52:0;;;;;;;;;;;;-1:-1:-1;;;13670:52:0;;;;;;;;;;;;;;;13752:10;13733:30;;;;:18;:30;;;;;;;;-1:-1:-1;;;;;13733:34:0;;;;;;;;;;;;:45;;-1:-1:-1;;13733:45:0;;;;;;;;;;13794:40;;;;;;;13733:34;;13752:10;13794:40;;;;;;;;;;;13589:253;;:::o;34935:171::-;29979:9;:7;:9::i;:::-;29971:41;;;;;-1:-1:-1;;;29971:41:0;;;;;;;;;;;;-1:-1:-1;;;29971:41:0;;;;;;;;;;;;;;;35016:6;-1:-1:-1;;;;;34235:20:0;::::1;34227:54;;;::::0;;-1:-1:-1;;;34227:54:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;34227:54:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;35035:14:0;::::2;;::::0;;;:6:::2;:14;::::0;;;;;;;;:18;;-1:-1:-1;;35035:18:0::2;35052:1;35035:18:::0;;::::2;::::0;;;35069:29;;;;;;;::::2;::::0;;;;;;;;::::2;30023:1:::1;34935:171:::0;:::o;32600:180::-;32655:4;32686:7;:5;:7::i;:::-;-1:-1:-1;;;;;32676:17:0;:6;-1:-1:-1;;;;;32676:17:0;;32672:100;;;-1:-1:-1;32702:4:0;32695:11;;32672:100;-1:-1:-1;;;;;;32743:14:0;;32760:1;32743:14;;;:6;:14;;;;;;;;;;:18;;;32722:50;;33356:116;33395:4;33433:20;33442:10;33433:8;:20::i;44441:198::-;44500:13;44533:98;44565:14;:12;:14::i;:::-;44594:26;44611:8;44594:16;:26::i;:::-;44533:17;:98::i;4739:35::-;;;-1:-1:-1;;;;;4739:35:0;;:::o;43922:99::-;44000:13;43993:20;;;;;;;-1:-1:-1;;43993:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43967:13;;43993:20;;44000:13;;43993:20;;44000:13;43993:20;;;;;;;;;;;;;;;;;;;;;;;;40286:449;40544:20;;40588:28;;;-1:-1:-1;;;40588:28:0;;-1:-1:-1;;;;;40588:28:0;;;;;;;;;40415:4;;40544:20;;;40580:49;;;40544:20;;40588:21;;:28;;;;;;;;;;;;;;;40544:20;40588:28;;;5:2:-1;;;;30:1;27;20:12;5:2;40588:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40588:28:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40588:28:0;-1:-1:-1;;;;;40580:49:0;;40576:93;;;40653:4;40646:11;;;;;40576:93;40688:39;40711:5;40718:8;40688:22;:39::i;:::-;40681:46;40286:449;-1:-1:-1;;;;40286:449:0:o;30886:109::-;29979:9;:7;:9::i;:::-;29971:41;;;;;-1:-1:-1;;;29971:41:0;;;;;;;;;;;;-1:-1:-1;;;29971:41:0;;;;;;;;;;;;;;;30959:28:::1;30978:8;30959:18;:28::i;43088:763::-:0;43290:11;;;;:19;;:11;:19;43286:558;;43326:11;:18;;-1:-1:-1;;43326:18:0;43340:4;43326:18;;;43361:64;43387:5;43394:7;43403:21;43361:25;:64::i;:::-;43442:23;;;;:13;;:23;;;;;:::i;:::-;-1:-1:-1;43564:40:0;-1:-1:-1;;;43564:18:0;:40::i;:::-;43619:49;-1:-1:-1;;;43619:18:0;:49::i;:::-;43683:51;-1:-1:-1;;;43683:18:0;:51::i;:::-;43749:40;-1:-1:-1;;;43749:18:0;:40::i;:::-;43806:26;43825:6;43806:18;:26::i;:::-;43088:763;;;;;:::o;16934:155::-;16991:4;17024:20;;;:11;:20;;;;;;-1:-1:-1;;;;;17024:20:0;17062:19;;;16934:155::o;17452:249::-;17537:4;17554:13;17570:16;17578:7;17570;:16::i;:::-;17554:32;;17616:5;-1:-1:-1;;;;;17605:16:0;:7;-1:-1:-1;;;;;17605:16:0;;:51;;;;17649:7;-1:-1:-1;;;;;17625:31:0;:20;17637:7;17625:11;:20::i;:::-;-1:-1:-1;;;;;17625:31:0;;17605:51;:87;;;;17660:32;17677:5;17684:7;17660:16;:32::i;24600:254::-;24695:38;24715:4;24721:2;24725:7;24695:19;:38::i;:::-;24746:47;24779:4;24785:7;24746:32;:47::i;:::-;24806:40;24834:2;24838:7;24806:27;:40::i;19067:92::-;19119:32;19125:16;19133:7;19125;:16::i;:::-;19143:7;19119:5;:32::i;41796:409::-;41974:10;-1:-1:-1;;;;;41964:35:0;;:37;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41964:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41964:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41964:37:0;41893:66;41885:116;41863:180;;;;;-1:-1:-1;;;41863:180:0;;;;;;;;;;;;-1:-1:-1;;;41863:180:0;;;;;;;;;;;;;;;42108:66;42101:86;42063:135::o;26188:126::-;-1:-1:-1;;;;;26287:19:0;26250:17;26287:19;;;:12;:19;;;;;;26188:126::o;20514:352::-;20632:4;20659:15;:2;-1:-1:-1;;;;;20659:13:0;;:15::i;:::-;20654:60;;-1:-1:-1;20698:4:0;20691:11;;20654:60;20742:70;;-1:-1:-1;;;20742:70:0;;20779:10;20742:70;;;;;;-1:-1:-1;;;;;20742:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;20726:13;;20742:36;;;;;;20779:10;;20791:4;;20797:7;;20806:5;;20742:70;;;;;;;;;;;20726:13;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;20742:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20742:70:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20742:70:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20742:70:0;-1:-1:-1;;;;;;20831:26:0;-1:-1:-1;;;20831:26:0;;-1:-1:-1;;20514:352:0;;;;;;:::o;3760:114::-;3852:14;;3760:114::o;39891:106::-;39967:15;;39940:7;;39967:22;;39987:1;39967:22;:19;:22;:::i;25112:211::-;25185:24;25197:2;25201:7;25185:11;:24::i;:::-;25222:40;25250:2;25254:7;25222:27;:40::i;:::-;25275;25307:7;25275:31;:40::i;40082:74::-;40131:15;:17;;;;;;40082:74::o;37005:482::-;37055:27;37099:7;37095:50;;-1:-1:-1;37123:10:0;;;;;;;;;;;;-1:-1:-1;;;37123:10:0;;;;;;37095:50;37164:2;37155:6;37196:69;37203:6;;37196:69;;37226:5;;37251:2;37246:7;;;;37196:69;;;37275:17;37305:3;37295:14;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;37295:14:0;87:34:-1;135:17;;-1:-1;37295:14:0;-1:-1:-1;37275:34:0;-1:-1:-1;;;37329:7:0;;37347:103;37354:7;;37347:103;;37411:2;37406;:7;37401:2;:12;37390:25;;37378:4;37383:3;;;;;;;37378:9;;;;;;;;;;;:37;-1:-1:-1;;;;;37378:37:0;;;;;;;;-1:-1:-1;37436:2:0;37430:8;;;;37347:103;;;-1:-1:-1;37474:4:0;37005:482;-1:-1:-1;;;;37005:482:0:o;36849:148::-;36927:13;36960:29;36970:2;36974;36960:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:9;:29::i;:::-;36953:36;36849:148;-1:-1:-1;;;36849:148:0:o;14166:164::-;-1:-1:-1;;;;;14287:25:0;;;14263:4;14287:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;14166:164::o;31142:220::-;-1:-1:-1;;;;;31216:22:0;;31208:64;;;;;-1:-1:-1;;;31208:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;31309:6;;31288:38;;-1:-1:-1;;;;;31288:38:0;;;;31309:6;;31288:38;;31309:6;;31288:38;31337:6;:17;;-1:-1:-1;;;;;;31337:17:0;-1:-1:-1;;;;;31337:17:0;;;;;;;;;;31142:220::o;38610:203::-;38719:31;38735:5;38742:7;38719:15;:31::i;:::-;38761:20;:44;;-1:-1:-1;;;;;;38761:44:0;-1:-1:-1;;;;;38761:44:0;;;;;;;;;;-1:-1:-1;;38610:203:0:o;6554:178::-;-1:-1:-1;;;;;;6630:25:0;;;;;6622:51;;;;;-1:-1:-1;;;6622:51:0;;;;;;;;;;;;-1:-1:-1;;;6622:51:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;;6684:33:0;;;;;:20;:33;;;;;:40;;-1:-1:-1;;6684:40:0;6720:4;6684:40;;;6554:178::o;19537:446::-;19659:4;-1:-1:-1;;;;;19639:24:0;:16;19647:7;19639;:16::i;:::-;-1:-1:-1;;;;;19639:24:0;;19631:69;;;;;-1:-1:-1;;;19631:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19719:16:0;;19711:53;;;;;-1:-1:-1;;;19711:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;19777:23;19792:7;19777:14;:23::i;:::-;-1:-1:-1;;;;;19813:23:0;;;;;;:17;:23;;;;;:35;;:33;:35::i;:::-;-1:-1:-1;;;;;19859:21:0;;;;;;:17;:21;;;;;:33;;:31;:33::i;:::-;19905:20;;;;:11;:20;;;;;;;;;:25;;-1:-1:-1;;;;;;19905:25:0;-1:-1:-1;;;;;19905:25:0;;;;;;;;;19948:27;;;;;;;19905:25;;19948:27;;;;;;;;;;;;19537:446;;;:::o;27777:502::-;-1:-1:-1;;;;;27894:18:0;;27869:22;27894:18;;;:12;:18;;;;;:25;:32;;27924:1;27894:32;:29;:32;:::i;:::-;27937:18;27958:26;;;:17;:26;;;;;;27869:57;;-1:-1:-1;28001:28:0;;;27997:238;;-1:-1:-1;;;;;28068:18:0;;28046:19;28068:18;;;:12;:18;;;;;:34;;28087:14;;28068:34;;;;;;;;;;;;;;28046:56;;28152:11;28119:12;:18;28132:4;-1:-1:-1;;;;;28119:18:0;-1:-1:-1;;;;;28119:18:0;;;;;;;;;;;;28138:10;28119:30;;;;;;;;;;;;;;;;;;;:44;;;;28179:30;;;:17;:30;;;;;:43;;;27997:238;-1:-1:-1;;;;;28247:18:0;;;;;;:12;:18;;;;;:24;;;;;;;;;;;;;;;;;;;;;;;;27777:502;;;;:::o;26611:186::-;-1:-1:-1;;;;;26725:16:0;;;;;;;:12;:16;;;;;;;;:23;;26696:26;;;:17;:26;;;;;:52;;;26759:16;;;39:1:-1;23:18;;45:23;;26759:30:0;;;;;;;;26611:186::o;25598:383::-;25674:27;25686:5;25693:7;25674:11;:27::i;:::-;25714:48;25747:5;25754:7;25714:32;:48::i;:::-;25912:1;25883:26;;;:17;:26;;;;;:30;25926:45;25901:7;25926:36;:45::i;9776:534::-;10255:20;10294:8;;;9776:534::o;2178:186::-;2236:7;2268:5;;;2292:6;;;;2284:51;;;;;-1:-1:-1;;;2284:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;17947:327;-1:-1:-1;;;;;18027:16:0;;18019:53;;;;;-1:-1:-1;;;18019:53:0;;;;;;;;;;;;-1:-1:-1;;;18019:53:0;;;;;;;;;;;;;;;18092:16;18100:7;18092;:16::i;:::-;18091:17;18083:50;;;;;-1:-1:-1;;;18083:50:0;;;;;;;;;;;;-1:-1:-1;;;18083:50:0;;;;;;;;;;;;;;;18146:20;;;;:11;:20;;;;;;;;:25;;-1:-1:-1;;;;;;18146:25:0;-1:-1:-1;;;;;18146:25:0;;;;;;;;18182:21;;:17;:21;;;;;:33;;:31;:33::i;:::-;18233;;;;;;;;-1:-1:-1;;;;;18233:33:0;;;18250:1;;18233:33;;;;;;;;;17947:327;;:::o;26995:164::-;27099:10;:17;;27072:24;;;;:15;:24;;;;;:44;;;39:1:-1;23:18;;45:23;;27127:24:0;;;;;;;26995:164::o;35575:900::-;35707:13;35733:16;35758:2;35733:28;;35772:16;35797:2;35772:28;;35811:16;35836:2;35811:28;;35850:16;35875:2;35850:28;;35889:16;35914:2;35889:28;;35928:19;36013:3;:10;36000:3;:10;35987:3;:10;35974:3;:10;35961:3;:10;:23;:36;:49;:62;35950:74;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;35950:74:0;87:34:-1;135:17;;-1:-1;35950:74:0;-1:-1:-1;35928:96:0;-1:-1:-1;35928:96:0;36080:6;;36101:58;36122:3;:10;36118:1;:14;36101:58;;;36153:3;36157:1;36153:6;;;;;;;;;;;;;;;;36139;36146:3;;;;;;36139:11;;;;;;;;;;;:20;-1:-1:-1;;;;;36139:20:0;;;;;;;;-1:-1:-1;36134:3:0;;36101:58;;;-1:-1:-1;36175:6:0;36170:58;36191:3;:10;36187:1;:14;36170:58;;;36222:3;36226:1;36222:6;;;;;;;;;;;;;;;;36208;36215:3;;;;;;36208:11;;;;;;;;;;;:20;-1:-1:-1;;;;;36208:20:0;;;;;;;;-1:-1:-1;36203:3:0;;36170:58;;;-1:-1:-1;36244:6:0;36239:58;36260:3;:10;36256:1;:14;36239:58;;;36291:3;36295:1;36291:6;;;;;;;;;;;;;;;;36277;36284:3;;;;;;36277:11;;;;;;;;;;;:20;-1:-1:-1;;;;;36277:20:0;;;;;;;;-1:-1:-1;36272:3:0;;36239:58;;;-1:-1:-1;36313:6:0;36308:58;36329:3;:10;36325:1;:14;36308:58;;;36360:3;36364:1;36360:6;;;;;;;;;;;;;;;;36346;36353:3;;;;;;36346:11;;;;;;;;;;;:20;-1:-1:-1;;;;;36346:20:0;;;;;;;;-1:-1:-1;36341:3:0;;36308:58;;;-1:-1:-1;36382:6:0;36377:58;36398:3;:10;36394:1;:14;36377:58;;;36429:3;36433:1;36429:6;;;;;;;;;;;;;;;;36415;36422:3;;;;;;36415:11;;;;;;;;;;;:20;-1:-1:-1;;;;;36415:20:0;;;;;;;;-1:-1:-1;36410:3:0;;36377:58;;;-1:-1:-1;36460:6:0;;35575:900;-1:-1:-1;;;;;;;;;;;;;35575:900:0:o;22316:124::-;22393:12;;;;:5;;:12;;;;;:::i;:::-;-1:-1:-1;22416:16:0;;;;:7;;:16;;;;;:::i;21030:175::-;21130:1;21094:24;;;:15;:24;;;;;;-1:-1:-1;;;;;21094:24:0;:38;21090:108;;21184:1;21149:24;;;:15;:24;;;;;:37;;-1:-1:-1;;;;;;21149:37:0;;;21030:175::o;3981:110::-;4062:14;;:21;;4081:1;4062:21;:18;:21;:::i;:::-;4045:38;;3981:110::o;3882:91::-;3946:19;;3964:1;3946:19;;;3882:91::o;1909:183::-;1967:7;2000:1;1995;:6;;1987:48;;;;;-1:-1:-1;;;1987:48:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2058:5:0;;;1909:183::o;18550:335::-;18653:5;-1:-1:-1;;;;;18633:25:0;:16;18641:7;18633;:16::i;:::-;-1:-1:-1;;;;;18633:25:0;;18625:69;;;;;-1:-1:-1;;;18625:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;18707:23;18722:7;18707:14;:23::i;:::-;-1:-1:-1;;;;;18743:24:0;;;;;;:17;:24;;;;;:36;;:34;:36::i;:::-;18821:1;18790:20;;;:11;:20;;;;;;;;:33;;-1:-1:-1;;;;;;18790:33:0;;;18841:36;;;;;;;-1:-1:-1;;;;;18841:36:0;;;;;;;;;;;18550:335;;:::o;28570:427::-;28677:10;:17;28652:22;;28677:24;;28699:1;28677:24;:21;:24;:::i;:::-;28712:18;28733:24;;;:15;:24;;;;;;28792:10;:26;;28652:49;;-1:-1:-1;28733:24:0;;28652:49;;28792:26;;;;;;;;;;;;;;28770:48;;28856:11;28831:10;28842;28831:22;;;;;;;;;;;;;;;;;;;:36;;;;28879:28;;;:15;:28;;;;;;:41;;;28934:10;:16;;;;;;;;;;;;;;;;;;;;;;;;28988:1;28961:15;:24;28977:7;28961:24;;;;;;;;;;;:28;;;;28570:427;;;;:::o;42575:2966::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42575:2966:0;;;-1:-1:-1;42575:2966:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;
Swarm Source
ipfs://6704363571e345380667e8d1842009e3e9ac55dcdeb93ffb507cd3ae79c45034
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 35 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.