ETH Price: $2,374.22 (-4.33%)

Token

Whitetail (WWHC)
 

Overview

Max Total Supply

0 WWHC

Holders

41

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
zeropointzero.eth
Balance
1 WWHC
0x2afba283324a65b64bbcb70fff9165cabfa5b87a
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

The Whitetail Wall Hangers Club is an NFT collection of 5,555 hand-drawn whitetail deer living on the ETH blockchain.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
WWHC

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-02-26
*/

//SPDX-License-Identifier: MIT
pragma solidity 0.8.11;

error NotOwner();

abstract contract LilOwnable {
    address internal _owner;

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

    constructor() {
        _owner = msg.sender;
    }

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

    function transferOwnership(address _newOwner) external {
        if (msg.sender != _owner) revert NotOwner();

        _owner = _newOwner;
    }

    function renounceOwnership() public {
        if (msg.sender != _owner) revert NotOwner();

        _owner = address(0);
    }

    function supportsInterface(bytes4 interfaceId)
        public
        pure
        virtual
        returns (bool)
    {
        return interfaceId == 0x7f5828d0; // ERC165 Interface ID for ERC173
    }
}


library Strings {
    /**
     * @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);
    }
}


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

    mapping(address => uint256) public balanceOf;

    mapping(uint256 => address) public ownerOf;

    mapping(uint256 => address) public getApproved;

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

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

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

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

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

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

        getApproved[id] = spender;

        emit Approval(owner, spender, id);
    }

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

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

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

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

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

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

            balanceOf[to]++;
        }

        ownerOf[id] = to;

        delete getApproved[id];

        emit Transfer(from, to, id);
    }

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

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

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

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

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

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

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

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

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

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

        ownerOf[id] = to;

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

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

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

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

        delete ownerOf[id];

        delete getApproved[id];

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

    /*///////////////////////////////////////////////////////////////
                       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);
}


/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC20.sol)
/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol)
/// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it.
abstract contract ERC20 {
    /*///////////////////////////////////////////////////////////////
                                  EVENTS
    //////////////////////////////////////////////////////////////*/

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

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

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

    string public name;

    string public symbol;

    uint8 public immutable decimals;

    /*///////////////////////////////////////////////////////////////
                              ERC20 STORAGE
    //////////////////////////////////////////////////////////////*/

    uint256 public totalSupply;

    mapping(address => uint256) public balanceOf;

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

    /*///////////////////////////////////////////////////////////////
                             EIP-2612 STORAGE
    //////////////////////////////////////////////////////////////*/

    bytes32 public constant PERMIT_TYPEHASH =
        keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");

    uint256 internal immutable INITIAL_CHAIN_ID;

    bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR;

    mapping(address => uint256) public nonces;

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

    constructor(
        string memory _name,
        string memory _symbol,
        uint8 _decimals
    ) {
        name = _name;
        symbol = _symbol;
        decimals = _decimals;

        INITIAL_CHAIN_ID = block.chainid;
        INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator();
    }

    /*///////////////////////////////////////////////////////////////
                              ERC20 LOGIC
    //////////////////////////////////////////////////////////////*/

    function approve(address spender, uint256 amount) public virtual returns (bool) {
        allowance[msg.sender][spender] = amount;

        emit Approval(msg.sender, spender, amount);

        return true;
    }

    function transfer(address to, uint256 amount) public virtual returns (bool) {
        balanceOf[msg.sender] -= amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(msg.sender, to, amount);

        return true;
    }

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual returns (bool) {
        uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals.

        if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount;

        balanceOf[from] -= amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(from, to, amount);

        return true;
    }

    /*///////////////////////////////////////////////////////////////
                              EIP-2612 LOGIC
    //////////////////////////////////////////////////////////////*/

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual {
        require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED");

        // Unchecked because the only math done is incrementing
        // the owner's nonce which cannot realistically overflow.
        unchecked {
            bytes32 digest = keccak256(
                abi.encodePacked(
                    "\x19\x01",
                    DOMAIN_SEPARATOR(),
                    keccak256(abi.encode(PERMIT_TYPEHASH, owner, spender, value, nonces[owner]++, deadline))
                )
            );

            address recoveredAddress = ecrecover(digest, v, r, s);

            require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER");

            allowance[recoveredAddress][spender] = value;
        }

        emit Approval(owner, spender, value);
    }

    function DOMAIN_SEPARATOR() public view virtual returns (bytes32) {
        return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator();
    }

    function computeDomainSeparator() internal view virtual returns (bytes32) {
        return
            keccak256(
                abi.encode(
                    keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
                    keccak256(bytes(name)),
                    keccak256("1"),
                    block.chainid,
                    address(this)
                )
            );
    }

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

    function _mint(address to, uint256 amount) internal virtual {
        totalSupply += amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

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

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

        // Cannot underflow because a user's balance
        // will never be larger than the total supply.
        unchecked {
            totalSupply -= amount;
        }

        emit Transfer(from, address(0), amount);
    }
}


/// @notice Safe ETH and ERC20 transfer library that gracefully handles missing return values.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/utils/SafeTransferLib.sol)
/// @author Modified from Gnosis (https://github.com/gnosis/gp-v2-contracts/blob/main/src/contracts/libraries/GPv2SafeERC20.sol)
/// @dev Use with caution! Some functions in this library knowingly create dirty bits at the destination of the free memory pointer.
library SafeTransferLib {
    /*///////////////////////////////////////////////////////////////
                            ETH OPERATIONS
    //////////////////////////////////////////////////////////////*/

    function safeTransferETH(address to, uint256 amount) internal {
        bool callStatus;

        assembly {
            // Transfer the ETH and store if it succeeded or not.
            callStatus := call(gas(), to, amount, 0, 0, 0, 0)
        }

        require(callStatus, "ETH_TRANSFER_FAILED");
    }

    /*///////////////////////////////////////////////////////////////
                           ERC20 OPERATIONS
    //////////////////////////////////////////////////////////////*/

    function safeTransferFrom(
        ERC20 token,
        address from,
        address to,
        uint256 amount
    ) internal {
        bool callStatus;

        assembly {
            // Get a pointer to some free memory.
            let freeMemoryPointer := mload(0x40)

            // Write the abi-encoded calldata to memory piece by piece:
            mstore(freeMemoryPointer, 0x23b872dd00000000000000000000000000000000000000000000000000000000) // Begin with the function selector.
            mstore(add(freeMemoryPointer, 4), and(from, 0xffffffffffffffffffffffffffffffffffffffff)) // Mask and append the "from" argument.
            mstore(add(freeMemoryPointer, 36), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Mask and append the "to" argument.
            mstore(add(freeMemoryPointer, 68), amount) // Finally append the "amount" argument. No mask as it's a full 32 byte value.

            // Call the token and store if it succeeded or not.
            // We use 100 because the calldata length is 4 + 32 * 3.
            callStatus := call(gas(), token, 0, freeMemoryPointer, 100, 0, 0)
        }

        require(didLastOptionalReturnCallSucceed(callStatus), "TRANSFER_FROM_FAILED");
    }

    function safeTransfer(
        ERC20 token,
        address to,
        uint256 amount
    ) internal {
        bool callStatus;

        assembly {
            // Get a pointer to some free memory.
            let freeMemoryPointer := mload(0x40)

            // Write the abi-encoded calldata to memory piece by piece:
            mstore(freeMemoryPointer, 0xa9059cbb00000000000000000000000000000000000000000000000000000000) // Begin with the function selector.
            mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Mask and append the "to" argument.
            mstore(add(freeMemoryPointer, 36), amount) // Finally append the "amount" argument. No mask as it's a full 32 byte value.

            // Call the token and store if it succeeded or not.
            // We use 68 because the calldata length is 4 + 32 * 2.
            callStatus := call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)
        }

        require(didLastOptionalReturnCallSucceed(callStatus), "TRANSFER_FAILED");
    }

    function safeApprove(
        ERC20 token,
        address to,
        uint256 amount
    ) internal {
        bool callStatus;

        assembly {
            // Get a pointer to some free memory.
            let freeMemoryPointer := mload(0x40)

            // Write the abi-encoded calldata to memory piece by piece:
            mstore(freeMemoryPointer, 0x095ea7b300000000000000000000000000000000000000000000000000000000) // Begin with the function selector.
            mstore(add(freeMemoryPointer, 4), and(to, 0xffffffffffffffffffffffffffffffffffffffff)) // Mask and append the "to" argument.
            mstore(add(freeMemoryPointer, 36), amount) // Finally append the "amount" argument. No mask as it's a full 32 byte value.

            // Call the token and store if it succeeded or not.
            // We use 68 because the calldata length is 4 + 32 * 2.
            callStatus := call(gas(), token, 0, freeMemoryPointer, 68, 0, 0)
        }

        require(didLastOptionalReturnCallSucceed(callStatus), "APPROVE_FAILED");
    }

    /*///////////////////////////////////////////////////////////////
                         INTERNAL HELPER LOGIC
    //////////////////////////////////////////////////////////////*/

    function didLastOptionalReturnCallSucceed(bool callStatus) private pure returns (bool success) {
        assembly {
            // Get how many bytes the call returned.
            let returnDataSize := returndatasize()

            // If the call reverted:
            if iszero(callStatus) {
                // Copy the revert message into memory.
                returndatacopy(0, 0, returnDataSize)

                // Revert with the same message.
                revert(0, returnDataSize)
            }

            switch returnDataSize
            case 32 {
                // Copy the return data into memory.
                returndatacopy(0, 0, returnDataSize)

                // Set success to whether it returned true.
                success := iszero(iszero(mload(0)))
            }
            case 0 {
                // There was no return data.
                success := 1
            }
            default {
                // It returned some malformed input.
                success := 0
            }
        }
    }
}


/// @notice Arithmetic library with operations for fixed-point numbers.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/utils/FixedPointMathLib.sol)
library FixedPointMathLib {
    /*///////////////////////////////////////////////////////////////
                            COMMON BASE UNITS
    //////////////////////////////////////////////////////////////*/

    uint256 internal constant YAD = 1e8;
    uint256 internal constant WAD = 1e18;
    uint256 internal constant RAY = 1e27;
    uint256 internal constant RAD = 1e45;

    /*///////////////////////////////////////////////////////////////
                         FIXED POINT OPERATIONS
    //////////////////////////////////////////////////////////////*/

    function fmul(
        uint256 x,
        uint256 y,
        uint256 baseUnit
    ) internal pure returns (uint256 z) {
        assembly {
            // Store x * y in z for now.
            z := mul(x, y)

            // Equivalent to require(x == 0 || (x * y) / x == y)
            if iszero(or(iszero(x), eq(div(z, x), y))) {
                revert(0, 0)
            }

            // If baseUnit is zero this will return zero instead of reverting.
            z := div(z, baseUnit)
        }
    }

    function fdiv(
        uint256 x,
        uint256 y,
        uint256 baseUnit
    ) internal pure returns (uint256 z) {
        assembly {
            // Store x * baseUnit in z for now.
            z := mul(x, baseUnit)

            // Equivalent to require(y != 0 && (x == 0 || (x * baseUnit) / x == baseUnit))
            if iszero(and(iszero(iszero(y)), or(iszero(x), eq(div(z, x), baseUnit)))) {
                revert(0, 0)
            }

            // We ensure y is not zero above, so there is never division by zero here.
            z := div(z, y)
        }
    }

    function fpow(
        uint256 x,
        uint256 n,
        uint256 baseUnit
    ) internal pure returns (uint256 z) {
        assembly {
            switch x
            case 0 {
                switch n
                case 0 {
                    // 0 ** 0 = 1
                    z := baseUnit
                }
                default {
                    // 0 ** n = 0
                    z := 0
                }
            }
            default {
                switch mod(n, 2)
                case 0 {
                    // If n is even, store baseUnit in z for now.
                    z := baseUnit
                }
                default {
                    // If n is odd, store x in z for now.
                    z := x
                }

                // Shifting right by 1 is like dividing by 2.
                let half := shr(1, baseUnit)

                for {
                    // Shift n right by 1 before looping to halve it.
                    n := shr(1, n)
                } n {
                    // Shift n right by 1 each iteration to halve it.
                    n := shr(1, n)
                } {
                    // Revert immediately if x ** 2 would overflow.
                    // Equivalent to iszero(eq(div(xx, x), x)) here.
                    if shr(128, x) {
                        revert(0, 0)
                    }

                    // Store x squared.
                    let xx := mul(x, x)

                    // Round to the nearest number.
                    let xxRound := add(xx, half)

                    // Revert if xx + half overflowed.
                    if lt(xxRound, xx) {
                        revert(0, 0)
                    }

                    // Set x to scaled xxRound.
                    x := div(xxRound, baseUnit)

                    // If n is even:
                    if mod(n, 2) {
                        // Compute z * x.
                        let zx := mul(z, x)

                        // If z * x overflowed:
                        if iszero(eq(div(zx, x), z)) {
                            // Revert if x is non-zero.
                            if iszero(iszero(x)) {
                                revert(0, 0)
                            }
                        }

                        // Round to the nearest number.
                        let zxRound := add(zx, half)

                        // Revert if zx + half overflowed.
                        if lt(zxRound, zx) {
                            revert(0, 0)
                        }

                        // Return properly scaled zxRound.
                        z := div(zxRound, baseUnit)
                    }
                }
            }
        }
    }

    /*///////////////////////////////////////////////////////////////
                        GENERAL NUMBER UTILITIES
    //////////////////////////////////////////////////////////////*/

    function sqrt(uint256 x) internal pure returns (uint256 z) {
        assembly {
            // Start off with z at 1.
            z := 1

            // Used below to help find a nearby power of 2.
            let y := x

            // Find the lowest power of 2 that is at least sqrt(x).
            if iszero(lt(y, 0x100000000000000000000000000000000)) {
                y := shr(128, y) // Like dividing by 2 ** 128.
                z := shl(64, z)
            }
            if iszero(lt(y, 0x10000000000000000)) {
                y := shr(64, y) // Like dividing by 2 ** 64.
                z := shl(32, z)
            }
            if iszero(lt(y, 0x100000000)) {
                y := shr(32, y) // Like dividing by 2 ** 32.
                z := shl(16, z)
            }
            if iszero(lt(y, 0x10000)) {
                y := shr(16, y) // Like dividing by 2 ** 16.
                z := shl(8, z)
            }
            if iszero(lt(y, 0x100)) {
                y := shr(8, y) // Like dividing by 2 ** 8.
                z := shl(4, z)
            }
            if iszero(lt(y, 0x10)) {
                y := shr(4, y) // Like dividing by 2 ** 4.
                z := shl(2, z)
            }
            if iszero(lt(y, 0x8)) {
                // Equivalent to 2 ** z.
                z := shl(1, z)
            }

            // Shifting right by 1 is like dividing by 2.
            z := shr(1, add(z, div(x, z)))
            z := shr(1, add(z, div(x, z)))
            z := shr(1, add(z, div(x, z)))
            z := shr(1, add(z, div(x, z)))
            z := shr(1, add(z, div(x, z)))
            z := shr(1, add(z, div(x, z)))
            z := shr(1, add(z, div(x, z)))

            // Compute a rounded down version of z.
            let zRoundDown := div(x, z)

            // If zRoundDown is smaller, use it.
            if lt(zRoundDown, z) {
                z := zRoundDown
            }
        }
    }
}

