ETH Price: $3,603.32 (+9.15%)

Token

House of Warlords (HOWL)
 

Overview

Max Total Supply

0 HOWL

Holders

872

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
huustle.eth
Balance
5 HOWL
0x3A224cF56e1E5382234972ba6A02E197a0Fe302B
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

500+ Warlords burned to date. 600+ Warlords staked. Tattoo-inspired Urban Samurais. Trait transfer composability tech. High utility token to purchase traits and limited edition art.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Howl

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// File: @openzeppelin/contracts/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 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/utils/Counters.sol



pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

// File: @openzeppelin/contracts/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/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/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() {
        _setOwner(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _setOwner(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

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



pragma solidity ^0.8.0;

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

        uint256 size;
        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/token/ERC721/IERC721Receiver.sol



pragma solidity ^0.8.0;

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

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



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/utils/introspection/ERC165.sol



pragma solidity ^0.8.0;


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

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



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

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

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

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



pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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



pragma solidity ^0.8.0;



/**
 * @title ERC721 Burnable Token
 * @dev ERC721 Token that can be irreversibly burned (destroyed).
 */
abstract contract ERC721Burnable is Context, ERC721 {
    /**
     * @dev Burns `tokenId`. See {ERC721-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) public virtual {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved");
        _burn(tokenId);
    }
}

// File: contracts/Howl.sol


pragma solidity ^0.8.2;





interface ISoul {
    function mint(address _address, uint256 _amount) external;

    function collectAndBurn(address _address, uint256 _amount) external;
}

contract Howl is ERC721Burnable, Ownable {
    using ECDSA for bytes32;
    using Counters for Counters.Counter;

    constructor() ERC721("House of Warlords", "HOWL") Ownable() {
        genesisTokenIdCounter._value = 888; // accounting for giveaways and reserve
        genesisReserveTokenIdCounter._value = 8; // accounting for legendaries
    }

    struct Warlord {
        uint16 face; // 0
        uint16 headGear; // 1
        uint16 clothes; // 2
        uint16 shoulderGuard; // 3
        uint16 armGuards; // 4
        uint16 sideWeapon; // 5
        uint16 backWeapon; // 6
        uint16 background; // 7
        uint16 killCount; // 8
    }

    event Seppuku(
        address indexed _address,
        uint256 indexed _generation,
        uint256 _tokenId1,
        uint256 _tokenId2
    );

    event Resurrection(
        uint256 indexed _tokenId,
        address indexed _address,
        uint256 indexed _generation
    );

    event VoucherUsed(
        address indexed _address,
        uint256 indexed _nonce,
        uint256 _claimQty
    );

    event StartConquest(uint256 indexed _tokenId, uint256 _startDate);
    event EndConquest(uint256 indexed _tokenId, uint256 _reward);
    event NameChange(uint256 indexed _tokenId, string _name);

    Counters.Counter public generationCounter;
    Counters.Counter public genesisTokenIdCounter;
    Counters.Counter public genesisReserveTokenIdCounter;

    uint256 public constant GENESIS_MAX_SUPPLY = 8888;
    uint256 public constant RESERVE_QTY = 888;
    uint256 public SALE_MINT_PRICE = 0.069 ether;
    bool public IS_SALE_ON;
    bool public IS_SEPPUKU_ON;
    bool public IS_STAKING_ON;

    uint256[3] private _stakingRewards = [250, 600, 1000];
    uint256[3] private _stakingPeriods = [30, 60, 90];

    uint256 public seppukuBaseFee = 1000;
    uint256 public seppukuMultiplierFee = 500;

    bool public canSummonLegendaries = true;

    string public preRevealUrl;
    string public apiUrl;
    address public signer;
    address public soulContractAddress;

    // When warlords are minted for the first time this contract generates a random looking DNA mapped to a tokenID.
    // The actual uint16 properties of the warlord are later derived by decoding it with the
    // information that's inside of the generationRanges and generationRarities mappings.
    // Each generation of warlords will have its own set of rarities and property ranges
    // with a provenance hash uploaded ahead of time.
    // It gurantees that the actual property distribution is hidden during the pre-reveal phase since decoding depends on
    // the unknown information.
    // Property ranges are stored inside of a uint16[4] array per each property.
    // These 4 numbers are interpreted as buckets of traits. Traits are just sequential numbers.
    // For example [1, 100, 200, 300] value inside of generationRanges for the face property will be interpreted as:
    // - Common: 1-99
    // - Uncommon: 100-199
    // - Rare: 200 - 299
    //
    // The last two pieces of data are located inside of generationRarities mapping which holds uint16[2] arrays of rarities.
    // For example, if our rarities were defined as [80, 15], combined with buckets from above they will result in:
    // - Common: 1-99 [80% chance]
    // - Uncommon: 100-199 [15% chance]
    // - Rare: 200 - 299 [5% chance]
    //
    // This framework helps us to keep our trait generation random and hidden while still allowing for
    // clearly defined rarity categories.
    mapping(uint256 => mapping(uint256 => uint16[4])) public generationRanges;
    mapping(uint256 => uint16[2]) public generationRarities;
    mapping(uint256 => uint256) public generationProvenance;
    mapping(uint256 => bool) public isGenerationRevealed;
    mapping(uint256 => uint256) public generationSeed;
    mapping(uint256 => uint256) public generationResurrectionChance;
    mapping(address => mapping(uint256 => uint256)) public resurrectionTickets;
    mapping(uint256 => uint256) private _tokenIdToWarlord;
    mapping(uint256 => uint256) public conquests;
    mapping(uint256 => uint256) private _voucherToMinted;
    mapping(uint256 => string) public tokenIdToWarlordName;
    mapping(string => bool) public namesTaken;

    // This mapping is going to be used to connect our howl store implementation and potential future
    // mechanics that will enhance this collection.
    mapping(address => bool) public authorizedToEquip;
    // Kill switch for the mapping above, if community decides that it's too dangerous to have this
    // list extendable we can prevent it from being modified.
    bool public isAuthorizedToEquipLocked;

    mapping(address => bool) public admins;

    function _isTokenOwner(uint256 _tokenId) private view {
        require(
            ownerOf(_tokenId) == msg.sender,
            "HOWL: you don't own this token"
        );
    }

    function _isOwnerOrAdmin() private view {
        require(
            owner() == msg.sender || admins[msg.sender],
            "HOWL: unauthorized"
        );
    }

    modifier onlyOwnerOrAdmin() {
        _isOwnerOrAdmin();
        _;
    }

    modifier onlyTokenOwner(uint256 _tokenId) {
        _isTokenOwner(_tokenId);
        _;
    }

    modifier onlyAuthorizedToEquip() {
        require(authorizedToEquip[msg.sender], "HOWL: unauthorized");
        _;
    }

    function withdraw() external onlyOwner {
        payable(owner()).transfer(address(this).balance);
    }

    function setAuthorizedToEquip(address _address, bool _isAuthorized)
        external
        onlyOwner
    {
        require(!isAuthorizedToEquipLocked);
        authorizedToEquip[_address] = _isAuthorized;
    }

    function lockAuthorizedToEquip() external onlyOwner {
        isAuthorizedToEquipLocked = true;
    }

    function setAdmin(address _address, bool _hasAccess) external onlyOwner {
        admins[_address] = _hasAccess;
    }

    function setSaleMintPrice(uint256 _mintPrice) external onlyOwner {
        SALE_MINT_PRICE = _mintPrice;
    }

    function setSigner(address _signer) external onlyOwner {
        signer = _signer;
    }

    function setApiUrl(string calldata _apiUrl) external onlyOwner {
        apiUrl = _apiUrl;
    }

    function setPreRevealUrl(string calldata _preRevealUrl) external onlyOwner {
        preRevealUrl = _preRevealUrl;
    }

    function setSoulContractAddress(address _address) external onlyOwner {
        soulContractAddress = _address;
    }

    function setIsSaleOn(bool _isSaleOn) external onlyOwnerOrAdmin {
        IS_SALE_ON = _isSaleOn;
    }

    function setIsSeppukuOn(bool _isSeppukuOn) external onlyOwnerOrAdmin {
        IS_SEPPUKU_ON = _isSeppukuOn;
    }

    function setSeppukuBaseAndMultiplierFee(
        uint256 _baseFee,
        uint256 _multiplierFee
    ) external onlyOwnerOrAdmin {
        seppukuBaseFee = _baseFee;
        seppukuMultiplierFee = _multiplierFee;
    }

    function setStakingRewardsAndPeriods(
        uint256[3] calldata _rewards,
        uint256[3] calldata _periods
    ) external onlyOwnerOrAdmin {
        _stakingRewards = _rewards;
        _stakingPeriods = _periods;
    }

    function getStakingRewardsAndPeriods()
        external
        view
        returns (uint256[3][2] memory)
    {
        return [
            [_stakingRewards[0], _stakingRewards[1], _stakingRewards[2]],
            [_stakingPeriods[0], _stakingPeriods[1], _stakingPeriods[2]]
        ];
    }

    function setIsStakingOn(bool _isStakingOn) external onlyOwnerOrAdmin {
        IS_STAKING_ON = _isStakingOn;
    }

    function setIsGenerationRevealed(uint256 _gen, bool _isGenerationRevealed)
        external
        onlyOwnerOrAdmin
    {
        require(!isGenerationRevealed[_gen]);
        isGenerationRevealed[_gen] = _isGenerationRevealed;
    }

    function setGenerationRanges(
        uint256 _gen,
        uint16[4] calldata _face,
        uint16[4] calldata _headGear,
        uint16[4] calldata _clothes,
        uint16[4] calldata _shoulderGuard,
        uint16[4] calldata _armGuards,
        uint16[4] calldata _sideWeapon,
        uint16[4] calldata _backWeapon,
        uint16[4] calldata _background
    ) external onlyOwnerOrAdmin {
        require(!isGenerationRevealed[_gen]);

        generationRanges[_gen][0] = _face;
        generationRanges[_gen][1] = _headGear;
        generationRanges[_gen][2] = _clothes;
        generationRanges[_gen][3] = _shoulderGuard;
        generationRanges[_gen][4] = _armGuards;
        generationRanges[_gen][5] = _sideWeapon;
        generationRanges[_gen][6] = _backWeapon;
        generationRanges[_gen][7] = _background;
    }

    function setGenerationRarities(
        uint256 _gen,
        uint16 _common,
        uint16 _uncommon
    ) external onlyOwnerOrAdmin {
        require(!isGenerationRevealed[_gen]);
        // rare is derived by 100% - common + uncommon
        // so in the case of [80,15] - rare will be 5%
        require(_common > _uncommon);
        generationRarities[_gen] = [_common, _uncommon];
    }

    function setGenerationProvenance(uint256 _provenance, uint256 _gen)
        external
        onlyOwnerOrAdmin
    {
        require(generationProvenance[_gen] == 0);
        generationProvenance[_gen] = _provenance;
    }

    function startNextGenerationResurrection(uint256 _resurrectionChance)
        external
        onlyOwnerOrAdmin
    {
        require(!IS_SEPPUKU_ON);
        generationCounter.increment();
        uint256 gen = generationCounter.current();
        generationSeed[gen] = _getSeed();
        generationResurrectionChance[gen] = _resurrectionChance;
    }

    function mintReserve(address _address, uint256 _claimQty)
        external
        onlyOwner
    {
        require(
            genesisReserveTokenIdCounter.current() + _claimQty <= RESERVE_QTY
        );

        for (uint256 i = 0; i < _claimQty; i++) {
            genesisReserveTokenIdCounter.increment();
            _mintWarlord(_address, genesisReserveTokenIdCounter.current(), 0);
        }
    }

    function summonLegendaries(address _address) external onlyOwner {
        require(canSummonLegendaries);
        // make sure that this action cannot be performed again
        // in theory all 10 legendaries can be burned
        canSummonLegendaries = false;

        uint256 traitBase = 10000;
        for (uint256 i = 1; i < 9; i++) {
            // first 4 are zen, second 4 are aku
            _tokenIdToWarlord[i] = _generateDecodedDna(
                Warlord(
                    uint16(traitBase + i), // produces traits that look like 10001 - 10002 - ...etc.
                    uint16(traitBase + i),
                    uint16(traitBase + i),
                    uint16(traitBase + i),
                    uint16(traitBase + i),
                    uint16(traitBase + i),
                    uint16(traitBase + i),
                    (i <= 4) ? uint16(traitBase + 1) : uint16(traitBase + 2), // background is 10001 for zen and 10002 for aku
                    0 // 0 kills
                )
            );

            _safeMint(_address, i);
        }
    }

    function redeemVoucher(
        address _address,
        uint256 _approvedQty,
        uint256 _price,
        uint256 _nonce,
        bool _isLastItemFree,
        bool _isTeamReserve,
        uint256 _claimQty,
        bytes calldata _voucher
    ) external payable {
        bytes32 hash = keccak256(
            abi.encodePacked(
                _address,
                _approvedQty,
                _price,
                _nonce,
                _isLastItemFree,
                _isTeamReserve
            )
        );

        require(
            _verifySignature(signer, hash, _voucher),
            "HOWL: invalid signature"
        );

        uint256 totalWithClaimed = _voucherToMinted[uint256(hash)] + _claimQty;
        require(totalWithClaimed <= _approvedQty, "HOWL: exceeds approved qty");

        _voucherToMinted[uint256(hash)] += _claimQty;

        // Make last item free if voucher allows
        string memory err = "HOWL: not enough funds sent";
        if (totalWithClaimed == _approvedQty && _isLastItemFree) {
            require(msg.value >= _price * (_claimQty - 1), err);
        } else {
            require(msg.value >= _price * _claimQty, err);
        }

        if (_isTeamReserve) {
            // Minting from 9-888 range if authorized to mint from the reserve
            require(
                genesisReserveTokenIdCounter.current() + _claimQty <=
                    RESERVE_QTY,
                "HOWL: exceeds reserve supply"
            );
            for (uint256 i = 0; i < _claimQty; i++) {
                genesisReserveTokenIdCounter.increment();
                _mintWarlord(
                    _address,
                    genesisReserveTokenIdCounter.current(),
                    0
                );
            }
        } else {
            // minting from 889 to 8888
            require(
                genesisTokenIdCounter.current() + _claimQty <=
                    GENESIS_MAX_SUPPLY,
                "HOWL: exceeds max genesis supply"
            );

            for (uint256 i = 0; i < _claimQty; i++) {
                genesisTokenIdCounter.increment();
                _mintWarlord(_address, genesisTokenIdCounter.current(), 0);
            }
        }

        emit VoucherUsed(_address, _nonce, _claimQty);
    }

    function mintSale(uint256 _claimQty) external payable {
        require(IS_SALE_ON, "HOWL: sale is not active");
        require(
            _claimQty <= 10,
            "HOWL: can't claim more than 10 in one transaction"
        );
        require(
            msg.value >= SALE_MINT_PRICE * _claimQty,
            "HOWL: not enough funds sent"
        );
        require(
            genesisTokenIdCounter.current() + _claimQty <= GENESIS_MAX_SUPPLY,
            "HOWL: exceeds max genesis supply"
        );

        for (uint256 i = 0; i < _claimQty; i++) {
            genesisTokenIdCounter.increment();
            _mintWarlord(msg.sender, genesisTokenIdCounter.current(), 0);
        }
    }

    function _mintWarlord(
        address _address,
        uint256 _tokenId,
        uint256 _gen
    ) private {
        uint256 dna = uint256(
            keccak256(abi.encodePacked(_address, _tokenId, _getSeed()))
        );

        // When warlords are generated for the first time
        // the last 9 bits of their DNA will be used to store the generation number (8 bit)
        // and a flag that indicates whether the dna is in its encoded
        // or decoded state (1 bit).

        // Generation number will help to properly decode properties based on
        // property ranges that are unknown during minting.

        // ((dna >> 9) << 9) clears the last 9 bits.
        // _gen * 2 moves generation information one bit to the left and sets the last bit to 0.
        dna = ((dna >> 9) << 9) | (uint8(_gen) * 2);
        _tokenIdToWarlord[_tokenId] = dna;
        _safeMint(_address, _tokenId);
    }

    function canResurrectWarlord(address _address, uint256 _tokenId)
        public
        view
        returns (bool)
    {
        // Check if resurrection ticket was submitted
        uint256 currentGen = generationCounter.current();
        uint256 resurrectionGen = resurrectionTickets[_address][_tokenId];
        if (resurrectionGen == 0 || resurrectionGen != currentGen) {
            return false;
        }

        // Check if current generation was seeded
        uint256 seed = generationSeed[currentGen];
        if (seed == 0) {
            return false;
        }

        // Check if this token is lucky to be reborn
        if (
            (uint256(keccak256(abi.encodePacked(_tokenId, seed))) % 100) >
            generationResurrectionChance[currentGen]
        ) {
            return false;
        }

        return true;
    }

    function resurrectWarlord(uint256 _tokenId) external {
        require(
            canResurrectWarlord(msg.sender, _tokenId),
            "HOWL: warlord cannot be resurrected"
        );

        delete resurrectionTickets[msg.sender][_tokenId];

        uint256 gen = generationCounter.current();
        _mintWarlord(msg.sender, _tokenId, gen);
        emit Resurrection(_tokenId, msg.sender, gen);
    }

    function seppuku(
        uint256 _tokenId1,
        uint256 _tokenId2,
        uint16[8] calldata _w
    ) external onlyTokenOwner(_tokenId1) onlyTokenOwner(_tokenId2) {
        require(
            soulContractAddress != address(0) && IS_SEPPUKU_ON,
            "HOWL: seppuku is not active"
        );

        Warlord memory w1 = getWarlord(_tokenId1);
        Warlord memory w2 = getWarlord(_tokenId2);

        require(
            (_w[0] == w1.face || _w[0] == w2.face) &&
                (_w[1] == w1.headGear || _w[1] == w2.headGear) &&
                (_w[2] == w1.clothes || _w[2] == w2.clothes) &&
                (_w[3] == w1.shoulderGuard || _w[3] == w2.shoulderGuard) &&
                (_w[4] == w1.armGuards || _w[4] == w2.armGuards) &&
                (_w[5] == w1.sideWeapon || _w[5] == w2.sideWeapon) &&
                (_w[6] == w1.backWeapon || _w[6] == w2.backWeapon) &&
                (_w[7] == w1.background || _w[7] == w2.background),
            "HOWL: invalid property transfer"
        );

        _burn(_tokenId2);

        ISoul(soulContractAddress).mint(
            msg.sender,
            seppukuBaseFee +
                ((w1.killCount + w2.killCount) * seppukuMultiplierFee)
        );

        // Once any composability mechanic is used warlord traits become fully decoded
        // for the ease of future trait transfers between generations.
        _tokenIdToWarlord[_tokenId1] = _generateDecodedDna(
            Warlord(
                _w[0],
                _w[1],
                _w[2],
                _w[3],
                _w[4],
                _w[5],
                _w[6],
                _w[7],
                w1.killCount + w2.killCount + 1
            )
        );

        uint256 gen = generationCounter.current();

        // Burned token has a chance of resurrection during the next generation.
        resurrectionTickets[msg.sender][_tokenId2] = gen + 1;
        emit Seppuku(msg.sender, gen, _tokenId1, _tokenId2);
    }

    function equipProperties(
        address _originalCaller,
        uint256 _tokenId,
        uint16[8] calldata _w
    ) external onlyAuthorizedToEquip {
        require(
            ownerOf(_tokenId) == _originalCaller,
            "HOWL: you don't own this token"
        );

        Warlord memory w = getWarlord(_tokenId);

        w.face = _w[0] == 0 ? w.face : _w[0];
        w.headGear = _w[1] == 0 ? w.headGear : _w[1];
        w.clothes = _w[2] == 0 ? w.clothes : _w[2];
        w.shoulderGuard = _w[3] == 0 ? w.shoulderGuard : _w[3];
        w.armGuards = _w[4] == 0 ? w.armGuards : _w[4];
        w.sideWeapon = _w[5] == 0 ? w.sideWeapon : _w[5];
        w.backWeapon = _w[6] == 0 ? w.backWeapon : _w[6];
        w.background = _w[7] == 0 ? w.background : _w[7];

        _tokenIdToWarlord[_tokenId] = _generateDecodedDna(w);
    }

    function startConquest(uint256 _tokenId) external onlyTokenOwner(_tokenId) {
        require(IS_STAKING_ON, "HOWL: conquests are disabled");
        require(
            conquests[_tokenId] == 0,
            "HOWL: current conquest hasn't ended yet"
        );
        conquests[_tokenId] = block.timestamp;
        emit StartConquest(_tokenId, block.timestamp);
    }

    function getCurrentConquestReward(uint256 _tokenId)
        public
        view
        returns (uint256)
    {
        uint256 conquestStart = conquests[_tokenId];
        require(conquestStart != 0, "HOWL: warlord is not on a conquest");

        // Calculate for how long the token has been staked
        uint256 stakedDays = (block.timestamp - conquestStart) / 24 / 60 / 60;
        uint256[3] memory periods = _stakingPeriods;
        uint256[3] memory rewards = _stakingRewards;

        if (stakedDays >= periods[2]) {
            return rewards[2];
        } else if (stakedDays >= periods[1]) {
            return rewards[1];
        } else if (stakedDays >= periods[0]) {
            return rewards[0];
        }

        return 0;
    }

    function endConquest(uint256 _tokenId) external onlyTokenOwner(_tokenId) {
        uint256 reward = getCurrentConquestReward(_tokenId);
        delete conquests[_tokenId];

        if (reward != 0) {
            ISoul(soulContractAddress).mint(msg.sender, reward);
        }

        emit EndConquest(_tokenId, reward);
    }

    // Tokens can't be transferred when on a conquest
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal view override {
        require(
            conquests[tokenId] == 0,
            "HOWL: can't transfer or burn warlord while on a conquest"
        );
    }

    function nameWarlord(uint256 _tokenId, string calldata _name)
        external
        onlyTokenOwner(_tokenId)
    {
        require(!namesTaken[_name], "HOWL: this name has been taken");
        ISoul(soulContractAddress).collectAndBurn(msg.sender, 250);

        // if warlords was renamed - unreserve the previous name
        string memory previousName = tokenIdToWarlordName[_tokenId];
        if (bytes(previousName).length > 0) {
            namesTaken[previousName] = false;
        }

        tokenIdToWarlordName[_tokenId] = _name;

        if (bytes(_name).length > 0) {
            namesTaken[_name] = true;
        }

        emit NameChange(_tokenId, _name);
    }

    function tokenURI(uint256 _tokenId)
        public
        view
        override
        returns (string memory)
    {
        require(_exists(_tokenId), "HOWL: warlord doesn't exist");

        if (
            bytes(apiUrl).length == 0 ||
            !_isDnaRevealed(_tokenIdToWarlord[_tokenId])
        ) {
            return preRevealUrl;
        }

        Warlord memory w = getWarlord(_tokenId);
        string memory separator = "-";
        return
            string(
                abi.encodePacked(
                    apiUrl,
                    abi.encodePacked(
                        _toString(_tokenId),
                        separator,
                        _toString(w.face),
                        separator,
                        _toString(w.headGear),
                        separator,
                        _toString(w.clothes)
                    ),
                    abi.encodePacked(
                        separator,
                        _toString(w.shoulderGuard),
                        separator,
                        _toString(w.armGuards),
                        separator,
                        _toString(w.sideWeapon)
                    ),
                    abi.encodePacked(
                        separator,
                        _toString(w.backWeapon),
                        separator,
                        _toString(w.background),
                        separator,
                        _toString(w.killCount)
                    )
                )
            );
    }

    function _verifySignature(
        address _signer,
        bytes32 _hash,
        bytes memory _signature
    ) private pure returns (bool) {
        return
            _signer ==
            ECDSA.recover(ECDSA.toEthSignedMessageHash(_hash), _signature);
    }

    function _getSeed() private view returns (uint256) {
        return uint256(blockhash(block.number - 1));
    }

    function _generateDecodedDna(Warlord memory _w)
        private
        pure
        returns (uint256)
    {
        uint256 dna = _w.killCount; // 8
        dna = (dna << 16) | _w.background; // 7
        dna = (dna << 16) | _w.backWeapon; // 6
        dna = (dna << 16) | _w.sideWeapon; // 5
        dna = (dna << 16) | _w.armGuards; // 4
        dna = (dna << 16) | _w.shoulderGuard; // 3
        dna = (dna << 16) | _w.clothes; // 2
        dna = (dna << 16) | _w.headGear; // 1
        dna = (dna << 16) | _w.face; // 0
        dna = (dna << 1) | 1; // flag indicating whether this dna was decoded
        // Decoded DNA won't have a generation number anymore.
        // These traits will permanently look decoded and no further manipulation will be needed
        // apart from just extracting it with a bitshift.

        return dna;
    }

    function _isDnaRevealed(uint256 _dna) private view returns (bool) {
        // Check the last bit to see if dna is decoded.
        if (_dna & 1 == 1) {
            return true;
        }

        // If dna wasn't decoded we wanna look up whether the generation it belongs to was revealed.
        return isGenerationRevealed[(_dna >> 1) & 0xFF];
    }

    function getWarlord(uint256 _tokenId) public view returns (Warlord memory) {
        uint256 dna = _tokenIdToWarlord[_tokenId];
        require(_isDnaRevealed(dna), "HOWL: warlord is not revealed yet");

        Warlord memory w;
        w.face = _getWarlordProperty(dna, 0);
        w.headGear = _getWarlordProperty(dna, 1);
        w.clothes = _getWarlordProperty(dna, 2);
        w.shoulderGuard = _getWarlordProperty(dna, 3);
        w.armGuards = _getWarlordProperty(dna, 4);
        w.sideWeapon = _getWarlordProperty(dna, 5);
        w.backWeapon = _getWarlordProperty(dna, 6);
        w.background = _getWarlordProperty(dna, 7);
        w.killCount = _getWarlordProperty(dna, 8);

        return w;
    }

    function _getWarlordProperty(uint256 _dna, uint256 _propertyId)
        private
        view
        returns (uint16)
    {
        // Property right offset in bits.
        uint256 bitShift = _propertyId * 16;

        // Last bit shows whether the dna was already decoded.
        // If it was we can safely return the stored value after bitshifting and applying a mask.
        // Decoded values don't have a generation number, so only need to shift by one bit to account for the flag.
        if (_dna & 1 == 1) {
            return uint16(((_dna >> 1) >> bitShift) & 0xFFFF);
        }

        // Every time warlords commit seppuku their DNA will be decoded.
        // If we got here it means that it wasn't decoded and we can safely assume that their kill counter is 0.
        if (_propertyId == 8) {
            return 0;
        }

        // Minted generation number is stored inside of 8 bits after the encoded/decoded flag.
        uint256 gen = (_dna >> 1) & 0xFF;

        // Rarity and range values to decode the property (specific to generation)
        uint16[2] storage _rarity = generationRarities[gen];
        uint16[4] storage _range = generationRanges[gen][_propertyId];

        // Extracting the encoded (raw) property (also shifting by 9bits first to account for generation metadata and a flag).
        // This property is just a raw value, it will get decoded with _rarity and _range information from above.
        uint256 encodedProp = (((_dna >> 9) >> bitShift) & 0xFFFF);

        if (
            (_propertyId == 3 || _propertyId == 4 || _propertyId == 5) &&
            // 60% chance that sideWeapon/armGuards/shoulderGuard will appear
            uint256(keccak256(abi.encodePacked(encodedProp, _range))) % 100 > 60
        ) {
            // Unlucky
            return 0;
        }

        // A value that will dictate from which pool of properties we should pull (common, uncommon, rare)
        uint256 rarityDecider = (uint256(
            keccak256(abi.encodePacked(_propertyId, _dna, _range))
        ) % 100) + 1;

        uint256 rangeStart;
        uint256 rangeEnd;

        // There is an opportunity to optimize for SLOAD operations here by byte packing all
        // rarity/range information and loading it in getWarlord before this function
        // is called to minimize state access.
        if (rarityDecider <= _rarity[0]) {
            // common
            rangeStart = _range[0];
            rangeEnd = _range[1];
        } else if (rarityDecider <= _rarity[1] + _rarity[0]) {
            // uncommon
            rangeStart = _range[1];
            rangeEnd = _range[2];
        } else {
            // rare
            rangeStart = _range[2];
            rangeEnd = _range[3];
        }

        // Returns a decoded property that will fall within one of the rarity buckets.
        return uint16((encodedProp % (rangeEnd - rangeStart)) + rangeStart);
    }

    function _toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT license
        // 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);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_reward","type":"uint256"}],"name":"EndConquest","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"_name","type":"string"}],"name":"NameChange","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":"uint256","name":"_tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"_address","type":"address"},{"indexed":true,"internalType":"uint256","name":"_generation","type":"uint256"}],"name":"Resurrection","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_address","type":"address"},{"indexed":true,"internalType":"uint256","name":"_generation","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_tokenId1","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_tokenId2","type":"uint256"}],"name":"Seppuku","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_startDate","type":"uint256"}],"name":"StartConquest","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_address","type":"address"},{"indexed":true,"internalType":"uint256","name":"_nonce","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_claimQty","type":"uint256"}],"name":"VoucherUsed","type":"event"},{"inputs":[],"name":"GENESIS_MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"IS_SALE_ON","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"IS_SEPPUKU_ON","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"IS_STAKING_ON","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RESERVE_QTY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SALE_MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"admins","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"apiUrl","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"authorizedToEquip","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"canResurrectWarlord","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"canSummonLegendaries","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"conquests","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"endConquest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_originalCaller","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint16[8]","name":"_w","type":"uint16[8]"}],"name":"equipProperties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"generationCounter","outputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"generationProvenance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"generationRanges","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"generationRarities","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"generationResurrectionChance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"generationSeed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"genesisReserveTokenIdCounter","outputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"genesisTokenIdCounter","outputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getCurrentConquestReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getStakingRewardsAndPeriods","outputs":[{"internalType":"uint256[3][2]","name":"","type":"uint256[3][2]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getWarlord","outputs":[{"components":[{"internalType":"uint16","name":"face","type":"uint16"},{"internalType":"uint16","name":"headGear","type":"uint16"},{"internalType":"uint16","name":"clothes","type":"uint16"},{"internalType":"uint16","name":"shoulderGuard","type":"uint16"},{"internalType":"uint16","name":"armGuards","type":"uint16"},{"internalType":"uint16","name":"sideWeapon","type":"uint16"},{"internalType":"uint16","name":"backWeapon","type":"uint16"},{"internalType":"uint16","name":"background","type":"uint16"},{"internalType":"uint16","name":"killCount","type":"uint16"}],"internalType":"struct Howl.Warlord","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isAuthorizedToEquipLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"isGenerationRevealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockAuthorizedToEquip","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"_claimQty","type":"uint256"}],"name":"mintReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_claimQty","type":"uint256"}],"name":"mintSale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_name","type":"string"}],"name":"nameWarlord","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"namesTaken","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":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preRevealUrl","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"_approvedQty","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"uint256","name":"_nonce","type":"uint256"},{"internalType":"bool","name":"_isLastItemFree","type":"bool"},{"internalType":"bool","name":"_isTeamReserve","type":"bool"},{"internalType":"uint256","name":"_claimQty","type":"uint256"},{"internalType":"bytes","name":"_voucher","type":"bytes"}],"name":"redeemVoucher","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"resurrectWarlord","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"resurrectionTickets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId1","type":"uint256"},{"internalType":"uint256","name":"_tokenId2","type":"uint256"},{"internalType":"uint16[8]","name":"_w","type":"uint16[8]"}],"name":"seppuku","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"seppukuBaseFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"seppukuMultiplierFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_hasAccess","type":"bool"}],"name":"setAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_apiUrl","type":"string"}],"name":"setApiUrl","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":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_isAuthorized","type":"bool"}],"name":"setAuthorizedToEquip","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_provenance","type":"uint256"},{"internalType":"uint256","name":"_gen","type":"uint256"}],"name":"setGenerationProvenance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_gen","type":"uint256"},{"internalType":"uint16[4]","name":"_face","type":"uint16[4]"},{"internalType":"uint16[4]","name":"_headGear","type":"uint16[4]"},{"internalType":"uint16[4]","name":"_clothes","type":"uint16[4]"},{"internalType":"uint16[4]","name":"_shoulderGuard","type":"uint16[4]"},{"internalType":"uint16[4]","name":"_armGuards","type":"uint16[4]"},{"internalType":"uint16[4]","name":"_sideWeapon","type":"uint16[4]"},{"internalType":"uint16[4]","name":"_backWeapon","type":"uint16[4]"},{"internalType":"uint16[4]","name":"_background","type":"uint16[4]"}],"name":"setGenerationRanges","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_gen","type":"uint256"},{"internalType":"uint16","name":"_common","type":"uint16"},{"internalType":"uint16","name":"_uncommon","type":"uint16"}],"name":"setGenerationRarities","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_gen","type":"uint256"},{"internalType":"bool","name":"_isGenerationRevealed","type":"bool"}],"name":"setIsGenerationRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isSaleOn","type":"bool"}],"name":"setIsSaleOn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isSeppukuOn","type":"bool"}],"name":"setIsSeppukuOn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isStakingOn","type":"bool"}],"name":"setIsStakingOn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_preRevealUrl","type":"string"}],"name":"setPreRevealUrl","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintPrice","type":"uint256"}],"name":"setSaleMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_baseFee","type":"uint256"},{"internalType":"uint256","name":"_multiplierFee","type":"uint256"}],"name":"setSeppukuBaseAndMultiplierFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_signer","type":"address"}],"name":"setSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setSoulContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[3]","name":"_rewards","type":"uint256[3]"},{"internalType":"uint256[3]","name":"_periods","type":"uint256[3]"}],"name":"setStakingRewardsAndPeriods","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"signer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"soulContractAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"startConquest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_resurrectionChance","type":"uint256"}],"name":"startNextGenerationResurrection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"summonLegendaries","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenIdToWarlordName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

66f5232269808000600a5560e060405260fa608090815261025860a0526103e860c0526200003290600c90600362000178565b5060408051606081018252601e8152603c6020820152605a918101919091526200006190600f906003620001c1565b506103e86012556101f46013556014805460ff191660011790553480156200008857600080fd5b506040805180820182526011815270486f757365206f66205761726c6f72647360781b6020808301918252835180850190945260048452631213d5d360e21b908401528151919291620000de91600091620001f7565b508051620000f4906001906020840190620001f7565b505050620001116200010b6200012260201b60201c565b62000126565b6103786008908155600955620002c8565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8260038101928215620001af579160200282015b82811115620001af578251829061ffff169055916020019190600101906200018c565b50620001bd92915062000274565b5090565b8260038101928215620001af579160200282015b82811115620001af578251829060ff16905591602001919060010190620001d5565b82805462000205906200028b565b90600052602060002090601f016020900481019282620002295760008555620001af565b82601f106200024457805160ff1916838001178555620001af565b82800160010185558215620001af579182015b82811115620001af57825182559160200191906001019062000257565b5b80821115620001bd576000815560010162000275565b600181811c90821680620002a057607f821691505b60208210811415620002c257634e487b7160e01b600052602260045260246000fd5b50919050565b6156e180620002d86000396000f3fe6080604052600436106104675760003560e01c80636352211e1161024a578063a22cb46511610139578063d21f4b94116100b6578063f2fde38b1161007a578063f2fde38b14610e6c578063f3fdf37514610e8c578063f48ccdcc14610ea2578063f8f8dbf814610ec2578063f964f49b14610ed557600080fd5b8063d21f4b9414610dbf578063e8c75a3014610ddf578063e985e9c514610dff578063ed02c52b14610e1f578063ede0fe0514610e3f57600080fd5b8063bc1a481e116100fd578063bc1a481e14610d2a578063c87b56dd14610d3f578063cb1f4b5814610d5f578063cd53594814610d7f578063d077076d14610d9f57600080fd5b8063a22cb46514610c0e578063b37aa25314610c2e578063b88d4fde14610c4e578063ba079a8d14610c6e578063ba64c7d614610d0a57600080fd5b80638228eac1116101c75780638e825be01161018b5780638e825be014610b945780639416647114610bb457806395d89b4114610bcb578063988acb9614610be0578063a213040a14610bf757600080fd5b80638228eac114610b025780638367e12014610b225780638937461314610b375780638d1f68b314610b575780638da5cb5b14610b7657600080fd5b8063715018a61161020e578063715018a614610a4d578063755ae95314610a6257806375f1baf214610a9a578063778ef1fa14610aba57806381d063e214610acf57600080fd5b80636352211e146109ad57806364e9aae2146109cd578063659202c3146109ed5780636c19e78314610a0d57806370a0823114610a2d57600080fd5b80632f72d8f211610366578063453c6696116102e35780634b0bddd2116102a75780634b0bddd214610911578063523cefe1146109315780635b8926911461094b57806360196a651461096d578063609baf9f1461098d57600080fd5b8063453c66961461087b5780634875bccb1461089b57806348f5c144146108ae57806348f95765146108ce5780634aa4746e146108e457600080fd5b80633ccfd60b1161032a5780633ccfd60b146107c6578063410a467f146107db57806342842e0e1461080b57806342966c681461082b578063429b62e51461084b57600080fd5b80632f72d8f2146107365780632f76b18814610756578063332b73ba14610776578063342aab121461078c5780633548d0d2146107a657600080fd5b80630f77e8a0116103f4578063217c4a0a116103b8578063217c4a0a1461067b578063238ac933146106b657806323b872dd146106d65780632ac85965146106f65780632b3b3df51461071657600080fd5b80630f77e8a0146105eb5780631325b5271461060b57806313270de314610625578063190c7e99146106455780631de010a71461065b57600080fd5b8063081812fc1161043b578063081812fc1461050957806308a887b114610541578063095ea7b3146105715780630b86d730146105915780630e281fec146105be57600080fd5b80620cbb211461046c57806301ffc9a71461048e57806302d81a12146104c357806306fdde03146104e7575b600080fd5b34801561047857600080fd5b5061048c610487366004614e1f565b610ef5565b005b34801561049a57600080fd5b506104ae6104a9366004614de5565b610f39565b60405190151581526020015b60405180910390f35b3480156104cf57600080fd5b506104d9600a5481565b6040519081526020016104ba565b3480156104f357600080fd5b506104fc610f8b565b6040516104ba91906153f5565b34801561051557600080fd5b50610529610524366004614ec5565b61101d565b6040516001600160a01b0390911681526020016104ba565b34801561054d57600080fd5b506104ae61055c366004614b60565b60256020526000908152604090205460ff1681565b34801561057d57600080fd5b5061048c61058c366004614c97565b6110b2565b34801561059d57600080fd5b506104d96105ac366004614ec5565b601e6020526000908152604090205481565b3480156105ca57600080fd5b506104d96105d9366004614ec5565b60216020526000908152604090205481565b3480156105f757600080fd5b5061048c610606366004614cc1565b6111c3565b34801561061757600080fd5b50600b546104ae9060ff1681565b34801561063157600080fd5b5061048c610640366004614faf565b61148b565b34801561065157600080fd5b506104d96122b881565b34801561066757600080fd5b50601854610529906001600160a01b031681565b34801561068757600080fd5b506104ae610696366004614e61565b805160208183018101805160248252928201919093012091525460ff1681565b3480156106c257600080fd5b50601754610529906001600160a01b031681565b3480156106e257600080fd5b5061048c6106f1366004614bb5565b6116da565b34801561070257600080fd5b506104fc610711366004614ec5565b61170c565b34801561072257600080fd5b5061048c61073136600461502e565b6117a6565b34801561074257600080fd5b506104d9610751366004614ec5565b6117d8565b34801561076257600080fd5b5061048c610771366004615050565b611938565b34801561078257600080fd5b506104d960125481565b34801561079857600080fd5b506026546104ae9060ff1681565b3480156107b257600080fd5b5061048c6107c1366004614b60565b611ec8565b3480156107d257600080fd5b5061048c611f14565b3480156107e757600080fd5b506104ae6107f6366004614ec5565b601c6020526000908152604090205460ff1681565b34801561081757600080fd5b5061048c610826366004614bb5565b611f7a565b34801561083757600080fd5b5061048c610846366004614ec5565b611f95565b34801561085757600080fd5b506104ae610866366004614b60565b60276020526000908152604090205460ff1681565b34801561088757600080fd5b5061048c61089636600461502e565b61200c565b61048c6108a9366004614ec5565b61201f565b3480156108ba57600080fd5b5061048c6108c9366004614d9e565b6121e1565b3480156108da57600080fd5b506104d960135481565b3480156108f057600080fd5b506104d96108ff366004614ec5565b601b6020526000908152604090205481565b34801561091d57600080fd5b5061048c61092c366004614c6d565b612204565b34801561093d57600080fd5b506014546104ae9060ff1681565b34801561095757600080fd5b50610960612259565b6040516104ba919061536c565b34801561097957600080fd5b5061048c610988366004614ffb565b6122ba565b34801561099957600080fd5b5061048c6109a8366004614dca565b61232d565b3480156109b957600080fd5b506105296109c8366004614ec5565b612348565b3480156109d957600080fd5b5061048c6109e8366004614ec5565b6123bf565b3480156109f957600080fd5b5061048c610a08366004614ec5565b61241d565b348015610a1957600080fd5b5061048c610a28366004614b60565b61253e565b348015610a3957600080fd5b506104d9610a48366004614b60565b61258a565b348015610a5957600080fd5b5061048c612611565b348015610a6e57600080fd5b506104d9610a7d366004614c97565b601f60209081526000928352604080842090915290825290205481565b348015610aa657600080fd5b5061048c610ab5366004614c6d565b612647565b348015610ac657600080fd5b5061048c6126ac565b348015610adb57600080fd5b50610aef610aea36600461507e565b6126e5565b60405161ffff90911681526020016104ba565b348015610b0e57600080fd5b50600b546104ae9062010000900460ff1681565b348015610b2e57600080fd5b506104fc61272f565b348015610b4357600080fd5b5061048c610b52366004614f8c565b61273c565b348015610b6357600080fd5b50600b546104ae90610100900460ff1681565b348015610b8257600080fd5b506006546001600160a01b0316610529565b348015610ba057600080fd5b5061048c610baf366004614c97565b612780565b348015610bc057600080fd5b506008546104d99081565b348015610bd757600080fd5b506104fc612804565b348015610bec57600080fd5b506009546104d99081565b348015610c0357600080fd5b506007546104d99081565b348015610c1a57600080fd5b5061048c610c29366004614c6d565b612813565b348015610c3a57600080fd5b5061048c610c49366004614dca565b6128d8565b348015610c5a57600080fd5b5061048c610c69366004614bf1565b6128fa565b348015610c7a57600080fd5b50610c8e610c89366004614ec5565b61292c565b6040516104ba9190815161ffff908116825260208084015182169083015260408084015182169083015260608084015182169083015260808084015182169083015260a08084015182169083015260c08084015182169083015260e0808401518216908301526101009283015116918101919091526101200190565b348015610d1657600080fd5b5061048c610d25366004614ec5565b612a62565b348015610d3657600080fd5b506104fc612a91565b348015610d4b57600080fd5b506104fc610d5a366004614ec5565b612a9e565b348015610d6b57600080fd5b5061048c610d7a366004614ede565b612d35565b348015610d8b57600080fd5b5061048c610d9a366004614b60565b612e9b565b348015610dab57600080fd5b50610aef610dba36600461502e565b612fe4565b348015610dcb57600080fd5b5061048c610dda366004614dca565b613021565b348015610deb57600080fd5b5061048c610dfa366004614e1f565b613045565b348015610e0b57600080fd5b506104ae610e1a366004614b82565b61307b565b348015610e2b57600080fd5b506104ae610e3a366004614c97565b6130a9565b348015610e4b57600080fd5b506104d9610e5a366004614ec5565b601d6020526000908152604090205481565b348015610e7857600080fd5b5061048c610e87366004614b60565b613181565b348015610e9857600080fd5b506104d961037881565b348015610eae57600080fd5b5061048c610ebd366004614ec5565b613219565b61048c610ed0366004614cff565b6132d8565b348015610ee157600080fd5b5061048c610ef0366004614ec5565b6136ad565b6006546001600160a01b03163314610f285760405162461bcd60e51b8152600401610f1f9061545a565b60405180910390fd5b610f34601583836147ee565b505050565b60006001600160e01b031982166380ac58cd60e01b1480610f6a57506001600160e01b03198216635b5e139f60e01b145b80610f8557506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060008054610f9a906155bd565b80601f0160208091040260200160405190810160405280929190818152602001828054610fc6906155bd565b80156110135780601f10610fe857610100808354040283529160200191611013565b820191906000526020600020905b815481529060010190602001808311610ff657829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166110965760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610f1f565b506000908152600460205260409020546001600160a01b031690565b60006110bd82612348565b9050806001600160a01b0316836001600160a01b0316141561112b5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610f1f565b336001600160a01b03821614806111475750611147813361307b565b6111b95760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610f1f565b610f34838361377d565b3360009081526025602052604090205460ff166112175760405162461bcd60e51b81526020600482015260126024820152711213d5d30e881d5b985d5d1a1bdc9a5e995960721b6044820152606401610f1f565b826001600160a01b031661122a83612348565b6001600160a01b0316146112805760405162461bcd60e51b815260206004820152601e60248201527f484f574c3a20796f7520646f6e2774206f776e207468697320746f6b656e00006044820152606401610f1f565b600061128b8361292c565b905061129a6020830183614eaa565b61ffff16156112b5576112b06020830183614eaa565b6112b8565b80515b61ffff1681526112ce6040830160208401614eaa565b61ffff16156112ec576112e76040830160208401614eaa565b6112f2565b80602001515b61ffff16602082015261130b6060830160408401614eaa565b61ffff1615611329576113246060830160408401614eaa565b61132f565b80604001515b61ffff1660408201526113486080830160608401614eaa565b61ffff1615611366576113616080830160608401614eaa565b61136c565b80606001515b61ffff16606082015261138560a0830160808401614eaa565b61ffff16156113a35761139e60a0830160808401614eaa565b6113a9565b80608001515b61ffff1660808201526113c260c0830160a08401614eaa565b61ffff16156113e0576113db60c0830160a08401614eaa565b6113e6565b8060a001515b61ffff1660a08201526113ff60e0830160c08401614eaa565b61ffff161561141d5761141860e0830160c08401614eaa565b611423565b8060c001515b61ffff1660c082015261143d610100830160e08401614eaa565b61ffff161561145c57611457610100830160e08401614eaa565b611462565b8060e001515b61ffff1660e0820152611474816137eb565b600093845260208052604090932092909255505050565b8261149581613863565b602483836040516114a79291906150f2565b9081526040519081900360200190205460ff16156115075760405162461bcd60e51b815260206004820152601e60248201527f484f574c3a2074686973206e616d6520686173206265656e2074616b656e00006044820152606401610f1f565b60185460405163b4638cc160e01b815233600482015260fa60248201526001600160a01b039091169063b4638cc190604401600060405180830381600087803b15801561155357600080fd5b505af1158015611567573d6000803e3d6000fd5b5050506000858152602360205260408120805491925090611587906155bd565b80601f01602080910402602001604051908101604052809291908181526020018280546115b3906155bd565b80156116005780601f106115d557610100808354040283529160200191611600565b820191906000526020600020905b8154815290600101906020018083116115e357829003601f168201915b505050505090506000815111156116445760006024826040516116239190615102565b908152604051908190036020019020805491151560ff199092169190911790555b600085815260236020526040902061165d9085856147ee565b508215611699576001602485856040516116789291906150f2565b908152604051908190036020019020805491151560ff199092169190911790555b847f7e632a301794d8d4a81ea7e20f37d1947158d36e66403af04ba85dd194b66f1b85856040516116cb9291906153c6565b60405180910390a25050505050565b6116e5335b826138c3565b6117015760405162461bcd60e51b8152600401610f1f9061548f565b610f3483838361399a565b60236020526000908152604090208054611725906155bd565b80601f0160208091040260200160405190810160405280929190818152602001828054611751906155bd565b801561179e5780601f106117735761010080835404028352916020019161179e565b820191906000526020600020905b81548152906001019060200180831161178157829003601f168201915b505050505081565b6117ae613b45565b6000818152601b6020526040902054156117c757600080fd5b6000908152601b6020526040902055565b6000818152602160205260408120548061183f5760405162461bcd60e51b815260206004820152602260248201527f484f574c3a207761726c6f7264206973206e6f74206f6e206120636f6e7175656044820152611cdd60f21b6064820152608401610f1f565b6000603c806018611850854261557a565b61185a919061551e565b611864919061551e565b61186e919061551e565b60408051606081019182905291925060009190600f9060039082845b81548152602001906001019080831161188a5750506040805160608101918290529495506000949350600c92506003915082845b8154815260200190600101908083116118be5750505050509050816002600381106118eb576118eb615669565b60200201518310611909578060025b60200201519695505050505050565b6020820151831061191c578060016118fa565b8151831061192c578060006118fa565b50600095945050505050565b8261194281613863565b8261194c81613863565b6018546001600160a01b03161580159061196d5750600b54610100900460ff165b6119b95760405162461bcd60e51b815260206004820152601b60248201527f484f574c3a2073657070756b75206973206e6f742061637469766500000000006044820152606401610f1f565b60006119c48661292c565b905060006119d18661292c565b825190915061ffff166119e76020870187614eaa565b61ffff161480611a0b5750805161ffff16611a056020870187614eaa565b61ffff16145b8015611a59575060208281015161ffff1690611a2d9060408801908801614eaa565b61ffff161480611a59575060208181015161ffff1690611a539060408801908801614eaa565b61ffff16145b8015611aa7575060408281015161ffff1690611a7b9060608801908801614eaa565b61ffff161480611aa7575060408181015161ffff1690611aa19060608801908801614eaa565b61ffff16145b8015611af5575060608281015161ffff1690611ac99060808801908801614eaa565b61ffff161480611af5575060608181015161ffff1690611aef9060808801908801614eaa565b61ffff16145b8015611b43575060808281015161ffff1690611b179060a08801908801614eaa565b61ffff161480611b43575060808181015161ffff1690611b3d9060a08801908801614eaa565b61ffff16145b8015611b91575060a08281015161ffff1690611b659060c08801908801614eaa565b61ffff161480611b91575060a08181015161ffff1690611b8b9060c08801908801614eaa565b61ffff16145b8015611bdf575060c08281015161ffff1690611bb39060e08801908801614eaa565b61ffff161480611bdf575060c08181015161ffff1690611bd99060e08801908801614eaa565b61ffff16145b8015611c2f575060e08281015161ffff1690611c02906101008801908801614eaa565b61ffff161480611c2f575060e08181015161ffff1690611c29906101008801908801614eaa565b61ffff16145b611c7b5760405162461bcd60e51b815260206004820152601f60248201527f484f574c3a20696e76616c69642070726f7065727479207472616e73666572006044820152606401610f1f565b611c8486613bbd565b60185460135461010083810151908501516001600160a01b03909316926340c10f199233929091611cb591906154e0565b61ffff16611cc39190615532565b601254611cd09190615506565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015611d1657600080fd5b505af1158015611d2a573d6000803e3d6000fd5b50505050611e4b60405180610120016040528087600060088110611d5057611d50615669565b602002016020810190611d639190614eaa565b61ffff168152602090810190611d7f9060408a01908a01614eaa565b61ffff168152602001611d986060890160408a01614eaa565b61ffff168152602001611db16080890160608a01614eaa565b61ffff168152602001611dca60a0890160808a01614eaa565b61ffff168152602001611de360c0890160a08a01614eaa565b61ffff168152602001611dfc60e0890160c08a01614eaa565b61ffff168152602001611e16610100890160e08a01614eaa565b61ffff168152602001836101000151856101000151611e3591906154e0565b611e409060016154e0565b61ffff1690526137eb565b6000888152602080526040902055600754611e67816001615506565b336000818152601f602090815260408083208c84528252918290209390935580518b81529283018a905283927ff428ac5d321cb28d0fa951fe0bc5411a8caad77ff67b6beffa1c8c26f7110aa9910160405180910390a35050505050505050565b6006546001600160a01b03163314611ef25760405162461bcd60e51b8152600401610f1f9061545a565b601880546001600160a01b0319166001600160a01b0392909216919091179055565b6006546001600160a01b03163314611f3e5760405162461bcd60e51b8152600401610f1f9061545a565b6006546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015611f77573d6000803e3d6000fd5b50565b610f34838383604051806020016040528060008152506128fa565b611f9e336116df565b6120035760405162461bcd60e51b815260206004820152603060248201527f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760448201526f1b995c881b9bdc88185c1c1c9bdd995960821b6064820152608401610f1f565b611f7781613bbd565b612014613b45565b601291909155601355565b600b5460ff166120715760405162461bcd60e51b815260206004820152601860248201527f484f574c3a2073616c65206973206e6f742061637469766500000000000000006044820152606401610f1f565b600a8111156120dc5760405162461bcd60e51b815260206004820152603160248201527f484f574c3a2063616e277420636c61696d206d6f7265207468616e2031302069604482015270371037b732903a3930b739b0b1ba34b7b760791b6064820152608401610f1f565b80600a546120ea9190615532565b3410156121395760405162461bcd60e51b815260206004820152601b60248201527f484f574c3a206e6f7420656e6f7567682066756e64732073656e7400000000006044820152606401610f1f565b6122b88161214660085490565b6121509190615506565b111561219e5760405162461bcd60e51b815260206004820181905260248201527f484f574c3a2065786365656473206d61782067656e6573697320737570706c796044820152606401610f1f565b60005b818110156121dd576121b7600880546001019055565b6121cb336121c460085490565b6000613c64565b806121d5816155f8565b9150506121a1565b5050565b6121e9613b45565b6121f6600c836003614872565b50610f34600f826003614872565b6006546001600160a01b0316331461222e5760405162461bcd60e51b8152600401610f1f9061545a565b6001600160a01b03919091166000908152602760205260409020805460ff1916911515919091179055565b61226161489f565b6040805160a081018252600c54818301908152600d54606080840191909152600e546080840152908252825190810190925290602082019080600f60000154815260105460208201526011546040909101529052919050565b6122c2613b45565b6000838152601c602052604090205460ff16156122de57600080fd5b8061ffff168261ffff16116122f257600080fd5b60408051808201825261ffff808516825283166020808301919091526000868152601a909152919091206123279160026148cc565b50505050565b612335613b45565b600b805460ff1916911515919091179055565b6000818152600260205260408120546001600160a01b031680610f855760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610f1f565b6123c7613b45565b600b54610100900460ff16156123dc57600080fd5b6123ea600780546001019055565b60006123f560075490565b90506123ff613ceb565b6000918252601d6020908152604080842092909255601e9052902055565b8061242781613863565b600b5462010000900460ff1661247f5760405162461bcd60e51b815260206004820152601c60248201527f484f574c3a20636f6e717565737473206172652064697361626c6564000000006044820152606401610f1f565b600082815260216020526040902054156124eb5760405162461bcd60e51b815260206004820152602760248201527f484f574c3a2063757272656e7420636f6e7175657374206861736e277420656e604482015266191959081e595d60ca1b6064820152608401610f1f565b600082815260216020526040908190204290819055905183917f16969204e93ac0883a00b75197329a0e647874c02f5662266351d040c303f2809161253291815260200190565b60405180910390a25050565b6006546001600160a01b031633146125685760405162461bcd60e51b8152600401610f1f9061545a565b601780546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160a01b0382166125f55760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610f1f565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b0316331461263b5760405162461bcd60e51b8152600401610f1f9061545a565b6126456000613cfe565b565b6006546001600160a01b031633146126715760405162461bcd60e51b8152600401610f1f9061545a565b60265460ff161561268157600080fd5b6001600160a01b03919091166000908152602560205260409020805460ff1916911515919091179055565b6006546001600160a01b031633146126d65760405162461bcd60e51b8152600401610f1f9061545a565b6026805460ff19166001179055565b6019602052826000526040600020602052816000526040600020816004811061270d57600080fd5b6010918282040191900660020292509250509054906101000a900461ffff1681565b60168054611725906155bd565b612744613b45565b6000828152601c602052604090205460ff161561276057600080fd5b6000918252601c6020526040909120805460ff1916911515919091179055565b6006546001600160a01b031633146127aa5760405162461bcd60e51b8152600401610f1f9061545a565b610378816127b760095490565b6127c19190615506565b11156127cc57600080fd5b60005b81811015610f34576127e5600980546001019055565b6127f2836121c460095490565b806127fc816155f8565b9150506127cf565b606060018054610f9a906155bd565b6001600160a01b03821633141561286c5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610f1f565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6128e0613b45565b600b80549115156101000261ff0019909216919091179055565b61290433836138c3565b6129205760405162461bcd60e51b8152600401610f1f9061548f565b61232784848484613d50565b61293461495d565b600082815260208052604090205461294b81613d83565b6129a15760405162461bcd60e51b815260206004820152602160248201527f484f574c3a207761726c6f7264206973206e6f742072657665616c65642079656044820152601d60fa1b6064820152608401610f1f565b6129a961495d565b6129b4826000613db5565b61ffff1681526129c5826001613db5565b61ffff1660208201526129d9826002613db5565b61ffff1660408201526129ed826003613db5565b61ffff166060820152612a01826004613db5565b61ffff166080820152612a15826005613db5565b61ffff1660a0820152612a29826006613db5565b61ffff1660c0820152612a3d826007613db5565b61ffff1660e0820152612a51826008613db5565b61ffff166101008201529392505050565b6006546001600160a01b03163314612a8c5760405162461bcd60e51b8152600401610f1f9061545a565b600a55565b60158054611725906155bd565b6000818152600260205260409020546060906001600160a01b0316612b055760405162461bcd60e51b815260206004820152601b60248201527f484f574c3a207761726c6f726420646f65736e277420657869737400000000006044820152606401610f1f565b60168054612b12906155bd565b15905080612b3457506000828152602080526040902054612b3290613d83565b155b15612bcb5760158054612b46906155bd565b80601f0160208091040260200160405190810160405280929190818152602001828054612b72906155bd565b8015612bbf5780601f10612b9457610100808354040283529160200191612bbf565b820191906000526020600020905b815481529060010190602001808311612ba257829003601f168201915b50505050509050919050565b6000612bd68361292c565b6040805180820190915260018152602d60f81b60208201529091506016612bfc85613fdc565b82612c0e856000015161ffff16613fdc565b84612c20876020015161ffff16613fdc565b86612c32896040015161ffff16613fdc565b604051602001612c48979695949392919061519d565b60405160208183030381529060405282612c69856060015161ffff16613fdc565b84612c7b876080015161ffff16613fdc565b86612c8d8960a0015161ffff16613fdc565b604051602001612ca29695949392919061511e565b60405160208183030381529060405283612cc38660c0015161ffff16613fdc565b85612cd58860e0015161ffff16613fdc565b87612ce88a610100015161ffff16613fdc565b604051602001612cfd9695949392919061511e565b60408051601f1981840301815290829052612d1d9493929160200161522f565b60405160208183030381529060405292505050919050565b612d3d613b45565b6000898152601c602052604090205460ff1615612d5957600080fd5b60008981526019602090815260408083208380529091529020612d7e908960046149a9565b506000898152601960209081526040808320600184529091529020612da5908860046149a9565b506000898152601960209081526040808320600284529091529020612dcc908760046149a9565b506000898152601960209081526040808320600384529091529020612df3908660046149a9565b50600089815260196020908152604080832060048085529252909120612e1a9186906149a9565b506000898152601960209081526040808320600584529091529020612e41908460046149a9565b506000898152601960209081526040808320600684529091529020612e68908360046149a9565b506000898152601960209081526040808320600784529091529020612e8f908260046149a9565b50505050505050505050565b6006546001600160a01b03163314612ec55760405162461bcd60e51b8152600401610f1f9061545a565b60145460ff16612ed457600080fd5b6014805460ff1916905561271060015b6009811015610f3457612fba6040518061012001604052808385612f089190615506565b61ffff168152602001612f1b8486615506565b61ffff168152602001612f2e8486615506565b61ffff168152602001612f418486615506565b61ffff168152602001612f548486615506565b61ffff168152602001612f678486615506565b61ffff168152602001612f7a8486615506565b61ffff1681526020016004841115612f9c57612f97856002615506565b612fa7565b612fa7856001615506565b61ffff16815260006020909101526137eb565b6000828152602080526040902055612fd283826140da565b80612fdc816155f8565b915050612ee4565b601a602052816000526040600020816002811061300057600080fd5b60109182820401919006600202915091509054906101000a900461ffff1681565b613029613b45565b600b8054911515620100000262ff000019909216919091179055565b6006546001600160a01b0316331461306f5760405162461bcd60e51b8152600401610f1f9061545a565b610f34601683836147ee565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6000806130b560075490565b6001600160a01b0385166000908152601f602090815260408083208784529091529020549091508015806130e95750818114155b156130f957600092505050610f85565b6000828152601d6020526040902054806131195760009350505050610f85565b6000838152601e60209081526040918290205482519182018890529181018390526064906060016040516020818303038152906040528051906020012060001c6131639190615613565b11156131755760009350505050610f85565b50600195945050505050565b6006546001600160a01b031633146131ab5760405162461bcd60e51b8152600401610f1f9061545a565b6001600160a01b0381166132105760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610f1f565b611f7781613cfe565b61322333826130a9565b61327b5760405162461bcd60e51b815260206004820152602360248201527f484f574c3a207761726c6f72642063616e6e6f742062652072657375727265636044820152621d195960ea1b6064820152608401610f1f565b336000818152601f60209081526040808320858452909152812055600754906132a5908383613c64565b6040518190339084907fe78b1a4d61d8e84ed36ddb3bf5ba09cd497312889adfa18db97b598984c07c5e90600090a45050565b6040516bffffffffffffffffffffffff1960608b901b16602082015260348101899052605481018890526074810187905285151560f890811b6094830152851515901b609582015260009060960160408051601f198184030181528282528051602091820120601754601f87018390048302850183019093528584529350613388926001600160a01b0390921691849187908790819084018382808284376000920191909152506140f492505050565b6133d45760405162461bcd60e51b815260206004820152601760248201527f484f574c3a20696e76616c6964207369676e61747572650000000000000000006044820152606401610f1f565b6000818152602260205260408120546133ee908690615506565b9050898111156134405760405162461bcd60e51b815260206004820152601a60248201527f484f574c3a206578636565647320617070726f766564207174790000000000006044820152606401610f1f565b6000828152602260205260408120805487929061345e908490615506565b909155505060408051808201909152601b81527f484f574c3a206e6f7420656e6f7567682066756e64732073656e7400000000006020820152818b1480156134a35750875b156134e5576134b360018761557a565b6134bd908b615532565b34101581906134df5760405162461bcd60e51b8152600401610f1f91906153f5565b50613513565b6134ef868b615532565b34101581906135115760405162461bcd60e51b8152600401610f1f91906153f5565b505b86156135bc576103788661352660095490565b6135309190615506565b111561357e5760405162461bcd60e51b815260206004820152601c60248201527f484f574c3a2065786365656473207265736572766520737570706c79000000006044820152606401610f1f565b60005b868110156135b657613597600980546001019055565b6135a48d6121c460095490565b806135ae816155f8565b915050613581565b5061365b565b6122b8866135c960085490565b6135d39190615506565b11156136215760405162461bcd60e51b815260206004820181905260248201527f484f574c3a2065786365656473206d61782067656e6573697320737570706c796044820152606401610f1f565b60005b868110156136595761363a600880546001019055565b6136478d6121c460085490565b80613651816155f8565b915050613624565b505b888c6001600160a01b03167f7f8116dee4dcad7a6847ed8d84779ab3ba76e1385bc9251da7b521e7c2e7cc2d8860405161369791815260200190565b60405180910390a3505050505050505050505050565b806136b781613863565b60006136c2836117d8565b6000848152602160205260408120559050801561373e576018546040516340c10f1960e01b8152336004820152602481018390526001600160a01b03909116906340c10f1990604401600060405180830381600087803b15801561372557600080fd5b505af1158015613739573d6000803e3d6000fd5b505050505b827fa60c8988092734348c58663db7e00d274c64fe99a387b97a88ee2febbac50de18260405161377091815260200190565b60405180910390a2505050565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906137b282612348565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b61010081015160e082015160c083015160a08401516080850151606086015160408701516020880151975161ffff9081169881169181169281169381169481169581169616601097881b63ffff00001617871b95909517861b93909317851b91909117841b17831b17821b17901b17600190811b1790565b3361386d82612348565b6001600160a01b031614611f775760405162461bcd60e51b815260206004820152601e60248201527f484f574c3a20796f7520646f6e2774206f776e207468697320746f6b656e00006044820152606401610f1f565b6000818152600260205260408120546001600160a01b031661393c5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610f1f565b600061394783612348565b9050806001600160a01b0316846001600160a01b031614806139825750836001600160a01b03166139778461101d565b6001600160a01b0316145b806139925750613992818561307b565b949350505050565b826001600160a01b03166139ad82612348565b6001600160a01b031614613a155760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610f1f565b6001600160a01b038216613a775760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610f1f565b613a82838383614173565b613a8d60008261377d565b6001600160a01b0383166000908152600360205260408120805460019290613ab690849061557a565b90915550506001600160a01b0382166000908152600360205260408120805460019290613ae4908490615506565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b33613b586006546001600160a01b031690565b6001600160a01b03161480613b7c57503360009081526027602052604090205460ff165b6126455760405162461bcd60e51b81526020600482015260126024820152711213d5d30e881d5b985d5d1a1bdc9a5e995960721b6044820152606401610f1f565b6000613bc882612348565b9050613bd681600084614173565b613be160008361377d565b6001600160a01b0381166000908152600360205260408120805460019290613c0a90849061557a565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b60008383613c70613ceb565b60405160609390931b6bffffffffffffffffffffffff191660208401526034830191909152605482015260740160408051601f1981840301815291905280516020909101209050613cc2826002615551565b600084815260208052604090206101ff1990921660ff91909116179081905561232784846140da565b6000613cf860014361557a565b40919050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b613d5b84848461399a565b613d67848484846141f5565b6123275760405162461bcd60e51b8152600401610f1f90615408565b60008160011660011415613d9957506001919050565b5060011c60ff9081166000908152601c60205260409020541690565b600080613dc3836010615532565b90508360011660011415613de357600184901c901c61ffff169050610f85565b8260081415613df6576000915050610f85565b60ff600185901c166000818152601a602090815260408083206019835281842088855290925290912061ffff600988901c851c166003871480613e395750866004145b80613e445750866005145b8015613e875750603c60648284604051602001613e629291906152ea565b6040516020818303038152906040528051906020012060001c613e859190615613565b115b15613e9a57600095505050505050610f85565b6040805160208082018a90529181018a9052835461ffff8082166060840152601082901c811660808401529281901c831660a083015260301c90911660c082015260009060649060e0016040516020818303038152906040528051906020012060001c613f079190615613565b613f12906001615506565b8454909150600090819061ffff168311613f5757845461ffff1691508460015b601091828204019190066002029054906101000a900461ffff1661ffff169050613fae565b8554613f709061ffff80821691620100009004166154e0565b61ffff168311613f9057845462010000900461ffff169150846002613f32565b5050825461ffff640100000000820481169166010000000000009004165b81613fb9818361557a565b613fc39086615613565b613fcd9190615506565b9b9a5050505050505050505050565b6060816140005750506040805180820190915260018152600360fc1b602082015290565b8160005b811561402a5780614014816155f8565b91506140239050600a8361551e565b9150614004565b60008167ffffffffffffffff8111156140455761404561567f565b6040519080825280601f01601f19166020018201604052801561406f576020820181803683370190505b5090505b84156139925761408460018361557a565b9150614091600a86615613565b61409c906030615506565b60f81b8183815181106140b1576140b1615669565b60200101906001600160f81b031916908160001a9053506140d3600a8661551e565b9450614073565b6121dd828260405180602001604052806000815250614302565b6000614156614150846040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b83614335565b6001600160a01b0316846001600160a01b03161490509392505050565b60008181526021602052604090205415610f345760405162461bcd60e51b815260206004820152603860248201527f484f574c3a2063616e2774207472616e73666572206f72206275726e2077617260448201527f6c6f7264207768696c65206f6e206120636f6e717565737400000000000000006064820152608401610f1f565b60006001600160a01b0384163b156142f757604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061423990339089908890889060040161532f565b602060405180830381600087803b15801561425357600080fd5b505af1925050508015614283575060408051601f3d908101601f1916820190925261428091810190614e02565b60015b6142dd573d8080156142b1576040519150601f19603f3d011682016040523d82523d6000602084013e6142b6565b606091505b5080516142d55760405162461bcd60e51b8152600401610f1f90615408565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050613992565b506001949350505050565b61430c8383614359565b61431960008484846141f5565b610f345760405162461bcd60e51b8152600401610f1f90615408565b600080600061434485856144a7565b9150915061435181614517565b509392505050565b6001600160a01b0382166143af5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610f1f565b6000818152600260205260409020546001600160a01b0316156144145760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610f1f565b61442060008383614173565b6001600160a01b0382166000908152600360205260408120805460019290614449908490615506565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000808251604114156144de5760208301516040840151606085015160001a6144d2878285856146d2565b94509450505050614510565b82516040141561450857602083015160408401516144fd8683836147bf565b935093505050614510565b506000905060025b9250929050565b600081600481111561452b5761452b615653565b14156145345750565b600181600481111561454857614548615653565b14156145965760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610f1f565b60028160048111156145aa576145aa615653565b14156145f85760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610f1f565b600381600481111561460c5761460c615653565b14156146655760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610f1f565b600481600481111561467957614679615653565b1415611f775760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610f1f565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561470957506000905060036147b6565b8460ff16601b1415801561472157508460ff16601c14155b1561473257506000905060046147b6565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015614786573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166147af576000600192509250506147b6565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b016147e0878288856146d2565b935093505050935093915050565b8280546147fa906155bd565b90600052602060002090601f01602090048101928261481c5760008555614862565b82601f106148355782800160ff19823516178555614862565b82800160010185558215614862579182015b82811115614862578235825591602001919060010190614847565b5061486e929150614a03565b5090565b82600381019282156148625791602002820182811115614862578235825591602001919060010190614847565b60405180604001604052806002905b6148b6614a18565b8152602001906001900390816148ae5790505090565b6001830191839082156148625791602002820160005b8382111561492257835183826101000a81548161ffff021916908361ffff16021790555092602001926002016020816001010492830192600103026148e2565b80156149505782816101000a81549061ffff0219169055600201602081600101049283019260010302614922565b505061486e929150614a03565b6040805161012081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810182905261010081019190915290565b6001830191839082156148625791602002820160005b8382111561492257833561ffff1683826101000a81548161ffff021916908361ffff16021790555092602001926002016020816001010492830192600103026149bf565b5b8082111561486e5760008155600101614a04565b60405180606001604052806003906020820280368337509192915050565b600067ffffffffffffffff80841115614a5157614a5161567f565b604051601f8501601f19908116603f01168101908282118183101715614a7957614a7961567f565b81604052809350858152868686011115614a9257600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114614ac357600080fd5b919050565b8060808101831015610f8557600080fd5b806101008101831015610f8557600080fd5b8060608101831015610f8557600080fd5b80358015158114614ac357600080fd5b60008083601f840112614b1e57600080fd5b50813567ffffffffffffffff811115614b3657600080fd5b60208301915083602082850101111561451057600080fd5b803561ffff81168114614ac357600080fd5b600060208284031215614b7257600080fd5b614b7b82614aac565b9392505050565b60008060408385031215614b9557600080fd5b614b9e83614aac565b9150614bac60208401614aac565b90509250929050565b600080600060608486031215614bca57600080fd5b614bd384614aac565b9250614be160208501614aac565b9150604084013590509250925092565b60008060008060808587031215614c0757600080fd5b614c1085614aac565b9350614c1e60208601614aac565b925060408501359150606085013567ffffffffffffffff811115614c4157600080fd5b8501601f81018713614c5257600080fd5b614c6187823560208401614a36565b91505092959194509250565b60008060408385031215614c8057600080fd5b614c8983614aac565b9150614bac60208401614afc565b60008060408385031215614caa57600080fd5b614cb383614aac565b946020939093013593505050565b60008060006101408486031215614cd757600080fd5b614ce084614aac565b925060208401359150614cf68560408601614ad9565b90509250925092565b60008060008060008060008060006101008a8c031215614d1e57600080fd5b614d278a614aac565b985060208a0135975060408a0135965060608a01359550614d4a60808b01614afc565b9450614d5860a08b01614afc565b935060c08a0135925060e08a013567ffffffffffffffff811115614d7b57600080fd5b614d878c828d01614b0c565b915080935050809150509295985092959850929598565b60008060c08385031215614db157600080fd5b614dbb8484614aeb565b9150614bac8460608501614aeb565b600060208284031215614ddc57600080fd5b614b7b82614afc565b600060208284031215614df757600080fd5b8135614b7b81615695565b600060208284031215614e1457600080fd5b8151614b7b81615695565b60008060208385031215614e3257600080fd5b823567ffffffffffffffff811115614e4957600080fd5b614e5585828601614b0c565b90969095509350505050565b600060208284031215614e7357600080fd5b813567ffffffffffffffff811115614e8a57600080fd5b8201601f81018413614e9b57600080fd5b61399284823560208401614a36565b600060208284031215614ebc57600080fd5b614b7b82614b4e565b600060208284031215614ed757600080fd5b5035919050565b60008060008060008060008060006104208a8c031215614efd57600080fd5b89359850614f0e8b60208c01614ac8565b9750614f1d8b60a08c01614ac8565b9650614f2d8b6101208c01614ac8565b9550614f3d8b6101a08c01614ac8565b9450614f4d8b6102208c01614ac8565b9350614f5d8b6102a08c01614ac8565b9250614f6d8b6103208c01614ac8565b9150614f7d8b6103a08c01614ac8565b90509295985092959850929598565b60008060408385031215614f9f57600080fd5b82359150614bac60208401614afc565b600080600060408486031215614fc457600080fd5b83359250602084013567ffffffffffffffff811115614fe257600080fd5b614fee86828701614b0c565b9497909650939450505050565b60008060006060848603121561501057600080fd5b8335925061502060208501614b4e565b9150614cf660408501614b4e565b6000806040838503121561504157600080fd5b50508035926020909101359150565b6000806000610140848603121561506657600080fd5b8335925060208401359150614cf68560408601614ad9565b60008060006060848603121561509357600080fd5b505081359360208301359350604090920135919050565b600081518084526150c2816020860160208601615591565b601f01601f19169290920160200192915050565b600081516150e8818560208601615591565b9290920192915050565b8183823760009101908152919050565b60008251615114818460208701615591565b9190910192915050565b6000875160206151318285838d01615591565b8851918401916151448184848d01615591565b88519201916151568184848c01615591565b87519201916151688184848b01615591565b865192019161517a8184848a01615591565b855192019161518c8184848901615591565b919091019998505050505050505050565b6000885160206151b08285838e01615591565b8951918401916151c38184848e01615591565b89519201916151d58184848d01615591565b88519201916151e78184848c01615591565b87519201916151f98184848b01615591565b865192019161520b8184848a01615591565b855192019161521d8184848901615591565b919091019a9950505050505050505050565b600080865481600182811c91508083168061524b57607f831692505b602080841082141561526b57634e487b7160e01b86526022600452602486fd5b81801561527f5760018114615290576152bd565b60ff198616895284890196506152bd565b60008d81526020902060005b868110156152b55781548b82015290850190830161529c565b505084890196505b5050505050506152df6152d96152d383896150d6565b876150d6565b856150d6565b979650505050505050565b8281526153266020820183805461ffff8082168452808260101c166020850152808260201c166040850152808260301c16606085015250505050565b60a00192915050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090615362908301846150aa565b9695505050505050565b60c0810181836000805b60028110156153bc57825184835b60038110156153a3578251825260209283019290910190600101615384565b5050506060939093019260209290920191600101615376565b5050505092915050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b602081526000614b7b60208301846150aa565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b600061ffff8083168185168083038211156154fd576154fd615627565b01949350505050565b6000821982111561551957615519615627565b500190565b60008261552d5761552d61563d565b500490565b600081600019048311821515161561554c5761554c615627565b500290565b600060ff821660ff84168160ff048111821515161561557257615572615627565b029392505050565b60008282101561558c5761558c615627565b500390565b60005b838110156155ac578181015183820152602001615594565b838111156123275750506000910152565b600181811c908216806155d157607f821691505b602082108114156155f257634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561560c5761560c615627565b5060010190565b6000826156225761562261563d565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114611f7757600080fdfea2646970667358221220b39d71f0aff5e36872c46341d06f6ee4b38fe1143dbe6925e95ec440dce6527464736f6c63430008070033

Deployed Bytecode

0x6080604052600436106104675760003560e01c80636352211e1161024a578063a22cb46511610139578063d21f4b94116100b6578063f2fde38b1161007a578063f2fde38b14610e6c578063f3fdf37514610e8c578063f48ccdcc14610ea2578063f8f8dbf814610ec2578063f964f49b14610ed557600080fd5b8063d21f4b9414610dbf578063e8c75a3014610ddf578063e985e9c514610dff578063ed02c52b14610e1f578063ede0fe0514610e3f57600080fd5b8063bc1a481e116100fd578063bc1a481e14610d2a578063c87b56dd14610d3f578063cb1f4b5814610d5f578063cd53594814610d7f578063d077076d14610d9f57600080fd5b8063a22cb46514610c0e578063b37aa25314610c2e578063b88d4fde14610c4e578063ba079a8d14610c6e578063ba64c7d614610d0a57600080fd5b80638228eac1116101c75780638e825be01161018b5780638e825be014610b945780639416647114610bb457806395d89b4114610bcb578063988acb9614610be0578063a213040a14610bf757600080fd5b80638228eac114610b025780638367e12014610b225780638937461314610b375780638d1f68b314610b575780638da5cb5b14610b7657600080fd5b8063715018a61161020e578063715018a614610a4d578063755ae95314610a6257806375f1baf214610a9a578063778ef1fa14610aba57806381d063e214610acf57600080fd5b80636352211e146109ad57806364e9aae2146109cd578063659202c3146109ed5780636c19e78314610a0d57806370a0823114610a2d57600080fd5b80632f72d8f211610366578063453c6696116102e35780634b0bddd2116102a75780634b0bddd214610911578063523cefe1146109315780635b8926911461094b57806360196a651461096d578063609baf9f1461098d57600080fd5b8063453c66961461087b5780634875bccb1461089b57806348f5c144146108ae57806348f95765146108ce5780634aa4746e146108e457600080fd5b80633ccfd60b1161032a5780633ccfd60b146107c6578063410a467f146107db57806342842e0e1461080b57806342966c681461082b578063429b62e51461084b57600080fd5b80632f72d8f2146107365780632f76b18814610756578063332b73ba14610776578063342aab121461078c5780633548d0d2146107a657600080fd5b80630f77e8a0116103f4578063217c4a0a116103b8578063217c4a0a1461067b578063238ac933146106b657806323b872dd146106d65780632ac85965146106f65780632b3b3df51461071657600080fd5b80630f77e8a0146105eb5780631325b5271461060b57806313270de314610625578063190c7e99146106455780631de010a71461065b57600080fd5b8063081812fc1161043b578063081812fc1461050957806308a887b114610541578063095ea7b3146105715780630b86d730146105915780630e281fec146105be57600080fd5b80620cbb211461046c57806301ffc9a71461048e57806302d81a12146104c357806306fdde03146104e7575b600080fd5b34801561047857600080fd5b5061048c610487366004614e1f565b610ef5565b005b34801561049a57600080fd5b506104ae6104a9366004614de5565b610f39565b60405190151581526020015b60405180910390f35b3480156104cf57600080fd5b506104d9600a5481565b6040519081526020016104ba565b3480156104f357600080fd5b506104fc610f8b565b6040516104ba91906153f5565b34801561051557600080fd5b50610529610524366004614ec5565b61101d565b6040516001600160a01b0390911681526020016104ba565b34801561054d57600080fd5b506104ae61055c366004614b60565b60256020526000908152604090205460ff1681565b34801561057d57600080fd5b5061048c61058c366004614c97565b6110b2565b34801561059d57600080fd5b506104d96105ac366004614ec5565b601e6020526000908152604090205481565b3480156105ca57600080fd5b506104d96105d9366004614ec5565b60216020526000908152604090205481565b3480156105f757600080fd5b5061048c610606366004614cc1565b6111c3565b34801561061757600080fd5b50600b546104ae9060ff1681565b34801561063157600080fd5b5061048c610640366004614faf565b61148b565b34801561065157600080fd5b506104d96122b881565b34801561066757600080fd5b50601854610529906001600160a01b031681565b34801561068757600080fd5b506104ae610696366004614e61565b805160208183018101805160248252928201919093012091525460ff1681565b3480156106c257600080fd5b50601754610529906001600160a01b031681565b3480156106e257600080fd5b5061048c6106f1366004614bb5565b6116da565b34801561070257600080fd5b506104fc610711366004614ec5565b61170c565b34801561072257600080fd5b5061048c61073136600461502e565b6117a6565b34801561074257600080fd5b506104d9610751366004614ec5565b6117d8565b34801561076257600080fd5b5061048c610771366004615050565b611938565b34801561078257600080fd5b506104d960125481565b34801561079857600080fd5b506026546104ae9060ff1681565b3480156107b257600080fd5b5061048c6107c1366004614b60565b611ec8565b3480156107d257600080fd5b5061048c611f14565b3480156107e757600080fd5b506104ae6107f6366004614ec5565b601c6020526000908152604090205460ff1681565b34801561081757600080fd5b5061048c610826366004614bb5565b611f7a565b34801561083757600080fd5b5061048c610846366004614ec5565b611f95565b34801561085757600080fd5b506104ae610866366004614b60565b60276020526000908152604090205460ff1681565b34801561088757600080fd5b5061048c61089636600461502e565b61200c565b61048c6108a9366004614ec5565b61201f565b3480156108ba57600080fd5b5061048c6108c9366004614d9e565b6121e1565b3480156108da57600080fd5b506104d960135481565b3480156108f057600080fd5b506104d96108ff366004614ec5565b601b6020526000908152604090205481565b34801561091d57600080fd5b5061048c61092c366004614c6d565b612204565b34801561093d57600080fd5b506014546104ae9060ff1681565b34801561095757600080fd5b50610960612259565b6040516104ba919061536c565b34801561097957600080fd5b5061048c610988366004614ffb565b6122ba565b34801561099957600080fd5b5061048c6109a8366004614dca565b61232d565b3480156109b957600080fd5b506105296109c8366004614ec5565b612348565b3480156109d957600080fd5b5061048c6109e8366004614ec5565b6123bf565b3480156109f957600080fd5b5061048c610a08366004614ec5565b61241d565b348015610a1957600080fd5b5061048c610a28366004614b60565b61253e565b348015610a3957600080fd5b506104d9610a48366004614b60565b61258a565b348015610a5957600080fd5b5061048c612611565b348015610a6e57600080fd5b506104d9610a7d366004614c97565b601f60209081526000928352604080842090915290825290205481565b348015610aa657600080fd5b5061048c610ab5366004614c6d565b612647565b348015610ac657600080fd5b5061048c6126ac565b348015610adb57600080fd5b50610aef610aea36600461507e565b6126e5565b60405161ffff90911681526020016104ba565b348015610b0e57600080fd5b50600b546104ae9062010000900460ff1681565b348015610b2e57600080fd5b506104fc61272f565b348015610b4357600080fd5b5061048c610b52366004614f8c565b61273c565b348015610b6357600080fd5b50600b546104ae90610100900460ff1681565b348015610b8257600080fd5b506006546001600160a01b0316610529565b348015610ba057600080fd5b5061048c610baf366004614c97565b612780565b348015610bc057600080fd5b506008546104d99081565b348015610bd757600080fd5b506104fc612804565b348015610bec57600080fd5b506009546104d99081565b348015610c0357600080fd5b506007546104d99081565b348015610c1a57600080fd5b5061048c610c29366004614c6d565b612813565b348015610c3a57600080fd5b5061048c610c49366004614dca565b6128d8565b348015610c5a57600080fd5b5061048c610c69366004614bf1565b6128fa565b348015610c7a57600080fd5b50610c8e610c89366004614ec5565b61292c565b6040516104ba9190815161ffff908116825260208084015182169083015260408084015182169083015260608084015182169083015260808084015182169083015260a08084015182169083015260c08084015182169083015260e0808401518216908301526101009283015116918101919091526101200190565b348015610d1657600080fd5b5061048c610d25366004614ec5565b612a62565b348015610d3657600080fd5b506104fc612a91565b348015610d4b57600080fd5b506104fc610d5a366004614ec5565b612a9e565b348015610d6b57600080fd5b5061048c610d7a366004614ede565b612d35565b348015610d8b57600080fd5b5061048c610d9a366004614b60565b612e9b565b348015610dab57600080fd5b50610aef610dba36600461502e565b612fe4565b348015610dcb57600080fd5b5061048c610dda366004614dca565b613021565b348015610deb57600080fd5b5061048c610dfa366004614e1f565b613045565b348015610e0b57600080fd5b506104ae610e1a366004614b82565b61307b565b348015610e2b57600080fd5b506104ae610e3a366004614c97565b6130a9565b348015610e4b57600080fd5b506104d9610e5a366004614ec5565b601d6020526000908152604090205481565b348015610e7857600080fd5b5061048c610e87366004614b60565b613181565b348015610e9857600080fd5b506104d961037881565b348015610eae57600080fd5b5061048c610ebd366004614ec5565b613219565b61048c610ed0366004614cff565b6132d8565b348015610ee157600080fd5b5061048c610ef0366004614ec5565b6136ad565b6006546001600160a01b03163314610f285760405162461bcd60e51b8152600401610f1f9061545a565b60405180910390fd5b610f34601583836147ee565b505050565b60006001600160e01b031982166380ac58cd60e01b1480610f6a57506001600160e01b03198216635b5e139f60e01b145b80610f8557506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060008054610f9a906155bd565b80601f0160208091040260200160405190810160405280929190818152602001828054610fc6906155bd565b80156110135780601f10610fe857610100808354040283529160200191611013565b820191906000526020600020905b815481529060010190602001808311610ff657829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166110965760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610f1f565b506000908152600460205260409020546001600160a01b031690565b60006110bd82612348565b9050806001600160a01b0316836001600160a01b0316141561112b5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610f1f565b336001600160a01b03821614806111475750611147813361307b565b6111b95760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610f1f565b610f34838361377d565b3360009081526025602052604090205460ff166112175760405162461bcd60e51b81526020600482015260126024820152711213d5d30e881d5b985d5d1a1bdc9a5e995960721b6044820152606401610f1f565b826001600160a01b031661122a83612348565b6001600160a01b0316146112805760405162461bcd60e51b815260206004820152601e60248201527f484f574c3a20796f7520646f6e2774206f776e207468697320746f6b656e00006044820152606401610f1f565b600061128b8361292c565b905061129a6020830183614eaa565b61ffff16156112b5576112b06020830183614eaa565b6112b8565b80515b61ffff1681526112ce6040830160208401614eaa565b61ffff16156112ec576112e76040830160208401614eaa565b6112f2565b80602001515b61ffff16602082015261130b6060830160408401614eaa565b61ffff1615611329576113246060830160408401614eaa565b61132f565b80604001515b61ffff1660408201526113486080830160608401614eaa565b61ffff1615611366576113616080830160608401614eaa565b61136c565b80606001515b61ffff16606082015261138560a0830160808401614eaa565b61ffff16156113a35761139e60a0830160808401614eaa565b6113a9565b80608001515b61ffff1660808201526113c260c0830160a08401614eaa565b61ffff16156113e0576113db60c0830160a08401614eaa565b6113e6565b8060a001515b61ffff1660a08201526113ff60e0830160c08401614eaa565b61ffff161561141d5761141860e0830160c08401614eaa565b611423565b8060c001515b61ffff1660c082015261143d610100830160e08401614eaa565b61ffff161561145c57611457610100830160e08401614eaa565b611462565b8060e001515b61ffff1660e0820152611474816137eb565b600093845260208052604090932092909255505050565b8261149581613863565b602483836040516114a79291906150f2565b9081526040519081900360200190205460ff16156115075760405162461bcd60e51b815260206004820152601e60248201527f484f574c3a2074686973206e616d6520686173206265656e2074616b656e00006044820152606401610f1f565b60185460405163b4638cc160e01b815233600482015260fa60248201526001600160a01b039091169063b4638cc190604401600060405180830381600087803b15801561155357600080fd5b505af1158015611567573d6000803e3d6000fd5b5050506000858152602360205260408120805491925090611587906155bd565b80601f01602080910402602001604051908101604052809291908181526020018280546115b3906155bd565b80156116005780601f106115d557610100808354040283529160200191611600565b820191906000526020600020905b8154815290600101906020018083116115e357829003601f168201915b505050505090506000815111156116445760006024826040516116239190615102565b908152604051908190036020019020805491151560ff199092169190911790555b600085815260236020526040902061165d9085856147ee565b508215611699576001602485856040516116789291906150f2565b908152604051908190036020019020805491151560ff199092169190911790555b847f7e632a301794d8d4a81ea7e20f37d1947158d36e66403af04ba85dd194b66f1b85856040516116cb9291906153c6565b60405180910390a25050505050565b6116e5335b826138c3565b6117015760405162461bcd60e51b8152600401610f1f9061548f565b610f3483838361399a565b60236020526000908152604090208054611725906155bd565b80601f0160208091040260200160405190810160405280929190818152602001828054611751906155bd565b801561179e5780601f106117735761010080835404028352916020019161179e565b820191906000526020600020905b81548152906001019060200180831161178157829003601f168201915b505050505081565b6117ae613b45565b6000818152601b6020526040902054156117c757600080fd5b6000908152601b6020526040902055565b6000818152602160205260408120548061183f5760405162461bcd60e51b815260206004820152602260248201527f484f574c3a207761726c6f7264206973206e6f74206f6e206120636f6e7175656044820152611cdd60f21b6064820152608401610f1f565b6000603c806018611850854261557a565b61185a919061551e565b611864919061551e565b61186e919061551e565b60408051606081019182905291925060009190600f9060039082845b81548152602001906001019080831161188a5750506040805160608101918290529495506000949350600c92506003915082845b8154815260200190600101908083116118be5750505050509050816002600381106118eb576118eb615669565b60200201518310611909578060025b60200201519695505050505050565b6020820151831061191c578060016118fa565b8151831061192c578060006118fa565b50600095945050505050565b8261194281613863565b8261194c81613863565b6018546001600160a01b03161580159061196d5750600b54610100900460ff165b6119b95760405162461bcd60e51b815260206004820152601b60248201527f484f574c3a2073657070756b75206973206e6f742061637469766500000000006044820152606401610f1f565b60006119c48661292c565b905060006119d18661292c565b825190915061ffff166119e76020870187614eaa565b61ffff161480611a0b5750805161ffff16611a056020870187614eaa565b61ffff16145b8015611a59575060208281015161ffff1690611a2d9060408801908801614eaa565b61ffff161480611a59575060208181015161ffff1690611a539060408801908801614eaa565b61ffff16145b8015611aa7575060408281015161ffff1690611a7b9060608801908801614eaa565b61ffff161480611aa7575060408181015161ffff1690611aa19060608801908801614eaa565b61ffff16145b8015611af5575060608281015161ffff1690611ac99060808801908801614eaa565b61ffff161480611af5575060608181015161ffff1690611aef9060808801908801614eaa565b61ffff16145b8015611b43575060808281015161ffff1690611b179060a08801908801614eaa565b61ffff161480611b43575060808181015161ffff1690611b3d9060a08801908801614eaa565b61ffff16145b8015611b91575060a08281015161ffff1690611b659060c08801908801614eaa565b61ffff161480611b91575060a08181015161ffff1690611b8b9060c08801908801614eaa565b61ffff16145b8015611bdf575060c08281015161ffff1690611bb39060e08801908801614eaa565b61ffff161480611bdf575060c08181015161ffff1690611bd99060e08801908801614eaa565b61ffff16145b8015611c2f575060e08281015161ffff1690611c02906101008801908801614eaa565b61ffff161480611c2f575060e08181015161ffff1690611c29906101008801908801614eaa565b61ffff16145b611c7b5760405162461bcd60e51b815260206004820152601f60248201527f484f574c3a20696e76616c69642070726f7065727479207472616e73666572006044820152606401610f1f565b611c8486613bbd565b60185460135461010083810151908501516001600160a01b03909316926340c10f199233929091611cb591906154e0565b61ffff16611cc39190615532565b601254611cd09190615506565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015611d1657600080fd5b505af1158015611d2a573d6000803e3d6000fd5b50505050611e4b60405180610120016040528087600060088110611d5057611d50615669565b602002016020810190611d639190614eaa565b61ffff168152602090810190611d7f9060408a01908a01614eaa565b61ffff168152602001611d986060890160408a01614eaa565b61ffff168152602001611db16080890160608a01614eaa565b61ffff168152602001611dca60a0890160808a01614eaa565b61ffff168152602001611de360c0890160a08a01614eaa565b61ffff168152602001611dfc60e0890160c08a01614eaa565b61ffff168152602001611e16610100890160e08a01614eaa565b61ffff168152602001836101000151856101000151611e3591906154e0565b611e409060016154e0565b61ffff1690526137eb565b6000888152602080526040902055600754611e67816001615506565b336000818152601f602090815260408083208c84528252918290209390935580518b81529283018a905283927ff428ac5d321cb28d0fa951fe0bc5411a8caad77ff67b6beffa1c8c26f7110aa9910160405180910390a35050505050505050565b6006546001600160a01b03163314611ef25760405162461bcd60e51b8152600401610f1f9061545a565b601880546001600160a01b0319166001600160a01b0392909216919091179055565b6006546001600160a01b03163314611f3e5760405162461bcd60e51b8152600401610f1f9061545a565b6006546040516001600160a01b03909116904780156108fc02916000818181858888f19350505050158015611f77573d6000803e3d6000fd5b50565b610f34838383604051806020016040528060008152506128fa565b611f9e336116df565b6120035760405162461bcd60e51b815260206004820152603060248201527f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760448201526f1b995c881b9bdc88185c1c1c9bdd995960821b6064820152608401610f1f565b611f7781613bbd565b612014613b45565b601291909155601355565b600b5460ff166120715760405162461bcd60e51b815260206004820152601860248201527f484f574c3a2073616c65206973206e6f742061637469766500000000000000006044820152606401610f1f565b600a8111156120dc5760405162461bcd60e51b815260206004820152603160248201527f484f574c3a2063616e277420636c61696d206d6f7265207468616e2031302069604482015270371037b732903a3930b739b0b1ba34b7b760791b6064820152608401610f1f565b80600a546120ea9190615532565b3410156121395760405162461bcd60e51b815260206004820152601b60248201527f484f574c3a206e6f7420656e6f7567682066756e64732073656e7400000000006044820152606401610f1f565b6122b88161214660085490565b6121509190615506565b111561219e5760405162461bcd60e51b815260206004820181905260248201527f484f574c3a2065786365656473206d61782067656e6573697320737570706c796044820152606401610f1f565b60005b818110156121dd576121b7600880546001019055565b6121cb336121c460085490565b6000613c64565b806121d5816155f8565b9150506121a1565b5050565b6121e9613b45565b6121f6600c836003614872565b50610f34600f826003614872565b6006546001600160a01b0316331461222e5760405162461bcd60e51b8152600401610f1f9061545a565b6001600160a01b03919091166000908152602760205260409020805460ff1916911515919091179055565b61226161489f565b6040805160a081018252600c54818301908152600d54606080840191909152600e546080840152908252825190810190925290602082019080600f60000154815260105460208201526011546040909101529052919050565b6122c2613b45565b6000838152601c602052604090205460ff16156122de57600080fd5b8061ffff168261ffff16116122f257600080fd5b60408051808201825261ffff808516825283166020808301919091526000868152601a909152919091206123279160026148cc565b50505050565b612335613b45565b600b805460ff1916911515919091179055565b6000818152600260205260408120546001600160a01b031680610f855760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610f1f565b6123c7613b45565b600b54610100900460ff16156123dc57600080fd5b6123ea600780546001019055565b60006123f560075490565b90506123ff613ceb565b6000918252601d6020908152604080842092909255601e9052902055565b8061242781613863565b600b5462010000900460ff1661247f5760405162461bcd60e51b815260206004820152601c60248201527f484f574c3a20636f6e717565737473206172652064697361626c6564000000006044820152606401610f1f565b600082815260216020526040902054156124eb5760405162461bcd60e51b815260206004820152602760248201527f484f574c3a2063757272656e7420636f6e7175657374206861736e277420656e604482015266191959081e595d60ca1b6064820152608401610f1f565b600082815260216020526040908190204290819055905183917f16969204e93ac0883a00b75197329a0e647874c02f5662266351d040c303f2809161253291815260200190565b60405180910390a25050565b6006546001600160a01b031633146125685760405162461bcd60e51b8152600401610f1f9061545a565b601780546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160a01b0382166125f55760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610f1f565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b0316331461263b5760405162461bcd60e51b8152600401610f1f9061545a565b6126456000613cfe565b565b6006546001600160a01b031633146126715760405162461bcd60e51b8152600401610f1f9061545a565b60265460ff161561268157600080fd5b6001600160a01b03919091166000908152602560205260409020805460ff1916911515919091179055565b6006546001600160a01b031633146126d65760405162461bcd60e51b8152600401610f1f9061545a565b6026805460ff19166001179055565b6019602052826000526040600020602052816000526040600020816004811061270d57600080fd5b6010918282040191900660020292509250509054906101000a900461ffff1681565b60168054611725906155bd565b612744613b45565b6000828152601c602052604090205460ff161561276057600080fd5b6000918252601c6020526040909120805460ff1916911515919091179055565b6006546001600160a01b031633146127aa5760405162461bcd60e51b8152600401610f1f9061545a565b610378816127b760095490565b6127c19190615506565b11156127cc57600080fd5b60005b81811015610f34576127e5600980546001019055565b6127f2836121c460095490565b806127fc816155f8565b9150506127cf565b606060018054610f9a906155bd565b6001600160a01b03821633141561286c5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610f1f565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6128e0613b45565b600b80549115156101000261ff0019909216919091179055565b61290433836138c3565b6129205760405162461bcd60e51b8152600401610f1f9061548f565b61232784848484613d50565b61293461495d565b600082815260208052604090205461294b81613d83565b6129a15760405162461bcd60e51b815260206004820152602160248201527f484f574c3a207761726c6f7264206973206e6f742072657665616c65642079656044820152601d60fa1b6064820152608401610f1f565b6129a961495d565b6129b4826000613db5565b61ffff1681526129c5826001613db5565b61ffff1660208201526129d9826002613db5565b61ffff1660408201526129ed826003613db5565b61ffff166060820152612a01826004613db5565b61ffff166080820152612a15826005613db5565b61ffff1660a0820152612a29826006613db5565b61ffff1660c0820152612a3d826007613db5565b61ffff1660e0820152612a51826008613db5565b61ffff166101008201529392505050565b6006546001600160a01b03163314612a8c5760405162461bcd60e51b8152600401610f1f9061545a565b600a55565b60158054611725906155bd565b6000818152600260205260409020546060906001600160a01b0316612b055760405162461bcd60e51b815260206004820152601b60248201527f484f574c3a207761726c6f726420646f65736e277420657869737400000000006044820152606401610f1f565b60168054612b12906155bd565b15905080612b3457506000828152602080526040902054612b3290613d83565b155b15612bcb5760158054612b46906155bd565b80601f0160208091040260200160405190810160405280929190818152602001828054612b72906155bd565b8015612bbf5780601f10612b9457610100808354040283529160200191612bbf565b820191906000526020600020905b815481529060010190602001808311612ba257829003601f168201915b50505050509050919050565b6000612bd68361292c565b6040805180820190915260018152602d60f81b60208201529091506016612bfc85613fdc565b82612c0e856000015161ffff16613fdc565b84612c20876020015161ffff16613fdc565b86612c32896040015161ffff16613fdc565b604051602001612c48979695949392919061519d565b60405160208183030381529060405282612c69856060015161ffff16613fdc565b84612c7b876080015161ffff16613fdc565b86612c8d8960a0015161ffff16613fdc565b604051602001612ca29695949392919061511e565b60405160208183030381529060405283612cc38660c0015161ffff16613fdc565b85612cd58860e0015161ffff16613fdc565b87612ce88a610100015161ffff16613fdc565b604051602001612cfd9695949392919061511e565b60408051601f1981840301815290829052612d1d9493929160200161522f565b60405160208183030381529060405292505050919050565b612d3d613b45565b6000898152601c602052604090205460ff1615612d5957600080fd5b60008981526019602090815260408083208380529091529020612d7e908960046149a9565b506000898152601960209081526040808320600184529091529020612da5908860046149a9565b506000898152601960209081526040808320600284529091529020612dcc908760046149a9565b506000898152601960209081526040808320600384529091529020612df3908660046149a9565b50600089815260196020908152604080832060048085529252909120612e1a9186906149a9565b506000898152601960209081526040808320600584529091529020612e41908460046149a9565b506000898152601960209081526040808320600684529091529020612e68908360046149a9565b506000898152601960209081526040808320600784529091529020612e8f908260046149a9565b50505050505050505050565b6006546001600160a01b03163314612ec55760405162461bcd60e51b8152600401610f1f9061545a565b60145460ff16612ed457600080fd5b6014805460ff1916905561271060015b6009811015610f3457612fba6040518061012001604052808385612f089190615506565b61ffff168152602001612f1b8486615506565b61ffff168152602001612f2e8486615506565b61ffff168152602001612f418486615506565b61ffff168152602001612f548486615506565b61ffff168152602001612f678486615506565b61ffff168152602001612f7a8486615506565b61ffff1681526020016004841115612f9c57612f97856002615506565b612fa7565b612fa7856001615506565b61ffff16815260006020909101526137eb565b6000828152602080526040902055612fd283826140da565b80612fdc816155f8565b915050612ee4565b601a602052816000526040600020816002811061300057600080fd5b60109182820401919006600202915091509054906101000a900461ffff1681565b613029613b45565b600b8054911515620100000262ff000019909216919091179055565b6006546001600160a01b0316331461306f5760405162461bcd60e51b8152600401610f1f9061545a565b610f34601683836147ee565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6000806130b560075490565b6001600160a01b0385166000908152601f602090815260408083208784529091529020549091508015806130e95750818114155b156130f957600092505050610f85565b6000828152601d6020526040902054806131195760009350505050610f85565b6000838152601e60209081526040918290205482519182018890529181018390526064906060016040516020818303038152906040528051906020012060001c6131639190615613565b11156131755760009350505050610f85565b50600195945050505050565b6006546001600160a01b031633146131ab5760405162461bcd60e51b8152600401610f1f9061545a565b6001600160a01b0381166132105760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610f1f565b611f7781613cfe565b61322333826130a9565b61327b5760405162461bcd60e51b815260206004820152602360248201527f484f574c3a207761726c6f72642063616e6e6f742062652072657375727265636044820152621d195960ea1b6064820152608401610f1f565b336000818152601f60209081526040808320858452909152812055600754906132a5908383613c64565b6040518190339084907fe78b1a4d61d8e84ed36ddb3bf5ba09cd497312889adfa18db97b598984c07c5e90600090a45050565b6040516bffffffffffffffffffffffff1960608b901b16602082015260348101899052605481018890526074810187905285151560f890811b6094830152851515901b609582015260009060960160408051601f198184030181528282528051602091820120601754601f87018390048302850183019093528584529350613388926001600160a01b0390921691849187908790819084018382808284376000920191909152506140f492505050565b6133d45760405162461bcd60e51b815260206004820152601760248201527f484f574c3a20696e76616c6964207369676e61747572650000000000000000006044820152606401610f1f565b6000818152602260205260408120546133ee908690615506565b9050898111156134405760405162461bcd60e51b815260206004820152601a60248201527f484f574c3a206578636565647320617070726f766564207174790000000000006044820152606401610f1f565b6000828152602260205260408120805487929061345e908490615506565b909155505060408051808201909152601b81527f484f574c3a206e6f7420656e6f7567682066756e64732073656e7400000000006020820152818b1480156134a35750875b156134e5576134b360018761557a565b6134bd908b615532565b34101581906134df5760405162461bcd60e51b8152600401610f1f91906153f5565b50613513565b6134ef868b615532565b34101581906135115760405162461bcd60e51b8152600401610f1f91906153f5565b505b86156135bc576103788661352660095490565b6135309190615506565b111561357e5760405162461bcd60e51b815260206004820152601c60248201527f484f574c3a2065786365656473207265736572766520737570706c79000000006044820152606401610f1f565b60005b868110156135b657613597600980546001019055565b6135a48d6121c460095490565b806135ae816155f8565b915050613581565b5061365b565b6122b8866135c960085490565b6135d39190615506565b11156136215760405162461bcd60e51b815260206004820181905260248201527f484f574c3a2065786365656473206d61782067656e6573697320737570706c796044820152606401610f1f565b60005b868110156136595761363a600880546001019055565b6136478d6121c460085490565b80613651816155f8565b915050613624565b505b888c6001600160a01b03167f7f8116dee4dcad7a6847ed8d84779ab3ba76e1385bc9251da7b521e7c2e7cc2d8860405161369791815260200190565b60405180910390a3505050505050505050505050565b806136b781613863565b60006136c2836117d8565b6000848152602160205260408120559050801561373e576018546040516340c10f1960e01b8152336004820152602481018390526001600160a01b03909116906340c10f1990604401600060405180830381600087803b15801561372557600080fd5b505af1158015613739573d6000803e3d6000fd5b505050505b827fa60c8988092734348c58663db7e00d274c64fe99a387b97a88ee2febbac50de18260405161377091815260200190565b60405180910390a2505050565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906137b282612348565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b61010081015160e082015160c083015160a08401516080850151606086015160408701516020880151975161ffff9081169881169181169281169381169481169581169616601097881b63ffff00001617871b95909517861b93909317851b91909117841b17831b17821b17901b17600190811b1790565b3361386d82612348565b6001600160a01b031614611f775760405162461bcd60e51b815260206004820152601e60248201527f484f574c3a20796f7520646f6e2774206f776e207468697320746f6b656e00006044820152606401610f1f565b6000818152600260205260408120546001600160a01b031661393c5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610f1f565b600061394783612348565b9050806001600160a01b0316846001600160a01b031614806139825750836001600160a01b03166139778461101d565b6001600160a01b0316145b806139925750613992818561307b565b949350505050565b826001600160a01b03166139ad82612348565b6001600160a01b031614613a155760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610f1f565b6001600160a01b038216613a775760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610f1f565b613a82838383614173565b613a8d60008261377d565b6001600160a01b0383166000908152600360205260408120805460019290613ab690849061557a565b90915550506001600160a01b0382166000908152600360205260408120805460019290613ae4908490615506565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b33613b586006546001600160a01b031690565b6001600160a01b03161480613b7c57503360009081526027602052604090205460ff165b6126455760405162461bcd60e51b81526020600482015260126024820152711213d5d30e881d5b985d5d1a1bdc9a5e995960721b6044820152606401610f1f565b6000613bc882612348565b9050613bd681600084614173565b613be160008361377d565b6001600160a01b0381166000908152600360205260408120805460019290613c0a90849061557a565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b60008383613c70613ceb565b60405160609390931b6bffffffffffffffffffffffff191660208401526034830191909152605482015260740160408051601f1981840301815291905280516020909101209050613cc2826002615551565b600084815260208052604090206101ff1990921660ff91909116179081905561232784846140da565b6000613cf860014361557a565b40919050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b613d5b84848461399a565b613d67848484846141f5565b6123275760405162461bcd60e51b8152600401610f1f90615408565b60008160011660011415613d9957506001919050565b5060011c60ff9081166000908152601c60205260409020541690565b600080613dc3836010615532565b90508360011660011415613de357600184901c901c61ffff169050610f85565b8260081415613df6576000915050610f85565b60ff600185901c166000818152601a602090815260408083206019835281842088855290925290912061ffff600988901c851c166003871480613e395750866004145b80613e445750866005145b8015613e875750603c60648284604051602001613e629291906152ea565b6040516020818303038152906040528051906020012060001c613e859190615613565b115b15613e9a57600095505050505050610f85565b6040805160208082018a90529181018a9052835461ffff8082166060840152601082901c811660808401529281901c831660a083015260301c90911660c082015260009060649060e0016040516020818303038152906040528051906020012060001c613f079190615613565b613f12906001615506565b8454909150600090819061ffff168311613f5757845461ffff1691508460015b601091828204019190066002029054906101000a900461ffff1661ffff169050613fae565b8554613f709061ffff80821691620100009004166154e0565b61ffff168311613f9057845462010000900461ffff169150846002613f32565b5050825461ffff640100000000820481169166010000000000009004165b81613fb9818361557a565b613fc39086615613565b613fcd9190615506565b9b9a5050505050505050505050565b6060816140005750506040805180820190915260018152600360fc1b602082015290565b8160005b811561402a5780614014816155f8565b91506140239050600a8361551e565b9150614004565b60008167ffffffffffffffff8111156140455761404561567f565b6040519080825280601f01601f19166020018201604052801561406f576020820181803683370190505b5090505b84156139925761408460018361557a565b9150614091600a86615613565b61409c906030615506565b60f81b8183815181106140b1576140b1615669565b60200101906001600160f81b031916908160001a9053506140d3600a8661551e565b9450614073565b6121dd828260405180602001604052806000815250614302565b6000614156614150846040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b83614335565b6001600160a01b0316846001600160a01b03161490509392505050565b60008181526021602052604090205415610f345760405162461bcd60e51b815260206004820152603860248201527f484f574c3a2063616e2774207472616e73666572206f72206275726e2077617260448201527f6c6f7264207768696c65206f6e206120636f6e717565737400000000000000006064820152608401610f1f565b60006001600160a01b0384163b156142f757604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061423990339089908890889060040161532f565b602060405180830381600087803b15801561425357600080fd5b505af1925050508015614283575060408051601f3d908101601f1916820190925261428091810190614e02565b60015b6142dd573d8080156142b1576040519150601f19603f3d011682016040523d82523d6000602084013e6142b6565b606091505b5080516142d55760405162461bcd60e51b8152600401610f1f90615408565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050613992565b506001949350505050565b61430c8383614359565b61431960008484846141f5565b610f345760405162461bcd60e51b8152600401610f1f90615408565b600080600061434485856144a7565b9150915061435181614517565b509392505050565b6001600160a01b0382166143af5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610f1f565b6000818152600260205260409020546001600160a01b0316156144145760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610f1f565b61442060008383614173565b6001600160a01b0382166000908152600360205260408120805460019290614449908490615506565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000808251604114156144de5760208301516040840151606085015160001a6144d2878285856146d2565b94509450505050614510565b82516040141561450857602083015160408401516144fd8683836147bf565b935093505050614510565b506000905060025b9250929050565b600081600481111561452b5761452b615653565b14156145345750565b600181600481111561454857614548615653565b14156145965760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610f1f565b60028160048111156145aa576145aa615653565b14156145f85760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610f1f565b600381600481111561460c5761460c615653565b14156146655760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610f1f565b600481600481111561467957614679615653565b1415611f775760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610f1f565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561470957506000905060036147b6565b8460ff16601b1415801561472157508460ff16601c14155b1561473257506000905060046147b6565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015614786573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166147af576000600192509250506147b6565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b016147e0878288856146d2565b935093505050935093915050565b8280546147fa906155bd565b90600052602060002090601f01602090048101928261481c5760008555614862565b82601f106148355782800160ff19823516178555614862565b82800160010185558215614862579182015b82811115614862578235825591602001919060010190614847565b5061486e929150614a03565b5090565b82600381019282156148625791602002820182811115614862578235825591602001919060010190614847565b60405180604001604052806002905b6148b6614a18565b8152602001906001900390816148ae5790505090565b6001830191839082156148625791602002820160005b8382111561492257835183826101000a81548161ffff021916908361ffff16021790555092602001926002016020816001010492830192600103026148e2565b80156149505782816101000a81549061ffff0219169055600201602081600101049283019260010302614922565b505061486e929150614a03565b6040805161012081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e0810182905261010081019190915290565b6001830191839082156148625791602002820160005b8382111561492257833561ffff1683826101000a81548161ffff021916908361ffff16021790555092602001926002016020816001010492830192600103026149bf565b5b8082111561486e5760008155600101614a04565b60405180606001604052806003906020820280368337509192915050565b600067ffffffffffffffff80841115614a5157614a5161567f565b604051601f8501601f19908116603f01168101908282118183101715614a7957614a7961567f565b81604052809350858152868686011115614a9257600080fd5b858560208301376000602087830101525050509392505050565b80356001600160a01b0381168114614ac357600080fd5b919050565b8060808101831015610f8557600080fd5b806101008101831015610f8557600080fd5b8060608101831015610f8557600080fd5b80358015158114614ac357600080fd5b60008083601f840112614b1e57600080fd5b50813567ffffffffffffffff811115614b3657600080fd5b60208301915083602082850101111561451057600080fd5b803561ffff81168114614ac357600080fd5b600060208284031215614b7257600080fd5b614b7b82614aac565b9392505050565b60008060408385031215614b9557600080fd5b614b9e83614aac565b9150614bac60208401614aac565b90509250929050565b600080600060608486031215614bca57600080fd5b614bd384614aac565b9250614be160208501614aac565b9150604084013590509250925092565b60008060008060808587031215614c0757600080fd5b614c1085614aac565b9350614c1e60208601614aac565b925060408501359150606085013567ffffffffffffffff811115614c4157600080fd5b8501601f81018713614c5257600080fd5b614c6187823560208401614a36565b91505092959194509250565b60008060408385031215614c8057600080fd5b614c8983614aac565b9150614bac60208401614afc565b60008060408385031215614caa57600080fd5b614cb383614aac565b946020939093013593505050565b60008060006101408486031215614cd757600080fd5b614ce084614aac565b925060208401359150614cf68560408601614ad9565b90509250925092565b60008060008060008060008060006101008a8c031215614d1e57600080fd5b614d278a614aac565b985060208a0135975060408a0135965060608a01359550614d4a60808b01614afc565b9450614d5860a08b01614afc565b935060c08a0135925060e08a013567ffffffffffffffff811115614d7b57600080fd5b614d878c828d01614b0c565b915080935050809150509295985092959850929598565b60008060c08385031215614db157600080fd5b614dbb8484614aeb565b9150614bac8460608501614aeb565b600060208284031215614ddc57600080fd5b614b7b82614afc565b600060208284031215614df757600080fd5b8135614b7b81615695565b600060208284031215614e1457600080fd5b8151614b7b81615695565b60008060208385031215614e3257600080fd5b823567ffffffffffffffff811115614e4957600080fd5b614e5585828601614b0c565b90969095509350505050565b600060208284031215614e7357600080fd5b813567ffffffffffffffff811115614e8a57600080fd5b8201601f81018413614e9b57600080fd5b61399284823560208401614a36565b600060208284031215614ebc57600080fd5b614b7b82614b4e565b600060208284031215614ed757600080fd5b5035919050565b60008060008060008060008060006104208a8c031215614efd57600080fd5b89359850614f0e8b60208c01614ac8565b9750614f1d8b60a08c01614ac8565b9650614f2d8b6101208c01614ac8565b9550614f3d8b6101a08c01614ac8565b9450614f4d8b6102208c01614ac8565b9350614f5d8b6102a08c01614ac8565b9250614f6d8b6103208c01614ac8565b9150614f7d8b6103a08c01614ac8565b90509295985092959850929598565b60008060408385031215614f9f57600080fd5b82359150614bac60208401614afc565b600080600060408486031215614fc457600080fd5b83359250602084013567ffffffffffffffff811115614fe257600080fd5b614fee86828701614b0c565b9497909650939450505050565b60008060006060848603121561501057600080fd5b8335925061502060208501614b4e565b9150614cf660408501614b4e565b6000806040838503121561504157600080fd5b50508035926020909101359150565b6000806000610140848603121561506657600080fd5b8335925060208401359150614cf68560408601614ad9565b60008060006060848603121561509357600080fd5b505081359360208301359350604090920135919050565b600081518084526150c2816020860160208601615591565b601f01601f19169290920160200192915050565b600081516150e8818560208601615591565b9290920192915050565b8183823760009101908152919050565b60008251615114818460208701615591565b9190910192915050565b6000875160206151318285838d01615591565b8851918401916151448184848d01615591565b88519201916151568184848c01615591565b87519201916151688184848b01615591565b865192019161517a8184848a01615591565b855192019161518c8184848901615591565b919091019998505050505050505050565b6000885160206151b08285838e01615591565b8951918401916151c38184848e01615591565b89519201916151d58184848d01615591565b88519201916151e78184848c01615591565b87519201916151f98184848b01615591565b865192019161520b8184848a01615591565b855192019161521d8184848901615591565b919091019a9950505050505050505050565b600080865481600182811c91508083168061524b57607f831692505b602080841082141561526b57634e487b7160e01b86526022600452602486fd5b81801561527f5760018114615290576152bd565b60ff198616895284890196506152bd565b60008d81526020902060005b868110156152b55781548b82015290850190830161529c565b505084890196505b5050505050506152df6152d96152d383896150d6565b876150d6565b856150d6565b979650505050505050565b8281526153266020820183805461ffff8082168452808260101c166020850152808260201c166040850152808260301c16606085015250505050565b60a00192915050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090615362908301846150aa565b9695505050505050565b60c0810181836000805b60028110156153bc57825184835b60038110156153a3578251825260209283019290910190600101615384565b5050506060939093019260209290920191600101615376565b5050505092915050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b602081526000614b7b60208301846150aa565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b600061ffff8083168185168083038211156154fd576154fd615627565b01949350505050565b6000821982111561551957615519615627565b500190565b60008261552d5761552d61563d565b500490565b600081600019048311821515161561554c5761554c615627565b500290565b600060ff821660ff84168160ff048111821515161561557257615572615627565b029392505050565b60008282101561558c5761558c615627565b500390565b60005b838110156155ac578181015183820152602001615594565b838111156123275750506000910152565b600181811c908216806155d157607f821691505b602082108114156155f257634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561560c5761560c615627565b5060010190565b6000826156225761562261563d565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b031981168114611f7757600080fdfea2646970667358221220b39d71f0aff5e36872c46341d06f6ee4b38fe1143dbe6925e95ec440dce6527464736f6c63430008070033

Deployed Bytecode Sourcemap

46403:29999:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52832:122;;;;;;;;;;-1:-1:-1;52832:122:0;;;;;:::i;:::-;;:::i;:::-;;33339:305;;;;;;;;;;-1:-1:-1;33339:305:0;;;;;:::i;:::-;;:::i;:::-;;;20900:14:1;;20893:22;20875:41;;20863:2;20848:18;33339:305:0;;;;;;;;47982:44;;;;;;;;;;;;;;;;;;;38485:25:1;;;38473:2;38458:18;47982:44:0;38339:177:1;34284:100:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;35843:221::-;;;;;;;;;;-1:-1:-1;35843:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;18713:32:1;;;18695:51;;18683:2;18668:18;35843:221:0;18549:203:1;50926:49:0;;;;;;;;;;-1:-1:-1;50926:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;35366:411;;;;;;;;;;-1:-1:-1;35366:411:0;;;;;:::i;:::-;;:::i;50338:63::-;;;;;;;;;;-1:-1:-1;50338:63:0;;;;;:::i;:::-;;;;;;;;;;;;;;50549:44;;;;;;;;;;-1:-1:-1;50549:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;65274:864;;;;;;;;;;-1:-1:-1;65274:864:0;;;;;:::i;:::-;;:::i;48033:22::-;;;;;;;;;;-1:-1:-1;48033:22:0;;;;;;;;67991:699;;;;;;;;;;-1:-1:-1;67991:699:0;;;;;:::i;:::-;;:::i;47878:49::-;;;;;;;;;;;;47923:4;47878:49;;48475:34;;;;;;;;;;-1:-1:-1;48475:34:0;;;;-1:-1:-1;;;;;48475:34:0;;;50720:41;;;;;;;;;;-1:-1:-1;50720:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48447:21;;;;;;;;;;-1:-1:-1;48447:21:0;;;;-1:-1:-1;;;;;48447:21:0;;;36733:339;;;;;;;;;;-1:-1:-1;36733:339:0;;;;;:::i;:::-;;:::i;50659:54::-;;;;;;;;;;-1:-1:-1;50659:54:0;;;;;:::i;:::-;;:::i;55749:227::-;;;;;;;;;;-1:-1:-1;55749:227:0;;;;;:::i;:::-;;:::i;66530:770::-;;;;;;;;;;-1:-1:-1;66530:770:0;;;;;:::i;:::-;;:::i;63230:2036::-;;;;;;;;;;-1:-1:-1;63230:2036:0;;;;;:::i;:::-;;:::i;48246:36::-;;;;;;;;;;;;;;;;51146:37;;;;;;;;;;-1:-1:-1;51146:37:0;;;;;;;;52962:118;;;;;;;;;;-1:-1:-1;52962:118:0;;;;;:::i;:::-;;:::i;51929:106::-;;;;;;;;;;;;;:::i;50223:52::-;;;;;;;;;;-1:-1:-1;50223:52:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;37143:185;;;;;;;;;;-1:-1:-1;37143:185:0;;;;;:::i;:::-;;:::i;45919:245::-;;;;;;;;;;-1:-1:-1;45919:245:0;;;;;:::i;:::-;;:::i;51192:38::-;;;;;;;;;;-1:-1:-1;51192:38:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;53324:225;;;;;;;;;;-1:-1:-1;53324:225:0;;;;;:::i;:::-;;:::i;60251:718::-;;;;;;:::i;:::-;;:::i;53557:230::-;;;;;;;;;;-1:-1:-1;53557:230:0;;;;;:::i;:::-;;:::i;48289:41::-;;;;;;;;;;;;;;;;50161:55;;;;;;;;;;-1:-1:-1;50161:55:0;;;;;:::i;:::-;;;;;;;;;;;;;;52380:120;;;;;;;;;;-1:-1:-1;52380:120:0;;;;;:::i;:::-;;:::i;48339:39::-;;;;;;;;;;-1:-1:-1;48339:39:0;;;;;;;;53795:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;55338:403::-;;;;;;;;;;-1:-1:-1;55338:403:0;;;;;:::i;:::-;;:::i;53088:104::-;;;;;;;;;;-1:-1:-1;53088:104:0;;;;;:::i;:::-;;:::i;33978:239::-;;;;;;;;;;-1:-1:-1;33978:239:0;;;;;:::i;:::-;;:::i;55984:362::-;;;;;;;;;;-1:-1:-1;55984:362:0;;;;;:::i;:::-;;:::i;66146:376::-;;;;;;;;;;-1:-1:-1;66146:376:0;;;;;:::i;:::-;;:::i;52628:90::-;;;;;;;;;;-1:-1:-1;52628:90:0;;;;;:::i;:::-;;:::i;33708:208::-;;;;;;;;;;-1:-1:-1;33708:208:0;;;;;:::i;:::-;;:::i;14974:94::-;;;;;;;;;;;;;:::i;50408:74::-;;;;;;;;;;-1:-1:-1;50408:74:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;52043:218;;;;;;;;;;-1:-1:-1;52043:218:0;;;;;:::i;:::-;;:::i;52269:103::-;;;;;;;;;;;;;:::i;50019:73::-;;;;;;;;;;-1:-1:-1;50019:73:0;;;;;:::i;:::-;;:::i;:::-;;;38320:6:1;38308:19;;;38290:38;;38278:2;38263:18;50019:73:0;38146:188:1;48094:25:0;;;;;;;;;;-1:-1:-1;48094:25:0;;;;;;;;;;;48420:20;;;;;;;;;;;;;:::i;54230:240::-;;;;;;;;;;-1:-1:-1;54230:240:0;;;;;:::i;:::-;;:::i;48062:25::-;;;;;;;;;;-1:-1:-1;48062:25:0;;;;;;;;;;;14323:87;;;;;;;;;;-1:-1:-1;14396:6:0;;-1:-1:-1;;;;;14396:6:0;14323:87;;56354:416;;;;;;;;;;-1:-1:-1;56354:416:0;;;;;:::i;:::-;;:::i;47765:45::-;;;;;;;;;;-1:-1:-1;47765:45:0;;;;;;34453:104;;;;;;;;;;;;;:::i;47817:52::-;;;;;;;;;;-1:-1:-1;47817:52:0;;;;;;47717:41;;;;;;;;;;-1:-1:-1;47717:41:0;;;;;;36136:295;;;;;;;;;;-1:-1:-1;36136:295:0;;;;;:::i;:::-;;:::i;53200:116::-;;;;;;;;;;-1:-1:-1;53200:116:0;;;;;:::i;:::-;;:::i;37399:328::-;;;;;;;;;;-1:-1:-1;37399:328:0;;;;;:::i;:::-;;:::i;71943:728::-;;;;;;;;;;-1:-1:-1;71943:728:0;;;;;:::i;:::-;;:::i;:::-;;;;;;37194:13:1;;37157:6;37190:22;;;37172:41;;37273:4;37261:17;;;37255:24;37251:33;;37229:20;;;37222:63;37332:4;37320:17;;;37314:24;11602:18;;37379:20;;;11590:31;37449:4;37437:17;;;37431:24;11602:18;;37498:20;;;11590:31;37568:4;37556:17;;;37550:24;11602:18;;37617:20;;;11590:31;37687:4;37675:17;;;37669:24;11602:18;;37736:20;;;11590:31;37806:4;37794:17;;;37788:24;11602:18;;37855:20;;;11590:31;37925:4;37913:17;;;37907:24;11602:18;;37974:20;;;11590:31;38014:6;38057:15;;;38051:22;11602:18;38116;;;11590:31;;;;37134:3;37119:19;;36950:1191;52508:112:0;;;;;;;;;;-1:-1:-1;52508:112:0;;;;;:::i;:::-;;:::i;48387:26::-;;;;;;;;;;;;;:::i;68698:1595::-;;;;;;;;;;-1:-1:-1;68698:1595:0;;;;;:::i;:::-;;:::i;54478:852::-;;;;;;;;;;-1:-1:-1;54478:852:0;;;;;:::i;:::-;;:::i;56778:1098::-;;;;;;;;;;-1:-1:-1;56778:1098:0;;;;;:::i;:::-;;:::i;50099:55::-;;;;;;;;;;-1:-1:-1;50099:55:0;;;;;:::i;:::-;;:::i;54106:116::-;;;;;;;;;;-1:-1:-1;54106:116:0;;;;;:::i;:::-;;:::i;52726:98::-;;;;;;;;;;-1:-1:-1;52726:98:0;;;;;:::i;:::-;;:::i;36502:164::-;;;;;;;;;;-1:-1:-1;36502:164:0;;;;;:::i;:::-;;:::i;61922:874::-;;;;;;;;;;-1:-1:-1;61922:874:0;;;;;:::i;:::-;;:::i;50282:49::-;;;;;;;;;;-1:-1:-1;50282:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;15223:192;;;;;;;;;;-1:-1:-1;15223:192:0;;;;;:::i;:::-;;:::i;47934:41::-;;;;;;;;;;;;47972:3;47934:41;;62804:418;;;;;;;;;;-1:-1:-1;62804:418:0;;;;;:::i;:::-;;:::i;57884:2359::-;;;;;;:::i;:::-;;:::i;67308:334::-;;;;;;;;;;-1:-1:-1;67308:334:0;;;;;:::i;:::-;;:::i;52832:122::-;14396:6;;-1:-1:-1;;;;;14396:6:0;13191:10;14543:23;14535:68;;;;-1:-1:-1;;;14535:68:0;;;;;;;:::i;:::-;;;;;;;;;52918:28:::1;:12;52933:13:::0;;52918:28:::1;:::i;:::-;;52832:122:::0;;:::o;33339:305::-;33441:4;-1:-1:-1;;;;;;33478:40:0;;-1:-1:-1;;;33478:40:0;;:105;;-1:-1:-1;;;;;;;33535:48:0;;-1:-1:-1;;;33535:48:0;33478:105;:158;;;-1:-1:-1;;;;;;;;;;26418:40:0;;;33600:36;33458:178;33339:305;-1:-1:-1;;33339:305:0:o;34284:100::-;34338:13;34371:5;34364:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34284:100;:::o;35843:221::-;35919:7;39326:16;;;:7;:16;;;;;;-1:-1:-1;;;;;39326:16:0;35939:73;;;;-1:-1:-1;;;35939:73:0;;30298:2:1;35939:73:0;;;30280:21:1;30337:2;30317:18;;;30310:30;30376:34;30356:18;;;30349:62;-1:-1:-1;;;30427:18:1;;;30420:42;30479:19;;35939:73:0;30096:408:1;35939:73:0;-1:-1:-1;36032:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;36032:24:0;;35843:221::o;35366:411::-;35447:13;35463:23;35478:7;35463:14;:23::i;:::-;35447:39;;35511:5;-1:-1:-1;;;;;35505:11:0;:2;-1:-1:-1;;;;;35505:11:0;;;35497:57;;;;-1:-1:-1;;;35497:57:0;;33076:2:1;35497:57:0;;;33058:21:1;33115:2;33095:18;;;33088:30;33154:34;33134:18;;;33127:62;-1:-1:-1;;;33205:18:1;;;33198:31;33246:19;;35497:57:0;32874:397:1;35497:57:0;13191:10;-1:-1:-1;;;;;35589:21:0;;;;:62;;-1:-1:-1;35614:37:0;35631:5;13191:10;36502:164;:::i;35614:37::-;35567:168;;;;-1:-1:-1;;;35567:168:0;;27886:2:1;35567:168:0;;;27868:21:1;27925:2;27905:18;;;27898:30;27964:34;27944:18;;;27937:62;28035:26;28015:18;;;28008:54;28079:19;;35567:168:0;27684:420:1;35567:168:0;35748:21;35757:2;35761:7;35748:8;:21::i;65274:864::-;51867:10;51849:29;;;;:17;:29;;;;;;;;51841:60;;;;-1:-1:-1;;;51841:60:0;;34959:2:1;51841:60:0;;;34941:21:1;34998:2;34978:18;;;34971:30;-1:-1:-1;;;35017:18:1;;;35010:48;35075:18;;51841:60:0;34757:342:1;51841:60:0;65484:15:::1;-1:-1:-1::0;;;;;65463:36:0::1;:17;65471:8;65463:7;:17::i;:::-;-1:-1:-1::0;;;;;65463:36:0::1;;65441:116;;;::::0;-1:-1:-1;;;65441:116:0;;35662:2:1;65441:116:0::1;::::0;::::1;35644:21:1::0;35701:2;35681:18;;;35674:30;35740:32;35720:18;;;35713:60;35790:18;;65441:116:0::1;35460:354:1::0;65441:116:0::1;65570:16;65589:20;65600:8;65589:10;:20::i;:::-;65570:39:::0;-1:-1:-1;65631:5:0::1;;::::0;::::1;:2:::0;:5:::1;:::i;:::-;:10;;::::0;:27:::1;;65653:5;;::::0;::::1;:2:::0;:5:::1;:::i;:::-;65631:27;;;65644:6:::0;;65631:27:::1;65622:36;;::::0;;65682:5:::1;::::0;;;::::1;::::0;::::1;;:::i;:::-;:10;;::::0;:31:::1;;65708:5;::::0;;;::::1;::::0;::::1;;:::i;:::-;65682:31;;;65695:1;:10;;;65682:31;65669:44;;:10;::::0;::::1;:44:::0;65736:5:::1;::::0;;;;;::::1;;:::i;:::-;:10;;::::0;:30:::1;;65761:5;::::0;;;;;::::1;;:::i;:::-;65736:30;;;65749:1;:9;;;65736:30;65724:42;;:9;::::0;::::1;:42:::0;65795:5:::1;::::0;;;;;::::1;;:::i;:::-;:10;;::::0;:36:::1;;65826:5;::::0;;;;;::::1;;:::i;:::-;65795:36;;;65808:1;:15;;;65795:36;65777:54;;:15;::::0;::::1;:54:::0;65856:5:::1;::::0;;;;;::::1;;:::i;:::-;:10;;::::0;:32:::1;;65883:5;::::0;;;;;::::1;;:::i;:::-;65856:32;;;65869:1;:11;;;65856:32;65842:46;;:11;::::0;::::1;:46:::0;65914:5:::1;::::0;;;;;::::1;;:::i;:::-;:10;;::::0;:33:::1;;65942:5;::::0;;;;;::::1;;:::i;:::-;65914:33;;;65927:1;:12;;;65914:33;65899:48;;:12;::::0;::::1;:48:::0;65973:5:::1;::::0;;;;;::::1;;:::i;:::-;:10;;::::0;:33:::1;;66001:5;::::0;;;;;::::1;;:::i;:::-;65973:33;;;65986:1;:12;;;65973:33;65958:48;;:12;::::0;::::1;:48:::0;66032:5:::1;::::0;;;;;::::1;;:::i;:::-;:10;;::::0;:33:::1;;66060:5;::::0;;;;;::::1;;:::i;:::-;66032:33;;;66045:1;:12;;;66032:33;66017:48;;:12;::::0;::::1;:48:::0;66108:22:::1;66017:1:::0;66108:19:::1;:22::i;:::-;66078:27;::::0;;;:17:::1;:27:::0;;;;;;:52;;;;-1:-1:-1;;;65274:864:0:o;67991:699::-;68095:8;51746:23;51760:8;51746:13;:23::i;:::-;68130:10:::1;68141:5;;68130:17;;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;;::::1;;68129:18;68121:61;;;::::0;-1:-1:-1;;;68121:61:0;;25936:2:1;68121:61:0::1;::::0;::::1;25918:21:1::0;25975:2;25955:18;;;25948:30;26014:32;25994:18;;;25987:60;26064:18;;68121:61:0::1;25734:354:1::0;68121:61:0::1;68199:19;::::0;68193:58:::1;::::0;-1:-1:-1;;;68193:58:0;;68235:10:::1;68193:58;::::0;::::1;19445:51:1::0;68247:3:0::1;19512:18:1::0;;;19505:34;-1:-1:-1;;;;;68199:19:0;;::::1;::::0;68193:41:::1;::::0;19418:18:1;;68193:58:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;;68330:26:0::1;68359:30:::0;;;:20:::1;:30;::::0;;;;68330:59;;:26;;-1:-1:-1;68359:30:0;68330:59:::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68433:1;68410:12;68404:26;:30;68400:95;;;68478:5;68451:10;68462:12;68451:24;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:32;;;::::1;;-1:-1:-1::0;;68451:32:0;;::::1;::::0;;;::::1;::::0;;68400:95:::1;68507:30;::::0;;;:20:::1;:30;::::0;;;;:38:::1;::::0;68540:5;;68507:38:::1;:::i;:::-;-1:-1:-1::0;68562:23:0;;68558:80:::1;;68622:4;68602:10;68613:5;;68602:17;;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:24;;;::::1;;-1:-1:-1::0;;68602:24:0;;::::1;::::0;;;::::1;::::0;;68558:80:::1;68666:8;68655:27;68676:5;;68655:27;;;;;;;:::i;:::-;;;;;;;;68110:580;67991:699:::0;;;;:::o;36733:339::-;36928:41;13191:10;36947:12;36961:7;36928:18;:41::i;:::-;36920:103;;;;-1:-1:-1;;;36920:103:0;;;;;;;:::i;:::-;37036:28;37046:4;37052:2;37056:7;37036:9;:28::i;50659:54::-;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;55749:227::-;51648:17;:15;:17::i;:::-;55885:26:::1;::::0;;;:20:::1;:26;::::0;;;;;:31;55877:40:::1;;;::::0;::::1;;55928:26;::::0;;;:20:::1;:26;::::0;;;;:40;55749:227::o;66530:770::-;66630:7;66679:19;;;:9;:19;;;;;;66717:18;66709:65;;;;-1:-1:-1;;;66709:65:0;;22515:2:1;66709:65:0;;;22497:21:1;22554:2;22534:18;;;22527:30;22593:34;22573:18;;;22566:62;-1:-1:-1;;;22644:18:1;;;22637:32;22686:19;;66709:65:0;22313:398:1;66709:65:0;66848:18;66915:2;;66905;66870:31;66888:13;66870:15;:31;:::i;:::-;66869:38;;;;:::i;:::-;:43;;;;:::i;:::-;:48;;;;:::i;:::-;66928:43;;;;;;;;;;66848:69;;-1:-1:-1;;;66928:43:0;66956:15;;66928:43;;66956:15;66928:43;;;;;;;;;;;;;;;;;-1:-1:-1;;66982:43:0;;;;;;;;;;66928;;-1:-1:-1;;;66982:43:0;-1:-1:-1;67010:15:0;;-1:-1:-1;66982:43:0;;-1:-1:-1;67010:15:0;66982:43;;;;;;;;;;;;;;;;;;;;;;;;67056:7;67064:1;67056:10;;;;;;;:::i;:::-;;;;;67042;:24;67038:234;;67090:7;67098:1;67090:10;;;;;;66530:770;-1:-1:-1;;;;;;66530:770:0:o;67038:234::-;67136:10;;;;67122:24;;67118:154;;67170:7;67178:1;67170:10;;67118:154;67216:10;;67202:24;;67198:74;;67250:7;67258:1;67250:10;;67198:74;-1:-1:-1;67291:1:0;;66530:770;-1:-1:-1;;;;;66530:770:0:o;63230:2036::-;63366:9;51746:23;51760:8;51746:13;:23::i;:::-;63392:9:::1;51746:23;51760:8;51746:13;:23::i;:::-;63436:19:::2;::::0;-1:-1:-1;;;;;63436:19:0::2;:33:::0;;::::2;::::0;:50:::2;;-1:-1:-1::0;63473:13:0::2;::::0;::::2;::::0;::::2;;;63436:50;63414:127;;;::::0;-1:-1:-1;;;63414:127:0;;35306:2:1;63414:127:0::2;::::0;::::2;35288:21:1::0;35345:2;35325:18;;;35318:30;35384:29;35364:18;;;35357:57;35431:18;;63414:127:0::2;35104:351:1::0;63414:127:0::2;63554:17;63574:21;63585:9;63574:10;:21::i;:::-;63554:41;;63606:17;63626:21;63637:9;63626:10;:21::i;:::-;63692:7:::0;;63606:41;;-1:-1:-1;63683:16:0::2;;:5;;::::0;::::2;:2:::0;:5:::2;:::i;:::-;:16;;;:36;;;-1:-1:-1::0;63712:7:0;;63703:16:::2;;:5;;::::0;::::2;:2:::0;:5:::2;:::i;:::-;:16;;;63683:36;63682:105;;;;-1:-1:-1::0;63751:11:0::2;::::0;;::::2;::::0;63742:20:::2;;::::0;:5:::2;::::0;;;;;;::::2;;:::i;:::-;:20;;;:44;;;-1:-1:-1::0;63775:11:0::2;::::0;;::::2;::::0;63766:20:::2;;::::0;:5:::2;::::0;;;;;;::::2;;:::i;:::-;:20;;;63742:44;63682:170;;;;-1:-1:-1::0;63818:10:0::2;::::0;;::::2;::::0;63809:19:::2;;::::0;:5:::2;::::0;;;;;;::::2;;:::i;:::-;:19;;;:42;;;-1:-1:-1::0;63841:10:0::2;::::0;;::::2;::::0;63832:19:::2;;::::0;:5:::2;::::0;;;;;;::::2;;:::i;:::-;:19;;;63809:42;63682:247;;;;-1:-1:-1::0;63883:16:0::2;::::0;;::::2;::::0;63874:25:::2;;::::0;:5:::2;::::0;;;;;;::::2;;:::i;:::-;:25;;;:54;;;-1:-1:-1::0;63912:16:0::2;::::0;;::::2;::::0;63903:25:::2;;::::0;:5:::2;::::0;;;;;;::::2;;:::i;:::-;:25;;;63874:54;63682:316;;;;-1:-1:-1::0;63960:12:0::2;::::0;;::::2;::::0;63951:21:::2;;::::0;:5:::2;::::0;;;;;;::::2;;:::i;:::-;:21;;;:46;;;-1:-1:-1::0;63985:12:0::2;::::0;;::::2;::::0;63976:21:::2;;::::0;:5:::2;::::0;;;;;;::::2;;:::i;:::-;:21;;;63951:46;63682:387;;;;-1:-1:-1::0;64029:13:0::2;::::0;;::::2;::::0;64020:22:::2;;::::0;:5:::2;::::0;;;;;;::::2;;:::i;:::-;:22;;;:48;;;-1:-1:-1::0;64055:13:0::2;::::0;;::::2;::::0;64046:22:::2;;::::0;:5:::2;::::0;;;;;;::::2;;:::i;:::-;:22;;;64020:48;63682:458;;;;-1:-1:-1::0;64100:13:0::2;::::0;;::::2;::::0;64091:22:::2;;::::0;:5:::2;::::0;;;;;;::::2;;:::i;:::-;:22;;;:48;;;-1:-1:-1::0;64126:13:0::2;::::0;;::::2;::::0;64117:22:::2;;::::0;:5:::2;::::0;;;;;;::::2;;:::i;:::-;:22;;;64091:48;63682:529;;;;-1:-1:-1::0;64171:13:0::2;::::0;;::::2;::::0;64162:22:::2;;::::0;:5:::2;::::0;;;;;;::::2;;:::i;:::-;:22;;;:48;;;-1:-1:-1::0;64197:13:0::2;::::0;;::::2;::::0;64188:22:::2;;::::0;:5:::2;::::0;;;;;;::::2;;:::i;:::-;:22;;;64162:48;63660:610;;;::::0;-1:-1:-1;;;63660:610:0;;24817:2:1;63660:610:0::2;::::0;::::2;24799:21:1::0;24856:2;24836:18;;;24829:30;24895:33;24875:18;;;24868:61;24946:18;;63660:610:0::2;24615:355:1::0;63660:610:0::2;64283:16;64289:9;64283:5;:16::i;:::-;64318:19;::::0;64450:20:::2;::::0;64318:19:::2;64434:12:::0;;::::2;::::0;64419;;::::2;::::0;-1:-1:-1;;;;;64318:19:0;;::::2;::::0;64312:31:::2;::::0;64358:10:::2;::::0;64450:20;;64419:27:::2;::::0;64434:12;64419:27:::2;:::i;:::-;64418:52;;;;;;:::i;:::-;64383:14;;:88;;;;:::i;:::-;64312:170;::::0;-1:-1:-1;;;;;;64312:170:0::2;::::0;;;;;;-1:-1:-1;;;;;19463:32:1;;;64312:170:0::2;::::0;::::2;19445:51:1::0;19512:18;;;19505:34;19418:18;;64312:170:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;64686:309;64720:264;;;;;;;;64746:2;64749:1;64746:5;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;64720:264;;::::0;;::::2;::::0;;::::2;::::0;64770:5:::2;::::0;;;;;;::::2;;:::i;:::-;64720:264;;::::0;;::::2;;64794:5;::::0;;;;;::::2;;:::i;:::-;64720:264;;::::0;;::::2;;64818:5;::::0;;;;;::::2;;:::i;:::-;64720:264;;::::0;;::::2;;64842:5;::::0;;;;;::::2;;:::i;:::-;64720:264;;::::0;;::::2;;64866:5;::::0;;;;;::::2;;:::i;:::-;64720:264;;::::0;;::::2;;64890:5;::::0;;;;;::::2;;:::i;:::-;64720:264;;::::0;;::::2;;64914:5;::::0;;;;;::::2;;:::i;:::-;64720:264;;;;;;64953:2;:12;;;64938:2;:12;;;:27;;;;:::i;:::-;:31;::::0;64968:1:::2;64938:31;:::i;:::-;64720:264;;::::0;;64686:19:::2;:309::i;:::-;64655:28;::::0;;;:17:::2;:28:::0;;;;;:340;65022:17:::2;9915:14:::0;65189:7:::2;9915:14:::0;65195:1:::2;65189:7;:::i;:::-;65164:10;65144:31;::::0;;;:19:::2;:31;::::0;;;;;;;:42;;;;;;;;;:52;;;;65212:46;;38695:25:1;;;38736:18;;;38729:34;;;65232:3:0;;65212:46:::2;::::0;38668:18:1;65212:46:0::2;;;;;;;63403:1863;;;51780:1:::1;63230:2036:::0;;;;:::o;52962:118::-;14396:6;;-1:-1:-1;;;;;14396:6:0;13191:10;14543:23;14535:68;;;;-1:-1:-1;;;14535:68:0;;;;;;;:::i;:::-;53042:19:::1;:30:::0;;-1:-1:-1;;;;;;53042:30:0::1;-1:-1:-1::0;;;;;53042:30:0;;;::::1;::::0;;;::::1;::::0;;52962:118::o;51929:106::-;14396:6;;-1:-1:-1;;;;;14396:6:0;13191:10;14543:23;14535:68;;;;-1:-1:-1;;;14535:68:0;;;;;;;:::i;:::-;14396:6;;51979:48:::1;::::0;-1:-1:-1;;;;;14396:6:0;;;;52005:21:::1;51979:48:::0;::::1;;;::::0;::::1;::::0;;;52005:21;14396:6;51979:48;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;51929:106::o:0;37143:185::-;37281:39;37298:4;37304:2;37308:7;37281:39;;;;;;;;;;;;:16;:39::i;45919:245::-;46037:41;13191:10;46056:12;13111:98;46037:41;46029:102;;;;-1:-1:-1;;;46029:102:0;;36021:2:1;46029:102:0;;;36003:21:1;36060:2;36040:18;;;36033:30;36099:34;36079:18;;;36072:62;-1:-1:-1;;;36150:18:1;;;36143:46;36206:19;;46029:102:0;35819:412:1;46029:102:0;46142:14;46148:7;46142:5;:14::i;53324:225::-;51648:17;:15;:17::i;:::-;53468:14:::1;:25:::0;;;;53504:20:::1;:37:::0;53324:225::o;60251:718::-;60324:10;;;;60316:47;;;;-1:-1:-1;;;60316:47:0;;36438:2:1;60316:47:0;;;36420:21:1;36477:2;36457:18;;;36450:30;36516:26;36496:18;;;36489:54;36560:18;;60316:47:0;36236:348:1;60316:47:0;60409:2;60396:9;:15;;60374:114;;;;-1:-1:-1;;;60374:114:0;;27468:2:1;60374:114:0;;;27450:21:1;27507:2;27487:18;;;27480:30;27546:34;27526:18;;;27519:62;-1:-1:-1;;;27597:18:1;;;27590:47;27654:19;;60374:114:0;27266:413:1;60374:114:0;60552:9;60534:15;;:27;;;;:::i;:::-;60521:9;:40;;60499:117;;;;-1:-1:-1;;;60499:117:0;;23278:2:1;60499:117:0;;;23260:21:1;23317:2;23297:18;;;23290:30;23356:29;23336:18;;;23329:57;23403:18;;60499:117:0;23076:351:1;60499:117:0;47923:4;60683:9;60649:31;:21;9915:14;;9823:114;60649:31;:43;;;;:::i;:::-;:65;;60627:147;;;;-1:-1:-1;;;60627:147:0;;36791:2:1;60627:147:0;;;36773:21:1;;;36810:18;;;36803:30;36869:34;36849:18;;;36842:62;36921:18;;60627:147:0;36589:356:1;60627:147:0;60792:9;60787:175;60811:9;60807:1;:13;60787:175;;;60842:33;:21;10034:19;;10052:1;10034:19;;;9945:127;60842:33;60890:60;60903:10;60915:31;:21;9915:14;;9823:114;60915:31;60948:1;60890:12;:60::i;:::-;60822:3;;;;:::i;:::-;;;;60787:175;;;;60251:718;:::o;53557:230::-;51648:17;:15;:17::i;:::-;53716:26:::1;:15;53734:8:::0;53716:26:::1;;:::i;:::-;-1:-1:-1::0;53753:26:0::1;:15;53771:8:::0;53753:26:::1;;:::i;52380:120::-:0;14396:6;;-1:-1:-1;;;;;14396:6:0;13191:10;14543:23;14535:68;;;;-1:-1:-1;;;14535:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;52463:16:0;;;::::1;;::::0;;;:6:::1;:16;::::0;;;;:29;;-1:-1:-1;;52463:29:0::1;::::0;::::1;;::::0;;;::::1;::::0;;52380:120::o;53795:303::-;53884:20;;:::i;:::-;53922:168;;;;;;;;53945:15;:18;53922:168;;;;;;53965:18;;53922:168;;;;;;;;53985:18;;53922:168;;;;;;;;;;;;;;;;;;;;;54020:15;-1:-1:-1;54020:18:0;;53922:168;;54040:18;;53922:168;;;;54060:18;;53922:168;;;;;;;;;-1:-1:-1;53795:303:0:o;55338:403::-;51648:17;:15;:17::i;:::-;55497:26:::1;::::0;;;:20:::1;:26;::::0;;;;;::::1;;55496:27;55488:36;;;::::0;::::1;;55665:9;55655:19;;:7;:19;;;55647:28;;;::::0;::::1;;55686:47;::::0;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;::::1;;::::0;;::::1;::::0;;;;-1:-1:-1;55686:24:0;;;:18:::1;:24:::0;;;;;;;:47:::1;::::0;::::1;;:::i;:::-;;55338:403:::0;;;:::o;53088:104::-;51648:17;:15;:17::i;:::-;53162:10:::1;:22:::0;;-1:-1:-1;;53162:22:0::1;::::0;::::1;;::::0;;;::::1;::::0;;53088:104::o;33978:239::-;34050:7;34086:16;;;:7;:16;;;;;;-1:-1:-1;;;;;34086:16:0;34121:19;34113:73;;;;-1:-1:-1;;;34113:73:0;;28722:2:1;34113:73:0;;;28704:21:1;28761:2;28741:18;;;28734:30;28800:34;28780:18;;;28773:62;-1:-1:-1;;;28851:18:1;;;28844:39;28900:19;;34113:73:0;28520:405:1;55984:362:0;51648:17;:15;:17::i;:::-;56123:13:::1;::::0;::::1;::::0;::::1;;;56122:14;56114:23;;;::::0;::::1;;56148:29;:17;10034:19:::0;;10052:1;10034:19;;;9945:127;56148:29:::1;56188:11;56202:27;:17;9915:14:::0;;9823:114;56202:27:::1;56188:41;;56262:10;:8;:10::i;:::-;56240:19;::::0;;;:14:::1;:19;::::0;;;;;;;:32;;;;56283:28:::1;:33:::0;;;;:55;55984:362::o;66146:376::-;66211:8;51746:23;51760:8;51746:13;:23::i;:::-;66240:13:::1;::::0;;;::::1;;;66232:54;;;::::0;-1:-1:-1;;;66232:54:0;;31136:2:1;66232:54:0::1;::::0;::::1;31118:21:1::0;31175:2;31155:18;;;31148:30;31214;31194:18;;;31187:58;31262:18;;66232:54:0::1;30934:352:1::0;66232:54:0::1;66319:19;::::0;;;:9:::1;:19;::::0;;;;;:24;66297:113:::1;;;::::0;-1:-1:-1;;;66297:113:0;;31897:2:1;66297:113:0::1;::::0;::::1;31879:21:1::0;31936:2;31916:18;;;31909:30;31975:34;31955:18;;;31948:62;-1:-1:-1;;;32026:18:1;;;32019:37;32073:19;;66297:113:0::1;31695:403:1::0;66297:113:0::1;66421:19;::::0;;;:9:::1;:19;::::0;;;;;;66443:15:::1;66421:37:::0;;;;66474:40;;66431:8;;66474:40:::1;::::0;::::1;::::0;38485:25:1;;38473:2;38458:18;;38339:177;66474:40:0::1;;;;;;;;66146:376:::0;;:::o;52628:90::-;14396:6;;-1:-1:-1;;;;;14396:6:0;13191:10;14543:23;14535:68;;;;-1:-1:-1;;;14535:68:0;;;;;;;:::i;:::-;52694:6:::1;:16:::0;;-1:-1:-1;;;;;;52694:16:0::1;-1:-1:-1::0;;;;;52694:16:0;;;::::1;::::0;;;::::1;::::0;;52628:90::o;33708:208::-;33780:7;-1:-1:-1;;;;;33808:19:0;;33800:74;;;;-1:-1:-1;;;33800:74:0;;28311:2:1;33800:74:0;;;28293:21:1;28350:2;28330:18;;;28323:30;28389:34;28369:18;;;28362:62;-1:-1:-1;;;28440:18:1;;;28433:40;28490:19;;33800:74:0;28109:406:1;33800:74:0;-1:-1:-1;;;;;;33892:16:0;;;;;:9;:16;;;;;;;33708:208::o;14974:94::-;14396:6;;-1:-1:-1;;;;;14396:6:0;13191:10;14543:23;14535:68;;;;-1:-1:-1;;;14535:68:0;;;;;;;:::i;:::-;15039:21:::1;15057:1;15039:9;:21::i;:::-;14974:94::o:0;52043:218::-;14396:6;;-1:-1:-1;;;;;14396:6:0;13191:10;14543:23;14535:68;;;;-1:-1:-1;;;14535:68:0;;;;;;;:::i;:::-;52173:25:::1;::::0;::::1;;52172:26;52164:35;;;::::0;::::1;;-1:-1:-1::0;;;;;52210:27:0;;;::::1;;::::0;;;:17:::1;:27;::::0;;;;:43;;-1:-1:-1;;52210:43:0::1;::::0;::::1;;::::0;;;::::1;::::0;;52043:218::o;52269:103::-;14396:6;;-1:-1:-1;;;;;14396:6:0;13191:10;14543:23;14535:68;;;;-1:-1:-1;;;14535:68:0;;;;;;;:::i;:::-;52332:25:::1;:32:::0;;-1:-1:-1;;52332:32:0::1;52360:4;52332:32;::::0;;52269:103::o;50019:73::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;48420:20::-;;;;;;;:::i;54230:240::-;51648:17;:15;:17::i;:::-;54374:26:::1;::::0;;;:20:::1;:26;::::0;;;;;::::1;;54373:27;54365:36;;;::::0;::::1;;54412:26;::::0;;;:20:::1;:26;::::0;;;;;:50;;-1:-1:-1;;54412:50:0::1;::::0;::::1;;::::0;;;::::1;::::0;;54230:240::o;56354:416::-;14396:6;;-1:-1:-1;;;;;14396:6:0;13191:10;14543:23;14535:68;;;;-1:-1:-1;;;14535:68:0;;;;;;;:::i;:::-;47972:3:::1;56528:9;56487:38;:28;9915:14:::0;;9823:114;56487:38:::1;:50;;;;:::i;:::-;:65;;56465:98;;;::::0;::::1;;56581:9;56576:187;56600:9;56596:1;:13;56576:187;;;56631:40;:28;10034:19:::0;;10052:1;10034:19;;;9945:127;56631:40:::1;56686:65;56699:8;56709:38;:28;9915:14:::0;;9823:114;56686:65:::1;56611:3:::0;::::1;::::0;::::1;:::i;:::-;;;;56576:187;;34453:104:::0;34509:13;34542:7;34535:14;;;;;:::i;36136:295::-;-1:-1:-1;;;;;36239:24:0;;13191:10;36239:24;;36231:62;;;;-1:-1:-1;;;36231:62:0;;25582:2:1;36231:62:0;;;25564:21:1;25621:2;25601:18;;;25594:30;25660:27;25640:18;;;25633:55;25705:18;;36231:62:0;25380:349:1;36231:62:0;13191:10;36306:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;36306:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;36306:53:0;;;;;;;;;;36375:48;;20875:41:1;;;36306:42:0;;13191:10;36375:48;;20848:18:1;36375:48:0;;;;;;;36136:295;;:::o;53200:116::-;51648:17;:15;:17::i;:::-;53280:13:::1;:28:::0;;;::::1;;;;-1:-1:-1::0;;53280:28:0;;::::1;::::0;;;::::1;::::0;;53200:116::o;37399:328::-;37574:41;13191:10;37607:7;37574:18;:41::i;:::-;37566:103;;;;-1:-1:-1;;;37566:103:0;;;;;;;:::i;:::-;37680:39;37694:4;37700:2;37704:7;37713:5;37680:13;:39::i;71943:728::-;72002:14;;:::i;:::-;72029:11;72043:27;;;:17;:27;;;;;;72089:19;72043:27;72089:14;:19::i;:::-;72081:65;;;;-1:-1:-1;;;72081:65:0;;29896:2:1;72081:65:0;;;29878:21:1;29935:2;29915:18;;;29908:30;29974:34;29954:18;;;29947:62;-1:-1:-1;;;30025:18:1;;;30018:31;30066:19;;72081:65:0;29694:397:1;72081:65:0;72159:16;;:::i;:::-;72195:27;72215:3;72220:1;72195:19;:27::i;:::-;72186:36;;;;72246:27;72266:3;72271:1;72246:19;:27::i;:::-;72233:40;;:10;;;:40;72296:27;72316:3;72321:1;72296:19;:27::i;:::-;72284:39;;:9;;;:39;72352:27;72372:3;72377:1;72352:19;:27::i;:::-;72334:45;;:15;;;:45;72404:27;72424:3;72429:1;72404:19;:27::i;:::-;72390:41;;:11;;;:41;72457:27;72477:3;72482:1;72457:19;:27::i;:::-;72442:42;;:12;;;:42;72510:27;72530:3;72535:1;72510:19;:27::i;:::-;72495:42;;:12;;;:42;72563:27;72583:3;72588:1;72563:19;:27::i;:::-;72548:42;;:12;;;:42;72615:27;72635:3;72640:1;72615:19;:27::i;:::-;72601:41;;:11;;;:41;:1;71943:728;-1:-1:-1;;;71943:728:0:o;52508:112::-;14396:6;;-1:-1:-1;;;;;14396:6:0;13191:10;14543:23;14535:68;;;;-1:-1:-1;;;14535:68:0;;;;;;;:::i;:::-;52584:15:::1;:28:::0;52508:112::o;48387:26::-;;;;;;;:::i;68698:1595::-;39302:4;39326:16;;;:7;:16;;;;;;68800:13;;-1:-1:-1;;;;;39326:16:0;68831:57;;;;-1:-1:-1;;;68831:57:0;;33478:2:1;68831:57:0;;;33460:21:1;33517:2;33497:18;;;33490:30;33556:29;33536:18;;;33529:57;33603:18;;68831:57:0;33276:351:1;68831:57:0;68925:6;68919:20;;;;;:::i;:::-;:25;;-1:-1:-1;68919:25:0;:86;;-1:-1:-1;68977:27:0;;;;:17;:27;;;;;;68962:43;;:14;:43::i;:::-;68961:44;68919:86;68901:162;;;69039:12;69032:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68698:1595;;;:::o;68901:162::-;69075:16;69094:20;69105:8;69094:10;:20::i;:::-;69125:29;;;;;;;;;;;;-1:-1:-1;;;69125:29:0;;;;69075:39;;-1:-1:-1;69249:6:0;69321:19;69331:8;69321:9;:19::i;:::-;69367:9;69403:17;69413:1;:6;;;69403:17;;:9;:17::i;:::-;69447:9;69483:21;69493:1;:10;;;69483:21;;:9;:21::i;:::-;69531:9;69567:20;69577:1;:9;;;69567:20;;:9;:20::i;:::-;69278:332;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;69676:9;69712:26;69722:1;:15;;;69712:26;;:9;:26::i;:::-;69765:9;69801:22;69811:1;:11;;;69801:22;;:9;:22::i;:::-;69850:9;69886:23;69896:1;:12;;;69886:23;;:9;:23::i;:::-;69633:299;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;69998:9;70034:23;70044:1;:12;;;70034:23;;:9;:23::i;:::-;70084:9;70120:23;70130:1;:12;;;70120:23;;:9;:23::i;:::-;70170:9;70206:22;70216:1;:11;;;70206:22;;:9;:22::i;:::-;69955:296;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;69955:296:0;;;;;;;;;;69210:1060;;;;;69955:296;69210:1060;;:::i;:::-;;;;;;;;;;;;;69165:1120;;;;68698:1595;;;:::o;54478:852::-;51648:17;:15;:17::i;:::-;54902:26:::1;::::0;;;:20:::1;:26;::::0;;;;;::::1;;54901:27;54893:36;;;::::0;::::1;;54942:22;::::0;;;:16:::1;:22;::::0;;;;;;;:25;;;;;;;;:33:::1;::::0;54970:5;54942:33:::1;;:::i;:::-;-1:-1:-1::0;54986:22:0::1;::::0;;;:16:::1;:22;::::0;;;;;;;55009:1:::1;54986:25:::0;;;;;;;:37:::1;::::0;55014:9;54986:37:::1;;:::i;:::-;-1:-1:-1::0;55034:22:0::1;::::0;;;:16:::1;:22;::::0;;;;;;;55057:1:::1;55034:25:::0;;;;;;;:36:::1;::::0;55062:8;55034:36:::1;;:::i;:::-;-1:-1:-1::0;55081:22:0::1;::::0;;;:16:::1;:22;::::0;;;;;;;55104:1:::1;55081:25:::0;;;;;;;:42:::1;::::0;55109:14;55081:42:::1;;:::i;:::-;-1:-1:-1::0;55134:22:0::1;::::0;;;:16:::1;:22;::::0;;;;;;;55157:1:::1;55134:25:::0;;;;;;;;:38:::1;::::0;55162:10;;55134:38:::1;:::i;:::-;-1:-1:-1::0;55183:22:0::1;::::0;;;:16:::1;:22;::::0;;;;;;;55206:1:::1;55183:25:::0;;;;;;;:39:::1;::::0;55211:11;55183:39:::1;;:::i;:::-;-1:-1:-1::0;55233:22:0::1;::::0;;;:16:::1;:22;::::0;;;;;;;55256:1:::1;55233:25:::0;;;;;;;:39:::1;::::0;55261:11;55233:39:::1;;:::i;:::-;-1:-1:-1::0;55283:22:0::1;::::0;;;:16:::1;:22;::::0;;;;;;;55306:1:::1;55283:25:::0;;;;;;;:39:::1;::::0;55311:11;55283:39:::1;;:::i;:::-;;54478:852:::0;;;;;;;;;:::o;56778:1098::-;14396:6;;-1:-1:-1;;;;;14396:6:0;13191:10;14543:23;14535:68;;;;-1:-1:-1;;;14535:68:0;;;;;;;:::i;:::-;56861:20:::1;::::0;::::1;;56853:29;;;::::0;::::1;;57013:20;:28:::0;;-1:-1:-1;;57013:28:0::1;::::0;;57074:5:::1;57013:28:::0;57090:779:::1;57114:1;57110;:5;57090:779;;;57210:608;57248:555;;;;;;;;57297:1;57285:9;:13;;;;:::i;:::-;57248:555;;::::0;;::::1;;57387:13;57399:1:::0;57387:9;:13:::1;:::i;:::-;57248:555;;::::0;;::::1;;57431:13;57443:1:::0;57431:9;:13:::1;:::i;:::-;57248:555;;::::0;;::::1;;57475:13;57487:1:::0;57475:9;:13:::1;:::i;:::-;57248:555;;::::0;;::::1;;57519:13;57531:1:::0;57519:9;:13:::1;:::i;:::-;57248:555;;::::0;;::::1;;57563:13;57575:1:::0;57563:9;:13:::1;:::i;:::-;57248:555;;::::0;;::::1;;57607:13;57619:1:::0;57607:9;:13:::1;:::i;:::-;57248:555;;;;;;57650:1;57645;:6;;57644:56;;57686:13;:9:::0;57698:1:::1;57686:13;:::i;:::-;57644:56;;;57662:13;:9:::0;57674:1:::1;57662:13;:::i;:::-;57248:555;;::::0;;57772:1:::1;57248:555;::::0;;::::1;::::0;57210:19:::1;:608::i;:::-;57187:20;::::0;;;:17:::1;:20:::0;;;;;:631;57835:22:::1;57845:8:::0;57205:1;57835:9:::1;:22::i;:::-;57117:3:::0;::::1;::::0;::::1;:::i;:::-;;;;57090:779;;50099:55:::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;54106:116::-;51648:17;:15;:17::i;:::-;54186:13:::1;:28:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;54186:28:0;;::::1;::::0;;;::::1;::::0;;54106:116::o;52726:98::-;14396:6;;-1:-1:-1;;;;;14396:6:0;13191:10;14543:23;14535:68;;;;-1:-1:-1;;;14535:68:0;;;;;;;:::i;:::-;52800:16:::1;:6;52809:7:::0;;52800:16:::1;:::i;36502:164::-:0;-1:-1:-1;;;;;36623:25:0;;;36599:4;36623:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;36502:164::o;61922:874::-;62035:4;62112:18;62133:27;:17;9915:14;;9823:114;62133:27;-1:-1:-1;;;;;62197:29:0;;62171:23;62197:29;;;:19;:29;;;;;;;;:39;;;;;;;;;62112:48;;-1:-1:-1;62251:20:0;;;:53;;;62294:10;62275:15;:29;;62251:53;62247:98;;;62328:5;62321:12;;;;;;62247:98;62408:12;62423:26;;;:14;:26;;;;;;62464:9;62460:54;;62497:5;62490:12;;;;;;;62460:54;62674:40;;;;:28;:40;;;;;;;;;;62617:32;;;;;18062:19:1;;;18097:12;;;18090:28;;;62654:3:0;;18134:12:1;;62617:32:0;;;;;;;;;;;;62607:43;;;;;;62599:52;;:58;;;;:::i;:::-;62598:116;62580:185;;;62748:5;62741:12;;;;;;;62580:185;-1:-1:-1;62784:4:0;;61922:874;-1:-1:-1;;;;;61922:874:0:o;15223:192::-;14396:6;;-1:-1:-1;;;;;14396:6:0;13191:10;14543:23;14535:68;;;;-1:-1:-1;;;14535:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;15312:22:0;::::1;15304:73;;;::::0;-1:-1:-1;;;15304:73:0;;24053:2:1;15304:73:0::1;::::0;::::1;24035:21:1::0;24092:2;24072:18;;;24065:30;24131:34;24111:18;;;24104:62;-1:-1:-1;;;24182:18:1;;;24175:36;24228:19;;15304:73:0::1;23851:402:1::0;15304:73:0::1;15388:19;15398:8;15388:9;:19::i;62804:418::-:0;62890:41;62910:10;62922:8;62890:19;:41::i;:::-;62868:126;;;;-1:-1:-1;;;62868:126:0;;31493:2:1;62868:126:0;;;31475:21:1;31532:2;31512:18;;;31505:30;31571:34;31551:18;;;31544:62;-1:-1:-1;;;31622:18:1;;;31615:33;31665:19;;62868:126:0;31291:399:1;62868:126:0;63034:10;63014:31;;;;:19;:31;;;;;;;;:41;;;;;;;;63007:48;63082:17;9915:14;;63120:39;;63014:41;9915:14;63120:12;:39::i;:::-;63175;;63210:3;;63198:10;;63188:8;;63175:39;;;;;62857:365;62804:418;:::o;57884:2359::-;58212:206;;-1:-1:-1;;12273:2:1;12269:15;;;12265:53;58212:206:0;;;12253:66:1;12335:12;;;12328:28;;;12372:12;;;12365:28;;;12409:12;;;12402:28;;;12477:14;;12470:22;12465:3;12461:32;;;12446:13;;;12439:55;12541:14;;12534:22;12525:32;;12510:13;;;12503:55;58173:12:0;;12574:13:1;;58212:206:0;;;-1:-1:-1;;58212:206:0;;;;;;;;;58188:241;;58212:206;58188:241;;;;58481:6;;58464:40;;;;;;;;;;;;;;;;;;58188:241;-1:-1:-1;58464:40:0;;-1:-1:-1;;;;;58481:6:0;;;;58188:241;;58495:8;;;;;;58464:40;;58495:8;;;;58464:40;;;;;;;;;-1:-1:-1;58464:16:0;;-1:-1:-1;;;58464:40:0:i;:::-;58442:113;;;;-1:-1:-1;;;58442:113:0;;34252:2:1;58442:113:0;;;34234:21:1;34291:2;34271:18;;;34264:30;34330:25;34310:18;;;34303:53;34373:18;;58442:113:0;34050:347:1;58442:113:0;58568:24;58595:31;;;:16;:31;;;;;;:43;;58629:9;;58595:43;:::i;:::-;58568:70;;58677:12;58657:16;:32;;58649:71;;;;-1:-1:-1;;;58649:71:0;;34604:2:1;58649:71:0;;;34586:21:1;34643:2;34623:18;;;34616:30;34682:28;34662:18;;;34655:56;34728:18;;58649:71:0;34402:350:1;58649:71:0;58733:31;;;;:16;:31;;;;;:44;;58768:9;;58733:31;:44;;58768:9;;58733:44;:::i;:::-;;;;-1:-1:-1;;58840:49:0;;;;;;;;;;;;;;;;;58904:32;;;:51;;;;;58940:15;58904:51;58900:213;;;59003:13;59015:1;59003:9;:13;:::i;:::-;58993:24;;:6;:24;:::i;:::-;58980:9;:37;;59019:3;58972:51;;;;;-1:-1:-1;;;58972:51:0;;;;;;;;:::i;:::-;;58900:213;;;59077:18;59086:9;59077:6;:18;:::i;:::-;59064:9;:31;;59097:3;59056:45;;;;;-1:-1:-1;;;59056:45:0;;;;;;;;:::i;:::-;;58900:213;59129:14;59125:1053;;;47972:3;59307:9;59266:38;:28;9915:14;;9823:114;59266:38;:50;;;;:::i;:::-;:86;;59240:176;;;;-1:-1:-1;;;59240:176:0;;26295:2:1;59240:176:0;;;26277:21:1;26334:2;26314:18;;;26307:30;26373;26353:18;;;26346:58;26421:18;;59240:176:0;26093:352:1;59240:176:0;59436:9;59431:281;59455:9;59451:1;:13;59431:281;;;59490:40;:28;10034:19;;10052:1;10034:19;;;9945:127;59490:40;59549:147;59584:8;59615:38;:28;9915:14;;9823:114;59549:147;59466:3;;;;:::i;:::-;;;;59431:281;;;;59125:1053;;;47923:4;59845:9;59811:31;:21;9915:14;;9823:114;59811:31;:43;;;;:::i;:::-;:86;;59785:180;;;;-1:-1:-1;;;59785:180:0;;36791:2:1;59785:180:0;;;36773:21:1;;;36810:18;;;36803:30;36869:34;36849:18;;;36842:62;36921:18;;59785:180:0;36589:356:1;59785:180:0;59987:9;59982:185;60006:9;60002:1;:13;59982:185;;;60041:33;:21;10034:19;;10052:1;10034:19;;;9945:127;60041:33;60093:58;60106:8;60116:31;:21;9915:14;;9823:114;60093:58;60017:3;;;;:::i;:::-;;;;59982:185;;;;59125:1053;60217:6;60207:8;-1:-1:-1;;;;;60195:40:0;;60225:9;60195:40;;;;38485:25:1;;38473:2;38458:18;;38339:177;60195:40:0;;;;;;;;58162:2081;;;57884:2359;;;;;;;;;:::o;67308:334::-;67371:8;51746:23;51760:8;51746:13;:23::i;:::-;67392:14:::1;67409:34;67434:8;67409:24;:34::i;:::-;67461:19;::::0;;;:9:::1;:19;::::0;;;;67454:26;67392:51;-1:-1:-1;67497:11:0;;67493:95:::1;;67531:19;::::0;67525:51:::1;::::0;-1:-1:-1;;;67525:51:0;;67557:10:::1;67525:51;::::0;::::1;19445::1::0;19512:18;;;19505:34;;;-1:-1:-1;;;;;67531:19:0;;::::1;::::0;67525:31:::1;::::0;19418:18:1;;67525:51:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;67493:95;67617:8;67605:29;67627:6;67605:29;;;;38485:25:1::0;;38473:2;38458:18;;38339:177;67605:29:0::1;;;;;;;;67381:261;67308:334:::0;;:::o;43219:174::-;43294:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;43294:29:0;-1:-1:-1;;;;;43294:29:0;;;;;;;;:24;;43348:23;43294:24;43348:14;:23::i;:::-;-1:-1:-1;;;;;43339:46:0;;;;;;;;;;;43219:174;;:::o;70700:867::-;70836:12;;;;70884:13;;;;70933;;;;70982;;;;71031:12;;;;71079:16;;;;71131:10;;;;71177:11;;;;71224:7;;70822:26;71210:21;;;71163:25;;;71117:24;;;71065:30;;;71017:26;;;70968:27;;;70919;;;70870;;70878:2;70871:9;;;;;70870:27;70920:9;;70919:27;;;;70969:9;;70968:27;;;;71018:9;;71017:26;;;;71066:9;;71065:30;71118:9;;71117:24;71164:9;;71163:25;71211:9;;71210:21;71261:1;71254:8;;;71253:14;;70700:867::o;51239:184::-;51347:10;51326:17;51334:8;51326:7;:17::i;:::-;-1:-1:-1;;;;;51326:31:0;;51304:111;;;;-1:-1:-1;;;51304:111:0;;35662:2:1;51304:111:0;;;35644:21:1;35701:2;35681:18;;;35674:30;35740:32;35720:18;;;35713:60;35790:18;;51304:111:0;35460:354:1;39531:348:0;39624:4;39326:16;;;:7;:16;;;;;;-1:-1:-1;;;;;39326:16:0;39641:73;;;;-1:-1:-1;;;39641:73:0;;27055:2:1;39641:73:0;;;27037:21:1;27094:2;27074:18;;;27067:30;27133:34;27113:18;;;27106:62;-1:-1:-1;;;27184:18:1;;;27177:42;27236:19;;39641:73:0;26853:408:1;39641:73:0;39725:13;39741:23;39756:7;39741:14;:23::i;:::-;39725:39;;39794:5;-1:-1:-1;;;;;39783:16:0;:7;-1:-1:-1;;;;;39783:16:0;;:51;;;;39827:7;-1:-1:-1;;;;;39803:31:0;:20;39815:7;39803:11;:20::i;:::-;-1:-1:-1;;;;;39803:31:0;;39783:51;:87;;;;39838:32;39855:5;39862:7;39838:16;:32::i;:::-;39775:96;39531:348;-1:-1:-1;;;;39531:348:0:o;42523:578::-;42682:4;-1:-1:-1;;;;;42655:31:0;:23;42670:7;42655:14;:23::i;:::-;-1:-1:-1;;;;;42655:31:0;;42647:85;;;;-1:-1:-1;;;42647:85:0;;32666:2:1;42647:85:0;;;32648:21:1;32705:2;32685:18;;;32678:30;32744:34;32724:18;;;32717:62;-1:-1:-1;;;32795:18:1;;;32788:39;32844:19;;42647:85:0;32464:405:1;42647:85:0;-1:-1:-1;;;;;42751:16:0;;42743:65;;;;-1:-1:-1;;;42743:65:0;;25177:2:1;42743:65:0;;;25159:21:1;25216:2;25196:18;;;25189:30;25255:34;25235:18;;;25228:62;-1:-1:-1;;;25306:18:1;;;25299:34;25350:19;;42743:65:0;24975:400:1;42743:65:0;42821:39;42842:4;42848:2;42852:7;42821:20;:39::i;:::-;42925:29;42942:1;42946:7;42925:8;:29::i;:::-;-1:-1:-1;;;;;42967:15:0;;;;;;:9;:15;;;;;:20;;42986:1;;42967:15;:20;;42986:1;;42967:20;:::i;:::-;;;;-1:-1:-1;;;;;;;42998:13:0;;;;;;:9;:13;;;;;:18;;43015:1;;42998:13;:18;;43015:1;;42998:18;:::i;:::-;;;;-1:-1:-1;;43027:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;43027:21:0;-1:-1:-1;;;;;43027:21:0;;;;;;;;;43066:27;;43027:16;;43066:27;;;;;;;42523:578;;;:::o;51431:170::-;51515:10;51504:7;14396:6;;-1:-1:-1;;;;;14396:6:0;;14323:87;51504:7;-1:-1:-1;;;;;51504:21:0;;:43;;;-1:-1:-1;51536:10:0;51529:18;;;;:6;:18;;;;;;;;51504:43;51482:111;;;;-1:-1:-1;;;51482:111:0;;34959:2:1;51482:111:0;;;34941:21:1;34998:2;34978:18;;;34971:30;-1:-1:-1;;;35017:18:1;;;35010:48;35075:18;;51482:111:0;34757:342:1;41826:360:0;41886:13;41902:23;41917:7;41902:14;:23::i;:::-;41886:39;;41938:48;41959:5;41974:1;41978:7;41938:20;:48::i;:::-;42027:29;42044:1;42048:7;42027:8;:29::i;:::-;-1:-1:-1;;;;;42069:16:0;;;;;;:9;:16;;;;;:21;;42089:1;;42069:16;:21;;42089:1;;42069:21;:::i;:::-;;;;-1:-1:-1;;42108:16:0;;;;:7;:16;;;;;;42101:23;;-1:-1:-1;;;;;;42101:23:0;;;42142:36;42116:7;;42108:16;-1:-1:-1;;;;;42142:36:0;;;;;42108:16;;42142:36;41875:311;41826:360;:::o;60977:937::-;61102:11;61165:8;61175;61185:10;:8;:10::i;:::-;61148:48;;11837:2:1;11833:15;;;;-1:-1:-1;;11829:53:1;61148:48:0;;;11817:66:1;11899:12;;;11892:28;;;;11936:12;;;11929:28;11973:12;;61148:48:0;;;-1:-1:-1;;61148:48:0;;;;;;;;;61138:59;;61148:48;61138:59;;;;;-1:-1:-1;61806:15:0;61812:4;61820:1;61806:15;:::i;:::-;61833:27;;;;:17;:27;;;;;-1:-1:-1;;61786:15:0;;;61785:37;;;;;;61833:33;;;;61877:29;61887:8;61851;61877:9;:29::i;70579:113::-;70621:7;70666:16;70681:1;70666:12;:16;:::i;:::-;70656:27;;70579:113;-1:-1:-1;70579:113:0:o;15423:173::-;15498:6;;;-1:-1:-1;;;;;15515:17:0;;;-1:-1:-1;;;;;;15515:17:0;;;;;;;15548:40;;15498:6;;;15515:17;15498:6;;15548:40;;15479:16;;15548:40;15468:128;15423:173;:::o;38609:315::-;38766:28;38776:4;38782:2;38786:7;38766:9;:28::i;:::-;38813:48;38836:4;38842:2;38846:7;38855:5;38813:22;:48::i;:::-;38805:111;;;;-1:-1:-1;;;38805:111:0;;;;;;;:::i;71575:360::-;71635:4;71713;71720:1;71713:8;71725:1;71713:13;71709:57;;;-1:-1:-1;71750:4:0;;71575:360;-1:-1:-1;71575:360:0:o;71709:57::-;-1:-1:-1;71917:1:0;71909:9;71922:4;71908:18;;;71887:40;;;;:20;:40;;;;;;;;71575:360::o;72679:2988::-;72792:6;;72878:16;:11;72892:2;72878:16;:::i;:::-;72859:35;;73191:4;73198:1;73191:8;73203:1;73191:13;73187:95;;;73245:1;73237:9;;;73236:23;;73263:6;73235:34;;-1:-1:-1;73221:49:0;;73187:95;73486:11;73501:1;73486:16;73482:57;;;73526:1;73519:8;;;;;73482:57;73675:4;73670:1;73662:9;;;73661:18;73647:11;73804:23;;;:18;:23;;;;;;;;73865:16;:21;;;;;:34;;;;;;;;;74206:6;74188:1;74180:9;;;74179:23;;74178:34;74260:1;74245:16;;;:36;;;74265:11;74280:1;74265:16;74245:36;:56;;;;74285:11;74300:1;74285:16;74245:56;74244:222;;;;;74464:2;74458:3;74433:11;74446:6;74416:37;;;;;;;;;:::i;:::-;;;;;;;;;;;;;74406:48;;;;;;74398:57;;:63;;;;:::i;:::-;:68;74244:222;74226:311;;;74524:1;74517:8;;;;;;;;;74226:311;74714:43;;;;;;;18387:19:1;;;18422:12;;;18415:28;;;10829:12;;10860:6;10887:13;;;18496:12;;;10875:26;10941:2;10937:13;;;10933:22;;10917:14;;;10910:46;10990:15;;;;10986:24;;10972:12;;;10965:46;11049:2;11045:13;11041:22;;;11027:12;;;11020:44;74657:21:0;;74772:3;;18525:13:1;;74714:43:0;;;;;;;;;;;;74704:54;;;;;;74682:87;;:93;;;;:::i;:::-;74681:99;;74779:1;74681:99;:::i;:::-;75101:10;;74657:123;;-1:-1:-1;74793:18:0;;;;75101:10;;75084:27;;75080:412;;75164:9;;;;;-1:-1:-1;75164:6:0;:9;75199;;;;;;;;;;;;;;;;;;;;;75188:20;;;;75080:412;;;75260:10;;75247:23;;75260:10;;;;;75247;;;;:23;:::i;:::-;75230:40;;:13;:40;75226:266;;75325:9;;;;;;;;-1:-1:-1;75325:6:0;:9;75360;;75226:266;-1:-1:-1;;75436:9:0;;;;;;;;;75471;;;;75226:266;75648:10;75622:21;75648:10;75622:8;:21;:::i;:::-;75607:37;;:11;:37;:::i;:::-;75606:52;;;;:::i;:::-;75592:67;72679:2988;-1:-1:-1;;;;;;;;;;;72679:2988:0:o;75675:724::-;75732:13;75953:10;75949:53;;-1:-1:-1;;75980:10:0;;;;;;;;;;;;-1:-1:-1;;;75980:10:0;;;;;75675:724::o;75949:53::-;76027:5;76012:12;76068:78;76075:9;;76068:78;;76101:8;;;;:::i;:::-;;-1:-1:-1;76124:10:0;;-1:-1:-1;76132:2:0;76124:10;;:::i;:::-;;;76068:78;;;76156:19;76188:6;76178:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;76178:17:0;;76156:39;;76206:154;76213:10;;76206:154;;76240:11;76250:1;76240:11;;:::i;:::-;;-1:-1:-1;76309:10:0;76317:2;76309:5;:10;:::i;:::-;76296:24;;:2;:24;:::i;:::-;76283:39;;76266:6;76273;76266:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;76266:56:0;;;;;;;;-1:-1:-1;76337:11:0;76346:2;76337:11;;:::i;:::-;;;76206:154;;40221:110;40297:26;40307:2;40311:7;40297:26;;;;;;;;;;;;:9;:26::i;70301:270::-;70440:4;70501:62;70515:35;70544:5;8386:58;;17435:66:1;8386:58:0;;;17423:79:1;17518:12;;;17511:28;;;8253:7:0;;17555:12:1;;8386:58:0;;;;;;;;;;;;8376:69;;;;;;8369:76;;8184:269;;;;70515:35;70552:10;70501:13;:62::i;:::-;-1:-1:-1;;;;;70477:86:0;:7;-1:-1:-1;;;;;70477:86:0;;70457:106;;70301:270;;;;;:::o;67705:278::-;67868:18;;;;:9;:18;;;;;;:23;67846:129;;;;-1:-1:-1;;;67846:129:0;;30711:2:1;67846:129:0;;;30693:21:1;30750:2;30730:18;;;30723:30;30789:34;30769:18;;;30762:62;30860:26;30840:18;;;30833:54;30904:19;;67846:129:0;30509:420:1;43958:799:0;44113:4;-1:-1:-1;;;;;44134:13:0;;16692:20;16740:8;44130:620;;44170:72;;-1:-1:-1;;;44170:72:0;;-1:-1:-1;;;;;44170:36:0;;;;;:72;;13191:10;;44221:4;;44227:7;;44236:5;;44170:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44170:72:0;;;;;;;;-1:-1:-1;;44170:72:0;;;;;;;;;;;;:::i;:::-;;;44166:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44412:13:0;;44408:272;;44455:60;;-1:-1:-1;;;44455:60:0;;;;;;;:::i;44408:272::-;44630:6;44624:13;44615:6;44611:2;44607:15;44600:38;44166:529;-1:-1:-1;;;;;;44293:51:0;-1:-1:-1;;;44293:51:0;;-1:-1:-1;44286:58:0;;44130:620;-1:-1:-1;44734:4:0;43958:799;;;;;;:::o;40558:321::-;40688:18;40694:2;40698:7;40688:5;:18::i;:::-;40739:54;40770:1;40774:2;40778:7;40787:5;40739:22;:54::i;:::-;40717:154;;;;-1:-1:-1;;;40717:154:0;;;;;;;:::i;4335:231::-;4413:7;4434:17;4453:18;4475:27;4486:4;4492:9;4475:10;:27::i;:::-;4433:69;;;;4513:18;4525:5;4513:11;:18::i;:::-;-1:-1:-1;4549:9:0;4335:231;-1:-1:-1;;;4335:231:0:o;41215:382::-;-1:-1:-1;;;;;41295:16:0;;41287:61;;;;-1:-1:-1;;;41287:61:0;;29535:2:1;41287:61:0;;;29517:21:1;;;29554:18;;;29547:30;29613:34;29593:18;;;29586:62;29665:18;;41287:61:0;29333:356:1;41287:61:0;39302:4;39326:16;;;:7;:16;;;;;;-1:-1:-1;;;;;39326:16:0;:30;41359:58;;;;-1:-1:-1;;;41359:58:0;;24460:2:1;41359:58:0;;;24442:21:1;24499:2;24479:18;;;24472:30;24538;24518:18;;;24511:58;24586:18;;41359:58:0;24258:352:1;41359:58:0;41430:45;41459:1;41463:2;41467:7;41430:20;:45::i;:::-;-1:-1:-1;;;;;41488:13:0;;;;;;:9;:13;;;;;:18;;41505:1;;41488:13;:18;;41505:1;;41488:18;:::i;:::-;;;;-1:-1:-1;;41517:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;41517:21:0;-1:-1:-1;;;;;41517:21:0;;;;;;;;41556:33;;41517:16;;;41556:33;;41517:16;;41556:33;41215:382;;:::o;2225:1308::-;2306:7;2315:12;2540:9;:16;2560:2;2540:22;2536:990;;;2836:4;2821:20;;2815:27;2886:4;2871:20;;2865:27;2944:4;2929:20;;2923:27;2579:9;2915:36;2987:25;2998:4;2915:36;2815:27;2865;2987:10;:25::i;:::-;2980:32;;;;;;;;;2536:990;3034:9;:16;3054:2;3034:22;3030:496;;;3309:4;3294:20;;3288:27;3360:4;3345:20;;3339:27;3402:23;3413:4;3288:27;3339;3402:10;:23::i;:::-;3395:30;;;;;;;;3030:496;-1:-1:-1;3474:1:0;;-1:-1:-1;3478:35:0;3030:496;2225:1308;;;;;:::o;496:643::-;574:20;565:5;:29;;;;;;;;:::i;:::-;;561:571;;;496:643;:::o;561:571::-;672:29;663:5;:38;;;;;;;;:::i;:::-;;659:473;;;718:34;;-1:-1:-1;;;718:34:0;;22162:2:1;718:34:0;;;22144:21:1;22201:2;22181:18;;;22174:30;22240:26;22220:18;;;22213:54;22284:18;;718:34:0;21960:348:1;659:473:0;783:35;774:5;:44;;;;;;;;:::i;:::-;;770:362;;;835:41;;-1:-1:-1;;;835:41:0;;22918:2:1;835:41:0;;;22900:21:1;22957:2;22937:18;;;22930:30;22996:33;22976:18;;;22969:61;23047:18;;835:41:0;22716:355:1;770:362:0;907:30;898:5;:39;;;;;;;;:::i;:::-;;894:238;;;954:44;;-1:-1:-1;;;954:44:0;;26652:2:1;954:44:0;;;26634:21:1;26691:2;26671:18;;;26664:30;26730:34;26710:18;;;26703:62;-1:-1:-1;;;26781:18:1;;;26774:32;26823:19;;954:44:0;26450:398:1;894:238:0;1029:30;1020:5;:39;;;;;;;;:::i;:::-;;1016:116;;;1076:44;;-1:-1:-1;;;1076:44:0;;29132:2:1;1076:44:0;;;29114:21:1;29171:2;29151:18;;;29144:30;29210:34;29190:18;;;29183:62;-1:-1:-1;;;29261:18:1;;;29254:32;29303:19;;1076:44:0;28930:398:1;5834:1632:0;5965:7;;6899:66;6886:79;;6882:163;;;-1:-1:-1;6998:1:0;;-1:-1:-1;7002:30:0;6982:51;;6882:163;7059:1;:7;;7064:2;7059:7;;:18;;;;;7070:1;:7;;7075:2;7070:7;;7059:18;7055:102;;;-1:-1:-1;7110:1:0;;-1:-1:-1;7114:30:0;7094:51;;7055:102;7271:24;;;7254:14;7271:24;;;;;;;;;21154:25:1;;;21227:4;21215:17;;21195:18;;;21188:45;;;;21249:18;;;21242:34;;;21292:18;;;21285:34;;;7271:24:0;;21126:19:1;;7271:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;7271:24:0;;-1:-1:-1;;7271:24:0;;;-1:-1:-1;;;;;;;7310:20:0;;7306:103;;7363:1;7367:29;7347:50;;;;;;;7306:103;7429:6;-1:-1:-1;7437:20:0;;-1:-1:-1;5834:1632:0;;;;;;;;:::o;4829:391::-;4943:7;;-1:-1:-1;;;;;5044:75:0;;5146:3;5142:12;;;5156:2;5138:21;5187:25;5198:4;5138:21;5207:1;5044:75;5187:10;:25::i;:::-;5180:32;;;;;;4829:391;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:631:1:-;78:5;108:18;149:2;141:6;138:14;135:40;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:72;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:45;;;532:1;529;522:12;491:45;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;14:631;;;;;:::o;650:173::-;718:20;;-1:-1:-1;;;;;767:31:1;;757:42;;747:70;;813:1;810;803:12;747:70;650:173;;;:::o;828:159::-;921:6;954:3;942:16;;939:25;-1:-1:-1;936:45:1;;;977:1;974;967:12;992:163;1089:6;1122:3;1110:16;;1107:25;-1:-1:-1;1104:45:1;;;1145:1;1142;1135:12;1160:159;1254:6;1287:2;1275:15;;1272:24;-1:-1:-1;1269:44:1;;;1309:1;1306;1299:12;1324:160;1389:20;;1445:13;;1438:21;1428:32;;1418:60;;1474:1;1471;1464:12;1489:347;1540:8;1550:6;1604:3;1597:4;1589:6;1585:17;1581:27;1571:55;;1622:1;1619;1612:12;1571:55;-1:-1:-1;1645:20:1;;1688:18;1677:30;;1674:50;;;1720:1;1717;1710:12;1674:50;1757:4;1749:6;1745:17;1733:29;;1809:3;1802:4;1793:6;1785;1781:19;1777:30;1774:39;1771:59;;;1826:1;1823;1816:12;1841:159;1908:20;;1968:6;1957:18;;1947:29;;1937:57;;1990:1;1987;1980:12;2005:186;2064:6;2117:2;2105:9;2096:7;2092:23;2088:32;2085:52;;;2133:1;2130;2123:12;2085:52;2156:29;2175:9;2156:29;:::i;:::-;2146:39;2005:186;-1:-1:-1;;;2005:186:1:o;2196:260::-;2264:6;2272;2325:2;2313:9;2304:7;2300:23;2296:32;2293:52;;;2341:1;2338;2331:12;2293:52;2364:29;2383:9;2364:29;:::i;:::-;2354:39;;2412:38;2446:2;2435:9;2431:18;2412:38;:::i;:::-;2402:48;;2196:260;;;;;:::o;2461:328::-;2538:6;2546;2554;2607:2;2595:9;2586:7;2582:23;2578:32;2575:52;;;2623:1;2620;2613:12;2575:52;2646:29;2665:9;2646:29;:::i;:::-;2636:39;;2694:38;2728:2;2717:9;2713:18;2694:38;:::i;:::-;2684:48;;2779:2;2768:9;2764:18;2751:32;2741:42;;2461:328;;;;;:::o;2794:666::-;2889:6;2897;2905;2913;2966:3;2954:9;2945:7;2941:23;2937:33;2934:53;;;2983:1;2980;2973:12;2934:53;3006:29;3025:9;3006:29;:::i;:::-;2996:39;;3054:38;3088:2;3077:9;3073:18;3054:38;:::i;:::-;3044:48;;3139:2;3128:9;3124:18;3111:32;3101:42;;3194:2;3183:9;3179:18;3166:32;3221:18;3213:6;3210:30;3207:50;;;3253:1;3250;3243:12;3207:50;3276:22;;3329:4;3321:13;;3317:27;-1:-1:-1;3307:55:1;;3358:1;3355;3348:12;3307:55;3381:73;3446:7;3441:2;3428:16;3423:2;3419;3415:11;3381:73;:::i;:::-;3371:83;;;2794:666;;;;;;;:::o;3465:254::-;3530:6;3538;3591:2;3579:9;3570:7;3566:23;3562:32;3559:52;;;3607:1;3604;3597:12;3559:52;3630:29;3649:9;3630:29;:::i;:::-;3620:39;;3678:35;3709:2;3698:9;3694:18;3678:35;:::i;3724:254::-;3792:6;3800;3853:2;3841:9;3832:7;3828:23;3824:32;3821:52;;;3869:1;3866;3859:12;3821:52;3892:29;3911:9;3892:29;:::i;:::-;3882:39;3968:2;3953:18;;;;3940:32;;-1:-1:-1;;;3724:254:1:o;3983:380::-;4084:6;4092;4100;4153:3;4141:9;4132:7;4128:23;4124:33;4121:53;;;4170:1;4167;4160:12;4121:53;4193:29;4212:9;4193:29;:::i;:::-;4183:39;;4269:2;4258:9;4254:18;4241:32;4231:42;;4292:65;4349:7;4344:2;4333:9;4329:18;4292:65;:::i;:::-;4282:75;;3983:380;;;;;:::o;4368:896::-;4495:6;4503;4511;4519;4527;4535;4543;4551;4559;4612:3;4600:9;4591:7;4587:23;4583:33;4580:53;;;4629:1;4626;4619:12;4580:53;4652:29;4671:9;4652:29;:::i;:::-;4642:39;;4728:2;4717:9;4713:18;4700:32;4690:42;;4779:2;4768:9;4764:18;4751:32;4741:42;;4830:2;4819:9;4815:18;4802:32;4792:42;;4853:36;4884:3;4873:9;4869:19;4853:36;:::i;:::-;4843:46;;4908:36;4939:3;4928:9;4924:19;4908:36;:::i;:::-;4898:46;;4991:3;4980:9;4976:19;4963:33;4953:43;;5047:3;5036:9;5032:19;5019:33;5075:18;5067:6;5064:30;5061:50;;;5107:1;5104;5097:12;5061:50;5146:58;5196:7;5187:6;5176:9;5172:22;5146:58;:::i;:::-;5120:84;;5223:8;5213:18;;;5250:8;5240:18;;;4368:896;;;;;;;;;;;:::o;5269:359::-;5387:6;5395;5448:3;5436:9;5427:7;5423:23;5419:33;5416:53;;;5465:1;5462;5455:12;5416:53;5488;5533:7;5522:9;5488:53;:::i;:::-;5478:63;;5560:62;5614:7;5609:2;5598:9;5594:18;5560:62;:::i;5633:180::-;5689:6;5742:2;5730:9;5721:7;5717:23;5713:32;5710:52;;;5758:1;5755;5748:12;5710:52;5781:26;5797:9;5781:26;:::i;5818:245::-;5876:6;5929:2;5917:9;5908:7;5904:23;5900:32;5897:52;;;5945:1;5942;5935:12;5897:52;5984:9;5971:23;6003:30;6027:5;6003:30;:::i;6068:249::-;6137:6;6190:2;6178:9;6169:7;6165:23;6161:32;6158:52;;;6206:1;6203;6196:12;6158:52;6238:9;6232:16;6257:30;6281:5;6257:30;:::i;6322:410::-;6393:6;6401;6454:2;6442:9;6433:7;6429:23;6425:32;6422:52;;;6470:1;6467;6460:12;6422:52;6510:9;6497:23;6543:18;6535:6;6532:30;6529:50;;;6575:1;6572;6565:12;6529:50;6614:58;6664:7;6655:6;6644:9;6640:22;6614:58;:::i;:::-;6691:8;;6588:84;;-1:-1:-1;6322:410:1;-1:-1:-1;;;;6322:410:1:o;6737:450::-;6806:6;6859:2;6847:9;6838:7;6834:23;6830:32;6827:52;;;6875:1;6872;6865:12;6827:52;6915:9;6902:23;6948:18;6940:6;6937:30;6934:50;;;6980:1;6977;6970:12;6934:50;7003:22;;7056:4;7048:13;;7044:27;-1:-1:-1;7034:55:1;;7085:1;7082;7075:12;7034:55;7108:73;7173:7;7168:2;7155:16;7150:2;7146;7142:11;7108:73;:::i;7192:184::-;7250:6;7303:2;7291:9;7282:7;7278:23;7274:32;7271:52;;;7319:1;7316;7309:12;7271:52;7342:28;7360:9;7342:28;:::i;7381:180::-;7440:6;7493:2;7481:9;7472:7;7468:23;7464:32;7461:52;;;7509:1;7506;7499:12;7461:52;-1:-1:-1;7532:23:1;;7381:180;-1:-1:-1;7381:180:1:o;7566:1157::-;7889:6;7897;7905;7913;7921;7929;7937;7945;7953;8006:4;7994:9;7985:7;7981:23;7977:34;7974:54;;;8024:1;8021;8014:12;7974:54;8060:9;8047:23;8037:33;;8089:61;8142:7;8137:2;8126:9;8122:18;8089:61;:::i;:::-;8079:71;;8169:62;8223:7;8217:3;8206:9;8202:19;8169:62;:::i;:::-;8159:72;;8250:62;8304:7;8298:3;8287:9;8283:19;8250:62;:::i;:::-;8240:72;;8331:62;8385:7;8379:3;8368:9;8364:19;8331:62;:::i;:::-;8321:72;;8412:62;8466:7;8460:3;8449:9;8445:19;8412:62;:::i;:::-;8402:72;;8493:62;8547:7;8541:3;8530:9;8526:19;8493:62;:::i;:::-;8483:72;;8574:62;8628:7;8622:3;8611:9;8607:19;8574:62;:::i;:::-;8564:72;;8655:62;8709:7;8703:3;8692:9;8688:19;8655:62;:::i;:::-;8645:72;;7566:1157;;;;;;;;;;;:::o;8728:248::-;8793:6;8801;8854:2;8842:9;8833:7;8829:23;8825:32;8822:52;;;8870:1;8867;8860:12;8822:52;8906:9;8893:23;8883:33;;8935:35;8966:2;8955:9;8951:18;8935:35;:::i;8981:478::-;9061:6;9069;9077;9130:2;9118:9;9109:7;9105:23;9101:32;9098:52;;;9146:1;9143;9136:12;9098:52;9182:9;9169:23;9159:33;;9243:2;9232:9;9228:18;9215:32;9270:18;9262:6;9259:30;9256:50;;;9302:1;9299;9292:12;9256:50;9341:58;9391:7;9382:6;9371:9;9367:22;9341:58;:::i;:::-;8981:478;;9418:8;;-1:-1:-1;9315:84:1;;-1:-1:-1;;;;8981:478:1:o;9464:324::-;9539:6;9547;9555;9608:2;9596:9;9587:7;9583:23;9579:32;9576:52;;;9624:1;9621;9614:12;9576:52;9660:9;9647:23;9637:33;;9689:37;9722:2;9711:9;9707:18;9689:37;:::i;:::-;9679:47;;9745:37;9778:2;9767:9;9763:18;9745:37;:::i;9793:248::-;9861:6;9869;9922:2;9910:9;9901:7;9897:23;9893:32;9890:52;;;9938:1;9935;9928:12;9890:52;-1:-1:-1;;9961:23:1;;;10031:2;10016:18;;;10003:32;;-1:-1:-1;9793:248:1:o;10046:374::-;10147:6;10155;10163;10216:3;10204:9;10195:7;10191:23;10187:33;10184:53;;;10233:1;10230;10223:12;10184:53;10269:9;10256:23;10246:33;;10326:2;10315:9;10311:18;10298:32;10288:42;;10349:65;10406:7;10401:2;10390:9;10386:18;10349:65;:::i;10425:316::-;10502:6;10510;10518;10571:2;10559:9;10550:7;10546:23;10542:32;10539:52;;;10587:1;10584;10577:12;10539:52;-1:-1:-1;;10610:23:1;;;10680:2;10665:18;;10652:32;;-1:-1:-1;10731:2:1;10716:18;;;10703:32;;10425:316;-1:-1:-1;10425:316:1:o;11075:268::-;11127:3;11165:5;11159:12;11192:6;11187:3;11180:19;11208:63;11264:6;11257:4;11252:3;11248:14;11241:4;11234:5;11230:16;11208:63;:::i;:::-;11325:2;11304:15;-1:-1:-1;;11300:29:1;11291:39;;;;11332:4;11287:50;;11075:268;-1:-1:-1;;11075:268:1:o;11348:184::-;11389:3;11427:5;11421:12;11442:52;11487:6;11482:3;11475:4;11468:5;11464:16;11442:52;:::i;:::-;11510:16;;;;;11348:184;-1:-1:-1;;11348:184:1:o;12598:273::-;12783:6;12775;12770:3;12757:33;12739:3;12809:16;;12834:13;;;12809:16;12598:273;-1:-1:-1;12598:273:1:o;12876:276::-;13007:3;13045:6;13039:13;13061:53;13107:6;13102:3;13095:4;13087:6;13083:17;13061:53;:::i;:::-;13130:16;;;;;12876:276;-1:-1:-1;;12876:276:1:o;13157:1257::-;13528:3;13566:6;13560:13;13592:4;13605:51;13649:6;13644:3;13639:2;13631:6;13627:15;13605:51;:::i;:::-;13719:13;;13678:16;;;;13741:55;13719:13;13678:16;13763:15;;;13741:55;:::i;:::-;13863:13;;13818:20;;;13885:55;13863:13;13818:20;13907:15;;;13885:55;:::i;:::-;14007:13;;13962:20;;;14029:55;14007:13;13962:20;14051:15;;;14029:55;:::i;:::-;14151:13;;14106:20;;;14173:55;14151:13;14106:20;14195:15;;;14173:55;:::i;:::-;14295:13;;14250:20;;;14317:55;14295:13;14250:20;14339:15;;;14317:55;:::i;:::-;14388:20;;;;;13157:1257;-1:-1:-1;;;;;;;;;13157:1257:1:o;14419:1449::-;14838:3;14876:6;14870:13;14902:4;14915:51;14959:6;14954:3;14949:2;14941:6;14937:15;14915:51;:::i;:::-;15029:13;;14988:16;;;;15051:55;15029:13;14988:16;15073:15;;;15051:55;:::i;:::-;15173:13;;15128:20;;;15195:55;15173:13;15128:20;15217:15;;;15195:55;:::i;:::-;15317:13;;15272:20;;;15339:55;15317:13;15272:20;15361:15;;;15339:55;:::i;:::-;15461:13;;15416:20;;;15483:55;15461:13;15416:20;15505:15;;;15483:55;:::i;:::-;15605:13;;15560:20;;;15627:55;15605:13;15560:20;15649:15;;;15627:55;:::i;:::-;15749:13;;15704:20;;;15771:55;15749:13;15704:20;15793:15;;;15771:55;:::i;:::-;15842:20;;;;;14419:1449;-1:-1:-1;;;;;;;;;;14419:1449:1:o;15873:1315::-;16139:3;16168:1;16201:6;16195:13;16231:3;16253:1;16281:9;16277:2;16273:18;16263:28;;16341:2;16330:9;16326:18;16363;16353:61;;16407:4;16399:6;16395:17;16385:27;;16353:61;16433:2;16481;16473:6;16470:14;16450:18;16447:38;16444:165;;;-1:-1:-1;;;16508:33:1;;16564:4;16561:1;16554:15;16594:4;16515:3;16582:17;16444:165;16625:18;16652:104;;;;16770:1;16765:320;;;;16618:467;;16652:104;-1:-1:-1;;16685:24:1;;16673:37;;16730:16;;;;-1:-1:-1;16652:104:1;;16765:320;38847:1;38840:14;;;38884:4;38871:18;;16860:1;16874:165;16888:6;16885:1;16882:13;16874:165;;;16966:14;;16953:11;;;16946:35;17009:16;;;;16903:10;;16874:165;;;16878:3;;17068:6;17063:3;17059:16;17052:23;;16618:467;;;;;;;17101:81;17126:55;17151:29;17176:3;17168:6;17151:29;:::i;:::-;17143:6;17126:55;:::i;:::-;17118:6;17101:81;:::i;:::-;17094:88;15873:1315;-1:-1:-1;;;;;;;15873:1315:1:o;17578:322::-;17792:6;17787:3;17780:19;17808:57;17861:2;17856:3;17852:12;17844:6;10835:5;10829:12;10860:6;10897:2;10891:4;10887:13;10882:3;10875:26;10952:2;10945:4;10941:2;10937:13;10933:22;10926:4;10921:3;10917:14;10910:46;11007:2;11000:4;10994;10990:15;10986:24;10981:2;10976:3;10972:12;10965:46;11060:2;11053:4;11049:2;11045:13;11041:22;11036:2;11031:3;11027:12;11020:44;;;10746:324;;;17808:57;17890:3;17881:13;;17578:322;-1:-1:-1;;17578:322:1:o;18757:499::-;-1:-1:-1;;;;;19026:15:1;;;19008:34;;19078:15;;19073:2;19058:18;;19051:43;19125:2;19110:18;;19103:34;;;19173:3;19168:2;19153:18;;19146:31;;;18951:4;;19194:56;;19230:19;;19222:6;19194:56;:::i;:::-;19186:64;18757:499;-1:-1:-1;;;;;;18757:499:1:o;19829:901::-;20055:3;20040:19;;20044:9;20136:6;20013:4;;20191:533;20207:4;20202:3;20199:13;20191:533;;;20268:13;;20307:3;20390:1;20404:236;20420:4;20415:3;20412:13;20404:236;;;20493:15;;20479:30;;20536:4;20609:17;;;;20566:14;;;;20444:1;20435:11;20404:236;;;-1:-1:-1;;;20669:4:1;20660:14;;;;;20709:4;20697:17;;;;;20231:1;20222:11;20191:533;;;20195:3;;;;19829:901;;;;:::o;21330:390::-;21489:2;21478:9;21471:21;21528:6;21523:2;21512:9;21508:18;21501:34;21585:6;21577;21572:2;21561:9;21557:18;21544:48;21641:1;21612:22;;;21636:2;21608:31;;;21601:42;;;;21704:2;21683:15;;;-1:-1:-1;;21679:29:1;21664:45;21660:54;;21330:390;-1:-1:-1;21330:390:1:o;21725:230::-;21874:2;21863:9;21856:21;21837:4;21894:55;21945:2;21934:9;21930:18;21922:6;21894:55;:::i;23432:414::-;23634:2;23616:21;;;23673:2;23653:18;;;23646:30;23712:34;23707:2;23692:18;;23685:62;-1:-1:-1;;;23778:2:1;23763:18;;23756:48;23836:3;23821:19;;23432:414::o;32103:356::-;32305:2;32287:21;;;32324:18;;;32317:30;32383:34;32378:2;32363:18;;32356:62;32450:2;32435:18;;32103:356::o;33632:413::-;33834:2;33816:21;;;33873:2;33853:18;;;33846:30;33912:34;33907:2;33892:18;;33885:62;-1:-1:-1;;;33978:2:1;33963:18;;33956:47;34035:3;34020:19;;33632:413::o;38900:224::-;38939:3;38967:6;39000:2;38997:1;38993:10;39030:2;39027:1;39023:10;39061:3;39057:2;39053:12;39048:3;39045:21;39042:47;;;39069:18;;:::i;:::-;39105:13;;38900:224;-1:-1:-1;;;;38900:224:1:o;39129:128::-;39169:3;39200:1;39196:6;39193:1;39190:13;39187:39;;;39206:18;;:::i;:::-;-1:-1:-1;39242:9:1;;39129:128::o;39262:120::-;39302:1;39328;39318:35;;39333:18;;:::i;:::-;-1:-1:-1;39367:9:1;;39262:120::o;39387:168::-;39427:7;39493:1;39489;39485:6;39481:14;39478:1;39475:21;39470:1;39463:9;39456:17;39452:45;39449:71;;;39500:18;;:::i;:::-;-1:-1:-1;39540:9:1;;39387:168::o;39560:238::-;39598:7;39638:4;39635:1;39631:12;39670:4;39667:1;39663:12;39730:3;39724:4;39720:14;39715:3;39712:23;39705:3;39698:11;39691:19;39687:49;39684:75;;;39739:18;;:::i;:::-;39779:13;;39560:238;-1:-1:-1;;;39560:238:1:o;39803:125::-;39843:4;39871:1;39868;39865:8;39862:34;;;39876:18;;:::i;:::-;-1:-1:-1;39913:9:1;;39803:125::o;39933:258::-;40005:1;40015:113;40029:6;40026:1;40023:13;40015:113;;;40105:11;;;40099:18;40086:11;;;40079:39;40051:2;40044:10;40015:113;;;40146:6;40143:1;40140:13;40137:48;;;-1:-1:-1;;40181:1:1;40163:16;;40156:27;39933:258::o;40196:380::-;40275:1;40271:12;;;;40318;;;40339:61;;40393:4;40385:6;40381:17;40371:27;;40339:61;40446:2;40438:6;40435:14;40415:18;40412:38;40409:161;;;40492:10;40487:3;40483:20;40480:1;40473:31;40527:4;40524:1;40517:15;40555:4;40552:1;40545:15;40409:161;;40196:380;;;:::o;40581:135::-;40620:3;-1:-1:-1;;40641:17:1;;40638:43;;;40661:18;;:::i;:::-;-1:-1:-1;40708:1:1;40697:13;;40581:135::o;40721:112::-;40753:1;40779;40769:35;;40784:18;;:::i;:::-;-1:-1:-1;40818:9:1;;40721:112::o;40838:127::-;40899:10;40894:3;40890:20;40887:1;40880:31;40930:4;40927:1;40920:15;40954:4;40951:1;40944:15;40970:127;41031:10;41026:3;41022:20;41019:1;41012:31;41062:4;41059:1;41052:15;41086:4;41083:1;41076:15;41102:127;41163:10;41158:3;41154:20;41151:1;41144:31;41194:4;41191:1;41184:15;41218:4;41215:1;41208:15;41234:127;41295:10;41290:3;41286:20;41283:1;41276:31;41326:4;41323:1;41316:15;41350:4;41347:1;41340:15;41366:127;41427:10;41422:3;41418:20;41415:1;41408:31;41458:4;41455:1;41448:15;41482:4;41479:1;41472:15;41498:131;-1:-1:-1;;;;;;41572:32:1;;41562:43;;41552:71;;41619:1;41616;41609:12

Swarm Source

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