ETH Price: $3,470.65 (+0.56%)

Token

WannaPanda (WP)
 

Overview

Max Total Supply

10,000 WP

Holders

3,029

Market

Volume (24H)

0.0107 ETH

Min Price (24H)

$7.29 @ 0.002100 ETH

Max Price (24H)

$7.64 @ 0.002200 ETH
Balance
52 WP
0xf7C88920e5CF7Dd0725172C6f05dCb867b56825d
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
WannaPanda

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-09-22
*/

// SPDX-License-Identifier: MIT
pragma solidity >=0.6.0 <0.8.0;
pragma abicoder v2;
abstract contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        return msg.sender;
    }
    function _msgData() internal view virtual returns (bytes memory) {
        this;
        return msg.data;
    }
}
interface IERC165 {
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
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 safeTransferFrom(address from, address to, uint256 tokenId) external;
    function transferFrom(address from, address to, uint256 tokenId) external;
    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 safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;
}
interface IERC721Metadata is IERC721 {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function tokenURI(uint256 tokenId) external view returns (string memory);
}
interface IERC721Enumerable 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);
}
interface IERC721Receiver {
    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4);
}
abstract contract ERC165 is IERC165 {
    bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;
    mapping(bytes4 => bool) private _supportedInterfaces;
    constructor () internal {
        _registerInterface(_INTERFACE_ID_ERC165);
    }
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return _supportedInterfaces[interfaceId];
    }
    function _registerInterface(bytes4 interfaceId) internal virtual {
        require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
        _supportedInterfaces[interfaceId] = true;
    }
}
library SafeMath {
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        uint256 c = a + b;
        if (c < a) return (false, 0);
        return (true, c);
    }
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b > a) return (false, 0);
        return (true, a - b);
    }
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (a == 0) return (true, 0);
        uint256 c = a * b;
        if (c / a != b) return (false, 0);
        return (true, c);
    }
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a / b);
    }
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        if (b == 0) return (false, 0);
        return (true, a % b);
    }
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");
        return c;
    }
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a, "SafeMath: subtraction overflow");
        return a - b;
    }
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) return 0;
        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");
        return c;
    }
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: division by zero");
        return a / b;
    }
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b > 0, "SafeMath: modulo by zero");
        return a % b;
    }
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        return a - b;
    }
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a / b;
    }
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        return a % b;
    }
}
library Address {
    function isContract(address account) internal view returns (bool) {
        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");
        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }
    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }
    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");
        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }
    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");
        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }
    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");
        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }
    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        if (success) {
            return returndata;
        } else {
            if (returndata.length > 0) {
                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}
library EnumerableSet {
    struct Set {
        bytes32[] _values;
        mapping (bytes32 => uint256) _indexes;
    }
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        uint256 valueIndex = set._indexes[value];
        if (valueIndex != 0) {
            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;
            bytes32 lastvalue = set._values[lastIndex];
            set._values[toDeleteIndex] = lastvalue;
            set._indexes[lastvalue] = toDeleteIndex + 1;
            set._values.pop();
            delete set._indexes[value];
            return true;
        } else {
            return false;
        }
    }
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        require(set._values.length > index, "EnumerableSet: index out of bounds");
        return set._values[index];
    }
    struct Bytes32Set {
        Set _inner;
    }
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }
    struct AddressSet {
        Set _inner;
    }
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }
    struct UintSet {
        Set _inner;
    }
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }
}
library EnumerableMap {
    struct MapEntry {
        bytes32 _key;
        bytes32 _value;
    }
    struct Map {
        MapEntry[] _entries;
        mapping (bytes32 => uint256) _indexes;
    }
    function _set(Map storage map, bytes32 key, bytes32 value) private returns (bool) {
        uint256 keyIndex = map._indexes[key];
        if (keyIndex == 0) {
            map._entries.push(MapEntry({ _key: key, _value: value }));
            map._indexes[key] = map._entries.length;
            return true;
        } else {
            map._entries[keyIndex - 1]._value = value;
            return false;
        }
    }
    function _remove(Map storage map, bytes32 key) private returns (bool) {
        uint256 keyIndex = map._indexes[key];
        if (keyIndex != 0) {
            uint256 toDeleteIndex = keyIndex - 1;
            uint256 lastIndex = map._entries.length - 1;
            MapEntry storage lastEntry = map._entries[lastIndex];
            map._entries[toDeleteIndex] = lastEntry;
            map._indexes[lastEntry._key] = toDeleteIndex + 1;
            map._entries.pop();
            delete map._indexes[key];
            return true;
        } else {
            return false;
        }
    }
    function _contains(Map storage map, bytes32 key) private view returns (bool) {
        return map._indexes[key] != 0;
    }
    function _length(Map storage map) private view returns (uint256) {
        return map._entries.length;
    }
    function _at(Map storage map, uint256 index) private view returns (bytes32, bytes32) {
        require(map._entries.length > index, "EnumerableMap: index out of bounds");
        MapEntry storage entry = map._entries[index];
        return (entry._key, entry._value);
    }
    function _tryGet(Map storage map, bytes32 key) private view returns (bool, bytes32) {
        uint256 keyIndex = map._indexes[key];
        if (keyIndex == 0) return (false, 0);
        return (true, map._entries[keyIndex - 1]._value);
    }
    function _get(Map storage map, bytes32 key) private view returns (bytes32) {
        uint256 keyIndex = map._indexes[key];
        require(keyIndex != 0, "EnumerableMap: nonexistent key");
        return map._entries[keyIndex - 1]._value;
    }
    function _get(Map storage map, bytes32 key, string memory errorMessage) private view returns (bytes32) {
        uint256 keyIndex = map._indexes[key];
        require(keyIndex != 0, errorMessage);
        return map._entries[keyIndex - 1]._value;
    }
    struct UintToAddressMap {
        Map _inner;
    }
    function set(UintToAddressMap storage map, uint256 key, address value) internal returns (bool) {
        return _set(map._inner, bytes32(key), bytes32(uint256(uint160(value))));
    }
    function remove(UintToAddressMap storage map, uint256 key) internal returns (bool) {
        return _remove(map._inner, bytes32(key));
    }
    function contains(UintToAddressMap storage map, uint256 key) internal view returns (bool) {
        return _contains(map._inner, bytes32(key));
    }
    function length(UintToAddressMap storage map) internal view returns (uint256) {
        return _length(map._inner);
    }
    function at(UintToAddressMap storage map, uint256 index) internal view returns (uint256, address) {
        (bytes32 key, bytes32 value) = _at(map._inner, index);
        return (uint256(key), address(uint160(uint256(value))));
    }
    function tryGet(UintToAddressMap storage map, uint256 key) internal view returns (bool, address) {
        (bool success, bytes32 value) = _tryGet(map._inner, bytes32(key));
        return (success, address(uint160(uint256(value))));
    }
    function get(UintToAddressMap storage map, uint256 key) internal view returns (address) {
        return address(uint160(uint256(_get(map._inner, bytes32(key)))));
    }
    function get(UintToAddressMap storage map, uint256 key, string memory errorMessage) internal view returns (address) {
        return address(uint160(uint256(_get(map._inner, bytes32(key), errorMessage))));
    }
}
library Strings {
    function toString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        uint256 index = digits - 1;
        temp = value;
        while (temp != 0) {
            buffer[index--] = bytes1(uint8(48 + temp % 10));
            temp /= 10;
        }
        return string(buffer);
    }
}
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
    using SafeMath for uint256;
    using Address for address;
    using EnumerableSet for EnumerableSet.UintSet;
    using EnumerableMap for EnumerableMap.UintToAddressMap;
    using Strings for uint256;
    bytes4 private constant _ERC721_RECEIVED = 0x150b7a02;
    mapping (address => EnumerableSet.UintSet) private _holderTokens;
    EnumerableMap.UintToAddressMap private _tokenOwners;
    mapping (uint256 => address) private _tokenApprovals;
    mapping (address => mapping (address => bool)) private _operatorApprovals;
    string private _name;
    string private _symbol;
    mapping (uint256 => string) private _tokenURIs;
    string private _baseURI;
    bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd;
    bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f;
    bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63;
    constructor (string memory name_, string memory symbol_) public {
        _name = name_;
        _symbol = symbol_;
        _registerInterface(_INTERFACE_ID_ERC721);
        _registerInterface(_INTERFACE_ID_ERC721_METADATA);
        _registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE);
    }
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _holderTokens[owner].length();
    }
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        return _tokenOwners.get(tokenId, "ERC721: owner query for nonexistent token");
    }
    function name() public view virtual override returns (string memory) {
        return _name;
    }
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }
    function _setName(string memory name_) internal virtual {
        _name = name_;
    }
    function _setSymbol(string memory symbol_) internal virtual {
        _symbol = symbol_;
    }
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = baseURI();
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }
        return string(abi.encodePacked(base, tokenId.toString()));
    }
    function baseURI() public view virtual returns (string memory) {
        return _baseURI;
    }
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        return _holderTokens[owner].at(index);
    }
    function totalSupply() public view virtual override returns (uint256) {
        return _tokenOwners.length();
    }
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        (uint256 tokenId, ) = _tokenOwners.at(index);
        return tokenId;
    }
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");
        require(_msgSender() == owner || ERC721.isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );
        _approve(to, tokenId);
    }
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");
        return _tokenApprovals[tokenId];
    }
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");
        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }
    function transferFrom(address from, address to, uint256 tokenId) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _transfer(from, to, tokenId);
    }
    function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }
    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }
    function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _tokenOwners.contains(tokenId);
    }
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || ERC721.isApprovedForAll(owner, spender));
    }
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }
    function _safeMint(address to, uint256 tokenId, bytes memory _data) internal virtual {
        _mint(to, tokenId);
        require(_checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");
        _beforeTokenTransfer(address(0), to, tokenId);
        _holderTokens[to].add(tokenId);
        _tokenOwners.set(tokenId, to);
        emit Transfer(address(0), to, tokenId);
    }
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);
        _beforeTokenTransfer(owner, address(0), tokenId);
        _approve(address(0), tokenId);
        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
        _holderTokens[owner].remove(tokenId);
        _tokenOwners.remove(tokenId);
        emit Transfer(owner, address(0), tokenId);
    }
    function _transfer(address from, address to, uint256 tokenId) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");
        _beforeTokenTransfer(from, to, tokenId);
        _approve(address(0), tokenId);
        _holderTokens[from].remove(tokenId);
        _holderTokens[to].add(tokenId);
        _tokenOwners.set(tokenId, to);
        emit Transfer(from, to, tokenId);
    }
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }
    function _setBaseURI(string memory baseURI_) internal virtual {
        _baseURI = baseURI_;
    }
    function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data)
        private returns (bool)
    {
        if (!to.isContract()) {
            return true;
        }
        bytes memory returndata = to.functionCall(abi.encodeWithSelector(
            IERC721Receiver(to).onERC721Received.selector,
            _msgSender(),
            from,
            tokenId,
            _data
        ), "ERC721: transfer to non ERC721Receiver implementer");
        bytes4 retval = abi.decode(returndata, (bytes4));
        return (retval == _ERC721_RECEIVED);
    }
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId); // internal owner
    }
    function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual { }
}
abstract contract Ownable is Context {
    address private _owner;
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
    constructor () internal {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }
    function owner() public view virtual returns (address) {
        return _owner;
    }
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

contract WannaPanda is ERC721, Ownable {
    using SafeMath for uint256;
    uint256 public PRICE = 70000000000000000;
    uint public MAX_PURCHASE = 25;
    uint256 public MAX_PANDAS = 10000;
    uint256 public DAYS = 5;
    bool public SELLING = false;
    bool public RESERVED = true;
    bool public CHECK_WHITELISTING = true;
    mapping(address => bool) public whitelister10;
    mapping(address => bool) public whitelister25;
    uint256 public whitelisters10Length;
    uint256 public whitelisters25Length;
    struct userMintInfo {
        uint256 mintTimestamp;
        uint minted;
    }
    mapping(address => userMintInfo) userMints;
    event MintedIDs(uint[] array);
    constructor() ERC721("WannaPanda", "WP") {}
    function getSeconds() public view returns(uint256) {
        uint HOURS = DAYS.mul(24);
        uint SECONDS = HOURS.mul(3600);
        return SECONDS;
    }
    function checkUserMinting(address userAddress, uint256 timeNow) public view returns(uint) {
        userMintInfo storage userMint = userMints[userAddress];
        bool inTime = checkInTime(userAddress, timeNow);
        if(inTime) {
            return userMint.minted;
        }
        else {
            return 0;
        }
    }
    function checkInTime(address userAddress, uint256 timeNow) public view returns(bool) {
        userMintInfo storage userMint = userMints[userAddress];
        uint256 mintTimestamp = userMint.mintTimestamp;
        uint256 _seconds = getSeconds();
        if(timeNow - mintTimestamp < _seconds) {
            return true;
        }
        else {
            return false;
        }
    }
    function setUserMinting(address userAddress, uint minted, bool inTime, uint256 timeNow) internal {
        userMintInfo storage userMint = userMints[userAddress];
        userMint.minted = minted;
        if(!inTime) {
            userMint.mintTimestamp = timeNow;
        }
    }
    function withdraw() public onlyOwner {
        uint balance = address(this).balance;
        msg.sender.transfer(balance);
    }
    function togglePandaPurchase() public onlyOwner {
        SELLING = !SELLING;
    }
    function setDays(uint _days) public onlyOwner {
        DAYS = _days;
    }
    function setMaxPandas(uint256 maxPandas) public onlyOwner {
        MAX_PANDAS = maxPandas;
    }
    function getMaxPandas() public view returns(uint256) {
        return MAX_PANDAS;
    }
    function setMaxPurchase(uint256 maxPurchase) public onlyOwner {
        MAX_PURCHASE = maxPurchase;
    }
    function setBaseURI(string memory baseURI) public onlyOwner {
        _setBaseURI(baseURI);
    }
    function setTokenURI(uint256 tokenId, string memory _tokenURI) public onlyOwner {
        _setTokenURI(tokenId, _tokenURI);
    }
    function setTokenURIMultiple(uint256[] memory tokenId, string[] memory _tokenURI) public onlyOwner {
        for(uint x=0; x<tokenId.length; x++ ) {
            _setTokenURI(tokenId[x], _tokenURI[x]);
        }
    }
    function toggleWhiteListing() public onlyOwner {
        CHECK_WHITELISTING = !CHECK_WHITELISTING;
    }
    function isWhiteLister(address _beneficiary) public view returns (uint) {
        if(whitelister10[_beneficiary]) {
            return 10;
        }
        if(whitelister25[_beneficiary]) {
            return 25;
        }
        return 0;
    }
    function addWhitelisters10(address[] memory _whitelister) external onlyOwner {
        for(uint8 i=0; i<_whitelister.length;i++) {
            if(isWhiteLister(_whitelister[i]) == 0) {
                whitelister10[_whitelister[i]] = true;
                whitelisters10Length++;
            }
        }
    }
    function addWhitelisters25(address[] memory _whitelister) external onlyOwner {
        for(uint8 i=0; i<_whitelister.length;i++){
            if(isWhiteLister(_whitelister[i]) == 0) {
                whitelister25[_whitelister[i]] = true;
                whitelisters25Length++;
            }
        }
    }
    function removeWhitelisters10(address[] memory _whitelister) external onlyOwner {
        for(uint8 i=0; i<_whitelister.length;i++) {
            if(isWhiteLister(_whitelister[i]) == 10) {
                whitelister10[_whitelister[i]] = false;
                whitelisters10Length--;
            }
        }
    }
    function removeWhitelisters25(address[] memory _whitelister) external onlyOwner {
        for(uint8 i=0; i<_whitelister.length;i++) {
            if(isWhiteLister(_whitelister[i]) == 25) {
                whitelister25[_whitelister[i]] = false;
                whitelisters25Length--;
            }
        }
    }
    function mintPandas(uint numberOfTokens, string memory revealingImage) public payable {
        uint256 timeNow = block.timestamp;
        uint[] memory array = new uint[](numberOfTokens);
        require(SELLING, "Panda sale is not active yet");
        uint alreadyMintedInTime = checkUserMinting(msg.sender, timeNow);
        bool inTime = checkInTime(msg.sender, timeNow);
        string memory message;
        if(CHECK_WHITELISTING) {
            uint maxMintsAllowed = isWhiteLister(msg.sender);
            require(maxMintsAllowed > 0, "You are not whitelisted by the owner.");
            if(maxMintsAllowed == 10) {
                message = "Can not mint more than 10 tokens per 5 days";
            }
            else if(maxMintsAllowed == 25) {
                message = "Can not mint more than 25 tokens per 5 days";
            }
            require(numberOfTokens <= maxMintsAllowed, message);
            require(numberOfTokens.add(alreadyMintedInTime) <= maxMintsAllowed, message);
        }
        else {
            require(numberOfTokens <= MAX_PURCHASE, "Can not mint more than 10 tokens at a time");
        }
        
        require(totalSupply().add(numberOfTokens) <= MAX_PANDAS, "Purchase would exceed max supply of Pandas");
        require(PRICE.mul(numberOfTokens) <= msg.value, "Ether value sent is not correct");
        for(uint i = 0; i < numberOfTokens; i++) {
            uint mintIndex = totalSupply();
            array[i] = mintIndex;
            if (totalSupply() < MAX_PANDAS) {
                _safeMint(msg.sender, mintIndex);
                _setTokenURI(mintIndex, revealingImage);
            }
        }
        setUserMinting(msg.sender, numberOfTokens.add(alreadyMintedInTime), inTime, timeNow);
        emit MintedIDs(array);
    }
    function reservePandas(uint total, string memory revealingImage) external onlyOwner {
        require(RESERVED, "You have already reserved the Pandas");
        uint[] memory array = new uint[](total);
        require(totalSupply().add(total) <= MAX_PANDAS, "Mint would exceed max supply of Pandas");
        for(uint i = 0; i < total; i++) {
            uint mintIndex = totalSupply();
            array[i] = mintIndex;
            if (totalSupply() < MAX_PANDAS) {
                _safeMint(msg.sender, mintIndex);
                _setTokenURI(mintIndex, revealingImage);
            }
        }
        RESERVED = false;
        emit MintedIDs(array);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"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":"uint256[]","name":"array","type":"uint256[]"}],"name":"MintedIDs","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":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"CHECK_WHITELISTING","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DAYS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PANDAS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PURCHASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RESERVED","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SELLING","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_whitelister","type":"address[]"}],"name":"addWhitelisters10","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_whitelister","type":"address[]"}],"name":"addWhitelisters25","outputs":[],"stateMutability":"nonpayable","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":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"uint256","name":"timeNow","type":"uint256"}],"name":"checkInTime","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"uint256","name":"timeNow","type":"uint256"}],"name":"checkUserMinting","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxPandas","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"_beneficiary","type":"address"}],"name":"isWhiteLister","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"},{"internalType":"string","name":"revealingImage","type":"string"}],"name":"mintPandas","outputs":[],"stateMutability":"payable","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":[{"internalType":"address[]","name":"_whitelister","type":"address[]"}],"name":"removeWhitelisters10","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_whitelister","type":"address[]"}],"name":"removeWhitelisters25","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"total","type":"uint256"},{"internalType":"string","name":"revealingImage","type":"string"}],"name":"reservePandas","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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_days","type":"uint256"}],"name":"setDays","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxPandas","type":"uint256"}],"name":"setMaxPandas","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxPurchase","type":"uint256"}],"name":"setMaxPurchase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"_tokenURI","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenId","type":"uint256[]"},{"internalType":"string[]","name":"_tokenURI","type":"string[]"}],"name":"setTokenURIMultiple","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":[],"name":"togglePandaPurchase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleWhiteListing","outputs":[],"stateMutability":"nonpayable","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":[],"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":"","type":"address"}],"name":"whitelister10","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelister25","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelisters10Length","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelisters25Length","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405266f8b0a10e470000600b556019600c55612710600d556005600e55600f805462ff00001961ffff199091166101001716620100001790553480156200004857600080fd5b50604080518082018252600a81526957616e6e6150616e646160b01b60208083019190915282518084019093526002835261057560f41b9083015290620000966301ffc9a760e01b6200015b565b8151620000ab906006906020850190620001ba565b508051620000c1906007906020840190620001ba565b50620000d46380ac58cd60e01b6200015b565b620000e6635b5e139f60e01b6200015b565b620000f863780e9d6360e01b6200015b565b506000905062000107620001b6565b600a80546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506200029d565b6001600160e01b03198082161415620001915760405162461bcd60e51b8152600401620001889062000266565b60405180910390fd5b6001600160e01b0319166000908152602081905260409020805460ff19166001179055565b3390565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620001f257600085556200023d565b82601f106200020d57805160ff19168380011785556200023d565b828001600101855582156200023d579182015b828111156200023d57825182559160200191906001019062000220565b506200024b9291506200024f565b5090565b5b808211156200024b576000815560010162000250565b6020808252601c908201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604082015260600190565b6134d080620002ad6000396000f3fe6080604052600436106102e45760003560e01c80636460015011610190578063aa592f25116100dc578063e1487fb711610095578063f2fde38b1161006f578063f2fde38b1461082a578063f4de189d1461084a578063fa2f0eb51461086a578063fd93644d1461087f576102e4565b8063e1487fb7146107ca578063e985e9c5146107ea578063ebea38151461080a576102e4565b8063aa592f251461072b578063b794fae614610740578063b88d4fde14610755578063c549e6b914610775578063c87b56dd1461078a578063d1a2584f146107aa576102e4565b8063718ee8c1116101495780638da5cb5b116101235780638da5cb5b146106c157806395d89b41146106d6578063a22cb465146106eb578063a5183ae71461070b576102e4565b8063718ee8c11461068257806382242e4d146106975780638d859f3e146106ac576102e4565b806364600150146105ee5780636c0360eb1461060357806370a082311461061857806371189742146106385780637146bd0814610658578063715018a61461066d576102e4565b806323b872dd1161024f5780633e0e4c01116102085780634945d2c2116101e25780634945d2c21461056e5780634f6ccce71461058e57806355f804b3146105ae5780636352211e146105ce576102e4565b80633e0e4c011461050e57806342842e0e1461052e578063463300bd1461054e576102e4565b806323b872dd1461045957806324f2a7d7146104795780632ac23cd3146104995780632b9c9cdd146104b95780632f745c59146104d95780633ccfd60b146104f9576102e4565b80631360a5c7116102a15780631360a5c7146103c7578063154c9e2d146103dc578063162094c4146103f1578063171db5111461041157806318160ddd146104245780631d4814cc14610439576102e4565b806301ffc9a7146102e957806306fdde031461031f578063071b58a614610341578063081812fc14610363578063095ea7b3146103905780631056b16d146103b2575b600080fd5b3480156102f557600080fd5b50610309610304366004612a07565b61089f565b6040516103169190612bd1565b60405180910390f35b34801561032b57600080fd5b506103346108c2565b6040516103169190612bdc565b34801561034d57600080fd5b50610356610958565b604051610316919061335c565b34801561036f57600080fd5b5061038361037e366004612a72565b61095e565b6040516103169190612b3c565b34801561039c57600080fd5b506103b06103ab366004612890565b6109aa565b005b3480156103be57600080fd5b50610356610a42565b3480156103d357600080fd5b50610356610a48565b3480156103e857600080fd5b50610309610a4e565b3480156103fd57600080fd5b506103b061040c366004612a8a565b610a57565b6103b061041f366004612a8a565b610aa4565b34801561043057600080fd5b50610356610d46565b34801561044557600080fd5b506103b0610454366004612950565b610d57565b34801561046557600080fd5b506103b06104743660046127a2565b610dda565b34801561048557600080fd5b50610309610494366004612756565b610e12565b3480156104a557600080fd5b506103096104b4366004612890565b610e27565b3480156104c557600080fd5b506103566104d4366004612756565b610e70565b3480156104e557600080fd5b506103566104f4366004612890565b610eca565b34801561050557600080fd5b506103b0610ef3565b34801561051a57600080fd5b506103b0610529366004612a8a565b610f61565b34801561053a57600080fd5b506103b06105493660046127a2565b6110e1565b34801561055a57600080fd5b50610309610569366004612756565b6110fc565b34801561057a57600080fd5b506103b06105893660046128b9565b611111565b34801561059a57600080fd5b506103566105a9366004612a72565b6111db565b3480156105ba57600080fd5b506103b06105c9366004612a3f565b6111f1565b3480156105da57600080fd5b506103836105e9366004612a72565b61123c565b3480156105fa57600080fd5b506103b0611264565b34801561060f57600080fd5b506103346112c2565b34801561062457600080fd5b50610356610633366004612756565b611323565b34801561064457600080fd5b506103b0610653366004612a72565b61136c565b34801561066457600080fd5b506103566113b0565b34801561067957600080fd5b506103b06113b6565b34801561068e57600080fd5b5061035661143f565b3480156106a357600080fd5b50610309611445565b3480156106b857600080fd5b50610356611454565b3480156106cd57600080fd5b5061038361145a565b3480156106e257600080fd5b50610334611469565b3480156106f757600080fd5b506103b0610706366004612856565b6114ca565b34801561071757600080fd5b506103b0610726366004612a72565b611598565b34801561073757600080fd5b506103096115dc565b34801561074c57600080fd5b506103566115ea565b34801561076157600080fd5b506103b06107703660046127dd565b61161a565b34801561078157600080fd5b50610356611659565b34801561079657600080fd5b506103346107a5366004612a72565b61165f565b3480156107b657600080fd5b506103b06107c53660046128b9565b6117a3565b3480156107d657600080fd5b506103b06107e53660046128b9565b611860565b3480156107f657600080fd5b50610309610805366004612770565b611922565b34801561081657600080fd5b506103b0610825366004612a72565b611950565b34801561083657600080fd5b506103b0610845366004612756565b611994565b34801561085657600080fd5b506103b06108653660046128b9565b611a55565b34801561087657600080fd5b506103b0611b17565b34801561088b57600080fd5b5061035661089a366004612890565b611b6a565b6001600160e01b0319811660009081526020819052604090205460ff165b919050565b60068054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561094e5780601f106109235761010080835404028352916020019161094e565b820191906000526020600020905b81548152906001019060200180831161093157829003601f168201915b5050505050905090565b60125481565b600061096982611bac565b61098e5760405162461bcd60e51b81526004016109859061309e565b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006109b58261123c565b9050806001600160a01b0316836001600160a01b031614156109e95760405162461bcd60e51b815260040161098590613203565b806001600160a01b03166109fb611bb9565b6001600160a01b03161480610a175750610a1781610805611bb9565b610a335760405162461bcd60e51b815260040161098590612f08565b610a3d8383611bbd565b505050565b600d5481565b60135481565b600f5460ff1681565b610a5f611bb9565b6001600160a01b0316610a7061145a565b6001600160a01b031614610a965760405162461bcd60e51b815260040161098590613136565b610aa08282611c2b565b5050565b4260008367ffffffffffffffff81118015610abe57600080fd5b50604051908082528060200260200182016040528015610ae8578160200160208202803683370190505b50600f5490915060ff16610b0e5760405162461bcd60e51b815260040161098590612f65565b6000610b1a3384611b6a565b90506000610b283385610e27565b600f5490915060609062010000900460ff1615610c10576000610b4a33610e70565b905060008111610b6c5760405162461bcd60e51b815260040161098590612cc9565b80600a1415610b95576040518060600160405280602b8152602001613447602b91399150610bba565b8060191415610bba576040518060600160405280602b815260200161341c602b913991505b8181891115610bdc5760405162461bcd60e51b81526004016109859190612bdc565b5080610be88986611c6f565b11158290610c095760405162461bcd60e51b81526004016109859190612bdc565b5050610c32565b600c54871115610c325760405162461bcd60e51b815260040161098590613312565b600d54610c4788610c41610d46565b90611c6f565b1115610c655760405162461bcd60e51b815260040161098590612e3b565b600b543490610c749089611c94565b1115610c925760405162461bcd60e51b815260040161098590612e85565b60005b87811015610cf0576000610ca7610d46565b905080868381518110610cb657fe5b602002602001018181525050600d54610ccd610d46565b1015610ce757610cdd3382611cce565b610ce78189611c2b565b50600101610c95565b50610d0633610cff8986611c6f565b8488611ce8565b7f69b7bd0a565a53b21c81a72f7ef2efb0f2fc115663aa76e3dcdc88269cb59d1084604051610d359190612b8d565b60405180910390a150505050505050565b6000610d526002611d17565b905090565b610d5f611bb9565b6001600160a01b0316610d7061145a565b6001600160a01b031614610d965760405162461bcd60e51b815260040161098590613136565b60005b8251811015610a3d57610dd2838281518110610db157fe5b6020026020010151838381518110610dc557fe5b6020026020010151611c2b565b600101610d99565b610deb610de5611bb9565b82611d22565b610e075760405162461bcd60e51b81526004016109859061328a565b610a3d838383611da7565b60106020526000908152604090205460ff1681565b6001600160a01b0382166000908152601460205260408120805482610e4a6115ea565b9050808286031015610e625760019350505050610e6a565b600093505050505b92915050565b6001600160a01b03811660009081526010602052604081205460ff1615610e995750600a6108bd565b6001600160a01b03821660009081526011602052604090205460ff1615610ec2575060196108bd565b506000919050565b6001600160a01b0382166000908152600160205260408120610eec9083611eb5565b9392505050565b610efb611bb9565b6001600160a01b0316610f0c61145a565b6001600160a01b031614610f325760405162461bcd60e51b815260040161098590613136565b6040514790339082156108fc029083906000818181858888f19350505050158015610aa0573d6000803e3d6000fd5b610f69611bb9565b6001600160a01b0316610f7a61145a565b6001600160a01b031614610fa05760405162461bcd60e51b815260040161098590613136565b600f54610100900460ff16610fc75760405162461bcd60e51b815260040161098590612d45565b60008267ffffffffffffffff81118015610fe057600080fd5b5060405190808252806020026020018201604052801561100a578160200160208202803683370190505b509050600d5461101c84610c41610d46565b111561103a5760405162461bcd60e51b815260040161098590613244565b60005b8381101561109857600061104f610d46565b90508083838151811061105e57fe5b602002602001018181525050600d54611075610d46565b101561108f576110853382611cce565b61108f8185611c2b565b5060010161103d565b50600f805461ff00191690556040517f69b7bd0a565a53b21c81a72f7ef2efb0f2fc115663aa76e3dcdc88269cb59d10906110d4908390612b8d565b60405180910390a1505050565b610a3d8383836040518060200160405280600081525061161a565b60116020526000908152604090205460ff1681565b611119611bb9565b6001600160a01b031661112a61145a565b6001600160a01b0316146111505760405162461bcd60e51b815260040161098590613136565b60005b81518160ff161015610aa05761117e828260ff168151811061117157fe5b6020026020010151610e70565b6111d357600160116000848460ff168151811061119757fe5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790556013805460010190555b600101611153565b6000806111e9600284611ec1565b509392505050565b6111f9611bb9565b6001600160a01b031661120a61145a565b6001600160a01b0316146112305760405162461bcd60e51b815260040161098590613136565b61123981611edd565b50565b6000610e6a826040518060600160405280602981526020016134726029913960029190611ef0565b61126c611bb9565b6001600160a01b031661127d61145a565b6001600160a01b0316146112a35760405162461bcd60e51b815260040161098590613136565b600f805462ff0000198116620100009182900460ff1615909102179055565b60098054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561094e5780601f106109235761010080835404028352916020019161094e565b60006001600160a01b03821661134b5760405162461bcd60e51b815260040161098590612f9c565b6001600160a01b0382166000908152600160205260409020610e6a90611d17565b611374611bb9565b6001600160a01b031661138561145a565b6001600160a01b0316146113ab5760405162461bcd60e51b815260040161098590613136565b600c55565b600c5481565b6113be611bb9565b6001600160a01b03166113cf61145a565b6001600160a01b0316146113f55760405162461bcd60e51b815260040161098590613136565b600a546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600a80546001600160a01b0319169055565b600d5490565b600f5462010000900460ff1681565b600b5481565b600a546001600160a01b031690565b60078054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561094e5780601f106109235761010080835404028352916020019161094e565b6114d2611bb9565b6001600160a01b0316826001600160a01b031614156115035760405162461bcd60e51b815260040161098590612e04565b8060056000611510611bb9565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155611554611bb9565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161158c9190612bd1565b60405180910390a35050565b6115a0611bb9565b6001600160a01b03166115b161145a565b6001600160a01b0316146115d75760405162461bcd60e51b815260040161098590613136565b600d55565b600f54610100900460ff1681565b6000806116036018600e54611c9490919063ffffffff16565b9050600061161382610e10611c94565b9250505090565b61162b611625611bb9565b83611d22565b6116475760405162461bcd60e51b81526004016109859061328a565b61165384848484611efd565b50505050565b600e5481565b606061166a82611bac565b6116865760405162461bcd60e51b8152600401610985906131b4565b60008281526008602090815260408083208054825160026001831615610100026000190190921691909104601f8101859004850282018501909352828152929091908301828280156117195780601f106116ee57610100808354040283529160200191611719565b820191906000526020600020905b8154815290600101906020018083116116fc57829003601f168201915b50505050509050600061172a6112c2565b905080516000141561173e575090506108bd565b815115611770578082604051602001611758929190612b0d565b604051602081830303815290604052925050506108bd565b8061177a85611f30565b60405160200161178b929190612b0d565b60405160208183030381529060405292505050919050565b6117ab611bb9565b6001600160a01b03166117bc61145a565b6001600160a01b0316146117e25760405162461bcd60e51b815260040161098590613136565b60005b81518160ff161015610aa057611803828260ff168151811061117157fe5b61185857600160106000848460ff168151811061181c57fe5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790556012805460010190555b6001016117e5565b611868611bb9565b6001600160a01b031661187961145a565b6001600160a01b03161461189f5760405162461bcd60e51b815260040161098590613136565b60005b81518160ff161015610aa0576118c0828260ff168151811061117157fe5b600a141561191a57600060106000848460ff16815181106118dd57fe5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055601280546000190190555b6001016118a2565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b611958611bb9565b6001600160a01b031661196961145a565b6001600160a01b03161461198f5760405162461bcd60e51b815260040161098590613136565b600e55565b61199c611bb9565b6001600160a01b03166119ad61145a565b6001600160a01b0316146119d35760405162461bcd60e51b815260040161098590613136565b6001600160a01b0381166119f95760405162461bcd60e51b815260040161098590612c83565b600a546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b611a5d611bb9565b6001600160a01b0316611a6e61145a565b6001600160a01b031614611a945760405162461bcd60e51b815260040161098590613136565b60005b81518160ff161015610aa057611ab5828260ff168151811061117157fe5b60191415611b0f57600060116000848460ff1681518110611ad257fe5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055601380546000190190555b600101611a97565b611b1f611bb9565b6001600160a01b0316611b3061145a565b6001600160a01b031614611b565760405162461bcd60e51b815260040161098590613136565b600f805460ff19811660ff90911615179055565b6001600160a01b038216600090815260146020526040812081611b8d8585610e27565b90508015611ba15750600101549050610e6a565b600092505050610e6a565b6000610e6a60028361200b565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611bf28261123c565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611c3482611bac565b611c505760405162461bcd60e51b8152600401610985906130ea565b60008281526008602090815260409091208251610a3d928401906125c6565b600082820183811015610eec5760405162461bcd60e51b815260040161098590612d89565b600082611ca357506000610e6a565b82820282848281611cb057fe5b0414610eec5760405162461bcd60e51b81526004016109859061305d565b610aa0828260405180602001604052806000815250612017565b6001600160a01b03841660009081526014602052604090206001810184905582611d10578181555b5050505050565b6000610e6a8261204a565b6000611d2d82611bac565b611d495760405162461bcd60e51b815260040161098590612ebc565b6000611d548361123c565b9050806001600160a01b0316846001600160a01b03161480611d8f5750836001600160a01b0316611d848461095e565b6001600160a01b0316145b80611d9f5750611d9f8185611922565b949350505050565b826001600160a01b0316611dba8261123c565b6001600160a01b031614611de05760405162461bcd60e51b81526004016109859061316b565b6001600160a01b038216611e065760405162461bcd60e51b815260040161098590612dc0565b611e11838383610a3d565b611e1c600082611bbd565b6001600160a01b0383166000908152600160205260409020611e3e908261204e565b506001600160a01b0382166000908152600160205260409020611e61908261205a565b50611e6e60028284612066565b5080826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000610eec838361207c565b6000808080611ed086866120c1565b9097909650945050505050565b8051610aa09060099060208401906125c6565b6000611d9f84848461211d565b611f08848484611da7565b611f148484848461217c565b6116535760405162461bcd60e51b815260040161098590612c31565b606081611f5557506040805180820190915260018152600360fc1b60208201526108bd565b8160005b8115611f6d57600101600a82049150611f59565b60008167ffffffffffffffff81118015611f8657600080fd5b506040519080825280601f01601f191660200182016040528015611fb1576020820181803683370190505b50859350905060001982015b831561200257600a840660300160f81b82828060019003935081518110611fe057fe5b60200101906001600160f81b031916908160001a905350600a84049350611fbd565b50949350505050565b6000610eec838361225b565b6120218383612273565b61202e600084848461217c565b610a3d5760405162461bcd60e51b815260040161098590612c31565b5490565b6000610eec8383612337565b6000610eec83836123fd565b6000611d9f84846001600160a01b038516612447565b8154600090821061209f5760405162461bcd60e51b815260040161098590612bef565b8260000182815481106120ae57fe5b9060005260206000200154905092915050565b8154600090819083106120e65760405162461bcd60e51b815260040161098590612fe6565b60008460000184815481106120f757fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b6000828152600184016020526040812054828161214d5760405162461bcd60e51b81526004016109859190612bdc565b5084600001600182038154811061216057fe5b9060005260206000209060020201600101549150509392505050565b6000612190846001600160a01b03166124de565b61219c57506001611d9f565b6000612224630a85bd0160e11b6121b1611bb9565b8887876040516024016121c79493929190612b50565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b0383818316178352505050506040518060600160405280603281526020016133ea603291396001600160a01b03881691906124e4565b905060008180602001905181019061223c9190612a23565b6001600160e01b031916630a85bd0160e11b1492505050949350505050565b60009081526001919091016020526040902054151590565b6001600160a01b0382166122995760405162461bcd60e51b815260040161098590613028565b6122a281611bac565b156122bf5760405162461bcd60e51b815260040161098590612d0e565b6122cb60008383610a3d565b6001600160a01b03821660009081526001602052604090206122ed908261205a565b506122fa60028284612066565b5060405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600081815260018301602052604081205480156123f3578354600019808301919081019060009087908390811061236a57fe5b906000526020600020015490508087600001848154811061238757fe5b6000918252602080832090910192909255828152600189810190925260409020908401905586548790806123b757fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610e6a565b6000915050610e6a565b6000612409838361225b565b61243f57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610e6a565b506000610e6a565b6000828152600184016020526040812054806124ac575050604080518082018252838152602080820184815286546001818101895560008981528481209551600290930290950191825591519082015586548684528188019092529290912055610eec565b828560000160018303815481106124bf57fe5b9060005260206000209060020201600101819055506000915050610eec565b3b151590565b6060611d9f8484600085856124f8856124de565b6125145760405162461bcd60e51b8152600401610985906132db565b600080866001600160a01b031685876040516125309190612af1565b60006040518083038185875af1925050503d806000811461256d576040519150601f19603f3d011682016040523d82523d6000602084013e612572565b606091505b509150915061258282828661258d565b979650505050505050565b6060831561259c575081610eec565b8251156125ac5782518084602001fd5b8160405162461bcd60e51b81526004016109859190612bdc565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826125fc5760008555612642565b82601f1061261557805160ff1916838001178555612642565b82800160010185558215612642579182015b82811115612642578251825591602001919060010190612627565b5061264e929150612652565b5090565b5b8082111561264e5760008155600101612653565b600067ffffffffffffffff83111561267b57fe5b61268e601f8401601f1916602001613365565b90508281528383830111156126a257600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146108bd57600080fd5b600082601f8301126126e0578081fd5b813560206126f56126f083613389565b613365565b82815281810190858301855b8581101561272a57612718898684358b0101612737565b84529284019290840190600101612701565b5090979650505050505050565b600082601f830112612747578081fd5b610eec83833560208501612667565b600060208284031215612767578081fd5b610eec826126b9565b60008060408385031215612782578081fd5b61278b836126b9565b9150612799602084016126b9565b90509250929050565b6000806000606084860312156127b6578081fd5b6127bf846126b9565b92506127cd602085016126b9565b9150604084013590509250925092565b600080600080608085870312156127f2578081fd5b6127fb856126b9565b9350612809602086016126b9565b925060408501359150606085013567ffffffffffffffff81111561282b578182fd5b8501601f8101871361283b578182fd5b61284a87823560208401612667565b91505092959194509250565b60008060408385031215612868578182fd5b612871836126b9565b915060208301358015158114612885578182fd5b809150509250929050565b600080604083850312156128a2578182fd5b6128ab836126b9565b946020939093013593505050565b600060208083850312156128cb578182fd5b823567ffffffffffffffff8111156128e1578283fd5b8301601f810185136128f1578283fd5b80356128ff6126f082613389565b818152838101908385018584028501860189101561291b578687fd5b8694505b8385101561294457612930816126b9565b83526001949094019391850191850161291f565b50979650505050505050565b60008060408385031215612962578182fd5b823567ffffffffffffffff80821115612979578384fd5b818501915085601f83011261298c578384fd5b8135602061299c6126f083613389565b82815281810190858301838502870184018b10156129b8578889fd5b8896505b848710156129da5780358352600196909601959183019183016129bc565b50965050860135925050808211156129f0578283fd5b506129fd858286016126d0565b9150509250929050565b600060208284031215612a18578081fd5b8135610eec816133d3565b600060208284031215612a34578081fd5b8151610eec816133d3565b600060208284031215612a50578081fd5b813567ffffffffffffffff811115612a66578182fd5b611d9f84828501612737565b600060208284031215612a83578081fd5b5035919050565b60008060408385031215612a9c578182fd5b82359150602083013567ffffffffffffffff811115612ab9578182fd5b6129fd85828601612737565b60008151808452612add8160208601602086016133a7565b601f01601f19169290920160200192915050565b60008251612b038184602087016133a7565b9190910192915050565b60008351612b1f8184602088016133a7565b835190830190612b338183602088016133a7565b01949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612b8390830184612ac5565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015612bc557835183529284019291840191600101612ba9565b50909695505050505050565b901515815260200190565b600060208252610eec6020830184612ac5565b60208082526022908201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526025908201527f596f7520617265206e6f742077686974656c697374656420627920746865206f6040820152643bb732b91760d91b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526024908201527f596f75206861766520616c7265616479207265736572766564207468652050616040820152636e64617360e01b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252602a908201527f507572636861736520776f756c6420657863656564206d617820737570706c79604082015269206f662050616e64617360b01b606082015260800190565b6020808252601f908201527f45746865722076616c75652073656e74206973206e6f7420636f727265637400604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252601c908201527f50616e64612073616c65206973206e6f74206163746976652079657400000000604082015260600190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526022908201527f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252602c908201527f4552433732314d657461646174613a2055524920736574206f66206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526026908201527f4d696e7420776f756c6420657863656564206d617820737570706c79206f662060408201526550616e64617360d01b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f43616e206e6f74206d696e74206d6f7265207468616e20313020746f6b656e7360408201526920617420612074696d6560b01b606082015260800190565b90815260200190565b60405181810167ffffffffffffffff8111828210171561338157fe5b604052919050565b600067ffffffffffffffff82111561339d57fe5b5060209081020190565b60005b838110156133c25781810151838201526020016133aa565b838111156116535750506000910152565b6001600160e01b03198116811461123957600080fdfe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e74657243616e206e6f74206d696e74206d6f7265207468616e20323520746f6b656e73207065722035206461797343616e206e6f74206d696e74206d6f7265207468616e20313020746f6b656e7320706572203520646179734552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea264697066735822122032f325e597e4982b020c3a7376f95cba40e3616b4f807326b98aa6c5da8900ff64736f6c63430007060033