/*

__        ___     _ _       _        _ _ 
\ \      / / |__ (_) |_ ___| |_ __ _(_) |
 \ \ /\ / /| '_ \| | __/ _ \ __/ _` | | |
  \ V  V / | | | | | ||  __/ || (_| | | |
   \_/\_/  |_| |_|_|\__\___|\__\__,_|_|_|


*/

error DoesNotExist();
error NoTokensLeft();
error NotEnoughETH();
error TooManyMintAtOnce();
error NotOnWhitelist();
error WhitelistMintNotStarted();
error MintNotStarted();
error EmptyBalance();
error NoReserveTokensLeft();

/// @title  WWHC contract 
/// @author @CrossChainLabs (https://canthedevsdosomething.com) 
contract WWHC is LilOwnable, ERC721 {
    using Strings for uint256;

    uint256 public constant TOTAL_SUPPLY = 5555;
    uint256 public constant PRICE_PER_WHITELIST_MINT = 0.1 ether;
    uint256 public constant PRICE_PER_PUBLIC_MINT = 0.15 ether;
    uint256 public maxWhitelistMintAmount = 10;
    uint256 public maxPublicMintAmount = 20;

    bool public whitelistMintStarted = false;
    bool public mintStarted = false;
    bool public revealed = false;

    uint256 public totalMinted;

    bytes32 private _merkleRoot;

    string public baseURI;
    string public nonRevealedURI;

    address[5] private _royaltyAddresses;

    mapping(address => uint256) private _royaltyShares;

    modifier onlyOwner() {
        require(msg.sender == _owner, "Ownable: caller is not the owner");
        _;
    }
    
    constructor(
        string memory _nonRevealedURI,
        bytes32 _initMerkleRoot,
        address[5] memory _contributorAddresses
    ) payable ERC721("Whitetail", "WWHC") {
        nonRevealedURI = _nonRevealedURI;
        _merkleRoot = _initMerkleRoot;

        _royaltyAddresses[0] = _contributorAddresses[0]; 
        _royaltyAddresses[1] = _contributorAddresses[1];
        _royaltyAddresses[2] = _contributorAddresses[2];
        _royaltyAddresses[3] = _contributorAddresses[3]; 
        _royaltyAddresses[4] = _contributorAddresses[4]; 

        _royaltyShares[_royaltyAddresses[0]] = 295;
        _royaltyShares[_royaltyAddresses[1]] = 295;
        _royaltyShares[_royaltyAddresses[2]] = 295;
        _royaltyShares[_royaltyAddresses[3]] = 100;
        _royaltyShares[_royaltyAddresses[4]] = 15;
        
        for (uint256 i=0; i < 100; i++) {
            _mint(msg.sender, totalMinted + 1);
            totalMinted++;
        }
    }

    /// @dev    Add a hashed address to the merkle tree as a leaf
    /// @param  account Leaf address for MerkleTree
    /// @return bytes32 hashed version of the merkle leaf address
    function _leaf(address account) private pure returns (bytes32) {
        return keccak256(abi.encodePacked(account));
    }

    /// @dev    Verify the whitelist using the merkle tree
    /// @param  leaf Hashed address leaf from _leaf() to search for
    /// @param  proof Submitted root proof from MerkleTree
    /// @return bool True if address is allowed to mint
    function verifyWhitelist(bytes32 leaf, bytes32[] memory proof) private view returns (bool) {
        bytes32 computedHash = leaf;

        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];

            if (computedHash < proofElement) {
                computedHash = keccak256(
                    abi.encodePacked(computedHash, proofElement)
                );
            } else {
                computedHash = keccak256(
                    abi.encodePacked(proofElement, computedHash)
                );
            }
        }

        return computedHash == _merkleRoot;
    }

    function mint(uint16 amount) external payable {
        if (totalMinted + amount > TOTAL_SUPPLY) revert NoTokensLeft();
        if (!mintStarted) revert MintNotStarted();
        if (msg.value < amount * PRICE_PER_PUBLIC_MINT) revert NotEnoughETH();
        if (amount > maxPublicMintAmount) revert TooManyMintAtOnce();

        unchecked {
            for (uint16 index = 0; index < amount; index++) {
                _mint(msg.sender, totalMinted + 1);
                totalMinted++;
            }
        }
    }

    function whitelistMint(uint16 amount, bytes32[] memory _proof) external payable {
        if (totalMinted + amount > TOTAL_SUPPLY) revert NoTokensLeft();
        if (!whitelistMintStarted) revert WhitelistMintNotStarted();
        if (msg.value < amount * PRICE_PER_WHITELIST_MINT) revert NotEnoughETH();
        if (amount > maxWhitelistMintAmount) revert TooManyMintAtOnce();
        if (verifyWhitelist(_leaf(msg.sender), _proof) == false) revert NotOnWhitelist();
        
        unchecked {
            for (uint16 index = 0; index < amount; index++) {
                _mint(msg.sender, totalMinted + 1);
                totalMinted++;
            }
        }
    }

    function tokenURI(uint256 id) public view virtual override returns (string memory) {
        if (ownerOf[id] == address(0)) revert DoesNotExist();

        if (revealed == false) {
            return string(abi.encodePacked(nonRevealedURI, id.toString()));
        }
        return string(abi.encodePacked(baseURI, id.toString()));
    }

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

    function startWhitelistMint() public onlyOwner {
        whitelistMintStarted = true;
    }
    
    function startMint() public onlyOwner {
        mintStarted = true;
    }

    function pauseMint() public onlyOwner {
        whitelistMintStarted = false;
        mintStarted = false;
    }

    function reveal(string memory _baseUri) public onlyOwner {
        setBaseURI(_baseUri);
        revealed = true;
    }

    function setMerkleRoot(bytes32 _merkleRootValue) external onlyOwner returns (bytes32) {
        _merkleRoot = _merkleRootValue;
        return _merkleRoot;
    }

    function withdraw() external onlyOwner {
        if (address(this).balance == 0) revert EmptyBalance();
        uint256 balance = address(this).balance;

        for (uint256 i = 0; i < _royaltyAddresses.length; i++) {
            payable(_royaltyAddresses[i]).transfer(
                balance * _royaltyShares[_royaltyAddresses[i]] / 1000
            );
        }
    }

    /// @dev Tells interfacing contracts what they can do with this one
    function supportsInterface(bytes4 interfaceId)
        public
        pure
        override(LilOwnable, ERC721)
        returns (bool)
    {
        return
            interfaceId == 0x7f5828d0 || // ERC165 Interface ID for ERC173
            interfaceId == 0x80ac58cd || // ERC165 Interface ID for ERC721
            interfaceId == 0x5b5e139f || // ERC165 Interface ID for ERC165
            interfaceId == 0x01ffc9a7; // ERC165 Interface ID for ERC721Metadata
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_nonRevealedURI","type":"string"},{"internalType":"bytes32","name":"_initMerkleRoot","type":"bytes32"},{"internalType":"address[5]","name":"_contributorAddresses","type":"address[5]"}],"stateMutability":"payable","type":"constructor"},{"inputs":[],"name":"DoesNotExist","type":"error"},{"inputs":[],"name":"EmptyBalance","type":"error"},{"inputs":[],"name":"MintNotStarted","type":"error"},{"inputs":[],"name":"NoTokensLeft","type":"error"},{"inputs":[],"name":"NotEnoughETH","type":"error"},{"inputs":[],"name":"NotOnWhitelist","type":"error"},{"inputs":[],"name":"NotOwner","type":"error"},{"inputs":[],"name":"TooManyMintAtOnce","type":"error"},{"inputs":[],"name":"WhitelistMintNotStarted","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"PRICE_PER_PUBLIC_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE_PER_WHITELIST_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOTAL_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","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":"maxPublicMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWhitelistMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"amount","type":"uint16"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nonRevealedURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pauseMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseUri","type":"string"}],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRootValue","type":"bytes32"}],"name":"setMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startWhitelistMint","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":"uint256","name":"id","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"amount","type":"uint16"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"whitelistMintStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052600a60075560146008556000600960006101000a81548160ff0219169083151502179055506000600960016101000a81548160ff0219169083151502179055506000600960026101000a81548160ff021916908315150217905550604051620046e4380380620046e4833981810160405281019062000084919062000c74565b6040518060400160405280600981526020017f57686974657461696c00000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f5757484300000000000000000000000000000000000000000000000000000000815250336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550816001908051906020019062000148929190620008be565b50806002908051906020019062000161929190620008be565b50505082600d90805190602001906200017c929190620008be565b5081600b81905550806000600581106200019b576200019a62000cef565b5b6020020151600e600060058110620001b857620001b762000cef565b5b0160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550806001600581106200020e576200020d62000cef565b5b6020020151600e6001600581106200022b576200022a62000cef565b5b0160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060026005811062000281576200028062000cef565b5b6020020151600e6002600581106200029e576200029d62000cef565b5b0160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600360058110620002f457620002f362000cef565b5b6020020151600e60036005811062000311576200031062000cef565b5b0160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060046005811062000367576200036662000cef565b5b6020020151600e60046005811062000384576200038362000cef565b5b0160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061012760136000600e600060058110620003e257620003e162000cef565b5b0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061012760136000600e60016005811062000461576200046062000cef565b5b0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061012760136000600e600260058110620004e057620004df62000cef565b5b0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550606460136000600e6003600581106200055e576200055d62000cef565b5b0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600f60136000600e600460058110620005dc57620005db62000cef565b5b0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060005b60648110156200069b576200066b336001600a546200065f919062000d57565b620006a560201b60201c565b600a6000815480929190620006809062000db4565b91905055508080620006929062000db4565b9150506200063f565b5050505062000f5c565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000718576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200070f9062000e63565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614620007bd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007b49062000ed5565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054620008cc9062000f26565b90600052602060002090601f016020900481019282620008f057600085556200093c565b82601f106200090b57805160ff19168380011785556200093c565b828001600101855582156200093c579182015b828111156200093b5782518255916020019190600101906200091e565b5b5090506200094b91906200094f565b5090565b5b808211156200096a57600081600090555060010162000950565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620009d7826200098c565b810181811067ffffffffffffffff82111715620009f957620009f86200099d565b5b80604052505050565b600062000a0e6200096e565b905062000a1c8282620009cc565b919050565b600067ffffffffffffffff82111562000a3f5762000a3e6200099d565b5b62000a4a826200098c565b9050602081019050919050565b60005b8381101562000a7757808201518184015260208101905062000a5a565b8381111562000a87576000848401525b50505050565b600062000aa462000a9e8462000a21565b62000a02565b90508281526020810184848401111562000ac35762000ac262000987565b5b62000ad084828562000a57565b509392505050565b600082601f83011262000af05762000aef62000982565b5b815162000b0284826020860162000a8d565b91505092915050565b6000819050919050565b62000b208162000b0b565b811462000b2c57600080fd5b50565b60008151905062000b408162000b15565b92915050565b600067ffffffffffffffff82111562000b645762000b636200099d565b5b602082029050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000ba18262000b74565b9050919050565b62000bb38162000b94565b811462000bbf57600080fd5b50565b60008151905062000bd38162000ba8565b92915050565b600062000bf062000bea8462000b46565b62000a02565b9050806020840283018581111562000c0d5762000c0c62000b6f565b5b835b8181101562000c3a578062000c25888262000bc2565b84526020840193505060208101905062000c0f565b5050509392505050565b600082601f83011262000c5c5762000c5b62000982565b5b600562000c6b84828562000bd9565b91505092915050565b600080600060e0848603121562000c905762000c8f62000978565b5b600084015167ffffffffffffffff81111562000cb15762000cb06200097d565b5b62000cbf8682870162000ad8565b935050602062000cd28682870162000b2f565b925050604062000ce58682870162000c44565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000d648262000d1e565b915062000d718362000d1e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000da95762000da862000d28565b5b828201905092915050565b600062000dc18262000d1e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141562000df75762000df662000d28565b5b600182019050919050565b600082825260208201905092915050565b7f494e56414c49445f524543495049454e54000000000000000000000000000000600082015250565b600062000e4b60118362000e02565b915062000e588262000e13565b602082019050919050565b6000602082019050818103600083015262000e7e8162000e3c565b9050919050565b7f414c52454144595f4d494e544544000000000000000000000000000000000000600082015250565b600062000ebd600e8362000e02565b915062000eca8262000e85565b602082019050919050565b6000602082019050818103600083015262000ef08162000eae565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000f3f57607f821691505b6020821081141562000f565762000f5562000ef7565b5b50919050565b6137788062000f6c6000396000f3fe60806040526004361061020f5760003560e01c80636c0360eb11610118578063a9722cf3116100a0578063c87b56dd1161006f578063c87b56dd14610727578063cd85cdb514610764578063e985e9c51461077b578063f2fde38b146107b8578063f96407fa146107e15761020f565b8063a9722cf3146106a0578063b182e818146106cb578063b70196d7146106e7578063b88d4fde146106fe5761020f565b80638da5cb5b116100e75780638da5cb5b146105cb578063902d55a5146105f657806395d89b4114610621578063a22cb4651461064c578063a2309ff8146106755761020f565b80636c0360eb1461050f57806370a082311461053a578063715018a6146105775780637cb647591461058e5761020f565b80632be095611161019b5780634c2612471161016a5780634c2612471461042a578063518302271461045357806355f804b31461047e5780636352211e146104a757806369eb16a3146104e45761020f565b80632be09561146103a85780632f0d3e20146103bf5780633ccfd60b146103ea57806342842e0e146104015761020f565b8063081812fc116101e2578063081812fc146102d2578063095ea7b31461030f5780631cfddb1f1461033857806323b872dd1461036357806323cf0a221461038c5761020f565b806301ffc9a71461021457806303d8acef14610251578063055ea1411461027c57806306fdde03146102a7575b600080fd5b34801561022057600080fd5b5061023b600480360381019061023691906126ed565b61080c565b6040516102489190612735565b60405180910390f35b34801561025d57600080fd5b506102666108ce565b6040516102739190612769565b60405180910390f35b34801561028857600080fd5b506102916108d4565b60405161029e919061281d565b60405180910390f35b3480156102b357600080fd5b506102bc610962565b6040516102c9919061281d565b60405180910390f35b3480156102de57600080fd5b506102f960048036038101906102f4919061286b565b6109f0565b60405161030691906128d9565b60405180910390f35b34801561031b57600080fd5b5061033660048036038101906103319190612920565b610a23565b005b34801561034457600080fd5b5061034d610c0c565b60405161035a9190612735565b60405180910390f35b34801561036f57600080fd5b5061038a60048036038101906103859190612960565b610c1f565b005b6103a660048036038101906103a191906129ed565b61101f565b005b3480156103b457600080fd5b506103bd611188565b005b3480156103cb57600080fd5b506103d4611233565b6040516103e19190612769565b60405180910390f35b3480156103f657600080fd5b506103ff61123f565b005b34801561040d57600080fd5b5061042860048036038101906104239190612960565b611438565b005b34801561043657600080fd5b50610451600480360381019061044c9190612b4f565b611570565b005b34801561045f57600080fd5b50610468611625565b6040516104759190612735565b60405180910390f35b34801561048a57600080fd5b506104a560048036038101906104a09190612b4f565b611638565b005b3480156104b357600080fd5b506104ce60048036038101906104c9919061286b565b6116e0565b6040516104db91906128d9565b60405180910390f35b3480156104f057600080fd5b506104f9611713565b6040516105069190612769565b60405180910390f35b34801561051b57600080fd5b5061052461171f565b604051610531919061281d565b60405180910390f35b34801561054657600080fd5b50610561600480360381019061055c9190612b98565b6117ad565b60405161056e9190612769565b60405180910390f35b34801561058357600080fd5b5061058c6117c5565b005b34801561059a57600080fd5b506105b560048036038101906105b09190612bfb565b61188d565b6040516105c29190612c37565b60405180910390f35b3480156105d757600080fd5b506105e061192f565b6040516105ed91906128d9565b60405180910390f35b34801561060257600080fd5b5061060b611958565b6040516106189190612769565b60405180910390f35b34801561062d57600080fd5b5061063661195e565b604051610643919061281d565b60405180910390f35b34801561065857600080fd5b50610673600480360381019061066e9190612c7e565b6119ec565b005b34801561068157600080fd5b5061068a611ae9565b6040516106979190612769565b60405180910390f35b3480156106ac57600080fd5b506106b5611aef565b6040516106c29190612735565b60405180910390f35b6106e560048036038101906106e09190612d86565b611b02565b005b3480156106f357600080fd5b506106fc611cbc565b005b34801561070a57600080fd5b5061072560048036038101906107209190612e83565b611d67565b005b34801561073357600080fd5b5061074e6004803603810190610749919061286b565b611ea2565b60405161075b919061281d565b60405180910390f35b34801561077057600080fd5b50610779611fbf565b005b34801561078757600080fd5b506107a2600480360381019061079d9190612f06565b612085565b6040516107af9190612735565b60405180910390f35b3480156107c457600080fd5b506107df60048036038101906107da9190612b98565b6120b4565b005b3480156107ed57600080fd5b506107f661217c565b6040516108039190612769565b60405180910390f35b6000637f5828d060e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061086757506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108975750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108c757506301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60085481565b600d80546108e190612f75565b80601f016020809104026020016040519081016040528092919081815260200182805461090d90612f75565b801561095a5780601f1061092f5761010080835404028352916020019161095a565b820191906000526020600020905b81548152906001019060200180831161093d57829003601f168201915b505050505081565b6001805461096f90612f75565b80601f016020809104026020016040519081016040528092919081815260200182805461099b90612f75565b80156109e85780601f106109bd576101008083540402835291602001916109e8565b820191906000526020600020905b8154815290600101906020018083116109cb57829003601f168201915b505050505081565b60056020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610b1b5750600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b610b5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5190612ff3565b60405180910390fd5b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600960009054906101000a900460ff1681565b6004600082815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614610cc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb79061305f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d27906130cb565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610dc857506005600082815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80610e595750600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b610e98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8f90612ff3565b60405180910390fd5b600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600190039190505550600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506005600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6115b38161ffff16600a54611034919061311a565b111561106c576040517f7364ba1700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600960019054906101000a900460ff166110b2576040517f06290e4e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b670214e8348c4f00008161ffff166110ca9190613170565b341015611103576040517f583aa02600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6008548161ffff161115611143576040517f9defc75000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8161ffff168161ffff16101561118457611165336001600a5401612182565b600a600081548092919060010191905055508080600101915050611146565b5050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120d90613216565b60405180910390fd5b6001600960016101000a81548160ff021916908315150217905550565b670214e8348c4f000081565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146112cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c490613216565b60405180910390fd5b6000471415611308576040517f2313b4b600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600047905060005b600581101561143457600e816005811061132d5761132c613236565b5b0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc6103e860136000600e866005811061138357611382613236565b5b0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054856113eb9190613170565b6113f59190613294565b9081150290604051600060405180830381858888f19350505050158015611420573d6000803e3d6000fd5b50808061142c906132c5565b915050611310565b5050565b611443838383610c1f565b60008273ffffffffffffffffffffffffffffffffffffffff163b148061152c575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168273ffffffffffffffffffffffffffffffffffffffff1663150b7a023386856040518463ffffffff1660e01b81526004016114c893929190613345565b6020604051808303816000875af11580156114e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061150b91906133a4565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b61156b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115629061341d565b60405180910390fd5b505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146115fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f590613216565b60405180910390fd5b61160781611638565b6001600960026101000a81548160ff02191690831515021790555050565b600960029054906101000a900460ff1681565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146116c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116bd90613216565b60405180910390fd5b80600c90805190602001906116dc9291906125de565b5050565b60046020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b67016345785d8a000081565b600c805461172c90612f75565b80601f016020809104026020016040519081016040528092919081815260200182805461175890612f75565b80156117a55780601f1061177a576101008083540402835291602001916117a5565b820191906000526020600020905b81548152906001019060200180831161178857829003601f168201915b505050505081565b60036020528060005260406000206000915090505481565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461184a576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461191e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191590613216565b60405180910390fd5b81600b81905550600b549050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6115b381565b6002805461196b90612f75565b80601f016020809104026020016040519081016040528092919081815260200182805461199790612f75565b80156119e45780601f106119b9576101008083540402835291602001916119e4565b820191906000526020600020905b8154815290600101906020018083116119c757829003601f168201915b505050505081565b80600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611add9190612735565b60405180910390a35050565b600a5481565b600960019054906101000a900460ff1681565b6115b38261ffff16600a54611b17919061311a565b1115611b4f576040517f7364ba1700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600960009054906101000a900460ff16611b95576040517fef4604b300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67016345785d8a00008261ffff16611bad9190613170565b341015611be6576040517f583aa02600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007548261ffff161115611c26576040517f9defc75000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60001515611c3c611c3633612395565b836123c5565b15151415611c76576040517f522fc3bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8261ffff168161ffff161015611cb757611c98336001600a5401612182565b600a600081548092919060010191905055508080600101915050611c79565b505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4190613216565b60405180910390fd5b6001600960006101000a81548160ff021916908315150217905550565b611d72848484610c1f565b60008373ffffffffffffffffffffffffffffffffffffffff163b1480611e5d575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168373ffffffffffffffffffffffffffffffffffffffff1663150b7a02338786866040518563ffffffff1660e01b8152600401611df99493929190613481565b6020604051808303816000875af1158015611e18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e3c91906133a4565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b611e9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e939061341d565b60405180910390fd5b50505050565b6060600073ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611f3e576040517fb0ce759100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60001515600960029054906101000a900460ff1615151415611f8c57600d611f658361247d565b604051602001611f7692919061359d565b6040516020818303038152906040529050611fba565b600c611f978361247d565b604051602001611fa892919061359d565b60405160208183030381529060405290505b919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461204d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204490613216565b60405180910390fd5b6000600960006101000a81548160ff0219169083151502179055506000600960016101000a81548160ff021916908315150217905550565b60066020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612139576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60075481565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e9906130cb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612294576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228b9061360d565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000816040516020016123a89190613675565b604051602081830303815290604052805190602001209050919050565b60008083905060005b835181101561246e5760008482815181106123ec576123eb613236565b5b602002602001015190508083101561242e5782816040516020016124119291906136b1565b60405160208183030381529060405280519060200120925061245a565b80836040516020016124419291906136b1565b6040516020818303038152906040528051906020012092505b508080612466906132c5565b9150506123ce565b50600b54811491505092915050565b606060008214156124c5576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506125d9565b600082905060005b600082146124f75780806124e0906132c5565b915050600a826124f09190613294565b91506124cd565b60008167ffffffffffffffff81111561251357612512612a24565b5b6040519080825280601f01601f1916602001820160405280156125455781602001600182028036833780820191505090505b5090505b600085146125d25760018261255e91906136dd565b9150600a8561256d9190613711565b6030612579919061311a565b60f81b81838151811061258f5761258e613236565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856125cb9190613294565b9450612549565b8093505050505b919050565b8280546125ea90612f75565b90600052602060002090601f01602090048101928261260c5760008555612653565b82601f1061262557805160ff1916838001178555612653565b82800160010185558215612653579182015b82811115612652578251825591602001919060010190612637565b5b5090506126609190612664565b5090565b5b8082111561267d576000816000905550600101612665565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6126ca81612695565b81146126d557600080fd5b50565b6000813590506126e7816126c1565b92915050565b6000602082840312156127035761270261268b565b5b6000612711848285016126d8565b91505092915050565b60008115159050919050565b61272f8161271a565b82525050565b600060208201905061274a6000830184612726565b92915050565b6000819050919050565b61276381612750565b82525050565b600060208201905061277e600083018461275a565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156127be5780820151818401526020810190506127a3565b838111156127cd576000848401525b50505050565b6000601f19601f8301169050919050565b60006127ef82612784565b6127f9818561278f565b93506128098185602086016127a0565b612812816127d3565b840191505092915050565b6000602082019050818103600083015261283781846127e4565b905092915050565b61284881612750565b811461285357600080fd5b50565b6000813590506128658161283f565b92915050565b6000602082840312156128815761288061268b565b5b600061288f84828501612856565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006128c382612898565b9050919050565b6128d3816128b8565b82525050565b60006020820190506128ee60008301846128ca565b92915050565b6128fd816128b8565b811461290857600080fd5b50565b60008135905061291a816128f4565b92915050565b600080604083850312156129375761293661268b565b5b60006129458582860161290b565b925050602061295685828601612856565b9150509250929050565b6000806000606084860312156129795761297861268b565b5b60006129878682870161290b565b93505060206129988682870161290b565b92505060406129a986828701612856565b9150509250925092565b600061ffff82169050919050565b6129ca816129b3565b81146129d557600080fd5b50565b6000813590506129e7816129c1565b92915050565b600060208284031215612a0357612a0261268b565b5b6000612a11848285016129d8565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612a5c826127d3565b810181811067ffffffffffffffff82111715612a7b57612a7a612a24565b5b80604052505050565b6000612a8e612681565b9050612a9a8282612a53565b919050565b600067ffffffffffffffff821115612aba57612ab9612a24565b5b612ac3826127d3565b9050602081019050919050565b82818337600083830152505050565b6000612af2612aed84612a9f565b612a84565b905082815260208101848484011115612b0e57612b0d612a1f565b5b612b19848285612ad0565b509392505050565b600082601f830112612b3657612b35612a1a565b5b8135612b46848260208601612adf565b91505092915050565b600060208284031215612b6557612b6461268b565b5b600082013567ffffffffffffffff811115612b8357612b82612690565b5b612b8f84828501612b21565b91505092915050565b600060208284031215612bae57612bad61268b565b5b6000612bbc8482850161290b565b91505092915050565b6000819050919050565b612bd881612bc5565b8114612be357600080fd5b50565b600081359050612bf581612bcf565b92915050565b600060208284031215612c1157612c1061268b565b5b6000612c1f84828501612be6565b91505092915050565b612c3181612bc5565b82525050565b6000602082019050612c4c6000830184612c28565b92915050565b612c5b8161271a565b8114612c6657600080fd5b50565b600081359050612c7881612c52565b92915050565b60008060408385031215612c9557612c9461268b565b5b6000612ca38582860161290b565b9250506020612cb485828601612c69565b9150509250929050565b600067ffffffffffffffff821115612cd957612cd8612a24565b5b602082029050602081019050919050565b600080fd5b6000612d02612cfd84612cbe565b612a84565b90508083825260208201905060208402830185811115612d2557612d24612cea565b5b835b81811015612d4e5780612d3a8882612be6565b845260208401935050602081019050612d27565b5050509392505050565b600082601f830112612d6d57612d6c612a1a565b5b8135612d7d848260208601612cef565b91505092915050565b60008060408385031215612d9d57612d9c61268b565b5b6000612dab858286016129d8565b925050602083013567ffffffffffffffff811115612dcc57612dcb612690565b5b612dd885828601612d58565b9150509250929050565b600067ffffffffffffffff821115612dfd57612dfc612a24565b5b612e06826127d3565b9050602081019050919050565b6000612e26612e2184612de2565b612a84565b905082815260208101848484011115612e4257612e41612a1f565b5b612e4d848285612ad0565b509392505050565b600082601f830112612e6a57612e69612a1a565b5b8135612e7a848260208601612e13565b91505092915050565b60008060008060808587031215612e9d57612e9c61268b565b5b6000612eab8782880161290b565b9450506020612ebc8782880161290b565b9350506040612ecd87828801612856565b925050606085013567ffffffffffffffff811115612eee57612eed612690565b5b612efa87828801612e55565b91505092959194509250565b60008060408385031215612f1d57612f1c61268b565b5b6000612f2b8582860161290b565b9250506020612f3c8582860161290b565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612f8d57607f821691505b60208210811415612fa157612fa0612f46565b5b50919050565b7f4e4f545f415554484f52495a4544000000000000000000000000000000000000600082015250565b6000612fdd600e8361278f565b9150612fe882612fa7565b602082019050919050565b6000602082019050818103600083015261300c81612fd0565b9050919050565b7f57524f4e475f46524f4d00000000000000000000000000000000000000000000600082015250565b6000613049600a8361278f565b915061305482613013565b602082019050919050565b600060208201905081810360008301526130788161303c565b9050919050565b7f494e56414c49445f524543495049454e54000000000000000000000000000000600082015250565b60006130b560118361278f565b91506130c08261307f565b602082019050919050565b600060208201905081810360008301526130e4816130a8565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061312582612750565b915061313083612750565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613165576131646130eb565b5b828201905092915050565b600061317b82612750565b915061318683612750565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156131bf576131be6130eb565b5b828202905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061320060208361278f565b915061320b826131ca565b602082019050919050565b6000602082019050818103600083015261322f816131f3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061329f82612750565b91506132aa83612750565b9250826132ba576132b9613265565b5b828204905092915050565b60006132d082612750565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613303576133026130eb565b5b600182019050919050565b600082825260208201905092915050565b50565b600061332f60008361330e565b915061333a8261331f565b600082019050919050565b600060808201905061335a60008301866128ca565b61336760208301856128ca565b613374604083018461275a565b818103606083015261338581613322565b9050949350505050565b60008151905061339e816126c1565b92915050565b6000602082840312156133ba576133b961268b565b5b60006133c88482850161338f565b91505092915050565b7f554e534146455f524543495049454e5400000000000000000000000000000000600082015250565b600061340760108361278f565b9150613412826133d1565b602082019050919050565b60006020820190508181036000830152613436816133fa565b9050919050565b600081519050919050565b60006134538261343d565b61345d818561330e565b935061346d8185602086016127a0565b613476816127d3565b840191505092915050565b600060808201905061349660008301876128ca565b6134a360208301866128ca565b6134b0604083018561275a565b81810360608301526134c28184613448565b905095945050505050565b600081905092915050565b60008190508160005260206000209050919050565b600081546134fa81612f75565b61350481866134cd565b9450600182166000811461351f576001811461353057613563565b60ff19831686528186019350613563565b613539856134d8565b60005b8381101561355b5781548189015260018201915060208101905061353c565b838801955050505b50505092915050565b600061357782612784565b61358181856134cd565b93506135918185602086016127a0565b80840191505092915050565b60006135a982856134ed565b91506135b5828461356c565b91508190509392505050565b7f414c52454144595f4d494e544544000000000000000000000000000000000000600082015250565b60006135f7600e8361278f565b9150613602826135c1565b602082019050919050565b60006020820190508181036000830152613626816135ea565b9050919050565b60008160601b9050919050565b60006136458261362d565b9050919050565b60006136578261363a565b9050919050565b61366f61366a826128b8565b61364c565b82525050565b6000613681828461365e565b60148201915081905092915050565b6000819050919050565b6136ab6136a682612bc5565b613690565b82525050565b60006136bd828561369a565b6020820191506136cd828461369a565b6020820191508190509392505050565b60006136e882612750565b91506136f383612750565b925082821015613706576137056130eb565b5b828203905092915050565b600061371c82612750565b915061372783612750565b92508261373757613736613265565b5b82820690509291505056fea26469706673582212200c2e0460c844c825d381d5e8c278d78899cae4fd568bd5cfc9fa0091aa270fbf64736f6c634300080b003300000000000000000000000000000000000000000000000000000000000000e0a8050e682d966447aab67ff471d92b34bb47befc79e8f8f06ddd233de6bf3fc90000000000000000000000003f4239321e820d890950df63f8a64192c2f4db930000000000000000000000002967087b17c3a8fd45af40e6965e55aa6cfa418b00000000000000000000000086e43ba422488221276cdb6fb9c8e93ad72edf16000000000000000000000000abeec041894dce885fdc04cbddecee09ce2c53c20000000000000000000000005b588e36ff358d4376a76fb163fd69da02a2a9a5000000000000000000000000000000000000000000000000000000000000004468747470733a2f2f697066732e696f2f697066732f516d57476f6667635a4265436461445538724e697465736742697271686836567061686970736131446e4d6b37762f00000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061020f5760003560e01c80636c0360eb11610118578063a9722cf3116100a0578063c87b56dd1161006f578063c87b56dd14610727578063cd85cdb514610764578063e985e9c51461077b578063f2fde38b146107b8578063f96407fa146107e15761020f565b8063a9722cf3146106a0578063b182e818146106cb578063b70196d7146106e7578063b88d4fde146106fe5761020f565b80638da5cb5b116100e75780638da5cb5b146105cb578063902d55a5146105f657806395d89b4114610621578063a22cb4651461064c578063a2309ff8146106755761020f565b80636c0360eb1461050f57806370a082311461053a578063715018a6146105775780637cb647591461058e5761020f565b80632be095611161019b5780634c2612471161016a5780634c2612471461042a578063518302271461045357806355f804b31461047e5780636352211e146104a757806369eb16a3146104e45761020f565b80632be09561146103a85780632f0d3e20146103bf5780633ccfd60b146103ea57806342842e0e146104015761020f565b8063081812fc116101e2578063081812fc146102d2578063095ea7b31461030f5780631cfddb1f1461033857806323b872dd1461036357806323cf0a221461038c5761020f565b806301ffc9a71461021457806303d8acef14610251578063055ea1411461027c57806306fdde03146102a7575b600080fd5b34801561022057600080fd5b5061023b600480360381019061023691906126ed565b61080c565b6040516102489190612735565b60405180910390f35b34801561025d57600080fd5b506102666108ce565b6040516102739190612769565b60405180910390f35b34801561028857600080fd5b506102916108d4565b60405161029e919061281d565b60405180910390f35b3480156102b357600080fd5b506102bc610962565b6040516102c9919061281d565b60405180910390f35b3480156102de57600080fd5b506102f960048036038101906102f4919061286b565b6109f0565b60405161030691906128d9565b60405180910390f35b34801561031b57600080fd5b5061033660048036038101906103319190612920565b610a23565b005b34801561034457600080fd5b5061034d610c0c565b60405161035a9190612735565b60405180910390f35b34801561036f57600080fd5b5061038a60048036038101906103859190612960565b610c1f565b005b6103a660048036038101906103a191906129ed565b61101f565b005b3480156103b457600080fd5b506103bd611188565b005b3480156103cb57600080fd5b506103d4611233565b6040516103e19190612769565b60405180910390f35b3480156103f657600080fd5b506103ff61123f565b005b34801561040d57600080fd5b5061042860048036038101906104239190612960565b611438565b005b34801561043657600080fd5b50610451600480360381019061044c9190612b4f565b611570565b005b34801561045f57600080fd5b50610468611625565b6040516104759190612735565b60405180910390f35b34801561048a57600080fd5b506104a560048036038101906104a09190612b4f565b611638565b005b3480156104b357600080fd5b506104ce60048036038101906104c9919061286b565b6116e0565b6040516104db91906128d9565b60405180910390f35b3480156104f057600080fd5b506104f9611713565b6040516105069190612769565b60405180910390f35b34801561051b57600080fd5b5061052461171f565b604051610531919061281d565b60405180910390f35b34801561054657600080fd5b50610561600480360381019061055c9190612b98565b6117ad565b60405161056e9190612769565b60405180910390f35b34801561058357600080fd5b5061058c6117c5565b005b34801561059a57600080fd5b506105b560048036038101906105b09190612bfb565b61188d565b6040516105c29190612c37565b60405180910390f35b3480156105d757600080fd5b506105e061192f565b6040516105ed91906128d9565b60405180910390f35b34801561060257600080fd5b5061060b611958565b6040516106189190612769565b60405180910390f35b34801561062d57600080fd5b5061063661195e565b604051610643919061281d565b60405180910390f35b34801561065857600080fd5b50610673600480360381019061066e9190612c7e565b6119ec565b005b34801561068157600080fd5b5061068a611ae9565b6040516106979190612769565b60405180910390f35b3480156106ac57600080fd5b506106b5611aef565b6040516106c29190612735565b60405180910390f35b6106e560048036038101906106e09190612d86565b611b02565b005b3480156106f357600080fd5b506106fc611cbc565b005b34801561070a57600080fd5b5061072560048036038101906107209190612e83565b611d67565b005b34801561073357600080fd5b5061074e6004803603810190610749919061286b565b611ea2565b60405161075b919061281d565b60405180910390f35b34801561077057600080fd5b50610779611fbf565b005b34801561078757600080fd5b506107a2600480360381019061079d9190612f06565b612085565b6040516107af9190612735565b60405180910390f35b3480156107c457600080fd5b506107df60048036038101906107da9190612b98565b6120b4565b005b3480156107ed57600080fd5b506107f661217c565b6040516108039190612769565b60405180910390f35b6000637f5828d060e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061086757506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108975750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108c757506301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60085481565b600d80546108e190612f75565b80601f016020809104026020016040519081016040528092919081815260200182805461090d90612f75565b801561095a5780601f1061092f5761010080835404028352916020019161095a565b820191906000526020600020905b81548152906001019060200180831161093d57829003601f168201915b505050505081565b6001805461096f90612f75565b80601f016020809104026020016040519081016040528092919081815260200182805461099b90612f75565b80156109e85780601f106109bd576101008083540402835291602001916109e8565b820191906000526020600020905b8154815290600101906020018083116109cb57829003601f168201915b505050505081565b60056020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610b1b5750600660008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b610b5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5190612ff3565b60405180910390fd5b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600960009054906101000a900460ff1681565b6004600082815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614610cc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb79061305f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d27906130cb565b60405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610dc857506005600082815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80610e595750600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b610e98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8f90612ff3565b60405180910390fd5b600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815480929190600190039190505550600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506005600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6115b38161ffff16600a54611034919061311a565b111561106c576040517f7364ba1700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600960019054906101000a900460ff166110b2576040517f06290e4e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b670214e8348c4f00008161ffff166110ca9190613170565b341015611103576040517f583aa02600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6008548161ffff161115611143576040517f9defc75000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8161ffff168161ffff16101561118457611165336001600a5401612182565b600a600081548092919060010191905055508080600101915050611146565b5050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120d90613216565b60405180910390fd5b6001600960016101000a81548160ff021916908315150217905550565b670214e8348c4f000081565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146112cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c490613216565b60405180910390fd5b6000471415611308576040517f2313b4b600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600047905060005b600581101561143457600e816005811061132d5761132c613236565b5b0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc6103e860136000600e866005811061138357611382613236565b5b0160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054856113eb9190613170565b6113f59190613294565b9081150290604051600060405180830381858888f19350505050158015611420573d6000803e3d6000fd5b50808061142c906132c5565b915050611310565b5050565b611443838383610c1f565b60008273ffffffffffffffffffffffffffffffffffffffff163b148061152c575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168273ffffffffffffffffffffffffffffffffffffffff1663150b7a023386856040518463ffffffff1660e01b81526004016114c893929190613345565b6020604051808303816000875af11580156114e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061150b91906133a4565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b61156b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115629061341d565b60405180910390fd5b505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146115fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f590613216565b60405180910390fd5b61160781611638565b6001600960026101000a81548160ff02191690831515021790555050565b600960029054906101000a900460ff1681565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146116c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116bd90613216565b60405180910390fd5b80600c90805190602001906116dc9291906125de565b5050565b60046020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b67016345785d8a000081565b600c805461172c90612f75565b80601f016020809104026020016040519081016040528092919081815260200182805461175890612f75565b80156117a55780601f1061177a576101008083540402835291602001916117a5565b820191906000526020600020905b81548152906001019060200180831161178857829003601f168201915b505050505081565b60036020528060005260406000206000915090505481565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461184a576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461191e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191590613216565b60405180910390fd5b81600b81905550600b549050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6115b381565b6002805461196b90612f75565b80601f016020809104026020016040519081016040528092919081815260200182805461199790612f75565b80156119e45780601f106119b9576101008083540402835291602001916119e4565b820191906000526020600020905b8154815290600101906020018083116119c757829003601f168201915b505050505081565b80600660003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611add9190612735565b60405180910390a35050565b600a5481565b600960019054906101000a900460ff1681565b6115b38261ffff16600a54611b17919061311a565b1115611b4f576040517f7364ba1700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600960009054906101000a900460ff16611b95576040517fef4604b300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67016345785d8a00008261ffff16611bad9190613170565b341015611be6576040517f583aa02600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007548261ffff161115611c26576040517f9defc75000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60001515611c3c611c3633612395565b836123c5565b15151415611c76576040517f522fc3bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b8261ffff168161ffff161015611cb757611c98336001600a5401612182565b600a600081548092919060010191905055508080600101915050611c79565b505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d4190613216565b60405180910390fd5b6001600960006101000a81548160ff021916908315150217905550565b611d72848484610c1f565b60008373ffffffffffffffffffffffffffffffffffffffff163b1480611e5d575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168373ffffffffffffffffffffffffffffffffffffffff1663150b7a02338786866040518563ffffffff1660e01b8152600401611df99493929190613481565b6020604051808303816000875af1158015611e18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e3c91906133a4565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b611e9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e939061341d565b60405180910390fd5b50505050565b6060600073ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611f3e576040517fb0ce759100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60001515600960029054906101000a900460ff1615151415611f8c57600d611f658361247d565b604051602001611f7692919061359d565b6040516020818303038152906040529050611fba565b600c611f978361247d565b604051602001611fa892919061359d565b60405160208183030381529060405290505b919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461204d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204490613216565b60405180910390fd5b6000600960006101000a81548160ff0219169083151502179055506000600960016101000a81548160ff021916908315150217905550565b60066020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612139576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60075481565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e9906130cb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612294576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161228b9061360d565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154809291906001019190505550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000816040516020016123a89190613675565b604051602081830303815290604052805190602001209050919050565b60008083905060005b835181101561246e5760008482815181106123ec576123eb613236565b5b602002602001015190508083101561242e5782816040516020016124119291906136b1565b60405160208183030381529060405280519060200120925061245a565b80836040516020016124419291906136b1565b6040516020818303038152906040528051906020012092505b508080612466906132c5565b9150506123ce565b50600b54811491505092915050565b606060008214156124c5576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506125d9565b600082905060005b600082146124f75780806124e0906132c5565b915050600a826124f09190613294565b91506124cd565b60008167ffffffffffffffff81111561251357612512612a24565b5b6040519080825280601f01601f1916602001820160405280156125455781602001600182028036833780820191505090505b5090505b600085146125d25760018261255e91906136dd565b9150600a8561256d9190613711565b6030612579919061311a565b60f81b81838151811061258f5761258e613236565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856125cb9190613294565b9450612549565b8093505050505b919050565b8280546125ea90612f75565b90600052602060002090601f01602090048101928261260c5760008555612653565b82601f1061262557805160ff1916838001178555612653565b82800160010185558215612653579182015b82811115612652578251825591602001919060010190612637565b5b5090506126609190612664565b5090565b5b8082111561267d576000816000905550600101612665565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6126ca81612695565b81146126d557600080fd5b50565b6000813590506126e7816126c1565b92915050565b6000602082840312156127035761270261268b565b5b6000612711848285016126d8565b91505092915050565b60008115159050919050565b61272f8161271a565b82525050565b600060208201905061274a6000830184612726565b92915050565b6000819050919050565b61276381612750565b82525050565b600060208201905061277e600083018461275a565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156127be5780820151818401526020810190506127a3565b838111156127cd576000848401525b50505050565b6000601f19601f8301169050919050565b60006127ef82612784565b6127f9818561278f565b93506128098185602086016127a0565b612812816127d3565b840191505092915050565b6000602082019050818103600083015261283781846127e4565b905092915050565b61284881612750565b811461285357600080fd5b50565b6000813590506128658161283f565b92915050565b6000602082840312156128815761288061268b565b5b600061288f84828501612856565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006128c382612898565b9050919050565b6128d3816128b8565b82525050565b60006020820190506128ee60008301846128ca565b92915050565b6128fd816128b8565b811461290857600080fd5b50565b60008135905061291a816128f4565b92915050565b600080604083850312156129375761293661268b565b5b60006129458582860161290b565b925050602061295685828601612856565b9150509250929050565b6000806000606084860312156129795761297861268b565b5b60006129878682870161290b565b93505060206129988682870161290b565b92505060406129a986828701612856565b9150509250925092565b600061ffff82169050919050565b6129ca816129b3565b81146129d557600080fd5b50565b6000813590506129e7816129c1565b92915050565b600060208284031215612a0357612a0261268b565b5b6000612a11848285016129d8565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612a5c826127d3565b810181811067ffffffffffffffff82111715612a7b57612a7a612a24565b5b80604052505050565b6000612a8e612681565b9050612a9a8282612a53565b919050565b600067ffffffffffffffff821115612aba57612ab9612a24565b5b612ac3826127d3565b9050602081019050919050565b82818337600083830152505050565b6000612af2612aed84612a9f565b612a84565b905082815260208101848484011115612b0e57612b0d612a1f565b5b612b19848285612ad0565b509392505050565b600082601f830112612b3657612b35612a1a565b5b8135612b46848260208601612adf565b91505092915050565b600060208284031215612b6557612b6461268b565b5b600082013567ffffffffffffffff811115612b8357612b82612690565b5b612b8f84828501612b21565b91505092915050565b600060208284031215612bae57612bad61268b565b5b6000612bbc8482850161290b565b91505092915050565b6000819050919050565b612bd881612bc5565b8114612be357600080fd5b50565b600081359050612bf581612bcf565b92915050565b600060208284031215612c1157612c1061268b565b5b6000612c1f84828501612be6565b91505092915050565b612c3181612bc5565b82525050565b6000602082019050612c4c6000830184612c28565b92915050565b612c5b8161271a565b8114612c6657600080fd5b50565b600081359050612c7881612c52565b92915050565b60008060408385031215612c9557612c9461268b565b5b6000612ca38582860161290b565b9250506020612cb485828601612c69565b9150509250929050565b600067ffffffffffffffff821115612cd957612cd8612a24565b5b602082029050602081019050919050565b600080fd5b6000612d02612cfd84612cbe565b612a84565b90508083825260208201905060208402830185811115612d2557612d24612cea565b5b835b81811015612d4e5780612d3a8882612be6565b845260208401935050602081019050612d27565b5050509392505050565b600082601f830112612d6d57612d6c612a1a565b5b8135612d7d848260208601612cef565b91505092915050565b60008060408385031215612d9d57612d9c61268b565b5b6000612dab858286016129d8565b925050602083013567ffffffffffffffff811115612dcc57612dcb612690565b5b612dd885828601612d58565b9150509250929050565b600067ffffffffffffffff821115612dfd57612dfc612a24565b5b612e06826127d3565b9050602081019050919050565b6000612e26612e2184612de2565b612a84565b905082815260208101848484011115612e4257612e41612a1f565b5b612e4d848285612ad0565b509392505050565b600082601f830112612e6a57612e69612a1a565b5b8135612e7a848260208601612e13565b91505092915050565b60008060008060808587031215612e9d57612e9c61268b565b5b6000612eab8782880161290b565b9450506020612ebc8782880161290b565b9350506040612ecd87828801612856565b925050606085013567ffffffffffffffff811115612eee57612eed612690565b5b612efa87828801612e55565b91505092959194509250565b60008060408385031215612f1d57612f1c61268b565b5b6000612f2b8582860161290b565b9250506020612f3c8582860161290b565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612f8d57607f821691505b60208210811415612fa157612fa0612f46565b5b50919050565b7f4e4f545f415554484f52495a4544000000000000000000000000000000000000600082015250565b6000612fdd600e8361278f565b9150612fe882612fa7565b602082019050919050565b6000602082019050818103600083015261300c81612fd0565b9050919050565b7f57524f4e475f46524f4d00000000000000000000000000000000000000000000600082015250565b6000613049600a8361278f565b915061305482613013565b602082019050919050565b600060208201905081810360008301526130788161303c565b9050919050565b7f494e56414c49445f524543495049454e54000000000000000000000000000000600082015250565b60006130b560118361278f565b91506130c08261307f565b602082019050919050565b600060208201905081810360008301526130e4816130a8565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061312582612750565b915061313083612750565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613165576131646130eb565b5b828201905092915050565b600061317b82612750565b915061318683612750565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156131bf576131be6130eb565b5b828202905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061320060208361278f565b915061320b826131ca565b602082019050919050565b6000602082019050818103600083015261322f816131f3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061329f82612750565b91506132aa83612750565b9250826132ba576132b9613265565b5b828204905092915050565b60006132d082612750565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613303576133026130eb565b5b600182019050919050565b600082825260208201905092915050565b50565b600061332f60008361330e565b915061333a8261331f565b600082019050919050565b600060808201905061335a60008301866128ca565b61336760208301856128ca565b613374604083018461275a565b818103606083015261338581613322565b9050949350505050565b60008151905061339e816126c1565b92915050565b6000602082840312156133ba576133b961268b565b5b60006133c88482850161338f565b91505092915050565b7f554e534146455f524543495049454e5400000000000000000000000000000000600082015250565b600061340760108361278f565b9150613412826133d1565b602082019050919050565b60006020820190508181036000830152613436816133fa565b9050919050565b600081519050919050565b60006134538261343d565b61345d818561330e565b935061346d8185602086016127a0565b613476816127d3565b840191505092915050565b600060808201905061349660008301876128ca565b6134a360208301866128ca565b6134b0604083018561275a565b81810360608301526134c28184613448565b905095945050505050565b600081905092915050565b60008190508160005260206000209050919050565b600081546134fa81612f75565b61350481866134cd565b9450600182166000811461351f576001811461353057613563565b60ff19831686528186019350613563565b613539856134d8565b60005b8381101561355b5781548189015260018201915060208101905061353c565b838801955050505b50505092915050565b600061357782612784565b61358181856134cd565b93506135918185602086016127a0565b80840191505092915050565b60006135a982856134ed565b91506135b5828461356c565b91508190509392505050565b7f414c52454144595f4d494e544544000000000000000000000000000000000000600082015250565b60006135f7600e8361278f565b9150613602826135c1565b602082019050919050565b60006020820190508181036000830152613626816135ea565b9050919050565b60008160601b9050919050565b60006136458261362d565b9050919050565b60006136578261363a565b9050919050565b61366f61366a826128b8565b61364c565b82525050565b6000613681828461365e565b60148201915081905092915050565b6000819050919050565b6136ab6136a682612bc5565b613690565b82525050565b60006136bd828561369a565b6020820191506136cd828461369a565b6020820191508190509392505050565b60006136e882612750565b91506136f383612750565b925082821015613706576137056130eb565b5b828203905092915050565b600061371c82612750565b915061372783612750565b92508261373757613736613265565b5b82820690509291505056fea26469706673582212200c2e0460c844c825d381d5e8c278d78899cae4fd568bd5cfc9fa0091aa270fbf64736f6c634300080b0033

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

