ETH Price: $2,508.01 (-0.11%)

Token

ShatteredEon (Colonists)
 

Overview

Max Total Supply

0 Colonists

Holders

1,288

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
exploding-heads.eth
Balance
216 Colonists
0xe4c7a6fcb6b90106d00874d01b9058908c31623d
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Shattered EON, a Sci-Fi inspired, Ethereum-based, strategy game which incorporates the earning power of defi with a series of unique and utility packed dystopian-retro style NFTs. 10,000 Generation 0 Colonist NFTs.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Colonist

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
No with 2000 runs

Other Settings:
default evmVersion, MIT license
File 1 of 10 : Colonist.sol
// SPDX-License-Identifier: MIT LICENSE

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/security/Pausable.sol";
import "./ERC721.sol";
import "./interfaces/IColonist.sol";
import "./interfaces/ITColonist.sol";
import "./interfaces/IHColonist.sol";
import "./interfaces/IEON.sol";
import "./interfaces/IPytheas.sol";
import "./interfaces/IRandomizer.sol";

contract Colonist is IColonist, ERC721, Pausable {
    /*///////////////////////////////////////////////////////
                    Global STATE
    ///////////////////////////////////////////////////////*/

    event ColonistMinted(uint256 indexed tokenId);
    event ColonistBurned(uint256 indexed tokenId);
    event ColonistStolen(uint256 indexed tokenId);
    event ColonistNamed(uint256 indexed tokenId, string newName);

    // toggle naming
    bool public namingActive;

    // max number of tokens that can be minted - 60000
    uint256 public MAX_TOKENS = 60000;

    // number of ERC721s for sale in eth
    uint256 public PAID_TOKENS = 10000;

    // an arbatrary counter to dish out IDs
    uint16 public override minted;

    // counter of colonist in circulation
    uint256 public override totalCir;

    // counter of _mint to honors amount
    uint256 public honorMints;

    // max number of colonist to mint to honor members
    uint256 public constant maxHonorMints = 450;

    // cost to name
    uint256 public constant costToName = 2000 ether;

    // mapping from tokenId to a struct containing the colonist token's traits
    mapping(uint256 => Colonist) public tokenTraitsColonist;

    // mapping from tokenId to a stuct containing the honors colonist
    mapping(uint256 => HColonist) public tokenTraitsHonors;
    mapping(uint256 => bool) public isHonors;

    // mapping from hashed(tokenTrait) to the tokenId it's associated with
    // used to ensure there are no duplicates
    mapping(uint256 => uint256) public existingCombinations;

    // Mapping from token ID to name
    mapping(uint256 => string) private _tokenName;
    mapping(uint256 => bool) private _hasName;

    // Mapping if certain name string has already been reserved
    mapping(string => bool) private _nameReserved;

    // address => used in allowing system communication between contracts
    mapping(address => bool) private admins;

    // list of probabilities for each trait type
    uint8[][8] public rarities;
    uint8[][8] public aliases;

    // reference to the Pytheas for transfers without approval
    IPytheas public pytheas;

    // reference to Traits
    ITColonist public traits;

    // reference to honors traits
    IHColonist public honorTraits;

    //reference to Randomizer
    IRandomizer public randomizer;

    //reference to EON
    IEON public EON;

    address public pirateGames;

    address private imperialGuildTreasury;

    address public auth;

    /**
     * instantiates contract and rarity tables
     */
    constructor() ERC721("ShatteredEon", "Colonists") {
        auth = msg.sender;
        admins[msg.sender] = true;

        // Saves users gas by making lookup O(1)
        // A.J. Walker's Alias Algorithm
        // Credit to WolfGame devs
        // colonist
        // background
        rarities[0] = [255, 255, 255, 255, 255];
        aliases[0] = [4, 1, 0, 3, 2];
        // body
        rarities[1] = [255, 220, 210, 255, 220, 200];
        aliases[1] = [0, 1, 2, 3, 4, 5];
        // shirt
        rarities[2] = [120, 150, 150, 120, 20, 200, 255, 255, 190, 255, 40];
        aliases[2] = [6, 7, 6, 7, 9, 6, 7, 9, 0, 1, 0];
        // jacket
        rarities[3] = [
            20,
            100,
            205,
            185,
            235,
            195,
            215,
            190,
            215,
            130,
            40,
            30,
            220,
            255
        ];
        aliases[3] = [3, 13, 5, 13, 13, 9, 13, 7, 13, 3, 13, 13, 12, 13];
        // jaw
        rarities[4] = [255, 255, 100, 110, 250, 125, 245, 40, 200, 35, 255];
        aliases[4] = [0, 1, 1, 6, 0, 2, 1, 6, 9, 2, 1];
        // hair
        rarities[5] = [
            245,
            245,
            120,
            245,
            200,
            245,
            245,
            122,
            220,
            225,
            175,
            40,
            25,
            233
        ];
        aliases[5] = [1, 4, 5, 8, 9, 13, 13, 9, 8, 5, 4, 1, 13, 1];
        // eyes
        rarities[6] = [60, 225, 200, 50, 90, 200, 145, 125, 50, 255];
        aliases[6] = [2, 1, 9, 1, 9, 5, 1, 1, 9, 9];
        //held
        rarities[7] = [
            220,
            245,
            139,
            120,
            120,
            230,
            190,
            35,
            40,
            245,
            190,
            90,
            134
        ];
        aliases[7] = [0, 1, 5, 4, 6, 10, 1, 0, 1, 5, 4, 1, 0];
    }

    modifier onlyOwner() {
        require(msg.sender == auth);
        _;
    }

    function setContracts(
        address _traits,
        address _honorTraits,
        address _pytheas,
        address _rand,
        address _pirateGames,
        address _eon
    ) external onlyOwner {
        traits = ITColonist(_traits);
        honorTraits = IHColonist(_honorTraits);
        pytheas = IPytheas(_pytheas);
        randomizer = IRandomizer(_rand);
        EON = IEON(_eon);
        pirateGames = _pirateGames;
    }

    /*///////////////////////////////////////////////////////////////
                    EXTERNAL
    //////////////////////////////////////////////////////////////*/

    /**
     * Mint a token - any payment / game logic should be handled in the game contract.
     * This will just generate random traits and mint a token to a designated address.
     */
    function _mintColonist(address recipient, uint256 seed) external override {
        require(admins[msg.sender], "Only Admins");
        require(minted + 1 <= MAX_TOKENS, "All colonists deployed");
        minted++;
        totalCir++;
        generateColonist(minted, seed);
        if (tx.origin != recipient && recipient != address(pytheas)) {
            // Stolen!
            emit ColonistStolen(minted);
        }
        _mint(recipient, minted);
    }

    function _mintHonors(address recipient, uint8 id) external whenNotPaused {
        require(admins[msg.sender], "Only Admins");
        require(minted + 1 <= MAX_TOKENS, "All colonist deployed");
        minted++;
        totalCir++;
        generateHonors(minted, id);
        _mint(recipient, minted);
    }

    function _mintToHonors(address recipient, uint256 seed) external override {
        require(admins[msg.sender], "Only Admins");
        require(minted + 1 <= MAX_TOKENS, "All colonists deployed");
        require(
            honorMints + 1 <= maxHonorMints,
            "All honor mints have been sent"
        );
        minted++;
        totalCir++;
        generateColonist(minted, seed);
        _mint(recipient, minted);
    }

    /**
     * Burn a token - any game logic should be handled before this function.
     */
    function burn(uint256 tokenId) external override whenNotPaused {
        require(admins[msg.sender]);
        require(
            ownerOf[tokenId] == tx.origin ||
                msg.sender == address(pytheas) ||
                msg.sender == address(pirateGames),
            "Colonist: Not Owner"
        );
        totalCir--;
        _burn(tokenId);
        emit ColonistBurned(tokenId);
    }

    function transferFrom(
        address from,
        address to,
        uint256 id
    ) public override(ERC721, IColonist) {
        require(from == ownerOf[id], "WRONG_FROM");

        require(to != address(0), "INVALID_RECIPIENT");
        // allow admin contracts to send without approval
        if (!admins[msg.sender]) {
            require(
                msg.sender == from ||
                    msg.sender == getApproved[id] ||
                    isApprovedForAll[from][msg.sender],
                "NOT_AUTHORIZED"
            );
        }
        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        unchecked {
            balanceOf[from]--;

            balanceOf[to]++;
        }

        ownerOf[id] = to;

        delete getApproved[id];

        emit Transfer(from, to, id);
    }

    function generateColonist(uint256 tokenId, uint256 seed)
        internal
        returns (Colonist memory t)
    {
        t = selectColTraits(tokenId, seed);
        if (existingCombinations[structToHashCol(t)] == 0) {
            tokenTraitsColonist[tokenId] = t;
            existingCombinations[structToHashCol(t)] = tokenId;
            emit ColonistMinted(tokenId);
            return t;
        }
        return generateColonist(tokenId, randomizer.random(seed));
    }

    function generateHonors(uint256 tokenId, uint8 id)
        internal
        returns (HColonist memory q)
    {
        q.Legendary = id;
        tokenTraitsHonors[minted] = q;
        isHonors[minted] = true;
        emit ColonistMinted(tokenId);
        return q;
    }

    /**
     * uses A.J. Walker's Alias algorithm for O(1) rarity table lookup
     * ensuring O(1) instead of O(n) reduces mint cost by more than 50%
     * probability & alias tables are generated off-chain beforehand
     * @param seed portion of the 256 bit seed to remove trait correlation
     * @param traitType the trait type to select a trait for
     * @return the ID of the randomly selected trait
     */
    function selectTrait(uint16 seed, uint8 traitType)
        internal
        view
        returns (uint8)
    {
        uint8 trait = uint8(seed) % uint8(rarities[traitType].length);
        // If a selected random trait probability is selected (biased coin) return that trait
        if (seed >> 8 < rarities[traitType][trait]) return trait;
        return aliases[traitType][trait];
    }

    function selectGen(uint256 tokenId) internal pure returns (uint8 gen) {
        if (tokenId <= (60000 / 6)) return 0; //0k-10k
        if (tokenId <= (60000 * 8) / 24) return 1; //10k-20k
        if (tokenId <= (60000 * 12) / 24) return 2; //20k-30k
        if (tokenId <= (60000 * 16) / 24) return 3; //30k-40k
        if (tokenId <= (60000 * 20) / 24) return 4; //40k-50k
        if (tokenId <= (60000 * 22) / 24) return 5;
        //50k-60k
        else return 5;
    }

    /**
     * selects the species and all of its traits based on the seed value
     * @param seed a pseudorandom 256 bit number to derive traits from
     * @return t -  a struct of randomly selected traits
     */
    function selectColTraits(uint256 tokenId, uint256 seed)
        internal
        view
        returns (Colonist memory t)
    {
        t.isColonist = true;
        seed >>= 16;
        t.background = selectTrait(uint16(seed & 0xFFFF), 0);
        seed >>= 16;
        t.body = selectTrait(uint16(seed & 0xFFFF), 1);
        seed >>= 16;
        t.shirt = selectTrait(uint16(seed & 0xFFFF), 2);
        seed >>= 16;
        t.jacket = selectTrait(uint16(seed & 0xFFFF), 3);
        seed >>= 16;
        t.jaw = selectTrait(uint16(seed & 0xFFFF), 4);
        seed >>= 16;
        t.hair = selectTrait(uint16(seed & 0xFFFF), 5);
        seed >>= 16;
        t.eyes = selectTrait(uint16(seed & 0xFFFF), 6);
        seed >>= 16;
        t.held = selectTrait(uint16(seed & 0xFFFF), 7);
        uint8 gen = selectGen(tokenId);
        t.gen = gen;
    }

    function structToHashCol(Colonist memory s)
        internal
        pure
        returns (uint256)
    {
        return
            uint256(
                keccak256(
                    abi.encodePacked(
                        s.background,
                        s.body,
                        s.shirt,
                        s.jacket,
                        s.jaw,
                        s.hair,
                        s.eyes,
                        s.held,
                        s.gen
                    )
                )
            );
    }

    function tokenNameByIndex(uint256 index)
        public
        view
        returns (string memory)
    {
        return _tokenName[index];
    }

    function isNameReserved(string memory nameString)
        public
        view
        returns (bool)
    {
        return _nameReserved[toLower(nameString)];
    }

    function hasBeenNamed(uint256 tokenId) public view returns (bool) {
        return _hasName[tokenId];
    }

    function nameColonist(uint256 tokenId, string memory newName) public {
        require(namingActive == true, "naming not yet available");
        require(ownerOf[tokenId] == msg.sender, "Not your colonist to name");
        require(hasBeenNamed(tokenId) == false, "Colonist already named");
        require(validateName(newName) == true, "Not a valid name");
        require(isNameReserved(newName) == false, "Name already reserved");

        //   IERC20(_eonAddress).transferFrom(msg.sender, address(this), NAME_CHANGE_PRICE);

        toggleReserveName(newName, true);
        toggleHasName(tokenId, true);
        _tokenName[tokenId] = newName;
        EON.burn(_msgSender(), costToName);
        emit ColonistNamed(tokenId, newName);
    }

    /**
     * @dev Reserves the name if isReserve is set to true, de-reserves if set to false
     */
    function toggleReserveName(string memory str, bool isReserve) internal {
        _nameReserved[toLower(str)] = isReserve;
    }

    function toggleHasName(uint256 tokenId, bool hasName) internal {
        _hasName[tokenId] = hasName;
    }

    /**
     * @dev Check if the name string is valid (Alphanumeric and spaces without leading or trailing space)
     */
    function validateName(string memory str) public pure returns (bool) {
        bytes memory b = bytes(str);
        if (b.length < 1) return false;
        if (b.length > 25) return false; // Cannot be longer than 25 characters
        if (b[0] == 0x20) return false; // Leading space
        if (b[b.length - 1] == 0x20) return false; // Trailing space

        bytes1 lastChar = b[0];

        for (uint256 i; i < b.length; i++) {
            bytes1 char = b[i];

            if (char == 0x20 && lastChar == 0x20) return false; // Cannot contain continous spaces

            if (
                !(char >= 0x30 && char <= 0x39) && //9-0
                !(char >= 0x41 && char <= 0x5A) && //A-Z
                !(char >= 0x61 && char <= 0x7A) && //a-z
                !(char == 0x20) //space
            ) return false;

            lastChar = char;
        }

        return true;
    }

    /**
     * @dev Converts the string to lowercase
     */
    function toLower(string memory str) public pure returns (string memory) {
        bytes memory bStr = bytes(str);
        bytes memory bLower = new bytes(bStr.length);
        for (uint256 i = 0; i < bStr.length; i++) {
            // Uppercase character
            if ((uint8(bStr[i]) >= 65) && (uint8(bStr[i]) <= 90)) {
                bLower[i] = bytes1(uint8(bStr[i]) + 32);
            } else {
                bLower[i] = bStr[i];
            }
        }
        return string(bLower);
    }

    function getMaxTokens() external view override returns (uint256) {
        return MAX_TOKENS;
    }

    function getPaidTokens() external view override returns (uint256) {
        return PAID_TOKENS;
    }

    /**
     * enables owner to pause / unpause minting
     */
    function setPaused(bool _paused) external onlyOwner {
        if (_paused) _pause();
        else _unpause();
    }

    /**
     * enables an address to mint / burn
     * @param addr the address to enable
     */
    function addAdmin(address addr) external onlyOwner {
        admins[addr] = true;
    }

    /**
     * disables an address from minting / burning
     * @param addr the address to disbale
     */
    function removeAdmin(address addr) external onlyOwner {
        admins[addr] = false;
    }

    function transferOwnership(address newOwner) external onlyOwner {
        auth = newOwner;
    }

    function toggleNameing(bool _namingActive) external onlyOwner {
        namingActive = _namingActive;
    }

    function setImperialGuildTreasury(address _imperialTreasury)
        external
        onlyOwner
    {
        imperialGuildTreasury = _imperialTreasury;
    }

    /** Traits */

    function getTokenTraitsColonist(uint256 tokenId)
        external
        view
        override(IColonist)
        returns (Colonist memory)
    {
        return tokenTraitsColonist[tokenId];
    }

    function getTokenTraitsHonors(uint256 tokenId)
        external
        view
        override(IColonist)
        returns (HColonist memory)
    {
        return tokenTraitsHonors[tokenId];
    }

    function tokenURI(uint256 tokenId)
        public
        view
        override
        returns (string memory)
    {
        if (isHonors[tokenId]) {
            return honorTraits.tokenURI(tokenId);
        }
        return traits.tokenURI(tokenId);
    }

    function isOwner(uint256 tokenId) public view returns (address) {
        address addr = ownerOf[tokenId];
        return addr;
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 id
    ) public override(ERC721, IColonist) {
        transferFrom(from, to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(
                    msg.sender,
                    from,
                    id,
                    ""
                ) ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        bytes memory data
    ) public override(ERC721, IColonist) {
        transferFrom(from, to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(
                    msg.sender,
                    from,
                    id,
                    data
                ) ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    // For OpenSeas
    function owner() public view virtual returns (address) {
        return auth;
    }
}

File 2 of 10 : Pausable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

File 3 of 10 : Context.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

File 4 of 10 : ERC721.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

/// @notice Modern, minimalist, and gas efficient ERC-721 implementation.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC721.sol)
/// @dev Note that balanceOf does not revert if passed the zero address, in defiance of the ERC.
abstract contract ERC721 {
    /*///////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

    event Transfer(
        address indexed from,
        address indexed to,
        uint256 indexed tokenId
    );

    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 indexed tokenId
    );

    event ApprovalForAll(
        address indexed owner,
        address indexed operator,
        bool approved
    );

    /*///////////////////////////////////////////////////////////////
                          METADATA STORAGE/LOGIC
    //////////////////////////////////////////////////////////////*/

    string public name;

    string public symbol;

    function tokenURI(uint256 id) public view virtual returns (string memory);

    /*///////////////////////////////////////////////////////////////
                            ERC721 STORAGE                        
    //////////////////////////////////////////////////////////////*/

    mapping(address => uint256) public balanceOf;

    mapping(uint256 => address) public ownerOf;

    mapping(uint256 => address) public getApproved;

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

    /*///////////////////////////////////////////////////////////////
                              CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    constructor(string memory _name, string memory _symbol) {
        name = _name;
        symbol = _symbol;
    }

    /*///////////////////////////////////////////////////////////////
                              ERC721 LOGIC
    //////////////////////////////////////////////////////////////*/

    function approve(address spender, uint256 id) public virtual {
        address owner = ownerOf[id];

        require(
            msg.sender == owner || isApprovedForAll[owner][msg.sender],
            "NOT_AUTHORIZED"
        );

        getApproved[id] = spender;

        emit Approval(owner, spender, id);
    }

    function setApprovalForAll(address operator, bool approved) public virtual {
        isApprovedForAll[msg.sender][operator] = approved;

        emit ApprovalForAll(msg.sender, operator, approved);
    }

    function transferFrom(
        address from,
        address to,
        uint256 id
    ) public virtual {
        require(from == ownerOf[id], "WRONG_FROM");

        require(to != address(0), "INVALID_RECIPIENT");

        require(
            msg.sender == from ||
                msg.sender == getApproved[id] ||
                isApprovedForAll[from][msg.sender],
            "NOT_AUTHORIZED"
        );

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        unchecked {
            balanceOf[from]--;

            balanceOf[to]++;
        }

        ownerOf[id] = to;

        delete getApproved[id];

        emit Transfer(from, to, id);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 id
    ) public virtual {
        transferFrom(from, to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(
                    msg.sender,
                    from,
                    id,
                    ""
                ) ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        bytes memory data
    ) public virtual {
        transferFrom(from, to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(
                    msg.sender,
                    from,
                    id,
                    data
                ) ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    /*///////////////////////////////////////////////////////////////
                              ERC165 LOGIC
    //////////////////////////////////////////////////////////////*/

    function supportsInterface(bytes4 interfaceId)
        public
        pure
        virtual
        returns (bool)
    {
        return
            interfaceId == 0x01ffc9a7 || // ERC165 Interface ID for ERC165
            interfaceId == 0x80ac58cd || // ERC165 Interface ID for ERC721
            interfaceId == 0x5b5e139f; // ERC165 Interface ID for ERC721Metadata
    }

    /*///////////////////////////////////////////////////////////////
                       INTERNAL MINT/BURN LOGIC
    //////////////////////////////////////////////////////////////*/

    function _mint(address to, uint256 id) internal virtual {
        require(to != address(0), "INVALID_RECIPIENT");

        require(ownerOf[id] == address(0), "ALREADY_MINTED");

        // Counter overflow is incredibly unrealistic.
        unchecked {
            balanceOf[to]++;
        }

        ownerOf[id] = to;

        emit Transfer(address(0), to, id);
    }

    function _burn(uint256 id) internal virtual {
        address owner = ownerOf[id];

        require(ownerOf[id] != address(0), "NOT_MINTED");

        // Ownership check above ensures no underflow.
        unchecked {
            balanceOf[owner]--;
        }

        delete ownerOf[id];

        delete getApproved[id];

        emit Transfer(owner, address(0), id);
    }
}

/// @notice A generic interface for a contract which properly accepts ERC721 tokens.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC721.sol)
interface ERC721TokenReceiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 id,
        bytes calldata data
    ) external returns (bytes4);
}

File 5 of 10 : IColonist.sol
// SPDX-License-Identifier: MIT LICENSE
pragma solidity ^0.8.0;

interface IColonist {
    // struct to store each Colonist's traits
    struct Colonist {
        bool isColonist;
        uint8 background;
        uint8 body;
        uint8 shirt;
        uint8 jacket;
        uint8 jaw;
        uint8 eyes;
        uint8 hair;
        uint8 held;
        uint8 gen;
    }

    struct HColonist {
        uint8 Legendary;
    }

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

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) external;

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    function isOwner(uint256 tokenId)
        external
        view
        returns (address);

    function minted() external returns (uint16);

    function totalCir() external returns (uint256);

    function _mintColonist(address recipient, uint256 seed) external;

    function _mintToHonors(address recipient, uint256 seed) external;

    function _mintHonors(address recipient, uint8 id) external;

    function burn(uint256 tokenId) external;

    function getMaxTokens() external view returns (uint256);

    function getPaidTokens() external view returns (uint256);

    function getTokenTraitsColonist(uint256 tokenId)
        external
        view
        returns (Colonist memory);

    function getTokenTraitsHonors(uint256 tokenId)
        external
        view
        returns (HColonist memory);

    function tokenNameByIndex(uint256 index)
        external
        view
        returns (string memory);

    function hasBeenNamed(uint256 tokenId) external view returns (bool);

    function nameColonist(uint256 tokenId, string memory newName) external;
}

File 6 of 10 : IEON.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface IEON {
    function mint(address to, uint256 amount) external;

    function burn(address from, uint256 amount) external;

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);
}

File 7 of 10 : IHColonist.sol
// SPDX-License-Identifier: MIT LICENSE
pragma solidity ^0.8.0;

interface IHColonist {
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

File 8 of 10 : IPytheas.sol
// SPDX-License-Identifier: MIT LICENSE

pragma solidity ^0.8.0;

interface IPytheas {
    function addColonistToPytheas(address account, uint16[] calldata tokenIds)
        external;

    function claimColonistFromPytheas(address account, uint16[] calldata tokenIds, bool unstake)
        external;

    function getColonistMined(address account, uint16 tokenId)
        external
        returns (uint256);

    function handleJoinPirates(address addr, uint16 tokenId) external;

    function payUp(
        uint16 tokenId,
        uint256 amtMined,
        address addr
    ) external;
}

File 9 of 10 : IRandomizer.sol
// SPDX-License-Identifier: MIT LICENSE

pragma solidity ^0.8.0;

interface IRandomizer {
    function random(uint256) external returns (uint256);
}

File 10 of 10 : ITColonist.sol
// SPDX-License-Identifier: MIT LICENSE
pragma solidity ^0.8.0;

interface ITColonist {
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

Settings
{
  "evmVersion": "london",
  "libraries": {},
  "metadata": {
    "bytecodeHash": "ipfs",
    "useLiteralContent": true
  },
  "optimizer": {
    "details": {
      "constantOptimizer": true,
      "cse": true,
      "deduplicate": true,
      "inliner": true,
      "jumpdestRemover": true,
      "orderLiterals": true,
      "peephole": true,
      "yul": true,
      "yulDetails": {
        "optimizerSteps": "dhfoDgvulfnTUtnIf",
        "stackAllocation": true
      }
    },
    "runs": 2000
  },
  "remappings": [],
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","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":"uint256","name":"tokenId","type":"uint256"}],"name":"ColonistBurned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ColonistMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"newName","type":"string"}],"name":"ColonistNamed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ColonistStolen","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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"},{"inputs":[],"name":"EON","outputs":[{"internalType":"contract IEON","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAID_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"seed","type":"uint256"}],"name":"_mintColonist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint8","name":"id","type":"uint8"}],"name":"_mintHonors","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"seed","type":"uint256"}],"name":"_mintToHonors","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"addAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"aliases","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"auth","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"costToName","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"existingCombinations","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPaidTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTokenTraitsColonist","outputs":[{"components":[{"internalType":"bool","name":"isColonist","type":"bool"},{"internalType":"uint8","name":"background","type":"uint8"},{"internalType":"uint8","name":"body","type":"uint8"},{"internalType":"uint8","name":"shirt","type":"uint8"},{"internalType":"uint8","name":"jacket","type":"uint8"},{"internalType":"uint8","name":"jaw","type":"uint8"},{"internalType":"uint8","name":"eyes","type":"uint8"},{"internalType":"uint8","name":"hair","type":"uint8"},{"internalType":"uint8","name":"held","type":"uint8"},{"internalType":"uint8","name":"gen","type":"uint8"}],"internalType":"struct IColonist.Colonist","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTokenTraitsHonors","outputs":[{"components":[{"internalType":"uint8","name":"Legendary","type":"uint8"}],"internalType":"struct IColonist.HColonist","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"hasBeenNamed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"honorMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"honorTraits","outputs":[{"internalType":"contract IHColonist","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"isHonors","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"nameString","type":"string"}],"name":"isNameReserved","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"isOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxHonorMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minted","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"newName","type":"string"}],"name":"nameColonist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"namingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pirateGames","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pytheas","outputs":[{"internalType":"contract IPytheas","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"randomizer","outputs":[{"internalType":"contract IRandomizer","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"rarities","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"removeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_traits","type":"address"},{"internalType":"address","name":"_honorTraits","type":"address"},{"internalType":"address","name":"_pytheas","type":"address"},{"internalType":"address","name":"_rand","type":"address"},{"internalType":"address","name":"_pirateGames","type":"address"},{"internalType":"address","name":"_eon","type":"address"}],"name":"setContracts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_imperialTreasury","type":"address"}],"name":"setImperialGuildTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_paused","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"str","type":"string"}],"name":"toLower","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bool","name":"_namingActive","type":"bool"}],"name":"toggleNameing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenNameByIndex","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenTraitsColonist","outputs":[{"internalType":"bool","name":"isColonist","type":"bool"},{"internalType":"uint8","name":"background","type":"uint8"},{"internalType":"uint8","name":"body","type":"uint8"},{"internalType":"uint8","name":"shirt","type":"uint8"},{"internalType":"uint8","name":"jacket","type":"uint8"},{"internalType":"uint8","name":"jaw","type":"uint8"},{"internalType":"uint8","name":"eyes","type":"uint8"},{"internalType":"uint8","name":"hair","type":"uint8"},{"internalType":"uint8","name":"held","type":"uint8"},{"internalType":"uint8","name":"gen","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenTraitsHonors","outputs":[{"internalType":"uint8","name":"Legendary","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalCir","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"traits","outputs":[{"internalType":"contract ITColonist","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"str","type":"string"}],"name":"validateName","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"}]

608060405261ea606007556127106008553480156200001d57600080fd5b50604080518082018252600c81526b29b430ba3a32b932b222b7b760a11b602080830191825283518085019094526009845268436f6c6f6e6973747360b81b908401528151919291620000739160009162000772565b5080516200008990600190602084019062000772565b50506006805460ff19908116909155602b80546001600160a01b0319163390811790915560009081526013602090815260408083208054909416600117909355825160a08101845260ff8082529181018290529283018190526060830181905260808301529091506014906200010492910190600562000801565b506040805160a081018252600481526001602082015260009181019190915260036060820152600260808201526200014190601c90600562000801565b506040805160c08101825260ff80825260dc6020830181905260d2938301939093526060820152608081019190915260c860a08201526200018790601590600662000801565b506040805160c08101825260008152600160208201526002918101919091526003606082015260046080820152600560a0820152620001cb90601d90600662000801565b50604080516101608101825260788082526096602083018190529282019290925260608101919091526014608082015260c860a082015260ff60c0820181905260e0820181905260be61010083015261012082015260286101408201526200023890601690600b62000801565b50604080516101608101825260068082526007602083018190529282018190526060820183905260096080830181905260a083019190915260c082019290925260e0810191909152600061010082018190526001610120830152610140820152620002a890601e90600b62000801565b50604080516101c081018252601481526064602082015260cd9181019190915260b9606082015260eb608082015260c360a082015260d760c0820181905260be60e083015261010082015260826101208201526028610140820152601e61016082015260dc61018082015260ff6101a08201526200032b90601790600e62000801565b50604080516101c0810182526003808252600d602083018190526005938301939093526060820183905260808201839052600960a083015260c08201839052600760e0830152610100820183905261012082015261014081018290526101608101829052600c6101808201526101a0810191909152620003b090601f90600e62000801565b50604080516101608101825260ff80825260208201819052606492820192909252606e606082015260fa6080820152607d60a082015260f560c0820152602860e082015260c861010082015260236101208201526101408101919091526200041d90601890600b62000801565b5060408051610160810182526000808252600160208084018290529383018190526006606084018190526080840192909252600260a0840181905260c0840182905260e084019290925260096101008401526101208301919091526101408201526200048c9190600b62000801565b50604080516101c08101825260f5808252602082018190526078928201929092526060810182905260c8608082015260a0810182905260c0810191909152607a60e082015260dc61010082015260e161012082015260af61014082015260286101608201526019610180820181905260e96101a08301526200051091600e62000801565b50604080516101c08101825260018082526004602083018190526005938301849052600860608401819052600960808501819052600d60a0860181905260c0860181905260e0860191909152610100850191909152610120840185905261014084019190915261016083018290526101808301526101a082015290601c906200059e92910190600e62000801565b506040805161014081018252603c815260e1602082015260c8918101829052603260608201819052605a608083015260a0820192909252609160c0820152607d60e082015261010081019190915260ff6101208201526200060490601a90600a62000801565b5060408051610140810182526002815260016020820181905260099282018390526060820181905260808201839052600560a083015260c0820181905260e082015261010081018290526101208101919091526200066790602290600a62000801565b50604080516101a08101825260dc815260f560208201819052608b92820192909252607860608201819052608082015260e660a082015260be60c08201819052602360e08301526028610100830152610120820192909252610140810191909152605a6101608201526086610180820152620006e890601b90600d62000801565b50604080516101a0810182526000808252600160208301819052600593830184905260046060840181905260066080850152600a60a085015260c0840182905260e0840183905261010084018290526101208401949094526101408301939093526101608201929092526101808101919091526200076b90602390600d62000801565b5062000902565b8280546200078090620008d1565b90600052602060002090601f016020900481019282620007a45760008555620007ef565b82601f10620007bf57805160ff1916838001178555620007ef565b82800160010185558215620007ef579182015b82811115620007ef578251825591602001919060010190620007d2565b50620007fd929150620008a4565b5090565b82805482825590600052602060002090601f01602090048101928215620007ef5791602002820160005b838211156200086b57835183826101000a81548160ff021916908360ff16021790555092602001926001016020816000010492830192600103026200082b565b80156200089a5782816101000a81549060ff02191690556001016020816000010492830192600103026200086b565b5050620007fd9291505b5b80821115620007fd5760008155600101620008a5565b634e487b7160e01b600052602260045260246000fd5b600281046001821680620008e657607f821691505b60208210811415620008fc57620008fc620008bb565b50919050565b6138ee80620009126000396000f3fe608060405234801561001057600080fd5b506004361061038e5760003560e01c806375ab9b76116101de578063b656f09d1161010f578063d41d416d116100ad578063e985e9c51161007c578063e985e9c514610a00578063f10fb58414610a2e578063f2fde38b14610a41578063f47c84c514610a5457600080fd5b8063d41d416d14610994578063de9375f2146109b7578063e1fc334f146109ca578063e6073869146109dd57600080fd5b8063bb5434de116100e9578063bb5434de1461095c578063bea093d214610965578063c084f54014610978578063c87b56dd1461098157600080fd5b8063b656f09d14610923578063b6a7195314610936578063b88d4fde1461094957600080fd5b806395d89b411161017c578063a22cb46511610156578063a22cb465146108ad578063a70e847b146108c0578063ab32e8a3146108c9578063b07ba6a7146108dc57600080fd5b806395d89b41146108725780639ffdb65a1461087a578063a1b8f3741461088d57600080fd5b80638f58e7a8116101b85780638f58e7a81461082057806392b086f41461084357806393de58231461084c5780639416b4231461085f57600080fd5b806375ab9b76146107ec57806383c79d43146107ff5780638da5cb5b1461080f57600080fd5b80634018b1f8116102c35780636352211e116102615780636d522418116102305780636d522418146107005780637048027514610713578063704b3bec1461072657806370a08231146107cc57600080fd5b80636352211e1461069c578063693fe4db146106c55780636abcded1146106d85780636ca865ba146106e057600080fd5b806347486c751161029d57806347486c75146105345780634806e930146105465780634f02c420146106765780635c975abb1461069157600080fd5b80634018b1f8146104fd57806342842e0e1461050e57806342966c681461052157600080fd5b806316c38b3c116103305780632463a55a1161030a5780632463a55a1461048e57806333df4b2c146104a157806336838391146104c157806339c7639c146104d457600080fd5b806316c38b3c146104555780631785f53c1461046857806323b872dd1461047b57600080fd5b8063081812fc1161036c578063081812fc146103e6578063095ea7b31461041c5780631509f2941461042f57806315b56d101461044257600080fd5b806301ffc9a71461039357806302815835146103bc57806306fdde03146103d1575b600080fd5b6103a66103a1366004612928565b610a5d565b6040516103b3919061295b565b60405180910390f35b6103cf6103ca36600461297c565b610b42565b005b6103d9610b73565b6040516103b391906129fb565b61040f6103f4366004612a1d565b6004602052600090815260409020546001600160a01b031681565b6040516103b39190612a58565b6103cf61042a366004612a7a565b610c01565b6103cf61043d366004612ab7565b610cd8565b6103a6610450366004612bc6565b610d1e565b6103cf61046336600461297c565b610d51565b6103cf610476366004612ab7565b610d81565b6103cf610489366004612c01565b610db9565b6103cf61049c366004612c51565b610f42565b6104b46104af366004612cdb565b610fd6565b6040516103b39190612d06565b6104b46104cf366004612cdb565b61101c565b61040f6104e2366004612a1d565b6000908152600360205260409020546001600160a01b031690565b6008545b6040516103b39190612d1a565b6103cf61051c366004612c01565b61102c565b6103cf61052f366004612a1d565b61111c565b6006546103a690610100900460ff1681565b610669610554366004612a1d565b6040805161014081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810191909152506000908152600c6020908152604091829020825161014081018452905460ff808216151583526101008083048216948401949094526201000082048116948301949094526301000000810484166060830152640100000000810484166080830152650100000000008104841660a083015266010000000000008104841660c08301526701000000000000008104841660e0830152680100000000000000008104841692820192909252690100000000000000000090910490911661012082015290565b6040516103b39190612de3565b6009546106849061ffff1681565b6040516103b39190612dfc565b60065460ff166103a6565b61040f6106aa366004612a1d565b6003602052600090815260409020546001600160a01b031681565b6103cf6106d3366004612a7a565b611207565b600754610501565b6028546106f3906001600160a01b031681565b6040516103b39190612e29565b6103d961070e366004612a1d565b61130c565b6103cf610721366004612ab7565b6113ae565b6107b6610734366004612a1d565b600c6020526000908152604090205460ff80821691610100810482169162010000820481169163010000008104821691640100000000820481169165010000000000810482169166010000000000008204811691670100000000000000810482169168010000000000000000820481169169010000000000000000009004168a565b6040516103b39a99989796959493929190612e37565b6105016107da366004612ab7565b60026020526000908152604090205481565b6026546106f3906001600160a01b031681565b610501686c6b935b8bbd40000081565b602b546001600160a01b031661040f565b6103a661082e366004612a1d565b60009081526011602052604090205460ff1690565b6105016101c281565b6024546106f3906001600160a01b031681565b6103d961086d366004612bc6565b6113e9565b6103d961157c565b6103a6610888366004612bc6565b611589565b61050161089b366004612a1d565b600f6020526000908152604090205481565b6103cf6108bb366004612ecc565b611840565b610501600a5481565b60295461040f906001600160a01b031681565b6109166108ea366004612a1d565b6040805160208082018352600091829052928152600d835281902081519283019091525460ff16815290565b6040516103b39190612f0b565b6103cf610931366004612a7a565b6118af565b6103cf610944366004612f2d565b6119e0565b6103cf610957366004612f60565b611ac1565b610501600b5481565b6103cf610973366004612fdf565b611bb4565b61050160085481565b6103d961098f366004612a1d565b611d7a565b6104b46109a2366004612a1d565b600d6020526000908152604090205460ff1681565b602b5461040f906001600160a01b031681565b6025546106f3906001600160a01b031681565b6103a66109eb366004612a1d565b600e6020526000908152604090205460ff1681565b6103a6610a0e36600461302d565b600560209081526000928352604080842090915290825290205460ff1681565b6027546106f3906001600160a01b031681565b6103cf610a4f366004612ab7565b611e6b565b61050160075481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000083161480610af057507f80ac58cd000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b80610b3c57507f5b5e139f000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b602b546001600160a01b03163314610b5957600080fd5b600680549115156101000261ff0019909216919091179055565b60008054610b8090613076565b80601f0160208091040260200160405190810160405280929190818152602001828054610bac90613076565b8015610bf95780601f10610bce57610100808354040283529160200191610bf9565b820191906000526020600020905b815481529060010190602001808311610bdc57829003601f168201915b505050505081565b6000818152600360205260409020546001600160a01b031633811480610c4a57506001600160a01b038116600090815260056020908152604080832033845290915290205460ff165b610c6f5760405162461bcd60e51b8152600401610c66906130d7565b60405180910390fd5b600082815260046020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b602b546001600160a01b03163314610cef57600080fd5b602a805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b60006012610d2b836113e9565b604051610d389190613109565b9081526040519081900360200190205460ff1692915050565b602b546001600160a01b03163314610d6857600080fd5b8015610d7957610d76611eb1565b50565b610d76611f20565b602b546001600160a01b03163314610d9857600080fd5b6001600160a01b03166000908152601360205260409020805460ff19169055565b6000818152600360205260409020546001600160a01b03848116911614610df25760405162461bcd60e51b8152600401610c6690613145565b6001600160a01b038216610e185760405162461bcd60e51b8152600401610c6690613187565b3360009081526013602052604090205460ff16610ea657336001600160a01b0384161480610e5c57506000818152600460205260409020546001600160a01b031633145b80610e8a57506001600160a01b038316600090815260056020908152604080832033845290915290205460ff165b610ea65760405162461bcd60e51b8152600401610c66906130d7565b6001600160a01b03808416600081815260026020908152604080832080546000190190559386168083528483208054600101905585835260038252848320805473ffffffffffffffffffffffffffffffffffffffff199081168317909155600490925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b602b546001600160a01b03163314610f5957600080fd5b6025805473ffffffffffffffffffffffffffffffffffffffff199081166001600160a01b039889161790915560268054821696881696909617909555602480548616948716949094179093556027805485169286169290921790915560288054841692851692909217909155602980549092169216919091179055565b60148260088110610fe657600080fd5b018181548110610ff557600080fd5b9060005260206000209060209182820401919006915091509054906101000a900460ff1681565b601c8260088110610fe657600080fd5b611037838383610db9565b6001600160a01b0382163b15806110fb57506040517f150b7a0200000000000000000000000000000000000000000000000000000000808252906001600160a01b0384169063150b7a029061109490339088908790600401613197565b6020604051808303816000875af11580156110b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d791906131e3565b7fffffffff0000000000000000000000000000000000000000000000000000000016145b6111175760405162461bcd60e51b8152600401610c6690613236565b505050565b60065460ff161561113f5760405162461bcd60e51b8152600401610c6690613278565b3360009081526013602052604090205460ff1661115b57600080fd5b6000818152600360205260409020546001600160a01b031632148061118a57506024546001600160a01b031633145b8061119f57506029546001600160a01b031633145b6111bb5760405162461bcd60e51b8152600401610c66906132ba565b600a80549060006111cb836132e0565b91905055506111d981611f73565b60405181907f04758eba0e440c213770b194262bd033c02424a06dd27169bdb94d5e1582c6b790600090a250565b3360009081526013602052604090205460ff166112365760405162461bcd60e51b8152600401610c6690613329565b60075460095461124b9061ffff166001613339565b61ffff16111561126d5760405162461bcd60e51b8152600401610c6690613394565b6101c2600b54600161127f91906133a4565b111561129d5760405162461bcd60e51b8152600401610c66906133e9565b6009805461ffff169060006112b1836133f9565b91906101000a81548161ffff021916908361ffff16021790555050600a60008154809291906112df9061341b565b90915550506009546112f59061ffff1682612030565b5060095461130890839061ffff166123b8565b5050565b600081815260106020526040902080546060919061132990613076565b80601f016020809104026020016040519081016040528092919081815260200182805461135590613076565b80156113a25780601f10611377576101008083540402835291602001916113a2565b820191906000526020600020905b81548152906001019060200180831161138557829003601f168201915b50505050509050919050565b602b546001600160a01b031633146113c557600080fd5b6001600160a01b03166000908152601360205260409020805460ff19166001179055565b606060008290506000815167ffffffffffffffff81111561140c5761140c612ad8565b6040519080825280601f01601f191660200182016040528015611436576020820181803683370190505b50905060005b82518110156115745760418382815181106114595761145961342f565b016020015160f81c108015906114895750605a83828151811061147e5761147e61342f565b016020015160f81c11155b15611503578281815181106114a0576114a061342f565b602001015160f81c60f81b60f81c60206114ba9190613445565b60f81b8282815181106114cf576114cf61342f565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611562565b8281815181106115155761151561342f565b602001015160f81c60f81b8282815181106115325761153261342f565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b8061156c8161341b565b91505061143c565b509392505050565b60018054610b8090613076565b6000808290506001815110156115a25750600092915050565b6019815111156115b55750600092915050565b806000815181106115c8576115c861342f565b6020910101516001600160f81b031916600160fd1b14156115ec5750600092915050565b80600182516115fb9190613466565b8151811061160b5761160b61342f565b6020910101516001600160f81b031916600160fd1b141561162f5750600092915050565b6000816000815181106116445761164461342f565b01602001516001600160f81b031916905060005b82518110156118355760008382815181106116755761167561342f565b01602001516001600160f81b0319169050600160fd1b811480156116a65750600160fd1b6001600160f81b03198416145b156116b75750600095945050505050565b7f30000000000000000000000000000000000000000000000000000000000000006001600160f81b031982161080159061171b57507f39000000000000000000000000000000000000000000000000000000000000006001600160f81b0319821611155b15801561178957507f41000000000000000000000000000000000000000000000000000000000000006001600160f81b031982161080159061178757507f5a000000000000000000000000000000000000000000000000000000000000006001600160f81b0319821611155b155b80156117f657507f61000000000000000000000000000000000000000000000000000000000000006001600160f81b03198216108015906117f457507f7a000000000000000000000000000000000000000000000000000000000000006001600160f81b0319821611155b155b80156118105750600160fd1b6001600160f81b0319821614155b156118215750600095945050505050565b91508061182d8161341b565b915050611658565b506001949350505050565b3360008181526005602090815260408083206001600160a01b038716808552925291829020805460ff191685151517905590519091907f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31906118a390859061295b565b60405180910390a35050565b3360009081526013602052604090205460ff166118de5760405162461bcd60e51b8152600401610c6690613329565b6007546009546118f39061ffff166001613339565b61ffff1611156119155760405162461bcd60e51b8152600401610c6690613394565b6009805461ffff16906000611929836133f9565b91906101000a81548161ffff021916908361ffff16021790555050600a60008154809291906119579061341b565b909155505060095461196d9061ffff1682612030565b50326001600160a01b0383161480159061199557506024546001600160a01b03838116911614155b156119ce5760095460405161ffff909116907fb2e017be121bc5ebd43482997d41cf19fa0e0e024f0befb11c71e35083e2555190600090a25b60095461130890839061ffff166123b8565b60065460ff1615611a035760405162461bcd60e51b8152600401610c6690613278565b3360009081526013602052604090205460ff16611a325760405162461bcd60e51b8152600401610c6690613329565b600754600954611a479061ffff166001613339565b61ffff161115611a695760405162461bcd60e51b8152600401610c66906134af565b6009805461ffff16906000611a7d836133f9565b91906101000a81548161ffff021916908361ffff16021790555050600a6000815480929190611aab9061341b565b90915550506009546112f59061ffff168261248b565b611acc848484610db9565b6001600160a01b0383163b1580611b9257506040517f150b7a0200000000000000000000000000000000000000000000000000000000808252906001600160a01b0385169063150b7a0290611b2b9033908990889088906004016134bf565b6020604051808303816000875af1158015611b4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b6e91906131e3565b7fffffffff0000000000000000000000000000000000000000000000000000000016145b611bae5760405162461bcd60e51b8152600401610c6690613236565b50505050565b60065460ff610100909104161515600114611be15760405162461bcd60e51b8152600401610c6690613535565b6000828152600360205260409020546001600160a01b03163314611c175760405162461bcd60e51b8152600401610c6690613577565b60008281526011602052604090205460ff1615611c465760405162461bcd60e51b8152600401610c66906135b9565b611c4f81611589565b1515600114611c705760405162461bcd60e51b8152600401610c66906135fb565b611c7981610d1e565b15611c965760405162461bcd60e51b8152600401610c669061363d565b611ca1816001612509565b6000828152601160209081526040808320805460ff19166001179055601082529091208251611cd292840190612855565b506028546001600160a01b0316639dc29fac33686c6b935b8bbd4000006040518363ffffffff1660e01b8152600401611d0c92919061364d565b600060405180830381600087803b158015611d2657600080fd5b505af1158015611d3a573d6000803e3d6000fd5b50505050817f557ccefdb621ec53187da31464572dbe5ad475e5cc300ba8d528cb8134de1aae82604051611d6e91906129fb565b60405180910390a25050565b6000818152600e602052604090205460609060ff1615611e22576026546040517fc87b56dd0000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063c87b56dd90611ddd908590600401612d1a565b600060405180830381865afa158015611dfa573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b3c91908101906136c0565b6025546040517fc87b56dd0000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063c87b56dd90611ddd908590600401612d1a565b602b546001600160a01b03163314611e8257600080fd5b602b805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b60065460ff1615611ed45760405162461bcd60e51b8152600401610c6690613278565b6006805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611f093390565b604051611f169190612a58565b60405180910390a1565b60065460ff16611f425760405162461bcd60e51b8152600401610c669061372d565b6006805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33611f09565b6000818152600360205260409020546001600160a01b031680611fa85760405162461bcd60e51b8152600401610c669061376f565b6001600160a01b0381166000818152600260209081526040808320805460001901905585835260038252808320805473ffffffffffffffffffffffffffffffffffffffff1990811690915560049092528083208054909216909155518492907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6040805161014081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081019190915261208b8383612546565b9050600f600061209a836126a4565b8152602001908152602001600020546000141561231a576000838152600c602090815260408083208451815493860151928601516060870151608088015160a089015160c08a015160e08b0151610100808d01516101208e01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909c1698151561ff0019169890981760ff9a8b16909102177fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffff1662010000968a16969096027fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff1695909517630100000094891694909402939093177fffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffff16640100000000928816929092027fffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffff16919091176501000000000091871691909102177fffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffff166601000000000000918616919091027fffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffff161767010000000000000091851691909102177fffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffff1668010000000000000000918416919091027fffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff1617690100000000000000000092909316919091029190911790558390600f906122d6846126a4565b815260200190815260200160002081905550827f917ce909ba5a9cf4c718eefa4de73bf0e8c10a72be6ea753886cb66293ac3f6260405160405180910390a2610b3c565b6027546040517fb863bd370000000000000000000000000000000000000000000000000000000081526123b19185916001600160a01b039091169063b863bd3790612369908790600401612d1a565b6020604051808303816000875af1158015612388573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123ac919061378a565b612030565b9392505050565b6001600160a01b0382166123de5760405162461bcd60e51b8152600401610c6690613187565b6000818152600360205260409020546001600160a01b0316156124135760405162461bcd60e51b8152600401610c66906137dd565b6001600160a01b0382166000818152600260209081526040808320805460010190558483526003909152808220805473ffffffffffffffffffffffffffffffffffffffff19168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b604080516020808201835260ff84811683526009805461ffff9081166000908152600d855286812086518154951660ff199586161790559154168152600e909252838220805490911660011790559151909184917f917ce909ba5a9cf4c718eefa4de73bf0e8c10a72be6ea753886cb66293ac3f629190a292915050565b806012612515846113e9565b6040516125229190613109565b908152604051908190036020019020805491151560ff199092169190911790555050565b6040805161014081018252600060208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526001815260109290921c91906125ae9061ffff841690612704565b60ff16602082015260109190911c906125cc61ffff83166001612704565b60ff16604082015260109190911c906125ea61ffff83166002612704565b60ff16606082015260109190911c9061260861ffff83166003612704565b60ff16608082015260109190911c9061262661ffff83166004612704565b60ff1660a082015260109190911c9061264461ffff83166005612704565b60ff1660e082015260109190911c9061266261ffff83166006612704565b60ff1660c082015260109190911c9061268061ffff83166007612704565b60ff166101008201526000612694846127e0565b60ff166101208301525092915050565b6020808201516040808401516060850151608086015160a087015160e088015160c08901516101008a01516101208b0151975160009a6126e69a999101613805565b60408051601f19818403018152919052805160209091012092915050565b60008060148360ff166008811061271d5761271d61342f565b0154612729908561389d565b905060148360ff16600881106127415761274161342f565b018160ff16815481106127565761275661342f565b60009182526020918290209181049091015460ff601f9092166101000a90048116600886901c909116101561278c579050610b3c565b601c8360ff16600881106127a2576127a261342f565b018160ff16815481106127b7576127b761342f565b90600052602060002090602091828204019190069054906101000a900460ff1691505092915050565b600061271082116127f357506000919050565b614e20821161280457506001919050565b617530821161281557506002919050565b619c40821161282657506003919050565b61c350821161283757506004919050565b61d6d8821161284857506005919050565b506005919050565b919050565b82805461286190613076565b90600052602060002090601f01602090048101928261288357600085556128c9565b82601f1061289c57805160ff19168380011785556128c9565b828001600101855582156128c9579182015b828111156128c95782518255916020019190600101906128ae565b506128d59291506128d9565b5090565b5b808211156128d557600081556001016128da565b7fffffffff0000000000000000000000000000000000000000000000000000000081165b8114610d7657600080fd5b8035610b3c816128ee565b60006020828403121561293d5761293d600080fd5b6000612949848461291d565b949350505050565b8015155b82525050565b60208101610b3c8284612951565b801515612912565b8035610b3c81612969565b60006020828403121561299157612991600080fd5b60006129498484612971565b60005b838110156129b85781810151838201526020016129a0565b83811115611bae5750506000910152565b60006129d3825190565b8084526020840193506129ea81856020860161299d565b601f01601f19169290920192915050565b602080825281016123b181846129c9565b80612912565b8035610b3c81612a0c565b600060208284031215612a3257612a32600080fd5b60006129498484612a12565b60006001600160a01b038216610b3c565b61295581612a3e565b60208101610b3c8284612a4f565b61291281612a3e565b8035610b3c81612a66565b60008060408385031215612a9057612a90600080fd5b6000612a9c8585612a6f565b9250506020612aad85828601612a12565b9150509250929050565b600060208284031215612acc57612acc600080fd5b60006129498484612a6f565b634e487b7160e01b600052604160045260246000fd5b601f19601f830116810181811067ffffffffffffffff82111715612b1457612b14612ad8565b6040525050565b6000612b2660405190565b90506128508282612aee565b600067ffffffffffffffff821115612b4c57612b4c612ad8565b601f19601f83011660200192915050565b82818337506000910152565b6000612b7c612b7784612b32565b612b1b565b905082815260208101848484011115612b9757612b97600080fd5b611574848285612b5d565b600082601f830112612bb657612bb6600080fd5b8135612949848260208601612b69565b600060208284031215612bdb57612bdb600080fd5b813567ffffffffffffffff811115612bf557612bf5600080fd5b61294984828501612ba2565b600080600060608486031215612c1957612c19600080fd5b6000612c258686612a6f565b9350506020612c3686828701612a6f565b9250506040612c4786828701612a12565b9150509250925092565b60008060008060008060c08789031215612c6d57612c6d600080fd5b6000612c798989612a6f565b9650506020612c8a89828a01612a6f565b9550506040612c9b89828a01612a6f565b9450506060612cac89828a01612a6f565b9350506080612cbd89828a01612a6f565b92505060a0612cce89828a01612a6f565b9150509295509295509295565b60008060408385031215612cf157612cf1600080fd5b6000612a9c8585612a12565b60ff8116612955565b60208101610b3c8284612cfd565b80612955565b60208101610b3c8284612d14565b8051612d348382612951565b506020810151612d476020840182612cfd565b506040810151612d5a6040840182612cfd565b506060810151612d6d6060840182612cfd565b506080810151612d806080840182612cfd565b5060a0810151612d9360a0840182612cfd565b5060c0810151612da660c0840182612cfd565b5060e0810151612db960e0840182612cfd565b50610100810151612dce610100840182612cfd565b50610120810151611117610120840182612cfd565b6101408101610b3c8284612d28565b61ffff8116612955565b60208101610b3c8284612df2565b6000610b3c82612a3e565b6000610b3c82612e0a565b61295581612e15565b60208101610b3c8284612e20565b6101408101612e46828d612951565b612e53602083018c612cfd565b612e60604083018b612cfd565b612e6d606083018a612cfd565b612e7a6080830189612cfd565b612e8760a0830188612cfd565b612e9460c0830187612cfd565b612ea160e0830186612cfd565b612eaf610100830185612cfd565b612ebd610120830184612cfd565b9b9a5050505050505050505050565b60008060408385031215612ee257612ee2600080fd5b6000612eee8585612a6f565b9250506020612aad85828601612971565b80516111178382612cfd565b60208101610b3c8284612eff565b60ff8116612912565b8035610b3c81612f19565b60008060408385031215612f4357612f43600080fd5b6000612f4f8585612a6f565b9250506020612aad85828601612f22565b60008060008060808587031215612f7957612f79600080fd5b6000612f858787612a6f565b9450506020612f9687828801612a6f565b9350506040612fa787828801612a12565b925050606085013567ffffffffffffffff811115612fc757612fc7600080fd5b612fd387828801612ba2565b91505092959194509250565b60008060408385031215612ff557612ff5600080fd5b60006130018585612a12565b925050602083013567ffffffffffffffff81111561302157613021600080fd5b612aad85828601612ba2565b6000806040838503121561304357613043600080fd5b600061304f8585612a6f565b9250506020612aad85828601612a6f565b634e487b7160e01b600052602260045260246000fd5b60028104600182168061308a57607f821691505b6020821081141561309d5761309d613060565b50919050565b600e8152602081017f4e4f545f415554484f52495a4544000000000000000000000000000000000000815290505b60200190565b60208082528101610b3c816130a3565b60006130f1825190565b6130ff81856020860161299d565b9290920192915050565b610b3c81836130e7565b600a8152602081017f57524f4e475f46524f4d00000000000000000000000000000000000000000000815290506130d1565b60208082528101610b3c81613113565b60118152602081017f494e56414c49445f524543495049454e54000000000000000000000000000000815290506130d1565b60208082528101610b3c81613155565b608081016131a58286612a4f565b6131b26020830185612a4f565b6131bf6040830184612d14565b8181036060830152600081526020810195945050505050565b8051610b3c816128ee565b6000602082840312156131f8576131f8600080fd5b600061294984846131d8565b60108152602081017f554e534146455f524543495049454e5400000000000000000000000000000000815290506130d1565b60208082528101610b3c81613204565b60108152602081017f5061757361626c653a2070617573656400000000000000000000000000000000815290506130d1565b60208082528101610b3c81613246565b60138152602081017f436f6c6f6e6973743a204e6f74204f776e657200000000000000000000000000815290506130d1565b60208082528101610b3c81613288565b634e487b7160e01b600052601160045260246000fd5b6000816132ef576132ef6132ca565b506000190190565b600b8152602081017f4f6e6c792041646d696e73000000000000000000000000000000000000000000815290506130d1565b60208082528101610b3c816132f7565b61ffff8116905061ffff8216915060008261ffff0382111561335d5761335d6132ca565b500190565b60168152602081017f416c6c20636f6c6f6e69737473206465706c6f79656400000000000000000000815290506130d1565b60208082528101610b3c81613362565b6000821982111561335d5761335d6132ca565b601e8152602081017f416c6c20686f6e6f72206d696e74732068617665206265656e2073656e740000815290506130d1565b60208082528101610b3c816133b7565b61ffff81169050600061ffff821415613414576134146132ca565b5060010190565b6000600019821415613414576134146132ca565b634e487b7160e01b600052603260045260246000fd5b60ff8116905060ff8216915060008260ff0382111561335d5761335d6132ca565b600082821015613478576134786132ca565b500390565b60158152602081017f416c6c20636f6c6f6e697374206465706c6f7965640000000000000000000000815290506130d1565b60208082528101610b3c8161347d565b608081016134cd8287612a4f565b6134da6020830186612a4f565b6134e76040830185612d14565b81810360608301526134f981846129c9565b9695505050505050565b60188152602081017f6e616d696e67206e6f742079657420617661696c61626c650000000000000000815290506130d1565b60208082528101610b3c81613503565b60198152602081017f4e6f7420796f757220636f6c6f6e69737420746f206e616d6500000000000000815290506130d1565b60208082528101610b3c81613545565b60168152602081017f436f6c6f6e69737420616c7265616479206e616d656400000000000000000000815290506130d1565b60208082528101610b3c81613587565b60108152602081017f4e6f7420612076616c6964206e616d6500000000000000000000000000000000815290506130d1565b60208082528101610b3c816135c9565b60158152602081017f4e616d6520616c72656164792072657365727665640000000000000000000000815290506130d1565b60208082528101610b3c8161360b565b6040810161365b8285612a4f565b6123b16020830184612d14565b6000613676612b7784612b32565b90508281526020810184848401111561369157613691600080fd5b61157484828561299d565b600082601f8301126136b0576136b0600080fd5b8151612949848260208601613668565b6000602082840312156136d5576136d5600080fd5b815167ffffffffffffffff8111156136ef576136ef600080fd5b6129498482850161369c565b60148152602081017f5061757361626c653a206e6f7420706175736564000000000000000000000000815290506130d1565b60208082528101610b3c816136fb565b600a8152602081017f4e4f545f4d494e54454400000000000000000000000000000000000000000000815290506130d1565b60208082528101610b3c8161373d565b8051610b3c81612a0c565b60006020828403121561379f5761379f600080fd5b6000612949848461377f565b600e8152602081017f414c52454144595f4d494e544544000000000000000000000000000000000000815290506130d1565b60208082528101610b3c816137ab565b6000610b3c8260f81b90565b61295560ff82166137ed565b61380f818b6137f9565b60010161381c818a6137f9565b60010161382981896137f9565b60010161383681886137f9565b60010161384381876137f9565b60010161385081866137f9565b60010161385d81856137f9565b60010161386a81846137f9565b60010161387781836137f9565b6001019998505050505050505050565b634e487b7160e01b600052601260045260246000fd5b60ff91821691166000826138b3576138b3613887565b50069056fea2646970667358221220304cd02a588c1f0cef0eed9a6095a8de48abd0d9655ca12869ad94ba5bc1c3f764736f6c634300080b0033

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061038e5760003560e01c806375ab9b76116101de578063b656f09d1161010f578063d41d416d116100ad578063e985e9c51161007c578063e985e9c514610a00578063f10fb58414610a2e578063f2fde38b14610a41578063f47c84c514610a5457600080fd5b8063d41d416d14610994578063de9375f2146109b7578063e1fc334f146109ca578063e6073869146109dd57600080fd5b8063bb5434de116100e9578063bb5434de1461095c578063bea093d214610965578063c084f54014610978578063c87b56dd1461098157600080fd5b8063b656f09d14610923578063b6a7195314610936578063b88d4fde1461094957600080fd5b806395d89b411161017c578063a22cb46511610156578063a22cb465146108ad578063a70e847b146108c0578063ab32e8a3146108c9578063b07ba6a7146108dc57600080fd5b806395d89b41146108725780639ffdb65a1461087a578063a1b8f3741461088d57600080fd5b80638f58e7a8116101b85780638f58e7a81461082057806392b086f41461084357806393de58231461084c5780639416b4231461085f57600080fd5b806375ab9b76146107ec57806383c79d43146107ff5780638da5cb5b1461080f57600080fd5b80634018b1f8116102c35780636352211e116102615780636d522418116102305780636d522418146107005780637048027514610713578063704b3bec1461072657806370a08231146107cc57600080fd5b80636352211e1461069c578063693fe4db146106c55780636abcded1146106d85780636ca865ba146106e057600080fd5b806347486c751161029d57806347486c75146105345780634806e930146105465780634f02c420146106765780635c975abb1461069157600080fd5b80634018b1f8146104fd57806342842e0e1461050e57806342966c681461052157600080fd5b806316c38b3c116103305780632463a55a1161030a5780632463a55a1461048e57806333df4b2c146104a157806336838391146104c157806339c7639c146104d457600080fd5b806316c38b3c146104555780631785f53c1461046857806323b872dd1461047b57600080fd5b8063081812fc1161036c578063081812fc146103e6578063095ea7b31461041c5780631509f2941461042f57806315b56d101461044257600080fd5b806301ffc9a71461039357806302815835146103bc57806306fdde03146103d1575b600080fd5b6103a66103a1366004612928565b610a5d565b6040516103b3919061295b565b60405180910390f35b6103cf6103ca36600461297c565b610b42565b005b6103d9610b73565b6040516103b391906129fb565b61040f6103f4366004612a1d565b6004602052600090815260409020546001600160a01b031681565b6040516103b39190612a58565b6103cf61042a366004612a7a565b610c01565b6103cf61043d366004612ab7565b610cd8565b6103a6610450366004612bc6565b610d1e565b6103cf61046336600461297c565b610d51565b6103cf610476366004612ab7565b610d81565b6103cf610489366004612c01565b610db9565b6103cf61049c366004612c51565b610f42565b6104b46104af366004612cdb565b610fd6565b6040516103b39190612d06565b6104b46104cf366004612cdb565b61101c565b61040f6104e2366004612a1d565b6000908152600360205260409020546001600160a01b031690565b6008545b6040516103b39190612d1a565b6103cf61051c366004612c01565b61102c565b6103cf61052f366004612a1d565b61111c565b6006546103a690610100900460ff1681565b610669610554366004612a1d565b6040805161014081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e081018290526101008101829052610120810191909152506000908152600c6020908152604091829020825161014081018452905460ff808216151583526101008083048216948401949094526201000082048116948301949094526301000000810484166060830152640100000000810484166080830152650100000000008104841660a083015266010000000000008104841660c08301526701000000000000008104841660e0830152680100000000000000008104841692820192909252690100000000000000000090910490911661012082015290565b6040516103b39190612de3565b6009546106849061ffff1681565b6040516103b39190612dfc565b60065460ff166103a6565b61040f6106aa366004612a1d565b6003602052600090815260409020546001600160a01b031681565b6103cf6106d3366004612a7a565b611207565b600754610501565b6028546106f3906001600160a01b031681565b6040516103b39190612e29565b6103d961070e366004612a1d565b61130c565b6103cf610721366004612ab7565b6113ae565b6107b6610734366004612a1d565b600c6020526000908152604090205460ff80821691610100810482169162010000820481169163010000008104821691640100000000820481169165010000000000810482169166010000000000008204811691670100000000000000810482169168010000000000000000820481169169010000000000000000009004168a565b6040516103b39a99989796959493929190612e37565b6105016107da366004612ab7565b60026020526000908152604090205481565b6026546106f3906001600160a01b031681565b610501686c6b935b8bbd40000081565b602b546001600160a01b031661040f565b6103a661082e366004612a1d565b60009081526011602052604090205460ff1690565b6105016101c281565b6024546106f3906001600160a01b031681565b6103d961086d366004612bc6565b6113e9565b6103d961157c565b6103a6610888366004612bc6565b611589565b61050161089b366004612a1d565b600f6020526000908152604090205481565b6103cf6108bb366004612ecc565b611840565b610501600a5481565b60295461040f906001600160a01b031681565b6109166108ea366004612a1d565b6040805160208082018352600091829052928152600d835281902081519283019091525460ff16815290565b6040516103b39190612f0b565b6103cf610931366004612a7a565b6118af565b6103cf610944366004612f2d565b6119e0565b6103cf610957366004612f60565b611ac1565b610501600b5481565b6103cf610973366004612fdf565b611bb4565b61050160085481565b6103d961098f366004612a1d565b611d7a565b6104b46109a2366004612a1d565b600d6020526000908152604090205460ff1681565b602b5461040f906001600160a01b031681565b6025546106f3906001600160a01b031681565b6103a66109eb366004612a1d565b600e6020526000908152604090205460ff1681565b6103a6610a0e36600461302d565b600560209081526000928352604080842090915290825290205460ff1681565b6027546106f3906001600160a01b031681565b6103cf610a4f366004612ab7565b611e6b565b61050160075481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000083161480610af057507f80ac58cd000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b80610b3c57507f5b5e139f000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b602b546001600160a01b03163314610b5957600080fd5b600680549115156101000261ff0019909216919091179055565b60008054610b8090613076565b80601f0160208091040260200160405190810160405280929190818152602001828054610bac90613076565b8015610bf95780601f10610bce57610100808354040283529160200191610bf9565b820191906000526020600020905b815481529060010190602001808311610bdc57829003601f168201915b505050505081565b6000818152600360205260409020546001600160a01b031633811480610c4a57506001600160a01b038116600090815260056020908152604080832033845290915290205460ff165b610c6f5760405162461bcd60e51b8152600401610c66906130d7565b60405180910390fd5b600082815260046020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b602b546001600160a01b03163314610cef57600080fd5b602a805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b60006012610d2b836113e9565b604051610d389190613109565b9081526040519081900360200190205460ff1692915050565b602b546001600160a01b03163314610d6857600080fd5b8015610d7957610d76611eb1565b50565b610d76611f20565b602b546001600160a01b03163314610d9857600080fd5b6001600160a01b03166000908152601360205260409020805460ff19169055565b6000818152600360205260409020546001600160a01b03848116911614610df25760405162461bcd60e51b8152600401610c6690613145565b6001600160a01b038216610e185760405162461bcd60e51b8152600401610c6690613187565b3360009081526013602052604090205460ff16610ea657336001600160a01b0384161480610e5c57506000818152600460205260409020546001600160a01b031633145b80610e8a57506001600160a01b038316600090815260056020908152604080832033845290915290205460ff165b610ea65760405162461bcd60e51b8152600401610c66906130d7565b6001600160a01b03808416600081815260026020908152604080832080546000190190559386168083528483208054600101905585835260038252848320805473ffffffffffffffffffffffffffffffffffffffff199081168317909155600490925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b602b546001600160a01b03163314610f5957600080fd5b6025805473ffffffffffffffffffffffffffffffffffffffff199081166001600160a01b039889161790915560268054821696881696909617909555602480548616948716949094179093556027805485169286169290921790915560288054841692851692909217909155602980549092169216919091179055565b60148260088110610fe657600080fd5b018181548110610ff557600080fd5b9060005260206000209060209182820401919006915091509054906101000a900460ff1681565b601c8260088110610fe657600080fd5b611037838383610db9565b6001600160a01b0382163b15806110fb57506040517f150b7a0200000000000000000000000000000000000000000000000000000000808252906001600160a01b0384169063150b7a029061109490339088908790600401613197565b6020604051808303816000875af11580156110b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d791906131e3565b7fffffffff0000000000000000000000000000000000000000000000000000000016145b6111175760405162461bcd60e51b8152600401610c6690613236565b505050565b60065460ff161561113f5760405162461bcd60e51b8152600401610c6690613278565b3360009081526013602052604090205460ff1661115b57600080fd5b6000818152600360205260409020546001600160a01b031632148061118a57506024546001600160a01b031633145b8061119f57506029546001600160a01b031633145b6111bb5760405162461bcd60e51b8152600401610c66906132ba565b600a80549060006111cb836132e0565b91905055506111d981611f73565b60405181907f04758eba0e440c213770b194262bd033c02424a06dd27169bdb94d5e1582c6b790600090a250565b3360009081526013602052604090205460ff166112365760405162461bcd60e51b8152600401610c6690613329565b60075460095461124b9061ffff166001613339565b61ffff16111561126d5760405162461bcd60e51b8152600401610c6690613394565b6101c2600b54600161127f91906133a4565b111561129d5760405162461bcd60e51b8152600401610c66906133e9565b6009805461ffff169060006112b1836133f9565b91906101000a81548161ffff021916908361ffff16021790555050600a60008154809291906112df9061341b565b90915550506009546112f59061ffff1682612030565b5060095461130890839061ffff166123b8565b5050565b600081815260106020526040902080546060919061132990613076565b80601f016020809104026020016040519081016040528092919081815260200182805461135590613076565b80156113a25780601f10611377576101008083540402835291602001916113a2565b820191906000526020600020905b81548152906001019060200180831161138557829003601f168201915b50505050509050919050565b602b546001600160a01b031633146113c557600080fd5b6001600160a01b03166000908152601360205260409020805460ff19166001179055565b606060008290506000815167ffffffffffffffff81111561140c5761140c612ad8565b6040519080825280601f01601f191660200182016040528015611436576020820181803683370190505b50905060005b82518110156115745760418382815181106114595761145961342f565b016020015160f81c108015906114895750605a83828151811061147e5761147e61342f565b016020015160f81c11155b15611503578281815181106114a0576114a061342f565b602001015160f81c60f81b60f81c60206114ba9190613445565b60f81b8282815181106114cf576114cf61342f565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611562565b8281815181106115155761151561342f565b602001015160f81c60f81b8282815181106115325761153261342f565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b8061156c8161341b565b91505061143c565b509392505050565b60018054610b8090613076565b6000808290506001815110156115a25750600092915050565b6019815111156115b55750600092915050565b806000815181106115c8576115c861342f565b6020910101516001600160f81b031916600160fd1b14156115ec5750600092915050565b80600182516115fb9190613466565b8151811061160b5761160b61342f565b6020910101516001600160f81b031916600160fd1b141561162f5750600092915050565b6000816000815181106116445761164461342f565b01602001516001600160f81b031916905060005b82518110156118355760008382815181106116755761167561342f565b01602001516001600160f81b0319169050600160fd1b811480156116a65750600160fd1b6001600160f81b03198416145b156116b75750600095945050505050565b7f30000000000000000000000000000000000000000000000000000000000000006001600160f81b031982161080159061171b57507f39000000000000000000000000000000000000000000000000000000000000006001600160f81b0319821611155b15801561178957507f41000000000000000000000000000000000000000000000000000000000000006001600160f81b031982161080159061178757507f5a000000000000000000000000000000000000000000000000000000000000006001600160f81b0319821611155b155b80156117f657507f61000000000000000000000000000000000000000000000000000000000000006001600160f81b03198216108015906117f457507f7a000000000000000000000000000000000000000000000000000000000000006001600160f81b0319821611155b155b80156118105750600160fd1b6001600160f81b0319821614155b156118215750600095945050505050565b91508061182d8161341b565b915050611658565b506001949350505050565b3360008181526005602090815260408083206001600160a01b038716808552925291829020805460ff191685151517905590519091907f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31906118a390859061295b565b60405180910390a35050565b3360009081526013602052604090205460ff166118de5760405162461bcd60e51b8152600401610c6690613329565b6007546009546118f39061ffff166001613339565b61ffff1611156119155760405162461bcd60e51b8152600401610c6690613394565b6009805461ffff16906000611929836133f9565b91906101000a81548161ffff021916908361ffff16021790555050600a60008154809291906119579061341b565b909155505060095461196d9061ffff1682612030565b50326001600160a01b0383161480159061199557506024546001600160a01b03838116911614155b156119ce5760095460405161ffff909116907fb2e017be121bc5ebd43482997d41cf19fa0e0e024f0befb11c71e35083e2555190600090a25b60095461130890839061ffff166123b8565b60065460ff1615611a035760405162461bcd60e51b8152600401610c6690613278565b3360009081526013602052604090205460ff16611a325760405162461bcd60e51b8152600401610c6690613329565b600754600954611a479061ffff166001613339565b61ffff161115611a695760405162461bcd60e51b8152600401610c66906134af565b6009805461ffff16906000611a7d836133f9565b91906101000a81548161ffff021916908361ffff16021790555050600a6000815480929190611aab9061341b565b90915550506009546112f59061ffff168261248b565b611acc848484610db9565b6001600160a01b0383163b1580611b9257506040517f150b7a0200000000000000000000000000000000000000000000000000000000808252906001600160a01b0385169063150b7a0290611b2b9033908990889088906004016134bf565b6020604051808303816000875af1158015611b4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b6e91906131e3565b7fffffffff0000000000000000000000000000000000000000000000000000000016145b611bae5760405162461bcd60e51b8152600401610c6690613236565b50505050565b60065460ff610100909104161515600114611be15760405162461bcd60e51b8152600401610c6690613535565b6000828152600360205260409020546001600160a01b03163314611c175760405162461bcd60e51b8152600401610c6690613577565b60008281526011602052604090205460ff1615611c465760405162461bcd60e51b8152600401610c66906135b9565b611c4f81611589565b1515600114611c705760405162461bcd60e51b8152600401610c66906135fb565b611c7981610d1e565b15611c965760405162461bcd60e51b8152600401610c669061363d565b611ca1816001612509565b6000828152601160209081526040808320805460ff19166001179055601082529091208251611cd292840190612855565b506028546001600160a01b0316639dc29fac33686c6b935b8bbd4000006040518363ffffffff1660e01b8152600401611d0c92919061364d565b600060405180830381600087803b158015611d2657600080fd5b505af1158015611d3a573d6000803e3d6000fd5b50505050817f557ccefdb621ec53187da31464572dbe5ad475e5cc300ba8d528cb8134de1aae82604051611d6e91906129fb565b60405180910390a25050565b6000818152600e602052604090205460609060ff1615611e22576026546040517fc87b56dd0000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063c87b56dd90611ddd908590600401612d1a565b600060405180830381865afa158015611dfa573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b3c91908101906136c0565b6025546040517fc87b56dd0000000000000000000000000000000000000000000000000000000081526001600160a01b039091169063c87b56dd90611ddd908590600401612d1a565b602b546001600160a01b03163314611e8257600080fd5b602b805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b60065460ff1615611ed45760405162461bcd60e51b8152600401610c6690613278565b6006805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611f093390565b604051611f169190612a58565b60405180910390a1565b60065460ff16611f425760405162461bcd60e51b8152600401610c669061372d565b6006805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33611f09565b6000818152600360205260409020546001600160a01b031680611fa85760405162461bcd60e51b8152600401610c669061376f565b6001600160a01b0381166000818152600260209081526040808320805460001901905585835260038252808320805473ffffffffffffffffffffffffffffffffffffffff1990811690915560049092528083208054909216909155518492907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6040805161014081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081019190915261208b8383612546565b9050600f600061209a836126a4565b8152602001908152602001600020546000141561231a576000838152600c602090815260408083208451815493860151928601516060870151608088015160a089015160c08a015160e08b0151610100808d01516101208e01517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909c1698151561ff0019169890981760ff9a8b16909102177fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffff1662010000968a16969096027fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff1695909517630100000094891694909402939093177fffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffff16640100000000928816929092027fffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffff16919091176501000000000091871691909102177fffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffff166601000000000000918616919091027fffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffff161767010000000000000091851691909102177fffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffffffff1668010000000000000000918416919091027fffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffffff1617690100000000000000000092909316919091029190911790558390600f906122d6846126a4565b815260200190815260200160002081905550827f917ce909ba5a9cf4c718eefa4de73bf0e8c10a72be6ea753886cb66293ac3f6260405160405180910390a2610b3c565b6027546040517fb863bd370000000000000000000000000000000000000000000000000000000081526123b19185916001600160a01b039091169063b863bd3790612369908790600401612d1a565b6020604051808303816000875af1158015612388573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123ac919061378a565b612030565b9392505050565b6001600160a01b0382166123de5760405162461bcd60e51b8152600401610c6690613187565b6000818152600360205260409020546001600160a01b0316156124135760405162461bcd60e51b8152600401610c66906137dd565b6001600160a01b0382166000818152600260209081526040808320805460010190558483526003909152808220805473ffffffffffffffffffffffffffffffffffffffff19168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b604080516020808201835260ff84811683526009805461ffff9081166000908152600d855286812086518154951660ff199586161790559154168152600e909252838220805490911660011790559151909184917f917ce909ba5a9cf4c718eefa4de73bf0e8c10a72be6ea753886cb66293ac3f629190a292915050565b806012612515846113e9565b6040516125229190613109565b908152604051908190036020019020805491151560ff199092169190911790555050565b6040805161014081018252600060208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526001815260109290921c91906125ae9061ffff841690612704565b60ff16602082015260109190911c906125cc61ffff83166001612704565b60ff16604082015260109190911c906125ea61ffff83166002612704565b60ff16606082015260109190911c9061260861ffff83166003612704565b60ff16608082015260109190911c9061262661ffff83166004612704565b60ff1660a082015260109190911c9061264461ffff83166005612704565b60ff1660e082015260109190911c9061266261ffff83166006612704565b60ff1660c082015260109190911c9061268061ffff83166007612704565b60ff166101008201526000612694846127e0565b60ff166101208301525092915050565b6020808201516040808401516060850151608086015160a087015160e088015160c08901516101008a01516101208b0151975160009a6126e69a999101613805565b60408051601f19818403018152919052805160209091012092915050565b60008060148360ff166008811061271d5761271d61342f565b0154612729908561389d565b905060148360ff16600881106127415761274161342f565b018160ff16815481106127565761275661342f565b60009182526020918290209181049091015460ff601f9092166101000a90048116600886901c909116101561278c579050610b3c565b601c8360ff16600881106127a2576127a261342f565b018160ff16815481106127b7576127b761342f565b90600052602060002090602091828204019190069054906101000a900460ff1691505092915050565b600061271082116127f357506000919050565b614e20821161280457506001919050565b617530821161281557506002919050565b619c40821161282657506003919050565b61c350821161283757506004919050565b61d6d8821161284857506005919050565b506005919050565b919050565b82805461286190613076565b90600052602060002090601f01602090048101928261288357600085556128c9565b82601f1061289c57805160ff19168380011785556128c9565b828001600101855582156128c9579182015b828111156128c95782518255916020019190600101906128ae565b506128d59291506128d9565b5090565b5b808211156128d557600081556001016128da565b7fffffffff0000000000000000000000000000000000000000000000000000000081165b8114610d7657600080fd5b8035610b3c816128ee565b60006020828403121561293d5761293d600080fd5b6000612949848461291d565b949350505050565b8015155b82525050565b60208101610b3c8284612951565b801515612912565b8035610b3c81612969565b60006020828403121561299157612991600080fd5b60006129498484612971565b60005b838110156129b85781810151838201526020016129a0565b83811115611bae5750506000910152565b60006129d3825190565b8084526020840193506129ea81856020860161299d565b601f01601f19169290920192915050565b602080825281016123b181846129c9565b80612912565b8035610b3c81612a0c565b600060208284031215612a3257612a32600080fd5b60006129498484612a12565b60006001600160a01b038216610b3c565b61295581612a3e565b60208101610b3c8284612a4f565b61291281612a3e565b8035610b3c81612a66565b60008060408385031215612a9057612a90600080fd5b6000612a9c8585612a6f565b9250506020612aad85828601612a12565b9150509250929050565b600060208284031215612acc57612acc600080fd5b60006129498484612a6f565b634e487b7160e01b600052604160045260246000fd5b601f19601f830116810181811067ffffffffffffffff82111715612b1457612b14612ad8565b6040525050565b6000612b2660405190565b90506128508282612aee565b600067ffffffffffffffff821115612b4c57612b4c612ad8565b601f19601f83011660200192915050565b82818337506000910152565b6000612b7c612b7784612b32565b612b1b565b905082815260208101848484011115612b9757612b97600080fd5b611574848285612b5d565b600082601f830112612bb657612bb6600080fd5b8135612949848260208601612b69565b600060208284031215612bdb57612bdb600080fd5b813567ffffffffffffffff811115612bf557612bf5600080fd5b61294984828501612ba2565b600080600060608486031215612c1957612c19600080fd5b6000612c258686612a6f565b9350506020612c3686828701612a6f565b9250506040612c4786828701612a12565b9150509250925092565b60008060008060008060c08789031215612c6d57612c6d600080fd5b6000612c798989612a6f565b9650506020612c8a89828a01612a6f565b9550506040612c9b89828a01612a6f565b9450506060612cac89828a01612a6f565b9350506080612cbd89828a01612a6f565b92505060a0612cce89828a01612a6f565b9150509295509295509295565b60008060408385031215612cf157612cf1600080fd5b6000612a9c8585612a12565b60ff8116612955565b60208101610b3c8284612cfd565b80612955565b60208101610b3c8284612d14565b8051612d348382612951565b506020810151612d476020840182612cfd565b506040810151612d5a6040840182612cfd565b506060810151612d6d6060840182612cfd565b506080810151612d806080840182612cfd565b5060a0810151612d9360a0840182612cfd565b5060c0810151612da660c0840182612cfd565b5060e0810151612db960e0840182612cfd565b50610100810151612dce610100840182612cfd565b50610120810151611117610120840182612cfd565b6101408101610b3c8284612d28565b61ffff8116612955565b60208101610b3c8284612df2565b6000610b3c82612a3e565b6000610b3c82612e0a565b61295581612e15565b60208101610b3c8284612e20565b6101408101612e46828d612951565b612e53602083018c612cfd565b612e60604083018b612cfd565b612e6d606083018a612cfd565b612e7a6080830189612cfd565b612e8760a0830188612cfd565b612e9460c0830187612cfd565b612ea160e0830186612cfd565b612eaf610100830185612cfd565b612ebd610120830184612cfd565b9b9a5050505050505050505050565b60008060408385031215612ee257612ee2600080fd5b6000612eee8585612a6f565b9250506020612aad85828601612971565b80516111178382612cfd565b60208101610b3c8284612eff565b60ff8116612912565b8035610b3c81612f19565b60008060408385031215612f4357612f43600080fd5b6000612f4f8585612a6f565b9250506020612aad85828601612f22565b60008060008060808587031215612f7957612f79600080fd5b6000612f858787612a6f565b9450506020612f9687828801612a6f565b9350506040612fa787828801612a12565b925050606085013567ffffffffffffffff811115612fc757612fc7600080fd5b612fd387828801612ba2565b91505092959194509250565b60008060408385031215612ff557612ff5600080fd5b60006130018585612a12565b925050602083013567ffffffffffffffff81111561302157613021600080fd5b612aad85828601612ba2565b6000806040838503121561304357613043600080fd5b600061304f8585612a6f565b9250506020612aad85828601612a6f565b634e487b7160e01b600052602260045260246000fd5b60028104600182168061308a57607f821691505b6020821081141561309d5761309d613060565b50919050565b600e8152602081017f4e4f545f415554484f52495a4544000000000000000000000000000000000000815290505b60200190565b60208082528101610b3c816130a3565b60006130f1825190565b6130ff81856020860161299d565b9290920192915050565b610b3c81836130e7565b600a8152602081017f57524f4e475f46524f4d00000000000000000000000000000000000000000000815290506130d1565b60208082528101610b3c81613113565b60118152602081017f494e56414c49445f524543495049454e54000000000000000000000000000000815290506130d1565b60208082528101610b3c81613155565b608081016131a58286612a4f565b6131b26020830185612a4f565b6131bf6040830184612d14565b8181036060830152600081526020810195945050505050565b8051610b3c816128ee565b6000602082840312156131f8576131f8600080fd5b600061294984846131d8565b60108152602081017f554e534146455f524543495049454e5400000000000000000000000000000000815290506130d1565b60208082528101610b3c81613204565b60108152602081017f5061757361626c653a2070617573656400000000000000000000000000000000815290506130d1565b60208082528101610b3c81613246565b60138152602081017f436f6c6f6e6973743a204e6f74204f776e657200000000000000000000000000815290506130d1565b60208082528101610b3c81613288565b634e487b7160e01b600052601160045260246000fd5b6000816132ef576132ef6132ca565b506000190190565b600b8152602081017f4f6e6c792041646d696e73000000000000000000000000000000000000000000815290506130d1565b60208082528101610b3c816132f7565b61ffff8116905061ffff8216915060008261ffff0382111561335d5761335d6132ca565b500190565b60168152602081017f416c6c20636f6c6f6e69737473206465706c6f79656400000000000000000000815290506130d1565b60208082528101610b3c81613362565b6000821982111561335d5761335d6132ca565b601e8152602081017f416c6c20686f6e6f72206d696e74732068617665206265656e2073656e740000815290506130d1565b60208082528101610b3c816133b7565b61ffff81169050600061ffff821415613414576134146132ca565b5060010190565b6000600019821415613414576134146132ca565b634e487b7160e01b600052603260045260246000fd5b60ff8116905060ff8216915060008260ff0382111561335d5761335d6132ca565b600082821015613478576134786132ca565b500390565b60158152602081017f416c6c20636f6c6f6e697374206465706c6f7965640000000000000000000000815290506130d1565b60208082528101610b3c8161347d565b608081016134cd8287612a4f565b6134da6020830186612a4f565b6134e76040830185612d14565b81810360608301526134f981846129c9565b9695505050505050565b60188152602081017f6e616d696e67206e6f742079657420617661696c61626c650000000000000000815290506130d1565b60208082528101610b3c81613503565b60198152602081017f4e6f7420796f757220636f6c6f6e69737420746f206e616d6500000000000000815290506130d1565b60208082528101610b3c81613545565b60168152602081017f436f6c6f6e69737420616c7265616479206e616d656400000000000000000000815290506130d1565b60208082528101610b3c81613587565b60108152602081017f4e6f7420612076616c6964206e616d6500000000000000000000000000000000815290506130d1565b60208082528101610b3c816135c9565b60158152602081017f4e616d6520616c72656164792072657365727665640000000000000000000000815290506130d1565b60208082528101610b3c8161360b565b6040810161365b8285612a4f565b6123b16020830184612d14565b6000613676612b7784612b32565b90508281526020810184848401111561369157613691600080fd5b61157484828561299d565b600082601f8301126136b0576136b0600080fd5b8151612949848260208601613668565b6000602082840312156136d5576136d5600080fd5b815167ffffffffffffffff8111156136ef576136ef600080fd5b6129498482850161369c565b60148152602081017f5061757361626c653a206e6f7420706175736564000000000000000000000000815290506130d1565b60208082528101610b3c816136fb565b600a8152602081017f4e4f545f4d494e54454400000000000000000000000000000000000000000000815290506130d1565b60208082528101610b3c8161373d565b8051610b3c81612a0c565b60006020828403121561379f5761379f600080fd5b6000612949848461377f565b600e8152602081017f414c52454144595f4d494e544544000000000000000000000000000000000000815290506130d1565b60208082528101610b3c816137ab565b6000610b3c8260f81b90565b61295560ff82166137ed565b61380f818b6137f9565b60010161381c818a6137f9565b60010161382981896137f9565b60010161383681886137f9565b60010161384381876137f9565b60010161385081866137f9565b60010161385d81856137f9565b60010161386a81846137f9565b60010161387781836137f9565b6001019998505050505050505050565b634e487b7160e01b600052601260045260246000fd5b60ff91821691166000826138b3576138b3613887565b50069056fea2646970667358221220304cd02a588c1f0cef0eed9a6095a8de48abd0d9655ca12869ad94ba5bc1c3f764736f6c634300080b0033

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.