ETH Price: $3,406.67 (-1.86%)
Gas: 14 Gwei

Token

BFH:Unit (BFHU)
 

Overview

Max Total Supply

7,043 BFHU

Holders

502

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 BFHU
0x459e9E7Fa2631cE07a8369bEEaEbCE0a660B9eCC
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Extremely successful mobile game BRAVE FRONTIER turns into Blockchian Game

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
BFHUnit

Compiler Version
v0.5.12+commit.7709ece9

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-01-26
*/

// Copyright (c) 2018-2020 double jump.tokyo inc.
pragma solidity 0.5.12;

interface IERC721Metadata /* is ERC721 */ {
    /// @notice A descriptive name for a collection of NFTs in this contract
    function name() external view returns (string memory _name);

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

    /// @notice A distinct Uniform Resource Identifier (URI) for a given asset.
    /// @dev Throws if `_tokenId` is not a valid NFT. URIs are defined in RFC
    ///  3986. The URI may point to a JSON file that conforms to the "ERC721
    ///  Metadata JSON Schema".
    function tokenURI(uint256 _tokenId) external view returns (string memory);
}

interface IERC721TokenReceiver {
    /// @notice Handle the receipt of an NFT
    /// @dev The ERC721 smart contract calls this function on the recipient
    ///  after a `transfer`. This function MAY throw to revert and reject the
    ///  transfer. Return of other than the magic value MUST result in the
    ///  transaction being reverted.
    ///  Note: the contract address is always the message sender.
    /// @param _operator The address which called `safeTransferFrom` function
    /// @param _from The address which previously owned the token
    /// @param _tokenId The NFT identifier which is being transferred
    /// @param _data Additional data with no specified format
    /// @return `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
    ///  unless throwing
    function onERC721Received(
        address _operator,
        address _from,
        uint256 _tokenId,
        bytes calldata _data
    )
        external
        returns(bytes4);
}

library Uint32 {

    function add(uint32 a, uint32 b) internal pure returns (uint32) {
        uint32 c = a + b;
        require(c >= a, "addition overflow");
        return c;
    }

    function sub(uint32 a, uint32 b) internal pure returns (uint32) {
        require(a >= b, "subtraction overflow");
        return a - b;
    }

    function mul(uint32 a, uint32 b) internal pure returns (uint32) {
        if (a == 0) {
            return 0;
        }
        uint32 c = a * b;
        require(c / a == b, "multiplication overflow");
        return c;
    }

    function div(uint32 a, uint32 b) internal pure returns (uint32) {
        require(b != 0, "division by 0");
        return a / b;
    }

    function mod(uint32 a, uint32 b) internal pure returns (uint32) {
        require(b != 0, "modulo by 0");
        return a % b;
    }

}

library String {

    function compare(string memory _a, string memory _b) public pure returns (bool) {
        return (keccak256(abi.encodePacked(_a)) == keccak256(abi.encodePacked(_b)));
    }

    function cut(string memory _s, uint256 _from, uint256 _range) public pure returns (string memory) {
        bytes memory s = bytes(_s);
        require(s.length >= _from + _range, "_s length must be longer than _from + _range");
        bytes memory ret = new bytes(_range);

        for (uint256 i = 0; i < _range; i++) {
            ret[i] = s[_from+i];
        }
        return string(ret);
    }

    function concat(string memory _a, string memory _b) internal pure returns (string memory) {
        return string(abi.encodePacked(_a, _b));
    }
}

library Address {

    function isContract(address account) internal view returns (bool) {
        uint256 size;
        assembly { size := extcodesize(account) }
        return size > 0;
    }

    function toPayable(address account) internal pure returns (address payable) {
        return address(uint160(account));
    }

    function toHex(address account) internal pure returns (string memory) {
        bytes32 value = bytes32(uint256(account));
        bytes memory alphabet = "0123456789abcdef";

        bytes memory str = new bytes(42);
        str[0] = '0';
        str[1] = 'x';
        for (uint i = 0; i < 20; i++) {
            str[2+i*2] = alphabet[uint(uint8(value[i + 12] >> 4))];
            str[3+i*2] = alphabet[uint(uint8(value[i + 12] & 0x0f))];
        }
        return string(str);
    }
}
interface IERC165 {
    function supportsInterface(bytes4 interfaceID) external view returns (bool);
}

/// @title ERC-165 Standard Interface Detection
/// @dev See https://eips.ethereum.org/EIPS/eip-165
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) external view returns (bool) {
        return _supportedInterfaces[interfaceId];
    }

    function _registerInterface(bytes4 interfaceId) internal {
        require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
        _supportedInterfaces[interfaceId] = true;
    }
}

interface IApprovalProxy {
  function setApprovalForAll(address _owner, address _spender, bool _approved) external;
  function isApprovedForAll(address _owner, address _spender, bool _original) external view returns (bool);
}
library Uint256 {

    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "addition overflow");
        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(a >= b, "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, "multiplication overflow");
        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b != 0, "division by 0");
        return a / b;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b != 0, "modulo by 0");
        return a % b;
    }

    function toString(uint256 a) internal pure returns (string memory) {
        bytes32 retBytes32;
        uint256 len = 0;
        if (a == 0) {
            retBytes32 = "0";
            len++;
        } else {
            uint256 value = a;
            while (value > 0) {
                retBytes32 = bytes32(uint256(retBytes32) / (2 ** 8));
                retBytes32 |= bytes32(((value % 10) + 48) * 2 ** (8 * 31));
                value /= 10;
                len++;
            }
        }

        bytes memory ret = new bytes(len);
        uint256 i;

        for (i = 0; i < len; i++) {
            ret[i] = retBytes32[i];
        }
        return string(ret);
    }
}

interface IERC721 /* is ERC165 */ {
    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);
    function ownerOf(uint256 _tokenId) external view returns (address);
    function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes calldata data) external payable;
    function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable;
    function transferFrom(address _from, address _to, uint256 _tokenId) external payable;
    function approve(address _approved, uint256 _tokenId) external payable;
    function setApprovalForAll(address _operator, bool _approved) external;
    function getApproved(uint256 _tokenId) external view returns (address);
    function isApprovedForAll(address _owner, address _operator) external view returns (bool);
}

library Roles {
    struct Role {
        mapping (address => bool) bearer;
    }

    function add(Role storage role, address account) internal {
        require(!has(role, account), "role already has the account");
        role.bearer[account] = true;
    }

    function remove(Role storage role, address account) internal {
        require(has(role, account), "role dosen't have the account");
        role.bearer[account] = false;
    }

    function has(Role storage role, address account) internal view returns (bool) {
        return role.bearer[account];
    }
}

contract ERC721 is IERC721, ERC165 {
    using Uint256 for uint256;
    using Address for address;

    bytes4 private constant _ERC721_RECEIVED = 0x150b7a02;
    bytes4 private constant _InterfaceId_ERC721 = 0x80ac58cd;

    mapping (uint256 => address) private _tokenOwner;
    mapping (address => uint256) private _balance;
    mapping (uint256 => address) private _tokenApproved;
    mapping (address => mapping (address => bool)) private _operatorApprovals;

    constructor () public {
        _registerInterface(_InterfaceId_ERC721);
    }

    function balanceOf(address _owner) public view returns (uint256) {
        return _balance[_owner];
    }

    function ownerOf(uint256 _tokenId) public view returns (address) {
        require(_exist(_tokenId),
                "`_tokenId` is not a valid NFT.");
        return _tokenOwner[_tokenId];
    }

    function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes memory _data) public payable {
        require(_data.length == 0, "data is not implemented");
        safeTransferFrom(_from, _to, _tokenId);
    }

    function safeTransferFrom(address _from, address _to, uint256 _tokenId) public payable {
        require(_checkOnERC721Received(_from, _to, _tokenId, ""),
                "`_to` is a smart contract and onERC721Received is invalid");
        transferFrom(_from, _to, _tokenId);
    }

    function transferFrom(address _from, address _to, uint256 _tokenId) public payable {
        require(_transferable(msg.sender, _tokenId),
                "Unless `msg.sender` is the current owner, an authorized operator, or the approved address for this NFT."); // solhint-disable-line
        require(ownerOf(_tokenId) == _from,
                "`_from` is not the current owner.");
        require(_to != address(0),
                "`_to` is the zero address.");
        require(_exist(_tokenId),
                "`_tokenId` is not a valid NFT.");
        _transfer(_from, _to, _tokenId);
    }

    function approve(address _approved, uint256 _tokenId) public payable {
        address owner = ownerOf(_tokenId);
        require(msg.sender == owner || isApprovedForAll(owner, msg.sender),
                "Unless `msg.sender` is the current NFT owner, or an authorized operator of the current owner.");

        _tokenApproved[_tokenId] = _approved;
        emit Approval(msg.sender, _approved, _tokenId);
    }

    function setApprovalForAll(address _operator, bool _approved) public {
        _setApprovalForAll(msg.sender, _operator, _approved);
    }

    function _setApprovalForAll(address _owner, address _operator, bool _approved) internal {
        _operatorApprovals[_owner][_operator] = _approved;
        emit ApprovalForAll(_owner, _operator, _approved);
    }

    function getApproved(uint256 _tokenId) public view returns (address) {
        require(_exist(_tokenId),
                "`_tokenId` is not a valid NFT.");
        return _tokenApproved[_tokenId];
    }

    function isApprovedForAll(address _owner, address _operator) public view returns (bool) {
        return _isApprovedForAll(_owner, _operator);
    }
    
    function _isApprovedForAll(address _owner, address _operator) internal view returns (bool) {
        return _operatorApprovals[_owner][_operator];
    }

    function _transferable(address _spender, uint256 _tokenId) internal view returns (bool){
        address owner = ownerOf(_tokenId);
        return (_spender == owner || getApproved(_tokenId) == _spender || isApprovedForAll(owner, _spender));
    }

    function _transfer(address _from, address _to, uint256 _tokenId) internal {
        _clearApproval(_tokenId);
        _tokenOwner[_tokenId] = _to;
        _balance[_from] = _balance[_from].sub(1);
        _balance[_to] = _balance[_to].add(1);
        emit Transfer(_from, _to, _tokenId);
    }
  
    function _mint(address _to, uint256 _tokenId) internal {
        require(!_exist(_tokenId), "mint token already exists");
        _tokenOwner[_tokenId] = _to;
        _balance[_to] = _balance[_to].add(1);
        emit Transfer(address(0), _to, _tokenId);
    }
  
    function _burn(uint256 _tokenId) internal {
        require(_exist(_tokenId), "burn token does not already exists");
        address owner = ownerOf(_tokenId);
        _clearApproval(_tokenId);
        _tokenOwner[_tokenId] = address(0);
        _balance[owner] = _balance[owner].sub(1);
        emit Transfer(owner, address(0), _tokenId);
    }

    function _exist(uint256 _tokenId) internal view returns (bool) {
        address owner = _tokenOwner[_tokenId];
        return owner != address(0);
    }

    function _checkOnERC721Received(
        address _from,
        address _to,
        uint256 _tokenId,
        bytes memory _data
    ) 
        internal
        returns (bool) 
    {
        if (!_to.isContract()) {
            return true;
        }
        bytes4 retval = IERC721TokenReceiver(_to).onERC721Received(msg.sender, _from, _tokenId, _data);
        return (retval == _ERC721_RECEIVED);
    }

    function _clearApproval(uint256 tokenId) internal {
        if (_tokenApproved[tokenId] != address(0)) {
            _tokenApproved[tokenId] = address(0);
        }
    }
}

interface IERC173 /* is ERC165 */ {
    /// @dev This emits when ownership of a contract changes.
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /// @notice Get the address of the owner
    /// @return The address of the owner.
    function owner() external view returns (address);

    /// @notice Set the address of the new owner of the contract
    /// @param _newOwner The address of the new owner of the contract
    function transferOwnership(address _newOwner) external;
}

contract ERC173 is IERC173, ERC165  {
    address private _owner;

    constructor() public {
        _registerInterface(0x7f5828d0);
        _transferOwnership(msg.sender);
    }

    modifier onlyOwner() {
        require(msg.sender == owner(), "Must be owner");
        _;
    }

    function owner() public view returns (address) {
        return _owner;
    }

    function transferOwnership(address _newOwner) public onlyOwner() {
        _transferOwnership(_newOwner);
    }

    function _transferOwnership(address _newOwner) internal {
        address previousOwner = owner();
	_owner = _newOwner;
        emit OwnershipTransferred(previousOwner, _newOwner);
    }
}

contract Operatable is ERC173 {
    using Roles for Roles.Role;

    event OperatorAdded(address indexed account);
    event OperatorRemoved(address indexed account);

    event Paused(address account);
    event Unpaused(address account);

    bool private _paused;
    Roles.Role private operators;

    constructor() public {
        operators.add(msg.sender);
        _paused = false;
    }

    modifier onlyOperator() {
        require(isOperator(msg.sender), "Must be operator");
        _;
    }

    modifier whenNotPaused() {
        require(!_paused, "Pausable: paused");
        _;
    }

    modifier whenPaused() {
        require(_paused, "Pausable: not paused");
        _;
    }

    function transferOwnership(address _newOwner) public onlyOperator() {
        _transferOwnership(_newOwner);
    }

    function isOperator(address account) public view returns (bool) {
        return operators.has(account);
    }

    function addOperator(address account) public onlyOperator() {
        operators.add(account);
        emit OperatorAdded(account);
    }

    function removeOperator(address account) public onlyOperator() {
        operators.remove(account);
        emit OperatorRemoved(account);
    }

    function paused() public view returns (bool) {
        return _paused;
    }

    function pause() public onlyOperator() whenNotPaused() {
        _paused = true;
        emit Paused(msg.sender);
    }

    function unpause() public onlyOperator() whenPaused() {
        _paused = false;
        emit Unpaused(msg.sender);
    }

    function withdrawEther() public onlyOperator() {
        msg.sender.transfer(address(this).balance);
    }

}

