ETH Price: $2,942.30 (-4.08%)
Gas: 2 Gwei

Token

Farmer Apes Yield Club (FAYC)
 

Overview

Max Total Supply

535 FAYC

Holders

305

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 FAYC
0x8F0Add9416Bc9aa39040aC06A268D3d70740e58f
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
FarmerApes

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 10 of 23: FarmerApes.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.1;

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

import "./ContentMixin.sol";
import "./NativeMetaTransaction.sol";

interface IERC721Contract {
    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);
}

interface YieldToken {
    function updateRewardOnMint(address _user) external;

    function updateReward(address _from, address _to) external;

    function claimReward(address _to) external;
}

/**
 * @title FarmerApes
 */
contract FarmerApes is
    ContextMixin,
    ERC721Enumerable,
    NativeMetaTransaction,
    Ownable
{
    using SafeMath for uint256;

    string public baseTokenURI;
    uint256 private _currentTokenId;
    uint256 public constant MAX_SUPPLY = 8888;
    uint8 public constant MAX_MINT_LIMIT = 10;
    uint256 private constant GIFT_COUNT = 88;
    uint256 public mintBeforeReserve;
    uint256 public totalAirdropNum;
    address public hawaiiApe;
    uint256 public totalReserved;
    uint256 public presalePrice = .0588 ether;
    uint256 public publicSalePrice = .06 ether;
    uint256 public presaleTime = 1639584000;
    uint256 public publicSaleTime = 1639670415;
    bool public ApprovedAsHolder = true;
    bool public inPublic;

    mapping(address => bool) public whitelisters;
    mapping(address => bool) public presaleStatus;
    mapping(address => uint8) public reserved;
    mapping(address => uint8) public claimed;
    mapping(address => uint8) public airdropNum;
    mapping(uint256 => RarityType) private apeType;
    mapping(address => uint256) private yield;

    enum RarityType {
        Null,
        Common,
        Rare,
        SuperRare,
        Epic,
        Lengendary
    }

    YieldToken public yieldToken;
    IERC721Contract public BAYC;
    IERC721Contract public MAYC;

    event ValueChanged(string indexed fieldName, uint256 newValue);
    event LuckyApe(uint256 indexed tokenId, address indexed luckyAddress);
    event LegendaryDrop(uint256 indexed tokenId, address indexed luckyAddress);

    /**
     * @dev Throws if called by any account that's not whitelisted.
     */
    modifier onlyWhitelisted() {
        require(
            checkWhiteList(msg.sender),
            "FarmerApes: Oops, sorry you're not whitelisted."
        );
        _;
    }

    constructor(
        string memory _name,
        string memory _symbol,
        string memory _uri,
        address _BAYC,
        address _MAYC
    ) ERC721(_name, _symbol) {
        baseTokenURI = _uri;
        _initializeEIP712(_name);
        BAYC = IERC721Contract(_BAYC);
        MAYC = IERC721Contract(_MAYC);
    }

    /**
     * @dev Check user is on the whitelist or not.
     * @param user msg.sender
     */

    function checkWhiteList(address user) public view returns (bool) {
        if (ApprovedAsHolder) {
            return
                whitelisters[user] ||
                BAYC.balanceOf(user) > 0 ||
                MAYC.balanceOf(user) > 0;
        } else {
            return whitelisters[user];
        }
    }

    function setPresalePrice(uint256 newPrice) external onlyOwner {
        presalePrice = newPrice;
        emit ValueChanged("presalePrice", newPrice);
    }

    function setPublicPrice(uint256 newPrice) external onlyOwner {
        publicSalePrice = newPrice;
        emit ValueChanged("publicSalePrice", newPrice);
    }

    /**
     * @dev Mint to msg.sender. Only whitelisted users can participate
     */
    function presale() external payable onlyWhitelisted {
        require(
            block.timestamp >= presaleTime &&
                block.timestamp < presaleTime + 1 days,
            "FarmerApes: Presale has yet to be started."
        );
        require(msg.value == presalePrice, "FarmerApes: Invalid value.");
        require(
            !presaleStatus[msg.sender],
            "FarmerApe: You had already participated in presale."
        );
        require(
            totalSupply() + 1 <= MAX_SUPPLY - GIFT_COUNT,
            "FarmerApes: Sorry, we are sold out."
        );
        _mintMany(1);
        presaleStatus[msg.sender] = true;
    }

    /**
     * @dev Reserve for the purchase. Each address is allowed to purchase up to 10 FarmerApes.
     * @param _num Quantity to purchase
     */
    function reserve(uint8 _num) external payable {
        require(
            block.timestamp >= publicSaleTime &&
                block.timestamp <= publicSaleTime + 7 days,
            "FarmerApes: Public sale has yet to be started."
        );
        if (mintBeforeReserve == 0) {
            mintBeforeReserve = totalSupply();
        }
        require(
            (_num + reserved[msg.sender] + claimed[msg.sender]) <=
                MAX_MINT_LIMIT,
            "FarmerApes: Each address is allowed to purchase up to 10 FarmerApes."
        );
        require(
            mintBeforeReserve + uint256(_num) <=
                MAX_SUPPLY - totalReserved - (GIFT_COUNT - totalAirdropNum),
            "FarmerApes: Sorry, we are sold out."
        );
        require(
            msg.value == uint256(_num) * publicSalePrice,
            "FarmerApes: Invalid value."
        );
        reserved[msg.sender] += _num;
        totalReserved += uint256(_num);
    }

    /**
     * @dev FarmerApes can only be claimed after your reservation.
     */
    function claim() external {
        require(
            block.timestamp >= publicSaleTime &&
                block.timestamp <= publicSaleTime + 7 days,
            "FarmerApes: You have missed the time window. Your Farmer Ape has escaped."
        );
        _mintMany(reserved[msg.sender]);
        claimed[msg.sender] += reserved[msg.sender];
        reserved[msg.sender] = 0;
    }

    /**
     * @dev set the presale and public sale time only by Admin
     */
    function updateTime(uint256 _preSaleTime, uint256 _publicSaleTime)
        external
        onlyOwner
    {
        require(
            _publicSaleTime > _preSaleTime,
            "FarmerApes: Invalid time set."
        );
        presaleTime = _preSaleTime;
        publicSaleTime = _publicSaleTime;
        emit ValueChanged("presaleTime", _preSaleTime);
        emit ValueChanged("publicSaleTime", _publicSaleTime);
    }

    function setAPCToken(address _APC) external onlyOwner {
        yieldToken = YieldToken(_APC);
    }

    function setInPublic(bool _inPublic) external onlyOwner {
        inPublic = _inPublic;
    }

    function setIfApprovedAsHolder(bool _ApprovedAsHolder) external onlyOwner {
        ApprovedAsHolder = _ApprovedAsHolder;
    }

    /**
     * @dev Mint and airdrop apes to several addresses directly.
     * @param _recipients addressses of the future holder of Farmer Apes.
     * @param rTypes rarity types of the future holder of Farmer Apes.
     */
    function mintTo(address[] memory _recipients, uint8[] memory rTypes)
        external
        onlyOwner
    {
        for (uint256 i = 0; i < _recipients.length; i++) {
            uint256 newTokenId = _getNextTokenId();
            _mintTo(_recipients[i], newTokenId, rTypes[i]);
            checkRoadmap(newTokenId);
            _incrementTokenId();
        }
        require(
            GIFT_COUNT - totalAirdropNum >= _recipients.length,
            "We've reached the maximum of airdrop limits."
        );
        totalAirdropNum += _recipients.length;
    }

    function _mintTo(
        address to,
        uint256 tokenId,
        uint8 rType
    ) internal {
        yieldToken.updateRewardOnMint(to);

        if (rType == 0) {
            apeType[tokenId] = randomRarity();
        } else {
            apeType[tokenId] = RarityType(rType);
        }

        super._mint(to, tokenId);
        yield[to] += getApeYield(tokenId);
    }

    function randomRarity() internal view returns (RarityType rtype) {
        uint256 randomNumber = (random(_currentTokenId) % 10000) + 1;
        if (randomNumber <= 8000) {
            return RarityType.Common;
        } else if (randomNumber <= 9387) {
            return RarityType.Rare;
        } else if (randomNumber <= 9887) {
            return RarityType.SuperRare;
        } else if (randomNumber <= 9987) {
            return RarityType.Epic;
        } else {
            return RarityType.Lengendary;
        }
    }

    /**
     * @dev Airdrop apes to several addresses.
     * @param _recipients Holders are able to mint Farmer Apes for free.
     */
    function airdrop(address[] memory _recipients, uint8[] memory _amounts)
        external
        onlyOwner
    {
        uint256 _airdropNum;
        require(
            block.timestamp >= publicSaleTime,
            "FarmerApes: Public sale has yet to be started."
        );

        for (uint256 i = 0; i < _recipients.length; i++) {
            _airdropNum += _amounts[i];
            airdropNum[_recipients[i]] = _amounts[i];
        }
        require(
            GIFT_COUNT - totalAirdropNum >= _airdropNum,
            "We've reached the maximum of airdrop limits."
        );
        totalAirdropNum += _airdropNum;
    }

    function getAirdrop() external {
        require(
            airdropNum[msg.sender] > 0 &&
                block.timestamp <= publicSaleTime + 7 days,
            "FarmerApes: You have missed the time window. Your Farmer Ape has escaped."
        );
        _mintMany(airdropNum[msg.sender]);
        airdropNum[msg.sender] = 0;
    }

    function checkRoadmap(uint256 newTokenId) internal {
        if (newTokenId % 888 == 0) {
            uint256 apeId = newTokenId - (random(newTokenId) % 888);
            address luckyAddress = ownerOf(apeId);
            payable(luckyAddress).transfer(.888 ether);
            emit LuckyApe(apeId, luckyAddress);
        }

        // For every 4444 sales, a legendary NFT will be airdropped to a lucky ape holder.
        if (newTokenId == 4444 || newTokenId == MAX_SUPPLY + 2 - GIFT_COUNT) {
            uint256 apeId = newTokenId - (random(newTokenId) % 4444);
            address luckyAddress = ownerOf(apeId);
            emit LegendaryDrop(apeId, luckyAddress);
        }
    }

    /**
     * @dev Mint Farmer Apes.
     */
    function _mintMany(uint8 _num) private {
        for (uint8 i = 0; i < _num; i++) {
            uint256 newTokenId = _getNextTokenId();
            _mint(msg.sender, newTokenId);
            _incrementTokenId();
            checkRoadmap(newTokenId);
        }
    }

    /**
     * @dev calculates the next token ID based on value of _currentTokenId
     * @return uint256 for the next token ID
     */
    function _getNextTokenId() private view returns (uint256) {
        return _currentTokenId.add(1);
    }

    /**
     * @dev Once we sell out, a lucky Hawaii ape holder with at least 2 Farmer Apes will be selected to jump to a paid trip.
     */
    function _randomTripApeAddress(uint256 seed) internal returns (address) {
        uint256 apeId = (random(seed) % _currentTokenId) + 1;
        address apeAddress = ownerOf(apeId);
        if (balanceOf(apeAddress) >= 2) {
            return apeAddress;
        }
        return _randomTripApeAddress(random(seed));
    }

    /**
     * @dev Get the lucky ape for a paid trip to Hawaii
     * @return address
     */
    function randomTripApeAddress() external onlyOwner returns (address) {
        require(hawaiiApe == address(0), "The ape has already selected.");
        hawaiiApe = _randomTripApeAddress(_currentTokenId);
        return hawaiiApe;
    }

    /**
     * generates a pseudorandom number
     * @param seed a value ensure different outcomes for different sources in the same block
     * @return a pseudorandom value
     */
    function random(uint256 seed) internal view returns (uint256) {
        return
            uint256(
                keccak256(
                    abi.encodePacked(
                        tx.origin,
                        blockhash(block.number - 1),
                        block.timestamp,
                        seed
                    )
                )
            );
    }

    /**
     * @dev increments the value of _currentTokenId
     */
    function _incrementTokenId() private {
        require(_currentTokenId < MAX_SUPPLY);
        _currentTokenId++;
    }

    /**
     * @dev change the baseTokenURI only by Admin
     */
    function setBaseUri(string memory _uri) external onlyOwner {
        baseTokenURI = _uri;
    }

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

    function _msgSender() internal view override returns (address sender) {
        return ContextMixin.msgSender();
    }

    function withdraw() external onlyOwner {
        uint256 balance = address(this).balance;

        payable(address(0xa297c335fF5De7b2a8f2F95283456FDA26ddbfE4)).transfer(
            (balance * 3) / 100
        );
        payable(address(0x25f9454ABf96C656A151D85cD74EFD008838Aa54)).transfer(
            (balance * 8) / 1000
        );
        payable(address(0xa9b16C30a17D91a91746b072D7700971651e8d7A)).transfer(
            (balance * 3) / 100
        );
        
        payable(owner()).transfer(address(this).balance);
    }

    receive() external payable {}

    /**
     * @dev Set whitelist
     * @param whitelistAddresses Whitelist addresses
     */
    function addWhitelisters(address[] calldata whitelistAddresses)
        external
        onlyOwner
    {
        for (uint256 i; i < whitelistAddresses.length; i++) {
            whitelisters[whitelistAddresses[i]] = true;
        }
    }

    /**
     * @dev To know each Token's type and daily Yield.
     * @param tokenId token id
     */
    function getApeTypeAndYield(uint256 tokenId)
        external
        view
        returns (RarityType rType, uint256 apeYield)
    {
        if (inPublic) {
            rType = apeType[tokenId];
            apeYield = getApeYield(tokenId);
        } else {
            rType = RarityType.Null;
            apeYield = 0;
        }
    }

    /**
     * @dev To know each Token's daily Yield.
     * @param tokenId token id
     */

    function getApeYield(uint256 tokenId)
        internal
        view
        returns (uint256 apeYield)
    {
        if (apeType[tokenId] == RarityType.Common) {
            return 6;
        }
        if (apeType[tokenId] == RarityType.Rare) {
            return 7;
        }
        if (apeType[tokenId] == RarityType.SuperRare) {
            return 8;
        }
        if (apeType[tokenId] == RarityType.Epic) {
            return 9;
        }
        if (apeType[tokenId] == RarityType.Lengendary) {
            return 15;
        }
    }

    /**
     * @dev To know each address's total daily Yield.
     * @param user address
     */
    function getUserYield(address user) external view returns (uint256) {
        if (!inPublic) return 0;
        return yield[user] * 1e18;
    }

    /**
     * @dev To claim your total reward.
     */
    function claimReward() external {
        yieldToken.updateReward(msg.sender, address(0));
        yieldToken.claimReward(msg.sender);
    }

    function _mint(address to, uint256 tokenId) internal virtual override {
        yieldToken.updateRewardOnMint(to);
        apeType[tokenId] = randomRarity();
        super._mint(to, tokenId);
        yield[to] += getApeYield(tokenId);
    }

    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public override {
        yieldToken.updateReward(from, to);
        yield[from] -= getApeYield(tokenId);
        yield[to] += getApeYield(tokenId);
        super.transferFrom(from, to, tokenId);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public override {
        yieldToken.updateReward(from, to);
        yield[from] -= getApeYield(tokenId);
        yield[to] += getApeYield(tokenId);
        super.safeTransferFrom(from, to, tokenId, _data);
    }
}

File 1 of 23: Address.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(
            address(this).balance >= amount,
            "Address: insufficient balance"
        );

        (bool success, ) = recipient.call{value: amount}("");
        require(
            success,
            "Address: unable to send value, recipient may have reverted"
        );
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data)
        internal
        returns (bytes memory)
    {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return
            functionCallWithValue(
                target,
                data,
                value,
                "Address: low-level call with value failed"
            );
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(
            address(this).balance >= value,
            "Address: insufficient balance for call"
        );
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(
            data
        );
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data)
        internal
        view
        returns (bytes memory)
    {
        return
            functionStaticCall(
                target,
                data,
                "Address: low-level static call failed"
            );
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data)
        internal
        returns (bytes memory)
    {
        return
            functionDelegateCall(
                target,
                data,
                "Address: low-level delegate call failed"
            );
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 2 of 23: APC.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.1;

import "./ERC20.sol";
import "./SafeMath.sol";
import "./Ownable.sol";

interface IFarmerApes {
    function getUserYield(address _user) external view returns (uint256);
}

contract YieldToken is ERC20("Ape Coin", "APC"), Ownable {
    using SafeMath for uint256;

    mapping(address => uint256) public rewards;
    mapping(address => uint256) public lastUpdate;
    mapping(address => bool) public burnList;

    uint256 public stakeStartAt = 1640361615;
    uint256 public stakeEndAt = stakeStartAt + 365 days;

    IFarmerApes public farmerApesContract;

    event RewardPaid(address indexed user, uint256 reward);
    event ValueChanged(string indexed fieldName, uint256 newValue);
    event SetFarmerApesContracts(address indexed newAddress);

    constructor() {}

    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev To set FarmerApes smart contract.
     * @param _farmerApe FarmerApes smart contract address
     */
    function setFarmerApesContract(address _farmerApe) external onlyOwner {
        farmerApesContract = IFarmerApes(_farmerApe);
        emit SetFarmerApesContracts(_farmerApe);
    }

    /**
     * @dev set the staking start time
     */
    function setStakingTime(uint256 _stakeStartAt, uint256 _stakeEndAt)
        external
        onlyOwner
    {
        require(_stakeEndAt > _stakeStartAt, "FarmerApe: Invalid time set.");
        require(_stakeStartAt > stakeStartAt, "FarmerApe: Invalid time set.");
        stakeStartAt = _stakeStartAt;
        stakeEndAt = _stakeEndAt;
        emit ValueChanged("stakeStartAt", _stakeStartAt);
        emit ValueChanged("stakeEndAt", _stakeEndAt);
    }

    function setBurnAccess(address _addr, bool _canBurn) external onlyOwner {
        burnList[_addr] = _canBurn;
    }

    function burn(address _from, uint256 _amount) external {
        require(
            burnList[msg.sender],
            "FarmerApe: Only addresses with access can call this function."
        );
        _burn(_from, _amount);
    }

    function getTotalClaimable(address _user) external view returns (uint256) {
        uint256 time = min(block.timestamp, stakeEndAt);
        uint256 pending = farmerApesContract
            .getUserYield(_user)
            .mul(time.sub(lastUpdate[_user]))
            .div(86400);
        return rewards[_user] + pending;
    }

    
    function claimReward(address _to) external {
        require(msg.sender == address(farmerApesContract));
        uint256 reward = rewards[_to];
        if (reward > 0) {
            rewards[_to] = 0;
            _mint(_to, reward);
            emit RewardPaid(_to, reward);
        }
    }

    /**
     * @dev This will be triggered when each Farmer Ape being minted.
     */
    function updateRewardOnMint(address _user) external {
        if (block.timestamp < stakeStartAt) {
            if (lastUpdate[_user] < stakeStartAt)
                lastUpdate[_user] = stakeStartAt;
            return;
        }
        require(
            msg.sender == address(farmerApesContract),
            "FarmerApe: Only Farmer Apes contract can call this function."
        );
        uint256 time = min(block.timestamp, stakeEndAt);
        uint256 timerUser = lastUpdate[_user];

        if (timerUser > 0) {
            if (timerUser < stakeStartAt) timerUser = stakeStartAt;
            rewards[_user] = rewards[_user].add(
                farmerApesContract
                    .getUserYield(_user)
                    .mul((time.sub(timerUser)))
                    .div(86400)
            );
        }
        lastUpdate[_user] = time;
    }

    /**
     * @dev To update the reward of both _from and _to.
     */
    function updateReward(address _from, address _to) external {
        if (block.timestamp < stakeStartAt) return;
        require(msg.sender == address(farmerApesContract));
        uint256 time = min(block.timestamp, stakeEndAt);
        uint256 timerFrom = lastUpdate[_from];

        if (timerFrom != stakeEndAt) {
            if (timerFrom < stakeStartAt) timerFrom = stakeStartAt;
            rewards[_from] += rewards[_from].add(
                farmerApesContract
                    .getUserYield(_from)
                    .mul((time.sub(timerFrom)))
                    .div(86400)
            );
            lastUpdate[_from] = time;
        }

        if (_to != address(0)) {
            uint256 timerTo = lastUpdate[_to];

            if (timerTo == stakeEndAt) return;

            if (timerTo > 0)
                if (timerTo < stakeStartAt) timerTo = stakeStartAt;
            rewards[_to] = rewards[_to].add(
                farmerApesContract
                    .getUserYield(_to)
                    .mul((time.sub(timerTo)))
                    .div(86400)
            );
            if (timerTo != stakeEndAt) lastUpdate[_to] = time;
        }
    }


 
}

File 3 of 23: ContentMixin.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.1;

abstract contract ContextMixin {
    function msgSender() internal view returns (address payable sender) {
        if (msg.sender == address(this)) {
            bytes memory array = msg.data;
            uint256 index = msg.data.length;
            assembly {
                // Load the 32 bytes word from memory with the address on the lower 20 bytes, and mask those.
                sender := and(
                    mload(add(array, index)),
                    0xffffffffffffffffffffffffffffffffffffffff
                )
            }
        } else {
            sender = payable(msg.sender);
        }
        return sender;
    }
}

File 4 of 23: Context.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.1;

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

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

File 5 of 23: EIP712Base.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.1;

import {Initializable} from "./Initializable.sol";

contract EIP712Base is Initializable {
    struct EIP712Domain {
        string name;
        string version;
        address verifyingContract;
        bytes32 salt;
    }

    string public constant ERC712_VERSION = "1";

    bytes32 internal constant EIP712_DOMAIN_TYPEHASH =
        keccak256(
            bytes(
                "EIP712Domain(string name,string version,address verifyingContract,bytes32 salt)"
            )
        );
    bytes32 internal domainSeperator;

    // supposed to be called once while initializing.
    // one of the contracts that inherits this contract follows proxy pattern
    // so it is not possible to do this in a constructor
    function _initializeEIP712(string memory name) internal initializer {
        _setDomainSeperator(name);
    }

    function _setDomainSeperator(string memory name) internal {
        domainSeperator = keccak256(
            abi.encode(
                EIP712_DOMAIN_TYPEHASH,
                keccak256(bytes(name)),
                keccak256(bytes(ERC712_VERSION)),
                address(this),
                bytes32(getChainId())
            )
        );
    }

    function getDomainSeperator() public view returns (bytes32) {
        return domainSeperator;
    }

    function getChainId() public view returns (uint256) {
        uint256 id;
        assembly {
            id := chainid()
        }
        return id;
    }

    /**
     * Accept message hash and returns hash message in EIP712 compatible form
     * So that it can be used to recover signer from signature signed using EIP712 formatted data
     * https://eips.ethereum.org/EIPS/eip-712
     * "\\x19" makes the encoding deterministic
     * "\\x01" is the version byte to make it compatible to EIP-191
     */
    function toTypedMessageHash(bytes32 messageHash)
        internal
        view
        returns (bytes32)
    {
        return
            keccak256(
                abi.encodePacked("\x19\x01", getDomainSeperator(), messageHash)
            );
    }
}

File 6 of 23: ERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.1;

import "./IERC165.sol";

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override
        returns (bool)
    {
        return interfaceId == type(IERC165).interfaceId;
    }
}

