ETH Price: $3,309.84 (-3.62%)
Gas: 19 Gwei

Token

Elephants for Africa (EFA)
 

Overview

Max Total Supply

219 EFA

Holders

72

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
5 EFA
0x469EceB3d8a52277ECc1fCFF34A62e757291468f
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:
Elephants

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-10-10
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/*
    Fully commented standard ERC721 Distilled from OpenZeppelin Docs
    Base for Building ERC721 by Martin McConnell
    All the utility without the fluff.
*/


interface IERC165 {
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

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`.
    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;
}

interface IERC721Metadata is IERC721 {
    //@dev Returns the token collection name.
    function name() external view returns (string memory);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

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

abstract contract Functional {
    function toString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }
    
    bool private _reentryKey = false;
    modifier reentryLock {
        require(!_reentryKey, "attempt to reenter a locked function");
        _reentryKey = true;
        _;
        _reentryKey = false;
    }
}

contract ERC721 {
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
    function balanceOf(address owner) external view returns (uint256 balance){}
    function ownerOf(uint256 tokenId) external view returns (address owner){}
    function safeTransferFrom(address from,address to,uint256 tokenId) external{}
    function transferFrom(address from, address to, uint256 tokenId) external{}
    function approve(address to, uint256 tokenId) external{}
    function getApproved(uint256 tokenId) external view returns (address operator){}
    function setApprovalForAll(address operator, bool _approved) external{}
    function isApprovedForAll(address owner, address operator) external view returns (bool){}
    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external{}
}

// ******************************************************************************************************************************
// **************************************************  Start of Main Contract ***************************************************
// ******************************************************************************************************************************

contract Elephants is IERC721, Ownable, Functional {

    using Address for address;
    
    // Token name
    string private _name;

    // Token symbol
    string private _symbol;
    
    // URI Root Location for Json Files
    string private _baseURI;

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

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

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

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;
    
    // Specific Functionality
    bool public mintActive;
    bool private _hideTokens;  //for URI redirects
    uint256 public price;
    uint256 public holderPrice;
    uint256 public totalTokens;
    uint256 public numberMinted;

    address private _founder;
    address private _dev;
    
    //contract connectors
    ERC721 CDB;
    ERC721 Toadz;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor() {
        _name = "Elephants for Africa";
        _symbol = "EFA";
        
        // Set URI to the propper address from the get-go, no secret mission going on here ;)
        _baseURI = "Shhh, it's a secret";
        _hideTokens = true;
        
        totalTokens = 3000;
        price = 100 * (10 ** 15); // Replace leading value with price in finney
        holderPrice = 69 * (10 ** 15);
        
        _founder = 0x1ED2456aE0fb7ce7ae1E0E0b962462fc0060D26A;
        _dev = 0x2496286BDB820d40C402802F828ae265b244188A;
        
        CDB = ERC721(0x42069ABFE407C60cf4ae4112bEDEaD391dBa1cdB);
        Toadz = ERC721(0x1CB1A5e65610AEFF2551A50f76a87a7d3fB649C6);
    }

    //@dev See {IERC165-supportsInterface}. Interfaces Supported by this Standard
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return  interfaceId == type(IERC721).interfaceId ||
                interfaceId == type(IERC721Metadata).interfaceId ||
                interfaceId == type(IERC165).interfaceId ||
                interfaceId == Elephants.onERC721Received.selector;
    }
    
    // Standard Withdraw function for the owner to pull the contract
    function withdraw() external onlyOwner {
        //send to addresses and percentages
        uint256 devcash = (address(this).balance * 30) / 100;
        uint256 foundercash = (address(this).balance * 70) / 100;
        
        (bool success, ) = _founder.call{value: foundercash}("");
        require(success, "Transaction Unsuccessful");
        (success, ) = _dev.call{value: devcash}("");
        require(success, "Transaction Unsuccessful");
    }

    
    function ownerMint(address _to, uint256 qty) external onlyOwner {
        require((numberMinted + qty) > numberMinted, "Math overflow error");
        require((numberMinted + qty) < totalTokens, "Cannot fill order");
        
        uint256 mintSeedValue = numberMinted; //Store the starting value of the mint batch
        
        for(uint256 i = 0; i < qty; i++) {
            _safeMint(_to, mintSeedValue + i);
            numberMinted ++;  //reservedTokens can be reset, numberMinted can not
        }
    }
    
    function mint(uint256 qty) external payable reentryLock {
        require(msg.value >= qty * price, "Mint: Insufficient Funds");
        require((qty + numberMinted) < totalTokens, "Mint: Not enough avaialability");
        require(mintActive, "Currently Closed for Business");
        
        uint256 mintSeedValue = numberMinted; //Store the starting value of the mint batch
        
        //Handle ETH transactions
        uint256 cashIn = msg.value;
        uint256 payment = (qty * price);
        uint256 cashChange = cashIn - payment;
        
        //send tokens
        for(uint256 i = 0; i < qty; i++) {
            _safeMint(_msgSender(), mintSeedValue + i);
            numberMinted ++;
        }
        
        if (cashChange > 0){
            (bool success, ) = msg.sender.call{value: cashChange}("");
            require(success, "Mint: unable to send change to user");
        }
    }
    
    function mintCDB(uint256 qty) external payable reentryLock {
        uint256 tokensHeld = CDB.balanceOf(_msgSender());
        require(tokensHeld > 0, "Must hold CryptoDickButts to use this mint");
        require(msg.value >= qty * holderPrice, "Mint: Insufficient Funds");
        require((qty + numberMinted) < totalTokens, "Mint: Not enough avaialability");
        require(mintActive, "Currently Closed for Business");
        uint256 mintSeedValue = numberMinted; //Store the starting value of the mint batch
        
        //Handle ETH transactions
        uint256 cashIn = msg.value;
        uint256 payment = (qty * holderPrice);
        uint256 cashChange = cashIn - payment;
        
        //send tokens
        for(uint256 i = 0; i < qty; i++) {
            _safeMint(_msgSender(), mintSeedValue + i);
            numberMinted ++;
        }
        
        if (cashChange > 0){
            (bool success, ) = msg.sender.call{value: cashChange}("");
            require(success, "Mint: unable to send change to user");
        }
    }

    function mintToadz(uint256 qty) external payable reentryLock {
        uint256 tokensHeld = Toadz.balanceOf(_msgSender());
        require(tokensHeld > 0, "Must hold CrypToadz to use this mint");
        require(msg.value >= qty * holderPrice, "Mint: Insufficient Funds");
        require((qty + numberMinted) < totalTokens, "Mint: Not enough avaialability");
        require(mintActive, "Currently Closed for Business");

        uint256 mintSeedValue = numberMinted; //Store the starting value of the mint batch
        
        //Handle ETH transactions
        uint256 cashIn = msg.value;
        uint256 payment = (qty * holderPrice);
        uint256 cashChange = cashIn - payment;
        
        //send tokens
        for(uint256 i = 0; i < qty; i++) {
            _safeMint(_msgSender(), mintSeedValue + i);
            numberMinted ++;
        }
        
        if (cashChange > 0){
            (bool success, ) = msg.sender.call{value: cashChange}("");
            require(success, "Mint: unable to send change to user");
        }
    }
    
    // allows holders to burn their own tokens if desired
    function burn(uint256 tokenID) external {
        require(_msgSender() == ownerOf(tokenID));
        _burn(tokenID);
    }
    
    //////////////////////////////////////////////////////////////
    //////////////////// Setters and Getters /////////////////////
    //////////////////////////////////////////////////////////////

    function setBaseURI(string memory newURI) public onlyOwner {
        _baseURI = newURI;
    }
    
    function activateMint() public onlyOwner {
        mintActive = true;
    }
    
    function deactivateMint() public onlyOwner {
        mintActive = false;
    }
    
    function setPrice(uint256 newPrice) public onlyOwner {
        price = newPrice;
    }

    function setHolderPrice(uint256 newPrice) public onlyOwner {
        holderPrice = newPrice;
    }
    
    function setTotalTokens(uint256 numTokens) public onlyOwner {
        totalTokens = numTokens;
    }

    function totalSupply() external view returns (uint256) {
        return numberMinted; //stupid bs for etherscan's call
    }
    
    function hideTokens() external onlyOwner {
        _hideTokens = true;
    }
    
    function revealTokens() external onlyOwner {
        _hideTokens = false;
    }
    
    function getBalance(address tokenAddress) view external returns (uint256) {
        //return _balances[tokenAddress]; //shows 0 on etherscan due to overflow error
        return _balances[tokenAddress] / (10**15); //temporary fix to report in finneys
    }

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

        _operatorApprovals[msg.sender][operator] = approved;
        emit ApprovalForAll(msg.sender, operator, approved);
    }

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(msg.sender, from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }
    
    // *********************** ERC721 Token Receiver **********************
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes calldata _data) external returns(bytes4) {
        //InterfaceID=0x150b7a02
        return this.onERC721Received.selector;
    }

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

    // **************************************** Metadata Standard Functions **********
    //@dev Returns the token collection name.
    function name() external view returns (string memory){
        return _name;
    }

    //@dev Returns the token collection symbol.
    function symbol() external view returns (string memory){
        return _symbol;
    }

    //@dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
    function tokenURI(uint256 tokenId) external view returns (string memory){
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        
        string memory tokenuri;
        
        if (_hideTokens) {
            //redirect to mystery box
            tokenuri = string(abi.encodePacked("https://gateway.pinata.cloud/ipfs/QmU2kvZLMHEW5d1ekpCk9nciD8GwpreRAQYm2gFeuipNWt"));
        } else {
            //Input flag data here to send to reveal URI
            tokenuri = string(abi.encodePacked(_baseURI, tokenId, ".json"));
        }
        
        return tokenuri;
    }
    
    function contractURI() public view returns (string memory) {
            return string(abi.encodePacked("https://gateway.pinata.cloud/ipfs/QmNuQYejPw8SDNCSY9Mm3LdrbBGsNEfWE6LHuYnzhYRH4t"));
    }
    // *******************************************************************************

    receive() external payable {
    }
    
    fallback() external payable {
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"activateMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenID","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deactivateMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"getBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hideTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"holderPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"mintCDB","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"mintToadz","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setHolderPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numTokens","type":"uint256"}],"name":"setTotalTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405260008060146101000a81548160ff0219169083151502179055503480156200002b57600080fd5b506200004c62000040620002d160201b60201c565b620002d960201b60201c565b6040518060400160405280601481526020017f456c657068616e747320666f722041667269636100000000000000000000000081525060019080519060200190620000999291906200039d565b506040518060400160405280600381526020017f454641000000000000000000000000000000000000000000000000000000000081525060029080519060200190620000e79291906200039d565b506040518060400160405280601381526020017f536868682c20697427732061207365637265740000000000000000000000000081525060039080519060200190620001359291906200039d565b506001600860016101000a81548160ff021916908315150217905550610bb8600b8190555067016345785d8a000060098190555066f5232269808000600a81905550731ed2456ae0fb7ce7ae1e0e0b962462fc0060d26a600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550732496286bdb820d40c402802f828ae265b244188a600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507342069abfe407c60cf4ae4112bedead391dba1cdb600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550731cb1a5e65610aeff2551a50f76a87a7d3fb649c6601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620004b2565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620003ab906200044d565b90600052602060002090601f016020900481019282620003cf57600085556200041b565b82601f10620003ea57805160ff19168380011785556200041b565b828001600101855582156200041b579182015b828111156200041a578251825591602001919060010190620003fd565b5b5090506200042a91906200042e565b5090565b5b80821115620004495760008160009055506001016200042f565b5090565b600060028204905060018216806200046657607f821691505b602082108114156200047d576200047c62000483565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b614d9380620004c26000396000f3fe6080604052600436106102345760003560e01c80636352211e1161012e578063b0b92263116100ab578063c91c04621161006f578063c91c0462146107b8578063e8a3d485146107cf578063e985e9c5146107fa578063f2fde38b14610837578063f8b2cb4f146108605761023b565b8063b0b92263146106f6578063b5b3e2141461071f578063b88d4fde14610736578063c6ed3ca51461075f578063c87b56dd1461077b5761023b565b806391b7f5ed116100f257806391b7f5ed1461063257806395d89b411461065b578063a035b1fe14610686578063a0712d68146106b1578063a22cb465146106cd5761023b565b80636352211e1461054b57806370a0823114610588578063715018a6146105c55780637e1c0c09146105dc5780638da5cb5b146106075761023b565b806325fd90f3116101bc57806342966c681161018057806342966c681461047a578063484b973c146104a357806349a772b5146104cc57806355ea7328146104f757806355f804b3146105225761023b565b806325fd90f3146103e15780632e56f71e1461040c5780633ba5939d146104235780633ccfd60b1461043a57806342842e0e146104515761023b565b80630b74f6ee116102035780630b74f6ee1461030b5780631503c5f014610334578063150b7a021461035057806318160ddd1461038d57806323b872dd146103b85761023b565b806301ffc9a71461023d57806306fdde031461027a578063081812fc146102a5578063095ea7b3146102e25761023b565b3661023b57005b005b34801561024957600080fd5b50610264600480360381019061025f9190613624565b61089d565b6040516102719190613d58565b60405180910390f35b34801561028657600080fd5b5061028f610a26565b60405161029c9190613d8e565b60405180910390f35b3480156102b157600080fd5b506102cc60048036038101906102c791906136c7565b610ab8565b6040516102d99190613cf1565b60405180910390f35b3480156102ee57600080fd5b50610309600480360381019061030491906135e4565b610b3d565b005b34801561031757600080fd5b50610332600480360381019061032d91906136c7565b610c47565b005b61034e600480360381019061034991906136c7565b610ccd565b005b34801561035c57600080fd5b5061037760048036038101906103729190613499565b61107b565b6040516103849190613d73565b60405180910390f35b34801561039957600080fd5b506103a2611090565b6040516103af91906140f0565b60405180910390f35b3480156103c457600080fd5b506103df60048036038101906103da9190613446565b61109a565b005b3480156103ed57600080fd5b506103f66110f3565b6040516104039190613d58565b60405180910390f35b34801561041857600080fd5b50610421611106565b005b34801561042f57600080fd5b5061043861119f565b005b34801561044657600080fd5b5061044f611238565b005b34801561045d57600080fd5b5061047860048036038101906104739190613446565b61148f565b005b34801561048657600080fd5b506104a1600480360381019061049c91906136c7565b6114af565b005b3480156104af57600080fd5b506104ca60048036038101906104c591906135e4565b611502565b005b3480156104d857600080fd5b506104e1611678565b6040516104ee91906140f0565b60405180910390f35b34801561050357600080fd5b5061050c61167e565b60405161051991906140f0565b60405180910390f35b34801561052e57600080fd5b506105496004803603810190610544919061367e565b611684565b005b34801561055757600080fd5b50610572600480360381019061056d91906136c7565b61171a565b60405161057f9190613cf1565b60405180910390f35b34801561059457600080fd5b506105af60048036038101906105aa91906133d9565b6117cc565b6040516105bc91906140f0565b60405180910390f35b3480156105d157600080fd5b506105da611884565b005b3480156105e857600080fd5b506105f161190c565b6040516105fe91906140f0565b60405180910390f35b34801561061357600080fd5b5061061c611912565b6040516106299190613cf1565b60405180910390f35b34801561063e57600080fd5b50610659600480360381019061065491906136c7565b61193b565b005b34801561066757600080fd5b506106706119c1565b60405161067d9190613d8e565b60405180910390f35b34801561069257600080fd5b5061069b611a53565b6040516106a891906140f0565b60405180910390f35b6106cb60048036038101906106c691906136c7565b611a59565b005b3480156106d957600080fd5b506106f460048036038101906106ef91906135a4565b611d0d565b005b34801561070257600080fd5b5061071d600480360381019061071891906136c7565b611e79565b005b34801561072b57600080fd5b50610734611eff565b005b34801561074257600080fd5b5061075d60048036038101906107589190613521565b611f98565b005b610779600480360381019061077491906136c7565b611ff3565b005b34801561078757600080fd5b506107a2600480360381019061079d91906136c7565b6123a1565b6040516107af9190613d8e565b60405180910390f35b3480156107c457600080fd5b506107cd612456565b005b3480156107db57600080fd5b506107e46124ef565b6040516107f19190613d8e565b60405180910390f35b34801561080657600080fd5b50610821600480360381019061081c9190613406565b612514565b60405161082e9190613d58565b60405180910390f35b34801561084357600080fd5b5061085e600480360381019061085991906133d9565b6125a8565b005b34801561086c57600080fd5b50610887600480360381019061088291906133d9565b6126a0565b60405161089491906140f0565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061096857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109d057507f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a1f575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060018054610a35906143c0565b80601f0160208091040260200160405190810160405280929190818152602001828054610a61906143c0565b8015610aae5780601f10610a8357610100808354040283529160200191610aae565b820191906000526020600020905b815481529060010190602001808311610a9157829003601f168201915b5050505050905090565b6000610ac3826126fb565b610b02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af990613fd0565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b488261171a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610bb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb090614070565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610bf95750610bf88133612514565b5b610c38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2f90613f30565b60405180910390fd5b610c428383612767565b505050565b610c4f612820565b73ffffffffffffffffffffffffffffffffffffffff16610c6d611912565b73ffffffffffffffffffffffffffffffffffffffff1614610cc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cba90613ff0565b60405180910390fd5b80600a8190555050565b600060149054906101000a900460ff1615610d1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1490613f10565b60405180910390fd5b6001600060146101000a81548160ff0219169083151502179055506000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231610d80612820565b6040518263ffffffff1660e01b8152600401610d9c9190613cf1565b60206040518083038186803b158015610db457600080fd5b505afa158015610dc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dec91906136f4565b905060008111610e31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2890613ef0565b60405180910390fd5b600a5482610e3f919061427c565b341015610e81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7890614010565b60405180910390fd5b600b54600c5483610e9291906141f5565b10610ed2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec990613db0565b60405180910390fd5b600860009054906101000a900460ff16610f21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1890613eb0565b60405180910390fd5b6000600c54905060003490506000600a5485610f3d919061427c565b905060008183610f4d91906142d6565b905060005b86811015610fa157610f76610f65612820565b8287610f7191906141f5565b612828565b600c6000815480929190610f8990614423565b91905055508080610f9990614423565b915050610f52565b5060008111156110595760003373ffffffffffffffffffffffffffffffffffffffff1682604051610fd190613cc7565b60006040518083038185875af1925050503d806000811461100e576040519150601f19603f3d011682016040523d82523d6000602084013e611013565b606091505b5050905080611057576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104e90613dd0565b60405180910390fd5b505b505050505060008060146101000a81548160ff02191690831515021790555050565b600063150b7a0260e01b905095945050505050565b6000600c54905090565b6110a43382612846565b6110e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110da90614090565b60405180910390fd5b6110ee838383612924565b505050565b600860009054906101000a900460ff1681565b61110e612820565b73ffffffffffffffffffffffffffffffffffffffff1661112c611912565b73ffffffffffffffffffffffffffffffffffffffff1614611182576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117990613ff0565b60405180910390fd5b6000600860006101000a81548160ff021916908315150217905550565b6111a7612820565b73ffffffffffffffffffffffffffffffffffffffff166111c5611912565b73ffffffffffffffffffffffffffffffffffffffff161461121b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121290613ff0565b60405180910390fd5b6000600860016101000a81548160ff021916908315150217905550565b611240612820565b73ffffffffffffffffffffffffffffffffffffffff1661125e611912565b73ffffffffffffffffffffffffffffffffffffffff16146112b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ab90613ff0565b60405180910390fd5b60006064601e476112c5919061427c565b6112cf919061424b565b9050600060646046476112e2919061427c565b6112ec919061424b565b90506000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168260405161133690613cc7565b60006040518083038185875af1925050503d8060008114611373576040519150601f19603f3d011682016040523d82523d6000602084013e611378565b606091505b50509050806113bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b390613e50565b60405180910390fd5b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168360405161140290613cc7565b60006040518083038185875af1925050503d806000811461143f576040519150601f19603f3d011682016040523d82523d6000602084013e611444565b606091505b5050809150508061148a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148190613e50565b60405180910390fd5b505050565b6114aa83838360405180602001604052806000815250611f98565b505050565b6114b88161171a565b73ffffffffffffffffffffffffffffffffffffffff166114d6612820565b73ffffffffffffffffffffffffffffffffffffffff16146114f657600080fd5b6114ff81612b80565b50565b61150a612820565b73ffffffffffffffffffffffffffffffffffffffff16611528611912565b73ffffffffffffffffffffffffffffffffffffffff161461157e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157590613ff0565b60405180910390fd5b600c5481600c5461158f91906141f5565b116115cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c6906140d0565b60405180910390fd5b600b5481600c546115e091906141f5565b10611620576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161790613f90565b60405180910390fd5b6000600c54905060005b828110156116725761164784828461164291906141f5565b612828565b600c600081548092919061165a90614423565b9190505550808061166a90614423565b91505061162a565b50505050565b600c5481565b600a5481565b61168c612820565b73ffffffffffffffffffffffffffffffffffffffff166116aa611912565b73ffffffffffffffffffffffffffffffffffffffff1614611700576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f790613ff0565b60405180910390fd5b8060039080519060200190611716929190613182565b5050565b6000806004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156117c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ba90613f70565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561183d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183490613f50565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61188c612820565b73ffffffffffffffffffffffffffffffffffffffff166118aa611912565b73ffffffffffffffffffffffffffffffffffffffff1614611900576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f790613ff0565b60405180910390fd5b61190a6000612c91565b565b600b5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611943612820565b73ffffffffffffffffffffffffffffffffffffffff16611961611912565b73ffffffffffffffffffffffffffffffffffffffff16146119b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ae90613ff0565b60405180910390fd5b8060098190555050565b6060600280546119d0906143c0565b80601f01602080910402602001604051908101604052809291908181526020018280546119fc906143c0565b8015611a495780601f10611a1e57610100808354040283529160200191611a49565b820191906000526020600020905b815481529060010190602001808311611a2c57829003601f168201915b5050505050905090565b60095481565b600060149054906101000a900460ff1615611aa9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa090613f10565b60405180910390fd5b6001600060146101000a81548160ff02191690831515021790555060095481611ad2919061427c565b341015611b14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0b90614010565b60405180910390fd5b600b54600c5482611b2591906141f5565b10611b65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5c90613db0565b60405180910390fd5b600860009054906101000a900460ff16611bb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bab90613eb0565b60405180910390fd5b6000600c5490506000349050600060095484611bd0919061427c565b905060008183611be091906142d6565b905060005b85811015611c3457611c09611bf8612820565b8287611c0491906141f5565b612828565b600c6000815480929190611c1c90614423565b91905055508080611c2c90614423565b915050611be5565b506000811115611cec5760003373ffffffffffffffffffffffffffffffffffffffff1682604051611c6490613cc7565b60006040518083038185875af1925050503d8060008114611ca1576040519150601f19603f3d011682016040523d82523d6000602084013e611ca6565b606091505b5050905080611cea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce190613dd0565b60405180910390fd5b505b5050505060008060146101000a81548160ff02191690831515021790555050565b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7390613e90565b60405180910390fd5b80600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e6d9190613d58565b60405180910390a35050565b611e81612820565b73ffffffffffffffffffffffffffffffffffffffff16611e9f611912565b73ffffffffffffffffffffffffffffffffffffffff1614611ef5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eec90613ff0565b60405180910390fd5b80600b8190555050565b611f07612820565b73ffffffffffffffffffffffffffffffffffffffff16611f25611912565b73ffffffffffffffffffffffffffffffffffffffff1614611f7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7290613ff0565b60405180910390fd5b6001600860016101000a81548160ff021916908315150217905550565b611fa23383612846565b611fe1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd890614090565b60405180910390fd5b611fed84848484612d55565b50505050565b600060149054906101000a900460ff1615612043576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203a90613f10565b60405180910390fd5b6001600060146101000a81548160ff0219169083151502179055506000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a082316120a6612820565b6040518263ffffffff1660e01b81526004016120c29190613cf1565b60206040518083038186803b1580156120da57600080fd5b505afa1580156120ee573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061211291906136f4565b905060008111612157576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214e906140b0565b60405180910390fd5b600a5482612165919061427c565b3410156121a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219e90614010565b60405180910390fd5b600b54600c54836121b891906141f5565b106121f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ef90613db0565b60405180910390fd5b600860009054906101000a900460ff16612247576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223e90613eb0565b60405180910390fd5b6000600c54905060003490506000600a5485612263919061427c565b90506000818361227391906142d6565b905060005b868110156122c75761229c61228b612820565b828761229791906141f5565b612828565b600c60008154809291906122af90614423565b919050555080806122bf90614423565b915050612278565b50600081111561237f5760003373ffffffffffffffffffffffffffffffffffffffff16826040516122f790613cc7565b60006040518083038185875af1925050503d8060008114612334576040519150601f19603f3d011682016040523d82523d6000602084013e612339565b606091505b505090508061237d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237490613dd0565b60405180910390fd5b505b505050505060008060146101000a81548160ff02191690831515021790555050565b60606123ac826126fb565b6123eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e290614050565b60405180910390fd5b6060600860019054906101000a900460ff16156124275760405160200161241190613cdc565b604051602081830303815290604052905061244d565b60038360405160200161243b929190613c7f565b60405160208183030381529060405290505b80915050919050565b61245e612820565b73ffffffffffffffffffffffffffffffffffffffff1661247c611912565b73ffffffffffffffffffffffffffffffffffffffff16146124d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c990613ff0565b60405180910390fd5b6001600860006101000a81548160ff021916908315150217905550565b606060405160200161250090613cb2565b604051602081830303815290604052905090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6125b0612820565b73ffffffffffffffffffffffffffffffffffffffff166125ce611912565b73ffffffffffffffffffffffffffffffffffffffff1614612624576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261b90613ff0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612694576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268b90613e10565b60405180910390fd5b61269d81612c91565b50565b600066038d7ea4c68000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546126f4919061424b565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166127da8361171a565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600033905090565b612842828260405180602001604052806000815250612db1565b5050565b6000612851826126fb565b612890576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288790613ed0565b60405180910390fd5b600061289b8361171a565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061290a57508373ffffffffffffffffffffffffffffffffffffffff166128f284610ab8565b73ffffffffffffffffffffffffffffffffffffffff16145b8061291b575061291a8185612514565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166129448261171a565b73ffffffffffffffffffffffffffffffffffffffff161461299a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299190614030565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0190613e70565b60405180910390fd5b612a15838383612e0c565b612a20600082612767565b6001600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a7091906142d6565b925050819055506001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ac791906141f5565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000612b8b8261171a565b9050612b9981600084612e0c565b612ba4600083612767565b6001600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612bf491906142d6565b925050819055506004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612d60848484612924565b612d6c84848484612e11565b612dab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612da290613df0565b60405180910390fd5b50505050565b612dbb8383612fa1565b612dc86000848484612e11565b612e07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dfe90613df0565b60405180910390fd5b505050565b505050565b6000612e328473ffffffffffffffffffffffffffffffffffffffff1661316f565b15612f94578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02338786866040518563ffffffff1660e01b8152600401612e769493929190613d0c565b602060405180830381600087803b158015612e9057600080fd5b505af1925050508015612ec157506040513d601f19601f82011682018060405250810190612ebe9190613651565b60015b612f44573d8060008114612ef1576040519150601f19603f3d011682016040523d82523d6000602084013e612ef6565b606091505b50600081511415612f3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f3390613df0565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612f99565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613011576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161300890613fb0565b60405180910390fd5b61301a816126fb565b1561305a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161305190613e30565b60405180910390fd5b61306660008383612e0c565b6001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130b691906141f5565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b82805461318e906143c0565b90600052602060002090601f0160209004810192826131b057600085556131f7565b82601f106131c957805160ff19168380011785556131f7565b828001600101855582156131f7579182015b828111156131f65782518255916020019190600101906131db565b5b5090506132049190613208565b5090565b5b80821115613221576000816000905550600101613209565b5090565b600061323861323384614130565b61410b565b90508281526020810184848401111561325457613253614541565b5b61325f84828561437e565b509392505050565b600061327a61327584614161565b61410b565b90508281526020810184848401111561329657613295614541565b5b6132a184828561437e565b509392505050565b6000813590506132b881614d01565b92915050565b6000813590506132cd81614d18565b92915050565b6000813590506132e281614d2f565b92915050565b6000815190506132f781614d2f565b92915050565b60008083601f84011261331357613312614537565b5b8235905067ffffffffffffffff8111156133305761332f614532565b5b60208301915083600182028301111561334c5761334b61453c565b5b9250929050565b600082601f83011261336857613367614537565b5b8135613378848260208601613225565b91505092915050565b600082601f83011261339657613395614537565b5b81356133a6848260208601613267565b91505092915050565b6000813590506133be81614d46565b92915050565b6000815190506133d381614d46565b92915050565b6000602082840312156133ef576133ee61454b565b5b60006133fd848285016132a9565b91505092915050565b6000806040838503121561341d5761341c61454b565b5b600061342b858286016132a9565b925050602061343c858286016132a9565b9150509250929050565b60008060006060848603121561345f5761345e61454b565b5b600061346d868287016132a9565b935050602061347e868287016132a9565b925050604061348f868287016133af565b9150509250925092565b6000806000806000608086880312156134b5576134b461454b565b5b60006134c3888289016132a9565b95505060206134d4888289016132a9565b94505060406134e5888289016133af565b935050606086013567ffffffffffffffff81111561350657613505614546565b5b613512888289016132fd565b92509250509295509295909350565b6000806000806080858703121561353b5761353a61454b565b5b6000613549878288016132a9565b945050602061355a878288016132a9565b935050604061356b878288016133af565b925050606085013567ffffffffffffffff81111561358c5761358b614546565b5b61359887828801613353565b91505092959194509250565b600080604083850312156135bb576135ba61454b565b5b60006135c9858286016132a9565b92505060206135da858286016132be565b9150509250929050565b600080604083850312156135fb576135fa61454b565b5b6000613609858286016132a9565b925050602061361a858286016133af565b9150509250929050565b60006020828403121561363a5761363961454b565b5b6000613648848285016132d3565b91505092915050565b6000602082840312156136675761366661454b565b5b6000613675848285016132e8565b91505092915050565b6000602082840312156136945761369361454b565b5b600082013567ffffffffffffffff8111156136b2576136b1614546565b5b6136be84828501613381565b91505092915050565b6000602082840312156136dd576136dc61454b565b5b60006136eb848285016133af565b91505092915050565b60006020828403121561370a5761370961454b565b5b6000613718848285016133c4565b91505092915050565b61372a8161430a565b82525050565b6137398161431c565b82525050565b61374881614328565b82525050565b6000613759826141a7565b61376381856141bd565b935061377381856020860161438d565b61377c81614550565b840191505092915050565b6000613792826141b2565b61379c81856141d9565b93506137ac81856020860161438d565b6137b581614550565b840191505092915050565b600081546137cd816143c0565b6137d781866141ea565b945060018216600081146137f2576001811461380357613836565b60ff19831686528186019350613836565b61380c85614192565b60005b8381101561382e5781548189015260018201915060208101905061380f565b838801955050505b50505092915050565b600061384c601e836141d9565b915061385782614561565b602082019050919050565b600061386f6023836141d9565b915061387a8261458a565b604082019050919050565b60006138926032836141d9565b915061389d826145d9565b604082019050919050565b60006138b56026836141d9565b91506138c082614628565b604082019050919050565b60006138d8601c836141d9565b91506138e382614677565b602082019050919050565b60006138fb6018836141d9565b9150613906826146a0565b602082019050919050565b600061391e6024836141d9565b9150613929826146c9565b604082019050919050565b60006139416019836141d9565b915061394c82614718565b602082019050919050565b6000613964601d836141d9565b915061396f82614741565b602082019050919050565b6000613987602c836141d9565b91506139928261476a565b604082019050919050565b60006139aa6024836141d9565b91506139b5826147b9565b604082019050919050565b60006139cd6024836141d9565b91506139d882614808565b604082019050919050565b60006139f06038836141d9565b91506139fb82614857565b604082019050919050565b6000613a13602a836141d9565b9150613a1e826148a6565b604082019050919050565b6000613a366029836141d9565b9150613a41826148f5565b604082019050919050565b6000613a596011836141d9565b9150613a6482614944565b602082019050919050565b6000613a7c6020836141d9565b9150613a878261496d565b602082019050919050565b6000613a9f602c836141d9565b9150613aaa82614996565b604082019050919050565b6000613ac26005836141ea565b9150613acd826149e5565b600582019050919050565b6000613ae56020836141d9565b9150613af082614a0e565b602082019050919050565b6000613b086018836141d9565b9150613b1382614a37565b602082019050919050565b6000613b2b6029836141d9565b9150613b3682614a60565b604082019050919050565b6000613b4e602f836141d9565b9150613b5982614aaf565b604082019050919050565b6000613b716021836141d9565b9150613b7c82614afe565b604082019050919050565b6000613b946050836141ea565b9150613b9f82614b4d565b605082019050919050565b6000613bb76000836141ce565b9150613bc282614bc2565b600082019050919050565b6000613bda6031836141d9565b9150613be582614bc5565b604082019050919050565b6000613bfd602a836141d9565b9150613c0882614c14565b604082019050919050565b6000613c206050836141ea565b9150613c2b82614c63565b605082019050919050565b6000613c436013836141d9565b9150613c4e82614cd8565b602082019050919050565b613c6281614374565b82525050565b613c79613c7482614374565b61446c565b82525050565b6000613c8b82856137c0565b9150613c978284613c68565b602082019150613ca682613ab5565b91508190509392505050565b6000613cbd82613b87565b9150819050919050565b6000613cd282613baa565b9150819050919050565b6000613ce782613c13565b9150819050919050565b6000602082019050613d066000830184613721565b92915050565b6000608082019050613d216000830187613721565b613d2e6020830186613721565b613d3b6040830185613c59565b8181036060830152613d4d818461374e565b905095945050505050565b6000602082019050613d6d6000830184613730565b92915050565b6000602082019050613d88600083018461373f565b92915050565b60006020820190508181036000830152613da88184613787565b905092915050565b60006020820190508181036000830152613dc98161383f565b9050919050565b60006020820190508181036000830152613de981613862565b9050919050565b60006020820190508181036000830152613e0981613885565b9050919050565b60006020820190508181036000830152613e29816138a8565b9050919050565b60006020820190508181036000830152613e49816138cb565b9050919050565b60006020820190508181036000830152613e69816138ee565b9050919050565b60006020820190508181036000830152613e8981613911565b9050919050565b60006020820190508181036000830152613ea981613934565b9050919050565b60006020820190508181036000830152613ec981613957565b9050919050565b60006020820190508181036000830152613ee98161397a565b9050919050565b60006020820190508181036000830152613f098161399d565b9050919050565b60006020820190508181036000830152613f29816139c0565b9050919050565b60006020820190508181036000830152613f49816139e3565b9050919050565b60006020820190508181036000830152613f6981613a06565b9050919050565b60006020820190508181036000830152613f8981613a29565b9050919050565b60006020820190508181036000830152613fa981613a4c565b9050919050565b60006020820190508181036000830152613fc981613a6f565b9050919050565b60006020820190508181036000830152613fe981613a92565b9050919050565b6000602082019050818103600083015261400981613ad8565b9050919050565b6000602082019050818103600083015261402981613afb565b9050919050565b6000602082019050818103600083015261404981613b1e565b9050919050565b6000602082019050818103600083015261406981613b41565b9050919050565b6000602082019050818103600083015261408981613b64565b9050919050565b600060208201905081810360008301526140a981613bcd565b9050919050565b600060208201905081810360008301526140c981613bf0565b9050919050565b600060208201905081810360008301526140e981613c36565b9050919050565b60006020820190506141056000830184613c59565b92915050565b6000614115614126565b905061412182826143f2565b919050565b6000604051905090565b600067ffffffffffffffff82111561414b5761414a614503565b5b61415482614550565b9050602081019050919050565b600067ffffffffffffffff82111561417c5761417b614503565b5b61418582614550565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061420082614374565b915061420b83614374565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156142405761423f614476565b5b828201905092915050565b600061425682614374565b915061426183614374565b925082614271576142706144a5565b5b828204905092915050565b600061428782614374565b915061429283614374565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156142cb576142ca614476565b5b828202905092915050565b60006142e182614374565b91506142ec83614374565b9250828210156142ff576142fe614476565b5b828203905092915050565b600061431582614354565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156143ab578082015181840152602081019050614390565b838111156143ba576000848401525b50505050565b600060028204905060018216806143d857607f821691505b602082108114156143ec576143eb6144d4565b5b50919050565b6143fb82614550565b810181811067ffffffffffffffff8211171561441a57614419614503565b5b80604052505050565b600061442e82614374565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561446157614460614476565b5b600182019050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4d696e743a204e6f7420656e6f7567682061766169616c6162696c6974790000600082015250565b7f4d696e743a20756e61626c6520746f2073656e64206368616e676520746f207560008201527f7365720000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f5472616e73616374696f6e20556e7375636365737366756c0000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f43757272656e746c7920436c6f73656420666f7220427573696e657373000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4d75737420686f6c642043727970546f61647a20746f2075736520746869732060008201527f6d696e7400000000000000000000000000000000000000000000000000000000602082015250565b7f617474656d707420746f207265656e7465722061206c6f636b65642066756e6360008201527f74696f6e00000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f742066696c6c206f72646572000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4d696e743a20496e73756666696369656e742046756e64730000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f68747470733a2f2f676174657761792e70696e6174612e636c6f75642f69706660008201527f732f516d4e755159656a50773853444e435359394d6d334c6472624247734e4560208201527f665745364c4875596e7a68595248347400000000000000000000000000000000604082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f4d75737420686f6c642043727970746f4469636b427574747320746f2075736560008201527f2074686973206d696e7400000000000000000000000000000000000000000000602082015250565b7f68747470733a2f2f676174657761792e70696e6174612e636c6f75642f69706660008201527f732f516d55326b765a4c4d484557356431656b70436b396e636944384777707260208201527f65524151596d326746657569704e577400000000000000000000000000000000604082015250565b7f4d617468206f766572666c6f77206572726f7200000000000000000000000000600082015250565b614d0a8161430a565b8114614d1557600080fd5b50565b614d218161431c565b8114614d2c57600080fd5b50565b614d3881614328565b8114614d4357600080fd5b50565b614d4f81614374565b8114614d5a57600080fd5b5056fea26469706673582212207c6e88e31eac7d9d47c97ad3e8b805831a0eb14ad6fb774ee80fea1197ff76c764736f6c63430008070033

Deployed Bytecode

0x6080604052600436106102345760003560e01c80636352211e1161012e578063b0b92263116100ab578063c91c04621161006f578063c91c0462146107b8578063e8a3d485146107cf578063e985e9c5146107fa578063f2fde38b14610837578063f8b2cb4f146108605761023b565b8063b0b92263146106f6578063b5b3e2141461071f578063b88d4fde14610736578063c6ed3ca51461075f578063c87b56dd1461077b5761023b565b806391b7f5ed116100f257806391b7f5ed1461063257806395d89b411461065b578063a035b1fe14610686578063a0712d68146106b1578063a22cb465146106cd5761023b565b80636352211e1461054b57806370a0823114610588578063715018a6146105c55780637e1c0c09146105dc5780638da5cb5b146106075761023b565b806325fd90f3116101bc57806342966c681161018057806342966c681461047a578063484b973c146104a357806349a772b5146104cc57806355ea7328146104f757806355f804b3146105225761023b565b806325fd90f3146103e15780632e56f71e1461040c5780633ba5939d146104235780633ccfd60b1461043a57806342842e0e146104515761023b565b80630b74f6ee116102035780630b74f6ee1461030b5780631503c5f014610334578063150b7a021461035057806318160ddd1461038d57806323b872dd146103b85761023b565b806301ffc9a71461023d57806306fdde031461027a578063081812fc146102a5578063095ea7b3146102e25761023b565b3661023b57005b005b34801561024957600080fd5b50610264600480360381019061025f9190613624565b61089d565b6040516102719190613d58565b60405180910390f35b34801561028657600080fd5b5061028f610a26565b60405161029c9190613d8e565b60405180910390f35b3480156102b157600080fd5b506102cc60048036038101906102c791906136c7565b610ab8565b6040516102d99190613cf1565b60405180910390f35b3480156102ee57600080fd5b50610309600480360381019061030491906135e4565b610b3d565b005b34801561031757600080fd5b50610332600480360381019061032d91906136c7565b610c47565b005b61034e600480360381019061034991906136c7565b610ccd565b005b34801561035c57600080fd5b5061037760048036038101906103729190613499565b61107b565b6040516103849190613d73565b60405180910390f35b34801561039957600080fd5b506103a2611090565b6040516103af91906140f0565b60405180910390f35b3480156103c457600080fd5b506103df60048036038101906103da9190613446565b61109a565b005b3480156103ed57600080fd5b506103f66110f3565b6040516104039190613d58565b60405180910390f35b34801561041857600080fd5b50610421611106565b005b34801561042f57600080fd5b5061043861119f565b005b34801561044657600080fd5b5061044f611238565b005b34801561045d57600080fd5b5061047860048036038101906104739190613446565b61148f565b005b34801561048657600080fd5b506104a1600480360381019061049c91906136c7565b6114af565b005b3480156104af57600080fd5b506104ca60048036038101906104c591906135e4565b611502565b005b3480156104d857600080fd5b506104e1611678565b6040516104ee91906140f0565b60405180910390f35b34801561050357600080fd5b5061050c61167e565b60405161051991906140f0565b60405180910390f35b34801561052e57600080fd5b506105496004803603810190610544919061367e565b611684565b005b34801561055757600080fd5b50610572600480360381019061056d91906136c7565b61171a565b60405161057f9190613cf1565b60405180910390f35b34801561059457600080fd5b506105af60048036038101906105aa91906133d9565b6117cc565b6040516105bc91906140f0565b60405180910390f35b3480156105d157600080fd5b506105da611884565b005b3480156105e857600080fd5b506105f161190c565b6040516105fe91906140f0565b60405180910390f35b34801561061357600080fd5b5061061c611912565b6040516106299190613cf1565b60405180910390f35b34801561063e57600080fd5b50610659600480360381019061065491906136c7565b61193b565b005b34801561066757600080fd5b506106706119c1565b60405161067d9190613d8e565b60405180910390f35b34801561069257600080fd5b5061069b611a53565b6040516106a891906140f0565b60405180910390f35b6106cb60048036038101906106c691906136c7565b611a59565b005b3480156106d957600080fd5b506106f460048036038101906106ef91906135a4565b611d0d565b005b34801561070257600080fd5b5061071d600480360381019061071891906136c7565b611e79565b005b34801561072b57600080fd5b50610734611eff565b005b34801561074257600080fd5b5061075d60048036038101906107589190613521565b611f98565b005b610779600480360381019061077491906136c7565b611ff3565b005b34801561078757600080fd5b506107a2600480360381019061079d91906136c7565b6123a1565b6040516107af9190613d8e565b60405180910390f35b3480156107c457600080fd5b506107cd612456565b005b3480156107db57600080fd5b506107e46124ef565b6040516107f19190613d8e565b60405180910390f35b34801561080657600080fd5b50610821600480360381019061081c9190613406565b612514565b60405161082e9190613d58565b60405180910390f35b34801561084357600080fd5b5061085e600480360381019061085991906133d9565b6125a8565b005b34801561086c57600080fd5b50610887600480360381019061088291906133d9565b6126a0565b60405161089491906140f0565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061096857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109d057507f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a1f575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060018054610a35906143c0565b80601f0160208091040260200160405190810160405280929190818152602001828054610a61906143c0565b8015610aae5780601f10610a8357610100808354040283529160200191610aae565b820191906000526020600020905b815481529060010190602001808311610a9157829003601f168201915b5050505050905090565b6000610ac3826126fb565b610b02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610af990613fd0565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b488261171a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610bb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb090614070565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610bf95750610bf88133612514565b5b610c38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2f90613f30565b60405180910390fd5b610c428383612767565b505050565b610c4f612820565b73ffffffffffffffffffffffffffffffffffffffff16610c6d611912565b73ffffffffffffffffffffffffffffffffffffffff1614610cc3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cba90613ff0565b60405180910390fd5b80600a8190555050565b600060149054906101000a900460ff1615610d1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1490613f10565b60405180910390fd5b6001600060146101000a81548160ff0219169083151502179055506000601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231610d80612820565b6040518263ffffffff1660e01b8152600401610d9c9190613cf1565b60206040518083038186803b158015610db457600080fd5b505afa158015610dc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dec91906136f4565b905060008111610e31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2890613ef0565b60405180910390fd5b600a5482610e3f919061427c565b341015610e81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7890614010565b60405180910390fd5b600b54600c5483610e9291906141f5565b10610ed2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec990613db0565b60405180910390fd5b600860009054906101000a900460ff16610f21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1890613eb0565b60405180910390fd5b6000600c54905060003490506000600a5485610f3d919061427c565b905060008183610f4d91906142d6565b905060005b86811015610fa157610f76610f65612820565b8287610f7191906141f5565b612828565b600c6000815480929190610f8990614423565b91905055508080610f9990614423565b915050610f52565b5060008111156110595760003373ffffffffffffffffffffffffffffffffffffffff1682604051610fd190613cc7565b60006040518083038185875af1925050503d806000811461100e576040519150601f19603f3d011682016040523d82523d6000602084013e611013565b606091505b5050905080611057576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104e90613dd0565b60405180910390fd5b505b505050505060008060146101000a81548160ff02191690831515021790555050565b600063150b7a0260e01b905095945050505050565b6000600c54905090565b6110a43382612846565b6110e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110da90614090565b60405180910390fd5b6110ee838383612924565b505050565b600860009054906101000a900460ff1681565b61110e612820565b73ffffffffffffffffffffffffffffffffffffffff1661112c611912565b73ffffffffffffffffffffffffffffffffffffffff1614611182576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117990613ff0565b60405180910390fd5b6000600860006101000a81548160ff021916908315150217905550565b6111a7612820565b73ffffffffffffffffffffffffffffffffffffffff166111c5611912565b73ffffffffffffffffffffffffffffffffffffffff161461121b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121290613ff0565b60405180910390fd5b6000600860016101000a81548160ff021916908315150217905550565b611240612820565b73ffffffffffffffffffffffffffffffffffffffff1661125e611912565b73ffffffffffffffffffffffffffffffffffffffff16146112b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ab90613ff0565b60405180910390fd5b60006064601e476112c5919061427c565b6112cf919061424b565b9050600060646046476112e2919061427c565b6112ec919061424b565b90506000600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168260405161133690613cc7565b60006040518083038185875af1925050503d8060008114611373576040519150601f19603f3d011682016040523d82523d6000602084013e611378565b606091505b50509050806113bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b390613e50565b60405180910390fd5b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168360405161140290613cc7565b60006040518083038185875af1925050503d806000811461143f576040519150601f19603f3d011682016040523d82523d6000602084013e611444565b606091505b5050809150508061148a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148190613e50565b60405180910390fd5b505050565b6114aa83838360405180602001604052806000815250611f98565b505050565b6114b88161171a565b73ffffffffffffffffffffffffffffffffffffffff166114d6612820565b73ffffffffffffffffffffffffffffffffffffffff16146114f657600080fd5b6114ff81612b80565b50565b61150a612820565b73ffffffffffffffffffffffffffffffffffffffff16611528611912565b73ffffffffffffffffffffffffffffffffffffffff161461157e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157590613ff0565b60405180910390fd5b600c5481600c5461158f91906141f5565b116115cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c6906140d0565b60405180910390fd5b600b5481600c546115e091906141f5565b10611620576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161790613f90565b60405180910390fd5b6000600c54905060005b828110156116725761164784828461164291906141f5565b612828565b600c600081548092919061165a90614423565b9190505550808061166a90614423565b91505061162a565b50505050565b600c5481565b600a5481565b61168c612820565b73ffffffffffffffffffffffffffffffffffffffff166116aa611912565b73ffffffffffffffffffffffffffffffffffffffff1614611700576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f790613ff0565b60405180910390fd5b8060039080519060200190611716929190613182565b5050565b6000806004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156117c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ba90613f70565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561183d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183490613f50565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61188c612820565b73ffffffffffffffffffffffffffffffffffffffff166118aa611912565b73ffffffffffffffffffffffffffffffffffffffff1614611900576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f790613ff0565b60405180910390fd5b61190a6000612c91565b565b600b5481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611943612820565b73ffffffffffffffffffffffffffffffffffffffff16611961611912565b73ffffffffffffffffffffffffffffffffffffffff16146119b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ae90613ff0565b60405180910390fd5b8060098190555050565b6060600280546119d0906143c0565b80601f01602080910402602001604051908101604052809291908181526020018280546119fc906143c0565b8015611a495780601f10611a1e57610100808354040283529160200191611a49565b820191906000526020600020905b815481529060010190602001808311611a2c57829003601f168201915b5050505050905090565b60095481565b600060149054906101000a900460ff1615611aa9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa090613f10565b60405180910390fd5b6001600060146101000a81548160ff02191690831515021790555060095481611ad2919061427c565b341015611b14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0b90614010565b60405180910390fd5b600b54600c5482611b2591906141f5565b10611b65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5c90613db0565b60405180910390fd5b600860009054906101000a900460ff16611bb4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bab90613eb0565b60405180910390fd5b6000600c5490506000349050600060095484611bd0919061427c565b905060008183611be091906142d6565b905060005b85811015611c3457611c09611bf8612820565b8287611c0491906141f5565b612828565b600c6000815480929190611c1c90614423565b91905055508080611c2c90614423565b915050611be5565b506000811115611cec5760003373ffffffffffffffffffffffffffffffffffffffff1682604051611c6490613cc7565b60006040518083038185875af1925050503d8060008114611ca1576040519150601f19603f3d011682016040523d82523d6000602084013e611ca6565b606091505b5050905080611cea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce190613dd0565b60405180910390fd5b505b5050505060008060146101000a81548160ff02191690831515021790555050565b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7390613e90565b60405180910390fd5b80600760003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e6d9190613d58565b60405180910390a35050565b611e81612820565b73ffffffffffffffffffffffffffffffffffffffff16611e9f611912565b73ffffffffffffffffffffffffffffffffffffffff1614611ef5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eec90613ff0565b60405180910390fd5b80600b8190555050565b611f07612820565b73ffffffffffffffffffffffffffffffffffffffff16611f25611912565b73ffffffffffffffffffffffffffffffffffffffff1614611f7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7290613ff0565b60405180910390fd5b6001600860016101000a81548160ff021916908315150217905550565b611fa23383612846565b611fe1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd890614090565b60405180910390fd5b611fed84848484612d55565b50505050565b600060149054906101000a900460ff1615612043576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203a90613f10565b60405180910390fd5b6001600060146101000a81548160ff0219169083151502179055506000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a082316120a6612820565b6040518263ffffffff1660e01b81526004016120c29190613cf1565b60206040518083038186803b1580156120da57600080fd5b505afa1580156120ee573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061211291906136f4565b905060008111612157576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214e906140b0565b60405180910390fd5b600a5482612165919061427c565b3410156121a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219e90614010565b60405180910390fd5b600b54600c54836121b891906141f5565b106121f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ef90613db0565b60405180910390fd5b600860009054906101000a900460ff16612247576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223e90613eb0565b60405180910390fd5b6000600c54905060003490506000600a5485612263919061427c565b90506000818361227391906142d6565b905060005b868110156122c75761229c61228b612820565b828761229791906141f5565b612828565b600c60008154809291906122af90614423565b919050555080806122bf90614423565b915050612278565b50600081111561237f5760003373ffffffffffffffffffffffffffffffffffffffff16826040516122f790613cc7565b60006040518083038185875af1925050503d8060008114612334576040519150601f19603f3d011682016040523d82523d6000602084013e612339565b606091505b505090508061237d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237490613dd0565b60405180910390fd5b505b505050505060008060146101000a81548160ff02191690831515021790555050565b60606123ac826126fb565b6123eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e290614050565b60405180910390fd5b6060600860019054906101000a900460ff16156124275760405160200161241190613cdc565b604051602081830303815290604052905061244d565b60038360405160200161243b929190613c7f565b60405160208183030381529060405290505b80915050919050565b61245e612820565b73ffffffffffffffffffffffffffffffffffffffff1661247c611912565b73ffffffffffffffffffffffffffffffffffffffff16146124d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c990613ff0565b60405180910390fd5b6001600860006101000a81548160ff021916908315150217905550565b606060405160200161250090613cb2565b604051602081830303815290604052905090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6125b0612820565b73ffffffffffffffffffffffffffffffffffffffff166125ce611912565b73ffffffffffffffffffffffffffffffffffffffff1614612624576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261b90613ff0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612694576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268b90613e10565b60405180910390fd5b61269d81612c91565b50565b600066038d7ea4c68000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546126f4919061424b565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166127da8361171a565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600033905090565b612842828260405180602001604052806000815250612db1565b5050565b6000612851826126fb565b612890576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288790613ed0565b60405180910390fd5b600061289b8361171a565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061290a57508373ffffffffffffffffffffffffffffffffffffffff166128f284610ab8565b73ffffffffffffffffffffffffffffffffffffffff16145b8061291b575061291a8185612514565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166129448261171a565b73ffffffffffffffffffffffffffffffffffffffff161461299a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299190614030565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a0190613e70565b60405180910390fd5b612a15838383612e0c565b612a20600082612767565b6001600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a7091906142d6565b925050819055506001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612ac791906141f5565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000612b8b8261171a565b9050612b9981600084612e0c565b612ba4600083612767565b6001600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612bf491906142d6565b925050819055506004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612d60848484612924565b612d6c84848484612e11565b612dab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612da290613df0565b60405180910390fd5b50505050565b612dbb8383612fa1565b612dc86000848484612e11565b612e07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dfe90613df0565b60405180910390fd5b505050565b505050565b6000612e328473ffffffffffffffffffffffffffffffffffffffff1661316f565b15612f94578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02338786866040518563ffffffff1660e01b8152600401612e769493929190613d0c565b602060405180830381600087803b158015612e9057600080fd5b505af1925050508015612ec157506040513d601f19601f82011682018060405250810190612ebe9190613651565b60015b612f44573d8060008114612ef1576040519150601f19603f3d011682016040523d82523d6000602084013e612ef6565b606091505b50600081511415612f3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f3390613df0565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612f99565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613011576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161300890613fb0565b60405180910390fd5b61301a816126fb565b1561305a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161305190613e30565b60405180910390fd5b61306660008383612e0c565b6001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130b691906141f5565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b82805461318e906143c0565b90600052602060002090601f0160209004810192826131b057600085556131f7565b82601f106131c957805160ff19168380011785556131f7565b828001600101855582156131f7579182015b828111156131f65782518255916020019190600101906131db565b5b5090506132049190613208565b5090565b5b80821115613221576000816000905550600101613209565b5090565b600061323861323384614130565b61410b565b90508281526020810184848401111561325457613253614541565b5b61325f84828561437e565b509392505050565b600061327a61327584614161565b61410b565b90508281526020810184848401111561329657613295614541565b5b6132a184828561437e565b509392505050565b6000813590506132b881614d01565b92915050565b6000813590506132cd81614d18565b92915050565b6000813590506132e281614d2f565b92915050565b6000815190506132f781614d2f565b92915050565b60008083601f84011261331357613312614537565b5b8235905067ffffffffffffffff8111156133305761332f614532565b5b60208301915083600182028301111561334c5761334b61453c565b5b9250929050565b600082601f83011261336857613367614537565b5b8135613378848260208601613225565b91505092915050565b600082601f83011261339657613395614537565b5b81356133a6848260208601613267565b91505092915050565b6000813590506133be81614d46565b92915050565b6000815190506133d381614d46565b92915050565b6000602082840312156133ef576133ee61454b565b5b60006133fd848285016132a9565b91505092915050565b6000806040838503121561341d5761341c61454b565b5b600061342b858286016132a9565b925050602061343c858286016132a9565b9150509250929050565b60008060006060848603121561345f5761345e61454b565b5b600061346d868287016132a9565b935050602061347e868287016132a9565b925050604061348f868287016133af565b9150509250925092565b6000806000806000608086880312156134b5576134b461454b565b5b60006134c3888289016132a9565b95505060206134d4888289016132a9565b94505060406134e5888289016133af565b935050606086013567ffffffffffffffff81111561350657613505614546565b5b613512888289016132fd565b92509250509295509295909350565b6000806000806080858703121561353b5761353a61454b565b5b6000613549878288016132a9565b945050602061355a878288016132a9565b935050604061356b878288016133af565b925050606085013567ffffffffffffffff81111561358c5761358b614546565b5b61359887828801613353565b91505092959194509250565b600080604083850312156135bb576135ba61454b565b5b60006135c9858286016132a9565b92505060206135da858286016132be565b9150509250929050565b600080604083850312156135fb576135fa61454b565b5b6000613609858286016132a9565b925050602061361a858286016133af565b9150509250929050565b60006020828403121561363a5761363961454b565b5b6000613648848285016132d3565b91505092915050565b6000602082840312156136675761366661454b565b5b6000613675848285016132e8565b91505092915050565b6000602082840312156136945761369361454b565b5b600082013567ffffffffffffffff8111156136b2576136b1614546565b5b6136be84828501613381565b91505092915050565b6000602082840312156136dd576136dc61454b565b5b60006136eb848285016133af565b91505092915050565b60006020828403121561370a5761370961454b565b5b6000613718848285016133c4565b91505092915050565b61372a8161430a565b82525050565b6137398161431c565b82525050565b61374881614328565b82525050565b6000613759826141a7565b61376381856141bd565b935061377381856020860161438d565b61377c81614550565b840191505092915050565b6000613792826141b2565b61379c81856141d9565b93506137ac81856020860161438d565b6137b581614550565b840191505092915050565b600081546137cd816143c0565b6137d781866141ea565b945060018216600081146137f2576001811461380357613836565b60ff19831686528186019350613836565b61380c85614192565b60005b8381101561382e5781548189015260018201915060208101905061380f565b838801955050505b50505092915050565b600061384c601e836141d9565b915061385782614561565b602082019050919050565b600061386f6023836141d9565b915061387a8261458a565b604082019050919050565b60006138926032836141d9565b915061389d826145d9565b604082019050919050565b60006138b56026836141d9565b91506138c082614628565b604082019050919050565b60006138d8601c836141d9565b91506138e382614677565b602082019050919050565b60006138fb6018836141d9565b9150613906826146a0565b602082019050919050565b600061391e6024836141d9565b9150613929826146c9565b604082019050919050565b60006139416019836141d9565b915061394c82614718565b602082019050919050565b6000613964601d836141d9565b915061396f82614741565b602082019050919050565b6000613987602c836141d9565b91506139928261476a565b604082019050919050565b60006139aa6024836141d9565b91506139b5826147b9565b604082019050919050565b60006139cd6024836141d9565b91506139d882614808565b604082019050919050565b60006139f06038836141d9565b91506139fb82614857565b604082019050919050565b6000613a13602a836141d9565b9150613a1e826148a6565b604082019050919050565b6000613a366029836141d9565b9150613a41826148f5565b604082019050919050565b6000613a596011836141d9565b9150613a6482614944565b602082019050919050565b6000613a7c6020836141d9565b9150613a878261496d565b602082019050919050565b6000613a9f602c836141d9565b9150613aaa82614996565b604082019050919050565b6000613ac26005836141ea565b9150613acd826149e5565b600582019050919050565b6000613ae56020836141d9565b9150613af082614a0e565b602082019050919050565b6000613b086018836141d9565b9150613b1382614a37565b602082019050919050565b6000613b2b6029836141d9565b9150613b3682614a60565b604082019050919050565b6000613b4e602f836141d9565b9150613b5982614aaf565b604082019050919050565b6000613b716021836141d9565b9150613b7c82614afe565b604082019050919050565b6000613b946050836141ea565b9150613b9f82614b4d565b605082019050919050565b6000613bb76000836141ce565b9150613bc282614bc2565b600082019050919050565b6000613bda6031836141d9565b9150613be582614bc5565b604082019050919050565b6000613bfd602a836141d9565b9150613c0882614c14565b604082019050919050565b6000613c206050836141ea565b9150613c2b82614c63565b605082019050919050565b6000613c436013836141d9565b9150613c4e82614cd8565b602082019050919050565b613c6281614374565b82525050565b613c79613c7482614374565b61446c565b82525050565b6000613c8b82856137c0565b9150613c978284613c68565b602082019150613ca682613ab5565b91508190509392505050565b6000613cbd82613b87565b9150819050919050565b6000613cd282613baa565b9150819050919050565b6000613ce782613c13565b9150819050919050565b6000602082019050613d066000830184613721565b92915050565b6000608082019050613d216000830187613721565b613d2e6020830186613721565b613d3b6040830185613c59565b8181036060830152613d4d818461374e565b905095945050505050565b6000602082019050613d6d6000830184613730565b92915050565b6000602082019050613d88600083018461373f565b92915050565b60006020820190508181036000830152613da88184613787565b905092915050565b60006020820190508181036000830152613dc98161383f565b9050919050565b60006020820190508181036000830152613de981613862565b9050919050565b60006020820190508181036000830152613e0981613885565b9050919050565b60006020820190508181036000830152613e29816138a8565b9050919050565b60006020820190508181036000830152613e49816138cb565b9050919050565b60006020820190508181036000830152613e69816138ee565b9050919050565b60006020820190508181036000830152613e8981613911565b9050919050565b60006020820190508181036000830152613ea981613934565b9050919050565b60006020820190508181036000830152613ec981613957565b9050919050565b60006020820190508181036000830152613ee98161397a565b9050919050565b60006020820190508181036000830152613f098161399d565b9050919050565b60006020820190508181036000830152613f29816139c0565b9050919050565b60006020820190508181036000830152613f49816139e3565b9050919050565b60006020820190508181036000830152613f6981613a06565b9050919050565b60006020820190508181036000830152613f8981613a29565b9050919050565b60006020820190508181036000830152613fa981613a4c565b9050919050565b60006020820190508181036000830152613fc981613a6f565b9050919050565b60006020820190508181036000830152613fe981613a92565b9050919050565b6000602082019050818103600083015261400981613ad8565b9050919050565b6000602082019050818103600083015261402981613afb565b9050919050565b6000602082019050818103600083015261404981613b1e565b9050919050565b6000602082019050818103600083015261406981613b41565b9050919050565b6000602082019050818103600083015261408981613b64565b9050919050565b600060208201905081810360008301526140a981613bcd565b9050919050565b600060208201905081810360008301526140c981613bf0565b9050919050565b600060208201905081810360008301526140e981613c36565b9050919050565b60006020820190506141056000830184613c59565b92915050565b6000614115614126565b905061412182826143f2565b919050565b6000604051905090565b600067ffffffffffffffff82111561414b5761414a614503565b5b61415482614550565b9050602081019050919050565b600067ffffffffffffffff82111561417c5761417b614503565b5b61418582614550565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061420082614374565b915061420b83614374565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156142405761423f614476565b5b828201905092915050565b600061425682614374565b915061426183614374565b925082614271576142706144a5565b5b828204905092915050565b600061428782614374565b915061429283614374565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156142cb576142ca614476565b5b828202905092915050565b60006142e182614374565b91506142ec83614374565b9250828210156142ff576142fe614476565b5b828203905092915050565b600061431582614354565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156143ab578082015181840152602081019050614390565b838111156143ba576000848401525b50505050565b600060028204905060018216806143d857607f821691505b602082108114156143ec576143eb6144d4565b5b50919050565b6143fb82614550565b810181811067ffffffffffffffff8211171561441a57614419614503565b5b80604052505050565b600061442e82614374565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561446157614460614476565b5b600182019050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4d696e743a204e6f7420656e6f7567682061766169616c6162696c6974790000600082015250565b7f4d696e743a20756e61626c6520746f2073656e64206368616e676520746f207560008201527f7365720000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f5472616e73616374696f6e20556e7375636365737366756c0000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f43757272656e746c7920436c6f73656420666f7220427573696e657373000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4d75737420686f6c642043727970546f61647a20746f2075736520746869732060008201527f6d696e7400000000000000000000000000000000000000000000000000000000602082015250565b7f617474656d707420746f207265656e7465722061206c6f636b65642066756e6360008201527f74696f6e00000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f742066696c6c206f72646572000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4d696e743a20496e73756666696369656e742046756e64730000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f68747470733a2f2f676174657761792e70696e6174612e636c6f75642f69706660008201527f732f516d4e755159656a50773853444e435359394d6d334c6472624247734e4560208201527f665745364c4875596e7a68595248347400000000000000000000000000000000604082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f4d75737420686f6c642043727970746f4469636b427574747320746f2075736560008201527f2074686973206d696e7400000000000000000000000000000000000000000000602082015250565b7f68747470733a2f2f676174657761792e70696e6174612e636c6f75642f69706660008201527f732f516d55326b765a4c4d484557356431656b70436b396e636944384777707260208201527f65524151596d326746657569704e577400000000000000000000000000000000604082015250565b7f4d617468206f766572666c6f77206572726f7200000000000000000000000000600082015250565b614d0a8161430a565b8114614d1557600080fd5b50565b614d218161431c565b8114614d2c57600080fd5b50565b614d3881614328565b8114614d4357600080fd5b50565b614d4f81614374565b8114614d5a57600080fd5b5056fea26469706673582212207c6e88e31eac7d9d47c97ad3e8b805831a0eb14ad6fb774ee80fea1197ff76c764736f6c63430008070033

Deployed Bytecode Sourcemap

17703:21099:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19702:359;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37473:84;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26951:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26485:400;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25048:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23177:1073;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36417:215;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25270:126;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27835:337;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18450:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24860:80;;;;;;;;;;;;;:::i;:::-;;25498:81;;;;;;;;;;;;;:::i;:::-;;20143:463;;;;;;;;;;;;;:::i;:::-;;28243:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24321:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20620:523;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18624:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18558:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24664:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26184:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25914:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14833:94;;;;;;;;;;;;;:::i;:::-;;18591:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14182:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24952:88;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37614;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18531:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21155:929;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27244:289;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25160:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25408:78;;;;;;;;;;;;;:::i;:::-;;28499:326;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22096:1073;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37789:622;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24771:77;;;;;;;;;;;;;:::i;:::-;;38423:197;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27604:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15082:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25591:259;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19702:359;19787:4;19827:25;19812:40;;;:11;:40;;;;:109;;;;19888:33;19873:48;;;:11;:48;;;;19812:109;:170;;;;19957:25;19942:40;;;:11;:40;;;;19812:170;:241;;;;20018:35;;;20003:50;;;:11;:50;;;;19812:241;19804:249;;19702:359;;;:::o;37473:84::-;37512:13;37544:5;37537:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37473:84;:::o;26951:221::-;27027:7;27055:16;27063:7;27055;:16::i;:::-;27047:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27140:15;:24;27156:7;27140:24;;;;;;;;;;;;;;;;;;;;;27133:31;;26951:221;;;:::o;26485:400::-;26566:13;26582:16;26590:7;26582;:16::i;:::-;26566:32;;26623:5;26617:11;;:2;:11;;;;26609:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;26715:5;26701:19;;:10;:19;;;:58;;;;26724:35;26741:5;26748:10;26724:16;:35::i;:::-;26701:58;26679:164;;;;;;;;;;;;:::i;:::-;;;;;;;;;26856:21;26865:2;26869:7;26856:8;:21::i;:::-;26555:330;26485:400;;:::o;25048:100::-;14413:12;:10;:12::i;:::-;14402:23;;:7;:5;:7::i;:::-;:23;;;14394:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;25132:8:::1;25118:11;:22;;;;25048:100:::0;:::o;23177:1073::-;16122:11;;;;;;;;;;;16121:12;16113:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;16199:4;16185:11;;:18;;;;;;;;;;;;;;;;;;23249::::1;23270:5;;;;;;;;;;;:15;;;23286:12;:10;:12::i;:::-;23270:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23249:50;;23331:1;23318:10;:14;23310:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;23411:11;;23405:3;:17;;;;:::i;:::-;23392:9;:30;;23384:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;23493:11;;23477:12;;23471:3;:18;;;;:::i;:::-;23470:34;23462:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;23558:10;;;;;;;;;;;23550:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;23615:21;23639:12;;23615:36;;23752:14;23769:9;23752:26;;23789:15;23814:11;;23808:3;:17;;;;:::i;:::-;23789:37;;23837:18;23867:7;23858:6;:16;;;;:::i;:::-;23837:37;;23922:9;23918:132;23941:3;23937:1;:7;23918:132;;;23966:42;23976:12;:10;:12::i;:::-;24006:1;23990:13;:17;;;;:::i;:::-;23966:9;:42::i;:::-;24023:12;;:15;;;;;;;;;:::i;:::-;;;;;;23946:3;;;;;:::i;:::-;;;;23918:132;;;;24087:1;24074:10;:14;24070:173;;;24105:12;24123:10;:15;;24146:10;24123:38;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24104:57;;;24184:7;24176:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;24089:154;24070:173;23238:1012;;;;;16240:5:::0;16226:11;;:19;;;;;;;;;;;;;;;;;;23177:1073;:::o;36417:215::-;36534:6;36594:30;;;36587:37;;36417:215;;;;;;;:::o;25270:126::-;25316:7;25343:12;;25336:19;;25270:126;:::o;27835:337::-;28030:39;28049:10;28061:7;28030:18;:39::i;:::-;28022:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;28136:28;28146:4;28152:2;28156:7;28136:9;:28::i;:::-;27835:337;;;:::o;18450:22::-;;;;;;;;;;;;;:::o;24860:80::-;14413:12;:10;:12::i;:::-;14402:23;;:7;:5;:7::i;:::-;:23;;;14394:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;24927:5:::1;24914:10;;:18;;;;;;;;;;;;;;;;;;24860:80::o:0;25498:81::-;14413:12;:10;:12::i;:::-;14402:23;;:7;:5;:7::i;:::-;:23;;;14394:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;25566:5:::1;25552:11;;:19;;;;;;;;;;;;;;;;;;25498:81::o:0;20143:463::-;14413:12;:10;:12::i;:::-;14402:23;;:7;:5;:7::i;:::-;:23;;;14394:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;20238:15:::1;20287:3;20281:2;20257:21;:26;;;;:::i;:::-;20256:34;;;;:::i;:::-;20238:52;;20301:19;20354:3;20348:2;20324:21;:26;;;;:::i;:::-;20323:34;;;;:::i;:::-;20301:56;;20379:12;20397:8;;;;;;;;;;;:13;;20418:11;20397:37;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20378:56;;;20453:7;20445:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;20514:4;;;;;;;;;;;:9;;20531:7;20514:29;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20500:43;;;;;20562:7;20554:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;20182:424;;;20143:463::o:0;28243:185::-;28381:39;28398:4;28404:2;28408:7;28381:39;;;;;;;;;;;;:16;:39::i;:::-;28243:185;;;:::o;24321:125::-;24396:16;24404:7;24396;:16::i;:::-;24380:32;;:12;:10;:12::i;:::-;:32;;;24372:41;;;;;;24424:14;24430:7;24424:5;:14::i;:::-;24321:125;:::o;20620:523::-;14413:12;:10;:12::i;:::-;14402:23;;:7;:5;:7::i;:::-;:23;;;14394:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;20726:12:::1;;20719:3;20704:12;;:18;;;;:::i;:::-;20703:35;20695:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;20804:11;;20797:3;20782:12;;:18;;;;:::i;:::-;20781:34;20773:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;20858:21;20882:12;;20858:36;;20964:9;20960:176;20983:3;20979:1;:7;20960:176;;;21008:33;21018:3;21039:1;21023:13;:17;;;;:::i;:::-;21008:9;:33::i;:::-;21056:12;;:15;;;;;;;;;:::i;:::-;;;;;;20988:3;;;;;:::i;:::-;;;;20960:176;;;;20684:459;20620:523:::0;;:::o;18624:27::-;;;;:::o;18558:26::-;;;;:::o;24664:95::-;14413:12;:10;:12::i;:::-;14402:23;;:7;:5;:7::i;:::-;:23;;;14394:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;24745:6:::1;24734:8;:17;;;;;;;;;;;;:::i;:::-;;24664:95:::0;:::o;26184:239::-;26256:7;26276:13;26292:7;:16;26300:7;26292:16;;;;;;;;;;;;;;;;;;;;;26276:32;;26344:1;26327:19;;:5;:19;;;;26319:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26410:5;26403:12;;;26184:239;;;:::o;25914:208::-;25986:7;26031:1;26014:19;;:5;:19;;;;26006:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;26098:9;:16;26108:5;26098:16;;;;;;;;;;;;;;;;26091:23;;25914:208;;;:::o;14833:94::-;14413:12;:10;:12::i;:::-;14402:23;;:7;:5;:7::i;:::-;:23;;;14394:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14898:21:::1;14916:1;14898:9;:21::i;:::-;14833:94::o:0;18591:26::-;;;;:::o;14182:87::-;14228:7;14255:6;;;;;;;;;;;14248:13;;14182:87;:::o;24952:88::-;14413:12;:10;:12::i;:::-;14402:23;;:7;:5;:7::i;:::-;:23;;;14394:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;25024:8:::1;25016:5;:16;;;;24952:88:::0;:::o;37614:::-;37655:13;37687:7;37680:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37614:88;:::o;18531:20::-;;;;:::o;21155:929::-;16122:11;;;;;;;;;;;16121:12;16113:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;16199:4;16185:11;;:18;;;;;;;;;;;;;;;;;;21249:5:::1;;21243:3;:11;;;;:::i;:::-;21230:9;:24;;21222:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;21325:11;;21309:12;;21303:3;:18;;;;:::i;:::-;21302:34;21294:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;21390:10;;;;;;;;;;;21382:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;21455:21;21479:12;;21455:36;;21592:14;21609:9;21592:26;;21629:15;21654:5;;21648:3;:11;;;;:::i;:::-;21629:31;;21671:18;21701:7;21692:6;:16;;;;:::i;:::-;21671:37;;21756:9;21752:132;21775:3;21771:1;:7;21752:132;;;21800:42;21810:12;:10;:12::i;:::-;21840:1;21824:13;:17;;;;:::i;:::-;21800:9;:42::i;:::-;21857:12;;:15;;;;;;;;;:::i;:::-;;;;;;21780:3;;;;;:::i;:::-;;;;21752:132;;;;21921:1;21908:10;:14;21904:173;;;21939:12;21957:10;:15;;21980:10;21957:38;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21938:57;;;22018:7;22010:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;21923:154;21904:173;21211:873;;;;16240:5:::0;16226:11;;:19;;;;;;;;;;;;;;;;;;21155:929;:::o;27244:289::-;27359:10;27347:22;;:8;:22;;;;27339:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;27455:8;27412:18;:30;27431:10;27412:30;;;;;;;;;;;;;;;:40;27443:8;27412:40;;;;;;;;;;;;;;;;:51;;;;;;;;;;;;;;;;;;27506:8;27479:46;;27494:10;27479:46;;;27516:8;27479:46;;;;;;:::i;:::-;;;;;;;;27244:289;;:::o;25160:102::-;14413:12;:10;:12::i;:::-;14402:23;;:7;:5;:7::i;:::-;:23;;;14394:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;25245:9:::1;25231:11;:23;;;;25160:102:::0;:::o;25408:78::-;14413:12;:10;:12::i;:::-;14402:23;;:7;:5;:7::i;:::-;:23;;;14394:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;25474:4:::1;25460:11;;:18;;;;;;;;;;;;;;;;;;25408:78::o:0;28499:326::-;28674:39;28693:10;28705:7;28674:18;:39::i;:::-;28666:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;28778:39;28792:4;28798:2;28802:7;28811:5;28778:13;:39::i;:::-;28499:326;;;;:::o;22096:1073::-;16122:11;;;;;;;;;;;16121:12;16113:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;16199:4;16185:11;;:18;;;;;;;;;;;;;;;;;;22166::::1;22187:3;;;;;;;;;;;:13;;;22201:12;:10;:12::i;:::-;22187:27;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;22166:48;;22246:1;22233:10;:14;22225:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;22332:11;;22326:3;:17;;;;:::i;:::-;22313:9;:30;;22305:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;22414:11;;22398:12;;22392:3;:18;;;;:::i;:::-;22391:34;22383:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;22479:10;;;;;;;;;;;22471:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;22534:21;22558:12;;22534:36;;22671:14;22688:9;22671:26;;22708:15;22733:11;;22727:3;:17;;;;:::i;:::-;22708:37;;22756:18;22786:7;22777:6;:16;;;;:::i;:::-;22756:37;;22841:9;22837:132;22860:3;22856:1;:7;22837:132;;;22885:42;22895:12;:10;:12::i;:::-;22925:1;22909:13;:17;;;;:::i;:::-;22885:9;:42::i;:::-;22942:12;;:15;;;;;;;;;:::i;:::-;;;;;;22865:3;;;;;:::i;:::-;;;;22837:132;;;;23006:1;22993:10;:14;22989:173;;;23024:12;23042:10;:15;;23065:10;23042:38;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23023:57;;;23103:7;23095:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;23008:154;22989:173;22155:1014;;;;;16240:5:::0;16226:11;;:19;;;;;;;;;;;;;;;;;;22096:1073;:::o;37789:622::-;37847:13;37880:16;37888:7;37880;:16::i;:::-;37872:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;37969:22;38016:11;;;;;;;;;;;38012:356;;;38101:100;;;;;;;:::i;:::-;;;;;;;;;;;;;38083:119;;38012:356;;;38328:8;38338:7;38311:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;38293:63;;38012:356;38395:8;38388:15;;;37789:622;;;:::o;24771:77::-;14413:12;:10;:12::i;:::-;14402:23;;:7;:5;:7::i;:::-;:23;;;14394:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;24836:4:::1;24823:10;;:17;;;;;;;;;;;;;;;;;;24771:77::o:0;38423:197::-;38467:13;38511:100;;;;;;;:::i;:::-;;;;;;;;;;;;;38497:115;;38423:197;:::o;27604:164::-;27701:4;27725:18;:25;27744:5;27725:25;;;;;;;;;;;;;;;:35;27751:8;27725:35;;;;;;;;;;;;;;;;;;;;;;;;;27718:42;;27604:164;;;;:::o;15082:192::-;14413:12;:10;:12::i;:::-;14402:23;;:7;:5;:7::i;:::-;:23;;;14394:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;15191:1:::1;15171:22;;:8;:22;;;;15163:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;15247:19;15257:8;15247:9;:19::i;:::-;15082:192:::0;:::o;25591:259::-;25656:7;25798:6;25771:9;:23;25781:12;25771:23;;;;;;;;;;;;;;;;:34;;;;:::i;:::-;25764:41;;25591:259;;;:::o;30335:127::-;30400:4;30452:1;30424:30;;:7;:16;30432:7;30424:16;;;;;;;;;;;;;;;;;;;;;:30;;;;30417:37;;30335:127;;;:::o;34296:167::-;34398:2;34371:15;:24;34387:7;34371:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;34447:7;34443:2;34416:39;;34425:16;34433:7;34425;:16::i;:::-;34416:39;;;;;;;;;;;;34296:167;;:::o;13565:98::-;13618:7;13645:10;13638:17;;13565:98;:::o;31312:110::-;31388:26;31398:2;31402:7;31388:26;;;;;;;;;;;;:9;:26::i;:::-;31312:110;;:::o;30629:341::-;30722:4;30747:16;30755:7;30747;:16::i;:::-;30739:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30823:13;30839:16;30847:7;30839;:16::i;:::-;30823:32;;30885:5;30874:16;;:7;:16;;;:51;;;;30918:7;30894:31;;:20;30906:7;30894:11;:20::i;:::-;:31;;;30874:51;:87;;;;30929:32;30946:5;30953:7;30929:16;:32::i;:::-;30874:87;30866:96;;;30629:341;;;;:::o;33607:571::-;33759:4;33739:24;;:16;33747:7;33739;:16::i;:::-;:24;;;33731:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;33842:1;33828:16;;:2;:16;;;;33820:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;33898:39;33919:4;33925:2;33929:7;33898:20;:39::i;:::-;34002:29;34019:1;34023:7;34002:8;:29::i;:::-;34063:1;34044:9;:15;34054:4;34044:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;34092:1;34075:9;:13;34085:2;34075:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34123:2;34104:7;:16;34112:7;34104:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;34162:7;34158:2;34143:27;;34152:4;34143:27;;;;;;;;;;;;33607:571;;;:::o;32917:353::-;32977:13;32993:16;33001:7;32993;:16::i;:::-;32977:32;;33022:48;33043:5;33058:1;33062:7;33022:20;:48::i;:::-;33111:29;33128:1;33132:7;33111:8;:29::i;:::-;33173:1;33153:9;:16;33163:5;33153:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;33192:7;:16;33200:7;33192:16;;;;;;;;;;;;33185:23;;;;;;;;;;;33254:7;33250:1;33226:36;;33235:5;33226:36;;;;;;;;;;;;32966:304;32917:353;:::o;15282:173::-;15338:16;15357:6;;;;;;;;;;;15338:25;;15383:8;15374:6;;:17;;;;;;;;;;;;;;;;;;15438:8;15407:40;;15428:8;15407:40;;;;;;;;;;;;15327:128;15282:173;:::o;29707:315::-;29864:28;29874:4;29880:2;29884:7;29864:9;:28::i;:::-;29911:48;29934:4;29940:2;29944:7;29953:5;29911:22;:48::i;:::-;29903:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;29707:315;;;;:::o;31649:321::-;31779:18;31785:2;31789:7;31779:5;:18::i;:::-;31830:54;31861:1;31865:2;31869:7;31878:5;31830:22;:54::i;:::-;31808:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;31649:321;;;:::o;37204:126::-;;;;:::o;35028:801::-;35183:4;35204:15;:2;:13;;;:15::i;:::-;35200:622;;;35256:2;35240:36;;;35277:10;35289:4;35295:7;35304:5;35240:70;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;35236:531;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35501:1;35484:6;:13;:18;35480:272;;;35527:60;;;;;;;;;;:::i;:::-;;;;;;;;35480:272;35702:6;35696:13;35687:6;35683:2;35679:15;35672:38;35236:531;35371:45;;;35361:55;;;:6;:55;;;;35354:62;;;;;35200:622;35806:4;35799:11;;35028:801;;;;;;;:::o;32306:382::-;32400:1;32386:16;;:2;:16;;;;32378:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;32459:16;32467:7;32459;:16::i;:::-;32458:17;32450:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;32521:45;32550:1;32554:2;32558:7;32521:20;:45::i;:::-;32596:1;32579:9;:13;32589:2;32579:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32627:2;32608:7;:16;32616:7;32608:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32672:7;32668:2;32647:33;;32664:1;32647:33;;;;;;;;;;;;32306:382;;:::o;6418:387::-;6478:4;6686:12;6753:7;6741:20;6733:28;;6796:1;6789:4;:8;6782:15;;;6418:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:552::-;1485:8;1495:6;1545:3;1538:4;1530:6;1526:17;1522:27;1512:122;;1553:79;;:::i;:::-;1512:122;1666:6;1653:20;1643:30;;1696:18;1688:6;1685:30;1682:117;;;1718:79;;:::i;:::-;1682:117;1832:4;1824:6;1820:17;1808:29;;1886:3;1878:4;1870:6;1866:17;1856:8;1852:32;1849:41;1846:128;;;1893:79;;:::i;:::-;1846:128;1428:552;;;;;:::o;1999:338::-;2054:5;2103:3;2096:4;2088:6;2084:17;2080:27;2070:122;;2111:79;;:::i;:::-;2070:122;2228:6;2215:20;2253:78;2327:3;2319:6;2312:4;2304:6;2300:17;2253:78;:::i;:::-;2244:87;;2060:277;1999:338;;;;:::o;2357:340::-;2413:5;2462:3;2455:4;2447:6;2443:17;2439:27;2429:122;;2470:79;;:::i;:::-;2429:122;2587:6;2574:20;2612:79;2687:3;2679:6;2672:4;2664:6;2660:17;2612:79;:::i;:::-;2603:88;;2419:278;2357:340;;;;:::o;2703:139::-;2749:5;2787:6;2774:20;2765:29;;2803:33;2830:5;2803:33;:::i;:::-;2703:139;;;;:::o;2848:143::-;2905:5;2936:6;2930:13;2921:22;;2952:33;2979:5;2952:33;:::i;:::-;2848:143;;;;:::o;2997:329::-;3056:6;3105:2;3093:9;3084:7;3080:23;3076:32;3073:119;;;3111:79;;:::i;:::-;3073:119;3231:1;3256:53;3301:7;3292:6;3281:9;3277:22;3256:53;:::i;:::-;3246:63;;3202:117;2997:329;;;;:::o;3332:474::-;3400:6;3408;3457:2;3445:9;3436:7;3432:23;3428:32;3425:119;;;3463:79;;:::i;:::-;3425:119;3583:1;3608:53;3653:7;3644:6;3633:9;3629:22;3608:53;:::i;:::-;3598:63;;3554:117;3710:2;3736:53;3781:7;3772:6;3761:9;3757:22;3736:53;:::i;:::-;3726:63;;3681:118;3332:474;;;;;:::o;3812:619::-;3889:6;3897;3905;3954:2;3942:9;3933:7;3929:23;3925:32;3922:119;;;3960:79;;:::i;:::-;3922:119;4080:1;4105:53;4150:7;4141:6;4130:9;4126:22;4105:53;:::i;:::-;4095:63;;4051:117;4207:2;4233:53;4278:7;4269:6;4258:9;4254:22;4233:53;:::i;:::-;4223:63;;4178:118;4335:2;4361:53;4406:7;4397:6;4386:9;4382:22;4361:53;:::i;:::-;4351:63;;4306:118;3812:619;;;;;:::o;4437:963::-;4534:6;4542;4550;4558;4566;4615:3;4603:9;4594:7;4590:23;4586:33;4583:120;;;4622:79;;:::i;:::-;4583:120;4742:1;4767:53;4812:7;4803:6;4792:9;4788:22;4767:53;:::i;:::-;4757:63;;4713:117;4869:2;4895:53;4940:7;4931:6;4920:9;4916:22;4895:53;:::i;:::-;4885:63;;4840:118;4997:2;5023:53;5068:7;5059:6;5048:9;5044:22;5023:53;:::i;:::-;5013:63;;4968:118;5153:2;5142:9;5138:18;5125:32;5184:18;5176:6;5173:30;5170:117;;;5206:79;;:::i;:::-;5170:117;5319:64;5375:7;5366:6;5355:9;5351:22;5319:64;:::i;:::-;5301:82;;;;5096:297;4437:963;;;;;;;;:::o;5406:943::-;5501:6;5509;5517;5525;5574:3;5562:9;5553:7;5549:23;5545:33;5542:120;;;5581:79;;:::i;:::-;5542:120;5701:1;5726:53;5771:7;5762:6;5751:9;5747:22;5726:53;:::i;:::-;5716:63;;5672:117;5828:2;5854:53;5899:7;5890:6;5879:9;5875:22;5854:53;:::i;:::-;5844:63;;5799:118;5956:2;5982:53;6027:7;6018:6;6007:9;6003:22;5982:53;:::i;:::-;5972:63;;5927:118;6112:2;6101:9;6097:18;6084:32;6143:18;6135:6;6132:30;6129:117;;;6165:79;;:::i;:::-;6129:117;6270:62;6324:7;6315:6;6304:9;6300:22;6270:62;:::i;:::-;6260:72;;6055:287;5406:943;;;;;;;:::o;6355:468::-;6420:6;6428;6477:2;6465:9;6456:7;6452:23;6448:32;6445:119;;;6483:79;;:::i;:::-;6445:119;6603:1;6628:53;6673:7;6664:6;6653:9;6649:22;6628:53;:::i;:::-;6618:63;;6574:117;6730:2;6756:50;6798:7;6789:6;6778:9;6774:22;6756:50;:::i;:::-;6746:60;;6701:115;6355:468;;;;;:::o;6829:474::-;6897:6;6905;6954:2;6942:9;6933:7;6929:23;6925:32;6922:119;;;6960:79;;:::i;:::-;6922:119;7080:1;7105:53;7150:7;7141:6;7130:9;7126:22;7105:53;:::i;:::-;7095:63;;7051:117;7207:2;7233:53;7278:7;7269:6;7258:9;7254:22;7233:53;:::i;:::-;7223:63;;7178:118;6829:474;;;;;:::o;7309:327::-;7367:6;7416:2;7404:9;7395:7;7391:23;7387:32;7384:119;;;7422:79;;:::i;:::-;7384:119;7542:1;7567:52;7611:7;7602:6;7591:9;7587:22;7567:52;:::i;:::-;7557:62;;7513:116;7309:327;;;;:::o;7642:349::-;7711:6;7760:2;7748:9;7739:7;7735:23;7731:32;7728:119;;;7766:79;;:::i;:::-;7728:119;7886:1;7911:63;7966:7;7957:6;7946:9;7942:22;7911:63;:::i;:::-;7901:73;;7857:127;7642:349;;;;:::o;7997:509::-;8066:6;8115:2;8103:9;8094:7;8090:23;8086:32;8083:119;;;8121:79;;:::i;:::-;8083:119;8269:1;8258:9;8254:17;8241:31;8299:18;8291:6;8288:30;8285:117;;;8321:79;;:::i;:::-;8285:117;8426:63;8481:7;8472:6;8461:9;8457:22;8426:63;:::i;:::-;8416:73;;8212:287;7997:509;;;;:::o;8512:329::-;8571:6;8620:2;8608:9;8599:7;8595:23;8591:32;8588:119;;;8626:79;;:::i;:::-;8588:119;8746:1;8771:53;8816:7;8807:6;8796:9;8792:22;8771:53;:::i;:::-;8761:63;;8717:117;8512:329;;;;:::o;8847:351::-;8917:6;8966:2;8954:9;8945:7;8941:23;8937:32;8934:119;;;8972:79;;:::i;:::-;8934:119;9092:1;9117:64;9173:7;9164:6;9153:9;9149:22;9117:64;:::i;:::-;9107:74;;9063:128;8847:351;;;;:::o;9204:118::-;9291:24;9309:5;9291:24;:::i;:::-;9286:3;9279:37;9204:118;;:::o;9328:109::-;9409:21;9424:5;9409:21;:::i;:::-;9404:3;9397:34;9328:109;;:::o;9443:115::-;9528:23;9545:5;9528:23;:::i;:::-;9523:3;9516:36;9443:115;;:::o;9564:360::-;9650:3;9678:38;9710:5;9678:38;:::i;:::-;9732:70;9795:6;9790:3;9732:70;:::i;:::-;9725:77;;9811:52;9856:6;9851:3;9844:4;9837:5;9833:16;9811:52;:::i;:::-;9888:29;9910:6;9888:29;:::i;:::-;9883:3;9879:39;9872:46;;9654:270;9564:360;;;;:::o;9930:364::-;10018:3;10046:39;10079:5;10046:39;:::i;:::-;10101:71;10165:6;10160:3;10101:71;:::i;:::-;10094:78;;10181:52;10226:6;10221:3;10214:4;10207:5;10203:16;10181:52;:::i;:::-;10258:29;10280:6;10258:29;:::i;:::-;10253:3;10249:39;10242:46;;10022:272;9930:364;;;;:::o;10324:845::-;10427:3;10464:5;10458:12;10493:36;10519:9;10493:36;:::i;:::-;10545:89;10627:6;10622:3;10545:89;:::i;:::-;10538:96;;10665:1;10654:9;10650:17;10681:1;10676:137;;;;10827:1;10822:341;;;;10643:520;;10676:137;10760:4;10756:9;10745;10741:25;10736:3;10729:38;10796:6;10791:3;10787:16;10780:23;;10676:137;;10822:341;10889:38;10921:5;10889:38;:::i;:::-;10949:1;10963:154;10977:6;10974:1;10971:13;10963:154;;;11051:7;11045:14;11041:1;11036:3;11032:11;11025:35;11101:1;11092:7;11088:15;11077:26;;10999:4;10996:1;10992:12;10987:17;;10963:154;;;11146:6;11141:3;11137:16;11130:23;;10829:334;;10643:520;;10431:738;;10324:845;;;;:::o;11175:366::-;11317:3;11338:67;11402:2;11397:3;11338:67;:::i;:::-;11331:74;;11414:93;11503:3;11414:93;:::i;:::-;11532:2;11527:3;11523:12;11516:19;;11175:366;;;:::o;11547:::-;11689:3;11710:67;11774:2;11769:3;11710:67;:::i;:::-;11703:74;;11786:93;11875:3;11786:93;:::i;:::-;11904:2;11899:3;11895:12;11888:19;;11547:366;;;:::o;11919:::-;12061:3;12082:67;12146:2;12141:3;12082:67;:::i;:::-;12075:74;;12158:93;12247:3;12158:93;:::i;:::-;12276:2;12271:3;12267:12;12260:19;;11919:366;;;:::o;12291:::-;12433:3;12454:67;12518:2;12513:3;12454:67;:::i;:::-;12447:74;;12530:93;12619:3;12530:93;:::i;:::-;12648:2;12643:3;12639:12;12632:19;;12291:366;;;:::o;12663:::-;12805:3;12826:67;12890:2;12885:3;12826:67;:::i;:::-;12819:74;;12902:93;12991:3;12902:93;:::i;:::-;13020:2;13015:3;13011:12;13004:19;;12663:366;;;:::o;13035:::-;13177:3;13198:67;13262:2;13257:3;13198:67;:::i;:::-;13191:74;;13274:93;13363:3;13274:93;:::i;:::-;13392:2;13387:3;13383:12;13376:19;;13035:366;;;:::o;13407:::-;13549:3;13570:67;13634:2;13629:3;13570:67;:::i;:::-;13563:74;;13646:93;13735:3;13646:93;:::i;:::-;13764:2;13759:3;13755:12;13748:19;;13407:366;;;:::o;13779:::-;13921:3;13942:67;14006:2;14001:3;13942:67;:::i;:::-;13935:74;;14018:93;14107:3;14018:93;:::i;:::-;14136:2;14131:3;14127:12;14120:19;;13779:366;;;:::o;14151:::-;14293:3;14314:67;14378:2;14373:3;14314:67;:::i;:::-;14307:74;;14390:93;14479:3;14390:93;:::i;:::-;14508:2;14503:3;14499:12;14492:19;;14151:366;;;:::o;14523:::-;14665:3;14686:67;14750:2;14745:3;14686:67;:::i;:::-;14679:74;;14762:93;14851:3;14762:93;:::i;:::-;14880:2;14875:3;14871:12;14864:19;;14523:366;;;:::o;14895:::-;15037:3;15058:67;15122:2;15117:3;15058:67;:::i;:::-;15051:74;;15134:93;15223:3;15134:93;:::i;:::-;15252:2;15247:3;15243:12;15236:19;;14895:366;;;:::o;15267:::-;15409:3;15430:67;15494:2;15489:3;15430:67;:::i;:::-;15423:74;;15506:93;15595:3;15506:93;:::i;:::-;15624:2;15619:3;15615:12;15608:19;;15267:366;;;:::o;15639:::-;15781:3;15802:67;15866:2;15861:3;15802:67;:::i;:::-;15795:74;;15878:93;15967:3;15878:93;:::i;:::-;15996:2;15991:3;15987:12;15980:19;;15639:366;;;:::o;16011:::-;16153:3;16174:67;16238:2;16233:3;16174:67;:::i;:::-;16167:74;;16250:93;16339:3;16250:93;:::i;:::-;16368:2;16363:3;16359:12;16352:19;;16011:366;;;:::o;16383:::-;16525:3;16546:67;16610:2;16605:3;16546:67;:::i;:::-;16539:74;;16622:93;16711:3;16622:93;:::i;:::-;16740:2;16735:3;16731:12;16724:19;;16383:366;;;:::o;16755:::-;16897:3;16918:67;16982:2;16977:3;16918:67;:::i;:::-;16911:74;;16994:93;17083:3;16994:93;:::i;:::-;17112:2;17107:3;17103:12;17096:19;;16755:366;;;:::o;17127:::-;17269:3;17290:67;17354:2;17349:3;17290:67;:::i;:::-;17283:74;;17366:93;17455:3;17366:93;:::i;:::-;17484:2;17479:3;17475:12;17468:19;;17127:366;;;:::o;17499:::-;17641:3;17662:67;17726:2;17721:3;17662:67;:::i;:::-;17655:74;;17738:93;17827:3;17738:93;:::i;:::-;17856:2;17851:3;17847:12;17840:19;;17499:366;;;:::o;17871:400::-;18031:3;18052:84;18134:1;18129:3;18052:84;:::i;:::-;18045:91;;18145:93;18234:3;18145:93;:::i;:::-;18263:1;18258:3;18254:11;18247:18;;17871:400;;;:::o;18277:366::-;18419:3;18440:67;18504:2;18499:3;18440:67;:::i;:::-;18433:74;;18516:93;18605:3;18516:93;:::i;:::-;18634:2;18629:3;18625:12;18618:19;;18277:366;;;:::o;18649:::-;18791:3;18812:67;18876:2;18871:3;18812:67;:::i;:::-;18805:74;;18888:93;18977:3;18888:93;:::i;:::-;19006:2;19001:3;18997:12;18990:19;;18649:366;;;:::o;19021:::-;19163:3;19184:67;19248:2;19243:3;19184:67;:::i;:::-;19177:74;;19260:93;19349:3;19260:93;:::i;:::-;19378:2;19373:3;19369:12;19362:19;;19021:366;;;:::o;19393:::-;19535:3;19556:67;19620:2;19615:3;19556:67;:::i;:::-;19549:74;;19632:93;19721:3;19632:93;:::i;:::-;19750:2;19745:3;19741:12;19734:19;;19393:366;;;:::o;19765:::-;19907:3;19928:67;19992:2;19987:3;19928:67;:::i;:::-;19921:74;;20004:93;20093:3;20004:93;:::i;:::-;20122:2;20117:3;20113:12;20106:19;;19765:366;;;:::o;20137:402::-;20297:3;20318:85;20400:2;20395:3;20318:85;:::i;:::-;20311:92;;20412:93;20501:3;20412:93;:::i;:::-;20530:2;20525:3;20521:12;20514:19;;20137:402;;;:::o;20545:398::-;20704:3;20725:83;20806:1;20801:3;20725:83;:::i;:::-;20718:90;;20817:93;20906:3;20817:93;:::i;:::-;20935:1;20930:3;20926:11;20919:18;;20545:398;;;:::o;20949:366::-;21091:3;21112:67;21176:2;21171:3;21112:67;:::i;:::-;21105:74;;21188:93;21277:3;21188:93;:::i;:::-;21306:2;21301:3;21297:12;21290:19;;20949:366;;;:::o;21321:::-;21463:3;21484:67;21548:2;21543:3;21484:67;:::i;:::-;21477:74;;21560:93;21649:3;21560:93;:::i;:::-;21678:2;21673:3;21669:12;21662:19;;21321:366;;;:::o;21693:402::-;21853:3;21874:85;21956:2;21951:3;21874:85;:::i;:::-;21867:92;;21968:93;22057:3;21968:93;:::i;:::-;22086:2;22081:3;22077:12;22070:19;;21693:402;;;:::o;22101:366::-;22243:3;22264:67;22328:2;22323:3;22264:67;:::i;:::-;22257:74;;22340:93;22429:3;22340:93;:::i;:::-;22458:2;22453:3;22449:12;22442:19;;22101:366;;;:::o;22473:118::-;22560:24;22578:5;22560:24;:::i;:::-;22555:3;22548:37;22473:118;;:::o;22597:157::-;22702:45;22722:24;22740:5;22722:24;:::i;:::-;22702:45;:::i;:::-;22697:3;22690:58;22597:157;;:::o;22760:676::-;23018:3;23040:92;23128:3;23119:6;23040:92;:::i;:::-;23033:99;;23142:75;23213:3;23204:6;23142:75;:::i;:::-;23242:2;23237:3;23233:12;23226:19;;23262:148;23406:3;23262:148;:::i;:::-;23255:155;;23427:3;23420:10;;22760:676;;;;;:::o;23442:381::-;23627:3;23649:148;23793:3;23649:148;:::i;:::-;23642:155;;23814:3;23807:10;;23442:381;;;:::o;23829:379::-;24013:3;24035:147;24178:3;24035:147;:::i;:::-;24028:154;;24199:3;24192:10;;23829:379;;;:::o;24214:381::-;24399:3;24421:148;24565:3;24421:148;:::i;:::-;24414:155;;24586:3;24579:10;;24214:381;;;:::o;24601:222::-;24694:4;24732:2;24721:9;24717:18;24709:26;;24745:71;24813:1;24802:9;24798:17;24789:6;24745:71;:::i;:::-;24601:222;;;;:::o;24829:640::-;25024:4;25062:3;25051:9;25047:19;25039:27;;25076:71;25144:1;25133:9;25129:17;25120:6;25076:71;:::i;:::-;25157:72;25225:2;25214:9;25210:18;25201:6;25157:72;:::i;:::-;25239;25307:2;25296:9;25292:18;25283:6;25239:72;:::i;:::-;25358:9;25352:4;25348:20;25343:2;25332:9;25328:18;25321:48;25386:76;25457:4;25448:6;25386:76;:::i;:::-;25378:84;;24829:640;;;;;;;:::o;25475:210::-;25562:4;25600:2;25589:9;25585:18;25577:26;;25613:65;25675:1;25664:9;25660:17;25651:6;25613:65;:::i;:::-;25475:210;;;;:::o;25691:218::-;25782:4;25820:2;25809:9;25805:18;25797:26;;25833:69;25899:1;25888:9;25884:17;25875:6;25833:69;:::i;:::-;25691:218;;;;:::o;25915:313::-;26028:4;26066:2;26055:9;26051:18;26043:26;;26115:9;26109:4;26105:20;26101:1;26090:9;26086:17;26079:47;26143:78;26216:4;26207:6;26143:78;:::i;:::-;26135:86;;25915:313;;;;:::o;26234:419::-;26400:4;26438:2;26427:9;26423:18;26415:26;;26487:9;26481:4;26477:20;26473:1;26462:9;26458:17;26451:47;26515:131;26641:4;26515:131;:::i;:::-;26507:139;;26234:419;;;:::o;26659:::-;26825:4;26863:2;26852:9;26848:18;26840:26;;26912:9;26906:4;26902:20;26898:1;26887:9;26883:17;26876:47;26940:131;27066:4;26940:131;:::i;:::-;26932:139;;26659:419;;;:::o;27084:::-;27250:4;27288:2;27277:9;27273:18;27265:26;;27337:9;27331:4;27327:20;27323:1;27312:9;27308:17;27301:47;27365:131;27491:4;27365:131;:::i;:::-;27357:139;;27084:419;;;:::o;27509:::-;27675:4;27713:2;27702:9;27698:18;27690:26;;27762:9;27756:4;27752:20;27748:1;27737:9;27733:17;27726:47;27790:131;27916:4;27790:131;:::i;:::-;27782:139;;27509:419;;;:::o;27934:::-;28100:4;28138:2;28127:9;28123:18;28115:26;;28187:9;28181:4;28177:20;28173:1;28162:9;28158:17;28151:47;28215:131;28341:4;28215:131;:::i;:::-;28207:139;;27934:419;;;:::o;28359:::-;28525:4;28563:2;28552:9;28548:18;28540:26;;28612:9;28606:4;28602:20;28598:1;28587:9;28583:17;28576:47;28640:131;28766:4;28640:131;:::i;:::-;28632:139;;28359:419;;;:::o;28784:::-;28950:4;28988:2;28977:9;28973:18;28965:26;;29037:9;29031:4;29027:20;29023:1;29012:9;29008:17;29001:47;29065:131;29191:4;29065:131;:::i;:::-;29057:139;;28784:419;;;:::o;29209:::-;29375:4;29413:2;29402:9;29398:18;29390:26;;29462:9;29456:4;29452:20;29448:1;29437:9;29433:17;29426:47;29490:131;29616:4;29490:131;:::i;:::-;29482:139;;29209:419;;;:::o;29634:::-;29800:4;29838:2;29827:9;29823:18;29815:26;;29887:9;29881:4;29877:20;29873:1;29862:9;29858:17;29851:47;29915:131;30041:4;29915:131;:::i;:::-;29907:139;;29634:419;;;:::o;30059:::-;30225:4;30263:2;30252:9;30248:18;30240:26;;30312:9;30306:4;30302:20;30298:1;30287:9;30283:17;30276:47;30340:131;30466:4;30340:131;:::i;:::-;30332:139;;30059:419;;;:::o;30484:::-;30650:4;30688:2;30677:9;30673:18;30665:26;;30737:9;30731:4;30727:20;30723:1;30712:9;30708:17;30701:47;30765:131;30891:4;30765:131;:::i;:::-;30757:139;;30484:419;;;:::o;30909:::-;31075:4;31113:2;31102:9;31098:18;31090:26;;31162:9;31156:4;31152:20;31148:1;31137:9;31133:17;31126:47;31190:131;31316:4;31190:131;:::i;:::-;31182:139;;30909:419;;;:::o;31334:::-;31500:4;31538:2;31527:9;31523:18;31515:26;;31587:9;31581:4;31577:20;31573:1;31562:9;31558:17;31551:47;31615:131;31741:4;31615:131;:::i;:::-;31607:139;;31334:419;;;:::o;31759:::-;31925:4;31963:2;31952:9;31948:18;31940:26;;32012:9;32006:4;32002:20;31998:1;31987:9;31983:17;31976:47;32040:131;32166:4;32040:131;:::i;:::-;32032:139;;31759:419;;;:::o;32184:::-;32350:4;32388:2;32377:9;32373:18;32365:26;;32437:9;32431:4;32427:20;32423:1;32412:9;32408:17;32401:47;32465:131;32591:4;32465:131;:::i;:::-;32457:139;;32184:419;;;:::o;32609:::-;32775:4;32813:2;32802:9;32798:18;32790:26;;32862:9;32856:4;32852:20;32848:1;32837:9;32833:17;32826:47;32890:131;33016:4;32890:131;:::i;:::-;32882:139;;32609:419;;;:::o;33034:::-;33200:4;33238:2;33227:9;33223:18;33215:26;;33287:9;33281:4;33277:20;33273:1;33262:9;33258:17;33251:47;33315:131;33441:4;33315:131;:::i;:::-;33307:139;;33034:419;;;:::o;33459:::-;33625:4;33663:2;33652:9;33648:18;33640:26;;33712:9;33706:4;33702:20;33698:1;33687:9;33683:17;33676:47;33740:131;33866:4;33740:131;:::i;:::-;33732:139;;33459:419;;;:::o;33884:::-;34050:4;34088:2;34077:9;34073:18;34065:26;;34137:9;34131:4;34127:20;34123:1;34112:9;34108:17;34101:47;34165:131;34291:4;34165:131;:::i;:::-;34157:139;;33884:419;;;:::o;34309:::-;34475:4;34513:2;34502:9;34498:18;34490:26;;34562:9;34556:4;34552:20;34548:1;34537:9;34533:17;34526:47;34590:131;34716:4;34590:131;:::i;:::-;34582:139;;34309:419;;;:::o;34734:::-;34900:4;34938:2;34927:9;34923:18;34915:26;;34987:9;34981:4;34977:20;34973:1;34962:9;34958:17;34951:47;35015:131;35141:4;35015:131;:::i;:::-;35007:139;;34734:419;;;:::o;35159:::-;35325:4;35363:2;35352:9;35348:18;35340:26;;35412:9;35406:4;35402:20;35398:1;35387:9;35383:17;35376:47;35440:131;35566:4;35440:131;:::i;:::-;35432:139;;35159:419;;;:::o;35584:::-;35750:4;35788:2;35777:9;35773:18;35765:26;;35837:9;35831:4;35827:20;35823:1;35812:9;35808:17;35801:47;35865:131;35991:4;35865:131;:::i;:::-;35857:139;;35584:419;;;:::o;36009:::-;36175:4;36213:2;36202:9;36198:18;36190:26;;36262:9;36256:4;36252:20;36248:1;36237:9;36233:17;36226:47;36290:131;36416:4;36290:131;:::i;:::-;36282:139;;36009:419;;;:::o;36434:::-;36600:4;36638:2;36627:9;36623:18;36615:26;;36687:9;36681:4;36677:20;36673:1;36662:9;36658:17;36651:47;36715:131;36841:4;36715:131;:::i;:::-;36707:139;;36434:419;;;:::o;36859:::-;37025:4;37063:2;37052:9;37048:18;37040:26;;37112:9;37106:4;37102:20;37098:1;37087:9;37083:17;37076:47;37140:131;37266:4;37140:131;:::i;:::-;37132:139;;36859:419;;;:::o;37284:222::-;37377:4;37415:2;37404:9;37400:18;37392:26;;37428:71;37496:1;37485:9;37481:17;37472:6;37428:71;:::i;:::-;37284:222;;;;:::o;37512:129::-;37546:6;37573:20;;:::i;:::-;37563:30;;37602:33;37630:4;37622:6;37602:33;:::i;:::-;37512:129;;;:::o;37647:75::-;37680:6;37713:2;37707:9;37697:19;;37647:75;:::o;37728:307::-;37789:4;37879:18;37871:6;37868:30;37865:56;;;37901:18;;:::i;:::-;37865:56;37939:29;37961:6;37939:29;:::i;:::-;37931:37;;38023:4;38017;38013:15;38005:23;;37728:307;;;:::o;38041:308::-;38103:4;38193:18;38185:6;38182:30;38179:56;;;38215:18;;:::i;:::-;38179:56;38253:29;38275:6;38253:29;:::i;:::-;38245:37;;38337:4;38331;38327:15;38319:23;;38041:308;;;:::o;38355:141::-;38404:4;38427:3;38419:11;;38450:3;38447:1;38440:14;38484:4;38481:1;38471:18;38463:26;;38355:141;;;:::o;38502:98::-;38553:6;38587:5;38581:12;38571:22;;38502:98;;;:::o;38606:99::-;38658:6;38692:5;38686:12;38676:22;;38606:99;;;:::o;38711:168::-;38794:11;38828:6;38823:3;38816:19;38868:4;38863:3;38859:14;38844:29;;38711:168;;;;:::o;38885:147::-;38986:11;39023:3;39008:18;;38885:147;;;;:::o;39038:169::-;39122:11;39156:6;39151:3;39144:19;39196:4;39191:3;39187:14;39172:29;;39038:169;;;;:::o;39213:148::-;39315:11;39352:3;39337:18;;39213:148;;;;:::o;39367:305::-;39407:3;39426:20;39444:1;39426:20;:::i;:::-;39421:25;;39460:20;39478:1;39460:20;:::i;:::-;39455:25;;39614:1;39546:66;39542:74;39539:1;39536:81;39533:107;;;39620:18;;:::i;:::-;39533:107;39664:1;39661;39657:9;39650:16;;39367:305;;;;:::o;39678:185::-;39718:1;39735:20;39753:1;39735:20;:::i;:::-;39730:25;;39769:20;39787:1;39769:20;:::i;:::-;39764:25;;39808:1;39798:35;;39813:18;;:::i;:::-;39798:35;39855:1;39852;39848:9;39843:14;;39678:185;;;;:::o;39869:348::-;39909:7;39932:20;39950:1;39932:20;:::i;:::-;39927:25;;39966:20;39984:1;39966:20;:::i;:::-;39961:25;;40154:1;40086:66;40082:74;40079:1;40076:81;40071:1;40064:9;40057:17;40053:105;40050:131;;;40161:18;;:::i;:::-;40050:131;40209:1;40206;40202:9;40191:20;;39869:348;;;;:::o;40223:191::-;40263:4;40283:20;40301:1;40283:20;:::i;:::-;40278:25;;40317:20;40335:1;40317:20;:::i;:::-;40312:25;;40356:1;40353;40350:8;40347:34;;;40361:18;;:::i;:::-;40347:34;40406:1;40403;40399:9;40391:17;;40223:191;;;;:::o;40420:96::-;40457:7;40486:24;40504:5;40486:24;:::i;:::-;40475:35;;40420:96;;;:::o;40522:90::-;40556:7;40599:5;40592:13;40585:21;40574:32;;40522:90;;;:::o;40618:149::-;40654:7;40694:66;40687:5;40683:78;40672:89;;40618:149;;;:::o;40773:126::-;40810:7;40850:42;40843:5;40839:54;40828:65;;40773:126;;;:::o;40905:77::-;40942:7;40971:5;40960:16;;40905:77;;;:::o;40988:154::-;41072:6;41067:3;41062;41049:30;41134:1;41125:6;41120:3;41116:16;41109:27;40988:154;;;:::o;41148:307::-;41216:1;41226:113;41240:6;41237:1;41234:13;41226:113;;;41325:1;41320:3;41316:11;41310:18;41306:1;41301:3;41297:11;41290:39;41262:2;41259:1;41255:10;41250:15;;41226:113;;;41357:6;41354:1;41351:13;41348:101;;;41437:1;41428:6;41423:3;41419:16;41412:27;41348:101;41197:258;41148:307;;;:::o;41461:320::-;41505:6;41542:1;41536:4;41532:12;41522:22;;41589:1;41583:4;41579:12;41610:18;41600:81;;41666:4;41658:6;41654:17;41644:27;;41600:81;41728:2;41720:6;41717:14;41697:18;41694:38;41691:84;;;41747:18;;:::i;:::-;41691:84;41512:269;41461:320;;;:::o;41787:281::-;41870:27;41892:4;41870:27;:::i;:::-;41862:6;41858:40;42000:6;41988:10;41985:22;41964:18;41952:10;41949:34;41946:62;41943:88;;;42011:18;;:::i;:::-;41943:88;42051:10;42047:2;42040:22;41830:238;41787:281;;:::o;42074:233::-;42113:3;42136:24;42154:5;42136:24;:::i;:::-;42127:33;;42182:66;42175:5;42172:77;42169:103;;;42252:18;;:::i;:::-;42169:103;42299:1;42292:5;42288:13;42281:20;;42074:233;;;:::o;42313:79::-;42352:7;42381:5;42370:16;;42313:79;;;:::o;42398:180::-;42446:77;42443:1;42436:88;42543:4;42540:1;42533:15;42567:4;42564:1;42557:15;42584:180;42632:77;42629:1;42622:88;42729:4;42726:1;42719:15;42753:4;42750:1;42743:15;42770:180;42818:77;42815:1;42808:88;42915:4;42912:1;42905:15;42939:4;42936:1;42929:15;42956:180;43004:77;43001:1;42994:88;43101:4;43098:1;43091:15;43125:4;43122:1;43115:15;43142:117;43251:1;43248;43241:12;43265:117;43374:1;43371;43364:12;43388:117;43497:1;43494;43487:12;43511:117;43620:1;43617;43610:12;43634:117;43743:1;43740;43733:12;43757:117;43866:1;43863;43856:12;43880:102;43921:6;43972:2;43968:7;43963:2;43956:5;43952:14;43948:28;43938:38;;43880:102;;;:::o;43988:180::-;44128:32;44124:1;44116:6;44112:14;44105:56;43988:180;:::o;44174:222::-;44314:34;44310:1;44302:6;44298:14;44291:58;44383:5;44378:2;44370:6;44366:15;44359:30;44174:222;:::o;44402:237::-;44542:34;44538:1;44530:6;44526:14;44519:58;44611:20;44606:2;44598:6;44594:15;44587:45;44402:237;:::o;44645:225::-;44785:34;44781:1;44773:6;44769:14;44762:58;44854:8;44849:2;44841:6;44837:15;44830:33;44645:225;:::o;44876:178::-;45016:30;45012:1;45004:6;45000:14;44993:54;44876:178;:::o;45060:174::-;45200:26;45196:1;45188:6;45184:14;45177:50;45060:174;:::o;45240:223::-;45380:34;45376:1;45368:6;45364:14;45357:58;45449:6;45444:2;45436:6;45432:15;45425:31;45240:223;:::o;45469:175::-;45609:27;45605:1;45597:6;45593:14;45586:51;45469:175;:::o;45650:179::-;45790:31;45786:1;45778:6;45774:14;45767:55;45650:179;:::o;45835:231::-;45975:34;45971:1;45963:6;45959:14;45952:58;46044:14;46039:2;46031:6;46027:15;46020:39;45835:231;:::o;46072:223::-;46212:34;46208:1;46200:6;46196:14;46189:58;46281:6;46276:2;46268:6;46264:15;46257:31;46072:223;:::o;46301:::-;46441:34;46437:1;46429:6;46425:14;46418:58;46510:6;46505:2;46497:6;46493:15;46486:31;46301:223;:::o;46530:243::-;46670:34;46666:1;46658:6;46654:14;46647:58;46739:26;46734:2;46726:6;46722:15;46715:51;46530:243;:::o;46779:229::-;46919:34;46915:1;46907:6;46903:14;46896:58;46988:12;46983:2;46975:6;46971:15;46964:37;46779:229;:::o;47014:228::-;47154:34;47150:1;47142:6;47138:14;47131:58;47223:11;47218:2;47210:6;47206:15;47199:36;47014:228;:::o;47248:167::-;47388:19;47384:1;47376:6;47372:14;47365:43;47248:167;:::o;47421:182::-;47561:34;47557:1;47549:6;47545:14;47538:58;47421:182;:::o;47609:231::-;47749:34;47745:1;47737:6;47733:14;47726:58;47818:14;47813:2;47805:6;47801:15;47794:39;47609:231;:::o;47846:155::-;47986:7;47982:1;47974:6;47970:14;47963:31;47846:155;:::o;48007:182::-;48147:34;48143:1;48135:6;48131:14;48124:58;48007:182;:::o;48195:174::-;48335:26;48331:1;48323:6;48319:14;48312:50;48195:174;:::o;48375:228::-;48515:34;48511:1;48503:6;48499:14;48492:58;48584:11;48579:2;48571:6;48567:15;48560:36;48375:228;:::o;48609:234::-;48749:34;48745:1;48737:6;48733:14;48726:58;48818:17;48813:2;48805:6;48801:15;48794:42;48609:234;:::o;48849:220::-;48989:34;48985:1;48977:6;48973:14;48966:58;49058:3;49053:2;49045:6;49041:15;49034:28;48849:220;:::o;49075:316::-;49215:34;49211:1;49203:6;49199:14;49192:58;49288:34;49283:2;49275:6;49271:15;49264:59;49361:18;49356:2;49348:6;49344:15;49337:43;49075:316;:::o;49401:118::-;;:::o;49529:248::-;49673:34;49669:1;49661:6;49657:14;49650:58;49746:19;49741:2;49733:6;49729:15;49722:44;49529:248;:::o;49787:241::-;49931:34;49927:1;49919:6;49915:14;49908:58;50004:12;49999:2;49991:6;49987:15;49980:37;49787:241;:::o;50038:332::-;50182:34;50178:1;50170:6;50166:14;50159:58;50259:34;50254:2;50246:6;50242:15;50235:59;50336:18;50331:2;50323:6;50319:15;50312:43;50038:332;:::o;50384:185::-;50532:21;50528:1;50520:6;50516:14;50509:45;50384:185;:::o;50583:138::-;50664:24;50682:5;50664:24;:::i;:::-;50657:5;50654:35;50644:63;;50703:1;50700;50693:12;50644:63;50583:138;:::o;50735:132::-;50813:21;50828:5;50813:21;:::i;:::-;50806:5;50803:32;50793:60;;50849:1;50846;50839:12;50793:60;50735:132;:::o;50881:136::-;50961:23;50978:5;50961:23;:::i;:::-;50954:5;50951:34;50941:62;;50999:1;50996;50989:12;50941:62;50881:136;:::o;51031:138::-;51112:24;51130:5;51112:24;:::i;:::-;51105:5;51102:35;51092:63;;51151:1;51148;51141:12;51092:63;51031:138;:::o

Swarm Source

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