ETH Price: $3,490.14 (+0.64%)
Gas: 6 Gwei

Token

 

Overview

Max Total Supply

216

Holders

214

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
tinchi.eth
0x7f957b7fe99dd0d515a2283420b6d8702be2ff18
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
CampaignV1

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-01-28
*/

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/ERC1155/[email protected]


// OpenZeppelin Contracts v4.4.0 (token/ERC1155/IERC1155.sol)

pragma solidity ^0.8.0;

/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}


// File @openzeppelin/contracts/token/ERC1155/[email protected]


// OpenZeppelin Contracts v4.4.0 (token/ERC1155/IERC1155Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
        @dev Handles the receipt of a single ERC1155 token type. This function is
        called at the end of a `safeTransferFrom` after the balance has been updated.
        To accept the transfer, this must return
        `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
        (i.e. 0xf23a6e61, or its own function selector).
        @param operator The address which initiated the transfer (i.e. msg.sender)
        @param from The address which previously owned the token
        @param id The ID of the token being transferred
        @param value The amount of tokens being transferred
        @param data Additional data with no specified format
        @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
    */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
        @dev Handles the receipt of a multiple ERC1155 token types. This function
        is called at the end of a `safeBatchTransferFrom` after the balances have
        been updated. To accept the transfer(s), this must return
        `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
        (i.e. 0xbc197c81, or its own function selector).
        @param operator The address which initiated the batch transfer (i.e. msg.sender)
        @param from The address which previously owned the token
        @param ids An array containing ids of each token being transferred (order and length must match values array)
        @param values An array containing amounts of each token being transferred (order and length must match ids array)
        @param data Additional data with no specified format
        @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
    */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}


// File @openzeppelin/contracts/token/ERC1155/extensions/[email protected]


// OpenZeppelin Contracts v4.4.0 (token/ERC1155/extensions/IERC1155MetadataURI.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the optional ERC1155MetadataExtension interface, as defined
 * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155MetadataURI is IERC1155 {
    /**
     * @dev Returns the URI for token type `id`.
     *
     * If the `\{id\}` substring is present in the URI, it must be replaced by
     * clients with the actual token type ID.
     */
    function uri(uint256 id) external view returns (string memory);
}


// File @openzeppelin/contracts/utils/[email protected]


// OpenZeppelin Contracts v4.4.0 (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;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/utils/[email protected]


// OpenZeppelin Contracts v4.4.0 (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) {
        return msg.data;
    }
}


// File @openzeppelin/contracts/utils/introspection/[email protected]


// OpenZeppelin Contracts v4.4.0 (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/ERC1155/[email protected]


// OpenZeppelin Contracts v4.4.0 (token/ERC1155/ERC1155.sol)

pragma solidity ^0.8.0;






/**
 * @dev Implementation of the basic standard multi-token.
 * See https://eips.ethereum.org/EIPS/eip-1155
 * Originally based on code by Enjin: https://github.com/enjin/erc-1155
 *
 * _Available since v3.1._
 */
contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
    using Address for address;

    // Mapping from token ID to account balances
    mapping(uint256 => mapping(address => uint256)) private _balances;

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

    // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json
    string private _uri;

    /**
     * @dev See {_setURI}.
     */
    constructor(string memory uri_) {
        _setURI(uri_);
    }

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

    /**
     * @dev See {IERC1155MetadataURI-uri}.
     *
     * This implementation returns the same URI for *all* token types. It relies
     * on the token type ID substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * Clients calling this function must replace the `\{id\}` substring with the
     * actual token type ID.
     */
    function uri(uint256) public view virtual override returns (string memory) {
        return _uri;
    }

    /**
     * @dev See {IERC1155-balanceOf}.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {
        require(account != address(0), "ERC1155: balance query for the zero address");
        return _balances[id][account];
    }

    /**
     * @dev See {IERC1155-balanceOfBatch}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] memory accounts, uint256[] memory ids)
        public
        view
        virtual
        override
        returns (uint256[] memory)
    {
        require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch");

        uint256[] memory batchBalances = new uint256[](accounts.length);

        for (uint256 i = 0; i < accounts.length; ++i) {
            batchBalances[i] = balanceOf(accounts[i], ids[i]);
        }

        return batchBalances;
    }

    /**
     * @dev See {IERC1155-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );
        _safeTransferFrom(from, to, id, amount, data);
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: transfer caller is not owner nor approved"
        );
        _safeBatchTransferFrom(from, to, ids, amounts, data);
    }

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), data);

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }
        _balances[id][to] += amount;

        emit TransferSingle(operator, from, to, id, amount);

        _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; ++i) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
            _balances[id][to] += amount;
        }

        emit TransferBatch(operator, from, to, ids, amounts);

        _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);
    }

    /**
     * @dev Sets a new URI for all token types, by relying on the token type ID
     * substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * By this mechanism, any occurrence of the `\{id\}` substring in either the
     * URI or any of the amounts in the JSON file at said URI will be replaced by
     * clients with the token type ID.
     *
     * For example, the `https://token-cdn-domain/\{id\}.json` URI would be
     * interpreted by clients as
     * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`
     * for token type ID 0x4cce0.
     *
     * See {uri}.
     *
     * Because these URIs cannot be meaningfully represented by the {URI} event,
     * this function emits no events.
     */
    function _setURI(string memory newuri) internal virtual {
        _uri = newuri;
    }

    /**
     * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _mint(
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, _asSingletonArray(id), _asSingletonArray(amount), data);

        _balances[id][to] += amount;
        emit TransferSingle(operator, address(0), to, id, amount);

        _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _mintBatch(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; i++) {
            _balances[ids[i]][to] += amounts[i];
        }

        emit TransferBatch(operator, address(0), to, ids, amounts);

        _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);
    }

    /**
     * @dev Destroys `amount` tokens of token type `id` from `from`
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `from` must have at least `amount` tokens of token type `id`.
     */
    function _burn(
        address from,
        uint256 id,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, address(0), _asSingletonArray(id), _asSingletonArray(amount), "");

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }

        emit TransferSingle(operator, from, address(0), id, amount);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     */
    function _burnBatch(
        address from,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        for (uint256 i = 0; i < ids.length; i++) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
        }

        emit TransferBatch(operator, from, address(0), ids, amounts);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC1155: setting approval status for self");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    function _doSafeTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {
                if (response != IERC1155Receiver.onERC1155Received.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _doSafeBatchTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (
                bytes4 response
            ) {
                if (response != IERC1155Receiver.onERC1155BatchReceived.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {
        uint256[] memory array = new uint256[](1);
        array[0] = element;

        return array;
    }
}


// File @openzeppelin/contracts/utils/[email protected]


// OpenZeppelin Contracts v4.4.0 (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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


// File @openzeppelin/contracts/utils/cryptography/[email protected]


// OpenZeppelin Contracts v4.4.0 (utils/cryptography/ECDSA.sol)

pragma solidity ^0.8.0;

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s;
        uint8 v;
        assembly {
            s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)
            v := add(shr(255, vs), 27)
        }
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from `s`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}


// File @openzeppelin/contracts/access/[email protected]