File 7 of 23: ERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.1;

import "./IERC20.sol";
import "./IERC20Metadata.sol";
import "./Context.sol";

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

    mapping(address => mapping(address => uint256)) private _allowances;

    uint256 private _maxTotalSupply = 88_888_888e18;
    uint256 private _initialSupply = 88_888_888e18 * 0.75;
    uint256 private _totalSupply = _initialSupply;
    string private _name;
    string private _symbol;
    uint8 private _decimals;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _balances[msg.sender] = _initialSupply;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        unchecked {
            _approve(sender, _msgSender(), currentAllowance - amount);
        }

        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(_msgSender(), spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[sender] = senderBalance - amount;
        }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");
        require(_totalSupply+amount<=_maxTotalSupply, "ERC20: mint amount exceeds maxTotalSupply");
        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

File 8 of 23: ERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.1;

import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./IERC721Metadata.sol";
import "./Address.sol";
import "./Context.sol";
import "./Strings.sol";
import "./ERC165.sol";

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(ERC165, IERC165)
        returns (bool)
    {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner)
        public
        view
        virtual
        override
        returns (uint256)
    {
        require(
            owner != address(0),
            "ERC721: balance query for the zero address"
        );
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId)
        public
        view
        virtual
        override
        returns (address)
    {
        address owner = _owners[tokenId];
        require(
            owner != address(0),
            "ERC721: owner query for nonexistent token"
        );
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(
            _exists(tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );

        string memory baseURI = _baseURI();
        return
            bytes(baseURI).length > 0
                ? string(abi.encodePacked(baseURI, tokenId.toString()))
                : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId)
        public
        view
        virtual
        override
        returns (address)
    {
        require(
            _exists(tokenId),
            "ERC721: approved query for nonexistent token"
        );

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved)
        public
        virtual
        override
    {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator)
        public
        view
        virtual
        override
        returns (bool)
    {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(
            _isApprovedOrOwner(_msgSender(), tokenId),
            "ERC721: transfer caller is not owner nor approved"
        );

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(
            _isApprovedOrOwner(_msgSender(), tokenId),
            "ERC721: transfer caller is not owner nor approved"
        );
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId)
        internal
        view
        virtual
        returns (bool)
    {
        require(
            _exists(tokenId),
            "ERC721: operator query for nonexistent token"
        );
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner ||
            getApproved(tokenId) == spender ||
            isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

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

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(
            ERC721.ownerOf(tokenId) == from,
            "ERC721: transfer of token that is not own"
        );
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try
                IERC721Receiver(to).onERC721Received(
                    _msgSender(),
                    from,
                    tokenId,
                    _data
                )
            returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert(
                        "ERC721: transfer to non ERC721Receiver implementer"
                    );
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

File 9 of 23: ERC721Enumerable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.1;

import "./ERC721.sol";
import "./IERC721Enumerable.sol";

/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(IERC165, ERC721)
        returns (bool)
    {
        return
            interfaceId == type(IERC721Enumerable).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index)
        public
        view
        virtual
        override
        returns (uint256)
    {
        require(
            index < ERC721.balanceOf(owner),
            "ERC721Enumerable: owner index out of bounds"
        );
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index)
        public
        view
        virtual
        override
        returns (uint256)
    {
        require(
            index < ERC721Enumerable.totalSupply(),
            "ERC721Enumerable: global index out of bounds"
        );
        return _allTokens[index];
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId)
        private
    {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

File 11 of 23: IERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.1;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

File 12 of 23: IERC20.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

File 13 of 23: IERC20Metadata.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC20.sol";

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

File 14 of 23: IERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.1;

import "./IERC165.sol";

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(
        address indexed from,
        address indexed to,
        uint256 indexed tokenId
    );

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(
        address indexed owner,
        address indexed approved,
        uint256 indexed tokenId
    );

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(
        address indexed owner,
        address indexed operator,
        bool approved
    );

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId)
        external
        view
        returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator)
        external
        view
        returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

File 15 of 23: IERC721Enumerable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.1;

import "./IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index)
        external
        view
        returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

File 16 of 23: IERC721Metadata.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.1;

import "./IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

File 17 of 23: IERC721Receiver.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.1;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

File 18 of 23: Initializable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.1;

contract Initializable {
    bool inited = false;

    modifier initializer() {
        require(!inited, "already inited");
        _;
        inited = true;
    }
}

File 19 of 23: Migrations.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.1;

contract Migrations {
    address public owner;
    uint256 public last_completed_migration;

    constructor() {
        owner = msg.sender;
    }

    modifier restricted() {
        if (msg.sender == owner) _;
    }

    function setCompleted(uint256 completed) public restricted {
        last_completed_migration = completed;
    }

    function upgrade(address new_address) public restricted {
        Migrations upgraded = Migrations(new_address);
        upgraded.setCompleted(last_completed_migration);
    }
}

File 20 of 23: NativeMetaTransaction.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.1;

import {SafeMath} from "./SafeMath.sol";
import {EIP712Base} from "./EIP712Base.sol";

contract NativeMetaTransaction is EIP712Base {
    using SafeMath for uint256;
    bytes32 private constant META_TRANSACTION_TYPEHASH =
        keccak256(
            bytes(
                "MetaTransaction(uint256 nonce,address from,bytes functionSignature)"
            )
        );
    event MetaTransactionExecuted(
        address userAddress,
        address payable relayerAddress,
        bytes functionSignature
    );
    mapping(address => uint256) nonces;

    /*
     * Meta transaction structure.
     * No point of including value field here as if user is doing value transfer then he has the funds to pay for gas
     * He should call the desired function directly in that case.
     */
    struct MetaTransaction {
        uint256 nonce;
        address from;
        bytes functionSignature;
    }

    function executeMetaTransaction(
        address userAddress,
        bytes memory functionSignature,
        bytes32 sigR,
        bytes32 sigS,
        uint8 sigV
    ) public payable returns (bytes memory) {
        MetaTransaction memory metaTx = MetaTransaction({
            nonce: nonces[userAddress],
            from: userAddress,
            functionSignature: functionSignature
        });

        require(
            verify(userAddress, metaTx, sigR, sigS, sigV),
            "Signer and signature do not match"
        );

        // increase nonce for user (to avoid re-use)
        nonces[userAddress] = nonces[userAddress].add(1);

        emit MetaTransactionExecuted(
            userAddress,
            payable(msg.sender),
            functionSignature
        );

        // Append userAddress and relayer address at the end to extract it from calling context
        (bool success, bytes memory returnData) = address(this).call(
            abi.encodePacked(functionSignature, userAddress)
        );
        require(success, "Function call not successful");

        return returnData;
    }

    function hashMetaTransaction(MetaTransaction memory metaTx)
        internal
        pure
        returns (bytes32)
    {
        return
            keccak256(
                abi.encode(
                    META_TRANSACTION_TYPEHASH,
                    metaTx.nonce,
                    metaTx.from,
                    keccak256(metaTx.functionSignature)
                )
            );
    }

    function getNonce(address user) public view returns (uint256 nonce) {
        nonce = nonces[user];
    }

    function verify(
        address signer,
        MetaTransaction memory metaTx,
        bytes32 sigR,
        bytes32 sigS,
        uint8 sigV
    ) internal view returns (bool) {
        require(signer != address(0), "NativeMetaTransaction: INVALID_SIGNER");
        return
            signer ==
            ecrecover(
                toTypedMessageHash(hashMetaTransaction(metaTx)),
                sigV,
                sigR,
                sigS
            );
    }
}

File 21 of 23: Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.1;

import "./Context.sol";

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

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

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

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

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

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

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

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 22 of 23: SafeMath.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.1;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

File 23 of 23: Strings.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.1;

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

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

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

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

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_uri","type":"string"},{"internalType":"address","name":"_BAYC","type":"address"},{"internalType":"address","name":"_MAYC","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"luckyAddress","type":"address"}],"name":"LegendaryDrop","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"luckyAddress","type":"address"}],"name":"LuckyApe","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"userAddress","type":"address"},{"indexed":false,"internalType":"address payable","name":"relayerAddress","type":"address"},{"indexed":false,"internalType":"bytes","name":"functionSignature","type":"bytes"}],"name":"MetaTransactionExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"fieldName","type":"string"},{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"ValueChanged","type":"event"},{"inputs":[],"name":"ApprovedAsHolder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BAYC","outputs":[{"internalType":"contract IERC721Contract","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ERC712_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_MINT_LIMIT","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAYC","outputs":[{"internalType":"contract IERC721Contract","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"whitelistAddresses","type":"address[]"}],"name":"addWhitelisters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_recipients","type":"address[]"},{"internalType":"uint8[]","name":"_amounts","type":"uint8[]"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"airdropNum","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"checkWhiteList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimed","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"bytes","name":"functionSignature","type":"bytes"},{"internalType":"bytes32","name":"sigR","type":"bytes32"},{"internalType":"bytes32","name":"sigS","type":"bytes32"},{"internalType":"uint8","name":"sigV","type":"uint8"}],"name":"executeMetaTransaction","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"getAirdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApeTypeAndYield","outputs":[{"internalType":"enum FarmerApes.RarityType","name":"rType","type":"uint8"},{"internalType":"uint256","name":"apeYield","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChainId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDomainSeperator","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getNonce","outputs":[{"internalType":"uint256","name":"nonce","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getUserYield","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hawaiiApe","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"inPublic","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintBeforeReserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_recipients","type":"address[]"},{"internalType":"uint8[]","name":"rTypes","type":"uint8[]"}],"name":"mintTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"presalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"presaleStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"randomTripApeAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_num","type":"uint8"}],"name":"reserve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"reserved","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_APC","type":"address"}],"name":"setAPCToken","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":"_uri","type":"string"}],"name":"setBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_ApprovedAsHolder","type":"bool"}],"name":"setIfApprovedAsHolder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_inPublic","type":"bool"}],"name":"setInPublic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPresalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPublicPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAirdropNum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReserved","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_preSaleTime","type":"uint256"},{"internalType":"uint256","name":"_publicSaleTime","type":"uint256"}],"name":"updateTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelisters","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"yieldToken","outputs":[{"internalType":"contract YieldToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052600a805460ff1990811690915566d0e649d8cb000060145566d529ae9e8600006015556361ba11006016556361bb628f6017556018805490911660011790553480156200005057600080fd5b5060405162004d1538038062004d15833981016040819052620000739162000463565b8451859085906200008c906000906020850190620002e9565b508051620000a2906001906020840190620002e9565b505050620000bf620000b96200011660201b60201c565b62000132565b8251620000d490600e906020860190620002e9565b50620000e08562000184565b602180546001600160a01b039384166001600160a01b03199182161790915560228054929093169116179055506200056d915050565b60006200012d620001e860201b620028cd1760201c565b905090565b600d80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600a5460ff1615620001cd5760405162461bcd60e51b815260206004820152600e60248201526d185b1c9958591e481a5b9a5d195960921b604482015260640160405180910390fd5b620001d88162000247565b50600a805460ff19166001179055565b6000333014156200024157600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b03169150620002449050565b50335b90565b6040518060800160405280604f815260200162004cc6604f9139805160209182012082519282019290922060408051808201825260018152603160f81b90840152805180840194909452838101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608401523060808401524660a0808501919091528151808503909101815260c090930190528151910120600b55565b828054620002f7906200051a565b90600052602060002090601f0160209004810192826200031b576000855562000366565b82601f106200033657805160ff191683800117855562000366565b8280016001018555821562000366579182015b828111156200036657825182559160200191906001019062000349565b506200037492915062000378565b5090565b5b8082111562000374576000815560010162000379565b80516001600160a01b0381168114620003a757600080fd5b919050565b600082601f830112620003be57600080fd5b81516001600160401b0380821115620003db57620003db62000557565b604051601f8301601f19908116603f0116810190828211818310171562000406576200040662000557565b816040528381526020925086838588010111156200042357600080fd5b600091505b8382101562000447578582018301518183018401529082019062000428565b83821115620004595760008385830101525b9695505050505050565b600080600080600060a086880312156200047c57600080fd5b85516001600160401b03808211156200049457600080fd5b620004a289838a01620003ac565b96506020880151915080821115620004b957600080fd5b620004c789838a01620003ac565b95506040880151915080821115620004de57600080fd5b50620004ed88828901620003ac565b935050620004fe606087016200038f565b91506200050e608087016200038f565b90509295509295909350565b600181811c908216806200052f57607f821691505b602082108114156200055157634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b614749806200057d6000396000f3fe6080604052600436106103d15760003560e01c80636352211e116101fd578063b88a802f11610118578063d25f82a0116100ab578063e985e9c51161007a578063e985e9c514610b44578063f11ef5cf14610b8d578063f2fde38b14610ba0578063f45c63ee14610bc0578063fdea8e0b14610bdf57600080fd5b8063d25f82a014610aca578063d547cfb714610adf578063da9425e214610af4578063e846423814610b2457600080fd5b8063c6e62e0b116100e7578063c6e62e0b14610a4e578063c71b0e1c14610a64578063c87b56dd14610a7a578063c884ef8314610a9a57600080fd5b8063b88a802f146109d9578063b88d4fde146109ee578063bbfda60a14610a0e578063c627525514610a2e57600080fd5b806395d89b4111610190578063a0bcfc7f1161015f578063a0bcfc7f14610959578063a22cb46514610979578063ab736f1c14610999578063b0c1d7d8146109b957600080fd5b806395d89b41146108ee5780639b6860c8146109035780639cce37c614610919578063a061a03a1461093957600080fd5b80637f59230f116101cc5780637f59230f146108595780638a6dc8a4146108805780638da5cb5b146108b05780639582b6e5146108ce57600080fd5b80636352211e146107e457806370a0823114610804578063715018a61461082457806376d5de851461083957600080fd5b806329a5f81e116102ed5780634229abdd1161028057806350d549151161024f57806350d549151461076857806355daf2101461077e5780635b9e82c5146107ae5780635cee11f3146107ce57600080fd5b80634229abdd146106f357806342842e0e146107135780634e71d92d146107335780634f6ccce71461074857600080fd5b80633408e470116102bc5780633408e470146106915780633549345e146106a4578063388dabfc146106c45780633ccfd60b146106de57600080fd5b806329a5f81e146106055780632d0335ab146106255780632f745c591461065b57806332cb6b0c1461067b57600080fd5b80631371dab91161036557806321f1b6771161033457806321f1b6771461059a5780632344be0a146105ba5780632360bab9146105d057806323b872dd146105e557600080fd5b80631371dab91461051257806318160ddd1461054257806320379ee5146105575780632117f1b61461056c57600080fd5b8063095ea7b3116103a1578063095ea7b3146104905780630c53c51c146104b25780630da10a83146104c55780630f7e5970146104e557600080fd5b80620e7fa8146103dd57806301ffc9a71461040657806306fdde0314610436578063081812fc1461045857600080fd5b366103d857005b600080fd5b3480156103e957600080fd5b506103f360145481565b6040519081526020015b60405180910390f35b34801561041257600080fd5b50610426610421366004613fa4565b610be7565b60405190151581526020016103fd565b34801561044257600080fd5b5061044b610c12565b6040516103fd9190614241565b34801561046457600080fd5b50610478610473366004614027565b610ca4565b6040516001600160a01b0390911681526020016103fd565b34801561049c57600080fd5b506104b06104ab366004613e23565b610d3e565b005b61044b6104c0366004613db1565b610e66565b3480156104d157600080fd5b50601254610478906001600160a01b031681565b3480156104f157600080fd5b5061044b604051806040016040528060018152602001603160f81b81525081565b34801561051e57600080fd5b5061042661052d366004613c95565b60196020526000908152604090205460ff1681565b34801561054e57600080fd5b506008546103f3565b34801561056357600080fd5b50600b546103f3565b34801561057857600080fd5b5061058c610587366004614027565b611050565b6040516103fd929190614254565b3480156105a657600080fd5b506104b06105b5366004614059565b611094565b3480156105c657600080fd5b506103f360175481565b3480156105dc57600080fd5b506104786111df565b3480156105f157600080fd5b506104b0610600366004613ce3565b6112b3565b34801561061157600080fd5b506104b0610620366004613e4d565b611393565b34801561063157600080fd5b506103f3610640366004613c95565b6001600160a01b03166000908152600c602052604090205490565b34801561066757600080fd5b506103f3610676366004613e23565b61144e565b34801561068757600080fd5b506103f36122b881565b34801561069d57600080fd5b50466103f3565b3480156106b057600080fd5b506104b06106bf366004614027565b6114e4565b3480156106d057600080fd5b506018546104269060ff1681565b3480156106ea57600080fd5b506104b0611588565b3480156106ff57600080fd5b506103f361070e366004613c95565b611718565b34801561071f57600080fd5b506104b061072e366004613ce3565b61175d565b34801561073f57600080fd5b506104b0611778565b34801561075457600080fd5b506103f3610763366004614027565b611837565b34801561077457600080fd5b506103f360115481565b34801561078a57600080fd5b50610426610799366004613c95565b601a6020526000908152604090205460ff1681565b3480156107ba57600080fd5b506104b06107c9366004613c95565b6118ca565b3480156107da57600080fd5b506103f360105481565b3480156107f057600080fd5b506104786107ff366004614027565b611935565b34801561081057600080fd5b506103f361081f366004613c95565b6119ac565b34801561083057600080fd5b506104b0611a33565b34801561084557600080fd5b50602054610478906001600160a01b031681565b34801561086557600080fd5b5061086e600a81565b60405160ff90911681526020016103fd565b34801561088c57600080fd5b5061086e61089b366004613c95565b601d6020526000908152604090205460ff1681565b3480156108bc57600080fd5b50600d546001600160a01b0316610478565b3480156108da57600080fd5b50602154610478906001600160a01b031681565b3480156108fa57600080fd5b5061044b611a88565b34801561090f57600080fd5b506103f360155481565b34801561092557600080fd5b50610426610934366004613c95565b611a97565b34801561094557600080fd5b506104b0610954366004613ec2565b611bf6565b34801561096557600080fd5b506104b0610974366004613fde565b611d67565b34801561098557600080fd5b506104b0610994366004613d87565b611dc3565b3480156109a557600080fd5b50602254610478906001600160a01b031681565b3480156109c557600080fd5b506104b06109d4366004613ec2565b611ec5565b3480156109e557600080fd5b506104b0611fd2565b3480156109fa57600080fd5b506104b0610a09366004613d1f565b612095565b348015610a1a57600080fd5b506104b0610a29366004613f89565b612176565b348015610a3a57600080fd5b506104b0610a49366004614027565b6121d2565b348015610a5a57600080fd5b506103f360165481565b348015610a7057600080fd5b506103f360135481565b348015610a8657600080fd5b5061044b610a95366004614027565b612240565b348015610aa657600080fd5b5061086e610ab5366004613c95565b601c6020526000908152604090205460ff1681565b348015610ad657600080fd5b506104b0612274565b348015610aeb57600080fd5b5061044b6122f5565b348015610b0057600080fd5b5061086e610b0f366004613c95565b601b6020526000908152604090205460ff1681565b348015610b3057600080fd5b506104b0610b3f366004613f89565b612383565b348015610b5057600080fd5b50610426610b5f366004613cb0565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6104b0610b9b36600461407b565b6123e6565b348015610bac57600080fd5b506104b0610bbb366004613c95565b6125fb565b348015610bcc57600080fd5b5060185461042690610100900460ff1681565b6104b06126b5565b60006001600160e01b0319821663780e9d6360e01b1480610c0c5750610c0c82612929565b92915050565b606060008054610c21906145ac565b80601f0160208091040260200160405190810160405280929190818152602001828054610c4d906145ac565b8015610c9a5780601f10610c6f57610100808354040283529160200191610c9a565b820191906000526020600020905b815481529060010190602001808311610c7d57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610d225760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610d4982611935565b9050806001600160a01b0316836001600160a01b03161415610db75760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610d19565b806001600160a01b0316610dc9612979565b6001600160a01b03161480610de55750610de581610b5f612979565b610e575760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610d19565b610e618383612988565b505050565b60408051606081810183526001600160a01b0388166000818152600c602090815290859020548452830152918101869052610ea487828787876129f6565b610efa5760405162461bcd60e51b815260206004820152602160248201527f5369676e657220616e64207369676e617475726520646f206e6f74206d6174636044820152600d60fb1b6064820152608401610d19565b6001600160a01b0387166000908152600c6020526040902054610f1e906001612ae6565b6001600160a01b0388166000908152600c60205260409081902091909155517f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b90610f6e90899033908a906141d8565b60405180910390a1600080306001600160a01b0316888a604051602001610f969291906140fa565b60408051601f1981840301815290829052610fb0916140de565b6000604051808303816000865af19150503d8060008114610fed576040519150601f19603f3d011682016040523d82523d6000602084013e610ff2565b606091505b5091509150816110445760405162461bcd60e51b815260206004820152601c60248201527f46756e6374696f6e2063616c6c206e6f74207375636365737366756c000000006044820152606401610d19565b98975050505050505050565b6018546000908190610100900460ff1615611089576000838152601e602052604090205460ff16915061108283612af9565b9050915091565b506000905080915091565b61109c612979565b6001600160a01b03166110b7600d546001600160a01b031690565b6001600160a01b0316146110dd5760405162461bcd60e51b8152600401610d19906143db565b81811161112c5760405162461bcd60e51b815260206004820152601d60248201527f4661726d6572417065733a20496e76616c69642074696d65207365742e0000006044820152606401610d19565b601682905560178190556040516a70726573616c6554696d6560a81b8152600b01604051908190038120838252907fb7dbf4f78c37528484cb9761beaca968c613f3c6c534b25b1988b912413c68bc9060200160405180910390a26040516d7075626c696353616c6554696d6560901b8152600e01604051908190038120828252907fb7dbf4f78c37528484cb9761beaca968c613f3c6c534b25b1988b912413c68bc9060200160405180910390a25050565b60006111e9612979565b6001600160a01b0316611204600d546001600160a01b031690565b6001600160a01b03161461122a5760405162461bcd60e51b8152600401610d19906143db565b6012546001600160a01b0316156112835760405162461bcd60e51b815260206004820152601d60248201527f546865206170652068617320616c72656164792073656c65637465642e0000006044820152606401610d19565b61128e600f54612bfa565b601280546001600160a01b0319166001600160a01b0392909216918217905590505b90565b602054604051636918579d60e11b81526001600160a01b03858116600483015284811660248301529091169063d230af3a90604401600060405180830381600087803b15801561130257600080fd5b505af1158015611316573d6000803e3d6000fd5b5050505061132381612af9565b6001600160a01b0384166000908152601f60205260408120805490919061134b908490614569565b9091555061135a905081612af9565b6001600160a01b0383166000908152601f6020526040812080549091906113829084906144f9565b90915550610e619050838383612c5d565b61139b612979565b6001600160a01b03166113b6600d546001600160a01b031690565b6001600160a01b0316146113dc5760405162461bcd60e51b8152600401610d19906143db565b60005b81811015610e61576001601960008585858181106113ff576113ff61468e565b90506020020160208101906114149190613c95565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580611446816145e7565b9150506113df565b6000611459836119ac565b82106114bb5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610d19565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6114ec612979565b6001600160a01b0316611507600d546001600160a01b031690565b6001600160a01b03161461152d5760405162461bcd60e51b8152600401610d19906143db565b60148190556040516b70726573616c65507269636560a01b8152600c015b604051908190038120828252907fb7dbf4f78c37528484cb9761beaca968c613f3c6c534b25b1988b912413c68bc9060200160405180910390a250565b611590612979565b6001600160a01b03166115ab600d546001600160a01b031690565b6001600160a01b0316146115d15760405162461bcd60e51b8152600401610d19906143db565b4773a297c335ff5de7b2a8f2f95283456fda26ddbfe46108fc60646115f784600361454a565b6116019190614536565b6040518115909202916000818181858888f19350505050158015611629573d6000803e3d6000fd5b507325f9454abf96c656a151d85cd74efd008838aa546108fc6103e861165084600861454a565b61165a9190614536565b6040518115909202916000818181858888f19350505050158015611682573d6000803e3d6000fd5b5073a9b16c30a17d91a91746b072d7700971651e8d7a6108fc60646116a884600361454a565b6116b29190614536565b6040518115909202916000818181858888f193505050501580156116da573d6000803e3d6000fd5b50600d546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015611714573d6000803e3d6000fd5b5050565b601854600090610100900460ff1661173257506000919050565b6001600160a01b0382166000908152601f6020526040902054610c0c90670de0b6b3a764000061454a565b610e6183838360405180602001604052806000815250612095565b601754421015801561179957506017546117959062093a806144f9565b4211155b6117b55760405162461bcd60e51b8152600401610d1990614320565b336000908152601b60205260409020546117d19060ff16612c95565b336000908152601b6020908152604080832054601c9092528220805460ff92831693919261180191859116614511565b825460ff9182166101009390930a928302919092021990911617905550336000908152601b60205260409020805460ff19169055565b600061184260085490565b82106118a55760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610d19565b600882815481106118b8576118b861468e565b90600052602060002001549050919050565b6118d2612979565b6001600160a01b03166118ed600d546001600160a01b031690565b6001600160a01b0316146119135760405162461bcd60e51b8152600401610d19906143db565b602080546001600160a01b0319166001600160a01b0392909216919091179055565b6000818152600260205260408120546001600160a01b031680610c0c5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610d19565b60006001600160a01b038216611a175760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610d19565b506001600160a01b031660009081526003602052604090205490565b611a3b612979565b6001600160a01b0316611a56600d546001600160a01b031690565b6001600160a01b031614611a7c5760405162461bcd60e51b8152600401610d19906143db565b611a866000612ce0565b565b606060018054610c21906145ac565b60185460009060ff1615611bd2576001600160a01b03821660009081526019602052604090205460ff1680611b4757506021546040516370a0823160e01b81526001600160a01b03848116600483015260009216906370a082319060240160206040518083038186803b158015611b0d57600080fd5b505afa158015611b21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b459190614040565b115b80610c0c57506022546040516370a0823160e01b81526001600160a01b03848116600483015260009216906370a082319060240160206040518083038186803b158015611b9357600080fd5b505afa158015611ba7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bcb9190614040565b1192915050565b506001600160a01b031660009081526019602052604090205460ff1690565b919050565b611bfe612979565b6001600160a01b0316611c19600d546001600160a01b031690565b6001600160a01b031614611c3f5760405162461bcd60e51b8152600401610d19906143db565b6000601754421015611c635760405162461bcd60e51b8152600401610d19906142d2565b60005b8351811015611d1c57828181518110611c8157611c8161468e565b602002602001015160ff1682611c9791906144f9565b9150828181518110611cab57611cab61468e565b6020026020010151601d6000868481518110611cc957611cc961468e565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff021916908360ff1602179055508080611d14906145e7565b915050611c66565b50806011546058611d2d9190614569565b1015611d4b5760405162461bcd60e51b8152600401610d199061438f565b8060116000828254611d5d91906144f9565b9091555050505050565b611d6f612979565b6001600160a01b0316611d8a600d546001600160a01b031690565b6001600160a01b031614611db05760405162461bcd60e51b8152600401610d19906143db565b805161171490600e906020840190613adc565b611dcb612979565b6001600160a01b0316826001600160a01b03161415611e2c5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610d19565b8060056000611e39612979565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155611e7d612979565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611eb9911515815260200190565b60405180910390a35050565b611ecd612979565b6001600160a01b0316611ee8600d546001600160a01b031690565b6001600160a01b031614611f0e5760405162461bcd60e51b8152600401610d19906143db565b60005b8251811015611f87576000611f24612d32565b9050611f63848381518110611f3b57611f3b61468e565b602002602001015182858581518110611f5657611f5661468e565b6020026020010151612d43565b611f6c81612e62565b611f74612fb0565b5080611f7f816145e7565b915050611f11565b508151601154611f98906058614569565b1015611fb65760405162461bcd60e51b8152600401610d199061438f565b815160116000828254611fc991906144f9565b90915550505050565b602054604051636918579d60e11b8152336004820152600060248201526001600160a01b039091169063d230af3a90604401600060405180830381600087803b15801561201e57600080fd5b505af1158015612032573d6000803e3d6000fd5b505060205460405163d279c19160e01b81523360048201526001600160a01b03909116925063d279c1919150602401600060405180830381600087803b15801561207b57600080fd5b505af115801561208f573d6000803e3d6000fd5b50505050565b602054604051636918579d60e11b81526001600160a01b03868116600483015285811660248301529091169063d230af3a90604401600060405180830381600087803b1580156120e457600080fd5b505af11580156120f8573d6000803e3d6000fd5b5050505061210582612af9565b6001600160a01b0385166000908152601f60205260408120805490919061212d908490614569565b9091555061213c905082612af9565b6001600160a01b0384166000908152601f6020526040812080549091906121649084906144f9565b9091555061208f905084848484612fd7565b61217e612979565b6001600160a01b0316612199600d546001600160a01b031690565b6001600160a01b0316146121bf5760405162461bcd60e51b8152600401610d19906143db565b6018805460ff1916911515919091179055565b6121da612979565b6001600160a01b03166121f5600d546001600160a01b031690565b6001600160a01b03161461221b5760405162461bcd60e51b8152600401610d19906143db565b60158190556040516e7075626c696353616c65507269636560881b8152600f0161154b565b6060600e61224d83613010565b60405160200161225e929190614131565b6040516020818303038152906040529050919050565b336000908152601d602052604090205460ff16158015906122a457506017546122a09062093a806144f9565b4211155b6122c05760405162461bcd60e51b8152600401610d1990614320565b336000908152601d60205260409020546122dc9060ff16612c95565b336000908152601d60205260409020805460ff19169055565b600e8054612302906145ac565b80601f016020809104026020016040519081016040528092919081815260200182805461232e906145ac565b801561237b5780601f106123505761010080835404028352916020019161237b565b820191906000526020600020905b81548152906001019060200180831161235e57829003601f168201915b505050505081565b61238b612979565b6001600160a01b03166123a6600d546001600160a01b031690565b6001600160a01b0316146123cc5760405162461bcd60e51b8152600401610d19906143db565b601880549115156101000261ff0019909216919091179055565b601754421015801561240757506017546124039062093a806144f9565b4211155b6124235760405162461bcd60e51b8152600401610d19906142d2565b601054612431576008546010555b336000908152601c6020908152604080832054601b90925290912054600a9160ff90811691612461911684614511565b61246b9190614511565b60ff1611156124f05760405162461bcd60e51b8152602060048201526044602482018190527f4661726d6572417065733a2045616368206164647265737320697320616c6c6f908201527f77656420746f20707572636861736520757020746f203130204661726d6572416064820152633832b99760e11b608482015260a401610d19565b6011546124fe906058614569565b60135461250d906122b8614569565b6125179190614569565b8160ff1660105461252891906144f9565b11156125465760405162461bcd60e51b8152600401610d1990614461565b6015546125569060ff831661454a565b34146125a45760405162461bcd60e51b815260206004820152601a60248201527f4661726d6572417065733a20496e76616c69642076616c75652e0000000000006044820152606401610d19565b336000908152601b6020526040812080548392906125c690849060ff16614511565b92506101000a81548160ff021916908360ff1602179055508060ff16601360008282546125f391906144f9565b909155505050565b612603612979565b6001600160a01b031661261e600d546001600160a01b031690565b6001600160a01b0316146126445760405162461bcd60e51b8152600401610d19906143db565b6001600160a01b0381166126a95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d19565b6126b281612ce0565b50565b6126be33611a97565b6127225760405162461bcd60e51b815260206004820152602f60248201527f4661726d6572417065733a204f6f70732c20736f72727920796f75277265206e60448201526e37ba103bb434ba32b634b9ba32b21760891b6064820152608401610d19565b6016544210158015612742575060165461273f90620151806144f9565b42105b6127a15760405162461bcd60e51b815260206004820152602a60248201527f4661726d6572417065733a2050726573616c65206861732079657420746f2062604482015269329039ba30b93a32b21760b11b6064820152608401610d19565b60145434146127f25760405162461bcd60e51b815260206004820152601a60248201527f4661726d6572417065733a20496e76616c69642076616c75652e0000000000006044820152606401610d19565b336000908152601a602052604090205460ff161561286e5760405162461bcd60e51b815260206004820152603360248201527f4661726d65724170653a20596f752068616420616c726561647920706172746960448201527231b4b830ba32b21034b710383932b9b0b6329760691b6064820152608401610d19565b61287b60586122b8614569565b6008546128899060016144f9565b11156128a75760405162461bcd60e51b8152600401610d1990614461565b6128b16001612c95565b336000908152601a60205260409020805460ff19166001179055565b60003330141561292457600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b031691506112b09050565b503390565b60006001600160e01b031982166380ac58cd60e01b148061295a57506001600160e01b03198216635b5e139f60e01b145b80610c0c57506301ffc9a760e01b6001600160e01b0319831614610c0c565b60006129836128cd565b905090565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906129bd82611935565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006001600160a01b038616612a5c5760405162461bcd60e51b815260206004820152602560248201527f4e61746976654d6574615472616e73616374696f6e3a20494e56414c49445f5360448201526424a3a722a960d91b6064820152608401610d19565b6001612a6f612a6a8761310e565b61318b565b6040805160008152602081018083529290925260ff851690820152606081018690526080810185905260a0016020604051602081039080840390855afa158015612abd573d6000803e3d6000fd5b505050602060405103516001600160a01b0316866001600160a01b031614905095945050505050565b6000612af282846144f9565b9392505050565b600060016000838152601e602052604090205460ff166005811115612b2057612b20614662565b1415612b2e57506006919050565b60026000838152601e602052604090205460ff166005811115612b5357612b53614662565b1415612b6157506007919050565b60036000838152601e602052604090205460ff166005811115612b8657612b86614662565b1415612b9457506008919050565b60046000838152601e602052604090205460ff166005811115612bb957612bb9614662565b1415612bc757506009919050565b60056000838152601e602052604090205460ff166005811115612bec57612bec614662565b1415611bf15750600f919050565b600080600f54612c09846131bb565b612c139190614622565b612c1e9060016144f9565b90506000612c2b82611935565b90506002612c38826119ac565b10612c44579392505050565b612c55612c50856131bb565b612bfa565b949350505050565b612c6e612c68612979565b8261321a565b612c8a5760405162461bcd60e51b8152600401610d1990614410565b610e6183838361330d565b60005b8160ff168160ff161015611714576000612cb0612d32565b9050612cbc33826134b8565b612cc4612fb0565b612ccd81612e62565b5080612cd881614602565b915050612c98565b600d80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600f54600090612983906001612ae6565b6020546040516311ef30b560e31b81526001600160a01b03858116600483015290911690638f7985a890602401600060405180830381600087803b158015612d8a57600080fd5b505af1158015612d9e573d6000803e3d6000fd5b5050505060ff8116612de457612db2613587565b6000838152601e60205260409020805460ff19166001836005811115612dda57612dda614662565b0217905550612e27565b8060ff166005811115612df957612df9614662565b6000838152601e60205260409020805460ff19166001836005811115612e2157612e21614662565b02179055505b612e3183836135ff565b612e3a82612af9565b6001600160a01b0384166000908152601f602052604081208054909190611d5d9084906144f9565b612e6e61037882614622565b612f17576000610378612e80836131bb565b612e8a9190614622565b612e949083614569565b90506000612ea182611935565b6040519091506001600160a01b03821690600090670c52cf4b908c00009082818181858883f19350505050158015612edd573d6000803e3d6000fd5b506040516001600160a01b0382169083907fa6570564778caa6be0a7c28de3f674b3f617cdcab38a948008b26b530d8a4a7390600090a350505b8061115c1480612f3e57506058612f316122b860026144f9565b612f3b9190614569565b81145b156126b257600061115c612f51836131bb565b612f5b9190614622565b612f659083614569565b90506000612f7282611935565b9050806001600160a01b0316827faa47801cd7e2b07f4c788dbd1bb61b8618c2d4086b6147eda7a40317b8723c5a60405160405180910390a3505050565b6122b8600f5410612fc057600080fd5b600f8054906000612fd0836145e7565b9190505550565b612fe8612fe2612979565b8361321a565b6130045760405162461bcd60e51b8152600401610d1990614410565b61208f8484848461374d565b6060816130345750506040805180820190915260018152600360fc1b602082015290565b8160005b811561305e5780613048816145e7565b91506130579050600a83614536565b9150613038565b60008167ffffffffffffffff811115613079576130796146a4565b6040519080825280601f01601f1916602001820160405280156130a3576020820181803683370190505b5090505b8415612c55576130b8600183614569565b91506130c5600a86614622565b6130d09060306144f9565b60f81b8183815181106130e5576130e561468e565b60200101906001600160f81b031916908160001a905350613107600a86614536565b94506130a7565b60006040518060800160405280604381526020016146d1604391398051602091820120835184830151604080870151805190860120905161316e950193845260208401929092526001600160a01b03166040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b6000613196600b5490565b60405161190160f01b602082015260228101919091526042810183905260620161316e565b6000326131c9600143614569565b60405160609290921b6bffffffffffffffffffffffff191660208301524060348201524260548201526074810183905260940160408051601f19818403018152919052805160209091012092915050565b6000818152600260205260408120546001600160a01b03166132935760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610d19565b600061329e83611935565b9050806001600160a01b0316846001600160a01b031614806132d95750836001600160a01b03166132ce84610ca4565b6001600160a01b0316145b80612c5557506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff16612c55565b826001600160a01b031661332082611935565b6001600160a01b0316146133885760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610d19565b6001600160a01b0382166133ea5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610d19565b6133f5838383613780565b613400600082612988565b6001600160a01b0383166000908152600360205260408120805460019290613429908490614569565b90915550506001600160a01b03821660009081526003602052604081208054600192906134579084906144f9565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6020546040516311ef30b560e31b81526001600160a01b03848116600483015290911690638f7985a890602401600060405180830381600087803b1580156134ff57600080fd5b505af1158015613513573d6000803e3d6000fd5b5050505061351f613587565b6000828152601e60205260409020805460ff1916600183600581111561354757613547614662565b021790555061355682826135ff565b61355f81612af9565b6001600160a01b0383166000908152601f602052604081208054909190611fc99084906144f9565b600080612710613598600f546131bb565b6135a29190614622565b6135ad9060016144f9565b9050611f4081116135c057600191505090565b6124ab81116135d157600291505090565b61269f81116135e257600391505090565b61270381116135f357600491505090565b600591505090565b5090565b6001600160a01b0382166136555760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610d19565b6000818152600260205260409020546001600160a01b0316156136ba5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610d19565b6136c660008383613780565b6001600160a01b03821660009081526003602052604081208054600192906136ef9084906144f9565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b61375884848461330d565b61376484848484613838565b61208f5760405162461bcd60e51b8152600401610d1990614280565b6001600160a01b0383166137db576137d681600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6137fe565b816001600160a01b0316836001600160a01b0316146137fe576137fe838261394c565b6001600160a01b03821661381557610e61816139e9565b826001600160a01b0316826001600160a01b031614610e6157610e618282613a98565b60006001600160a01b0384163b1561394157836001600160a01b031663150b7a02613861612979565b8786866040518563ffffffff1660e01b81526004016138839493929190614204565b602060405180830381600087803b15801561389d57600080fd5b505af19250505080156138cd575060408051601f3d908101601f191682019092526138ca91810190613fc1565b60015b613927573d8080156138fb576040519150601f19603f3d011682016040523d82523d6000602084013e613900565b606091505b50805161391f5760405162461bcd60e51b8152600401610d1990614280565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612c55565b506001949350505050565b60006001613959846119ac565b6139639190614569565b6000838152600760205260409020549091508082146139b6576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906139fb90600190614569565b60008381526009602052604081205460088054939450909284908110613a2357613a2361468e565b906000526020600020015490508060088381548110613a4457613a4461468e565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480613a7c57613a7c614678565b6001900381819060005260206000200160009055905550505050565b6000613aa3836119ac565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b828054613ae8906145ac565b90600052602060002090601f016020900481019282613b0a5760008555613b50565b82601f10613b2357805160ff1916838001178555613b50565b82800160010185558215613b50579182015b82811115613b50578251825591602001919060010190613b35565b506135fb9291505b808211156135fb5760008155600101613b58565b600067ffffffffffffffff831115613b8657613b866146a4565b613b99601f8401601f19166020016144a4565b9050828152838383011115613bad57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b0381168114611bf157600080fd5b600082601f830112613bec57600080fd5b81356020613c01613bfc836144d5565b6144a4565b80838252828201915082860187848660051b8901011115613c2157600080fd5b60005b85811015613c4757613c3582613c84565b84529284019290840190600101613c24565b5090979650505050505050565b80358015158114611bf157600080fd5b600082601f830112613c7557600080fd5b612af283833560208501613b6c565b803560ff81168114611bf157600080fd5b600060208284031215613ca757600080fd5b612af282613bc4565b60008060408385031215613cc357600080fd5b613ccc83613bc4565b9150613cda60208401613bc4565b90509250929050565b600080600060608486031215613cf857600080fd5b613d0184613bc4565b9250613d0f60208501613bc4565b9150604084013590509250925092565b60008060008060808587031215613d3557600080fd5b613d3e85613bc4565b9350613d4c60208601613bc4565b925060408501359150606085013567ffffffffffffffff811115613d6f57600080fd5b613d7b87828801613c64565b91505092959194509250565b60008060408385031215613d9a57600080fd5b613da383613bc4565b9150613cda60208401613c54565b600080600080600060a08688031215613dc957600080fd5b613dd286613bc4565b9450602086013567ffffffffffffffff811115613dee57600080fd5b613dfa88828901613c64565b9450506040860135925060608601359150613e1760808701613c84565b90509295509295909350565b60008060408385031215613e3657600080fd5b613e3f83613bc4565b946020939093013593505050565b60008060208385031215613e6057600080fd5b823567ffffffffffffffff80821115613e7857600080fd5b818501915085601f830112613e8c57600080fd5b813581811115613e9b57600080fd5b8660208260051b8501011115613eb057600080fd5b60209290920196919550909350505050565b60008060408385031215613ed557600080fd5b823567ffffffffffffffff80821115613eed57600080fd5b818501915085601f830112613f0157600080fd5b81356020613f11613bfc836144d5565b8083825282820191508286018a848660051b8901011115613f3157600080fd5b600096505b84871015613f5b57613f4781613bc4565b835260019690960195918301918301613f36565b5096505086013592505080821115613f7257600080fd5b50613f7f85828601613bdb565b9150509250929050565b600060208284031215613f9b57600080fd5b612af282613c54565b600060208284031215613fb657600080fd5b8135612af2816146ba565b600060208284031215613fd357600080fd5b8151612af2816146ba565b600060208284031215613ff057600080fd5b813567ffffffffffffffff81111561400757600080fd5b8201601f8101841361401857600080fd5b612c5584823560208401613b6c565b60006020828403121561403957600080fd5b5035919050565b60006020828403121561405257600080fd5b5051919050565b6000806040838503121561406c57600080fd5b50508035926020909101359150565b60006020828403121561408d57600080fd5b612af282613c84565b600081518084526140ae816020860160208601614580565b601f01601f19169290920160200192915050565b600081516140d4818560208601614580565b9290920192915050565b600082516140f0818460208701614580565b9190910192915050565b6000835161410c818460208801614580565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b600080845481600182811c91508083168061414d57607f831692505b602080841082141561416d57634e487b7160e01b86526022600452602486fd5b8180156141815760018114614192576141bf565b60ff198616895284890196506141bf565b60008b81526020902060005b868110156141b75781548b82015290850190830161419e565b505084890196505b5050505050506141cf81856140c2565b95945050505050565b6001600160a01b038481168252831660208201526060604082018190526000906141cf90830184614096565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061423790830184614096565b9695505050505050565b602081526000612af26020830184614096565b604081016006841061427657634e487b7160e01b600052602160045260246000fd5b9281526020015290565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252602e908201527f4661726d6572417065733a205075626c69632073616c6520686173207965742060408201526d3a379031329039ba30b93a32b21760911b606082015260800190565b60208082526049908201527f4661726d6572417065733a20596f752068617665206d6973736564207468652060408201527f74696d652077696e646f772e20596f7572204661726d657220417065206861736060820152681032b9b1b0b832b21760b91b608082015260a00190565b6020808252602c908201527f5765277665207265616368656420746865206d6178696d756d206f662061697260408201526b323937b8103634b6b4ba399760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526023908201527f4661726d6572417065733a20536f7272792c2077652061726520736f6c64206f6040820152623aba1760e91b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff811182821017156144cd576144cd6146a4565b604052919050565b600067ffffffffffffffff8211156144ef576144ef6146a4565b5060051b60200190565b6000821982111561450c5761450c614636565b500190565b600060ff821660ff84168060ff0382111561452e5761452e614636565b019392505050565b6000826145455761454561464c565b500490565b600081600019048311821515161561456457614564614636565b500290565b60008282101561457b5761457b614636565b500390565b60005b8381101561459b578181015183820152602001614583565b8381111561208f5750506000910152565b600181811c908216806145c057607f821691505b602082108114156145e157634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156145fb576145fb614636565b5060010190565b600060ff821660ff81141561461957614619614636565b60010192915050565b6000826146315761463161464c565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146126b257600080fdfe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529a264697066735822122073f2b9dbef78c7193b67385158dda17c20c71a00480dede27910a8813bb139da64736f6c63430008070033454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c6164647265737320766572696679696e67436f6e74726163742c627974657333322073616c742900000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000bc4ca0eda7647a8ab7c2061c2e118a18a936f13d00000000000000000000000060e4d786628fea6478f785a6d7e704777c86a7c600000000000000000000000000000000000000000000000000000000000000164661726d65722041706573205969656c6420436c75620000000000000000000000000000000000000000000000000000000000000000000000000000000000044641594300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002968747470733a2f2f6e66742e6661726d6572617065732e636f6d2f6170692f6661726d65726170652f0000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106103d15760003560e01c80636352211e116101fd578063b88a802f11610118578063d25f82a0116100ab578063e985e9c51161007a578063e985e9c514610b44578063f11ef5cf14610b8d578063f2fde38b14610ba0578063f45c63ee14610bc0578063fdea8e0b14610bdf57600080fd5b8063d25f82a014610aca578063d547cfb714610adf578063da9425e214610af4578063e846423814610b2457600080fd5b8063c6e62e0b116100e7578063c6e62e0b14610a4e578063c71b0e1c14610a64578063c87b56dd14610a7a578063c884ef8314610a9a57600080fd5b8063b88a802f146109d9578063b88d4fde146109ee578063bbfda60a14610a0e578063c627525514610a2e57600080fd5b806395d89b4111610190578063a0bcfc7f1161015f578063a0bcfc7f14610959578063a22cb46514610979578063ab736f1c14610999578063b0c1d7d8146109b957600080fd5b806395d89b41146108ee5780639b6860c8146109035780639cce37c614610919578063a061a03a1461093957600080fd5b80637f59230f116101cc5780637f59230f146108595780638a6dc8a4146108805780638da5cb5b146108b05780639582b6e5146108ce57600080fd5b80636352211e146107e457806370a0823114610804578063715018a61461082457806376d5de851461083957600080fd5b806329a5f81e116102ed5780634229abdd1161028057806350d549151161024f57806350d549151461076857806355daf2101461077e5780635b9e82c5146107ae5780635cee11f3146107ce57600080fd5b80634229abdd146106f357806342842e0e146107135780634e71d92d146107335780634f6ccce71461074857600080fd5b80633408e470116102bc5780633408e470146106915780633549345e146106a4578063388dabfc146106c45780633ccfd60b146106de57600080fd5b806329a5f81e146106055780632d0335ab146106255780632f745c591461065b57806332cb6b0c1461067b57600080fd5b80631371dab91161036557806321f1b6771161033457806321f1b6771461059a5780632344be0a146105ba5780632360bab9146105d057806323b872dd146105e557600080fd5b80631371dab91461051257806318160ddd1461054257806320379ee5146105575780632117f1b61461056c57600080fd5b8063095ea7b3116103a1578063095ea7b3146104905780630c53c51c146104b25780630da10a83146104c55780630f7e5970146104e557600080fd5b80620e7fa8146103dd57806301ffc9a71461040657806306fdde0314610436578063081812fc1461045857600080fd5b366103d857005b600080fd5b3480156103e957600080fd5b506103f360145481565b6040519081526020015b60405180910390f35b34801561041257600080fd5b50610426610421366004613fa4565b610be7565b60405190151581526020016103fd565b34801561044257600080fd5b5061044b610c12565b6040516103fd9190614241565b34801561046457600080fd5b50610478610473366004614027565b610ca4565b6040516001600160a01b0390911681526020016103fd565b34801561049c57600080fd5b506104b06104ab366004613e23565b610d3e565b005b61044b6104c0366004613db1565b610e66565b3480156104d157600080fd5b50601254610478906001600160a01b031681565b3480156104f157600080fd5b5061044b604051806040016040528060018152602001603160f81b81525081565b34801561051e57600080fd5b5061042661052d366004613c95565b60196020526000908152604090205460ff1681565b34801561054e57600080fd5b506008546103f3565b34801561056357600080fd5b50600b546103f3565b34801561057857600080fd5b5061058c610587366004614027565b611050565b6040516103fd929190614254565b3480156105a657600080fd5b506104b06105b5366004614059565b611094565b3480156105c657600080fd5b506103f360175481565b3480156105dc57600080fd5b506104786111df565b3480156105f157600080fd5b506104b0610600366004613ce3565b6112b3565b34801561061157600080fd5b506104b0610620366004613e4d565b611393565b34801561063157600080fd5b506103f3610640366004613c95565b6001600160a01b03166000908152600c602052604090205490565b34801561066757600080fd5b506103f3610676366004613e23565b61144e565b34801561068757600080fd5b506103f36122b881565b34801561069d57600080fd5b50466103f3565b3480156106b057600080fd5b506104b06106bf366004614027565b6114e4565b3480156106d057600080fd5b506018546104269060ff1681565b3480156106ea57600080fd5b506104b0611588565b3480156106ff57600080fd5b506103f361070e366004613c95565b611718565b34801561071f57600080fd5b506104b061072e366004613ce3565b61175d565b34801561073f57600080fd5b506104b0611778565b34801561075457600080fd5b506103f3610763366004614027565b611837565b34801561077457600080fd5b506103f360115481565b34801561078a57600080fd5b50610426610799366004613c95565b601a6020526000908152604090205460ff1681565b3480156107ba57600080fd5b506104b06107c9366004613c95565b6118ca565b3480156107da57600080fd5b506103f360105481565b3480156107f057600080fd5b506104786107ff366004614027565b611935565b34801561081057600080fd5b506103f361081f366004613c95565b6119ac565b34801561083057600080fd5b506104b0611a33565b34801561084557600080fd5b50602054610478906001600160a01b031681565b34801561086557600080fd5b5061086e600a81565b60405160ff90911681526020016103fd565b34801561088c57600080fd5b5061086e61089b366004613c95565b601d6020526000908152604090205460ff1681565b3480156108bc57600080fd5b50600d546001600160a01b0316610478565b3480156108da57600080fd5b50602154610478906001600160a01b031681565b3480156108fa57600080fd5b5061044b611a88565b34801561090f57600080fd5b506103f360155481565b34801561092557600080fd5b50610426610934366004613c95565b611a97565b34801561094557600080fd5b506104b0610954366004613ec2565b611bf6565b34801561096557600080fd5b506104b0610974366004613fde565b611d67565b34801561098557600080fd5b506104b0610994366004613d87565b611dc3565b3480156109a557600080fd5b50602254610478906001600160a01b031681565b3480156109c557600080fd5b506104b06109d4366004613ec2565b611ec5565b3480156109e557600080fd5b506104b0611fd2565b3480156109fa57600080fd5b506104b0610a09366004613d1f565b612095565b348015610a1a57600080fd5b506104b0610a29366004613f89565b612176565b348015610a3a57600080fd5b506104b0610a49366004614027565b6121d2565b348015610a5a57600080fd5b506103f360165481565b348015610a7057600080fd5b506103f360135481565b348015610a8657600080fd5b5061044b610a95366004614027565b612240565b348015610aa657600080fd5b5061086e610ab5366004613c95565b601c6020526000908152604090205460ff1681565b348015610ad657600080fd5b506104b0612274565b348015610aeb57600080fd5b5061044b6122f5565b348015610b0057600080fd5b5061086e610b0f366004613c95565b601b6020526000908152604090205460ff1681565b348015610b3057600080fd5b506104b0610b3f366004613f89565b612383565b348015610b5057600080fd5b50610426610b5f366004613cb0565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6104b0610b9b36600461407b565b6123e6565b348015610bac57600080fd5b506104b0610bbb366004613c95565b6125fb565b348015610bcc57600080fd5b5060185461042690610100900460ff1681565b6104b06126b5565b60006001600160e01b0319821663780e9d6360e01b1480610c0c5750610c0c82612929565b92915050565b606060008054610c21906145ac565b80601f0160208091040260200160405190810160405280929190818152602001828054610c4d906145ac565b8015610c9a5780601f10610c6f57610100808354040283529160200191610c9a565b820191906000526020600020905b815481529060010190602001808311610c7d57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610d225760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610d4982611935565b9050806001600160a01b0316836001600160a01b03161415610db75760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610d19565b806001600160a01b0316610dc9612979565b6001600160a01b03161480610de55750610de581610b5f612979565b610e575760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610d19565b610e618383612988565b505050565b60408051606081810183526001600160a01b0388166000818152600c602090815290859020548452830152918101869052610ea487828787876129f6565b610efa5760405162461bcd60e51b815260206004820152602160248201527f5369676e657220616e64207369676e617475726520646f206e6f74206d6174636044820152600d60fb1b6064820152608401610d19565b6001600160a01b0387166000908152600c6020526040902054610f1e906001612ae6565b6001600160a01b0388166000908152600c60205260409081902091909155517f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b90610f6e90899033908a906141d8565b60405180910390a1600080306001600160a01b0316888a604051602001610f969291906140fa565b60408051601f1981840301815290829052610fb0916140de565b6000604051808303816000865af19150503d8060008114610fed576040519150601f19603f3d011682016040523d82523d6000602084013e610ff2565b606091505b5091509150816110445760405162461bcd60e51b815260206004820152601c60248201527f46756e6374696f6e2063616c6c206e6f74207375636365737366756c000000006044820152606401610d19565b98975050505050505050565b6018546000908190610100900460ff1615611089576000838152601e602052604090205460ff16915061108283612af9565b9050915091565b506000905080915091565b61109c612979565b6001600160a01b03166110b7600d546001600160a01b031690565b6001600160a01b0316146110dd5760405162461bcd60e51b8152600401610d19906143db565b81811161112c5760405162461bcd60e51b815260206004820152601d60248201527f4661726d6572417065733a20496e76616c69642074696d65207365742e0000006044820152606401610d19565b601682905560178190556040516a70726573616c6554696d6560a81b8152600b01604051908190038120838252907fb7dbf4f78c37528484cb9761beaca968c613f3c6c534b25b1988b912413c68bc9060200160405180910390a26040516d7075626c696353616c6554696d6560901b8152600e01604051908190038120828252907fb7dbf4f78c37528484cb9761beaca968c613f3c6c534b25b1988b912413c68bc9060200160405180910390a25050565b60006111e9612979565b6001600160a01b0316611204600d546001600160a01b031690565b6001600160a01b03161461122a5760405162461bcd60e51b8152600401610d19906143db565b6012546001600160a01b0316156112835760405162461bcd60e51b815260206004820152601d60248201527f546865206170652068617320616c72656164792073656c65637465642e0000006044820152606401610d19565b61128e600f54612bfa565b601280546001600160a01b0319166001600160a01b0392909216918217905590505b90565b602054604051636918579d60e11b81526001600160a01b03858116600483015284811660248301529091169063d230af3a90604401600060405180830381600087803b15801561130257600080fd5b505af1158015611316573d6000803e3d6000fd5b5050505061132381612af9565b6001600160a01b0384166000908152601f60205260408120805490919061134b908490614569565b9091555061135a905081612af9565b6001600160a01b0383166000908152601f6020526040812080549091906113829084906144f9565b90915550610e619050838383612c5d565b61139b612979565b6001600160a01b03166113b6600d546001600160a01b031690565b6001600160a01b0316146113dc5760405162461bcd60e51b8152600401610d19906143db565b60005b81811015610e61576001601960008585858181106113ff576113ff61468e565b90506020020160208101906114149190613c95565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580611446816145e7565b9150506113df565b6000611459836119ac565b82106114bb5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610d19565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6114ec612979565b6001600160a01b0316611507600d546001600160a01b031690565b6001600160a01b03161461152d5760405162461bcd60e51b8152600401610d19906143db565b60148190556040516b70726573616c65507269636560a01b8152600c015b604051908190038120828252907fb7dbf4f78c37528484cb9761beaca968c613f3c6c534b25b1988b912413c68bc9060200160405180910390a250565b611590612979565b6001600160a01b03166115ab600d546001600160a01b031690565b6001600160a01b0316146115d15760405162461bcd60e51b8152600401610d19906143db565b4773a297c335ff5de7b2a8f2f95283456fda26ddbfe46108fc60646115f784600361454a565b6116019190614536565b6040518115909202916000818181858888f19350505050158015611629573d6000803e3d6000fd5b507325f9454abf96c656a151d85cd74efd008838aa546108fc6103e861165084600861454a565b61165a9190614536565b6040518115909202916000818181858888f19350505050158015611682573d6000803e3d6000fd5b5073a9b16c30a17d91a91746b072d7700971651e8d7a6108fc60646116a884600361454a565b6116b29190614536565b6040518115909202916000818181858888f193505050501580156116da573d6000803e3d6000fd5b50600d546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015611714573d6000803e3d6000fd5b5050565b601854600090610100900460ff1661173257506000919050565b6001600160a01b0382166000908152601f6020526040902054610c0c90670de0b6b3a764000061454a565b610e6183838360405180602001604052806000815250612095565b601754421015801561179957506017546117959062093a806144f9565b4211155b6117b55760405162461bcd60e51b8152600401610d1990614320565b336000908152601b60205260409020546117d19060ff16612c95565b336000908152601b6020908152604080832054601c9092528220805460ff92831693919261180191859116614511565b825460ff9182166101009390930a928302919092021990911617905550336000908152601b60205260409020805460ff19169055565b600061184260085490565b82106118a55760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610d19565b600882815481106118b8576118b861468e565b90600052602060002001549050919050565b6118d2612979565b6001600160a01b03166118ed600d546001600160a01b031690565b6001600160a01b0316146119135760405162461bcd60e51b8152600401610d19906143db565b602080546001600160a01b0319166001600160a01b0392909216919091179055565b6000818152600260205260408120546001600160a01b031680610c0c5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610d19565b60006001600160a01b038216611a175760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610d19565b506001600160a01b031660009081526003602052604090205490565b611a3b612979565b6001600160a01b0316611a56600d546001600160a01b031690565b6001600160a01b031614611a7c5760405162461bcd60e51b8152600401610d19906143db565b611a866000612ce0565b565b606060018054610c21906145ac565b60185460009060ff1615611bd2576001600160a01b03821660009081526019602052604090205460ff1680611b4757506021546040516370a0823160e01b81526001600160a01b03848116600483015260009216906370a082319060240160206040518083038186803b158015611b0d57600080fd5b505afa158015611b21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b459190614040565b115b80610c0c57506022546040516370a0823160e01b81526001600160a01b03848116600483015260009216906370a082319060240160206040518083038186803b158015611b9357600080fd5b505afa158015611ba7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bcb9190614040565b1192915050565b506001600160a01b031660009081526019602052604090205460ff1690565b919050565b611bfe612979565b6001600160a01b0316611c19600d546001600160a01b031690565b6001600160a01b031614611c3f5760405162461bcd60e51b8152600401610d19906143db565b6000601754421015611c635760405162461bcd60e51b8152600401610d19906142d2565b60005b8351811015611d1c57828181518110611c8157611c8161468e565b602002602001015160ff1682611c9791906144f9565b9150828181518110611cab57611cab61468e565b6020026020010151601d6000868481518110611cc957611cc961468e565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff021916908360ff1602179055508080611d14906145e7565b915050611c66565b50806011546058611d2d9190614569565b1015611d4b5760405162461bcd60e51b8152600401610d199061438f565b8060116000828254611d5d91906144f9565b9091555050505050565b611d6f612979565b6001600160a01b0316611d8a600d546001600160a01b031690565b6001600160a01b031614611db05760405162461bcd60e51b8152600401610d19906143db565b805161171490600e906020840190613adc565b611dcb612979565b6001600160a01b0316826001600160a01b03161415611e2c5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610d19565b8060056000611e39612979565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155611e7d612979565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611eb9911515815260200190565b60405180910390a35050565b611ecd612979565b6001600160a01b0316611ee8600d546001600160a01b031690565b6001600160a01b031614611f0e5760405162461bcd60e51b8152600401610d19906143db565b60005b8251811015611f87576000611f24612d32565b9050611f63848381518110611f3b57611f3b61468e565b602002602001015182858581518110611f5657611f5661468e565b6020026020010151612d43565b611f6c81612e62565b611f74612fb0565b5080611f7f816145e7565b915050611f11565b508151601154611f98906058614569565b1015611fb65760405162461bcd60e51b8152600401610d199061438f565b815160116000828254611fc991906144f9565b90915550505050565b602054604051636918579d60e11b8152336004820152600060248201526001600160a01b039091169063d230af3a90604401600060405180830381600087803b15801561201e57600080fd5b505af1158015612032573d6000803e3d6000fd5b505060205460405163d279c19160e01b81523360048201526001600160a01b03909116925063d279c1919150602401600060405180830381600087803b15801561207b57600080fd5b505af115801561208f573d6000803e3d6000fd5b50505050565b602054604051636918579d60e11b81526001600160a01b03868116600483015285811660248301529091169063d230af3a90604401600060405180830381600087803b1580156120e457600080fd5b505af11580156120f8573d6000803e3d6000fd5b5050505061210582612af9565b6001600160a01b0385166000908152601f60205260408120805490919061212d908490614569565b9091555061213c905082612af9565b6001600160a01b0384166000908152601f6020526040812080549091906121649084906144f9565b9091555061208f905084848484612fd7565b61217e612979565b6001600160a01b0316612199600d546001600160a01b031690565b6001600160a01b0316146121bf5760405162461bcd60e51b8152600401610d19906143db565b6018805460ff1916911515919091179055565b6121da612979565b6001600160a01b03166121f5600d546001600160a01b031690565b6001600160a01b03161461221b5760405162461bcd60e51b8152600401610d19906143db565b60158190556040516e7075626c696353616c65507269636560881b8152600f0161154b565b6060600e61224d83613010565b60405160200161225e929190614131565b6040516020818303038152906040529050919050565b336000908152601d602052604090205460ff16158015906122a457506017546122a09062093a806144f9565b4211155b6122c05760405162461bcd60e51b8152600401610d1990614320565b336000908152601d60205260409020546122dc9060ff16612c95565b336000908152601d60205260409020805460ff19169055565b600e8054612302906145ac565b80601f016020809104026020016040519081016040528092919081815260200182805461232e906145ac565b801561237b5780601f106123505761010080835404028352916020019161237b565b820191906000526020600020905b81548152906001019060200180831161235e57829003601f168201915b505050505081565b61238b612979565b6001600160a01b03166123a6600d546001600160a01b031690565b6001600160a01b0316146123cc5760405162461bcd60e51b8152600401610d19906143db565b601880549115156101000261ff0019909216919091179055565b601754421015801561240757506017546124039062093a806144f9565b4211155b6124235760405162461bcd60e51b8152600401610d19906142d2565b601054612431576008546010555b336000908152601c6020908152604080832054601b90925290912054600a9160ff90811691612461911684614511565b61246b9190614511565b60ff1611156124f05760405162461bcd60e51b8152602060048201526044602482018190527f4661726d6572417065733a2045616368206164647265737320697320616c6c6f908201527f77656420746f20707572636861736520757020746f203130204661726d6572416064820152633832b99760e11b608482015260a401610d19565b6011546124fe906058614569565b60135461250d906122b8614569565b6125179190614569565b8160ff1660105461252891906144f9565b11156125465760405162461bcd60e51b8152600401610d1990614461565b6015546125569060ff831661454a565b34146125a45760405162461bcd60e51b815260206004820152601a60248201527f4661726d6572417065733a20496e76616c69642076616c75652e0000000000006044820152606401610d19565b336000908152601b6020526040812080548392906125c690849060ff16614511565b92506101000a81548160ff021916908360ff1602179055508060ff16601360008282546125f391906144f9565b909155505050565b612603612979565b6001600160a01b031661261e600d546001600160a01b031690565b6001600160a01b0316146126445760405162461bcd60e51b8152600401610d19906143db565b6001600160a01b0381166126a95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d19565b6126b281612ce0565b50565b6126be33611a97565b6127225760405162461bcd60e51b815260206004820152602f60248201527f4661726d6572417065733a204f6f70732c20736f72727920796f75277265206e60448201526e37ba103bb434ba32b634b9ba32b21760891b6064820152608401610d19565b6016544210158015612742575060165461273f90620151806144f9565b42105b6127a15760405162461bcd60e51b815260206004820152602a60248201527f4661726d6572417065733a2050726573616c65206861732079657420746f2062604482015269329039ba30b93a32b21760b11b6064820152608401610d19565b60145434146127f25760405162461bcd60e51b815260206004820152601a60248201527f4661726d6572417065733a20496e76616c69642076616c75652e0000000000006044820152606401610d19565b336000908152601a602052604090205460ff161561286e5760405162461bcd60e51b815260206004820152603360248201527f4661726d65724170653a20596f752068616420616c726561647920706172746960448201527231b4b830ba32b21034b710383932b9b0b6329760691b6064820152608401610d19565b61287b60586122b8614569565b6008546128899060016144f9565b11156128a75760405162461bcd60e51b8152600401610d1990614461565b6128b16001612c95565b336000908152601a60205260409020805460ff19166001179055565b60003330141561292457600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b031691506112b09050565b503390565b60006001600160e01b031982166380ac58cd60e01b148061295a57506001600160e01b03198216635b5e139f60e01b145b80610c0c57506301ffc9a760e01b6001600160e01b0319831614610c0c565b60006129836128cd565b905090565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906129bd82611935565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006001600160a01b038616612a5c5760405162461bcd60e51b815260206004820152602560248201527f4e61746976654d6574615472616e73616374696f6e3a20494e56414c49445f5360448201526424a3a722a960d91b6064820152608401610d19565b6001612a6f612a6a8761310e565b61318b565b6040805160008152602081018083529290925260ff851690820152606081018690526080810185905260a0016020604051602081039080840390855afa158015612abd573d6000803e3d6000fd5b505050602060405103516001600160a01b0316866001600160a01b031614905095945050505050565b6000612af282846144f9565b9392505050565b600060016000838152601e602052604090205460ff166005811115612b2057612b20614662565b1415612b2e57506006919050565b60026000838152601e602052604090205460ff166005811115612b5357612b53614662565b1415612b6157506007919050565b60036000838152601e602052604090205460ff166005811115612b8657612b86614662565b1415612b9457506008919050565b60046000838152601e602052604090205460ff166005811115612bb957612bb9614662565b1415612bc757506009919050565b60056000838152601e602052604090205460ff166005811115612bec57612bec614662565b1415611bf15750600f919050565b600080600f54612c09846131bb565b612c139190614622565b612c1e9060016144f9565b90506000612c2b82611935565b90506002612c38826119ac565b10612c44579392505050565b612c55612c50856131bb565b612bfa565b949350505050565b612c6e612c68612979565b8261321a565b612c8a5760405162461bcd60e51b8152600401610d1990614410565b610e6183838361330d565b60005b8160ff168160ff161015611714576000612cb0612d32565b9050612cbc33826134b8565b612cc4612fb0565b612ccd81612e62565b5080612cd881614602565b915050612c98565b600d80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600f54600090612983906001612ae6565b6020546040516311ef30b560e31b81526001600160a01b03858116600483015290911690638f7985a890602401600060405180830381600087803b158015612d8a57600080fd5b505af1158015612d9e573d6000803e3d6000fd5b5050505060ff8116612de457612db2613587565b6000838152601e60205260409020805460ff19166001836005811115612dda57612dda614662565b0217905550612e27565b8060ff166005811115612df957612df9614662565b6000838152601e60205260409020805460ff19166001836005811115612e2157612e21614662565b02179055505b612e3183836135ff565b612e3a82612af9565b6001600160a01b0384166000908152601f602052604081208054909190611d5d9084906144f9565b612e6e61037882614622565b612f17576000610378612e80836131bb565b612e8a9190614622565b612e949083614569565b90506000612ea182611935565b6040519091506001600160a01b03821690600090670c52cf4b908c00009082818181858883f19350505050158015612edd573d6000803e3d6000fd5b506040516001600160a01b0382169083907fa6570564778caa6be0a7c28de3f674b3f617cdcab38a948008b26b530d8a4a7390600090a350505b8061115c1480612f3e57506058612f316122b860026144f9565b612f3b9190614569565b81145b156126b257600061115c612f51836131bb565b612f5b9190614622565b612f659083614569565b90506000612f7282611935565b9050806001600160a01b0316827faa47801cd7e2b07f4c788dbd1bb61b8618c2d4086b6147eda7a40317b8723c5a60405160405180910390a3505050565b6122b8600f5410612fc057600080fd5b600f8054906000612fd0836145e7565b9190505550565b612fe8612fe2612979565b8361321a565b6130045760405162461bcd60e51b8152600401610d1990614410565b61208f8484848461374d565b6060816130345750506040805180820190915260018152600360fc1b602082015290565b8160005b811561305e5780613048816145e7565b91506130579050600a83614536565b9150613038565b60008167ffffffffffffffff811115613079576130796146a4565b6040519080825280601f01601f1916602001820160405280156130a3576020820181803683370190505b5090505b8415612c55576130b8600183614569565b91506130c5600a86614622565b6130d09060306144f9565b60f81b8183815181106130e5576130e561468e565b60200101906001600160f81b031916908160001a905350613107600a86614536565b94506130a7565b60006040518060800160405280604381526020016146d1604391398051602091820120835184830151604080870151805190860120905161316e950193845260208401929092526001600160a01b03166040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b6000613196600b5490565b60405161190160f01b602082015260228101919091526042810183905260620161316e565b6000326131c9600143614569565b60405160609290921b6bffffffffffffffffffffffff191660208301524060348201524260548201526074810183905260940160408051601f19818403018152919052805160209091012092915050565b6000818152600260205260408120546001600160a01b03166132935760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610d19565b600061329e83611935565b9050806001600160a01b0316846001600160a01b031614806132d95750836001600160a01b03166132ce84610ca4565b6001600160a01b0316145b80612c5557506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff16612c55565b826001600160a01b031661332082611935565b6001600160a01b0316146133885760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610d19565b6001600160a01b0382166133ea5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610d19565b6133f5838383613780565b613400600082612988565b6001600160a01b0383166000908152600360205260408120805460019290613429908490614569565b90915550506001600160a01b03821660009081526003602052604081208054600192906134579084906144f9565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6020546040516311ef30b560e31b81526001600160a01b03848116600483015290911690638f7985a890602401600060405180830381600087803b1580156134ff57600080fd5b505af1158015613513573d6000803e3d6000fd5b5050505061351f613587565b6000828152601e60205260409020805460ff1916600183600581111561354757613547614662565b021790555061355682826135ff565b61355f81612af9565b6001600160a01b0383166000908152601f602052604081208054909190611fc99084906144f9565b600080612710613598600f546131bb565b6135a29190614622565b6135ad9060016144f9565b9050611f4081116135c057600191505090565b6124ab81116135d157600291505090565b61269f81116135e257600391505090565b61270381116135f357600491505090565b600591505090565b5090565b6001600160a01b0382166136555760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610d19565b6000818152600260205260409020546001600160a01b0316156136ba5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610d19565b6136c660008383613780565b6001600160a01b03821660009081526003602052604081208054600192906136ef9084906144f9565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b61375884848461330d565b61376484848484613838565b61208f5760405162461bcd60e51b8152600401610d1990614280565b6001600160a01b0383166137db576137d681600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6137fe565b816001600160a01b0316836001600160a01b0316146137fe576137fe838261394c565b6001600160a01b03821661381557610e61816139e9565b826001600160a01b0316826001600160a01b031614610e6157610e618282613a98565b60006001600160a01b0384163b1561394157836001600160a01b031663150b7a02613861612979565b8786866040518563ffffffff1660e01b81526004016138839493929190614204565b602060405180830381600087803b15801561389d57600080fd5b505af19250505080156138cd575060408051601f3d908101601f191682019092526138ca91810190613fc1565b60015b613927573d8080156138fb576040519150601f19603f3d011682016040523d82523d6000602084013e613900565b606091505b50805161391f5760405162461bcd60e51b8152600401610d1990614280565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612c55565b506001949350505050565b60006001613959846119ac565b6139639190614569565b6000838152600760205260409020549091508082146139b6576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906139fb90600190614569565b60008381526009602052604081205460088054939450909284908110613a2357613a2361468e565b906000526020600020015490508060088381548110613a4457613a4461468e565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480613a7c57613a7c614678565b6001900381819060005260206000200160009055905550505050565b6000613aa3836119ac565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b828054613ae8906145ac565b90600052602060002090601f016020900481019282613b0a5760008555613b50565b82601f10613b2357805160ff1916838001178555613b50565b82800160010185558215613b50579182015b82811115613b50578251825591602001919060010190613b35565b506135fb9291505b808211156135fb5760008155600101613b58565b600067ffffffffffffffff831115613b8657613b866146a4565b613b99601f8401601f19166020016144a4565b9050828152838383011115613bad57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b0381168114611bf157600080fd5b600082601f830112613bec57600080fd5b81356020613c01613bfc836144d5565b6144a4565b80838252828201915082860187848660051b8901011115613c2157600080fd5b60005b85811015613c4757613c3582613c84565b84529284019290840190600101613c24565b5090979650505050505050565b80358015158114611bf157600080fd5b600082601f830112613c7557600080fd5b612af283833560208501613b6c565b803560ff81168114611bf157600080fd5b600060208284031215613ca757600080fd5b612af282613bc4565b60008060408385031215613cc357600080fd5b613ccc83613bc4565b9150613cda60208401613bc4565b90509250929050565b600080600060608486031215613cf857600080fd5b613d0184613bc4565b9250613d0f60208501613bc4565b9150604084013590509250925092565b60008060008060808587031215613d3557600080fd5b613d3e85613bc4565b9350613d4c60208601613bc4565b925060408501359150606085013567ffffffffffffffff811115613d6f57600080fd5b613d7b87828801613c64565b91505092959194509250565b60008060408385031215613d9a57600080fd5b613da383613bc4565b9150613cda60208401613c54565b600080600080600060a08688031215613dc957600080fd5b613dd286613bc4565b9450602086013567ffffffffffffffff811115613dee57600080fd5b613dfa88828901613c64565b9450506040860135925060608601359150613e1760808701613c84565b90509295509295909350565b60008060408385031215613e3657600080fd5b613e3f83613bc4565b946020939093013593505050565b60008060208385031215613e6057600080fd5b823567ffffffffffffffff80821115613e7857600080fd5b818501915085601f830112613e8c57600080fd5b813581811115613e9b57600080fd5b8660208260051b8501011115613eb057600080fd5b60209290920196919550909350505050565b60008060408385031215613ed557600080fd5b823567ffffffffffffffff80821115613eed57600080fd5b818501915085601f830112613f0157600080fd5b81356020613f11613bfc836144d5565b8083825282820191508286018a848660051b8901011115613f3157600080fd5b600096505b84871015613f5b57613f4781613bc4565b835260019690960195918301918301613f36565b5096505086013592505080821115613f7257600080fd5b50613f7f85828601613bdb565b9150509250929050565b600060208284031215613f9b57600080fd5b612af282613c54565b600060208284031215613fb657600080fd5b8135612af2816146ba565b600060208284031215613fd357600080fd5b8151612af2816146ba565b600060208284031215613ff057600080fd5b813567ffffffffffffffff81111561400757600080fd5b8201601f8101841361401857600080fd5b612c5584823560208401613b6c565b60006020828403121561403957600080fd5b5035919050565b60006020828403121561405257600080fd5b5051919050565b6000806040838503121561406c57600080fd5b50508035926020909101359150565b60006020828403121561408d57600080fd5b612af282613c84565b600081518084526140ae816020860160208601614580565b601f01601f19169290920160200192915050565b600081516140d4818560208601614580565b9290920192915050565b600082516140f0818460208701614580565b9190910192915050565b6000835161410c818460208801614580565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b600080845481600182811c91508083168061414d57607f831692505b602080841082141561416d57634e487b7160e01b86526022600452602486fd5b8180156141815760018114614192576141bf565b60ff198616895284890196506141bf565b60008b81526020902060005b868110156141b75781548b82015290850190830161419e565b505084890196505b5050505050506141cf81856140c2565b95945050505050565b6001600160a01b038481168252831660208201526060604082018190526000906141cf90830184614096565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061423790830184614096565b9695505050505050565b602081526000612af26020830184614096565b604081016006841061427657634e487b7160e01b600052602160045260246000fd5b9281526020015290565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252602e908201527f4661726d6572417065733a205075626c69632073616c6520686173207965742060408201526d3a379031329039ba30b93a32b21760911b606082015260800190565b60208082526049908201527f4661726d6572417065733a20596f752068617665206d6973736564207468652060408201527f74696d652077696e646f772e20596f7572204661726d657220417065206861736060820152681032b9b1b0b832b21760b91b608082015260a00190565b6020808252602c908201527f5765277665207265616368656420746865206d6178696d756d206f662061697260408201526b323937b8103634b6b4ba399760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526023908201527f4661726d6572417065733a20536f7272792c2077652061726520736f6c64206f6040820152623aba1760e91b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff811182821017156144cd576144cd6146a4565b604052919050565b600067ffffffffffffffff8211156144ef576144ef6146a4565b5060051b60200190565b6000821982111561450c5761450c614636565b500190565b600060ff821660ff84168060ff0382111561452e5761452e614636565b019392505050565b6000826145455761454561464c565b500490565b600081600019048311821515161561456457614564614636565b500290565b60008282101561457b5761457b614636565b500390565b60005b8381101561459b578181015183820152602001614583565b8381111561208f5750506000910152565b600181811c908216806145c057607f821691505b602082108114156145e157634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156145fb576145fb614636565b5060010190565b600060ff821660ff81141561461957614619614636565b60010192915050565b6000826146315761463161464c565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146126b257600080fdfe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529a264697066735822122073f2b9dbef78c7193b67385158dda17c20c71a00480dede27910a8813bb139da64736f6c63430008070033

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

