ETH Price: $3,298.39 (-3.31%)
Gas: 19 Gwei

Token

Angry Boars (BOARS)
 

Overview

Max Total Supply

10,000 BOARS

Holders

3,472

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 BOARS
0xad9921018099dad55c47f06c9aa7781b3a6c9267
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Angry Boars is a collection of 10,000 unique, randomly generated wild boars roaming on the Ethereum blockchain as ERC-721 NFTs. Every Angry Boar is unique and programmatically generated from over 250+ possible attributes and traits. Some boars are rarer than others.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
AngryBoars

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

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

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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


pragma solidity ^0.8.0;

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

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

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

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

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

}

pragma solidity ^0.8.0;

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

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        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");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

pragma solidity ^0.8.0;

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

pragma solidity ^0.8.0;

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


pragma solidity ^0.8.0;

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


pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

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

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

pragma solidity ^0.8.0;

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {

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

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

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




pragma solidity ^0.8.0;

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

    function _msgData() internal view virtual returns (bytes calldata) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

pragma solidity ^0.8.0;

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), 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 {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}


pragma solidity ^0.8.0;

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Base URI for computing {tokenURI}. Empty by default, can be overriden
     * in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;


contract AngryBoars is ERC721Enumerable, Ownable {
    using SafeMath for uint256;
    using Address for address;
    using Strings for uint256;

    uint256 public constant NFT_PRICE = 40000000000000000; // 0.04 ETH
    uint public constant MAX_NFT_PURCHASE = 10;
    uint public constant MAX_NFT_PURCHASE_PRESALE = 3;
    uint256 public MAX_SUPPLY = 10000;
    bool public saleIsActive = false;
    bool public presaleIsActive = false;
    bool public isMetadataLocked = false;
    uint256 public boarReserve = 100;

    // Faciliating the needed functionality for the presale
    mapping(address => bool) _allowList;
    mapping(address => uint256) _allowListClaimed;

    string private _baseURIExtended;
    mapping (uint256 => string) _tokenURIs;

    constructor() ERC721("Angry Boars","BOARS"){
        
    }
    
    // Presale functions
    function addToWhitelist(address[] memory addresses) public onlyOwner {
        for (uint256 i = 0; i < addresses.length; i++) {
          require(addresses[i] != address(0), "Can't add the null address");
        
          _allowList[addresses[i]] = true;
          _allowListClaimed[addresses[i]] > 0 ? _allowListClaimed[addresses[i]] : 0;
        }
    }
    
    function isWhitelisted (address addr) public view returns (bool) {
        return _allowList[addr];
    }    
    
    function removeFromAllowList(address[] calldata addresses) external onlyOwner {
        for (uint256 i = 0; i < addresses.length; i++) {
          require(addresses[i] != address(0), "Can't add the null address");
          _allowList[addresses[i]] = false;
        }
    }    
    
    function allowListClaimedBy(address owner) external view returns (uint256){
        require(owner != address(0), 'Zero address not on Allow List');
        
        return _allowListClaimed[owner];
    }    

    function flipSaleState() public onlyOwner {
        saleIsActive = !saleIsActive;
    }
    
    function lockMetadata() public onlyOwner {
        isMetadataLocked = true;
    }
    
    function flipPresaleState() public onlyOwner {
        presaleIsActive = !presaleIsActive;
    }

    function withdraw() public onlyOwner {
        uint balance = address(this).balance;
        payable(msg.sender).transfer(balance);
    }

    function reserveBoars(address _to, uint256 _reserveAmount)
        public
        onlyOwner
    {
        uint256 supply = totalSupply();
        require(
            _reserveAmount > 0 && _reserveAmount <= boarReserve,
            "Not enough reserve left for team"
        );
        for (uint256 i = 0; i < _reserveAmount; i++) {
            _safeMint(_to, supply + i);
        }
        boarReserve = boarReserve.sub(_reserveAmount);
    }

    function mintBoar(uint numberOfTokens) public payable {
        require(saleIsActive, "Sale is not active at the moment");
        require(numberOfTokens > 0, "Number of tokens can not be less than or equal to 0");
        require(totalSupply().add(numberOfTokens) <= MAX_SUPPLY.sub(boarReserve), "Purchase would exceed max supply of Boars");
        require(numberOfTokens <= MAX_NFT_PURCHASE,"Can only mint up to 15 per purchase");
        require(NFT_PRICE.mul(numberOfTokens) <= msg.value, "Sent ether value is incorrect");

        for (uint i = 0; i < numberOfTokens; i++) {
            _safeMint(msg.sender, totalSupply());
        }
    }
    
    function mintBoarPresale(uint numberOfTokens) public payable {
        require(presaleIsActive, "Presale is not active at the moment");
        require(_allowList[msg.sender] == true,"This address is not whitelisted for the presale.");
        require(_allowListClaimed[msg.sender] + numberOfTokens <= 3,"Exceeds supply of presale Boars you can mint.");
        require(numberOfTokens > 0, "Number of tokens can not be less than or equal to 0");
        require(NFT_PRICE.mul(numberOfTokens) <= msg.value, "Sent ether value is incorrect");
        
        for (uint i = 0; i < numberOfTokens; i++) {
            _safeMint(msg.sender,  totalSupply());
        }
        
        
        _allowListClaimed[msg.sender] += numberOfTokens;
    }

    function _baseURI() internal view virtual override returns (string memory) {
        return _baseURIExtended;
    }

    function setBaseURI(string memory baseURI_) external onlyOwner {
        require(!isMetadataLocked,"Metadata is locked");
        _baseURIExtended = baseURI_;
    }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI, '.json'));
        }
        // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI.
        return string(abi.encodePacked(base, tokenId.toString(), '.json'));
    }
}

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"},{"inputs":[],"name":"MAX_NFT_PURCHASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_NFT_PURCHASE_PRESALE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NFT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"addToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"allowListClaimedBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"boarReserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipPresaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSaleState","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":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isMetadataLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintBoar","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintBoarPresale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"removeFromAllowList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_reserveAmount","type":"uint256"}],"name":"reserveBoars","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":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052612710600b556000600c60006101000a81548160ff0219169083151502179055506000600c60016101000a81548160ff0219169083151502179055506000600c60026101000a81548160ff0219169083151502179055506064600d553480156200006d57600080fd5b506040518060400160405280600b81526020017f416e67727920426f6172730000000000000000000000000000000000000000008152506040518060400160405280600581526020017f424f4152530000000000000000000000000000000000000000000000000000008152508160009080519060200190620000f2929190620001cd565b5080600190805190602001906200010b929190620001cd565b505050600062000120620001c560201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350620002e2565b600033905090565b828054620001db906200027d565b90600052602060002090601f016020900481019282620001ff57600085556200024b565b82601f106200021a57805160ff19168380011785556200024b565b828001600101855582156200024b579182015b828111156200024a5782518255916020019190600101906200022d565b5b5090506200025a91906200025e565b5090565b5b80821115620002795760008160009055506001016200025f565b5090565b600060028204905060018216806200029657607f821691505b60208210811415620002ad57620002ac620002b3565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61525980620002f26000396000f3fe60806040526004361061022f5760003560e01c80636352211e1161012e578063a51312c8116100ab578063d7e45cd71161006f578063d7e45cd71461080c578063e985e9c514610837578063eb8d244414610874578063f2fde38b1461089f578063f81227d4146108c85761022f565b8063a51312c814610745578063b1d1c5351461076e578063b88d4fde1461078a578063ba217f14146107b3578063c87b56dd146107cf5761022f565b80638da5cb5b116100f25780638da5cb5b1461068457806395d89b41146106af578063989bdbb6146106da578063a06a513f146106f1578063a22cb4651461071c5761022f565b80636352211e1461059f578063676dd563146105dc57806370a0823114610607578063715018a6146106445780637f6497831461065b5761022f565b806323b872dd116101bc5780633af32abf116101805780633af32abf146104bc5780633ccfd60b146104f957806342842e0e146105105780634f6ccce71461053957806355f804b3146105765761022f565b806323b872dd146103e95780632f745c591461041257806330f72cd41461044f57806332cb6b0c1461047a57806334918dfd146104a55761022f565b8063081812fc11610203578063081812fc14610304578063095ea7b31461034157806318160ddd1461036a57806322f69c70146103955780632314af43146103c05761022f565b806208ffdd1461023457806301ffc9a714610271578063020b39cc146102ae57806306fdde03146102d9575b600080fd5b34801561024057600080fd5b5061025b6004803603810190610256919061380d565b6108df565b60405161026891906144d6565b60405180910390f35b34801561027d57600080fd5b5061029860048036038101906102939190613a66565b610997565b6040516102a591906140d9565b60405180910390f35b3480156102ba57600080fd5b506102c3610a11565b6040516102d091906144d6565b60405180910390f35b3480156102e557600080fd5b506102ee610a16565b6040516102fb91906140f4565b60405180910390f35b34801561031057600080fd5b5061032b60048036038101906103269190613b09565b610aa8565b6040516103389190614072565b60405180910390f35b34801561034d57600080fd5b5061036860048036038101906103639190613990565b610b2d565b005b34801561037657600080fd5b5061037f610c45565b60405161038c91906144d6565b60405180910390f35b3480156103a157600080fd5b506103aa610c52565b6040516103b791906144d6565b60405180910390f35b3480156103cc57600080fd5b506103e760048036038101906103e29190613990565b610c58565b005b3480156103f557600080fd5b50610410600480360381019061040b919061387a565b610d85565b005b34801561041e57600080fd5b5061043960048036038101906104349190613990565b610de5565b60405161044691906144d6565b60405180910390f35b34801561045b57600080fd5b50610464610e8a565b60405161047191906140d9565b60405180910390f35b34801561048657600080fd5b5061048f610e9d565b60405161049c91906144d6565b60405180910390f35b3480156104b157600080fd5b506104ba610ea3565b005b3480156104c857600080fd5b506104e360048036038101906104de919061380d565b610f4b565b6040516104f091906140d9565b60405180910390f35b34801561050557600080fd5b5061050e610fa1565b005b34801561051c57600080fd5b506105376004803603810190610532919061387a565b61106c565b005b34801561054557600080fd5b50610560600480360381019061055b9190613b09565b61108c565b60405161056d91906144d6565b60405180910390f35b34801561058257600080fd5b5061059d60048036038101906105989190613ac0565b6110fd565b005b3480156105ab57600080fd5b506105c660048036038101906105c19190613b09565b6111e3565b6040516105d39190614072565b60405180910390f35b3480156105e857600080fd5b506105f1611295565b6040516105fe91906144d6565b60405180910390f35b34801561061357600080fd5b5061062e6004803603810190610629919061380d565b6112a0565b60405161063b91906144d6565b60405180910390f35b34801561065057600080fd5b50610659611358565b005b34801561066757600080fd5b50610682600480360381019061067d9190613a1d565b611495565b005b34801561069057600080fd5b506106996116f4565b6040516106a69190614072565b60405180910390f35b3480156106bb57600080fd5b506106c461171e565b6040516106d191906140f4565b60405180910390f35b3480156106e657600080fd5b506106ef6117b0565b005b3480156106fd57600080fd5b50610706611849565b60405161071391906144d6565b60405180910390f35b34801561072857600080fd5b50610743600480360381019061073e9190613950565b61184e565b005b34801561075157600080fd5b5061076c600480360381019061076791906139d0565b6119cf565b005b61078860048036038101906107839190613b09565b611b87565b005b34801561079657600080fd5b506107b160048036038101906107ac91906138cd565b611d5e565b005b6107cd60048036038101906107c89190613b09565b611dc0565b005b3480156107db57600080fd5b506107f660048036038101906107f19190613b09565b612058565b60405161080391906140f4565b60405180910390f35b34801561081857600080fd5b506108216121cb565b60405161082e91906140d9565b60405180910390f35b34801561084357600080fd5b5061085e6004803603810190610859919061383a565b6121de565b60405161086b91906140d9565b60405180910390f35b34801561088057600080fd5b50610889612272565b60405161089691906140d9565b60405180910390f35b3480156108ab57600080fd5b506108c660048036038101906108c1919061380d565b612285565b005b3480156108d457600080fd5b506108dd612431565b005b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610950576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094790614376565b60405180910390fd5b600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a0a5750610a09826124d9565b5b9050919050565b600a81565b606060008054610a25906147b2565b80601f0160208091040260200160405190810160405280929190818152602001828054610a51906147b2565b8015610a9e5780601f10610a7357610100808354040283529160200191610a9e565b820191906000526020600020905b815481529060010190602001808311610a8157829003601f168201915b5050505050905090565b6000610ab3826125bb565b610af2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae9906142f6565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b38826111e3565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ba9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba0906143f6565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bc8612627565b73ffffffffffffffffffffffffffffffffffffffff161480610bf75750610bf681610bf1612627565b6121de565b5b610c36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2d90614256565b60405180910390fd5b610c40838361262f565b505050565b6000600880549050905090565b600d5481565b610c60612627565b73ffffffffffffffffffffffffffffffffffffffff16610c7e6116f4565b73ffffffffffffffffffffffffffffffffffffffff1614610cd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ccb90614356565b60405180910390fd5b6000610cde610c45565b9050600082118015610cf25750600d548211155b610d31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d28906141d6565b60405180910390fd5b60005b82811015610d6457610d51848284610d4c91906145e7565b6126e8565b8080610d5c90614815565b915050610d34565b50610d7a82600d5461270690919063ffffffff16565b600d81905550505050565b610d96610d90612627565b8261271c565b610dd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dcc90614416565b60405180910390fd5b610de08383836127fa565b505050565b6000610df0836112a0565b8210610e31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2890614156565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600c60019054906101000a900460ff1681565b600b5481565b610eab612627565b73ffffffffffffffffffffffffffffffffffffffff16610ec96116f4565b73ffffffffffffffffffffffffffffffffffffffff1614610f1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1690614356565b60405180910390fd5b600c60009054906101000a900460ff1615600c60006101000a81548160ff021916908315150217905550565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b610fa9612627565b73ffffffffffffffffffffffffffffffffffffffff16610fc76116f4565b73ffffffffffffffffffffffffffffffffffffffff161461101d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101490614356565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611068573d6000803e3d6000fd5b5050565b61108783838360405180602001604052806000815250611d5e565b505050565b6000611096610c45565b82106110d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ce90614456565b60405180910390fd5b600882815481106110eb576110ea61494b565b5b90600052602060002001549050919050565b611105612627565b73ffffffffffffffffffffffffffffffffffffffff166111236116f4565b73ffffffffffffffffffffffffffffffffffffffff1614611179576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117090614356565b60405180910390fd5b600c60029054906101000a900460ff16156111c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c090614476565b60405180910390fd5b80601090805190602001906111df92919061352d565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561128c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128390614296565b60405180910390fd5b80915050919050565b668e1bc9bf04000081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611311576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130890614276565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611360612627565b73ffffffffffffffffffffffffffffffffffffffff1661137e6116f4565b73ffffffffffffffffffffffffffffffffffffffff16146113d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113cb90614356565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b61149d612627565b73ffffffffffffffffffffffffffffffffffffffff166114bb6116f4565b73ffffffffffffffffffffffffffffffffffffffff1614611511576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150890614356565b60405180910390fd5b60005b81518110156116f057600073ffffffffffffffffffffffffffffffffffffffff168282815181106115485761154761494b565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614156115a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159e90614396565b60405180910390fd5b6001600e60008484815181106115c0576115bf61494b565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600f60008484815181106116325761163161494b565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054116116815760006116dc565b600f60008383815181106116985761169761494b565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020545b5080806116e890614815565b915050611514565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461172d906147b2565b80601f0160208091040260200160405190810160405280929190818152602001828054611759906147b2565b80156117a65780601f1061177b576101008083540402835291602001916117a6565b820191906000526020600020905b81548152906001019060200180831161178957829003601f168201915b5050505050905090565b6117b8612627565b73ffffffffffffffffffffffffffffffffffffffff166117d66116f4565b73ffffffffffffffffffffffffffffffffffffffff161461182c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182390614356565b60405180910390fd5b6001600c60026101000a81548160ff021916908315150217905550565b600381565b611856612627565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118bb90614216565b60405180910390fd5b80600560006118d1612627565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661197e612627565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119c391906140d9565b60405180910390a35050565b6119d7612627565b73ffffffffffffffffffffffffffffffffffffffff166119f56116f4565b73ffffffffffffffffffffffffffffffffffffffff1614611a4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4290614356565b60405180910390fd5b60005b82829050811015611b8257600073ffffffffffffffffffffffffffffffffffffffff16838383818110611a8457611a8361494b565b5b9050602002016020810190611a99919061380d565b73ffffffffffffffffffffffffffffffffffffffff161415611af0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae790614396565b60405180910390fd5b6000600e6000858585818110611b0957611b0861494b565b5b9050602002016020810190611b1e919061380d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611b7a90614815565b915050611a4e565b505050565b600c60009054906101000a900460ff16611bd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bcd906144b6565b60405180910390fd5b60008111611c19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1090614136565b60405180910390fd5b611c30600d54600b5461270690919063ffffffff16565b611c4a82611c3c610c45565b612a5690919063ffffffff16565b1115611c8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8290614436565b60405180910390fd5b600a811115611ccf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc690614336565b60405180910390fd5b34611cea82668e1bc9bf040000612a6c90919063ffffffff16565b1115611d2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d22906142b6565b60405180910390fd5b60005b81811015611d5a57611d4733611d42610c45565b6126e8565b8080611d5290614815565b915050611d2e565b5050565b611d6f611d69612627565b8361271c565b611dae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da590614416565b60405180910390fd5b611dba84848484612a82565b50505050565b600c60019054906101000a900460ff16611e0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0690614116565b60405180910390fd5b60011515600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611ea2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9990614316565b60405180910390fd5b600381600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611eef91906145e7565b1115611f30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2790614496565b60405180910390fd5b60008111611f73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6a90614136565b60405180910390fd5b34611f8e82668e1bc9bf040000612a6c90919063ffffffff16565b1115611fcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc6906142b6565b60405180910390fd5b60005b81811015611ffe57611feb33611fe6610c45565b6126e8565b8080611ff690614815565b915050611fd2565b5080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461204e91906145e7565b9250508190555050565b6060612063826125bb565b6120a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612099906143d6565b60405180910390fd5b60006011600084815260200190815260200160002080546120c2906147b2565b80601f01602080910402602001604051908101604052809291908181526020018280546120ee906147b2565b801561213b5780601f106121105761010080835404028352916020019161213b565b820191906000526020600020905b81548152906001019060200180831161211e57829003601f168201915b50505050509050600061214c612ade565b90506000815114156121625781925050506121c6565b60008251111561219757808260405160200161217f929190614043565b604051602081830303815290604052925050506121c6565b806121a185612b70565b6040516020016121b2929190614043565b604051602081830303815290604052925050505b919050565b600c60029054906101000a900460ff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c60009054906101000a900460ff1681565b61228d612627565b73ffffffffffffffffffffffffffffffffffffffff166122ab6116f4565b73ffffffffffffffffffffffffffffffffffffffff1614612301576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f890614356565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612371576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236890614196565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b612439612627565b73ffffffffffffffffffffffffffffffffffffffff166124576116f4565b73ffffffffffffffffffffffffffffffffffffffff16146124ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a490614356565b60405180910390fd5b600c60019054906101000a900460ff1615600c60016101000a81548160ff021916908315150217905550565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806125a457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806125b457506125b382612cd1565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166126a2836111e3565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b612702828260405180602001604052806000815250612d3b565b5050565b6000818361271491906146c8565b905092915050565b6000612727826125bb565b612766576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275d90614236565b60405180910390fd5b6000612771836111e3565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806127e057508373ffffffffffffffffffffffffffffffffffffffff166127c884610aa8565b73ffffffffffffffffffffffffffffffffffffffff16145b806127f157506127f081856121de565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661281a826111e3565b73ffffffffffffffffffffffffffffffffffffffff1614612870576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612867906143b6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156128e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128d7906141f6565b60405180910390fd5b6128eb838383612d96565b6128f660008261262f565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461294691906146c8565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461299d91906145e7565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008183612a6491906145e7565b905092915050565b60008183612a7a919061466e565b905092915050565b612a8d8484846127fa565b612a9984848484612eaa565b612ad8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612acf90614176565b60405180910390fd5b50505050565b606060108054612aed906147b2565b80601f0160208091040260200160405190810160405280929190818152602001828054612b19906147b2565b8015612b665780601f10612b3b57610100808354040283529160200191612b66565b820191906000526020600020905b815481529060010190602001808311612b4957829003601f168201915b5050505050905090565b60606000821415612bb8576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612ccc565b600082905060005b60008214612bea578080612bd390614815565b915050600a82612be3919061463d565b9150612bc0565b60008167ffffffffffffffff811115612c0657612c0561497a565b5b6040519080825280601f01601f191660200182016040528015612c385781602001600182028036833780820191505090505b5090505b60008514612cc557600182612c5191906146c8565b9150600a85612c60919061485e565b6030612c6c91906145e7565b60f81b818381518110612c8257612c8161494b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612cbe919061463d565b9450612c3c565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612d458383613041565b612d526000848484612eaa565b612d91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d8890614176565b60405180910390fd5b505050565b612da183838361320f565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612de457612ddf81613214565b612e23565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612e2257612e21838261325d565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e6657612e61816133ca565b612ea5565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612ea457612ea3828261349b565b5b5b505050565b6000612ecb8473ffffffffffffffffffffffffffffffffffffffff1661351a565b15613034578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612ef4612627565b8786866040518563ffffffff1660e01b8152600401612f16949392919061408d565b602060405180830381600087803b158015612f3057600080fd5b505af1925050508015612f6157506040513d601f19601f82011682018060405250810190612f5e9190613a93565b60015b612fe4573d8060008114612f91576040519150601f19603f3d011682016040523d82523d6000602084013e612f96565b606091505b50600081511415612fdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fd390614176565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613039565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130a8906142d6565b60405180910390fd5b6130ba816125bb565b156130fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130f1906141b6565b60405180910390fd5b61310660008383612d96565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461315691906145e7565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161326a846112a0565b61327491906146c8565b9050600060076000848152602001908152602001600020549050818114613359576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506133de91906146c8565b905060006009600084815260200190815260200160002054905060006008838154811061340e5761340d61494b565b5b9060005260206000200154905080600883815481106134305761342f61494b565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061347f5761347e61491c565b5b6001900381819060005260206000200160009055905550505050565b60006134a6836112a0565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b828054613539906147b2565b90600052602060002090601f01602090048101928261355b57600085556135a2565b82601f1061357457805160ff19168380011785556135a2565b828001600101855582156135a2579182015b828111156135a1578251825591602001919060010190613586565b5b5090506135af91906135b3565b5090565b5b808211156135cc5760008160009055506001016135b4565b5090565b60006135e36135de84614516565b6144f1565b90508083825260208201905082856020860282011115613606576136056149b3565b5b60005b85811015613636578161361c88826136c4565b845260208401935060208301925050600181019050613609565b5050509392505050565b600061365361364e84614542565b6144f1565b90508281526020810184848401111561366f5761366e6149b8565b5b61367a848285614770565b509392505050565b600061369561369084614573565b6144f1565b9050828152602081018484840111156136b1576136b06149b8565b5b6136bc848285614770565b509392505050565b6000813590506136d3816151c7565b92915050565b60008083601f8401126136ef576136ee6149ae565b5b8235905067ffffffffffffffff81111561370c5761370b6149a9565b5b602083019150836020820283011115613728576137276149b3565b5b9250929050565b600082601f830112613744576137436149ae565b5b81356137548482602086016135d0565b91505092915050565b60008135905061376c816151de565b92915050565b600081359050613781816151f5565b92915050565b600081519050613796816151f5565b92915050565b600082601f8301126137b1576137b06149ae565b5b81356137c1848260208601613640565b91505092915050565b600082601f8301126137df576137de6149ae565b5b81356137ef848260208601613682565b91505092915050565b6000813590506138078161520c565b92915050565b600060208284031215613823576138226149c2565b5b6000613831848285016136c4565b91505092915050565b60008060408385031215613851576138506149c2565b5b600061385f858286016136c4565b9250506020613870858286016136c4565b9150509250929050565b600080600060608486031215613893576138926149c2565b5b60006138a1868287016136c4565b93505060206138b2868287016136c4565b92505060406138c3868287016137f8565b9150509250925092565b600080600080608085870312156138e7576138e66149c2565b5b60006138f5878288016136c4565b9450506020613906878288016136c4565b9350506040613917878288016137f8565b925050606085013567ffffffffffffffff811115613938576139376149bd565b5b6139448782880161379c565b91505092959194509250565b60008060408385031215613967576139666149c2565b5b6000613975858286016136c4565b92505060206139868582860161375d565b9150509250929050565b600080604083850312156139a7576139a66149c2565b5b60006139b5858286016136c4565b92505060206139c6858286016137f8565b9150509250929050565b600080602083850312156139e7576139e66149c2565b5b600083013567ffffffffffffffff811115613a0557613a046149bd565b5b613a11858286016136d9565b92509250509250929050565b600060208284031215613a3357613a326149c2565b5b600082013567ffffffffffffffff811115613a5157613a506149bd565b5b613a5d8482850161372f565b91505092915050565b600060208284031215613a7c57613a7b6149c2565b5b6000613a8a84828501613772565b91505092915050565b600060208284031215613aa957613aa86149c2565b5b6000613ab784828501613787565b91505092915050565b600060208284031215613ad657613ad56149c2565b5b600082013567ffffffffffffffff811115613af457613af36149bd565b5b613b00848285016137ca565b91505092915050565b600060208284031215613b1f57613b1e6149c2565b5b6000613b2d848285016137f8565b91505092915050565b613b3f816146fc565b82525050565b613b4e8161470e565b82525050565b6000613b5f826145a4565b613b6981856145ba565b9350613b7981856020860161477f565b613b82816149c7565b840191505092915050565b6000613b98826145af565b613ba281856145cb565b9350613bb281856020860161477f565b613bbb816149c7565b840191505092915050565b6000613bd1826145af565b613bdb81856145dc565b9350613beb81856020860161477f565b80840191505092915050565b6000613c046023836145cb565b9150613c0f826149d8565b604082019050919050565b6000613c276033836145cb565b9150613c3282614a27565b604082019050919050565b6000613c4a602b836145cb565b9150613c5582614a76565b604082019050919050565b6000613c6d6032836145cb565b9150613c7882614ac5565b604082019050919050565b6000613c906026836145cb565b9150613c9b82614b14565b604082019050919050565b6000613cb3601c836145cb565b9150613cbe82614b63565b602082019050919050565b6000613cd66020836145cb565b9150613ce182614b8c565b602082019050919050565b6000613cf96024836145cb565b9150613d0482614bb5565b604082019050919050565b6000613d1c6019836145cb565b9150613d2782614c04565b602082019050919050565b6000613d3f602c836145cb565b9150613d4a82614c2d565b604082019050919050565b6000613d626038836145cb565b9150613d6d82614c7c565b604082019050919050565b6000613d85602a836145cb565b9150613d9082614ccb565b604082019050919050565b6000613da86029836145cb565b9150613db382614d1a565b604082019050919050565b6000613dcb601d836145cb565b9150613dd682614d69565b602082019050919050565b6000613dee6020836145cb565b9150613df982614d92565b602082019050919050565b6000613e11602c836145cb565b9150613e1c82614dbb565b604082019050919050565b6000613e346030836145cb565b9150613e3f82614e0a565b604082019050919050565b6000613e576005836145dc565b9150613e6282614e59565b600582019050919050565b6000613e7a6023836145cb565b9150613e8582614e82565b604082019050919050565b6000613e9d6020836145cb565b9150613ea882614ed1565b602082019050919050565b6000613ec0601e836145cb565b9150613ecb82614efa565b602082019050919050565b6000613ee3601a836145cb565b9150613eee82614f23565b602082019050919050565b6000613f066029836145cb565b9150613f1182614f4c565b604082019050919050565b6000613f29602f836145cb565b9150613f3482614f9b565b604082019050919050565b6000613f4c6021836145cb565b9150613f5782614fea565b604082019050919050565b6000613f6f6031836145cb565b9150613f7a82615039565b604082019050919050565b6000613f926029836145cb565b9150613f9d82615088565b604082019050919050565b6000613fb5602c836145cb565b9150613fc0826150d7565b604082019050919050565b6000613fd86012836145cb565b9150613fe382615126565b602082019050919050565b6000613ffb602d836145cb565b91506140068261514f565b604082019050919050565b600061401e6020836145cb565b91506140298261519e565b602082019050919050565b61403d81614766565b82525050565b600061404f8285613bc6565b915061405b8284613bc6565b915061406682613e4a565b91508190509392505050565b60006020820190506140876000830184613b36565b92915050565b60006080820190506140a26000830187613b36565b6140af6020830186613b36565b6140bc6040830185614034565b81810360608301526140ce8184613b54565b905095945050505050565b60006020820190506140ee6000830184613b45565b92915050565b6000602082019050818103600083015261410e8184613b8d565b905092915050565b6000602082019050818103600083015261412f81613bf7565b9050919050565b6000602082019050818103600083015261414f81613c1a565b9050919050565b6000602082019050818103600083015261416f81613c3d565b9050919050565b6000602082019050818103600083015261418f81613c60565b9050919050565b600060208201905081810360008301526141af81613c83565b9050919050565b600060208201905081810360008301526141cf81613ca6565b9050919050565b600060208201905081810360008301526141ef81613cc9565b9050919050565b6000602082019050818103600083015261420f81613cec565b9050919050565b6000602082019050818103600083015261422f81613d0f565b9050919050565b6000602082019050818103600083015261424f81613d32565b9050919050565b6000602082019050818103600083015261426f81613d55565b9050919050565b6000602082019050818103600083015261428f81613d78565b9050919050565b600060208201905081810360008301526142af81613d9b565b9050919050565b600060208201905081810360008301526142cf81613dbe565b9050919050565b600060208201905081810360008301526142ef81613de1565b9050919050565b6000602082019050818103600083015261430f81613e04565b9050919050565b6000602082019050818103600083015261432f81613e27565b9050919050565b6000602082019050818103600083015261434f81613e6d565b9050919050565b6000602082019050818103600083015261436f81613e90565b9050919050565b6000602082019050818103600083015261438f81613eb3565b9050919050565b600060208201905081810360008301526143af81613ed6565b9050919050565b600060208201905081810360008301526143cf81613ef9565b9050919050565b600060208201905081810360008301526143ef81613f1c565b9050919050565b6000602082019050818103600083015261440f81613f3f565b9050919050565b6000602082019050818103600083015261442f81613f62565b9050919050565b6000602082019050818103600083015261444f81613f85565b9050919050565b6000602082019050818103600083015261446f81613fa8565b9050919050565b6000602082019050818103600083015261448f81613fcb565b9050919050565b600060208201905081810360008301526144af81613fee565b9050919050565b600060208201905081810360008301526144cf81614011565b9050919050565b60006020820190506144eb6000830184614034565b92915050565b60006144fb61450c565b905061450782826147e4565b919050565b6000604051905090565b600067ffffffffffffffff8211156145315761453061497a565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561455d5761455c61497a565b5b614566826149c7565b9050602081019050919050565b600067ffffffffffffffff82111561458e5761458d61497a565b5b614597826149c7565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006145f282614766565b91506145fd83614766565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156146325761463161488f565b5b828201905092915050565b600061464882614766565b915061465383614766565b925082614663576146626148be565b5b828204905092915050565b600061467982614766565b915061468483614766565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156146bd576146bc61488f565b5b828202905092915050565b60006146d382614766565b91506146de83614766565b9250828210156146f1576146f061488f565b5b828203905092915050565b600061470782614746565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561479d578082015181840152602081019050614782565b838111156147ac576000848401525b50505050565b600060028204905060018216806147ca57607f821691505b602082108114156147de576147dd6148ed565b5b50919050565b6147ed826149c7565b810181811067ffffffffffffffff8211171561480c5761480b61497a565b5b80604052505050565b600061482082614766565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156148535761485261488f565b5b600182019050919050565b600061486982614766565b915061487483614766565b925082614884576148836148be565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f50726573616c65206973206e6f742061637469766520617420746865206d6f6d60008201527f656e740000000000000000000000000000000000000000000000000000000000602082015250565b7f4e756d626572206f6620746f6b656e732063616e206e6f74206265206c65737360008201527f207468616e206f7220657175616c20746f203000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4e6f7420656e6f7567682072657365727665206c65667420666f72207465616d600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f53656e742065746865722076616c756520697320696e636f7272656374000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f546869732061646472657373206973206e6f742077686974656c69737465642060008201527f666f72207468652070726573616c652e00000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f43616e206f6e6c79206d696e7420757020746f2031352070657220707572636860008201527f6173650000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f5a65726f2061646472657373206e6f74206f6e20416c6c6f77204c6973740000600082015250565b7f43616e27742061646420746865206e756c6c2061646472657373000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d617820737570706c7960008201527f206f6620426f6172730000000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4d65746164617461206973206c6f636b65640000000000000000000000000000600082015250565b7f4578636565647320737570706c79206f662070726573616c6520426f6172732060008201527f796f752063616e206d696e742e00000000000000000000000000000000000000602082015250565b7f53616c65206973206e6f742061637469766520617420746865206d6f6d656e74600082015250565b6151d0816146fc565b81146151db57600080fd5b50565b6151e78161470e565b81146151f257600080fd5b50565b6151fe8161471a565b811461520957600080fd5b50565b61521581614766565b811461522057600080fd5b5056fea2646970667358221220e1cdee36c305b43ba4439c64aa2b59fd8c8c12a9f11d4290b0b1eb5967c66b8f64736f6c63430008070033

