ETH Price: $3,449.85 (-1.90%)
Gas: 3 Gwei

Token

Crystal (Crystal)
 

Overview

Max Total Supply

2,216,196.24536161 Crystal

Holders

44

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
siddha.eth
Balance
340,806.91707296 Crystal

Value
$0.00
0xb91A23971cAbcE0dB9dbde18F554E47F8fF6F9F3
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:
Crystal

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 2 of 10: Crystal.sol
// contracts/Crystal.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "ERC20Burnable.sol";
import "Ownable.sol";
import "SafeMath.sol";
import "IERC721.sol";

interface IEights is IERC721 {
  function transferFrom(address from, address to, uint256 tokenId) external;
  function ownerOf(uint256 tokenId) external view returns (address owner);
}

contract Crystal is ERC20Burnable, Ownable {

    using SafeMath for uint256;

    event Staked(address from);
    event UnStaked(address from);
    event AllClaimed(address from);

    uint256 public MAX_WALLET_STAKED = 30;
    uint256 public EMISSIONS_RATE = 11574070000000000; //1000 $Crystal per day
    uint256 public CLAIM_END_TIME = 1653689398; //Fri May 27 2022 22:09:58 GMT+0000~ 8 months

    address nullAddress = 0x0000000000000000000000000000000000000000;

    address public theEightsAddress;

    //Mapping of Eight to timestamp
    mapping(uint256 => uint256) internal tokenIdToTimeStamp;

    //Mapping of Eight to staker
    mapping(uint256 => address) internal tokenIdToStaker;

    //Mapping of staker to Eights
    mapping(address => uint256[]) internal stakerToTokenIds;

    constructor() ERC20("Crystal", "Crystal") {}

    function setTheEightsAddress(address _theEightsAddress) public onlyOwner {
        theEightsAddress = _theEightsAddress;
        return;
    }

    function getTokensStaked(address staker)
        public
        view
        returns (uint256[] memory)
    {
        return stakerToTokenIds[staker];
    }

    function remove(address staker, uint256 index) internal {
        if (index >= stakerToTokenIds[staker].length) return;

        for (uint256 i = index; i < stakerToTokenIds[staker].length - 1; i++) {
            stakerToTokenIds[staker][i] = stakerToTokenIds[staker][i + 1];
        }
        stakerToTokenIds[staker].pop();
    }

    function removeTokenIdFromStaker(address staker, uint256 tokenId) internal {
        for (uint256 i = 0; i < stakerToTokenIds[staker].length; i++) {
            if (stakerToTokenIds[staker][i] == tokenId) {
                //This is the tokenId to remove;
                remove(staker, i);
            }
        }
    }

    function stakeByIds(uint256[] memory tokenIds) public {
        require(
            stakerToTokenIds[msg.sender].length + tokenIds.length <=
                MAX_WALLET_STAKED,
            "Must have less than 30 Eights staked!"
        );

        for (uint256 i = 0; i < tokenIds.length; i++) {
            require(
                IEights(theEightsAddress).ownerOf(tokenIds[i]) == msg.sender &&
                    tokenIdToStaker[tokenIds[i]] == nullAddress,
                "Token must be stakable by you!"
            );

            IEights(theEightsAddress).transferFrom(
                msg.sender,
                address(this),
                tokenIds[i]
            );

            stakerToTokenIds[msg.sender].push(tokenIds[i]);

            tokenIdToTimeStamp[tokenIds[i]] = block.timestamp;
            tokenIdToStaker[tokenIds[i]] = msg.sender;
        }

        emit Staked(msg.sender);
    }

    function unstakeAll() public {
        require(
            stakerToTokenIds[msg.sender].length > 0,
            "Must have at least one token staked!"
        );
        uint256 totalRewards = 0;

        for (uint256 i = stakerToTokenIds[msg.sender].length; i > 0; i--) {
            uint256 tokenId = stakerToTokenIds[msg.sender][i - 1];

            IEights(theEightsAddress).transferFrom(
                address(this),
                msg.sender,
                tokenId
            );

            totalRewards =
                totalRewards +
                ((block.timestamp - tokenIdToTimeStamp[tokenId]) *
                    EMISSIONS_RATE);

            removeTokenIdFromStaker(msg.sender, tokenId);

            tokenIdToStaker[tokenId] = nullAddress;
        }

        _mint(msg.sender, totalRewards);
    }

    function unstakeByIds(uint256[] memory tokenIds) public {
        uint256 totalRewards = 0;

        for (uint256 i = 0; i < tokenIds.length; i++) {
            require(
                tokenIdToStaker[tokenIds[i]] == msg.sender,
                "Message Sender was not original staker!"
            );

            IEights(theEightsAddress).transferFrom(
                address(this),
                msg.sender,
                tokenIds[i]
            );

            totalRewards =
                totalRewards +
                ((block.timestamp - tokenIdToTimeStamp[tokenIds[i]]) *
                    EMISSIONS_RATE);

            removeTokenIdFromStaker(msg.sender, tokenIds[i]);

            tokenIdToStaker[tokenIds[i]] = nullAddress;
        }

        _mint(msg.sender, totalRewards);
        emit UnStaked(msg.sender);
    }

    function claimByTokenId(uint256 tokenId) public {
        require(
            tokenIdToStaker[tokenId] == msg.sender,
            "Token is not claimable by you!"
        );
        require(block.timestamp < CLAIM_END_TIME, "Claim period is over!");

        _mint(
            msg.sender,
            ((block.timestamp - tokenIdToTimeStamp[tokenId]) * EMISSIONS_RATE)
        );

        tokenIdToTimeStamp[tokenId] = block.timestamp;
    }

    function claimAll() public {
        require(block.timestamp < CLAIM_END_TIME, "Claim period is over!");
        uint256[] memory tokenIds = stakerToTokenIds[msg.sender];
        uint256 totalRewards = 0;

        for (uint256 i = 0; i < tokenIds.length; i++) {
            require(
                tokenIdToStaker[tokenIds[i]] == msg.sender,
                "Token is not claimable by you!"
            );

            totalRewards =
                totalRewards +
                ((block.timestamp - tokenIdToTimeStamp[tokenIds[i]]) *
                    EMISSIONS_RATE);

            tokenIdToTimeStamp[tokenIds[i]] = block.timestamp;
        }

        _mint(msg.sender, totalRewards);
        emit AllClaimed(msg.sender);
    }

    function getAllRewards(address staker) public view returns (uint256) {
        uint256[] memory tokenIds = stakerToTokenIds[staker];
        uint256 totalRewards = 0;

        for (uint256 i = 0; i < tokenIds.length; i++) {
            totalRewards =
                totalRewards +
                ((block.timestamp - tokenIdToTimeStamp[tokenIds[i]]) *
                    EMISSIONS_RATE);
        }

        return totalRewards;
    }

    function getRewardsByTokenId(uint256 tokenId)
        public
        view
        returns (uint256)
    {
        require(
            tokenIdToStaker[tokenId] != nullAddress,
            "Token is not staked!"
        );

        uint256 secondsStaked = block.timestamp - tokenIdToTimeStamp[tokenId];

        return secondsStaked * EMISSIONS_RATE;
    }

    function getStaker(uint256 tokenId) public view returns (address) {
        return tokenIdToStaker[tokenId];
    }
}

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

pragma solidity ^0.8.0;

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

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

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

pragma solidity ^0.8.0;

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 _totalSupply;

    string private _name;
    string private _symbol;

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

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

        _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 4 of 10: ERC20Burnable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "ERC20.sol";
import "Context.sol";

/**
 * @dev Extension of {ERC20} that allows token holders to destroy both their own
 * tokens and those that they have an allowance for, in a way that can be
 * recognized off-chain (via event analysis).
 */