00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000bc4ca0eda7647a8ab7c2061c2e118a18a936f13d00000000000000000000000060e4d786628fea6478f785a6d7e704777c86a7c600000000000000000000000000000000000000000000000000000000000000164661726d65722041706573205969656c6420436c75620000000000000000000000000000000000000000000000000000000000000000000000000000000000044641594300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002968747470733a2f2f6e66742e6661726d6572617065732e636f6d2f6170692f6661726d65726170652f0000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): Farmer Apes Yield Club
Arg [1] : _symbol (string): FAYC
Arg [2] : _uri (string): https://nft.farmerapes.com/api/farmerape/
Arg [3] : _BAYC (address): 0xBC4CA0EdA7647A8aB7C2061c2E118A18a936f13D
Arg [4] : _MAYC (address): 0x60E4d786628Fea6478F785A6d7e704777c86a7c6

-----Encoded View---------------
12 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [3] : 000000000000000000000000bc4ca0eda7647a8ab7c2061c2e118a18a936f13d
Arg [4] : 00000000000000000000000060e4d786628fea6478f785a6d7e704777c86a7c6
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000016
Arg [6] : 4661726d65722041706573205969656c6420436c756200000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [8] : 4641594300000000000000000000000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000029
Arg [10] : 68747470733a2f2f6e66742e6661726d6572617065732e636f6d2f6170692f66
Arg [11] : 61726d65726170652f0000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