Deployed Bytecode

0x60806040526004361061022f5760003560e01c80636352211e1161012e578063a51312c8116100ab578063d7e45cd71161006f578063d7e45cd71461080c578063e985e9c514610837578063eb8d244414610874578063f2fde38b1461089f578063f81227d4146108c85761022f565b8063a51312c814610745578063b1d1c5351461076e578063b88d4fde1461078a578063ba217f14146107b3578063c87b56dd146107cf5761022f565b80638da5cb5b116100f25780638da5cb5b1461068457806395d89b41146106af578063989bdbb6146106da578063a06a513f146106f1578063a22cb4651461071c5761022f565b80636352211e1461059f578063676dd563146105dc57806370a0823114610607578063715018a6146106445780637f6497831461065b5761022f565b806323b872dd116101bc5780633af32abf116101805780633af32abf146104bc5780633ccfd60b146104f957806342842e0e146105105780634f6ccce71461053957806355f804b3146105765761022f565b806323b872dd146103e95780632f745c591461041257806330f72cd41461044f57806332cb6b0c1461047a57806334918dfd146104a55761022f565b8063081812fc11610203578063081812fc14610304578063095ea7b31461034157806318160ddd1461036a57806322f69c70146103955780632314af43146103c05761022f565b806208ffdd1461023457806301ffc9a714610271578063020b39cc146102ae57806306fdde03146102d9575b600080fd5b34801561024057600080fd5b5061025b6004803603810190610256919061380d565b6108df565b60405161026891906144d6565b60405180910390f35b34801561027d57600080fd5b5061029860048036038101906102939190613a66565b610997565b6040516102a591906140d9565b60405180910390f35b3480156102ba57600080fd5b506102c3610a11565b6040516102d091906144d6565b60405180910390f35b3480156102e557600080fd5b506102ee610a16565b6040516102fb91906140f4565b60405180910390f35b34801561031057600080fd5b5061032b60048036038101906103269190613b09565b610aa8565b6040516103389190614072565b60405180910390f35b34801561034d57600080fd5b5061036860048036038101906103639190613990565b610b2d565b005b34801561037657600080fd5b5061037f610c45565b60405161038c91906144d6565b60405180910390f35b3480156103a157600080fd5b506103aa610c52565b6040516103b791906144d6565b60405180910390f35b3480156103cc57600080fd5b506103e760048036038101906103e29190613990565b610c58565b005b3480156103f557600080fd5b50610410600480360381019061040b919061387a565b610d85565b005b34801561041e57600080fd5b5061043960048036038101906104349190613990565b610de5565b60405161044691906144d6565b60405180910390f35b34801561045b57600080fd5b50610464610e8a565b60405161047191906140d9565b60405180910390f35b34801561048657600080fd5b5061048f610e9d565b60405161049c91906144d6565b60405180910390f35b3480156104b157600080fd5b506104ba610ea3565b005b3480156104c857600080fd5b506104e360048036038101906104de919061380d565b610f4b565b6040516104f091906140d9565b60405180910390f35b34801561050557600080fd5b5061050e610fa1565b005b34801561051c57600080fd5b506105376004803603810190610532919061387a565b61106c565b005b34801561054557600080fd5b50610560600480360381019061055b9190613b09565b61108c565b60405161056d91906144d6565b60405180910390f35b34801561058257600080fd5b5061059d60048036038101906105989190613ac0565b6110fd565b005b3480156105ab57600080fd5b506105c660048036038101906105c19190613b09565b6111e3565b6040516105d39190614072565b60405180910390f35b3480156105e857600080fd5b506105f1611295565b6040516105fe91906144d6565b60405180910390f35b34801561061357600080fd5b5061062e6004803603810190610629919061380d565b6112a0565b60405161063b91906144d6565b60405180910390f35b34801561065057600080fd5b50610659611358565b005b34801561066757600080fd5b50610682600480360381019061067d9190613a1d565b611495565b005b34801561069057600080fd5b506106996116f4565b6040516106a69190614072565b60405180910390f35b3480156106bb57600080fd5b506106c461171e565b6040516106d191906140f4565b60405180910390f35b3480156106e657600080fd5b506106ef6117b0565b005b3480156106fd57600080fd5b50610706611849565b60405161071391906144d6565b60405180910390f35b34801561072857600080fd5b50610743600480360381019061073e9190613950565b61184e565b005b34801561075157600080fd5b5061076c600480360381019061076791906139d0565b6119cf565b005b61078860048036038101906107839190613b09565b611b87565b005b34801561079657600080fd5b506107b160048036038101906107ac91906138cd565b611d5e565b005b6107cd60048036038101906107c89190613b09565b611dc0565b005b3480156107db57600080fd5b506107f660048036038101906107f19190613b09565b612058565b60405161080391906140f4565b60405180910390f35b34801561081857600080fd5b506108216121cb565b60405161082e91906140d9565b60405180910390f35b34801561084357600080fd5b5061085e6004803603810190610859919061383a565b6121de565b60405161086b91906140d9565b60405180910390f35b34801561088057600080fd5b50610889612272565b60405161089691906140d9565b60405180910390f35b3480156108ab57600080fd5b506108c660048036038101906108c1919061380d565b612285565b005b3480156108d457600080fd5b506108dd612431565b005b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610950576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094790614376565b60405180910390fd5b600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a0a5750610a09826124d9565b5b9050919050565b600a81565b606060008054610a25906147b2565b80601f0160208091040260200160405190810160405280929190818152602001828054610a51906147b2565b8015610a9e5780601f10610a7357610100808354040283529160200191610a9e565b820191906000526020600020905b815481529060010190602001808311610a8157829003601f168201915b5050505050905090565b6000610ab3826125bb565b610af2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae9906142f6565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b38826111e3565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ba9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba0906143f6565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bc8612627565b73ffffffffffffffffffffffffffffffffffffffff161480610bf75750610bf681610bf1612627565b6121de565b5b610c36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2d90614256565b60405180910390fd5b610c40838361262f565b505050565b6000600880549050905090565b600d5481565b610c60612627565b73ffffffffffffffffffffffffffffffffffffffff16610c7e6116f4565b73ffffffffffffffffffffffffffffffffffffffff1614610cd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ccb90614356565b60405180910390fd5b6000610cde610c45565b9050600082118015610cf25750600d548211155b610d31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d28906141d6565b60405180910390fd5b60005b82811015610d6457610d51848284610d4c91906145e7565b6126e8565b8080610d5c90614815565b915050610d34565b50610d7a82600d5461270690919063ffffffff16565b600d81905550505050565b610d96610d90612627565b8261271c565b610dd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dcc90614416565b60405180910390fd5b610de08383836127fa565b505050565b6000610df0836112a0565b8210610e31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2890614156565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600c60019054906101000a900460ff1681565b600b5481565b610eab612627565b73ffffffffffffffffffffffffffffffffffffffff16610ec96116f4565b73ffffffffffffffffffffffffffffffffffffffff1614610f1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1690614356565b60405180910390fd5b600c60009054906101000a900460ff1615600c60006101000a81548160ff021916908315150217905550565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b610fa9612627565b73ffffffffffffffffffffffffffffffffffffffff16610fc76116f4565b73ffffffffffffffffffffffffffffffffffffffff161461101d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101490614356565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611068573d6000803e3d6000fd5b5050565b61108783838360405180602001604052806000815250611d5e565b505050565b6000611096610c45565b82106110d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ce90614456565b60405180910390fd5b600882815481106110eb576110ea61494b565b5b90600052602060002001549050919050565b611105612627565b73ffffffffffffffffffffffffffffffffffffffff166111236116f4565b73ffffffffffffffffffffffffffffffffffffffff1614611179576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117090614356565b60405180910390fd5b600c60029054906101000a900460ff16156111c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c090614476565b60405180910390fd5b80601090805190602001906111df92919061352d565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561128c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128390614296565b60405180910390fd5b80915050919050565b668e1bc9bf04000081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611311576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130890614276565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611360612627565b73ffffffffffffffffffffffffffffffffffffffff1661137e6116f4565b73ffffffffffffffffffffffffffffffffffffffff16146113d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113cb90614356565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b61149d612627565b73ffffffffffffffffffffffffffffffffffffffff166114bb6116f4565b73ffffffffffffffffffffffffffffffffffffffff1614611511576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150890614356565b60405180910390fd5b60005b81518110156116f057600073ffffffffffffffffffffffffffffffffffffffff168282815181106115485761154761494b565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614156115a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159e90614396565b60405180910390fd5b6001600e60008484815181106115c0576115bf61494b565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600f60008484815181106116325761163161494b565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054116116815760006116dc565b600f60008383815181106116985761169761494b565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020545b5080806116e890614815565b915050611514565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461172d906147b2565b80601f0160208091040260200160405190810160405280929190818152602001828054611759906147b2565b80156117a65780601f1061177b576101008083540402835291602001916117a6565b820191906000526020600020905b81548152906001019060200180831161178957829003601f168201915b5050505050905090565b6117b8612627565b73ffffffffffffffffffffffffffffffffffffffff166117d66116f4565b73ffffffffffffffffffffffffffffffffffffffff161461182c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182390614356565b60405180910390fd5b6001600c60026101000a81548160ff021916908315150217905550565b600381565b611856612627565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118bb90614216565b60405180910390fd5b80600560006118d1612627565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661197e612627565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119c391906140d9565b60405180910390a35050565b6119d7612627565b73ffffffffffffffffffffffffffffffffffffffff166119f56116f4565b73ffffffffffffffffffffffffffffffffffffffff1614611a4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4290614356565b60405180910390fd5b60005b82829050811015611b8257600073ffffffffffffffffffffffffffffffffffffffff16838383818110611a8457611a8361494b565b5b9050602002016020810190611a99919061380d565b73ffffffffffffffffffffffffffffffffffffffff161415611af0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae790614396565b60405180910390fd5b6000600e6000858585818110611b0957611b0861494b565b5b9050602002016020810190611b1e919061380d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611b7a90614815565b915050611a4e565b505050565b600c60009054906101000a900460ff16611bd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bcd906144b6565b60405180910390fd5b60008111611c19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1090614136565b60405180910390fd5b611c30600d54600b5461270690919063ffffffff16565b611c4a82611c3c610c45565b612a5690919063ffffffff16565b1115611c8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8290614436565b60405180910390fd5b600a811115611ccf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc690614336565b60405180910390fd5b34611cea82668e1bc9bf040000612a6c90919063ffffffff16565b1115611d2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d22906142b6565b60405180910390fd5b60005b81811015611d5a57611d4733611d42610c45565b6126e8565b8080611d5290614815565b915050611d2e565b5050565b611d6f611d69612627565b8361271c565b611dae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da590614416565b60405180910390fd5b611dba84848484612a82565b50505050565b600c60019054906101000a900460ff16611e0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e0690614116565b60405180910390fd5b60011515600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611ea2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9990614316565b60405180910390fd5b600381600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611eef91906145e7565b1115611f30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2790614496565b60405180910390fd5b60008111611f73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6a90614136565b60405180910390fd5b34611f8e82668e1bc9bf040000612a6c90919063ffffffff16565b1115611fcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc6906142b6565b60405180910390fd5b60005b81811015611ffe57611feb33611fe6610c45565b6126e8565b8080611ff690614815565b915050611fd2565b5080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461204e91906145e7565b9250508190555050565b6060612063826125bb565b6120a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612099906143d6565b60405180910390fd5b60006011600084815260200190815260200160002080546120c2906147b2565b80601f01602080910402602001604051908101604052809291908181526020018280546120ee906147b2565b801561213b5780601f106121105761010080835404028352916020019161213b565b820191906000526020600020905b81548152906001019060200180831161211e57829003601f168201915b50505050509050600061214c612ade565b90506000815114156121625781925050506121c6565b60008251111561219757808260405160200161217f929190614043565b604051602081830303815290604052925050506121c6565b806121a185612b70565b6040516020016121b2929190614043565b604051602081830303815290604052925050505b919050565b600c60029054906101000a900460ff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c60009054906101000a900460ff1681565b61228d612627565b73ffffffffffffffffffffffffffffffffffffffff166122ab6116f4565b73ffffffffffffffffffffffffffffffffffffffff1614612301576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f890614356565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612371576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236890614196565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b612439612627565b73ffffffffffffffffffffffffffffffffffffffff166124576116f4565b73ffffffffffffffffffffffffffffffffffffffff16146124ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a490614356565b60405180910390fd5b600c60019054906101000a900460ff1615600c60016101000a81548160ff021916908315150217905550565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806125a457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806125b457506125b382612cd1565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166126a2836111e3565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b612702828260405180602001604052806000815250612d3b565b5050565b6000818361271491906146c8565b905092915050565b6000612727826125bb565b612766576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275d90614236565b60405180910390fd5b6000612771836111e3565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806127e057508373ffffffffffffffffffffffffffffffffffffffff166127c884610aa8565b73ffffffffffffffffffffffffffffffffffffffff16145b806127f157506127f081856121de565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661281a826111e3565b73ffffffffffffffffffffffffffffffffffffffff1614612870576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612867906143b6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156128e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128d7906141f6565b60405180910390fd5b6128eb838383612d96565b6128f660008261262f565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461294691906146c8565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461299d91906145e7565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008183612a6491906145e7565b905092915050565b60008183612a7a919061466e565b905092915050565b612a8d8484846127fa565b612a9984848484612eaa565b612ad8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612acf90614176565b60405180910390fd5b50505050565b606060108054612aed906147b2565b80601f0160208091040260200160405190810160405280929190818152602001828054612b19906147b2565b8015612b665780601f10612b3b57610100808354040283529160200191612b66565b820191906000526020600020905b815481529060010190602001808311612b4957829003601f168201915b5050505050905090565b60606000821415612bb8576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612ccc565b600082905060005b60008214612bea578080612bd390614815565b915050600a82612be3919061463d565b9150612bc0565b60008167ffffffffffffffff811115612c0657612c0561497a565b5b6040519080825280601f01601f191660200182016040528015612c385781602001600182028036833780820191505090505b5090505b60008514612cc557600182612c5191906146c8565b9150600a85612c60919061485e565b6030612c6c91906145e7565b60f81b818381518110612c8257612c8161494b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612cbe919061463d565b9450612c3c565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612d458383613041565b612d526000848484612eaa565b612d91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d8890614176565b60405180910390fd5b505050565b612da183838361320f565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612de457612ddf81613214565b612e23565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612e2257612e21838261325d565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e6657612e61816133ca565b612ea5565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612ea457612ea3828261349b565b5b5b505050565b6000612ecb8473ffffffffffffffffffffffffffffffffffffffff1661351a565b15613034578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612ef4612627565b8786866040518563ffffffff1660e01b8152600401612f16949392919061408d565b602060405180830381600087803b158015612f3057600080fd5b505af1925050508015612f6157506040513d601f19601f82011682018060405250810190612f5e9190613a93565b60015b612fe4573d8060008114612f91576040519150601f19603f3d011682016040523d82523d6000602084013e612f96565b606091505b50600081511415612fdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fd390614176565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613039565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130a8906142d6565b60405180910390fd5b6130ba816125bb565b156130fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130f1906141b6565b60405180910390fd5b61310660008383612d96565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461315691906145e7565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161326a846112a0565b61327491906146c8565b9050600060076000848152602001908152602001600020549050818114613359576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506133de91906146c8565b905060006009600084815260200190815260200160002054905060006008838154811061340e5761340d61494b565b5b9060005260206000200154905080600883815481106134305761342f61494b565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061347f5761347e61491c565b5b6001900381819060005260206000200160009055905550505050565b60006134a6836112a0565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b828054613539906147b2565b90600052602060002090601f01602090048101928261355b57600085556135a2565b82601f1061357457805160ff19168380011785556135a2565b828001600101855582156135a2579182015b828111156135a1578251825591602001919060010190613586565b5b5090506135af91906135b3565b5090565b5b808211156135cc5760008160009055506001016135b4565b5090565b60006135e36135de84614516565b6144f1565b90508083825260208201905082856020860282011115613606576136056149b3565b5b60005b85811015613636578161361c88826136c4565b845260208401935060208301925050600181019050613609565b5050509392505050565b600061365361364e84614542565b6144f1565b90508281526020810184848401111561366f5761366e6149b8565b5b61367a848285614770565b509392505050565b600061369561369084614573565b6144f1565b9050828152602081018484840111156136b1576136b06149b8565b5b6136bc848285614770565b509392505050565b6000813590506136d3816151c7565b92915050565b60008083601f8401126136ef576136ee6149ae565b5b8235905067ffffffffffffffff81111561370c5761370b6149a9565b5b602083019150836020820283011115613728576137276149b3565b5b9250929050565b600082601f830112613744576137436149ae565b5b81356137548482602086016135d0565b91505092915050565b60008135905061376c816151de565b92915050565b600081359050613781816151f5565b92915050565b600081519050613796816151f5565b92915050565b600082601f8301126137b1576137b06149ae565b5b81356137c1848260208601613640565b91505092915050565b600082601f8301126137df576137de6149ae565b5b81356137ef848260208601613682565b91505092915050565b6000813590506138078161520c565b92915050565b600060208284031215613823576138226149c2565b5b6000613831848285016136c4565b91505092915050565b60008060408385031215613851576138506149c2565b5b600061385f858286016136c4565b9250506020613870858286016136c4565b9150509250929050565b600080600060608486031215613893576138926149c2565b5b60006138a1868287016136c4565b93505060206138b2868287016136c4565b92505060406138c3868287016137f8565b9150509250925092565b600080600080608085870312156138e7576138e66149c2565b5b60006138f5878288016136c4565b9450506020613906878288016136c4565b9350506040613917878288016137f8565b925050606085013567ffffffffffffffff811115613938576139376149bd565b5b6139448782880161379c565b91505092959194509250565b60008060408385031215613967576139666149c2565b5b6000613975858286016136c4565b92505060206139868582860161375d565b9150509250929050565b600080604083850312156139a7576139a66149c2565b5b60006139b5858286016136c4565b92505060206139c6858286016137f8565b9150509250929050565b600080602083850312156139e7576139e66149c2565b5b600083013567ffffffffffffffff811115613a0557613a046149bd565b5b613a11858286016136d9565b92509250509250929050565b600060208284031215613a3357613a326149c2565b5b600082013567ffffffffffffffff811115613a5157613a506149bd565b5b613a5d8482850161372f565b91505092915050565b600060208284031215613a7c57613a7b6149c2565b5b6000613a8a84828501613772565b91505092915050565b600060208284031215613aa957613aa86149c2565b5b6000613ab784828501613787565b91505092915050565b600060208284031215613ad657613ad56149c2565b5b600082013567ffffffffffffffff811115613af457613af36149bd565b5b613b00848285016137ca565b91505092915050565b600060208284031215613b1f57613b1e6149c2565b5b6000613b2d848285016137f8565b91505092915050565b613b3f816146fc565b82525050565b613b4e8161470e565b82525050565b6000613b5f826145a4565b613b6981856145ba565b9350613b7981856020860161477f565b613b82816149c7565b840191505092915050565b6000613b98826145af565b613ba281856145cb565b9350613bb281856020860161477f565b613bbb816149c7565b840191505092915050565b6000613bd1826145af565b613bdb81856145dc565b9350613beb81856020860161477f565b80840191505092915050565b6000613c046023836145cb565b9150613c0f826149d8565b604082019050919050565b6000613c276033836145cb565b9150613c3282614a27565b604082019050919050565b6000613c4a602b836145cb565b9150613c5582614a76565b604082019050919050565b6000613c6d6032836145cb565b9150613c7882614ac5565b604082019050919050565b6000613c906026836145cb565b9150613c9b82614b14565b604082019050919050565b6000613cb3601c836145cb565b9150613cbe82614b63565b602082019050919050565b6000613cd66020836145cb565b9150613ce182614b8c565b602082019050919050565b6000613cf96024836145cb565b9150613d0482614bb5565b604082019050919050565b6000613d1c6019836145cb565b9150613d2782614c04565b602082019050919050565b6000613d3f602c836145cb565b9150613d4a82614c2d565b604082019050919050565b6000613d626038836145cb565b9150613d6d82614c7c565b604082019050919050565b6000613d85602a836145cb565b9150613d9082614ccb565b604082019050919050565b6000613da86029836145cb565b9150613db382614d1a565b604082019050919050565b6000613dcb601d836145cb565b9150613dd682614d69565b602082019050919050565b6000613dee6020836145cb565b9150613df982614d92565b602082019050919050565b6000613e11602c836145cb565b9150613e1c82614dbb565b604082019050919050565b6000613e346030836145cb565b9150613e3f82614e0a565b604082019050919050565b6000613e576005836145dc565b9150613e6282614e59565b600582019050919050565b6000613e7a6023836145cb565b9150613e8582614e82565b604082019050919050565b6000613e9d6020836145cb565b9150613ea882614ed1565b602082019050919050565b6000613ec0601e836145cb565b9150613ecb82614efa565b602082019050919050565b6000613ee3601a836145cb565b9150613eee82614f23565b602082019050919050565b6000613f066029836145cb565b9150613f1182614f4c565b604082019050919050565b6000613f29602f836145cb565b9150613f3482614f9b565b604082019050919050565b6000613f4c6021836145cb565b9150613f5782614fea565b604082019050919050565b6000613f6f6031836145cb565b9150613f7a82615039565b604082019050919050565b6000613f926029836145cb565b9150613f9d82615088565b604082019050919050565b6000613fb5602c836145cb565b9150613fc0826150d7565b604082019050919050565b6000613fd86012836145cb565b9150613fe382615126565b602082019050919050565b6000613ffb602d836145cb565b91506140068261514f565b604082019050919050565b600061401e6020836145cb565b91506140298261519e565b602082019050919050565b61403d81614766565b82525050565b600061404f8285613bc6565b915061405b8284613bc6565b915061406682613e4a565b91508190509392505050565b60006020820190506140876000830184613b36565b92915050565b60006080820190506140a26000830187613b36565b6140af6020830186613b36565b6140bc6040830185614034565b81810360608301526140ce8184613b54565b905095945050505050565b60006020820190506140ee6000830184613b45565b92915050565b6000602082019050818103600083015261410e8184613b8d565b905092915050565b6000602082019050818103600083015261412f81613bf7565b9050919050565b6000602082019050818103600083015261414f81613c1a565b9050919050565b6000602082019050818103600083015261416f81613c3d565b9050919050565b6000602082019050818103600083015261418f81613c60565b9050919050565b600060208201905081810360008301526141af81613c83565b9050919050565b600060208201905081810360008301526141cf81613ca6565b9050919050565b600060208201905081810360008301526141ef81613cc9565b9050919050565b6000602082019050818103600083015261420f81613cec565b9050919050565b6000602082019050818103600083015261422f81613d0f565b9050919050565b6000602082019050818103600083015261424f81613d32565b9050919050565b6000602082019050818103600083015261426f81613d55565b9050919050565b6000602082019050818103600083015261428f81613d78565b9050919050565b600060208201905081810360008301526142af81613d9b565b9050919050565b600060208201905081810360008301526142cf81613dbe565b9050919050565b600060208201905081810360008301526142ef81613de1565b9050919050565b6000602082019050818103600083015261430f81613e04565b9050919050565b6000602082019050818103600083015261432f81613e27565b9050919050565b6000602082019050818103600083015261434f81613e6d565b9050919050565b6000602082019050818103600083015261436f81613e90565b9050919050565b6000602082019050818103600083015261438f81613eb3565b9050919050565b600060208201905081810360008301526143af81613ed6565b9050919050565b600060208201905081810360008301526143cf81613ef9565b9050919050565b600060208201905081810360008301526143ef81613f1c565b9050919050565b6000602082019050818103600083015261440f81613f3f565b9050919050565b6000602082019050818103600083015261442f81613f62565b9050919050565b6000602082019050818103600083015261444f81613f85565b9050919050565b6000602082019050818103600083015261446f81613fa8565b9050919050565b6000602082019050818103600083015261448f81613fcb565b9050919050565b600060208201905081810360008301526144af81613fee565b9050919050565b600060208201905081810360008301526144cf81614011565b9050919050565b60006020820190506144eb6000830184614034565b92915050565b60006144fb61450c565b905061450782826147e4565b919050565b6000604051905090565b600067ffffffffffffffff8211156145315761453061497a565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561455d5761455c61497a565b5b614566826149c7565b9050602081019050919050565b600067ffffffffffffffff82111561458e5761458d61497a565b5b614597826149c7565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006145f282614766565b91506145fd83614766565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156146325761463161488f565b5b828201905092915050565b600061464882614766565b915061465383614766565b925082614663576146626148be565b5b828204905092915050565b600061467982614766565b915061468483614766565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156146bd576146bc61488f565b5b828202905092915050565b60006146d382614766565b91506146de83614766565b9250828210156146f1576146f061488f565b5b828203905092915050565b600061470782614746565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561479d578082015181840152602081019050614782565b838111156147ac576000848401525b50505050565b600060028204905060018216806147ca57607f821691505b602082108114156147de576147dd6148ed565b5b50919050565b6147ed826149c7565b810181811067ffffffffffffffff8211171561480c5761480b61497a565b5b80604052505050565b600061482082614766565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156148535761485261488f565b5b600182019050919050565b600061486982614766565b915061487483614766565b925082614884576148836148be565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f50726573616c65206973206e6f742061637469766520617420746865206d6f6d60008201527f656e740000000000000000000000000000000000000000000000000000000000602082015250565b7f4e756d626572206f6620746f6b656e732063616e206e6f74206265206c65737360008201527f207468616e206f7220657175616c20746f203000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4e6f7420656e6f7567682072657365727665206c65667420666f72207465616d600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f53656e742065746865722076616c756520697320696e636f7272656374000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f546869732061646472657373206973206e6f742077686974656c69737465642060008201527f666f72207468652070726573616c652e00000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f43616e206f6e6c79206d696e7420757020746f2031352070657220707572636860008201527f6173650000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f5a65726f2061646472657373206e6f74206f6e20416c6c6f77204c6973740000600082015250565b7f43616e27742061646420746865206e756c6c2061646472657373000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d617820737570706c7960008201527f206f6620426f6172730000000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4d65746164617461206973206c6f636b65640000000000000000000000000000600082015250565b7f4578636565647320737570706c79206f662070726573616c6520426f6172732060008201527f796f752063616e206d696e742e00000000000000000000000000000000000000602082015250565b7f53616c65206973206e6f742061637469766520617420746865206d6f6d656e74600082015250565b6151d0816146fc565b81146151db57600080fd5b50565b6151e78161470e565b81146151f257600080fd5b50565b6151fe8161471a565b811461520957600080fd5b50565b61521581614766565b811461522057600080fd5b5056fea2646970667358221220e1cdee36c305b43ba4439c64aa2b59fd8c8c12a9f11d4290b0b1eb5967c66b8f64736f6c63430008070033

