ETH Price: $3,174.68 (+1.28%)
Gas: 10 Gwei

Token

Evolution Serum (ES)
 

Overview

Max Total Supply

2,800 ES

Holders

211

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
0xa728b8816f6c3119146b96dbe0424f826ad48048
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Pixelmon Evolution Serums are the key to evolving your Pixelmon to its next Evolution State. In order to use a serum you must also own a Pixelmon NFT and a serum for that generation.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
EvolutionSerum

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
Yes with 9999 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 4 of 7: EvolutionSerum.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.14;

import "./Pixelmon.sol";
import "./ERC721.sol";
import "./ERC1155.sol";
import "./Ownable.sol";
import "./Strings.sol";

error InvalidNonce();
error InvalidOwner();
error InvalidEvolution();
error InvalidVoucher();
error NotEnoughEther();

contract EvolutionSerum is ERC1155, Ownable, ERC1155TokenReceiver {
    using Strings for uint256;

    /*///////////////////////////////////////////////////////////////
                               EVENTS
    //////////////////////////////////////////////////////////////*/

    event Evolution(uint indexed tokenId, uint evolutionStage);

    /*///////////////////////////////////////////////////////////////
                               CONSTANTS
    //////////////////////////////////////////////////////////////*/
    
    address constant public evolutionSigner = 0x00000001DEA29D000f2e99100C503bf1544Da95d;
    address constant public gnosisSafeAddress = 0x813F10aBA9624D2f4b3130a1EcD26da2BB2d09D4;

    string constant public name = "Evolution Serum";
    string constant public symbol = "ES";

    /*///////////////////////////////////////////////////////////////
                               STORAGE
    //////////////////////////////////////////////////////////////*/

    Pixelmon creatures;

    mapping(uint => uint) public serumPrices;
    mapping(address => uint) public nonces;
    mapping(bytes32 => bool) public usedVouchers;

    string baseURI;

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

    constructor(address creatureAddress, string memory _baseURI) {
        creatures = Pixelmon(creatureAddress);
        baseURI = _baseURI;
    }

    /*///////////////////////////////////////////////////////////////
                               MODIFIERS
    //////////////////////////////////////////////////////////////*/

    modifier correctNonce(uint nonce) {
        if(nonce != nonces[msg.sender]) revert InvalidNonce();
        nonces[msg.sender]++;
        _;
    }

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

    function setBaseURI(string memory _baseURI) public onlyOwner {
        baseURI = _baseURI;
    }

    function setSerumPrice(uint serumId, uint price) public onlyOwner {
        serumPrices[serumId] = price;
    }

    function uri(uint256 id) public view override returns (string memory) {
        return string(abi.encodePacked(baseURI, id.toString()));
    }

    /*///////////////////////////////////////////////////////////////
                            MINTING LOGIC
    //////////////////////////////////////////////////////////////*/

    function claim(uint serumId, uint count, bytes memory signature) public payable {
        if(msg.value < count * serumPrices[serumId]) revert NotEnoughEther();
        if(!validMint(msg.sender, serumId, count, signature)) revert InvalidVoucher();
        _mint(msg.sender, serumId, count, "");
    }

    function airdrop(uint serumId, address[] calldata users) public onlyOwner {
        for (uint256 i = 0; i < users.length; i++) {
           _mint(users[i], serumId, 1, ""); 
        }
    }

    function ownerMint(uint id, uint amount, address receiver) public onlyOwner {
        _mint(receiver, id, amount, "");
    }

    /*///////////////////////////////////////////////////////////////
                            EVOLUTION LOGIC
    //////////////////////////////////////////////////////////////*/

    function evolve(uint tokenId, uint serumId, uint nonce, uint evolutionStage, bytes memory signature) public correctNonce(nonce) {
        if(creatures.ownerOf(tokenId) != msg.sender) revert InvalidOwner();
        if(!validEvolution(msg.sender, serumId, tokenId, evolutionStage, nonce, signature)) revert InvalidEvolution();
        _burn(msg.sender, serumId, 1);
        creatures.mintEvolvedPixelmon(msg.sender, evolutionStage);
        emit Evolution(tokenId, evolutionStage);
    }

    /*///////////////////////////////////////////////////////////////
                                UTILS
    //////////////////////////////////////////////////////////////*/

    function validMint(address user, uint serumId, uint count, bytes memory signature) public returns (bool) {
        bytes32 messageHash = keccak256(abi.encodePacked(user, serumId, count));
        if(usedVouchers[messageHash]) return false;

        usedVouchers[messageHash] = true;
        bytes32 ethSignedMessageHash = getEthSignedMessageHash(messageHash);
        return recoverSigner(ethSignedMessageHash, signature) == evolutionSigner;
    }

    function validEvolution(address user, uint serumId, uint creatureId, uint evolutionStage, uint nonce, bytes memory signature)
        public
        pure
        returns (bool)
    {
        bytes32 messageHash = keccak256(abi.encodePacked(user, serumId, creatureId, evolutionStage, nonce));
        bytes32 ethSignedMessageHash = getEthSignedMessageHash(messageHash);

        return recoverSigner(ethSignedMessageHash, signature) == evolutionSigner;
    }

    function getEthSignedMessageHash(bytes32 _messageHash)
        private
        pure
        returns (bytes32)
    {
        /*
        Signature is produced by signing a keccak256 hash with the following format:
        "\x19Ethereum Signed Message\n" + len(msg) + msg
        */
        return
            keccak256(
                abi.encodePacked(
                    "\x19Ethereum Signed Message:\n32",
                    _messageHash
                )
            );
    }

    function recoverSigner(
        bytes32 _ethSignedMessageHash,
        bytes memory _signature
    ) private pure returns (address) {
        (bytes32 r, bytes32 s, uint8 v) = splitSignature(_signature);
        return ecrecover(_ethSignedMessageHash, v, r, s);
    }

    function splitSignature(bytes memory sig)
        private
        pure
        returns (
            bytes32 r,
            bytes32 s,
            uint8 v
        )
    {
        require(sig.length == 65, "sig invalid");

        assembly {
            /*
        First 32 bytes stores the length of the signature

        add(sig, 32) = pointer of sig + 32
        effectively, skips first 32 bytes of signature

        mload(p) loads next 32 bytes starting at the memory address p into memory
        */

            // first 32 bytes, after the length prefix
            r := mload(add(sig, 32))
            // second 32 bytes
            s := mload(add(sig, 64))
            // final byte (first byte of the next 32 bytes)
            v := byte(0, mload(add(sig, 96)))
        }

        // implicitly return (r, s, v)
    }

    /// @notice Withdraws collected funds to the Gnosis Safe address
    function withdraw() public onlyOwner {
        (bool success, ) = gnosisSafeAddress.call{value: address(this).balance}("");
        require(success);
    }

    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external returns (bytes4) {
        return ERC1155TokenReceiver.onERC1155Received.selector;
    }

    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external returns (bytes4) {
        return ERC1155TokenReceiver.onERC1155BatchReceived.selector;
    }
}

File 1 of 7: Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

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 2 of 7: ERC1155.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