contract ERC721Metadata is IERC721Metadata, ERC721, Operatable {
    using Uint256 for uint256;
    using String for string;

    event UpdateTokenURIPrefix(
        string tokenUriPrefix
    );

    // Metadata
    string private __name;
    string private __symbol;
    string private __tokenUriPrefix;

    constructor(string memory _name,
                string memory _symbol,
                string memory _tokenUriPrefix) public {
        // ERC721Metadata
        __name = _name;
        __symbol = _symbol;
        setTokenURIPrefix(_tokenUriPrefix);
    }

    function setTokenURIPrefix(string memory _tokenUriPrefix) public onlyOperator() {
        __tokenUriPrefix = _tokenUriPrefix;
        emit UpdateTokenURIPrefix(_tokenUriPrefix);
    }

    function name() public view returns (string memory) {
        return __name;
    }

    function symbol() public view returns (string memory) {
        return __symbol;
    }

    function tokenURI(uint256 _tokenId) public view returns (string memory) {
        return __tokenUriPrefix.concat(_tokenId.toString());
    }
}

contract ERC721TokenPausable is ERC721,Operatable {
    using Roles for Roles.Role;
    Roles.Role private tokenPauser;

    event TokenPauserAdded(address indexed account);
    event TokenPauserRemoved(address indexed account);

    event TokenPaused(uint256 indexed tokenId);
    event TokenUnpaused(uint256 indexed tokenId);

    mapping (uint256 => bool) private _tokenPaused;

    constructor() public {
        tokenPauser.add(msg.sender);
    }

    modifier onlyTokenPauser() {
        require(isTokenPauser(msg.sender), "Only token pauser can call this method");
        _;
    }

    modifier whenNotTokenPaused(uint256 _tokenId) {
        require(!isTokenPaused(_tokenId), "TokenPausable: paused");
        _;
    }

    modifier whenTokenPaused(uint256 _tokenId) {
        require(isTokenPaused(_tokenId), "TokenPausable: not paused");
        _;
    }

    function pauseToken(uint256 _tokenId) public onlyTokenPauser() {
        require(!isTokenPaused(_tokenId), "Token is already paused");
        _tokenPaused[_tokenId] = true;
        emit TokenPaused(_tokenId);
    }

    function unpauseToken(uint256 _tokenId) public onlyTokenPauser() {
        require(isTokenPaused(_tokenId), "Token is not paused");
        _tokenPaused[_tokenId] = false;
        emit TokenUnpaused(_tokenId);
    }

    function isTokenPaused(uint256 _tokenId) public view returns (bool) {
        return _tokenPaused[_tokenId];
    }

    function isTokenPauser(address account) public view returns (bool) {
        return tokenPauser.has(account);
    }

    function addTokenPauser(address account) public onlyOperator() {
        tokenPauser.add(account);
        emit TokenPauserAdded(account);
    }

    function removeTokenPauser(address account) public onlyOperator() {
        tokenPauser.remove(account);
        emit TokenPauserRemoved(account);
    }

    function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes memory _data) public payable
                            whenNotPaused() whenNotTokenPaused(_tokenId) {
        super.safeTransferFrom(_from, _to, _tokenId, _data);
    }

    function safeTransferFrom(address _from, address _to, uint256 _tokenId) public payable
                            whenNotPaused() whenNotTokenPaused(_tokenId) {
        super.safeTransferFrom(_from, _to, _tokenId);
    }

    function transferFrom(address _from, address _to, uint256 _tokenId) public payable
                            whenNotPaused() whenNotTokenPaused(_tokenId) {
        super.transferFrom(_from, _to, _tokenId);
    }
}

interface IERC721Mintable {
    event MinterAdded(address indexed account);
    event MinterRemoved(address indexed account);
    function exist(uint256 _tokenId) external view returns (bool);
    function mint(address _to, uint256 _tokenId) external;
    function isMinter(address account) external view returns (bool);
    function addMinter(address account) external;
    function removeMinter(address account) external;
}

contract ERC721Mintable is ERC721, IERC721Mintable, Operatable {
    using Roles for Roles.Role;
    Roles.Role private minters;

    constructor() public {
        addMinter(msg.sender);
    }

    modifier onlyMinter() {
        require(isMinter(msg.sender), "Must be minter");
        _;
    }

    function isMinter(address account) public view returns (bool) {
        return minters.has(account);
    }

    function addMinter(address account) public onlyOperator() {
        minters.add(account);
        emit MinterAdded(account);
    }

    function removeMinter(address account) public onlyOperator() {
        minters.remove(account);
        emit MinterRemoved(account);
    }
    
    function exist(uint256 tokenId) public view returns (bool) {
        return _exist(tokenId);
    }

    function mint(address to, uint256 tokenId) public onlyMinter() {
        _mint(to, tokenId);
    }
}
interface IERC721CappedSupply /* IERC721Mintable, IERC721 */ {
    event SetUnitCap(uint32 _assetType, uint32 _unitCap);
    event SetTypeCap(uint256 _typeCap);
    function totalSupply() external view returns (uint256);
    function getTypeOffset() external view returns (uint256);
    function getTypeCap() external view returns (uint256);
    function setTypeCap(uint32 _newTypeCap) external;
    function getTypeCount() external view returns (uint256);
    function existingType(uint32 _assetType) external view returns (bool);
    function getUnitCap(uint32 _assetType) external view returns (uint32);
    function setUnitCap(uint32 _assetType, uint32 _newUnitCap) external;
    function mint(address _to, uint256 _tokenId) external;
}

/// @title ERC-721 Capped Supply
/// @author double jump.tokyo inc.
/// @dev see https://medium.com/@makzent/ca1008866871
contract ERC721CappedSupply is IERC721CappedSupply, ERC721Mintable {
    using Uint256 for uint256;
    using Uint32 for uint32;

    uint32 private assetTypeOffset;
    mapping(uint32 => uint32) private unitCap;
    mapping(uint32 => uint32) private unitCount;
    mapping(uint32 => bool) private unitCapIsSet;
    uint256 private assetTypeCap = 2**256-1;
    uint256 private assetTypeCount = 0;
    uint256 private totalCount = 0;

    constructor(uint32 _assetTypeOffset) public {
        setTypeOffset(_assetTypeOffset);
    }

    function isValidOffset(uint32 _offset) private pure returns (bool) {
        for (uint32 i = _offset; i > 0; i = i.div(10)) {
            if (i == 10) {
                return true;
            }
            if (i.mod(10) != 0) {
                return false;
            }
        }
        return false;
    }

    function totalSupply() public view returns (uint256) {
        return totalCount;
    }

    function setTypeOffset(uint32 _assetTypeOffset) private {
        require(isValidOffset(_assetTypeOffset),  "Offset is invalid");
        assetTypeCap = assetTypeCap / _assetTypeOffset;
        assetTypeOffset = _assetTypeOffset;
    }

    function getTypeOffset() public view returns (uint256) {
        return assetTypeOffset;
    }

    function setTypeCap(uint32 _newTypeCap) public onlyMinter() {
        require(_newTypeCap < assetTypeCap, "New type cap cannot be less than existing type cap");
        require(_newTypeCap >= assetTypeCount, "New type cap must be more than current type count");
        assetTypeCap = _newTypeCap;
        emit SetTypeCap(_newTypeCap);
    }

    function getTypeCap() public view returns (uint256) {
        return assetTypeCap;
    }

    function getTypeCount() public view returns (uint256) {
        return assetTypeCount;
    }

    function existingType(uint32 _assetType) public view returns (bool) {
        return unitCapIsSet[_assetType];
    }

    function setUnitCap(uint32 _assetType, uint32 _newUnitCap) public onlyMinter() {
        require(_assetType != 0, "Asset Type must not be 0");
        require(_newUnitCap < assetTypeOffset, "New unit cap must be less than asset type offset");

        if (!existingType(_assetType)) {
            unitCapIsSet[_assetType] = true;
            assetTypeCount = assetTypeCount.add(1);
            require(assetTypeCount <= assetTypeCap, "Asset type cap is exceeded");
        } else {
            require(_newUnitCap < getUnitCap(_assetType), "New unit cap must be less than previous unit cap");
            require(_newUnitCap >= getUnitCount(_assetType), "New unit cap must be more than current unit count");
        }

        unitCap[_assetType] = _newUnitCap;
        emit SetUnitCap(_assetType, _newUnitCap);
    }

    function getUnitCap(uint32 _assetType) public view returns (uint32) {
        require(existingType(_assetType), "Asset type does not exist");
        return unitCap[_assetType];
    }

    function getUnitCount(uint32 _assetType) public view returns (uint32) {
        return unitCount[_assetType];
    }

    function mint(address _to, uint256 _tokenId) public onlyMinter() {
        require(_tokenId.mod(assetTypeOffset) != 0, "Index must not be 0");
        uint32 assetType = uint32(_tokenId.div(assetTypeOffset));
        unitCount[assetType] = unitCount[assetType].add(1);
        totalCount = totalCount.add(1);
        require(unitCount[assetType] <= getUnitCap(assetType), "Asset unit cap is exceed");
        super.mint(_to, _tokenId);
    }
}

contract BFHUnit is
                    ERC721TokenPausable,
                    ERC721CappedSupply(10000),
                    ERC721Metadata("BFH:Unit", "BFHU", "https://bravefrontierheroes.com/metadata/units/")
                    {

    event UpdateApprovalProxy(address _newProxyContract);
    IApprovalProxy public approvalProxy;
    constructor(address _approvalProxy) public {
        setApprovalProxy(_approvalProxy);
    }

    function setApprovalProxy(address _new) public onlyOperator() {
        approvalProxy = IApprovalProxy(_new);
        emit UpdateApprovalProxy(_new);
    }

    function setApprovalForAll(address _spender, bool _approved) public {
        if (address(approvalProxy) != address(0x0) && _spender.isContract()) {
            approvalProxy.setApprovalForAll(msg.sender, _spender, _approved);
        }
        super.setApprovalForAll(_spender, _approved);
    }

    function isApprovedForAll(address _owner, address _spender) public view returns (bool) {
        bool original = super.isApprovedForAll(_owner, _spender);
        if (address(approvalProxy) != address(0x0)) {
            return approvalProxy.isApprovedForAll(_owner, _spender, original);
        }
        return original;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_approvalProxy","type":"address"}],"payable":false,"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":true,"internalType":"address","name":"account","type":"address"}],"name":"MinterAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"MinterRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"OperatorAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"OperatorRemoved","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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_typeCap","type":"uint256"}],"name":"SetTypeCap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint32","name":"_assetType","type":"uint32"},{"indexed":false,"internalType":"uint32","name":"_unitCap","type":"uint32"}],"name":"SetUnitCap","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"TokenPaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"TokenPauserAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"TokenPauserRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"TokenUnpaused","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_newProxyContract","type":"address"}],"name":"UpdateApprovalProxy","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"tokenUriPrefix","type":"string"}],"name":"UpdateTokenURIPrefix","type":"event"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addMinter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addOperator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addTokenPauser","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"approvalProxy","outputs":[{"internalType":"contract IApprovalProxy","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_approved","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"exist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint32","name":"_assetType","type":"uint32"}],"name":"existingType","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTypeCap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTypeCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getTypeOffset","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint32","name":"_assetType","type":"uint32"}],"name":"getUnitCap","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint32","name":"_assetType","type":"uint32"}],"name":"getUnitCount","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_spender","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isOperator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"isTokenPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isTokenPauser","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"mint","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"pauseToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeMinter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeOperator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeTokenPauser","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"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":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_new","type":"address"}],"name":"setApprovalProxy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"string","name":"_tokenUriPrefix","type":"string"}],"name":"setTokenURIPrefix","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint32","name":"_newTypeCap","type":"uint32"}],"name":"setTypeCap","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint32","name":"_assetType","type":"uint32"},{"internalType":"uint32","name":"_newUnitCap","type":"uint32"}],"name":"setUnitCap","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"unpauseToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"withdrawEther","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]

