ETH Price: $3,402.47 (+1.71%)

Token

TheWickedLoot (WICKEDLOOT)
 

Overview

Max Total Supply

5,388 WICKEDLOOT

Holders

2,068

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 WICKEDLOOT
0xf7a45d0f0b6a88df803ee4d55a57ba3be21a0f3f
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

1 Cranium = 1 Loot https://wickedcranium.com/mint-loot

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
WickedLoot

Compiler Version
v0.8.3+commit.8d00100c

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

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol

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

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol

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

// File: @openzeppelin/contracts/utils/Address.sol

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

// File: @openzeppelin/contracts/utils/Context.sol

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

// File: @openzeppelin/contracts/utils/Strings.sol

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

}

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol

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

// File: @openzeppelin/contracts/token/ERC721/ERC721.sol

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 { }
}

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol

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

// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol

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

// File: @openzeppelin/contracts/access/Ownable.sol

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

// File: contracts/WickedLoot.sol

pragma solidity ^0.8.0;

abstract contract TWC {
  function ownerOf(uint256 tokenId) public virtual view returns (address);
  function tokenOfOwnerByIndex(address owner, uint256 index) public virtual view returns (uint256);
  function balanceOf(address owner) external virtual view returns (uint256 balance);
}

contract WickedLoot is ERC721Enumerable, Ownable {  
  
  TWC private twc = TWC(0x85f740958906b317de6ed79663012859067E745B); 
  string public WickedLootProvenance;
  bool public saleIsActive = false;
  uint256 public maxLoot = 10762;
  string private baseURI;

  constructor() ERC721("TheWickedLoot", "WICKEDLOOT") {
  }

  function setProvenanceHash(string memory provenanceHash) public onlyOwner {
    WickedLootProvenance = provenanceHash;
  }

  function isMinted(uint256 tokenId) external view returns (bool) {
    require(tokenId < maxLoot, "tokenId outside collection bounds");
    return _exists(tokenId);
  }

  function _baseURI() internal view override returns (string memory) {
    return baseURI;
  }
  
  function setBaseURI(string memory uri) public onlyOwner {
    baseURI = uri;
  }

  function flipSaleState() public onlyOwner {
    saleIsActive = !saleIsActive;
  }

  function mintLoot(uint256 startingIndex, uint256 totalLootToMint) public {
    require(saleIsActive, "Sale must be active to mint a Loot");
    require(totalLootToMint > 0, "Must mint at least one Loot");
    uint balance = twc.balanceOf(msg.sender);
    require(balance > 0, "Must hold at least one Cranium to mint a Loot");
    require(balance >= totalLootToMint, "Must hold at least as many Craniums as the number of Loot you intend to mint");
    require(balance >= startingIndex + totalLootToMint, "Must hold at least as many Craniums as the number of Loot you intend to mint");

    for(uint i = 0; i < balance && i < totalLootToMint; i++) {
      require(totalSupply() < maxLoot, "Cannot exceed max supply of Loot");
      uint tokenId = twc.tokenOfOwnerByIndex(msg.sender, i + startingIndex);
      if (!_exists(tokenId)) {
        _safeMint(msg.sender, tokenId);
      }
    }
  }


  function ownerMint(address[] memory ads, uint[] memory ids) public onlyOwner {
    for(uint i = 0; i < ads.length; i++) {
        _safeMint(ads[i], ids[i]);
    }
  }
}

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":"WickedLootProvenance","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"isMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxLoot","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"startingIndex","type":"uint256"},{"internalType":"uint256","name":"totalLootToMint","type":"uint256"}],"name":"mintLoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"ads","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","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":"uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenanceHash","type":"string"}],"name":"setProvenanceHash","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"}]