Deployed Bytecode Sourcemap

49027:5349:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50698:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42871:237;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49254:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31158:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32618:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32155:397;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43524:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49523:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51367:456;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33508:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43192:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49438:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49359:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50917:89;;;;;;;;;;;;;:::i;:::-;;50281:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51219:140;;;;;;;;;;;;;:::i;:::-;;33884:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43714:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53387:167;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30852:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49182:53;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30582:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28410:148;;;;;;;;;;;;;:::i;:::-;;49905:364;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27759:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31327:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51018:83;;;;;;;;;;;;;:::i;:::-;;49303:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32911:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50404:278;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51831:656;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34106:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52499:755;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53562:811;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49480:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33277:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49399:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28713:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51113:98;;;;;;;;;;;;;:::i;:::-;;50698:207;50764:7;50808:1;50791:19;;:5;:19;;;;50783:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;50873:17;:24;50891:5;50873:24;;;;;;;;;;;;;;;;50866:31;;50698:207;;;:::o;42871:237::-;42973:4;43012:35;42997:50;;;:11;:50;;;;:103;;;;43064:36;43088:11;43064:23;:36::i;:::-;42997:103;42990:110;;42871:237;;;:::o;49254:42::-;49294:2;49254:42;:::o;31158:100::-;31212:13;31245:5;31238:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31158:100;:::o;32618:221::-;32694:7;32722:16;32730:7;32722;:16::i;:::-;32714:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;32807:15;:24;32823:7;32807:24;;;;;;;;;;;;;;;;;;;;;32800:31;;32618:221;;;:::o;32155:397::-;32236:13;32252:23;32267:7;32252:14;:23::i;:::-;32236:39;;32300:5;32294:11;;:2;:11;;;;32286:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;32380:5;32364:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;32389:37;32406:5;32413:12;:10;:12::i;:::-;32389:16;:37::i;:::-;32364:62;32356:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;32523:21;32532:2;32536:7;32523:8;:21::i;:::-;32225:327;32155:397;;:::o;43524:113::-;43585:7;43612:10;:17;;;;43605:24;;43524:113;:::o;49523:32::-;;;;:::o;51367:456::-;27990:12;:10;:12::i;:::-;27979:23;;:7;:5;:7::i;:::-;:23;;;27971:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51477:14:::1;51494:13;:11;:13::i;:::-;51477:30;;51557:1;51540:14;:18;:51;;;;;51580:11;;51562:14;:29;;51540:51;51518:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;51667:9;51662:98;51686:14;51682:1;:18;51662:98;;;51722:26;51732:3;51746:1;51737:6;:10;;;;:::i;:::-;51722:9;:26::i;:::-;51702:3;;;;;:::i;:::-;;;;51662:98;;;;51784:31;51800:14;51784:11;;:15;;:31;;;;:::i;:::-;51770:11;:45;;;;51466:357;51367:456:::0;;:::o;33508:305::-;33669:41;33688:12;:10;:12::i;:::-;33702:7;33669:18;:41::i;:::-;33661:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;33777:28;33787:4;33793:2;33797:7;33777:9;:28::i;:::-;33508:305;;;:::o;43192:256::-;43289:7;43325:23;43342:5;43325:16;:23::i;:::-;43317:5;:31;43309:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;43414:12;:19;43427:5;43414:19;;;;;;;;;;;;;;;:26;43434:5;43414:26;;;;;;;;;;;;43407:33;;43192:256;;;;:::o;49438:35::-;;;;;;;;;;;;;:::o;49359:33::-;;;;:::o;50917:89::-;27990:12;:10;:12::i;:::-;27979:23;;:7;:5;:7::i;:::-;:23;;;27971:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50986:12:::1;;;;;;;;;;;50985:13;50970:12;;:28;;;;;;;;;;;;;;;;;;50917:89::o:0;50281:107::-;50340:4;50364:10;:16;50375:4;50364:16;;;;;;;;;;;;;;;;;;;;;;;;;50357:23;;50281:107;;;:::o;51219:140::-;27990:12;:10;:12::i;:::-;27979:23;;:7;:5;:7::i;:::-;:23;;;27971:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51267:12:::1;51282:21;51267:36;;51322:10;51314:28;;:37;51343:7;51314:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;51256:103;51219:140::o:0;33884:151::-;33988:39;34005:4;34011:2;34015:7;33988:39;;;;;;;;;;;;:16;:39::i;:::-;33884:151;;;:::o;43714:233::-;43789:7;43825:30;:28;:30::i;:::-;43817:5;:38;43809:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;43922:10;43933:5;43922:17;;;;;;;;:::i;:::-;;;;;;;;;;43915:24;;43714:233;;;:::o;53387:167::-;27990:12;:10;:12::i;:::-;27979:23;;:7;:5;:7::i;:::-;:23;;;27971:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53470:16:::1;;;;;;;;;;;53469:17;53461:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;53538:8;53519:16;:27;;;;;;;;;;;;:::i;:::-;;53387:167:::0;:::o;30852:239::-;30924:7;30944:13;30960:7;:16;30968:7;30960:16;;;;;;;;;;;;;;;;;;;;;30944:32;;31012:1;30995:19;;:5;:19;;;;30987:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31078:5;31071:12;;;30852:239;;;:::o;49182:53::-;49218:17;49182:53;:::o;30582:208::-;30654:7;30699:1;30682:19;;:5;:19;;;;30674:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;30766:9;:16;30776:5;30766:16;;;;;;;;;;;;;;;;30759:23;;30582:208;;;:::o;28410:148::-;27990:12;:10;:12::i;:::-;27979:23;;:7;:5;:7::i;:::-;:23;;;27971:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28517:1:::1;28480:40;;28501:6;;;;;;;;;;;28480:40;;;;;;;;;;;;28548:1;28531:6;;:19;;;;;;;;;;;;;;;;;;28410:148::o:0;49905:364::-;27990:12;:10;:12::i;:::-;27979:23;;:7;:5;:7::i;:::-;:23;;;27971:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49990:9:::1;49985:277;50009:9;:16;50005:1;:20;49985:277;;;50077:1;50053:26;;:9;50063:1;50053:12;;;;;;;;:::i;:::-;;;;;;;;:26;;;;50045:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;50160:4;50133:10;:24;50144:9;50154:1;50144:12;;;;;;;;:::i;:::-;;;;;;;;50133:24;;;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;50211:1;50177:17;:31;50195:9;50205:1;50195:12;;;;;;;;:::i;:::-;;;;;;;;50177:31;;;;;;;;;;;;;;;;:35;:73;;50249:1;50177:73;;;50215:17;:31;50233:9;50243:1;50233:12;;;;;;;;:::i;:::-;;;;;;;;50215:31;;;;;;;;;;;;;;;;50177:73;;50027:3;;;;;:::i;:::-;;;;49985:277;;;;49905:364:::0;:::o;27759:87::-;27805:7;27832:6;;;;;;;;;;;27825:13;;27759:87;:::o;31327:104::-;31383:13;31416:7;31409:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31327:104;:::o;51018:83::-;27990:12;:10;:12::i;:::-;27979:23;;:7;:5;:7::i;:::-;:23;;;27971:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51089:4:::1;51070:16;;:23;;;;;;;;;;;;;;;;;;51018:83::o:0;49303:49::-;49351:1;49303:49;:::o;32911:295::-;33026:12;:10;:12::i;:::-;33014:24;;:8;:24;;;;33006:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;33126:8;33081:18;:32;33100:12;:10;:12::i;:::-;33081:32;;;;;;;;;;;;;;;:42;33114:8;33081:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;33179:8;33150:48;;33165:12;:10;:12::i;:::-;33150:48;;;33189:8;33150:48;;;;;;:::i;:::-;;;;;;;;32911:295;;:::o;50404:278::-;27990:12;:10;:12::i;:::-;27979:23;;:7;:5;:7::i;:::-;:23;;;27971:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50498:9:::1;50493:182;50517:9;;:16;;50513:1;:20;50493:182;;;50585:1;50561:26;;:9;;50571:1;50561:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;:26;;;;50553:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;50658:5;50631:10;:24;50642:9;;50652:1;50642:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;50631:24;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;50535:3;;;;;:::i;:::-;;;;50493:182;;;;50404:278:::0;;:::o;51831:656::-;51904:12;;;;;;;;;;;51896:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;51989:1;51972:14;:18;51964:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;52102:27;52117:11;;52102:10;;:14;;:27;;;;:::i;:::-;52065:33;52083:14;52065:13;:11;:13::i;:::-;:17;;:33;;;;:::i;:::-;:64;;52057:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;49294:2;52194:14;:34;;52186:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;52319:9;52286:29;52300:14;49218:17;52286:13;;:29;;;;:::i;:::-;:42;;52278:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;52380:6;52375:105;52396:14;52392:1;:18;52375:105;;;52432:36;52442:10;52454:13;:11;:13::i;:::-;52432:9;:36::i;:::-;52412:3;;;;;:::i;:::-;;;;52375:105;;;;51831:656;:::o;34106:285::-;34238:41;34257:12;:10;:12::i;:::-;34271:7;34238:18;:41::i;:::-;34230:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;34344:39;34358:4;34364:2;34368:7;34377:5;34344:13;:39::i;:::-;34106:285;;;;:::o;52499:755::-;52579:15;;;;;;;;;;;52571:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;52679:4;52653:30;;:10;:22;52664:10;52653:22;;;;;;;;;;;;;;;;;;;;;;;;;:30;;;52645:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;52804:1;52786:14;52754:17;:29;52772:10;52754:29;;;;;;;;;;;;;;;;:46;;;;:::i;:::-;:51;;52746:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;52890:1;52873:14;:18;52865:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;52999:9;52966:29;52980:14;49218:17;52966:13;;:29;;;;:::i;:::-;:42;;52958:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;53068:6;53063:106;53084:14;53080:1;:18;53063:106;;;53120:37;53130:10;53143:13;:11;:13::i;:::-;53120:9;:37::i;:::-;53100:3;;;;;:::i;:::-;;;;53063:106;;;;53232:14;53199:17;:29;53217:10;53199:29;;;;;;;;;;;;;;;;:47;;;;;;;:::i;:::-;;;;;;;;52499:755;:::o;53562:811::-;53635:13;53669:16;53677:7;53669;:16::i;:::-;53661:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;53750:23;53776:10;:19;53787:7;53776:19;;;;;;;;;;;53750:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53806:18;53827:10;:8;:10::i;:::-;53806:31;;53935:1;53919:4;53913:18;:23;53909:72;;;53960:9;53953:16;;;;;;53909:72;54111:1;54091:9;54085:23;:27;54081:117;;;54160:4;54166:9;54143:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54129:57;;;;;;54081:117;54330:4;54336:18;:7;:16;:18::i;:::-;54313:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54299:66;;;;53562:811;;;;:::o;49480:36::-;;;;;;;;;;;;;:::o;33277:164::-;33374:4;33398:18;:25;33417:5;33398:25;;;;;;;;;;;;;;;:35;33424:8;33398:35;;;;;;;;;;;;;;;;;;;;;;;;;33391:42;;33277:164;;;;:::o;49399:32::-;;;;;;;;;;;;;:::o;28713:244::-;27990:12;:10;:12::i;:::-;27979:23;;:7;:5;:7::i;:::-;:23;;;27971:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28822:1:::1;28802:22;;:8;:22;;;;28794:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28912:8;28883:38;;28904:6;;;;;;;;;;;28883:38;;;;;;;;;;;;28941:8;28932:6;;:17;;;;;;;;;;;;;;;;;;28713:244:::0;:::o;51113:98::-;27990:12;:10;:12::i;:::-;27979:23;;:7;:5;:7::i;:::-;:23;;;27971:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51188:15:::1;;;;;;;;;;;51187:16;51169:15;;:34;;;;;;;;;;;;;;;;;;51113:98::o:0;30226:292::-;30328:4;30367:25;30352:40;;;:11;:40;;;;:105;;;;30424:33;30409:48;;;:11;:48;;;;30352:105;:158;;;;30474:36;30498:11;30474:23;:36::i;:::-;30352:158;30345:165;;30226:292;;;:::o;35858:127::-;35923:4;35975:1;35947:30;;:7;:16;35955:7;35947:16;;;;;;;;;;;;;;;;;;;;;:30;;;;35940:37;;35858:127;;;:::o;26376:98::-;26429:7;26456:10;26449:17;;26376:98;:::o;39735:174::-;39837:2;39810:15;:24;39826:7;39810:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;39893:7;39889:2;39855:46;;39864:23;39879:7;39864:14;:23::i;:::-;39855:46;;;;;;;;;;;;39735:174;;:::o;36842:110::-;36918:26;36928:2;36932:7;36918:26;;;;;;;;;;;;:9;:26::i;:::-;36842:110;;:::o;3215:98::-;3273:7;3304:1;3300;:5;;;;:::i;:::-;3293:12;;3215:98;;;;:::o;36152:348::-;36245:4;36270:16;36278:7;36270;:16::i;:::-;36262:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;36346:13;36362:23;36377:7;36362:14;:23::i;:::-;36346:39;;36415:5;36404:16;;:7;:16;;;:51;;;;36448:7;36424:31;;:20;36436:7;36424:11;:20::i;:::-;:31;;;36404:51;:87;;;;36459:32;36476:5;36483:7;36459:16;:32::i;:::-;36404:87;36396:96;;;36152:348;;;;:::o;39073:544::-;39198:4;39171:31;;:23;39186:7;39171:14;:23::i;:::-;:31;;;39163:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;39281:1;39267:16;;:2;:16;;;;39259:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;39337:39;39358:4;39364:2;39368:7;39337:20;:39::i;:::-;39441:29;39458:1;39462:7;39441:8;:29::i;:::-;39502:1;39483:9;:15;39493:4;39483:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;39531:1;39514:9;:13;39524:2;39514:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;39562:2;39543:7;:16;39551:7;39543:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;39601:7;39597:2;39582:27;;39591:4;39582:27;;;;;;;;;;;;39073:544;;;:::o;2834:98::-;2892:7;2923:1;2919;:5;;;;:::i;:::-;2912:12;;2834:98;;;;:::o;3572:::-;3630:7;3661:1;3657;:5;;;;:::i;:::-;3650:12;;3572:98;;;;:::o;35273:272::-;35387:28;35397:4;35403:2;35407:7;35387:9;:28::i;:::-;35434:48;35457:4;35463:2;35467:7;35476:5;35434:22;:48::i;:::-;35426:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;35273:272;;;;:::o;53262:117::-;53322:13;53355:16;53348:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53262:117;:::o;7375:723::-;7431:13;7661:1;7652:5;:10;7648:53;;;7679:10;;;;;;;;;;;;;;;;;;;;;7648:53;7711:12;7726:5;7711:20;;7742:14;7767:78;7782:1;7774:4;:9;7767:78;;7800:8;;;;;:::i;:::-;;;;7831:2;7823:10;;;;;:::i;:::-;;;7767:78;;;7855:19;7887:6;7877:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7855:39;;7905:154;7921:1;7912:5;:10;7905:154;;7949:1;7939:11;;;;;:::i;:::-;;;8016:2;8008:5;:10;;;;:::i;:::-;7995:2;:24;;;;:::i;:::-;7982:39;;7965:6;7972;7965:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;8045:2;8036:11;;;;;:::i;:::-;;;7905:154;;;8083:6;8069:21;;;;;7375:723;;;;:::o;19449:157::-;19534:4;19573:25;19558:40;;;:11;:40;;;;19551:47;;19449:157;;;:::o;37179:250::-;37275:18;37281:2;37285:7;37275:5;:18::i;:::-;37312:54;37343:1;37347:2;37351:7;37360:5;37312:22;:54::i;:::-;37304:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;37179:250;;;:::o;44560:555::-;44670:45;44697:4;44703:2;44707:7;44670:26;:45::i;:::-;44748:1;44732:18;;:4;:18;;;44728:187;;;44767:40;44799:7;44767:31;:40::i;:::-;44728:187;;;44837:2;44829:10;;:4;:10;;;44825:90;;44856:47;44889:4;44895:7;44856:32;:47::i;:::-;44825:90;44728:187;44943:1;44929:16;;:2;:16;;;44925:183;;;44962:45;44999:7;44962:36;:45::i;:::-;44925:183;;;45035:4;45029:10;;:2;:10;;;45025:83;;45056:40;45084:2;45088:7;45056:27;:40::i;:::-;45025:83;44925:183;44560:555;;;:::o;40474:843::-;40595:4;40621:15;:2;:13;;;:15::i;:::-;40617:693;;;40673:2;40657:36;;;40694:12;:10;:12::i;:::-;40708:4;40714:7;40723:5;40657:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;40653:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40920:1;40903:6;:13;:18;40899:341;;;40946:60;;;;;;;;;;:::i;:::-;;;;;;;;40899:341;41190:6;41184:13;41175:6;41171:2;41167:15;41160:38;40653:602;40790:45;;;40780:55;;;:6;:55;;;;40773:62;;;;;40617:693;41294:4;41287:11;;40474:843;;;;;;;:::o;37765:382::-;37859:1;37845:16;;:2;:16;;;;37837:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;37918:16;37926:7;37918;:16::i;:::-;37917:17;37909:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;37980:45;38009:1;38013:2;38017:7;37980:20;:45::i;:::-;38055:1;38038:9;:13;38048:2;38038:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;38086:2;38067:7;:16;38075:7;38067:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;38131:7;38127:2;38106:33;;38123:1;38106:33;;;;;;;;;;;;37765:382;;:::o;41930:93::-;;;;:::o;45838:164::-;45942:10;:17;;;;45915:15;:24;45931:7;45915:24;;;;;;;;;;;:44;;;;45970:10;45986:7;45970:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45838:164;:::o;46629:988::-;46895:22;46945:1;46920:22;46937:4;46920:16;:22::i;:::-;:26;;;;:::i;:::-;46895:51;;46957:18;46978:17;:26;46996:7;46978:26;;;;;;;;;;;;46957:47;;47125:14;47111:10;:28;47107:328;;47156:19;47178:12;:18;47191:4;47178:18;;;;;;;;;;;;;;;:34;47197:14;47178:34;;;;;;;;;;;;47156:56;;47262:11;47229:12;:18;47242:4;47229:18;;;;;;;;;;;;;;;:30;47248:10;47229:30;;;;;;;;;;;:44;;;;47379:10;47346:17;:30;47364:11;47346:30;;;;;;;;;;;:43;;;;47141:294;47107:328;47531:17;:26;47549:7;47531:26;;;;;;;;;;;47524:33;;;47575:12;:18;47588:4;47575:18;;;;;;;;;;;;;;;:34;47594:14;47575:34;;;;;;;;;;;47568:41;;;46710:907;;46629:988;;:::o;47912:1079::-;48165:22;48210:1;48190:10;:17;;;;:21;;;;:::i;:::-;48165:46;;48222:18;48243:15;:24;48259:7;48243:24;;;;;;;;;;;;48222:45;;48594:19;48616:10;48627:14;48616:26;;;;;;;;:::i;:::-;;;;;;;;;;48594:48;;48680:11;48655:10;48666;48655:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;48791:10;48760:15;:28;48776:11;48760:28;;;;;;;;;;;:41;;;;48932:15;:24;48948:7;48932:24;;;;;;;;;;;48925:31;;;48967:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;47983:1008;;;47912:1079;:::o;45416:221::-;45501:14;45518:20;45535:2;45518:16;:20::i;:::-;45501:37;;45576:7;45549:12;:16;45562:2;45549:16;;;;;;;;;;;;;;;:24;45566:6;45549:24;;;;;;;;;;;:34;;;;45623:6;45594:17;:26;45612:7;45594:26;;;;;;;;;;;:35;;;;45490:147;45416:221;;:::o;9840:422::-;9900:4;10108:12;10219:7;10207:20;10199:28;;10253:1;10246:4;:8;10239:15;;;9840:422;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:412::-;1246:5;1271:66;1287:49;1329:6;1287:49;:::i;:::-;1271:66;:::i;:::-;1262:75;;1360:6;1353:5;1346:21;1398:4;1391:5;1387:16;1436:3;1427:6;1422:3;1418:16;1415:25;1412:112;;;1443:79;;:::i;:::-;1412:112;1533:41;1567:6;1562:3;1557;1533:41;:::i;:::-;1252:328;1168:412;;;;;:::o;1586:139::-;1632:5;1670:6;1657:20;1648:29;;1686:33;1713:5;1686:33;:::i;:::-;1586:139;;;;:::o;1748:568::-;1821:8;1831:6;1881:3;1874:4;1866:6;1862:17;1858:27;1848:122;;1889:79;;:::i;:::-;1848:122;2002:6;1989:20;1979:30;;2032:18;2024:6;2021:30;2018:117;;;2054:79;;:::i;:::-;2018:117;2168:4;2160:6;2156:17;2144:29;;2222:3;2214:4;2206:6;2202:17;2192:8;2188:32;2185:41;2182:128;;;2229:79;;:::i;:::-;2182:128;1748:568;;;;;:::o;2339:370::-;2410:5;2459:3;2452:4;2444:6;2440:17;2436:27;2426:122;;2467:79;;:::i;:::-;2426:122;2584:6;2571:20;2609:94;2699:3;2691:6;2684:4;2676:6;2672:17;2609:94;:::i;:::-;2600:103;;2416:293;2339:370;;;;:::o;2715:133::-;2758:5;2796:6;2783:20;2774:29;;2812:30;2836:5;2812:30;:::i;:::-;2715:133;;;;:::o;2854:137::-;2899:5;2937:6;2924:20;2915:29;;2953:32;2979:5;2953:32;:::i;:::-;2854:137;;;;:::o;2997:141::-;3053:5;3084:6;3078:13;3069:22;;3100:32;3126:5;3100:32;:::i;:::-;2997:141;;;;:::o;3157:338::-;3212:5;3261:3;3254:4;3246:6;3242:17;3238:27;3228:122;;3269:79;;:::i;:::-;3228:122;3386:6;3373:20;3411:78;3485:3;3477:6;3470:4;3462:6;3458:17;3411:78;:::i;:::-;3402:87;;3218:277;3157:338;;;;:::o;3515:340::-;3571:5;3620:3;3613:4;3605:6;3601:17;3597:27;3587:122;;3628:79;;:::i;:::-;3587:122;3745:6;3732:20;3770:79;3845:3;3837:6;3830:4;3822:6;3818:17;3770:79;:::i;:::-;3761:88;;3577:278;3515:340;;;;:::o;3861:139::-;3907:5;3945:6;3932:20;3923:29;;3961:33;3988:5;3961:33;:::i;:::-;3861:139;;;;:::o;4006:329::-;4065:6;4114:2;4102:9;4093:7;4089:23;4085:32;4082:119;;;4120:79;;:::i;:::-;4082:119;4240:1;4265:53;4310:7;4301:6;4290:9;4286:22;4265:53;:::i;:::-;4255:63;;4211:117;4006:329;;;;:::o;4341:474::-;4409:6;4417;4466:2;4454:9;4445:7;4441:23;4437:32;4434:119;;;4472:79;;:::i;:::-;4434:119;4592:1;4617:53;4662:7;4653:6;4642:9;4638:22;4617:53;:::i;:::-;4607:63;;4563:117;4719:2;4745:53;4790:7;4781:6;4770:9;4766:22;4745:53;:::i;:::-;4735:63;;4690:118;4341:474;;;;;:::o;4821:619::-;4898:6;4906;4914;4963:2;4951:9;4942:7;4938:23;4934:32;4931:119;;;4969:79;;:::i;:::-;4931:119;5089:1;5114:53;5159:7;5150:6;5139:9;5135:22;5114:53;:::i;:::-;5104:63;;5060:117;5216:2;5242:53;5287:7;5278:6;5267:9;5263:22;5242:53;:::i;:::-;5232:63;;5187:118;5344:2;5370:53;5415:7;5406:6;5395:9;5391:22;5370:53;:::i;:::-;5360:63;;5315:118;4821:619;;;;;:::o;5446:943::-;5541:6;5549;5557;5565;5614:3;5602:9;5593:7;5589:23;5585:33;5582:120;;;5621:79;;:::i;:::-;5582:120;5741:1;5766:53;5811:7;5802:6;5791:9;5787:22;5766:53;:::i;:::-;5756:63;;5712:117;5868:2;5894:53;5939:7;5930:6;5919:9;5915:22;5894:53;:::i;:::-;5884:63;;5839:118;5996:2;6022:53;6067:7;6058:6;6047:9;6043:22;6022:53;:::i;:::-;6012:63;;5967:118;6152:2;6141:9;6137:18;6124:32;6183:18;6175:6;6172:30;6169:117;;;6205:79;;:::i;:::-;6169:117;6310:62;6364:7;6355:6;6344:9;6340:22;6310:62;:::i;:::-;6300:72;;6095:287;5446:943;;;;;;;:::o;6395:468::-;6460:6;6468;6517:2;6505:9;6496:7;6492:23;6488:32;6485:119;;;6523:79;;:::i;:::-;6485:119;6643:1;6668:53;6713:7;6704:6;6693:9;6689:22;6668:53;:::i;:::-;6658:63;;6614:117;6770:2;6796:50;6838:7;6829:6;6818:9;6814:22;6796:50;:::i;:::-;6786:60;;6741:115;6395:468;;;;;:::o;6869:474::-;6937:6;6945;6994:2;6982:9;6973:7;6969:23;6965:32;6962:119;;;7000:79;;:::i;:::-;6962:119;7120:1;7145:53;7190:7;7181:6;7170:9;7166:22;7145:53;:::i;:::-;7135:63;;7091:117;7247:2;7273:53;7318:7;7309:6;7298:9;7294:22;7273:53;:::i;:::-;7263:63;;7218:118;6869:474;;;;;:::o;7349:559::-;7435:6;7443;7492:2;7480:9;7471:7;7467:23;7463:32;7460:119;;;7498:79;;:::i;:::-;7460:119;7646:1;7635:9;7631:17;7618:31;7676:18;7668:6;7665:30;7662:117;;;7698:79;;:::i;:::-;7662:117;7811:80;7883:7;7874:6;7863:9;7859:22;7811:80;:::i;:::-;7793:98;;;;7589:312;7349:559;;;;;:::o;7914:539::-;7998:6;8047:2;8035:9;8026:7;8022:23;8018:32;8015:119;;;8053:79;;:::i;:::-;8015:119;8201:1;8190:9;8186:17;8173:31;8231:18;8223:6;8220:30;8217:117;;;8253:79;;:::i;:::-;8217:117;8358:78;8428:7;8419:6;8408:9;8404:22;8358:78;:::i;:::-;8348:88;;8144:302;7914:539;;;;:::o;8459:327::-;8517:6;8566:2;8554:9;8545:7;8541:23;8537:32;8534:119;;;8572:79;;:::i;:::-;8534:119;8692:1;8717:52;8761:7;8752:6;8741:9;8737:22;8717:52;:::i;:::-;8707:62;;8663:116;8459:327;;;;:::o;8792:349::-;8861:6;8910:2;8898:9;8889:7;8885:23;8881:32;8878:119;;;8916:79;;:::i;:::-;8878:119;9036:1;9061:63;9116:7;9107:6;9096:9;9092:22;9061:63;:::i;:::-;9051:73;;9007:127;8792:349;;;;:::o;9147:509::-;9216:6;9265:2;9253:9;9244:7;9240:23;9236:32;9233:119;;;9271:79;;:::i;:::-;9233:119;9419:1;9408:9;9404:17;9391:31;9449:18;9441:6;9438:30;9435:117;;;9471:79;;:::i;:::-;9435:117;9576:63;9631:7;9622:6;9611:9;9607:22;9576:63;:::i;:::-;9566:73;;9362:287;9147:509;;;;:::o;9662:329::-;9721:6;9770:2;9758:9;9749:7;9745:23;9741:32;9738:119;;;9776:79;;:::i;:::-;9738:119;9896:1;9921:53;9966:7;9957:6;9946:9;9942:22;9921:53;:::i;:::-;9911:63;;9867:117;9662:329;;;;:::o;9997:118::-;10084:24;10102:5;10084:24;:::i;:::-;10079:3;10072:37;9997:118;;:::o;10121:109::-;10202:21;10217:5;10202:21;:::i;:::-;10197:3;10190:34;10121:109;;:::o;10236:360::-;10322:3;10350:38;10382:5;10350:38;:::i;:::-;10404:70;10467:6;10462:3;10404:70;:::i;:::-;10397:77;;10483:52;10528:6;10523:3;10516:4;10509:5;10505:16;10483:52;:::i;:::-;10560:29;10582:6;10560:29;:::i;:::-;10555:3;10551:39;10544:46;;10326:270;10236:360;;;;:::o;10602:364::-;10690:3;10718:39;10751:5;10718:39;:::i;:::-;10773:71;10837:6;10832:3;10773:71;:::i;:::-;10766:78;;10853:52;10898:6;10893:3;10886:4;10879:5;10875:16;10853:52;:::i;:::-;10930:29;10952:6;10930:29;:::i;:::-;10925:3;10921:39;10914:46;;10694:272;10602:364;;;;:::o;10972:377::-;11078:3;11106:39;11139:5;11106:39;:::i;:::-;11161:89;11243:6;11238:3;11161:89;:::i;:::-;11154:96;;11259:52;11304:6;11299:3;11292:4;11285:5;11281:16;11259:52;:::i;:::-;11336:6;11331:3;11327:16;11320:23;;11082:267;10972:377;;;;:::o;11355:366::-;11497:3;11518:67;11582:2;11577:3;11518:67;:::i;:::-;11511:74;;11594:93;11683:3;11594:93;:::i;:::-;11712:2;11707:3;11703:12;11696:19;;11355:366;;;:::o;11727:::-;11869:3;11890:67;11954:2;11949:3;11890:67;:::i;:::-;11883:74;;11966:93;12055:3;11966:93;:::i;:::-;12084:2;12079:3;12075:12;12068:19;;11727:366;;;:::o;12099:::-;12241:3;12262:67;12326:2;12321:3;12262:67;:::i;:::-;12255:74;;12338:93;12427:3;12338:93;:::i;:::-;12456:2;12451:3;12447:12;12440:19;;12099:366;;;:::o;12471:::-;12613:3;12634:67;12698:2;12693:3;12634:67;:::i;:::-;12627:74;;12710:93;12799:3;12710:93;:::i;:::-;12828:2;12823:3;12819:12;12812:19;;12471:366;;;:::o;12843:::-;12985:3;13006:67;13070:2;13065:3;13006:67;:::i;:::-;12999:74;;13082:93;13171:3;13082:93;:::i;:::-;13200:2;13195:3;13191:12;13184:19;;12843:366;;;:::o;13215:::-;13357:3;13378:67;13442:2;13437:3;13378:67;:::i;:::-;13371:74;;13454:93;13543:3;13454:93;:::i;:::-;13572:2;13567:3;13563:12;13556:19;;13215:366;;;:::o;13587:::-;13729:3;13750:67;13814:2;13809:3;13750:67;:::i;:::-;13743:74;;13826:93;13915:3;13826:93;:::i;:::-;13944:2;13939:3;13935:12;13928:19;;13587:366;;;:::o;13959:::-;14101:3;14122:67;14186:2;14181:3;14122:67;:::i;:::-;14115:74;;14198:93;14287:3;14198:93;:::i;:::-;14316:2;14311:3;14307:12;14300:19;;13959:366;;;:::o;14331:::-;14473:3;14494:67;14558:2;14553:3;14494:67;:::i;:::-;14487:74;;14570:93;14659:3;14570:93;:::i;:::-;14688:2;14683:3;14679:12;14672:19;;14331:366;;;:::o;14703:::-;14845:3;14866:67;14930:2;14925:3;14866:67;:::i;:::-;14859:74;;14942:93;15031:3;14942:93;:::i;:::-;15060:2;15055:3;15051:12;15044:19;;14703:366;;;:::o;15075:::-;15217:3;15238:67;15302:2;15297:3;15238:67;:::i;:::-;15231:74;;15314:93;15403:3;15314:93;:::i;:::-;15432:2;15427:3;15423:12;15416:19;;15075:366;;;:::o;15447:::-;15589:3;15610:67;15674:2;15669:3;15610:67;:::i;:::-;15603:74;;15686:93;15775:3;15686:93;:::i;:::-;15804:2;15799:3;15795:12;15788:19;;15447:366;;;:::o;15819:::-;15961:3;15982:67;16046:2;16041:3;15982:67;:::i;:::-;15975:74;;16058:93;16147:3;16058:93;:::i;:::-;16176:2;16171:3;16167:12;16160:19;;15819:366;;;:::o;16191:::-;16333:3;16354:67;16418:2;16413:3;16354:67;:::i;:::-;16347:74;;16430:93;16519:3;16430:93;:::i;:::-;16548:2;16543:3;16539:12;16532:19;;16191:366;;;:::o;16563:::-;16705:3;16726:67;16790:2;16785:3;16726:67;:::i;:::-;16719:74;;16802:93;16891:3;16802:93;:::i;:::-;16920:2;16915:3;16911:12;16904:19;;16563:366;;;:::o;16935:::-;17077:3;17098:67;17162:2;17157:3;17098:67;:::i;:::-;17091:74;;17174:93;17263:3;17174:93;:::i;:::-;17292:2;17287:3;17283:12;17276:19;;16935:366;;;:::o;17307:::-;17449:3;17470:67;17534:2;17529:3;17470:67;:::i;:::-;17463:74;;17546:93;17635:3;17546:93;:::i;:::-;17664:2;17659:3;17655:12;17648:19;;17307:366;;;:::o;17679:400::-;17839:3;17860:84;17942:1;17937:3;17860:84;:::i;:::-;17853:91;;17953:93;18042:3;17953:93;:::i;:::-;18071:1;18066:3;18062:11;18055:18;;17679:400;;;:::o;18085:366::-;18227:3;18248:67;18312:2;18307:3;18248:67;:::i;:::-;18241:74;;18324:93;18413:3;18324:93;:::i;:::-;18442:2;18437:3;18433:12;18426:19;;18085:366;;;:::o;18457:::-;18599:3;18620:67;18684:2;18679:3;18620:67;:::i;:::-;18613:74;;18696:93;18785:3;18696:93;:::i;:::-;18814:2;18809:3;18805:12;18798:19;;18457:366;;;:::o;18829:::-;18971:3;18992:67;19056:2;19051:3;18992:67;:::i;:::-;18985:74;;19068:93;19157:3;19068:93;:::i;:::-;19186:2;19181:3;19177:12;19170:19;;18829:366;;;:::o;19201:::-;19343:3;19364:67;19428:2;19423:3;19364:67;:::i;:::-;19357:74;;19440:93;19529:3;19440:93;:::i;:::-;19558:2;19553:3;19549:12;19542:19;;19201:366;;;:::o;19573:::-;19715:3;19736:67;19800:2;19795:3;19736:67;:::i;:::-;19729:74;;19812:93;19901:3;19812:93;:::i;:::-;19930:2;19925:3;19921:12;19914:19;;19573:366;;;:::o;19945:::-;20087:3;20108:67;20172:2;20167:3;20108:67;:::i;:::-;20101:74;;20184:93;20273:3;20184:93;:::i;:::-;20302:2;20297:3;20293:12;20286:19;;19945:366;;;:::o;20317:::-;20459:3;20480:67;20544:2;20539:3;20480:67;:::i;:::-;20473:74;;20556:93;20645:3;20556:93;:::i;:::-;20674:2;20669:3;20665:12;20658:19;;20317:366;;;:::o;20689:::-;20831:3;20852:67;20916:2;20911:3;20852:67;:::i;:::-;20845:74;;20928:93;21017:3;20928:93;:::i;:::-;21046:2;21041:3;21037:12;21030:19;;20689:366;;;:::o;21061:::-;21203:3;21224:67;21288:2;21283:3;21224:67;:::i;:::-;21217:74;;21300:93;21389:3;21300:93;:::i;:::-;21418:2;21413:3;21409:12;21402:19;;21061:366;;;:::o;21433:::-;21575:3;21596:67;21660:2;21655:3;21596:67;:::i;:::-;21589:74;;21672:93;21761:3;21672:93;:::i;:::-;21790:2;21785:3;21781:12;21774:19;;21433:366;;;:::o;21805:::-;21947:3;21968:67;22032:2;22027:3;21968:67;:::i;:::-;21961:74;;22044:93;22133:3;22044:93;:::i;:::-;22162:2;22157:3;22153:12;22146:19;;21805:366;;;:::o;22177:::-;22319:3;22340:67;22404:2;22399:3;22340:67;:::i;:::-;22333:74;;22416:93;22505:3;22416:93;:::i;:::-;22534:2;22529:3;22525:12;22518:19;;22177:366;;;:::o;22549:::-;22691:3;22712:67;22776:2;22771:3;22712:67;:::i;:::-;22705:74;;22788:93;22877:3;22788:93;:::i;:::-;22906:2;22901:3;22897:12;22890:19;;22549:366;;;:::o;22921:118::-;23008:24;23026:5;23008:24;:::i;:::-;23003:3;22996:37;22921:118;;:::o;23045:701::-;23326:3;23348:95;23439:3;23430:6;23348:95;:::i;:::-;23341:102;;23460:95;23551:3;23542:6;23460:95;:::i;:::-;23453:102;;23572:148;23716:3;23572:148;:::i;:::-;23565:155;;23737:3;23730:10;;23045:701;;;;;:::o;23752:222::-;23845:4;23883:2;23872:9;23868:18;23860:26;;23896:71;23964:1;23953:9;23949:17;23940:6;23896:71;:::i;:::-;23752:222;;;;:::o;23980:640::-;24175:4;24213:3;24202:9;24198:19;24190:27;;24227:71;24295:1;24284:9;24280:17;24271:6;24227:71;:::i;:::-;24308:72;24376:2;24365:9;24361:18;24352:6;24308:72;:::i;:::-;24390;24458:2;24447:9;24443:18;24434:6;24390:72;:::i;:::-;24509:9;24503:4;24499:20;24494:2;24483:9;24479:18;24472:48;24537:76;24608:4;24599:6;24537:76;:::i;:::-;24529:84;;23980:640;;;;;;;:::o;24626:210::-;24713:4;24751:2;24740:9;24736:18;24728:26;;24764:65;24826:1;24815:9;24811:17;24802:6;24764:65;:::i;:::-;24626:210;;;;:::o;24842:313::-;24955:4;24993:2;24982:9;24978:18;24970:26;;25042:9;25036:4;25032:20;25028:1;25017:9;25013:17;25006:47;25070:78;25143:4;25134:6;25070:78;:::i;:::-;25062:86;;24842:313;;;;:::o;25161:419::-;25327:4;25365:2;25354:9;25350:18;25342:26;;25414:9;25408:4;25404:20;25400:1;25389:9;25385:17;25378:47;25442:131;25568:4;25442:131;:::i;:::-;25434:139;;25161:419;;;:::o;25586:::-;25752:4;25790:2;25779:9;25775:18;25767:26;;25839:9;25833:4;25829:20;25825:1;25814:9;25810:17;25803:47;25867:131;25993:4;25867:131;:::i;:::-;25859:139;;25586:419;;;:::o;26011:::-;26177:4;26215:2;26204:9;26200:18;26192:26;;26264:9;26258:4;26254:20;26250:1;26239:9;26235:17;26228:47;26292:131;26418:4;26292:131;:::i;:::-;26284:139;;26011:419;;;:::o;26436:::-;26602:4;26640:2;26629:9;26625:18;26617:26;;26689:9;26683:4;26679:20;26675:1;26664:9;26660:17;26653:47;26717:131;26843:4;26717:131;:::i;:::-;26709:139;;26436:419;;;:::o;26861:::-;27027:4;27065:2;27054:9;27050:18;27042:26;;27114:9;27108:4;27104:20;27100:1;27089:9;27085:17;27078:47;27142:131;27268:4;27142:131;:::i;:::-;27134:139;;26861:419;;;:::o;27286:::-;27452:4;27490:2;27479:9;27475:18;27467:26;;27539:9;27533:4;27529:20;27525:1;27514:9;27510:17;27503:47;27567:131;27693:4;27567:131;:::i;:::-;27559:139;;27286:419;;;:::o;27711:::-;27877:4;27915:2;27904:9;27900:18;27892:26;;27964:9;27958:4;27954:20;27950:1;27939:9;27935:17;27928:47;27992:131;28118:4;27992:131;:::i;:::-;27984:139;;27711:419;;;:::o;28136:::-;28302:4;28340:2;28329:9;28325:18;28317:26;;28389:9;28383:4;28379:20;28375:1;28364:9;28360:17;28353:47;28417:131;28543:4;28417:131;:::i;:::-;28409:139;;28136:419;;;:::o;28561:::-;28727:4;28765:2;28754:9;28750:18;28742:26;;28814:9;28808:4;28804:20;28800:1;28789:9;28785:17;28778:47;28842:131;28968:4;28842:131;:::i;:::-;28834:139;;28561:419;;;:::o;28986:::-;29152:4;29190:2;29179:9;29175:18;29167:26;;29239:9;29233:4;29229:20;29225:1;29214:9;29210:17;29203:47;29267:131;29393:4;29267:131;:::i;:::-;29259:139;;28986:419;;;:::o;29411:::-;29577:4;29615:2;29604:9;29600:18;29592:26;;29664:9;29658:4;29654:20;29650:1;29639:9;29635:17;29628:47;29692:131;29818:4;29692:131;:::i;:::-;29684:139;;29411:419;;;:::o;29836:::-;30002:4;30040:2;30029:9;30025:18;30017:26;;30089:9;30083:4;30079:20;30075:1;30064:9;30060:17;30053:47;30117:131;30243:4;30117:131;:::i;:::-;30109:139;;29836:419;;;:::o;30261:::-;30427:4;30465:2;30454:9;30450:18;30442:26;;30514:9;30508:4;30504:20;30500:1;30489:9;30485:17;30478:47;30542:131;30668:4;30542:131;:::i;:::-;30534:139;;30261:419;;;:::o;30686:::-;30852:4;30890:2;30879:9;30875:18;30867:26;;30939:9;30933:4;30929:20;30925:1;30914:9;30910:17;30903:47;30967:131;31093:4;30967:131;:::i;:::-;30959:139;;30686:419;;;:::o;31111:::-;31277:4;31315:2;31304:9;31300:18;31292:26;;31364:9;31358:4;31354:20;31350:1;31339:9;31335:17;31328:47;31392:131;31518:4;31392:131;:::i;:::-;31384:139;;31111:419;;;:::o;31536:::-;31702:4;31740:2;31729:9;31725:18;31717:26;;31789:9;31783:4;31779:20;31775:1;31764:9;31760:17;31753:47;31817:131;31943:4;31817:131;:::i;:::-;31809:139;;31536:419;;;:::o;31961:::-;32127:4;32165:2;32154:9;32150:18;32142:26;;32214:9;32208:4;32204:20;32200:1;32189:9;32185:17;32178:47;32242:131;32368:4;32242:131;:::i;:::-;32234:139;;31961:419;;;:::o;32386:::-;32552:4;32590:2;32579:9;32575:18;32567:26;;32639:9;32633:4;32629:20;32625:1;32614:9;32610:17;32603:47;32667:131;32793:4;32667:131;:::i;:::-;32659:139;;32386:419;;;:::o;32811:::-;32977:4;33015:2;33004:9;33000:18;32992:26;;33064:9;33058:4;33054:20;33050:1;33039:9;33035:17;33028:47;33092:131;33218:4;33092:131;:::i;:::-;33084:139;;32811:419;;;:::o;33236:::-;33402:4;33440:2;33429:9;33425:18;33417:26;;33489:9;33483:4;33479:20;33475:1;33464:9;33460:17;33453:47;33517:131;33643:4;33517:131;:::i;:::-;33509:139;;33236:419;;;:::o;33661:::-;33827:4;33865:2;33854:9;33850:18;33842:26;;33914:9;33908:4;33904:20;33900:1;33889:9;33885:17;33878:47;33942:131;34068:4;33942:131;:::i;:::-;33934:139;;33661:419;;;:::o;34086:::-;34252:4;34290:2;34279:9;34275:18;34267:26;;34339:9;34333:4;34329:20;34325:1;34314:9;34310:17;34303:47;34367:131;34493:4;34367:131;:::i;:::-;34359:139;;34086:419;;;:::o;34511:::-;34677:4;34715:2;34704:9;34700:18;34692:26;;34764:9;34758:4;34754:20;34750:1;34739:9;34735:17;34728:47;34792:131;34918:4;34792:131;:::i;:::-;34784:139;;34511:419;;;:::o;34936:::-;35102:4;35140:2;35129:9;35125:18;35117:26;;35189:9;35183:4;35179:20;35175:1;35164:9;35160:17;35153:47;35217:131;35343:4;35217:131;:::i;:::-;35209:139;;34936:419;;;:::o;35361:::-;35527:4;35565:2;35554:9;35550:18;35542:26;;35614:9;35608:4;35604:20;35600:1;35589:9;35585:17;35578:47;35642:131;35768:4;35642:131;:::i;:::-;35634:139;;35361:419;;;:::o;35786:::-;35952:4;35990:2;35979:9;35975:18;35967:26;;36039:9;36033:4;36029:20;36025:1;36014:9;36010:17;36003:47;36067:131;36193:4;36067:131;:::i;:::-;36059:139;;35786:419;;;:::o;36211:::-;36377:4;36415:2;36404:9;36400:18;36392:26;;36464:9;36458:4;36454:20;36450:1;36439:9;36435:17;36428:47;36492:131;36618:4;36492:131;:::i;:::-;36484:139;;36211:419;;;:::o;36636:::-;36802:4;36840:2;36829:9;36825:18;36817:26;;36889:9;36883:4;36879:20;36875:1;36864:9;36860:17;36853:47;36917:131;37043:4;36917:131;:::i;:::-;36909:139;;36636:419;;;:::o;37061:::-;37227:4;37265:2;37254:9;37250:18;37242:26;;37314:9;37308:4;37304:20;37300:1;37289:9;37285:17;37278:47;37342:131;37468:4;37342:131;:::i;:::-;37334:139;;37061:419;;;:::o;37486:::-;37652:4;37690:2;37679:9;37675:18;37667:26;;37739:9;37733:4;37729:20;37725:1;37714:9;37710:17;37703:47;37767:131;37893:4;37767:131;:::i;:::-;37759:139;;37486:419;;;:::o;37911:222::-;38004:4;38042:2;38031:9;38027:18;38019:26;;38055:71;38123:1;38112:9;38108:17;38099:6;38055:71;:::i;:::-;37911:222;;;;:::o;38139:129::-;38173:6;38200:20;;:::i;:::-;38190:30;;38229:33;38257:4;38249:6;38229:33;:::i;:::-;38139:129;;;:::o;38274:75::-;38307:6;38340:2;38334:9;38324:19;;38274:75;:::o;38355:311::-;38432:4;38522:18;38514:6;38511:30;38508:56;;;38544:18;;:::i;:::-;38508:56;38594:4;38586:6;38582:17;38574:25;;38654:4;38648;38644:15;38636:23;;38355:311;;;:::o;38672:307::-;38733:4;38823:18;38815:6;38812:30;38809:56;;;38845:18;;:::i;:::-;38809:56;38883:29;38905:6;38883:29;:::i;:::-;38875:37;;38967:4;38961;38957:15;38949:23;;38672:307;;;:::o;38985:308::-;39047:4;39137:18;39129:6;39126:30;39123:56;;;39159:18;;:::i;:::-;39123:56;39197:29;39219:6;39197:29;:::i;:::-;39189:37;;39281:4;39275;39271:15;39263:23;;38985:308;;;:::o;39299:98::-;39350:6;39384:5;39378:12;39368:22;;39299:98;;;:::o;39403:99::-;39455:6;39489:5;39483:12;39473:22;;39403:99;;;:::o;39508:168::-;39591:11;39625:6;39620:3;39613:19;39665:4;39660:3;39656:14;39641:29;;39508:168;;;;:::o;39682:169::-;39766:11;39800:6;39795:3;39788:19;39840:4;39835:3;39831:14;39816:29;;39682:169;;;;:::o;39857:148::-;39959:11;39996:3;39981:18;;39857:148;;;;:::o;40011:305::-;40051:3;40070:20;40088:1;40070:20;:::i;:::-;40065:25;;40104:20;40122:1;40104:20;:::i;:::-;40099:25;;40258:1;40190:66;40186:74;40183:1;40180:81;40177:107;;;40264:18;;:::i;:::-;40177:107;40308:1;40305;40301:9;40294:16;;40011:305;;;;:::o;40322:185::-;40362:1;40379:20;40397:1;40379:20;:::i;:::-;40374:25;;40413:20;40431:1;40413:20;:::i;:::-;40408:25;;40452:1;40442:35;;40457:18;;:::i;:::-;40442:35;40499:1;40496;40492:9;40487:14;;40322:185;;;;:::o;40513:348::-;40553:7;40576:20;40594:1;40576:20;:::i;:::-;40571:25;;40610:20;40628:1;40610:20;:::i;:::-;40605:25;;40798:1;40730:66;40726:74;40723:1;40720:81;40715:1;40708:9;40701:17;40697:105;40694:131;;;40805:18;;:::i;:::-;40694:131;40853:1;40850;40846:9;40835:20;;40513:348;;;;:::o;40867:191::-;40907:4;40927:20;40945:1;40927:20;:::i;:::-;40922:25;;40961:20;40979:1;40961:20;:::i;:::-;40956:25;;41000:1;40997;40994:8;40991:34;;;41005:18;;:::i;:::-;40991:34;41050:1;41047;41043:9;41035:17;;40867:191;;;;:::o;41064:96::-;41101:7;41130:24;41148:5;41130:24;:::i;:::-;41119:35;;41064:96;;;:::o;41166:90::-;41200:7;41243:5;41236:13;41229:21;41218:32;;41166:90;;;:::o;41262:149::-;41298:7;41338:66;41331:5;41327:78;41316:89;;41262:149;;;:::o;41417:126::-;41454:7;41494:42;41487:5;41483:54;41472:65;;41417:126;;;:::o;41549:77::-;41586:7;41615:5;41604:16;;41549:77;;;:::o;41632:154::-;41716:6;41711:3;41706;41693:30;41778:1;41769:6;41764:3;41760:16;41753:27;41632:154;;;:::o;41792:307::-;41860:1;41870:113;41884:6;41881:1;41878:13;41870:113;;;41969:1;41964:3;41960:11;41954:18;41950:1;41945:3;41941:11;41934:39;41906:2;41903:1;41899:10;41894:15;;41870:113;;;42001:6;41998:1;41995:13;41992:101;;;42081:1;42072:6;42067:3;42063:16;42056:27;41992:101;41841:258;41792:307;;;:::o;42105:320::-;42149:6;42186:1;42180:4;42176:12;42166:22;;42233:1;42227:4;42223:12;42254:18;42244:81;;42310:4;42302:6;42298:17;42288:27;;42244:81;42372:2;42364:6;42361:14;42341:18;42338:38;42335:84;;;42391:18;;:::i;:::-;42335:84;42156:269;42105:320;;;:::o;42431:281::-;42514:27;42536:4;42514:27;:::i;:::-;42506:6;42502:40;42644:6;42632:10;42629:22;42608:18;42596:10;42593:34;42590:62;42587:88;;;42655:18;;:::i;:::-;42587:88;42695:10;42691:2;42684:22;42474:238;42431:281;;:::o;42718:233::-;42757:3;42780:24;42798:5;42780:24;:::i;:::-;42771:33;;42826:66;42819:5;42816:77;42813:103;;;42896:18;;:::i;:::-;42813:103;42943:1;42936:5;42932:13;42925:20;;42718:233;;;:::o;42957:176::-;42989:1;43006:20;43024:1;43006:20;:::i;:::-;43001:25;;43040:20;43058:1;43040:20;:::i;:::-;43035:25;;43079:1;43069:35;;43084:18;;:::i;:::-;43069:35;43125:1;43122;43118:9;43113:14;;42957:176;;;;:::o;43139:180::-;43187:77;43184:1;43177:88;43284:4;43281:1;43274:15;43308:4;43305:1;43298:15;43325:180;43373:77;43370:1;43363:88;43470:4;43467:1;43460:15;43494:4;43491:1;43484:15;43511:180;43559:77;43556:1;43549:88;43656:4;43653:1;43646:15;43680:4;43677:1;43670:15;43697:180;43745:77;43742:1;43735:88;43842:4;43839:1;43832:15;43866:4;43863:1;43856:15;43883:180;43931:77;43928:1;43921:88;44028:4;44025:1;44018:15;44052:4;44049:1;44042:15;44069:180;44117:77;44114:1;44107:88;44214:4;44211:1;44204:15;44238:4;44235:1;44228:15;44255:117;44364:1;44361;44354:12;44378:117;44487:1;44484;44477:12;44501:117;44610:1;44607;44600:12;44624:117;44733:1;44730;44723:12;44747:117;44856:1;44853;44846:12;44870:117;44979:1;44976;44969:12;44993:102;45034:6;45085:2;45081:7;45076:2;45069:5;45065:14;45061:28;45051:38;;44993:102;;;:::o;45101:222::-;45241:34;45237:1;45229:6;45225:14;45218:58;45310:5;45305:2;45297:6;45293:15;45286:30;45101:222;:::o;45329:238::-;45469:34;45465:1;45457:6;45453:14;45446:58;45538:21;45533:2;45525:6;45521:15;45514:46;45329:238;:::o;45573:230::-;45713:34;45709:1;45701:6;45697:14;45690:58;45782:13;45777:2;45769:6;45765:15;45758:38;45573:230;:::o;45809:237::-;45949:34;45945:1;45937:6;45933:14;45926:58;46018:20;46013:2;46005:6;46001:15;45994:45;45809:237;:::o;46052:225::-;46192:34;46188:1;46180:6;46176:14;46169:58;46261:8;46256:2;46248:6;46244:15;46237:33;46052:225;:::o;46283:178::-;46423:30;46419:1;46411:6;46407:14;46400:54;46283:178;:::o;46467:182::-;46607:34;46603:1;46595:6;46591:14;46584:58;46467:182;:::o;46655:223::-;46795:34;46791:1;46783:6;46779:14;46772:58;46864:6;46859:2;46851:6;46847:15;46840:31;46655:223;:::o;46884:175::-;47024:27;47020:1;47012:6;47008:14;47001:51;46884:175;:::o;47065:231::-;47205:34;47201:1;47193:6;47189:14;47182:58;47274:14;47269:2;47261:6;47257:15;47250:39;47065:231;:::o;47302:243::-;47442:34;47438:1;47430:6;47426:14;47419:58;47511:26;47506:2;47498:6;47494:15;47487:51;47302:243;:::o;47551:229::-;47691:34;47687:1;47679:6;47675:14;47668:58;47760:12;47755:2;47747:6;47743:15;47736:37;47551:229;:::o;47786:228::-;47926:34;47922:1;47914:6;47910:14;47903:58;47995:11;47990:2;47982:6;47978:15;47971:36;47786:228;:::o;48020:179::-;48160:31;48156:1;48148:6;48144:14;48137:55;48020:179;:::o;48205:182::-;48345:34;48341:1;48333:6;48329:14;48322:58;48205:182;:::o;48393:231::-;48533:34;48529:1;48521:6;48517:14;48510:58;48602:14;48597:2;48589:6;48585:15;48578:39;48393:231;:::o;48630:235::-;48770:34;48766:1;48758:6;48754:14;48747:58;48839:18;48834:2;48826:6;48822:15;48815:43;48630:235;:::o;48871:155::-;49011:7;49007:1;48999:6;48995:14;48988:31;48871:155;:::o;49032:222::-;49172:34;49168:1;49160:6;49156:14;49149:58;49241:5;49236:2;49228:6;49224:15;49217:30;49032:222;:::o;49260:182::-;49400:34;49396:1;49388:6;49384:14;49377:58;49260:182;:::o;49448:180::-;49588:32;49584:1;49576:6;49572:14;49565:56;49448:180;:::o;49634:176::-;49774:28;49770:1;49762:6;49758:14;49751:52;49634:176;:::o;49816:228::-;49956:34;49952:1;49944:6;49940:14;49933:58;50025:11;50020:2;50012:6;50008:15;50001:36;49816:228;:::o;50050:234::-;50190:34;50186:1;50178:6;50174:14;50167:58;50259:17;50254:2;50246:6;50242:15;50235:42;50050:234;:::o;50290:220::-;50430:34;50426:1;50418:6;50414:14;50407:58;50499:3;50494:2;50486:6;50482:15;50475:28;50290:220;:::o;50516:236::-;50656:34;50652:1;50644:6;50640:14;50633:58;50725:19;50720:2;50712:6;50708:15;50701:44;50516:236;:::o;50758:228::-;50898:34;50894:1;50886:6;50882:14;50875:58;50967:11;50962:2;50954:6;50950:15;50943:36;50758:228;:::o;50992:231::-;51132:34;51128:1;51120:6;51116:14;51109:58;51201:14;51196:2;51188:6;51184:15;51177:39;50992:231;:::o;51229:168::-;51369:20;51365:1;51357:6;51353:14;51346:44;51229:168;:::o;51403:232::-;51543:34;51539:1;51531:6;51527:14;51520:58;51612:15;51607:2;51599:6;51595:15;51588:40;51403:232;:::o;51641:182::-;51781:34;51777:1;51769:6;51765:14;51758:58;51641:182;:::o;51829:122::-;51902:24;51920:5;51902:24;:::i;:::-;51895:5;51892:35;51882:63;;51941:1;51938;51931:12;51882:63;51829:122;:::o;51957:116::-;52027:21;52042:5;52027:21;:::i;:::-;52020:5;52017:32;52007:60;;52063:1;52060;52053:12;52007:60;51957:116;:::o;52079:120::-;52151:23;52168:5;52151:23;:::i;:::-;52144:5;52141:34;52131:62;;52189:1;52186;52179:12;52131:62;52079:120;:::o;52205:122::-;52278:24;52296:5;52278:24;:::i;:::-;52271:5;52268:35;52258:63;;52317:1;52314;52307:12;52258:63;52205:122;:::o

Swarm Source

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