Deployed Bytecode

0x6080604052600436106102e45760003560e01c80636460015011610190578063aa592f25116100dc578063e1487fb711610095578063f2fde38b1161006f578063f2fde38b1461082a578063f4de189d1461084a578063fa2f0eb51461086a578063fd93644d1461087f576102e4565b8063e1487fb7146107ca578063e985e9c5146107ea578063ebea38151461080a576102e4565b8063aa592f251461072b578063b794fae614610740578063b88d4fde14610755578063c549e6b914610775578063c87b56dd1461078a578063d1a2584f146107aa576102e4565b8063718ee8c1116101495780638da5cb5b116101235780638da5cb5b146106c157806395d89b41146106d6578063a22cb465146106eb578063a5183ae71461070b576102e4565b8063718ee8c11461068257806382242e4d146106975780638d859f3e146106ac576102e4565b806364600150146105ee5780636c0360eb1461060357806370a082311461061857806371189742146106385780637146bd0814610658578063715018a61461066d576102e4565b806323b872dd1161024f5780633e0e4c01116102085780634945d2c2116101e25780634945d2c21461056e5780634f6ccce71461058e57806355f804b3146105ae5780636352211e146105ce576102e4565b80633e0e4c011461050e57806342842e0e1461052e578063463300bd1461054e576102e4565b806323b872dd1461045957806324f2a7d7146104795780632ac23cd3146104995780632b9c9cdd146104b95780632f745c59146104d95780633ccfd60b146104f9576102e4565b80631360a5c7116102a15780631360a5c7146103c7578063154c9e2d146103dc578063162094c4146103f1578063171db5111461041157806318160ddd146104245780631d4814cc14610439576102e4565b806301ffc9a7146102e957806306fdde031461031f578063071b58a614610341578063081812fc14610363578063095ea7b3146103905780631056b16d146103b2575b600080fd5b3480156102f557600080fd5b50610309610304366004612a07565b61089f565b6040516103169190612bd1565b60405180910390f35b34801561032b57600080fd5b506103346108c2565b6040516103169190612bdc565b34801561034d57600080fd5b50610356610958565b604051610316919061335c565b34801561036f57600080fd5b5061038361037e366004612a72565b61095e565b6040516103169190612b3c565b34801561039c57600080fd5b506103b06103ab366004612890565b6109aa565b005b3480156103be57600080fd5b50610356610a42565b3480156103d357600080fd5b50610356610a48565b3480156103e857600080fd5b50610309610a4e565b3480156103fd57600080fd5b506103b061040c366004612a8a565b610a57565b6103b061041f366004612a8a565b610aa4565b34801561043057600080fd5b50610356610d46565b34801561044557600080fd5b506103b0610454366004612950565b610d57565b34801561046557600080fd5b506103b06104743660046127a2565b610dda565b34801561048557600080fd5b50610309610494366004612756565b610e12565b3480156104a557600080fd5b506103096104b4366004612890565b610e27565b3480156104c557600080fd5b506103566104d4366004612756565b610e70565b3480156104e557600080fd5b506103566104f4366004612890565b610eca565b34801561050557600080fd5b506103b0610ef3565b34801561051a57600080fd5b506103b0610529366004612a8a565b610f61565b34801561053a57600080fd5b506103b06105493660046127a2565b6110e1565b34801561055a57600080fd5b50610309610569366004612756565b6110fc565b34801561057a57600080fd5b506103b06105893660046128b9565b611111565b34801561059a57600080fd5b506103566105a9366004612a72565b6111db565b3480156105ba57600080fd5b506103b06105c9366004612a3f565b6111f1565b3480156105da57600080fd5b506103836105e9366004612a72565b61123c565b3480156105fa57600080fd5b506103b0611264565b34801561060f57600080fd5b506103346112c2565b34801561062457600080fd5b50610356610633366004612756565b611323565b34801561064457600080fd5b506103b0610653366004612a72565b61136c565b34801561066457600080fd5b506103566113b0565b34801561067957600080fd5b506103b06113b6565b34801561068e57600080fd5b5061035661143f565b3480156106a357600080fd5b50610309611445565b3480156106b857600080fd5b50610356611454565b3480156106cd57600080fd5b5061038361145a565b3480156106e257600080fd5b50610334611469565b3480156106f757600080fd5b506103b0610706366004612856565b6114ca565b34801561071757600080fd5b506103b0610726366004612a72565b611598565b34801561073757600080fd5b506103096115dc565b34801561074c57600080fd5b506103566115ea565b34801561076157600080fd5b506103b06107703660046127dd565b61161a565b34801561078157600080fd5b50610356611659565b34801561079657600080fd5b506103346107a5366004612a72565b61165f565b3480156107b657600080fd5b506103b06107c53660046128b9565b6117a3565b3480156107d657600080fd5b506103b06107e53660046128b9565b611860565b3480156107f657600080fd5b50610309610805366004612770565b611922565b34801561081657600080fd5b506103b0610825366004612a72565b611950565b34801561083657600080fd5b506103b0610845366004612756565b611994565b34801561085657600080fd5b506103b06108653660046128b9565b611a55565b34801561087657600080fd5b506103b0611b17565b34801561088b57600080fd5b5061035661089a366004612890565b611b6a565b6001600160e01b0319811660009081526020819052604090205460ff165b919050565b60068054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561094e5780601f106109235761010080835404028352916020019161094e565b820191906000526020600020905b81548152906001019060200180831161093157829003601f168201915b5050505050905090565b60125481565b600061096982611bac565b61098e5760405162461bcd60e51b81526004016109859061309e565b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b60006109b58261123c565b9050806001600160a01b0316836001600160a01b031614156109e95760405162461bcd60e51b815260040161098590613203565b806001600160a01b03166109fb611bb9565b6001600160a01b03161480610a175750610a1781610805611bb9565b610a335760405162461bcd60e51b815260040161098590612f08565b610a3d8383611bbd565b505050565b600d5481565b60135481565b600f5460ff1681565b610a5f611bb9565b6001600160a01b0316610a7061145a565b6001600160a01b031614610a965760405162461bcd60e51b815260040161098590613136565b610aa08282611c2b565b5050565b4260008367ffffffffffffffff81118015610abe57600080fd5b50604051908082528060200260200182016040528015610ae8578160200160208202803683370190505b50600f5490915060ff16610b0e5760405162461bcd60e51b815260040161098590612f65565b6000610b1a3384611b6a565b90506000610b283385610e27565b600f5490915060609062010000900460ff1615610c10576000610b4a33610e70565b905060008111610b6c5760405162461bcd60e51b815260040161098590612cc9565b80600a1415610b95576040518060600160405280602b8152602001613447602b91399150610bba565b8060191415610bba576040518060600160405280602b815260200161341c602b913991505b8181891115610bdc5760405162461bcd60e51b81526004016109859190612bdc565b5080610be88986611c6f565b11158290610c095760405162461bcd60e51b81526004016109859190612bdc565b5050610c32565b600c54871115610c325760405162461bcd60e51b815260040161098590613312565b600d54610c4788610c41610d46565b90611c6f565b1115610c655760405162461bcd60e51b815260040161098590612e3b565b600b543490610c749089611c94565b1115610c925760405162461bcd60e51b815260040161098590612e85565b60005b87811015610cf0576000610ca7610d46565b905080868381518110610cb657fe5b602002602001018181525050600d54610ccd610d46565b1015610ce757610cdd3382611cce565b610ce78189611c2b565b50600101610c95565b50610d0633610cff8986611c6f565b8488611ce8565b7f69b7bd0a565a53b21c81a72f7ef2efb0f2fc115663aa76e3dcdc88269cb59d1084604051610d359190612b8d565b60405180910390a150505050505050565b6000610d526002611d17565b905090565b610d5f611bb9565b6001600160a01b0316610d7061145a565b6001600160a01b031614610d965760405162461bcd60e51b815260040161098590613136565b60005b8251811015610a3d57610dd2838281518110610db157fe5b6020026020010151838381518110610dc557fe5b6020026020010151611c2b565b600101610d99565b610deb610de5611bb9565b82611d22565b610e075760405162461bcd60e51b81526004016109859061328a565b610a3d838383611da7565b60106020526000908152604090205460ff1681565b6001600160a01b0382166000908152601460205260408120805482610e4a6115ea565b9050808286031015610e625760019350505050610e6a565b600093505050505b92915050565b6001600160a01b03811660009081526010602052604081205460ff1615610e995750600a6108bd565b6001600160a01b03821660009081526011602052604090205460ff1615610ec2575060196108bd565b506000919050565b6001600160a01b0382166000908152600160205260408120610eec9083611eb5565b9392505050565b610efb611bb9565b6001600160a01b0316610f0c61145a565b6001600160a01b031614610f325760405162461bcd60e51b815260040161098590613136565b6040514790339082156108fc029083906000818181858888f19350505050158015610aa0573d6000803e3d6000fd5b610f69611bb9565b6001600160a01b0316610f7a61145a565b6001600160a01b031614610fa05760405162461bcd60e51b815260040161098590613136565b600f54610100900460ff16610fc75760405162461bcd60e51b815260040161098590612d45565b60008267ffffffffffffffff81118015610fe057600080fd5b5060405190808252806020026020018201604052801561100a578160200160208202803683370190505b509050600d5461101c84610c41610d46565b111561103a5760405162461bcd60e51b815260040161098590613244565b60005b8381101561109857600061104f610d46565b90508083838151811061105e57fe5b602002602001018181525050600d54611075610d46565b101561108f576110853382611cce565b61108f8185611c2b565b5060010161103d565b50600f805461ff00191690556040517f69b7bd0a565a53b21c81a72f7ef2efb0f2fc115663aa76e3dcdc88269cb59d10906110d4908390612b8d565b60405180910390a1505050565b610a3d8383836040518060200160405280600081525061161a565b60116020526000908152604090205460ff1681565b611119611bb9565b6001600160a01b031661112a61145a565b6001600160a01b0316146111505760405162461bcd60e51b815260040161098590613136565b60005b81518160ff161015610aa05761117e828260ff168151811061117157fe5b6020026020010151610e70565b6111d357600160116000848460ff168151811061119757fe5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790556013805460010190555b600101611153565b6000806111e9600284611ec1565b509392505050565b6111f9611bb9565b6001600160a01b031661120a61145a565b6001600160a01b0316146112305760405162461bcd60e51b815260040161098590613136565b61123981611edd565b50565b6000610e6a826040518060600160405280602981526020016134726029913960029190611ef0565b61126c611bb9565b6001600160a01b031661127d61145a565b6001600160a01b0316146112a35760405162461bcd60e51b815260040161098590613136565b600f805462ff0000198116620100009182900460ff1615909102179055565b60098054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561094e5780601f106109235761010080835404028352916020019161094e565b60006001600160a01b03821661134b5760405162461bcd60e51b815260040161098590612f9c565b6001600160a01b0382166000908152600160205260409020610e6a90611d17565b611374611bb9565b6001600160a01b031661138561145a565b6001600160a01b0316146113ab5760405162461bcd60e51b815260040161098590613136565b600c55565b600c5481565b6113be611bb9565b6001600160a01b03166113cf61145a565b6001600160a01b0316146113f55760405162461bcd60e51b815260040161098590613136565b600a546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600a80546001600160a01b0319169055565b600d5490565b600f5462010000900460ff1681565b600b5481565b600a546001600160a01b031690565b60078054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281526060939092909183018282801561094e5780601f106109235761010080835404028352916020019161094e565b6114d2611bb9565b6001600160a01b0316826001600160a01b031614156115035760405162461bcd60e51b815260040161098590612e04565b8060056000611510611bb9565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155611554611bb9565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161158c9190612bd1565b60405180910390a35050565b6115a0611bb9565b6001600160a01b03166115b161145a565b6001600160a01b0316146115d75760405162461bcd60e51b815260040161098590613136565b600d55565b600f54610100900460ff1681565b6000806116036018600e54611c9490919063ffffffff16565b9050600061161382610e10611c94565b9250505090565b61162b611625611bb9565b83611d22565b6116475760405162461bcd60e51b81526004016109859061328a565b61165384848484611efd565b50505050565b600e5481565b606061166a82611bac565b6116865760405162461bcd60e51b8152600401610985906131b4565b60008281526008602090815260408083208054825160026001831615610100026000190190921691909104601f8101859004850282018501909352828152929091908301828280156117195780601f106116ee57610100808354040283529160200191611719565b820191906000526020600020905b8154815290600101906020018083116116fc57829003601f168201915b50505050509050600061172a6112c2565b905080516000141561173e575090506108bd565b815115611770578082604051602001611758929190612b0d565b604051602081830303815290604052925050506108bd565b8061177a85611f30565b60405160200161178b929190612b0d565b60405160208183030381529060405292505050919050565b6117ab611bb9565b6001600160a01b03166117bc61145a565b6001600160a01b0316146117e25760405162461bcd60e51b815260040161098590613136565b60005b81518160ff161015610aa057611803828260ff168151811061117157fe5b61185857600160106000848460ff168151811061181c57fe5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790556012805460010190555b6001016117e5565b611868611bb9565b6001600160a01b031661187961145a565b6001600160a01b03161461189f5760405162461bcd60e51b815260040161098590613136565b60005b81518160ff161015610aa0576118c0828260ff168151811061117157fe5b600a141561191a57600060106000848460ff16815181106118dd57fe5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055601280546000190190555b6001016118a2565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b611958611bb9565b6001600160a01b031661196961145a565b6001600160a01b03161461198f5760405162461bcd60e51b815260040161098590613136565b600e55565b61199c611bb9565b6001600160a01b03166119ad61145a565b6001600160a01b0316146119d35760405162461bcd60e51b815260040161098590613136565b6001600160a01b0381166119f95760405162461bcd60e51b815260040161098590612c83565b600a546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b611a5d611bb9565b6001600160a01b0316611a6e61145a565b6001600160a01b031614611a945760405162461bcd60e51b815260040161098590613136565b60005b81518160ff161015610aa057611ab5828260ff168151811061117157fe5b60191415611b0f57600060116000848460ff1681518110611ad257fe5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055601380546000190190555b600101611a97565b611b1f611bb9565b6001600160a01b0316611b3061145a565b6001600160a01b031614611b565760405162461bcd60e51b815260040161098590613136565b600f805460ff19811660ff90911615179055565b6001600160a01b038216600090815260146020526040812081611b8d8585610e27565b90508015611ba15750600101549050610e6a565b600092505050610e6a565b6000610e6a60028361200b565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611bf28261123c565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611c3482611bac565b611c505760405162461bcd60e51b8152600401610985906130ea565b60008281526008602090815260409091208251610a3d928401906125c6565b600082820183811015610eec5760405162461bcd60e51b815260040161098590612d89565b600082611ca357506000610e6a565b82820282848281611cb057fe5b0414610eec5760405162461bcd60e51b81526004016109859061305d565b610aa0828260405180602001604052806000815250612017565b6001600160a01b03841660009081526014602052604090206001810184905582611d10578181555b5050505050565b6000610e6a8261204a565b6000611d2d82611bac565b611d495760405162461bcd60e51b815260040161098590612ebc565b6000611d548361123c565b9050806001600160a01b0316846001600160a01b03161480611d8f5750836001600160a01b0316611d848461095e565b6001600160a01b0316145b80611d9f5750611d9f8185611922565b949350505050565b826001600160a01b0316611dba8261123c565b6001600160a01b031614611de05760405162461bcd60e51b81526004016109859061316b565b6001600160a01b038216611e065760405162461bcd60e51b815260040161098590612dc0565b611e11838383610a3d565b611e1c600082611bbd565b6001600160a01b0383166000908152600160205260409020611e3e908261204e565b506001600160a01b0382166000908152600160205260409020611e61908261205a565b50611e6e60028284612066565b5080826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000610eec838361207c565b6000808080611ed086866120c1565b9097909650945050505050565b8051610aa09060099060208401906125c6565b6000611d9f84848461211d565b611f08848484611da7565b611f148484848461217c565b6116535760405162461bcd60e51b815260040161098590612c31565b606081611f5557506040805180820190915260018152600360fc1b60208201526108bd565b8160005b8115611f6d57600101600a82049150611f59565b60008167ffffffffffffffff81118015611f8657600080fd5b506040519080825280601f01601f191660200182016040528015611fb1576020820181803683370190505b50859350905060001982015b831561200257600a840660300160f81b82828060019003935081518110611fe057fe5b60200101906001600160f81b031916908160001a905350600a84049350611fbd565b50949350505050565b6000610eec838361225b565b6120218383612273565b61202e600084848461217c565b610a3d5760405162461bcd60e51b815260040161098590612c31565b5490565b6000610eec8383612337565b6000610eec83836123fd565b6000611d9f84846001600160a01b038516612447565b8154600090821061209f5760405162461bcd60e51b815260040161098590612bef565b8260000182815481106120ae57fe5b9060005260206000200154905092915050565b8154600090819083106120e65760405162461bcd60e51b815260040161098590612fe6565b60008460000184815481106120f757fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b6000828152600184016020526040812054828161214d5760405162461bcd60e51b81526004016109859190612bdc565b5084600001600182038154811061216057fe5b9060005260206000209060020201600101549150509392505050565b6000612190846001600160a01b03166124de565b61219c57506001611d9f565b6000612224630a85bd0160e11b6121b1611bb9565b8887876040516024016121c79493929190612b50565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b0383818316178352505050506040518060600160405280603281526020016133ea603291396001600160a01b03881691906124e4565b905060008180602001905181019061223c9190612a23565b6001600160e01b031916630a85bd0160e11b1492505050949350505050565b60009081526001919091016020526040902054151590565b6001600160a01b0382166122995760405162461bcd60e51b815260040161098590613028565b6122a281611bac565b156122bf5760405162461bcd60e51b815260040161098590612d0e565b6122cb60008383610a3d565b6001600160a01b03821660009081526001602052604090206122ed908261205a565b506122fa60028284612066565b5060405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600081815260018301602052604081205480156123f3578354600019808301919081019060009087908390811061236a57fe5b906000526020600020015490508087600001848154811061238757fe5b6000918252602080832090910192909255828152600189810190925260409020908401905586548790806123b757fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610e6a565b6000915050610e6a565b6000612409838361225b565b61243f57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610e6a565b506000610e6a565b6000828152600184016020526040812054806124ac575050604080518082018252838152602080820184815286546001818101895560008981528481209551600290930290950191825591519082015586548684528188019092529290912055610eec565b828560000160018303815481106124bf57fe5b9060005260206000209060020201600101819055506000915050610eec565b3b151590565b6060611d9f8484600085856124f8856124de565b6125145760405162461bcd60e51b8152600401610985906132db565b600080866001600160a01b031685876040516125309190612af1565b60006040518083038185875af1925050503d806000811461256d576040519150601f19603f3d011682016040523d82523d6000602084013e612572565b606091505b509150915061258282828661258d565b979650505050505050565b6060831561259c575081610eec565b8251156125ac5782518084602001fd5b8160405162461bcd60e51b81526004016109859190612bdc565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826125fc5760008555612642565b82601f1061261557805160ff1916838001178555612642565b82800160010185558215612642579182015b82811115612642578251825591602001919060010190612627565b5061264e929150612652565b5090565b5b8082111561264e5760008155600101612653565b600067ffffffffffffffff83111561267b57fe5b61268e601f8401601f1916602001613365565b90508281528383830111156126a257600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146108bd57600080fd5b600082601f8301126126e0578081fd5b813560206126f56126f083613389565b613365565b82815281810190858301855b8581101561272a57612718898684358b0101612737565b84529284019290840190600101612701565b5090979650505050505050565b600082601f830112612747578081fd5b610eec83833560208501612667565b600060208284031215612767578081fd5b610eec826126b9565b60008060408385031215612782578081fd5b61278b836126b9565b9150612799602084016126b9565b90509250929050565b6000806000606084860312156127b6578081fd5b6127bf846126b9565b92506127cd602085016126b9565b9150604084013590509250925092565b600080600080608085870312156127f2578081fd5b6127fb856126b9565b9350612809602086016126b9565b925060408501359150606085013567ffffffffffffffff81111561282b578182fd5b8501601f8101871361283b578182fd5b61284a87823560208401612667565b91505092959194509250565b60008060408385031215612868578182fd5b612871836126b9565b915060208301358015158114612885578182fd5b809150509250929050565b600080604083850312156128a2578182fd5b6128ab836126b9565b946020939093013593505050565b600060208083850312156128cb578182fd5b823567ffffffffffffffff8111156128e1578283fd5b8301601f810185136128f1578283fd5b80356128ff6126f082613389565b818152838101908385018584028501860189101561291b578687fd5b8694505b8385101561294457612930816126b9565b83526001949094019391850191850161291f565b50979650505050505050565b60008060408385031215612962578182fd5b823567ffffffffffffffff80821115612979578384fd5b818501915085601f83011261298c578384fd5b8135602061299c6126f083613389565b82815281810190858301838502870184018b10156129b8578889fd5b8896505b848710156129da5780358352600196909601959183019183016129bc565b50965050860135925050808211156129f0578283fd5b506129fd858286016126d0565b9150509250929050565b600060208284031215612a18578081fd5b8135610eec816133d3565b600060208284031215612a34578081fd5b8151610eec816133d3565b600060208284031215612a50578081fd5b813567ffffffffffffffff811115612a66578182fd5b611d9f84828501612737565b600060208284031215612a83578081fd5b5035919050565b60008060408385031215612a9c578182fd5b82359150602083013567ffffffffffffffff811115612ab9578182fd5b6129fd85828601612737565b60008151808452612add8160208601602086016133a7565b601f01601f19169290920160200192915050565b60008251612b038184602087016133a7565b9190910192915050565b60008351612b1f8184602088016133a7565b835190830190612b338183602088016133a7565b01949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612b8390830184612ac5565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015612bc557835183529284019291840191600101612ba9565b50909695505050505050565b901515815260200190565b600060208252610eec6020830184612ac5565b60208082526022908201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526025908201527f596f7520617265206e6f742077686974656c697374656420627920746865206f6040820152643bb732b91760d91b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526024908201527f596f75206861766520616c7265616479207265736572766564207468652050616040820152636e64617360e01b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252602a908201527f507572636861736520776f756c6420657863656564206d617820737570706c79604082015269206f662050616e64617360b01b606082015260800190565b6020808252601f908201527f45746865722076616c75652073656e74206973206e6f7420636f727265637400604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252601c908201527f50616e64612073616c65206973206e6f74206163746976652079657400000000604082015260600190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526022908201527f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252602c908201527f4552433732314d657461646174613a2055524920736574206f66206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526026908201527f4d696e7420776f756c6420657863656564206d617820737570706c79206f662060408201526550616e64617360d01b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f43616e206e6f74206d696e74206d6f7265207468616e20313020746f6b656e7360408201526920617420612074696d6560b01b606082015260800190565b90815260200190565b60405181810167ffffffffffffffff8111828210171561338157fe5b604052919050565b600067ffffffffffffffff82111561339d57fe5b5060209081020190565b60005b838110156133c25781810151838201526020016133aa565b838111156116535750506000910152565b6001600160e01b03198116811461123957600080fdfe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e74657243616e206e6f74206d696e74206d6f7265207468616e20323520746f6b656e73207065722035206461797343616e206e6f74206d696e74206d6f7265207468616e20313020746f6b656e7320706572203520646179734552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea264697066735822122032f325e597e4982b020c3a7376f95cba40e3616b4f807326b98aa6c5da8900ff64736f6c63430007060033