6080604052600019600e556000600f5560006010553480156200002157600080fd5b5060405162003cd738038062003cd7833981810160405260208110156200004757600080fd5b5051604080518082018252600881527f4246483a556e697400000000000000000000000000000000000000000000000060208281019190915282518084018452600481527f424648550000000000000000000000000000000000000000000000000000000081830152835160608101909452602f80855292939092909162003ca890830139612710620001037f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b036200024416565b620001377f80ac58cd000000000000000000000000000000000000000000000000000000006001600160e01b036200024416565b6200016b7f7f5828d0000000000000000000000000000000000000000000000000000000006001600160e01b036200024416565b6200017f336001600160e01b036200031316565b6200019a3360066200037c60201b620027131790919060201c565b6005805460ff60a01b19169055620001c06007336200037c602090811b6200271317901c565b620001d4336001600160e01b036200042316565b620001e8816001600160e01b03620004f516565b508251620001fe906011906020860190620009c0565b50815162000214906012906020850190620009c0565b5062000229816001600160e01b03620005a716565b5050506200023d81620006dc60201b60201c565b5062000a62565b7fffffffff000000000000000000000000000000000000000000000000000000008082161415620002d657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604482015290519081900360640190fd5b7fffffffff00000000000000000000000000000000000000000000000000000000166000908152602081905260409020805460ff19166001179055565b6000620003286001600160e01b03620007b016565b600580546001600160a01b0319166001600160a01b0385811691821790925560405192935091908316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6200039182826001600160e01b03620007c016565b15620003fe57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f726f6c6520616c72656164792068617320746865206163636f756e7400000000604482015290519081900360640190fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b62000437336001600160e01b03620007df16565b620004a357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4d757374206265206f70657261746f7200000000000000000000000000000000604482015290519081900360640190fd5b620004be8160096200037c60201b620027131790919060201c565b6040516001600160a01b038216907f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f690600090a250565b62000509816001600160e01b036200080416565b6200057557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f4f666673657420697320696e76616c6964000000000000000000000000000000604482015290519081900360640190fd5b8063ffffffff16600e54816200058757fe5b04600e55600a805463ffffffff191663ffffffff92909216919091179055565b620005bb336001600160e01b03620007df16565b6200062757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4d757374206265206f70657261746f7200000000000000000000000000000000604482015290519081900360640190fd5b80516200063c906013906020840190620009c0565b507fd5e477fc51908e22673125c3b4666c4a72f49feb8665fd3875e224a58ca9659a816040518080602001828103825283818151815260200191508051906020019080838360005b838110156200069e57818101518382015260200162000684565b50505050905090810190601f168015620006cc5780820380516001836020036101000a031916815260200191505b509250505060405180910390a150565b620006f0336001600160e01b03620007df16565b6200075c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f4d757374206265206f70657261746f7200000000000000000000000000000000604482015290519081900360640190fd5b601480546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f12be4820d03362d1f48434d870b2fc1549b3a3d16d891eeaac7c3073f3ded8b79181900360200190a150565b6005546001600160a01b03165b90565b6001600160a01b03166000908152602091909152604090205460ff1690565b6000620007fc826006620007c060201b620026f41790919060201c565b90505b919050565b6000815b63ffffffff81161562000891578063ffffffff16600a141562000830576001915050620007ff565b62000851600a8263ffffffff166200089a60201b62002f0d1790919060201c565b63ffffffff161562000868576000915050620007ff565b62000889600a8263ffffffff166200092d60201b62002f6a1790919060201c565b905062000808565b50600092915050565b600063ffffffff82166200090f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6d6f64756c6f2062792030000000000000000000000000000000000000000000604482015290519081900360640190fd5b8163ffffffff168363ffffffff16816200092557fe5b069392505050565b600063ffffffff8216620009a257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f6469766973696f6e206279203000000000000000000000000000000000000000604482015290519081900360640190fd5b8163ffffffff168363ffffffff1681620009b857fe5b049392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1062000a0357805160ff191683800117855562000a33565b8280016001018555821562000a33579182015b8281111562000a3357825182559160200191906001019062000a16565b5062000a4192915062000a45565b5090565b620007bd91905b8082111562000a41576000815560010162000a4c565b6132368062000a726000396000f3fe6080604052600436106102725760003560e01c8063776ab6341161014f578063ac8a584a116100c1578063ca1728fd1161007a578063ca1728fd14610a8e578063d644736814610ac6578063e985e9c514610af0578063ed841bf114610b2b578063f2fde38b14610b5e578063fbd395f814610b9157610272565b8063ac8a584a146108f3578063b88d4fde14610926578063b97d7895146109ec578063c000582714610a1c578063c2508c4614610a31578063c87b56dd14610a6457610272565b8063983b2d5611610113578063983b2d56146107395780639870d7fe1461076c57806399e0dd7c1461079f5780639bb5c9c314610852578063a22cb46514610885578063aa271e1a146108c057610272565b8063776ab634146106bb5780637d02b1a3146106e55780638456cb59146106fa5780638da5cb5b1461070f57806395d89b411461072457610272565b80634dd09f33116101e85780636352211e116101ac5780636352211e146105b35780636d70f7ae146105dd57806370a08231146106105780637362377b14610643578063739f66871461065857806374db07d81461068857610272565b80634dd09f33146104e65780634ebbc92a146104fb578063532efe60146105255780635c975abb1461056e57806362977e2c1461058357610272565b806323b872dd1161023a57806323b872dd146103e45780632cff5b391461041a5780633092afd51461042f5780633f4ba83a1461046257806340c10f191461047757806342842e0e146104b057610272565b806301ffc9a71461027757806306fdde03146102bf578063081812fc14610349578063095ea7b31461038f57806318160ddd146103bd575b600080fd5b34801561028357600080fd5b506102ab6004803603602081101561029a57600080fd5b50356001600160e01b031916610bbb565b604080519115158252519081900360200190f35b3480156102cb57600080fd5b506102d4610bda565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561030e5781810151838201526020016102f6565b50505050905090810190601f16801561033b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561035557600080fd5b506103736004803603602081101561036c57600080fd5b5035610c71565b604080516001600160a01b039092168252519081900360200190f35b6103bb600480360360408110156103a557600080fd5b506001600160a01b038135169060200135610ce9565b005b3480156103c957600080fd5b506103d2610da7565b60408051918252519081900360200190f35b6103bb600480360360608110156103fa57600080fd5b506001600160a01b03813581169160208101359091169060400135610dad565b34801561042657600080fd5b506103d2610e64565b34801561043b57600080fd5b506103bb6004803603602081101561045257600080fd5b50356001600160a01b0316610e6a565b34801561046e57600080fd5b506103bb610eff565b34801561048357600080fd5b506103bb6004803603604081101561049a57600080fd5b506001600160a01b038135169060200135610fe3565b6103bb600480360360608110156104c657600080fd5b506001600160a01b03813581169160208101359091169060400135611195565b3480156104f257600080fd5b50610373611246565b34801561050757600080fd5b506102ab6004803603602081101561051e57600080fd5b5035611255565b34801561053157600080fd5b506105556004803603602081101561054857600080fd5b503563ffffffff16611266565b6040805163ffffffff9092168252519081900360200190f35b34801561057a57600080fd5b506102ab611281565b34801561058f57600080fd5b506103bb600480360360208110156105a657600080fd5b503563ffffffff16611291565b3480156105bf57600080fd5b50610373600480360360208110156105d657600080fd5b50356113aa565b3480156105e957600080fd5b506102ab6004803603602081101561060057600080fd5b50356001600160a01b0316611422565b34801561061c57600080fd5b506103d26004803603602081101561063357600080fd5b50356001600160a01b0316611435565b34801561064f57600080fd5b506103bb611450565b34801561066457600080fd5b506105556004803603602081101561067b57600080fd5b503563ffffffff166114cd565b34801561069457600080fd5b506103bb600480360360208110156106ab57600080fd5b50356001600160a01b0316611545565b3480156106c757600080fd5b506103bb600480360360208110156106de57600080fd5b50356115da565b3480156106f157600080fd5b506103d26116ae565b34801561070657600080fd5b506103bb6116b4565b34801561071b57600080fd5b5061037361179b565b34801561073057600080fd5b506102d46117aa565b34801561074557600080fd5b506103bb6004803603602081101561075c57600080fd5b50356001600160a01b031661180b565b34801561077857600080fd5b506103bb6004803603602081101561078f57600080fd5b50356001600160a01b03166118a0565b3480156107ab57600080fd5b506103bb600480360360208110156107c257600080fd5b8101906020810181356401000000008111156107dd57600080fd5b8201836020820111156107ef57600080fd5b8035906020019184600183028401116401000000008311171561081157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611935945050505050565b34801561085e57600080fd5b506103bb6004803603602081101561087557600080fd5b50356001600160a01b0316611a32565b34801561089157600080fd5b506103bb600480360360408110156108a857600080fd5b506001600160a01b0381351690602001351515611ad3565b3480156108cc57600080fd5b506102ab600480360360208110156108e357600080fd5b50356001600160a01b0316611b82565b3480156108ff57600080fd5b506103bb6004803603602081101561091657600080fd5b50356001600160a01b0316611b95565b6103bb6004803603608081101561093c57600080fd5b6001600160a01b0382358116926020810135909116916040820135919081019060808101606082013564010000000081111561097757600080fd5b82018360208201111561098957600080fd5b803590602001918460018302840111640100000000831117156109ab57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611c2a945050505050565b3480156109f857600080fd5b506102ab60048036036020811015610a0f57600080fd5b503563ffffffff16611ce3565b348015610a2857600080fd5b506103d2611cfe565b348015610a3d57600080fd5b506103bb60048036036020811015610a5457600080fd5b50356001600160a01b0316611d0a565b348015610a7057600080fd5b506102d460048036036020811015610a8757600080fd5b5035611d9f565b348015610a9a57600080fd5b506103bb60048036036040811015610ab157600080fd5b5063ffffffff81358116916020013516611e46565b348015610ad257600080fd5b506102ab60048036036020811015610ae957600080fd5b50356120e0565b348015610afc57600080fd5b506102ab60048036036040811015610b1357600080fd5b506001600160a01b03813581169160200135166120f5565b348015610b3757600080fd5b506102ab60048036036020811015610b4e57600080fd5b50356001600160a01b03166121af565b348015610b6a57600080fd5b506103bb60048036036020811015610b8157600080fd5b50356001600160a01b03166121c2565b348015610b9d57600080fd5b506103bb60048036036020811015610bb457600080fd5b5035612218565b6001600160e01b03191660009081526020819052604090205460ff1690565b60118054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610c665780601f10610c3b57610100808354040283529160200191610c66565b820191906000526020600020905b815481529060010190602001808311610c4957829003601f168201915b505050505090505b90565b6000610c7c826122fa565b610ccd576040805162461bcd60e51b815260206004820152601e60248201527f605f746f6b656e496460206973206e6f7420612076616c6964204e46542e0000604482015290519081900360640190fd5b506000908152600360205260409020546001600160a01b031690565b6000610cf4826113aa565b9050336001600160a01b0382161480610d125750610d1281336120f5565b610d4d5760405162461bcd60e51b815260040180806020018281038252605d8152602001806130fb605d913960600191505060405180910390fd5b60008281526003602052604080822080546001600160a01b0319166001600160a01b0387169081179091559051849233917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259190a4505050565b60105490565b600554600160a01b900460ff1615610dff576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b80610e09816120e0565b15610e53576040805162461bcd60e51b8152602060048201526015602482015274151bdad95b94185d5cd8589b194e881c185d5cd959605a1b604482015290519081900360640190fd5b610e5e848484612317565b50505050565b600e5490565b610e7333611422565b610eb7576040805162461bcd60e51b815260206004820152601060248201526f26bab9ba1031329037b832b930ba37b960811b604482015290519081900360640190fd5b610ec860098263ffffffff61247416565b6040516001600160a01b038216907fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb6669290600090a250565b610f0833611422565b610f4c576040805162461bcd60e51b815260206004820152601060248201526f26bab9ba1031329037b832b930ba37b960811b604482015290519081900360640190fd5b600554600160a01b900460ff16610fa1576040805162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015290519081900360640190fd5b6005805460ff60a01b191690556040805133815290517f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa9181900360200190a1565b610fec33611b82565b61102e576040805162461bcd60e51b815260206004820152600e60248201526d26bab9ba1031329036b4b73a32b960911b604482015290519081900360640190fd5b600a5461104690829063ffffffff908116906124f116565b61108d576040805162461bcd60e51b81526020600482015260136024820152720496e646578206d757374206e6f74206265203606c1b604482015290519081900360640190fd5b600a546000906110a890839063ffffffff9081169061254416565b63ffffffff8082166000908152600c60205260409020549192506110d29181169060019061259916565b63ffffffff8281166000908152600c60205260409020805463ffffffff19169282169290921790915560105461110b916001906125f016565b601055611117816114cd565b63ffffffff8281166000908152600c602052604090205491811691161115611186576040805162461bcd60e51b815260206004820152601860248201527f417373657420756e697420636170206973206578636565640000000000000000604482015290519081900360640190fd5b611190838361263e565b505050565b600554600160a01b900460ff16156111e7576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b806111f1816120e0565b1561123b576040805162461bcd60e51b8152602060048201526015602482015274151bdad95b94185d5cd8589b194e881c185d5cd959605a1b604482015290519081900360640190fd5b610e5e848484612693565b6014546001600160a01b031681565b6000611260826122fa565b92915050565b63ffffffff9081166000908152600c60205260409020541690565b600554600160a01b900460ff1690565b61129a33611b82565b6112dc576040805162461bcd60e51b815260206004820152600e60248201526d26bab9ba1031329036b4b73a32b960911b604482015290519081900360640190fd5b600e548163ffffffff16106113225760405162461bcd60e51b81526004018080602001828103825260328152602001806131796032913960400191505060405180910390fd5b600f548163ffffffff1610156113695760405162461bcd60e51b81526004018080602001828103825260318152602001806131ab6031913960400191505060405180910390fd5b63ffffffff8116600e81905560408051918252517fcffe07c9e7982b6c56cb569d21caedd78c8fbc68a0cbdc4d963c21eae6e8f9109181900360200190a150565b60006113b5826122fa565b611406576040805162461bcd60e51b815260206004820152601e60248201527f605f746f6b656e496460206973206e6f7420612076616c6964204e46542e0000604482015290519081900360640190fd5b506000908152600160205260409020546001600160a01b031690565b600061126060068363ffffffff6126f416565b6001600160a01b031660009081526002602052604090205490565b61145933611422565b61149d576040805162461bcd60e51b815260206004820152601060248201526f26bab9ba1031329037b832b930ba37b960811b604482015290519081900360640190fd5b6040513390303180156108fc02916000818181858888f193505050501580156114ca573d6000803e3d6000fd5b50565b60006114d882611ce3565b611529576040805162461bcd60e51b815260206004820152601960248201527f4173736574207479706520646f6573206e6f7420657869737400000000000000604482015290519081900360640190fd5b5063ffffffff9081166000908152600b60205260409020541690565b61154e33611422565b611592576040805162461bcd60e51b815260206004820152601060248201526f26bab9ba1031329037b832b930ba37b960811b604482015290519081900360640190fd5b6115a360078263ffffffff61271316565b6040516001600160a01b038216907fff12d576e2fecf516eb406e6618d5e97bcc8046690863b984069b15ada11d61290600090a250565b6115e3336121af565b61161e5760405162461bcd60e51b81526004018080602001828103825260268152602001806131dc6026913960400191505060405180910390fd5b611627816120e0565b61166e576040805162461bcd60e51b8152602060048201526013602482015272151bdad95b881a5cc81b9bdd081c185d5cd959606a1b604482015290519081900360640190fd5b600081815260086020526040808220805460ff191690555182917f0cfa9cc56bacd896c88effb6a4051b954fcaaf2de7ae98882e39f294ea65184391a250565b600f5490565b6116bd33611422565b611701576040805162461bcd60e51b815260206004820152601060248201526f26bab9ba1031329037b832b930ba37b960811b604482015290519081900360640190fd5b600554600160a01b900460ff1615611753576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6005805460ff60a01b1916600160a01b1790556040805133815290517f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2589181900360200190a1565b6005546001600160a01b031690565b60128054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610c665780601f10610c3b57610100808354040283529160200191610c66565b61181433611422565b611858576040805162461bcd60e51b815260206004820152601060248201526f26bab9ba1031329037b832b930ba37b960811b604482015290519081900360640190fd5b61186960098263ffffffff61271316565b6040516001600160a01b038216907f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f690600090a250565b6118a933611422565b6118ed576040805162461bcd60e51b815260206004820152601060248201526f26bab9ba1031329037b832b930ba37b960811b604482015290519081900360640190fd5b6118fe60068263ffffffff61271316565b6040516001600160a01b038216907fac6fa858e9350a46cec16539926e0fde25b7629f84b5a72bffaae4df888ae86d90600090a250565b61193e33611422565b611982576040805162461bcd60e51b815260206004820152601060248201526f26bab9ba1031329037b832b930ba37b960811b604482015290519081900360640190fd5b8051611995906013906020840190612e75565b507fd5e477fc51908e22673125c3b4666c4a72f49feb8665fd3875e224a58ca9659a816040518080602001828103825283818151815260200191508051906020019080838360005b838110156119f55781810151838201526020016119dd565b50505050905090810190601f168015611a225780820380516001836020036101000a031916815260200191505b509250505060405180910390a150565b611a3b33611422565b611a7f576040805162461bcd60e51b815260206004820152601060248201526f26bab9ba1031329037b832b930ba37b960811b604482015290519081900360640190fd5b601480546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f12be4820d03362d1f48434d870b2fc1549b3a3d16d891eeaac7c3073f3ded8b79181900360200190a150565b6014546001600160a01b031615801590611afa5750611afa826001600160a01b0316612794565b15611b745760145460408051631b3b02e560e11b81523360048201526001600160a01b03858116602483015284151560448301529151919092169163367605ca91606480830192600092919082900301818387803b158015611b5b57600080fd5b505af1158015611b6f573d6000803e3d6000fd5b505050505b611b7e828261279a565b5050565b600061126060098363ffffffff6126f416565b611b9e33611422565b611be2576040805162461bcd60e51b815260206004820152601060248201526f26bab9ba1031329037b832b930ba37b960811b604482015290519081900360640190fd5b611bf360068263ffffffff61247416565b6040516001600160a01b038216907f80c0b871b97b595b16a7741c1b06fed0c6f6f558639f18ccbce50724325dc40d90600090a250565b600554600160a01b900460ff1615611c7c576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b81611c86816120e0565b15611cd0576040805162461bcd60e51b8152602060048201526015602482015274151bdad95b94185d5cd8589b194e881c185d5cd959605a1b604482015290519081900360640190fd5b611cdc858585856127a5565b5050505050565b63ffffffff166000908152600d602052604090205460ff1690565b600a5463ffffffff1690565b611d1333611422565b611d57576040805162461bcd60e51b815260206004820152601060248201526f26bab9ba1031329037b832b930ba37b960811b604482015290519081900360640190fd5b611d6860078263ffffffff61247416565b6040516001600160a01b038216907f2186c7d8e4b2d6a73790355b1a465872175798d2366146e638fc885d54460b8590600090a250565b6060611260611dad83612804565b6013805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015611e335780601f10611e0857610100808354040283529160200191611e33565b820191906000526020600020905b815481529060010190602001808311611e1657829003601f168201915b50505050506128d990919063ffffffff16565b611e4f33611b82565b611e91576040805162461bcd60e51b815260206004820152600e60248201526d26bab9ba1031329036b4b73a32b960911b604482015290519081900360640190fd5b63ffffffff8216611ee9576040805162461bcd60e51b815260206004820152601860248201527f41737365742054797065206d757374206e6f7420626520300000000000000000604482015290519081900360640190fd5b600a5463ffffffff90811690821610611f335760405162461bcd60e51b81526004018080602001828103825260308152602001806130cb6030913960400191505060405180910390fd5b611f3c82611ce3565b611fd45763ffffffff8083166000908152600d60205260409020805460ff19166001908117909155600f54611f74929091906125f016565b600f819055600e541015611fcf576040805162461bcd60e51b815260206004820152601a60248201527f4173736574207479706520636170206973206578636565646564000000000000604482015290519081900360640190fd5b612079565b611fdd826114cd565b63ffffffff168163ffffffff16106120265760405162461bcd60e51b81526004018080602001828103825260308152602001806130316030913960400191505060405180910390fd5b61202f82611266565b63ffffffff168163ffffffff1610156120795760405162461bcd60e51b815260040180806020018281038252603181526020018061309a6031913960400191505060405180910390fd5b63ffffffff8281166000818152600b6020908152604091829020805463ffffffff19169486169485179055815192835282019290925281517f30525f07d1d2ff6b7c2b1817c13c37935c691304253dd353909b5c0381a9dc40929181900390910190a15050565b60009081526008602052604090205460ff1690565b6000806121028484612994565b6014549091506001600160a01b0316156121a857601454604080516346e67e2960e11b81526001600160a01b0387811660048301528681166024830152841515604483015291519190921691638dccfc52916064808301926020929190829003018186803b15801561217357600080fd5b505afa158015612187573d6000803e3d6000fd5b505050506040513d602081101561219d57600080fd5b505191506112609050565b9392505050565b600061126060078363ffffffff6126f416565b6121cb33611422565b61220f576040805162461bcd60e51b815260206004820152601060248201526f26bab9ba1031329037b832b930ba37b960811b604482015290519081900360640190fd5b6114ca816129a0565b612221336121af565b61225c5760405162461bcd60e51b81526004018080602001828103825260268152602001806131dc6026913960400191505060405180910390fd5b612265816120e0565b156122b7576040805162461bcd60e51b815260206004820152601760248201527f546f6b656e20697320616c726561647920706175736564000000000000000000604482015290519081900360640190fd5b600081815260086020526040808220805460ff191660011790555182917fc2d830ac158eec7b589dfadf012044c95b8646222991556ab4cd311e38bc77d191a250565b6000908152600160205260409020546001600160a01b0316151590565b61232133826129fe565b61235c5760405162461bcd60e51b8152600401808060200182810382526067815260200180612fca6067913960800191505060405180910390fd5b826001600160a01b031661236f826113aa565b6001600160a01b0316146123b45760405162461bcd60e51b81526004018080602001828103825260218152602001806131586021913960400191505060405180910390fd5b6001600160a01b03821661240f576040805162461bcd60e51b815260206004820152601a60248201527f605f746f6020697320746865207a65726f20616464726573732e000000000000604482015290519081900360640190fd5b612418816122fa565b612469576040805162461bcd60e51b815260206004820152601e60248201527f605f746f6b656e496460206973206e6f7420612076616c6964204e46542e0000604482015290519081900360640190fd5b611190838383612a5d565b61247e82826126f4565b6124cf576040805162461bcd60e51b815260206004820152601d60248201527f726f6c6520646f73656e2774206861766520746865206163636f756e74000000604482015290519081900360640190fd5b6001600160a01b0316600090815260209190915260409020805460ff19169055565b600081612533576040805162461bcd60e51b815260206004820152600b60248201526a06d6f64756c6f20627920360ac1b604482015290519081900360640190fd5b81838161253c57fe5b069392505050565b600081612588576040805162461bcd60e51b815260206004820152600d60248201526c06469766973696f6e206279203609c1b604482015290519081900360640190fd5b81838161259157fe5b049392505050565b600082820163ffffffff80851690821610156121a8576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b6000828201838110156121a8576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b61264733611b82565b612689576040805162461bcd60e51b815260206004820152600e60248201526d26bab9ba1031329036b4b73a32b960911b604482015290519081900360640190fd5b611b7e8282612b30565b6126ae83838360405180602001604052806000815250612c17565b6126e95760405162461bcd60e51b81526004018080602001828103825260398152602001806130616039913960400191505060405180910390fd5b611190838383610dad565b6001600160a01b03166000908152602091909152604090205460ff1690565b61271d82826126f4565b1561276f576040805162461bcd60e51b815260206004820152601c60248201527f726f6c6520616c72656164792068617320746865206163636f756e7400000000604482015290519081900360640190fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b3b151590565b611b7e338383612d4a565b8051156127f9576040805162461bcd60e51b815260206004820152601760248201527f64617461206973206e6f7420696d706c656d656e746564000000000000000000604482015290519081900360640190fd5b610e5e848484611195565b60606000808361281d57600360fc1b915060010161285a565b835b80156128585761010083049250600a8106603001600160f81b0260001b83179250600a818161284a57fe5b60019093019204905061281f565b505b6060816040519080825280601f01601f191660200182016040528015612887576020820181803883390190505b50905060005b828110156128d0578381602081106128a157fe5b1a60f81b8282815181106128b157fe5b60200101906001600160f81b031916908160001a90535060010161288d565b50949350505050565b606082826040516020018083805190602001908083835b6020831061290f5780518252601f1990920191602091820191016128f0565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b602083106129575780518252601f199092019160209182019101612938565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052905092915050565b60006121a88383612db8565b60006129aa61179b565b600580546001600160a01b0319166001600160a01b0385811691821790925560405192935091908316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600080612a0a836113aa565b9050806001600160a01b0316846001600160a01b03161480612a455750836001600160a01b0316612a3a84610c71565b6001600160a01b0316145b80612a555750612a5581856120f5565b949350505050565b612a6681612de6565b600081815260016020818152604080842080546001600160a01b0319166001600160a01b038881169190911790915587168452600290915290912054612aab91612e21565b6001600160a01b038085166000908152600260205260408082209390935590841681522054612ae190600163ffffffff6125f016565b6001600160a01b03808416600081815260026020526040808220949094559251849391928716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b612b39816122fa565b15612b8b576040805162461bcd60e51b815260206004820152601960248201527f6d696e7420746f6b656e20616c72656164792065786973747300000000000000604482015290519081900360640190fd5b600081815260016020818152604080842080546001600160a01b0319166001600160a01b0388169081179091558452600290915290912054612bcc916125f0565b6001600160a01b0383166000818152600260205260408082209390935591518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000612c2b846001600160a01b0316612794565b612c3757506001612a55565b604051630a85bd0160e11b815233600482018181526001600160a01b03888116602485015260448401879052608060648501908152865160848601528651600095928a169463150b7a029490938c938b938b939260a4019060208501908083838e5b83811015612cb1578181015183820152602001612c99565b50505050905090810190601f168015612cde5780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b158015612d0057600080fd5b505af1158015612d14573d6000803e3d6000fd5b505050506040513d6020811015612d2a57600080fd5b50516001600160e01b031916630a85bd0160e11b14915050949350505050565b6001600160a01b03838116600081815260046020908152604080832094871680845294825291829020805460ff1916861515908117909155825190815291517f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319281900390910190a3505050565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205460ff1690565b6000818152600360205260409020546001600160a01b0316156114ca57600090815260036020526040902080546001600160a01b0319169055565b600081831015612e6f576040805162461bcd60e51b81526020600482015260146024820152737375627472616374696f6e206f766572666c6f7760601b604482015290519081900360640190fd5b50900390565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10612eb657805160ff1916838001178555612ee3565b82800160010185558215612ee3579182015b82811115612ee3578251825591602001919060010190612ec8565b50612eef929150612ef3565b5090565b610c6e91905b80821115612eef5760008155600101612ef9565b600063ffffffff8216612f55576040805162461bcd60e51b815260206004820152600b60248201526a06d6f64756c6f20627920360ac1b604482015290519081900360640190fd5b8163ffffffff168363ffffffff168161253c57fe5b600063ffffffff8216612fb4576040805162461bcd60e51b815260206004820152600d60248201526c06469766973696f6e206279203609c1b604482015290519081900360640190fd5b8163ffffffff168363ffffffff168161259157fefe556e6c65737320606d73672e73656e64657260206973207468652063757272656e74206f776e65722c20616e20617574686f72697a6564206f70657261746f722c206f722074686520617070726f766564206164647265737320666f722074686973204e46542e4e657720756e697420636170206d757374206265206c657373207468616e2070726576696f757320756e697420636170605f746f60206973206120736d61727420636f6e747261637420616e64206f6e455243373231526563656976656420697320696e76616c69644e657720756e697420636170206d757374206265206d6f7265207468616e2063757272656e7420756e697420636f756e744e657720756e697420636170206d757374206265206c657373207468616e2061737365742074797065206f6666736574556e6c65737320606d73672e73656e64657260206973207468652063757272656e74204e4654206f776e65722c206f7220616e20617574686f72697a6564206f70657261746f72206f66207468652063757272656e74206f776e65722e605f66726f6d60206973206e6f74207468652063757272656e74206f776e65722e4e65772074797065206361702063616e6e6f74206265206c657373207468616e206578697374696e672074797065206361704e6577207479706520636170206d757374206265206d6f7265207468616e2063757272656e74207479706520636f756e744f6e6c7920746f6b656e207061757365722063616e2063616c6c2074686973206d6574686f64a265627a7a72315820d506f9fe37bed5f8efb64a109452c51bea04c52ee8ee21e051ae1d8d9d4d820164736f6c634300050c003268747470733a2f2f627261766566726f6e746965726865726f65732e636f6d2f6d657461646174612f756e6974732f000000000000000000000000aa06e5c117dbe8bc52dbaa18aaf447eda556b13c