abstract contract ERC20Burnable is Context, ERC20 {
    /**
     * @dev Destroys `amount` tokens from the caller.
     *
     * See {ERC20-_burn}.
     */
    function burn(uint256 amount) public virtual {
        _burn(_msgSender(), amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, deducting from the caller's
     * allowance.
     *
     * See {ERC20-_burn} and {ERC20-allowance}.
     *
     * Requirements:
     *
     * - the caller must have allowance for ``accounts``'s tokens of at least
     * `amount`.
     */
    function burnFrom(address account, uint256 amount) public virtual {
        uint256 currentAllowance = allowance(account, _msgSender());
        require(currentAllowance >= amount, "ERC20: burn amount exceeds allowance");
        unchecked {
            _approve(account, _msgSender(), currentAllowance - amount);
        }
        _burn(account, amount);
    }
}

File 5 of 10: IERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @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 6 of 10: 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 7 of 10: 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 8 of 10: IERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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 9 of 10: Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "Context.sol";

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _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 10 of 10: SafeMath.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"}],"name":"AllClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"}],"name":"UnStaked","type":"event"},{"inputs":[],"name":"CLAIM_END_TIME","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EMISSIONS_RATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_WALLET_STAKED","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"claimByTokenId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"getAllRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getRewardsByTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getStaker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"getTokensStaked","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_theEightsAddress","type":"address"}],"name":"setTheEightsAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"stakeByIds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"theEightsAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unstakeAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"unstakeByIds","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052601e60065566291e8e2af49c006007556362914c366008556000600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200006b57600080fd5b506040518060400160405280600781526020017f4372797374616c000000000000000000000000000000000000000000000000008152506040518060400160405280600781526020017f4372797374616c000000000000000000000000000000000000000000000000008152508160039080519060200190620000f092919062000200565b5080600490805190602001906200010992919062000200565b5050506200012c620001206200013260201b60201c565b6200013a60201b60201c565b62000315565b600033905090565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200020e90620002df565b90600052602060002090601f0160209004810192826200023257600085556200027e565b82601f106200024d57805160ff19168380011785556200027e565b828001600101855582156200027e579182015b828111156200027d57825182559160200191906001019062000260565b5b5090506200028d919062000291565b5090565b5b80821115620002ac57600081600090555060010162000292565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620002f857607f821691505b602082108114156200030f576200030e620002b0565b5b50919050565b613cd980620003256000396000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c80636ad866bd11610104578063a457c2d7116100a2578063d9ffad4711610071578063d9ffad4714610547578063dd62ed3e14610563578063e3c998fe14610593578063f2fde38b146105c3576101da565b8063a457c2d7146104bf578063a9059cbb146104ef578063ba7e76621461051f578063d1058e591461053d576101da565b806379cc6790116100de57806379cc6790146104495780638ab8fab3146104655780638da5cb5b1461048357806395d89b41146104a1576101da565b80636ad866bd146103f357806370a082311461040f578063715018a61461043f576101da565b8063362a3fad1161017c578063515ec1051161014b578063515ec1051461035957806352eb7796146103895780635e1f1e2a146103b957806361134f60146103d5576101da565b8063362a3fad146102c157806339509351146102f157806342966c681461032157806348aa19361461033d576101da565b80632209d38c116101b85780632209d38c1461024b57806323b872dd14610269578063313ce5671461029957806335322f37146102b7576101da565b806306fdde03146101df578063095ea7b3146101fd57806318160ddd1461022d575b600080fd5b6101e76105df565b6040516101f49190612a38565b60405180910390f35b61021760048036038101906102129190612b02565b610671565b6040516102249190612b5d565b60405180910390f35b61023561068f565b6040516102429190612b87565b60405180910390f35b610253610699565b6040516102609190612b87565b60405180910390f35b610283600480360381019061027e9190612ba2565b61069f565b6040516102909190612b5d565b60405180910390f35b6102a1610797565b6040516102ae9190612c11565b60405180910390f35b6102bf6107a0565b005b6102db60048036038101906102d69190612c2c565b610a4d565b6040516102e89190612b87565b60405180910390f35b61030b60048036038101906103069190612b02565b610b5e565b6040516103189190612b5d565b60405180910390f35b61033b60048036038101906103369190612c59565b610c0a565b005b61035760048036038101906103529190612dce565b610c1e565b005b610373600480360381019061036e9190612c59565b610eef565b6040516103809190612b87565b60405180910390f35b6103a3600480360381019061039e9190612c2c565b610fee565b6040516103b09190612ed5565b60405180910390f35b6103d360048036038101906103ce9190612c59565b611085565b005b6103dd6111ba565b6040516103ea9190612f06565b60405180910390f35b61040d60048036038101906104089190612c2c565b6111e0565b005b61042960048036038101906104249190612c2c565b6112a0565b6040516104369190612b87565b60405180910390f35b6104476112e8565b005b610463600480360381019061045e9190612b02565b611370565b005b61046d6113eb565b60405161047a9190612b87565b60405180910390f35b61048b6113f1565b6040516104989190612f06565b60405180910390f35b6104a961141b565b6040516104b69190612a38565b60405180910390f35b6104d960048036038101906104d49190612b02565b6114ad565b6040516104e69190612b5d565b60405180910390f35b61050960048036038101906105049190612b02565b611598565b6040516105169190612b5d565b60405180910390f35b6105276115b6565b6040516105349190612b87565b60405180910390f35b6105456115bc565b005b610561600480360381019061055c9190612dce565b611838565b005b61057d60048036038101906105789190612f21565b611cc6565b60405161058a9190612b87565b60405180910390f35b6105ad60048036038101906105a89190612c59565b611d4d565b6040516105ba9190612f06565b60405180910390f35b6105dd60048036038101906105d89190612c2c565b611d8a565b005b6060600380546105ee90612f90565b80601f016020809104026020016040519081016040528092919081815260200182805461061a90612f90565b80156106675780601f1061063c57610100808354040283529160200191610667565b820191906000526020600020905b81548152906001019060200180831161064a57829003601f168201915b5050505050905090565b600061068561067e611e82565b8484611e8a565b6001905092915050565b6000600254905090565b60085481565b60006106ac848484612055565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006106f7611e82565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161076e90613034565b60405180910390fd5b61078b85610783611e82565b858403611e8a565b60019150509392505050565b60006012905090565b6000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905011610825576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161081c906130c6565b60405180910390fd5b600080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905090505b6000811115610a3f576000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001836108c59190613115565b815481106108d6576108d5613149565b5b90600052602060002001549050600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3033846040518463ffffffff1660e01b815260040161094293929190613178565b600060405180830381600087803b15801561095c57600080fd5b505af1158015610970573d6000803e3d6000fd5b50505050600754600b600083815260200190815260200160002054426109969190613115565b6109a091906131af565b836109ab9190613209565b92506109b733826122d6565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600c600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550508080610a379061325f565b91505061086e565b50610a4a33826123a9565b50565b600080600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015610ad957602002820191906000526020600020905b815481526020019060010190808311610ac5575b505050505090506000805b8251811015610b5357600754600b6000858481518110610b0757610b06613149565b5b602002602001015181526020019081526020016000205442610b299190613115565b610b3391906131af565b82610b3e9190613209565b91508080610b4b90613289565b915050610ae4565b508092505050919050565b6000610c00610b6b611e82565b848460016000610b79611e82565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610bfb9190613209565b611e8a565b6001905092915050565b610c1b610c15611e82565b82612509565b50565b6000805b8251811015610ea9573373ffffffffffffffffffffffffffffffffffffffff16600c6000858481518110610c5957610c58613149565b5b6020026020010151815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ce6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cdd90613344565b60405180910390fd5b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3033868581518110610d3957610d38613149565b5b60200260200101516040518463ffffffff1660e01b8152600401610d5f93929190613178565b600060405180830381600087803b158015610d7957600080fd5b505af1158015610d8d573d6000803e3d6000fd5b50505050600754600b6000858481518110610dab57610daa613149565b5b602002602001015181526020019081526020016000205442610dcd9190613115565b610dd791906131af565b82610de29190613209565b9150610e0833848381518110610dfb57610dfa613149565b5b60200260200101516122d6565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600c6000858481518110610e4257610e41613149565b5b6020026020010151815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508080610ea190613289565b915050610c22565b50610eb433826123a9565b7f6834bcb181c65df18ce2da14523ae95d5db81f9a666b2334d1b58e8caa952cfb33604051610ee39190612f06565b60405180910390a15050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600c600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610fb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fac906133b0565b60405180910390fd5b6000600b60008481526020019081526020016000205442610fd69190613115565b905060075481610fe691906131af565b915050919050565b6060600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561107957602002820191906000526020600020905b815481526020019060010190808311611065575b50505050509050919050565b3373ffffffffffffffffffffffffffffffffffffffff16600c600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611126576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111d9061341c565b60405180910390fd5b600854421061116a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116190613488565b60405180910390fd5b61119f33600754600b600085815260200190815260200160002054426111909190613115565b61119a91906131af565b6123a9565b42600b60008381526020019081526020016000208190555050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6111e8611e82565b73ffffffffffffffffffffffffffffffffffffffff166112066113f1565b73ffffffffffffffffffffffffffffffffffffffff161461125c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611253906134f4565b60405180910390fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6112f0611e82565b73ffffffffffffffffffffffffffffffffffffffff1661130e6113f1565b73ffffffffffffffffffffffffffffffffffffffff1614611364576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135b906134f4565b60405180910390fd5b61136e60006126e0565b565b60006113838361137e611e82565b611cc6565b9050818110156113c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113bf90613586565b60405180910390fd5b6113dc836113d4611e82565b848403611e8a565b6113e68383612509565b505050565b60065481565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461142a90612f90565b80601f016020809104026020016040519081016040528092919081815260200182805461145690612f90565b80156114a35780601f10611478576101008083540402835291602001916114a3565b820191906000526020600020905b81548152906001019060200180831161148657829003601f168201915b5050505050905090565b600080600160006114bc611e82565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015611579576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157090613618565b60405180910390fd5b61158d611584611e82565b85858403611e8a565b600191505092915050565b60006115ac6115a5611e82565b8484612055565b6001905092915050565b60075481565b6008544210611600576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f790613488565b60405180910390fd5b6000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561168b57602002820191906000526020600020905b815481526020019060010190808311611677575b505050505090506000805b82518110156117f2573373ffffffffffffffffffffffffffffffffffffffff16600c60008584815181106116cd576116cc613149565b5b6020026020010151815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461175a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117519061341c565b60405180910390fd5b600754600b600085848151811061177457611773613149565b5b6020026020010151815260200190815260200160002054426117969190613115565b6117a091906131af565b826117ab9190613209565b915042600b60008584815181106117c5576117c4613149565b5b602002602001015181526020019081526020016000208190555080806117ea90613289565b915050611696565b506117fd33826123a9565b7fd0e590bed8abdbfae3fb98dcfce5d5139a377a2b1f2c4c1d53eae9e656626a833360405161182c9190612f06565b60405180910390a15050565b6006548151600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905061188a9190613209565b11156118cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c2906136aa565b60405180910390fd5b60005b8151811015611c8b573373ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e84848151811061193f5761193e613149565b5b60200260200101516040518263ffffffff1660e01b81526004016119639190612b87565b60206040518083038186803b15801561197b57600080fd5b505afa15801561198f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119b391906136df565b73ffffffffffffffffffffffffffffffffffffffff16148015611a705750600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600c6000848481518110611a2157611a20613149565b5b6020026020010151815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b611aaf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa690613758565b60405180910390fd5b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330858581518110611b0257611b01613149565b5b60200260200101516040518463ffffffff1660e01b8152600401611b2893929190613178565b600060405180830381600087803b158015611b4257600080fd5b505af1158015611b56573d6000803e3d6000fd5b50505050600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828281518110611bac57611bab613149565b5b6020026020010151908060018154018082558091505060019003906000526020600020016000909190919091505542600b6000848481518110611bf257611bf1613149565b5b602002602001015181526020019081526020016000208190555033600c6000848481518110611c2457611c23613149565b5b6020026020010151815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508080611c8390613289565b9150506118ce565b507f77338642d9284a44296d29a273e04b8ab6b15c7d2439094cd460b7e4f0b3307433604051611cbb9190612f06565b60405180910390a150565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000600c600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b611d92611e82565b73ffffffffffffffffffffffffffffffffffffffff16611db06113f1565b73ffffffffffffffffffffffffffffffffffffffff1614611e06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dfd906134f4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611e76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6d906137ea565b60405180910390fd5b611e7f816126e0565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611efa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef19061387c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f619061390e565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516120489190612b87565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156120c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120bc906139a0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612135576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212c90613a32565b60405180910390fd5b6121408383836127a6565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156121c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121bd90613ac4565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122599190613209565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516122bd9190612b87565b60405180910390a36122d08484846127ab565b50505050565b60005b600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490508110156123a45781600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061237557612374613149565b5b906000526020600020015414156123915761239083826127b0565b5b808061239c90613289565b9150506122d9565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612419576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241090613b30565b60405180910390fd5b612425600083836127a6565b80600260008282546124379190613209565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461248c9190613209565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516124f19190612b87565b60405180910390a3612505600083836127ab565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612579576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257090613bc2565b60405180910390fd5b612585826000836127a6565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561260b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260290613c54565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282546126629190613115565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516126c79190612b87565b60405180910390a36126db836000846127ab565b505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b505050565b505050565b600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905081106127fe5761299b565b60008190505b6001600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506128539190613115565b81101561293457600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001826128a69190613209565b815481106128b7576128b6613149565b5b9060005260206000200154600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061291357612912613149565b5b9060005260206000200181905550808061292c90613289565b915050612804565b50600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548061298457612983613c74565b5b600190038181906000526020600020016000905590555b5050565b600081519050919050565b600082825260208201905092915050565b60005b838110156129d95780820151818401526020810190506129be565b838111156129e8576000848401525b50505050565b6000601f19601f8301169050919050565b6000612a0a8261299f565b612a1481856129aa565b9350612a248185602086016129bb565b612a2d816129ee565b840191505092915050565b60006020820190508181036000830152612a5281846129ff565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612a9982612a6e565b9050919050565b612aa981612a8e565b8114612ab457600080fd5b50565b600081359050612ac681612aa0565b92915050565b6000819050919050565b612adf81612acc565b8114612aea57600080fd5b50565b600081359050612afc81612ad6565b92915050565b60008060408385031215612b1957612b18612a64565b5b6000612b2785828601612ab7565b9250506020612b3885828601612aed565b9150509250929050565b60008115159050919050565b612b5781612b42565b82525050565b6000602082019050612b726000830184612b4e565b92915050565b612b8181612acc565b82525050565b6000602082019050612b9c6000830184612b78565b92915050565b600080600060608486031215612bbb57612bba612a64565b5b6000612bc986828701612ab7565b9350506020612bda86828701612ab7565b9250506040612beb86828701612aed565b9150509250925092565b600060ff82169050919050565b612c0b81612bf5565b82525050565b6000602082019050612c266000830184612c02565b92915050565b600060208284031215612c4257612c41612a64565b5b6000612c5084828501612ab7565b91505092915050565b600060208284031215612c6f57612c6e612a64565b5b6000612c7d84828501612aed565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612cc3826129ee565b810181811067ffffffffffffffff82111715612ce257612ce1612c8b565b5b80604052505050565b6000612cf5612a5a565b9050612d018282612cba565b919050565b600067ffffffffffffffff821115612d2157612d20612c8b565b5b602082029050602081019050919050565b600080fd5b6000612d4a612d4584612d06565b612ceb565b90508083825260208201905060208402830185811115612d6d57612d6c612d32565b5b835b81811015612d965780612d828882612aed565b845260208401935050602081019050612d6f565b5050509392505050565b600082601f830112612db557612db4612c86565b5b8135612dc5848260208601612d37565b91505092915050565b600060208284031215612de457612de3612a64565b5b600082013567ffffffffffffffff811115612e0257612e01612a69565b5b612e0e84828501612da0565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612e4c81612acc565b82525050565b6000612e5e8383612e43565b60208301905092915050565b6000602082019050919050565b6000612e8282612e17565b612e8c8185612e22565b9350612e9783612e33565b8060005b83811015612ec8578151612eaf8882612e52565b9750612eba83612e6a565b925050600181019050612e9b565b5085935050505092915050565b60006020820190508181036000830152612eef8184612e77565b905092915050565b612f0081612a8e565b82525050565b6000602082019050612f1b6000830184612ef7565b92915050565b60008060408385031215612f3857612f37612a64565b5b6000612f4685828601612ab7565b9250506020612f5785828601612ab7565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612fa857607f821691505b60208210811415612fbc57612fbb612f61565b5b50919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b600061301e6028836129aa565b915061302982612fc2565b604082019050919050565b6000602082019050818103600083015261304d81613011565b9050919050565b7f4d7573742068617665206174206c65617374206f6e6520746f6b656e2073746160008201527f6b65642100000000000000000000000000000000000000000000000000000000602082015250565b60006130b06024836129aa565b91506130bb82613054565b604082019050919050565b600060208201905081810360008301526130df816130a3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061312082612acc565b915061312b83612acc565b92508282101561313e5761313d6130e6565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060608201905061318d6000830186612ef7565b61319a6020830185612ef7565b6131a76040830184612b78565b949350505050565b60006131ba82612acc565b91506131c583612acc565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156131fe576131fd6130e6565b5b828202905092915050565b600061321482612acc565b915061321f83612acc565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613254576132536130e6565b5b828201905092915050565b600061326a82612acc565b9150600082141561327e5761327d6130e6565b5b600182039050919050565b600061329482612acc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156132c7576132c66130e6565b5b600182019050919050565b7f4d6573736167652053656e64657220776173206e6f74206f726967696e616c2060008201527f7374616b65722100000000000000000000000000000000000000000000000000602082015250565b600061332e6027836129aa565b9150613339826132d2565b604082019050919050565b6000602082019050818103600083015261335d81613321565b9050919050565b7f546f6b656e206973206e6f74207374616b656421000000000000000000000000600082015250565b600061339a6014836129aa565b91506133a582613364565b602082019050919050565b600060208201905081810360008301526133c98161338d565b9050919050565b7f546f6b656e206973206e6f7420636c61696d61626c6520627920796f75210000600082015250565b6000613406601e836129aa565b9150613411826133d0565b602082019050919050565b60006020820190508181036000830152613435816133f9565b9050919050565b7f436c61696d20706572696f64206973206f766572210000000000000000000000600082015250565b60006134726015836129aa565b915061347d8261343c565b602082019050919050565b600060208201905081810360008301526134a181613465565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006134de6020836129aa565b91506134e9826134a8565b602082019050919050565b6000602082019050818103600083015261350d816134d1565b9050919050565b7f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f7760008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b60006135706024836129aa565b915061357b82613514565b604082019050919050565b6000602082019050818103600083015261359f81613563565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006136026025836129aa565b915061360d826135a6565b604082019050919050565b60006020820190508181036000830152613631816135f5565b9050919050565b7f4d7573742068617665206c657373207468616e2033302045696768747320737460008201527f616b656421000000000000000000000000000000000000000000000000000000602082015250565b60006136946025836129aa565b915061369f82613638565b604082019050919050565b600060208201905081810360008301526136c381613687565b9050919050565b6000815190506136d981612aa0565b92915050565b6000602082840312156136f5576136f4612a64565b5b6000613703848285016136ca565b91505092915050565b7f546f6b656e206d757374206265207374616b61626c6520627920796f75210000600082015250565b6000613742601e836129aa565b915061374d8261370c565b602082019050919050565b6000602082019050818103600083015261377181613735565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006137d46026836129aa565b91506137df82613778565b604082019050919050565b60006020820190508181036000830152613803816137c7565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006138666024836129aa565b91506138718261380a565b604082019050919050565b6000602082019050818103600083015261389581613859565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006138f86022836129aa565b91506139038261389c565b604082019050919050565b60006020820190508181036000830152613927816138eb565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061398a6025836129aa565b91506139958261392e565b604082019050919050565b600060208201905081810360008301526139b98161397d565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000613a1c6023836129aa565b9150613a27826139c0565b604082019050919050565b60006020820190508181036000830152613a4b81613a0f565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000613aae6026836129aa565b9150613ab982613a52565b604082019050919050565b60006020820190508181036000830152613add81613aa1565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000613b1a601f836129aa565b9150613b2582613ae4565b602082019050919050565b60006020820190508181036000830152613b4981613b0d565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000613bac6021836129aa565b9150613bb782613b50565b604082019050919050565b60006020820190508181036000830152613bdb81613b9f565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000613c3e6022836129aa565b9150613c4982613be2565b604082019050919050565b60006020820190508181036000830152613c6d81613c31565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220f6e5e7a7c08ab0d0d15ffcf0904f262578499b9d757e155efb08d5730b63717364736f6c63430008090033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101da5760003560e01c80636ad866bd11610104578063a457c2d7116100a2578063d9ffad4711610071578063d9ffad4714610547578063dd62ed3e14610563578063e3c998fe14610593578063f2fde38b146105c3576101da565b8063a457c2d7146104bf578063a9059cbb146104ef578063ba7e76621461051f578063d1058e591461053d576101da565b806379cc6790116100de57806379cc6790146104495780638ab8fab3146104655780638da5cb5b1461048357806395d89b41146104a1576101da565b80636ad866bd146103f357806370a082311461040f578063715018a61461043f576101da565b8063362a3fad1161017c578063515ec1051161014b578063515ec1051461035957806352eb7796146103895780635e1f1e2a146103b957806361134f60146103d5576101da565b8063362a3fad146102c157806339509351146102f157806342966c681461032157806348aa19361461033d576101da565b80632209d38c116101b85780632209d38c1461024b57806323b872dd14610269578063313ce5671461029957806335322f37146102b7576101da565b806306fdde03146101df578063095ea7b3146101fd57806318160ddd1461022d575b600080fd5b6101e76105df565b6040516101f49190612a38565b60405180910390f35b61021760048036038101906102129190612b02565b610671565b6040516102249190612b5d565b60405180910390f35b61023561068f565b6040516102429190612b87565b60405180910390f35b610253610699565b6040516102609190612b87565b60405180910390f35b610283600480360381019061027e9190612ba2565b61069f565b6040516102909190612b5d565b60405180910390f35b6102a1610797565b6040516102ae9190612c11565b60405180910390f35b6102bf6107a0565b005b6102db60048036038101906102d69190612c2c565b610a4d565b6040516102e89190612b87565b60405180910390f35b61030b60048036038101906103069190612b02565b610b5e565b6040516103189190612b5d565b60405180910390f35b61033b60048036038101906103369190612c59565b610c0a565b005b61035760048036038101906103529190612dce565b610c1e565b005b610373600480360381019061036e9190612c59565b610eef565b6040516103809190612b87565b60405180910390f35b6103a3600480360381019061039e9190612c2c565b610fee565b6040516103b09190612ed5565b60405180910390f35b6103d360048036038101906103ce9190612c59565b611085565b005b6103dd6111ba565b6040516103ea9190612f06565b60405180910390f35b61040d60048036038101906104089190612c2c565b6111e0565b005b61042960048036038101906104249190612c2c565b6112a0565b6040516104369190612b87565b60405180910390f35b6104476112e8565b005b610463600480360381019061045e9190612b02565b611370565b005b61046d6113eb565b60405161047a9190612b87565b60405180910390f35b61048b6113f1565b6040516104989190612f06565b60405180910390f35b6104a961141b565b6040516104b69190612a38565b60405180910390f35b6104d960048036038101906104d49190612b02565b6114ad565b6040516104e69190612b5d565b60405180910390f35b61050960048036038101906105049190612b02565b611598565b6040516105169190612b5d565b60405180910390f35b6105276115b6565b6040516105349190612b87565b60405180910390f35b6105456115bc565b005b610561600480360381019061055c9190612dce565b611838565b005b61057d60048036038101906105789190612f21565b611cc6565b60405161058a9190612b87565b60405180910390f35b6105ad60048036038101906105a89190612c59565b611d4d565b6040516105ba9190612f06565b60405180910390f35b6105dd60048036038101906105d89190612c2c565b611d8a565b005b6060600380546105ee90612f90565b80601f016020809104026020016040519081016040528092919081815260200182805461061a90612f90565b80156106675780601f1061063c57610100808354040283529160200191610667565b820191906000526020600020905b81548152906001019060200180831161064a57829003601f168201915b5050505050905090565b600061068561067e611e82565b8484611e8a565b6001905092915050565b6000600254905090565b60085481565b60006106ac848484612055565b6000600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006106f7611e82565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015610777576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161076e90613034565b60405180910390fd5b61078b85610783611e82565b858403611e8a565b60019150509392505050565b60006012905090565b6000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905011610825576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161081c906130c6565b60405180910390fd5b600080600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905090505b6000811115610a3f576000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001836108c59190613115565b815481106108d6576108d5613149565b5b90600052602060002001549050600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3033846040518463ffffffff1660e01b815260040161094293929190613178565b600060405180830381600087803b15801561095c57600080fd5b505af1158015610970573d6000803e3d6000fd5b50505050600754600b600083815260200190815260200160002054426109969190613115565b6109a091906131af565b836109ab9190613209565b92506109b733826122d6565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600c600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550508080610a379061325f565b91505061086e565b50610a4a33826123a9565b50565b600080600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805480602002602001604051908101604052809291908181526020018280548015610ad957602002820191906000526020600020905b815481526020019060010190808311610ac5575b505050505090506000805b8251811015610b5357600754600b6000858481518110610b0757610b06613149565b5b602002602001015181526020019081526020016000205442610b299190613115565b610b3391906131af565b82610b3e9190613209565b91508080610b4b90613289565b915050610ae4565b508092505050919050565b6000610c00610b6b611e82565b848460016000610b79611e82565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610bfb9190613209565b611e8a565b6001905092915050565b610c1b610c15611e82565b82612509565b50565b6000805b8251811015610ea9573373ffffffffffffffffffffffffffffffffffffffff16600c6000858481518110610c5957610c58613149565b5b6020026020010151815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ce6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cdd90613344565b60405180910390fd5b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3033868581518110610d3957610d38613149565b5b60200260200101516040518463ffffffff1660e01b8152600401610d5f93929190613178565b600060405180830381600087803b158015610d7957600080fd5b505af1158015610d8d573d6000803e3d6000fd5b50505050600754600b6000858481518110610dab57610daa613149565b5b602002602001015181526020019081526020016000205442610dcd9190613115565b610dd791906131af565b82610de29190613209565b9150610e0833848381518110610dfb57610dfa613149565b5b60200260200101516122d6565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600c6000858481518110610e4257610e41613149565b5b6020026020010151815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508080610ea190613289565b915050610c22565b50610eb433826123a9565b7f6834bcb181c65df18ce2da14523ae95d5db81f9a666b2334d1b58e8caa952cfb33604051610ee39190612f06565b60405180910390a15050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600c600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610fb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fac906133b0565b60405180910390fd5b6000600b60008481526020019081526020016000205442610fd69190613115565b905060075481610fe691906131af565b915050919050565b6060600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561107957602002820191906000526020600020905b815481526020019060010190808311611065575b50505050509050919050565b3373ffffffffffffffffffffffffffffffffffffffff16600c600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611126576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111d9061341c565b60405180910390fd5b600854421061116a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116190613488565b60405180910390fd5b61119f33600754600b600085815260200190815260200160002054426111909190613115565b61119a91906131af565b6123a9565b42600b60008381526020019081526020016000208190555050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6111e8611e82565b73ffffffffffffffffffffffffffffffffffffffff166112066113f1565b73ffffffffffffffffffffffffffffffffffffffff161461125c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611253906134f4565b60405180910390fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6112f0611e82565b73ffffffffffffffffffffffffffffffffffffffff1661130e6113f1565b73ffffffffffffffffffffffffffffffffffffffff1614611364576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135b906134f4565b60405180910390fd5b61136e60006126e0565b565b60006113838361137e611e82565b611cc6565b9050818110156113c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113bf90613586565b60405180910390fd5b6113dc836113d4611e82565b848403611e8a565b6113e68383612509565b505050565b60065481565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606004805461142a90612f90565b80601f016020809104026020016040519081016040528092919081815260200182805461145690612f90565b80156114a35780601f10611478576101008083540402835291602001916114a3565b820191906000526020600020905b81548152906001019060200180831161148657829003601f168201915b5050505050905090565b600080600160006114bc611e82565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905082811015611579576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157090613618565b60405180910390fd5b61158d611584611e82565b85858403611e8a565b600191505092915050565b60006115ac6115a5611e82565b8484612055565b6001905092915050565b60075481565b6008544210611600576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f790613488565b60405180910390fd5b6000600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801561168b57602002820191906000526020600020905b815481526020019060010190808311611677575b505050505090506000805b82518110156117f2573373ffffffffffffffffffffffffffffffffffffffff16600c60008584815181106116cd576116cc613149565b5b6020026020010151815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461175a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117519061341c565b60405180910390fd5b600754600b600085848151811061177457611773613149565b5b6020026020010151815260200190815260200160002054426117969190613115565b6117a091906131af565b826117ab9190613209565b915042600b60008584815181106117c5576117c4613149565b5b602002602001015181526020019081526020016000208190555080806117ea90613289565b915050611696565b506117fd33826123a9565b7fd0e590bed8abdbfae3fb98dcfce5d5139a377a2b1f2c4c1d53eae9e656626a833360405161182c9190612f06565b60405180910390a15050565b6006548151600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905061188a9190613209565b11156118cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c2906136aa565b60405180910390fd5b60005b8151811015611c8b573373ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e84848151811061193f5761193e613149565b5b60200260200101516040518263ffffffff1660e01b81526004016119639190612b87565b60206040518083038186803b15801561197b57600080fd5b505afa15801561198f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119b391906136df565b73ffffffffffffffffffffffffffffffffffffffff16148015611a705750600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600c6000848481518110611a2157611a20613149565b5b6020026020010151815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b611aaf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa690613758565b60405180910390fd5b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330858581518110611b0257611b01613149565b5b60200260200101516040518463ffffffff1660e01b8152600401611b2893929190613178565b600060405180830381600087803b158015611b4257600080fd5b505af1158015611b56573d6000803e3d6000fd5b50505050600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828281518110611bac57611bab613149565b5b6020026020010151908060018154018082558091505060019003906000526020600020016000909190919091505542600b6000848481518110611bf257611bf1613149565b5b602002602001015181526020019081526020016000208190555033600c6000848481518110611c2457611c23613149565b5b6020026020010151815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508080611c8390613289565b9150506118ce565b507f77338642d9284a44296d29a273e04b8ab6b15c7d2439094cd460b7e4f0b3307433604051611cbb9190612f06565b60405180910390a150565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000600c600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b611d92611e82565b73ffffffffffffffffffffffffffffffffffffffff16611db06113f1565b73ffffffffffffffffffffffffffffffffffffffff1614611e06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dfd906134f4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611e76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6d906137ea565b60405180910390fd5b611e7f816126e0565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611efa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef19061387c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f619061390e565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516120489190612b87565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156120c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120bc906139a0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612135576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161212c90613a32565b60405180910390fd5b6121408383836127a6565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156121c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121bd90613ac4565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122599190613209565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516122bd9190612b87565b60405180910390a36122d08484846127ab565b50505050565b60005b600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490508110156123a45781600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061237557612374613149565b5b906000526020600020015414156123915761239083826127b0565b5b808061239c90613289565b9150506122d9565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612419576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241090613b30565b60405180910390fd5b612425600083836127a6565b80600260008282546124379190613209565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461248c9190613209565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516124f19190612b87565b60405180910390a3612505600083836127ab565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612579576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257090613bc2565b60405180910390fd5b612585826000836127a6565b60008060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561260b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260290613c54565b60405180910390fd5b8181036000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600260008282546126629190613115565b92505081905550600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516126c79190612b87565b60405180910390a36126db836000846127ab565b505050565b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b505050565b505050565b600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054905081106127fe5761299b565b60008190505b6001600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490506128539190613115565b81101561293457600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001826128a69190613209565b815481106128b7576128b6613149565b5b9060005260206000200154600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811061291357612912613149565b5b9060005260206000200181905550808061292c90613289565b915050612804565b50600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548061298457612983613c74565b5b600190038181906000526020600020016000905590555b5050565b600081519050919050565b600082825260208201905092915050565b60005b838110156129d95780820151818401526020810190506129be565b838111156129e8576000848401525b50505050565b6000601f19601f8301169050919050565b6000612a0a8261299f565b612a1481856129aa565b9350612a248185602086016129bb565b612a2d816129ee565b840191505092915050565b60006020820190508181036000830152612a5281846129ff565b905092915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612a9982612a6e565b9050919050565b612aa981612a8e565b8114612ab457600080fd5b50565b600081359050612ac681612aa0565b92915050565b6000819050919050565b612adf81612acc565b8114612aea57600080fd5b50565b600081359050612afc81612ad6565b92915050565b60008060408385031215612b1957612b18612a64565b5b6000612b2785828601612ab7565b9250506020612b3885828601612aed565b9150509250929050565b60008115159050919050565b612b5781612b42565b82525050565b6000602082019050612b726000830184612b4e565b92915050565b612b8181612acc565b82525050565b6000602082019050612b9c6000830184612b78565b92915050565b600080600060608486031215612bbb57612bba612a64565b5b6000612bc986828701612ab7565b9350506020612bda86828701612ab7565b9250506040612beb86828701612aed565b9150509250925092565b600060ff82169050919050565b612c0b81612bf5565b82525050565b6000602082019050612c266000830184612c02565b92915050565b600060208284031215612c4257612c41612a64565b5b6000612c5084828501612ab7565b91505092915050565b600060208284031215612c6f57612c6e612a64565b5b6000612c7d84828501612aed565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612cc3826129ee565b810181811067ffffffffffffffff82111715612ce257612ce1612c8b565b5b80604052505050565b6000612cf5612a5a565b9050612d018282612cba565b919050565b600067ffffffffffffffff821115612d2157612d20612c8b565b5b602082029050602081019050919050565b600080fd5b6000612d4a612d4584612d06565b612ceb565b90508083825260208201905060208402830185811115612d6d57612d6c612d32565b5b835b81811015612d965780612d828882612aed565b845260208401935050602081019050612d6f565b5050509392505050565b600082601f830112612db557612db4612c86565b5b8135612dc5848260208601612d37565b91505092915050565b600060208284031215612de457612de3612a64565b5b600082013567ffffffffffffffff811115612e0257612e01612a69565b5b612e0e84828501612da0565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612e4c81612acc565b82525050565b6000612e5e8383612e43565b60208301905092915050565b6000602082019050919050565b6000612e8282612e17565b612e8c8185612e22565b9350612e9783612e33565b8060005b83811015612ec8578151612eaf8882612e52565b9750612eba83612e6a565b925050600181019050612e9b565b5085935050505092915050565b60006020820190508181036000830152612eef8184612e77565b905092915050565b612f0081612a8e565b82525050565b6000602082019050612f1b6000830184612ef7565b92915050565b60008060408385031215612f3857612f37612a64565b5b6000612f4685828601612ab7565b9250506020612f5785828601612ab7565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612fa857607f821691505b60208210811415612fbc57612fbb612f61565b5b50919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b600061301e6028836129aa565b915061302982612fc2565b604082019050919050565b6000602082019050818103600083015261304d81613011565b9050919050565b7f4d7573742068617665206174206c65617374206f6e6520746f6b656e2073746160008201527f6b65642100000000000000000000000000000000000000000000000000000000602082015250565b60006130b06024836129aa565b91506130bb82613054565b604082019050919050565b600060208201905081810360008301526130df816130a3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061312082612acc565b915061312b83612acc565b92508282101561313e5761313d6130e6565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060608201905061318d6000830186612ef7565b61319a6020830185612ef7565b6131a76040830184612b78565b949350505050565b60006131ba82612acc565b91506131c583612acc565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156131fe576131fd6130e6565b5b828202905092915050565b600061321482612acc565b915061321f83612acc565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613254576132536130e6565b5b828201905092915050565b600061326a82612acc565b9150600082141561327e5761327d6130e6565b5b600182039050919050565b600061329482612acc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156132c7576132c66130e6565b5b600182019050919050565b7f4d6573736167652053656e64657220776173206e6f74206f726967696e616c2060008201527f7374616b65722100000000000000000000000000000000000000000000000000602082015250565b600061332e6027836129aa565b9150613339826132d2565b604082019050919050565b6000602082019050818103600083015261335d81613321565b9050919050565b7f546f6b656e206973206e6f74207374616b656421000000000000000000000000600082015250565b600061339a6014836129aa565b91506133a582613364565b602082019050919050565b600060208201905081810360008301526133c98161338d565b9050919050565b7f546f6b656e206973206e6f7420636c61696d61626c6520627920796f75210000600082015250565b6000613406601e836129aa565b9150613411826133d0565b602082019050919050565b60006020820190508181036000830152613435816133f9565b9050919050565b7f436c61696d20706572696f64206973206f766572210000000000000000000000600082015250565b60006134726015836129aa565b915061347d8261343c565b602082019050919050565b600060208201905081810360008301526134a181613465565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006134de6020836129aa565b91506134e9826134a8565b602082019050919050565b6000602082019050818103600083015261350d816134d1565b9050919050565b7f45524332303a206275726e20616d6f756e74206578636565647320616c6c6f7760008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b60006135706024836129aa565b915061357b82613514565b604082019050919050565b6000602082019050818103600083015261359f81613563565b9050919050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b60006136026025836129aa565b915061360d826135a6565b604082019050919050565b60006020820190508181036000830152613631816135f5565b9050919050565b7f4d7573742068617665206c657373207468616e2033302045696768747320737460008201527f616b656421000000000000000000000000000000000000000000000000000000602082015250565b60006136946025836129aa565b915061369f82613638565b604082019050919050565b600060208201905081810360008301526136c381613687565b9050919050565b6000815190506136d981612aa0565b92915050565b6000602082840312156136f5576136f4612a64565b5b6000613703848285016136ca565b91505092915050565b7f546f6b656e206d757374206265207374616b61626c6520627920796f75210000600082015250565b6000613742601e836129aa565b915061374d8261370c565b602082019050919050565b6000602082019050818103600083015261377181613735565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006137d46026836129aa565b91506137df82613778565b604082019050919050565b60006020820190508181036000830152613803816137c7565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006138666024836129aa565b91506138718261380a565b604082019050919050565b6000602082019050818103600083015261389581613859565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006138f86022836129aa565b91506139038261389c565b604082019050919050565b60006020820190508181036000830152613927816138eb565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061398a6025836129aa565b91506139958261392e565b604082019050919050565b600060208201905081810360008301526139b98161397d565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000613a1c6023836129aa565b9150613a27826139c0565b604082019050919050565b60006020820190508181036000830152613a4b81613a0f565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b6000613aae6026836129aa565b9150613ab982613a52565b604082019050919050565b60006020820190508181036000830152613add81613aa1565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b6000613b1a601f836129aa565b9150613b2582613ae4565b602082019050919050565b60006020820190508181036000830152613b4981613b0d565b9050919050565b7f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000613bac6021836129aa565b9150613bb782613b50565b604082019050919050565b60006020820190508181036000830152613bdb81613b9f565b9050919050565b7f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60008201527f6365000000000000000000000000000000000000000000000000000000000000602082015250565b6000613c3e6022836129aa565b9150613c4982613be2565b604082019050919050565b60006020820190508181036000830152613c6d81613c31565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220f6e5e7a7c08ab0d0d15ffcf0904f262578499b9d757e155efb08d5730b63717364736f6c63430008090033