60806040527385f740958906b317de6ed79663012859067e745b600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600d60006101000a81548160ff021916908315150217905550612a0a600e553480156200008757600080fd5b506040518060400160405280600d81526020017f5468655769636b65644c6f6f74000000000000000000000000000000000000008152506040518060400160405280600a81526020017f5749434b45444c4f4f540000000000000000000000000000000000000000000081525081600090805190602001906200010c929190620001e7565b50806001908051906020019062000125929190620001e7565b50505060006200013a620001df60201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350620002fc565b600033905090565b828054620001f59062000297565b90600052602060002090601f01602090048101928262000219576000855562000265565b82601f106200023457805160ff191683800117855562000265565b8280016001018555821562000265579182015b828111156200026457825182559160200191906001019062000247565b5b50905062000274919062000278565b5090565b5b808211156200029357600081600090555060010162000279565b5090565b60006002820490506001821680620002b057607f821691505b60208210811415620002c757620002c6620002cd565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b614433806200030c6000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c80636352211e116100f9578063a22cb46511610097578063e985e9c511610071578063e985e9c5146104f1578063eb8d244414610521578063ebb2c8531461053f578063f2fde38b1461055b576101c4565b8063a22cb46514610489578063b88d4fde146104a5578063c87b56dd146104c1576101c4565b8063715018a6116100d3578063715018a6146104255780638da5cb5b1461042f578063959924341461044d57806395d89b411461046b576101c4565b80636352211e146103a957806369f7d2f2146103d957806370a08231146103f5576101c4565b80632f745c591161016657806342842e0e1161014057806342842e0e146103235780634bef36ac1461033f5780634f6ccce71461035d57806355f804b31461038d576101c4565b80632f745c59146102b957806333c41a90146102e957806334918dfd14610319576101c4565b8063095ea7b3116101a2578063095ea7b314610247578063109695231461026357806318160ddd1461027f57806323b872dd1461029d576101c4565b806301ffc9a7146101c957806306fdde03146101f9578063081812fc14610217575b600080fd5b6101e360048036038101906101de9190612f75565b610577565b6040516101f09190613562565b60405180910390f35b6102016105f1565b60405161020e919061357d565b60405180910390f35b610231600480360381019061022c9190613008565b610683565b60405161023e91906134d2565b60405180910390f35b610261600480360381019061025c9190612ecd565b610708565b005b61027d60048036038101906102789190612fc7565b610820565b005b6102876108b6565b604051610294919061389f565b60405180910390f35b6102b760048036038101906102b29190612dc7565b6108c3565b005b6102d360048036038101906102ce9190612ecd565b610923565b6040516102e0919061389f565b60405180910390f35b61030360048036038101906102fe9190613008565b6109c8565b6040516103109190613562565b60405180910390f35b610321610a1e565b005b61033d60048036038101906103389190612dc7565b610ac6565b005b610347610ae6565b604051610354919061357d565b60405180910390f35b61037760048036038101906103729190613008565b610b74565b604051610384919061389f565b60405180910390f35b6103a760048036038101906103a29190612fc7565b610c0b565b005b6103c360048036038101906103be9190613008565b610ca1565b6040516103d091906134d2565b60405180910390f35b6103f360048036038101906103ee9190612f09565b610d53565b005b61040f600480360381019061040a9190612d62565b610e7d565b60405161041c919061389f565b60405180910390f35b61042d610f35565b005b610437611072565b60405161044491906134d2565b60405180910390f35b61045561109c565b604051610462919061389f565b60405180910390f35b6104736110a2565b604051610480919061357d565b60405180910390f35b6104a3600480360381019061049e9190612e91565b611134565b005b6104bf60048036038101906104ba9190612e16565b6112b5565b005b6104db60048036038101906104d69190613008565b611317565b6040516104e8919061357d565b60405180910390f35b61050b60048036038101906105069190612d8b565b6113be565b6040516105189190613562565b60405180910390f35b610529611452565b6040516105369190613562565b60405180910390f35b6105596004803603810190610554919061305a565b611465565b005b61057560048036038101906105709190612d62565b6117c9565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105ea57506105e982611975565b5b9050919050565b60606000805461060090613b4d565b80601f016020809104026020016040519081016040528092919081815260200182805461062c90613b4d565b80156106795780601f1061064e57610100808354040283529160200191610679565b820191906000526020600020905b81548152906001019060200180831161065c57829003601f168201915b5050505050905090565b600061068e82611a57565b6106cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106c49061377f565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061071382610ca1565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610784576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077b9061383f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166107a3611ac3565b73ffffffffffffffffffffffffffffffffffffffff1614806107d257506107d1816107cc611ac3565b6113be565b5b610811576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610808906136df565b60405180910390fd5b61081b8383611acb565b505050565b610828611ac3565b73ffffffffffffffffffffffffffffffffffffffff16610846611072565b73ffffffffffffffffffffffffffffffffffffffff161461089c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108939061379f565b60405180910390fd5b80600c90805190602001906108b2929190612a45565b5050565b6000600880549050905090565b6108d46108ce611ac3565b82611b84565b610913576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090a9061385f565b60405180910390fd5b61091e838383611c62565b505050565b600061092e83610e7d565b821061096f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109669061359f565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6000600e548210610a0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a059061381f565b60405180910390fd5b610a1782611a57565b9050919050565b610a26611ac3565b73ffffffffffffffffffffffffffffffffffffffff16610a44611072565b73ffffffffffffffffffffffffffffffffffffffff1614610a9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a919061379f565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550565b610ae1838383604051806020016040528060008152506112b5565b505050565b600c8054610af390613b4d565b80601f0160208091040260200160405190810160405280929190818152602001828054610b1f90613b4d565b8015610b6c5780601f10610b4157610100808354040283529160200191610b6c565b820191906000526020600020905b815481529060010190602001808311610b4f57829003601f168201915b505050505081565b6000610b7e6108b6565b8210610bbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb69061387f565b60405180910390fd5b60088281548110610bf9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610c13611ac3565b73ffffffffffffffffffffffffffffffffffffffff16610c31611072565b73ffffffffffffffffffffffffffffffffffffffff1614610c87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7e9061379f565b60405180910390fd5b80600f9080519060200190610c9d929190612a45565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d419061371f565b60405180910390fd5b80915050919050565b610d5b611ac3565b73ffffffffffffffffffffffffffffffffffffffff16610d79611072565b73ffffffffffffffffffffffffffffffffffffffff1614610dcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc69061379f565b60405180910390fd5b60005b8251811015610e7857610e65838281518110610e17577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151838381518110610e58577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151611ebe565b8080610e7090613bb0565b915050610dd2565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610eee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee5906136ff565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610f3d611ac3565b73ffffffffffffffffffffffffffffffffffffffff16610f5b611072565b73ffffffffffffffffffffffffffffffffffffffff1614610fb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa89061379f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600e5481565b6060600180546110b190613b4d565b80601f01602080910402602001604051908101604052809291908181526020018280546110dd90613b4d565b801561112a5780601f106110ff5761010080835404028352916020019161112a565b820191906000526020600020905b81548152906001019060200180831161110d57829003601f168201915b5050505050905090565b61113c611ac3565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a19061367f565b60405180910390fd5b80600560006111b7611ac3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611264611ac3565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516112a99190613562565b60405180910390a35050565b6112c66112c0611ac3565b83611b84565b611305576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fc9061385f565b60405180910390fd5b61131184848484611edc565b50505050565b606061132282611a57565b611361576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611358906137df565b60405180910390fd5b600061136b611f38565b9050600081511161138b57604051806020016040528060008152506113b6565b8061139584611fca565b6040516020016113a69291906134ae565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600d60009054906101000a900460ff1681565b600d60009054906101000a900460ff166114b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ab9061361f565b60405180910390fd5b600081116114f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ee906135df565b60405180910390fd5b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b815260040161155491906134d2565b60206040518083038186803b15801561156c57600080fd5b505afa158015611580573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115a49190613031565b9050600081116115e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e09061375f565b60405180910390fd5b8181101561162c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611623906137ff565b60405180910390fd5b818361163891906139dc565b81101561167a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611671906137ff565b60405180910390fd5b60005b818110801561168b57508281105b156117c357600e5461169b6108b6565b106116db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d2906136bf565b60405180910390fd5b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f745c5933878561172891906139dc565b6040518363ffffffff1660e01b8152600401611745929190613539565b60206040518083038186803b15801561175d57600080fd5b505afa158015611771573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117959190613031565b90506117a081611a57565b6117af576117ae3382611ebe565b5b5080806117bb90613bb0565b91505061167d565b50505050565b6117d1611ac3565b73ffffffffffffffffffffffffffffffffffffffff166117ef611072565b73ffffffffffffffffffffffffffffffffffffffff1614611845576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183c9061379f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156118b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ac906135ff565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611a4057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611a505750611a4f82612177565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611b3e83610ca1565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611b8f82611a57565b611bce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc59061369f565b60405180910390fd5b6000611bd983610ca1565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611c4857508373ffffffffffffffffffffffffffffffffffffffff16611c3084610683565b73ffffffffffffffffffffffffffffffffffffffff16145b80611c595750611c5881856113be565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611c8282610ca1565b73ffffffffffffffffffffffffffffffffffffffff1614611cd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ccf906137bf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3f9061365f565b60405180910390fd5b611d538383836121e1565b611d5e600082611acb565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611dae9190613a63565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e0591906139dc565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611ed88282604051806020016040528060008152506122f5565b5050565b611ee7848484611c62565b611ef384848484612350565b611f32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f29906135bf565b60405180910390fd5b50505050565b6060600f8054611f4790613b4d565b80601f0160208091040260200160405190810160405280929190818152602001828054611f7390613b4d565b8015611fc05780601f10611f9557610100808354040283529160200191611fc0565b820191906000526020600020905b815481529060010190602001808311611fa357829003601f168201915b5050505050905090565b60606000821415612012576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612172565b600082905060005b6000821461204457808061202d90613bb0565b915050600a8261203d9190613a32565b915061201a565b60008167ffffffffffffffff811115612086577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156120b85781602001600182028036833780820191505090505b5090505b6000851461216b576001826120d19190613a63565b9150600a856120e09190613bf9565b60306120ec91906139dc565b60f81b818381518110612128577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856121649190613a32565b94506120bc565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6121ec8383836124e7565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561222f5761222a816124ec565b61226e565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461226d5761226c8382612535565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122b1576122ac816126a2565b6122f0565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146122ef576122ee82826127e5565b5b5b505050565b6122ff8383612864565b61230c6000848484612350565b61234b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612342906135bf565b60405180910390fd5b505050565b60006123718473ffffffffffffffffffffffffffffffffffffffff16612a32565b156124da578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261239a611ac3565b8786866040518563ffffffff1660e01b81526004016123bc94939291906134ed565b602060405180830381600087803b1580156123d657600080fd5b505af192505050801561240757506040513d601f19601f820116820180604052508101906124049190612f9e565b60015b61248a573d8060008114612437576040519150601f19603f3d011682016040523d82523d6000602084013e61243c565b606091505b50600081511415612482576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612479906135bf565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506124df565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161254284610e7d565b61254c9190613a63565b9050600060076000848152602001908152602001600020549050818114612631576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506126b69190613a63565b905060006009600084815260200190815260200160002054905060006008838154811061270c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612754577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806127c9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006127f083610e7d565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156128d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128cb9061373f565b60405180910390fd5b6128dd81611a57565b1561291d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129149061363f565b60405180910390fd5b612929600083836121e1565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461297991906139dc565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054612a5190613b4d565b90600052602060002090601f016020900481019282612a735760008555612aba565b82601f10612a8c57805160ff1916838001178555612aba565b82800160010185558215612aba579182015b82811115612ab9578251825591602001919060010190612a9e565b5b509050612ac79190612acb565b5090565b5b80821115612ae4576000816000905550600101612acc565b5090565b6000612afb612af6846138df565b6138ba565b90508083825260208201905082856020860282011115612b1a57600080fd5b60005b85811015612b4a5781612b308882612c3c565b845260208401935060208301925050600181019050612b1d565b5050509392505050565b6000612b67612b628461390b565b6138ba565b90508083825260208201905082856020860282011115612b8657600080fd5b60005b85811015612bb65781612b9c8882612d38565b845260208401935060208301925050600181019050612b89565b5050509392505050565b6000612bd3612bce84613937565b6138ba565b905082815260208101848484011115612beb57600080fd5b612bf6848285613b0b565b509392505050565b6000612c11612c0c84613968565b6138ba565b905082815260208101848484011115612c2957600080fd5b612c34848285613b0b565b509392505050565b600081359050612c4b816143a1565b92915050565b600082601f830112612c6257600080fd5b8135612c72848260208601612ae8565b91505092915050565b600082601f830112612c8c57600080fd5b8135612c9c848260208601612b54565b91505092915050565b600081359050612cb4816143b8565b92915050565b600081359050612cc9816143cf565b92915050565b600081519050612cde816143cf565b92915050565b600082601f830112612cf557600080fd5b8135612d05848260208601612bc0565b91505092915050565b600082601f830112612d1f57600080fd5b8135612d2f848260208601612bfe565b91505092915050565b600081359050612d47816143e6565b92915050565b600081519050612d5c816143e6565b92915050565b600060208284031215612d7457600080fd5b6000612d8284828501612c3c565b91505092915050565b60008060408385031215612d9e57600080fd5b6000612dac85828601612c3c565b9250506020612dbd85828601612c3c565b9150509250929050565b600080600060608486031215612ddc57600080fd5b6000612dea86828701612c3c565b9350506020612dfb86828701612c3c565b9250506040612e0c86828701612d38565b9150509250925092565b60008060008060808587031215612e2c57600080fd5b6000612e3a87828801612c3c565b9450506020612e4b87828801612c3c565b9350506040612e5c87828801612d38565b925050606085013567ffffffffffffffff811115612e7957600080fd5b612e8587828801612ce4565b91505092959194509250565b60008060408385031215612ea457600080fd5b6000612eb285828601612c3c565b9250506020612ec385828601612ca5565b9150509250929050565b60008060408385031215612ee057600080fd5b6000612eee85828601612c3c565b9250506020612eff85828601612d38565b9150509250929050565b60008060408385031215612f1c57600080fd5b600083013567ffffffffffffffff811115612f3657600080fd5b612f4285828601612c51565b925050602083013567ffffffffffffffff811115612f5f57600080fd5b612f6b85828601612c7b565b9150509250929050565b600060208284031215612f8757600080fd5b6000612f9584828501612cba565b91505092915050565b600060208284031215612fb057600080fd5b6000612fbe84828501612ccf565b91505092915050565b600060208284031215612fd957600080fd5b600082013567ffffffffffffffff811115612ff357600080fd5b612fff84828501612d0e565b91505092915050565b60006020828403121561301a57600080fd5b600061302884828501612d38565b91505092915050565b60006020828403121561304357600080fd5b600061305184828501612d4d565b91505092915050565b6000806040838503121561306d57600080fd5b600061307b85828601612d38565b925050602061308c85828601612d38565b9150509250929050565b61309f81613a97565b82525050565b6130ae81613aa9565b82525050565b60006130bf82613999565b6130c981856139af565b93506130d9818560208601613b1a565b6130e281613ce6565b840191505092915050565b60006130f8826139a4565b61310281856139c0565b9350613112818560208601613b1a565b61311b81613ce6565b840191505092915050565b6000613131826139a4565b61313b81856139d1565b935061314b818560208601613b1a565b80840191505092915050565b6000613164602b836139c0565b915061316f82613cf7565b604082019050919050565b60006131876032836139c0565b915061319282613d46565b604082019050919050565b60006131aa601b836139c0565b91506131b582613d95565b602082019050919050565b60006131cd6026836139c0565b91506131d882613dbe565b604082019050919050565b60006131f06022836139c0565b91506131fb82613e0d565b604082019050919050565b6000613213601c836139c0565b915061321e82613e5c565b602082019050919050565b60006132366024836139c0565b915061324182613e85565b604082019050919050565b60006132596019836139c0565b915061326482613ed4565b602082019050919050565b600061327c602c836139c0565b915061328782613efd565b604082019050919050565b600061329f6020836139c0565b91506132aa82613f4c565b602082019050919050565b60006132c26038836139c0565b91506132cd82613f75565b604082019050919050565b60006132e5602a836139c0565b91506132f082613fc4565b604082019050919050565b60006133086029836139c0565b915061331382614013565b604082019050919050565b600061332b6020836139c0565b915061333682614062565b602082019050919050565b600061334e602d836139c0565b91506133598261408b565b604082019050919050565b6000613371602c836139c0565b915061337c826140da565b604082019050919050565b60006133946020836139c0565b915061339f82614129565b602082019050919050565b60006133b76029836139c0565b91506133c282614152565b604082019050919050565b60006133da602f836139c0565b91506133e5826141a1565b604082019050919050565b60006133fd604c836139c0565b9150613408826141f0565b606082019050919050565b60006134206021836139c0565b915061342b82614265565b604082019050919050565b60006134436021836139c0565b915061344e826142b4565b604082019050919050565b60006134666031836139c0565b915061347182614303565b604082019050919050565b6000613489602c836139c0565b915061349482614352565b604082019050919050565b6134a881613b01565b82525050565b60006134ba8285613126565b91506134c68284613126565b91508190509392505050565b60006020820190506134e76000830184613096565b92915050565b60006080820190506135026000830187613096565b61350f6020830186613096565b61351c604083018561349f565b818103606083015261352e81846130b4565b905095945050505050565b600060408201905061354e6000830185613096565b61355b602083018461349f565b9392505050565b600060208201905061357760008301846130a5565b92915050565b6000602082019050818103600083015261359781846130ed565b905092915050565b600060208201905081810360008301526135b881613157565b9050919050565b600060208201905081810360008301526135d88161317a565b9050919050565b600060208201905081810360008301526135f88161319d565b9050919050565b60006020820190508181036000830152613618816131c0565b9050919050565b60006020820190508181036000830152613638816131e3565b9050919050565b6000602082019050818103600083015261365881613206565b9050919050565b6000602082019050818103600083015261367881613229565b9050919050565b600060208201905081810360008301526136988161324c565b9050919050565b600060208201905081810360008301526136b88161326f565b9050919050565b600060208201905081810360008301526136d881613292565b9050919050565b600060208201905081810360008301526136f8816132b5565b9050919050565b60006020820190508181036000830152613718816132d8565b9050919050565b60006020820190508181036000830152613738816132fb565b9050919050565b600060208201905081810360008301526137588161331e565b9050919050565b6000602082019050818103600083015261377881613341565b9050919050565b6000602082019050818103600083015261379881613364565b9050919050565b600060208201905081810360008301526137b881613387565b9050919050565b600060208201905081810360008301526137d8816133aa565b9050919050565b600060208201905081810360008301526137f8816133cd565b9050919050565b60006020820190508181036000830152613818816133f0565b9050919050565b6000602082019050818103600083015261383881613413565b9050919050565b6000602082019050818103600083015261385881613436565b9050919050565b6000602082019050818103600083015261387881613459565b9050919050565b600060208201905081810360008301526138988161347c565b9050919050565b60006020820190506138b4600083018461349f565b92915050565b60006138c46138d5565b90506138d08282613b7f565b919050565b6000604051905090565b600067ffffffffffffffff8211156138fa576138f9613cb7565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561392657613925613cb7565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561395257613951613cb7565b5b61395b82613ce6565b9050602081019050919050565b600067ffffffffffffffff82111561398357613982613cb7565b5b61398c82613ce6565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006139e782613b01565b91506139f283613b01565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613a2757613a26613c2a565b5b828201905092915050565b6000613a3d82613b01565b9150613a4883613b01565b925082613a5857613a57613c59565b5b828204905092915050565b6000613a6e82613b01565b9150613a7983613b01565b925082821015613a8c57613a8b613c2a565b5b828203905092915050565b6000613aa282613ae1565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613b38578082015181840152602081019050613b1d565b83811115613b47576000848401525b50505050565b60006002820490506001821680613b6557607f821691505b60208210811415613b7957613b78613c88565b5b50919050565b613b8882613ce6565b810181811067ffffffffffffffff82111715613ba757613ba6613cb7565b5b80604052505050565b6000613bbb82613b01565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613bee57613bed613c2a565b5b600182019050919050565b6000613c0482613b01565b9150613c0f83613b01565b925082613c1f57613c1e613c59565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4d757374206d696e74206174206c65617374206f6e65204c6f6f740000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f53616c65206d7573742062652061637469766520746f206d696e742061204c6f60008201527f6f74000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f43616e6e6f7420657863656564206d617820737570706c79206f66204c6f6f74600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4d75737420686f6c64206174206c65617374206f6e65204372616e69756d207460008201527f6f206d696e742061204c6f6f7400000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4d75737420686f6c64206174206c65617374206173206d616e79204372616e6960008201527f756d7320617320746865206e756d626572206f66204c6f6f7420796f7520696e60208201527f74656e6420746f206d696e740000000000000000000000000000000000000000604082015250565b7f746f6b656e4964206f75747369646520636f6c6c656374696f6e20626f756e6460008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6143aa81613a97565b81146143b557600080fd5b50565b6143c181613aa9565b81146143cc57600080fd5b50565b6143d881613ab5565b81146143e357600080fd5b50565b6143ef81613b01565b81146143fa57600080fd5b5056fea26469706673582212208a1c54d7f91351286236aea26ab5f0af336d4a631c2ae295729d54262a1b525a64736f6c63430008030033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101c45760003560e01c80636352211e116100f9578063a22cb46511610097578063e985e9c511610071578063e985e9c5146104f1578063eb8d244414610521578063ebb2c8531461053f578063f2fde38b1461055b576101c4565b8063a22cb46514610489578063b88d4fde146104a5578063c87b56dd146104c1576101c4565b8063715018a6116100d3578063715018a6146104255780638da5cb5b1461042f578063959924341461044d57806395d89b411461046b576101c4565b80636352211e146103a957806369f7d2f2146103d957806370a08231146103f5576101c4565b80632f745c591161016657806342842e0e1161014057806342842e0e146103235780634bef36ac1461033f5780634f6ccce71461035d57806355f804b31461038d576101c4565b80632f745c59146102b957806333c41a90146102e957806334918dfd14610319576101c4565b8063095ea7b3116101a2578063095ea7b314610247578063109695231461026357806318160ddd1461027f57806323b872dd1461029d576101c4565b806301ffc9a7146101c957806306fdde03146101f9578063081812fc14610217575b600080fd5b6101e360048036038101906101de9190612f75565b610577565b6040516101f09190613562565b60405180910390f35b6102016105f1565b60405161020e919061357d565b60405180910390f35b610231600480360381019061022c9190613008565b610683565b60405161023e91906134d2565b60405180910390f35b610261600480360381019061025c9190612ecd565b610708565b005b61027d60048036038101906102789190612fc7565b610820565b005b6102876108b6565b604051610294919061389f565b60405180910390f35b6102b760048036038101906102b29190612dc7565b6108c3565b005b6102d360048036038101906102ce9190612ecd565b610923565b6040516102e0919061389f565b60405180910390f35b61030360048036038101906102fe9190613008565b6109c8565b6040516103109190613562565b60405180910390f35b610321610a1e565b005b61033d60048036038101906103389190612dc7565b610ac6565b005b610347610ae6565b604051610354919061357d565b60405180910390f35b61037760048036038101906103729190613008565b610b74565b604051610384919061389f565b60405180910390f35b6103a760048036038101906103a29190612fc7565b610c0b565b005b6103c360048036038101906103be9190613008565b610ca1565b6040516103d091906134d2565b60405180910390f35b6103f360048036038101906103ee9190612f09565b610d53565b005b61040f600480360381019061040a9190612d62565b610e7d565b60405161041c919061389f565b60405180910390f35b61042d610f35565b005b610437611072565b60405161044491906134d2565b60405180910390f35b61045561109c565b604051610462919061389f565b60405180910390f35b6104736110a2565b604051610480919061357d565b60405180910390f35b6104a3600480360381019061049e9190612e91565b611134565b005b6104bf60048036038101906104ba9190612e16565b6112b5565b005b6104db60048036038101906104d69190613008565b611317565b6040516104e8919061357d565b60405180910390f35b61050b60048036038101906105069190612d8b565b6113be565b6040516105189190613562565b60405180910390f35b610529611452565b6040516105369190613562565b60405180910390f35b6105596004803603810190610554919061305a565b611465565b005b61057560048036038101906105709190612d62565b6117c9565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105ea57506105e982611975565b5b9050919050565b60606000805461060090613b4d565b80601f016020809104026020016040519081016040528092919081815260200182805461062c90613b4d565b80156106795780601f1061064e57610100808354040283529160200191610679565b820191906000526020600020905b81548152906001019060200180831161065c57829003601f168201915b5050505050905090565b600061068e82611a57565b6106cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106c49061377f565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061071382610ca1565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610784576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077b9061383f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166107a3611ac3565b73ffffffffffffffffffffffffffffffffffffffff1614806107d257506107d1816107cc611ac3565b6113be565b5b610811576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610808906136df565b60405180910390fd5b61081b8383611acb565b505050565b610828611ac3565b73ffffffffffffffffffffffffffffffffffffffff16610846611072565b73ffffffffffffffffffffffffffffffffffffffff161461089c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108939061379f565b60405180910390fd5b80600c90805190602001906108b2929190612a45565b5050565b6000600880549050905090565b6108d46108ce611ac3565b82611b84565b610913576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090a9061385f565b60405180910390fd5b61091e838383611c62565b505050565b600061092e83610e7d565b821061096f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109669061359f565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6000600e548210610a0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a059061381f565b60405180910390fd5b610a1782611a57565b9050919050565b610a26611ac3565b73ffffffffffffffffffffffffffffffffffffffff16610a44611072565b73ffffffffffffffffffffffffffffffffffffffff1614610a9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a919061379f565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550565b610ae1838383604051806020016040528060008152506112b5565b505050565b600c8054610af390613b4d565b80601f0160208091040260200160405190810160405280929190818152602001828054610b1f90613b4d565b8015610b6c5780601f10610b4157610100808354040283529160200191610b6c565b820191906000526020600020905b815481529060010190602001808311610b4f57829003601f168201915b505050505081565b6000610b7e6108b6565b8210610bbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb69061387f565b60405180910390fd5b60088281548110610bf9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610c13611ac3565b73ffffffffffffffffffffffffffffffffffffffff16610c31611072565b73ffffffffffffffffffffffffffffffffffffffff1614610c87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7e9061379f565b60405180910390fd5b80600f9080519060200190610c9d929190612a45565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d419061371f565b60405180910390fd5b80915050919050565b610d5b611ac3565b73ffffffffffffffffffffffffffffffffffffffff16610d79611072565b73ffffffffffffffffffffffffffffffffffffffff1614610dcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc69061379f565b60405180910390fd5b60005b8251811015610e7857610e65838281518110610e17577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151838381518110610e58577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151611ebe565b8080610e7090613bb0565b915050610dd2565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610eee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee5906136ff565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610f3d611ac3565b73ffffffffffffffffffffffffffffffffffffffff16610f5b611072565b73ffffffffffffffffffffffffffffffffffffffff1614610fb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa89061379f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600e5481565b6060600180546110b190613b4d565b80601f01602080910402602001604051908101604052809291908181526020018280546110dd90613b4d565b801561112a5780601f106110ff5761010080835404028352916020019161112a565b820191906000526020600020905b81548152906001019060200180831161110d57829003601f168201915b5050505050905090565b61113c611ac3565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a19061367f565b60405180910390fd5b80600560006111b7611ac3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611264611ac3565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516112a99190613562565b60405180910390a35050565b6112c66112c0611ac3565b83611b84565b611305576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112fc9061385f565b60405180910390fd5b61131184848484611edc565b50505050565b606061132282611a57565b611361576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611358906137df565b60405180910390fd5b600061136b611f38565b9050600081511161138b57604051806020016040528060008152506113b6565b8061139584611fca565b6040516020016113a69291906134ae565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600d60009054906101000a900460ff1681565b600d60009054906101000a900460ff166114b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ab9061361f565b60405180910390fd5b600081116114f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ee906135df565b60405180910390fd5b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b815260040161155491906134d2565b60206040518083038186803b15801561156c57600080fd5b505afa158015611580573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115a49190613031565b9050600081116115e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e09061375f565b60405180910390fd5b8181101561162c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611623906137ff565b60405180910390fd5b818361163891906139dc565b81101561167a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611671906137ff565b60405180910390fd5b60005b818110801561168b57508281105b156117c357600e5461169b6108b6565b106116db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d2906136bf565b60405180910390fd5b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f745c5933878561172891906139dc565b6040518363ffffffff1660e01b8152600401611745929190613539565b60206040518083038186803b15801561175d57600080fd5b505afa158015611771573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117959190613031565b90506117a081611a57565b6117af576117ae3382611ebe565b5b5080806117bb90613bb0565b91505061167d565b50505050565b6117d1611ac3565b73ffffffffffffffffffffffffffffffffffffffff166117ef611072565b73ffffffffffffffffffffffffffffffffffffffff1614611845576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183c9061379f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156118b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ac906135ff565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611a4057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611a505750611a4f82612177565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611b3e83610ca1565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611b8f82611a57565b611bce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc59061369f565b60405180910390fd5b6000611bd983610ca1565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611c4857508373ffffffffffffffffffffffffffffffffffffffff16611c3084610683565b73ffffffffffffffffffffffffffffffffffffffff16145b80611c595750611c5881856113be565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611c8282610ca1565b73ffffffffffffffffffffffffffffffffffffffff1614611cd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ccf906137bf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3f9061365f565b60405180910390fd5b611d538383836121e1565b611d5e600082611acb565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611dae9190613a63565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e0591906139dc565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611ed88282604051806020016040528060008152506122f5565b5050565b611ee7848484611c62565b611ef384848484612350565b611f32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f29906135bf565b60405180910390fd5b50505050565b6060600f8054611f4790613b4d565b80601f0160208091040260200160405190810160405280929190818152602001828054611f7390613b4d565b8015611fc05780601f10611f9557610100808354040283529160200191611fc0565b820191906000526020600020905b815481529060010190602001808311611fa357829003601f168201915b5050505050905090565b60606000821415612012576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612172565b600082905060005b6000821461204457808061202d90613bb0565b915050600a8261203d9190613a32565b915061201a565b60008167ffffffffffffffff811115612086577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156120b85781602001600182028036833780820191505090505b5090505b6000851461216b576001826120d19190613a63565b9150600a856120e09190613bf9565b60306120ec91906139dc565b60f81b818381518110612128577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856121649190613a32565b94506120bc565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6121ec8383836124e7565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561222f5761222a816124ec565b61226e565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461226d5761226c8382612535565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122b1576122ac816126a2565b6122f0565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146122ef576122ee82826127e5565b5b5b505050565b6122ff8383612864565b61230c6000848484612350565b61234b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612342906135bf565b60405180910390fd5b505050565b60006123718473ffffffffffffffffffffffffffffffffffffffff16612a32565b156124da578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261239a611ac3565b8786866040518563ffffffff1660e01b81526004016123bc94939291906134ed565b602060405180830381600087803b1580156123d657600080fd5b505af192505050801561240757506040513d601f19601f820116820180604052508101906124049190612f9e565b60015b61248a573d8060008114612437576040519150601f19603f3d011682016040523d82523d6000602084013e61243c565b606091505b50600081511415612482576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612479906135bf565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506124df565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161254284610e7d565b61254c9190613a63565b9050600060076000848152602001908152602001600020549050818114612631576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506126b69190613a63565b905060006009600084815260200190815260200160002054905060006008838154811061270c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612754577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806127c9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006127f083610e7d565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156128d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128cb9061373f565b60405180910390fd5b6128dd81611a57565b1561291d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129149061363f565b60405180910390fd5b612929600083836121e1565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461297991906139dc565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054612a5190613b4d565b90600052602060002090601f016020900481019282612a735760008555612aba565b82601f10612a8c57805160ff1916838001178555612aba565b82800160010185558215612aba579182015b82811115612ab9578251825591602001919060010190612a9e565b5b509050612ac79190612acb565b5090565b5b80821115612ae4576000816000905550600101612acc565b5090565b6000612afb612af6846138df565b6138ba565b90508083825260208201905082856020860282011115612b1a57600080fd5b60005b85811015612b4a5781612b308882612c3c565b845260208401935060208301925050600181019050612b1d565b5050509392505050565b6000612b67612b628461390b565b6138ba565b90508083825260208201905082856020860282011115612b8657600080fd5b60005b85811015612bb65781612b9c8882612d38565b845260208401935060208301925050600181019050612b89565b5050509392505050565b6000612bd3612bce84613937565b6138ba565b905082815260208101848484011115612beb57600080fd5b612bf6848285613b0b565b509392505050565b6000612c11612c0c84613968565b6138ba565b905082815260208101848484011115612c2957600080fd5b612c34848285613b0b565b509392505050565b600081359050612c4b816143a1565b92915050565b600082601f830112612c6257600080fd5b8135612c72848260208601612ae8565b91505092915050565b600082601f830112612c8c57600080fd5b8135612c9c848260208601612b54565b91505092915050565b600081359050612cb4816143b8565b92915050565b600081359050612cc9816143cf565b92915050565b600081519050612cde816143cf565b92915050565b600082601f830112612cf557600080fd5b8135612d05848260208601612bc0565b91505092915050565b600082601f830112612d1f57600080fd5b8135612d2f848260208601612bfe565b91505092915050565b600081359050612d47816143e6565b92915050565b600081519050612d5c816143e6565b92915050565b600060208284031215612d7457600080fd5b6000612d8284828501612c3c565b91505092915050565b60008060408385031215612d9e57600080fd5b6000612dac85828601612c3c565b9250506020612dbd85828601612c3c565b9150509250929050565b600080600060608486031215612ddc57600080fd5b6000612dea86828701612c3c565b9350506020612dfb86828701612c3c565b9250506040612e0c86828701612d38565b9150509250925092565b60008060008060808587031215612e2c57600080fd5b6000612e3a87828801612c3c565b9450506020612e4b87828801612c3c565b9350506040612e5c87828801612d38565b925050606085013567ffffffffffffffff811115612e7957600080fd5b612e8587828801612ce4565b91505092959194509250565b60008060408385031215612ea457600080fd5b6000612eb285828601612c3c565b9250506020612ec385828601612ca5565b9150509250929050565b60008060408385031215612ee057600080fd5b6000612eee85828601612c3c565b9250506020612eff85828601612d38565b9150509250929050565b60008060408385031215612f1c57600080fd5b600083013567ffffffffffffffff811115612f3657600080fd5b612f4285828601612c51565b925050602083013567ffffffffffffffff811115612f5f57600080fd5b612f6b85828601612c7b565b9150509250929050565b600060208284031215612f8757600080fd5b6000612f9584828501612cba565b91505092915050565b600060208284031215612fb057600080fd5b6000612fbe84828501612ccf565b91505092915050565b600060208284031215612fd957600080fd5b600082013567ffffffffffffffff811115612ff357600080fd5b612fff84828501612d0e565b91505092915050565b60006020828403121561301a57600080fd5b600061302884828501612d38565b91505092915050565b60006020828403121561304357600080fd5b600061305184828501612d4d565b91505092915050565b6000806040838503121561306d57600080fd5b600061307b85828601612d38565b925050602061308c85828601612d38565b9150509250929050565b61309f81613a97565b82525050565b6130ae81613aa9565b82525050565b60006130bf82613999565b6130c981856139af565b93506130d9818560208601613b1a565b6130e281613ce6565b840191505092915050565b60006130f8826139a4565b61310281856139c0565b9350613112818560208601613b1a565b61311b81613ce6565b840191505092915050565b6000613131826139a4565b61313b81856139d1565b935061314b818560208601613b1a565b80840191505092915050565b6000613164602b836139c0565b915061316f82613cf7565b604082019050919050565b60006131876032836139c0565b915061319282613d46565b604082019050919050565b60006131aa601b836139c0565b91506131b582613d95565b602082019050919050565b60006131cd6026836139c0565b91506131d882613dbe565b604082019050919050565b60006131f06022836139c0565b91506131fb82613e0d565b604082019050919050565b6000613213601c836139c0565b915061321e82613e5c565b602082019050919050565b60006132366024836139c0565b915061324182613e85565b604082019050919050565b60006132596019836139c0565b915061326482613ed4565b602082019050919050565b600061327c602c836139c0565b915061328782613efd565b604082019050919050565b600061329f6020836139c0565b91506132aa82613f4c565b602082019050919050565b60006132c26038836139c0565b91506132cd82613f75565b604082019050919050565b60006132e5602a836139c0565b91506132f082613fc4565b604082019050919050565b60006133086029836139c0565b915061331382614013565b604082019050919050565b600061332b6020836139c0565b915061333682614062565b602082019050919050565b600061334e602d836139c0565b91506133598261408b565b604082019050919050565b6000613371602c836139c0565b915061337c826140da565b604082019050919050565b60006133946020836139c0565b915061339f82614129565b602082019050919050565b60006133b76029836139c0565b91506133c282614152565b604082019050919050565b60006133da602f836139c0565b91506133e5826141a1565b604082019050919050565b60006133fd604c836139c0565b9150613408826141f0565b606082019050919050565b60006134206021836139c0565b915061342b82614265565b604082019050919050565b60006134436021836139c0565b915061344e826142b4565b604082019050919050565b60006134666031836139c0565b915061347182614303565b604082019050919050565b6000613489602c836139c0565b915061349482614352565b604082019050919050565b6134a881613b01565b82525050565b60006134ba8285613126565b91506134c68284613126565b91508190509392505050565b60006020820190506134e76000830184613096565b92915050565b60006080820190506135026000830187613096565b61350f6020830186613096565b61351c604083018561349f565b818103606083015261352e81846130b4565b905095945050505050565b600060408201905061354e6000830185613096565b61355b602083018461349f565b9392505050565b600060208201905061357760008301846130a5565b92915050565b6000602082019050818103600083015261359781846130ed565b905092915050565b600060208201905081810360008301526135b881613157565b9050919050565b600060208201905081810360008301526135d88161317a565b9050919050565b600060208201905081810360008301526135f88161319d565b9050919050565b60006020820190508181036000830152613618816131c0565b9050919050565b60006020820190508181036000830152613638816131e3565b9050919050565b6000602082019050818103600083015261365881613206565b9050919050565b6000602082019050818103600083015261367881613229565b9050919050565b600060208201905081810360008301526136988161324c565b9050919050565b600060208201905081810360008301526136b88161326f565b9050919050565b600060208201905081810360008301526136d881613292565b9050919050565b600060208201905081810360008301526136f8816132b5565b9050919050565b60006020820190508181036000830152613718816132d8565b9050919050565b60006020820190508181036000830152613738816132fb565b9050919050565b600060208201905081810360008301526137588161331e565b9050919050565b6000602082019050818103600083015261377881613341565b9050919050565b6000602082019050818103600083015261379881613364565b9050919050565b600060208201905081810360008301526137b881613387565b9050919050565b600060208201905081810360008301526137d8816133aa565b9050919050565b600060208201905081810360008301526137f8816133cd565b9050919050565b60006020820190508181036000830152613818816133f0565b9050919050565b6000602082019050818103600083015261383881613413565b9050919050565b6000602082019050818103600083015261385881613436565b9050919050565b6000602082019050818103600083015261387881613459565b9050919050565b600060208201905081810360008301526138988161347c565b9050919050565b60006020820190506138b4600083018461349f565b92915050565b60006138c46138d5565b90506138d08282613b7f565b919050565b6000604051905090565b600067ffffffffffffffff8211156138fa576138f9613cb7565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561392657613925613cb7565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561395257613951613cb7565b5b61395b82613ce6565b9050602081019050919050565b600067ffffffffffffffff82111561398357613982613cb7565b5b61398c82613ce6565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006139e782613b01565b91506139f283613b01565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613a2757613a26613c2a565b5b828201905092915050565b6000613a3d82613b01565b9150613a4883613b01565b925082613a5857613a57613c59565b5b828204905092915050565b6000613a6e82613b01565b9150613a7983613b01565b925082821015613a8c57613a8b613c2a565b5b828203905092915050565b6000613aa282613ae1565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613b38578082015181840152602081019050613b1d565b83811115613b47576000848401525b50505050565b60006002820490506001821680613b6557607f821691505b60208210811415613b7957613b78613c88565b5b50919050565b613b8882613ce6565b810181811067ffffffffffffffff82111715613ba757613ba6613cb7565b5b80604052505050565b6000613bbb82613b01565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613bee57613bed613c2a565b5b600182019050919050565b6000613c0482613b01565b9150613c0f83613b01565b925082613c1f57613c1e613c59565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4d757374206d696e74206174206c65617374206f6e65204c6f6f740000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f53616c65206d7573742062652061637469766520746f206d696e742061204c6f60008201527f6f74000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f43616e6e6f7420657863656564206d617820737570706c79206f66204c6f6f74600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4d75737420686f6c64206174206c65617374206f6e65204372616e69756d207460008201527f6f206d696e742061204c6f6f7400000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4d75737420686f6c64206174206c65617374206173206d616e79204372616e6960008201527f756d7320617320746865206e756d626572206f66204c6f6f7420796f7520696e60208201527f74656e6420746f206d696e740000000000000000000000000000000000000000604082015250565b7f746f6b656e4964206f75747369646520636f6c6c656374696f6e20626f756e6460008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6143aa81613a97565b81146143b557600080fd5b50565b6143c181613aa9565b81146143cc57600080fd5b50565b6143d881613ab5565b81146143e357600080fd5b50565b6143ef81613b01565b81146143fa57600080fd5b5056fea26469706673582212208a1c54d7f91351286236aea26ab5f0af336d4a631c2ae295729d54262a1b525a64736f6c63430008030033