Deployed Bytecode

0x6080604052600436106102725760003560e01c8063776ab6341161014f578063ac8a584a116100c1578063ca1728fd1161007a578063ca1728fd14610a8e578063d644736814610ac6578063e985e9c514610af0578063ed841bf114610b2b578063f2fde38b14610b5e578063fbd395f814610b9157610272565b8063ac8a584a146108f3578063b88d4fde14610926578063b97d7895146109ec578063c000582714610a1c578063c2508c4614610a31578063c87b56dd14610a6457610272565b8063983b2d5611610113578063983b2d56146107395780639870d7fe1461076c57806399e0dd7c1461079f5780639bb5c9c314610852578063a22cb46514610885578063aa271e1a146108c057610272565b8063776ab634146106bb5780637d02b1a3146106e55780638456cb59146106fa5780638da5cb5b1461070f57806395d89b411461072457610272565b80634dd09f33116101e85780636352211e116101ac5780636352211e146105b35780636d70f7ae146105dd57806370a08231146106105780637362377b14610643578063739f66871461065857806374db07d81461068857610272565b80634dd09f33146104e65780634ebbc92a146104fb578063532efe60146105255780635c975abb1461056e57806362977e2c1461058357610272565b806323b872dd1161023a57806323b872dd146103e45780632cff5b391461041a5780633092afd51461042f5780633f4ba83a1461046257806340c10f191461047757806342842e0e146104b057610272565b806301ffc9a71461027757806306fdde03146102bf578063081812fc14610349578063095ea7b31461038f57806318160ddd146103bd575b600080fd5b34801561028357600080fd5b506102ab6004803603602081101561029a57600080fd5b50356001600160e01b031916610bbb565b604080519115158252519081900360200190f35b3480156102cb57600080fd5b506102d4610bda565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561030e5781810151838201526020016102f6565b50505050905090810190601f16801561033b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561035557600080fd5b506103736004803603602081101561036c57600080fd5b5035610c71565b604080516001600160a01b039092168252519081900360200190f35b6103bb600480360360408110156103a557600080fd5b506001600160a01b038135169060200135610ce9565b005b3480156103c957600080fd5b506103d2610da7565b60408051918252519081900360200190f35b6103bb600480360360608110156103fa57600080fd5b506001600160a01b03813581169160208101359091169060400135610dad565b34801561042657600080fd5b506103d2610e64565b34801561043b57600080fd5b506103bb6004803603602081101561045257600080fd5b50356001600160a01b0316610e6a565b34801561046e57600080fd5b506103bb610eff565b34801561048357600080fd5b506103bb6004803603604081101561049a57600080fd5b506001600160a01b038135169060200135610fe3565b6103bb600480360360608110156104c657600080fd5b506001600160a01b03813581169160208101359091169060400135611195565b3480156104f257600080fd5b50610373611246565b34801561050757600080fd5b506102ab6004803603602081101561051e57600080fd5b5035611255565b34801561053157600080fd5b506105556004803603602081101561054857600080fd5b503563ffffffff16611266565b6040805163ffffffff9092168252519081900360200190f35b34801561057a57600080fd5b506102ab611281565b34801561058f57600080fd5b506103bb600480360360208110156105a657600080fd5b503563ffffffff16611291565b3480156105bf57600080fd5b50610373600480360360208110156105d657600080fd5b50356113aa565b3480156105e957600080fd5b506102ab6004803603602081101561060057600080fd5b50356001600160a01b0316611422565b34801561061c57600080fd5b506103d26004803603602081101561063357600080fd5b50356001600160a01b0316611435565b34801561064f57600080fd5b506103bb611450565b34801561066457600080fd5b506105556004803603602081101561067b57600080fd5b503563ffffffff166114cd565b34801561069457600080fd5b506103bb600480360360208110156106ab57600080fd5b50356001600160a01b0316611545565b3480156106c757600080fd5b506103bb600480360360208110156106de57600080fd5b50356115da565b3480156106f157600080fd5b506103d26116ae565b34801561070657600080fd5b506103bb6116b4565b34801561071b57600080fd5b5061037361179b565b34801561073057600080fd5b506102d46117aa565b34801561074557600080fd5b506103bb6004803603602081101561075c57600080fd5b50356001600160a01b031661180b565b34801561077857600080fd5b506103bb6004803603602081101561078f57600080fd5b50356001600160a01b03166118a0565b3480156107ab57600080fd5b506103bb600480360360208110156107c257600080fd5b8101906020810181356401000000008111156107dd57600080fd5b8201836020820111156107ef57600080fd5b8035906020019184600183028401116401000000008311171561081157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611935945050505050565b34801561085e57600080fd5b506103bb6004803603602081101561087557600080fd5b50356001600160a01b0316611a32565b34801561089157600080fd5b506103bb600480360360408110156108a857600080fd5b506001600160a01b0381351690602001351515611ad3565b3480156108cc57600080fd5b506102ab600480360360208110156108e357600080fd5b50356001600160a01b0316611b82565b3480156108ff57600080fd5b506103bb6004803603602081101561091657600080fd5b50356001600160a01b0316611b95565b6103bb6004803603608081101561093c57600080fd5b6001600160a01b0382358116926020810135909116916040820135919081019060808101606082013564010000000081111561097757600080fd5b82018360208201111561098957600080fd5b803590602001918460018302840111640100000000831117156109ab57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611c2a945050505050565b3480156109f857600080fd5b506102ab60048036036020811015610a0f57600080fd5b503563ffffffff16611ce3565b348015610a2857600080fd5b506103d2611cfe565b348015610a3d57600080fd5b506103bb60048036036020811015610a5457600080fd5b50356001600160a01b0316611d0a565b348015610a7057600080fd5b506102d460048036036020811015610a8757600080fd5b5035611d9f565b348015610a9a57600080fd5b506103bb60048036036040811015610ab157600080fd5b5063ffffffff81358116916020013516611e46565b348015610ad257600080fd5b506102ab60048036036020811015610ae957600080fd5b50356120e0565b348015610afc57600080fd5b506102ab60048036036040811015610b1357600080fd5b506001600160a01b03813581169160200135166120f5565b348015610b3757600080fd5b506102ab60048036036020811015610b4e57600080fd5b50356001600160a01b03166121af565b348015610b6a57600080fd5b506103bb60048036036020811015610b8157600080fd5b50356001600160a01b03166121c2565b348015610b9d57600080fd5b506103bb60048036036020811015610bb457600080fd5b5035612218565b6001600160e01b03191660009081526020819052604090205460ff1690565b60118054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610c665780601f10610c3b57610100808354040283529160200191610c66565b820191906000526020600020905b815481529060010190602001808311610c4957829003601f168201915b505050505090505b90565b6000610c7c826122fa565b610ccd576040805162461bcd60e51b815260206004820152601e60248201527f605f746f6b656e496460206973206e6f7420612076616c6964204e46542e0000604482015290519081900360640190fd5b506000908152600360205260409020546001600160a01b031690565b6000610cf4826113aa565b9050336001600160a01b0382161480610d125750610d1281336120f5565b610d4d5760405162461bcd60e51b815260040180806020018281038252605d8152602001806130fb605d913960600191505060405180910390fd5b60008281526003602052604080822080546001600160a01b0319166001600160a01b0387169081179091559051849233917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259190a4505050565b60105490565b600554600160a01b900460ff1615610dff576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b80610e09816120e0565b15610e53576040805162461bcd60e51b8152602060048201526015602482015274151bdad95b94185d5cd8589b194e881c185d5cd959605a1b604482015290519081900360640190fd5b610e5e848484612317565b50505050565b600e5490565b610e7333611422565b610eb7576040805162461bcd60e51b815260206004820152601060248201526f26bab9ba1031329037b832b930ba37b960811b604482015290519081900360640190fd5b610ec860098263ffffffff61247416565b6040516001600160a01b038216907fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb6669290600090a250565b610f0833611422565b610f4c576040805162461bcd60e51b815260206004820152601060248201526f26bab9ba1031329037b832b930ba37b960811b604482015290519081900360640190fd5b600554600160a01b900460ff16610fa1576040805162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015290519081900360640190fd5b6005805460ff60a01b191690556040805133815290517f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa9181900360200190a1565b610fec33611b82565b61102e576040805162461bcd60e51b815260206004820152600e60248201526d26bab9ba1031329036b4b73a32b960911b604482015290519081900360640190fd5b600a5461104690829063ffffffff908116906124f116565b61108d576040805162461bcd60e51b81526020600482015260136024820152720496e646578206d757374206e6f74206265203606c1b604482015290519081900360640190fd5b600a546000906110a890839063ffffffff9081169061254416565b63ffffffff8082166000908152600c60205260409020549192506110d29181169060019061259916565b63ffffffff8281166000908152600c60205260409020805463ffffffff19169282169290921790915560105461110b916001906125f016565b601055611117816114cd565b63ffffffff8281166000908152600c602052604090205491811691161115611186576040805162461bcd60e51b815260206004820152601860248201527f417373657420756e697420636170206973206578636565640000000000000000604482015290519081900360640190fd5b611190838361263e565b505050565b600554600160a01b900460ff16156111e7576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b806111f1816120e0565b1561123b576040805162461bcd60e51b8152602060048201526015602482015274151bdad95b94185d5cd8589b194e881c185d5cd959605a1b604482015290519081900360640190fd5b610e5e848484612693565b6014546001600160a01b031681565b6000611260826122fa565b92915050565b63ffffffff9081166000908152600c60205260409020541690565b600554600160a01b900460ff1690565b61129a33611b82565b6112dc576040805162461bcd60e51b815260206004820152600e60248201526d26bab9ba1031329036b4b73a32b960911b604482015290519081900360640190fd5b600e548163ffffffff16106113225760405162461bcd60e51b81526004018080602001828103825260328152602001806131796032913960400191505060405180910390fd5b600f548163ffffffff1610156113695760405162461bcd60e51b81526004018080602001828103825260318152602001806131ab6031913960400191505060405180910390fd5b63ffffffff8116600e81905560408051918252517fcffe07c9e7982b6c56cb569d21caedd78c8fbc68a0cbdc4d963c21eae6e8f9109181900360200190a150565b60006113b5826122fa565b611406576040805162461bcd60e51b815260206004820152601e60248201527f605f746f6b656e496460206973206e6f7420612076616c6964204e46542e0000604482015290519081900360640190fd5b506000908152600160205260409020546001600160a01b031690565b600061126060068363ffffffff6126f416565b6001600160a01b031660009081526002602052604090205490565b61145933611422565b61149d576040805162461bcd60e51b815260206004820152601060248201526f26bab9ba1031329037b832b930ba37b960811b604482015290519081900360640190fd5b6040513390303180156108fc02916000818181858888f193505050501580156114ca573d6000803e3d6000fd5b50565b60006114d882611ce3565b611529576040805162461bcd60e51b815260206004820152601960248201527f4173736574207479706520646f6573206e6f7420657869737400000000000000604482015290519081900360640190fd5b5063ffffffff9081166000908152600b60205260409020541690565b61154e33611422565b611592576040805162461bcd60e51b815260206004820152601060248201526f26bab9ba1031329037b832b930ba37b960811b604482015290519081900360640190fd5b6115a360078263ffffffff61271316565b6040516001600160a01b038216907fff12d576e2fecf516eb406e6618d5e97bcc8046690863b984069b15ada11d61290600090a250565b6115e3336121af565b61161e5760405162461bcd60e51b81526004018080602001828103825260268152602001806131dc6026913960400191505060405180910390fd5b611627816120e0565b61166e576040805162461bcd60e51b8152602060048201526013602482015272151bdad95b881a5cc81b9bdd081c185d5cd959606a1b604482015290519081900360640190fd5b600081815260086020526040808220805460ff191690555182917f0cfa9cc56bacd896c88effb6a4051b954fcaaf2de7ae98882e39f294ea65184391a250565b600f5490565b6116bd33611422565b611701576040805162461bcd60e51b815260206004820152601060248201526f26bab9ba1031329037b832b930ba37b960811b604482015290519081900360640190fd5b600554600160a01b900460ff1615611753576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6005805460ff60a01b1916600160a01b1790556040805133815290517f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2589181900360200190a1565b6005546001600160a01b031690565b60128054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610c665780601f10610c3b57610100808354040283529160200191610c66565b61181433611422565b611858576040805162461bcd60e51b815260206004820152601060248201526f26bab9ba1031329037b832b930ba37b960811b604482015290519081900360640190fd5b61186960098263ffffffff61271316565b6040516001600160a01b038216907f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f690600090a250565b6118a933611422565b6118ed576040805162461bcd60e51b815260206004820152601060248201526f26bab9ba1031329037b832b930ba37b960811b604482015290519081900360640190fd5b6118fe60068263ffffffff61271316565b6040516001600160a01b038216907fac6fa858e9350a46cec16539926e0fde25b7629f84b5a72bffaae4df888ae86d90600090a250565b61193e33611422565b611982576040805162461bcd60e51b815260206004820152601060248201526f26bab9ba1031329037b832b930ba37b960811b604482015290519081900360640190fd5b8051611995906013906020840190612e75565b507fd5e477fc51908e22673125c3b4666c4a72f49feb8665fd3875e224a58ca9659a816040518080602001828103825283818151815260200191508051906020019080838360005b838110156119f55781810151838201526020016119dd565b50505050905090810190601f168015611a225780820380516001836020036101000a031916815260200191505b509250505060405180910390a150565b611a3b33611422565b611a7f576040805162461bcd60e51b815260206004820152601060248201526f26bab9ba1031329037b832b930ba37b960811b604482015290519081900360640190fd5b601480546001600160a01b0383166001600160a01b0319909116811790915560408051918252517f12be4820d03362d1f48434d870b2fc1549b3a3d16d891eeaac7c3073f3ded8b79181900360200190a150565b6014546001600160a01b031615801590611afa5750611afa826001600160a01b0316612794565b15611b745760145460408051631b3b02e560e11b81523360048201526001600160a01b03858116602483015284151560448301529151919092169163367605ca91606480830192600092919082900301818387803b158015611b5b57600080fd5b505af1158015611b6f573d6000803e3d6000fd5b505050505b611b7e828261279a565b5050565b600061126060098363ffffffff6126f416565b611b9e33611422565b611be2576040805162461bcd60e51b815260206004820152601060248201526f26bab9ba1031329037b832b930ba37b960811b604482015290519081900360640190fd5b611bf360068263ffffffff61247416565b6040516001600160a01b038216907f80c0b871b97b595b16a7741c1b06fed0c6f6f558639f18ccbce50724325dc40d90600090a250565b600554600160a01b900460ff1615611c7c576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b81611c86816120e0565b15611cd0576040805162461bcd60e51b8152602060048201526015602482015274151bdad95b94185d5cd8589b194e881c185d5cd959605a1b604482015290519081900360640190fd5b611cdc858585856127a5565b5050505050565b63ffffffff166000908152600d602052604090205460ff1690565b600a5463ffffffff1690565b611d1333611422565b611d57576040805162461bcd60e51b815260206004820152601060248201526f26bab9ba1031329037b832b930ba37b960811b604482015290519081900360640190fd5b611d6860078263ffffffff61247416565b6040516001600160a01b038216907f2186c7d8e4b2d6a73790355b1a465872175798d2366146e638fc885d54460b8590600090a250565b6060611260611dad83612804565b6013805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015611e335780601f10611e0857610100808354040283529160200191611e33565b820191906000526020600020905b815481529060010190602001808311611e1657829003601f168201915b50505050506128d990919063ffffffff16565b611e4f33611b82565b611e91576040805162461bcd60e51b815260206004820152600e60248201526d26bab9ba1031329036b4b73a32b960911b604482015290519081900360640190fd5b63ffffffff8216611ee9576040805162461bcd60e51b815260206004820152601860248201527f41737365742054797065206d757374206e6f7420626520300000000000000000604482015290519081900360640190fd5b600a5463ffffffff90811690821610611f335760405162461bcd60e51b81526004018080602001828103825260308152602001806130cb6030913960400191505060405180910390fd5b611f3c82611ce3565b611fd45763ffffffff8083166000908152600d60205260409020805460ff19166001908117909155600f54611f74929091906125f016565b600f819055600e541015611fcf576040805162461bcd60e51b815260206004820152601a60248201527f4173736574207479706520636170206973206578636565646564000000000000604482015290519081900360640190fd5b612079565b611fdd826114cd565b63ffffffff168163ffffffff16106120265760405162461bcd60e51b81526004018080602001828103825260308152602001806130316030913960400191505060405180910390fd5b61202f82611266565b63ffffffff168163ffffffff1610156120795760405162461bcd60e51b815260040180806020018281038252603181526020018061309a6031913960400191505060405180910390fd5b63ffffffff8281166000818152600b6020908152604091829020805463ffffffff19169486169485179055815192835282019290925281517f30525f07d1d2ff6b7c2b1817c13c37935c691304253dd353909b5c0381a9dc40929181900390910190a15050565b60009081526008602052604090205460ff1690565b6000806121028484612994565b6014549091506001600160a01b0316156121a857601454604080516346e67e2960e11b81526001600160a01b0387811660048301528681166024830152841515604483015291519190921691638dccfc52916064808301926020929190829003018186803b15801561217357600080fd5b505afa158015612187573d6000803e3d6000fd5b505050506040513d602081101561219d57600080fd5b505191506112609050565b9392505050565b600061126060078363ffffffff6126f416565b6121cb33611422565b61220f576040805162461bcd60e51b815260206004820152601060248201526f26bab9ba1031329037b832b930ba37b960811b604482015290519081900360640190fd5b6114ca816129a0565b612221336121af565b61225c5760405162461bcd60e51b81526004018080602001828103825260268152602001806131dc6026913960400191505060405180910390fd5b612265816120e0565b156122b7576040805162461bcd60e51b815260206004820152601760248201527f546f6b656e20697320616c726561647920706175736564000000000000000000604482015290519081900360640190fd5b600081815260086020526040808220805460ff191660011790555182917fc2d830ac158eec7b589dfadf012044c95b8646222991556ab4cd311e38bc77d191a250565b6000908152600160205260409020546001600160a01b0316151590565b61232133826129fe565b61235c5760405162461bcd60e51b8152600401808060200182810382526067815260200180612fca6067913960800191505060405180910390fd5b826001600160a01b031661236f826113aa565b6001600160a01b0316146123b45760405162461bcd60e51b81526004018080602001828103825260218152602001806131586021913960400191505060405180910390fd5b6001600160a01b03821661240f576040805162461bcd60e51b815260206004820152601a60248201527f605f746f6020697320746865207a65726f20616464726573732e000000000000604482015290519081900360640190fd5b612418816122fa565b612469576040805162461bcd60e51b815260206004820152601e60248201527f605f746f6b656e496460206973206e6f7420612076616c6964204e46542e0000604482015290519081900360640190fd5b611190838383612a5d565b61247e82826126f4565b6124cf576040805162461bcd60e51b815260206004820152601d60248201527f726f6c6520646f73656e2774206861766520746865206163636f756e74000000604482015290519081900360640190fd5b6001600160a01b0316600090815260209190915260409020805460ff19169055565b600081612533576040805162461bcd60e51b815260206004820152600b60248201526a06d6f64756c6f20627920360ac1b604482015290519081900360640190fd5b81838161253c57fe5b069392505050565b600081612588576040805162461bcd60e51b815260206004820152600d60248201526c06469766973696f6e206279203609c1b604482015290519081900360640190fd5b81838161259157fe5b049392505050565b600082820163ffffffff80851690821610156121a8576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b6000828201838110156121a8576040805162461bcd60e51b81526020600482015260116024820152706164646974696f6e206f766572666c6f7760781b604482015290519081900360640190fd5b61264733611b82565b612689576040805162461bcd60e51b815260206004820152600e60248201526d26bab9ba1031329036b4b73a32b960911b604482015290519081900360640190fd5b611b7e8282612b30565b6126ae83838360405180602001604052806000815250612c17565b6126e95760405162461bcd60e51b81526004018080602001828103825260398152602001806130616039913960400191505060405180910390fd5b611190838383610dad565b6001600160a01b03166000908152602091909152604090205460ff1690565b61271d82826126f4565b1561276f576040805162461bcd60e51b815260206004820152601c60248201527f726f6c6520616c72656164792068617320746865206163636f756e7400000000604482015290519081900360640190fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b3b151590565b611b7e338383612d4a565b8051156127f9576040805162461bcd60e51b815260206004820152601760248201527f64617461206973206e6f7420696d706c656d656e746564000000000000000000604482015290519081900360640190fd5b610e5e848484611195565b60606000808361281d57600360fc1b915060010161285a565b835b80156128585761010083049250600a8106603001600160f81b0260001b83179250600a818161284a57fe5b60019093019204905061281f565b505b6060816040519080825280601f01601f191660200182016040528015612887576020820181803883390190505b50905060005b828110156128d0578381602081106128a157fe5b1a60f81b8282815181106128b157fe5b60200101906001600160f81b031916908160001a90535060010161288d565b50949350505050565b606082826040516020018083805190602001908083835b6020831061290f5780518252601f1990920191602091820191016128f0565b51815160209384036101000a600019018019909216911617905285519190930192850191508083835b602083106129575780518252601f199092019160209182019101612938565b6001836020036101000a03801982511681845116808217855250505050505090500192505050604051602081830303815290604052905092915050565b60006121a88383612db8565b60006129aa61179b565b600580546001600160a01b0319166001600160a01b0385811691821790925560405192935091908316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600080612a0a836113aa565b9050806001600160a01b0316846001600160a01b03161480612a455750836001600160a01b0316612a3a84610c71565b6001600160a01b0316145b80612a555750612a5581856120f5565b949350505050565b612a6681612de6565b600081815260016020818152604080842080546001600160a01b0319166001600160a01b038881169190911790915587168452600290915290912054612aab91612e21565b6001600160a01b038085166000908152600260205260408082209390935590841681522054612ae190600163ffffffff6125f016565b6001600160a01b03808416600081815260026020526040808220949094559251849391928716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b612b39816122fa565b15612b8b576040805162461bcd60e51b815260206004820152601960248201527f6d696e7420746f6b656e20616c72656164792065786973747300000000000000604482015290519081900360640190fd5b600081815260016020818152604080842080546001600160a01b0319166001600160a01b0388169081179091558452600290915290912054612bcc916125f0565b6001600160a01b0383166000818152600260205260408082209390935591518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000612c2b846001600160a01b0316612794565b612c3757506001612a55565b604051630a85bd0160e11b815233600482018181526001600160a01b03888116602485015260448401879052608060648501908152865160848601528651600095928a169463150b7a029490938c938b938b939260a4019060208501908083838e5b83811015612cb1578181015183820152602001612c99565b50505050905090810190601f168015612cde5780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b158015612d0057600080fd5b505af1158015612d14573d6000803e3d6000fd5b505050506040513d6020811015612d2a57600080fd5b50516001600160e01b031916630a85bd0160e11b14915050949350505050565b6001600160a01b03838116600081815260046020908152604080832094871680845294825291829020805460ff1916861515908117909155825190815291517f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319281900390910190a3505050565b6001600160a01b03918216600090815260046020908152604080832093909416825291909152205460ff1690565b6000818152600360205260409020546001600160a01b0316156114ca57600090815260036020526040902080546001600160a01b0319169055565b600081831015612e6f576040805162461bcd60e51b81526020600482015260146024820152737375627472616374696f6e206f766572666c6f7760601b604482015290519081900360640190fd5b50900390565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10612eb657805160ff1916838001178555612ee3565b82800160010185558215612ee3579182015b82811115612ee3578251825591602001919060010190612ec8565b50612eef929150612ef3565b5090565b610c6e91905b80821115612eef5760008155600101612ef9565b600063ffffffff8216612f55576040805162461bcd60e51b815260206004820152600b60248201526a06d6f64756c6f20627920360ac1b604482015290519081900360640190fd5b8163ffffffff168363ffffffff168161253c57fe5b600063ffffffff8216612fb4576040805162461bcd60e51b815260206004820152600d60248201526c06469766973696f6e206279203609c1b604482015290519081900360640190fd5b8163ffffffff168363ffffffff168161259157fefe556e6c65737320606d73672e73656e64657260206973207468652063757272656e74206f776e65722c20616e20617574686f72697a6564206f70657261746f722c206f722074686520617070726f766564206164647265737320666f722074686973204e46542e4e657720756e697420636170206d757374206265206c657373207468616e2070726576696f757320756e697420636170605f746f60206973206120736d61727420636f6e747261637420616e64206f6e455243373231526563656976656420697320696e76616c69644e657720756e697420636170206d757374206265206d6f7265207468616e2063757272656e7420756e697420636f756e744e657720756e697420636170206d757374206265206c657373207468616e2061737365742074797065206f6666736574556e6c65737320606d73672e73656e64657260206973207468652063757272656e74204e4654206f776e65722c206f7220616e20617574686f72697a6564206f70657261746f72206f66207468652063757272656e74206f776e65722e605f66726f6d60206973206e6f74207468652063757272656e74206f776e65722e4e65772074797065206361702063616e6e6f74206265206c657373207468616e206578697374696e672074797065206361704e6577207479706520636170206d757374206265206d6f7265207468616e2063757272656e74207479706520636f756e744f6e6c7920746f6b656e207061757365722063616e2063616c6c2074686973206d6574686f64a265627a7a72315820d506f9fe37bed5f8efb64a109452c51bea04c52ee8ee21e051ae1d8d9d4d820164736f6c634300050c0032

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000aa06e5c117dbe8bc52dbaa18aaf447eda556b13c