00000000000000000000000000000000000000000000000000000000000000e0a8050e682d966447aab67ff471d92b34bb47befc79e8f8f06ddd233de6bf3fc90000000000000000000000003f4239321e820d890950df63f8a64192c2f4db930000000000000000000000002967087b17c3a8fd45af40e6965e55aa6cfa418b00000000000000000000000086e43ba422488221276cdb6fb9c8e93ad72edf16000000000000000000000000abeec041894dce885fdc04cbddecee09ce2c53c20000000000000000000000005b588e36ff358d4376a76fb163fd69da02a2a9a5000000000000000000000000000000000000000000000000000000000000004468747470733a2f2f697066732e696f2f697066732f516d57476f6667635a4265436461445538724e697465736742697271686836567061686970736131446e4d6b37762f00000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _nonRevealedURI (string): https://ipfs.io/ipfs/QmWGofgcZBeCdaDU8rNitesgBirqhh6Vpahipsa1DnMk7v/
Arg [1] : _initMerkleRoot (bytes32): 0xa8050e682d966447aab67ff471d92b34bb47befc79e8f8f06ddd233de6bf3fc9
Arg [2] : _contributorAddresses (address[5]): 0x3F4239321E820d890950dF63f8A64192C2F4dB93,0x2967087B17C3A8fd45aF40e6965E55aa6cfA418b,0x86e43ba422488221276CDb6Fb9C8e93AD72EdF16,0xAbEec041894DCE885fdc04cbDDecEE09CE2C53c2,0x5B588e36FF358D4376A76FB163fd69Da02A2A9a5