/// @notice Minimalist and gas efficient standard ERC1155 implementation.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC1155.sol)
abstract contract ERC1155 {
    /*///////////////////////////////////////////////////////////////
                                EVENTS
    //////////////////////////////////////////////////////////////*/

    event TransferSingle(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256 id,
        uint256 amount
    );

    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] amounts
    );

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

    event URI(string value, uint256 indexed id);

    /*///////////////////////////////////////////////////////////////
                            ERC1155 STORAGE
    //////////////////////////////////////////////////////////////*/

    mapping(address => mapping(uint256 => uint256)) public balanceOf;

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

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

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

    /*///////////////////////////////////////////////////////////////
                             ERC1155 LOGIC
    //////////////////////////////////////////////////////////////*/

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

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

    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public virtual {
        require(msg.sender == from || isApprovedForAll[from][msg.sender], "NOT_AUTHORIZED");

        balanceOf[from][id] -= amount;
        balanceOf[to][id] += amount;

        emit TransferSingle(msg.sender, from, to, id, amount);

        require(
            to.code.length == 0
                ? to != address(0)
                : ERC1155TokenReceiver(to).onERC1155Received(msg.sender, from, id, amount, data) ==
                    ERC1155TokenReceiver.onERC1155Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual {
        uint256 idsLength = ids.length; // Saves MLOADs.

        require(idsLength == amounts.length, "LENGTH_MISMATCH");

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

        for (uint256 i = 0; i < idsLength; ) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            balanceOf[from][id] -= amount;
            balanceOf[to][id] += amount;

            // An array can't have a total length
            // larger than the max uint256 value.
            unchecked {
                i++;
            }
        }

        emit TransferBatch(msg.sender, from, to, ids, amounts);

        require(
            to.code.length == 0
                ? to != address(0)
                : ERC1155TokenReceiver(to).onERC1155BatchReceived(msg.sender, from, ids, amounts, data) ==
                    ERC1155TokenReceiver.onERC1155BatchReceived.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    function balanceOfBatch(address[] memory owners, uint256[] memory ids)
        public
        view
        virtual
        returns (uint256[] memory balances)
    {
        uint256 ownersLength = owners.length; // Saves MLOADs.

        require(ownersLength == ids.length, "LENGTH_MISMATCH");

        balances = new uint256[](owners.length);

        // Unchecked because the only math done is incrementing
        // the array index counter which cannot possibly overflow.
        unchecked {
            for (uint256 i = 0; i < ownersLength; i++) {
                balances[i] = balanceOf[owners[i]][ids[i]];
            }
        }
    }

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

    function supportsInterface(bytes4 interfaceId) public pure virtual returns (bool) {
        return
            interfaceId == 0x01ffc9a7 || // ERC165 Interface ID for ERC165
            interfaceId == 0xd9b67a26 || // ERC165 Interface ID for ERC1155
            interfaceId == 0x0e89341c; // ERC165 Interface ID for ERC1155MetadataURI
    }

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

    function _mint(
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal {
        balanceOf[to][id] += amount;

        emit TransferSingle(msg.sender, address(0), to, id, amount);

        require(
            to.code.length == 0
                ? to != address(0)
                : ERC1155TokenReceiver(to).onERC1155Received(msg.sender, address(0), id, amount, data) ==
                    ERC1155TokenReceiver.onERC1155Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    function _batchMint(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal {
        uint256 idsLength = ids.length; // Saves MLOADs.

        require(idsLength == amounts.length, "LENGTH_MISMATCH");

        for (uint256 i = 0; i < idsLength; ) {
            balanceOf[to][ids[i]] += amounts[i];

            // An array can't have a total length
            // larger than the max uint256 value.
            unchecked {
                i++;
            }
        }

        emit TransferBatch(msg.sender, address(0), to, ids, amounts);

        require(
            to.code.length == 0
                ? to != address(0)
                : ERC1155TokenReceiver(to).onERC1155BatchReceived(msg.sender, address(0), ids, amounts, data) ==
                    ERC1155TokenReceiver.onERC1155BatchReceived.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    function _batchBurn(
        address from,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal {
        uint256 idsLength = ids.length; // Saves MLOADs.

        require(idsLength == amounts.length, "LENGTH_MISMATCH");

        for (uint256 i = 0; i < idsLength; ) {
            balanceOf[from][ids[i]] -= amounts[i];

            // An array can't have a total length
            // larger than the max uint256 value.
            unchecked {
                i++;
            }
        }

        emit TransferBatch(msg.sender, from, address(0), ids, amounts);
    }

    function _burn(
        address from,
        uint256 id,
        uint256 amount
    ) internal {
        balanceOf[from][id] -= amount;

        emit TransferSingle(msg.sender, from, address(0), id, amount);
    }
}

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

    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external returns (bytes4);
}

File 3 of 7: 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 id);

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

    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                        
    //////////////////////////////////////////////////////////////*/

    uint256 public totalSupply;

    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 {
            totalSupply++;

            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 {
            totalSupply--;

            balanceOf[owner]--;
        }

        delete ownerOf[id];

        delete getApproved[id];

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

    /*///////////////////////////////////////////////////////////////
                       INTERNAL SAFE MINT LOGIC
    //////////////////////////////////////////////////////////////*/

    function _safeMint(address to, uint256 id) internal virtual {
        _mint(to, id);

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

    function _safeMint(
        address to,
        uint256 id,
        bytes memory data
    ) internal virtual {
        _mint(to, id);

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

/// @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 7: Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

import "./Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 6 of 7: Pixelmon.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.14;

import "./ERC721.sol";
import "./Ownable.sol";
import "./Strings.sol";

/// @notice Thrown when completing the transaction results in overallocation of Pixelmon.
error MintedOut();
/// @notice Thrown when the dutch auction phase has not yet started, or has already ended.
error AuctionNotStarted();
/// @notice Thrown when the user has already minted two Pixelmon in the dutch auction.
error MintingTooMany();
/// @notice Thrown when the value of the transaction is not enough for the current dutch auction or mintlist price.
error ValueTooLow();
/// @notice Thrown when the user is not on the mintlist.
error NotMintlisted();
/// @notice Thrown when the caller is not the EvolutionSerum contract, and is trying to evolve a Pixelmon.
error UnauthorizedEvolution();
/// @notice Thrown when an invalid evolution is given by the EvolutionSerum contract.
error UnknownEvolution();


//  ______   __     __  __     ______     __         __    __     ______     __   __    
// /\  == \ /\ \   /\_\_\_\   /\  ___\   /\ \       /\ "-./  \   /\  __ \   /\ "-.\ \   
// \ \  _-/ \ \ \  \/_/\_\/_  \ \  __\   \ \ \____  \ \ \-./\ \  \ \ \/\ \  \ \ \-.  \  
//  \ \_\    \ \_\   /\_\/\_\  \ \_____\  \ \_____\  \ \_\ \ \_\  \ \_____\  \ \_\\"\_\ 
//   \/_/     \/_/   \/_/\/_/   \/_____/   \/_____/   \/_/  \/_/   \/_____/   \/_/ \/_/ 
//
/// @title Generation 1 Pixelmon NFTs
/// @author delta devs (https://www.twitter.com/deltadevelopers)
contract Pixelmon is ERC721, Ownable {
    using Strings for uint256;

    /*///////////////////////////////////////////////////////////////
                               CONSTANTS
    //////////////////////////////////////////////////////////////*/

    /// @dev Determines the order of the species for each tokenId, mechanism for choosing starting index explained post mint, explanation hash: acb427e920bde46de95103f14b8e57798a603abcf87ff9d4163e5f61c6a56881.
    uint constant public provenanceHash = 0x9912e067bd3802c3b007ce40b6c125160d2ccb5352d199e20c092fdc17af8057;

    /// @dev Sole receiver of collected contract funds, and receiver of 330 Pixelmon in the constructor.
    address constant gnosisSafeAddress = 0xF6BD9Fc094F7aB74a846E5d82a822540EE6c6971;

    /// @dev 7750, plus 330 for the Pixelmon Gnosis Safe
    uint constant auctionSupply = 7750 + 330;

    /// @dev The offsets are the tokenIds that the corresponding evolution stage will begin minting at.
    uint constant secondEvolutionOffset = 10005;
    uint constant thirdEvolutionOffset = secondEvolutionOffset + 4013;
    uint constant fourthEvolutionOffset = thirdEvolutionOffset + 1206;

    /*///////////////////////////////////////////////////////////////
                        EVOLUTIONARY STORAGE
    //////////////////////////////////////////////////////////////*/

    /// @dev The next tokenID to be minted for each of the evolution stages
    uint secondEvolutionSupply = 0;
    uint thirdEvolutionSupply = 0;
    uint fourthEvolutionSupply = 0;

    /// @notice The address of the contract permitted to mint evolved Pixelmon.
    address public serumContract;

    /// @notice Returns true if the user is on the mintlist, if they have not already minted.
    mapping(address => bool) public mintlisted;

    /*///////////////////////////////////////////////////////////////
                            AUCTION STORAGE
    //////////////////////////////////////////////////////////////*/

    /// @notice Starting price of the auction.
    uint256 constant public auctionStartPrice = 3 ether;

    /// @notice Unix Timestamp of the start of the auction.
    /// @dev Monday, February 7th 2022, 13:00:00 converted to 1644256800 (GMT -5)
    uint256 constant public auctionStartTime = 1644256800;

    /// @notice Current mintlist price, which will be updated after the end of the auction phase.
    /// @dev We started with signatures, then merkle tree, but landed on mapping to reduce USER gas fees.
    uint256 public mintlistPrice = 0.75 ether;

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

    string public baseURI;

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

    /// @notice Deploys the contract, minting 330 Pixelmon to the Gnosis Safe and setting the initial metadata URI.
    constructor(string memory _baseURI) ERC721("Pixelmon", "PXLMN") {
        baseURI = _baseURI;
        unchecked {
            balanceOf[gnosisSafeAddress] += 330;
            totalSupply += 330;
            for (uint256 i = 0; i < 330; i++) {
                ownerOf[i] = gnosisSafeAddress;
                emit Transfer(address(0), gnosisSafeAddress, i);
            }
        }
    }

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

    /// @notice Allows the contract deployer to set the metadata URI.
    /// @param _baseURI The new metadata URI.
    function setBaseURI(string memory _baseURI) public onlyOwner {
        baseURI = _baseURI;
    }

    function tokenURI(uint256 id) public view override returns (string memory) {
        return string(abi.encodePacked(baseURI, id.toString()));
    }

    /*///////////////////////////////////////////////////////////////
                        DUTCH AUCTION LOGIC
    //////////////////////////////////////////////////////////////*/

    /// @notice Calculates the auction price with the accumulated rate deduction since the auction's begin
    /// @return The auction price at the current time, or 0 if the deductions are greater than the auction's start price.
    function validCalculatedTokenPrice() private view returns (uint) {
        uint priceReduction = ((block.timestamp - auctionStartTime) / 10 minutes) * 0.1 ether;
        return auctionStartPrice >= priceReduction ? (auctionStartPrice - priceReduction) : 0;
    }

    /// @notice Calculates the current dutch auction price, given accumulated rate deductions and a minimum price.
    /// @return The current dutch auction price
    function getCurrentTokenPrice() public view returns (uint256) {
        return max(validCalculatedTokenPrice(), 0.2 ether);
    }

    /// @notice Purchases a Pixelmon NFT in the dutch auction
    /// @param mintingTwo True if the user is minting two Pixelmon, otherwise false.
    /// @dev balanceOf is fine, team is aware and accepts that transferring out and repurchasing can be done, even by contracts. 
    function auction(bool mintingTwo) public payable {
        if(block.timestamp < auctionStartTime || block.timestamp > auctionStartTime + 1 days) revert AuctionNotStarted();

        uint count = mintingTwo ? 2 : 1;
        uint price = getCurrentTokenPrice();

        if(totalSupply + count > auctionSupply) revert MintedOut();
        if(balanceOf[msg.sender] + count > 2) revert MintingTooMany();
        if(msg.value < price * count) revert ValueTooLow();

        mintingTwo ? _mintTwo(msg.sender) : _mint(msg.sender, totalSupply);
    }
    
    /// @notice Mints two Pixelmons to an address
    /// @param to Receiver of the two newly minted NFTs
    /// @dev errors taken from super._mint
    function _mintTwo(address to) internal {
        require(to != address(0), "INVALID_RECIPIENT");
        require(ownerOf[totalSupply] == address(0), "ALREADY_MINTED");
        uint currentId = totalSupply;

        /// @dev unchecked because no arithmetic can overflow
        unchecked {
            totalSupply += 2;
            balanceOf[to] += 2;
            ownerOf[currentId] = to;
            ownerOf[currentId + 1] = to;
            emit Transfer(address(0), to, currentId);
            emit Transfer(address(0), to, currentId + 1);
        }
    }


    /*///////////////////////////////////////////////////////////////
                        MINTLIST MINT LOGIC
    //////////////////////////////////////////////////////////////*/

    /// @notice Allows the contract deployer to set the price of the mintlist. To be called before uploading the mintlist.
    /// @param price The price in wei of a Pixelmon NFT to be purchased from the mintlist supply.
    function setMintlistPrice(uint256 price) public onlyOwner {
        mintlistPrice = price;
    }

    /// @notice Allows the contract deployer to add a single address to the mintlist.
    /// @param user Address to be added to the mintlist.
    function mintlistUser(address user) public onlyOwner {
        mintlisted[user] = true;
    }

    /// @notice Allows the contract deployer to add a list of addresses to the mintlist.
    /// @param users Addresses to be added to the mintlist.
    function mintlistUsers(address[] calldata users) public onlyOwner {
        for (uint256 i = 0; i < users.length; i++) {
           mintlisted[users[i]] = true; 
        }
    }

    /// @notice Purchases a Pixelmon NFT from the mintlist supply
    /// @dev We do not check if auction is over because the mintlist will be uploaded after the auction. 
    function mintlistMint() public payable {
        if(totalSupply >= secondEvolutionOffset) revert MintedOut();
        if(!mintlisted[msg.sender]) revert NotMintlisted();
        if(msg.value < mintlistPrice) revert ValueTooLow();

        mintlisted[msg.sender] = false;
        _mint(msg.sender, totalSupply);
    }

    /// @notice Withdraws collected funds to the Gnosis Safe address
    function withdraw() public onlyOwner {
        (bool success, ) = gnosisSafeAddress.call{value: address(this).balance}("");
        require(success);
    }

    /*///////////////////////////////////////////////////////////////
                            ROLL OVER LOGIC
    //////////////////////////////////////////////////////////////*/

    /// @notice Allows the contract deployer to airdrop Pixelmon to a list of addresses, in case the auction doesn't mint out
    /// @param addresses Array of addresses to receive Pixelmon
    function rollOverPixelmons(address[] calldata addresses) public onlyOwner {
        if(totalSupply + addresses.length > secondEvolutionOffset) revert MintedOut();

        for (uint256 i = 0; i < addresses.length; i++) {
            _mint(msg.sender, totalSupply);
        }
    }

    /*///////////////////////////////////////////////////////////////
                        EVOLUTIONARY LOGIC
    //////////////////////////////////////////////////////////////*/

    /// @notice Sets the address of the contract permitted to call mintEvolvedPixelmon
    /// @param _serumContract The address of the EvolutionSerum contract
    function setSerumContract(address _serumContract) public onlyOwner {
        serumContract = _serumContract; 
    }

    /// @notice Mints an evolved Pixelmon
    /// @param receiver Receiver of the evolved Pixelmon
    /// @param evolutionStage The evolution (2-4) that the Pixelmon is undergoing
    function mintEvolvedPixelmon(address receiver, uint evolutionStage) public payable {
        if(msg.sender != serumContract) revert UnauthorizedEvolution();

        if (evolutionStage == 2) {
            if(secondEvolutionSupply >= 4013) revert MintedOut();
            _mint(receiver, secondEvolutionOffset + secondEvolutionSupply);
            unchecked {
                secondEvolutionSupply++;
            }
        } else if (evolutionStage == 3) {
            if(thirdEvolutionSupply >= 1206) revert MintedOut();
            _mint(receiver, thirdEvolutionOffset + thirdEvolutionSupply);
            unchecked {
                thirdEvolutionSupply++;
            }
        } else if (evolutionStage == 4) {
            if(fourthEvolutionSupply >= 33) revert MintedOut();
            _mint(receiver, fourthEvolutionOffset + fourthEvolutionSupply);
            unchecked {
                fourthEvolutionSupply++;
            }
        } else  {
            revert UnknownEvolution();
        }
    }


    /*///////////////////////////////////////////////////////////////
                                UTILS
    //////////////////////////////////////////////////////////////*/

    /// @notice Returns the greater of two numbers.
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a >= b ? a : b;
    }

}

File 7 of 7: Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"creatureAddress","type":"address"},{"internalType":"string","name":"_baseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"InvalidEvolution","type":"error"},{"inputs":[],"name":"InvalidNonce","type":"error"},{"inputs":[],"name":"InvalidOwner","type":"error"},{"inputs":[],"name":"InvalidVoucher","type":"error"},{"inputs":[],"name":"NotEnoughEther","type":"error"},{"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"},{"indexed":false,"internalType":"uint256","name":"evolutionStage","type":"uint256"}],"name":"Evolution","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[{"internalType":"uint256","name":"serumId","type":"uint256"},{"internalType":"address[]","name":"users","type":"address[]"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"owners","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"balances","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"serumId","type":"uint256"},{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"claim","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"evolutionSigner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"serumId","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"evolutionStage","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"evolve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gnosisSafeAddress","outputs":[{"internalType":"address","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":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","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":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"serumPrices","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"serumId","type":"uint256"},{"internalType":"uint256","name":"price","type":"uint256"}],"name":"setSerumPrice","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":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"usedVouchers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"serumId","type":"uint256"},{"internalType":"uint256","name":"creatureId","type":"uint256"},{"internalType":"uint256","name":"evolutionStage","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"validEvolution","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"serumId","type":"uint256"},{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"validMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5060405162002ea238038062002ea28339810160408190526200003491620000d9565b6200003f3362000071565b600380546001600160a01b0319166001600160a01b038416179055600762000068828262000268565b50505062000334565b600280546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b60008060408385031215620000ed57600080fd5b82516001600160a01b03811681146200010557600080fd5b602084810151919350906001600160401b03808211156200012557600080fd5b818601915086601f8301126200013a57600080fd5b8151818111156200014f576200014f620000c3565b604051601f8201601f19908116603f011681019083821181831017156200017a576200017a620000c3565b8160405282815289868487010111156200019357600080fd5b600093505b82841015620001b7578484018601518185018701529285019262000198565b82841115620001c95760008684830101525b8096505050505050509250929050565b600181811c90821680620001ee57607f821691505b6020821081036200020f57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200026357600081815260208120601f850160051c810160208610156200023e5750805b601f850160051c820191505b818110156200025f578281556001016200024a565b5050505b505050565b81516001600160401b03811115620002845762000284620000c3565b6200029c81620002958454620001d9565b8462000215565b602080601f831160018114620002d45760008415620002bb5750858301515b600019600386901b1c1916600185901b1785556200025f565b600085815260208120601f198616915b828110156200030557888601518255948401946001909101908401620002e4565b5085821015620003245787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b612b5e80620003446000396000f3fe6080604052600436106101c15760003560e01c80638da5cb5b116100f7578063bdf7a8e611610095578063e985e9c511610064578063e985e9c51461060f578063f23a6e611461064a578063f242432a14610690578063f2fde38b146106b057600080fd5b8063bdf7a8e614610577578063bfa556e414610597578063c3ae792a146105c7578063c7434d0b146105e757600080fd5b80639e0445af116100d15780639e0445af14610491578063a22cb465146104be578063a66510e7146104de578063bc197c81146104fe57600080fd5b80638da5cb5b1461040a57806395d89b41146104285780639709eb511461047157600080fd5b80634d588a91116101645780635e0e20021161013e5780635e0e2002146103785780635eddd157146103b5578063715018a6146103c85780637ecebe00146103dd57600080fd5b80634d588a911461030b5780634e1273f41461032b57806355f804b31461035857600080fd5b80630e89341c116101a05780630e89341c146102945780632eb2c2d6146102b45780633ccfd60b146102d65780633fb0fff7146102eb57600080fd5b8062fdd58e146101c657806301ffc9a71461020e57806306fdde031461023e575b600080fd5b3480156101d257600080fd5b506101fb6101e1366004611d47565b600060208181529281526040808220909352908152205481565b6040519081526020015b60405180910390f35b34801561021a57600080fd5b5061022e610229366004611da1565b6106d0565b6040519015158152602001610205565b34801561024a57600080fd5b506102876040518060400160405280600f81526020017f45766f6c7574696f6e20536572756d000000000000000000000000000000000081525081565b6040516102059190611e1d565b3480156102a057600080fd5b506102876102af366004611e30565b6107b5565b3480156102c057600080fd5b506102d46102cf366004611fb0565b6107e9565b005b3480156102e257600080fd5b506102d4610b1e565b3480156102f757600080fd5b506102d461030636600461205e565b610be4565b34801561031757600080fd5b506102d46103263660046120b5565b610e23565b34801561033757600080fd5b5061034b6103463660046120ee565b610e9d565b60405161020591906121eb565b34801561036457600080fd5b506102d46103733660046121fe565b610fd9565b34801561038457600080fd5b5061039d7001dea29d000f2e99100c503bf1544da95d81565b6040516001600160a01b039091168152602001610205565b6102d46103c3366004612247565b611043565b3480156103d457600080fd5b506102d46110f2565b3480156103e957600080fd5b506101fb6103f8366004612297565b60056020526000908152604090205481565b34801561041657600080fd5b506002546001600160a01b031661039d565b34801561043457600080fd5b506102876040518060400160405280600281526020017f455300000000000000000000000000000000000000000000000000000000000081525081565b34801561047d57600080fd5b5061022e61048c3660046122b4565b611158565b34801561049d57600080fd5b506101fb6104ac366004611e30565b60046020526000908152604090205481565b3480156104ca57600080fd5b506102d46104d9366004612329565b61123c565b3480156104ea57600080fd5b5061022e6104f9366004612367565b6112c6565b34801561050a57600080fd5b50610546610519366004612458565b7fbc197c810000000000000000000000000000000000000000000000000000000098975050505050505050565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610205565b34801561058357600080fd5b506102d4610592366004612517565b611408565b3480156105a357600080fd5b5061022e6105b2366004611e30565b60066020526000908152604090205460ff1681565b3480156105d357600080fd5b506102d46105e2366004612563565b6114c7565b3480156105f357600080fd5b5061039d73813f10aba9624d2f4b3130a1ecd26da2bb2d09d481565b34801561061b57600080fd5b5061022e61062a366004612585565b600160209081526000928352604080842090915290825290205460ff1681565b34801561065657600080fd5b506105466106653660046125b3565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b34801561069c57600080fd5b506102d46106ab36600461262f565b611533565b3480156106bc57600080fd5b506102d46106cb366004612297565b61179a565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316148061076357507fd9b67a26000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b806107af57507f0e89341c000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b606060076107c283611879565b6040516020016107d39291906126df565b6040516020818303038152906040529050919050565b8251825181146108405760405162461bcd60e51b815260206004820152600f60248201527f4c454e4754485f4d49534d41544348000000000000000000000000000000000060448201526064015b60405180910390fd5b336001600160a01b038716148061087a57506001600160a01b038616600090815260016020908152604080832033845290915290205460ff165b6108c65760405162461bcd60e51b815260206004820152600e60248201527f4e4f545f415554484f52495a45440000000000000000000000000000000000006044820152606401610837565b60005b8181101561099b5760008582815181106108e5576108e5612784565b60200260200101519050600085838151811061090357610903612784565b60200260200101519050806000808b6001600160a01b03166001600160a01b031681526020019081526020016000206000848152602001908152602001600020600082825461095291906127e2565b90915550506001600160a01b038816600090815260208181526040808320858452909152812080548392906109889084906127f9565b9091555050600190920191506108c99050565b50846001600160a01b0316866001600160a01b0316336001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516109eb929190612811565b60405180910390a46001600160a01b0385163b15610abd576040517fbc197c8100000000000000000000000000000000000000000000000000000000808252906001600160a01b0387169063bc197c8190610a529033908b908a908a908a9060040161283f565b6020604051808303816000875af1158015610a71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a95919061289d565b7fffffffff000000000000000000000000000000000000000000000000000000001614610aca565b6001600160a01b03851615155b610b165760405162461bcd60e51b815260206004820152601060248201527f554e534146455f524543495049454e54000000000000000000000000000000006044820152606401610837565b505050505050565b6002546001600160a01b03163314610b785760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610837565b60405160009073813f10aba9624d2f4b3130a1ecd26da2bb2d09d49047908381818185875af1925050503d8060008114610bce576040519150601f19603f3d011682016040523d82523d6000602084013e610bd3565b606091505b5050905080610be157600080fd5b50565b3360009081526005602052604090205483908114610c2e576040517f756688fe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000908152600560205260408120805491610c49836128ba565b90915550506003546040517f6352211e0000000000000000000000000000000000000000000000000000000081526004810188905233916001600160a01b031690636352211e90602401602060405180830381865afa158015610cb0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd491906128f2565b6001600160a01b031614610d14576040517f49e27cff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d22338688868887611158565b610d58576040517f617c4ac600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d64338660016119ae565b6003546040517f1aa0ffe4000000000000000000000000000000000000000000000000000000008152336004820152602481018590526001600160a01b0390911690631aa0ffe490604401600060405180830381600087803b158015610dc957600080fd5b505af1158015610ddd573d6000803e3d6000fd5b50505050857ffecef5ffbeff589c2531c0dd627381c28a98251d2c33befcec163da7a03f0d1884604051610e1391815260200190565b60405180910390a2505050505050565b6002546001600160a01b03163314610e7d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610837565b610e9881848460405180602001604052806000815250611a32565b505050565b81518151606091908114610ef35760405162461bcd60e51b815260206004820152600f60248201527f4c454e4754485f4d49534d4154434800000000000000000000000000000000006044820152606401610837565b835167ffffffffffffffff811115610f0d57610f0d611e49565b604051908082528060200260200182016040528015610f36578160200160208202803683370190505b50915060005b81811015610fd157600080868381518110610f5957610f59612784565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000206000858381518110610f9557610f95612784565b6020026020010151815260200190815260200160002054838281518110610fbe57610fbe612784565b6020908102919091010152600101610f3c565b505092915050565b6002546001600160a01b031633146110335760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610837565b600761103f8282612955565b5050565b60008381526004602052604090205461105c9083612a51565b341015611095576040517f8a0d377900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110a1338484846112c6565b6110d7576040517f6d67dbd600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e9833848460405180602001604052806000815250611a32565b6002546001600160a01b0316331461114c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610837565b6111566000611bd5565b565b60408051606088901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660208083019190915260348201889052605482018790526074820186905260948083018690528351808403909101815260b4830184528051908201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000060d484015260f0808401829052845180850390910181526101109093019093528151910120600091907001dea29d000f2e99100c503bf1544da95d6112258286611c3f565b6001600160a01b0316149998505050505050505050565b3360008181526001602090815260408083206001600160a01b0387168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606086901b1660208201526034810184905260548101839052600090819060740160408051601f1981840301815291815281516020928301206000818152600690935291205490915060ff1615611345576000915050611400565b600081815260066020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556113d3826040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b90507001dea29d000f2e99100c503bf1544da95d6113f18286611c3f565b6001600160a01b031614925050505b949350505050565b6002546001600160a01b031633146114625760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610837565b60005b818110156114c1576114af83838381811061148257611482612784565b90506020020160208101906114979190612297565b85600160405180602001604052806000815250611a32565b806114b9816128ba565b915050611465565b50505050565b6002546001600160a01b031633146115215760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610837565b60009182526004602052604090912055565b336001600160a01b038616148061156d57506001600160a01b038516600090815260016020908152604080832033845290915290205460ff165b6115b95760405162461bcd60e51b815260206004820152600e60248201527f4e4f545f415554484f52495a45440000000000000000000000000000000000006044820152606401610837565b6001600160a01b038516600090815260208181526040808320868452909152812080548492906115ea9084906127e2565b90915550506001600160a01b038416600090815260208181526040808320868452909152812080548492906116209084906127f9565b909155505060408051848152602081018490526001600160a01b03808716929088169133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46001600160a01b0384163b1561173a576040517ff23a6e6100000000000000000000000000000000000000000000000000000000808252906001600160a01b0386169063f23a6e61906116cf9033908a90899089908990600401612a8e565b6020604051808303816000875af11580156116ee573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611712919061289d565b7fffffffff000000000000000000000000000000000000000000000000000000001614611747565b6001600160a01b03841615155b6117935760405162461bcd60e51b815260206004820152601060248201527f554e534146455f524543495049454e54000000000000000000000000000000006044820152606401610837565b5050505050565b6002546001600160a01b031633146117f45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610837565b6001600160a01b0381166118705760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610837565b610be181611bd5565b6060816000036118bc57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156118e657806118d0816128ba565b91506118df9050600a83612b00565b91506118c0565b60008167ffffffffffffffff81111561190157611901611e49565b6040519080825280601f01601f19166020018201604052801561192b576020820181803683370190505b5090505b8415611400576119406001836127e2565b915061194d600a86612b14565b6119589060306127f9565b60f81b81838151811061196d5761196d612784565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506119a7600a86612b00565b945061192f565b6001600160a01b038316600090815260208181526040808320858452909152812080548392906119df9084906127e2565b909155505060408051838152602081018390526000916001600160a01b0386169133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4505050565b6001600160a01b03841660009081526020818152604080832086845290915281208054849290611a639084906127f9565b909155505060408051848152602081018490526001600160a01b0386169160009133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46001600160a01b0384163b15611b7c576040517ff23a6e6100000000000000000000000000000000000000000000000000000000808252906001600160a01b0386169063f23a6e6190611b11903390600090899089908990600401612a8e565b6020604051808303816000875af1158015611b30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b54919061289d565b7fffffffff000000000000000000000000000000000000000000000000000000001614611b89565b6001600160a01b03841615155b6114c15760405162461bcd60e51b815260206004820152601060248201527f554e534146455f524543495049454e54000000000000000000000000000000006044820152606401610837565b600280546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600080600080611c4e85611cbe565b6040805160008152602081018083528b905260ff8316918101919091526060810184905260808101839052929550909350915060019060a0016020604051602081039080840390855afa158015611ca9573d6000803e3d6000fd5b5050604051601f190151979650505050505050565b60008060008351604114611d145760405162461bcd60e51b815260206004820152600b60248201527f73696720696e76616c69640000000000000000000000000000000000000000006044820152606401610837565b50505060208101516040820151606090920151909260009190911a90565b6001600160a01b0381168114610be157600080fd5b60008060408385031215611d5a57600080fd5b8235611d6581611d32565b946020939093013593505050565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114610be157600080fd5b600060208284031215611db357600080fd5b8135611dbe81611d73565b9392505050565b60005b83811015611de0578181015183820152602001611dc8565b838111156114c15750506000910152565b60008151808452611e09816020860160208601611dc5565b601f01601f19169290920160200192915050565b602081526000611dbe6020830184611df1565b600060208284031215611e4257600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611ea157611ea1611e49565b604052919050565b600067ffffffffffffffff821115611ec357611ec3611e49565b5060051b60200190565b600082601f830112611ede57600080fd5b81356020611ef3611eee83611ea9565b611e78565b82815260059290921b84018101918181019086841115611f1257600080fd5b8286015b84811015611f2d5780358352918301918301611f16565b509695505050505050565b600067ffffffffffffffff831115611f5257611f52611e49565b611f656020601f19601f86011601611e78565b9050828152838383011115611f7957600080fd5b828260208301376000602084830101529392505050565b600082601f830112611fa157600080fd5b611dbe83833560208501611f38565b600080600080600060a08688031215611fc857600080fd5b8535611fd381611d32565b94506020860135611fe381611d32565b9350604086013567ffffffffffffffff8082111561200057600080fd5b61200c89838a01611ecd565b9450606088013591508082111561202257600080fd5b61202e89838a01611ecd565b9350608088013591508082111561204457600080fd5b5061205188828901611f90565b9150509295509295909350565b600080600080600060a0868803121561207657600080fd5b85359450602086013593506040860135925060608601359150608086013567ffffffffffffffff8111156120a957600080fd5b61205188828901611f90565b6000806000606084860312156120ca57600080fd5b833592506020840135915060408401356120e381611d32565b809150509250925092565b6000806040838503121561210157600080fd5b823567ffffffffffffffff8082111561211957600080fd5b818501915085601f83011261212d57600080fd5b8135602061213d611eee83611ea9565b82815260059290921b8401810191818101908984111561215c57600080fd5b948201945b8386101561218357853561217481611d32565b82529482019490820190612161565b9650508601359250508082111561219957600080fd5b506121a685828601611ecd565b9150509250929050565b600081518084526020808501945080840160005b838110156121e0578151875295820195908201906001016121c4565b509495945050505050565b602081526000611dbe60208301846121b0565b60006020828403121561221057600080fd5b813567ffffffffffffffff81111561222757600080fd5b8201601f8101841361223857600080fd5b61140084823560208401611f38565b60008060006060848603121561225c57600080fd5b8335925060208401359150604084013567ffffffffffffffff81111561228157600080fd5b61228d86828701611f90565b9150509250925092565b6000602082840312156122a957600080fd5b8135611dbe81611d32565b60008060008060008060c087890312156122cd57600080fd5b86356122d881611d32565b95506020870135945060408701359350606087013592506080870135915060a087013567ffffffffffffffff81111561231057600080fd5b61231c89828a01611f90565b9150509295509295509295565b6000806040838503121561233c57600080fd5b823561234781611d32565b91506020830135801515811461235c57600080fd5b809150509250929050565b6000806000806080858703121561237d57600080fd5b843561238881611d32565b93506020850135925060408501359150606085013567ffffffffffffffff8111156123b257600080fd5b6123be87828801611f90565b91505092959194509250565b60008083601f8401126123dc57600080fd5b50813567ffffffffffffffff8111156123f457600080fd5b6020830191508360208260051b850101111561240f57600080fd5b9250929050565b60008083601f84011261242857600080fd5b50813567ffffffffffffffff81111561244057600080fd5b60208301915083602082850101111561240f57600080fd5b60008060008060008060008060a0898b03121561247457600080fd5b883561247f81611d32565b9750602089013561248f81611d32565b9650604089013567ffffffffffffffff808211156124ac57600080fd5b6124b88c838d016123ca565b909850965060608b01359150808211156124d157600080fd5b6124dd8c838d016123ca565b909650945060808b01359150808211156124f657600080fd5b506125038b828c01612416565b999c989b5096995094979396929594505050565b60008060006040848603121561252c57600080fd5b83359250602084013567ffffffffffffffff81111561254a57600080fd5b612556868287016123ca565b9497909650939450505050565b6000806040838503121561257657600080fd5b50508035926020909101359150565b6000806040838503121561259857600080fd5b82356125a381611d32565b9150602083013561235c81611d32565b60008060008060008060a087890312156125cc57600080fd5b86356125d781611d32565b955060208701356125e781611d32565b94506040870135935060608701359250608087013567ffffffffffffffff81111561261157600080fd5b61261d89828a01612416565b979a9699509497509295939492505050565b600080600080600060a0868803121561264757600080fd5b853561265281611d32565b9450602086013561266281611d32565b93506040860135925060608601359150608086013567ffffffffffffffff8111156120a957600080fd5b600181811c908216806126a057607f821691505b6020821081036126d9577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60008084546126ed8161268c565b60018281168015612705576001811461273857612767565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0084168752821515830287019450612767565b8860005260208060002060005b8581101561275e5781548a820152908401908201612745565b50505082870194505b50505050835161277b818360208801611dc5565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000828210156127f4576127f46127b3565b500390565b6000821982111561280c5761280c6127b3565b500190565b60408152600061282460408301856121b0565b828103602084015261283681856121b0565b95945050505050565b60006001600160a01b03808816835280871660208401525060a0604083015261286b60a08301866121b0565b828103606084015261287d81866121b0565b905082810360808401526128918185611df1565b98975050505050505050565b6000602082840312156128af57600080fd5b8151611dbe81611d73565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036128eb576128eb6127b3565b5060010190565b60006020828403121561290457600080fd5b8151611dbe81611d32565b601f821115610e9857600081815260208120601f850160051c810160208610156129365750805b601f850160051c820191505b81811015610b1657828155600101612942565b815167ffffffffffffffff81111561296f5761296f611e49565b6129838161297d845461268c565b8461290f565b602080601f8311600181146129d657600084156129a05750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555610b16565b600085815260208120601f198616915b82811015612a05578886015182559484019460019091019084016129e6565b5085821015612a4157878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612a8957612a896127b3565b500290565b60006001600160a01b03808816835280871660208401525084604083015283606083015260a06080830152612ac660a0830184611df1565b979650505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082612b0f57612b0f612ad1565b500490565b600082612b2357612b23612ad1565b50069056fea2646970667358221220498c57fadcedb85bce22103618e19340e5093b854e19df9fd811c7cd28066a1b64736f6c634300080f003300000000000000000000000032973908faee0bf825a343000fe412ebe56f802a0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000002568747470733a2f2f706978656c6d6f6e2e636c75622f6170692f736572756d2f6d6574612f000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106101c15760003560e01c80638da5cb5b116100f7578063bdf7a8e611610095578063e985e9c511610064578063e985e9c51461060f578063f23a6e611461064a578063f242432a14610690578063f2fde38b146106b057600080fd5b8063bdf7a8e614610577578063bfa556e414610597578063c3ae792a146105c7578063c7434d0b146105e757600080fd5b80639e0445af116100d15780639e0445af14610491578063a22cb465146104be578063a66510e7146104de578063bc197c81146104fe57600080fd5b80638da5cb5b1461040a57806395d89b41146104285780639709eb511461047157600080fd5b80634d588a91116101645780635e0e20021161013e5780635e0e2002146103785780635eddd157146103b5578063715018a6146103c85780637ecebe00146103dd57600080fd5b80634d588a911461030b5780634e1273f41461032b57806355f804b31461035857600080fd5b80630e89341c116101a05780630e89341c146102945780632eb2c2d6146102b45780633ccfd60b146102d65780633fb0fff7146102eb57600080fd5b8062fdd58e146101c657806301ffc9a71461020e57806306fdde031461023e575b600080fd5b3480156101d257600080fd5b506101fb6101e1366004611d47565b600060208181529281526040808220909352908152205481565b6040519081526020015b60405180910390f35b34801561021a57600080fd5b5061022e610229366004611da1565b6106d0565b6040519015158152602001610205565b34801561024a57600080fd5b506102876040518060400160405280600f81526020017f45766f6c7574696f6e20536572756d000000000000000000000000000000000081525081565b6040516102059190611e1d565b3480156102a057600080fd5b506102876102af366004611e30565b6107b5565b3480156102c057600080fd5b506102d46102cf366004611fb0565b6107e9565b005b3480156102e257600080fd5b506102d4610b1e565b3480156102f757600080fd5b506102d461030636600461205e565b610be4565b34801561031757600080fd5b506102d46103263660046120b5565b610e23565b34801561033757600080fd5b5061034b6103463660046120ee565b610e9d565b60405161020591906121eb565b34801561036457600080fd5b506102d46103733660046121fe565b610fd9565b34801561038457600080fd5b5061039d7001dea29d000f2e99100c503bf1544da95d81565b6040516001600160a01b039091168152602001610205565b6102d46103c3366004612247565b611043565b3480156103d457600080fd5b506102d46110f2565b3480156103e957600080fd5b506101fb6103f8366004612297565b60056020526000908152604090205481565b34801561041657600080fd5b506002546001600160a01b031661039d565b34801561043457600080fd5b506102876040518060400160405280600281526020017f455300000000000000000000000000000000000000000000000000000000000081525081565b34801561047d57600080fd5b5061022e61048c3660046122b4565b611158565b34801561049d57600080fd5b506101fb6104ac366004611e30565b60046020526000908152604090205481565b3480156104ca57600080fd5b506102d46104d9366004612329565b61123c565b3480156104ea57600080fd5b5061022e6104f9366004612367565b6112c6565b34801561050a57600080fd5b50610546610519366004612458565b7fbc197c810000000000000000000000000000000000000000000000000000000098975050505050505050565b6040517fffffffff000000000000000000000000000000000000000000000000000000009091168152602001610205565b34801561058357600080fd5b506102d4610592366004612517565b611408565b3480156105a357600080fd5b5061022e6105b2366004611e30565b60066020526000908152604090205460ff1681565b3480156105d357600080fd5b506102d46105e2366004612563565b6114c7565b3480156105f357600080fd5b5061039d73813f10aba9624d2f4b3130a1ecd26da2bb2d09d481565b34801561061b57600080fd5b5061022e61062a366004612585565b600160209081526000928352604080842090915290825290205460ff1681565b34801561065657600080fd5b506105466106653660046125b3565b7ff23a6e61000000000000000000000000000000000000000000000000000000009695505050505050565b34801561069c57600080fd5b506102d46106ab36600461262f565b611533565b3480156106bc57600080fd5b506102d46106cb366004612297565b61179a565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316148061076357507fd9b67a26000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b806107af57507f0e89341c000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b606060076107c283611879565b6040516020016107d39291906126df565b6040516020818303038152906040529050919050565b8251825181146108405760405162461bcd60e51b815260206004820152600f60248201527f4c454e4754485f4d49534d41544348000000000000000000000000000000000060448201526064015b60405180910390fd5b336001600160a01b038716148061087a57506001600160a01b038616600090815260016020908152604080832033845290915290205460ff165b6108c65760405162461bcd60e51b815260206004820152600e60248201527f4e4f545f415554484f52495a45440000000000000000000000000000000000006044820152606401610837565b60005b8181101561099b5760008582815181106108e5576108e5612784565b60200260200101519050600085838151811061090357610903612784565b60200260200101519050806000808b6001600160a01b03166001600160a01b031681526020019081526020016000206000848152602001908152602001600020600082825461095291906127e2565b90915550506001600160a01b038816600090815260208181526040808320858452909152812080548392906109889084906127f9565b9091555050600190920191506108c99050565b50846001600160a01b0316866001600160a01b0316336001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516109eb929190612811565b60405180910390a46001600160a01b0385163b15610abd576040517fbc197c8100000000000000000000000000000000000000000000000000000000808252906001600160a01b0387169063bc197c8190610a529033908b908a908a908a9060040161283f565b6020604051808303816000875af1158015610a71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a95919061289d565b7fffffffff000000000000000000000000000000000000000000000000000000001614610aca565b6001600160a01b03851615155b610b165760405162461bcd60e51b815260206004820152601060248201527f554e534146455f524543495049454e54000000000000000000000000000000006044820152606401610837565b505050505050565b6002546001600160a01b03163314610b785760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610837565b60405160009073813f10aba9624d2f4b3130a1ecd26da2bb2d09d49047908381818185875af1925050503d8060008114610bce576040519150601f19603f3d011682016040523d82523d6000602084013e610bd3565b606091505b5050905080610be157600080fd5b50565b3360009081526005602052604090205483908114610c2e576040517f756688fe00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336000908152600560205260408120805491610c49836128ba565b90915550506003546040517f6352211e0000000000000000000000000000000000000000000000000000000081526004810188905233916001600160a01b031690636352211e90602401602060405180830381865afa158015610cb0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cd491906128f2565b6001600160a01b031614610d14576040517f49e27cff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d22338688868887611158565b610d58576040517f617c4ac600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d64338660016119ae565b6003546040517f1aa0ffe4000000000000000000000000000000000000000000000000000000008152336004820152602481018590526001600160a01b0390911690631aa0ffe490604401600060405180830381600087803b158015610dc957600080fd5b505af1158015610ddd573d6000803e3d6000fd5b50505050857ffecef5ffbeff589c2531c0dd627381c28a98251d2c33befcec163da7a03f0d1884604051610e1391815260200190565b60405180910390a2505050505050565b6002546001600160a01b03163314610e7d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610837565b610e9881848460405180602001604052806000815250611a32565b505050565b81518151606091908114610ef35760405162461bcd60e51b815260206004820152600f60248201527f4c454e4754485f4d49534d4154434800000000000000000000000000000000006044820152606401610837565b835167ffffffffffffffff811115610f0d57610f0d611e49565b604051908082528060200260200182016040528015610f36578160200160208202803683370190505b50915060005b81811015610fd157600080868381518110610f5957610f59612784565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000206000858381518110610f9557610f95612784565b6020026020010151815260200190815260200160002054838281518110610fbe57610fbe612784565b6020908102919091010152600101610f3c565b505092915050565b6002546001600160a01b031633146110335760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610837565b600761103f8282612955565b5050565b60008381526004602052604090205461105c9083612a51565b341015611095576040517f8a0d377900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6110a1338484846112c6565b6110d7576040517f6d67dbd600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e9833848460405180602001604052806000815250611a32565b6002546001600160a01b0316331461114c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610837565b6111566000611bd5565b565b60408051606088901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660208083019190915260348201889052605482018790526074820186905260948083018690528351808403909101815260b4830184528051908201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000060d484015260f0808401829052845180850390910181526101109093019093528151910120600091907001dea29d000f2e99100c503bf1544da95d6112258286611c3f565b6001600160a01b0316149998505050505050505050565b3360008181526001602090815260408083206001600160a01b0387168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606086901b1660208201526034810184905260548101839052600090819060740160408051601f1981840301815291815281516020928301206000818152600690935291205490915060ff1615611345576000915050611400565b600081815260066020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556113d3826040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b90507001dea29d000f2e99100c503bf1544da95d6113f18286611c3f565b6001600160a01b031614925050505b949350505050565b6002546001600160a01b031633146114625760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610837565b60005b818110156114c1576114af83838381811061148257611482612784565b90506020020160208101906114979190612297565b85600160405180602001604052806000815250611a32565b806114b9816128ba565b915050611465565b50505050565b6002546001600160a01b031633146115215760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610837565b60009182526004602052604090912055565b336001600160a01b038616148061156d57506001600160a01b038516600090815260016020908152604080832033845290915290205460ff165b6115b95760405162461bcd60e51b815260206004820152600e60248201527f4e4f545f415554484f52495a45440000000000000000000000000000000000006044820152606401610837565b6001600160a01b038516600090815260208181526040808320868452909152812080548492906115ea9084906127e2565b90915550506001600160a01b038416600090815260208181526040808320868452909152812080548492906116209084906127f9565b909155505060408051848152602081018490526001600160a01b03808716929088169133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46001600160a01b0384163b1561173a576040517ff23a6e6100000000000000000000000000000000000000000000000000000000808252906001600160a01b0386169063f23a6e61906116cf9033908a90899089908990600401612a8e565b6020604051808303816000875af11580156116ee573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611712919061289d565b7fffffffff000000000000000000000000000000000000000000000000000000001614611747565b6001600160a01b03841615155b6117935760405162461bcd60e51b815260206004820152601060248201527f554e534146455f524543495049454e54000000000000000000000000000000006044820152606401610837565b5050505050565b6002546001600160a01b031633146117f45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610837565b6001600160a01b0381166118705760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610837565b610be181611bd5565b6060816000036118bc57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156118e657806118d0816128ba565b91506118df9050600a83612b00565b91506118c0565b60008167ffffffffffffffff81111561190157611901611e49565b6040519080825280601f01601f19166020018201604052801561192b576020820181803683370190505b5090505b8415611400576119406001836127e2565b915061194d600a86612b14565b6119589060306127f9565b60f81b81838151811061196d5761196d612784565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506119a7600a86612b00565b945061192f565b6001600160a01b038316600090815260208181526040808320858452909152812080548392906119df9084906127e2565b909155505060408051838152602081018390526000916001600160a01b0386169133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4505050565b6001600160a01b03841660009081526020818152604080832086845290915281208054849290611a639084906127f9565b909155505060408051848152602081018490526001600160a01b0386169160009133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46001600160a01b0384163b15611b7c576040517ff23a6e6100000000000000000000000000000000000000000000000000000000808252906001600160a01b0386169063f23a6e6190611b11903390600090899089908990600401612a8e565b6020604051808303816000875af1158015611b30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b54919061289d565b7fffffffff000000000000000000000000000000000000000000000000000000001614611b89565b6001600160a01b03841615155b6114c15760405162461bcd60e51b815260206004820152601060248201527f554e534146455f524543495049454e54000000000000000000000000000000006044820152606401610837565b600280546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600080600080611c4e85611cbe565b6040805160008152602081018083528b905260ff8316918101919091526060810184905260808101839052929550909350915060019060a0016020604051602081039080840390855afa158015611ca9573d6000803e3d6000fd5b5050604051601f190151979650505050505050565b60008060008351604114611d145760405162461bcd60e51b815260206004820152600b60248201527f73696720696e76616c69640000000000000000000000000000000000000000006044820152606401610837565b50505060208101516040820151606090920151909260009190911a90565b6001600160a01b0381168114610be157600080fd5b60008060408385031215611d5a57600080fd5b8235611d6581611d32565b946020939093013593505050565b7fffffffff0000000000000000000000000000000000000000000000000000000081168114610be157600080fd5b600060208284031215611db357600080fd5b8135611dbe81611d73565b9392505050565b60005b83811015611de0578181015183820152602001611dc8565b838111156114c15750506000910152565b60008151808452611e09816020860160208601611dc5565b601f01601f19169290920160200192915050565b602081526000611dbe6020830184611df1565b600060208284031215611e4257600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611ea157611ea1611e49565b604052919050565b600067ffffffffffffffff821115611ec357611ec3611e49565b5060051b60200190565b600082601f830112611ede57600080fd5b81356020611ef3611eee83611ea9565b611e78565b82815260059290921b84018101918181019086841115611f1257600080fd5b8286015b84811015611f2d5780358352918301918301611f16565b509695505050505050565b600067ffffffffffffffff831115611f5257611f52611e49565b611f656020601f19601f86011601611e78565b9050828152838383011115611f7957600080fd5b828260208301376000602084830101529392505050565b600082601f830112611fa157600080fd5b611dbe83833560208501611f38565b600080600080600060a08688031215611fc857600080fd5b8535611fd381611d32565b94506020860135611fe381611d32565b9350604086013567ffffffffffffffff8082111561200057600080fd5b61200c89838a01611ecd565b9450606088013591508082111561202257600080fd5b61202e89838a01611ecd565b9350608088013591508082111561204457600080fd5b5061205188828901611f90565b9150509295509295909350565b600080600080600060a0868803121561207657600080fd5b85359450602086013593506040860135925060608601359150608086013567ffffffffffffffff8111156120a957600080fd5b61205188828901611f90565b6000806000606084860312156120ca57600080fd5b833592506020840135915060408401356120e381611d32565b809150509250925092565b6000806040838503121561210157600080fd5b823567ffffffffffffffff8082111561211957600080fd5b818501915085601f83011261212d57600080fd5b8135602061213d611eee83611ea9565b82815260059290921b8401810191818101908984111561215c57600080fd5b948201945b8386101561218357853561217481611d32565b82529482019490820190612161565b9650508601359250508082111561219957600080fd5b506121a685828601611ecd565b9150509250929050565b600081518084526020808501945080840160005b838110156121e0578151875295820195908201906001016121c4565b509495945050505050565b602081526000611dbe60208301846121b0565b60006020828403121561221057600080fd5b813567ffffffffffffffff81111561222757600080fd5b8201601f8101841361223857600080fd5b61140084823560208401611f38565b60008060006060848603121561225c57600080fd5b8335925060208401359150604084013567ffffffffffffffff81111561228157600080fd5b61228d86828701611f90565b9150509250925092565b6000602082840312156122a957600080fd5b8135611dbe81611d32565b60008060008060008060c087890312156122cd57600080fd5b86356122d881611d32565b95506020870135945060408701359350606087013592506080870135915060a087013567ffffffffffffffff81111561231057600080fd5b61231c89828a01611f90565b9150509295509295509295565b6000806040838503121561233c57600080fd5b823561234781611d32565b91506020830135801515811461235c57600080fd5b809150509250929050565b6000806000806080858703121561237d57600080fd5b843561238881611d32565b93506020850135925060408501359150606085013567ffffffffffffffff8111156123b257600080fd5b6123be87828801611f90565b91505092959194509250565b60008083601f8401126123dc57600080fd5b50813567ffffffffffffffff8111156123f457600080fd5b6020830191508360208260051b850101111561240f57600080fd5b9250929050565b60008083601f84011261242857600080fd5b50813567ffffffffffffffff81111561244057600080fd5b60208301915083602082850101111561240f57600080fd5b60008060008060008060008060a0898b03121561247457600080fd5b883561247f81611d32565b9750602089013561248f81611d32565b9650604089013567ffffffffffffffff808211156124ac57600080fd5b6124b88c838d016123ca565b909850965060608b01359150808211156124d157600080fd5b6124dd8c838d016123ca565b909650945060808b01359150808211156124f657600080fd5b506125038b828c01612416565b999c989b5096995094979396929594505050565b60008060006040848603121561252c57600080fd5b83359250602084013567ffffffffffffffff81111561254a57600080fd5b612556868287016123ca565b9497909650939450505050565b6000806040838503121561257657600080fd5b50508035926020909101359150565b6000806040838503121561259857600080fd5b82356125a381611d32565b9150602083013561235c81611d32565b60008060008060008060a087890312156125cc57600080fd5b86356125d781611d32565b955060208701356125e781611d32565b94506040870135935060608701359250608087013567ffffffffffffffff81111561261157600080fd5b61261d89828a01612416565b979a9699509497509295939492505050565b600080600080600060a0868803121561264757600080fd5b853561265281611d32565b9450602086013561266281611d32565b93506040860135925060608601359150608086013567ffffffffffffffff8111156120a957600080fd5b600181811c908216806126a057607f821691505b6020821081036126d9577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60008084546126ed8161268c565b60018281168015612705576001811461273857612767565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0084168752821515830287019450612767565b8860005260208060002060005b8581101561275e5781548a820152908401908201612745565b50505082870194505b50505050835161277b818360208801611dc5565b01949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000828210156127f4576127f46127b3565b500390565b6000821982111561280c5761280c6127b3565b500190565b60408152600061282460408301856121b0565b828103602084015261283681856121b0565b95945050505050565b60006001600160a01b03808816835280871660208401525060a0604083015261286b60a08301866121b0565b828103606084015261287d81866121b0565b905082810360808401526128918185611df1565b98975050505050505050565b6000602082840312156128af57600080fd5b8151611dbe81611d73565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036128eb576128eb6127b3565b5060010190565b60006020828403121561290457600080fd5b8151611dbe81611d32565b601f821115610e9857600081815260208120601f850160051c810160208610156129365750805b601f850160051c820191505b81811015610b1657828155600101612942565b815167ffffffffffffffff81111561296f5761296f611e49565b6129838161297d845461268c565b8461290f565b602080601f8311600181146129d657600084156129a05750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555610b16565b600085815260208120601f198616915b82811015612a05578886015182559484019460019091019084016129e6565b5085821015612a4157878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612a8957612a896127b3565b500290565b60006001600160a01b03808816835280871660208401525084604083015283606083015260a06080830152612ac660a0830184611df1565b979650505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082612b0f57612b0f612ad1565b500490565b600082612b2357612b23612ad1565b50069056fea2646970667358221220498c57fadcedb85bce22103618e19340e5093b854e19df9fd811c7cd28066a1b64736f6c634300080f0033

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

00000000000000000000000032973908faee0bf825a343000fe412ebe56f802a0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000002568747470733a2f2f706978656c6d6f6e2e636c75622f6170692f736572756d2f6d6574612f000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : creatureAddress (address): 0x32973908FaeE0Bf825A343000fE412ebE56F802A
Arg [1] : _baseURI (string): https://pixelmon.club/api/serum/meta/

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 00000000000000000000000032973908faee0bf825a343000fe412ebe56f802a
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000025
Arg [3] : 68747470733a2f2f706978656c6d6f6e2e636c75622f6170692f736572756d2f
Arg [4] : 6d6574612f000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

298:7339:3:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1116:64:1;;;;;;;;;;-1:-1:-1;1116:64:1;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;639:25:7;;;627:2;612:18;1116:64:1;;;;;;;;4611:340;;;;;;;;;;-1:-1:-1;4611:340:1;;;;;:::i;:::-;;:::i;:::-;;;1272:14:7;;1265:22;1247:41;;1235:2;1220:18;4611:340:1;1107:187:7;1013:47:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;2541:142::-;;;;;;;;;;-1:-1:-1;2541:142:3;;;;;:::i;:::-;;:::i;2616:1159:1:-;;;;;;;;;;-1:-1:-1;2616:1159:1;;;;;:::i;:::-;;:::i;:::-;;6932:155:3;;;;;;;;;;;;;:::i;3685:485::-;;;;;;;;;;-1:-1:-1;3685:485:3;;;;;:::i;:::-;;:::i;3371:124::-;;;;;;;;;;-1:-1:-1;3371:124:3;;;;;:::i;:::-;;:::i;3781:641:1:-;;;;;;;;;;-1:-1:-1;3781:641:1;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;2322:96:3:-;;;;;;;;;;-1:-1:-1;2322:96:3;;;;;:::i;:::-;;:::i;830:84::-;;;;;;;;;;;;872:42;830:84;;;;;-1:-1:-1;;;;;8980:55:7;;;8962:74;;8950:2;8935:18;830:84:3;8816:226:7;2871:299:3;;;;;;:::i;:::-;;:::i;1661:101:4:-;;;;;;;;;;;;;:::i;1359:38:3:-;;;;;;;;;;-1:-1:-1;1359:38:3;;;;;:::i;:::-;;;;;;;;;;;;;;1029:85:4;;;;;;;;;;-1:-1:-1;1101:6:4;;-1:-1:-1;;;;;1101:6:4;1029:85;;1066:36:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4807:457;;;;;;;;;;-1:-1:-1;4807:457:3;;;;;:::i;:::-;;:::i;1313:40::-;;;;;;;;;;-1:-1:-1;1313:40:3;;;;;:::i;:::-;;;;;;;;;;;;;;1704:203:1;;;;;;;;;;-1:-1:-1;1704:203:1;;;;;:::i;:::-;;:::i;4354:447:3:-;;;;;;;;;;-1:-1:-1;4354:447:3;;;;;:::i;:::-;;:::i;7350:285::-;;;;;;;;;;-1:-1:-1;7350:285:3;;;;;:::i;:::-;7576:52;7350:285;;;;;;;;;;;;;;13754:66:7;13742:79;;;13724:98;;13712:2;13697:18;7350:285:3;13580:248:7;3176:189:3;;;;;;;;;;-1:-1:-1;3176:189:3;;;;;:::i;:::-;;:::i;1403:44::-;;;;;;;;;;-1:-1:-1;1403:44:3;;;;;:::i;:::-;;;;;;;;;;;;;;;;2424:111;;;;;;;;;;-1:-1:-1;2424:111:3;;;;;:::i;:::-;;:::i;920:86::-;;;;;;;;;;;;964:42;920:86;;1187:68:1;;;;;;;;;;-1:-1:-1;1187:68:1;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;7093:251:3;;;;;;;;;;-1:-1:-1;7093:251:3;;;;;:::i;:::-;7290:47;7093:251;;;;;;;;;1913:697:1;;;;;;;;;;-1:-1:-1;1913:697:1;;;;;:::i;:::-;;:::i;1911:198:4:-;;;;;;;;;;-1:-1:-1;1911:198:4;;;;;:::i;:::-;;:::i;4611:340:1:-;4687:4;4722:25;;;;;;:100;;-1:-1:-1;4797:25:1;;;;;4722:100;:176;;;-1:-1:-1;4873:25:1;;;;;4722:176;4703:195;4611:340;-1:-1:-1;;4611:340:1:o;2541:142:3:-;2596:13;2652:7;2661:13;:2;:11;:13::i;:::-;2635:40;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2621:55;;2541:142;;;:::o;2616:1159:1:-;2831:10;;2890:14;;2877:27;;2869:55;;;;-1:-1:-1;;;2869:55:1;;18581:2:7;2869:55:1;;;18563:21:7;18620:2;18600:18;;;18593:30;18659:17;18639:18;;;18632:45;18694:18;;2869:55:1;;;;;;;;;2943:10;-1:-1:-1;;;;;2943:18:1;;;;:56;;-1:-1:-1;;;;;;2965:22:1;;;;;;:16;:22;;;;;;;;2988:10;2965:34;;;;;;;;;;2943:56;2935:83;;;;-1:-1:-1;;;2935:83:1;;18925:2:7;2935:83:1;;;18907:21:7;18964:2;18944:18;;;18937:30;19003:16;18983:18;;;18976:44;19037:18;;2935:83:1;18723:338:7;2935:83:1;3034:9;3029:367;3053:9;3049:1;:13;3029:367;;;3080:10;3093:3;3097:1;3093:6;;;;;;;;:::i;:::-;;;;;;;3080:19;;3113:14;3130:7;3138:1;3130:10;;;;;;;;:::i;:::-;;;;;;;3113:27;;3178:6;3155:9;:15;3165:4;-1:-1:-1;;;;;3155:15:1;-1:-1:-1;;;;;3155:15:1;;;;;;;;;;;;:19;3171:2;3155:19;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;3198:13:1;;:9;:13;;;;;;;;;;;:17;;;;;;;;:27;;3219:6;;3198:9;:27;;3219:6;;3198:27;:::i;:::-;;;;-1:-1:-1;;3368:3:1;;;;;-1:-1:-1;3029:367:1;;-1:-1:-1;3029:367:1;;;3443:2;-1:-1:-1;;;;;3411:49:1;3437:4;-1:-1:-1;;;;;3411:49:1;3425:10;-1:-1:-1;;;;;3411:49:1;;3447:3;3452:7;3411:49;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;3492:14:1;;;:19;:234;;3565:85;;3674:52;3565:85;;;3674:52;-1:-1:-1;;;;;3565:47:1;;;3674:52;;3565:85;;3613:10;;3625:4;;3631:3;;3636:7;;3645:4;;3565:85;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:161;;;3492:234;;;-1:-1:-1;;;;;3530:16:1;;;;3492:234;3471:297;;;;-1:-1:-1;;;3471:297:1;;21488:2:7;3471:297:1;;;21470:21:7;21527:2;21507:18;;;21500:30;21566:18;21546;;;21539:46;21602:18;;3471:297:1;21286:340:7;3471:297:1;2801:974;2616:1159;;;;;:::o;6932:155:3:-;1101:6:4;;-1:-1:-1;;;;;1101:6:4;719:10:0;1241:23:4;1233:68;;;;-1:-1:-1;;;1233:68:4;;21833:2:7;1233:68:4;;;21815:21:7;;;21852:18;;;21845:30;21911:34;21891:18;;;21884:62;21963:18;;1233:68:4;21631:356:7;1233:68:4;6998:56:3::1;::::0;6980:12:::1;::::0;964:42:::1;::::0;7028:21:::1;::::0;6980:12;6998:56;6980:12;6998:56;7028:21;964:42;6998:56:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6979:75;;;7072:7;7064:16;;;::::0;::::1;;6969:118;6932:155::o:0;3685:485::-;2051:10;2044:18;;;;:6;:18;;;;;;3806:5;;2035:27;;2032:53;;2071:14;;;;;;;;;;;;;;2032:53;2102:10;2095:18;;;;:6;:18;;;;;:20;;;;;;:::i;:::-;;;;-1:-1:-1;;3826:9:3::1;::::0;:26:::1;::::0;;;;::::1;::::0;::::1;639:25:7::0;;;3856:10:3::1;::::0;-1:-1:-1;;;;;3826:9:3::1;::::0;:17:::1;::::0;612:18:7;;3826:26:3::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;3826:40:3::1;;3823:66;;3875:14;;;;;;;;;;;;;;3823:66;3903:78;3918:10;3930:7;3939;3948:14;3964:5;3971:9;3903:14;:78::i;:::-;3899:109;;3990:18;;;;;;;;;;;;;;3899:109;4018:29;4024:10;4036:7;4045:1;4018:5;:29::i;:::-;4057:9;::::0;:57:::1;::::0;;;;4087:10:::1;4057:57;::::0;::::1;22832:74:7::0;22922:18;;;22915:34;;;-1:-1:-1;;;;;4057:9:3;;::::1;::::0;:29:::1;::::0;22805:18:7;;4057:57:3::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;4139:7;4129:34;4148:14;4129:34;;;;639:25:7::0;;627:2;612:18;;493:177;4129:34:3::1;;;;;;;;3685:485:::0;;;;;;:::o;3371:124::-;1101:6:4;;-1:-1:-1;;;;;1101:6:4;719:10:0;1241:23:4;1233:68;;;;-1:-1:-1;;;1233:68:4;;21833:2:7;1233:68:4;;;21815:21:7;;;21852:18;;;21845:30;21911:34;21891:18;;;21884:62;21963:18;;1233:68:4;21631:356:7;1233:68:4;3457:31:3::1;3463:8;3473:2;3477:6;3457:31;;;;;;;;;;;::::0;:5:::1;:31::i;:::-;3371:124:::0;;;:::o;3781:641:1:-;3977:13;;4042:10;;3913:25;;3977:13;4026:26;;4018:54;;;;-1:-1:-1;;;4018:54:1;;18581:2:7;4018:54:1;;;18563:21:7;18620:2;18600:18;;;18593:30;18659:17;18639:18;;;18632:45;18694:18;;4018:54:1;18379:339:7;4018:54:1;4108:6;:13;4094:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4094:28:1;;4083:39;;4293:9;4288:118;4312:12;4308:1;:16;4288:118;;;4363:9;:20;4373:6;4380:1;4373:9;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;4363:20:1;-1:-1:-1;;;;;4363:20:1;;;;;;;;;;;;:28;4384:3;4388:1;4384:6;;;;;;;;:::i;:::-;;;;;;;4363:28;;;;;;;;;;;;4349:8;4358:1;4349:11;;;;;;;;:::i;:::-;;;;;;;;;;:42;4326:3;;4288:118;;;;3944:478;3781:641;;;;:::o;2322:96:3:-;1101:6:4;;-1:-1:-1;;;;;1101:6:4;719:10:0;1241:23:4;1233:68;;;;-1:-1:-1;;;1233:68:4;;21833:2:7;1233:68:4;;;21815:21:7;;;21852:18;;;21845:30;21911:34;21891:18;;;21884:62;21963:18;;1233:68:4;21631:356:7;1233:68:4;2393:7:3::1;:18;2403:8:::0;2393:7;:18:::1;:::i;:::-;;2322:96:::0;:::o;2871:299::-;2984:20;;;;:11;:20;;;;;;2976:28;;:5;:28;:::i;:::-;2964:9;:40;2961:68;;;3013:16;;;;;;;;;;;;;;2961:68;3043:48;3053:10;3065:7;3074:5;3081:9;3043;:48::i;:::-;3039:77;;3100:16;;;;;;;;;;;;;;3039:77;3126:37;3132:10;3144:7;3153:5;3126:37;;;;;;;;;;;;:5;:37::i;1661:101:4:-;1101:6;;-1:-1:-1;;;;;1101:6:4;719:10:0;1241:23:4;1233:68;;;;-1:-1:-1;;;1233:68:4;;21833:2:7;1233:68:4;;;21815:21:7;;;21852:18;;;21845:30;21911:34;21891:18;;;21884:62;21963:18;;1233:68:4;21631:356:7;1233:68:4;1725:30:::1;1752:1;1725:18;:30::i;:::-;1661:101::o:0;4807:457:3:-;5030:66;;;25711:2:7;25707:15;;;25724:66;25703:88;5030:66:3;;;;25691:101:7;;;;25808:12;;;25801:28;;;25845:12;;;25838:28;;;25882:12;;;25875:28;;;25919:13;;;;25912:29;;;5030:66:3;;;;;;;;;;25957:13:7;;;5030:66:3;;5020:77;;;;;;28302:66:7;5604:124:3;;;28290:79:7;28385:12;;;;28378:28;;;5604:124:3;;;;;;;;;;28422:12:7;;;;5604:124:3;;;5577:165;;;;;-1:-1:-1;;5020:77:3;872:42;5192:46;5107:67;5228:9;5192:13;:46::i;:::-;-1:-1:-1;;;;;5192:65:3;;;4807:457;-1:-1:-1;;;;;;;;;4807:457:3:o;1704:203:1:-;1806:10;1789:28;;;;:16;:28;;;;;;;;-1:-1:-1;;;;;1789:38:1;;;;;;;;;;;;:49;;;;;;;;;;;;;1854:46;;1247:41:7;;;1789:38:1;;1806:10;1854:46;;1220:18:7;1854:46:1;;;;;;;1704:203;;:::o;4354:447:3:-;4501:38;;26199:66:7;26186:2;26182:15;;;26178:88;4501:38:3;;;26166:101:7;26283:12;;;26276:28;;;26320:12;;;26313:28;;;4453:4:3;;;;26357:12:7;;4501:38:3;;;-1:-1:-1;;4501:38:3;;;;;;;;;4491:49;;4501:38;4491:49;;;;4553:25;;;;:12;:25;;;;;;4491:49;;-1:-1:-1;4553:25:3;;4550:42;;;4587:5;4580:12;;;;;4550:42;4603:25;;;;:12;:25;;;;;:32;;;;4631:4;4603:32;;;4676:36;4616:11;5604:124;;28302:66:7;5604:124:3;;;28290:79:7;28385:12;;;28378:28;;;5371:7:3;;28422:12:7;;5604:124:3;;;;;;;;;;;;5577:165;;;;;;5558:184;;5270:479;;;;4676:36;4645:67;-1:-1:-1;872:42:3;4729:46;4645:67;4765:9;4729:13;:46::i;:::-;-1:-1:-1;;;;;4729:65:3;;4722:72;;;;4354:447;;;;;;;:::o;3176:189::-;1101:6:4;;-1:-1:-1;;;;;1101:6:4;719:10:0;1241:23:4;1233:68;;;;-1:-1:-1;;;1233:68:4;;21833:2:7;1233:68:4;;;21815:21:7;;;21852:18;;;21845:30;21911:34;21891:18;;;21884:62;21963:18;;1233:68:4;21631:356:7;1233:68:4;3265:9:3::1;3260:99;3280:16:::0;;::::1;3260:99;;;3316:31;3322:5;;3328:1;3322:8;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;3332:7;3341:1;3316:31;;;;;;;;;;;::::0;:5:::1;:31::i;:::-;3298:3:::0;::::1;::::0;::::1;:::i;:::-;;;;3260:99;;;;3176:189:::0;;;:::o;2424:111::-;1101:6:4;;-1:-1:-1;;;;;1101:6:4;719:10:0;1241:23:4;1233:68;;;;-1:-1:-1;;;1233:68:4;;21833:2:7;1233:68:4;;;21815:21:7;;;21852:18;;;21845:30;21911:34;21891:18;;;21884:62;21963:18;;1233:68:4;21631:356:7;1233:68:4;2500:20:3::1;::::0;;;:11:::1;:20;::::0;;;;;:28;2424:111::o;1913:697:1:-;2091:10;-1:-1:-1;;;;;2091:18:1;;;;:56;;-1:-1:-1;;;;;;2113:22:1;;;;;;:16;:22;;;;;;;;2136:10;2113:34;;;;;;;;;;2091:56;2083:83;;;;-1:-1:-1;;;2083:83:1;;18925:2:7;2083:83:1;;;18907:21:7;18964:2;18944:18;;;18937:30;19003:16;18983:18;;;18976:44;19037:18;;2083:83:1;18723:338:7;2083:83:1;-1:-1:-1;;;;;2177:15:1;;:9;:15;;;;;;;;;;;:19;;;;;;;;:29;;2200:6;;2177:9;:29;;2200:6;;2177:29;:::i;:::-;;;;-1:-1:-1;;;;;;;2216:13:1;;:9;:13;;;;;;;;;;;:17;;;;;;;;:27;;2237:6;;2216:9;:27;;2237:6;;2216:27;:::i;:::-;;;;-1:-1:-1;;2259:48:1;;;26554:25:7;;;26610:2;26595:18;;26588:34;;;-1:-1:-1;;;;;2259:48:1;;;;;;;;2274:10;;2259:48;;26527:18:7;2259:48:1;;;;;;;-1:-1:-1;;;;;2339:14:1;;;:19;:222;;2412:78;;2514:47;2412:78;;;2514:47;-1:-1:-1;;;;;2412:42:1;;;2514:47;;2412:78;;2455:10;;2467:4;;2473:2;;2477:6;;2485:4;;2412:78;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:149;;;2339:222;;;-1:-1:-1;;;;;2377:16:1;;;;2339:222;2318:285;;;;-1:-1:-1;;;2318:285:1;;21488:2:7;2318:285:1;;;21470:21:7;21527:2;21507:18;;;21500:30;21566:18;21546;;;21539:46;21602:18;;2318:285:1;21286:340:7;2318:285:1;1913:697;;;;;:::o;1911:198:4:-;1101:6;;-1:-1:-1;;;;;1101:6:4;719:10:0;1241:23:4;1233:68;;;;-1:-1:-1;;;1233:68:4;;21833:2:7;1233:68:4;;;21815:21:7;;;21852:18;;;21845:30;21911:34;21891:18;;;21884:62;21963:18;;1233:68:4;21631:356:7;1233:68:4;-1:-1:-1;;;;;1999:22:4;::::1;1991:73;;;::::0;-1:-1:-1;;;1991:73:4;;27424:2:7;1991:73:4::1;::::0;::::1;27406:21:7::0;27463:2;27443:18;;;27436:30;27502:34;27482:18;;;27475:62;27573:8;27553:18;;;27546:36;27599:19;;1991:73:4::1;27222:402:7::0;1991:73:4::1;2074:28;2093:8;2074:18;:28::i;377:703:6:-:0;433:13;650:5;659:1;650:10;646:51;;-1:-1:-1;;676:10:6;;;;;;;;;;;;;;;;;;377:703::o;646:51::-;721:5;706:12;760:75;767:9;;760:75;;792:8;;;;:::i;:::-;;-1:-1:-1;814:10:6;;-1:-1:-1;822:2:6;814:10;;:::i;:::-;;;760:75;;;844:19;876:6;866:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;866:17:6;;844:39;;893:150;900:10;;893:150;;926:11;936:1;926:11;;:::i;:::-;;-1:-1:-1;994:10:6;1002:2;994:5;:10;:::i;:::-;981:24;;:2;:24;:::i;:::-;968:39;;951:6;958;951:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;1021:11:6;1030:2;1021:11;;:::i;:::-;;;893:150;;7222:214:1;-1:-1:-1;;;;;7328:15:1;;:9;:15;;;;;;;;;;;:19;;;;;;;;:29;;7351:6;;7328:9;:29;;7351:6;;7328:29;:::i;:::-;;;;-1:-1:-1;;7373:56:1;;;26554:25:7;;;26610:2;26595:18;;26588:34;;;7414:1:1;;-1:-1:-1;;;;;7373:56:1;;;7388:10;;7373:56;;26527:18:7;7373:56:1;;;;;;;7222:214;;;:::o;5146:537::-;-1:-1:-1;;;;;5277:13:1;;:9;:13;;;;;;;;;;;:17;;;;;;;;:27;;5298:6;;5277:9;:27;;5298:6;;5277:27;:::i;:::-;;;;-1:-1:-1;;5320:54:1;;;26554:25:7;;;26610:2;26595:18;;26588:34;;;-1:-1:-1;;;;;5320:54:1;;;5355:1;;5335:10;;5320:54;;26527:18:7;5320:54:1;;;;;;;-1:-1:-1;;;;;5406:14:1;;;:19;:228;;5479:84;;5587:47;5479:84;;;5587:47;-1:-1:-1;;;;;5479:42:1;;;5587:47;;5479:84;;5522:10;;5542:1;;5546:2;;5550:6;;5558:4;;5479:84;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:155;;;5406:228;;;-1:-1:-1;;;;;5444:16:1;;;;5406:228;5385:291;;;;-1:-1:-1;;;5385:291:1;;21488:2:7;5385:291:1;;;21470:21:7;21527:2;21507:18;;;21500:30;21566:18;21546;;;21539:46;21602:18;;5385:291:1;21286:340:7;2263:187:4;2355:6;;;-1:-1:-1;;;;;2371:17:4;;;;;;;;;;;2403:40;;2355:6;;;2371:17;2355:6;;2403:40;;2336:16;;2403:40;2326:124;2263:187;:::o;5755:267:3:-;5878:7;5898:9;5909;5920:7;5931:26;5946:10;5931:14;:26::i;:::-;5974:41;;;;;;;;;;;;28672:25:7;;;28745:4;28733:17;;28713:18;;;28706:45;;;;28767:18;;;28760:34;;;28810:18;;;28803:34;;;5897:60:3;;-1:-1:-1;5897:60:3;;-1:-1:-1;5897:60:3;-1:-1:-1;5974:41:3;;28644:19:7;;5974:41:3;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5974:41:3;;-1:-1:-1;;5974:41:3;;;5755:267;-1:-1:-1;;;;;;;5755:267:3:o;6028:829::-;6129:9;6152;6175:7;6215:3;:10;6229:2;6215:16;6207:40;;;;-1:-1:-1;;;6207:40:3;;29050:2:7;6207:40:3;;;29032:21:7;29089:2;29069:18;;;29062:30;29128:13;29108:18;;;29101:41;29159:18;;6207:40:3;28848:335:7;6207:40:3;-1:-1:-1;;;6623:2:3;6614:12;;6608:19;6691:2;6682:12;;6676:19;6796:2;6787:12;;;6781:19;6608;;6778:1;6773:28;;;;;6028:829::o;14:154:7:-;-1:-1:-1;;;;;93:5:7;89:54;82:5;79:65;69:93;;158:1;155;148:12;173:315;241:6;249;302:2;290:9;281:7;277:23;273:32;270:52;;;318:1;315;308:12;270:52;357:9;344:23;376:31;401:5;376:31;:::i;:::-;426:5;478:2;463:18;;;;450:32;;-1:-1:-1;;;173:315:7:o;675:177::-;760:66;753:5;749:78;742:5;739:89;729:117;;842:1;839;832:12;857:245;915:6;968:2;956:9;947:7;943:23;939:32;936:52;;;984:1;981;974:12;936:52;1023:9;1010:23;1042:30;1066:5;1042:30;:::i;:::-;1091:5;857:245;-1:-1:-1;;;857:245:7:o;1299:258::-;1371:1;1381:113;1395:6;1392:1;1389:13;1381:113;;;1471:11;;;1465:18;1452:11;;;1445:39;1417:2;1410:10;1381:113;;;1512:6;1509:1;1506:13;1503:48;;;-1:-1:-1;;1547:1:7;1529:16;;1522:27;1299:258::o;1562:317::-;1604:3;1642:5;1636:12;1669:6;1664:3;1657:19;1685:63;1741:6;1734:4;1729:3;1725:14;1718:4;1711:5;1707:16;1685:63;:::i;:::-;1793:2;1781:15;-1:-1:-1;;1777:88:7;1768:98;;;;1868:4;1764:109;;1562:317;-1:-1:-1;;1562:317:7:o;1884:220::-;2033:2;2022:9;2015:21;1996:4;2053:45;2094:2;2083:9;2079:18;2071:6;2053:45;:::i;2109:180::-;2168:6;2221:2;2209:9;2200:7;2196:23;2192:32;2189:52;;;2237:1;2234;2227:12;2189:52;-1:-1:-1;2260:23:7;;2109:180;-1:-1:-1;2109:180:7:o;2294:184::-;2346:77;2343:1;2336:88;2443:4;2440:1;2433:15;2467:4;2464:1;2457:15;2483:334;2554:2;2548:9;2610:2;2600:13;;-1:-1:-1;;2596:86:7;2584:99;;2713:18;2698:34;;2734:22;;;2695:62;2692:88;;;2760:18;;:::i;:::-;2796:2;2789:22;2483:334;;-1:-1:-1;2483:334:7:o;2822:183::-;2882:4;2915:18;2907:6;2904:30;2901:56;;;2937:18;;:::i;:::-;-1:-1:-1;2982:1:7;2978:14;2994:4;2974:25;;2822:183::o;3010:662::-;3064:5;3117:3;3110:4;3102:6;3098:17;3094:27;3084:55;;3135:1;3132;3125:12;3084:55;3171:6;3158:20;3197:4;3221:60;3237:43;3277:2;3237:43;:::i;:::-;3221:60;:::i;:::-;3315:15;;;3401:1;3397:10;;;;3385:23;;3381:32;;;3346:12;;;;3425:15;;;3422:35;;;3453:1;3450;3443:12;3422:35;3489:2;3481:6;3477:15;3501:142;3517:6;3512:3;3509:15;3501:142;;;3583:17;;3571:30;;3621:12;;;;3534;;3501:142;;;-1:-1:-1;3661:5:7;3010:662;-1:-1:-1;;;;;;3010:662:7:o;3677:465::-;3741:5;3775:18;3767:6;3764:30;3761:56;;;3797:18;;:::i;:::-;3835:116;3945:4;-1:-1:-1;;3871:2:7;3863:6;3859:15;3855:88;3851:99;3835:116;:::i;:::-;3826:125;;3974:6;3967:5;3960:21;4014:3;4005:6;4000:3;3996:16;3993:25;3990:45;;;4031:1;4028;4021:12;3990:45;4080:6;4075:3;4068:4;4061:5;4057:16;4044:43;4134:1;4127:4;4118:6;4111:5;4107:18;4103:29;4096:40;3677:465;;;;;:::o;4147:220::-;4189:5;4242:3;4235:4;4227:6;4223:17;4219:27;4209:55;;4260:1;4257;4250:12;4209:55;4282:79;4357:3;4348:6;4335:20;4328:4;4320:6;4316:17;4282:79;:::i;4372:1071::-;4526:6;4534;4542;4550;4558;4611:3;4599:9;4590:7;4586:23;4582:33;4579:53;;;4628:1;4625;4618:12;4579:53;4667:9;4654:23;4686:31;4711:5;4686:31;:::i;:::-;4736:5;-1:-1:-1;4793:2:7;4778:18;;4765:32;4806:33;4765:32;4806:33;:::i;:::-;4858:7;-1:-1:-1;4916:2:7;4901:18;;4888:32;4939:18;4969:14;;;4966:34;;;4996:1;4993;4986:12;4966:34;5019:61;5072:7;5063:6;5052:9;5048:22;5019:61;:::i;:::-;5009:71;;5133:2;5122:9;5118:18;5105:32;5089:48;;5162:2;5152:8;5149:16;5146:36;;;5178:1;5175;5168:12;5146:36;5201:63;5256:7;5245:8;5234:9;5230:24;5201:63;:::i;:::-;5191:73;;5317:3;5306:9;5302:19;5289:33;5273:49;;5347:2;5337:8;5334:16;5331:36;;;5363:1;5360;5353:12;5331:36;;5386:51;5429:7;5418:8;5407:9;5403:24;5386:51;:::i;:::-;5376:61;;;4372:1071;;;;;;;;:::o;5448:594::-;5552:6;5560;5568;5576;5584;5637:3;5625:9;5616:7;5612:23;5608:33;5605:53;;;5654:1;5651;5644:12;5605:53;5690:9;5677:23;5667:33;;5747:2;5736:9;5732:18;5719:32;5709:42;;5798:2;5787:9;5783:18;5770:32;5760:42;;5849:2;5838:9;5834:18;5821:32;5811:42;;5904:3;5893:9;5889:19;5876:33;5932:18;5924:6;5921:30;5918:50;;;5964:1;5961;5954:12;5918:50;5987:49;6028:7;6019:6;6008:9;6004:22;5987:49;:::i;6047:383::-;6124:6;6132;6140;6193:2;6181:9;6172:7;6168:23;6164:32;6161:52;;;6209:1;6206;6199:12;6161:52;6245:9;6232:23;6222:33;;6302:2;6291:9;6287:18;6274:32;6264:42;;6356:2;6345:9;6341:18;6328:32;6369:31;6394:5;6369:31;:::i;:::-;6419:5;6409:15;;;6047:383;;;;;:::o;6435:1215::-;6553:6;6561;6614:2;6602:9;6593:7;6589:23;6585:32;6582:52;;;6630:1;6627;6620:12;6582:52;6670:9;6657:23;6699:18;6740:2;6732:6;6729:14;6726:34;;;6756:1;6753;6746:12;6726:34;6794:6;6783:9;6779:22;6769:32;;6839:7;6832:4;6828:2;6824:13;6820:27;6810:55;;6861:1;6858;6851:12;6810:55;6897:2;6884:16;6919:4;6943:60;6959:43;6999:2;6959:43;:::i;6943:60::-;7037:15;;;7119:1;7115:10;;;;7107:19;;7103:28;;;7068:12;;;;7143:19;;;7140:39;;;7175:1;7172;7165:12;7140:39;7199:11;;;;7219:217;7235:6;7230:3;7227:15;7219:217;;;7315:3;7302:17;7332:31;7357:5;7332:31;:::i;:::-;7376:18;;7252:12;;;;7414;;;;7219:217;;;7455:5;-1:-1:-1;;7498:18:7;;7485:32;;-1:-1:-1;;7529:16:7;;;7526:36;;;7558:1;7555;7548:12;7526:36;;7581:63;7636:7;7625:8;7614:9;7610:24;7581:63;:::i;:::-;7571:73;;;6435:1215;;;;;:::o;7655:435::-;7708:3;7746:5;7740:12;7773:6;7768:3;7761:19;7799:4;7828:2;7823:3;7819:12;7812:19;;7865:2;7858:5;7854:14;7886:1;7896:169;7910:6;7907:1;7904:13;7896:169;;;7971:13;;7959:26;;8005:12;;;;8040:15;;;;7932:1;7925:9;7896:169;;;-1:-1:-1;8081:3:7;;7655:435;-1:-1:-1;;;;;7655:435:7:o;8095:261::-;8274:2;8263:9;8256:21;8237:4;8294:56;8346:2;8335:9;8331:18;8323:6;8294:56;:::i;8361:450::-;8430:6;8483:2;8471:9;8462:7;8458:23;8454:32;8451:52;;;8499:1;8496;8489:12;8451:52;8539:9;8526:23;8572:18;8564:6;8561:30;8558:50;;;8604:1;8601;8594:12;8558:50;8627:22;;8680:4;8672:13;;8668:27;-1:-1:-1;8658:55:7;;8709:1;8706;8699:12;8658:55;8732:73;8797:7;8792:2;8779:16;8774:2;8770;8766:11;8732:73;:::i;9047:456::-;9133:6;9141;9149;9202:2;9190:9;9181:7;9177:23;9173:32;9170:52;;;9218:1;9215;9208:12;9170:52;9254:9;9241:23;9231:33;;9311:2;9300:9;9296:18;9283:32;9273:42;;9366:2;9355:9;9351:18;9338:32;9393:18;9385:6;9382:30;9379:50;;;9425:1;9422;9415:12;9379:50;9448:49;9489:7;9480:6;9469:9;9465:22;9448:49;:::i;:::-;9438:59;;;9047:456;;;;;:::o;9508:247::-;9567:6;9620:2;9608:9;9599:7;9595:23;9591:32;9588:52;;;9636:1;9633;9626:12;9588:52;9675:9;9662:23;9694:31;9719:5;9694:31;:::i;9760:730::-;9873:6;9881;9889;9897;9905;9913;9966:3;9954:9;9945:7;9941:23;9937:33;9934:53;;;9983:1;9980;9973:12;9934:53;10022:9;10009:23;10041:31;10066:5;10041:31;:::i;:::-;10091:5;-1:-1:-1;10143:2:7;10128:18;;10115:32;;-1:-1:-1;10194:2:7;10179:18;;10166:32;;-1:-1:-1;10245:2:7;10230:18;;10217:32;;-1:-1:-1;10296:3:7;10281:19;;10268:33;;-1:-1:-1;10352:3:7;10337:19;;10324:33;10380:18;10369:30;;10366:50;;;10412:1;10409;10402:12;10366:50;10435:49;10476:7;10467:6;10456:9;10452:22;10435:49;:::i;:::-;10425:59;;;9760:730;;;;;;;;:::o;10495:416::-;10560:6;10568;10621:2;10609:9;10600:7;10596:23;10592:32;10589:52;;;10637:1;10634;10627:12;10589:52;10676:9;10663:23;10695:31;10720:5;10695:31;:::i;:::-;10745:5;-1:-1:-1;10802:2:7;10787:18;;10774:32;10844:15;;10837:23;10825:36;;10815:64;;10875:1;10872;10865:12;10815:64;10898:7;10888:17;;;10495:416;;;;;:::o;10916:592::-;11011:6;11019;11027;11035;11088:3;11076:9;11067:7;11063:23;11059:33;11056:53;;;11105:1;11102;11095:12;11056:53;11144:9;11131:23;11163:31;11188:5;11163:31;:::i;:::-;11213:5;-1:-1:-1;11265:2:7;11250:18;;11237:32;;-1:-1:-1;11316:2:7;11301:18;;11288:32;;-1:-1:-1;11371:2:7;11356:18;;11343:32;11398:18;11387:30;;11384:50;;;11430:1;11427;11420:12;11384:50;11453:49;11494:7;11485:6;11474:9;11470:22;11453:49;:::i;:::-;11443:59;;;10916:592;;;;;;;:::o;11513:367::-;11576:8;11586:6;11640:3;11633:4;11625:6;11621:17;11617:27;11607:55;;11658:1;11655;11648:12;11607:55;-1:-1:-1;11681:20:7;;11724:18;11713:30;;11710:50;;;11756:1;11753;11746:12;11710:50;11793:4;11785:6;11781:17;11769:29;;11853:3;11846:4;11836:6;11833:1;11829:14;11821:6;11817:27;11813:38;11810:47;11807:67;;;11870:1;11867;11860:12;11807:67;11513:367;;;;;:::o;11885:347::-;11936:8;11946:6;12000:3;11993:4;11985:6;11981:17;11977:27;11967:55;;12018:1;12015;12008:12;11967:55;-1:-1:-1;12041:20:7;;12084:18;12073:30;;12070:50;;;12116:1;12113;12106:12;12070:50;12153:4;12145:6;12141:17;12129:29;;12205:3;12198:4;12189:6;12181;12177:19;12173:30;12170:39;12167:59;;;12222:1;12219;12212:12;12237:1338;12397:6;12405;12413;12421;12429;12437;12445;12453;12506:3;12494:9;12485:7;12481:23;12477:33;12474:53;;;12523:1;12520;12513:12;12474:53;12562:9;12549:23;12581:31;12606:5;12581:31;:::i;:::-;12631:5;-1:-1:-1;12688:2:7;12673:18;;12660:32;12701:33;12660:32;12701:33;:::i;:::-;12753:7;-1:-1:-1;12811:2:7;12796:18;;12783:32;12834:18;12864:14;;;12861:34;;;12891:1;12888;12881:12;12861:34;12930:70;12992:7;12983:6;12972:9;12968:22;12930:70;:::i;:::-;13019:8;;-1:-1:-1;12904:96:7;-1:-1:-1;13107:2:7;13092:18;;13079:32;;-1:-1:-1;13123:16:7;;;13120:36;;;13152:1;13149;13142:12;13120:36;13191:72;13255:7;13244:8;13233:9;13229:24;13191:72;:::i;:::-;13282:8;;-1:-1:-1;13165:98:7;-1:-1:-1;13370:3:7;13355:19;;13342:33;;-1:-1:-1;13387:16:7;;;13384:36;;;13416:1;13413;13406:12;13384:36;;13455:60;13507:7;13496:8;13485:9;13481:24;13455:60;:::i;:::-;12237:1338;;;;-1:-1:-1;12237:1338:7;;-1:-1:-1;12237:1338:7;;;;;;13534:8;-1:-1:-1;;;12237:1338:7:o;13833:505::-;13928:6;13936;13944;13997:2;13985:9;13976:7;13972:23;13968:32;13965:52;;;14013:1;14010;14003:12;13965:52;14049:9;14036:23;14026:33;;14110:2;14099:9;14095:18;14082:32;14137:18;14129:6;14126:30;14123:50;;;14169:1;14166;14159:12;14123:50;14208:70;14270:7;14261:6;14250:9;14246:22;14208:70;:::i;:::-;13833:505;;14297:8;;-1:-1:-1;14182:96:7;;-1:-1:-1;;;;13833:505:7:o;14528:248::-;14596:6;14604;14657:2;14645:9;14636:7;14632:23;14628:32;14625:52;;;14673:1;14670;14663:12;14625:52;-1:-1:-1;;14696:23:7;;;14766:2;14751:18;;;14738:32;;-1:-1:-1;14528:248:7:o;14781:388::-;14849:6;14857;14910:2;14898:9;14889:7;14885:23;14881:32;14878:52;;;14926:1;14923;14916:12;14878:52;14965:9;14952:23;14984:31;15009:5;14984:31;:::i;:::-;15034:5;-1:-1:-1;15091:2:7;15076:18;;15063:32;15104:33;15063:32;15104:33;:::i;15174:823::-;15280:6;15288;15296;15304;15312;15320;15373:3;15361:9;15352:7;15348:23;15344:33;15341:53;;;15390:1;15387;15380:12;15341:53;15429:9;15416:23;15448:31;15473:5;15448:31;:::i;:::-;15498:5;-1:-1:-1;15555:2:7;15540:18;;15527:32;15568:33;15527:32;15568:33;:::i;:::-;15620:7;-1:-1:-1;15674:2:7;15659:18;;15646:32;;-1:-1:-1;15725:2:7;15710:18;;15697:32;;-1:-1:-1;15780:3:7;15765:19;;15752:33;15808:18;15797:30;;15794:50;;;15840:1;15837;15830:12;15794:50;15879:58;15929:7;15920:6;15909:9;15905:22;15879:58;:::i;:::-;15174:823;;;;-1:-1:-1;15174:823:7;;-1:-1:-1;15174:823:7;;15956:8;;15174:823;-1:-1:-1;;;15174:823:7:o;16002:734::-;16106:6;16114;16122;16130;16138;16191:3;16179:9;16170:7;16166:23;16162:33;16159:53;;;16208:1;16205;16198:12;16159:53;16247:9;16234:23;16266:31;16291:5;16266:31;:::i;:::-;16316:5;-1:-1:-1;16373:2:7;16358:18;;16345:32;16386:33;16345:32;16386:33;:::i;:::-;16438:7;-1:-1:-1;16492:2:7;16477:18;;16464:32;;-1:-1:-1;16543:2:7;16528:18;;16515:32;;-1:-1:-1;16598:3:7;16583:19;;16570:33;16626:18;16615:30;;16612:50;;;16658:1;16655;16648:12;16741:437;16820:1;16816:12;;;;16863;;;16884:61;;16938:4;16930:6;16926:17;16916:27;;16884:61;16991:2;16983:6;16980:14;16960:18;16957:38;16954:218;;17028:77;17025:1;17018:88;17129:4;17126:1;17119:15;17157:4;17154:1;17147:15;16954:218;;16741:437;;;:::o;17309:1065::-;17485:3;17514:1;17547:6;17541:13;17577:36;17603:9;17577:36;:::i;:::-;17632:1;17649:18;;;17676:191;;;;17881:1;17876:356;;;;17642:590;;17676:191;17724:66;17713:9;17709:82;17704:3;17697:95;17847:6;17840:14;17833:22;17825:6;17821:35;17816:3;17812:45;17805:52;;17676:191;;17876:356;17907:6;17904:1;17897:17;17937:4;17982:2;17979:1;17969:16;18007:1;18021:165;18035:6;18032:1;18029:13;18021:165;;;18113:14;;18100:11;;;18093:35;18156:16;;;;18050:10;;18021:165;;;18025:3;;;18215:6;18210:3;18206:16;18199:23;;17642:590;;;;;18263:6;18257:13;18279:55;18325:8;18320:3;18313:4;18305:6;18301:17;18279:55;:::i;:::-;18350:18;;17309:1065;-1:-1:-1;;;;17309:1065:7:o;19066:184::-;19118:77;19115:1;19108:88;19215:4;19212:1;19205:15;19239:4;19236:1;19229:15;19255:184;19307:77;19304:1;19297:88;19404:4;19401:1;19394:15;19428:4;19425:1;19418:15;19444:125;19484:4;19512:1;19509;19506:8;19503:34;;;19517:18;;:::i;:::-;-1:-1:-1;19554:9:7;;19444:125::o;19574:128::-;19614:3;19645:1;19641:6;19638:1;19635:13;19632:39;;;19651:18;;:::i;:::-;-1:-1:-1;19687:9:7;;19574:128::o;19707:465::-;19964:2;19953:9;19946:21;19927:4;19990:56;20042:2;20031:9;20027:18;20019:6;19990:56;:::i;:::-;20094:9;20086:6;20082:22;20077:2;20066:9;20062:18;20055:50;20122:44;20159:6;20151;20122:44;:::i;:::-;20114:52;19707:465;-1:-1:-1;;;;;19707:465:7:o;20177:850::-;20499:4;-1:-1:-1;;;;;20609:2:7;20601:6;20597:15;20586:9;20579:34;20661:2;20653:6;20649:15;20644:2;20633:9;20629:18;20622:43;;20701:3;20696:2;20685:9;20681:18;20674:31;20728:57;20780:3;20769:9;20765:19;20757:6;20728:57;:::i;:::-;20833:9;20825:6;20821:22;20816:2;20805:9;20801:18;20794:50;20867:44;20904:6;20896;20867:44;:::i;:::-;20853:58;;20960:9;20952:6;20948:22;20942:3;20931:9;20927:19;20920:51;20988:33;21014:6;21006;20988:33;:::i;:::-;20980:41;20177:850;-1:-1:-1;;;;;;;;20177:850:7:o;21032:249::-;21101:6;21154:2;21142:9;21133:7;21129:23;21125:32;21122:52;;;21170:1;21167;21160:12;21122:52;21202:9;21196:16;21221:30;21245:5;21221:30;:::i;22202:195::-;22241:3;22272:66;22265:5;22262:77;22259:103;;22342:18;;:::i;:::-;-1:-1:-1;22389:1:7;22378:13;;22202:195::o;22402:251::-;22472:6;22525:2;22513:9;22504:7;22500:23;22496:32;22493:52;;;22541:1;22538;22531:12;22493:52;22573:9;22567:16;22592:31;22617:5;22592:31;:::i;22960:545::-;23062:2;23057:3;23054:11;23051:448;;;23098:1;23123:5;23119:2;23112:17;23168:4;23164:2;23154:19;23238:2;23226:10;23222:19;23219:1;23215:27;23209:4;23205:38;23274:4;23262:10;23259:20;23256:47;;;-1:-1:-1;23297:4:7;23256:47;23352:2;23347:3;23343:12;23340:1;23336:20;23330:4;23326:31;23316:41;;23407:82;23425:2;23418:5;23415:13;23407:82;;;23470:17;;;23451:1;23440:13;23407:82;;23741:1471;23867:3;23861:10;23894:18;23886:6;23883:30;23880:56;;;23916:18;;:::i;:::-;23945:97;24035:6;23995:38;24027:4;24021:11;23995:38;:::i;:::-;23989:4;23945:97;:::i;:::-;24097:4;;24161:2;24150:14;;24178:1;24173:782;;;;24999:1;25016:6;25013:89;;;-1:-1:-1;25068:19:7;;;25062:26;25013:89;23647:66;23638:1;23634:11;;;23630:84;23626:89;23616:100;23722:1;23718:11;;;23613:117;25115:81;;24143:1063;;24173:782;17256:1;17249:14;;;17293:4;17280:18;;-1:-1:-1;;24209:79:7;;;24386:236;24400:7;24397:1;24394:14;24386:236;;;24489:19;;;24483:26;24468:42;;24581:27;;;;24549:1;24537:14;;;;24416:19;;24386:236;;;24390:3;24650:6;24641:7;24638:19;24635:261;;;24711:19;;;24705:26;24812:66;24794:1;24790:14;;;24806:3;24786:24;24782:97;24778:102;24763:118;24748:134;;24635:261;-1:-1:-1;;;;;24942:1:7;24926:14;;;24922:22;24909:36;;-1:-1:-1;23741:1471:7:o;25217:228::-;25257:7;25383:1;25315:66;25311:74;25308:1;25305:81;25300:1;25293:9;25286:17;25282:105;25279:131;;;25390:18;;:::i;:::-;-1:-1:-1;25430:9:7;;25217:228::o;26633:584::-;26855:4;-1:-1:-1;;;;;26965:2:7;26957:6;26953:15;26942:9;26935:34;27017:2;27009:6;27005:15;27000:2;26989:9;26985:18;26978:43;;27057:6;27052:2;27041:9;27037:18;27030:34;27100:6;27095:2;27084:9;27080:18;27073:34;27144:3;27138;27127:9;27123:19;27116:32;27165:46;27206:3;27195:9;27191:19;27183:6;27165:46;:::i;:::-;27157:54;26633:584;-1:-1:-1;;;;;;;26633:584:7:o;27629:184::-;27681:77;27678:1;27671:88;27778:4;27775:1;27768:15;27802:4;27799:1;27792:15;27818:120;27858:1;27884;27874:35;;27889:18;;:::i;:::-;-1:-1:-1;27923:9:7;;27818:120::o;27943:112::-;27975:1;28001;27991:35;;28006:18;;:::i;:::-;-1:-1:-1;28040:9:7;;27943:112::o

Swarm Source

ipfs://498c57fadcedb85bce22103618e19340e5093b854e19df9fd811c7cd28066a1b
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.