Deployed Bytecode Sourcemap

43037:2005:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34258:237;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21477:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22937:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22474:397;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43372:124;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34911:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23827:305;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34579:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43502:170;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43868:83;;;:::i;:::-;;24203:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43168:34;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35101:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43780:82;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21171:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44869:170;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20901:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42126:148;;;:::i;:::-;;41475:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43244:30;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21646:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23230:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24425:285;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21821:360;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23596:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43207:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43957:904;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42429:244;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34258:237;34360:4;34399:35;34384:50;;;:11;:50;;;;:103;;;;34451:36;34475:11;34451:23;:36::i;:::-;34384:103;34377:110;;34258:237;;;:::o;21477:100::-;21531:13;21564:5;21557:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21477:100;:::o;22937:221::-;23013:7;23041:16;23049:7;23041;:16::i;:::-;23033:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23126:15;:24;23142:7;23126:24;;;;;;;;;;;;;;;;;;;;;23119:31;;22937:221;;;:::o;22474:397::-;22555:13;22571:23;22586:7;22571:14;:23::i;:::-;22555:39;;22619:5;22613:11;;:2;:11;;;;22605:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22699:5;22683:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22708:37;22725:5;22732:12;:10;:12::i;:::-;22708:16;:37::i;:::-;22683:62;22675:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;22842:21;22851:2;22855:7;22842:8;:21::i;:::-;22474:397;;;:::o;43372:124::-;41706:12;:10;:12::i;:::-;41695:23;;:7;:5;:7::i;:::-;:23;;;41687:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43476:14:::1;43453:20;:37;;;;;;;;;;;;:::i;:::-;;43372:124:::0;:::o;34911:113::-;34972:7;34999:10;:17;;;;34992:24;;34911:113;:::o;23827:305::-;23988:41;24007:12;:10;:12::i;:::-;24021:7;23988:18;:41::i;:::-;23980:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24096:28;24106:4;24112:2;24116:7;24096:9;:28::i;:::-;23827:305;;;:::o;34579:256::-;34676:7;34712:23;34729:5;34712:16;:23::i;:::-;34704:5;:31;34696:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;34801:12;:19;34814:5;34801:19;;;;;;;;;;;;;;;:26;34821:5;34801:26;;;;;;;;;;;;34794:33;;34579:256;;;;:::o;43502:170::-;43560:4;43591:7;;43581;:17;43573:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;43650:16;43658:7;43650;:16::i;:::-;43643:23;;43502:170;;;:::o;43868:83::-;41706:12;:10;:12::i;:::-;41695:23;;:7;:5;:7::i;:::-;:23;;;41687:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43933:12:::1;;;;;;;;;;;43932:13;43917:12;;:28;;;;;;;;;;;;;;;;;;43868:83::o:0;24203:151::-;24307:39;24324:4;24330:2;24334:7;24307:39;;;;;;;;;;;;:16;:39::i;:::-;24203:151;;;:::o;43168:34::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35101:233::-;35176:7;35212:30;:28;:30::i;:::-;35204:5;:38;35196:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;35309:10;35320:5;35309:17;;;;;;;;;;;;;;;;;;;;;;;;35302:24;;35101:233;;;:::o;43780:82::-;41706:12;:10;:12::i;:::-;41695:23;;:7;:5;:7::i;:::-;:23;;;41687:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43853:3:::1;43843:7;:13;;;;;;;;;;;;:::i;:::-;;43780:82:::0;:::o;21171:239::-;21243:7;21263:13;21279:7;:16;21287:7;21279:16;;;;;;;;;;;;;;;;;;;;;21263:32;;21331:1;21314:19;;:5;:19;;;;21306:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21397:5;21390:12;;;21171:239;;;:::o;44869:170::-;41706:12;:10;:12::i;:::-;41695:23;;:7;:5;:7::i;:::-;:23;;;41687:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44957:6:::1;44953:81;44973:3;:10;44969:1;:14;44953:81;;;45001:25;45011:3;45015:1;45011:6;;;;;;;;;;;;;;;;;;;;;;45019:3;45023:1;45019:6;;;;;;;;;;;;;;;;;;;;;;45001:9;:25::i;:::-;44985:3;;;;;:::i;:::-;;;;44953:81;;;;44869:170:::0;;:::o;20901:208::-;20973:7;21018:1;21001:19;;:5;:19;;;;20993:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21085:9;:16;21095:5;21085:16;;;;;;;;;;;;;;;;21078:23;;20901:208;;;:::o;42126:148::-;41706:12;:10;:12::i;:::-;41695:23;;:7;:5;:7::i;:::-;:23;;;41687:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42233:1:::1;42196:40;;42217:6;;;;;;;;;;;42196:40;;;;;;;;;;;;42264:1;42247:6;;:19;;;;;;;;;;;;;;;;;;42126:148::o:0;41475:87::-;41521:7;41548:6;;;;;;;;;;;41541:13;;41475:87;:::o;43244:30::-;;;;:::o;21646:104::-;21702:13;21735:7;21728:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21646:104;:::o;23230:295::-;23345:12;:10;:12::i;:::-;23333:24;;:8;:24;;;;23325:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23445:8;23400:18;:32;23419:12;:10;:12::i;:::-;23400:32;;;;;;;;;;;;;;;:42;23433:8;23400:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;23498:8;23469:48;;23484:12;:10;:12::i;:::-;23469:48;;;23508:8;23469:48;;;;;;:::i;:::-;;;;;;;;23230:295;;:::o;24425:285::-;24557:41;24576:12;:10;:12::i;:::-;24590:7;24557:18;:41::i;:::-;24549:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24663:39;24677:4;24683:2;24687:7;24696:5;24663:13;:39::i;:::-;24425:285;;;;:::o;21821:360::-;21894:13;21928:16;21936:7;21928;:16::i;:::-;21920:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;22009:21;22033:10;:8;:10::i;:::-;22009:34;;22085:1;22067:7;22061:21;:25;:112;;;;;;;;;;;;;;;;;22126:7;22135:18;:7;:16;:18::i;:::-;22109:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22061:112;22054:119;;;21821:360;;;:::o;23596:164::-;23693:4;23717:18;:25;23736:5;23717:25;;;;;;;;;;;;;;;:35;23743:8;23717:35;;;;;;;;;;;;;;;;;;;;;;;;;23710:42;;23596:164;;;;:::o;43207:32::-;;;;;;;;;;;;;:::o;43957:904::-;44045:12;;;;;;;;;;;44037:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;44129:1;44111:15;:19;44103:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;44169:12;44184:3;;;;;;;;;;;:13;;;44198:10;44184:25;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44169:40;;44234:1;44224:7;:11;44216:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;44311:15;44300:7;:26;;44292:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;44449:15;44433:13;:31;;;;:::i;:::-;44422:7;:42;;44414:131;;;;;;;;;;;;:::i;:::-;;;;;;;;;44558:6;44554:302;44574:7;44570:1;:11;:34;;;;;44589:15;44585:1;:19;44570:34;44554:302;;;44644:7;;44628:13;:11;:13::i;:::-;:23;44620:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44697:12;44712:3;;;;;;;;;;;:23;;;44736:10;44752:13;44748:1;:17;;;;:::i;:::-;44712:54;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44697:69;;44780:16;44788:7;44780;:16::i;:::-;44775:74;;44809:30;44819:10;44831:7;44809:9;:30::i;:::-;44775:74;44554:302;44606:3;;;;;:::i;:::-;;;;44554:302;;;;43957:904;;;:::o;42429:244::-;41706:12;:10;:12::i;:::-;41695:23;;:7;:5;:7::i;:::-;:23;;;41687:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42538:1:::1;42518:22;;:8;:22;;;;42510:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;42628:8;42599:38;;42620:6;;;;;;;;;;;42599:38;;;;;;;;;;;;42657:8;42648:6;;:17;;;;;;;;;;;;;;;;;;42429:244:::0;:::o;20545:292::-;20647:4;20686:25;20671:40;;;:11;:40;;;;:105;;;;20743:33;20728:48;;;:11;:48;;;;20671:105;:158;;;;20793:36;20817:11;20793:23;:36::i;:::-;20671:158;20664:165;;20545:292;;;:::o;26177:127::-;26242:4;26294:1;26266:30;;:7;:16;26274:7;26266:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26259:37;;26177:127;;;:::o;15861:98::-;15914:7;15941:10;15934:17;;15861:98;:::o;30054:174::-;30156:2;30129:15;:24;30145:7;30129:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30212:7;30208:2;30174:46;;30183:23;30198:7;30183:14;:23::i;:::-;30174:46;;;;;;;;;;;;30054:174;;:::o;26471:348::-;26564:4;26589:16;26597:7;26589;:16::i;:::-;26581:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26665:13;26681:23;26696:7;26681:14;:23::i;:::-;26665:39;;26734:5;26723:16;;:7;:16;;;:51;;;;26767:7;26743:31;;:20;26755:7;26743:11;:20::i;:::-;:31;;;26723:51;:87;;;;26778:32;26795:5;26802:7;26778:16;:32::i;:::-;26723:87;26715:96;;;26471:348;;;;:::o;29392:544::-;29517:4;29490:31;;:23;29505:7;29490:14;:23::i;:::-;:31;;;29482:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;29600:1;29586:16;;:2;:16;;;;29578:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;29656:39;29677:4;29683:2;29687:7;29656:20;:39::i;:::-;29760:29;29777:1;29781:7;29760:8;:29::i;:::-;29821:1;29802:9;:15;29812:4;29802:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;29850:1;29833:9;:13;29843:2;29833:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29881:2;29862:7;:16;29870:7;29862:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29920:7;29916:2;29901:27;;29910:4;29901:27;;;;;;;;;;;;29392:544;;;:::o;27161:110::-;27237:26;27247:2;27251:7;27237:26;;;;;;;;;;;;:9;:26::i;:::-;27161:110;;:::o;25592:272::-;25706:28;25716:4;25722:2;25726:7;25706:9;:28::i;:::-;25753:48;25776:4;25782:2;25786:7;25795:5;25753:22;:48::i;:::-;25745:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25592:272;;;;:::o;43678:94::-;43730:13;43759:7;43752:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43678:94;:::o;16512:723::-;16568:13;16798:1;16789:5;:10;16785:53;;;16816:10;;;;;;;;;;;;;;;;;;;;;16785:53;16848:12;16863:5;16848:20;;16879:14;16904:78;16919:1;16911:4;:9;16904:78;;16937:8;;;;;:::i;:::-;;;;16968:2;16960:10;;;;;:::i;:::-;;;16904:78;;;16992:19;17024:6;17014:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16992:39;;17042:154;17058:1;17049:5;:10;17042:154;;17086:1;17076:11;;;;;:::i;:::-;;;17153:2;17145:5;:10;;;;:::i;:::-;17132:2;:24;;;;:::i;:::-;17119:39;;17102:6;17109;17102:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;17182:2;17173:11;;;;;:::i;:::-;;;17042:154;;;17220:6;17206:21;;;;;16512:723;;;;:::o;19061:157::-;19146:4;19185:25;19170:40;;;:11;:40;;;;19163:47;;19061:157;;;:::o;35947:555::-;36057:45;36084:4;36090:2;36094:7;36057:26;:45::i;:::-;36135:1;36119:18;;:4;:18;;;36115:187;;;36154:40;36186:7;36154:31;:40::i;:::-;36115:187;;;36224:2;36216:10;;:4;:10;;;36212:90;;36243:47;36276:4;36282:7;36243:32;:47::i;:::-;36212:90;36115:187;36330:1;36316:16;;:2;:16;;;36312:183;;;36349:45;36386:7;36349:36;:45::i;:::-;36312:183;;;36422:4;36416:10;;:2;:10;;;36412:83;;36443:40;36471:2;36475:7;36443:27;:40::i;:::-;36412:83;36312:183;35947:555;;;:::o;27498:250::-;27594:18;27600:2;27604:7;27594:5;:18::i;:::-;27631:54;27662:1;27666:2;27670:7;27679:5;27631:22;:54::i;:::-;27623:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;27498:250;;;:::o;30793:843::-;30914:4;30940:15;:2;:13;;;:15::i;:::-;30936:693;;;30992:2;30976:36;;;31013:12;:10;:12::i;:::-;31027:4;31033:7;31042:5;30976:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;30972:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31239:1;31222:6;:13;:18;31218:341;;;31265:60;;;;;;;;;;:::i;:::-;;;;;;;;31218:341;31509:6;31503:13;31494:6;31490:2;31486:15;31479:38;30972:602;31109:45;;;31099:55;;;:6;:55;;;;31092:62;;;;;30936:693;31613:4;31606:11;;30793:843;;;;;;;:::o;32249:93::-;;;;:::o;37225:164::-;37329:10;:17;;;;37302:15;:24;37318:7;37302:24;;;;;;;;;;;:44;;;;37357:10;37373:7;37357:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37225:164;:::o;38016:988::-;38282:22;38332:1;38307:22;38324:4;38307:16;:22::i;:::-;:26;;;;:::i;:::-;38282:51;;38344:18;38365:17;:26;38383:7;38365:26;;;;;;;;;;;;38344:47;;38512:14;38498:10;:28;38494:328;;38543:19;38565:12;:18;38578:4;38565:18;;;;;;;;;;;;;;;:34;38584:14;38565:34;;;;;;;;;;;;38543:56;;38649:11;38616:12;:18;38629:4;38616:18;;;;;;;;;;;;;;;:30;38635:10;38616:30;;;;;;;;;;;:44;;;;38766:10;38733:17;:30;38751:11;38733:30;;;;;;;;;;;:43;;;;38494:328;;38918:17;:26;38936:7;38918:26;;;;;;;;;;;38911:33;;;38962:12;:18;38975:4;38962:18;;;;;;;;;;;;;;;:34;38981:14;38962:34;;;;;;;;;;;38955:41;;;38016:988;;;;:::o;39299:1079::-;39552:22;39597:1;39577:10;:17;;;;:21;;;;:::i;:::-;39552:46;;39609:18;39630:15;:24;39646:7;39630:24;;;;;;;;;;;;39609:45;;39981:19;40003:10;40014:14;40003:26;;;;;;;;;;;;;;;;;;;;;;;;39981:48;;40067:11;40042:10;40053;40042:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;40178:10;40147:15;:28;40163:11;40147:28;;;;;;;;;;;:41;;;;40319:15;:24;40335:7;40319:24;;;;;;;;;;;40312:31;;;40354:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39299:1079;;;;:::o;36803:221::-;36888:14;36905:20;36922:2;36905:16;:20::i;:::-;36888:37;;36963:7;36936:12;:16;36949:2;36936:16;;;;;;;;;;;;;;;:24;36953:6;36936:24;;;;;;;;;;;:34;;;;37010:6;36981:17;:26;36999:7;36981:26;;;;;;;;;;;:35;;;;36803:221;;;:::o;28084:382::-;28178:1;28164:16;;:2;:16;;;;28156:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28237:16;28245:7;28237;:16::i;:::-;28236:17;28228:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28299:45;28328:1;28332:2;28336:7;28299:20;:45::i;:::-;28374:1;28357:9;:13;28367:2;28357:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28405:2;28386:7;:16;28394:7;28386:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28450:7;28446:2;28425:33;;28442:1;28425:33;;;;;;;;;;;;28084:382;;:::o;7982:422::-;8042:4;8250:12;8361:7;8349:20;8341:28;;8395:1;8388:4;:8;8381:15;;;7982:422;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:623:1:-;;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;274:6;267:5;260:21;300:4;293:5;289:16;282:23;;325:6;375:3;367:4;359:6;355:17;350:3;346:27;343:36;340:2;;;392:1;389;382:12;340:2;420:1;405:236;430:6;427:1;424:13;405:236;;;497:3;525:37;558:3;546:10;525:37;:::i;:::-;520:3;513:50;592:4;587:3;583:14;576:21;;626:4;621:3;617:14;610:21;;465:176;452:1;449;445:9;440:14;;405:236;;;409:14;126:521;;;;;;;:::o;670:623::-;;791:81;807:64;864:6;807:64;:::i;:::-;791:81;:::i;:::-;782:90;;892:5;920:6;913:5;906:21;946:4;939:5;935:16;928:23;;971:6;1021:3;1013:4;1005:6;1001:17;996:3;992:27;989:36;986:2;;;1038:1;1035;1028:12;986:2;1066:1;1051:236;1076:6;1073:1;1070:13;1051:236;;;1143:3;1171:37;1204:3;1192:10;1171:37;:::i;:::-;1166:3;1159:50;1238:4;1233:3;1229:14;1222:21;;1272:4;1267:3;1263:14;1256:21;;1111:176;1098:1;1095;1091:9;1086:14;;1051:236;;;1055:14;772:521;;;;;;;:::o;1299:343::-;;1401:65;1417:48;1458:6;1417:48;:::i;:::-;1401:65;:::i;:::-;1392:74;;1489:6;1482:5;1475:21;1527:4;1520:5;1516:16;1565:3;1556:6;1551:3;1547:16;1544:25;1541:2;;;1582:1;1579;1572:12;1541:2;1595:41;1629:6;1624:3;1619;1595:41;:::i;:::-;1382:260;;;;;;:::o;1648:345::-;;1751:66;1767:49;1809:6;1767:49;:::i;:::-;1751:66;:::i;:::-;1742:75;;1840:6;1833:5;1826:21;1878:4;1871:5;1867:16;1916:3;1907:6;1902:3;1898:16;1895:25;1892:2;;;1933:1;1930;1923:12;1892:2;1946:41;1980:6;1975:3;1970;1946:41;:::i;:::-;1732:261;;;;;;:::o;1999:139::-;;2083:6;2070:20;2061:29;;2099:33;2126:5;2099:33;:::i;:::-;2051:87;;;;:::o;2161:303::-;;2281:3;2274:4;2266:6;2262:17;2258:27;2248:2;;2299:1;2296;2289:12;2248:2;2339:6;2326:20;2364:94;2454:3;2446:6;2439:4;2431:6;2427:17;2364:94;:::i;:::-;2355:103;;2238:226;;;;;:::o;2487:303::-;;2607:3;2600:4;2592:6;2588:17;2584:27;2574:2;;2625:1;2622;2615:12;2574:2;2665:6;2652:20;2690:94;2780:3;2772:6;2765:4;2757:6;2753:17;2690:94;:::i;:::-;2681:103;;2564:226;;;;;:::o;2796:133::-;;2877:6;2864:20;2855:29;;2893:30;2917:5;2893:30;:::i;:::-;2845:84;;;;:::o;2935:137::-;;3018:6;3005:20;2996:29;;3034:32;3060:5;3034:32;:::i;:::-;2986:86;;;;:::o;3078:141::-;;3165:6;3159:13;3150:22;;3181:32;3207:5;3181:32;:::i;:::-;3140:79;;;;:::o;3238:271::-;;3342:3;3335:4;3327:6;3323:17;3319:27;3309:2;;3360:1;3357;3350:12;3309:2;3400:6;3387:20;3425:78;3499:3;3491:6;3484:4;3476:6;3472:17;3425:78;:::i;:::-;3416:87;;3299:210;;;;;:::o;3529:273::-;;3634:3;3627:4;3619:6;3615:17;3611:27;3601:2;;3652:1;3649;3642:12;3601:2;3692:6;3679:20;3717:79;3792:3;3784:6;3777:4;3769:6;3765:17;3717:79;:::i;:::-;3708:88;;3591:211;;;;;:::o;3808:139::-;;3892:6;3879:20;3870:29;;3908:33;3935:5;3908:33;:::i;:::-;3860:87;;;;:::o;3953:143::-;;4041:6;4035:13;4026:22;;4057:33;4084:5;4057:33;:::i;:::-;4016:80;;;;:::o;4102:262::-;;4210:2;4198:9;4189:7;4185:23;4181:32;4178:2;;;4226:1;4223;4216:12;4178:2;4269:1;4294:53;4339:7;4330:6;4319:9;4315:22;4294:53;:::i;:::-;4284:63;;4240:117;4168:196;;;;:::o;4370:407::-;;;4495:2;4483:9;4474:7;4470:23;4466:32;4463:2;;;4511:1;4508;4501:12;4463:2;4554:1;4579:53;4624:7;4615:6;4604:9;4600:22;4579:53;:::i;:::-;4569:63;;4525:117;4681:2;4707:53;4752:7;4743:6;4732:9;4728:22;4707:53;:::i;:::-;4697:63;;4652:118;4453:324;;;;;:::o;4783:552::-;;;;4925:2;4913:9;4904:7;4900:23;4896:32;4893:2;;;4941:1;4938;4931:12;4893:2;4984:1;5009:53;5054:7;5045:6;5034:9;5030:22;5009:53;:::i;:::-;4999:63;;4955:117;5111:2;5137:53;5182:7;5173:6;5162:9;5158:22;5137:53;:::i;:::-;5127:63;;5082:118;5239:2;5265:53;5310:7;5301:6;5290:9;5286:22;5265:53;:::i;:::-;5255:63;;5210:118;4883:452;;;;;:::o;5341:809::-;;;;;5509:3;5497:9;5488:7;5484:23;5480:33;5477:2;;;5526:1;5523;5516:12;5477:2;5569:1;5594:53;5639:7;5630:6;5619:9;5615:22;5594:53;:::i;:::-;5584:63;;5540:117;5696:2;5722:53;5767:7;5758:6;5747:9;5743:22;5722:53;:::i;:::-;5712:63;;5667:118;5824:2;5850:53;5895:7;5886:6;5875:9;5871:22;5850:53;:::i;:::-;5840:63;;5795:118;5980:2;5969:9;5965:18;5952:32;6011:18;6003:6;6000:30;5997:2;;;6043:1;6040;6033:12;5997:2;6071:62;6125:7;6116:6;6105:9;6101:22;6071:62;:::i;:::-;6061:72;;5923:220;5467:683;;;;;;;:::o;6156:401::-;;;6278:2;6266:9;6257:7;6253:23;6249:32;6246:2;;;6294:1;6291;6284:12;6246:2;6337:1;6362:53;6407:7;6398:6;6387:9;6383:22;6362:53;:::i;:::-;6352:63;;6308:117;6464:2;6490:50;6532:7;6523:6;6512:9;6508:22;6490:50;:::i;:::-;6480:60;;6435:115;6236:321;;;;;:::o;6563:407::-;;;6688:2;6676:9;6667:7;6663:23;6659:32;6656:2;;;6704:1;6701;6694:12;6656:2;6747:1;6772:53;6817:7;6808:6;6797:9;6793:22;6772:53;:::i;:::-;6762:63;;6718:117;6874:2;6900:53;6945:7;6936:6;6925:9;6921:22;6900:53;:::i;:::-;6890:63;;6845:118;6646:324;;;;;:::o;6976:693::-;;;7151:2;7139:9;7130:7;7126:23;7122:32;7119:2;;;7167:1;7164;7157:12;7119:2;7238:1;7227:9;7223:17;7210:31;7268:18;7260:6;7257:30;7254:2;;;7300:1;7297;7290:12;7254:2;7328:78;7398:7;7389:6;7378:9;7374:22;7328:78;:::i;:::-;7318:88;;7181:235;7483:2;7472:9;7468:18;7455:32;7514:18;7506:6;7503:30;7500:2;;;7546:1;7543;7536:12;7500:2;7574:78;7644:7;7635:6;7624:9;7620:22;7574:78;:::i;:::-;7564:88;;7426:236;7109:560;;;;;:::o;7675:260::-;;7782:2;7770:9;7761:7;7757:23;7753:32;7750:2;;;7798:1;7795;7788:12;7750:2;7841:1;7866:52;7910:7;7901:6;7890:9;7886:22;7866:52;:::i;:::-;7856:62;;7812:116;7740:195;;;;:::o;7941:282::-;;8059:2;8047:9;8038:7;8034:23;8030:32;8027:2;;;8075:1;8072;8065:12;8027:2;8118:1;8143:63;8198:7;8189:6;8178:9;8174:22;8143:63;:::i;:::-;8133:73;;8089:127;8017:206;;;;:::o;8229:375::-;;8347:2;8335:9;8326:7;8322:23;8318:32;8315:2;;;8363:1;8360;8353:12;8315:2;8434:1;8423:9;8419:17;8406:31;8464:18;8456:6;8453:30;8450:2;;;8496:1;8493;8486:12;8450:2;8524:63;8579:7;8570:6;8559:9;8555:22;8524:63;:::i;:::-;8514:73;;8377:220;8305:299;;;;:::o;8610:262::-;;8718:2;8706:9;8697:7;8693:23;8689:32;8686:2;;;8734:1;8731;8724:12;8686:2;8777:1;8802:53;8847:7;8838:6;8827:9;8823:22;8802:53;:::i;:::-;8792:63;;8748:117;8676:196;;;;:::o;8878:284::-;;8997:2;8985:9;8976:7;8972:23;8968:32;8965:2;;;9013:1;9010;9003:12;8965:2;9056:1;9081:64;9137:7;9128:6;9117:9;9113:22;9081:64;:::i;:::-;9071:74;;9027:128;8955:207;;;;:::o;9168:407::-;;;9293:2;9281:9;9272:7;9268:23;9264:32;9261:2;;;9309:1;9306;9299:12;9261:2;9352:1;9377:53;9422:7;9413:6;9402:9;9398:22;9377:53;:::i;:::-;9367:63;;9323:117;9479:2;9505:53;9550:7;9541:6;9530:9;9526:22;9505:53;:::i;:::-;9495:63;;9450:118;9251:324;;;;;:::o;9581:118::-;9668:24;9686:5;9668:24;:::i;:::-;9663:3;9656:37;9646:53;;:::o;9705:109::-;9786:21;9801:5;9786:21;:::i;:::-;9781:3;9774:34;9764:50;;:::o;9820:360::-;;9934:38;9966:5;9934:38;:::i;:::-;9988:70;10051:6;10046:3;9988:70;:::i;:::-;9981:77;;10067:52;10112:6;10107:3;10100:4;10093:5;10089:16;10067:52;:::i;:::-;10144:29;10166:6;10144:29;:::i;:::-;10139:3;10135:39;10128:46;;9910:270;;;;;:::o;10186:364::-;;10302:39;10335:5;10302:39;:::i;:::-;10357:71;10421:6;10416:3;10357:71;:::i;:::-;10350:78;;10437:52;10482:6;10477:3;10470:4;10463:5;10459:16;10437:52;:::i;:::-;10514:29;10536:6;10514:29;:::i;:::-;10509:3;10505:39;10498:46;;10278:272;;;;;:::o;10556:377::-;;10690:39;10723:5;10690:39;:::i;:::-;10745:89;10827:6;10822:3;10745:89;:::i;:::-;10738:96;;10843:52;10888:6;10883:3;10876:4;10869:5;10865:16;10843:52;:::i;:::-;10920:6;10915:3;10911:16;10904:23;;10666:267;;;;;:::o;10939:366::-;;11102:67;11166:2;11161:3;11102:67;:::i;:::-;11095:74;;11178:93;11267:3;11178:93;:::i;:::-;11296:2;11291:3;11287:12;11280:19;;11085:220;;;:::o;11311:366::-;;11474:67;11538:2;11533:3;11474:67;:::i;:::-;11467:74;;11550:93;11639:3;11550:93;:::i;:::-;11668:2;11663:3;11659:12;11652:19;;11457:220;;;:::o;11683:366::-;;11846:67;11910:2;11905:3;11846:67;:::i;:::-;11839:74;;11922:93;12011:3;11922:93;:::i;:::-;12040:2;12035:3;12031:12;12024:19;;11829:220;;;:::o;12055:366::-;;12218:67;12282:2;12277:3;12218:67;:::i;:::-;12211:74;;12294:93;12383:3;12294:93;:::i;:::-;12412:2;12407:3;12403:12;12396:19;;12201:220;;;:::o;12427:366::-;;12590:67;12654:2;12649:3;12590:67;:::i;:::-;12583:74;;12666:93;12755:3;12666:93;:::i;:::-;12784:2;12779:3;12775:12;12768:19;;12573:220;;;:::o;12799:366::-;;12962:67;13026:2;13021:3;12962:67;:::i;:::-;12955:74;;13038:93;13127:3;13038:93;:::i;:::-;13156:2;13151:3;13147:12;13140:19;;12945:220;;;:::o;13171:366::-;;13334:67;13398:2;13393:3;13334:67;:::i;:::-;13327:74;;13410:93;13499:3;13410:93;:::i;:::-;13528:2;13523:3;13519:12;13512:19;;13317:220;;;:::o;13543:366::-;;13706:67;13770:2;13765:3;13706:67;:::i;:::-;13699:74;;13782:93;13871:3;13782:93;:::i;:::-;13900:2;13895:3;13891:12;13884:19;;13689:220;;;:::o;13915:366::-;;14078:67;14142:2;14137:3;14078:67;:::i;:::-;14071:74;;14154:93;14243:3;14154:93;:::i;:::-;14272:2;14267:3;14263:12;14256:19;;14061:220;;;:::o;14287:366::-;;14450:67;14514:2;14509:3;14450:67;:::i;:::-;14443:74;;14526:93;14615:3;14526:93;:::i;:::-;14644:2;14639:3;14635:12;14628:19;;14433:220;;;:::o;14659:366::-;;14822:67;14886:2;14881:3;14822:67;:::i;:::-;14815:74;;14898:93;14987:3;14898:93;:::i;:::-;15016:2;15011:3;15007:12;15000:19;;14805:220;;;:::o;15031:366::-;;15194:67;15258:2;15253:3;15194:67;:::i;:::-;15187:74;;15270:93;15359:3;15270:93;:::i;:::-;15388:2;15383:3;15379:12;15372:19;;15177:220;;;:::o;15403:366::-;;15566:67;15630:2;15625:3;15566:67;:::i;:::-;15559:74;;15642:93;15731:3;15642:93;:::i;:::-;15760:2;15755:3;15751:12;15744:19;;15549:220;;;:::o;15775:366::-;;15938:67;16002:2;15997:3;15938:67;:::i;:::-;15931:74;;16014:93;16103:3;16014:93;:::i;:::-;16132:2;16127:3;16123:12;16116:19;;15921:220;;;:::o;16147:366::-;;16310:67;16374:2;16369:3;16310:67;:::i;:::-;16303:74;;16386:93;16475:3;16386:93;:::i;:::-;16504:2;16499:3;16495:12;16488:19;;16293:220;;;:::o;16519:366::-;;16682:67;16746:2;16741:3;16682:67;:::i;:::-;16675:74;;16758:93;16847:3;16758:93;:::i;:::-;16876:2;16871:3;16867:12;16860:19;;16665:220;;;:::o;16891:366::-;;17054:67;17118:2;17113:3;17054:67;:::i;:::-;17047:74;;17130:93;17219:3;17130:93;:::i;:::-;17248:2;17243:3;17239:12;17232:19;;17037:220;;;:::o;17263:366::-;;17426:67;17490:2;17485:3;17426:67;:::i;:::-;17419:74;;17502:93;17591:3;17502:93;:::i;:::-;17620:2;17615:3;17611:12;17604:19;;17409:220;;;:::o;17635:366::-;;17798:67;17862:2;17857:3;17798:67;:::i;:::-;17791:74;;17874:93;17963:3;17874:93;:::i;:::-;17992:2;17987:3;17983:12;17976:19;;17781:220;;;:::o;18007:366::-;;18170:67;18234:2;18229:3;18170:67;:::i;:::-;18163:74;;18246:93;18335:3;18246:93;:::i;:::-;18364:2;18359:3;18355:12;18348:19;;18153:220;;;:::o;18379:366::-;;18542:67;18606:2;18601:3;18542:67;:::i;:::-;18535:74;;18618:93;18707:3;18618:93;:::i;:::-;18736:2;18731:3;18727:12;18720:19;;18525:220;;;:::o;18751:366::-;;18914:67;18978:2;18973:3;18914:67;:::i;:::-;18907:74;;18990:93;19079:3;18990:93;:::i;:::-;19108:2;19103:3;19099:12;19092:19;;18897:220;;;:::o;19123:366::-;;19286:67;19350:2;19345:3;19286:67;:::i;:::-;19279:74;;19362:93;19451:3;19362:93;:::i;:::-;19480:2;19475:3;19471:12;19464:19;;19269:220;;;:::o;19495:366::-;;19658:67;19722:2;19717:3;19658:67;:::i;:::-;19651:74;;19734:93;19823:3;19734:93;:::i;:::-;19852:2;19847:3;19843:12;19836:19;;19641:220;;;:::o;19867:118::-;19954:24;19972:5;19954:24;:::i;:::-;19949:3;19942:37;19932:53;;:::o;19991:435::-;;20193:95;20284:3;20275:6;20193:95;:::i;:::-;20186:102;;20305:95;20396:3;20387:6;20305:95;:::i;:::-;20298:102;;20417:3;20410:10;;20175:251;;;;;:::o;20432:222::-;;20563:2;20552:9;20548:18;20540:26;;20576:71;20644:1;20633:9;20629:17;20620:6;20576:71;:::i;:::-;20530:124;;;;:::o;20660:640::-;;20893:3;20882:9;20878:19;20870:27;;20907:71;20975:1;20964:9;20960:17;20951:6;20907:71;:::i;:::-;20988:72;21056:2;21045:9;21041:18;21032:6;20988:72;:::i;:::-;21070;21138:2;21127:9;21123:18;21114:6;21070:72;:::i;:::-;21189:9;21183:4;21179:20;21174:2;21163:9;21159:18;21152:48;21217:76;21288:4;21279:6;21217:76;:::i;:::-;21209:84;;20860:440;;;;;;;:::o;21306:332::-;;21465:2;21454:9;21450:18;21442:26;;21478:71;21546:1;21535:9;21531:17;21522:6;21478:71;:::i;:::-;21559:72;21627:2;21616:9;21612:18;21603:6;21559:72;:::i;:::-;21432:206;;;;;:::o;21644:210::-;;21769:2;21758:9;21754:18;21746:26;;21782:65;21844:1;21833:9;21829:17;21820:6;21782:65;:::i;:::-;21736:118;;;;:::o;21860:313::-;;22011:2;22000:9;21996:18;21988:26;;22060:9;22054:4;22050:20;22046:1;22035:9;22031:17;22024:47;22088:78;22161:4;22152:6;22088:78;:::i;:::-;22080:86;;21978:195;;;;:::o;22179:419::-;;22383:2;22372:9;22368:18;22360:26;;22432:9;22426:4;22422:20;22418:1;22407:9;22403:17;22396:47;22460:131;22586:4;22460:131;:::i;:::-;22452:139;;22350:248;;;:::o;22604:419::-;;22808:2;22797:9;22793:18;22785:26;;22857:9;22851:4;22847:20;22843:1;22832:9;22828:17;22821:47;22885:131;23011:4;22885:131;:::i;:::-;22877:139;;22775:248;;;:::o;23029:419::-;;23233:2;23222:9;23218:18;23210:26;;23282:9;23276:4;23272:20;23268:1;23257:9;23253:17;23246:47;23310:131;23436:4;23310:131;:::i;:::-;23302:139;;23200:248;;;:::o;23454:419::-;;23658:2;23647:9;23643:18;23635:26;;23707:9;23701:4;23697:20;23693:1;23682:9;23678:17;23671:47;23735:131;23861:4;23735:131;:::i;:::-;23727:139;;23625:248;;;:::o;23879:419::-;;24083:2;24072:9;24068:18;24060:26;;24132:9;24126:4;24122:20;24118:1;24107:9;24103:17;24096:47;24160:131;24286:4;24160:131;:::i;:::-;24152:139;;24050:248;;;:::o;24304:419::-;;24508:2;24497:9;24493:18;24485:26;;24557:9;24551:4;24547:20;24543:1;24532:9;24528:17;24521:47;24585:131;24711:4;24585:131;:::i;:::-;24577:139;;24475:248;;;:::o;24729:419::-;;24933:2;24922:9;24918:18;24910:26;;24982:9;24976:4;24972:20;24968:1;24957:9;24953:17;24946:47;25010:131;25136:4;25010:131;:::i;:::-;25002:139;;24900:248;;;:::o;25154:419::-;;25358:2;25347:9;25343:18;25335:26;;25407:9;25401:4;25397:20;25393:1;25382:9;25378:17;25371:47;25435:131;25561:4;25435:131;:::i;:::-;25427:139;;25325:248;;;:::o;25579:419::-;;25783:2;25772:9;25768:18;25760:26;;25832:9;25826:4;25822:20;25818:1;25807:9;25803:17;25796:47;25860:131;25986:4;25860:131;:::i;:::-;25852:139;;25750:248;;;:::o;26004:419::-;;26208:2;26197:9;26193:18;26185:26;;26257:9;26251:4;26247:20;26243:1;26232:9;26228:17;26221:47;26285:131;26411:4;26285:131;:::i;:::-;26277:139;;26175:248;;;:::o;26429:419::-;;26633:2;26622:9;26618:18;26610:26;;26682:9;26676:4;26672:20;26668:1;26657:9;26653:17;26646:47;26710:131;26836:4;26710:131;:::i;:::-;26702:139;;26600:248;;;:::o;26854:419::-;;27058:2;27047:9;27043:18;27035:26;;27107:9;27101:4;27097:20;27093:1;27082:9;27078:17;27071:47;27135:131;27261:4;27135:131;:::i;:::-;27127:139;;27025:248;;;:::o;27279:419::-;;27483:2;27472:9;27468:18;27460:26;;27532:9;27526:4;27522:20;27518:1;27507:9;27503:17;27496:47;27560:131;27686:4;27560:131;:::i;:::-;27552:139;;27450:248;;;:::o;27704:419::-;;27908:2;27897:9;27893:18;27885:26;;27957:9;27951:4;27947:20;27943:1;27932:9;27928:17;27921:47;27985:131;28111:4;27985:131;:::i;:::-;27977:139;;27875:248;;;:::o;28129:419::-;;28333:2;28322:9;28318:18;28310:26;;28382:9;28376:4;28372:20;28368:1;28357:9;28353:17;28346:47;28410:131;28536:4;28410:131;:::i;:::-;28402:139;;28300:248;;;:::o;28554:419::-;;28758:2;28747:9;28743:18;28735:26;;28807:9;28801:4;28797:20;28793:1;28782:9;28778:17;28771:47;28835:131;28961:4;28835:131;:::i;:::-;28827:139;;28725:248;;;:::o;28979:419::-;;29183:2;29172:9;29168:18;29160:26;;29232:9;29226:4;29222:20;29218:1;29207:9;29203:17;29196:47;29260:131;29386:4;29260:131;:::i;:::-;29252:139;;29150:248;;;:::o;29404:419::-;;29608:2;29597:9;29593:18;29585:26;;29657:9;29651:4;29647:20;29643:1;29632:9;29628:17;29621:47;29685:131;29811:4;29685:131;:::i;:::-;29677:139;;29575:248;;;:::o;29829:419::-;;30033:2;30022:9;30018:18;30010:26;;30082:9;30076:4;30072:20;30068:1;30057:9;30053:17;30046:47;30110:131;30236:4;30110:131;:::i;:::-;30102:139;;30000:248;;;:::o;30254:419::-;;30458:2;30447:9;30443:18;30435:26;;30507:9;30501:4;30497:20;30493:1;30482:9;30478:17;30471:47;30535:131;30661:4;30535:131;:::i;:::-;30527:139;;30425:248;;;:::o;30679:419::-;;30883:2;30872:9;30868:18;30860:26;;30932:9;30926:4;30922:20;30918:1;30907:9;30903:17;30896:47;30960:131;31086:4;30960:131;:::i;:::-;30952:139;;30850:248;;;:::o;31104:419::-;;31308:2;31297:9;31293:18;31285:26;;31357:9;31351:4;31347:20;31343:1;31332:9;31328:17;31321:47;31385:131;31511:4;31385:131;:::i;:::-;31377:139;;31275:248;;;:::o;31529:419::-;;31733:2;31722:9;31718:18;31710:26;;31782:9;31776:4;31772:20;31768:1;31757:9;31753:17;31746:47;31810:131;31936:4;31810:131;:::i;:::-;31802:139;;31700:248;;;:::o;31954:419::-;;32158:2;32147:9;32143:18;32135:26;;32207:9;32201:4;32197:20;32193:1;32182:9;32178:17;32171:47;32235:131;32361:4;32235:131;:::i;:::-;32227:139;;32125:248;;;:::o;32379:222::-;;32510:2;32499:9;32495:18;32487:26;;32523:71;32591:1;32580:9;32576:17;32567:6;32523:71;:::i;:::-;32477:124;;;;:::o;32607:129::-;;32668:20;;:::i;:::-;32658:30;;32697:33;32725:4;32717:6;32697:33;:::i;:::-;32648:88;;;:::o;32742:75::-;;32808:2;32802:9;32792:19;;32782:35;:::o;32823:311::-;;32990:18;32982:6;32979:30;32976:2;;;33012:18;;:::i;:::-;32976:2;33062:4;33054:6;33050:17;33042:25;;33122:4;33116;33112:15;33104:23;;32905:229;;;:::o;33140:311::-;;33307:18;33299:6;33296:30;33293:2;;;33329:18;;:::i;:::-;33293:2;33379:4;33371:6;33367:17;33359:25;;33439:4;33433;33429:15;33421:23;;33222:229;;;:::o;33457:307::-;;33608:18;33600:6;33597:30;33594:2;;;33630:18;;:::i;:::-;33594:2;33668:29;33690:6;33668:29;:::i;:::-;33660:37;;33752:4;33746;33742:15;33734:23;;33523:241;;;:::o;33770:308::-;;33922:18;33914:6;33911:30;33908:2;;;33944:18;;:::i;:::-;33908:2;33982:29;34004:6;33982:29;:::i;:::-;33974:37;;34066:4;34060;34056:15;34048:23;;33837:241;;;:::o;34084:98::-;;34169:5;34163:12;34153:22;;34142:40;;;:::o;34188:99::-;;34274:5;34268:12;34258:22;;34247:40;;;:::o;34293:168::-;;34410:6;34405:3;34398:19;34450:4;34445:3;34441:14;34426:29;;34388:73;;;;:::o;34467:169::-;;34585:6;34580:3;34573:19;34625:4;34620:3;34616:14;34601:29;;34563:73;;;;:::o;34642:148::-;;34781:3;34766:18;;34756:34;;;;:::o;34796:305::-;;34855:20;34873:1;34855:20;:::i;:::-;34850:25;;34889:20;34907:1;34889:20;:::i;:::-;34884:25;;35043:1;34975:66;34971:74;34968:1;34965:81;34962:2;;;35049:18;;:::i;:::-;34962:2;35093:1;35090;35086:9;35079:16;;34840:261;;;;:::o;35107:185::-;;35164:20;35182:1;35164:20;:::i;:::-;35159:25;;35198:20;35216:1;35198:20;:::i;:::-;35193:25;;35237:1;35227:2;;35242:18;;:::i;:::-;35227:2;35284:1;35281;35277:9;35272:14;;35149:143;;;;:::o;35298:191::-;;35358:20;35376:1;35358:20;:::i;:::-;35353:25;;35392:20;35410:1;35392:20;:::i;:::-;35387:25;;35431:1;35428;35425:8;35422:2;;;35436:18;;:::i;:::-;35422:2;35481:1;35478;35474:9;35466:17;;35343:146;;;;:::o;35495:96::-;;35561:24;35579:5;35561:24;:::i;:::-;35550:35;;35540:51;;;:::o;35597:90::-;;35674:5;35667:13;35660:21;35649:32;;35639:48;;;:::o;35693:149::-;;35769:66;35762:5;35758:78;35747:89;;35737:105;;;:::o;35848:126::-;;35925:42;35918:5;35914:54;35903:65;;35893:81;;;:::o;35980:77::-;;36046:5;36035:16;;36025:32;;;:::o;36063:154::-;36147:6;36142:3;36137;36124:30;36209:1;36200:6;36195:3;36191:16;36184:27;36114:103;;;:::o;36223:307::-;36291:1;36301:113;36315:6;36312:1;36309:13;36301:113;;;36400:1;36395:3;36391:11;36385:18;36381:1;36376:3;36372:11;36365:39;36337:2;36334:1;36330:10;36325:15;;36301:113;;;36432:6;36429:1;36426:13;36423:2;;;36512:1;36503:6;36498:3;36494:16;36487:27;36423:2;36272:258;;;;:::o;36536:320::-;;36617:1;36611:4;36607:12;36597:22;;36664:1;36658:4;36654:12;36685:18;36675:2;;36741:4;36733:6;36729:17;36719:27;;36675:2;36803;36795:6;36792:14;36772:18;36769:38;36766:2;;;36822:18;;:::i;:::-;36766:2;36587:269;;;;:::o;36862:281::-;36945:27;36967:4;36945:27;:::i;:::-;36937:6;36933:40;37075:6;37063:10;37060:22;37039:18;37027:10;37024:34;37021:62;37018:2;;;37086:18;;:::i;:::-;37018:2;37126:10;37122:2;37115:22;36905:238;;;:::o;37149:233::-;;37211:24;37229:5;37211:24;:::i;:::-;37202:33;;37257:66;37250:5;37247:77;37244:2;;;37327:18;;:::i;:::-;37244:2;37374:1;37367:5;37363:13;37356:20;;37192:190;;;:::o;37388:176::-;;37437:20;37455:1;37437:20;:::i;:::-;37432:25;;37471:20;37489:1;37471:20;:::i;:::-;37466:25;;37510:1;37500:2;;37515:18;;:::i;:::-;37500:2;37556:1;37553;37549:9;37544:14;;37422:142;;;;:::o;37570:180::-;37618:77;37615:1;37608:88;37715:4;37712:1;37705:15;37739:4;37736:1;37729:15;37756:180;37804:77;37801:1;37794:88;37901:4;37898:1;37891:15;37925:4;37922:1;37915:15;37942:180;37990:77;37987:1;37980:88;38087:4;38084:1;38077:15;38111:4;38108:1;38101:15;38128:180;38176:77;38173:1;38166:88;38273:4;38270:1;38263:15;38297:4;38294:1;38287:15;38314:102;;38406:2;38402:7;38397:2;38390:5;38386:14;38382:28;38372:38;;38362:54;;;:::o;38422:230::-;38562:34;38558:1;38550:6;38546:14;38539:58;38631:13;38626:2;38618:6;38614:15;38607:38;38528:124;:::o;38658:237::-;38798:34;38794:1;38786:6;38782:14;38775:58;38867:20;38862:2;38854:6;38850:15;38843:45;38764:131;:::o;38901:177::-;39041:29;39037:1;39029:6;39025:14;39018:53;39007:71;:::o;39084:225::-;39224:34;39220:1;39212:6;39208:14;39201:58;39293:8;39288:2;39280:6;39276:15;39269:33;39190:119;:::o;39315:221::-;39455:34;39451:1;39443:6;39439:14;39432:58;39524:4;39519:2;39511:6;39507:15;39500:29;39421:115;:::o;39542:178::-;39682:30;39678:1;39670:6;39666:14;39659:54;39648:72;:::o;39726:223::-;39866:34;39862:1;39854:6;39850:14;39843:58;39935:6;39930:2;39922:6;39918:15;39911:31;39832:117;:::o;39955:175::-;40095:27;40091:1;40083:6;40079:14;40072:51;40061:69;:::o;40136:231::-;40276:34;40272:1;40264:6;40260:14;40253:58;40345:14;40340:2;40332:6;40328:15;40321:39;40242:125;:::o;40373:182::-;40513:34;40509:1;40501:6;40497:14;40490:58;40479:76;:::o;40561:243::-;40701:34;40697:1;40689:6;40685:14;40678:58;40770:26;40765:2;40757:6;40753:15;40746:51;40667:137;:::o;40810:229::-;40950:34;40946:1;40938:6;40934:14;40927:58;41019:12;41014:2;41006:6;41002:15;40995:37;40916:123;:::o;41045:228::-;41185:34;41181:1;41173:6;41169:14;41162:58;41254:11;41249:2;41241:6;41237:15;41230:36;41151:122;:::o;41279:182::-;41419:34;41415:1;41407:6;41403:14;41396:58;41385:76;:::o;41467:232::-;41607:34;41603:1;41595:6;41591:14;41584:58;41676:15;41671:2;41663:6;41659:15;41652:40;41573:126;:::o;41705:231::-;41845:34;41841:1;41833:6;41829:14;41822:58;41914:14;41909:2;41901:6;41897:15;41890:39;41811:125;:::o;41942:182::-;42082:34;42078:1;42070:6;42066:14;42059:58;42048:76;:::o;42130:228::-;42270:34;42266:1;42258:6;42254:14;42247:58;42339:11;42334:2;42326:6;42322:15;42315:36;42236:122;:::o;42364:234::-;42504:34;42500:1;42492:6;42488:14;42481:58;42573:17;42568:2;42560:6;42556:15;42549:42;42470:128;:::o;42604:300::-;42744:34;42740:1;42732:6;42728:14;42721:58;42813:34;42808:2;42800:6;42796:15;42789:59;42882:14;42877:2;42869:6;42865:15;42858:39;42710:194;:::o;42910:220::-;43050:34;43046:1;43038:6;43034:14;43027:58;43119:3;43114:2;43106:6;43102:15;43095:28;43016:114;:::o;43136:220::-;43276:34;43272:1;43264:6;43260:14;43253:58;43345:3;43340:2;43332:6;43328:15;43321:28;43242:114;:::o;43362:236::-;43502:34;43498:1;43490:6;43486:14;43479:58;43571:19;43566:2;43558:6;43554:15;43547:44;43468:130;:::o;43604:231::-;43744:34;43740:1;43732:6;43728:14;43721:58;43813:14;43808:2;43800:6;43796:15;43789:39;43710:125;:::o;43841:122::-;43914:24;43932:5;43914:24;:::i;:::-;43907:5;43904:35;43894:2;;43953:1;43950;43943:12;43894:2;43884:79;:::o;43969:116::-;44039:21;44054:5;44039:21;:::i;:::-;44032:5;44029:32;44019:2;;44075:1;44072;44065:12;44019:2;44009:76;:::o;44091:120::-;44163:23;44180:5;44163:23;:::i;:::-;44156:5;44153:34;44143:2;;44201:1;44198;44191:12;44143:2;44133:78;:::o;44217:122::-;44290:24;44308:5;44290:24;:::i;:::-;44283:5;44280:35;44270:2;;44329:1;44326;44319:12;44270:2;44260:79;:::o

Swarm Source

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