Deployed Bytecode Sourcemap

364:6515:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2057:98:2;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4154:166;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3145:106;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;672:42:1;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4787:478:2;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2994:91;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3102:824:1;;;:::i;:::-;;5961:435;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5660:212:2;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;469:89:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3932:837:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6402:355;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1360:156;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4775:442;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;838:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1212:142;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3309:125:2;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1596:92:8;;;:::i;:::-;;864:361:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;550:37:1;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;964:85:8;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2268:102:2;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6359:405;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3637:172;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;593:49:1;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5223:732;;;:::i;:::-;;2185:911;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3867:149:2;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6763:114:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1837:189:8;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2057:98:2;2111:13;2143:5;2136:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2057:98;:::o;4154:166::-;4237:4;4253:39;4262:12;:10;:12::i;:::-;4276:7;4285:6;4253:8;:39::i;:::-;4309:4;4302:11;;4154:166;;;;:::o;3145:106::-;3206:7;3232:12;;3225:19;;3145:106;:::o;672:42:1:-;;;;:::o;4787:478:2:-;4923:4;4939:36;4949:6;4957:9;4968:6;4939:9;:36::i;:::-;4986:24;5013:11;:19;5025:6;5013:19;;;;;;;;;;;;;;;:33;5033:12;:10;:12::i;:::-;5013:33;;;;;;;;;;;;;;;;4986:60;;5084:6;5064:16;:26;;5056:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;5169:57;5178:6;5186:12;:10;:12::i;:::-;5219:6;5200:16;:25;5169:8;:57::i;:::-;5254:4;5247:11;;;4787:478;;;;;:::o;2994:91::-;3052:5;3076:2;3069:9;;2994:91;:::o;3102:824:1:-;3200:1;3162:16;:28;3179:10;3162:28;;;;;;;;;;;;;;;:35;;;;:39;3141:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;3273:20;3313:9;3325:16;:28;3342:10;3325:28;;;;;;;;;;;;;;;:35;;;;3313:47;;3308:570;3366:1;3362;:5;3308:570;;;3388:15;3406:16;:28;3423:10;3406:28;;;;;;;;;;;;;;;3439:1;3435;:5;;;;:::i;:::-;3406:35;;;;;;;;:::i;:::-;;;;;;;;;;3388:53;;3464:16;;;;;;;;;;;3456:38;;;3520:4;3543:10;3571:7;3456:136;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3740:14;;3689:18;:27;3708:7;3689:27;;;;;;;;;;;;3671:15;:45;;;;:::i;:::-;3670:84;;;;:::i;:::-;3638:12;:117;;;;:::i;:::-;3607:148;;3770:44;3794:10;3806:7;3770:23;:44::i;:::-;3856:11;;;;;;;;;;;3829:15;:24;3845:7;3829:24;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;3374:504;3369:3;;;;;:::i;:::-;;;;3308:570;;;;3888:31;3894:10;3906:12;3888:5;:31::i;:::-;3131:795;3102:824::o;5961:435::-;6021:7;6040:25;6068:16;:24;6085:6;6068:24;;;;;;;;;;;;;;;6040:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6102:20;6142:9;6137:223;6161:8;:15;6157:1;:19;6137:223;;;6334:14;;6279:18;:31;6298:8;6307:1;6298:11;;;;;;;;:::i;:::-;;;;;;;;6279:31;;;;;;;;;;;;6261:15;:49;;;;:::i;:::-;6260:88;;;;:::i;:::-;6228:12;:121;;;;:::i;:::-;6197:152;;6178:3;;;;;:::i;:::-;;;;6137:223;;;;6377:12;6370:19;;;;5961:435;;;:::o;5660:212:2:-;5748:4;5764:80;5773:12;:10;:12::i;:::-;5787:7;5833:10;5796:11;:25;5808:12;:10;:12::i;:::-;5796:25;;;;;;;;;;;;;;;:34;5822:7;5796:34;;;;;;;;;;;;;;;;:47;;;;:::i;:::-;5764:8;:80::i;:::-;5861:4;5854:11;;5660:212;;;;:::o;469:89:3:-;524:27;530:12;:10;:12::i;:::-;544:6;524:5;:27::i;:::-;469:89;:::o;3932:837:1:-;3998:20;4038:9;4033:653;4057:8;:15;4053:1;:19;4033:653;;;4150:10;4118:42;;:15;:28;4134:8;4143:1;4134:11;;;;;;;;:::i;:::-;;;;;;;;4118:28;;;;;;;;;;;;;;;;;;;;;:42;;;4093:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;4256:16;;;;;;;;;;;4248:38;;;4312:4;4335:10;4363:8;4372:1;4363:11;;;;;;;;:::i;:::-;;;;;;;;4248:140;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4540:14;;4485:18;:31;4504:8;4513:1;4504:11;;;;;;;;:::i;:::-;;;;;;;;4485:31;;;;;;;;;;;;4467:15;:49;;;;:::i;:::-;4466:88;;;;:::i;:::-;4434:12;:121;;;;:::i;:::-;4403:152;;4570:48;4594:10;4606:8;4615:1;4606:11;;;;;;;;:::i;:::-;;;;;;;;4570:23;:48::i;:::-;4664:11;;;;;;;;;;;4633:15;:28;4649:8;4658:1;4649:11;;;;;;;;:::i;:::-;;;;;;;;4633:28;;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;4074:3;;;;;:::i;:::-;;;;4033:653;;;;4696:31;4702:10;4714:12;4696:5;:31::i;:::-;4742:20;4751:10;4742:20;;;;;;:::i;:::-;;;;;;;;3988:781;3932:837;:::o;6402:355::-;6493:7;6565:11;;;;;;;;;;;6537:39;;:15;:24;6553:7;6537:24;;;;;;;;;;;;;;;;;;;;;:39;;;;6516:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;6633:21;6675:18;:27;6694:7;6675:27;;;;;;;;;;;;6657:15;:45;;;;:::i;:::-;6633:69;;6736:14;;6720:13;:30;;;;:::i;:::-;6713:37;;;6402:355;;;:::o;1360:156::-;1446:16;1485;:24;1502:6;1485:24;;;;;;;;;;;;;;;1478:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1360:156;;;:::o;4775:442::-;4882:10;4854:38;;:15;:24;4870:7;4854:24;;;;;;;;;;;;;;;;;;;;;:38;;;4833:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;4984:14;;4966:15;:32;4958:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;5035:119;5054:10;5129:14;;5098:18;:27;5117:7;5098:27;;;;;;;;;;;;5080:15;:45;;;;:::i;:::-;5079:64;;;;:::i;:::-;5035:5;:119::i;:::-;5195:15;5165:18;:27;5184:7;5165:27;;;;;;;;;;;:45;;;;4775:442;:::o;838:31::-;;;;;;;;;;;;;:::o;1212:142::-;1187:12:8;:10;:12::i;:::-;1176:23;;:7;:5;:7::i;:::-;:23;;;1168:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1314:17:1::1;1295:16;;:36;;;;;;;;;;;;;;;;;;1212:142:::0;:::o;3309:125:2:-;3383:7;3409:9;:18;3419:7;3409:18;;;;;;;;;;;;;;;;3402:25;;3309:125;;;:::o;1596:92:8:-;1187:12;:10;:12::i;:::-;1176:23;;:7;:5;:7::i;:::-;:23;;;1168:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1660:21:::1;1678:1;1660:9;:21::i;:::-;1596:92::o:0;864:361:3:-;940:24;967:32;977:7;986:12;:10;:12::i;:::-;967:9;:32::i;:::-;940:59;;1037:6;1017:16;:26;;1009:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;1118:58;1127:7;1136:12;:10;:12::i;:::-;1169:6;1150:16;:25;1118:8;:58::i;:::-;1196:22;1202:7;1211:6;1196:5;:22::i;:::-;930:295;864:361;;:::o;550:37:1:-;;;;:::o;964:85:8:-;1010:7;1036:6;;;;;;;;;;;1029:13;;964:85;:::o;2268:102:2:-;2324:13;2356:7;2349:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2268:102;:::o;6359:405::-;6452:4;6468:24;6495:11;:25;6507:12;:10;:12::i;:::-;6495:25;;;;;;;;;;;;;;;:34;6521:7;6495:34;;;;;;;;;;;;;;;;6468:61;;6567:15;6547:16;:35;;6539:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;6658:67;6667:12;:10;:12::i;:::-;6681:7;6709:15;6690:16;:34;6658:8;:67::i;:::-;6753:4;6746:11;;;6359:405;;;;:::o;3637:172::-;3723:4;3739:42;3749:12;:10;:12::i;:::-;3763:9;3774:6;3739:9;:42::i;:::-;3798:4;3791:11;;3637:172;;;;:::o;593:49:1:-;;;;:::o;5223:732::-;5286:14;;5268:15;:32;5260:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;5336:25;5364:16;:28;5381:10;5364:28;;;;;;;;;;;;;;;5336:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5402:20;5442:9;5437:433;5461:8;:15;5457:1;:19;5437:433;;;5554:10;5522:42;;:15;:28;5538:8;5547:1;5538:11;;;;;;;;:::i;:::-;;;;;;;;5522:28;;;;;;;;;;;;;;;;;;;;;:42;;;5497:131;;;;;;;;;;;;:::i;:::-;;;;;;;;;5780:14;;5725:18;:31;5744:8;5753:1;5744:11;;;;;;;;:::i;:::-;;;;;;;;5725:31;;;;;;;;;;;;5707:15;:49;;;;:::i;:::-;5706:88;;;;:::i;:::-;5674:12;:121;;;;:::i;:::-;5643:152;;5844:15;5810:18;:31;5829:8;5838:1;5829:11;;;;;;;;:::i;:::-;;;;;;;;5810:31;;;;;;;;;;;:49;;;;5478:3;;;;;:::i;:::-;;;;5437:433;;;;5880:31;5886:10;5898:12;5880:5;:31::i;:::-;5926:22;5937:10;5926:22;;;;;;:::i;:::-;;;;;;;;5250:705;;5223:732::o;2185:911::-;2343:17;;2308:8;:15;2270:16;:28;2287:10;2270:28;;;;;;;;;;;;;;;:35;;;;:53;;;;:::i;:::-;:90;;2249:174;;;;;;;;;;;;:::i;:::-;;;;;;;;;2439:9;2434:622;2458:8;:15;2454:1;:19;2434:622;;;2569:10;2519:60;;2527:16;;;;;;;;;;;2519:33;;;2553:8;2562:1;2553:11;;;;;;;;:::i;:::-;;;;;;;;2519:46;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:60;;;:127;;;;;2635:11;;;;;;;;;;;2603:43;;:15;:28;2619:8;2628:1;2619:11;;;;;;;;:::i;:::-;;;;;;;;2603:28;;;;;;;;;;;;;;;;;;;;;:43;;;2519:127;2494:216;;;;;;;;;;;;:::i;:::-;;;;;;;;;2733:16;;;;;;;;;;;2725:38;;;2781:10;2817:4;2840:8;2849:1;2840:11;;;;;;;;:::i;:::-;;;;;;;;2725:140;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2880:16;:28;2897:10;2880:28;;;;;;;;;;;;;;;2914:8;2923:1;2914:11;;;;;;;;:::i;:::-;;;;;;;;2880:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2975:15;2941:18;:31;2960:8;2969:1;2960:11;;;;;;;;:::i;:::-;;;;;;;;2941:31;;;;;;;;;;;:49;;;;3035:10;3004:15;:28;3020:8;3029:1;3020:11;;;;;;;;:::i;:::-;;;;;;;;3004:28;;;;;;;;;;;;:41;;;;;;;;;;;;;;;;;;2475:3;;;;;:::i;:::-;;;;2434:622;;;;3071:18;3078:10;3071:18;;;;;;:::i;:::-;;;;;;;;2185:911;:::o;3867:149:2:-;3956:7;3982:11;:18;3994:5;3982:18;;;;;;;;;;;;;;;:27;4001:7;3982:27;;;;;;;;;;;;;;;;3975:34;;3867:149;;;;:::o;6763:114:1:-;6820:7;6846:15;:24;6862:7;6846:24;;;;;;;;;;;;;;;;;;;;;6839:31;;6763:114;;;:::o;1837:189:8:-;1187:12;:10;:12::i;:::-;1176:23;;:7;:5;:7::i;:::-;:23;;;1168:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1945:1:::1;1925:22;;:8;:22;;;;1917:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2000:19;2010:8;2000:9;:19::i;:::-;1837:189:::0;:::o;587:96:0:-;640:7;666:10;659:17;;587:96;:::o;9935:370:2:-;10083:1;10066:19;;:5;:19;;;;10058:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10163:1;10144:21;;:7;:21;;;;10136:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10245:6;10215:11;:18;10227:5;10215:18;;;;;;;;;;;;;;;:27;10234:7;10215:27;;;;;;;;;;;;;;;:36;;;;10282:7;10266:32;;10275:5;10266:32;;;10291:6;10266:32;;;;;;:::i;:::-;;;;;;;;9935:370;;;:::o;7238:713::-;7391:1;7373:20;;:6;:20;;;;7365:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;7474:1;7453:23;;:9;:23;;;;7445:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;7527:47;7548:6;7556:9;7567:6;7527:20;:47::i;:::-;7585:21;7609:9;:17;7619:6;7609:17;;;;;;;;;;;;;;;;7585:41;;7661:6;7644:13;:23;;7636:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;7780:6;7764:13;:22;7744:9;:17;7754:6;7744:17;;;;;;;;;;;;;;;:42;;;;7830:6;7806:9;:20;7816:9;7806:20;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;7869:9;7852:35;;7861:6;7852:35;;;7880:6;7852:35;;;;;;:::i;:::-;;;;;;;;7898:46;7918:6;7926:9;7937:6;7898:19;:46::i;:::-;7355:596;7238:713;;;:::o;1859:320:1:-;1949:9;1944:229;1968:16;:24;1985:6;1968:24;;;;;;;;;;;;;;;:31;;;;1964:1;:35;1944:229;;;2055:7;2024:16;:24;2041:6;2024:24;;;;;;;;;;;;;;;2049:1;2024:27;;;;;;;;:::i;:::-;;;;;;;;;;:38;2020:143;;;2131:17;2138:6;2146:1;2131:6;:17::i;:::-;2020:143;2001:3;;;;;:::i;:::-;;;;1944:229;;;;1859:320;;:::o;8227:389:2:-;8329:1;8310:21;;:7;:21;;;;8302:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;8378:49;8407:1;8411:7;8420:6;8378:20;:49::i;:::-;8454:6;8438:12;;:22;;;;;;;:::i;:::-;;;;;;;;8492:6;8470:9;:18;8480:7;8470:18;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;8534:7;8513:37;;8530:1;8513:37;;;8543:6;8513:37;;;;;;:::i;:::-;;;;;;;;8561:48;8589:1;8593:7;8602:6;8561:19;:48::i;:::-;8227:389;;:::o;8936:576::-;9038:1;9019:21;;:7;:21;;;;9011:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;9089:49;9110:7;9127:1;9131:6;9089:20;:49::i;:::-;9149:22;9174:9;:18;9184:7;9174:18;;;;;;;;;;;;;;;;9149:43;;9228:6;9210:14;:24;;9202:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;9345:6;9328:14;:23;9307:9;:18;9317:7;9307:18;;;;;;;;;;;;;;;:44;;;;9387:6;9371:12;;:22;;;;;;;:::i;:::-;;;;;;;;9435:1;9409:37;;9418:7;9409:37;;;9439:6;9409:37;;;;;;:::i;:::-;;;;;;;;9457:48;9477:7;9494:1;9498:6;9457:19;:48::i;:::-;9001:511;8936:576;;:::o;2032:169:8:-;2087:16;2106:6;;;;;;;;;;;2087:25;;2131:8;2122:6;;:17;;;;;;;;;;;;;;;;;;2185:8;2154:40;;2175:8;2154:40;;;;;;;;;;;;2077:124;2032:169;:::o;10889:121:2:-;;;;:::o;11598:120::-;;;;:::o;1522:331:1:-;1601:16;:24;1618:6;1601:24;;;;;;;;;;;;;;;:31;;;;1592:5;:40;1588:53;;1634:7;;1588:53;1656:9;1668:5;1656:17;;1651:156;1713:1;1679:16;:24;1696:6;1679:24;;;;;;;;;;;;;;;:31;;;;:35;;;;:::i;:::-;1675:1;:39;1651:156;;;1765:16;:24;1782:6;1765:24;;;;;;;;;;;;;;;1794:1;1790;:5;;;;:::i;:::-;1765:31;;;;;;;;:::i;:::-;;;;;;;;;;1735:16;:24;1752:6;1735:24;;;;;;;;;;;;;;;1760:1;1735:27;;;;;;;;:::i;:::-;;;;;;;;;:61;;;;1716:3;;;;;:::i;:::-;;;;1651:156;;;;1816:16;:24;1833:6;1816:24;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1522:331;;;:::o;7:99:10:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:307::-;355:1;365:113;379:6;376:1;373:13;365:113;;;464:1;459:3;455:11;449:18;445:1;440:3;436:11;429:39;401:2;398:1;394:10;389:15;;365:113;;;496:6;493:1;490:13;487:101;;;576:1;567:6;562:3;558:16;551:27;487:101;336:258;287:307;;;:::o;600:102::-;641:6;692:2;688:7;683:2;676:5;672:14;668:28;658:38;;600:102;;;:::o;708:364::-;796:3;824:39;857:5;824:39;:::i;:::-;879:71;943:6;938:3;879:71;:::i;:::-;872:78;;959:52;1004:6;999:3;992:4;985:5;981:16;959:52;:::i;:::-;1036:29;1058:6;1036:29;:::i;:::-;1031:3;1027:39;1020:46;;800:272;708:364;;;;:::o;1078:313::-;1191:4;1229:2;1218:9;1214:18;1206:26;;1278:9;1272:4;1268:20;1264:1;1253:9;1249:17;1242:47;1306:78;1379:4;1370:6;1306:78;:::i;:::-;1298:86;;1078:313;;;;:::o;1397:75::-;1430:6;1463:2;1457:9;1447:19;;1397:75;:::o;1478:117::-;1587:1;1584;1577:12;1601:117;1710:1;1707;1700:12;1724:126;1761:7;1801:42;1794:5;1790:54;1779:65;;1724:126;;;:::o;1856:96::-;1893:7;1922:24;1940:5;1922:24;:::i;:::-;1911:35;;1856:96;;;:::o;1958:122::-;2031:24;2049:5;2031:24;:::i;:::-;2024:5;2021:35;2011:63;;2070:1;2067;2060:12;2011:63;1958:122;:::o;2086:139::-;2132:5;2170:6;2157:20;2148:29;;2186:33;2213:5;2186:33;:::i;:::-;2086:139;;;;:::o;2231:77::-;2268:7;2297:5;2286:16;;2231:77;;;:::o;2314:122::-;2387:24;2405:5;2387:24;:::i;:::-;2380:5;2377:35;2367:63;;2426:1;2423;2416:12;2367:63;2314:122;:::o;2442:139::-;2488:5;2526:6;2513:20;2504:29;;2542:33;2569:5;2542:33;:::i;:::-;2442:139;;;;:::o;2587:474::-;2655:6;2663;2712:2;2700:9;2691:7;2687:23;2683:32;2680:119;;;2718:79;;:::i;:::-;2680:119;2838:1;2863:53;2908:7;2899:6;2888:9;2884:22;2863:53;:::i;:::-;2853:63;;2809:117;2965:2;2991:53;3036:7;3027:6;3016:9;3012:22;2991:53;:::i;:::-;2981:63;;2936:118;2587:474;;;;;:::o;3067:90::-;3101:7;3144:5;3137:13;3130:21;3119:32;;3067:90;;;:::o;3163:109::-;3244:21;3259:5;3244:21;:::i;:::-;3239:3;3232:34;3163:109;;:::o;3278:210::-;3365:4;3403:2;3392:9;3388:18;3380:26;;3416:65;3478:1;3467:9;3463:17;3454:6;3416:65;:::i;:::-;3278:210;;;;:::o;3494:118::-;3581:24;3599:5;3581:24;:::i;:::-;3576:3;3569:37;3494:118;;:::o;3618:222::-;3711:4;3749:2;3738:9;3734:18;3726:26;;3762:71;3830:1;3819:9;3815:17;3806:6;3762:71;:::i;:::-;3618:222;;;;:::o;3846:619::-;3923:6;3931;3939;3988:2;3976:9;3967:7;3963:23;3959:32;3956:119;;;3994:79;;:::i;:::-;3956:119;4114:1;4139:53;4184:7;4175:6;4164:9;4160:22;4139:53;:::i;:::-;4129:63;;4085:117;4241:2;4267:53;4312:7;4303:6;4292:9;4288:22;4267:53;:::i;:::-;4257:63;;4212:118;4369:2;4395:53;4440:7;4431:6;4420:9;4416:22;4395:53;:::i;:::-;4385:63;;4340:118;3846:619;;;;;:::o;4471:86::-;4506:7;4546:4;4539:5;4535:16;4524:27;;4471:86;;;:::o;4563:112::-;4646:22;4662:5;4646:22;:::i;:::-;4641:3;4634:35;4563:112;;:::o;4681:214::-;4770:4;4808:2;4797:9;4793:18;4785:26;;4821:67;4885:1;4874:9;4870:17;4861:6;4821:67;:::i;:::-;4681:214;;;;:::o;4901:329::-;4960:6;5009:2;4997:9;4988:7;4984:23;4980:32;4977:119;;;5015:79;;:::i;:::-;4977:119;5135:1;5160:53;5205:7;5196:6;5185:9;5181:22;5160:53;:::i;:::-;5150:63;;5106:117;4901:329;;;;:::o;5236:::-;5295:6;5344:2;5332:9;5323:7;5319:23;5315:32;5312:119;;;5350:79;;:::i;:::-;5312:119;5470:1;5495:53;5540:7;5531:6;5520:9;5516:22;5495:53;:::i;:::-;5485:63;;5441:117;5236:329;;;;:::o;5571:117::-;5680:1;5677;5670:12;5694:180;5742:77;5739:1;5732:88;5839:4;5836:1;5829:15;5863:4;5860:1;5853:15;5880:281;5963:27;5985:4;5963:27;:::i;:::-;5955:6;5951:40;6093:6;6081:10;6078:22;6057:18;6045:10;6042:34;6039:62;6036:88;;;6104:18;;:::i;:::-;6036:88;6144:10;6140:2;6133:22;5923:238;5880:281;;:::o;6167:129::-;6201:6;6228:20;;:::i;:::-;6218:30;;6257:33;6285:4;6277:6;6257:33;:::i;:::-;6167:129;;;:::o;6302:311::-;6379:4;6469:18;6461:6;6458:30;6455:56;;;6491:18;;:::i;:::-;6455:56;6541:4;6533:6;6529:17;6521:25;;6601:4;6595;6591:15;6583:23;;6302:311;;;:::o;6619:117::-;6728:1;6725;6718:12;6759:710;6855:5;6880:81;6896:64;6953:6;6896:64;:::i;:::-;6880:81;:::i;:::-;6871:90;;6981:5;7010:6;7003:5;6996:21;7044:4;7037:5;7033:16;7026:23;;7097:4;7089:6;7085:17;7077:6;7073:30;7126:3;7118:6;7115:15;7112:122;;;7145:79;;:::i;:::-;7112:122;7260:6;7243:220;7277:6;7272:3;7269:15;7243:220;;;7352:3;7381:37;7414:3;7402:10;7381:37;:::i;:::-;7376:3;7369:50;7448:4;7443:3;7439:14;7432:21;;7319:144;7303:4;7298:3;7294:14;7287:21;;7243:220;;;7247:21;6861:608;;6759:710;;;;;:::o;7492:370::-;7563:5;7612:3;7605:4;7597:6;7593:17;7589:27;7579:122;;7620:79;;:::i;:::-;7579:122;7737:6;7724:20;7762:94;7852:3;7844:6;7837:4;7829:6;7825:17;7762:94;:::i;:::-;7753:103;;7569:293;7492:370;;;;:::o;7868:539::-;7952:6;8001:2;7989:9;7980:7;7976:23;7972:32;7969:119;;;8007:79;;:::i;:::-;7969:119;8155:1;8144:9;8140:17;8127:31;8185:18;8177:6;8174:30;8171:117;;;8207:79;;:::i;:::-;8171:117;8312:78;8382:7;8373:6;8362:9;8358:22;8312:78;:::i;:::-;8302:88;;8098:302;7868:539;;;;:::o;8413:114::-;8480:6;8514:5;8508:12;8498:22;;8413:114;;;:::o;8533:184::-;8632:11;8666:6;8661:3;8654:19;8706:4;8701:3;8697:14;8682:29;;8533:184;;;;:::o;8723:132::-;8790:4;8813:3;8805:11;;8843:4;8838:3;8834:14;8826:22;;8723:132;;;:::o;8861:108::-;8938:24;8956:5;8938:24;:::i;:::-;8933:3;8926:37;8861:108;;:::o;8975:179::-;9044:10;9065:46;9107:3;9099:6;9065:46;:::i;:::-;9143:4;9138:3;9134:14;9120:28;;8975:179;;;;:::o;9160:113::-;9230:4;9262;9257:3;9253:14;9245:22;;9160:113;;;:::o;9309:732::-;9428:3;9457:54;9505:5;9457:54;:::i;:::-;9527:86;9606:6;9601:3;9527:86;:::i;:::-;9520:93;;9637:56;9687:5;9637:56;:::i;:::-;9716:7;9747:1;9732:284;9757:6;9754:1;9751:13;9732:284;;;9833:6;9827:13;9860:63;9919:3;9904:13;9860:63;:::i;:::-;9853:70;;9946:60;9999:6;9946:60;:::i;:::-;9936:70;;9792:224;9779:1;9776;9772:9;9767:14;;9732:284;;;9736:14;10032:3;10025:10;;9433:608;;;9309:732;;;;:::o;10047:373::-;10190:4;10228:2;10217:9;10213:18;10205:26;;10277:9;10271:4;10267:20;10263:1;10252:9;10248:17;10241:47;10305:108;10408:4;10399:6;10305:108;:::i;:::-;10297:116;;10047:373;;;;:::o;10426:118::-;10513:24;10531:5;10513:24;:::i;:::-;10508:3;10501:37;10426:118;;:::o;10550:222::-;10643:4;10681:2;10670:9;10666:18;10658:26;;10694:71;10762:1;10751:9;10747:17;10738:6;10694:71;:::i;:::-;10550:222;;;;:::o;10778:474::-;10846:6;10854;10903:2;10891:9;10882:7;10878:23;10874:32;10871:119;;;10909:79;;:::i;:::-;10871:119;11029:1;11054:53;11099:7;11090:6;11079:9;11075:22;11054:53;:::i;:::-;11044:63;;11000:117;11156:2;11182:53;11227:7;11218:6;11207:9;11203:22;11182:53;:::i;:::-;11172:63;;11127:118;10778:474;;;;;:::o;11258:180::-;11306:77;11303:1;11296:88;11403:4;11400:1;11393:15;11427:4;11424:1;11417:15;11444:320;11488:6;11525:1;11519:4;11515:12;11505:22;;11572:1;11566:4;11562:12;11593:18;11583:81;;11649:4;11641:6;11637:17;11627:27;;11583:81;11711:2;11703:6;11700:14;11680:18;11677:38;11674:84;;;11730:18;;:::i;:::-;11674:84;11495:269;11444:320;;;:::o;11770:227::-;11910:34;11906:1;11898:6;11894:14;11887:58;11979:10;11974:2;11966:6;11962:15;11955:35;11770:227;:::o;12003:366::-;12145:3;12166:67;12230:2;12225:3;12166:67;:::i;:::-;12159:74;;12242:93;12331:3;12242:93;:::i;:::-;12360:2;12355:3;12351:12;12344:19;;12003:366;;;:::o;12375:419::-;12541:4;12579:2;12568:9;12564:18;12556:26;;12628:9;12622:4;12618:20;12614:1;12603:9;12599:17;12592:47;12656:131;12782:4;12656:131;:::i;:::-;12648:139;;12375:419;;;:::o;12800:223::-;12940:34;12936:1;12928:6;12924:14;12917:58;13009:6;13004:2;12996:6;12992:15;12985:31;12800:223;:::o;13029:366::-;13171:3;13192:67;13256:2;13251:3;13192:67;:::i;:::-;13185:74;;13268:93;13357:3;13268:93;:::i;:::-;13386:2;13381:3;13377:12;13370:19;;13029:366;;;:::o;13401:419::-;13567:4;13605:2;13594:9;13590:18;13582:26;;13654:9;13648:4;13644:20;13640:1;13629:9;13625:17;13618:47;13682:131;13808:4;13682:131;:::i;:::-;13674:139;;13401:419;;;:::o;13826:180::-;13874:77;13871:1;13864:88;13971:4;13968:1;13961:15;13995:4;13992:1;13985:15;14012:191;14052:4;14072:20;14090:1;14072:20;:::i;:::-;14067:25;;14106:20;14124:1;14106:20;:::i;:::-;14101:25;;14145:1;14142;14139:8;14136:34;;;14150:18;;:::i;:::-;14136:34;14195:1;14192;14188:9;14180:17;;14012:191;;;;:::o;14209:180::-;14257:77;14254:1;14247:88;14354:4;14351:1;14344:15;14378:4;14375:1;14368:15;14395:442;14544:4;14582:2;14571:9;14567:18;14559:26;;14595:71;14663:1;14652:9;14648:17;14639:6;14595:71;:::i;:::-;14676:72;14744:2;14733:9;14729:18;14720:6;14676:72;:::i;:::-;14758;14826:2;14815:9;14811:18;14802:6;14758:72;:::i;:::-;14395:442;;;;;;:::o;14843:348::-;14883:7;14906:20;14924:1;14906:20;:::i;:::-;14901:25;;14940:20;14958:1;14940:20;:::i;:::-;14935:25;;15128:1;15060:66;15056:74;15053:1;15050:81;15045:1;15038:9;15031:17;15027:105;15024:131;;;15135:18;;:::i;:::-;15024:131;15183:1;15180;15176:9;15165:20;;14843:348;;;;:::o;15197:305::-;15237:3;15256:20;15274:1;15256:20;:::i;:::-;15251:25;;15290:20;15308:1;15290:20;:::i;:::-;15285:25;;15444:1;15376:66;15372:74;15369:1;15366:81;15363:107;;;15450:18;;:::i;:::-;15363:107;15494:1;15491;15487:9;15480:16;;15197:305;;;;:::o;15508:171::-;15547:3;15570:24;15588:5;15570:24;:::i;:::-;15561:33;;15616:4;15609:5;15606:15;15603:41;;;15624:18;;:::i;:::-;15603:41;15671:1;15664:5;15660:13;15653:20;;15508:171;;;:::o;15685:233::-;15724:3;15747:24;15765:5;15747:24;:::i;:::-;15738:33;;15793:66;15786:5;15783:77;15780:103;;;15863:18;;:::i;:::-;15780:103;15910:1;15903:5;15899:13;15892:20;;15685:233;;;:::o;15924:226::-;16064:34;16060:1;16052:6;16048:14;16041:58;16133:9;16128:2;16120:6;16116:15;16109:34;15924:226;:::o;16156:366::-;16298:3;16319:67;16383:2;16378:3;16319:67;:::i;:::-;16312:74;;16395:93;16484:3;16395:93;:::i;:::-;16513:2;16508:3;16504:12;16497:19;;16156:366;;;:::o;16528:419::-;16694:4;16732:2;16721:9;16717:18;16709:26;;16781:9;16775:4;16771:20;16767:1;16756:9;16752:17;16745:47;16809:131;16935:4;16809:131;:::i;:::-;16801:139;;16528:419;;;:::o;16953:170::-;17093:22;17089:1;17081:6;17077:14;17070:46;16953:170;:::o;17129:366::-;17271:3;17292:67;17356:2;17351:3;17292:67;:::i;:::-;17285:74;;17368:93;17457:3;17368:93;:::i;:::-;17486:2;17481:3;17477:12;17470:19;;17129:366;;;:::o;17501:419::-;17667:4;17705:2;17694:9;17690:18;17682:26;;17754:9;17748:4;17744:20;17740:1;17729:9;17725:17;17718:47;17782:131;17908:4;17782:131;:::i;:::-;17774:139;;17501:419;;;:::o;17926:180::-;18066:32;18062:1;18054:6;18050:14;18043:56;17926:180;:::o;18112:366::-;18254:3;18275:67;18339:2;18334:3;18275:67;:::i;:::-;18268:74;;18351:93;18440:3;18351:93;:::i;:::-;18469:2;18464:3;18460:12;18453:19;;18112:366;;;:::o;18484:419::-;18650:4;18688:2;18677:9;18673:18;18665:26;;18737:9;18731:4;18727:20;18723:1;18712:9;18708:17;18701:47;18765:131;18891:4;18765:131;:::i;:::-;18757:139;;18484:419;;;:::o;18909:171::-;19049:23;19045:1;19037:6;19033:14;19026:47;18909:171;:::o;19086:366::-;19228:3;19249:67;19313:2;19308:3;19249:67;:::i;:::-;19242:74;;19325:93;19414:3;19325:93;:::i;:::-;19443:2;19438:3;19434:12;19427:19;;19086:366;;;:::o;19458:419::-;19624:4;19662:2;19651:9;19647:18;19639:26;;19711:9;19705:4;19701:20;19697:1;19686:9;19682:17;19675:47;19739:131;19865:4;19739:131;:::i;:::-;19731:139;;19458:419;;;:::o;19883:182::-;20023:34;20019:1;20011:6;20007:14;20000:58;19883:182;:::o;20071:366::-;20213:3;20234:67;20298:2;20293:3;20234:67;:::i;:::-;20227:74;;20310:93;20399:3;20310:93;:::i;:::-;20428:2;20423:3;20419:12;20412:19;;20071:366;;;:::o;20443:419::-;20609:4;20647:2;20636:9;20632:18;20624:26;;20696:9;20690:4;20686:20;20682:1;20671:9;20667:17;20660:47;20724:131;20850:4;20724:131;:::i;:::-;20716:139;;20443:419;;;:::o;20868:223::-;21008:34;21004:1;20996:6;20992:14;20985:58;21077:6;21072:2;21064:6;21060:15;21053:31;20868:223;:::o;21097:366::-;21239:3;21260:67;21324:2;21319:3;21260:67;:::i;:::-;21253:74;;21336:93;21425:3;21336:93;:::i;:::-;21454:2;21449:3;21445:12;21438:19;;21097:366;;;:::o;21469:419::-;21635:4;21673:2;21662:9;21658:18;21650:26;;21722:9;21716:4;21712:20;21708:1;21697:9;21693:17;21686:47;21750:131;21876:4;21750:131;:::i;:::-;21742:139;;21469:419;;;:::o;21894:224::-;22034:34;22030:1;22022:6;22018:14;22011:58;22103:7;22098:2;22090:6;22086:15;22079:32;21894:224;:::o;22124:366::-;22266:3;22287:67;22351:2;22346:3;22287:67;:::i;:::-;22280:74;;22363:93;22452:3;22363:93;:::i;:::-;22481:2;22476:3;22472:12;22465:19;;22124:366;;;:::o;22496:419::-;22662:4;22700:2;22689:9;22685:18;22677:26;;22749:9;22743:4;22739:20;22735:1;22724:9;22720:17;22713:47;22777:131;22903:4;22777:131;:::i;:::-;22769:139;;22496:419;;;:::o;22921:224::-;23061:34;23057:1;23049:6;23045:14;23038:58;23130:7;23125:2;23117:6;23113:15;23106:32;22921:224;:::o;23151:366::-;23293:3;23314:67;23378:2;23373:3;23314:67;:::i;:::-;23307:74;;23390:93;23479:3;23390:93;:::i;:::-;23508:2;23503:3;23499:12;23492:19;;23151:366;;;:::o;23523:419::-;23689:4;23727:2;23716:9;23712:18;23704:26;;23776:9;23770:4;23766:20;23762:1;23751:9;23747:17;23740:47;23804:131;23930:4;23804:131;:::i;:::-;23796:139;;23523:419;;;:::o;23948:143::-;24005:5;24036:6;24030:13;24021:22;;24052:33;24079:5;24052:33;:::i;:::-;23948:143;;;;:::o;24097:351::-;24167:6;24216:2;24204:9;24195:7;24191:23;24187:32;24184:119;;;24222:79;;:::i;:::-;24184:119;24342:1;24367:64;24423:7;24414:6;24403:9;24399:22;24367:64;:::i;:::-;24357:74;;24313:128;24097:351;;;;:::o;24454:180::-;24594:32;24590:1;24582:6;24578:14;24571:56;24454:180;:::o;24640:366::-;24782:3;24803:67;24867:2;24862:3;24803:67;:::i;:::-;24796:74;;24879:93;24968:3;24879:93;:::i;:::-;24997:2;24992:3;24988:12;24981:19;;24640:366;;;:::o;25012:419::-;25178:4;25216:2;25205:9;25201:18;25193:26;;25265:9;25259:4;25255:20;25251:1;25240:9;25236:17;25229:47;25293:131;25419:4;25293:131;:::i;:::-;25285:139;;25012:419;;;:::o;25437:225::-;25577:34;25573:1;25565:6;25561:14;25554:58;25646:8;25641:2;25633:6;25629:15;25622:33;25437:225;:::o;25668:366::-;25810:3;25831:67;25895:2;25890:3;25831:67;:::i;:::-;25824:74;;25907:93;25996:3;25907:93;:::i;:::-;26025:2;26020:3;26016:12;26009:19;;25668:366;;;:::o;26040:419::-;26206:4;26244:2;26233:9;26229:18;26221:26;;26293:9;26287:4;26283:20;26279:1;26268:9;26264:17;26257:47;26321:131;26447:4;26321:131;:::i;:::-;26313:139;;26040:419;;;:::o;26465:223::-;26605:34;26601:1;26593:6;26589:14;26582:58;26674:6;26669:2;26661:6;26657:15;26650:31;26465:223;:::o;26694:366::-;26836:3;26857:67;26921:2;26916:3;26857:67;:::i;:::-;26850:74;;26933:93;27022:3;26933:93;:::i;:::-;27051:2;27046:3;27042:12;27035:19;;26694:366;;;:::o;27066:419::-;27232:4;27270:2;27259:9;27255:18;27247:26;;27319:9;27313:4;27309:20;27305:1;27294:9;27290:17;27283:47;27347:131;27473:4;27347:131;:::i;:::-;27339:139;;27066:419;;;:::o;27491:221::-;27631:34;27627:1;27619:6;27615:14;27608:58;27700:4;27695:2;27687:6;27683:15;27676:29;27491:221;:::o;27718:366::-;27860:3;27881:67;27945:2;27940:3;27881:67;:::i;:::-;27874:74;;27957:93;28046:3;27957:93;:::i;:::-;28075:2;28070:3;28066:12;28059:19;;27718:366;;;:::o;28090:419::-;28256:4;28294:2;28283:9;28279:18;28271:26;;28343:9;28337:4;28333:20;28329:1;28318:9;28314:17;28307:47;28371:131;28497:4;28371:131;:::i;:::-;28363:139;;28090:419;;;:::o;28515:224::-;28655:34;28651:1;28643:6;28639:14;28632:58;28724:7;28719:2;28711:6;28707:15;28700:32;28515:224;:::o;28745:366::-;28887:3;28908:67;28972:2;28967:3;28908:67;:::i;:::-;28901:74;;28984:93;29073:3;28984:93;:::i;:::-;29102:2;29097:3;29093:12;29086:19;;28745:366;;;:::o;29117:419::-;29283:4;29321:2;29310:9;29306:18;29298:26;;29370:9;29364:4;29360:20;29356:1;29345:9;29341:17;29334:47;29398:131;29524:4;29398:131;:::i;:::-;29390:139;;29117:419;;;:::o;29542:222::-;29682:34;29678:1;29670:6;29666:14;29659:58;29751:5;29746:2;29738:6;29734:15;29727:30;29542:222;:::o;29770:366::-;29912:3;29933:67;29997:2;29992:3;29933:67;:::i;:::-;29926:74;;30009:93;30098:3;30009:93;:::i;:::-;30127:2;30122:3;30118:12;30111:19;;29770:366;;;:::o;30142:419::-;30308:4;30346:2;30335:9;30331:18;30323:26;;30395:9;30389:4;30385:20;30381:1;30370:9;30366:17;30359:47;30423:131;30549:4;30423:131;:::i;:::-;30415:139;;30142:419;;;:::o;30567:225::-;30707:34;30703:1;30695:6;30691:14;30684:58;30776:8;30771:2;30763:6;30759:15;30752:33;30567:225;:::o;30798:366::-;30940:3;30961:67;31025:2;31020:3;30961:67;:::i;:::-;30954:74;;31037:93;31126:3;31037:93;:::i;:::-;31155:2;31150:3;31146:12;31139:19;;30798:366;;;:::o;31170:419::-;31336:4;31374:2;31363:9;31359:18;31351:26;;31423:9;31417:4;31413:20;31409:1;31398:9;31394:17;31387:47;31451:131;31577:4;31451:131;:::i;:::-;31443:139;;31170:419;;;:::o;31595:181::-;31735:33;31731:1;31723:6;31719:14;31712:57;31595:181;:::o;31782:366::-;31924:3;31945:67;32009:2;32004:3;31945:67;:::i;:::-;31938:74;;32021:93;32110:3;32021:93;:::i;:::-;32139:2;32134:3;32130:12;32123:19;;31782:366;;;:::o;32154:419::-;32320:4;32358:2;32347:9;32343:18;32335:26;;32407:9;32401:4;32397:20;32393:1;32382:9;32378:17;32371:47;32435:131;32561:4;32435:131;:::i;:::-;32427:139;;32154:419;;;:::o;32579:220::-;32719:34;32715:1;32707:6;32703:14;32696:58;32788:3;32783:2;32775:6;32771:15;32764:28;32579:220;:::o;32805:366::-;32947:3;32968:67;33032:2;33027:3;32968:67;:::i;:::-;32961:74;;33044:93;33133:3;33044:93;:::i;:::-;33162:2;33157:3;33153:12;33146:19;;32805:366;;;:::o;33177:419::-;33343:4;33381:2;33370:9;33366:18;33358:26;;33430:9;33424:4;33420:20;33416:1;33405:9;33401:17;33394:47;33458:131;33584:4;33458:131;:::i;:::-;33450:139;;33177:419;;;:::o;33602:221::-;33742:34;33738:1;33730:6;33726:14;33719:58;33811:4;33806:2;33798:6;33794:15;33787:29;33602:221;:::o;33829:366::-;33971:3;33992:67;34056:2;34051:3;33992:67;:::i;:::-;33985:74;;34068:93;34157:3;34068:93;:::i;:::-;34186:2;34181:3;34177:12;34170:19;;33829:366;;;:::o;34201:419::-;34367:4;34405:2;34394:9;34390:18;34382:26;;34454:9;34448:4;34444:20;34440:1;34429:9;34425:17;34418:47;34482:131;34608:4;34482:131;:::i;:::-;34474:139;;34201:419;;;:::o;34626:180::-;34674:77;34671:1;34664:88;34771:4;34768:1;34761:15;34795:4;34792:1;34785:15

Swarm Source

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