704:16080:9:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1209:41;;;;;;;;;;;;;;;;;;;14074:25:23;;;14062:2;14047:18;1209:41:9;;;;;;;;909:290:8;;;;;;;;;;-1:-1:-1;909:290:8;;;;;:::i;:::-;;:::i;:::-;;;13901:14:23;;13894:22;13876:41;;13864:2;13849:18;909:290:8;13736:187:23;2549:98:7;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;4182:295::-;;;;;;;;;;-1:-1:-1;4182:295:7;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;12432:32:23;;;12414:51;;12402:2;12387:18;4182:295:7;12268:203:23;3720:401:7;;;;;;;;;;-1:-1:-1;3720:401:7;;;;;:::i;:::-;;:::i;:::-;;966:1117:19;;;;;;:::i;:::-;;:::i;1143:24:9:-;;;;;;;;;;-1:-1:-1;1143:24:9;;;;-1:-1:-1;;;;;1143:24:9;;;288:43:4;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;288:43:4;;;;;1472:44:9;;;;;;;;;;-1:-1:-1;1472:44:9;;;;;:::i;:::-;;;;;;;;;;;;;;;;1680:111:8;;;;;;;;;;-1:-1:-1;1767:10:8;:17;1680:111;;1254:99:4;;;;;;;;;;-1:-1:-1;1331:15:4;;1254:99;;14375:348:9;;;;;;;;;;-1:-1:-1;14375:348:9;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;6171:437::-;;;;;;;;;;-1:-1:-1;6171:437:9;;;;;:::i;:::-;;:::i;1352:42::-;;;;;;;;;;;;;;;;11750:241;;;;;;;;;;;;;:::i;16119:305::-;;;;;;;;;;-1:-1:-1;16119:305:9;;;;;:::i;:::-;;:::i;14016:245::-;;;;;;;;;;-1:-1:-1;14016:245:9;;;;;:::i;:::-;;:::i;2491:105:19:-;;;;;;;;;;-1:-1:-1;2491:105:19;;;;;:::i;:::-;-1:-1:-1;;;;;2577:12:19;2544:13;2577:12;;;:6;:12;;;;;;;2491:105;1278:331:8;;;;;;;;;;-1:-1:-1;1278:331:8;;;;;:::i;:::-;;:::i;924:41:9:-;;;;;;;;;;;;961:4;924:41;;1359:155:4;;;;;;;;;;-1:-1:-1;1470:9:4;1359:155;;3341:158:9;;;;;;;;;;-1:-1:-1;3341:158:9;;;;;:::i;:::-;;:::i;1401:35::-;;;;;;;;;;-1:-1:-1;1401:35:9;;;;;;;;13328:544;;;;;;;;;;;;;:::i;15502:146::-;;;;;;;;;;-1:-1:-1;15502:146:9;;;;;:::i;:::-;;:::i;5626:179:7:-;;;;;;;;;;-1:-1:-1;5626:179:7;;;;;:::i;:::-;;:::i;5686:395:9:-;;;;;;;;;;;;;:::i;1863:308:8:-;;;;;;;;;;-1:-1:-1;1863:308:8;;;;;:::i;:::-;;:::i;1106:30:9:-;;;;;;;;;;;;;;;;1523:45;;;;;;;;;;-1:-1:-1;1523:45:9;;;;;:::i;:::-;;;;;;;;;;;;;;;;6616:102;;;;;;;;;;-1:-1:-1;6616:102:9;;;;;:::i;:::-;;:::i;1067:32::-;;;;;;;;;;;;;;;;2174:313:7;;;;;;;;;;-1:-1:-1;2174:313:7;;;;;:::i;:::-;;:::i;1834:283::-;;;;;;;;;;-1:-1:-1;1834:283:7;;;;;:::i;:::-;;:::i;1620:92:20:-;;;;;;;;;;;;;:::i;1957:28:9:-;;;;;;;;;;-1:-1:-1;1957:28:9;;;;-1:-1:-1;;;;;1957:28:9;;;972:41;;;;;;;;;;;;1011:2;972:41;;;;;29100:4:23;29088:17;;;29070:36;;29058:2;29043:18;972:41:9;28928:184:23;1670:43:9;;;;;;;;;;-1:-1:-1;1670:43:9;;;;;:::i;:::-;;;;;;;;;;;;;;;;988:85:20;;;;;;;;;;-1:-1:-1;1060:6:20;;-1:-1:-1;;;;;1060:6:20;988:85;;1992:27:9;;;;;;;;;;-1:-1:-1;1992:27:9;;;;-1:-1:-1;;;;;1992:27:9;;;2711:102:7;;;;;;;;;;;;;:::i;1257:42:9:-;;;;;;;;;;;;;;;;3011:322;;;;;;;;;;-1:-1:-1;3011:322:9;;;;;:::i;:::-;;:::i;8873:650::-;;;;;;;;;;-1:-1:-1;8873:650:9;;;;;:::i;:::-;;:::i;12860:97::-;;;;;;;;;;-1:-1:-1;12860:97:9;;;;;:::i;:::-;;:::i;4544:318:7:-;;;;;;;;;;-1:-1:-1;4544:318:7;;;;;:::i;:::-;;:::i;2026:27:9:-;;;;;;;;;;-1:-1:-1;2026:27:9;;;;-1:-1:-1;;;;;2026:27:9;;;7197:580;;;;;;;;;;-1:-1:-1;7197:580:9;;;;;:::i;:::-;;:::i;15715:143::-;;;;;;;;;;;;;:::i;16432:349::-;;;;;;;;;;-1:-1:-1;16432:349:9;;;;;:::i;:::-;;:::i;6829:129::-;;;;;;;;;;-1:-1:-1;6829:129:9;;;;;:::i;:::-;;:::i;3507:163::-;;;;;;;;;;-1:-1:-1;3507:163:9;;;;;:::i;:::-;;:::i;1306:39::-;;;;;;;;;;;;;;;;1174:28;;;;;;;;;;;;;;;;12965:227;;;;;;;;;;-1:-1:-1;12965:227:9;;;;;:::i;:::-;;:::i;1623:40::-;;;;;;;;;;-1:-1:-1;1623:40:9;;;;;:::i;:::-;;;;;;;;;;;;;;;;9531:343;;;;;;;;;;;;;:::i;853:26::-;;;;;;;;;;;;;:::i;1575:41::-;;;;;;;;;;-1:-1:-1;1575:41:9;;;;;:::i;:::-;;;;;;;;;;;;;;;;6726:95;;;;;;;;;;-1:-1:-1;6726:95:9;;;;;:::i;:::-;;:::i;4928:206:7:-;;;;;;;;;;-1:-1:-1;4928:206:7;;;;;:::i;:::-;-1:-1:-1;;;;;5092:25:7;;;5065:4;5092:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;4928:206;4602:990:9;;;;;;:::i;:::-;;:::i;1861:223:20:-;;;;;;;;;;-1:-1:-1;1861:223:20;;;;;:::i;:::-;;:::i;1443:20:9:-;;;;;;;;;;-1:-1:-1;1443:20:9;;;;;;;;;;;3768:671;;;:::i;909:290:8:-;1051:4;-1:-1:-1;;;;;;1090:50:8;;-1:-1:-1;;;1090:50:8;;:102;;;1156:36;1180:11;1156:23;:36::i;:::-;1071:121;909:290;-1:-1:-1;;909:290:8:o;2549:98:7:-;2603:13;2635:5;2628:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2549:98;:::o;4182:295::-;4298:7;7819:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7819:16:7;4321:107;;;;-1:-1:-1;;;4321:107:7;;25309:2:23;4321:107:7;;;25291:21:23;25348:2;25328:18;;;25321:30;25387:34;25367:18;;;25360:62;-1:-1:-1;;;25438:18:23;;;25431:42;25490:19;;4321:107:7;;;;;;;;;-1:-1:-1;4446:24:7;;;;:15;:24;;;;;;-1:-1:-1;;;;;4446:24:7;;4182:295::o;3720:401::-;3800:13;3816:23;3831:7;3816:14;:23::i;:::-;3800:39;;3863:5;-1:-1:-1;;;;;3857:11:7;:2;-1:-1:-1;;;;;3857:11:7;;;3849:57;;;;-1:-1:-1;;;3849:57:7;;27311:2:23;3849:57:7;;;27293:21:23;27350:2;27330:18;;;27323:30;27389:34;27369:18;;;27362:62;-1:-1:-1;;;27440:18:23;;;27433:31;27481:19;;3849:57:7;27109:397:23;3849:57:7;3954:5;-1:-1:-1;;;;;3938:21:7;:12;:10;:12::i;:::-;-1:-1:-1;;;;;3938:21:7;;:62;;;;3963:37;3980:5;3987:12;:10;:12::i;3963:37::-;3917:165;;;;-1:-1:-1;;;3917:165:7;;23291:2:23;3917:165:7;;;23273:21:23;23330:2;23310:18;;;23303:30;23369:34;23349:18;;;23342:62;23440:26;23420:18;;;23413:54;23484:19;;3917:165:7;23089:420:23;3917:165:7;4093:21;4102:2;4106:7;4093:8;:21::i;:::-;3790:331;3720:401;;:::o;966:1117:19:-;1217:148;;;1161:12;1217:148;;;;;-1:-1:-1;;;;;1254:19:19;;1185:29;1254:19;;;:6;:19;;;;;;;;;1217:148;;;;;;;;;;;1397:45;1261:11;1217:148;1425:4;1431;1437;1397:6;:45::i;:::-;1376:125;;;;-1:-1:-1;;;1376:125:19;;26909:2:23;1376:125:19;;;26891:21:23;26948:2;26928:18;;;26921:30;26987:34;26967:18;;;26960:62;-1:-1:-1;;;27038:18:23;;;27031:31;27079:19;;1376:125:19;26707:397:23;1376:125:19;-1:-1:-1;;;;;1587:19:19;;;;;;:6;:19;;;;;;:26;;1611:1;1587:23;:26::i;:::-;-1:-1:-1;;;;;1565:19:19;;;;;;:6;:19;;;;;;;:48;;;;1629:122;;;;;1572:11;;1699:10;;1724:17;;1629:122;:::i;:::-;;;;;;;;1859:12;1873:23;1908:4;-1:-1:-1;;;;;1900:18:19;1949:17;1968:11;1932:48;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;1932:48:19;;;;;;;;;;1900:90;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1858:132;;;;2008:7;2000:48;;;;-1:-1:-1;;;2000:48:19;;18434:2:23;2000:48:19;;;18416:21:23;18473:2;18453:18;;;18446:30;18512;18492:18;;;18485:58;18560:18;;2000:48:19;18232:352:23;2000:48:19;2066:10;966:1117;-1:-1:-1;;;;;;;;966:1117:19:o;14375:348:9:-;14526:8;;14470:16;;;;14526:8;;;;;14522:194;;;14559:16;;;;:7;:16;;;;;;;;;-1:-1:-1;14601:20:9;14567:7;14601:11;:20::i;:::-;14590:31;;14375:348;;;:::o;14522:194::-;-1:-1:-1;14662:15:9;;-1:-1:-1;14662:15:9;14375:348;;;:::o;6171:437::-;1211:12:20;:10;:12::i;:::-;-1:-1:-1;;;;;1200:23:20;:7;1060:6;;-1:-1:-1;;;;;1060:6:20;;988:85;1200:7;-1:-1:-1;;;;;1200:23:20;;1192:68;;;;-1:-1:-1;;;1192:68:20;;;;;;;:::i;:::-;6331:12:9::1;6313:15;:30;6291:109;;;::::0;-1:-1:-1;;;6291:109:9;;16483:2:23;6291:109:9::1;::::0;::::1;16465:21:23::0;16522:2;16502:18;;;16495:30;16561:31;16541:18;;;16534:59;16610:18;;6291:109:9::1;16281:353:23::0;6291:109:9::1;6411:11;:26:::0;;;6448:14:::1;:32:::0;;;6496:41:::1;::::0;-1:-1:-1;;;12203:26:23;;12254:2;12245:12;6496:41:9::1;::::0;;;;::::1;::::0;;14074:25:23;;;6496:41:9;::::1;::::0;14062:2:23;14047:18;6496:41:9::1;;;;;;;6553:47;::::0;-1:-1:-1;;;10997:29:23;;11051:2;11042:12;6553:47:9::1;::::0;;;;::::1;::::0;;14074:25:23;;;6553:47:9;::::1;::::0;14062:2:23;14047:18;6553:47:9::1;;;;;;;6171:437:::0;;:::o;11750:241::-;11810:7;1211:12:20;:10;:12::i;:::-;-1:-1:-1;;;;;1200:23:20;:7;1060:6;;-1:-1:-1;;;;;1060:6:20;;988:85;1200:7;-1:-1:-1;;;;;1200:23:20;;1192:68;;;;-1:-1:-1;;;1192:68:20;;;;;;;:::i;:::-;11838:9:9::1;::::0;-1:-1:-1;;;;;11838:9:9::1;:23:::0;11830:65:::1;;;::::0;-1:-1:-1;;;11830:65:9;;19568:2:23;11830:65:9::1;::::0;::::1;19550:21:23::0;19607:2;19587:18;;;19580:30;19646:31;19626:18;;;19619:59;19695:18;;11830:65:9::1;19366:353:23::0;11830:65:9::1;11918:38;11940:15;;11918:21;:38::i;:::-;11906:9;:50:::0;;-1:-1:-1;;;;;;11906:50:9::1;-1:-1:-1::0;;;;;11906:50:9;;;::::1;::::0;;::::1;::::0;;;-1:-1:-1;1270:1:20::1;11750:241:9::0;:::o;16119:305::-;16245:10;;:33;;-1:-1:-1;;;16245:33:9;;-1:-1:-1;;;;;12706:15:23;;;16245:33:9;;;12688:34:23;12758:15;;;12738:18;;;12731:43;16245:10:9;;;;:23;;12623:18:23;;16245:33:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16304:20;16316:7;16304:11;:20::i;:::-;-1:-1:-1;;;;;16289:11:9;;;;;;:5;:11;;;;;:35;;:11;;;:35;;;;;:::i;:::-;;;;-1:-1:-1;16348:20:9;;-1:-1:-1;16360:7:9;16348:11;:20::i;:::-;-1:-1:-1;;;;;16335:9:9;;;;;;:5;:9;;;;;:33;;:9;;;:33;;;;;:::i;:::-;;;;-1:-1:-1;16379:37:9;;-1:-1:-1;16398:4:9;16404:2;16408:7;16379:18;:37::i;14016:245::-;1211:12:20;:10;:12::i;:::-;-1:-1:-1;;;;;1200:23:20;:7;1060:6;;-1:-1:-1;;;;;1060:6:20;;988:85;1200:7;-1:-1:-1;;;;;1200:23:20;;1192:68;;;;-1:-1:-1;;;1192:68:20;;;;;;;:::i;:::-;14138:9:9::1;14133:121;14149:29:::0;;::::1;14133:121;;;14238:4;14200:12;:35;14213:18;;14232:1;14213:21;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;14200:35:9::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;14200:35:9;:42;;-1:-1:-1;;14200:42:9::1;::::0;::::1;;::::0;;;::::1;::::0;;14180:3;::::1;::::0;::::1;:::i;:::-;;;;14133:121;;1278:331:8::0;1415:7;1467:23;1484:5;1467:16;:23::i;:::-;1459:5;:31;1438:121;;;;-1:-1:-1;;;1438:121:8;;17196:2:23;1438:121:8;;;17178:21:23;17235:2;17215:18;;;17208:30;17274:34;17254:18;;;17247:62;-1:-1:-1;;;17325:18:23;;;17318:41;17376:19;;1438:121:8;16994:407:23;1438:121:8;-1:-1:-1;;;;;;1576:19:8;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;1278:331::o;3341:158:9:-;1211:12:20;:10;:12::i;:::-;-1:-1:-1;;;;;1200:23:20;:7;1060:6;;-1:-1:-1;;;;;1060:6:20;;988:85;1200:7;-1:-1:-1;;;;;1200:23:20;;1192:68;;;;-1:-1:-1;;;1192:68:20;;;;;;;:::i;:::-;3414:12:9::1;:23:::0;;;3453:38:::1;::::0;-1:-1:-1;;;11935:27:23;;11987:2;11978:12;3453:38:9::1;;::::0;;;;::::1;::::0;;14074:25:23;;;3453:38:9;::::1;::::0;14062:2:23;14047:18;3453:38:9::1;;;;;;;3341:158:::0;:::o;13328:544::-;1211:12:20;:10;:12::i;:::-;-1:-1:-1;;;;;1200:23:20;:7;1060:6;;-1:-1:-1;;;;;1060:6:20;;988:85;1200:7;-1:-1:-1;;;;;1200:23:20;;1192:68;;;;-1:-1:-1;;;1192:68:20;;;;;;;:::i;:::-;13396:21:9::1;13446:42;13430:114;13530:3;13515:11;13396:21:::0;13525:1:::1;13515:11;:::i;:::-;13514:19;;;;:::i;:::-;13430:114;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;13571:42:9::1;13555:115;13655:4;13640:11;:7:::0;13650:1:::1;13640:11;:::i;:::-;13639:20;;;;:::i;:::-;13555:115;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;13697:42:9::1;13681:114;13781:3;13766:11;:7:::0;13776:1:::1;13766:11;:::i;:::-;13765:19;;;;:::i;:::-;13681:114;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;1060:6:20;;13816:48:9::1;::::0;-1:-1:-1;;;;;1060:6:20;;;;13842:21:9::1;13816:48:::0;::::1;;;::::0;::::1;::::0;;;13842:21;1060:6:20;13816:48:9;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;13367:505;13328:544::o:0;15502:146::-;15586:8;;15561:7;;15586:8;;;;;15581:23;;-1:-1:-1;15603:1:9;;15502:146;-1:-1:-1;15502:146:9:o;15581:23::-;-1:-1:-1;;;;;15622:11:9;;;;;;:5;:11;;;;;;:18;;15636:4;15622:18;:::i;5626:179:7:-;5759:39;5776:4;5782:2;5786:7;5759:39;;;;;;;;;;;;:16;:39::i;5686:395:9:-;5764:14;;5745:15;:33;;:96;;;;-1:-1:-1;5818:14:9;;:23;;5835:6;5818:23;:::i;:::-;5799:15;:42;;5745:96;5723:219;;;;-1:-1:-1;;;5723:219:9;;;;;;;:::i;:::-;5972:10;5963:20;;;;:8;:20;;;;;;5953:31;;5963:20;;5953:9;:31::i;:::-;6027:10;6018:20;;;;:8;:20;;;;;;;;;5995:7;:19;;;;;:43;;6018:20;;;;;5995:19;;:43;;6018:20;;5995:43;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6058:10:9;-1:-1:-1;6049:20:9;;;:8;:20;;;;;:24;;-1:-1:-1;;6049:24:9;;;5686:395::o;1863:308:8:-;1978:7;2030:30;1767:10;:17;;1680:111;2030:30;2022:5;:38;2001:129;;;;-1:-1:-1;;;2001:129:8;;28131:2:23;2001:129:8;;;28113:21:23;28170:2;28150:18;;;28143:30;28209:34;28189:18;;;28182:62;-1:-1:-1;;;28260:18:23;;;28253:42;28312:19;;2001:129:8;27929:408:23;2001:129:8;2147:10;2158:5;2147:17;;;;;;;;:::i;:::-;;;;;;;;;2140:24;;1863:308;;;:::o;6616:102:9:-;1211:12:20;:10;:12::i;:::-;-1:-1:-1;;;;;1200:23:20;:7;1060:6;;-1:-1:-1;;;;;1060:6:20;;988:85;1200:7;-1:-1:-1;;;;;1200:23:20;;1192:68;;;;-1:-1:-1;;;1192:68:20;;;;;;;:::i;:::-;6681:10:9::1;:29:::0;;-1:-1:-1;;;;;;6681:29:9::1;-1:-1:-1::0;;;;;6681:29:9;;;::::1;::::0;;;::::1;::::0;;6616:102::o;2174:313:7:-;2286:7;2325:16;;;:7;:16;;;;;;-1:-1:-1;;;;;2325:16:7;2372:19;2351:107;;;;-1:-1:-1;;;2351:107:7;;24538:2:23;2351:107:7;;;24520:21:23;24577:2;24557:18;;;24550:30;24616:34;24596:18;;;24589:62;-1:-1:-1;;;24667:18:23;;;24660:39;24716:19;;2351:107:7;24336:405:23;1834:283:7;1946:7;-1:-1:-1;;;;;1990:19:7;;1969:108;;;;-1:-1:-1;;;1969:108:7;;24127:2:23;1969:108:7;;;24109:21:23;24166:2;24146:18;;;24139:30;24205:34;24185:18;;;24178:62;-1:-1:-1;;;24256:18:23;;;24249:40;24306:19;;1969:108:7;23925:406:23;1969:108:7;-1:-1:-1;;;;;;2094:16:7;;;;;:9;:16;;;;;;;1834:283::o;1620:92:20:-;1211:12;:10;:12::i;:::-;-1:-1:-1;;;;;1200:23:20;:7;1060:6;;-1:-1:-1;;;;;1060:6:20;;988:85;1200:7;-1:-1:-1;;;;;1200:23:20;;1192:68;;;;-1:-1:-1;;;1192:68:20;;;;;;;:::i;:::-;1684:21:::1;1702:1;1684:9;:21::i;:::-;1620:92::o:0;2711:102:7:-;2767:13;2799:7;2792:14;;;;;:::i;3011:322:9:-;3091:16;;3070:4;;3091:16;;3087:239;;;-1:-1:-1;;;;;3148:18:9;;;;;;:12;:18;;;;;;;;;:63;;-1:-1:-1;3187:4:9;;:20;;-1:-1:-1;;;3187:20:9;;-1:-1:-1;;;;;12432:32:23;;;3187:20:9;;;12414:51:23;3210:1:9;;3187:4;;:14;;12387:18:23;;3187:20:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:24;3148:63;:108;;;-1:-1:-1;3232:4:9;;:20;;-1:-1:-1;;;3232:20:9;;-1:-1:-1;;;;;12432:32:23;;;3232:20:9;;;12414:51:23;3255:1:9;;3232:4;;:14;;12387:18:23;;3232:20:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:24;3124:132;3011:322;-1:-1:-1;;3011:322:9:o;3087:239::-;-1:-1:-1;;;;;;3296:18:9;;;;;:12;:18;;;;;;;;;3011:322::o;3087:239::-;3011:322;;;:::o;8873:650::-;1211:12:20;:10;:12::i;:::-;-1:-1:-1;;;;;1200:23:20;:7;1060:6;;-1:-1:-1;;;;;1060:6:20;;988:85;1200:7;-1:-1:-1;;;;;1200:23:20;;1192:68;;;;-1:-1:-1;;;1192:68:20;;;;;;;:::i;:::-;8998:19:9::1;9069:14;;9050:15;:33;;9028:129;;;;-1:-1:-1::0;;;9028:129:9::1;;;;;;;:::i;:::-;9175:9;9170:157;9194:11;:18;9190:1;:22;9170:157;;;9249:8;9258:1;9249:11;;;;;;;;:::i;:::-;;;;;;;9234:26;;;;;;;:::i;:::-;;;9304:8;9313:1;9304:11;;;;;;;;:::i;:::-;;;;;;;9275:10;:26;9286:11;9298:1;9286:14;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;9275:26:9::1;-1:-1:-1::0;;;;;9275:26:9::1;;;;;;;;;;;;;:40;;;;;;;;;;;;;;;;;;9214:3;;;;;:::i;:::-;;;;9170:157;;;;9391:11;9372:15;;1058:2;9359:28;;;;:::i;:::-;:43;;9337:137;;;;-1:-1:-1::0;;;9337:137:9::1;;;;;;;:::i;:::-;9504:11;9485:15;;:30;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;;8873:650:9:o;12860:97::-;1211:12:20;:10;:12::i;:::-;-1:-1:-1;;;;;1200:23:20;:7;1060:6;;-1:-1:-1;;;;;1060:6:20;;988:85;1200:7;-1:-1:-1;;;;;1200:23:20;;1192:68;;;;-1:-1:-1;;;1192:68:20;;;;;;;:::i;:::-;12930:19:9;;::::1;::::0;:12:::1;::::0;:19:::1;::::0;::::1;::::0;::::1;:::i;4544:318:7:-:0;4686:12;:10;:12::i;:::-;-1:-1:-1;;;;;4674:24:7;:8;-1:-1:-1;;;;;4674:24:7;;;4666:62;;;;-1:-1:-1;;;4666:62:7;;21228:2:23;4666:62:7;;;21210:21:23;21267:2;21247:18;;;21240:30;21306:27;21286:18;;;21279:55;21351:18;;4666:62:7;21026:349:23;4666:62:7;4784:8;4739:18;:32;4758:12;:10;:12::i;:::-;-1:-1:-1;;;;;4739:32:7;;;;;;;;;;;;;;;;;-1:-1:-1;4739:32:7;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;4739:53:7;;;;;;;;;;;4822:12;:10;:12::i;:::-;-1:-1:-1;;;;;4807:48:7;;4846:8;4807:48;;;;13901:14:23;13894:22;13876:41;;13864:2;13849:18;;13736:187;4807:48:7;;;;;;;;4544:318;;:::o;7197:580:9:-;1211:12:20;:10;:12::i;:::-;-1:-1:-1;;;;;1200:23:20;:7;1060:6;;-1:-1:-1;;;;;1060:6:20;;988:85;1200:7;-1:-1:-1;;;;;1200:23:20;;1192:68;;;;-1:-1:-1;;;1192:68:20;;;;;;;:::i;:::-;7324:9:9::1;7319:248;7343:11;:18;7339:1;:22;7319:248;;;7383:18;7404:17;:15;:17::i;:::-;7383:38;;7436:46;7444:11;7456:1;7444:14;;;;;;;;:::i;:::-;;;;;;;7460:10;7472:6;7479:1;7472:9;;;;;;;;:::i;:::-;;;;;;;7436:7;:46::i;:::-;7497:24;7510:10;7497:12;:24::i;:::-;7536:19;:17;:19::i;:::-;-1:-1:-1::0;7363:3:9;::::1;::::0;::::1;:::i;:::-;;;;7319:248;;;-1:-1:-1::0;7631:18:9;;7612:15:::1;::::0;7599:28:::1;::::0;1058:2:::1;7599:28;:::i;:::-;:50;;7577:144;;;;-1:-1:-1::0;;;7577:144:9::1;;;;;;;:::i;:::-;7751:11;:18;7732:15;;:37;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;7197:580:9:o;15715:143::-;15758:10;;:47;;-1:-1:-1;;;15758:47:9;;15782:10;15758:47;;;12688:34:23;15758:10:9;12738:18:23;;;12731:43;-1:-1:-1;;;;;15758:10:9;;;;:23;;12623:18:23;;15758:47:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;15816:10:9;;:34;;-1:-1:-1;;;15816:34:9;;15839:10;15816:34;;;12414:51:23;-1:-1:-1;;;;;15816:10:9;;;;-1:-1:-1;15816:22:9;;-1:-1:-1;12387:18:23;;15816:34:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15715:143::o;16432:349::-;16591:10;;:33;;-1:-1:-1;;;16591:33:9;;-1:-1:-1;;;;;12706:15:23;;;16591:33:9;;;12688:34:23;12758:15;;;12738:18;;;12731:43;16591:10:9;;;;:23;;12623:18:23;;16591:33:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16650:20;16662:7;16650:11;:20::i;:::-;-1:-1:-1;;;;;16635:11:9;;;;;;:5;:11;;;;;:35;;:11;;;:35;;;;;:::i;:::-;;;;-1:-1:-1;16694:20:9;;-1:-1:-1;16706:7:9;16694:11;:20::i;:::-;-1:-1:-1;;;;;16681:9:9;;;;;;:5;:9;;;;;:33;;:9;;;:33;;;;;:::i;:::-;;;;-1:-1:-1;16725:48:9;;-1:-1:-1;16748:4:9;16754:2;16758:7;16767:5;16725:22;:48::i;6829:129::-;1211:12:20;:10;:12::i;:::-;-1:-1:-1;;;;;1200:23:20;:7;1060:6;;-1:-1:-1;;;;;1060:6:20;;988:85;1200:7;-1:-1:-1;;;;;1200:23:20;;1192:68;;;;-1:-1:-1;;;1192:68:20;;;;;;;:::i;:::-;6914:16:9::1;:36:::0;;-1:-1:-1;;6914:36:9::1;::::0;::::1;;::::0;;;::::1;::::0;;6829:129::o;3507:163::-;1211:12:20;:10;:12::i;:::-;-1:-1:-1;;;;;1200:23:20;:7;1060:6;;-1:-1:-1;;;;;1060:6:20;;988:85;1200:7;-1:-1:-1;;;;;1200:23:20;;1192:68;;;;-1:-1:-1;;;1192:68:20;;;;;;;:::i;:::-;3579:15:9::1;:26:::0;;;3621:41:::1;::::0;-1:-1:-1;;;11267:30:23;;11322:2;11313:12;3621:41:9::1;11065:266:23::0;12965:227:9;13067:13;13142:12;13156:26;13173:8;13156:16;:26::i;:::-;13125:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;13098:86;;12965:227;;;:::o;9531:343::-;9606:10;9620:1;9595:22;;;:10;:22;;;;;;;;:26;;;;:89;;-1:-1:-1;9661:14:9;;:23;;9678:6;9661:23;:::i;:::-;9642:15;:42;;9595:89;9573:212;;;;-1:-1:-1;;;9573:212:9;;;;;;;:::i;:::-;9817:10;9806:22;;;;:10;:22;;;;;;9796:33;;9806:22;;9796:9;:33::i;:::-;9851:10;9865:1;9840:22;;;:10;:22;;;;;:26;;-1:-1:-1;;9840:26:9;;;9531:343::o;853:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;6726:95::-;1211:12:20;:10;:12::i;:::-;-1:-1:-1;;;;;1200:23:20;:7;1060:6;;-1:-1:-1;;;;;1060:6:20;;988:85;1200:7;-1:-1:-1;;;;;1200:23:20;;1192:68;;;;-1:-1:-1;;;1192:68:20;;;;;;;:::i;:::-;6793:8:9::1;:20:::0;;;::::1;;;;-1:-1:-1::0;;6793:20:9;;::::1;::::0;;;::::1;::::0;;6726:95::o;4602:990::-;4700:14;;4681:15;:33;;:96;;;;-1:-1:-1;4754:14:9;;:23;;4771:6;4754:23;:::i;:::-;4735:15;:42;;4681:96;4659:192;;;;-1:-1:-1;;;4659:192:9;;;;;;;:::i;:::-;4866:17;;4862:88;;1767:10:8;:17;4905::9;:33;4862:88;5021:10;5013:19;;;;:7;:19;;;;;;;;;4990:8;:20;;;;;;;1011:2;;4982:86;5013:19;;;;4983:27;;4990:20;4983:4;:27;:::i;:::-;:49;;;;:::i;:::-;4982:86;;;;4960:204;;;;-1:-1:-1;;;4960:204:9;;21582:2:23;4960:204:9;;;21564:21:23;21621:2;21601:18;;;21594:30;;;21660:34;21640:18;;;21633:62;21731:34;21711:18;;;21704:62;-1:-1:-1;;;21782:19:23;;;21775:35;21827:19;;4960:204:9;21380:472:23;4960:204:9;5294:15;;5281:28;;1058:2;5281:28;:::i;:::-;5264:13;;5251:26;;961:4;5251:26;:::i;:::-;:59;;;;:::i;:::-;5225:4;5217:13;;5197:17;;:33;;;;:::i;:::-;:113;;5175:198;;;;-1:-1:-1;;;5175:198:9;;;;;;;:::i;:::-;5435:15;;5419:31;;:13;;;:31;:::i;:::-;5406:9;:44;5384:120;;;;-1:-1:-1;;;5384:120:9;;16841:2:23;5384:120:9;;;16823:21:23;16880:2;16860:18;;;16853:30;16919:28;16899:18;;;16892:56;16965:18;;5384:120:9;16639:350:23;5384:120:9;5524:10;5515:20;;;;:8;:20;;;;;:28;;5539:4;;5515:20;:28;;5539:4;;5515:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;5579:4;5571:13;;5554;;:30;;;;;;;:::i;:::-;;;;-1:-1:-1;;;4602:990:9:o;1861:223:20:-;1211:12;:10;:12::i;:::-;-1:-1:-1;;;;;1200:23:20;:7;1060:6;;-1:-1:-1;;;;;1060:6:20;;988:85;1200:7;-1:-1:-1;;;;;1200:23:20;;1192:68;;;;-1:-1:-1;;;1192:68:20;;;;;;;:::i;:::-;-1:-1:-1;;;;;1962:22:20;::::1;1941:107;;;::::0;-1:-1:-1;;;1941:107:20;;18027:2:23;1941:107:20::1;::::0;::::1;18009:21:23::0;18066:2;18046:18;;;18039:30;18105:34;18085:18;;;18078:62;-1:-1:-1;;;18156:18:23;;;18149:36;18202:19;;1941:107:20::1;17825:402:23::0;1941:107:20::1;2058:19;2068:8;2058:9;:19::i;:::-;1861:223:::0;:::o;3768:671:9:-;2437:26;2452:10;2437:14;:26::i;:::-;2415:123;;;;-1:-1:-1;;;2415:123:9;;26083:2:23;2415:123:9;;;26065:21:23;26122:2;26102:18;;;26095:30;26161:34;26141:18;;;26134:62;-1:-1:-1;;;26212:18:23;;;26205:45;26267:19;;2415:123:9;25881:411:23;2415:123:9;3872:11:::1;;3853:15;:30;;:89;;;;-1:-1:-1::0;3922:11:9::1;::::0;:20:::1;::::0;3936:6:::1;3922:20;:::i;:::-;3904:15;:38;3853:89;3831:181;;;::::0;-1:-1:-1;;;3831:181:9;;23716:2:23;3831:181:9::1;::::0;::::1;23698:21:23::0;23755:2;23735:18;;;23728:30;23794:34;23774:18;;;23767:62;-1:-1:-1;;;23845:18:23;;;23838:40;23895:19;;3831:181:9::1;23514:406:23::0;3831:181:9::1;4044:12;;4031:9;:25;4023:64;;;::::0;-1:-1:-1;;;4023:64:9;;16841:2:23;4023:64:9::1;::::0;::::1;16823:21:23::0;16880:2;16860:18;;;16853:30;16919:28;16899:18;;;16892:56;16965:18;;4023:64:9::1;16639:350:23::0;4023:64:9::1;4135:10;4121:25;::::0;;;:13:::1;:25;::::0;;;;;::::1;;4120:26;4098:127;;;::::0;-1:-1:-1;;;4098:127:9;;19148:2:23;4098:127:9::1;::::0;::::1;19130:21:23::0;19187:2;19167:18;;;19160:30;19226:34;19206:18;;;19199:62;-1:-1:-1;;;19277:18:23;;;19270:49;19336:19;;4098:127:9::1;18946:415:23::0;4098:127:9::1;4279:23;1058:2;961:4;4279:23;:::i;:::-;1767:10:8::0;:17;4258::9::1;::::0;4274:1:::1;4258:17;:::i;:::-;:44;;4236:129;;;;-1:-1:-1::0;;;4236:129:9::1;;;;;;;:::i;:::-;4376:12;4386:1;4376:9;:12::i;:::-;4413:10;4399:25;::::0;;;:13:::1;:25;::::0;;;;:32;;-1:-1:-1;;4399:32:9::1;4427:4;4399:32;::::0;;3768:671::o;95:603:2:-;139:22;177:10;199:4;177:27;173:496;;;220:18;241:8;;220:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;279:8:2;486:17;480:24;-1:-1:-1;;;;;455:131:2;;-1:-1:-1;173:496:2;;-1:-1:-1;173:496:2;;-1:-1:-1;647:10:2;95:603;:::o;1431:344:7:-;1573:4;-1:-1:-1;;;;;;1612:40:7;;-1:-1:-1;;;1612:40:7;;:104;;-1:-1:-1;;;;;;;1668:48:7;;-1:-1:-1;;;1668:48:7;1612:104;:156;;;-1:-1:-1;;;;;;;;;;915:40:5;;;1732:36:7;763:199:5;13200:120:9;13254:14;13288:24;:22;:24::i;:::-;13281:31;;13200:120;:::o;11710:171:7:-;11784:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;11784:29:7;-1:-1:-1;;;;;11784:29:7;;;;;;;;:24;;11837:23;11784:24;11837:14;:23::i;:::-;-1:-1:-1;;;;;11828:46:7;;;;;;;;;;;11710:171;;:::o;2602:470:19:-;2774:4;-1:-1:-1;;;;;2798:20:19;;2790:70;;;;-1:-1:-1;;;2790:70:19;;22885:2:23;2790:70:19;;;22867:21:23;22924:2;22904:18;;;22897:30;22963:34;22943:18;;;22936:62;-1:-1:-1;;;23014:18:23;;;23007:35;23059:19;;2790:70:19;22683:401:23;2790:70:19;2911:154;2938:47;2957:27;2977:6;2957:19;:27::i;:::-;2938:18;:47::i;:::-;2911:154;;;;;;;;;;;;14759:25:23;;;;14832:4;14820:17;;14800:18;;;14793:45;14854:18;;;14847:34;;;14897:18;;;14890:34;;;14731:19;;2911:154:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2889:176:19;:6;-1:-1:-1;;;;;2889:176:19;;2870:195;;2602:470;;;;;;;:::o;2812:96:21:-;2870:7;2896:5;2900:1;2896;:5;:::i;:::-;2889:12;2812:96;-1:-1:-1;;;2812:96:21:o;14830:563:9:-;14918:16;14976:17;14956:16;;;;:7;:16;;;;;;;;:37;;;;;;;;:::i;:::-;;14952:78;;;-1:-1:-1;15017:1:9;;14830:563;-1:-1:-1;14830:563:9:o;14952:78::-;15064:15;15044:16;;;;:7;:16;;;;;;;;:35;;;;;;;;:::i;:::-;;15040:76;;;-1:-1:-1;15103:1:9;;14830:563;-1:-1:-1;14830:563:9:o;15040:76::-;15150:20;15130:16;;;;:7;:16;;;;;;;;:40;;;;;;;;:::i;:::-;;15126:81;;;-1:-1:-1;15194:1:9;;14830:563;-1:-1:-1;14830:563:9:o;15126:81::-;15241:15;15221:16;;;;:7;:16;;;;;;;;:35;;;;;;;;:::i;:::-;;15217:76;;;-1:-1:-1;15280:1:9;;14830:563;-1:-1:-1;14830:563:9:o;15217:76::-;15327:21;15307:16;;;;:7;:16;;;;;;;;:41;;;;;;;;:::i;:::-;;15303:83;;;-1:-1:-1;15372:2:9;;14830:563;-1:-1:-1;14830:563:9:o;11315:328::-;11378:7;11398:13;11430:15;;11415:12;11422:4;11415:6;:12::i;:::-;:30;;;;:::i;:::-;11414:36;;11449:1;11414:36;:::i;:::-;11398:52;;11461:18;11482:14;11490:5;11482:7;:14::i;:::-;11461:35;;11536:1;11511:21;11521:10;11511:9;:21::i;:::-;:26;11507:76;;11561:10;11315:328;-1:-1:-1;;;11315:328:9:o;11507:76::-;11600:35;11622:12;11629:4;11622:6;:12::i;:::-;11600:21;:35::i;:::-;11593:42;11315:328;-1:-1:-1;;;;11315:328:9:o;5196:364:7:-;5398:41;5417:12;:10;:12::i;:::-;5431:7;5398:18;:41::i;:::-;5377:137;;;;-1:-1:-1;;;5377:137:7;;;;;;;:::i;:::-;5525:28;5535:4;5541:2;5545:7;5525:9;:28::i;10637:272:9:-;10692:7;10687:215;10709:4;10705:8;;:1;:8;;;10687:215;;;10735:18;10756:17;:15;:17::i;:::-;10735:38;;10788:29;10794:10;10806;10788:5;:29::i;:::-;10832:19;:17;:19::i;:::-;10866:24;10879:10;10866:12;:24::i;:::-;-1:-1:-1;10715:3:9;;;;:::i;:::-;;;;10687:215;;2090:169:20;2164:6;;;-1:-1:-1;;;;;2180:17:20;;;-1:-1:-1;;;;;;2180:17:20;;;;;;;2212:40;;2164:6;;;2180:17;2164:6;;2212:40;;2145:16;;2212:40;2135:124;2090:169;:::o;11057:106:9:-;11133:15;;11106:7;;11133:22;;11153:1;11133:19;:22::i;7785:392::-;7898:10;;:33;;-1:-1:-1;;;7898:33:9;;-1:-1:-1;;;;;12432:32:23;;;7898:33:9;;;12414:51:23;7898:10:9;;;;:29;;12387:18:23;;7898:33:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;7948:10:9;;;7944:145;;7994:14;:12;:14::i;:::-;7975:16;;;;:7;:16;;;;;:33;;-1:-1:-1;;7975:33:9;;;;;;;;;;;:::i;:::-;;;;;;7944:145;;;8071:5;8060:17;;;;;;;;;;:::i;:::-;8041:16;;;;:7;:16;;;;;:36;;-1:-1:-1;;8041:36:9;;;;;;;;;;;:::i;:::-;;;;;;7944:145;8101:24;8113:2;8117:7;8101:11;:24::i;:::-;8149:20;8161:7;8149:11;:20::i;:::-;-1:-1:-1;;;;;8136:9:9;;;;;;:5;:9;;;;;:33;;:9;;;:33;;;;;:::i;9882:698::-;9948:16;9961:3;9948:10;:16;:::i;:::-;9944:267;;9986:13;10037:3;10016:18;10023:10;10016:6;:18::i;:::-;:24;;;;:::i;:::-;10002:39;;:10;:39;:::i;:::-;9986:55;;10056:20;10079:14;10087:5;10079:7;:14::i;:::-;10108:42;;10056:37;;-1:-1:-1;;;;;;10108:30:9;;;:42;;10139:10;;10108:42;;;;10139:10;10108:30;:42;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10170:29:9;;-1:-1:-1;;;;;10170:29:9;;;10179:5;;10170:29;;;;;9971:240;;9944:267;10319:10;10333:4;10319:18;:63;;;-1:-1:-1;1058:2:9;10355:14;961:4;10368:1;10355:14;:::i;:::-;:27;;;;:::i;:::-;10341:10;:41;10319:63;10315:258;;;10399:13;10450:4;10429:18;10436:10;10429:6;:18::i;:::-;:25;;;;:::i;:::-;10415:40;;:10;:40;:::i;:::-;10399:56;;10470:20;10493:14;10501:5;10493:7;:14::i;:::-;10470:37;;10548:12;-1:-1:-1;;;;;10527:34:9;10541:5;10527:34;;;;;;;;;;10384:189;;9882:698;:::o;12662:121::-;961:4;12718:15;;:28;12710:37;;;;;;12758:15;:17;;;:15;:17;;;:::i;:::-;;;;;;12662:121::o;5871:354:7:-;6053:41;6072:12;:10;:12::i;:::-;6086:7;6053:18;:41::i;:::-;6032:137;;;;-1:-1:-1;;;6032:137:7;;;;;;;:::i;:::-;6179:39;6193:4;6199:2;6203:7;6212:5;6179:13;:39::i;275:703:22:-;331:13;548:10;544:51;;-1:-1:-1;;574:10:22;;;;;;;;;;;;-1:-1:-1;;;574:10:22;;;;;275:703::o;544:51::-;619:5;604:12;658:75;665:9;;658:75;;690:8;;;;:::i;:::-;;-1:-1:-1;712:10:22;;-1:-1:-1;720:2:22;712:10;;:::i;:::-;;;658:75;;;742:19;774:6;764:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;764:17:22;;742:39;;791:150;798:10;;791:150;;824:11;834:1;824:11;;:::i;:::-;;-1:-1:-1;892:10:22;900:2;892:5;:10;:::i;:::-;879:24;;:2;:24;:::i;:::-;866:39;;849:6;856;849:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;849:56:22;;;;;;;;-1:-1:-1;919:11:22;928:2;919:11;;:::i;:::-;;;791:150;;2089:396:19;2196:7;312:106;;;;;;;;;;;;;;;;;289:139;;;;;;;2344:12;;2378:11;;;;2421:24;;;;;2411:35;;;;;;2265:199;;;;;14341:25:23;;;14397:2;14382:18;;14375:34;;;;-1:-1:-1;;;;;14445:32:23;14440:2;14425:18;;14418:60;14509:2;14494:18;;14487:34;14328:3;14313:19;;14110:417;2265:199:19;;;;;;;;;;;;;2238:240;;;;;;2219:259;;2089:396;;;:::o;1874:249:4:-;1970:7;2068:20;1331:15;;;1254:99;2068:20;2039:63;;-1:-1:-1;;;2039:63:4;;;11594:27:23;11637:11;;;11630:27;;;;11673:12;;;11666:28;;;11710:12;;2039:63:4;11336:392:23;12188:395:9;12241:7;12382:9;12428:16;12443:1;12428:12;:16;:::i;:::-;12339:202;;8721:2:23;8717:15;;;;-1:-1:-1;;8713:53:23;12339:202:9;;;8701:66:23;12418:27:9;8783:12:23;;;8776:28;12472:15:9;8820:12:23;;;8813:28;8857:12;;;8850:28;;;8894:13;;12339:202:9;;;-1:-1:-1;;12339:202:9;;;;;;;;;12307:253;;12339:202;12307:253;;;;;12188:395;-1:-1:-1;;12188:395:9:o;8014:438:7:-;8139:4;7819:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7819:16:7;8159:107;;;;-1:-1:-1;;;8159:107:7;;22059:2:23;8159:107:7;;;22041:21:23;22098:2;22078:18;;;22071:30;22137:34;22117:18;;;22110:62;-1:-1:-1;;;22188:18:23;;;22181:42;22240:19;;8159:107:7;21857:408:23;8159:107:7;8276:13;8292:23;8307:7;8292:14;:23::i;:::-;8276:39;;8344:5;-1:-1:-1;;;;;8333:16:7;:7;-1:-1:-1;;;;;8333:16:7;;:63;;;;8389:7;-1:-1:-1;;;;;8365:31:7;:20;8377:7;8365:11;:20::i;:::-;-1:-1:-1;;;;;8365:31:7;;8333:63;:111;;;-1:-1:-1;;;;;;5092:25:7;;;5065:4;5092:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;8412:32;4928:206;11005:594;11172:4;-1:-1:-1;;;;;11145:31:7;:23;11160:7;11145:14;:23::i;:::-;-1:-1:-1;;;;;11145:31:7;;11124:119;;;;-1:-1:-1;;;11124:119:7;;26499:2:23;11124:119:7;;;26481:21:23;26538:2;26518:18;;;26511:30;26577:34;26557:18;;;26550:62;-1:-1:-1;;;26628:18:23;;;26621:39;26677:19;;11124:119:7;26297:405:23;11124:119:7;-1:-1:-1;;;;;11261:16:7;;11253:65;;;;-1:-1:-1;;;11253:65:7;;20823:2:23;11253:65:7;;;20805:21:23;20862:2;20842:18;;;20835:30;20901:34;20881:18;;;20874:62;-1:-1:-1;;;20952:18:23;;;20945:34;20996:19;;11253:65:7;20621:400:23;11253:65:7;11329:39;11350:4;11356:2;11360:7;11329:20;:39::i;:::-;11430:29;11447:1;11451:7;11430:8;:29::i;:::-;-1:-1:-1;;;;;11470:15:7;;;;;;:9;:15;;;;;:20;;11489:1;;11470:15;:20;;11489:1;;11470:20;:::i;:::-;;;;-1:-1:-1;;;;;;;11500:13:7;;;;;;:9;:13;;;;;:18;;11517:1;;11500:13;:18;;11517:1;;11500:18;:::i;:::-;;;;-1:-1:-1;;11528:16:7;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;11528:21:7;-1:-1:-1;;;;;11528:21:7;;;;;;;;;11565:27;;11528:16;;11565:27;;;;;;;11005:594;;;:::o;15866:245:9:-;15947:10;;:33;;-1:-1:-1;;;15947:33:9;;-1:-1:-1;;;;;12432:32:23;;;15947:33:9;;;12414:51:23;15947:10:9;;;;:29;;12387:18:23;;15947:33:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16010:14;:12;:14::i;:::-;15991:16;;;;:7;:16;;;;;:33;;-1:-1:-1;;15991:33:9;;;;;;;;;;;:::i;:::-;;;;;;16035:24;16047:2;16051:7;16035:11;:24::i;:::-;16083:20;16095:7;16083:11;:20::i;:::-;-1:-1:-1;;;;;16070:9:9;;;;;;:5;:9;;;;;:33;;:9;;;:33;;;;;:::i;8185:540::-;8232:16;8261:20;8311:5;8285:23;8292:15;;8285:6;:23::i;:::-;:31;;;;:::i;:::-;8284:37;;8320:1;8284:37;:::i;:::-;8261:60;;8352:4;8336:12;:20;8332:386;;8380:17;8373:24;;;8185:540;:::o;8332:386::-;8435:4;8419:12;:20;8415:303;;8463:15;8456:22;;;8185:540;:::o;8415:303::-;8516:4;8500:12;:20;8496:222;;8544:20;8537:27;;;8185:540;:::o;8496:222::-;8602:4;8586:12;:20;8582:136;;8630:15;8623:22;;;8185:540;:::o;8582:136::-;8685:21;8678:28;;;8185:540;:::o;8582:136::-;8250:475;8185:540;:::o;9744:372:7:-;-1:-1:-1;;;;;9823:16:7;;9815:61;;;;-1:-1:-1;;;9815:61:7;;24948:2:23;9815:61:7;;;24930:21:23;;;24967:18;;;24960:30;25026:34;25006:18;;;24999:62;25078:18;;9815:61:7;24746:356:23;9815:61:7;7796:4;7819:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7819:16:7;:30;9886:58;;;;-1:-1:-1;;;9886:58:7;;18791:2:23;9886:58:7;;;18773:21:23;18830:2;18810:18;;;18803:30;18869;18849:18;;;18842:58;18917:18;;9886:58:7;18589:352:23;9886:58:7;9955:45;9984:1;9988:2;9992:7;9955:20;:45::i;:::-;-1:-1:-1;;;;;10011:13:7;;;;;;:9;:13;;;;;:18;;10028:1;;10011:13;:18;;10028:1;;10011:18;:::i;:::-;;;;-1:-1:-1;;10039:16:7;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;10039:21:7;-1:-1:-1;;;;;10039:21:7;;;;;;;;10076:33;;10039:16;;;10076:33;;10039:16;;10076:33;9744:372;;:::o;7087:341::-;7238:28;7248:4;7254:2;7258:7;7238:9;:28::i;:::-;7297:48;7320:4;7326:2;7330:7;7339:5;7297:22;:48::i;:::-;7276:145;;;;-1:-1:-1;;;7276:145:7;;;;;;;:::i;2767:572:8:-;-1:-1:-1;;;;;2966:18:8;;2962:183;;3000:40;3032:7;4148:10;:17;;4121:24;;;;:15;:24;;;;;:44;;;4175:24;;;;;;;;;;;;4045:161;3000:40;2962:183;;;3069:2;-1:-1:-1;;;;;3061:10:8;:4;-1:-1:-1;;;;;3061:10:8;;3057:88;;3087:47;3120:4;3126:7;3087:32;:47::i;:::-;-1:-1:-1;;;;;3158:16:8;;3154:179;;3190:45;3227:7;3190:36;:45::i;3154:179::-;3262:4;-1:-1:-1;;;;;3256:10:8;:2;-1:-1:-1;;;;;3256:10:8;;3252:81;;3282:40;3310:2;3314:7;3282:27;:40::i;12434:950:7:-;12584:4;-1:-1:-1;;;;;12604:13:7;;1034:20:1;1080:8;12600:778:7;;12671:2;-1:-1:-1;;;;;12655:36:7;;12713:12;:10;:12::i;:::-;12747:4;12773:7;12802:5;12655:170;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12655:170:7;;;;;;;;-1:-1:-1;;12655:170:7;;;;;;;;;;;;:::i;:::-;;;12635:691;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13004:13:7;;13000:312;;13046:106;;-1:-1:-1;;;13046:106:7;;;;;;;:::i;13000:312::-;13264:6;13258:13;13249:6;13245:2;13241:15;13234:38;12635:691;-1:-1:-1;;;;;;12887:51:7;-1:-1:-1;;;12887:51:7;;-1:-1:-1;12880:58:7;;12600:778;-1:-1:-1;13363:4:7;12434:950;;;;;;:::o;4823:982:8:-;5097:22;5147:1;5122:22;5139:4;5122:16;:22::i;:::-;:26;;;;:::i;:::-;5158:18;5179:26;;;:17;:26;;;;;;5097:51;;-1:-1:-1;5309:28:8;;;5305:323;;-1:-1:-1;;;;;5375:18:8;;5353:19;5375:18;;;:12;:18;;;;;;;;:34;;;;;;;;;5424:30;;;;;;:44;;;5540:30;;:17;:30;;;;;:43;;;5305:323;-1:-1:-1;5721:26:8;;;;:17;:26;;;;;;;;5714:33;;;-1:-1:-1;;;;;5764:18:8;;;;;:12;:18;;;;;:34;;;;;;;5757:41;4823:982::o;6093:1061::-;6367:10;:17;6342:22;;6367:21;;6387:1;;6367:21;:::i;:::-;6398:18;6419:24;;;:15;:24;;;;;;6787:10;:26;;6342:46;;-1:-1:-1;6419:24:8;;6342:46;;6787:26;;;;;;:::i;:::-;;;;;;;;;6765:48;;6849:11;6824:10;6835;6824:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;6928:28;;;:15;:28;;;;;;;:41;;;7097:24;;;;;7090:31;7131:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;6164:990;;;6093:1061;:::o;3633:217::-;3717:14;3734:20;3751:2;3734:16;:20::i;:::-;-1:-1:-1;;;;;3764:16:8;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;3808:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;3633:217:8:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:406:23;78:5;112:18;104:6;101:30;98:56;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:23;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:45;;;309:1;306;299:12;268:45;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;14:406;;;;;:::o;425:173::-;493:20;;-1:-1:-1;;;;;542:31:23;;532:42;;522:70;;588:1;585;578:12;603:675;655:5;708:3;701:4;693:6;689:17;685:27;675:55;;726:1;723;716:12;675:55;762:6;749:20;788:4;812:60;828:43;868:2;828:43;:::i;:::-;812:60;:::i;:::-;894:3;918:2;913:3;906:15;946:2;941:3;937:12;930:19;;981:2;973:6;969:15;1033:3;1028:2;1022;1019:1;1015:10;1007:6;1003:23;999:32;996:41;993:61;;;1050:1;1047;1040:12;993:61;1072:1;1082:167;1096:2;1093:1;1090:9;1082:167;;;1153:21;1170:3;1153:21;:::i;:::-;1141:34;;1195:12;;;;1227;;;;1114:1;1107:9;1082:167;;;-1:-1:-1;1267:5:23;;603:675;-1:-1:-1;;;;;;;603:675:23:o;1283:160::-;1348:20;;1404:13;;1397:21;1387:32;;1377:60;;1433:1;1430;1423:12;1448:220;1490:5;1543:3;1536:4;1528:6;1524:17;1520:27;1510:55;;1561:1;1558;1551:12;1510:55;1583:79;1658:3;1649:6;1636:20;1629:4;1621:6;1617:17;1583:79;:::i;1673:156::-;1739:20;;1799:4;1788:16;;1778:27;;1768:55;;1819:1;1816;1809:12;1834:186;1893:6;1946:2;1934:9;1925:7;1921:23;1917:32;1914:52;;;1962:1;1959;1952:12;1914:52;1985:29;2004:9;1985:29;:::i;2025:260::-;2093:6;2101;2154:2;2142:9;2133:7;2129:23;2125:32;2122:52;;;2170:1;2167;2160:12;2122:52;2193:29;2212:9;2193:29;:::i;:::-;2183:39;;2241:38;2275:2;2264:9;2260:18;2241:38;:::i;:::-;2231:48;;2025:260;;;;;:::o;2290:328::-;2367:6;2375;2383;2436:2;2424:9;2415:7;2411:23;2407:32;2404:52;;;2452:1;2449;2442:12;2404:52;2475:29;2494:9;2475:29;:::i;:::-;2465:39;;2523:38;2557:2;2546:9;2542:18;2523:38;:::i;:::-;2513:48;;2608:2;2597:9;2593:18;2580:32;2570:42;;2290:328;;;;;:::o;2623:537::-;2718:6;2726;2734;2742;2795:3;2783:9;2774:7;2770:23;2766:33;2763:53;;;2812:1;2809;2802:12;2763:53;2835:29;2854:9;2835:29;:::i;:::-;2825:39;;2883:38;2917:2;2906:9;2902:18;2883:38;:::i;:::-;2873:48;;2968:2;2957:9;2953:18;2940:32;2930:42;;3023:2;3012:9;3008:18;2995:32;3050:18;3042:6;3039:30;3036:50;;;3082:1;3079;3072:12;3036:50;3105:49;3146:7;3137:6;3126:9;3122:22;3105:49;:::i;:::-;3095:59;;;2623:537;;;;;;;:::o;3165:254::-;3230:6;3238;3291:2;3279:9;3270:7;3266:23;3262:32;3259:52;;;3307:1;3304;3297:12;3259:52;3330:29;3349:9;3330:29;:::i;:::-;3320:39;;3378:35;3409:2;3398:9;3394:18;3378:35;:::i;3424:602::-;3526:6;3534;3542;3550;3558;3611:3;3599:9;3590:7;3586:23;3582:33;3579:53;;;3628:1;3625;3618:12;3579:53;3651:29;3670:9;3651:29;:::i;:::-;3641:39;;3731:2;3720:9;3716:18;3703:32;3758:18;3750:6;3747:30;3744:50;;;3790:1;3787;3780:12;3744:50;3813:49;3854:7;3845:6;3834:9;3830:22;3813:49;:::i;:::-;3803:59;;;3909:2;3898:9;3894:18;3881:32;3871:42;;3960:2;3949:9;3945:18;3932:32;3922:42;;3983:37;4015:3;4004:9;4000:19;3983:37;:::i;:::-;3973:47;;3424:602;;;;;;;;:::o;4031:254::-;4099:6;4107;4160:2;4148:9;4139:7;4135:23;4131:32;4128:52;;;4176:1;4173;4166:12;4128:52;4199:29;4218:9;4199:29;:::i;:::-;4189:39;4275:2;4260:18;;;;4247:32;;-1:-1:-1;;;4031:254:23:o;4290:615::-;4376:6;4384;4437:2;4425:9;4416:7;4412:23;4408:32;4405:52;;;4453:1;4450;4443:12;4405:52;4493:9;4480:23;4522:18;4563:2;4555:6;4552:14;4549:34;;;4579:1;4576;4569:12;4549:34;4617:6;4606:9;4602:22;4592:32;;4662:7;4655:4;4651:2;4647:13;4643:27;4633:55;;4684:1;4681;4674:12;4633:55;4724:2;4711:16;4750:2;4742:6;4739:14;4736:34;;;4766:1;4763;4756:12;4736:34;4819:7;4814:2;4804:6;4801:1;4797:14;4793:2;4789:23;4785:32;4782:45;4779:65;;;4840:1;4837;4830:12;4779:65;4871:2;4863:11;;;;;4893:6;;-1:-1:-1;4290:615:23;;-1:-1:-1;;;;4290:615:23:o;4910:1153::-;5026:6;5034;5087:2;5075:9;5066:7;5062:23;5058:32;5055:52;;;5103:1;5100;5093:12;5055:52;5143:9;5130:23;5172:18;5213:2;5205:6;5202:14;5199:34;;;5229:1;5226;5219:12;5199:34;5267:6;5256:9;5252:22;5242:32;;5312:7;5305:4;5301:2;5297:13;5293:27;5283:55;;5334:1;5331;5324:12;5283:55;5370:2;5357:16;5392:4;5416:60;5432:43;5472:2;5432:43;:::i;5416:60::-;5498:3;5522:2;5517:3;5510:15;5550:2;5545:3;5541:12;5534:19;;5581:2;5577;5573:11;5629:7;5624:2;5618;5615:1;5611:10;5607:2;5603:19;5599:28;5596:41;5593:61;;;5650:1;5647;5640:12;5593:61;5672:1;5663:10;;5682:169;5696:2;5693:1;5690:9;5682:169;;;5753:23;5772:3;5753:23;:::i;:::-;5741:36;;5714:1;5707:9;;;;;5797:12;;;;5829;;5682:169;;;-1:-1:-1;5870:5:23;-1:-1:-1;;5913:18:23;;5900:32;;-1:-1:-1;;5944:16:23;;;5941:36;;;5973:1;5970;5963:12;5941:36;;5996:61;6049:7;6038:8;6027:9;6023:24;5996:61;:::i;:::-;5986:71;;;4910:1153;;;;;:::o;6068:180::-;6124:6;6177:2;6165:9;6156:7;6152:23;6148:32;6145:52;;;6193:1;6190;6183:12;6145:52;6216:26;6232:9;6216:26;:::i;6253:245::-;6311:6;6364:2;6352:9;6343:7;6339:23;6335:32;6332:52;;;6380:1;6377;6370:12;6332:52;6419:9;6406:23;6438:30;6462:5;6438:30;:::i;6503:249::-;6572:6;6625:2;6613:9;6604:7;6600:23;6596:32;6593:52;;;6641:1;6638;6631:12;6593:52;6673:9;6667:16;6692:30;6716:5;6692:30;:::i;6757:450::-;6826:6;6879:2;6867:9;6858:7;6854:23;6850:32;6847:52;;;6895:1;6892;6885:12;6847:52;6935:9;6922:23;6968:18;6960:6;6957:30;6954:50;;;7000:1;6997;6990:12;6954:50;7023:22;;7076:4;7068:13;;7064:27;-1:-1:-1;7054:55:23;;7105:1;7102;7095:12;7054:55;7128:73;7193:7;7188:2;7175:16;7170:2;7166;7162:11;7128:73;:::i;7212:180::-;7271:6;7324:2;7312:9;7303:7;7299:23;7295:32;7292:52;;;7340:1;7337;7330:12;7292:52;-1:-1:-1;7363:23:23;;7212:180;-1:-1:-1;7212:180:23:o;7397:184::-;7467:6;7520:2;7508:9;7499:7;7495:23;7491:32;7488:52;;;7536:1;7533;7526:12;7488:52;-1:-1:-1;7559:16:23;;7397:184;-1:-1:-1;7397:184:23:o;7586:248::-;7654:6;7662;7715:2;7703:9;7694:7;7690:23;7686:32;7683:52;;;7731:1;7728;7721:12;7683:52;-1:-1:-1;;7754:23:23;;;7824:2;7809:18;;;7796:32;;-1:-1:-1;7586:248:23:o;7839:182::-;7896:6;7949:2;7937:9;7928:7;7924:23;7920:32;7917:52;;;7965:1;7962;7955:12;7917:52;7988:27;8005:9;7988:27;:::i;8026:268::-;8078:3;8116:5;8110:12;8143:6;8138:3;8131:19;8159:63;8215:6;8208:4;8203:3;8199:14;8192:4;8185:5;8181:16;8159:63;:::i;:::-;8276:2;8255:15;-1:-1:-1;;8251:29:23;8242:39;;;;8283:4;8238:50;;8026:268;-1:-1:-1;;8026:268:23:o;8299:184::-;8340:3;8378:5;8372:12;8393:52;8438:6;8433:3;8426:4;8419:5;8415:16;8393:52;:::i;:::-;8461:16;;;;;8299:184;-1:-1:-1;;8299:184:23:o;8918:274::-;9047:3;9085:6;9079:13;9101:53;9147:6;9142:3;9135:4;9127:6;9123:17;9101:53;:::i;:::-;9170:16;;;;;8918:274;-1:-1:-1;;8918:274:23:o;9197:415::-;9354:3;9392:6;9386:13;9408:53;9454:6;9449:3;9442:4;9434:6;9430:17;9408:53;:::i;:::-;9530:2;9526:15;;;;-1:-1:-1;;9522:53:23;9483:16;;;;9508:68;;;9603:2;9592:14;;9197:415;-1:-1:-1;;9197:415:23:o;9617:1173::-;9793:3;9822:1;9855:6;9849:13;9885:3;9907:1;9935:9;9931:2;9927:18;9917:28;;9995:2;9984:9;9980:18;10017;10007:61;;10061:4;10053:6;10049:17;10039:27;;10007:61;10087:2;10135;10127:6;10124:14;10104:18;10101:38;10098:165;;;-1:-1:-1;;;10162:33:23;;10218:4;10215:1;10208:15;10248:4;10169:3;10236:17;10098:165;10279:18;10306:104;;;;10424:1;10419:320;;;;10272:467;;10306:104;-1:-1:-1;;10339:24:23;;10327:37;;10384:16;;;;-1:-1:-1;10306:104:23;;10419:320;29658:1;29651:14;;;29695:4;29682:18;;10514:1;10528:165;10542:6;10539:1;10536:13;10528:165;;;10620:14;;10607:11;;;10600:35;10663:16;;;;10557:10;;10528:165;;;10532:3;;10722:6;10717:3;10713:16;10706:23;;10272:467;;;;;;;10755:29;10780:3;10772:6;10755:29;:::i;:::-;10748:36;9617:1173;-1:-1:-1;;;;;9617:1173:23:o;12785:442::-;-1:-1:-1;;;;;13042:15:23;;;13024:34;;13094:15;;13089:2;13074:18;;13067:43;13146:2;13141;13126:18;;13119:30;;;12967:4;;13166:55;;13202:18;;13194:6;13166:55;:::i;13232:499::-;-1:-1:-1;;;;;13501:15:23;;;13483:34;;13553:15;;13548:2;13533:18;;13526:43;13600:2;13585:18;;13578:34;;;13648:3;13643:2;13628:18;;13621:31;;;13426:4;;13669:56;;13705:19;;13697:6;13669:56;:::i;:::-;13661:64;13232:499;-1:-1:-1;;;;;;13232:499:23:o;14935:228::-;15082:2;15071:9;15064:21;15045:4;15102:55;15153:2;15142:9;15138:18;15130:6;15102:55;:::i;15627:414::-;15802:2;15787:18;;15835:1;15824:13;;15814:144;;15880:10;15875:3;15871:20;15868:1;15861:31;15915:4;15912:1;15905:15;15943:4;15940:1;15933:15;15814:144;15967:25;;;16023:2;16008:18;16001:34;15627:414;:::o;17406:::-;17608:2;17590:21;;;17647:2;17627:18;;;17620:30;17686:34;17681:2;17666:18;;17659:62;-1:-1:-1;;;17752:2:23;17737:18;;17730:48;17810:3;17795:19;;17406:414::o;19724:410::-;19926:2;19908:21;;;19965:2;19945:18;;;19938:30;20004:34;19999:2;19984:18;;19977:62;-1:-1:-1;;;20070:2:23;20055:18;;20048:44;20124:3;20109:19;;19724:410::o;20139:477::-;20341:2;20323:21;;;20380:2;20360:18;;;20353:30;20419:34;20414:2;20399:18;;20392:62;20490:34;20485:2;20470:18;;20463:62;-1:-1:-1;;;20556:3:23;20541:19;;20534:40;20606:3;20591:19;;20139:477::o;22270:408::-;22472:2;22454:21;;;22511:2;22491:18;;;22484:30;22550:34;22545:2;22530:18;;22523:62;-1:-1:-1;;;22616:2:23;22601:18;;22594:42;22668:3;22653:19;;22270:408::o;25520:356::-;25722:2;25704:21;;;25741:18;;;25734:30;25800:34;25795:2;25780:18;;25773:62;25867:2;25852:18;;25520:356::o;27511:413::-;27713:2;27695:21;;;27752:2;27732:18;;;27725:30;27791:34;27786:2;27771:18;;27764:62;-1:-1:-1;;;27857:2:23;27842:18;;27835:47;27914:3;27899:19;;27511:413::o;28342:399::-;28544:2;28526:21;;;28583:2;28563:18;;;28556:30;28622:34;28617:2;28602:18;;28595:62;-1:-1:-1;;;28688:2:23;28673:18;;28666:33;28731:3;28716:19;;28342:399::o;29117:275::-;29188:2;29182:9;29253:2;29234:13;;-1:-1:-1;;29230:27:23;29218:40;;29288:18;29273:34;;29309:22;;;29270:62;29267:88;;;29335:18;;:::i;:::-;29371:2;29364:22;29117:275;;-1:-1:-1;29117:275:23:o;29397:183::-;29457:4;29490:18;29482:6;29479:30;29476:56;;;29512:18;;:::i;:::-;-1:-1:-1;29557:1:23;29553:14;29569:4;29549:25;;29397:183::o;29711:128::-;29751:3;29782:1;29778:6;29775:1;29772:13;29769:39;;;29788:18;;:::i;:::-;-1:-1:-1;29824:9:23;;29711:128::o;29844:204::-;29882:3;29918:4;29915:1;29911:12;29950:4;29947:1;29943:12;29985:3;29979:4;29975:14;29970:3;29967:23;29964:49;;;29993:18;;:::i;:::-;30029:13;;29844:204;-1:-1:-1;;;29844:204:23:o;30053:120::-;30093:1;30119;30109:35;;30124:18;;:::i;:::-;-1:-1:-1;30158:9:23;;30053:120::o;30178:168::-;30218:7;30284:1;30280;30276:6;30272:14;30269:1;30266:21;30261:1;30254:9;30247:17;30243:45;30240:71;;;30291:18;;:::i;:::-;-1:-1:-1;30331:9:23;;30178:168::o;30351:125::-;30391:4;30419:1;30416;30413:8;30410:34;;;30424:18;;:::i;:::-;-1:-1:-1;30461:9:23;;30351:125::o;30481:258::-;30553:1;30563:113;30577:6;30574:1;30571:13;30563:113;;;30653:11;;;30647:18;30634:11;;;30627:39;30599:2;30592:10;30563:113;;;30694:6;30691:1;30688:13;30685:48;;;-1:-1:-1;;30729:1:23;30711:16;;30704:27;30481:258::o;30744:380::-;30823:1;30819:12;;;;30866;;;30887:61;;30941:4;30933:6;30929:17;30919:27;;30887:61;30994:2;30986:6;30983:14;30963:18;30960:38;30957:161;;;31040:10;31035:3;31031:20;31028:1;31021:31;31075:4;31072:1;31065:15;31103:4;31100:1;31093:15;30957:161;;30744:380;;;:::o;31129:135::-;31168:3;-1:-1:-1;;31189:17:23;;31186:43;;;31209:18;;:::i;:::-;-1:-1:-1;31256:1:23;31245:13;;31129:135::o;31269:175::-;31306:3;31350:4;31343:5;31339:16;31379:4;31370:7;31367:17;31364:43;;;31387:18;;:::i;:::-;31436:1;31423:15;;31269:175;-1:-1:-1;;31269:175:23:o;31449:112::-;31481:1;31507;31497:35;;31512:18;;:::i;:::-;-1:-1:-1;31546:9:23;;31449:112::o;31566:127::-;31627:10;31622:3;31618:20;31615:1;31608:31;31658:4;31655:1;31648:15;31682:4;31679:1;31672:15;31698:127;31759:10;31754:3;31750:20;31747:1;31740:31;31790:4;31787:1;31780:15;31814:4;31811:1;31804:15;31830:127;31891:10;31886:3;31882:20;31879:1;31872:31;31922:4;31919:1;31912:15;31946:4;31943:1;31936:15;31962:127;32023:10;32018:3;32014:20;32011:1;32004:31;32054:4;32051:1;32044:15;32078:4;32075:1;32068:15;32094:127;32155:10;32150:3;32146:20;32143:1;32136:31;32186:4;32183:1;32176:15;32210:4;32207:1;32200:15;32226:127;32287:10;32282:3;32278:20;32275:1;32268:31;32318:4;32315:1;32308:15;32342:4;32339:1;32332:15;32358:131;-1:-1:-1;;;;;;32432:32:23;;32422:43;;32412:71;;32479:1;32476;32469:12

Swarm Source

ipfs://73f2b9dbef78c7193b67385158dda17c20c71a00480dede27910a8813bb139da
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.