Deployed Bytecode Sourcemap

27094:7227:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2454:150;;;;;;;;;;-1:-1:-1;2454:150:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18982:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;27542:35::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;20926:219::-;;;;;;;;;;-1:-1:-1;20926:219:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;20520:400::-;;;;;;;;;;-1:-1:-1;20520:400:0;;;;;:::i;:::-;;:::i;:::-;;27256:33;;;;;;;;;;;;;:::i;27584:35::-;;;;;;;;;;;;;:::i;27326:27::-;;;;;;;;;;;;;:::i;29787:131::-;;;;;;;;;;-1:-1:-1;29787:131:0;;;;;:::i;:::-;;:::i;31820:1818::-;;;;;;:::i;:::-;;:::i;20219:117::-;;;;;;;;;;;;;:::i;29924:220::-;;;;;;;;;;-1:-1:-1;29924:220:0;;;;;:::i;:::-;;:::i;21620:303::-;;;;;;;;;;-1:-1:-1;21620:303:0;;;;;:::i;:::-;;:::i;27438:45::-;;;;;;;;;;-1:-1:-1;27438:45:0;;;;;:::i;:::-;;:::i;28362:398::-;;;;;;;;;;-1:-1:-1;28362:398:0;;;;;:::i;:::-;;:::i;30262:255::-;;;;;;;;;;-1:-1:-1;30262:255:0;;;;;:::i;:::-;;:::i;20051:162::-;;;;;;;;;;-1:-1:-1;20051:162:0;;;;;:::i;:::-;;:::i;29058:131::-;;;;;;;;;;;;;:::i;33644:674::-;;;;;;;;;;-1:-1:-1;33644:674:0;;;;;:::i;:::-;;:::i;21929:151::-;;;;;;;;;;-1:-1:-1;21929:151:0;;;;;:::i;:::-;;:::i;27490:45::-;;;;;;;;;;-1:-1:-1;27490:45:0;;;;;:::i;:::-;;:::i;30845:315::-;;;;;;;;;;-1:-1:-1;30845:315:0;;;;;:::i;:::-;;:::i;20342:172::-;;;;;;;;;;-1:-1:-1;20342:172:0;;;;;:::i;:::-;;:::i;29682:99::-;;;;;;;;;;-1:-1:-1;29682:99:0;;;;;:::i;:::-;;:::i;18799:177::-;;;;;;;;;;-1:-1:-1;18799:177:0;;;;;:::i;:::-;;:::i;30150:106::-;;;;;;;;;;;;;:::i;19948:97::-;;;;;;;;;;;;;:::i;18572:221::-;;;;;;;;;;-1:-1:-1;18572:221:0;;;;;:::i;:::-;;:::i;29569:107::-;;;;;;;;;;-1:-1:-1;29569:107:0;;;;;:::i;:::-;;:::i;27220:29::-;;;;;;;;;;;;;:::i;26689:148::-;;;;;;;;;;;;;:::i;29474:89::-;;;;;;;;;;;;;:::i;27394:37::-;;;;;;;;;;;;;:::i;27173:40::-;;;;;;;;;;;;;:::i;26470:87::-;;;;;;;;;;;;;:::i;19088:104::-;;;;;;;;;;;;;:::i;21151:293::-;;;;;;;;;;-1:-1:-1;21151:293:0;;;;;:::i;:::-;;:::i;29369:99::-;;;;;;;;;;-1:-1:-1;29369:99:0;;;;;:::i;:::-;;:::i;27360:27::-;;;;;;;;;;;;;:::i;27848:161::-;;;;;;;;;;;;;:::i;22086:285::-;;;;;;;;;;-1:-1:-1;22086:285:0;;;;;:::i;:::-;;:::i;27296:23::-;;;;;;;;;;;;;:::i;19394:548::-;;;;;;;;;;-1:-1:-1;19394:548:0;;;;;:::i;:::-;;:::i;30523:316::-;;;;;;;;;;-1:-1:-1;30523:316:0;;;;;:::i;:::-;;:::i;31166:321::-;;;;;;;;;;-1:-1:-1;31166:321:0;;;;;:::i;:::-;;:::i;21450:164::-;;;;;;;;;;-1:-1:-1;21450:164:0;;;;;:::i;:::-;;:::i;29286:77::-;;;;;;;;;;-1:-1:-1;29286:77:0;;;;;:::i;:::-;;:::i;26843:244::-;;;;;;;;;;-1:-1:-1;26843:244:0;;;;;:::i;:::-;;:::i;31493:321::-;;;;;;;;;;-1:-1:-1;31493:321:0;;;;;:::i;:::-;;:::i;29195:85::-;;;;;;;;;;;;;:::i;28015:341::-;;;;;;;;;;-1:-1:-1;28015:341:0;;;;;:::i;:::-;;:::i;2454:150::-;-1:-1:-1;;;;;;2563:33:0;;2539:4;2563:33;;;;;;;;;;;;;2454:150;;;;:::o;18982:100::-;19069:5;19062:12;;;;;;;;-1:-1:-1;;19062:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19036:13;;19062:12;;19069:5;;19062:12;;19069:5;19062:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18982:100;:::o;27542:35::-;;;;:::o;20926:219::-;21002:7;21030:16;21038:7;21030;:16::i;:::-;21022:73;;;;-1:-1:-1;;;21022:73:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;21113:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;21113:24:0;;20926:219::o;20520:400::-;20601:13;20617:23;20632:7;20617:14;:23::i;:::-;20601:39;;20665:5;-1:-1:-1;;;;;20659:11:0;:2;-1:-1:-1;;;;;20659:11:0;;;20651:57;;;;-1:-1:-1;;;20651:57:0;;;;;;;:::i;:::-;20743:5;-1:-1:-1;;;;;20727:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;20727:21:0;;:69;;;;20752:44;20776:5;20783:12;:10;:12::i;20752:44::-;20719:161;;;;-1:-1:-1;;;20719:161:0;;;;;;;:::i;:::-;20891:21;20900:2;20904:7;20891:8;:21::i;:::-;20520:400;;;:::o;27256:33::-;;;;:::o;27584:35::-;;;;:::o;27326:27::-;;;;;;:::o;29787:131::-;26614:12;:10;:12::i;:::-;-1:-1:-1;;;;;26603:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;26603:23:0;;26595:68;;;;-1:-1:-1;;;26595:68:0;;;;;;;:::i;:::-;29878:32:::1;29891:7;29900:9;29878:12;:32::i;:::-;29787:131:::0;;:::o;31820:1818::-;31935:15;31917;31994:14;31983:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31983:26:0;-1:-1:-1;32028:7:0;;31961:48;;-1:-1:-1;32028:7:0;;32020:48;;;;-1:-1:-1;;;32020:48:0;;;;;;;:::i;:::-;32079:24;32106:37;32123:10;32135:7;32106:16;:37::i;:::-;32079:64;;32154:11;32168:32;32180:10;32192:7;32168:11;:32::i;:::-;32246:18;;32154:46;;-1:-1:-1;32211:21:0;;32246:18;;;;;32243:731;;;32281:20;32304:25;32318:10;32304:13;:25::i;:::-;32281:48;;32370:1;32352:15;:19;32344:69;;;;-1:-1:-1;;;32344:69:0;;;;;;;:::i;:::-;32431:15;32450:2;32431:21;32428:251;;;32473:55;;;;;;;;;;;;;;;;;;;32428:251;;;32566:15;32585:2;32566:21;32563:116;;;32608:55;;;;;;;;;;;;;;;;;;;32563:116;32736:7;32701:33;;;;32693:51;;;;-1:-1:-1;;;32693:51:0;;;;;;;;:::i;:::-;-1:-1:-1;32810:15:0;32767:39;:14;32786:19;32767:18;:39::i;:::-;:58;;32827:7;32759:76;;;;;-1:-1:-1;;;32759:76:0;;;;;;;;:::i;:::-;;32243:731;;;;32903:12;;32885:14;:30;;32877:85;;;;-1:-1:-1;;;32877:85:0;;;;;;;:::i;:::-;33039:10;;33002:33;33020:14;33002:13;:11;:13::i;:::-;:17;;:33::i;:::-;:47;;32994:102;;;;-1:-1:-1;;;32994:102:0;;;;;;;:::i;:::-;33115:5;;33144:9;;33115:25;;33125:14;33115:9;:25::i;:::-;:38;;33107:82;;;;-1:-1:-1;;;33107:82:0;;;;;;;:::i;:::-;33204:6;33200:304;33220:14;33216:1;:18;33200:304;;;33256:14;33273:13;:11;:13::i;:::-;33256:30;;33312:9;33301:5;33307:1;33301:8;;;;;;;;;;;;;:20;;;;;33356:10;;33340:13;:11;:13::i;:::-;:26;33336:157;;;33387:32;33397:10;33409:9;33387;:32::i;:::-;33438:39;33451:9;33462:14;33438:12;:39::i;:::-;-1:-1:-1;33236:3:0;;33200:304;;;-1:-1:-1;33514:84:0;33529:10;33541:39;:14;33560:19;33541:18;:39::i;:::-;33582:6;33590:7;33514:14;:84::i;:::-;33614:16;33624:5;33614:16;;;;;;:::i;:::-;;;;;;;;31820:1818;;;;;;;:::o;20219:117::-;20280:7;20307:21;:12;:19;:21::i;:::-;20300:28;;20219:117;:::o;29924:220::-;26614:12;:10;:12::i;:::-;-1:-1:-1;;;;;26603:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;26603:23:0;;26595:68;;;;-1:-1:-1;;;26595:68:0;;;;;;;:::i;:::-;30038:6:::1;30034:103;30050:7;:14;30048:1;:16;30034:103;;;30087:38;30100:7;30108:1;30100:10;;;;;;;;;;;;;;30112:9;30122:1;30112:12;;;;;;;;;;;;;;30087;:38::i;:::-;30066:3;;30034:103;;21620:303:::0;21781:41;21800:12;:10;:12::i;:::-;21814:7;21781:18;:41::i;:::-;21773:103;;;;-1:-1:-1;;;21773:103:0;;;;;;;:::i;:::-;21887:28;21897:4;21903:2;21907:7;21887:9;:28::i;27438:45::-;;;;;;;;;;;;;;;:::o;28362:398::-;-1:-1:-1;;;;;28490:22:0;;28441:4;28490:22;;;:9;:22;;;;;28547;;28441:4;28599:12;:10;:12::i;:::-;28580:31;;28651:8;28635:13;28625:7;:23;:34;28622:131;;;28683:4;28676:11;;;;;;;28622:131;28736:5;28729:12;;;;;28362:398;;;;;:::o;30262:255::-;-1:-1:-1;;;;;30348:27:0;;30328:4;30348:27;;;:13;:27;;;;;;;;30345:68;;;-1:-1:-1;30399:2:0;30392:9;;30345:68;-1:-1:-1;;;;;30426:27:0;;;;;;:13;:27;;;;;;;;30423:68;;;-1:-1:-1;30477:2:0;30470:9;;30423:68;-1:-1:-1;30508:1:0;30262:255;;;:::o;20051:162::-;-1:-1:-1;;;;;20175:20:0;;20148:7;20175:20;;;:13;:20;;;;;:30;;20199:5;20175:23;:30::i;:::-;20168:37;20051:162;-1:-1:-1;;;20051:162:0:o;29058:131::-;26614:12;:10;:12::i;:::-;-1:-1:-1;;;;;26603:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;26603:23:0;;26595:68;;;;-1:-1:-1;;;26595:68:0;;;;;;;:::i;:::-;29153:28:::1;::::0;29121:21:::1;::::0;29153:10:::1;::::0;:28;::::1;;;::::0;29121:21;;29106:12:::1;29153:28:::0;29106:12;29153:28;29121:21;29153:10;:28;::::1;;;;;;;;;;;;;::::0;::::1;;;;33644:674:::0;26614:12;:10;:12::i;:::-;-1:-1:-1;;;;;26603:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;26603:23:0;;26595:68;;;;-1:-1:-1;;;26595:68:0;;;;;;;:::i;:::-;33747:8:::1;::::0;::::1;::::0;::::1;;;33739:57;;;;-1:-1:-1::0;;;33739:57:0::1;;;;;;;:::i;:::-;33807:19;33840:5;33829:17;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;33829:17:0::1;;33807:39;;33893:10;;33865:24;33883:5;33865:13;:11;:13::i;:24::-;:38;;33857:89;;;;-1:-1:-1::0;;;33857:89:0::1;;;;;;;:::i;:::-;33961:6;33957:295;33977:5;33973:1;:9;33957:295;;;34004:14;34021:13;:11;:13::i;:::-;34004:30;;34060:9;34049:5;34055:1;34049:8;;;;;;;;;;;;;:20;;;::::0;::::1;34104:10;;34088:13;:11;:13::i;:::-;:26;34084:157;;;34135:32;34145:10;34157:9;34135;:32::i;:::-;34186:39;34199:9;34210:14;34186:12;:39::i;:::-;-1:-1:-1::0;33984:3:0::1;;33957:295;;;-1:-1:-1::0;34262:8:0::1;:16:::0;;-1:-1:-1;;34262:16:0::1;::::0;;34294::::1;::::0;::::1;::::0;::::1;::::0;34304:5;;34294:16:::1;:::i;:::-;;;;;;;;26674:1;33644:674:::0;;:::o;21929:151::-;22033:39;22050:4;22056:2;22060:7;22033:39;;;;;;;;;;;;:16;:39::i;27490:45::-;;;;;;;;;;;;;;;:::o;30845:315::-;26614:12;:10;:12::i;:::-;-1:-1:-1;;;;;26603:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;26603:23:0;;26595:68;;;;-1:-1:-1;;;26595:68:0;;;;;;;:::i;:::-;30937:7:::1;30933:220;30950:12;:19;30948:1;:21;;;30933:220;;;30992:30;31006:12;31019:1;31006:15;;;;;;;;;;;;;;;;30992:13;:30::i;:::-;30989:153;;31081:4;31048:13;:30;31062:12;31075:1;31062:15;;;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;31048:30:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;31048:30:0;:37;;-1:-1:-1;;31048:37:0::1;::::0;::::1;;::::0;;;::::1;::::0;;31104:20:::1;:22:::0;;-1:-1:-1;31104:22:0::1;::::0;;30989:153:::1;30970:3;;30933:220;;20342:172:::0;20417:7;;20459:22;:12;20475:5;20459:15;:22::i;:::-;-1:-1:-1;20437:44:0;20342:172;-1:-1:-1;;;20342:172:0:o;29682:99::-;26614:12;:10;:12::i;:::-;-1:-1:-1;;;;;26603:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;26603:23:0;;26595:68;;;;-1:-1:-1;;;26595:68:0;;;;;;;:::i;:::-;29753:20:::1;29765:7;29753:11;:20::i;:::-;29682:99:::0;:::o;18799:177::-;18871:7;18898:70;18915:7;18898:70;;;;;;;;;;;;;;;;;:12;;:70;:16;:70::i;30150:106::-;26614:12;:10;:12::i;:::-;-1:-1:-1;;;;;26603:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;26603:23:0;;26595:68;;;;-1:-1:-1;;;26595:68:0;;;;;;;:::i;:::-;30230:18:::1;::::0;;-1:-1:-1;;30208:40:0;::::1;30230:18:::0;;;;::::1;;;30229:19;30208:40:::0;;::::1;;::::0;;30150:106::o;19948:97::-;20029:8;20022:15;;;;;;;;-1:-1:-1;;20022:15:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19996:13;;20022:15;;20029:8;;20022:15;;20029:8;20022:15;;;;;;;;;;;;;;;;;;;;;;;;18572:221;18644:7;-1:-1:-1;;;;;18672:19:0;;18664:74;;;;-1:-1:-1;;;18664:74:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;18756:20:0;;;;;;:13;:20;;;;;:29;;:27;:29::i;29569:107::-;26614:12;:10;:12::i;:::-;-1:-1:-1;;;;;26603:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;26603:23:0;;26595:68;;;;-1:-1:-1;;;26595:68:0;;;;;;;:::i;:::-;29642:12:::1;:26:::0;29569:107::o;27220:29::-;;;;:::o;26689:148::-;26614:12;:10;:12::i;:::-;-1:-1:-1;;;;;26603:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;26603:23:0;;26595:68;;;;-1:-1:-1;;;26595:68:0;;;;;;;:::i;:::-;26780:6:::1;::::0;26759:40:::1;::::0;26796:1:::1;::::0;-1:-1:-1;;;;;26780:6:0::1;::::0;26759:40:::1;::::0;26796:1;;26759:40:::1;26810:6;:19:::0;;-1:-1:-1;;;;;;26810:19:0::1;::::0;;26689:148::o;29474:89::-;29545:10;;29474:89;:::o;27394:37::-;;;;;;;;;:::o;27173:40::-;;;;:::o;26470:87::-;26543:6;;-1:-1:-1;;;;;26543:6:0;26470:87;:::o;19088:104::-;19177:7;19170:14;;;;;;;;-1:-1:-1;;19170:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19144:13;;19170:14;;19177:7;;19170:14;;19177:7;19170:14;;;;;;;;;;;;;;;;;;;;;;;;21151:293;21266:12;:10;:12::i;:::-;-1:-1:-1;;;;;21254:24:0;:8;-1:-1:-1;;;;;21254:24:0;;;21246:62;;;;-1:-1:-1;;;21246:62:0;;;;;;;:::i;:::-;21364:8;21319:18;:32;21338:12;:10;:12::i;:::-;-1:-1:-1;;;;;21319:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;21319:32:0;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;21319:53:0;;;;;;;;;;;21403:12;:10;:12::i;:::-;-1:-1:-1;;;;;21388:48:0;;21427:8;21388:48;;;;;;:::i;:::-;;;;;;;;21151:293;;:::o;29369:99::-;26614:12;:10;:12::i;:::-;-1:-1:-1;;;;;26603:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;26603:23:0;;26595:68;;;;-1:-1:-1;;;26595:68:0;;;;;;;:::i;:::-;29438:10:::1;:22:::0;29369:99::o;27360:27::-;;;;;;;;;:::o;27848:161::-;27890:7;27910:10;27923:12;27932:2;27923:4;;:8;;:12;;;;:::i;:::-;27910:25;-1:-1:-1;27946:12:0;27961:15;27910:25;27971:4;27961:9;:15::i;:::-;27946:30;-1:-1:-1;;;27848:161:0;:::o;22086:285::-;22218:41;22237:12;:10;:12::i;:::-;22251:7;22218:18;:41::i;:::-;22210:103;;;;-1:-1:-1;;;22210:103:0;;;;;;;:::i;:::-;22324:39;22338:4;22344:2;22348:7;22357:5;22324:13;:39::i;:::-;22086:285;;;;:::o;27296:23::-;;;;:::o;19394:548::-;19467:13;19501:16;19509:7;19501;:16::i;:::-;19493:76;;;;-1:-1:-1;;;19493:76:0;;;;;;;:::i;:::-;19580:23;19606:19;;;:10;:19;;;;;;;;19580:45;;;;;;;;;;;-1:-1:-1;;19580:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;19606:19;;19580:45;;;19606:19;19580:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19636:18;19657:9;:7;:9::i;:::-;19636:30;;19687:4;19681:18;19703:1;19681:23;19677:72;;;-1:-1:-1;19728:9:0;-1:-1:-1;19721:16:0;;19677:72;19763:23;;:27;19759:108;;19838:4;19844:9;19821:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;19807:48;;;;;;19759:108;19908:4;19914:18;:7;:16;:18::i;:::-;19891:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;19877:57;;;;19394:548;;;:::o;30523:316::-;26614:12;:10;:12::i;:::-;-1:-1:-1;;;;;26603:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;26603:23:0;;26595:68;;;;-1:-1:-1;;;26595:68:0;;;;;;;:::i;:::-;30615:7:::1;30611:221;30628:12;:19;30626:1;:21;;;30611:221;;;30671:30;30685:12;30698:1;30685:15;;;;;;;;;30671:30;30668:153;;30760:4;30727:13;:30;30741:12;30754:1;30741:15;;;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;30727:30:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;30727:30:0;:37;;-1:-1:-1;;30727:37:0::1;::::0;::::1;;::::0;;;::::1;::::0;;30783:20:::1;:22:::0;;-1:-1:-1;30783:22:0::1;::::0;;30668:153:::1;30648:3;;30611:221;;31166:321:::0;26614:12;:10;:12::i;:::-;-1:-1:-1;;;;;26603:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;26603:23:0;;26595:68;;;;-1:-1:-1;;;26595:68:0;;;;;;;:::i;:::-;31261:7:::1;31257:223;31274:12;:19;31272:1;:21;;;31257:223;;;31317:30;31331:12;31344:1;31331:15;;;;;;;;;31317:30;31351:2;31317:36;31314:155;;;31407:5;31374:13;:30;31388:12;31401:1;31388:15;;;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;31374:30:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;31374:30:0;:38;;-1:-1:-1;;31374:38:0::1;::::0;::::1;;::::0;;;::::1;::::0;;31431:20:::1;:22:::0;;-1:-1:-1;;31431:22:0;;;31314:155:::1;31294:3;;31257:223;;21450:164:::0;-1:-1:-1;;;;;21571:25:0;;;21547:4;21571:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;21450:164::o;29286:77::-;26614:12;:10;:12::i;:::-;-1:-1:-1;;;;;26603:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;26603:23:0;;26595:68;;;;-1:-1:-1;;;26595:68:0;;;;;;;:::i;:::-;29343:4:::1;:12:::0;29286:77::o;26843:244::-;26614:12;:10;:12::i;:::-;-1:-1:-1;;;;;26603:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;26603:23:0;;26595:68;;;;-1:-1:-1;;;26595:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;26932:22:0;::::1;26924:73;;;;-1:-1:-1::0;;;26924:73:0::1;;;;;;;:::i;:::-;27034:6;::::0;27013:38:::1;::::0;-1:-1:-1;;;;;27013:38:0;;::::1;::::0;27034:6:::1;::::0;27013:38:::1;::::0;27034:6:::1;::::0;27013:38:::1;27062:6;:17:::0;;-1:-1:-1;;;;;;27062:17:0::1;-1:-1:-1::0;;;;;27062:17:0;;;::::1;::::0;;;::::1;::::0;;26843:244::o;31493:321::-;26614:12;:10;:12::i;:::-;-1:-1:-1;;;;;26603:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;26603:23:0;;26595:68;;;;-1:-1:-1;;;26595:68:0;;;;;;;:::i;:::-;31588:7:::1;31584:223;31601:12;:19;31599:1;:21;;;31584:223;;;31644:30;31658:12;31671:1;31658:15;;;;;;;;;31644:30;31678:2;31644:36;31641:155;;;31734:5;31701:13;:30;31715:12;31728:1;31715:15;;;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;31701:30:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;31701:30:0;:38;;-1:-1:-1;;31701:38:0::1;::::0;::::1;;::::0;;;::::1;::::0;;31758:20:::1;:22:::0;;-1:-1:-1;;31758:22:0;;;31641:155:::1;31621:3;;31584:223;;29195:85:::0;26614:12;:10;:12::i;:::-;-1:-1:-1;;;;;26603:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;26603:23:0;;26595:68;;;;-1:-1:-1;;;26595:68:0;;;;;;;:::i;:::-;29265:7:::1;::::0;;-1:-1:-1;;29254:18:0;::::1;29265:7;::::0;;::::1;29264:8;29254:18;::::0;;29195:85::o;28015:341::-;-1:-1:-1;;;;;28148:22:0;;28099:4;28148:22;;;:9;:22;;;;;28099:4;28195:33;28158:11;28220:7;28195:11;:33::i;:::-;28181:47;;28242:6;28239:110;;;-1:-1:-1;28272:15:0;;;;-1:-1:-1;28265:22:0;;28239:110;28336:1;28329:8;;;;;;22655:127;22720:4;22744:30;:12;22766:7;22744:21;:30::i;120:106::-;208:10;120:106;:::o;25842:192::-;25917:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;25917:29:0;-1:-1:-1;;;;;25917:29:0;;;;;;;;:24;;25971:23;25917:24;25971:14;:23::i;:::-;-1:-1:-1;;;;;25962:46:0;;;;;;;;;;;25842:192;;:::o;24905:215::-;25005:16;25013:7;25005;:16::i;:::-;24997:73;;;;-1:-1:-1;;;24997:73:0;;;;;;;:::i;:::-;25081:19;;;;:10;:19;;;;;;;;:31;;;;;;;;:::i;3734:179::-;3792:7;3824:5;;;3848:6;;;;3840:46;;;;-1:-1:-1;;;3840:46:0;;;;;;;:::i;4083:220::-;4141:7;4165:6;4161:20;;-1:-1:-1;4180:1:0;4173:8;;4161:20;4204:5;;;4208:1;4204;:5;:1;4228:5;;;;;:10;4220:56;;;;-1:-1:-1;;;4220:56:0;;;;;;;:::i;23149:110::-;23225:26;23235:2;23239:7;23225:26;;;;;;;;;;;;:9;:26::i;28766:286::-;-1:-1:-1;;;;;28906:22:0;;28874:29;28906:22;;;:9;:22;;;;;28939:15;;;:24;;;28978:6;28974:71;;29001:32;;;28974:71;28766:286;;;;;:::o;15696:123::-;15765:7;15792:19;15800:3;15792:7;:19::i;22788:355::-;22881:4;22906:16;22914:7;22906;:16::i;:::-;22898:73;;;;-1:-1:-1;;;22898:73:0;;;;;;;:::i;:::-;22982:13;22998:23;23013:7;22998:14;:23::i;:::-;22982:39;;23051:5;-1:-1:-1;;;;;23040:16:0;:7;-1:-1:-1;;;;;23040:16:0;;:51;;;;23084:7;-1:-1:-1;;;;;23060:31:0;:20;23072:7;23060:11;:20::i;:::-;-1:-1:-1;;;;;23060:31:0;;23040:51;:94;;;;23095:39;23119:5;23126:7;23095:23;:39::i;:::-;23032:103;22788:355;-1:-1:-1;;;;22788:355:0:o;24380:519::-;24505:4;-1:-1:-1;;;;;24478:31:0;:23;24493:7;24478:14;:23::i;:::-;-1:-1:-1;;;;;24478:31:0;;24470:85;;;;-1:-1:-1;;;24470:85:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;24574:16:0;;24566:65;;;;-1:-1:-1;;;24566:65:0;;;;;;;:::i;:::-;24642:39;24663:4;24669:2;24673:7;24642:20;:39::i;:::-;24692:29;24709:1;24713:7;24692:8;:29::i;:::-;-1:-1:-1;;;;;24732:19:0;;;;;;:13;:19;;;;;:35;;24759:7;24732:26;:35::i;:::-;-1:-1:-1;;;;;;24778:17:0;;;;;;:13;:17;;;;;:30;;24800:7;24778:21;:30::i;:::-;-1:-1:-1;24819:29:0;:12;24836:7;24845:2;24819:16;:29::i;:::-;;24883:7;24879:2;-1:-1:-1;;;;;24864:27:0;24873:4;-1:-1:-1;;;;;24864:27:0;;;;;;;;;;;24380:519;;;:::o;12447:137::-;12518:7;12553:22;12557:3;12569:5;12553:3;:22::i;15825:236::-;15905:7;;;;15965:22;15969:3;15981:5;15965:3;:22::i;:::-;15934:53;;;;-1:-1:-1;15825:236:0;-1:-1:-1;;;;;15825:236:0:o;25126:100::-;25199:19;;;;:8;;:19;;;;;:::i;16492:213::-;16599:7;16650:44;16655:3;16675;16681:12;16650:4;:44::i;22377:272::-;22491:28;22501:4;22507:2;22511:7;22491:9;:28::i;:::-;22538:48;22561:4;22567:2;22571:7;22580:5;22538:22;:48::i;:::-;22530:111;;;;-1:-1:-1;;;22530:111:0;;;;;;;:::i;16733:555::-;16789:13;16819:10;16815:53;;-1:-1:-1;16846:10:0;;;;;;;;;;;;-1:-1:-1;;;16846:10:0;;;;;;16815:53;16893:5;16878:12;16934:78;16941:9;;16934:78;;16967:8;;16998:2;16990:10;;;;16934:78;;;17022:19;17054:6;17044:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17044:17:0;-1:-1:-1;17116:5:0;;-1:-1:-1;17022:39:0;-1:-1:-1;;;17088:10:0;;17132:117;17139:9;;17132:117;;17208:2;17201:4;:9;17196:2;:14;17183:29;;17165:6;17172:7;;;;;;;17165:15;;;;;;;;;;;:47;-1:-1:-1;;;;;17165:47:0;;;;;;;;-1:-1:-1;17235:2:0;17227:10;;;;17132:117;;;-1:-1:-1;17273:6:0;16733:555;-1:-1:-1;;;;16733:555:0:o;15539:151::-;15623:4;15647:35;15657:3;15677;15647:9;:35::i;23265:250::-;23361:18;23367:2;23371:7;23361:5;:18::i;:::-;23398:54;23429:1;23433:2;23437:7;23446:5;23398:22;:54::i;:::-;23390:117;;;;-1:-1:-1;;;23390:117:0;;;;;;;:::i;13975:110::-;14058:19;;13975:110::o;12032:137::-;12102:4;12126:35;12134:3;12154:5;12126:7;:35::i;11895:131::-;11962:4;11986:32;11991:3;12011:5;11986:4;:32::i;15200:185::-;15289:4;15313:64;15318:3;15338;-1:-1:-1;;;;;15352:23:0;;15313:4;:64::i;10073:204::-;10168:18;;10140:7;;10168:26;-1:-1:-1;10160:73:0;;;;-1:-1:-1;;;10160:73:0;;;;;;;:::i;:::-;10251:3;:11;;10263:5;10251:18;;;;;;;;;;;;;;;;10244:25;;10073:204;;;;:::o;14091:277::-;14195:19;;14158:7;;;;14195:27;-1:-1:-1;14187:74:0;;;;-1:-1:-1;;;14187:74:0;;;;;;;:::i;:::-;14272:22;14297:3;:12;;14310:5;14297:19;;;;;;;;;;;;;;;;;;14272:44;;14335:5;:10;;;14347:5;:12;;;14327:33;;;;;14091:277;;;;;:::o;14879:256::-;14973:7;15012:17;;;:12;;;:17;;;;;;15063:12;15048:13;15040:36;;;;-1:-1:-1;;;15040:36:0;;;;;;;;:::i;:::-;;15094:3;:12;;15118:1;15107:8;:12;15094:26;;;;;;;;;;;;;;;;;;:33;;;15087:40;;;14879:256;;;;;:::o;25232:604::-;25353:4;25380:15;:2;-1:-1:-1;;;;;25380:13:0;;:15::i;:::-;25375:60;;-1:-1:-1;25419:4:0;25412:11;;25375:60;25445:23;25471:252;-1:-1:-1;;;25584:12:0;:10;:12::i;:::-;25611:4;25630:7;25652:5;25487:181;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1;;;;;25487:181:0;;;;;;;-1:-1:-1;;;;;25487:181:0;;;;;;;;;;;25471:252;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25471:15:0;;;:252;:15;:252::i;:::-;25445:278;;25734:13;25761:10;25750:32;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;25801:26:0;-1:-1:-1;;;25801:26:0;;-1:-1:-1;;;25232:604:0;;;;;;:::o;13844:125::-;13915:4;13939:17;;;:12;;;;;:17;;;;;;:22;;;13844:125::o;23521:396::-;-1:-1:-1;;;;;23601:16:0;;23593:61;;;;-1:-1:-1;;;23593:61:0;;;;;;;:::i;:::-;23674:16;23682:7;23674;:16::i;:::-;23673:17;23665:58;;;;-1:-1:-1;;;23665:58:0;;;;;;;:::i;:::-;23734:45;23763:1;23767:2;23771:7;23734:20;:45::i;:::-;-1:-1:-1;;;;;23790:17:0;;;;;;:13;:17;;;;;:30;;23812:7;23790:21;:30::i;:::-;-1:-1:-1;23831:29:0;:12;23848:7;23857:2;23831:16;:29::i;:::-;-1:-1:-1;23876:33:0;;23901:7;;-1:-1:-1;;;;;23876:33:0;;;23893:1;;23876:33;;23893:1;;23876:33;23521:396;;:::o;9221:596::-;9287:4;9325:19;;;:12;;;:19;;;;;;9359:15;;9355:455;;9464:18;;-1:-1:-1;;9415:14:0;;;;9464:22;;;;9391:21;;9464:3;;:22;;9521;;;;;;;;;;;;;;9501:42;;9587:9;9558:3;:11;;9570:13;9558:26;;;;;;;;;;;;;;;;;;;:38;;;;9611:23;;;9653:1;9611:12;;;:23;;;;;;9637:17;;;9611:43;;9669:17;;9611:3;;9669:17;;;;;;;;;;;;;;;;;;;;;;9708:3;:12;;:19;9721:5;9708:19;;;;;;;;;;;9701:26;;;9749:4;9742:11;;;;;;;;9355:455;9793:5;9786:12;;;;;8924:291;8987:4;9009:21;9019:3;9024:5;9009:9;:21::i;:::-;9004:204;;-1:-1:-1;9047:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;9107:18;;9085:19;;;:12;;;:19;;;;;;:40;;;;9140:11;;9004:204;-1:-1:-1;9191:5:0;9184:12;;12799:431;12875:4;12911:17;;;:12;;;:17;;;;;;12943:13;12939:284;;-1:-1:-1;;12991:38:0;;;;;;;;;;;;;;;;;;12973:57;;;;;;;;:12;:57;;;;;;;;;;;;;;;;;;;;;;;;13065:19;;13045:17;;;:12;;;:17;;;;;;;:39;13099:11;;12939:284;13179:5;13143:3;:12;;13167:1;13156:8;:12;13143:26;;;;;;;;;;;;;;;;;;:33;;:41;;;;13206:5;13199:12;;;;;5161:231;5337:20;5376:8;;;5161:231::o;5978:195::-;6081:12;6113:52;6135:6;6143:4;6149:1;6152:12;6081;6663:18;6674:6;6663:10;:18::i;:::-;6655:60;;;;-1:-1:-1;;;6655:60:0;;;;;;;:::i;:::-;6787:12;6801:23;6828:6;-1:-1:-1;;;;;6828:11:0;6848:5;6856:4;6828:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6786:75;;;;6879:52;6897:7;6906:10;6918:12;6879:17;:52::i;:::-;6872:59;6411:528;-1:-1:-1;;;;;;;6411:528:0:o;8209:580::-;8324:12;8353:7;8349:433;;;-1:-1:-1;8384:10:0;8377:17;;8349:433;8431:17;;:21;8427:344;;8599:10;8593:17;8660:15;8647:10;8643:2;8639:19;8632:44;8547:148;8742:12;8735:20;;-1:-1:-1;;;8735:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:400:1;;114:18;106:6;103:30;100:2;;;136:9;100:2;165:58;211:2;188:17;;-1:-1:-1;;184:31:1;217:4;180:42;165:58;:::i;:::-;156:67;;246:6;239:5;232:21;286:3;277:6;272:3;268:16;265:25;262:2;;;303:1;300;293:12;262:2;352:6;347:3;340:4;333:5;329:16;316:43;406:1;399:4;390:6;383:5;379:18;375:29;368:40;90:324;;;;;:::o;419:175::-;489:20;;-1:-1:-1;;;;;538:31:1;;528:42;;518:2;;584:1;581;574:12;599:673;;711:3;704:4;696:6;692:17;688:27;678:2;;733:5;726;719:20;678:2;773:6;760:20;799:4;823:65;838:49;884:2;838:49;:::i;:::-;823:65;:::i;:::-;922:15;;;953:12;;;;985:15;;;1018:5;1032:211;1046:2;1043:1;1040:9;1032:211;;;1103:65;1164:3;1159:2;1152:3;1139:17;1131:6;1127:30;1123:39;1103:65;:::i;:::-;1091:78;;1189:12;;;;1221;;;;1064:1;1057:9;1032:211;;;-1:-1:-1;1261:5:1;;668:604;-1:-1:-1;;;;;;;668:604:1:o;1277:233::-;;1375:3;1368:4;1360:6;1356:17;1352:27;1342:2;;1397:5;1390;1383:20;1342:2;1423:81;1500:3;1491:6;1478:20;1471:4;1463:6;1459:17;1423:81;:::i;1515:198::-;;1627:2;1615:9;1606:7;1602:23;1598:32;1595:2;;;1648:6;1640;1633:22;1595:2;1676:31;1697:9;1676:31;:::i;1718:274::-;;;1847:2;1835:9;1826:7;1822:23;1818:32;1815:2;;;1868:6;1860;1853:22;1815:2;1896:31;1917:9;1896:31;:::i;:::-;1886:41;;1946:40;1982:2;1971:9;1967:18;1946:40;:::i;:::-;1936:50;;1805:187;;;;;:::o;1997:342::-;;;;2143:2;2131:9;2122:7;2118:23;2114:32;2111:2;;;2164:6;2156;2149:22;2111:2;2192:31;2213:9;2192:31;:::i;:::-;2182:41;;2242:40;2278:2;2267:9;2263:18;2242:40;:::i;:::-;2232:50;;2329:2;2318:9;2314:18;2301:32;2291:42;;2101:238;;;;;:::o;2344:702::-;;;;;2516:3;2504:9;2495:7;2491:23;2487:33;2484:2;;;2538:6;2530;2523:22;2484:2;2566:31;2587:9;2566:31;:::i;:::-;2556:41;;2616:40;2652:2;2641:9;2637:18;2616:40;:::i;:::-;2606:50;;2703:2;2692:9;2688:18;2675:32;2665:42;;2758:2;2747:9;2743:18;2730:32;2785:18;2777:6;2774:30;2771:2;;;2822:6;2814;2807:22;2771:2;2850:22;;2903:4;2895:13;;2891:27;-1:-1:-1;2881:2:1;;2937:6;2929;2922:22;2881:2;2965:75;3032:7;3027:2;3014:16;3009:2;3005;3001:11;2965:75;:::i;:::-;2955:85;;;2474:572;;;;;;;:::o;3051:369::-;;;3177:2;3165:9;3156:7;3152:23;3148:32;3145:2;;;3198:6;3190;3183:22;3145:2;3226:31;3247:9;3226:31;:::i;:::-;3216:41;;3307:2;3296:9;3292:18;3279:32;3354:5;3347:13;3340:21;3333:5;3330:32;3320:2;;3381:6;3373;3366:22;3320:2;3409:5;3399:15;;;3135:285;;;;;:::o;3425:266::-;;;3554:2;3542:9;3533:7;3529:23;3525:32;3522:2;;;3575:6;3567;3560:22;3522:2;3603:31;3624:9;3603:31;:::i;:::-;3593:41;3681:2;3666:18;;;;3653:32;;-1:-1:-1;;;3512:179:1:o;3696:961::-;;3811:2;3854;3842:9;3833:7;3829:23;3825:32;3822:2;;;3875:6;3867;3860:22;3822:2;3920:9;3907:23;3953:18;3945:6;3942:30;3939:2;;;3990:6;3982;3975:22;3939:2;4018:22;;4071:4;4063:13;;4059:27;-1:-1:-1;4049:2:1;;4105:6;4097;4090:22;4049:2;4146;4133:16;4169:65;4184:49;4230:2;4184:49;:::i;4169:65::-;4268:15;;;4299:12;;;;4331:11;;;4369;;;4361:20;;4357:29;;4354:42;-1:-1:-1;4351:2:1;;;4414:6;4406;4399:22;4351:2;4441:6;4432:15;;4456:171;4470:2;4467:1;4464:9;4456:171;;;4527:25;4548:3;4527:25;:::i;:::-;4515:38;;4488:1;4481:9;;;;;4573:12;;;;4605;;4456:171;;;-1:-1:-1;4646:5:1;3791:866;-1:-1:-1;;;;;;;3791:866:1:o;4662:1227::-;;;4851:2;4839:9;4830:7;4826:23;4822:32;4819:2;;;4872:6;4864;4857:22;4819:2;4917:9;4904:23;4946:18;4987:2;4979:6;4976:14;4973:2;;;5008:6;5000;4993:22;4973:2;5051:6;5040:9;5036:22;5026:32;;5096:7;5089:4;5085:2;5081:13;5077:27;5067:2;;5123:6;5115;5108:22;5067:2;5164;5151:16;5186:4;5210:65;5225:49;5271:2;5225:49;:::i;5210:65::-;5309:15;;;5340:12;;;;5372:11;;;5410;;;5402:20;;5398:29;;5395:42;-1:-1:-1;5392:2:1;;;5455:6;5447;5440:22;5392:2;5482:6;5473:15;;5497:163;5511:2;5508:1;5505:9;5497:163;;;5568:17;;5556:30;;5529:1;5522:9;;;;;5606:12;;;;5638;;5497:163;;;-1:-1:-1;5679:5:1;-1:-1:-1;;5722:18:1;;5709:32;;-1:-1:-1;;5753:16:1;;;5750:2;;;5787:6;5779;5772:22;5750:2;;5815:68;5875:7;5864:8;5853:9;5849:24;5815:68;:::i;:::-;5805:78;;;4809:1080;;;;;:::o;5894:257::-;;6005:2;5993:9;5984:7;5980:23;5976:32;5973:2;;;6026:6;6018;6011:22;5973:2;6070:9;6057:23;6089:32;6115:5;6089:32;:::i;6156:261::-;;6278:2;6266:9;6257:7;6253:23;6249:32;6246:2;;;6299:6;6291;6284:22;6246:2;6336:9;6330:16;6355:32;6381:5;6355:32;:::i;6422:344::-;;6544:2;6532:9;6523:7;6519:23;6515:32;6512:2;;;6565:6;6557;6550:22;6512:2;6610:9;6597:23;6643:18;6635:6;6632:30;6629:2;;;6680:6;6672;6665:22;6629:2;6708:52;6752:7;6743:6;6732:9;6728:22;6708:52;:::i;6771:190::-;;6883:2;6871:9;6862:7;6858:23;6854:32;6851:2;;;6904:6;6896;6889:22;6851:2;-1:-1:-1;6932:23:1;;6841:120;-1:-1:-1;6841:120:1:o;6966:412::-;;;7105:2;7093:9;7084:7;7080:23;7076:32;7073:2;;;7126:6;7118;7111:22;7073:2;7167:9;7154:23;7144:33;;7228:2;7217:9;7213:18;7200:32;7255:18;7247:6;7244:30;7241:2;;;7292:6;7284;7277:22;7241:2;7320:52;7364:7;7355:6;7344:9;7340:22;7320:52;:::i;7383:259::-;;7464:5;7458:12;7491:6;7486:3;7479:19;7507:63;7563:6;7556:4;7551:3;7547:14;7540:4;7533:5;7529:16;7507:63;:::i;:::-;7624:2;7603:15;-1:-1:-1;;7599:29:1;7590:39;;;;7631:4;7586:50;;7434:208;-1:-1:-1;;7434:208:1:o;7647:274::-;;7814:6;7808:13;7830:53;7876:6;7871:3;7864:4;7856:6;7852:17;7830:53;:::i;:::-;7899:16;;;;;7784:137;-1:-1:-1;;7784:137:1:o;7926:470::-;;8143:6;8137:13;8159:53;8205:6;8200:3;8193:4;8185:6;8181:17;8159:53;:::i;:::-;8275:13;;8234:16;;;;8297:57;8275:13;8234:16;8331:4;8319:17;;8297:57;:::i;:::-;8370:20;;8113:283;-1:-1:-1;;;;8113:283:1:o;8401:203::-;-1:-1:-1;;;;;8565:32:1;;;;8547:51;;8535:2;8520:18;;8502:102::o;8609:506::-;-1:-1:-1;;;;;8894:15:1;;;8876:34;;8946:15;;8941:2;8926:18;;8919:43;8993:2;8978:18;;8971:34;;;9041:3;9036:2;9021:18;;9014:31;;;8609:506;;9062:47;;9089:19;;9081:6;9062:47;:::i;:::-;9054:55;8828:287;-1:-1:-1;;;;;;8828:287:1:o;9120:635::-;9291:2;9343:21;;;9413:13;;9316:18;;;9435:22;;;9120:635;;9291:2;9514:15;;;;9488:2;9473:18;;;9120:635;9560:169;9574:6;9571:1;9568:13;9560:169;;;9635:13;;9623:26;;9704:15;;;;9669:12;;;;9596:1;9589:9;9560:169;;;-1:-1:-1;9746:3:1;;9271:484;-1:-1:-1;;;;;;9271:484:1:o;9760:187::-;9925:14;;9918:22;9900:41;;9888:2;9873:18;;9855:92::o;9952:221::-;;10101:2;10090:9;10083:21;10121:46;10163:2;10152:9;10148:18;10140:6;10121:46;:::i;10178:398::-;10380:2;10362:21;;;10419:2;10399:18;;;10392:30;10458:34;10453:2;10438:18;;10431:62;-1:-1:-1;;;10524:2:1;10509:18;;10502:32;10566:3;10551:19;;10352:224::o;10581:414::-;10783:2;10765:21;;;10822:2;10802:18;;;10795:30;10861:34;10856:2;10841:18;;10834:62;-1:-1:-1;;;10927:2:1;10912:18;;10905:48;10985:3;10970:19;;10755:240::o;11000:402::-;11202:2;11184:21;;;11241:2;11221:18;;;11214:30;11280:34;11275:2;11260:18;;11253:62;-1:-1:-1;;;11346:2:1;11331:18;;11324:36;11392:3;11377:19;;11174:228::o;11407:401::-;11609:2;11591:21;;;11648:2;11628:18;;;11621:30;11687:34;11682:2;11667:18;;11660:62;-1:-1:-1;;;11753:2:1;11738:18;;11731:35;11798:3;11783:19;;11581:227::o;11813:352::-;12015:2;11997:21;;;12054:2;12034:18;;;12027:30;12093;12088:2;12073:18;;12066:58;12156:2;12141:18;;11987:178::o;12170:400::-;12372:2;12354:21;;;12411:2;12391:18;;;12384:30;12450:34;12445:2;12430:18;;12423:62;-1:-1:-1;;;12516:2:1;12501:18;;12494:34;12560:3;12545:19;;12344:226::o;12575:351::-;12777:2;12759:21;;;12816:2;12796:18;;;12789:30;12855:29;12850:2;12835:18;;12828:57;12917:2;12902:18;;12749:177::o;12931:400::-;13133:2;13115:21;;;13172:2;13152:18;;;13145:30;13211:34;13206:2;13191:18;;13184:62;-1:-1:-1;;;13277:2:1;13262:18;;13255:34;13321:3;13306:19;;13105:226::o;13336:349::-;13538:2;13520:21;;;13577:2;13557:18;;;13550:30;13616:27;13611:2;13596:18;;13589:55;13676:2;13661:18;;13510:175::o;13690:406::-;13892:2;13874:21;;;13931:2;13911:18;;;13904:30;13970:34;13965:2;13950:18;;13943:62;-1:-1:-1;;;14036:2:1;14021:18;;14014:40;14086:3;14071:19;;13864:232::o;14101:355::-;14303:2;14285:21;;;14342:2;14322:18;;;14315:30;14381:33;14376:2;14361:18;;14354:61;14447:2;14432:18;;14275:181::o;14868:408::-;15070:2;15052:21;;;15109:2;15089:18;;;15082:30;15148:34;15143:2;15128:18;;15121:62;-1:-1:-1;;;15214:2:1;15199:18;;15192:42;15266:3;15251:19;;15042:234::o;15281:420::-;15483:2;15465:21;;;15522:2;15502:18;;;15495:30;15561:34;15556:2;15541:18;;15534:62;15632:26;15627:2;15612:18;;15605:54;15691:3;15676:19;;15455:246::o;15706:352::-;15908:2;15890:21;;;15947:2;15927:18;;;15920:30;15986;15981:2;15966:18;;15959:58;16049:2;16034:18;;15880:178::o;16063:406::-;16265:2;16247:21;;;16304:2;16284:18;;;16277:30;16343:34;16338:2;16323:18;;16316:62;-1:-1:-1;;;16409:2:1;16394:18;;16387:40;16459:3;16444:19;;16237:232::o;16474:398::-;16676:2;16658:21;;;16715:2;16695:18;;;16688:30;16754:34;16749:2;16734:18;;16727:62;-1:-1:-1;;;16820:2:1;16805:18;;16798:32;16862:3;16847:19;;16648:224::o;16877:356::-;17079:2;17061:21;;;17098:18;;;17091:30;17157:34;17152:2;17137:18;;17130:62;17224:2;17209:18;;17051:182::o;17238:397::-;17440:2;17422:21;;;17479:2;17459:18;;;17452:30;17518:34;17513:2;17498:18;;17491:62;-1:-1:-1;;;17584:2:1;17569:18;;17562:31;17625:3;17610:19;;17412:223::o;17640:408::-;17842:2;17824:21;;;17881:2;17861:18;;;17854:30;17920:34;17915:2;17900:18;;17893:62;-1:-1:-1;;;17986:2:1;17971:18;;17964:42;18038:3;18023:19;;17814:234::o;18053:408::-;18255:2;18237:21;;;18294:2;18274:18;;;18267:30;18333:34;18328:2;18313:18;;18306:62;-1:-1:-1;;;18399:2:1;18384:18;;18377:42;18451:3;18436:19;;18227:234::o;18466:356::-;18668:2;18650:21;;;18687:18;;;18680:30;18746:34;18741:2;18726:18;;18719:62;18813:2;18798:18;;18640:182::o;18827:405::-;19029:2;19011:21;;;19068:2;19048:18;;;19041:30;19107:34;19102:2;19087:18;;19080:62;-1:-1:-1;;;19173:2:1;19158:18;;19151:39;19222:3;19207:19;;19001:231::o;19237:411::-;19439:2;19421:21;;;19478:2;19458:18;;;19451:30;19517:34;19512:2;19497:18;;19490:62;-1:-1:-1;;;19583:2:1;19568:18;;19561:45;19638:3;19623:19;;19411:237::o;19653:397::-;19855:2;19837:21;;;19894:2;19874:18;;;19867:30;19933:34;19928:2;19913:18;;19906:62;-1:-1:-1;;;19999:2:1;19984:18;;19977:31;20040:3;20025:19;;19827:223::o;20055:402::-;20257:2;20239:21;;;20296:2;20276:18;;;20269:30;20335:34;20330:2;20315:18;;20308:62;-1:-1:-1;;;20401:2:1;20386:18;;20379:36;20447:3;20432:19;;20229:228::o;20462:413::-;20664:2;20646:21;;;20703:2;20683:18;;;20676:30;20742:34;20737:2;20722:18;;20715:62;-1:-1:-1;;;20808:2:1;20793:18;;20786:47;20865:3;20850:19;;20636:239::o;20880:353::-;21082:2;21064:21;;;21121:2;21101:18;;;21094:30;21160:31;21155:2;21140:18;;21133:59;21224:2;21209:18;;21054:179::o;21238:406::-;21440:2;21422:21;;;21479:2;21459:18;;;21452:30;21518:34;21513:2;21498:18;;21491:62;-1:-1:-1;;;21584:2:1;21569:18;;21562:40;21634:3;21619:19;;21412:232::o;21649:177::-;21795:25;;;21783:2;21768:18;;21750:76::o;21831:242::-;21901:2;21895:9;21931:17;;;21978:18;21963:34;;21999:22;;;21960:62;21957:2;;;22025:9;21957:2;22052;22045:22;21875:198;;-1:-1:-1;21875:198:1:o;22078:183::-;;22177:18;22169:6;22166:30;22163:2;;;22199:9;22163:2;-1:-1:-1;22250:4:1;22231:17;;;22227:28;;22153:108::o;22266:258::-;22338:1;22348:113;22362:6;22359:1;22356:13;22348:113;;;22438:11;;;22432:18;22419:11;;;22412:39;22384:2;22377:10;22348:113;;;22479:6;22476:1;22473:13;22470:2;;;-1:-1:-1;;22514:1:1;22496:16;;22489:27;22319:205::o;22529:133::-;-1:-1:-1;;;;;;22605:32:1;;22595:43;;22585:2;;22652:1;22649;22642:12

Swarm Source

ipfs://32f325e597e4982b020c3a7376f95cba40e3616b4f807326b98aa6c5da8900ff
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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