-----Decoded View---------------
Arg [0] : _approvalProxy (address): 0xAa06e5c117dbe8bC52dBaa18AaF447eDA556B13c

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000aa06e5c117dbe8bc52dbaa18aaf447eda556b13c


Deployed Bytecode Sourcemap

26572:1262:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4728:135;;8:9:-1;5:2;;;30:1;27;20:12;5:2;4728:135:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;4728:135:0;-1:-1:-1;;;;;;4728:135:0;;:::i;:::-;;;;;;;;;;;;;;;;;;17720:84;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17720:84:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;17720:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11430:206;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11430:206:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;11430:206:0;;:::i;:::-;;;;-1:-1:-1;;;;;11430:206:0;;;;;;;;;;;;;;10631:419;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;10631:419:0;;;;;;;;:::i;:::-;;23830:89;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23830:89:0;;;:::i;:::-;;;;;;;;;;;;;;;;20470:216;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;20470:216:0;;;;;;;;;;;;;;;;;:::i;24632:90::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24632:90:0;;;:::i;21702:141::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21702:141:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21702:141:0;-1:-1:-1;;;;;21702:141:0;;:::i;16684:124::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16684:124:0;;;:::i;26117:448::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26117:448:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;26117:448:0;;;;;;;;:::i;20238:224::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;20238:224:0;;;;;;;;;;;;;;;;;:::i;26878:35::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26878:35:0;;;:::i;21855:100::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21855:100:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21855:100:0;;:::i;25992:117::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25992:117:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25992:117:0;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;16468:78;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16468:78:0;;;:::i;24278:346::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24278:346:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24278:346:0;;;;:::i;9279:199::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9279:199:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9279:199:0;;:::i;16046:112::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16046:112:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16046:112:0;-1:-1:-1;;;;;16046:112:0;;:::i;9164:107::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;9164:107:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9164:107:0;-1:-1:-1;;;;;9164:107:0;;:::i;16816:108::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16816:108:0;;;:::i;25798:186::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25798:186:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25798:186:0;;;;:::i;19661:147::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19661:147:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19661:147:0;-1:-1:-1;;;;;19661:147:0;;:::i;19185:219::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19185:219:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19185:219:0;;:::i;24730:94::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24730:94:0;;;:::i;16554:122::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16554:122:0;;;:::i;14784:79::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;14784:79:0;;;:::i;17812:88::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17812:88:0;;;:::i;21561:133::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21561:133:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21561:133:0;-1:-1:-1;;;;;21561:133:0;;:::i;16166:139::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16166:139:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16166:139:0;-1:-1:-1;;;;;16166:139:0;;:::i;17526:186::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17526:186:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;17526:186:0;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;17526:186:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;17526:186:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;17526:186:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;17526:186:0;;-1:-1:-1;17526:186:0;;-1:-1:-1;;;;;17526:186:0:i;27022:158::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27022:158:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27022:158:0;-1:-1:-1;;;;;27022:158:0;;:::i;27188:301::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27188:301:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;27188:301:0;;;;;;;;;;:::i;21445:108::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;21445:108:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21445:108:0;-1:-1:-1;;;;;21445:108:0;;:::i;16313:147::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16313:147:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16313:147:0;-1:-1:-1;;;;;16313:147:0;;:::i;19979:251::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;19979:251:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;19979:251:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;19979:251:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;19979:251:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;19979:251:0;;-1:-1:-1;19979:251:0;;-1:-1:-1;;;;;19979:251:0:i;24832:118::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24832:118:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24832:118:0;;;;:::i;24174:96::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24174:96:0;;;:::i;19816:155::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19816:155:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19816:155:0;-1:-1:-1;;;;;19816:155:0;;:::i;17908:142::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17908:142:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17908:142:0;;:::i;24958:832::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24958:832:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24958:832:0;;;;;;;;;;;:::i;19412:116::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19412:116:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19412:116:0;;:::i;27497:334::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27497:334:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;27497:334:0;;;;;;;;;;:::i;19536:117::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19536:117:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19536:117:0;-1:-1:-1;;;;;19536:117:0;;:::i;15922:116::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;15922:116:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;15922:116:0;-1:-1:-1;;;;;15922:116:0;;:::i;18958:219::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18958:219:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;18958:219:0;;:::i;4728:135::-;-1:-1:-1;;;;;;4822:33:0;4798:4;4822:33;;;;;;;;;;;;;;4728:135::o;17720:84::-;17790:6;17783:13;;;;;;;;-1:-1:-1;;17783:13:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17757;;17783;;17790:6;;17783:13;;17790:6;17783:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17720:84;;:::o;11430:206::-;11490:7;11518:16;11525:8;11518:6;:16::i;:::-;11510:76;;;;;-1:-1:-1;;;11510:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11604:24:0;;;;:14;:24;;;;;;-1:-1:-1;;;;;11604:24:0;;11430:206::o;10631:419::-;10711:13;10727:17;10735:8;10727:7;:17::i;:::-;10711:33;-1:-1:-1;10763:10:0;-1:-1:-1;;;;;10763:19:0;;;;:58;;;10786:35;10803:5;10810:10;10786:16;:35::i;:::-;10755:181;;;;-1:-1:-1;;;10755:181:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10949:24;;;;:14;:24;;;;;;:36;;-1:-1:-1;;;;;;10949:36:0;-1:-1:-1;;;;;10949:36:0;;;;;;;;11001:41;;10949:24;;11010:10;;11001:41;;10949:24;11001:41;10631:419;;;:::o;23830:89::-;23901:10;;23830:89;:::o;20470:216::-;15765:7;;-1:-1:-1;;;15765:7:0;;;;15764:8;15756:37;;;;;-1:-1:-1;;;15756:37:0;;;;;;;;;;;;-1:-1:-1;;;15756:37:0;;;;;;;;;;;;;;;20617:8;18738:23;18752:8;18738:13;:23::i;:::-;18737:24;18729:58;;;;;-1:-1:-1;;;18729:58:0;;;;;;;;;;;;-1:-1:-1;;;18729:58:0;;;;;;;;;;;;;;;20638:40;20657:5;20664:3;20669:8;20638:18;:40::i;:::-;15804:1;20470:216;;;:::o;24632:90::-;24702:12;;24632:90;:::o;21702:141::-;15649:22;15660:10;15649;:22::i;:::-;15641:51;;;;;-1:-1:-1;;;15641:51:0;;;;;;;;;;;;-1:-1:-1;;;15641:51:0;;;;;;;;;;;;;;;21774:23;:7;21789;21774:23;:14;:23;:::i;:::-;21813:22;;-1:-1:-1;;;;;21813:22:0;;;;;;;;21702:141;:::o;16684:124::-;15649:22;15660:10;15649;:22::i;:::-;15641:51;;;;;-1:-1:-1;;;15641:51:0;;;;;;;;;;;;-1:-1:-1;;;15641:51:0;;;;;;;;;;;;;;;15862:7;;-1:-1:-1;;;15862:7:0;;;;15854:40;;;;;-1:-1:-1;;;15854:40:0;;;;;;;;;;;;-1:-1:-1;;;15854:40:0;;;;;;;;;;;;;;;16749:7;:15;;-1:-1:-1;;;;16749:15:0;;;16780:20;;;16789:10;16780:20;;;;;;;;;;;;;16684:124::o;26117:448::-;21378:20;21387:10;21378:8;:20::i;:::-;21370:47;;;;;-1:-1:-1;;;21370:47:0;;;;;;;;;;;;-1:-1:-1;;;21370:47:0;;;;;;;;;;;;;;;26214:15;;26201:29;;:8;;26214:15;;;;;26201:12;:29;:::i;:::-;26193:66;;;;;-1:-1:-1;;;26193:66:0;;;;;;;;;;;;-1:-1:-1;;;26193:66:0;;;;;;;;;;;;;;;26309:15;;26270:16;;26296:29;;:8;;26309:15;;;;;26296:12;:29;:::i;:::-;26360:20;;;;;;;;:9;:20;;;;;;26270:56;;-1:-1:-1;26360:27:0;;:20;;;26385:1;;26360:24;:27;:::i;:::-;26337:20;;;;;;;;:9;:20;;;;;:50;;-1:-1:-1;;26337:50:0;;;;;;;;;;;26411:10;;:17;;-1:-1:-1;;26411:14:0;:17;:::i;:::-;26398:10;:30;26471:21;26482:9;26471:10;:21::i;:::-;26447:45;:20;;;;;;;:9;:20;;;;;;:45;;;:20;;:45;;26439:82;;;;;-1:-1:-1;;;26439:82:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;26532:25;26543:3;26548:8;26532:10;:25::i;:::-;21428:1;26117:448;;:::o;20238:224::-;15765:7;;-1:-1:-1;;;15765:7:0;;;;15764:8;15756:37;;;;;-1:-1:-1;;;15756:37:0;;;;;;;;;;;;-1:-1:-1;;;15756:37:0;;;;;;;;;;;;;;;20389:8;18738:23;18752:8;18738:13;:23::i;:::-;18737:24;18729:58;;;;;-1:-1:-1;;;18729:58:0;;;;;;;;;;;;-1:-1:-1;;;18729:58:0;;;;;;;;;;;;;;;20410:44;20433:5;20440:3;20445:8;20410:22;:44::i;26878:35::-;;;-1:-1:-1;;;;;26878:35:0;;:::o;21855:100::-;21908:4;21932:15;21939:7;21932:6;:15::i;:::-;21925:22;21855:100;-1:-1:-1;;21855:100:0:o;25992:117::-;26080:21;;;;26054:6;26080:21;;;:9;:21;;;;;;;;25992:117::o;16468:78::-;16531:7;;-1:-1:-1;;;16531:7:0;;;;;16468:78::o;24278:346::-;21378:20;21387:10;21378:8;:20::i;:::-;21370:47;;;;;-1:-1:-1;;;21370:47:0;;;;;;;;;;;;-1:-1:-1;;;21370:47:0;;;;;;;;;;;;;;;24371:12;;24357:11;:26;;;24349:89;;;;-1:-1:-1;;;24349:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24472:14;;24457:11;:29;;;;24449:91;;;;-1:-1:-1;;;24449:91:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24551:26;;;:12;:26;;;24593:23;;;;;;;;;;;;;;;;24278:346;:::o;9279:199::-;9335:7;9363:16;9370:8;9363:6;:16::i;:::-;9355:76;;;;;-1:-1:-1;;;9355:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9449:21:0;;;;:11;:21;;;;;;-1:-1:-1;;;;;9449:21:0;;9279:199::o;16046:112::-;16104:4;16128:22;:9;16142:7;16128:22;:13;:22;:::i;9164:107::-;-1:-1:-1;;;;;9247:16:0;9220:7;9247:16;;;:8;:16;;;;;;;9164:107::o;16816:108::-;15649:22;15660:10;15649;:22::i;:::-;15641:51;;;;;-1:-1:-1;;;15641:51:0;;;;;;;;;;;;-1:-1:-1;;;15641:51:0;;;;;;;;;;;;;;;16874:42;;:10;;16902:4;16894:21;16874:42;;;;;;;;;16894:21;16874:10;:42;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16874:42:0;16816:108::o;25798:186::-;25858:6;25885:24;25898:10;25885:12;:24::i;:::-;25877:62;;;;;-1:-1:-1;;;25877:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25957:19:0;;;;;;;;:7;:19;;;;;;;;25798:186::o;19661:147::-;15649:22;15660:10;15649;:22::i;:::-;15641:51;;;;;-1:-1:-1;;;15641:51:0;;;;;;;;;;;;-1:-1:-1;;;15641:51:0;;;;;;;;;;;;;;;19735:24;:11;19751:7;19735:24;:15;:24;:::i;:::-;19775:25;;-1:-1:-1;;;;;19775:25:0;;;;;;;;19661:147;:::o;19185:219::-;18576:25;18590:10;18576:13;:25::i;:::-;18568:76;;;;-1:-1:-1;;;18568:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19269:23;19283:8;19269:13;:23::i;:::-;19261:55;;;;;-1:-1:-1;;;19261:55:0;;;;;;;;;;;;-1:-1:-1;;;19261:55:0;;;;;;;;;;;;;;;19352:5;19327:22;;;:12;:22;;;;;;:30;;-1:-1:-1;;19327:30:0;;;19373:23;19340:8;;19373:23;;;19185:219;:::o;24730:94::-;24802:14;;24730:94;:::o;16554:122::-;15649:22;15660:10;15649;:22::i;:::-;15641:51;;;;;-1:-1:-1;;;15641:51:0;;;;;;;;;;;;-1:-1:-1;;;15641:51:0;;;;;;;;;;;;;;;15765:7;;-1:-1:-1;;;15765:7:0;;;;15764:8;15756:37;;;;;-1:-1:-1;;;15756:37:0;;;;;;;;;;;;-1:-1:-1;;;15756:37:0;;;;;;;;;;;;;;;16620:7;:14;;-1:-1:-1;;;;16620:14:0;-1:-1:-1;;;16620:14:0;;;16650:18;;;16657:10;16650:18;;;;;;;;;;;;;16554:122::o;14784:79::-;14849:6;;-1:-1:-1;;;;;14849:6:0;14784:79;:::o;17812:88::-;17884:8;17877:15;;;;;;;;-1:-1:-1;;17877:15:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17851:13;;17877:15;;17884:8;;17877:15;;17884:8;17877:15;;;;;;;;;;;;;;;;;;;;;;;;21561:133;15649:22;15660:10;15649;:22::i;:::-;15641:51;;;;;-1:-1:-1;;;15641:51:0;;;;;;;;;;;;-1:-1:-1;;;15641:51:0;;;;;;;;;;;;;;;21630:20;:7;21642;21630:20;:11;:20;:::i;:::-;21666;;-1:-1:-1;;;;;21666:20:0;;;;;;;;21561:133;:::o;16166:139::-;15649:22;15660:10;15649;:22::i;:::-;15641:51;;;;;-1:-1:-1;;;15641:51:0;;;;;;;;;;;;-1:-1:-1;;;15641:51:0;;;;;;;;;;;;;;;16237:22;:9;16251:7;16237:22;:13;:22;:::i;:::-;16275;;-1:-1:-1;;;;;16275:22:0;;;;;;;;16166:139;:::o;17526:186::-;15649:22;15660:10;15649;:22::i;:::-;15641:51;;;;;-1:-1:-1;;;15641:51:0;;;;;;;;;;;;-1:-1:-1;;;15641:51:0;;;;;;;;;;;;;;;17617:34;;;;:16;;:34;;;;;:::i;:::-;;17667:37;17688:15;17667:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;17667:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17526:186;:::o;27022:158::-;15649:22;15660:10;15649;:22::i;:::-;15641:51;;;;;-1:-1:-1;;;15641:51:0;;;;;;;;;;;;-1:-1:-1;;;15641:51:0;;;;;;;;;;;;;;;27095:13;:36;;-1:-1:-1;;;;;27095:36:0;;-1:-1:-1;;;;;;27095:36:0;;;;;;;;27147:25;;;;;;;;;;;;;;;;27022:158;:::o;27188:301::-;27279:13;;-1:-1:-1;;;;;27279:13:0;27271:38;;;;:63;;;27313:21;:8;-1:-1:-1;;;;;27313:19:0;;:21::i;:::-;27267:160;;;27351:13;;:64;;;-1:-1:-1;;;27351:64:0;;27383:10;27351:64;;;;-1:-1:-1;;;;;27351:64:0;;;;;;;;;;;;;;;;:13;;;;;:31;;:64;;;;;:13;;:64;;;;;;;:13;;:64;;;5:2:-1;;;;30:1;27;20:12;5:2;27351:64:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27351:64:0;;;;27267:160;27437:44;27461:8;27471:9;27437:23;:44::i;:::-;27188:301;;:::o;21445:108::-;21501:4;21525:20;:7;21537;21525:20;:11;:20;:::i;16313:147::-;15649:22;15660:10;15649;:22::i;:::-;15641:51;;;;;-1:-1:-1;;;15641:51:0;;;;;;;;;;;;-1:-1:-1;;;15641:51:0;;;;;;;;;;;;;;;16387:25;:9;16404:7;16387:25;:16;:25;:::i;:::-;16428:24;;-1:-1:-1;;;;;16428:24:0;;;;;;;;16313:147;:::o;19979:251::-;15765:7;;-1:-1:-1;;;15765:7:0;;;;15764:8;15756:37;;;;;-1:-1:-1;;;15756:37:0;;;;;;;;;;;;-1:-1:-1;;;15756:37:0;;;;;;;;;;;;;;;20150:8;18738:23;18752:8;18738:13;:23::i;:::-;18737:24;18729:58;;;;;-1:-1:-1;;;18729:58:0;;;;;;;;;;;;-1:-1:-1;;;18729:58:0;;;;;;;;;;;;;;;20171:51;20194:5;20201:3;20206:8;20216:5;20171:22;:51::i;:::-;15804:1;19979:251;;;;:::o;24832:118::-;24918:24;;24894:4;24918:24;;;:12;:24;;;;;;;;;24832:118::o;24174:96::-;24247:15;;;;24174:96;:::o;19816:155::-;15649:22;15660:10;15649;:22::i;:::-;15641:51;;;;;-1:-1:-1;;;15641:51:0;;;;;;;;;;;;-1:-1:-1;;;15641:51:0;;;;;;;;;;;;;;;19893:27;:11;19912:7;19893:27;:18;:27;:::i;:::-;19936;;-1:-1:-1;;;;;19936:27:0;;;;;;;;19816:155;:::o;17908:142::-;17965:13;17998:44;18022:19;:8;:17;:19::i;:::-;17998:16;:23;;;;;;;;;;;;;-1:-1:-1;;17998:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;:16;:23;;:16;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:44;;;;:::i;24958:832::-;21378:20;21387:10;21378:8;:20::i;:::-;21370:47;;;;;-1:-1:-1;;;21370:47:0;;;;;;;;;;;;-1:-1:-1;;;21370:47:0;;;;;;;;;;;;;;;25056:15;;;25048:52;;;;;-1:-1:-1;;;25048:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;25133:15;;;;;;25119:29;;;;25111:90;;;;-1:-1:-1;;;25111:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25219:24;25232:10;25219:12;:24::i;:::-;25214:472;;25260:24;;;;;;;;:12;:24;;;;;:31;;-1:-1:-1;;25260:31:0;25287:4;25260:31;;;;;;25323:14;;:21;;:14;;25287:4;25323:18;:21;:::i;:::-;25306:14;:38;;;25385:12;;-1:-1:-1;25367:30:0;25359:69;;;;;-1:-1:-1;;;25359:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;25214:472;;;25483:22;25494:10;25483;:22::i;:::-;25469:36;;:11;:36;;;25461:97;;;;-1:-1:-1;;;25461:97:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25596:24;25609:10;25596:12;:24::i;:::-;25581:39;;:11;:39;;;;25573:101;;;;-1:-1:-1;;;25573:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25698:19;;;;;;;;:7;:19;;;;;;;;;:33;;-1:-1:-1;;25698:33:0;;;;;;;;;25747:35;;;;;;;;;;;;;;;;;;;;;;;;24958:832;;:::o;19412:116::-;19474:4;19498:22;;;:12;:22;;;;;;;;;19412:116::o;27497:334::-;27578:4;27595:13;27611:40;27634:6;27642:8;27611:22;:40::i;:::-;27674:13;;27595:56;;-1:-1:-1;;;;;;27674:13:0;27666:38;27662:136;;27728:13;;:58;;;-1:-1:-1;;;27728:58:0;;-1:-1:-1;;;;;27728:58:0;;;;;;;;;;;;;;;;;;;;;;;:13;;;;;:30;;:58;;;;;;;;;;;;;;:13;:58;;;5:2:-1;;;;30:1;27;20:12;5:2;27728:58:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;27728:58:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27728:58:0;;-1:-1:-1;27721:65:0;;-1:-1:-1;27721:65:0;27662:136;27815:8;27497:334;-1:-1:-1;;;27497:334:0:o;19536:117::-;19597:4;19621:24;:11;19637:7;19621:24;:15;:24;:::i;15922:116::-;15649:22;15660:10;15649;:22::i;:::-;15641:51;;;;;-1:-1:-1;;;15641:51:0;;;;;;;;;;;;-1:-1:-1;;;15641:51:0;;;;;;;;;;;;;;;16001:29;16020:9;16001:18;:29::i;18958:219::-;18576:25;18590:10;18576:13;:25::i;:::-;18568:76;;;;-1:-1:-1;;;18568:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19041:23;19055:8;19041:13;:23::i;:::-;19040:24;19032:60;;;;;-1:-1:-1;;;19032:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;19103:22;;;;:12;:22;;;;;;:29;;-1:-1:-1;;19103:29:0;19128:4;19103:29;;;19148:21;19116:8;;19148:21;;;18958:219;:::o;13170:156::-;13227:4;13260:21;;;:11;:21;;;;;;-1:-1:-1;;;;;13260:21:0;13299:19;;;13170:156::o;10016:607::-;10118:35;10132:10;10144:8;10118:13;:35::i;:::-;10110:168;;;;-1:-1:-1;;;10110:168:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10342:5;-1:-1:-1;;;;;10321:26:0;:17;10329:8;10321:7;:17::i;:::-;-1:-1:-1;;;;;10321:26:0;;10313:89;;;;-1:-1:-1;;;10313:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10421:17:0;;10413:73;;;;;-1:-1:-1;;;10413:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;10505:16;10512:8;10505:6;:16::i;:::-;10497:76;;;;;-1:-1:-1;;;10497:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;10584:31;10594:5;10601:3;10606:8;10584:9;:31::i;8278:179::-;8358:18;8362:4;8368:7;8358:3;:18::i;:::-;8350:60;;;;;-1:-1:-1;;;8350:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8421:20:0;8444:5;8421:20;;;;;;;;;;;:28;;-1:-1:-1;;8421:28:0;;;8278:179::o;6052:139::-;6110:7;6138:6;6130:30;;;;;-1:-1:-1;;;6130:30:0;;;;;;;;;;;;-1:-1:-1;;;6130:30:0;;;;;;;;;;;;;;;6182:1;6178;:5;;;;;;;6052:139;-1:-1:-1;;;6052:139:0:o;5903:141::-;5961:7;5989:6;5981:32;;;;;-1:-1:-1;;;5981:32:0;;;;;;;;;;;;-1:-1:-1;;;5981:32:0;;;;;;;;;;;;;;;6035:1;6031;:5;;;;;;;5903:141;-1:-1:-1;;;5903:141:0:o;1792:165::-;1848:6;1878:5;;;1902:6;;;;;;;;;1894:36;;;;;-1:-1:-1;;;1894:36:0;;;;;;;;;;;;-1:-1:-1;;;1894:36:0;;;;;;;;;;;;;;5326:169;5384:7;5416:5;;;5440:6;;;;5432:36;;;;;-1:-1:-1;;;5432:36:0;;;;;;;;;;;;-1:-1:-1;;;5432:36:0;;;;;;;;;;;;;;21963:100;21378:20;21387:10;21378:8;:20::i;:::-;21370:47;;;;;-1:-1:-1;;;21370:47:0;;;;;;;;;;;;-1:-1:-1;;;21370:47:0;;;;;;;;;;;;;;;22037:18;22043:2;22047:7;22037:5;:18::i;9722:286::-;9828:48;9851:5;9858:3;9863:8;9828:48;;;;;;;;;;;;:22;:48::i;:::-;9820:135;;;;-1:-1:-1;;;9820:135:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9966:34;9979:5;9986:3;9991:8;9966:12;:34::i;8465:124::-;-1:-1:-1;;;;;8561:20:0;8537:4;8561:20;;;;;;;;;;;;;;;8465:124::o;8095:175::-;8173:18;8177:4;8183:7;8173:3;:18::i;:::-;8172:19;8164:60;;;;;-1:-1:-1;;;8164:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;8235:20:0;:11;:20;;;;;;;;;;;:27;;-1:-1:-1;;8235:27:0;8258:4;8235:27;;;8095:175::o;3451:174::-;3570:20;3609:8;;;3451:174::o;11058:140::-;11138:52;11157:10;11169:9;11180;11138:18;:52::i;9486:228::-;9612:12;;:17;9604:53;;;;;-1:-1:-1;;;9604:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;9668:38;9685:5;9692:3;9697:8;9668:16;:38::i;6199:697::-;6251:13;6277:18;;6336:6;6332:375;;-1:-1:-1;;;6359:16:0;-1:-1:-1;6390:5:0;;6332:375;;;6444:1;6460:236;6467:9;;6460:236;;6541:6;6526:10;6518:30;;-1:-1:-1;6600:2:0;6592:5;:10;6606:2;6591:17;-1:-1:-1;;;6590:35:0;6582:44;;6568:58;;;;6654:2;6645:11;;;;;;6675:5;;;;;6645:11;;-1:-1:-1;6460:236:0;;;6332:375;;6719:16;6748:3;6738:14;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;6738:14:0;87:34:-1;135:17;;-1:-1;6738:14:0;-1:-1:-1;6719:33:0;-1:-1:-1;6763:9:0;6785:75;6801:3;6797:1;:7;6785:75;;;6835:10;6846:1;6835:13;;;;;;;;;;6826:3;6830:1;6826:6;;;;;;;;;;;:22;-1:-1:-1;;;;;6826:22:0;;;;;;;;-1:-1:-1;6806:3:0;;6785:75;;;-1:-1:-1;6884:3:0;6199:697;-1:-1:-1;;;;6199:697:0:o;3271:148::-;3346:13;3403:2;3407;3386:24;;;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;3386:24:0;;;;;;;;;;-1:-1:-1;3386:24:0;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;3386:24:0;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;3386:24:0;;;3372:39;;3271:148;;;;:::o;11644:150::-;11726:4;11750:36;11768:6;11776:9;11750:17;:36::i;14992:190::-;15059:21;15083:7;:5;:7::i;:::-;15094:6;:18;;-1:-1:-1;;;;;;15094:18:0;-1:-1:-1;;;;;15094:18:0;;;;;;;;;15128:46;;15059:31;;-1:-1:-1;15094:18:0;15128:46;;;;;;-1:-1:-1;;15128:46:0;14992:190;;:::o;11968:250::-;12050:4;12066:13;12082:17;12090:8;12082:7;:17::i;:::-;12066:33;;12130:5;-1:-1:-1;;;;;12118:17:0;:8;-1:-1:-1;;;;;12118:17:0;;:54;;;;12164:8;-1:-1:-1;;;;;12139:33:0;:21;12151:8;12139:11;:21::i;:::-;-1:-1:-1;;;;;12139:33:0;;12118:54;:91;;;;12176:33;12193:5;12200:8;12176:16;:33::i;:::-;12110:100;11968:250;-1:-1:-1;;;;11968:250:0:o;12226:299::-;12311:24;12326:8;12311:14;:24::i;:::-;12346:21;;;;:11;:21;;;;;;;;:27;;-1:-1:-1;;;;;;12346:27:0;-1:-1:-1;;;;;12346:27:0;;;;;;;;;;12402:15;;;;:8;:15;;;;;;;:22;;:19;:22::i;:::-;-1:-1:-1;;;;;12384:15:0;;;;;;;:8;:15;;;;;;:40;;;;12451:13;;;;;;;:20;;12469:1;12451:20;:17;:20;:::i;:::-;-1:-1:-1;;;;;12435:13:0;;;;;;;:8;:13;;;;;;:36;;;;12487:30;;12508:8;;12435:13;;12487:30;;;;;;12226:299;;;:::o;12535:265::-;12610:16;12617:8;12610:6;:16::i;:::-;12609:17;12601:55;;;;;-1:-1:-1;;;12601:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;12667:21;;;;:11;:21;;;;;;;;:27;;-1:-1:-1;;;;;;12667:27:0;-1:-1:-1;;;;;12667:27:0;;;;;;;;12721:13;;:8;:13;;;;;;;:20;;:17;:20::i;:::-;-1:-1:-1;;;;;12705:13:0;;;;;;:8;:13;;;;;;:36;;;;12757:35;;12783:8;;12705:13;12757:35;;12705:13;;12757:35;12535:265;;:::o;13334:420::-;13512:4;13540:16;:3;-1:-1:-1;;;;;13540:14:0;;:16::i;:::-;13535:61;;-1:-1:-1;13580:4:0;13573:11;;13535:61;13622:78;;-1:-1:-1;;;13622:78:0;;13665:10;13622:78;;;;;;-1:-1:-1;;;;;13622:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;13606:13;;13622:42;;;;;;13665:10;;13677:5;;13684:8;;13694:5;;13622:78;;;;;;;;;;;13606:13;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;13622:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13622:78:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;13622:78:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;13622:78:0;-1:-1:-1;;;;;;13719:26:0;-1:-1:-1;;;13719:26:0;;-1:-1:-1;;13334:420:0;;;;;;:::o;11206:216::-;-1:-1:-1;;;;;11305:26:0;;;;;;;:18;:26;;;;;;;;:37;;;;;;;;;;;;;:49;;-1:-1:-1;;11305:49:0;;;;;;;;;;11370:44;;;;;;;;;;;;;;;;;11206:216;;;:::o;11806:154::-;-1:-1:-1;;;;;11915:26:0;;;11891:4;11915:26;;;:18;:26;;;;;;;;:37;;;;;;;;;;;;;;;11806:154::o;13762:174::-;13862:1;13827:23;;;:14;:23;;;;;;-1:-1:-1;;;;;13827:23:0;:37;13823:106;;13915:1;13881:23;;;:14;:23;;;;;:36;;-1:-1:-1;;;;;;13881:36:0;;;13762:174::o;5503:148::-;5561:7;5594:1;5589;:6;;5581:39;;;;;-1:-1:-1;;;5581:39:0;;;;;;;;;;;;-1:-1:-1;;;5581:39:0;;;;;;;;;;;;;;;-1:-1:-1;5638:5:0;;;5503:148::o;26572:1262::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26572:1262:0;;;-1:-1:-1;26572:1262:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;2504:136;2560:6;2587;;;2579:30;;;;;-1:-1:-1;;;2579:30:0;;;;;;;;;;;;-1:-1:-1;;;2579:30:0;;;;;;;;;;;;;;;2631:1;2627:5;;:1;:5;;;;;;2358:138;2414:6;2441;;;2433:32;;;;;-1:-1:-1;;;2433:32:0;;;;;;;;;;;;-1:-1:-1;;;2433:32:0;;;;;;;;;;;;;;;2487:1;2483:5;;:1;:5;;;;;

Swarm Source

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