-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [1] : a8050e682d966447aab67ff471d92b34bb47befc79e8f8f06ddd233de6bf3fc9
Arg [2] : 0000000000000000000000003f4239321e820d890950df63f8a64192c2f4db93
Arg [3] : 0000000000000000000000002967087b17c3a8fd45af40e6965e55aa6cfa418b
Arg [4] : 00000000000000000000000086e43ba422488221276cdb6fb9c8e93ad72edf16
Arg [5] : 000000000000000000000000abeec041894dce885fdc04cbddecee09ce2c53c2
Arg [6] : 0000000000000000000000005b588e36ff358d4376a76fb163fd69da02a2a9a5
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000044
Arg [8] : 68747470733a2f2f697066732e696f2f697066732f516d57476f6667635a4265
Arg [9] : 436461445538724e697465736742697271686836567061686970736131446e4d
Arg [10] : 6b37762f00000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

28756:6289:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34564:478;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29064:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29333:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2724:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3177:46;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3804:289;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29112:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4316:764;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31799:527;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33595:75;;;;;;;;;;;;;:::i;:::-;;28950:58;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34103:380;;;;;;;;;;;;;:::i;:::-;;5088:409;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33801:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29197:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33378:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3126:42;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28883:60;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29305:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3073:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;570:130;;;;;;;;;;;;;:::i;:::-;;33931:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;325:81;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28833:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2751:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4101:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29234:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29159:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32334:684;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33490:93;;;;;;;;;;;;;:::i;:::-;;5505:439;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33026:344;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33678:115;;;;;;;;;;;;;:::i;:::-;;3232:68;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;414:148;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29015:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34564:478;34697:4;34754:10;34739:25;;:11;:25;;;;:101;;;;34830:10;34815:25;;:11;:25;;;;34739:101;:177;;;;34906:10;34891:25;;:11;:25;;;;34739:177;:253;;;;34982:10;34967:25;;:11;:25;;;;34739:253;34719:273;;34564:478;;;:::o;29064:39::-;;;;:::o;29333:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2724:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3177:46::-;;;;;;;;;;;;;;;;;;;;;;:::o;3804:289::-;3876:13;3892:7;:11;3900:2;3892:11;;;;;;;;;;;;;;;;;;;;;3876:27;;3938:5;3924:19;;:10;:19;;;:58;;;;3947:16;:23;3964:5;3947:23;;;;;;;;;;;;;;;:35;3971:10;3947:35;;;;;;;;;;;;;;;;;;;;;;;;;3924:58;3916:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;4032:7;4014:11;:15;4026:2;4014:15;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;4082:2;4073:7;4057:28;;4066:5;4057:28;;;;;;;;;;;;3865:228;3804:289;;:::o;29112:40::-;;;;;;;;;;;;;:::o;4316:764::-;4452:7;:11;4460:2;4452:11;;;;;;;;;;;;;;;;;;;;;4444:19;;:4;:19;;;4436:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;4513:1;4499:16;;:2;:16;;;;4491:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;4586:4;4572:18;;:10;:18;;;:51;;;;4608:11;:15;4620:2;4608:15;;;;;;;;;;;;;;;;;;;;;4594:29;;:10;:29;;;4572:51;:89;;;;4627:16;:22;4644:4;4627:22;;;;;;;;;;;;;;;:34;4650:10;4627:34;;;;;;;;;;;;;;;;;;;;;;;;;4572:89;4550:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;4908:9;:15;4918:4;4908:15;;;;;;;;;;;;;;;;:17;;;;;;;;;;;;;;4942:9;:13;4952:2;4942:13;;;;;;;;;;;;;;;;:15;;;;;;;;;;;;;4995:2;4981:7;:11;4989:2;4981:11;;;;;;;;;;;;:16;;;;;;;;;;;;;;;;;;5017:11;:15;5029:2;5017:15;;;;;;;;;;;;5010:22;;;;;;;;;;;5069:2;5065;5050:22;;5059:4;5050:22;;;;;;;;;;;;4316:764;;;:::o;31799:527::-;28872:4;31874:6;31860:20;;:11;;:20;;;;:::i;:::-;:35;31856:62;;;31904:14;;;;;;;;;;;;;;31856:62;31934:11;;;;;;;;;;;31929:41;;31954:16;;;;;;;;;;;;;;31929:41;28998:10;31997:6;:30;;;;;;:::i;:::-;31985:9;:42;31981:69;;;32036:14;;;;;;;;;;;;;;31981:69;32074:19;;32065:6;:28;;;32061:60;;;32102:19;;;;;;;;;;;;;;32061:60;32164:12;32159:149;32190:6;32182:14;;:5;:14;;;32159:149;;;32226:34;32232:10;32258:1;32244:11;;:15;32226:5;:34::i;:::-;32279:11;;:13;;;;;;;;;;;;;32198:7;;;;;;;32159:149;;;;31799:527;:::o;33595:75::-;29528:6;;;;;;;;;;29514:20;;:10;:20;;;29506:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;33658:4:::1;33644:11;;:18;;;;;;;;;;;;;;;;;;33595:75::o:0;28950:58::-;28998:10;28950:58;:::o;34103:380::-;29528:6;;;;;;;;;;29514:20;;:10;:20;;;29506:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;34182:1:::1;34157:21;:26;34153:53;;;34192:14;;;;;;;;;;;;;;34153:53;34217:15;34235:21;34217:39;;34274:9;34269:207;34293:24;34289:1;:28;34269:207;;;34347:17;34365:1;34347:20;;;;;;;:::i;:::-;;;;;;;;;;;;;34339:38;;:125;34445:4;34406:14;:36;34421:17;34439:1;34421:20;;;;;;;:::i;:::-;;;;;;;;;;;;;34406:36;;;;;;;;;;;;;;;;34396:7;:46;;;;:::i;:::-;:53;;;;:::i;:::-;34339:125;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;34319:3;;;;;:::i;:::-;;;;34269:207;;;;34142:341;34103:380::o:0;5088:409::-;5212:26;5225:4;5231:2;5235;5212:12;:26::i;:::-;5291:1;5273:2;:14;;;:19;:172;;;;5400:45;;;5313:132;;;5333:2;5313:40;;;5354:10;5366:4;5372:2;5313:66;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:132;;;;5273:172;5251:238;;;;;;;;;;;;:::i;:::-;;;;;;;;;5088:409;;;:::o;33801:122::-;29528:6;;;;;;;;;;29514:20;;:10;:20;;;29506:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;33869:20:::1;33880:8;33869:10;:20::i;:::-;33911:4;33900:8;;:15;;;;;;;;;;;;;;;;;;33801:122:::0;:::o;29197:28::-;;;;;;;;;;;;;:::o;33378:104::-;29528:6;;;;;;;;;;29514:20;;:10;:20;;;29506:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;33463:11:::1;33453:7;:21;;;;;;;;;;;;:::i;:::-;;33378:104:::0;:::o;3126:42::-;;;;;;;;;;;;;;;;;;;;;;:::o;28883:60::-;28934:9;28883:60;:::o;29305:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3073:44::-;;;;;;;;;;;;;;;;;:::o;570:130::-;635:6;;;;;;;;;;621:20;;:10;:20;;;617:43;;650:10;;;;;;;;;;;;;;617:43;690:1;673:6;;:19;;;;;;;;;;;;;;;;;;570:130::o;33931:164::-;34008:7;29528:6;;;;;;;;;;;29514:20;;:10;:20;;;29506:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;34042:16:::1;34028:11;:30;;;;34076:11;;34069:18;;33931:164:::0;;;:::o;325:81::-;365:7;392:6;;;;;;;;;;;385:13;;325:81;:::o;28833:43::-;28872:4;28833:43;:::o;2751:20::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4101:207::-;4228:8;4187:16;:28;4204:10;4187:28;;;;;;;;;;;;;;;:38;4216:8;4187:38;;;;;;;;;;;;;;;;:49;;;;;;;;;;;;;;;;;;4281:8;4254:46;;4269:10;4254:46;;;4291:8;4254:46;;;;;;:::i;:::-;;;;;;;;4101:207;;:::o;29234:26::-;;;;:::o;29159:31::-;;;;;;;;;;;;;:::o;32334:684::-;28872:4;32443:6;32429:20;;:11;;:20;;;;:::i;:::-;:35;32425:62;;;32473:14;;;;;;;;;;;;;;32425:62;32503:20;;;;;;;;;;;32498:59;;32532:25;;;;;;;;;;;;;;32498:59;28934:9;32584:6;:33;;;;;;:::i;:::-;32572:9;:45;32568:72;;;32626:14;;;;;;;;;;;;;;32568:72;32664:22;;32655:6;:31;;;32651:63;;;32695:19;;;;;;;;;;;;;;32651:63;32775:5;32729:51;;:42;32745:17;32751:10;32745:5;:17::i;:::-;32764:6;32729:15;:42::i;:::-;:51;;;32725:80;;;32789:16;;;;;;;;;;;;;;32725:80;32856:12;32851:149;32882:6;32874:14;;:5;:14;;;32851:149;;;32918:34;32924:10;32950:1;32936:11;;:15;32918:5;:34::i;:::-;32971:11;;:13;;;;;;;;;;;;;32890:7;;;;;;;32851:149;;;;32334:684;;:::o;33490:93::-;29528:6;;;;;;;;;;29514:20;;:10;:20;;;29506:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;33571:4:::1;33548:20;;:27;;;;;;;;;;;;;;;;;;33490:93::o:0;5505:439::-;5657:26;5670:4;5676:2;5680;5657:12;:26::i;:::-;5736:1;5718:2;:14;;;:19;:174;;;;5847:45;;;5758:134;;;5778:2;5758:40;;;5799:10;5811:4;5817:2;5821:4;5758:68;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:134;;;;5718:174;5696:240;;;;;;;;;;;;:::i;:::-;;;;;;;;;5505:439;;;;:::o;33026:344::-;33094:13;33147:1;33124:25;;:7;:11;33132:2;33124:11;;;;;;;;;;;;;;;;;;;;;:25;;;33120:52;;;33158:14;;;;;;;;;;;;;;33120:52;33201:5;33189:17;;:8;;;;;;;;;;;:17;;;33185:112;;;33254:14;33270:13;:2;:11;:13::i;:::-;33237:47;;;;;;;;;:::i;:::-;;;;;;;;;;;;;33223:62;;;;33185:112;33338:7;33347:13;:2;:11;:13::i;:::-;33321:40;;;;;;;;;:::i;:::-;;;;;;;;;;;;;33307:55;;33026:344;;;;:::o;33678:115::-;29528:6;;;;;;;;;;29514:20;;:10;:20;;;29506:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;33750:5:::1;33727:20;;:28;;;;;;;;;;;;;;;;;;33780:5;33766:11;;:19;;;;;;;;;;;;;;;;;;33678:115::o:0;3232:68::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;414:148::-;498:6;;;;;;;;;;484:20;;:10;:20;;;480:43;;513:10;;;;;;;;;;;;;;480:43;545:9;536:6;;:18;;;;;;;;;;;;;;;;;;414:148;:::o;29015:42::-;;;;:::o;6679:381::-;6768:1;6754:16;;:2;:16;;;;6746:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;6836:1;6813:25;;:7;:11;6821:2;6813:11;;;;;;;;;;;;;;;;;;;;;:25;;;6805:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;6951:9;:13;6961:2;6951:13;;;;;;;;;;;;;;;;:15;;;;;;;;;;;;;7004:2;6990:7;:11;6998:2;6990:11;;;;;;;;;;;;:16;;;;;;;;;;;;;;;;;;7049:2;7045;7024:28;;7041:1;7024:28;;;;;;;;;;;;6679:381;;:::o;30770:125::-;30824:7;30878;30861:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;30851:36;;;;;;30844:43;;30770:125;;;:::o;31149:642::-;31234:4;31251:20;31274:4;31251:27;;31296:9;31291:446;31315:5;:12;31311:1;:16;31291:446;;;31349:20;31372:5;31378:1;31372:8;;;;;;;;:::i;:::-;;;;;;;;31349:31;;31416:12;31401;:27;31397:329;;;31513:12;31527;31496:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;31464:95;;;;;;31449:110;;31397:329;;;31664:12;31678;31647:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;31615:95;;;;;;31600:110;;31397:329;31334:403;31329:3;;;;;:::i;:::-;;;;31291:446;;;;31772:11;;31756:12;:27;31749:34;;;31149:642;;;;:::o;1046:723::-;1102:13;1332:1;1323:5;:10;1319:53;;;1350:10;;;;;;;;;;;;;;;;;;;;;1319:53;1382:12;1397:5;1382:20;;1413:14;1438:78;1453:1;1445:4;:9;1438:78;;1471:8;;;;;:::i;:::-;;;;1502:2;1494:10;;;;;:::i;:::-;;;1438:78;;;1526:19;1558:6;1548:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1526:39;;1576:154;1592:1;1583:5;:10;1576:154;;1620:1;1610:11;;;;;:::i;:::-;;;1687:2;1679:5;:10;;;;:::i;:::-;1666:2;:24;;;;:::i;:::-;1653:39;;1636:6;1643;1636:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1716:2;1707:11;;;;;:::i;:::-;;;1576:154;;;1754:6;1740:21;;;;;1046:723;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:77::-;1555:7;1584:5;1573:16;;1518:77;;;:::o;1601:118::-;1688:24;1706:5;1688:24;:::i;:::-;1683:3;1676:37;1601:118;;:::o;1725:222::-;1818:4;1856:2;1845:9;1841:18;1833:26;;1869:71;1937:1;1926:9;1922:17;1913:6;1869:71;:::i;:::-;1725:222;;;;:::o;1953:99::-;2005:6;2039:5;2033:12;2023:22;;1953:99;;;:::o;2058:169::-;2142:11;2176:6;2171:3;2164:19;2216:4;2211:3;2207:14;2192:29;;2058:169;;;;:::o;2233:307::-;2301:1;2311:113;2325:6;2322:1;2319:13;2311:113;;;2410:1;2405:3;2401:11;2395:18;2391:1;2386:3;2382:11;2375:39;2347:2;2344:1;2340:10;2335:15;;2311:113;;;2442:6;2439:1;2436:13;2433:101;;;2522:1;2513:6;2508:3;2504:16;2497:27;2433:101;2282:258;2233:307;;;:::o;2546:102::-;2587:6;2638:2;2634:7;2629:2;2622:5;2618:14;2614:28;2604:38;;2546:102;;;:::o;2654:364::-;2742:3;2770:39;2803:5;2770:39;:::i;:::-;2825:71;2889:6;2884:3;2825:71;:::i;:::-;2818:78;;2905:52;2950:6;2945:3;2938:4;2931:5;2927:16;2905:52;:::i;:::-;2982:29;3004:6;2982:29;:::i;:::-;2977:3;2973:39;2966:46;;2746:272;2654:364;;;;:::o;3024:313::-;3137:4;3175:2;3164:9;3160:18;3152:26;;3224:9;3218:4;3214:20;3210:1;3199:9;3195:17;3188:47;3252:78;3325:4;3316:6;3252:78;:::i;:::-;3244:86;;3024:313;;;;:::o;3343:122::-;3416:24;3434:5;3416:24;:::i;:::-;3409:5;3406:35;3396:63;;3455:1;3452;3445:12;3396:63;3343:122;:::o;3471:139::-;3517:5;3555:6;3542:20;3533:29;;3571:33;3598:5;3571:33;:::i;:::-;3471:139;;;;:::o;3616:329::-;3675:6;3724:2;3712:9;3703:7;3699:23;3695:32;3692:119;;;3730:79;;:::i;:::-;3692:119;3850:1;3875:53;3920:7;3911:6;3900:9;3896:22;3875:53;:::i;:::-;3865:63;;3821:117;3616:329;;;;:::o;3951:126::-;3988:7;4028:42;4021:5;4017:54;4006:65;;3951:126;;;:::o;4083:96::-;4120:7;4149:24;4167:5;4149:24;:::i;:::-;4138:35;;4083:96;;;:::o;4185:118::-;4272:24;4290:5;4272:24;:::i;:::-;4267:3;4260:37;4185:118;;:::o;4309:222::-;4402:4;4440:2;4429:9;4425:18;4417:26;;4453:71;4521:1;4510:9;4506:17;4497:6;4453:71;:::i;:::-;4309:222;;;;:::o;4537:122::-;4610:24;4628:5;4610:24;:::i;:::-;4603:5;4600:35;4590:63;;4649:1;4646;4639:12;4590:63;4537:122;:::o;4665:139::-;4711:5;4749:6;4736:20;4727:29;;4765:33;4792:5;4765:33;:::i;:::-;4665:139;;;;:::o;4810:474::-;4878:6;4886;4935:2;4923:9;4914:7;4910:23;4906:32;4903:119;;;4941:79;;:::i;:::-;4903:119;5061:1;5086:53;5131:7;5122:6;5111:9;5107:22;5086:53;:::i;:::-;5076:63;;5032:117;5188:2;5214:53;5259:7;5250:6;5239:9;5235:22;5214:53;:::i;:::-;5204:63;;5159:118;4810:474;;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:89::-;5951:7;5991:6;5984:5;5980:18;5969:29;;5915:89;;;:::o;6010:120::-;6082:23;6099:5;6082:23;:::i;:::-;6075:5;6072:34;6062:62;;6120:1;6117;6110:12;6062:62;6010:120;:::o;6136:137::-;6181:5;6219:6;6206:20;6197:29;;6235:32;6261:5;6235:32;:::i;:::-;6136:137;;;;:::o;6279:327::-;6337:6;6386:2;6374:9;6365:7;6361:23;6357:32;6354:119;;;6392:79;;:::i;:::-;6354:119;6512:1;6537:52;6581:7;6572:6;6561:9;6557:22;6537:52;:::i;:::-;6527:62;;6483:116;6279:327;;;;:::o;6612:117::-;6721:1;6718;6711:12;6735:117;6844:1;6841;6834:12;6858:180;6906:77;6903:1;6896:88;7003:4;7000:1;6993:15;7027:4;7024:1;7017:15;7044:281;7127:27;7149:4;7127:27;:::i;:::-;7119:6;7115:40;7257:6;7245:10;7242:22;7221:18;7209:10;7206:34;7203:62;7200:88;;;7268:18;;:::i;:::-;7200:88;7308:10;7304:2;7297:22;7087:238;7044:281;;:::o;7331:129::-;7365:6;7392:20;;:::i;:::-;7382:30;;7421:33;7449:4;7441:6;7421:33;:::i;:::-;7331:129;;;:::o;7466:308::-;7528:4;7618:18;7610:6;7607:30;7604:56;;;7640:18;;:::i;:::-;7604:56;7678:29;7700:6;7678:29;:::i;:::-;7670:37;;7762:4;7756;7752:15;7744:23;;7466:308;;;:::o;7780:154::-;7864:6;7859:3;7854;7841:30;7926:1;7917:6;7912:3;7908:16;7901:27;7780:154;;;:::o;7940:412::-;8018:5;8043:66;8059:49;8101:6;8059:49;:::i;:::-;8043:66;:::i;:::-;8034:75;;8132:6;8125:5;8118:21;8170:4;8163:5;8159:16;8208:3;8199:6;8194:3;8190:16;8187:25;8184:112;;;8215:79;;:::i;:::-;8184:112;8305:41;8339:6;8334:3;8329;8305:41;:::i;:::-;8024:328;7940:412;;;;;:::o;8372:340::-;8428:5;8477:3;8470:4;8462:6;8458:17;8454:27;8444:122;;8485:79;;:::i;:::-;8444:122;8602:6;8589:20;8627:79;8702:3;8694:6;8687:4;8679:6;8675:17;8627:79;:::i;:::-;8618:88;;8434:278;8372:340;;;;:::o;8718:509::-;8787:6;8836:2;8824:9;8815:7;8811:23;8807:32;8804:119;;;8842:79;;:::i;:::-;8804:119;8990:1;8979:9;8975:17;8962:31;9020:18;9012:6;9009:30;9006:117;;;9042:79;;:::i;:::-;9006:117;9147:63;9202:7;9193:6;9182:9;9178:22;9147:63;:::i;:::-;9137:73;;8933:287;8718:509;;;;:::o;9233:329::-;9292:6;9341:2;9329:9;9320:7;9316:23;9312:32;9309:119;;;9347:79;;:::i;:::-;9309:119;9467:1;9492:53;9537:7;9528:6;9517:9;9513:22;9492:53;:::i;:::-;9482:63;;9438:117;9233:329;;;;:::o;9568:77::-;9605:7;9634:5;9623:16;;9568:77;;;:::o;9651:122::-;9724:24;9742:5;9724:24;:::i;:::-;9717:5;9714:35;9704:63;;9763:1;9760;9753:12;9704:63;9651:122;:::o;9779:139::-;9825:5;9863:6;9850:20;9841:29;;9879:33;9906:5;9879:33;:::i;:::-;9779:139;;;;:::o;9924:329::-;9983:6;10032:2;10020:9;10011:7;10007:23;10003:32;10000:119;;;10038:79;;:::i;:::-;10000:119;10158:1;10183:53;10228:7;10219:6;10208:9;10204:22;10183:53;:::i;:::-;10173:63;;10129:117;9924:329;;;;:::o;10259:118::-;10346:24;10364:5;10346:24;:::i;:::-;10341:3;10334:37;10259:118;;:::o;10383:222::-;10476:4;10514:2;10503:9;10499:18;10491:26;;10527:71;10595:1;10584:9;10580:17;10571:6;10527:71;:::i;:::-;10383:222;;;;:::o;10611:116::-;10681:21;10696:5;10681:21;:::i;:::-;10674:5;10671:32;10661:60;;10717:1;10714;10707:12;10661:60;10611:116;:::o;10733:133::-;10776:5;10814:6;10801:20;10792:29;;10830:30;10854:5;10830:30;:::i;:::-;10733:133;;;;:::o;10872:468::-;10937:6;10945;10994:2;10982:9;10973:7;10969:23;10965:32;10962:119;;;11000:79;;:::i;:::-;10962:119;11120:1;11145:53;11190:7;11181:6;11170:9;11166:22;11145:53;:::i;:::-;11135:63;;11091:117;11247:2;11273:50;11315:7;11306:6;11295:9;11291:22;11273:50;:::i;:::-;11263:60;;11218:115;10872:468;;;;;:::o;11346:311::-;11423:4;11513:18;11505:6;11502:30;11499:56;;;11535:18;;:::i;:::-;11499:56;11585:4;11577:6;11573:17;11565:25;;11645:4;11639;11635:15;11627:23;;11346:311;;;:::o;11663:117::-;11772:1;11769;11762:12;11803:710;11899:5;11924:81;11940:64;11997:6;11940:64;:::i;:::-;11924:81;:::i;:::-;11915:90;;12025:5;12054:6;12047:5;12040:21;12088:4;12081:5;12077:16;12070:23;;12141:4;12133:6;12129:17;12121:6;12117:30;12170:3;12162:6;12159:15;12156:122;;;12189:79;;:::i;:::-;12156:122;12304:6;12287:220;12321:6;12316:3;12313:15;12287:220;;;12396:3;12425:37;12458:3;12446:10;12425:37;:::i;:::-;12420:3;12413:50;12492:4;12487:3;12483:14;12476:21;;12363:144;12347:4;12342:3;12338:14;12331:21;;12287:220;;;12291:21;11905:608;;11803:710;;;;;:::o;12536:370::-;12607:5;12656:3;12649:4;12641:6;12637:17;12633:27;12623:122;;12664:79;;:::i;:::-;12623:122;12781:6;12768:20;12806:94;12896:3;12888:6;12881:4;12873:6;12869:17;12806:94;:::i;:::-;12797:103;;12613:293;12536:370;;;;:::o;12912:682::-;13004:6;13012;13061:2;13049:9;13040:7;13036:23;13032:32;13029:119;;;13067:79;;:::i;:::-;13029:119;13187:1;13212:52;13256:7;13247:6;13236:9;13232:22;13212:52;:::i;:::-;13202:62;;13158:116;13341:2;13330:9;13326:18;13313:32;13372:18;13364:6;13361:30;13358:117;;;13394:79;;:::i;:::-;13358:117;13499:78;13569:7;13560:6;13549:9;13545:22;13499:78;:::i;:::-;13489:88;;13284:303;12912:682;;;;;:::o;13600:307::-;13661:4;13751:18;13743:6;13740:30;13737:56;;;13773:18;;:::i;:::-;13737:56;13811:29;13833:6;13811:29;:::i;:::-;13803:37;;13895:4;13889;13885:15;13877:23;;13600:307;;;:::o;13913:410::-;13990:5;14015:65;14031:48;14072:6;14031:48;:::i;:::-;14015:65;:::i;:::-;14006:74;;14103:6;14096:5;14089:21;14141:4;14134:5;14130:16;14179:3;14170:6;14165:3;14161:16;14158:25;14155:112;;;14186:79;;:::i;:::-;14155:112;14276:41;14310:6;14305:3;14300;14276:41;:::i;:::-;13996:327;13913:410;;;;;:::o;14342:338::-;14397:5;14446:3;14439:4;14431:6;14427:17;14423:27;14413:122;;14454:79;;:::i;:::-;14413:122;14571:6;14558:20;14596:78;14670:3;14662:6;14655:4;14647:6;14643:17;14596:78;:::i;:::-;14587:87;;14403:277;14342:338;;;;:::o;14686:943::-;14781:6;14789;14797;14805;14854:3;14842:9;14833:7;14829:23;14825:33;14822:120;;;14861:79;;:::i;:::-;14822:120;14981:1;15006:53;15051:7;15042:6;15031:9;15027:22;15006:53;:::i;:::-;14996:63;;14952:117;15108:2;15134:53;15179:7;15170:6;15159:9;15155:22;15134:53;:::i;:::-;15124:63;;15079:118;15236:2;15262:53;15307:7;15298:6;15287:9;15283:22;15262:53;:::i;:::-;15252:63;;15207:118;15392:2;15381:9;15377:18;15364:32;15423:18;15415:6;15412:30;15409:117;;;15445:79;;:::i;:::-;15409:117;15550:62;15604:7;15595:6;15584:9;15580:22;15550:62;:::i;:::-;15540:72;;15335:287;14686:943;;;;;;;:::o;15635:474::-;15703:6;15711;15760:2;15748:9;15739:7;15735:23;15731:32;15728:119;;;15766:79;;:::i;:::-;15728:119;15886:1;15911:53;15956:7;15947:6;15936:9;15932:22;15911:53;:::i;:::-;15901:63;;15857:117;16013:2;16039:53;16084:7;16075:6;16064:9;16060:22;16039:53;:::i;:::-;16029:63;;15984:118;15635:474;;;;;:::o;16115:180::-;16163:77;16160:1;16153:88;16260:4;16257:1;16250:15;16284:4;16281:1;16274:15;16301:320;16345:6;16382:1;16376:4;16372:12;16362:22;;16429:1;16423:4;16419:12;16450:18;16440:81;;16506:4;16498:6;16494:17;16484:27;;16440:81;16568:2;16560:6;16557:14;16537:18;16534:38;16531:84;;;16587:18;;:::i;:::-;16531:84;16352:269;16301:320;;;:::o;16627:164::-;16767:16;16763:1;16755:6;16751:14;16744:40;16627:164;:::o;16797:366::-;16939:3;16960:67;17024:2;17019:3;16960:67;:::i;:::-;16953:74;;17036:93;17125:3;17036:93;:::i;:::-;17154:2;17149:3;17145:12;17138:19;;16797:366;;;:::o;17169:419::-;17335:4;17373:2;17362:9;17358:18;17350:26;;17422:9;17416:4;17412:20;17408:1;17397:9;17393:17;17386:47;17450:131;17576:4;17450:131;:::i;:::-;17442:139;;17169:419;;;:::o;17594:160::-;17734:12;17730:1;17722:6;17718:14;17711:36;17594:160;:::o;17760:366::-;17902:3;17923:67;17987:2;17982:3;17923:67;:::i;:::-;17916:74;;17999:93;18088:3;17999:93;:::i;:::-;18117:2;18112:3;18108:12;18101:19;;17760:366;;;:::o;18132:419::-;18298:4;18336:2;18325:9;18321:18;18313:26;;18385:9;18379:4;18375:20;18371:1;18360:9;18356:17;18349:47;18413:131;18539:4;18413:131;:::i;:::-;18405:139;;18132:419;;;:::o;18557:167::-;18697:19;18693:1;18685:6;18681:14;18674:43;18557:167;:::o;18730:366::-;18872:3;18893:67;18957:2;18952:3;18893:67;:::i;:::-;18886:74;;18969:93;19058:3;18969:93;:::i;:::-;19087:2;19082:3;19078:12;19071:19;;18730:366;;;:::o;19102:419::-;19268:4;19306:2;19295:9;19291:18;19283:26;;19355:9;19349:4;19345:20;19341:1;19330:9;19326:17;19319:47;19383:131;19509:4;19383:131;:::i;:::-;19375:139;;19102:419;;;:::o;19527:180::-;19575:77;19572:1;19565:88;19672:4;19669:1;19662:15;19696:4;19693:1;19686:15;19713:305;19753:3;19772:20;19790:1;19772:20;:::i;:::-;19767:25;;19806:20;19824:1;19806:20;:::i;:::-;19801:25;;19960:1;19892:66;19888:74;19885:1;19882:81;19879:107;;;19966:18;;:::i;:::-;19879:107;20010:1;20007;20003:9;19996:16;;19713:305;;;;:::o;20024:348::-;20064:7;20087:20;20105:1;20087:20;:::i;:::-;20082:25;;20121:20;20139:1;20121:20;:::i;:::-;20116:25;;20309:1;20241:66;20237:74;20234:1;20231:81;20226:1;20219:9;20212:17;20208:105;20205:131;;;20316:18;;:::i;:::-;20205:131;20364:1;20361;20357:9;20346:20;;20024:348;;;;:::o;20378:182::-;20518:34;20514:1;20506:6;20502:14;20495:58;20378:182;:::o;20566:366::-;20708:3;20729:67;20793:2;20788:3;20729:67;:::i;:::-;20722:74;;20805:93;20894:3;20805:93;:::i;:::-;20923:2;20918:3;20914:12;20907:19;;20566:366;;;:::o;20938:419::-;21104:4;21142:2;21131:9;21127:18;21119:26;;21191:9;21185:4;21181:20;21177:1;21166:9;21162:17;21155:47;21219:131;21345:4;21219:131;:::i;:::-;21211:139;;20938:419;;;:::o;21363:180::-;21411:77;21408:1;21401:88;21508:4;21505:1;21498:15;21532:4;21529:1;21522:15;21549:180;21597:77;21594:1;21587:88;21694:4;21691:1;21684:15;21718:4;21715:1;21708:15;21735:185;21775:1;21792:20;21810:1;21792:20;:::i;:::-;21787:25;;21826:20;21844:1;21826:20;:::i;:::-;21821:25;;21865:1;21855:35;;21870:18;;:::i;:::-;21855:35;21912:1;21909;21905:9;21900:14;;21735:185;;;;:::o;21926:233::-;21965:3;21988:24;22006:5;21988:24;:::i;:::-;21979:33;;22034:66;22027:5;22024:77;22021:103;;;22104:18;;:::i;:::-;22021:103;22151:1;22144:5;22140:13;22133:20;;21926:233;;;:::o;22165:168::-;22248:11;22282:6;22277:3;22270:19;22322:4;22317:3;22313:14;22298:29;;22165:168;;;;:::o;22339:114::-;;:::o;22459:362::-;22600:3;22621:65;22684:1;22679:3;22621:65;:::i;:::-;22614:72;;22695:93;22784:3;22695:93;:::i;:::-;22813:1;22808:3;22804:11;22797:18;;22459:362;;;:::o;22827:748::-;23076:4;23114:3;23103:9;23099:19;23091:27;;23128:71;23196:1;23185:9;23181:17;23172:6;23128:71;:::i;:::-;23209:72;23277:2;23266:9;23262:18;23253:6;23209:72;:::i;:::-;23291;23359:2;23348:9;23344:18;23335:6;23291:72;:::i;:::-;23410:9;23404:4;23400:20;23395:2;23384:9;23380:18;23373:48;23438:130;23563:4;23438:130;:::i;:::-;23430:138;;22827:748;;;;;;:::o;23581:141::-;23637:5;23668:6;23662:13;23653:22;;23684:32;23710:5;23684:32;:::i;:::-;23581:141;;;;:::o;23728:349::-;23797:6;23846:2;23834:9;23825:7;23821:23;23817:32;23814:119;;;23852:79;;:::i;:::-;23814:119;23972:1;23997:63;24052:7;24043:6;24032:9;24028:22;23997:63;:::i;:::-;23987:73;;23943:127;23728:349;;;;:::o;24083:166::-;24223:18;24219:1;24211:6;24207:14;24200:42;24083:166;:::o;24255:366::-;24397:3;24418:67;24482:2;24477:3;24418:67;:::i;:::-;24411:74;;24494:93;24583:3;24494:93;:::i;:::-;24612:2;24607:3;24603:12;24596:19;;24255:366;;;:::o;24627:419::-;24793:4;24831:2;24820:9;24816:18;24808:26;;24880:9;24874:4;24870:20;24866:1;24855:9;24851:17;24844:47;24908:131;25034:4;24908:131;:::i;:::-;24900:139;;24627:419;;;:::o;25052:98::-;25103:6;25137:5;25131:12;25121:22;;25052:98;;;:::o;25156:360::-;25242:3;25270:38;25302:5;25270:38;:::i;:::-;25324:70;25387:6;25382:3;25324:70;:::i;:::-;25317:77;;25403:52;25448:6;25443:3;25436:4;25429:5;25425:16;25403:52;:::i;:::-;25480:29;25502:6;25480:29;:::i;:::-;25475:3;25471:39;25464:46;;25246:270;25156:360;;;;:::o;25522:640::-;25717:4;25755:3;25744:9;25740:19;25732:27;;25769:71;25837:1;25826:9;25822:17;25813:6;25769:71;:::i;:::-;25850:72;25918:2;25907:9;25903:18;25894:6;25850:72;:::i;:::-;25932;26000:2;25989:9;25985:18;25976:6;25932:72;:::i;:::-;26051:9;26045:4;26041:20;26036:2;26025:9;26021:18;26014:48;26079:76;26150:4;26141:6;26079:76;:::i;:::-;26071:84;;25522:640;;;;;;;:::o;26168:148::-;26270:11;26307:3;26292:18;;26168:148;;;;:::o;26322:141::-;26371:4;26394:3;26386:11;;26417:3;26414:1;26407:14;26451:4;26448:1;26438:18;26430:26;;26322:141;;;:::o;26493:845::-;26596:3;26633:5;26627:12;26662:36;26688:9;26662:36;:::i;:::-;26714:89;26796:6;26791:3;26714:89;:::i;:::-;26707:96;;26834:1;26823:9;26819:17;26850:1;26845:137;;;;26996:1;26991:341;;;;26812:520;;26845:137;26929:4;26925:9;26914;26910:25;26905:3;26898:38;26965:6;26960:3;26956:16;26949:23;;26845:137;;26991:341;27058:38;27090:5;27058:38;:::i;:::-;27118:1;27132:154;27146:6;27143:1;27140:13;27132:154;;;27220:7;27214:14;27210:1;27205:3;27201:11;27194:35;27270:1;27261:7;27257:15;27246:26;;27168:4;27165:1;27161:12;27156:17;;27132:154;;;27315:6;27310:3;27306:16;27299:23;;26998:334;;26812:520;;26600:738;;26493:845;;;;:::o;27344:377::-;27450:3;27478:39;27511:5;27478:39;:::i;:::-;27533:89;27615:6;27610:3;27533:89;:::i;:::-;27526:96;;27631:52;27676:6;27671:3;27664:4;27657:5;27653:16;27631:52;:::i;:::-;27708:6;27703:3;27699:16;27692:23;;27454:267;27344:377;;;;:::o;27727:429::-;27904:3;27926:92;28014:3;28005:6;27926:92;:::i;:::-;27919:99;;28035:95;28126:3;28117:6;28035:95;:::i;:::-;28028:102;;28147:3;28140:10;;27727:429;;;;;:::o;28162:164::-;28302:16;28298:1;28290:6;28286:14;28279:40;28162:164;:::o;28332:366::-;28474:3;28495:67;28559:2;28554:3;28495:67;:::i;:::-;28488:74;;28571:93;28660:3;28571:93;:::i;:::-;28689:2;28684:3;28680:12;28673:19;;28332:366;;;:::o;28704:419::-;28870:4;28908:2;28897:9;28893:18;28885:26;;28957:9;28951:4;28947:20;28943:1;28932:9;28928:17;28921:47;28985:131;29111:4;28985:131;:::i;:::-;28977:139;;28704:419;;;:::o;29129:94::-;29162:8;29210:5;29206:2;29202:14;29181:35;;29129:94;;;:::o;29229:::-;29268:7;29297:20;29311:5;29297:20;:::i;:::-;29286:31;;29229:94;;;:::o;29329:100::-;29368:7;29397:26;29417:5;29397:26;:::i;:::-;29386:37;;29329:100;;;:::o;29435:157::-;29540:45;29560:24;29578:5;29560:24;:::i;:::-;29540:45;:::i;:::-;29535:3;29528:58;29435:157;;:::o;29598:256::-;29710:3;29725:75;29796:3;29787:6;29725:75;:::i;:::-;29825:2;29820:3;29816:12;29809:19;;29845:3;29838:10;;29598:256;;;;:::o;29860:79::-;29899:7;29928:5;29917:16;;29860:79;;;:::o;29945:157::-;30050:45;30070:24;30088:5;30070:24;:::i;:::-;30050:45;:::i;:::-;30045:3;30038:58;29945:157;;:::o;30108:397::-;30248:3;30263:75;30334:3;30325:6;30263:75;:::i;:::-;30363:2;30358:3;30354:12;30347:19;;30376:75;30447:3;30438:6;30376:75;:::i;:::-;30476:2;30471:3;30467:12;30460:19;;30496:3;30489:10;;30108:397;;;;;:::o;30511:191::-;30551:4;30571:20;30589:1;30571:20;:::i;:::-;30566:25;;30605:20;30623:1;30605:20;:::i;:::-;30600:25;;30644:1;30641;30638:8;30635:34;;;30649:18;;:::i;:::-;30635:34;30694:1;30691;30687:9;30679:17;;30511:191;;;;:::o;30708:176::-;30740:1;30757:20;30775:1;30757:20;:::i;:::-;30752:25;;30791:20;30809:1;30791:20;:::i;:::-;30786:25;;30830:1;30820:35;;30835:18;;:::i;:::-;30820:35;30876:1;30873;30869:9;30864:14;;30708:176;;;;:::o

Swarm Source

ipfs://0c2e0460c844c825d381d5e8c278d78899cae4fd568bd5cfc9fa0091aa270fbf
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.