// OpenZeppelin Contracts v4.4.0 (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() {
        _transferOwnership(_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 {
        _transferOwnership(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");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}


// File @openzeppelin/contracts/security/[email protected]


// OpenZeppelin Contracts v4.4.0 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}


// File contracts/CampaignV1.sol

//SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;





interface ICampaignV1 {
  function totalVoteCount() external view returns (uint64[] memory);

  function isVoted(address addr) external view returns (bool);

  function startDate() external view returns (uint256);

  function setStartDate(uint256 newTimestamp) external; // contract owner required

  function endDate() external view returns (uint256);

  function setEndDate(uint256 newTimestamp) external; // contract owner required

  function setUri(string memory newUri) external; // contract owner required

  function contractURI() external view returns (string memory);

  function setContractURI(string memory uri) external;

  function pVote(uint8[] memory sortedIds, address voter, bytes32 ticket) external;

  function vote(
    uint8[] memory sortedIds, // Length from 1 to 3, ascending order
    bytes memory memo, // Within 128 bytes
    bytes32 ticket,
    bytes memory signature
  ) external;
}

contract CampaignV1 is ERC1155, ICampaignV1, Ownable, ReentrancyGuard {
  uint256 private _startDate;
  uint256 private _endDate;
  string private _contractUri;
  uint256 private _nextTokenId;
  // Array for candidate's total vote count
  uint64[] private _voteCounts;

  // Flag whether address is voted or not
  mapping(address => bool) private _isVoted;

  mapping(bytes32 => bool) private _isTicketUsed;

  event Voted(
    uint8[] sortedIds,
    address voter,
    uint256 tokenId,
    bytes32 ticket
  );

  constructor(
    string memory tokenBaseUri,
    string memory contractBaseUri,
    uint8 totalCandidates,
    uint256 campaignStartDate,
    uint256 campaignEndDate
  )
    ERC1155(
      string(
        abi.encodePacked(
          tokenBaseUri,
          "/",
          Strings.toHexString(block.chainid),
          "/",
          Strings.toHexString(uint256(uint160(address(this))), 20),
          "/{id}"
        )
      )
    )
  {
    _contractUri = string(
      abi.encodePacked(
        contractBaseUri,
        "/",
        Strings.toHexString(block.chainid),
        "/",
        Strings.toHexString(uint256(uint160(address(this))), 20)
      )
    );
    _voteCounts = new uint64[](totalCandidates);
    _startDate = campaignStartDate;
    _endDate = campaignEndDate;
    _nextTokenId = 0;
  }

  function setUri(string memory newUri) external override onlyOwner {
    _setURI(newUri);
  }

  function setStartDate(uint256 newTimestamp) external override onlyOwner {
    _startDate = newTimestamp;
  }

  function setEndDate(uint256 newTimestamp) external override onlyOwner {
    _endDate = newTimestamp;
  }

  function totalVoteCount() external view override returns (uint64[] memory) {
    return _voteCounts;
  }

  function isVoted(address addr) external view override returns (bool) {
    return _isVoted[addr];
  }

  function startDate() external view override returns (uint256) {
    return _startDate;
  }

  function endDate() external view override returns (uint256) {
    return _endDate;
  }

  function vote(
    uint8[] memory sortedIds,
    bytes memory memo,
    bytes32 ticket,
    bytes memory signature
  ) external override nonReentrant {
    // checks
    require(block.timestamp >= _startDate, "vote not started yet");
    require(block.timestamp <= _endDate, "vote is ended already");
    require(!_isVoted[_msgSender()], "User is voted");
    require(
      sortedIds.length >= 1 && sortedIds.length <= 3,
      "Ids length not in [1,3]"
    );
    require(_isAscendingOrder(sortedIds), "Ids not in ascending order");
    require(memo.length <= 128, "Memo should be within 128 bytes");
    require(!_isTicketUsed[ticket], "Ticket is used");
    require(_isAuthorized(ticket, signature), "The vote is not authorized");
    //effects
    uint256 mintedTokenId = _nextTokenId;
    _nextTokenId++;
    for (uint8 i = 0; i < sortedIds.length; i++) {
      _voteCounts[sortedIds[i]] += 1;
    }
    _isVoted[_msgSender()] = true;
    _isTicketUsed[ticket] = true;
    // interactions
    _mint(_msgSender(), mintedTokenId, 1, "");
    emit Voted(sortedIds, _msgSender(), mintedTokenId, ticket);
  }

  function pVote(uint8[] memory sortedIds, address voter, bytes32 ticket) external override onlyOwner {
    // checks
    require(!_isTicketUsed[ticket], "Ticket is used");
    //effects
    uint256 mintedTokenId = _nextTokenId;
    _nextTokenId++;
    for (uint8 i = 0; i < sortedIds.length; i++) {
      _voteCounts[sortedIds[i]] += 1;
    }
    _isVoted[voter] = true;
    _isTicketUsed[ticket] = true;
    // interactions
    _mint(voter, mintedTokenId, 1, "");
    emit Voted(sortedIds, voter, mintedTokenId, ticket);
  }

  function _isAuthorized(bytes32 hash, bytes memory signature)
    internal
    view
    returns (bool)
  {
    return owner() == ECDSA.recover(hash, signature);
  }

  function _isAscendingOrder(uint8[] memory arr) internal pure returns (bool) {
    if (arr.length == 1) return true;
    for (uint8 i = 1; i < arr.length; i++) {
      if (arr[i] <= arr[i - 1]) return false;
    }
    return true;
  }

  function contractURI() external view override returns (string memory) {
    return _contractUri;
  }

  function setContractURI(string memory uri) external override onlyOwner {
    _contractUri = uri;
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"tokenBaseUri","type":"string"},{"internalType":"string","name":"contractBaseUri","type":"string"},{"internalType":"uint8","name":"totalCandidates","type":"uint8"},{"internalType":"uint256","name":"campaignStartDate","type":"uint256"},{"internalType":"uint256","name":"campaignEndDate","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","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":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8[]","name":"sortedIds","type":"uint8[]"},{"indexed":false,"internalType":"address","name":"voter","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"ticket","type":"bytes32"}],"name":"Voted","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"endDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isVoted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8[]","name":"sortedIds","type":"uint8[]"},{"internalType":"address","name":"voter","type":"address"},{"internalType":"bytes32","name":"ticket","type":"bytes32"}],"name":"pVote","outputs":[],"stateMutability":"nonpayable","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":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newTimestamp","type":"uint256"}],"name":"setEndDate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newTimestamp","type":"uint256"}],"name":"setStartDate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newUri","type":"string"}],"name":"setUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalVoteCount","outputs":[{"internalType":"uint64[]","name":"","type":"uint64[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8[]","name":"sortedIds","type":"uint8[]"},{"internalType":"bytes","name":"memo","type":"bytes"},{"internalType":"bytes32","name":"ticket","type":"bytes32"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"vote","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5060405162006060380380620060608339818101604052810190620000379190620008a6565b846200004e466200020660201b6200174f1760201c565b6200007c3073ffffffffffffffffffffffffffffffffffffffff1660146200029a60201b620017d51760201c565b604051602001620000909392919062000a57565b604051602081830303815290604052620000b081620005a960201b60201c565b50620000d1620000c5620005c560201b60201c565b620005cd60201b60201c565b600160048190555083620000f0466200020660201b6200174f1760201c565b6200011e3073ffffffffffffffffffffffffffffffffffffffff1660146200029a60201b620017d51760201c565b604051602001620001329392919062000a06565b604051602081830303815290604052600790805190602001906200015892919062000693565b508260ff1667ffffffffffffffff8111156200019d577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015620001cc5781602001602082028036833780820191505090505b5060099080519060200190620001e492919062000724565b5081600581905550806006819055506000600881905550505050505062000e9e565b6060600082141562000250576040518060400160405280600481526020017f3078303000000000000000000000000000000000000000000000000000000000815250905062000295565b600082905060005b600082146200027e5780806200026e9062000d03565b915050600882901c915062000258565b6200029084826200029a60201b60201c565b925050505b919050565b606060006002836002620002af919062000bba565b620002bb919062000b5d565b67ffffffffffffffff811115620002fb577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156200032e5781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106200038d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811062000418577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026200045a919062000bba565b62000466919062000b5d565b90505b600181111562000558577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110620004d0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b8282815181106200050e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080620005509062000c68565b905062000469565b50600084146200059f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005969062000ab5565b60405180910390fd5b8091505092915050565b8060029080519060200190620005c192919062000693565b5050565b600033905090565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620006a19062000c97565b90600052602060002090601f016020900481019282620006c5576000855562000711565b82601f10620006e057805160ff191683800117855562000711565b8280016001018555821562000711579182015b8281111562000710578251825591602001919060010190620006f3565b5b509050620007209190620007e7565b5090565b82805482825590600052602060002090600301600490048101928215620007d45791602002820160005b838211156200079c57835183826101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555092602001926008016020816007010492830192600103026200074e565b8015620007d25782816101000a81549067ffffffffffffffff02191690556008016020816007010492830192600103026200079c565b505b509050620007e39190620007e7565b5090565b5b8082111562000802576000816000905550600101620007e8565b5090565b60006200081d620008178462000b00565b62000ad7565b9050828152602081018484840111156200083657600080fd5b6200084384828562000c32565b509392505050565b600082601f8301126200085d57600080fd5b81516200086f84826020860162000806565b91505092915050565b600081519050620008898162000e6a565b92915050565b600081519050620008a08162000e84565b92915050565b600080600080600060a08688031215620008bf57600080fd5b600086015167ffffffffffffffff811115620008da57600080fd5b620008e8888289016200084b565b955050602086015167ffffffffffffffff8111156200090657600080fd5b62000914888289016200084b565b945050604062000927888289016200088f565b93505060606200093a8882890162000878565b92505060806200094d8882890162000878565b9150509295509295909350565b6000620009678262000b36565b62000973818562000b52565b93506200098581856020860162000c32565b80840191505092915050565b6000620009a060208362000b41565b9150620009ad8262000def565b602082019050919050565b6000620009c760058362000b52565b9150620009d48262000e18565b600582019050919050565b6000620009ee60018362000b52565b9150620009fb8262000e41565b600182019050919050565b600062000a1482866200095a565b915062000a2182620009df565b915062000a2f82856200095a565b915062000a3c82620009df565b915062000a4a82846200095a565b9150819050949350505050565b600062000a6582866200095a565b915062000a7282620009df565b915062000a8082856200095a565b915062000a8d82620009df565b915062000a9b82846200095a565b915062000aa882620009b8565b9150819050949350505050565b6000602082019050818103600083015262000ad08162000991565b9050919050565b600062000ae362000af6565b905062000af1828262000ccd565b919050565b6000604051905090565b600067ffffffffffffffff82111562000b1e5762000b1d62000daf565b5b62000b298262000dde565b9050602081019050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600062000b6a8262000c1b565b915062000b778362000c1b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000baf5762000bae62000d51565b5b828201905092915050565b600062000bc78262000c1b565b915062000bd48362000c1b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161562000c105762000c0f62000d51565b5b828202905092915050565b6000819050919050565b600060ff82169050919050565b60005b8381101562000c5257808201518184015260208101905062000c35565b8381111562000c62576000848401525b50505050565b600062000c758262000c1b565b9150600082141562000c8c5762000c8b62000d51565b5b600182039050919050565b6000600282049050600182168062000cb057607f821691505b6020821081141562000cc75762000cc662000d80565b5b50919050565b62000cd88262000dde565b810181811067ffffffffffffffff8211171562000cfa5762000cf962000daf565b5b80604052505050565b600062000d108262000c1b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141562000d465762000d4562000d51565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f2f7b69647d000000000000000000000000000000000000000000000000000000600082015250565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b62000e758162000c1b565b811462000e8157600080fd5b50565b62000e8f8162000c25565b811462000e9b57600080fd5b50565b6151b28062000eae6000396000f3fe608060405234801561001057600080fd5b50600436106101415760003560e01c80638da5cb5b116100b8578063cbff75cb1161007c578063cbff75cb1461034c578063da6669be1461037c578063e8a3d48514610398578063e985e9c5146103b6578063f242432a146103e6578063f2fde38b1461040257610141565b80638da5cb5b146102bc578063938e3d7b146102da5780639b642de1146102f6578063a22cb46514610312578063c24a0f8b1461032e57610141565b80632eb2c2d61161010a5780632eb2c2d6146102105780633784f0001461022c5780634e1273f414610248578063715018a61461027857806382d95df514610282578063893d8f4c1461029e57610141565b8062fdd58e1461014657806301ffc9a7146101765780630b97bc86146101a65780630e89341c146101c457806318bdcbf9146101f4575b600080fd5b610160600480360381019061015b91906135fa565b61041e565b60405161016d91906143f3565b60405180910390f35b610190600480360381019061018b91906137b4565b6104e7565b60405161019d9190614011565b60405180910390f35b6101ae6105c9565b6040516101bb91906143f3565b60405180910390f35b6101de60048036038101906101d99190613847565b6105d3565b6040516101eb9190614071565b60405180910390f35b61020e60048036038101906102099190613709565b610667565b005b61022a60048036038101906102259190613470565b610b7f565b005b61024660048036038101906102419190613847565b610c20565b005b610262600480360381019061025d9190613636565b610ca6565b60405161026f9190613f4a565b60405180910390f35b610280610e57565b005b61029c60048036038101906102979190613847565b610edf565b005b6102a6610f65565b6040516102b39190613fa3565b60405180910390f35b6102c4610ff1565b6040516102d19190613e6d565b60405180910390f35b6102f460048036038101906102ef9190613806565b61101b565b005b610310600480360381019061030b9190613806565b6110b1565b005b61032c600480360381019061032791906135be565b611139565b005b61033661114f565b60405161034391906143f3565b60405180910390f35b6103666004803603810190610361919061340b565b611159565b6040516103739190614011565b60405180910390f35b610396600480360381019061039191906136a2565b6111af565b005b6103a0611490565b6040516103ad9190614071565b60405180910390f35b6103d060048036038101906103cb9190613434565b611522565b6040516103dd9190614011565b60405180910390f35b61040060048036038101906103fb919061352f565b6115b6565b005b61041c6004803603810190610417919061340b565b611657565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561048f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161048690614133565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105b257507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806105c257506105c182611acf565b5b9050919050565b6000600554905090565b6060600280546105e290614852565b80601f016020809104026020016040519081016040528092919081815260200182805461060e90614852565b801561065b5780601f106106305761010080835404028352916020019161065b565b820191906000526020600020905b81548152906001019060200180831161063e57829003601f168201915b50505050509050919050565b600260045414156106ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106a4906143d3565b60405180910390fd5b60026004819055506005544210156106fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106f190614313565b60405180910390fd5b60065442111561073f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073690614273565b60405180910390fd5b600a600061074b611b39565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156107d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ca90614253565b60405180910390fd5b60018451101580156107e757506003845111155b610826576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161081d906142d3565b60405180910390fd5b61082f84611b41565b61086e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610865906141b3565b60405180910390fd5b6080835111156108b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108aa90614333565b60405180910390fd5b600b600083815260200190815260200160002060009054906101000a900460ff1615610914576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090b90614193565b60405180910390fd5b61091e8282611c30565b61095d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610954906142f3565b60405180910390fd5b6000600854905060086000815480929190610977906148b5565b919050555060005b85518160ff161015610a7d5760016009878360ff16815181106109cb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015160ff1681548110610a0d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600491828204019190066008028282829054906101000a900467ffffffffffffffff16610a44919061467b565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508080610a75906148fe565b91505061097f565b506001600a6000610a8c611b39565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600b600085815260200190815260200160002060006101000a81548160ff021916908315150217905550610b2c610b14611b39565b82600160405180602001604052806000815250611c79565b7f0fff3e263cf7261e3a4d00166ce57380cc446558c7b91cb4f4d98ce1b7f3ca2485610b56611b39565b8386604051610b689493929190613fc5565b60405180910390a150600160048190555050505050565b610b87611b39565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610bcd5750610bcc85610bc7611b39565b611522565b5b610c0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0390614213565b60405180910390fd5b610c198585858585611e0f565b5050505050565b610c28611b39565b73ffffffffffffffffffffffffffffffffffffffff16610c46610ff1565b73ffffffffffffffffffffffffffffffffffffffff1614610c9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c93906142b3565b60405180910390fd5b8060068190555050565b60608151835114610cec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce390614373565b60405180910390fd5b6000835167ffffffffffffffff811115610d2f577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015610d5d5781602001602082028036833780820191505090505b50905060005b8451811015610e4c57610df6858281518110610da8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151858381518110610de9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015161041e565b828281518110610e2f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505080610e45906148b5565b9050610d63565b508091505092915050565b610e5f611b39565b73ffffffffffffffffffffffffffffffffffffffff16610e7d610ff1565b73ffffffffffffffffffffffffffffffffffffffff1614610ed3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eca906142b3565b60405180910390fd5b610edd600061216f565b565b610ee7611b39565b73ffffffffffffffffffffffffffffffffffffffff16610f05610ff1565b73ffffffffffffffffffffffffffffffffffffffff1614610f5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f52906142b3565b60405180910390fd5b8060058190555050565b60606009805480602002602001604051908101604052809291908181526020018280548015610fe757602002820191906000526020600020906000905b82829054906101000a900467ffffffffffffffff1667ffffffffffffffff1681526020019060080190602082600701049283019260010382029150808411610fa25790505b5050505050905090565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611023611b39565b73ffffffffffffffffffffffffffffffffffffffff16611041610ff1565b73ffffffffffffffffffffffffffffffffffffffff1614611097576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108e906142b3565b60405180910390fd5b80600790805190602001906110ad929190613043565b5050565b6110b9611b39565b73ffffffffffffffffffffffffffffffffffffffff166110d7610ff1565b73ffffffffffffffffffffffffffffffffffffffff161461112d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611124906142b3565b60405180910390fd5b61113681612235565b50565b61114b611144611b39565b838361224f565b5050565b6000600654905090565b6000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6111b7611b39565b73ffffffffffffffffffffffffffffffffffffffff166111d5610ff1565b73ffffffffffffffffffffffffffffffffffffffff161461122b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611222906142b3565b60405180910390fd5b600b600082815260200190815260200160002060009054906101000a900460ff161561128c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128390614193565b60405180910390fd5b60006008549050600860008154809291906112a6906148b5565b919050555060005b84518160ff1610156113ac5760016009868360ff16815181106112fa577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015160ff168154811061133c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600491828204019190066008028282829054906101000a900467ffffffffffffffff16611373919061467b565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555080806113a4906148fe565b9150506112ae565b506001600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600b600084815260200190815260200160002060006101000a81548160ff02191690831515021790555061144d8382600160405180602001604052806000815250611c79565b7f0fff3e263cf7261e3a4d00166ce57380cc446558c7b91cb4f4d98ce1b7f3ca24848483856040516114829493929190613fc5565b60405180910390a150505050565b60606007805461149f90614852565b80601f01602080910402602001604051908101604052809291908181526020018280546114cb90614852565b80156115185780601f106114ed57610100808354040283529160200191611518565b820191906000526020600020905b8154815290600101906020018083116114fb57829003601f168201915b5050505050905090565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6115be611b39565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806116045750611603856115fe611b39565b611522565b5b611643576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163a90614173565b60405180910390fd5b61165085858585856123bc565b5050505050565b61165f611b39565b73ffffffffffffffffffffffffffffffffffffffff1661167d610ff1565b73ffffffffffffffffffffffffffffffffffffffff16146116d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ca906142b3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611743576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173a90614153565b60405180910390fd5b61174c8161216f565b50565b60606000821415611797576040518060400160405280600481526020017f307830300000000000000000000000000000000000000000000000000000000081525090506117d0565b600082905060005b600082146117c15780806117b2906148b5565b915050600882901c915061179f565b6117cb84826117d5565b925050505b919050565b6060600060028360026117e891906146b9565b6117f29190614625565b67ffffffffffffffff811115611831577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156118635781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106118c1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061194b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000600184600261198b91906146b9565b6119959190614625565b90505b6001811115611a81577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106119fd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b828281518110611a3a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080611a7a90614828565b9050611998565b5060008414611ac5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abc906140d3565b60405180910390fd5b8091505092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b6000600182511415611b565760019050611c2b565b6000600190505b82518160ff161015611c255782600182611b779190614713565b60ff1681518110611bb1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015160ff16838260ff1681518110611bf8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015160ff1611611c12576000915050611c2b565b8080611c1d906148fe565b915050611b5d565b50600190505b919050565b6000611c3c838361263e565b73ffffffffffffffffffffffffffffffffffffffff16611c5a610ff1565b73ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611ce9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce0906143b3565b60405180910390fd5b6000611cf3611b39565b9050611d1481600087611d0588612665565b611d0e88612665565b8761272b565b8260008086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d739190614625565b925050819055508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051611df192919061440e565b60405180910390a4611e0881600087878787612733565b5050505050565b8151835114611e53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4a90614393565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611ec3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eba906141f3565b60405180910390fd5b6000611ecd611b39565b9050611edd81878787878761272b565b60005b84518110156120da576000858281518110611f24577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190506000858381518110611f69577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561200a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200190614293565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120bf9190614625565b92505081905550505050806120d3906148b5565b9050611ee0565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051612151929190613f6c565b60405180910390a461216781878787878761291a565b505050505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b806002908051906020019061224b929190613043565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156122be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b590614353565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516123af9190614011565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561242c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612423906141f3565b60405180910390fd5b6000612436611b39565b905061245681878761244788612665565b61245088612665565b8761272b565b600080600086815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050838110156124ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e490614293565b60405180910390fd5b83810360008087815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508360008087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125a29190614625565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62888860405161261f92919061440e565b60405180910390a4612635828888888888612733565b50505050505050565b600080600061264d8585612b01565b9150915061265a81612b84565b819250505092915050565b60606000600167ffffffffffffffff8111156126aa577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156126d85781602001602082028036833780820191505090505b5090508281600081518110612716577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505080915050919050565b505050505050565b6127528473ffffffffffffffffffffffffffffffffffffffff16612ed5565b15612912578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401612798959493929190613ef0565b602060405180830381600087803b1580156127b257600080fd5b505af19250505080156127e357506040513d601f19601f820116820180604052508101906127e091906137dd565b60015b612889576127ef6149b5565b806308c379a0141561284c575061280461505c565b8061280f575061284e565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128439190614071565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612880906140b3565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612910576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612907906140f3565b60405180910390fd5b505b505050505050565b6129398473ffffffffffffffffffffffffffffffffffffffff16612ed5565b15612af9578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b815260040161297f959493929190613e88565b602060405180830381600087803b15801561299957600080fd5b505af19250505080156129ca57506040513d601f19601f820116820180604052508101906129c791906137dd565b60015b612a70576129d66149b5565b806308c379a01415612a3357506129eb61505c565b806129f65750612a35565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2a9190614071565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a67906140b3565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612af7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aee906140f3565b60405180910390fd5b505b505050505050565b600080604183511415612b435760008060006020860151925060408601519150606086015160001a9050612b3787828585612ee8565b94509450505050612b7d565b604083511415612b74576000806020850151915060408501519050612b69868383612ff5565b935093505050612b7d565b60006002915091505b9250929050565b60006004811115612bbe577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115612bf7577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415612c0257612ed2565b60016004811115612c3c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115612c75577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415612cb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cad90614093565b60405180910390fd5b60026004811115612cf0577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115612d29577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415612d6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d6190614113565b60405180910390fd5b60036004811115612da4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115612ddd577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415612e1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e15906141d3565b60405180910390fd5b600480811115612e57577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115612e90577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415612ed1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ec890614233565b60405180910390fd5b5b50565b600080823b905060008111915050919050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115612f23576000600391509150612fec565b601b8560ff1614158015612f3b5750601c8560ff1614155b15612f4d576000600491509150612fec565b600060018787878760405160008152602001604052604051612f72949392919061402c565b6020604051602081039080840390855afa158015612f94573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612fe357600060019250925050612fec565b80600092509250505b94509492505050565b6000806000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85169150601b8560ff1c01905061303587828885612ee8565b935093505050935093915050565b82805461304f90614852565b90600052602060002090601f01602090048101928261307157600085556130b8565b82601f1061308a57805160ff19168380011785556130b8565b828001600101855582156130b8579182015b828111156130b757825182559160200191906001019061309c565b5b5090506130c591906130c9565b5090565b5b808211156130e25760008160009055506001016130ca565b5090565b60006130f96130f48461445c565b614437565b9050808382526020820190508285602086028201111561311857600080fd5b60005b85811015613148578161312e88826132a6565b84526020840193506020830192505060018101905061311b565b5050509392505050565b600061316561316084614488565b614437565b9050808382526020820190508285602086028201111561318457600080fd5b60005b858110156131b4578161319a88826133e1565b845260208401935060208301925050600181019050613187565b5050509392505050565b60006131d16131cc846144b4565b614437565b905080838252602082019050828560208602820111156131f057600080fd5b60005b85811015613220578161320688826133f6565b8452602084019350602083019250506001810190506131f3565b5050509392505050565b600061323d613238846144e0565b614437565b90508281526020810184848401111561325557600080fd5b6132608482856147e6565b509392505050565b600061327b61327684614511565b614437565b90508281526020810184848401111561329357600080fd5b61329e8482856147e6565b509392505050565b6000813590506132b5816150f2565b92915050565b600082601f8301126132cc57600080fd5b81356132dc8482602086016130e6565b91505092915050565b600082601f8301126132f657600080fd5b8135613306848260208601613152565b91505092915050565b600082601f83011261332057600080fd5b81356133308482602086016131be565b91505092915050565b60008135905061334881615109565b92915050565b60008135905061335d81615120565b92915050565b60008135905061337281615137565b92915050565b60008151905061338781615137565b92915050565b600082601f83011261339e57600080fd5b81356133ae84826020860161322a565b91505092915050565b600082601f8301126133c857600080fd5b81356133d8848260208601613268565b91505092915050565b6000813590506133f08161514e565b92915050565b60008135905061340581615165565b92915050565b60006020828403121561341d57600080fd5b600061342b848285016132a6565b91505092915050565b6000806040838503121561344757600080fd5b6000613455858286016132a6565b9250506020613466858286016132a6565b9150509250929050565b600080600080600060a0868803121561348857600080fd5b6000613496888289016132a6565b95505060206134a7888289016132a6565b945050604086013567ffffffffffffffff8111156134c457600080fd5b6134d0888289016132e5565b935050606086013567ffffffffffffffff8111156134ed57600080fd5b6134f9888289016132e5565b925050608086013567ffffffffffffffff81111561351657600080fd5b6135228882890161338d565b9150509295509295909350565b600080600080600060a0868803121561354757600080fd5b6000613555888289016132a6565b9550506020613566888289016132a6565b9450506040613577888289016133e1565b9350506060613588888289016133e1565b925050608086013567ffffffffffffffff8111156135a557600080fd5b6135b18882890161338d565b9150509295509295909350565b600080604083850312156135d157600080fd5b60006135df858286016132a6565b92505060206135f085828601613339565b9150509250929050565b6000806040838503121561360d57600080fd5b600061361b858286016132a6565b925050602061362c858286016133e1565b9150509250929050565b6000806040838503121561364957600080fd5b600083013567ffffffffffffffff81111561366357600080fd5b61366f858286016132bb565b925050602083013567ffffffffffffffff81111561368c57600080fd5b613698858286016132e5565b9150509250929050565b6000806000606084860312156136b757600080fd5b600084013567ffffffffffffffff8111156136d157600080fd5b6136dd8682870161330f565b93505060206136ee868287016132a6565b92505060406136ff8682870161334e565b9150509250925092565b6000806000806080858703121561371f57600080fd5b600085013567ffffffffffffffff81111561373957600080fd5b6137458782880161330f565b945050602085013567ffffffffffffffff81111561376257600080fd5b61376e8782880161338d565b935050604061377f8782880161334e565b925050606085013567ffffffffffffffff81111561379c57600080fd5b6137a88782880161338d565b91505092959194509250565b6000602082840312156137c657600080fd5b60006137d484828501613363565b91505092915050565b6000602082840312156137ef57600080fd5b60006137fd84828501613378565b91505092915050565b60006020828403121561381857600080fd5b600082013567ffffffffffffffff81111561383257600080fd5b61383e848285016133b7565b91505092915050565b60006020828403121561385957600080fd5b6000613867848285016133e1565b91505092915050565b600061387c8383613e22565b60208301905092915050565b60006138948383613e40565b60208301905092915050565b60006138ac8383613e4f565b60208301905092915050565b6138c181614747565b82525050565b60006138d282614572565b6138dc81856145d0565b93506138e783614542565b8060005b838110156139185781516138ff8882613870565b975061390a836145a9565b9250506001810190506138eb565b5085935050505092915050565b60006139308261457d565b61393a81856145e1565b935061394583614552565b8060005b8381101561397657815161395d8882613888565b9750613968836145b6565b925050600181019050613949565b5085935050505092915050565b600061398e82614588565b61399881856145f2565b93506139a383614562565b8060005b838110156139d45781516139bb88826138a0565b97506139c6836145c3565b9250506001810190506139a7565b5085935050505092915050565b6139ea81614759565b82525050565b6139f981614765565b82525050565b6000613a0a82614593565b613a148185614603565b9350613a248185602086016147f5565b613a2d816149d7565b840191505092915050565b6000613a438261459e565b613a4d8185614614565b9350613a5d8185602086016147f5565b613a66816149d7565b840191505092915050565b6000613a7e601883614614565b9150613a89826149f5565b602082019050919050565b6000613aa1603483614614565b9150613aac82614a1e565b604082019050919050565b6000613ac4602083614614565b9150613acf82614a6d565b602082019050919050565b6000613ae7602883614614565b9150613af282614a96565b604082019050919050565b6000613b0a601f83614614565b9150613b1582614ae5565b602082019050919050565b6000613b2d602b83614614565b9150613b3882614b0e565b604082019050919050565b6000613b50602683614614565b9150613b5b82614b5d565b604082019050919050565b6000613b73602983614614565b9150613b7e82614bac565b604082019050919050565b6000613b96600e83614614565b9150613ba182614bfb565b602082019050919050565b6000613bb9601a83614614565b9150613bc482614c24565b602082019050919050565b6000613bdc602283614614565b9150613be782614c4d565b604082019050919050565b6000613bff602583614614565b9150613c0a82614c9c565b604082019050919050565b6000613c22603283614614565b9150613c2d82614ceb565b604082019050919050565b6000613c45602283614614565b9150613c5082614d3a565b604082019050919050565b6000613c68600d83614614565b9150613c7382614d89565b602082019050919050565b6000613c8b601583614614565b9150613c9682614db2565b602082019050919050565b6000613cae602a83614614565b9150613cb982614ddb565b604082019050919050565b6000613cd1602083614614565b9150613cdc82614e2a565b602082019050919050565b6000613cf4601783614614565b9150613cff82614e53565b602082019050919050565b6000613d17601a83614614565b9150613d2282614e7c565b602082019050919050565b6000613d3a601483614614565b9150613d4582614ea5565b602082019050919050565b6000613d5d601f83614614565b9150613d6882614ece565b602082019050919050565b6000613d80602983614614565b9150613d8b82614ef7565b604082019050919050565b6000613da3602983614614565b9150613dae82614f46565b604082019050919050565b6000613dc6602883614614565b9150613dd182614f95565b604082019050919050565b6000613de9602183614614565b9150613df482614fe4565b604082019050919050565b6000613e0c601f83614614565b9150613e1782615033565b602082019050919050565b613e2b816147bb565b82525050565b613e3a816147bb565b82525050565b613e49816147c5565b82525050565b613e58816147d9565b82525050565b613e67816147d9565b82525050565b6000602082019050613e8260008301846138b8565b92915050565b600060a082019050613e9d60008301886138b8565b613eaa60208301876138b8565b8181036040830152613ebc81866138c7565b90508181036060830152613ed081856138c7565b90508181036080830152613ee481846139ff565b90509695505050505050565b600060a082019050613f0560008301886138b8565b613f1260208301876138b8565b613f1f6040830186613e31565b613f2c6060830185613e31565b8181036080830152613f3e81846139ff565b90509695505050505050565b60006020820190508181036000830152613f6481846138c7565b905092915050565b60006040820190508181036000830152613f8681856138c7565b90508181036020830152613f9a81846138c7565b90509392505050565b60006020820190508181036000830152613fbd8184613925565b905092915050565b60006080820190508181036000830152613fdf8187613983565b9050613fee60208301866138b8565b613ffb6040830185613e31565b61400860608301846139f0565b95945050505050565b600060208201905061402660008301846139e1565b92915050565b600060808201905061404160008301876139f0565b61404e6020830186613e5e565b61405b60408301856139f0565b61406860608301846139f0565b95945050505050565b6000602082019050818103600083015261408b8184613a38565b905092915050565b600060208201905081810360008301526140ac81613a71565b9050919050565b600060208201905081810360008301526140cc81613a94565b9050919050565b600060208201905081810360008301526140ec81613ab7565b9050919050565b6000602082019050818103600083015261410c81613ada565b9050919050565b6000602082019050818103600083015261412c81613afd565b9050919050565b6000602082019050818103600083015261414c81613b20565b9050919050565b6000602082019050818103600083015261416c81613b43565b9050919050565b6000602082019050818103600083015261418c81613b66565b9050919050565b600060208201905081810360008301526141ac81613b89565b9050919050565b600060208201905081810360008301526141cc81613bac565b9050919050565b600060208201905081810360008301526141ec81613bcf565b9050919050565b6000602082019050818103600083015261420c81613bf2565b9050919050565b6000602082019050818103600083015261422c81613c15565b9050919050565b6000602082019050818103600083015261424c81613c38565b9050919050565b6000602082019050818103600083015261426c81613c5b565b9050919050565b6000602082019050818103600083015261428c81613c7e565b9050919050565b600060208201905081810360008301526142ac81613ca1565b9050919050565b600060208201905081810360008301526142cc81613cc4565b9050919050565b600060208201905081810360008301526142ec81613ce7565b9050919050565b6000602082019050818103600083015261430c81613d0a565b9050919050565b6000602082019050818103600083015261432c81613d2d565b9050919050565b6000602082019050818103600083015261434c81613d50565b9050919050565b6000602082019050818103600083015261436c81613d73565b9050919050565b6000602082019050818103600083015261438c81613d96565b9050919050565b600060208201905081810360008301526143ac81613db9565b9050919050565b600060208201905081810360008301526143cc81613ddc565b9050919050565b600060208201905081810360008301526143ec81613dff565b9050919050565b60006020820190506144086000830184613e31565b92915050565b60006040820190506144236000830185613e31565b6144306020830184613e31565b9392505050565b6000614441614452565b905061444d8282614884565b919050565b6000604051905090565b600067ffffffffffffffff82111561447757614476614986565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156144a3576144a2614986565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156144cf576144ce614986565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156144fb576144fa614986565b5b614504826149d7565b9050602081019050919050565b600067ffffffffffffffff82111561452c5761452b614986565b5b614535826149d7565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b6000614630826147bb565b915061463b836147bb565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156146705761466f614928565b5b828201905092915050565b6000614686826147c5565b9150614691836147c5565b92508267ffffffffffffffff038211156146ae576146ad614928565b5b828201905092915050565b60006146c4826147bb565b91506146cf836147bb565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561470857614707614928565b5b828202905092915050565b600061471e826147d9565b9150614729836147d9565b92508282101561473c5761473b614928565b5b828203905092915050565b60006147528261479b565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156148135780820151818401526020810190506147f8565b83811115614822576000848401525b50505050565b6000614833826147bb565b9150600082141561484757614846614928565b5b600182039050919050565b6000600282049050600182168061486a57607f821691505b6020821081141561487e5761487d614957565b5b50919050565b61488d826149d7565b810181811067ffffffffffffffff821117156148ac576148ab614986565b5b80604052505050565b60006148c0826147bb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156148f3576148f2614928565b5b600182019050919050565b6000614909826147d9565b915060ff82141561491d5761491c614928565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060033d11156149d45760046000803e6149d16000516149e8565b90505b90565b6000601f19601f8301169050919050565b60008160e01c9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f455243313135353a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008201527f20617070726f7665640000000000000000000000000000000000000000000000602082015250565b7f5469636b65742069732075736564000000000000000000000000000000000000600082015250565b7f496473206e6f7420696e20617363656e64696e67206f72646572000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f5573657220697320766f74656400000000000000000000000000000000000000600082015250565b7f766f746520697320656e64656420616c72656164790000000000000000000000600082015250565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f496473206c656e677468206e6f7420696e205b312c335d000000000000000000600082015250565b7f54686520766f7465206973206e6f7420617574686f72697a6564000000000000600082015250565b7f766f7465206e6f74207374617274656420796574000000000000000000000000600082015250565b7f4d656d6f2073686f756c642062652077697468696e2031323820627974657300600082015250565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600060443d101561506c576150ef565b615074614452565b60043d036004823e80513d602482011167ffffffffffffffff8211171561509c5750506150ef565b808201805167ffffffffffffffff8111156150ba57505050506150ef565b80602083010160043d0385018111156150d75750505050506150ef565b6150e682602001850186614884565b82955050505050505b90565b6150fb81614747565b811461510657600080fd5b50565b61511281614759565b811461511d57600080fd5b50565b61512981614765565b811461513457600080fd5b50565b6151408161476f565b811461514b57600080fd5b50565b615157816147bb565b811461516257600080fd5b50565b61516e816147d9565b811461517957600080fd5b5056fea2646970667358221220295b114865b1a79e5f0a2c82f5c6cb1af679f26b5095797fe8938427c46eabe764736f6c6343000804003300000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000061e7c50000000000000000000000000000000000000000000000000000000000621dd280000000000000000000000000000000000000000000000000000000000000002168747470733a2f2f6170692e6d6574617a6f6e732e636f6d2f6d6574616461746100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002168747470733a2f2f6170692e6d6574617a6f6e732e636f6d2f6d6574616461746100000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101415760003560e01c80638da5cb5b116100b8578063cbff75cb1161007c578063cbff75cb1461034c578063da6669be1461037c578063e8a3d48514610398578063e985e9c5146103b6578063f242432a146103e6578063f2fde38b1461040257610141565b80638da5cb5b146102bc578063938e3d7b146102da5780639b642de1146102f6578063a22cb46514610312578063c24a0f8b1461032e57610141565b80632eb2c2d61161010a5780632eb2c2d6146102105780633784f0001461022c5780634e1273f414610248578063715018a61461027857806382d95df514610282578063893d8f4c1461029e57610141565b8062fdd58e1461014657806301ffc9a7146101765780630b97bc86146101a65780630e89341c146101c457806318bdcbf9146101f4575b600080fd5b610160600480360381019061015b91906135fa565b61041e565b60405161016d91906143f3565b60405180910390f35b610190600480360381019061018b91906137b4565b6104e7565b60405161019d9190614011565b60405180910390f35b6101ae6105c9565b6040516101bb91906143f3565b60405180910390f35b6101de60048036038101906101d99190613847565b6105d3565b6040516101eb9190614071565b60405180910390f35b61020e60048036038101906102099190613709565b610667565b005b61022a60048036038101906102259190613470565b610b7f565b005b61024660048036038101906102419190613847565b610c20565b005b610262600480360381019061025d9190613636565b610ca6565b60405161026f9190613f4a565b60405180910390f35b610280610e57565b005b61029c60048036038101906102979190613847565b610edf565b005b6102a6610f65565b6040516102b39190613fa3565b60405180910390f35b6102c4610ff1565b6040516102d19190613e6d565b60405180910390f35b6102f460048036038101906102ef9190613806565b61101b565b005b610310600480360381019061030b9190613806565b6110b1565b005b61032c600480360381019061032791906135be565b611139565b005b61033661114f565b60405161034391906143f3565b60405180910390f35b6103666004803603810190610361919061340b565b611159565b6040516103739190614011565b60405180910390f35b610396600480360381019061039191906136a2565b6111af565b005b6103a0611490565b6040516103ad9190614071565b60405180910390f35b6103d060048036038101906103cb9190613434565b611522565b6040516103dd9190614011565b60405180910390f35b61040060048036038101906103fb919061352f565b6115b6565b005b61041c6004803603810190610417919061340b565b611657565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561048f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161048690614133565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105b257507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806105c257506105c182611acf565b5b9050919050565b6000600554905090565b6060600280546105e290614852565b80601f016020809104026020016040519081016040528092919081815260200182805461060e90614852565b801561065b5780601f106106305761010080835404028352916020019161065b565b820191906000526020600020905b81548152906001019060200180831161063e57829003601f168201915b50505050509050919050565b600260045414156106ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106a4906143d3565b60405180910390fd5b60026004819055506005544210156106fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106f190614313565b60405180910390fd5b60065442111561073f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073690614273565b60405180910390fd5b600a600061074b611b39565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156107d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ca90614253565b60405180910390fd5b60018451101580156107e757506003845111155b610826576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161081d906142d3565b60405180910390fd5b61082f84611b41565b61086e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610865906141b3565b60405180910390fd5b6080835111156108b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108aa90614333565b60405180910390fd5b600b600083815260200190815260200160002060009054906101000a900460ff1615610914576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090b90614193565b60405180910390fd5b61091e8282611c30565b61095d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610954906142f3565b60405180910390fd5b6000600854905060086000815480929190610977906148b5565b919050555060005b85518160ff161015610a7d5760016009878360ff16815181106109cb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015160ff1681548110610a0d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600491828204019190066008028282829054906101000a900467ffffffffffffffff16610a44919061467b565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055508080610a75906148fe565b91505061097f565b506001600a6000610a8c611b39565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600b600085815260200190815260200160002060006101000a81548160ff021916908315150217905550610b2c610b14611b39565b82600160405180602001604052806000815250611c79565b7f0fff3e263cf7261e3a4d00166ce57380cc446558c7b91cb4f4d98ce1b7f3ca2485610b56611b39565b8386604051610b689493929190613fc5565b60405180910390a150600160048190555050505050565b610b87611b39565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610bcd5750610bcc85610bc7611b39565b611522565b5b610c0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0390614213565b60405180910390fd5b610c198585858585611e0f565b5050505050565b610c28611b39565b73ffffffffffffffffffffffffffffffffffffffff16610c46610ff1565b73ffffffffffffffffffffffffffffffffffffffff1614610c9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c93906142b3565b60405180910390fd5b8060068190555050565b60608151835114610cec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce390614373565b60405180910390fd5b6000835167ffffffffffffffff811115610d2f577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015610d5d5781602001602082028036833780820191505090505b50905060005b8451811015610e4c57610df6858281518110610da8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151858381518110610de9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015161041e565b828281518110610e2f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505080610e45906148b5565b9050610d63565b508091505092915050565b610e5f611b39565b73ffffffffffffffffffffffffffffffffffffffff16610e7d610ff1565b73ffffffffffffffffffffffffffffffffffffffff1614610ed3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eca906142b3565b60405180910390fd5b610edd600061216f565b565b610ee7611b39565b73ffffffffffffffffffffffffffffffffffffffff16610f05610ff1565b73ffffffffffffffffffffffffffffffffffffffff1614610f5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f52906142b3565b60405180910390fd5b8060058190555050565b60606009805480602002602001604051908101604052809291908181526020018280548015610fe757602002820191906000526020600020906000905b82829054906101000a900467ffffffffffffffff1667ffffffffffffffff1681526020019060080190602082600701049283019260010382029150808411610fa25790505b5050505050905090565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611023611b39565b73ffffffffffffffffffffffffffffffffffffffff16611041610ff1565b73ffffffffffffffffffffffffffffffffffffffff1614611097576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108e906142b3565b60405180910390fd5b80600790805190602001906110ad929190613043565b5050565b6110b9611b39565b73ffffffffffffffffffffffffffffffffffffffff166110d7610ff1565b73ffffffffffffffffffffffffffffffffffffffff161461112d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611124906142b3565b60405180910390fd5b61113681612235565b50565b61114b611144611b39565b838361224f565b5050565b6000600654905090565b6000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6111b7611b39565b73ffffffffffffffffffffffffffffffffffffffff166111d5610ff1565b73ffffffffffffffffffffffffffffffffffffffff161461122b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611222906142b3565b60405180910390fd5b600b600082815260200190815260200160002060009054906101000a900460ff161561128c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128390614193565b60405180910390fd5b60006008549050600860008154809291906112a6906148b5565b919050555060005b84518160ff1610156113ac5760016009868360ff16815181106112fa577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015160ff168154811061133c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600491828204019190066008028282829054906101000a900467ffffffffffffffff16611373919061467b565b92506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555080806113a4906148fe565b9150506112ae565b506001600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600b600084815260200190815260200160002060006101000a81548160ff02191690831515021790555061144d8382600160405180602001604052806000815250611c79565b7f0fff3e263cf7261e3a4d00166ce57380cc446558c7b91cb4f4d98ce1b7f3ca24848483856040516114829493929190613fc5565b60405180910390a150505050565b60606007805461149f90614852565b80601f01602080910402602001604051908101604052809291908181526020018280546114cb90614852565b80156115185780601f106114ed57610100808354040283529160200191611518565b820191906000526020600020905b8154815290600101906020018083116114fb57829003601f168201915b5050505050905090565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6115be611b39565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806116045750611603856115fe611b39565b611522565b5b611643576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163a90614173565b60405180910390fd5b61165085858585856123bc565b5050505050565b61165f611b39565b73ffffffffffffffffffffffffffffffffffffffff1661167d610ff1565b73ffffffffffffffffffffffffffffffffffffffff16146116d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ca906142b3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611743576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173a90614153565b60405180910390fd5b61174c8161216f565b50565b60606000821415611797576040518060400160405280600481526020017f307830300000000000000000000000000000000000000000000000000000000081525090506117d0565b600082905060005b600082146117c15780806117b2906148b5565b915050600882901c915061179f565b6117cb84826117d5565b925050505b919050565b6060600060028360026117e891906146b9565b6117f29190614625565b67ffffffffffffffff811115611831577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156118635781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106118c1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061194b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000600184600261198b91906146b9565b6119959190614625565b90505b6001811115611a81577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106119fd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b828281518110611a3a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080611a7a90614828565b9050611998565b5060008414611ac5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abc906140d3565b60405180910390fd5b8091505092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b6000600182511415611b565760019050611c2b565b6000600190505b82518160ff161015611c255782600182611b779190614713565b60ff1681518110611bb1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015160ff16838260ff1681518110611bf8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015160ff1611611c12576000915050611c2b565b8080611c1d906148fe565b915050611b5d565b50600190505b919050565b6000611c3c838361263e565b73ffffffffffffffffffffffffffffffffffffffff16611c5a610ff1565b73ffffffffffffffffffffffffffffffffffffffff1614905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611ce9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce0906143b3565b60405180910390fd5b6000611cf3611b39565b9050611d1481600087611d0588612665565b611d0e88612665565b8761272b565b8260008086815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d739190614625565b925050819055508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051611df192919061440e565b60405180910390a4611e0881600087878787612733565b5050505050565b8151835114611e53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e4a90614393565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611ec3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eba906141f3565b60405180910390fd5b6000611ecd611b39565b9050611edd81878787878761272b565b60005b84518110156120da576000858281518110611f24577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015190506000858381518110611f69577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561200a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200190614293565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546120bf9190614625565b92505081905550505050806120d3906148b5565b9050611ee0565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051612151929190613f6c565b60405180910390a461216781878787878761291a565b505050505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b806002908051906020019061224b929190613043565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156122be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b590614353565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516123af9190614011565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561242c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612423906141f3565b60405180910390fd5b6000612436611b39565b905061245681878761244788612665565b61245088612665565b8761272b565b600080600086815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050838110156124ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124e490614293565b60405180910390fd5b83810360008087815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508360008087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546125a29190614625565b925050819055508573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62888860405161261f92919061440e565b60405180910390a4612635828888888888612733565b50505050505050565b600080600061264d8585612b01565b9150915061265a81612b84565b819250505092915050565b60606000600167ffffffffffffffff8111156126aa577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156126d85781602001602082028036833780820191505090505b5090508281600081518110612716577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505080915050919050565b505050505050565b6127528473ffffffffffffffffffffffffffffffffffffffff16612ed5565b15612912578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401612798959493929190613ef0565b602060405180830381600087803b1580156127b257600080fd5b505af19250505080156127e357506040513d601f19601f820116820180604052508101906127e091906137dd565b60015b612889576127ef6149b5565b806308c379a0141561284c575061280461505c565b8061280f575061284e565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128439190614071565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612880906140b3565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612910576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612907906140f3565b60405180910390fd5b505b505050505050565b6129398473ffffffffffffffffffffffffffffffffffffffff16612ed5565b15612af9578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b815260040161297f959493929190613e88565b602060405180830381600087803b15801561299957600080fd5b505af19250505080156129ca57506040513d601f19601f820116820180604052508101906129c791906137dd565b60015b612a70576129d66149b5565b806308c379a01415612a3357506129eb61505c565b806129f65750612a35565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a2a9190614071565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a67906140b3565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612af7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aee906140f3565b60405180910390fd5b505b505050505050565b600080604183511415612b435760008060006020860151925060408601519150606086015160001a9050612b3787828585612ee8565b94509450505050612b7d565b604083511415612b74576000806020850151915060408501519050612b69868383612ff5565b935093505050612b7d565b60006002915091505b9250929050565b60006004811115612bbe577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115612bf7577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415612c0257612ed2565b60016004811115612c3c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115612c75577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415612cb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cad90614093565b60405180910390fd5b60026004811115612cf0577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115612d29577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415612d6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d6190614113565b60405180910390fd5b60036004811115612da4577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115612ddd577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415612e1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e15906141d3565b60405180910390fd5b600480811115612e57577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115612e90577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415612ed1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ec890614233565b60405180910390fd5b5b50565b600080823b905060008111915050919050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c1115612f23576000600391509150612fec565b601b8560ff1614158015612f3b5750601c8560ff1614155b15612f4d576000600491509150612fec565b600060018787878760405160008152602001604052604051612f72949392919061402c565b6020604051602081039080840390855afa158015612f94573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612fe357600060019250925050612fec565b80600092509250505b94509492505050565b6000806000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85169150601b8560ff1c01905061303587828885612ee8565b935093505050935093915050565b82805461304f90614852565b90600052602060002090601f01602090048101928261307157600085556130b8565b82601f1061308a57805160ff19168380011785556130b8565b828001600101855582156130b8579182015b828111156130b757825182559160200191906001019061309c565b5b5090506130c591906130c9565b5090565b5b808211156130e25760008160009055506001016130ca565b5090565b60006130f96130f48461445c565b614437565b9050808382526020820190508285602086028201111561311857600080fd5b60005b85811015613148578161312e88826132a6565b84526020840193506020830192505060018101905061311b565b5050509392505050565b600061316561316084614488565b614437565b9050808382526020820190508285602086028201111561318457600080fd5b60005b858110156131b4578161319a88826133e1565b845260208401935060208301925050600181019050613187565b5050509392505050565b60006131d16131cc846144b4565b614437565b905080838252602082019050828560208602820111156131f057600080fd5b60005b85811015613220578161320688826133f6565b8452602084019350602083019250506001810190506131f3565b5050509392505050565b600061323d613238846144e0565b614437565b90508281526020810184848401111561325557600080fd5b6132608482856147e6565b509392505050565b600061327b61327684614511565b614437565b90508281526020810184848401111561329357600080fd5b61329e8482856147e6565b509392505050565b6000813590506132b5816150f2565b92915050565b600082601f8301126132cc57600080fd5b81356132dc8482602086016130e6565b91505092915050565b600082601f8301126132f657600080fd5b8135613306848260208601613152565b91505092915050565b600082601f83011261332057600080fd5b81356133308482602086016131be565b91505092915050565b60008135905061334881615109565b92915050565b60008135905061335d81615120565b92915050565b60008135905061337281615137565b92915050565b60008151905061338781615137565b92915050565b600082601f83011261339e57600080fd5b81356133ae84826020860161322a565b91505092915050565b600082601f8301126133c857600080fd5b81356133d8848260208601613268565b91505092915050565b6000813590506133f08161514e565b92915050565b60008135905061340581615165565b92915050565b60006020828403121561341d57600080fd5b600061342b848285016132a6565b91505092915050565b6000806040838503121561344757600080fd5b6000613455858286016132a6565b9250506020613466858286016132a6565b9150509250929050565b600080600080600060a0868803121561348857600080fd5b6000613496888289016132a6565b95505060206134a7888289016132a6565b945050604086013567ffffffffffffffff8111156134c457600080fd5b6134d0888289016132e5565b935050606086013567ffffffffffffffff8111156134ed57600080fd5b6134f9888289016132e5565b925050608086013567ffffffffffffffff81111561351657600080fd5b6135228882890161338d565b9150509295509295909350565b600080600080600060a0868803121561354757600080fd5b6000613555888289016132a6565b9550506020613566888289016132a6565b9450506040613577888289016133e1565b9350506060613588888289016133e1565b925050608086013567ffffffffffffffff8111156135a557600080fd5b6135b18882890161338d565b9150509295509295909350565b600080604083850312156135d157600080fd5b60006135df858286016132a6565b92505060206135f085828601613339565b9150509250929050565b6000806040838503121561360d57600080fd5b600061361b858286016132a6565b925050602061362c858286016133e1565b9150509250929050565b6000806040838503121561364957600080fd5b600083013567ffffffffffffffff81111561366357600080fd5b61366f858286016132bb565b925050602083013567ffffffffffffffff81111561368c57600080fd5b613698858286016132e5565b9150509250929050565b6000806000606084860312156136b757600080fd5b600084013567ffffffffffffffff8111156136d157600080fd5b6136dd8682870161330f565b93505060206136ee868287016132a6565b92505060406136ff8682870161334e565b9150509250925092565b6000806000806080858703121561371f57600080fd5b600085013567ffffffffffffffff81111561373957600080fd5b6137458782880161330f565b945050602085013567ffffffffffffffff81111561376257600080fd5b61376e8782880161338d565b935050604061377f8782880161334e565b925050606085013567ffffffffffffffff81111561379c57600080fd5b6137a88782880161338d565b91505092959194509250565b6000602082840312156137c657600080fd5b60006137d484828501613363565b91505092915050565b6000602082840312156137ef57600080fd5b60006137fd84828501613378565b91505092915050565b60006020828403121561381857600080fd5b600082013567ffffffffffffffff81111561383257600080fd5b61383e848285016133b7565b91505092915050565b60006020828403121561385957600080fd5b6000613867848285016133e1565b91505092915050565b600061387c8383613e22565b60208301905092915050565b60006138948383613e40565b60208301905092915050565b60006138ac8383613e4f565b60208301905092915050565b6138c181614747565b82525050565b60006138d282614572565b6138dc81856145d0565b93506138e783614542565b8060005b838110156139185781516138ff8882613870565b975061390a836145a9565b9250506001810190506138eb565b5085935050505092915050565b60006139308261457d565b61393a81856145e1565b935061394583614552565b8060005b8381101561397657815161395d8882613888565b9750613968836145b6565b925050600181019050613949565b5085935050505092915050565b600061398e82614588565b61399881856145f2565b93506139a383614562565b8060005b838110156139d45781516139bb88826138a0565b97506139c6836145c3565b9250506001810190506139a7565b5085935050505092915050565b6139ea81614759565b82525050565b6139f981614765565b82525050565b6000613a0a82614593565b613a148185614603565b9350613a248185602086016147f5565b613a2d816149d7565b840191505092915050565b6000613a438261459e565b613a4d8185614614565b9350613a5d8185602086016147f5565b613a66816149d7565b840191505092915050565b6000613a7e601883614614565b9150613a89826149f5565b602082019050919050565b6000613aa1603483614614565b9150613aac82614a1e565b604082019050919050565b6000613ac4602083614614565b9150613acf82614a6d565b602082019050919050565b6000613ae7602883614614565b9150613af282614a96565b604082019050919050565b6000613b0a601f83614614565b9150613b1582614ae5565b602082019050919050565b6000613b2d602b83614614565b9150613b3882614b0e565b604082019050919050565b6000613b50602683614614565b9150613b5b82614b5d565b604082019050919050565b6000613b73602983614614565b9150613b7e82614bac565b604082019050919050565b6000613b96600e83614614565b9150613ba182614bfb565b602082019050919050565b6000613bb9601a83614614565b9150613bc482614c24565b602082019050919050565b6000613bdc602283614614565b9150613be782614c4d565b604082019050919050565b6000613bff602583614614565b9150613c0a82614c9c565b604082019050919050565b6000613c22603283614614565b9150613c2d82614ceb565b604082019050919050565b6000613c45602283614614565b9150613c5082614d3a565b604082019050919050565b6000613c68600d83614614565b9150613c7382614d89565b602082019050919050565b6000613c8b601583614614565b9150613c9682614db2565b602082019050919050565b6000613cae602a83614614565b9150613cb982614ddb565b604082019050919050565b6000613cd1602083614614565b9150613cdc82614e2a565b602082019050919050565b6000613cf4601783614614565b9150613cff82614e53565b602082019050919050565b6000613d17601a83614614565b9150613d2282614e7c565b602082019050919050565b6000613d3a601483614614565b9150613d4582614ea5565b602082019050919050565b6000613d5d601f83614614565b9150613d6882614ece565b602082019050919050565b6000613d80602983614614565b9150613d8b82614ef7565b604082019050919050565b6000613da3602983614614565b9150613dae82614f46565b604082019050919050565b6000613dc6602883614614565b9150613dd182614f95565b604082019050919050565b6000613de9602183614614565b9150613df482614fe4565b604082019050919050565b6000613e0c601f83614614565b9150613e1782615033565b602082019050919050565b613e2b816147bb565b82525050565b613e3a816147bb565b82525050565b613e49816147c5565b82525050565b613e58816147d9565b82525050565b613e67816147d9565b82525050565b6000602082019050613e8260008301846138b8565b92915050565b600060a082019050613e9d60008301886138b8565b613eaa60208301876138b8565b8181036040830152613ebc81866138c7565b90508181036060830152613ed081856138c7565b90508181036080830152613ee481846139ff565b90509695505050505050565b600060a082019050613f0560008301886138b8565b613f1260208301876138b8565b613f1f6040830186613e31565b613f2c6060830185613e31565b8181036080830152613f3e81846139ff565b90509695505050505050565b60006020820190508181036000830152613f6481846138c7565b905092915050565b60006040820190508181036000830152613f8681856138c7565b90508181036020830152613f9a81846138c7565b90509392505050565b60006020820190508181036000830152613fbd8184613925565b905092915050565b60006080820190508181036000830152613fdf8187613983565b9050613fee60208301866138b8565b613ffb6040830185613e31565b61400860608301846139f0565b95945050505050565b600060208201905061402660008301846139e1565b92915050565b600060808201905061404160008301876139f0565b61404e6020830186613e5e565b61405b60408301856139f0565b61406860608301846139f0565b95945050505050565b6000602082019050818103600083015261408b8184613a38565b905092915050565b600060208201905081810360008301526140ac81613a71565b9050919050565b600060208201905081810360008301526140cc81613a94565b9050919050565b600060208201905081810360008301526140ec81613ab7565b9050919050565b6000602082019050818103600083015261410c81613ada565b9050919050565b6000602082019050818103600083015261412c81613afd565b9050919050565b6000602082019050818103600083015261414c81613b20565b9050919050565b6000602082019050818103600083015261416c81613b43565b9050919050565b6000602082019050818103600083015261418c81613b66565b9050919050565b600060208201905081810360008301526141ac81613b89565b9050919050565b600060208201905081810360008301526141cc81613bac565b9050919050565b600060208201905081810360008301526141ec81613bcf565b9050919050565b6000602082019050818103600083015261420c81613bf2565b9050919050565b6000602082019050818103600083015261422c81613c15565b9050919050565b6000602082019050818103600083015261424c81613c38565b9050919050565b6000602082019050818103600083015261426c81613c5b565b9050919050565b6000602082019050818103600083015261428c81613c7e565b9050919050565b600060208201905081810360008301526142ac81613ca1565b9050919050565b600060208201905081810360008301526142cc81613cc4565b9050919050565b600060208201905081810360008301526142ec81613ce7565b9050919050565b6000602082019050818103600083015261430c81613d0a565b9050919050565b6000602082019050818103600083015261432c81613d2d565b9050919050565b6000602082019050818103600083015261434c81613d50565b9050919050565b6000602082019050818103600083015261436c81613d73565b9050919050565b6000602082019050818103600083015261438c81613d96565b9050919050565b600060208201905081810360008301526143ac81613db9565b9050919050565b600060208201905081810360008301526143cc81613ddc565b9050919050565b600060208201905081810360008301526143ec81613dff565b9050919050565b60006020820190506144086000830184613e31565b92915050565b60006040820190506144236000830185613e31565b6144306020830184613e31565b9392505050565b6000614441614452565b905061444d8282614884565b919050565b6000604051905090565b600067ffffffffffffffff82111561447757614476614986565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156144a3576144a2614986565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156144cf576144ce614986565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156144fb576144fa614986565b5b614504826149d7565b9050602081019050919050565b600067ffffffffffffffff82111561452c5761452b614986565b5b614535826149d7565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b6000614630826147bb565b915061463b836147bb565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156146705761466f614928565b5b828201905092915050565b6000614686826147c5565b9150614691836147c5565b92508267ffffffffffffffff038211156146ae576146ad614928565b5b828201905092915050565b60006146c4826147bb565b91506146cf836147bb565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561470857614707614928565b5b828202905092915050565b600061471e826147d9565b9150614729836147d9565b92508282101561473c5761473b614928565b5b828203905092915050565b60006147528261479b565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156148135780820151818401526020810190506147f8565b83811115614822576000848401525b50505050565b6000614833826147bb565b9150600082141561484757614846614928565b5b600182039050919050565b6000600282049050600182168061486a57607f821691505b6020821081141561487e5761487d614957565b5b50919050565b61488d826149d7565b810181811067ffffffffffffffff821117156148ac576148ab614986565b5b80604052505050565b60006148c0826147bb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156148f3576148f2614928565b5b600182019050919050565b6000614909826147d9565b915060ff82141561491d5761491c614928565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060033d11156149d45760046000803e6149d16000516149e8565b90505b90565b6000601f19601f8301169050919050565b60008160e01c9050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f455243313135353a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008201527f20617070726f7665640000000000000000000000000000000000000000000000602082015250565b7f5469636b65742069732075736564000000000000000000000000000000000000600082015250565b7f496473206e6f7420696e20617363656e64696e67206f72646572000000000000600082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f5573657220697320766f74656400000000000000000000000000000000000000600082015250565b7f766f746520697320656e64656420616c72656164790000000000000000000000600082015250565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f496473206c656e677468206e6f7420696e205b312c335d000000000000000000600082015250565b7f54686520766f7465206973206e6f7420617574686f72697a6564000000000000600082015250565b7f766f7465206e6f74207374617274656420796574000000000000000000000000600082015250565b7f4d656d6f2073686f756c642062652077697468696e2031323820627974657300600082015250565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600060443d101561506c576150ef565b615074614452565b60043d036004823e80513d602482011167ffffffffffffffff8211171561509c5750506150ef565b808201805167ffffffffffffffff8111156150ba57505050506150ef565b80602083010160043d0385018111156150d75750505050506150ef565b6150e682602001850186614884565b82955050505050505b90565b6150fb81614747565b811461510657600080fd5b50565b61511281614759565b811461511d57600080fd5b50565b61512981614765565b811461513457600080fd5b50565b6151408161476f565b811461514b57600080fd5b50565b615157816147bb565b811461516257600080fd5b50565b61516e816147d9565b811461517957600080fd5b5056fea2646970667358221220295b114865b1a79e5f0a2c82f5c6cb1af679f26b5095797fe8938427c46eabe764736f6c63430008040033

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

00000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000061e7c50000000000000000000000000000000000000000000000000000000000621dd280000000000000000000000000000000000000000000000000000000000000002168747470733a2f2f6170692e6d6574617a6f6e732e636f6d2f6d6574616461746100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002168747470733a2f2f6170692e6d6574617a6f6e732e636f6d2f6d6574616461746100000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : tokenBaseUri (string): https://api.metazons.com/metadata
Arg [1] : contractBaseUri (string): https://api.metazons.com/metadata
Arg [2] : totalCandidates (uint8): 42
Arg [3] : campaignStartDate (uint256): 1642579200
Arg [4] : campaignEndDate (uint256): 1646121600

-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [2] : 000000000000000000000000000000000000000000000000000000000000002a
Arg [3] : 0000000000000000000000000000000000000000000000000000000061e7c500
Arg [4] : 00000000000000000000000000000000000000000000000000000000621dd280
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000021
Arg [6] : 68747470733a2f2f6170692e6d6574617a6f6e732e636f6d2f6d657461646174
Arg [7] : 6100000000000000000000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000021
Arg [9] : 68747470733a2f2f6170692e6d6574617a6f6e732e636f6d2f6d657461646174
Arg [10] : 6100000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

51911:4440:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20354:231;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19377:310;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53838:92;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20098:105;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54030:1138;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22293:442;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53505:106;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20751:524;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47280:103;;;:::i;:::-;;53389:110;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53617:106;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46629:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56246:102;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53289:94;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21348:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53936:88;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53729:103;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55174:538;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56138:102;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21575:168;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21815:401;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47538:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20354:231;20440:7;20487:1;20468:21;;:7;:21;;;;20460:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;20555:9;:13;20565:2;20555:13;;;;;;;;;;;:22;20569:7;20555:22;;;;;;;;;;;;;;;;20548:29;;20354:231;;;;:::o;19377:310::-;19479:4;19531:26;19516:41;;;:11;:41;;;;:110;;;;19589:37;19574:52;;;:11;:52;;;;19516:110;:163;;;;19643:36;19667:11;19643:23;:36::i;:::-;19516:163;19496:183;;19377:310;;;:::o;53838:92::-;53891:7;53914:10;;53907:17;;53838:92;:::o;20098:105::-;20158:13;20191:4;20184:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20098:105;;;:::o;54030:1138::-;49917:1;50515:7;;:19;;50507:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;49917:1;50648:7;:18;;;;54234:10:::1;;54215:15;:29;;54207:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;54303:8;;54284:15;:27;;54276:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;54353:8;:22;54362:12;:10;:12::i;:::-;54353:22;;;;;;;;;;;;;;;;;;;;;;;;;54352:23;54344:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;54436:1;54416:9;:16;:21;;:46;;;;;54461:1;54441:9;:16;:21;;54416:46;54400:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;54518:28;54536:9;54518:17;:28::i;:::-;54510:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;54607:3;54592:4;:11;:18;;54584:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;54662:13;:21;54676:6;54662:21;;;;;;;;;;;;;;;;;;;;;54661:22;54653:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;54717:32;54731:6;54739:9;54717:13;:32::i;:::-;54709:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;54802:21;54826:12;;54802:36;;54845:12;;:14;;;;;;;;;:::i;:::-;;;;;;54871:7;54866:92;54888:9;:16;54884:1;:20;;;54866:92;;;54949:1;54920:11;54932:9;54942:1;54932:12;;;;;;;;;;;;;;;;;;;;;;;;54920:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;54906:3;;;;;:::i;:::-;;;;54866:92;;;;54989:4;54964:8;:22;54973:12;:10;:12::i;:::-;54964:22;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;55024:4;55000:13;:21;55014:6;55000:21;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;55056:41;55062:12;:10;:12::i;:::-;55076:13;55091:1;55056:41;;;;;;;;;;;::::0;:5:::1;:41::i;:::-;55109:53;55115:9;55126:12;:10;:12::i;:::-;55140:13;55155:6;55109:53;;;;;;;;;:::i;:::-;;;;;;;;50679:1;49873::::0;50827:7;:22;;;;54030:1138;;;;:::o;22293:442::-;22534:12;:10;:12::i;:::-;22526:20;;:4;:20;;;:60;;;;22550:36;22567:4;22573:12;:10;:12::i;:::-;22550:16;:36::i;:::-;22526:60;22504:160;;;;;;;;;;;;:::i;:::-;;;;;;;;;22675:52;22698:4;22704:2;22708:3;22713:7;22722:4;22675:22;:52::i;:::-;22293:442;;;;;:::o;53505:106::-;46860:12;:10;:12::i;:::-;46849:23;;:7;:5;:7::i;:::-;:23;;;46841:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53593:12:::1;53582:8;:23;;;;53505:106:::0;:::o;20751:524::-;20907:16;20968:3;:10;20949:8;:15;:29;20941:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;21037:30;21084:8;:15;21070:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21037:63;;21118:9;21113:122;21137:8;:15;21133:1;:19;21113:122;;;21193:30;21203:8;21212:1;21203:11;;;;;;;;;;;;;;;;;;;;;;21216:3;21220:1;21216:6;;;;;;;;;;;;;;;;;;;;;;21193:9;:30::i;:::-;21174:13;21188:1;21174:16;;;;;;;;;;;;;;;;;;;;;:49;;;;;21154:3;;;;:::i;:::-;;;21113:122;;;;21254:13;21247:20;;;20751:524;;;;:::o;47280:103::-;46860:12;:10;:12::i;:::-;46849:23;;:7;:5;:7::i;:::-;:23;;;46841:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47345:30:::1;47372:1;47345:18;:30::i;:::-;47280:103::o:0;53389:110::-;46860:12;:10;:12::i;:::-;46849:23;;:7;:5;:7::i;:::-;:23;;;46841:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53481:12:::1;53468:10;:25;;;;53389:110:::0;:::o;53617:106::-;53675:15;53706:11;53699:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53617:106;:::o;46629:87::-;46675:7;46702:6;;;;;;;;;;;46695:13;;46629:87;:::o;56246:102::-;46860:12;:10;:12::i;:::-;46849:23;;:7;:5;:7::i;:::-;:23;;;46841:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56339:3:::1;56324:12;:18;;;;;;;;;;;;:::i;:::-;;56246:102:::0;:::o;53289:94::-;46860:12;:10;:12::i;:::-;46849:23;;:7;:5;:7::i;:::-;:23;;;46841:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53362:15:::1;53370:6;53362:7;:15::i;:::-;53289:94:::0;:::o;21348:155::-;21443:52;21462:12;:10;:12::i;:::-;21476:8;21486;21443:18;:52::i;:::-;21348:155;;:::o;53936:88::-;53987:7;54010:8;;54003:15;;53936:88;:::o;53729:103::-;53792:4;53812:8;:14;53821:4;53812:14;;;;;;;;;;;;;;;;;;;;;;;;;53805:21;;53729:103;;;:::o;55174:538::-;46860:12;:10;:12::i;:::-;46849:23;;:7;:5;:7::i;:::-;:23;;;46841:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55305:13:::1;:21;55319:6;55305:21;;;;;;;;;;;;;;;;;;;;;55304:22;55296:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;55367:21;55391:12;;55367:36;;55410:12;;:14;;;;;;;;;:::i;:::-;;;;;;55436:7;55431:92;55453:9;:16;55449:1;:20;;;55431:92;;;55514:1;55485:11;55497:9;55507:1;55497:12;;;;;;;;;;;;;;;;;;;;;;;;55485:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;55471:3;;;;;:::i;:::-;;;;55431:92;;;;55547:4;55529:8;:15;55538:5;55529:15;;;;;;;;;;;;;;;;:22;;;;;;;;;;;;;;;;;;55582:4;55558:13;:21;55572:6;55558:21;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;55614:34;55620:5;55627:13;55642:1;55614:34;;;;;;;;;;;::::0;:5:::1;:34::i;:::-;55660:46;55666:9;55677:5;55684:13;55699:6;55660:46;;;;;;;;;:::i;:::-;;;;;;;;46920:1;55174:538:::0;;;:::o;56138:102::-;56193:13;56222:12;56215:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56138:102;:::o;21575:168::-;21674:4;21698:18;:27;21717:7;21698:27;;;;;;;;;;;;;;;:37;21726:8;21698:37;;;;;;;;;;;;;;;;;;;;;;;;;21691:44;;21575:168;;;;:::o;21815:401::-;22031:12;:10;:12::i;:::-;22023:20;;:4;:20;;;:60;;;;22047:36;22064:4;22070:12;:10;:12::i;:::-;22047:16;:36::i;:::-;22023:60;22001:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;22163:45;22181:4;22187:2;22191;22195:6;22203:4;22163:17;:45::i;:::-;21815:401;;;;;:::o;47538:201::-;46860:12;:10;:12::i;:::-;46849:23;;:7;:5;:7::i;:::-;:23;;;46841:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47647:1:::1;47627:22;;:8;:22;;;;47619:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;47703:28;47722:8;47703:18;:28::i;:::-;47538:201:::0;:::o;35063:340::-;35122:13;35161:1;35152:5;:10;35148:56;;;35179:13;;;;;;;;;;;;;;;;;;;;;35148:56;35214:12;35229:5;35214:20;;35245:14;35274:78;35289:1;35281:4;:9;35274:78;;35307:8;;;;;:::i;:::-;;;;35339:1;35330:10;;;;;35274:78;;;35369:26;35381:5;35388:6;35369:11;:26::i;:::-;35362:33;;;;35063:340;;;;:::o;35531:451::-;35606:13;35632:19;35677:1;35668:6;35664:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;35654:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35632:47;;35690:15;:6;35697:1;35690:9;;;;;;;;;;;;;;;;;;;:15;;;;;;;;;;;35716;:6;35723:1;35716:9;;;;;;;;;;;;;;;;;;;:15;;;;;;;;;;;35747:9;35772:1;35763:6;35759:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;35747:26;;35742:135;35779:1;35775;:5;35742:135;;;35814:12;35835:3;35827:5;:11;35814:25;;;;;;;;;;;;;;;;;;35802:6;35809:1;35802:9;;;;;;;;;;;;;;;;;;;:37;;;;;;;;;;;35864:1;35854:11;;;;;35782:3;;;;:::i;:::-;;;35742:135;;;;35904:1;35895:5;:10;35887:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;35967:6;35953:21;;;35531:451;;;;:::o;18130:157::-;18215:4;18254:25;18239:40;;;:11;:40;;;;18232:47;;18130:157;;;:::o;17045:98::-;17098:7;17125:10;17118:17;;17045:98;:::o;55893:239::-;55963:4;55994:1;55980:3;:10;:15;55976:32;;;56004:4;55997:11;;;;55976:32;56020:7;56030:1;56020:11;;56015:94;56037:3;:10;56033:1;:14;;;56015:94;;;56077:3;56085:1;56081;:5;;;;:::i;:::-;56077:10;;;;;;;;;;;;;;;;;;;;;;;;56067:20;;:3;56071:1;56067:6;;;;;;;;;;;;;;;;;;;;;;;;:20;;;56063:38;;56096:5;56089:12;;;;;56063:38;56049:3;;;;;:::i;:::-;;;;56015:94;;;;56122:4;56115:11;;55893:239;;;;:::o;55718:169::-;55817:4;55851:30;55865:4;55871:9;55851:13;:30::i;:::-;55840:41;;:7;:5;:7::i;:::-;:41;;;55833:48;;55718:169;;;;:::o;26769:569::-;26936:1;26922:16;;:2;:16;;;;26914:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;26989:16;27008:12;:10;:12::i;:::-;26989:31;;27033:102;27054:8;27072:1;27076:2;27080:21;27098:2;27080:17;:21::i;:::-;27103:25;27121:6;27103:17;:25::i;:::-;27130:4;27033:20;:102::i;:::-;27169:6;27148:9;:13;27158:2;27148:13;;;;;;;;;;;:17;27162:2;27148:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;27228:2;27191:52;;27224:1;27191:52;;27206:8;27191:52;;;27232:2;27236:6;27191:52;;;;;;;:::i;:::-;;;;;;;;27256:74;27287:8;27305:1;27309:2;27313;27317:6;27325:4;27256:30;:74::i;:::-;26769:569;;;;;:::o;24377:1074::-;24604:7;:14;24590:3;:10;:28;24582:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;24696:1;24682:16;;:2;:16;;;;24674:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;24753:16;24772:12;:10;:12::i;:::-;24753:31;;24797:60;24818:8;24828:4;24834:2;24838:3;24843:7;24852:4;24797:20;:60::i;:::-;24875:9;24870:421;24894:3;:10;24890:1;:14;24870:421;;;24926:10;24939:3;24943:1;24939:6;;;;;;;;;;;;;;;;;;;;;;24926:19;;24960:14;24977:7;24985:1;24977:10;;;;;;;;;;;;;;;;;;;;;;24960:27;;25004:19;25026:9;:13;25036:2;25026:13;;;;;;;;;;;:19;25040:4;25026:19;;;;;;;;;;;;;;;;25004:41;;25083:6;25068:11;:21;;25060:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;25216:6;25202:11;:20;25180:9;:13;25190:2;25180:13;;;;;;;;;;;:19;25194:4;25180:19;;;;;;;;;;;;;;;:42;;;;25273:6;25252:9;:13;25262:2;25252:13;;;;;;;;;;;:17;25266:2;25252:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;24870:421;;;24906:3;;;;:::i;:::-;;;24870:421;;;;25338:2;25308:47;;25332:4;25308:47;;25322:8;25308:47;;;25342:3;25347:7;25308:47;;;;;;;:::i;:::-;;;;;;;;25368:75;25404:8;25414:4;25420:2;25424:3;25429:7;25438:4;25368:35;:75::i;:::-;24377:1074;;;;;;:::o;47899:191::-;47973:16;47992:6;;;;;;;;;;;47973:25;;48018:8;48009:6;;:17;;;;;;;;;;;;;;;;;;48073:8;48042:40;;48063:8;48042:40;;;;;;;;;;;;47899:191;;:::o;26295:88::-;26369:6;26362:4;:13;;;;;;;;;;;;:::i;:::-;;26295:88;:::o;30563:331::-;30718:8;30709:17;;:5;:17;;;;30701:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;30821:8;30783:18;:25;30802:5;30783:25;;;;;;;;;;;;;;;:35;30809:8;30783:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;30867:8;30845:41;;30860:5;30845:41;;;30877:8;30845:41;;;;;;:::i;:::-;;;;;;;;30563:331;;;:::o;23199:820::-;23401:1;23387:16;;:2;:16;;;;23379:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;23458:16;23477:12;:10;:12::i;:::-;23458:31;;23502:96;23523:8;23533:4;23539:2;23543:21;23561:2;23543:17;:21::i;:::-;23566:25;23584:6;23566:17;:25::i;:::-;23593:4;23502:20;:96::i;:::-;23611:19;23633:9;:13;23643:2;23633:13;;;;;;;;;;;:19;23647:4;23633:19;;;;;;;;;;;;;;;;23611:41;;23686:6;23671:11;:21;;23663:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;23811:6;23797:11;:20;23775:9;:13;23785:2;23775:13;;;;;;;;;;;:19;23789:4;23775:19;;;;;;;;;;;;;;;:42;;;;23860:6;23839:9;:13;23849:2;23839:13;;;;;;;;;;;:17;23853:2;23839:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;23915:2;23884:46;;23909:4;23884:46;;23899:8;23884:46;;;23919:2;23923:6;23884:46;;;;;;;:::i;:::-;;;;;;;;23943:68;23974:8;23984:4;23990:2;23994;23998:6;24006:4;23943:30;:68::i;:::-;23199:820;;;;;;;:::o;40397:231::-;40475:7;40496:17;40515:18;40537:27;40548:4;40554:9;40537:10;:27::i;:::-;40495:69;;;;40575:18;40587:5;40575:11;:18::i;:::-;40611:9;40604:16;;;;40397:231;;;;:::o;33652:198::-;33718:16;33747:22;33786:1;33772:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33747:41;;33810:7;33799:5;33805:1;33799:8;;;;;;;;;;;;;;;;;;;;;:18;;;;;33837:5;33830:12;;;33652:198;;;:::o;31850:221::-;;;;;;;:::o;32079:744::-;32294:15;:2;:13;;;:15::i;:::-;32290:526;;;32347:2;32330:38;;;32369:8;32379:4;32385:2;32389:6;32397:4;32330:72;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;32326:479;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;32678:6;32671:14;;;;;;;;;;;:::i;:::-;;;;;;;;32326:479;;;32727:62;;;;;;;;;;:::i;:::-;;;;;;;;32326:479;32464:43;;;32452:55;;;:8;:55;;;;32448:154;;32532:50;;;;;;;;;;:::i;:::-;;;;;;;;32448:154;32403:214;32290:526;32079:744;;;;;;:::o;32831:813::-;33071:15;:2;:13;;;:15::i;:::-;33067:570;;;33124:2;33107:43;;;33151:8;33161:4;33167:3;33172:7;33181:4;33107:79;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33103:523;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;33499:6;33492:14;;;;;;;;;;;:::i;:::-;;;;;;;;33103:523;;;33548:62;;;;;;;;;;:::i;:::-;;;;;;;;33103:523;33280:48;;;33268:60;;;:8;:60;;;;33264:159;;33353:50;;;;;;;;;;:::i;:::-;;;;;;;;33264:159;33187:251;33067:570;32831:813;;;;;;:::o;38287:1308::-;38368:7;38377:12;38622:2;38602:9;:16;:22;38598:990;;;38641:9;38665;38689:7;38898:4;38887:9;38883:20;38877:27;38872:32;;38948:4;38937:9;38933:20;38927:27;38922:32;;39006:4;38995:9;38991:20;38985:27;38982:1;38977:36;38972:41;;39049:25;39060:4;39066:1;39069;39072;39049:10;:25::i;:::-;39042:32;;;;;;;;;38598:990;39116:2;39096:9;:16;:22;39092:496;;;39135:9;39159:10;39371:4;39360:9;39356:20;39350:27;39345:32;;39422:4;39411:9;39407:20;39401:27;39395:33;;39464:23;39475:4;39481:1;39484:2;39464:10;:23::i;:::-;39457:30;;;;;;;;39092:496;39536:1;39540:35;39520:56;;;;38287:1308;;;;;;:::o;36558:643::-;36636:20;36627:29;;;;;;;;;;;;;;;;:5;:29;;;;;;;;;;;;;;;;;36623:571;;;36673:7;;36623:571;36734:29;36725:38;;;;;;;;;;;;;;;;:5;:38;;;;;;;;;;;;;;;;;36721:473;;;36780:34;;;;;;;;;;:::i;:::-;;;;;;;;36721:473;36845:35;36836:44;;;;;;;;;;;;;;;;:5;:44;;;;;;;;;;;;;;;;;36832:362;;;36897:41;;;;;;;;;;:::i;:::-;;;;;;;;36832:362;36969:30;36960:39;;;;;;;;;;;;;;;;:5;:39;;;;;;;;;;;;;;;;;36956:238;;;37016:44;;;;;;;;;;:::i;:::-;;;;;;;;36956:238;37091:30;37082:39;;;;;;;;;;;;;;;;:5;:39;;;;;;;;;;;;;;;;;37078:116;;;37138:44;;;;;;;;;;:::i;:::-;;;;;;;;37078:116;36558:643;;:::o;9027:387::-;9087:4;9295:12;9362:7;9350:20;9342:28;;9405:1;9398:4;:8;9391:15;;;9027:387;;;:::o;41896:1632::-;42027:7;42036:12;42961:66;42956:1;42948:10;;:79;42944:163;;;43060:1;43064:30;43044:51;;;;;;42944:163;43126:2;43121:1;:7;;;;:18;;;;;43137:2;43132:1;:7;;;;43121:18;43117:102;;;43172:1;43176:30;43156:51;;;;;;43117:102;43316:14;43333:24;43343:4;43349:1;43352;43355;43333:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43316:41;;43390:1;43372:20;;:6;:20;;;43368:103;;;43425:1;43429:29;43409:50;;;;;;;43368:103;43491:6;43499:20;43483:37;;;;;41896:1632;;;;;;;;:::o;40891:391::-;41005:7;41014:12;41039:9;41059:7;41114:66;41110:2;41106:75;41101:80;;41218:2;41213;41208:3;41204:12;41200:21;41195:26;;41249:25;41260:4;41266:1;41269;41272;41249:10;:25::i;:::-;41242:32;;;;;;40891:391;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:655:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:2;;;414:1;411;404:12;350:2;450:1;435:238;460:6;457:1;454:13;435:238;;;528:3;557:37;590:3;578:10;557:37;:::i;:::-;552:3;545:50;624:4;619:3;615:14;608:21;;658:4;653:3;649:14;642:21;;495:178;482:1;479;475:9;470:14;;435:238;;;439:14;126:553;;;;;;;:::o;702:655::-;798:5;823:81;839:64;896:6;839:64;:::i;:::-;823:81;:::i;:::-;814:90;;924:5;953:6;946:5;939:21;987:4;980:5;976:16;969:23;;1013:6;1063:3;1055:4;1047:6;1043:17;1038:3;1034:27;1031:36;1028:2;;;1092:1;1089;1082:12;1028:2;1128:1;1113:238;1138:6;1135:1;1132:13;1113:238;;;1206:3;1235:37;1268:3;1256:10;1235:37;:::i;:::-;1230:3;1223:50;1302:4;1297:3;1293:14;1286:21;;1336:4;1331:3;1327:14;1320:21;;1173:178;1160:1;1157;1153:9;1148:14;;1113:238;;;1117:14;804:553;;;;;;;:::o;1378:649::-;1472:5;1497:79;1513:62;1568:6;1513:62;:::i;:::-;1497:79;:::i;:::-;1488:88;;1596:5;1625:6;1618:5;1611:21;1659:4;1652:5;1648:16;1641:23;;1685:6;1735:3;1727:4;1719:6;1715:17;1710:3;1706:27;1703:36;1700:2;;;1764:1;1761;1754:12;1700:2;1800:1;1785:236;1810:6;1807:1;1804:13;1785:236;;;1878:3;1907:35;1938:3;1926:10;1907:35;:::i;:::-;1902:3;1895:48;1972:4;1967:3;1963:14;1956:21;;2006:4;2001:3;1997:14;1990:21;;1845:176;1832:1;1829;1825:9;1820:14;;1785:236;;;1789:14;1478:549;;;;;;;:::o;2033:343::-;2110:5;2135:65;2151:48;2192:6;2151:48;:::i;:::-;2135:65;:::i;:::-;2126:74;;2223:6;2216:5;2209:21;2261:4;2254:5;2250:16;2299:3;2290:6;2285:3;2281:16;2278:25;2275:2;;;2316:1;2313;2306:12;2275:2;2329:41;2363:6;2358:3;2353;2329:41;:::i;:::-;2116:260;;;;;;:::o;2382:345::-;2460:5;2485:66;2501:49;2543:6;2501:49;:::i;:::-;2485:66;:::i;:::-;2476:75;;2574:6;2567:5;2560:21;2612:4;2605:5;2601:16;2650:3;2641:6;2636:3;2632:16;2629:25;2626:2;;;2667:1;2664;2657:12;2626:2;2680:41;2714:6;2709:3;2704;2680:41;:::i;:::-;2466:261;;;;;;:::o;2733:139::-;2779:5;2817:6;2804:20;2795:29;;2833:33;2860:5;2833:33;:::i;:::-;2785:87;;;;:::o;2895:303::-;2966:5;3015:3;3008:4;3000:6;2996:17;2992:27;2982:2;;3033:1;3030;3023:12;2982:2;3073:6;3060:20;3098:94;3188:3;3180:6;3173:4;3165:6;3161:17;3098:94;:::i;:::-;3089:103;;2972:226;;;;;:::o;3221:303::-;3292:5;3341:3;3334:4;3326:6;3322:17;3318:27;3308:2;;3359:1;3356;3349:12;3308:2;3399:6;3386:20;3424:94;3514:3;3506:6;3499:4;3491:6;3487:17;3424:94;:::i;:::-;3415:103;;3298:226;;;;;:::o;3545:299::-;3614:5;3663:3;3656:4;3648:6;3644:17;3640:27;3630:2;;3681:1;3678;3671:12;3630:2;3721:6;3708:20;3746:92;3834:3;3826:6;3819:4;3811:6;3807:17;3746:92;:::i;:::-;3737:101;;3620:224;;;;;:::o;3850:133::-;3893:5;3931:6;3918:20;3909:29;;3947:30;3971:5;3947:30;:::i;:::-;3899:84;;;;:::o;3989:139::-;4035:5;4073:6;4060:20;4051:29;;4089:33;4116:5;4089:33;:::i;:::-;4041:87;;;;:::o;4134:137::-;4179:5;4217:6;4204:20;4195:29;;4233:32;4259:5;4233:32;:::i;:::-;4185:86;;;;:::o;4277:141::-;4333:5;4364:6;4358:13;4349:22;;4380:32;4406:5;4380:32;:::i;:::-;4339:79;;;;:::o;4437:271::-;4492:5;4541:3;4534:4;4526:6;4522:17;4518:27;4508:2;;4559:1;4556;4549:12;4508:2;4599:6;4586:20;4624:78;4698:3;4690:6;4683:4;4675:6;4671:17;4624:78;:::i;:::-;4615:87;;4498:210;;;;;:::o;4728:273::-;4784:5;4833:3;4826:4;4818:6;4814:17;4810:27;4800:2;;4851:1;4848;4841:12;4800:2;4891:6;4878:20;4916:79;4991:3;4983:6;4976:4;4968:6;4964:17;4916:79;:::i;:::-;4907:88;;4790:211;;;;;:::o;5007:139::-;5053:5;5091:6;5078:20;5069:29;;5107:33;5134:5;5107:33;:::i;:::-;5059:87;;;;:::o;5152:135::-;5196:5;5234:6;5221:20;5212:29;;5250:31;5275:5;5250:31;:::i;:::-;5202:85;;;;:::o;5293:262::-;5352:6;5401:2;5389:9;5380:7;5376:23;5372:32;5369:2;;;5417:1;5414;5407:12;5369:2;5460:1;5485:53;5530:7;5521:6;5510:9;5506:22;5485:53;:::i;:::-;5475:63;;5431:117;5359:196;;;;:::o;5561:407::-;5629:6;5637;5686:2;5674:9;5665:7;5661:23;5657:32;5654:2;;;5702:1;5699;5692:12;5654:2;5745:1;5770:53;5815:7;5806:6;5795:9;5791:22;5770:53;:::i;:::-;5760:63;;5716:117;5872:2;5898:53;5943:7;5934:6;5923:9;5919:22;5898:53;:::i;:::-;5888:63;;5843:118;5644:324;;;;;:::o;5974:1241::-;6128:6;6136;6144;6152;6160;6209:3;6197:9;6188:7;6184:23;6180:33;6177:2;;;6226:1;6223;6216:12;6177:2;6269:1;6294:53;6339:7;6330:6;6319:9;6315:22;6294:53;:::i;:::-;6284:63;;6240:117;6396:2;6422:53;6467:7;6458:6;6447:9;6443:22;6422:53;:::i;:::-;6412:63;;6367:118;6552:2;6541:9;6537:18;6524:32;6583:18;6575:6;6572:30;6569:2;;;6615:1;6612;6605:12;6569:2;6643:78;6713:7;6704:6;6693:9;6689:22;6643:78;:::i;:::-;6633:88;;6495:236;6798:2;6787:9;6783:18;6770:32;6829:18;6821:6;6818:30;6815:2;;;6861:1;6858;6851:12;6815:2;6889:78;6959:7;6950:6;6939:9;6935:22;6889:78;:::i;:::-;6879:88;;6741:236;7044:3;7033:9;7029:19;7016:33;7076:18;7068:6;7065:30;7062:2;;;7108:1;7105;7098:12;7062:2;7136:62;7190:7;7181:6;7170:9;7166:22;7136:62;:::i;:::-;7126:72;;6987:221;6167:1048;;;;;;;;:::o;7221:955::-;7325:6;7333;7341;7349;7357;7406:3;7394:9;7385:7;7381:23;7377:33;7374:2;;;7423:1;7420;7413:12;7374:2;7466:1;7491:53;7536:7;7527:6;7516:9;7512:22;7491:53;:::i;:::-;7481:63;;7437:117;7593:2;7619:53;7664:7;7655:6;7644:9;7640:22;7619:53;:::i;:::-;7609:63;;7564:118;7721:2;7747:53;7792:7;7783:6;7772:9;7768:22;7747:53;:::i;:::-;7737:63;;7692:118;7849:2;7875:53;7920:7;7911:6;7900:9;7896:22;7875:53;:::i;:::-;7865:63;;7820:118;8005:3;7994:9;7990:19;7977:33;8037:18;8029:6;8026:30;8023:2;;;8069:1;8066;8059:12;8023:2;8097:62;8151:7;8142:6;8131:9;8127:22;8097:62;:::i;:::-;8087:72;;7948:221;7364:812;;;;;;;;:::o;8182:401::-;8247:6;8255;8304:2;8292:9;8283:7;8279:23;8275:32;8272:2;;;8320:1;8317;8310:12;8272:2;8363:1;8388:53;8433:7;8424:6;8413:9;8409:22;8388:53;:::i;:::-;8378:63;;8334:117;8490:2;8516:50;8558:7;8549:6;8538:9;8534:22;8516:50;:::i;:::-;8506:60;;8461:115;8262:321;;;;;:::o;8589:407::-;8657:6;8665;8714:2;8702:9;8693:7;8689:23;8685:32;8682:2;;;8730:1;8727;8720:12;8682:2;8773:1;8798:53;8843:7;8834:6;8823:9;8819:22;8798:53;:::i;:::-;8788:63;;8744:117;8900:2;8926:53;8971:7;8962:6;8951:9;8947:22;8926:53;:::i;:::-;8916:63;;8871:118;8672:324;;;;;:::o;9002:693::-;9120:6;9128;9177:2;9165:9;9156:7;9152:23;9148:32;9145:2;;;9193:1;9190;9183:12;9145:2;9264:1;9253:9;9249:17;9236:31;9294:18;9286:6;9283:30;9280:2;;;9326:1;9323;9316:12;9280:2;9354:78;9424:7;9415:6;9404:9;9400:22;9354:78;:::i;:::-;9344:88;;9207:235;9509:2;9498:9;9494:18;9481:32;9540:18;9532:6;9529:30;9526:2;;;9572:1;9569;9562:12;9526:2;9600:78;9670:7;9661:6;9650:9;9646:22;9600:78;:::i;:::-;9590:88;;9452:236;9135:560;;;;;:::o;9701:691::-;9801:6;9809;9817;9866:2;9854:9;9845:7;9841:23;9837:32;9834:2;;;9882:1;9879;9872:12;9834:2;9953:1;9942:9;9938:17;9925:31;9983:18;9975:6;9972:30;9969:2;;;10015:1;10012;10005:12;9969:2;10043:76;10111:7;10102:6;10091:9;10087:22;10043:76;:::i;:::-;10033:86;;9896:233;10168:2;10194:53;10239:7;10230:6;10219:9;10215:22;10194:53;:::i;:::-;10184:63;;10139:118;10296:2;10322:53;10367:7;10358:6;10347:9;10343:22;10322:53;:::i;:::-;10312:63;;10267:118;9824:568;;;;;:::o;10398:1059::-;10525:6;10533;10541;10549;10598:3;10586:9;10577:7;10573:23;10569:33;10566:2;;;10615:1;10612;10605:12;10566:2;10686:1;10675:9;10671:17;10658:31;10716:18;10708:6;10705:30;10702:2;;;10748:1;10745;10738:12;10702:2;10776:76;10844:7;10835:6;10824:9;10820:22;10776:76;:::i;:::-;10766:86;;10629:233;10929:2;10918:9;10914:18;10901:32;10960:18;10952:6;10949:30;10946:2;;;10992:1;10989;10982:12;10946:2;11020:62;11074:7;11065:6;11054:9;11050:22;11020:62;:::i;:::-;11010:72;;10872:220;11131:2;11157:53;11202:7;11193:6;11182:9;11178:22;11157:53;:::i;:::-;11147:63;;11102:118;11287:2;11276:9;11272:18;11259:32;11318:18;11310:6;11307:30;11304:2;;;11350:1;11347;11340:12;11304:2;11378:62;11432:7;11423:6;11412:9;11408:22;11378:62;:::i;:::-;11368:72;;11230:220;10556:901;;;;;;;:::o;11463:260::-;11521:6;11570:2;11558:9;11549:7;11545:23;11541:32;11538:2;;;11586:1;11583;11576:12;11538:2;11629:1;11654:52;11698:7;11689:6;11678:9;11674:22;11654:52;:::i;:::-;11644:62;;11600:116;11528:195;;;;:::o;11729:282::-;11798:6;11847:2;11835:9;11826:7;11822:23;11818:32;11815:2;;;11863:1;11860;11853:12;11815:2;11906:1;11931:63;11986:7;11977:6;11966:9;11962:22;11931:63;:::i;:::-;11921:73;;11877:127;11805:206;;;;:::o;12017:375::-;12086:6;12135:2;12123:9;12114:7;12110:23;12106:32;12103:2;;;12151:1;12148;12141:12;12103:2;12222:1;12211:9;12207:17;12194:31;12252:18;12244:6;12241:30;12238:2;;;12284:1;12281;12274:12;12238:2;12312:63;12367:7;12358:6;12347:9;12343:22;12312:63;:::i;:::-;12302:73;;12165:220;12093:299;;;;:::o;12398:262::-;12457:6;12506:2;12494:9;12485:7;12481:23;12477:32;12474:2;;;12522:1;12519;12512:12;12474:2;12565:1;12590:53;12635:7;12626:6;12615:9;12611:22;12590:53;:::i;:::-;12580:63;;12536:117;12464:196;;;;:::o;12666:179::-;12735:10;12756:46;12798:3;12790:6;12756:46;:::i;:::-;12834:4;12829:3;12825:14;12811:28;;12746:99;;;;:::o;12851:175::-;12918:10;12939:44;12979:3;12971:6;12939:44;:::i;:::-;13015:4;13010:3;13006:14;12992:28;;12929:97;;;;:::o;13032:171::-;13097:10;13118:42;13156:3;13148:6;13118:42;:::i;:::-;13192:4;13187:3;13183:14;13169:28;;13108:95;;;;:::o;13209:118::-;13296:24;13314:5;13296:24;:::i;:::-;13291:3;13284:37;13274:53;;:::o;13363:732::-;13482:3;13511:54;13559:5;13511:54;:::i;:::-;13581:86;13660:6;13655:3;13581:86;:::i;:::-;13574:93;;13691:56;13741:5;13691:56;:::i;:::-;13770:7;13801:1;13786:284;13811:6;13808:1;13805:13;13786:284;;;13887:6;13881:13;13914:63;13973:3;13958:13;13914:63;:::i;:::-;13907:70;;14000:60;14053:6;14000:60;:::i;:::-;13990:70;;13846:224;13833:1;13830;13826:9;13821:14;;13786:284;;;13790:14;14086:3;14079:10;;13487:608;;;;;;;:::o;14129:724::-;14246:3;14275:53;14322:5;14275:53;:::i;:::-;14344:85;14422:6;14417:3;14344:85;:::i;:::-;14337:92;;14453:55;14502:5;14453:55;:::i;:::-;14531:7;14562:1;14547:281;14572:6;14569:1;14566:13;14547:281;;;14648:6;14642:13;14675:61;14732:3;14717:13;14675:61;:::i;:::-;14668:68;;14759:59;14811:6;14759:59;:::i;:::-;14749:69;;14607:221;14594:1;14591;14587:9;14582:14;;14547:281;;;14551:14;14844:3;14837:10;;14251:602;;;;;;;:::o;14885:716::-;15000:3;15029:52;15075:5;15029:52;:::i;:::-;15097:84;15174:6;15169:3;15097:84;:::i;:::-;15090:91;;15205:54;15253:5;15205:54;:::i;:::-;15282:7;15313:1;15298:278;15323:6;15320:1;15317:13;15298:278;;;15399:6;15393:13;15426:59;15481:3;15466:13;15426:59;:::i;:::-;15419:66;;15508:58;15559:6;15508:58;:::i;:::-;15498:68;;15358:218;15345:1;15342;15338:9;15333:14;;15298:278;;;15302:14;15592:3;15585:10;;15005:596;;;;;;;:::o;15607:109::-;15688:21;15703:5;15688:21;:::i;:::-;15683:3;15676:34;15666:50;;:::o;15722:118::-;15809:24;15827:5;15809:24;:::i;:::-;15804:3;15797:37;15787:53;;:::o;15846:360::-;15932:3;15960:38;15992:5;15960:38;:::i;:::-;16014:70;16077:6;16072:3;16014:70;:::i;:::-;16007:77;;16093:52;16138:6;16133:3;16126:4;16119:5;16115:16;16093:52;:::i;:::-;16170:29;16192:6;16170:29;:::i;:::-;16165:3;16161:39;16154:46;;15936:270;;;;;:::o;16212:364::-;16300:3;16328:39;16361:5;16328:39;:::i;:::-;16383:71;16447:6;16442:3;16383:71;:::i;:::-;16376:78;;16463:52;16508:6;16503:3;16496:4;16489:5;16485:16;16463:52;:::i;:::-;16540:29;16562:6;16540:29;:::i;:::-;16535:3;16531:39;16524:46;;16304:272;;;;;:::o;16582:366::-;16724:3;16745:67;16809:2;16804:3;16745:67;:::i;:::-;16738:74;;16821:93;16910:3;16821:93;:::i;:::-;16939:2;16934:3;16930:12;16923:19;;16728:220;;;:::o;16954:366::-;17096:3;17117:67;17181:2;17176:3;17117:67;:::i;:::-;17110:74;;17193:93;17282:3;17193:93;:::i;:::-;17311:2;17306:3;17302:12;17295:19;;17100:220;;;:::o;17326:366::-;17468:3;17489:67;17553:2;17548:3;17489:67;:::i;:::-;17482:74;;17565:93;17654:3;17565:93;:::i;:::-;17683:2;17678:3;17674:12;17667:19;;17472:220;;;:::o;17698:366::-;17840:3;17861:67;17925:2;17920:3;17861:67;:::i;:::-;17854:74;;17937:93;18026:3;17937:93;:::i;:::-;18055:2;18050:3;18046:12;18039:19;;17844:220;;;:::o;18070:366::-;18212:3;18233:67;18297:2;18292:3;18233:67;:::i;:::-;18226:74;;18309:93;18398:3;18309:93;:::i;:::-;18427:2;18422:3;18418:12;18411:19;;18216:220;;;:::o;18442:366::-;18584:3;18605:67;18669:2;18664:3;18605:67;:::i;:::-;18598:74;;18681:93;18770:3;18681:93;:::i;:::-;18799:2;18794:3;18790:12;18783:19;;18588:220;;;:::o;18814:366::-;18956:3;18977:67;19041:2;19036:3;18977:67;:::i;:::-;18970:74;;19053:93;19142:3;19053:93;:::i;:::-;19171:2;19166:3;19162:12;19155:19;;18960:220;;;:::o;19186:366::-;19328:3;19349:67;19413:2;19408:3;19349:67;:::i;:::-;19342:74;;19425:93;19514:3;19425:93;:::i;:::-;19543:2;19538:3;19534:12;19527:19;;19332:220;;;:::o;19558:366::-;19700:3;19721:67;19785:2;19780:3;19721:67;:::i;:::-;19714:74;;19797:93;19886:3;19797:93;:::i;:::-;19915:2;19910:3;19906:12;19899:19;;19704:220;;;:::o;19930:366::-;20072:3;20093:67;20157:2;20152:3;20093:67;:::i;:::-;20086:74;;20169:93;20258:3;20169:93;:::i;:::-;20287:2;20282:3;20278:12;20271:19;;20076:220;;;:::o;20302:366::-;20444:3;20465:67;20529:2;20524:3;20465:67;:::i;:::-;20458:74;;20541:93;20630:3;20541:93;:::i;:::-;20659:2;20654:3;20650:12;20643:19;;20448:220;;;:::o;20674:366::-;20816:3;20837:67;20901:2;20896:3;20837:67;:::i;:::-;20830:74;;20913:93;21002:3;20913:93;:::i;:::-;21031:2;21026:3;21022:12;21015:19;;20820:220;;;:::o;21046:366::-;21188:3;21209:67;21273:2;21268:3;21209:67;:::i;:::-;21202:74;;21285:93;21374:3;21285:93;:::i;:::-;21403:2;21398:3;21394:12;21387:19;;21192:220;;;:::o;21418:366::-;21560:3;21581:67;21645:2;21640:3;21581:67;:::i;:::-;21574:74;;21657:93;21746:3;21657:93;:::i;:::-;21775:2;21770:3;21766:12;21759:19;;21564:220;;;:::o;21790:366::-;21932:3;21953:67;22017:2;22012:3;21953:67;:::i;:::-;21946:74;;22029:93;22118:3;22029:93;:::i;:::-;22147:2;22142:3;22138:12;22131:19;;21936:220;;;:::o;22162:366::-;22304:3;22325:67;22389:2;22384:3;22325:67;:::i;:::-;22318:74;;22401:93;22490:3;22401:93;:::i;:::-;22519:2;22514:3;22510:12;22503:19;;22308:220;;;:::o;22534:366::-;22676:3;22697:67;22761:2;22756:3;22697:67;:::i;:::-;22690:74;;22773:93;22862:3;22773:93;:::i;:::-;22891:2;22886:3;22882:12;22875:19;;22680:220;;;:::o;22906:366::-;23048:3;23069:67;23133:2;23128:3;23069:67;:::i;:::-;23062:74;;23145:93;23234:3;23145:93;:::i;:::-;23263:2;23258:3;23254:12;23247:19;;23052:220;;;:::o;23278:366::-;23420:3;23441:67;23505:2;23500:3;23441:67;:::i;:::-;23434:74;;23517:93;23606:3;23517:93;:::i;:::-;23635:2;23630:3;23626:12;23619:19;;23424:220;;;:::o;23650:366::-;23792:3;23813:67;23877:2;23872:3;23813:67;:::i;:::-;23806:74;;23889:93;23978:3;23889:93;:::i;:::-;24007:2;24002:3;23998:12;23991:19;;23796:220;;;:::o;24022:366::-;24164:3;24185:67;24249:2;24244:3;24185:67;:::i;:::-;24178:74;;24261:93;24350:3;24261:93;:::i;:::-;24379:2;24374:3;24370:12;24363:19;;24168:220;;;:::o;24394:366::-;24536:3;24557:67;24621:2;24616:3;24557:67;:::i;:::-;24550:74;;24633:93;24722:3;24633:93;:::i;:::-;24751:2;24746:3;24742:12;24735:19;;24540:220;;;:::o;24766:366::-;24908:3;24929:67;24993:2;24988:3;24929:67;:::i;:::-;24922:74;;25005:93;25094:3;25005:93;:::i;:::-;25123:2;25118:3;25114:12;25107:19;;24912:220;;;:::o;25138:366::-;25280:3;25301:67;25365:2;25360:3;25301:67;:::i;:::-;25294:74;;25377:93;25466:3;25377:93;:::i;:::-;25495:2;25490:3;25486:12;25479:19;;25284:220;;;:::o;25510:366::-;25652:3;25673:67;25737:2;25732:3;25673:67;:::i;:::-;25666:74;;25749:93;25838:3;25749:93;:::i;:::-;25867:2;25862:3;25858:12;25851:19;;25656:220;;;:::o;25882:366::-;26024:3;26045:67;26109:2;26104:3;26045:67;:::i;:::-;26038:74;;26121:93;26210:3;26121:93;:::i;:::-;26239:2;26234:3;26230:12;26223:19;;26028:220;;;:::o;26254:366::-;26396:3;26417:67;26481:2;26476:3;26417:67;:::i;:::-;26410:74;;26493:93;26582:3;26493:93;:::i;:::-;26611:2;26606:3;26602:12;26595:19;;26400:220;;;:::o;26626:108::-;26703:24;26721:5;26703:24;:::i;:::-;26698:3;26691:37;26681:53;;:::o;26740:118::-;26827:24;26845:5;26827:24;:::i;:::-;26822:3;26815:37;26805:53;;:::o;26864:105::-;26939:23;26956:5;26939:23;:::i;:::-;26934:3;26927:36;26917:52;;:::o;26975:102::-;27048:22;27064:5;27048:22;:::i;:::-;27043:3;27036:35;27026:51;;:::o;27083:112::-;27166:22;27182:5;27166:22;:::i;:::-;27161:3;27154:35;27144:51;;:::o;27201:222::-;27294:4;27332:2;27321:9;27317:18;27309:26;;27345:71;27413:1;27402:9;27398:17;27389:6;27345:71;:::i;:::-;27299:124;;;;:::o;27429:1053::-;27752:4;27790:3;27779:9;27775:19;27767:27;;27804:71;27872:1;27861:9;27857:17;27848:6;27804:71;:::i;:::-;27885:72;27953:2;27942:9;27938:18;27929:6;27885:72;:::i;:::-;28004:9;27998:4;27994:20;27989:2;27978:9;27974:18;27967:48;28032:108;28135:4;28126:6;28032:108;:::i;:::-;28024:116;;28187:9;28181:4;28177:20;28172:2;28161:9;28157:18;28150:48;28215:108;28318:4;28309:6;28215:108;:::i;:::-;28207:116;;28371:9;28365:4;28361:20;28355:3;28344:9;28340:19;28333:49;28399:76;28470:4;28461:6;28399:76;:::i;:::-;28391:84;;27757:725;;;;;;;;:::o;28488:751::-;28711:4;28749:3;28738:9;28734:19;28726:27;;28763:71;28831:1;28820:9;28816:17;28807:6;28763:71;:::i;:::-;28844:72;28912:2;28901:9;28897:18;28888:6;28844:72;:::i;:::-;28926;28994:2;28983:9;28979:18;28970:6;28926:72;:::i;:::-;29008;29076:2;29065:9;29061:18;29052:6;29008:72;:::i;:::-;29128:9;29122:4;29118:20;29112:3;29101:9;29097:19;29090:49;29156:76;29227:4;29218:6;29156:76;:::i;:::-;29148:84;;28716:523;;;;;;;;:::o;29245:373::-;29388:4;29426:2;29415:9;29411:18;29403:26;;29475:9;29469:4;29465:20;29461:1;29450:9;29446:17;29439:47;29503:108;29606:4;29597:6;29503:108;:::i;:::-;29495:116;;29393:225;;;;:::o;29624:634::-;29845:4;29883:2;29872:9;29868:18;29860:26;;29932:9;29926:4;29922:20;29918:1;29907:9;29903:17;29896:47;29960:108;30063:4;30054:6;29960:108;:::i;:::-;29952:116;;30115:9;30109:4;30105:20;30100:2;30089:9;30085:18;30078:48;30143:108;30246:4;30237:6;30143:108;:::i;:::-;30135:116;;29850:408;;;;;:::o;30264:369::-;30405:4;30443:2;30432:9;30428:18;30420:26;;30492:9;30486:4;30482:20;30478:1;30467:9;30463:17;30456:47;30520:106;30621:4;30612:6;30520:106;:::i;:::-;30512:114;;30410:223;;;;:::o;30639:696::-;30862:4;30900:3;30889:9;30885:19;30877:27;;30950:9;30944:4;30940:20;30936:1;30925:9;30921:17;30914:47;30978:104;31077:4;31068:6;30978:104;:::i;:::-;30970:112;;31092:72;31160:2;31149:9;31145:18;31136:6;31092:72;:::i;:::-;31174;31242:2;31231:9;31227:18;31218:6;31174:72;:::i;:::-;31256;31324:2;31313:9;31309:18;31300:6;31256:72;:::i;:::-;30867:468;;;;;;;:::o;31341:210::-;31428:4;31466:2;31455:9;31451:18;31443:26;;31479:65;31541:1;31530:9;31526:17;31517:6;31479:65;:::i;:::-;31433:118;;;;:::o;31557:545::-;31730:4;31768:3;31757:9;31753:19;31745:27;;31782:71;31850:1;31839:9;31835:17;31826:6;31782:71;:::i;:::-;31863:68;31927:2;31916:9;31912:18;31903:6;31863:68;:::i;:::-;31941:72;32009:2;31998:9;31994:18;31985:6;31941:72;:::i;:::-;32023;32091:2;32080:9;32076:18;32067:6;32023:72;:::i;:::-;31735:367;;;;;;;:::o;32108:313::-;32221:4;32259:2;32248:9;32244:18;32236:26;;32308:9;32302:4;32298:20;32294:1;32283:9;32279:17;32272:47;32336:78;32409:4;32400:6;32336:78;:::i;:::-;32328:86;;32226:195;;;;:::o;32427:419::-;32593:4;32631:2;32620:9;32616:18;32608:26;;32680:9;32674:4;32670:20;32666:1;32655:9;32651:17;32644:47;32708:131;32834:4;32708:131;:::i;:::-;32700:139;;32598:248;;;:::o;32852:419::-;33018:4;33056:2;33045:9;33041:18;33033:26;;33105:9;33099:4;33095:20;33091:1;33080:9;33076:17;33069:47;33133:131;33259:4;33133:131;:::i;:::-;33125:139;;33023:248;;;:::o;33277:419::-;33443:4;33481:2;33470:9;33466:18;33458:26;;33530:9;33524:4;33520:20;33516:1;33505:9;33501:17;33494:47;33558:131;33684:4;33558:131;:::i;:::-;33550:139;;33448:248;;;:::o;33702:419::-;33868:4;33906:2;33895:9;33891:18;33883:26;;33955:9;33949:4;33945:20;33941:1;33930:9;33926:17;33919:47;33983:131;34109:4;33983:131;:::i;:::-;33975:139;;33873:248;;;:::o;34127:419::-;34293:4;34331:2;34320:9;34316:18;34308:26;;34380:9;34374:4;34370:20;34366:1;34355:9;34351:17;34344:47;34408:131;34534:4;34408:131;:::i;:::-;34400:139;;34298:248;;;:::o;34552:419::-;34718:4;34756:2;34745:9;34741:18;34733:26;;34805:9;34799:4;34795:20;34791:1;34780:9;34776:17;34769:47;34833:131;34959:4;34833:131;:::i;:::-;34825:139;;34723:248;;;:::o;34977:419::-;35143:4;35181:2;35170:9;35166:18;35158:26;;35230:9;35224:4;35220:20;35216:1;35205:9;35201:17;35194:47;35258:131;35384:4;35258:131;:::i;:::-;35250:139;;35148:248;;;:::o;35402:419::-;35568:4;35606:2;35595:9;35591:18;35583:26;;35655:9;35649:4;35645:20;35641:1;35630:9;35626:17;35619:47;35683:131;35809:4;35683:131;:::i;:::-;35675:139;;35573:248;;;:::o;35827:419::-;35993:4;36031:2;36020:9;36016:18;36008:26;;36080:9;36074:4;36070:20;36066:1;36055:9;36051:17;36044:47;36108:131;36234:4;36108:131;:::i;:::-;36100:139;;35998:248;;;:::o;36252:419::-;36418:4;36456:2;36445:9;36441:18;36433:26;;36505:9;36499:4;36495:20;36491:1;36480:9;36476:17;36469:47;36533:131;36659:4;36533:131;:::i;:::-;36525:139;;36423:248;;;:::o;36677:419::-;36843:4;36881:2;36870:9;36866:18;36858:26;;36930:9;36924:4;36920:20;36916:1;36905:9;36901:17;36894:47;36958:131;37084:4;36958:131;:::i;:::-;36950:139;;36848:248;;;:::o;37102:419::-;37268:4;37306:2;37295:9;37291:18;37283:26;;37355:9;37349:4;37345:20;37341:1;37330:9;37326:17;37319:47;37383:131;37509:4;37383:131;:::i;:::-;37375:139;;37273:248;;;:::o;37527:419::-;37693:4;37731:2;37720:9;37716:18;37708:26;;37780:9;37774:4;37770:20;37766:1;37755:9;37751:17;37744:47;37808:131;37934:4;37808:131;:::i;:::-;37800:139;;37698:248;;;:::o;37952:419::-;38118:4;38156:2;38145:9;38141:18;38133:26;;38205:9;38199:4;38195:20;38191:1;38180:9;38176:17;38169:47;38233:131;38359:4;38233:131;:::i;:::-;38225:139;;38123:248;;;:::o;38377:419::-;38543:4;38581:2;38570:9;38566:18;38558:26;;38630:9;38624:4;38620:20;38616:1;38605:9;38601:17;38594:47;38658:131;38784:4;38658:131;:::i;:::-;38650:139;;38548:248;;;:::o;38802:419::-;38968:4;39006:2;38995:9;38991:18;38983:26;;39055:9;39049:4;39045:20;39041:1;39030:9;39026:17;39019:47;39083:131;39209:4;39083:131;:::i;:::-;39075:139;;38973:248;;;:::o;39227:419::-;39393:4;39431:2;39420:9;39416:18;39408:26;;39480:9;39474:4;39470:20;39466:1;39455:9;39451:17;39444:47;39508:131;39634:4;39508:131;:::i;:::-;39500:139;;39398:248;;;:::o;39652:419::-;39818:4;39856:2;39845:9;39841:18;39833:26;;39905:9;39899:4;39895:20;39891:1;39880:9;39876:17;39869:47;39933:131;40059:4;39933:131;:::i;:::-;39925:139;;39823:248;;;:::o;40077:419::-;40243:4;40281:2;40270:9;40266:18;40258:26;;40330:9;40324:4;40320:20;40316:1;40305:9;40301:17;40294:47;40358:131;40484:4;40358:131;:::i;:::-;40350:139;;40248:248;;;:::o;40502:419::-;40668:4;40706:2;40695:9;40691:18;40683:26;;40755:9;40749:4;40745:20;40741:1;40730:9;40726:17;40719:47;40783:131;40909:4;40783:131;:::i;:::-;40775:139;;40673:248;;;:::o;40927:419::-;41093:4;41131:2;41120:9;41116:18;41108:26;;41180:9;41174:4;41170:20;41166:1;41155:9;41151:17;41144:47;41208:131;41334:4;41208:131;:::i;:::-;41200:139;;41098:248;;;:::o;41352:419::-;41518:4;41556:2;41545:9;41541:18;41533:26;;41605:9;41599:4;41595:20;41591:1;41580:9;41576:17;41569:47;41633:131;41759:4;41633:131;:::i;:::-;41625:139;;41523:248;;;:::o;41777:419::-;41943:4;41981:2;41970:9;41966:18;41958:26;;42030:9;42024:4;42020:20;42016:1;42005:9;42001:17;41994:47;42058:131;42184:4;42058:131;:::i;:::-;42050:139;;41948:248;;;:::o;42202:419::-;42368:4;42406:2;42395:9;42391:18;42383:26;;42455:9;42449:4;42445:20;42441:1;42430:9;42426:17;42419:47;42483:131;42609:4;42483:131;:::i;:::-;42475:139;;42373:248;;;:::o;42627:419::-;42793:4;42831:2;42820:9;42816:18;42808:26;;42880:9;42874:4;42870:20;42866:1;42855:9;42851:17;42844:47;42908:131;43034:4;42908:131;:::i;:::-;42900:139;;42798:248;;;:::o;43052:419::-;43218:4;43256:2;43245:9;43241:18;43233:26;;43305:9;43299:4;43295:20;43291:1;43280:9;43276:17;43269:47;43333:131;43459:4;43333:131;:::i;:::-;43325:139;;43223:248;;;:::o;43477:419::-;43643:4;43681:2;43670:9;43666:18;43658:26;;43730:9;43724:4;43720:20;43716:1;43705:9;43701:17;43694:47;43758:131;43884:4;43758:131;:::i;:::-;43750:139;;43648:248;;;:::o;43902:222::-;43995:4;44033:2;44022:9;44018:18;44010:26;;44046:71;44114:1;44103:9;44099:17;44090:6;44046:71;:::i;:::-;44000:124;;;;:::o;44130:332::-;44251:4;44289:2;44278:9;44274:18;44266:26;;44302:71;44370:1;44359:9;44355:17;44346:6;44302:71;:::i;:::-;44383:72;44451:2;44440:9;44436:18;44427:6;44383:72;:::i;:::-;44256:206;;;;;:::o;44468:129::-;44502:6;44529:20;;:::i;:::-;44519:30;;44558:33;44586:4;44578:6;44558:33;:::i;:::-;44509:88;;;:::o;44603:75::-;44636:6;44669:2;44663:9;44653:19;;44643:35;:::o;44684:311::-;44761:4;44851:18;44843:6;44840:30;44837:2;;;44873:18;;:::i;:::-;44837:2;44923:4;44915:6;44911:17;44903:25;;44983:4;44977;44973:15;44965:23;;44766:229;;;:::o;45001:311::-;45078:4;45168:18;45160:6;45157:30;45154:2;;;45190:18;;:::i;:::-;45154:2;45240:4;45232:6;45228:17;45220:25;;45300:4;45294;45290:15;45282:23;;45083:229;;;:::o;45318:309::-;45393:4;45483:18;45475:6;45472:30;45469:2;;;45505:18;;:::i;:::-;45469:2;45555:4;45547:6;45543:17;45535:25;;45615:4;45609;45605:15;45597:23;;45398:229;;;:::o;45633:307::-;45694:4;45784:18;45776:6;45773:30;45770:2;;;45806:18;;:::i;:::-;45770:2;45844:29;45866:6;45844:29;:::i;:::-;45836:37;;45928:4;45922;45918:15;45910:23;;45699:241;;;:::o;45946:308::-;46008:4;46098:18;46090:6;46087:30;46084:2;;;46120:18;;:::i;:::-;46084:2;46158:29;46180:6;46158:29;:::i;:::-;46150:37;;46242:4;46236;46232:15;46224:23;;46013:241;;;:::o;46260:132::-;46327:4;46350:3;46342:11;;46380:4;46375:3;46371:14;46363:22;;46332:60;;;:::o;46398:131::-;46464:4;46487:3;46479:11;;46517:4;46512:3;46508:14;46500:22;;46469:60;;;:::o;46535:130::-;46600:4;46623:3;46615:11;;46653:4;46648:3;46644:14;46636:22;;46605:60;;;:::o;46671:114::-;46738:6;46772:5;46766:12;46756:22;;46745:40;;;:::o;46791:113::-;46857:6;46891:5;46885:12;46875:22;;46864:40;;;:::o;46910:112::-;46975:6;47009:5;47003:12;46993:22;;46982:40;;;:::o;47028:98::-;47079:6;47113:5;47107:12;47097:22;;47086:40;;;:::o;47132:99::-;47184:6;47218:5;47212:12;47202:22;;47191:40;;;:::o;47237:113::-;47307:4;47339;47334:3;47330:14;47322:22;;47312:38;;;:::o;47356:112::-;47425:4;47457;47452:3;47448:14;47440:22;;47430:38;;;:::o;47474:111::-;47542:4;47574;47569:3;47565:14;47557:22;;47547:38;;;:::o;47591:184::-;47690:11;47724:6;47719:3;47712:19;47764:4;47759:3;47755:14;47740:29;;47702:73;;;;:::o;47781:183::-;47879:11;47913:6;47908:3;47901:19;47953:4;47948:3;47944:14;47929:29;;47891:73;;;;:::o;47970:182::-;48067:11;48101:6;48096:3;48089:19;48141:4;48136:3;48132:14;48117:29;;48079:73;;;;:::o;48158:168::-;48241:11;48275:6;48270:3;48263:19;48315:4;48310:3;48306:14;48291:29;;48253:73;;;;:::o;48332:169::-;48416:11;48450:6;48445:3;48438:19;48490:4;48485:3;48481:14;48466:29;;48428:73;;;;:::o;48507:305::-;48547:3;48566:20;48584:1;48566:20;:::i;:::-;48561:25;;48600:20;48618:1;48600:20;:::i;:::-;48595:25;;48754:1;48686:66;48682:74;48679:1;48676:81;48673:2;;;48760:18;;:::i;:::-;48673:2;48804:1;48801;48797:9;48790:16;;48551:261;;;;:::o;48818:254::-;48857:3;48876:19;48893:1;48876:19;:::i;:::-;48871:24;;48909:19;48926:1;48909:19;:::i;:::-;48904:24;;49014:1;48994:18;48990:26;48987:1;48984:33;48981:2;;;49020:18;;:::i;:::-;48981:2;49064:1;49061;49057:9;49050:16;;48861:211;;;;:::o;49078:348::-;49118:7;49141:20;49159:1;49141:20;:::i;:::-;49136:25;;49175:20;49193:1;49175:20;:::i;:::-;49170:25;;49363:1;49295:66;49291:74;49288:1;49285:81;49280:1;49273:9;49266:17;49262:105;49259:2;;;49370:18;;:::i;:::-;49259:2;49418:1;49415;49411:9;49400:20;;49126:300;;;;:::o;49432:185::-;49470:4;49490:18;49506:1;49490:18;:::i;:::-;49485:23;;49522:18;49538:1;49522:18;:::i;:::-;49517:23;;49559:1;49556;49553:8;49550:2;;;49564:18;;:::i;:::-;49550:2;49609:1;49606;49602:9;49594:17;;49475:142;;;;:::o;49623:96::-;49660:7;49689:24;49707:5;49689:24;:::i;:::-;49678:35;;49668:51;;;:::o;49725:90::-;49759:7;49802:5;49795:13;49788:21;49777:32;;49767:48;;;:::o;49821:77::-;49858:7;49887:5;49876:16;;49866:32;;;:::o;49904:149::-;49940:7;49980:66;49973:5;49969:78;49958:89;;49948:105;;;:::o;50059:126::-;50096:7;50136:42;50129:5;50125:54;50114:65;;50104:81;;;:::o;50191:77::-;50228:7;50257:5;50246:16;;50236:32;;;:::o;50274:101::-;50310:7;50350:18;50343:5;50339:30;50328:41;;50318:57;;;:::o;50381:86::-;50416:7;50456:4;50449:5;50445:16;50434:27;;50424:43;;;:::o;50473:154::-;50557:6;50552:3;50547;50534:30;50619:1;50610:6;50605:3;50601:16;50594:27;50524:103;;;:::o;50633:307::-;50701:1;50711:113;50725:6;50722:1;50719:13;50711:113;;;50810:1;50805:3;50801:11;50795:18;50791:1;50786:3;50782:11;50775:39;50747:2;50744:1;50740:10;50735:15;;50711:113;;;50842:6;50839:1;50836:13;50833:2;;;50922:1;50913:6;50908:3;50904:16;50897:27;50833:2;50682:258;;;;:::o;50946:171::-;50985:3;51008:24;51026:5;51008:24;:::i;:::-;50999:33;;51054:4;51047:5;51044:15;51041:2;;;51062:18;;:::i;:::-;51041:2;51109:1;51102:5;51098:13;51091:20;;50989:128;;;:::o;51123:320::-;51167:6;51204:1;51198:4;51194:12;51184:22;;51251:1;51245:4;51241:12;51272:18;51262:2;;51328:4;51320:6;51316:17;51306:27;;51262:2;51390;51382:6;51379:14;51359:18;51356:38;51353:2;;;51409:18;;:::i;:::-;51353:2;51174:269;;;;:::o;51449:281::-;51532:27;51554:4;51532:27;:::i;:::-;51524:6;51520:40;51662:6;51650:10;51647:22;51626:18;51614:10;51611:34;51608:62;51605:2;;;51673:18;;:::i;:::-;51605:2;51713:10;51709:2;51702:22;51492:238;;;:::o;51736:233::-;51775:3;51798:24;51816:5;51798:24;:::i;:::-;51789:33;;51844:66;51837:5;51834:77;51831:2;;;51914:18;;:::i;:::-;51831:2;51961:1;51954:5;51950:13;51943:20;;51779:190;;;:::o;51975:167::-;52012:3;52035:22;52051:5;52035:22;:::i;:::-;52026:31;;52079:4;52072:5;52069:15;52066:2;;;52087:18;;:::i;:::-;52066:2;52134:1;52127:5;52123:13;52116:20;;52016:126;;;:::o;52148:180::-;52196:77;52193:1;52186:88;52293:4;52290:1;52283:15;52317:4;52314:1;52307:15;52334:180;52382:77;52379:1;52372:88;52479:4;52476:1;52469:15;52503:4;52500:1;52493:15;52520:180;52568:77;52565:1;52558:88;52665:4;52662:1;52655:15;52689:4;52686:1;52679:15;52706:183;52741:3;52779:1;52761:16;52758:23;52755:2;;;52817:1;52814;52811;52796:23;52839:34;52870:1;52864:8;52839:34;:::i;:::-;52832:41;;52755:2;52745:144;:::o;52895:102::-;52936:6;52987:2;52983:7;52978:2;52971:5;52967:14;52963:28;52953:38;;52943:54;;;:::o;53003:106::-;53047:8;53096:5;53091:3;53087:15;53066:36;;53056:53;;;:::o;53115:174::-;53255:26;53251:1;53243:6;53239:14;53232:50;53221:68;:::o;53295:239::-;53435:34;53431:1;53423:6;53419:14;53412:58;53504:22;53499:2;53491:6;53487:15;53480:47;53401:133;:::o;53540:182::-;53680:34;53676:1;53668:6;53664:14;53657:58;53646:76;:::o;53728:227::-;53868:34;53864:1;53856:6;53852:14;53845:58;53937:10;53932:2;53924:6;53920:15;53913:35;53834:121;:::o;53961:181::-;54101:33;54097:1;54089:6;54085:14;54078:57;54067:75;:::o;54148:230::-;54288:34;54284:1;54276:6;54272:14;54265:58;54357:13;54352:2;54344:6;54340:15;54333:38;54254:124;:::o;54384:225::-;54524:34;54520:1;54512:6;54508:14;54501:58;54593:8;54588:2;54580:6;54576:15;54569:33;54490:119;:::o;54615:228::-;54755:34;54751:1;54743:6;54739:14;54732:58;54824:11;54819:2;54811:6;54807:15;54800:36;54721:122;:::o;54849:164::-;54989:16;54985:1;54977:6;54973:14;54966:40;54955:58;:::o;55019:176::-;55159:28;55155:1;55147:6;55143:14;55136:52;55125:70;:::o;55201:221::-;55341:34;55337:1;55329:6;55325:14;55318:58;55410:4;55405:2;55397:6;55393:15;55386:29;55307:115;:::o;55428:224::-;55568:34;55564:1;55556:6;55552:14;55545:58;55637:7;55632:2;55624:6;55620:15;55613:32;55534:118;:::o;55658:237::-;55798:34;55794:1;55786:6;55782:14;55775:58;55867:20;55862:2;55854:6;55850:15;55843:45;55764:131;:::o;55901:221::-;56041:34;56037:1;56029:6;56025:14;56018:58;56110:4;56105:2;56097:6;56093:15;56086:29;56007:115;:::o;56128:163::-;56268:15;56264:1;56256:6;56252:14;56245:39;56234:57;:::o;56297:171::-;56437:23;56433:1;56425:6;56421:14;56414:47;56403:65;:::o;56474:229::-;56614:34;56610:1;56602:6;56598:14;56591:58;56683:12;56678:2;56670:6;56666:15;56659:37;56580:123;:::o;56709:182::-;56849:34;56845:1;56837:6;56833:14;56826:58;56815:76;:::o;56897:173::-;57037:25;57033:1;57025:6;57021:14;57014:49;57003:67;:::o;57076:176::-;57216:28;57212:1;57204:6;57200:14;57193:52;57182:70;:::o;57258:170::-;57398:22;57394:1;57386:6;57382:14;57375:46;57364:64;:::o;57434:181::-;57574:33;57570:1;57562:6;57558:14;57551:57;57540:75;:::o;57621:228::-;57761:34;57757:1;57749:6;57745:14;57738:58;57830:11;57825:2;57817:6;57813:15;57806:36;57727:122;:::o;57855:228::-;57995:34;57991:1;57983:6;57979:14;57972:58;58064:11;58059:2;58051:6;58047:15;58040:36;57961:122;:::o;58089:227::-;58229:34;58225:1;58217:6;58213:14;58206:58;58298:10;58293:2;58285:6;58281:15;58274:35;58195:121;:::o;58322:220::-;58462:34;58458:1;58450:6;58446:14;58439:58;58531:3;58526:2;58518:6;58514:15;58507:28;58428:114;:::o;58548:181::-;58688:33;58684:1;58676:6;58672:14;58665:57;58654:75;:::o;58735:711::-;58774:3;58812:4;58794:16;58791:26;58788:2;;;58820:5;;58788:2;58849:20;;:::i;:::-;58924:1;58906:16;58902:24;58899:1;58893:4;58878:49;58957:4;58951:11;59056:16;59049:4;59041:6;59037:17;59034:39;59001:18;58993:6;58990:30;58974:113;58971:2;;;59102:5;;;;58971:2;59148:6;59142:4;59138:17;59184:3;59178:10;59211:18;59203:6;59200:30;59197:2;;;59233:5;;;;;;59197:2;59281:6;59274:4;59269:3;59265:14;59261:27;59340:1;59322:16;59318:24;59312:4;59308:35;59303:3;59300:44;59297:2;;;59347:5;;;;;;;59297:2;59364:57;59412:6;59406:4;59402:17;59394:6;59390:30;59384:4;59364:57;:::i;:::-;59437:3;59430:10;;58778:668;;;;;;;:::o;59452:122::-;59525:24;59543:5;59525:24;:::i;:::-;59518:5;59515:35;59505:2;;59564:1;59561;59554:12;59505:2;59495:79;:::o;59580:116::-;59650:21;59665:5;59650:21;:::i;:::-;59643:5;59640:32;59630:2;;59686:1;59683;59676:12;59630:2;59620:76;:::o;59702:122::-;59775:24;59793:5;59775:24;:::i;:::-;59768:5;59765:35;59755:2;;59814:1;59811;59804:12;59755:2;59745:79;:::o;59830:120::-;59902:23;59919:5;59902:23;:::i;:::-;59895:5;59892:34;59882:2;;59940:1;59937;59930:12;59882:2;59872:78;:::o;59956:122::-;60029:24;60047:5;60029:24;:::i;:::-;60022:5;60019:35;60009:2;;60068:1;60065;60058:12;60009:2;59999:79;:::o;60084:118::-;60155:22;60171:5;60155:22;:::i;:::-;60148:5;60145:33;60135:2;;60192:1;60189;60182:12;60135:2;60125:77;:::o

Swarm Source

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