ETH Price: $3,367.38 (-1.44%)
Gas: 7 Gwei

Token

Kinochromes ([k])
 

Overview

Max Total Supply

512 [k]

Holders

214

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
kingethy.eth
Balance
1 [k]
0xaa584127b91100dde6b52228c28848a7b1d059c9
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Kinochromes are fully onchain animated NFTs. Kino = cinema, or kinetic chrome = relating to color These animated little pixels dance with color for your viewing pleasure

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Kinochromes

Compiler Version
v0.8.9+commit.e5eed63a

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

// File: contracts/Base64.sol

// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.9;

library Base64 {
    bytes internal constant TABLE =
        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    /// @notice Encodes some bytes to the base64 representation
    function encode(bytes memory data) internal pure returns (string memory) {
        uint256 len = data.length;
        if (len == 0) return "";

        // multiply by 4/3 rounded up
        uint256 encodedLen = 4 * ((len + 2) / 3);

        // Add some extra buffer at the end
        bytes memory result = new bytes(encodedLen + 32);
        bytes memory table = TABLE;

        assembly {
            let tablePtr := add(table, 1)
            let resultPtr := add(result, 32)
            for {
                let i := 0
            } lt(i, len) {

            } {
                i := add(i, 3)
                let input := and(mload(add(data, i)), 0xffffff)
                let out := mload(add(tablePtr, and(shr(18, input), 0x3F)))
                out := shl(8, out)
                out := add(
                    out,
                    and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF)
                )
                out := shl(8, out)
                out := add(
                    out,
                    and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF)
                )
                out := shl(8, out)
                out := add(
                    out,
                    and(mload(add(tablePtr, and(input, 0x3F))), 0xFF)
                )
                out := shl(224, out)
                mstore(resultPtr, out)
                resultPtr := add(resultPtr, 4)
            }
            switch mod(len, 3)
            case 1 {
                mstore(sub(resultPtr, 2), shl(240, 0x3d3d))
            }
            case 2 {
                mstore(sub(resultPtr, 1), shl(248, 0x3d))
            }
            mstore(result, encodedLen)
        }
        return string(result);
    }
}

// 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/security/ReentrancyGuard.sol



pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

// File: @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/token/ERC721/IERC721.sol



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;

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

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



pragma solidity ^0.8.0;


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

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

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

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



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;


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

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



pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Base URI for computing {tokenURI}. 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: contracts/Kinochromes.sol


pragma solidity ^0.8.9;





//  _   ___                  _                                   
// | | / (_)                | |                                  
// | |/ / _ _ __   ___   ___| |__  _ __ ___  _ __ ___   ___  ___ 
// |    \| | '_ \ / _ \ / __| '_ \| '__/ _ \| '_ ` _ \ / _ \/ __|
// | |\  \ | | | | (_) | (__| | | | | | (_) | | | | | |  __/\__ \
// \_| \_/_|_| |_|\___/ \___|_| |_|_|  \___/|_| |_| |_|\___||___/
// by junkpunkie

contract Kinochromes is ERC721, ReentrancyGuard, Ownable {
    mapping(bytes10 => bool) private hashToMinted;
    mapping(uint => bytes10) private sToDNA;
    mapping(uint => bytes10) private tokenIdToDNA;
    mapping (address => bool) private addressToWhitelist;
    mapping (address => bool) private whitelistAddrToMinted;
    bool private paused = true;
    bool private whitelistPaused = true;
    uint private randNonce = 0;
    uint private totalMinted = 0;

    constructor() ERC721("Kinochromes", "[k]") {
      bytes10 dnaOne = bytes10(abi.encodePacked(bytes1(0xFF),bytes1(0xFF),bytes1(0xFF),bytes1(0),bytes1(0),bytes1(0),bytes1(0),bytes1(0),bytes1(0),bytes1(0)));
      bytes10 dnaTwo = bytes10(abi.encodePacked(bytes1(0xFF),bytes1(0xFF),bytes1(0xFF),bytes1(0),bytes1(0),bytes1(0x09),bytes1(0),bytes1(0),bytes1(0),bytes1(0)));
      bytes5 dnaOneMinusColor = getDnaMinusColor(dnaOne);
      bytes5 dnaTwoMinusColor = getDnaMinusColor(dnaTwo);

      sToDNA[0x32] = dnaOne;
      tokenIdToDNA[0x32] = getDnaMinusColor(dnaOne);
      hashToMinted[dnaOneMinusColor] = true;

      sToDNA[0x1FF] = dnaTwo;
      tokenIdToDNA[0x1FF] = getDnaMinusColor(dnaTwo);
      hashToMinted[dnaTwoMinusColor] = true;
    }    

    // MINTING RELATED FUNCTIONS

    // Pause or unpause minting
    function setPaused(bool _paused) public nonReentrant onlyOwner {
      paused = _paused;
    }

    function addToWhitelist(address[] memory users) public onlyOwner nonReentrant {
        for (uint i = 0; i < users.length; i++) {
            addressToWhitelist[users[i]] = true;
            whitelistAddrToMinted[users[i]] = false;
        }      
    }

    // Whitelisted addresses can claim 1 until public minting opens
    function whitelistClaim() public nonReentrant {
        require (addressToWhitelist[msg.sender], "You are not on the whitelist");
        require (!whitelistAddrToMinted[msg.sender], "You have already claimed with this address");
        uint index = totalSupply();
        require(index >= 50 && index < 512, "All have been minted");
        _internalMint(index);
        whitelistAddrToMinted[msg.sender] = true;
    }

    // Owner keeps the first 50
    function ownerClaim() public nonReentrant onlyOwner {
        uint index = totalSupply();
        require(index >= 0 && index + 9 < 50, "Choose an unclaimed index between 0 and 51, inclusive");
        for (uint i = index; i < index + 10; i++) {
          _internalMint(i);
        }
    }

    // Claim for public mint
    function claim() public nonReentrant {
        require (!paused, "Minting is paused");
        uint index = totalSupply();
        require(index >= 50 && index < 512, "All have been minted");
        _internalMint(index);
    }

    function _internalMint(uint256 tokenId) private {
        tokenIdToDNA[tokenId] = generateHash(tokenId);
        _safeMint(_msgSender(), tokenId);
        totalMinted++;
    }

    function generateHash(uint256 tokenId) internal returns (bytes10) {
      // bytes10 scheme is r/g/b/background/filter/pattern/transform/shape/anim1/anim2
      // like this: 0xd0714c04020901020706
      // where d0 = red, 71 = green, 4c = blue, 04 = background, 02 = filter, etc
      bytes10 dna;
      if (tokenId == 0x32 || tokenId == 0x1FF) {
        return sToDNA[tokenId];
      } else {
          dna = bytes10(
            abi.encodePacked(
              genRandomNum(tokenId, 255), // red index 0
              genRandomNum(tokenId, 255), // green index 1
              genRandomNum(tokenId, 255), // blue index 2
              genRandomNum(tokenId, 4),   // background index 3
              genRandomNum(tokenId, 5),   // filter index 4
              genRandomNum(tokenId, 9),   // pattern index 5
              genRandomNum(tokenId, 5),   // transform index 6
              genRandomNum(tokenId, 2),   // shape index 7
              genRandomNum(tokenId, 8),   // anim1 duration index 8
              genRandomNum(tokenId, 8)    // anim2 duration index 9
            )
          );
        }

        // Colors don't matter to the uniqueness of each token, but the rest
        // of the attributes do matter.
        bytes5 dnaMinusColor = getDnaMinusColor(dna);
        // No dupes
        if (hashToMinted[dnaMinusColor]) {
          randNonce++;
          return generateHash(tokenId);
        }
        hashToMinted[dnaMinusColor] = true;
        return dna;      
    }

    function getDnaMinusColor(bytes10 dna) private pure returns (bytes5) {
      return bytes5(
          abi.encodePacked(
              dna[3], dna[4], dna[5], dna[6], dna[7], dna[8], dna[9]      
          )
      );
    }

    function totalSupply() public view returns (uint) {
      return totalMinted;
    }

    // ART FUNCTIONS

    // The main SVG generator function
    function generateSvg(uint256 tokenId) internal view returns (string memory) {
        return string(abi.encodePacked(
          '<svg width="256" height="256" version="1.1" xmlns="http://www.w3.org/2000/svg" class="s1" style="background:', buildBackground(tokenId), ';">',
          generateStyle(tokenId),
          '<defs>', buildShape(tokenId), '</defs>',
          '<g id="g" style="',tokenId % 3 == 0 ? 'transform:scale(0.7) rotate(45deg);transform-origin:50% 50%;' : '','">',
          makeArt(tokenId),
          '</g></svg>'
        ));
    }

    // Creates the <style> tag
    function generateStyle(uint256 tokenId) internal view returns (string memory) {
      string[2] memory bgColors = invertColors(tokenId);
      return string(abi.encodePacked(
        '<style>.s1{--a:rgb(', bgColors[0],
        ');--b:rgb(', bgColors[1], ');transition: all 1000ms ease;}.s1:hover {filter:',tokenId == 0x32 ? 'sepia(1)' : (tokenId == 0x1FF ? 'contrast(5)' : (tokenId % 2 == 0 ? 'invert(1)' : 'hue-rotate(-270deg)')),';}.u{animation:',toString(buildAnimationDuration(tokenId, 8)) ,'ms infinite alternate a,',toString(buildAnimationDuration(tokenId, 9)),'ms infinite alternate b;transform-origin:50% 50%;}',
        buildAnimation(tokenId),
        '@keyframes b{from{opacity: 1;}to {opacity: 0.5;}}',
        '</style>'
      ));
    }

    // This is the main shape and pattern plotting function
    function makeArt(uint256 tokenId) internal view returns (string memory) {
        string memory o;
        bytes10 DNA = tokenIdToDNA[tokenId];
        uint256 seed = getDNASeed(DNA, tokenId);
        uint256 v = 0;
        int a = 0;
        int b = 0;
        // The following loop and algorithm is taken and slightly tweaked from Autoglyphs, created by Matt Hall & John Watkinson of Larva Labs.
        // The credit for this project and for onchain generative art goes to them.
        // Read the Autoglyphs contract here: https://etherscan.io/address/0xd4e4078ca3495de5b1d4db434bebc5a986197782#code
        if (uint8(DNA[5]) > 7) {
          for (uint8 y = 0; y < 8; y++) {
              a = (2 * (int8(y) - 4) + 1);
              if (seed % 3 == 1) {
                a = -a;
              } else if (seed % 3 == 2) {
                a = abs(a);
              }
              a = a * int(seed);
              for (uint8 x = 0; x < 8; x++) {
                  b = (2 * (int8(x) - 4) + 1);
                  if (seed % 2 == 1) {
                    b = abs(b);
                  }
                  b = b * int(seed);
                  v = uint(a * b / int(0x100000000)) % ((seed % 25) + 5);
                  string memory dString = v > 12 ? string(abi.encodePacked('-', toString(v * 1000))) : toString(v * 1000);
                  
                  o = string(abi.encodePacked(
                      o,
                      createShape(DNA, x, y, dString)
                  ));
              }
          }
          // Custom Patterns
        } else {
          for (uint8 y = 0; y < 8; y++) {
            for (uint8 x = 0; x < 8; x++) {
              v = drawCustomPattern(DNA, x, y, v);
              o = string(abi.encodePacked(
                  o,
                  createShape(DNA, x, y, toString(v))
              ));
            }
          }
        }
        return o;
    }

    // This giant function contains the logic to apply animation delays
    // based on the given pattern for a tokenId
    function drawCustomPattern(bytes10 DNA, uint8 x, uint8 y, uint delay) pure internal returns (uint) {
      uint _delay = delay;
      if(DNA[5] == 0x00) {
        // simple
        _delay += 100;
      } else if (DNA[5] == 0x01) {
        // staircase
        _delay += 100;
        _delay = _delay > 800 ? 0 : _delay;
      } else if (DNA[5] == 0x02) {
        // runner
        if (_delay == 0) {
          _delay = 1000;
        }
        if (y % 2 == 0) {
          _delay = x % 2 == 0 ? _delay -= 1000 : _delay;
        } else {
          _delay = x % 2 == 0 ? _delay : _delay -= 1000;
        }
        _delay += 1000;
      } else if (DNA[5] == 0x03) {
        // cross + corners
        if ((x == 0 && y == 0) || (x == 0 && y == 7) || (x == 7 && y == 0) || (x == 7 && y == 7)) {
          _delay = 6500;
        } else if (x == 3 || x == 4 || y == 3 || y == 4) {
          _delay = 0;
        } else {
          _delay = 4000;
        }
      } else if (DNA[5] == 0x04) {
        // spiral
        if (x == 0) {
          _delay = 3500 + 500 * y;
        } else if (y == 0) {
          _delay = 3500 - 500 * x;
        } else if (y == 1) {
          if (x > 0 && x < 7) {
            _delay = 17000 - 500 * x;
          } else {
            _delay = 13500;
          }
        } else if (y == 2) {
          if (x == 1) {
            _delay = 17000;
          } else if (x == 7) {
            _delay = 13000;
          } else {
            _delay = 26000 - 500 * x;
          }
        } else if (y == 3) {
          if (x == 1) {
            _delay = 17500;
          } else if (x == 2) {
            _delay = 26000;
          } else if (x == 6) {
            _delay = 23000;
          } else if (x == 7) {
            _delay = 12500;
          } else {
            _delay = 32000 - 500 * x;
          }
        } else if (y == 4) {
          if (x == 1) {
            _delay = 18000;
          } else if (x == 2) {
            _delay = 26500;
          } else if (x == 5) {
            _delay = 29000;
          } else if (x == 6) {
            _delay = 22500;
          } else if (x == 7) {
            _delay = 12000;
          } else {
            _delay = 29500 + 500 * x;
          }
        } else if (y == 5) {
          if (x == 1) {
            _delay = 18500;
          } else if (x > 1 && x < 6) {
            _delay = 26000 + 500 * x;
          } else if (x == 6) {
            _delay = 22000;
          } else {
            _delay = 11500;
          }
        } else if (y == 6) {
          if (x != 7) {
            _delay = 18500 + 500 * x;
          } else {
            _delay = 11000;
          }
        } else if (y == 7) {
          _delay = 7000 + 500 * x;
        }
      } else if (DNA[5] == 0x05) {
        // X pattern
        if ((x == 0 && y == 0) || (x == 7 && y == 7) || (x == 0 && y == 7) || (x == 7 && y == 0)) {
          _delay = 1000;
        } else if ((x == 1 && y == 1) || (x == 6 && y == 6) || (x == 1 && y == 6) || (x == 6 && y == 1)) {
          _delay = 2000;
        } else if ((x == 2 && y == 2) || (x == 5 && y == 5) || (x == 2 && y == 5) || (x == 5 && y == 2)) {
          _delay = 3000;
        } else if ((x == 3 && y == 3) || (x == 4 && y == 4) || (x == 3 && y == 4) || (x == 4 && y == 3)) {
          _delay = 4000;
        } else {
          _delay = 0;
        }
      } else if (DNA[5] == 0x06) {
        // 10Print
        _delay = tenPrint(DNA, x, y);
      } else {
        // Squares in Squares
        if (
          (x == 0 && y == 0) || (x == 7 && y == 7) || (x == 0 && y == 7) || (x == 7 && y == 0)
          || (x == 2 && y == 2) || (x == 5 && y == 5) || (x == 2 && y == 5) || (x == 5 && y == 2)
          || ((y == 2 || y == 5) && (x > 2 && x < 6))
          || (y > 2 && y < 5) && (x == 2 || x == 5)) {
          _delay = 1000;
        } else if (y == 0 || y == 7 || x == 0 || x == 7) {
          _delay = 0;
        } else {
          _delay = 2000;
        }
      }
      return _delay;
    }

    // A custom pattern based on the 10Print algorithm.
    // See: https://10print.org/
    function tenPrint(bytes10 DNA, uint8 x, uint8 y) internal pure returns (uint) {
      uint rand = (uint(uint(uint8(DNA[x])) + uint(x) + uint(y)) % (uint(y) * 3 + 35)) % 3;
      if (rand == 0) {
        return 0;
      }
      if (rand == 1) {
        return 7000;
      }
      return 15000;
    }

    // Changes a given color by subtracting up to 98 from its RGB value, and shifts the RGB position
    // so as to create a nice gradient and to not clash with the background color
    function changeColor(bytes10 _rgb, uint position, uint8 x, uint8 y) internal pure returns (bytes1) {
        return subtractBitwise(getColor(_rgb, position > 1 ? 0 : position + 1), bytes1(uint8(x ** 2) + uint8(y ** 2)));
    }

    // Returns R, G, or B
    function getColor(bytes10 _rgb, uint position) internal pure returns (bytes1) {
        return _rgb[position];
    }    

    // Creates a shape based on the x and y coordinates, and the animation delay
    function createShape(bytes10 DNA, uint8 x, uint8 y, string memory delay) pure internal returns (string memory) {
        return string(
            abi.encodePacked(
              '<use class="u" href="#r" x="', toString(uint8(x) * 32),
              '" y="', toString(uint8(y) * 32), '" fill="rgb(',
              toString(uint8(changeColor(DNA, 0, x, y))), ',',
              toString(uint8(changeColor(DNA, 1, x, y))), ',',
              toString(uint8(changeColor(DNA, 2, x, y))),
              ')" style="animation-delay:', delay, 'ms;" />'
            )
        );
    }

    // Chooses either Square or Circle shape
    function buildShape(uint256 tokenId) internal view returns (string memory) {
      string[2] memory shapes = [
        '<rect id="r" height="32" width="32"></rect>',
        '<circle id="r" cx="16" cy="16" height="32" width="32" r="8"></circle>'
      ];
      return shapes[getAttributeAtPos(tokenId, 7)];
    }

    // TOKENURI AND ATTRIBUTE FUNCTIONS

    function tokenURI(uint256 tokenId) public view override returns (string memory) {
        require(_exists(tokenId),"ERC721Metadata: URI query for nonexistent token");
        return string(abi.encodePacked(
          "data:application/json;base64,",
          Base64.encode(
            bytes(
              string(
                abi.encodePacked(
                  '{"name": "', (tokenId == 0x1FF || tokenId == 0x32) ? 'Albinochrome #' : 'Kinochrome #',
                  toString(tokenId),
                  getAttributes(tokenId),
                  // These two traits are called outside of getAttributes because of Stack Too Deep errors
                  '"},{"trait_type": "Animation 1 Duration","value": "',
                  getAttributeTitleValues(tokenId, 8),
                  'ms"},{"trait_type": "Animation 2 Duration","value": "',
                  getAttributeTitleValues(tokenId, 9), 'ms"}]'
                  ',"image": "data:image/svg+xml;base64,',
                  Base64.encode(
                    bytes(generateSvg(tokenId))
                  ),
                  '"}'
                )
              )
            )
          )
        ));
    }

    // Creates the "attributes" array for tokenURI
    function getAttributes(uint256 tokenId) view internal returns (string memory) {
      return string(
        abi.encodePacked(
          '", "attributes": [',(tokenId == 0x1FF || tokenId == 0x32) ? '{"trait_type": "Special","value": "Albino"},' : '',
          '{"trait_type": "Background","value": "',
          getAttributeTitleValues(tokenId, 3),
          '"},{"trait_type": "Filter","value": "',
          getAttributeTitleValues(tokenId, 4),
          '"},{"trait_type": "Pattern","value": "',
          getAttributeTitleValues(tokenId, 5),
          '"},{"trait_type": "Transform","value": "',
          getAttributeTitleValues(tokenId, 6),
          '"},{"trait_type": "Shape","value": "',
          getAttributeTitleValues(tokenId, 7)
        )
      );
    }

    // Returns the "value" for each trait_type
    function getAttributeTitleValues(uint256 tokenId, uint8 pos) view internal returns (string memory) {
      if (pos == 3) {
        return [
          'Solid',
          'Radial Gradient',
          'Linear Gradient',
          'Conic Gradient'
        ][getAttributeAtPos(tokenId, 3)];
      }
      if (pos == 4) {
        return [
          'Hue Rotate',
          'Reverse Hue Rotate',
          'Saturate/Invert',
          'Sepia',
          'Sepia/Invert'
        ][getAttributeAtPos(tokenId, 4)];
      }
      if (pos == 5) {
        uint8 index = getAttributeAtPos(tokenId, 5);
        return index > 7 ? 'Autoglyph' : [
          'Simple',
          'Staircase',
          'Runner',
          'Cross Corners',
          'Spiral',
          'X',
          '10 Print',
          'Squares in Squares'
        ][getAttributeAtPos(tokenId, 5)];
      }
      if (pos == 6) {
        return [
          'None',
          'Shrink',
          'Grow',
          'Rotate',
          'Slideways'
          // 'Slideways (Large)'
        ][getAttributeAtPos(tokenId, 6)];
      }
      if (pos == 7) {
        return [
          'Square',
          'Circle'
        ][getAttributeAtPos(tokenId, 7)];
      }
      return [
        '1500',
        '2700',
        '5100',
        '11000',
        '15500',
        '25000',
        '32000',
        '45000'
      ][getAttributeAtPos(tokenId, pos == 8 ? 8 : 9)];
    }

    // Returns animation duration in ms
    function buildAnimationDuration(uint256 tokenId, uint8 pos) internal view returns (uint16) {
      uint16[8] memory durs = [
        1500,
        2700,
        5100,
        11000,
        15500,
        25000,
        32000,
        45000
      ];
      return durs[getAttributeAtPos(tokenId, pos)];
    }

    // Returns background style for main <svg>
    function buildBackground(uint256 tokenId) internal view returns (string memory) {
      string[4] memory backgrounds = [
        'var(--a)',
        'radial-gradient(var(--a), var(--b))',
        'linear-gradient(var(--a), var(--b))',
        'conic-gradient(var(--a), var(--b))'
      ];
      return backgrounds[getAttributeAtPos(tokenId, 3)];
    }

    // Used for background only - inverts the RGB values to make a background color for the randomized palette
    function invertColors(uint256 tokenId) internal view returns (string[2] memory) {
      bytes1 red = bytes1(getAttributeAtPos(tokenId, 0));
      bytes1 green = bytes1(getAttributeAtPos(tokenId, 1));
      bytes1 blue = bytes1(getAttributeAtPos(tokenId, 2));
      return [
        string(abi.encodePacked(toString(uint8(~red)),',', toString(uint8(~green)),',', toString(uint8(~blue)))),
        string(abi.encodePacked(toString(uint8(~green)),',', toString(uint8(~blue)),',', toString(uint8(~red))))
      ];
    }

    // Returns CSS animations used for the animation pattern
    function buildAnimation(uint256 tokenId) internal view returns (string memory) {
      string[3][5] memory filters = [
        ['hue-rotate(0deg)', 'hue-rotate(180deg)', 'hue-rotate(-180deg)'],
        ['hue-rotate(0deg)', 'hue-rotate(-90deg)', 'hue-rotate(90deg)'],
        ['saturate(1) invert(0)', 'saturate(1.8) invert(1)', 'saturate(0.5) invert(0.2)'],
        ['sepia(0)', 'sepia(0.5)', 'sepia(0.8)'],
        ['sepia(0) invert(0)', 'sepia(0.5) invert(1)', 'sepia(0.8) invert(0.6)']
      ];
      string[3][5] memory transforms = [
        ['scale(1)', 'scale(1)', 'scale(1)'],
        ['scale(1)', 'scale(0.8)', 'scale(1.2)'],
        ['scale(1)', 'scale(1.6)', 'scale(1.2)'],
        ['rotate(0deg)', 'rotate(45deg)', 'rotate(-45deg)'],
        ['translate(0)', 'translate(16px)', 'translate(-16px)']
        // ['translate(0)', 'translate(-50%)']
      ];      
      string memory o = string(
        abi.encodePacked(
          '@keyframes a{25%{filter:',
          filters[getAttributeAtPos(tokenId, 4)][0],
          ';transform:',transforms[getAttributeAtPos(tokenId, 6)][0],
          ';}50%{filter:',
          filters[getAttributeAtPos(tokenId, 4)][1],
          ';transform:',transforms[getAttributeAtPos(tokenId, 6)][1],
          ';}75%{filter:',filters[getAttributeAtPos(tokenId, 4)][0],
          ';transform:',transforms[getAttributeAtPos(tokenId, 6)][0],
          ';}100%{filter:',filters[getAttributeAtPos(tokenId, 4)][2],
          ';transform:',transforms[getAttributeAtPos(tokenId, 6)][2],';}}'
        )
      );

      return o;
    }

    // Takes in a tokenId and a "max" number as the ceiling to randomly pull
    function genRandomNum(uint256 tokenId, uint8 max) internal returns (bytes1) {
      return bytes1(randMod(tokenId, max));
    }

    // Returns the value of each attribute at a specific position
    function getAttributeAtPos(uint256 tokenId, uint8 pos) internal view returns (uint8) {
      return uint8(tokenIdToDNA[tokenId][pos]);
    }    

    // Returns a seed; a uint of the DNA that's useful for performing math
    function getDNASeed(bytes10 DNA, uint256 tokenId) internal pure returns (uint64) {
        return uint64(uint256(keccak256(abi.encodePacked(
            DNA,
            tokenId
        ))));
    }    

    // UTIL FUNCTIONS

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

    function randMod(uint256 tokenId, uint8 _modulo) internal returns(uint8) {
        // increase nonce
        randNonce++; 
        return uint8(uint256(
          keccak256(
            abi.encodePacked(
              block.difficulty,
              block.timestamp,
              msg.sender,
              randNonce,
              tokenId)
            )
          )) % _modulo;
    }

    // Taken from Autoglyphs by Larva Labs
    function abs(int n) internal pure returns (int) {
        if (n >= 0) return n;
        return -n;
    }

    function subtractBitwise(bytes1 a, bytes1 b) internal pure returns (bytes1) {
      while (b != 0) {
        bytes1 borrow = (~a) & b;
        a = a ^ b;
        b = borrow << 1;
      }
      return a;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address[]","name":"users","type":"address[]"}],"name":"addToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ownerClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_paused","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"whitelistClaim","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052600d805461ffff19166101011790556000600e819055600f553480156200002a57600080fd5b50604080518082018252600b81526a4b696e6f6368726f6d657360a81b6020808301918252835180850190945260038452625b6b5d60e81b9084015281519192916200007991600091620003ff565b5080516200008f906001906020840190620003ff565b5050600160065550620000a23362000312565b6040516001600160f81b03196020820181905260218201819052602282015260006023820181905260248201819052602582018190526026820181905260278201819052602882018190526029820181905290602a016040516020818303038152906040526200011290620004a5565b6040516001600160f81b03196020820181905260218201819052602282015260006023820181905260248201819052600960f81b602583015260268201819052602782018190526028820181905260298201819052919250602a016040516020818303038152906040526200018790620004a5565b90506000620001968362000364565b90506000620001a58362000364565b603260005260096020527fdd9bf46b68f2858fcbfdd22eaa6d4bc710b50475a2b04df5507e88b47e1571f680546001600160501b03191660b087901c1790559050620001f18462000364565b7f3f84cf6cefe8166d7172cc41f23bd15f2ff6c4676631dd9620c8946b70ea8aed80546001600160501b031990811660b093841c69ffffffffff000000000016179091556001600160d81b0319841660009081526008602090815260408220805460ff191660011790556101ff909152600990527ff0946357f4a719a1fd9abcfcf7e7b6146494cfdd9659cbc106a262aa450e7ed780549091169185901c919091179055620002a08362000364565b7fc4f7bcad497416d10dcebc1f75f1ef596f5af9a1c686e9c43a1182dd6dbbf4c380546001600160501b03191660b09290921c69ffffffffff0000000000169190911790556001600160d81b0319166000908152600860205260409020805460ff19166001179055506200054e915050565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60008160031a60f81b8260041a60f81b8360051a60f81b8460061a60f81b8560071a60f81b8660081a60f81b8760096040516001600160f81b03199889166020820152968816602188015294871660228701529286166023860152908516602485015284166025840152901a60f81b919091166026820152602701604051602081830303815290604052620003f990620004dd565b92915050565b8280546200040d9062000511565b90600052602060002090601f0160209004810192826200043157600085556200047c565b82601f106200044c57805160ff19168380011785556200047c565b828001600101855582156200047c579182015b828111156200047c5782518255916020019190600101906200045f565b506200048a9291506200048e565b5090565b5b808211156200048a57600081556001016200048f565b805160208201516001600160b01b0319808216929190600a831015620004d557808184600a0360031b1b83161693505b505050919050565b805160208201516001600160d81b03198082169291906005831015620004d55760059290920360031b82901b161692915050565b600181811c908216806200052657607f821691505b602082108114156200054857634e487b7160e01b600052602260045260246000fd5b50919050565b614fb0806200055e6000396000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c80636352211e116100b857806395d89b411161007c57806395d89b4114610279578063a22cb46514610281578063b88d4fde14610294578063c87b56dd146102a7578063e985e9c5146102ba578063f2fde38b146102cd57600080fd5b80636352211e1461022757806370a082311461023a578063715018a61461024d5780637f649783146102555780638da5cb5b1461026857600080fd5b806318160ddd1161010a57806318160ddd146101d75780631f131fb4146101e957806323b872dd146101f157806342842e0e146102045780634dbe5889146102175780634e71d92d1461021f57600080fd5b806301ffc9a71461014757806306fdde031461016f578063081812fc14610184578063095ea7b3146101af57806316c38b3c146101c4575b600080fd5b61015a610155366004613a37565b6102e0565b60405190151581526020015b60405180910390f35b610177610332565b6040516101669190613aac565b610197610192366004613abf565b6103c4565b6040516001600160a01b039091168152602001610166565b6101c26101bd366004613af4565b61045e565b005b6101c26101d2366004613b2e565b610574565b600f545b604051908152602001610166565b6101c26105de565b6101c26101ff366004613b49565b610766565b6101c2610212366004613b49565b610797565b6101c26107b2565b6101c26108c1565b610197610235366004613abf565b6109a3565b6101db610248366004613b85565b610a1a565b6101c2610aa1565b6101c2610263366004613be7565b610ad7565b6007546001600160a01b0316610197565b610177610be8565b6101c261028f366004613c94565b610bf7565b6101c26102a2366004613cc7565b610cbc565b6101776102b5366004613abf565b610cf4565b61015a6102c8366004613d87565b610e64565b6101c26102db366004613b85565b610e92565b60006001600160e01b031982166380ac58cd60e01b148061031157506001600160e01b03198216635b5e139f60e01b145b8061032c57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606000805461034190613db1565b80601f016020809104026020016040519081016040528092919081815260200182805461036d90613db1565b80156103ba5780601f1061038f576101008083540402835291602001916103ba565b820191906000526020600020905b81548152906001019060200180831161039d57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166104425760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610469826109a3565b9050806001600160a01b0316836001600160a01b031614156104d75760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610439565b336001600160a01b03821614806104f357506104f38133610e64565b6105655760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610439565b61056f8383610f2d565b505050565b600260065414156105975760405162461bcd60e51b815260040161043990613dec565b60026006556007546001600160a01b031633146105c65760405162461bcd60e51b815260040161043990613e23565b600d805460ff19169115159190911790556001600655565b600260065414156106015760405162461bcd60e51b815260040161043990613dec565b6002600655336000908152600b602052604090205460ff166106655760405162461bcd60e51b815260206004820152601c60248201527f596f7520617265206e6f74206f6e207468652077686974656c697374000000006044820152606401610439565b336000908152600c602052604090205460ff16156106d85760405162461bcd60e51b815260206004820152602a60248201527f596f75206861766520616c726561647920636c61696d656420776974682074686044820152696973206164647265737360b01b6064820152608401610439565b60006106e3600f5490565b9050603281101580156106f7575061020081105b61073a5760405162461bcd60e51b8152602060048201526014602482015273105b1b081a185d99481899595b881b5a5b9d195960621b6044820152606401610439565b61074381610f9b565b50336000908152600c60205260409020805460ff19166001908117909155600655565b6107703382610fef565b61078c5760405162461bcd60e51b815260040161043990613e58565b61056f8383836110c6565b61056f83838360405180602001604052806000815250610cbc565b600260065414156107d55760405162461bcd60e51b815260040161043990613dec565b60026006556007546001600160a01b031633146108045760405162461bcd60e51b815260040161043990613e23565b600061080f600f5490565b9050603261081e826009613ebf565b106108895760405162461bcd60e51b815260206004820152603560248201527f43686f6f736520616e20756e636c61696d656420696e646578206265747765656044820152746e203020616e642035312c20696e636c757369766560581b6064820152608401610439565b805b61089682600a613ebf565b8110156108b8576108a681610f9b565b806108b081613ed7565b91505061088b565b50506001600655565b600260065414156108e45760405162461bcd60e51b815260040161043990613dec565b6002600655600d5460ff16156109305760405162461bcd60e51b8152602060048201526011602482015270135a5b9d1a5b99c81a5cc81c185d5cd959607a1b6044820152606401610439565b600061093b600f5490565b90506032811015801561094f575061020081105b6109925760405162461bcd60e51b8152602060048201526014602482015273105b1b081a185d99481899595b881b5a5b9d195960621b6044820152606401610439565b61099b81610f9b565b506001600655565b6000818152600260205260408120546001600160a01b03168061032c5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610439565b60006001600160a01b038216610a855760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610439565b506001600160a01b031660009081526003602052604090205490565b6007546001600160a01b03163314610acb5760405162461bcd60e51b815260040161043990613e23565b610ad56000611266565b565b6007546001600160a01b03163314610b015760405162461bcd60e51b815260040161043990613e23565b60026006541415610b245760405162461bcd60e51b815260040161043990613dec565b600260065560005b81518110156108b8576001600b6000848481518110610b4d57610b4d613ef2565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600c6000848481518110610ba457610ba4613ef2565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580610be081613ed7565b915050610b2c565b60606001805461034190613db1565b6001600160a01b038216331415610c505760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610439565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610cc63383610fef565b610ce25760405162461bcd60e51b815260040161043990613e58565b610cee848484846112b8565b50505050565b6000818152600260205260409020546060906001600160a01b0316610d735760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610439565b610e3e826101ff1480610d865750826032145b610db4576040518060400160405280600c81526020016b4b696e6f6368726f6d65202360a01b815250610ddc565b6040518060400160405280600e81526020016d416c62696e6f6368726f6d65202360901b8152505b610de5846112eb565b610dee856113e9565b610df986600861147a565b610e0487600961147a565b610e15610e1089611a59565b611ad2565b604051602001610e2a96959493929190613f24565b604051602081830303815290604052611ad2565b604051602001610e4e919061409a565b6040516020818303038152906040529050919050565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6007546001600160a01b03163314610ebc5760405162461bcd60e51b815260040161043990613e23565b6001600160a01b038116610f215760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610439565b610f2a81611266565b50565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610f62826109a3565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b610fa481611c38565b6000828152600a60205260409020805469ffffffffffffffffffff191660b09290921c919091179055610fd73382611dc2565b600f8054906000610fe783613ed7565b919050555050565b6000818152600260205260408120546001600160a01b03166110685760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610439565b6000611073836109a3565b9050806001600160a01b0316846001600160a01b031614806110ae5750836001600160a01b03166110a3846103c4565b6001600160a01b0316145b806110be57506110be8185610e64565b949350505050565b826001600160a01b03166110d9826109a3565b6001600160a01b0316146111415760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610439565b6001600160a01b0382166111a35760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610439565b6111ae600082610f2d565b6001600160a01b03831660009081526003602052604081208054600192906111d79084906140df565b90915550506001600160a01b0382166000908152600360205260408120805460019290611205908490613ebf565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6112c38484846110c6565b6112cf84848484611de0565b610cee5760405162461bcd60e51b8152600401610439906140f6565b60608161130f5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611339578061132381613ed7565b91506113329050600a8361415e565b9150611313565b60008167ffffffffffffffff81111561135457611354613ba0565b6040519080825280601f01601f19166020018201604052801561137e576020820181803683370190505b5090505b84156110be576113936001836140df565b91506113a0600a86614172565b6113ab906030613ebf565b60f81b8183815181106113c0576113c0613ef2565b60200101906001600160f81b031916908160001a9053506113e2600a8661415e565b9450611382565b6060816101ff14806113fb5750816032145b611414576040518060200160405280600081525061142e565b6040518060600160405280602c8152602001614f4f602c91395b61143983600361147a565b61144484600461147a565b61144f85600561147a565b61145a86600661147a565b61146587600761147a565b604051602001610e4e96959493929190614186565b60608160ff16600314156115645760405180608001604052806040518060400160405280600581526020016414dbdb1a5960da1b81525081526020016040518060400160405280600f81526020016e1498591a585b0811dc98591a595b9d608a1b81525081526020016040518060400160405280600f81526020016e131a5b99585c8811dc98591a595b9d608a1b81525081526020016040518060400160405280600e81526020016d10dbdb9a58c811dc98591a595b9d60921b815250815250611545846003611eed565b60ff166004811061155857611558613ef2565b6020020151905061032c565b8160ff1660041415611652576040805160e081018252600a60a082019081526948756520526f7461746560b01b60c08301528152815180830183526012815271526576657273652048756520526f7461746560701b6020828101919091528083019190915282518084018452600f81526e14d85d1d5c985d194bd25b9d995c9d608a1b8183015282840152825180840184526005815264536570696160d81b8183015260608301528251808401909352600c83526b14d95c1a584bd25b9d995c9d60a21b90830152608081019190915261163f846004611eed565b60ff166005811061155857611558613ef2565b8160ff16600514156117e257600061166b846005611eed565b905060078160ff16116117b7576040805161014081018252600661010082018181526553696d706c6560d01b610120840152825282518084018452600981526853746169726361736560b81b602082810191909152808401919091528351808501855282815265293ab73732b960d11b818301528385015283518085018552600d81526c43726f737320436f726e65727360981b818301526060840152835180850185529182526514dc1a5c985b60d21b8282015260808301919091528251808401845260018152600b60fb1b8183015260a08301528251808401845260088152670c4c08141c9a5b9d60c21b8183015260c0830152825180840190935260128352715371756172657320696e205371756172657360701b9083015260e081019190915261179a856005611eed565b60ff16600881106117ad576117ad613ef2565b60200201516117da565b60405180604001604052806009815260200168082eae8deced8f2e0d60bb1b8152505b91505061032c565b8160ff16600614156118b5576040518060a00160405280604051806040016040528060048152602001634e6f6e6560e01b815250815260200160405180604001604052806006815260200165536872696e6b60d01b81525081526020016040518060400160405280600481526020016347726f7760e01b815250815260200160405180604001604052806006815260200165526f7461746560d01b815250815260200160405180604001604052806009815260200168536c6964657761797360b81b81525081525061163f846006611eed565b8160ff1660071415611925576040805160808101825260068183018181526553717561726560d01b606084015282528251808401909352825265436972636c6560d01b602083810191909152810191909152611912846007611eed565b60ff166002811061155857611558613ef2565b604080516101408101825260046101008201818152630313530360e41b610120840152825282518084018452818152630323730360e41b6020828101919091528084019190915283518085018552918252630353130360e41b828201528284019190915282518084018452600580825264031313030360dc1b8284015260608401919091528351808501855281815264031353530360dc1b8184015260808401528351808501855281815264032353030360dc1b8184015260a08401528351808501855281815264033323030360dc1b8184015260c08401528351808501909452835264034353030360dc1b9083015260e0810191909152611a3a84600860ff861614611a33576009611eed565b6008611eed565b60ff1660088110611a4d57611a4d613ef2565b60200201519392505050565b6060611a6482611f1d565b611a6d83611fca565b611a7684612100565b611a81600386614172565b15611a9b5760405180602001604052806000815250611ab5565b6040518060600160405280603c8152602001614e49603c91395b611abe86612169565b604051602001610e4e959493929190614320565b805160609080611af2575050604080516020810190915260008152919050565b60006003611b01836002613ebf565b611b0b919061415e565b611b16906004614473565b90506000611b25826020613ebf565b67ffffffffffffffff811115611b3d57611b3d613ba0565b6040519080825280601f01601f191660200182016040528015611b67576020820181803683370190505b5090506000604051806060016040528060408152602001614ea8604091399050600181016020830160005b86811015611bf3576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b835260049092019101611b92565b506003860660018114611c0d5760028114611c1e57611c2a565b613d3d60f01b600119830152611c2a565b603d60f81b6000198301525b505050918152949350505050565b6000808260321480611c4b5750826101ff145b15611c6757505060009081526009602052604090205460b01b90565b611c728360ff612447565b611c7d8460ff612447565b611c888560ff612447565b611c93866004612447565b611c9e876005612447565b611ca9886009612447565b611cb4896005612447565b611cbf8a6002612447565b611cca8b6008612447565b611cd58c6008612447565b6040516001600160f81b03199a8b166020820152988a1660218a015296891660228901529488166023880152928716602487015290861660258601528516602685015284166027840152831660288301529091166029820152602a01604051602081830303815290604052611d4990614492565b90506000611d568261245d565b6001600160d81b0319811660009081526008602052604090205490915060ff1615611d9957600e8054906000611d8b83613ed7565b91905055506110be84611c38565b6001600160d81b0319166000908152600860205260409020805460ff1916600117905592915050565b611ddc8282604051806020016040528060008152506124f0565b5050565b60006001600160a01b0384163b15611ee257604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611e249033908990889088906004016144c9565b602060405180830381600087803b158015611e3e57600080fd5b505af1925050508015611e6e575060408051601f3d908101601f19168201909252611e6b91810190614506565b60015b611ec8573d808015611e9c576040519150601f19603f3d011682016040523d82523d6000602084013e611ea1565b606091505b508051611ec05760405162461bcd60e51b8152600401610439906140f6565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506110be565b506001949350505050565b6000828152600a6020819052604082205460b01b9060ff8416908110611f1557611f15613ef2565b1a9392505050565b60606000604051806080016040528060405180604001604052806008815260200167766172282d2d612960c01b8152508152602001604051806060016040528060238152602001614e85602391398152602001604051806060016040528060238152602001614dfb602391398152602001604051806060016040528060228152602001614f2d602291399052905080611fb7846003611eed565b60ff1660048110611a4d57611a4d613ef2565b60606000611fd783612523565b80516020820151919250906032851461208457846101ff1461205b57611ffe600286614172565b1561203457604051806040016040528060138152602001726875652d726f74617465282d3237306465672960681b8152506120a6565b60405180604001604052806009815260200168696e7665727428312960b81b8152506120a6565b6040518060400160405280600b81526020016a636f6e747261737428352960a81b8152506120a6565b60405180604001604052806008815260200167736570696128312960c01b8152505b6120bd6120b4876008612611565b61ffff166112eb565b6120cb6120b4886009612611565b6120d488612689565b6040516020016120e996959493929190614523565b604051602081830303815290604052915050919050565b6060600060405180604001604052806040518060600160405280602b8152602001614e1e602b91398152602001604051806080016040528060458152602001614ee8604591399052905080612156846007611eed565b60ff1660028110611a4d57611a4d613ef2565b6000818152600a6020526040812054606091829160b01b906121c582866040516001600160b01b031983166020820152602a8101829052600090604a0160408051601f1981840301815291905280516020909101209392505050565b67ffffffffffffffff1690506000808060078560051a11156123b05760005b60088160ff1610156123aa576121fb6004826146e5565b612206906002614726565b6122119060016147a7565b60000b9250612221600386614172565b6001141561223957612232836147ea565b9250612258565b612244600386614172565b600214156122585761225583612dd5565b92505b6122628584614807565b925060005b60088160ff1610156123975761227e6004826146e5565b612289906002614726565b6122949060016147a7565b60000b92506122a4600287614172565b600114156122b8576122b583612dd5565b92505b6122c28684614807565b92506122cf601987614172565b6122da906005613ebf565b6401000000006122ea8587614807565b6122f4919061488c565b6122fe9190614172565b94506000600c86116123235761231e612319876103e8614473565b6112eb565b612352565b612332612319876103e8614473565b60405160200161234291906148ba565b6040516020818303038152906040525b90508861236189848685612deb565b6040516020016123729291906148e3565b604051602081830303815290604052985050808061238f90614912565b915050612267565b50806123a281614912565b9150506121e4565b5061243b565b60005b60088160ff1610156124395760005b60088160ff161015612426576123da87828488612e78565b9450876123f18883856123ec8a6112eb565b612deb565b6040516020016124029291906148e3565b6040516020818303038152906040529750808061241e90614912565b9150506123c2565b508061243181614912565b9150506123b3565b505b50939695505050505050565b600061245383836136fa565b60f81b9392505050565b60008160031a60f81b8260041a60f81b8360051a60f81b8460061a60f81b8560071a60f81b8660081a60f81b8760096040516001600160f81b03199889166020820152968816602188015294871660228701529286166023860152908516602485015284166025840152901a60f81b91909116602682015260270160405160208183030381529060405261032c90614932565b6124fa8383613786565b6125076000848484611de0565b61056f5760405162461bcd60e51b8152600401610439906140f6565b61252b6139fa565b6000612538836000611eed565b60f81b9050600061254a846001611eed565b60f81b9050600061255c856002611eed565b60f81b9050604051806040016040528061257c851960f81c60ff166112eb565b612589851960f81c6112eb565b612596851960f81c6112eb565b6040516020016125a893929190614965565b60408051601f1981840301815291905281526020016125ca841960f81c6112eb565b6125d7841960f81c6112eb565b6125e4871960f81c6112eb565b6040516020016125f693929190614965565b60408051601f19818403018152919052905295945050505050565b60408051610100810182526105dc8152610a8c60208201526113ec91810191909152612af86060820152613c8c60808201526161a860a0820152617d0060c082015261afc860e0820152600090806126698585611eed565b60ff166008811061267c5761267c613ef2565b6020020151949350505050565b606060006040518060a0016040528060405180606001604052806040518060400160405280601081526020016f6875652d726f7461746528306465672960801b8152508152602001604051806040016040528060128152602001716875652d726f74617465283138306465672960701b8152508152602001604051806040016040528060138152602001726875652d726f74617465282d3138306465672960681b815250815250815260200160405180606001604052806040518060400160405280601081526020016f6875652d726f7461746528306465672960801b8152508152602001604051806040016040528060128152602001716875652d726f74617465282d39306465672960701b8152508152602001604051806040016040528060118152602001706875652d726f746174652839306465672960781b8152508152508152602001604051806060016040528060405180604001604052806015815260200174736174757261746528312920696e7665727428302960581b81525081526020016040518060400160405280601781526020017f736174757261746528312e382920696e7665727428312900000000000000000081525081526020016040518060400160405280601981526020017f736174757261746528302e352920696e7665727428302e3229000000000000008152508152508152602001604051806060016040528060405180604001604052806008815260200167736570696128302960c01b81525081526020016040518060400160405280600a815260200169736570696128302e352960b01b81525081526020016040518060400160405280600a815260200169736570696128302e382960b01b8152508152508152602001604051806060016040528060405180604001604052806012815260200171736570696128302920696e7665727428302960701b815250815260200160405180604001604052806014815260200173736570696128302e352920696e7665727428312960601b815250815260200160405180604001604052806016815260200175736570696128302e382920696e7665727428302e362960501b815250815250815250905060006040518060a001604052806040518060600160405280604051806040016040528060088152602001677363616c6528312960c01b8152508152602001604051806040016040528060088152602001677363616c6528312960c01b8152508152602001604051806040016040528060088152602001677363616c6528312960c01b81525081525081526020016040518060600160405280604051806040016040528060088152602001677363616c6528312960c01b81525081526020016040518060400160405280600a8152602001697363616c6528302e382960b01b81525081526020016040518060400160405280600a8152602001697363616c6528312e322960b01b81525081525081526020016040518060600160405280604051806040016040528060088152602001677363616c6528312960c01b81525081526020016040518060400160405280600a8152602001697363616c6528312e362960b01b81525081526020016040518060400160405280600a8152602001697363616c6528312e322960b01b815250815250815260200160405180606001604052806040518060400160405280600c81526020016b726f7461746528306465672960a01b81525081526020016040518060400160405280600d81526020016c726f746174652834356465672960981b81525081526020016040518060400160405280600e81526020016d726f74617465282d34356465672960901b815250815250815260200160405180606001604052806040518060400160405280600c81526020016b7472616e736c61746528302960a01b81525081526020016040518060400160405280600f81526020016e7472616e736c61746528313670782960881b81525081526020016040518060400160405280601081526020016f7472616e736c617465282d313670782960801b8152508152508152509050600082612c74866004611eed565b60ff1660058110612c8757612c87613ef2565b60200201515182612c99876006611eed565b60ff1660058110612cac57612cac613ef2565b60200201515184612cbe886004611eed565b60ff1660058110612cd157612cd1613ef2565b60200201516001602002015184612ce9896006611eed565b60ff1660058110612cfc57612cfc613ef2565b60200201516001602002015186612d148a6004611eed565b60ff1660058110612d2757612d27613ef2565b60200201515186612d398b6006611eed565b60ff1660058110612d4c57612d4c613ef2565b60200201515188612d5e8c6004611eed565b60ff1660058110612d7157612d71613ef2565b60200201516040015188612d868d6006611eed565b60ff1660058110612d9957612d99613ef2565b602002015160026020020151604051602001612dbc9897969594939291906149bf565b60408051601f1981840301815291905295945050505050565b6000808212612de2575090565b61032c826147ea565b6060612e03612dfb856020614afd565b60ff166112eb565b612e11612dfb856020614afd565b612e29612e2188600089896138c8565b60f81c6112eb565b612e39612e218960018a8a6138c8565b612e49612e218a60028b8b6138c8565b86604051602001612e5f96959493929190614b26565b6040516020818303038152906040529050949350505050565b6000818560051a60f81b6001600160f81b031916612ea257612e9b606482613ebf565b90506136f1565b600160f81b6001600160f81b0319600588901a60f81b161415612ee357612eca606482613ebf565b90506103208111612edb5780612e9b565b5060006136f1565b600160f91b6001600160f81b0319600588901a60f81b161415612f845780612f0a57506103e85b612f15600285614c3a565b60ff16612f4c57612f27600286614c3a565b60ff1615612f355780612f45565b612f416103e8826140df565b9050805b9050612f78565b612f57600286614c3a565b60ff1615612f7357612f6b6103e8826140df565b905080612f75565b805b90505b612e9b6103e882613ebf565b600360f81b6001600160f81b0319600588901a60f81b1614156130595760ff8516158015612fb3575060ff8416155b80612fcd575060ff8516158015612fcd57508360ff166007145b80612fe757508460ff166007148015612fe7575060ff8416155b8061300357508460ff16600714801561300357508360ff166007145b1561301157506119646136f1565b8460ff166003148061302657508460ff166004145b8061303457508360ff166003145b8061304257508360ff166004145b1561304f575060006136f1565b50610fa05b6136f1565b600160fa1b6001600160f81b0319600588901a60f81b1614156133455760ff85166130a45761308d60ff85166101f4614c5c565b61309990610dac614c86565b61ffff1690506136f1565b60ff84166130c7576130bb60ff86166101f4614c5c565b61309990610dac614ca3565b8360ff16600114156131125760008560ff161180156130e9575060078560ff16105b15613109576130fd60ff86166101f4614c5c565b61309990614268614ca3565b506134bc6136f1565b8360ff1660021415613163578460ff166001141561313357506142686136f1565b8460ff166007141561314857506132c86136f1565b61315760ff86166101f4614c5c565b61309990616590614ca3565b8360ff16600314156131de578460ff1660011415613184575061445c6136f1565b8460ff166002141561319957506165906136f1565b8460ff16600614156131ae57506159d86136f1565b8460ff16600714156131c357506130d46136f1565b6131d260ff86166101f4614c5c565b61309990617d00614ca3565b8360ff166004141561326e578460ff16600114156131ff57506146506136f1565b8460ff166002141561321457506167846136f1565b8460ff166005141561322957506171486136f1565b8460ff166006141561323e57506157e46136f1565b8460ff16600714156132535750612ee06136f1565b61326260ff86166101f4614c5c565b6130999061733c614c86565b8360ff16600514156132e3578460ff166001141561328f57506148446136f1565b60018560ff161180156132a5575060068560ff16105b156132c5576132b960ff86166101f4614c5c565b61309990616590614c86565b8460ff16600614156132da57506155f06136f1565b50612cec6136f1565b8360ff166006141561331e578460ff166007146133155761330960ff86166101f4614c5c565b61309990614844614c86565b50612af86136f1565b8360ff16600714156130545761333960ff86166101f4614c5c565b61309990611b58614c86565b600560f81b6001600160f81b0319600588901a60f81b16141561353a5760ff8516158015613374575060ff8416155b8061339057508460ff16600714801561339057508360ff166007145b806133aa575060ff85161580156133aa57508360ff166007145b806133c457508460ff1660071480156133c4575060ff8416155b156133d257506103e86136f1565b8460ff1660011480156133e857508360ff166001145b8061340457508460ff16600614801561340457508360ff166006145b8061342057508460ff16600114801561342057508360ff166006145b8061343c57508460ff16600614801561343c57508360ff166001145b1561344a57506107d06136f1565b8460ff16600214801561346057508360ff166002145b8061347c57508460ff16600514801561347c57508360ff166005145b8061349857508460ff16600214801561349857508360ff166005145b806134b457508460ff1660051480156134b457508360ff166002145b156134c25750610bb86136f1565b8460ff1660031480156134d857508360ff166003145b806134f457508460ff1660041480156134f457508360ff166004145b8061351057508460ff16600314801561351057508360ff166004145b8061352c57508460ff16600414801561352c57508360ff166003145b15612edb5750610fa06136f1565b600360f91b6001600160f81b0319600588901a60f81b16141561356257612e9b868686613918565b60ff8516158015613574575060ff8416155b8061359057508460ff16600714801561359057508360ff166007145b806135aa575060ff85161580156135aa57508360ff166007145b806135c457508460ff1660071480156135c4575060ff8416155b806135e057508460ff1660021480156135e057508360ff166002145b806135fc57508460ff1660051480156135fc57508360ff166005145b8061361857508460ff16600214801561361857508360ff166005145b8061363457508460ff16600514801561363457508360ff166002145b8061366c57508360ff166002148061364f57508360ff166005145b801561366c575060028560ff1611801561366c575060068560ff16105b806136a4575060028460ff16118015613688575060058460ff16105b80156136a457508460ff16600214806136a457508460ff166005145b156136b257506103e86136f1565b60ff841615806136c557508360ff166007145b806136d1575060ff8516155b806136df57508460ff166007145b156136ec575060006136f1565b506107d05b95945050505050565b600e80546000918261370b83613ed7565b919050555081444233600e548760405160200161375c959493929190948552602085019390935260609190911b6bffffffffffffffffffffffff191660408401526054830152607482015260940190565b6040516020818303038152906040528051906020012060001c61377f9190614c3a565b9392505050565b6001600160a01b0382166137dc5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610439565b6000818152600260205260409020546001600160a01b0316156138415760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610439565b6001600160a01b038216600090815260036020526040812080546001929061386a908490613ebf565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006136f16138f086600187116138e9576138e4876001613ebf565b6139aa565b60006139aa565b6138fb600285614dc3565b613906600287614dc3565b6139109190614dd5565b60f81b6139c9565b600080600361392a60ff851682614473565b613935906023613ebf565b60ff8086169087168881600a811061394f5761394f613ef2565b61395b9291901a613ebf565b6139659190613ebf565b61396f9190614172565b6139799190614172565b90508061398a57600091505061377f565b806001141561399e57611b5891505061377f565b50613a98949350505050565b60008282600a81106139be576139be613ef2565b1a60f81b9392505050565b60005b6001600160f81b03198216156139f357818318921990911660011b607f60f91b16906139cc565b5090919050565b60405180604001604052806002905b6060815260200190600190039081613a095790505090565b6001600160e01b031981168114610f2a57600080fd5b600060208284031215613a4957600080fd5b813561377f81613a21565b60005b83811015613a6f578181015183820152602001613a57565b83811115610cee5750506000910152565b60008151808452613a98816020860160208601613a54565b601f01601f19169290920160200192915050565b60208152600061377f6020830184613a80565b600060208284031215613ad157600080fd5b5035919050565b80356001600160a01b0381168114613aef57600080fd5b919050565b60008060408385031215613b0757600080fd5b613b1083613ad8565b946020939093013593505050565b80358015158114613aef57600080fd5b600060208284031215613b4057600080fd5b61377f82613b1e565b600080600060608486031215613b5e57600080fd5b613b6784613ad8565b9250613b7560208501613ad8565b9150604084013590509250925092565b600060208284031215613b9757600080fd5b61377f82613ad8565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613bdf57613bdf613ba0565b604052919050565b60006020808385031215613bfa57600080fd5b823567ffffffffffffffff80821115613c1257600080fd5b818501915085601f830112613c2657600080fd5b813581811115613c3857613c38613ba0565b8060051b9150613c49848301613bb6565b8181529183018401918481019088841115613c6357600080fd5b938501935b83851015613c8857613c7985613ad8565b82529385019390850190613c68565b98975050505050505050565b60008060408385031215613ca757600080fd5b613cb083613ad8565b9150613cbe60208401613b1e565b90509250929050565b60008060008060808587031215613cdd57600080fd5b613ce685613ad8565b93506020613cf5818701613ad8565b935060408601359250606086013567ffffffffffffffff80821115613d1957600080fd5b818801915088601f830112613d2d57600080fd5b813581811115613d3f57613d3f613ba0565b613d51601f8201601f19168501613bb6565b91508082528984828501011115613d6757600080fd5b808484018584013760008482840101525080935050505092959194509250565b60008060408385031215613d9a57600080fd5b613da383613ad8565b9150613cbe60208401613ad8565b600181811c90821680613dc557607f821691505b60208210811415613de657634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b60008219821115613ed257613ed2613ea9565b500190565b6000600019821415613eeb57613eeb613ea9565b5060010190565b634e487b7160e01b600052603260045260246000fd5b60008151613f1a818560208601613a54565b9290920192915050565b693d913730b6b2911d101160b11b81528651600090613f4a81600a850160208c01613a54565b875190830190613f6181600a840160208c01613a54565b8751910190613f7781600a840160208b01613a54565b7f227d2c7b2274726169745f74797065223a2022416e696d6174696f6e20312044600a9290910191820152723ab930ba34b7b71116113b30b63ab2911d101160691b602a8201528551613fd181603d840160208a01613a54565b7f6d73227d2c7b2274726169745f74797065223a2022416e696d6174696f6e2032603d92909101918201527410223ab930ba34b7b71116113b30b63ab2911d101160591b605d820152845161402d816072840160208901613a54565b61408c61407e6140786072848601017f6d73227d5d2c22696d616765223a2022646174613a696d6167652f7376672b788152691b5b0ed8985cd94d8d0b60b21b6020820152602a0190565b87613f08565b61227d60f01b815260020190565b9a9950505050505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152600082516140d281601d850160208701613a54565b91909101601d0192915050565b6000828210156140f1576140f1613ea9565b500390565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b60008261416d5761416d614148565b500490565b60008261418157614181614148565b500690565b71222c202261747472696275746573223a205b60701b815286516000906141b4816012850160208c01613a54565b7f7b2274726169745f74797065223a20224261636b67726f756e64222c2276616c601291840191820152653ab2911d101160d11b603282018190528851614202816038850160208d01613a54565b7f227d2c7b2274726169745f74797065223a202246696c746572222c2276616c75603893909101928301526432911d101160d91b6058830152875161424e81605d850160208c01613a54565b7f227d2c7b2274726169745f74797065223a20225061747465726e222c2276616c605d9390910192830152607d82015261431361430d6142d76142d1614297608386018b613f08565b7f227d2c7b2274726169745f74797065223a20225472616e73666f726d222c227681526730b63ab2911d101160c11b602082015260280190565b88613f08565b7f227d2c7b2274726169745f74797065223a20225368617065222c2276616c7565815263111d101160e11b602082015260240190565b85613f08565b9998505050505050505050565b7f3c7376672077696474683d2232353622206865696768743d223235362220766581527f7273696f6e3d22312e312220786d6c6e733d22687474703a2f2f7777772e773360208201527f2e6f72672f323030302f7376672220636c6173733d22733122207374796c653d60408201526b113130b1b5b3b937bab7321d60a11b6060820152600086516143b981606c850160208b01613a54565b621d911f60e91b606c9184019182015286516143dc81606f840160208b01613a54565b651e3232b3399f60d11b606f92909101918201528551614403816075840160208a01613a54565b661e17b232b3399f60c91b91016075810191909152701e339034b21e9133911039ba3cb6329e9160791b607c820152613c8861445d614457614449608d85015b89613f08565b61111f60f11b815260020190565b86613f08565b691e17b39f1e17b9bb339f60b11b8152600a0190565b600081600019048311821515161561448d5761448d613ea9565b500290565b805160208201516001600160b01b0319808216929190600a8310156144c157808184600a0360031b1b83161693505b505050919050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906144fc90830184613a80565b9695505050505050565b60006020828403121561451857600080fd5b815161377f81613a21565b72078e6e8f2d8ca7c5ce662f65a5ac274e4cec45606b1b815260008751614551816013850160208c01613a54565b69052765a5ac474e4cec4560b31b601391840191820152875161457b81601d840160208c01613a54565b7f293b7472616e736974696f6e3a20616c6c20313030306d7320656173653b7d2e601d92909101918201527039989d3437bb32b9103db334b63a32b91d60791b603d82015286516145d381604e840160208b01613a54565b6e1dbe973abdb0b734b6b0ba34b7b71d60891b604e9290910191820152855161460381605d840160208a01613a54565b61408c6146d161468e6142d161464a614644605d878901017f6d7320696e66696e69746520616c7465726e61746520612c0000000000000000815260180190565b8b613f08565b7f6d7320696e66696e69746520616c7465726e61746520623b7472616e73666f728152716d2d6f726967696e3a353025203530253b7d60701b602082015260320190565b7f406b65796672616d657320627b66726f6d7b6f7061636974793a20313b7d746f815270207b6f7061636974793a20302e353b7d7d60781b602082015260310190565b671e17b9ba3cb6329f60c11b815260080190565b600081810b83820b8281128015607f1983018412161561470757614707613ea9565b81607f01831381161561471c5761471c613ea9565b5090039392505050565b60008082810b84820b82811383831382607f048411828216161561474c5761474c613ea9565b607f198584128281168683058612161561476857614768613ea9565b958512958387168583058712161561478257614782613ea9565b84607f058612818816161561479957614799613ea9565b505050910295945050505050565b60008160000b8360000b6000821282607f038213811516156147cb576147cb613ea9565b82607f190382128116156147e1576147e1613ea9565b50019392505050565b6000600160ff1b82141561480057614800613ea9565b5060000390565b60006001600160ff1b038184138284138082168684048611161561482d5761482d613ea9565b600160ff1b600087128281168783058912161561484c5761484c613ea9565b6000871292508782058712848416161561486857614868613ea9565b8785058712818416161561487e5761487e613ea9565b505050929093029392505050565b60008261489b5761489b614148565b600160ff1b8214600019841416156148b5576148b5613ea9565b500590565b602d60f81b8152600082516148d6816001850160208701613a54565b9190910160010192915050565b600083516148f5818460208801613a54565b835190830190614909818360208801613a54565b01949350505050565b600060ff821660ff81141561492957614929613ea9565b60010192915050565b805160208201516001600160d81b031980821692919060058310156144c15760059290920360031b82901b161692915050565b60008451614977818460208901613a54565b8083019050600b60fa1b8082528551614997816001850160208a01613a54565b600192019182015283516149b2816002840160208801613a54565b0160020195945050505050565b7f406b65796672616d657320617b3235257b66696c7465723a00000000000000008152600089516149f7816018850160208e01613a54565b80830190506a1dba3930b739b337b9369d60a91b8060188301528a51614a24816023850160208f01613a54565b6c1dbe9a9812bdb334b63a32b91d60991b602393909101928301528951614a52816030850160208e01613a54565b60309201918201528751614a6d81603b840160208c01613a54565b6c1dbe9b9a92bdb334b63a32b91d60991b603b9290910191820152614aee614adf614457614aa8614443614ac5614abf83604889018f613f08565b6a1dba3930b739b337b9369d60a91b8152600b0190565b8c613f08565b6d1dbe98981812bdb334b63a32b91d60911b8152600e0190565b623b7d7d60e81b815260030190565b9b9a5050505050505050505050565b600060ff821660ff84168160ff0481118215151615614b1e57614b1e613ea9565b029392505050565b7f3c75736520636c6173733d22752220687265663d2223722220783d2200000000815260008751614b5e81601c850160208c01613a54565b6411103c9e9160d91b601c918401918201528751614b83816021840160208c01613a54565b6b04440ccd2d8d87a44e4cec4560a31b602192909101918201528651614bb081602d840160208b01613a54565b808201915050600b60fa1b80602d8301528651614bd481602e850160208b01613a54565b602e9201918201528451614bef81602f840160208901613a54565b61408c614c27614078602f848601017f2922207374796c653d22616e696d6174696f6e2d64656c61793a0000000000008152601a0190565b6636b99d9110179f60c91b815260070190565b600060ff831680614c4d57614c4d614148565b8060ff84160691505092915050565b600061ffff80831681851681830481118215151615614c7d57614c7d613ea9565b02949350505050565b600061ffff80831681851680830382111561490957614909613ea9565b600061ffff83811690831681811015614cbe57614cbe613ea9565b039392505050565b600181815b80851115614d00578160ff04821115614ce657614ce6613ea9565b80851615614cf357918102915b93841c9390800290614ccb565b509250929050565b600082614d175750600161032c565b81614d245750600061032c565b8160018114614d3a5760028114614d4457614d72565b600191505061032c565b60ff841115614d5557614d55613ea9565b6001841b915060ff821115614d6c57614d6c613ea9565b5061032c565b5060208310610133831016604e8410600b8410161715614da6575081810a60ff811115614da157614da1613ea9565b61032c565b614db08383614cc6565b8060ff04821115614b1e57614b1e613ea9565b600061377f60ff841660ff8416614d08565b600060ff821660ff84168060ff03821115614df257614df2613ea9565b01939250505056fe6c696e6561722d6772616469656e7428766172282d2d61292c20766172282d2d6229293c726563742069643d227222206865696768743d223332222077696474683d223332223e3c2f726563743e7472616e73666f726d3a7363616c6528302e372920726f74617465283435646567293b7472616e73666f726d2d6f726967696e3a353025203530253b72616469616c2d6772616469656e7428766172282d2d61292c20766172282d2d6229294142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c636972636c652069643d2272222063783d223136222063793d22313622206865696768743d223332222077696474683d2233322220723d2238223e3c2f636972636c653e636f6e69632d6772616469656e7428766172282d2d61292c20766172282d2d6229297b2274726169745f74797065223a20225370656369616c222c2276616c7565223a2022416c62696e6f227d2ca2646970667358221220b3adf560980eb90ae74ac31a88901b24d48df3b38392c99f269e7b693146c2c964736f6c63430008090033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101425760003560e01c80636352211e116100b857806395d89b411161007c57806395d89b4114610279578063a22cb46514610281578063b88d4fde14610294578063c87b56dd146102a7578063e985e9c5146102ba578063f2fde38b146102cd57600080fd5b80636352211e1461022757806370a082311461023a578063715018a61461024d5780637f649783146102555780638da5cb5b1461026857600080fd5b806318160ddd1161010a57806318160ddd146101d75780631f131fb4146101e957806323b872dd146101f157806342842e0e146102045780634dbe5889146102175780634e71d92d1461021f57600080fd5b806301ffc9a71461014757806306fdde031461016f578063081812fc14610184578063095ea7b3146101af57806316c38b3c146101c4575b600080fd5b61015a610155366004613a37565b6102e0565b60405190151581526020015b60405180910390f35b610177610332565b6040516101669190613aac565b610197610192366004613abf565b6103c4565b6040516001600160a01b039091168152602001610166565b6101c26101bd366004613af4565b61045e565b005b6101c26101d2366004613b2e565b610574565b600f545b604051908152602001610166565b6101c26105de565b6101c26101ff366004613b49565b610766565b6101c2610212366004613b49565b610797565b6101c26107b2565b6101c26108c1565b610197610235366004613abf565b6109a3565b6101db610248366004613b85565b610a1a565b6101c2610aa1565b6101c2610263366004613be7565b610ad7565b6007546001600160a01b0316610197565b610177610be8565b6101c261028f366004613c94565b610bf7565b6101c26102a2366004613cc7565b610cbc565b6101776102b5366004613abf565b610cf4565b61015a6102c8366004613d87565b610e64565b6101c26102db366004613b85565b610e92565b60006001600160e01b031982166380ac58cd60e01b148061031157506001600160e01b03198216635b5e139f60e01b145b8061032c57506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606000805461034190613db1565b80601f016020809104026020016040519081016040528092919081815260200182805461036d90613db1565b80156103ba5780601f1061038f576101008083540402835291602001916103ba565b820191906000526020600020905b81548152906001019060200180831161039d57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166104425760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610469826109a3565b9050806001600160a01b0316836001600160a01b031614156104d75760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610439565b336001600160a01b03821614806104f357506104f38133610e64565b6105655760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610439565b61056f8383610f2d565b505050565b600260065414156105975760405162461bcd60e51b815260040161043990613dec565b60026006556007546001600160a01b031633146105c65760405162461bcd60e51b815260040161043990613e23565b600d805460ff19169115159190911790556001600655565b600260065414156106015760405162461bcd60e51b815260040161043990613dec565b6002600655336000908152600b602052604090205460ff166106655760405162461bcd60e51b815260206004820152601c60248201527f596f7520617265206e6f74206f6e207468652077686974656c697374000000006044820152606401610439565b336000908152600c602052604090205460ff16156106d85760405162461bcd60e51b815260206004820152602a60248201527f596f75206861766520616c726561647920636c61696d656420776974682074686044820152696973206164647265737360b01b6064820152608401610439565b60006106e3600f5490565b9050603281101580156106f7575061020081105b61073a5760405162461bcd60e51b8152602060048201526014602482015273105b1b081a185d99481899595b881b5a5b9d195960621b6044820152606401610439565b61074381610f9b565b50336000908152600c60205260409020805460ff19166001908117909155600655565b6107703382610fef565b61078c5760405162461bcd60e51b815260040161043990613e58565b61056f8383836110c6565b61056f83838360405180602001604052806000815250610cbc565b600260065414156107d55760405162461bcd60e51b815260040161043990613dec565b60026006556007546001600160a01b031633146108045760405162461bcd60e51b815260040161043990613e23565b600061080f600f5490565b9050603261081e826009613ebf565b106108895760405162461bcd60e51b815260206004820152603560248201527f43686f6f736520616e20756e636c61696d656420696e646578206265747765656044820152746e203020616e642035312c20696e636c757369766560581b6064820152608401610439565b805b61089682600a613ebf565b8110156108b8576108a681610f9b565b806108b081613ed7565b91505061088b565b50506001600655565b600260065414156108e45760405162461bcd60e51b815260040161043990613dec565b6002600655600d5460ff16156109305760405162461bcd60e51b8152602060048201526011602482015270135a5b9d1a5b99c81a5cc81c185d5cd959607a1b6044820152606401610439565b600061093b600f5490565b90506032811015801561094f575061020081105b6109925760405162461bcd60e51b8152602060048201526014602482015273105b1b081a185d99481899595b881b5a5b9d195960621b6044820152606401610439565b61099b81610f9b565b506001600655565b6000818152600260205260408120546001600160a01b03168061032c5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610439565b60006001600160a01b038216610a855760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610439565b506001600160a01b031660009081526003602052604090205490565b6007546001600160a01b03163314610acb5760405162461bcd60e51b815260040161043990613e23565b610ad56000611266565b565b6007546001600160a01b03163314610b015760405162461bcd60e51b815260040161043990613e23565b60026006541415610b245760405162461bcd60e51b815260040161043990613dec565b600260065560005b81518110156108b8576001600b6000848481518110610b4d57610b4d613ef2565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600c6000848481518110610ba457610ba4613ef2565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580610be081613ed7565b915050610b2c565b60606001805461034190613db1565b6001600160a01b038216331415610c505760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610439565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610cc63383610fef565b610ce25760405162461bcd60e51b815260040161043990613e58565b610cee848484846112b8565b50505050565b6000818152600260205260409020546060906001600160a01b0316610d735760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610439565b610e3e826101ff1480610d865750826032145b610db4576040518060400160405280600c81526020016b4b696e6f6368726f6d65202360a01b815250610ddc565b6040518060400160405280600e81526020016d416c62696e6f6368726f6d65202360901b8152505b610de5846112eb565b610dee856113e9565b610df986600861147a565b610e0487600961147a565b610e15610e1089611a59565b611ad2565b604051602001610e2a96959493929190613f24565b604051602081830303815290604052611ad2565b604051602001610e4e919061409a565b6040516020818303038152906040529050919050565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6007546001600160a01b03163314610ebc5760405162461bcd60e51b815260040161043990613e23565b6001600160a01b038116610f215760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610439565b610f2a81611266565b50565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610f62826109a3565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b610fa481611c38565b6000828152600a60205260409020805469ffffffffffffffffffff191660b09290921c919091179055610fd73382611dc2565b600f8054906000610fe783613ed7565b919050555050565b6000818152600260205260408120546001600160a01b03166110685760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610439565b6000611073836109a3565b9050806001600160a01b0316846001600160a01b031614806110ae5750836001600160a01b03166110a3846103c4565b6001600160a01b0316145b806110be57506110be8185610e64565b949350505050565b826001600160a01b03166110d9826109a3565b6001600160a01b0316146111415760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610439565b6001600160a01b0382166111a35760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610439565b6111ae600082610f2d565b6001600160a01b03831660009081526003602052604081208054600192906111d79084906140df565b90915550506001600160a01b0382166000908152600360205260408120805460019290611205908490613ebf565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600780546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6112c38484846110c6565b6112cf84848484611de0565b610cee5760405162461bcd60e51b8152600401610439906140f6565b60608161130f5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611339578061132381613ed7565b91506113329050600a8361415e565b9150611313565b60008167ffffffffffffffff81111561135457611354613ba0565b6040519080825280601f01601f19166020018201604052801561137e576020820181803683370190505b5090505b84156110be576113936001836140df565b91506113a0600a86614172565b6113ab906030613ebf565b60f81b8183815181106113c0576113c0613ef2565b60200101906001600160f81b031916908160001a9053506113e2600a8661415e565b9450611382565b6060816101ff14806113fb5750816032145b611414576040518060200160405280600081525061142e565b6040518060600160405280602c8152602001614f4f602c91395b61143983600361147a565b61144484600461147a565b61144f85600561147a565b61145a86600661147a565b61146587600761147a565b604051602001610e4e96959493929190614186565b60608160ff16600314156115645760405180608001604052806040518060400160405280600581526020016414dbdb1a5960da1b81525081526020016040518060400160405280600f81526020016e1498591a585b0811dc98591a595b9d608a1b81525081526020016040518060400160405280600f81526020016e131a5b99585c8811dc98591a595b9d608a1b81525081526020016040518060400160405280600e81526020016d10dbdb9a58c811dc98591a595b9d60921b815250815250611545846003611eed565b60ff166004811061155857611558613ef2565b6020020151905061032c565b8160ff1660041415611652576040805160e081018252600a60a082019081526948756520526f7461746560b01b60c08301528152815180830183526012815271526576657273652048756520526f7461746560701b6020828101919091528083019190915282518084018452600f81526e14d85d1d5c985d194bd25b9d995c9d608a1b8183015282840152825180840184526005815264536570696160d81b8183015260608301528251808401909352600c83526b14d95c1a584bd25b9d995c9d60a21b90830152608081019190915261163f846004611eed565b60ff166005811061155857611558613ef2565b8160ff16600514156117e257600061166b846005611eed565b905060078160ff16116117b7576040805161014081018252600661010082018181526553696d706c6560d01b610120840152825282518084018452600981526853746169726361736560b81b602082810191909152808401919091528351808501855282815265293ab73732b960d11b818301528385015283518085018552600d81526c43726f737320436f726e65727360981b818301526060840152835180850185529182526514dc1a5c985b60d21b8282015260808301919091528251808401845260018152600b60fb1b8183015260a08301528251808401845260088152670c4c08141c9a5b9d60c21b8183015260c0830152825180840190935260128352715371756172657320696e205371756172657360701b9083015260e081019190915261179a856005611eed565b60ff16600881106117ad576117ad613ef2565b60200201516117da565b60405180604001604052806009815260200168082eae8deced8f2e0d60bb1b8152505b91505061032c565b8160ff16600614156118b5576040518060a00160405280604051806040016040528060048152602001634e6f6e6560e01b815250815260200160405180604001604052806006815260200165536872696e6b60d01b81525081526020016040518060400160405280600481526020016347726f7760e01b815250815260200160405180604001604052806006815260200165526f7461746560d01b815250815260200160405180604001604052806009815260200168536c6964657761797360b81b81525081525061163f846006611eed565b8160ff1660071415611925576040805160808101825260068183018181526553717561726560d01b606084015282528251808401909352825265436972636c6560d01b602083810191909152810191909152611912846007611eed565b60ff166002811061155857611558613ef2565b604080516101408101825260046101008201818152630313530360e41b610120840152825282518084018452818152630323730360e41b6020828101919091528084019190915283518085018552918252630353130360e41b828201528284019190915282518084018452600580825264031313030360dc1b8284015260608401919091528351808501855281815264031353530360dc1b8184015260808401528351808501855281815264032353030360dc1b8184015260a08401528351808501855281815264033323030360dc1b8184015260c08401528351808501909452835264034353030360dc1b9083015260e0810191909152611a3a84600860ff861614611a33576009611eed565b6008611eed565b60ff1660088110611a4d57611a4d613ef2565b60200201519392505050565b6060611a6482611f1d565b611a6d83611fca565b611a7684612100565b611a81600386614172565b15611a9b5760405180602001604052806000815250611ab5565b6040518060600160405280603c8152602001614e49603c91395b611abe86612169565b604051602001610e4e959493929190614320565b805160609080611af2575050604080516020810190915260008152919050565b60006003611b01836002613ebf565b611b0b919061415e565b611b16906004614473565b90506000611b25826020613ebf565b67ffffffffffffffff811115611b3d57611b3d613ba0565b6040519080825280601f01601f191660200182016040528015611b67576020820181803683370190505b5090506000604051806060016040528060408152602001614ea8604091399050600181016020830160005b86811015611bf3576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b835260049092019101611b92565b506003860660018114611c0d5760028114611c1e57611c2a565b613d3d60f01b600119830152611c2a565b603d60f81b6000198301525b505050918152949350505050565b6000808260321480611c4b5750826101ff145b15611c6757505060009081526009602052604090205460b01b90565b611c728360ff612447565b611c7d8460ff612447565b611c888560ff612447565b611c93866004612447565b611c9e876005612447565b611ca9886009612447565b611cb4896005612447565b611cbf8a6002612447565b611cca8b6008612447565b611cd58c6008612447565b6040516001600160f81b03199a8b166020820152988a1660218a015296891660228901529488166023880152928716602487015290861660258601528516602685015284166027840152831660288301529091166029820152602a01604051602081830303815290604052611d4990614492565b90506000611d568261245d565b6001600160d81b0319811660009081526008602052604090205490915060ff1615611d9957600e8054906000611d8b83613ed7565b91905055506110be84611c38565b6001600160d81b0319166000908152600860205260409020805460ff1916600117905592915050565b611ddc8282604051806020016040528060008152506124f0565b5050565b60006001600160a01b0384163b15611ee257604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611e249033908990889088906004016144c9565b602060405180830381600087803b158015611e3e57600080fd5b505af1925050508015611e6e575060408051601f3d908101601f19168201909252611e6b91810190614506565b60015b611ec8573d808015611e9c576040519150601f19603f3d011682016040523d82523d6000602084013e611ea1565b606091505b508051611ec05760405162461bcd60e51b8152600401610439906140f6565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506110be565b506001949350505050565b6000828152600a6020819052604082205460b01b9060ff8416908110611f1557611f15613ef2565b1a9392505050565b60606000604051806080016040528060405180604001604052806008815260200167766172282d2d612960c01b8152508152602001604051806060016040528060238152602001614e85602391398152602001604051806060016040528060238152602001614dfb602391398152602001604051806060016040528060228152602001614f2d602291399052905080611fb7846003611eed565b60ff1660048110611a4d57611a4d613ef2565b60606000611fd783612523565b80516020820151919250906032851461208457846101ff1461205b57611ffe600286614172565b1561203457604051806040016040528060138152602001726875652d726f74617465282d3237306465672960681b8152506120a6565b60405180604001604052806009815260200168696e7665727428312960b81b8152506120a6565b6040518060400160405280600b81526020016a636f6e747261737428352960a81b8152506120a6565b60405180604001604052806008815260200167736570696128312960c01b8152505b6120bd6120b4876008612611565b61ffff166112eb565b6120cb6120b4886009612611565b6120d488612689565b6040516020016120e996959493929190614523565b604051602081830303815290604052915050919050565b6060600060405180604001604052806040518060600160405280602b8152602001614e1e602b91398152602001604051806080016040528060458152602001614ee8604591399052905080612156846007611eed565b60ff1660028110611a4d57611a4d613ef2565b6000818152600a6020526040812054606091829160b01b906121c582866040516001600160b01b031983166020820152602a8101829052600090604a0160408051601f1981840301815291905280516020909101209392505050565b67ffffffffffffffff1690506000808060078560051a11156123b05760005b60088160ff1610156123aa576121fb6004826146e5565b612206906002614726565b6122119060016147a7565b60000b9250612221600386614172565b6001141561223957612232836147ea565b9250612258565b612244600386614172565b600214156122585761225583612dd5565b92505b6122628584614807565b925060005b60088160ff1610156123975761227e6004826146e5565b612289906002614726565b6122949060016147a7565b60000b92506122a4600287614172565b600114156122b8576122b583612dd5565b92505b6122c28684614807565b92506122cf601987614172565b6122da906005613ebf565b6401000000006122ea8587614807565b6122f4919061488c565b6122fe9190614172565b94506000600c86116123235761231e612319876103e8614473565b6112eb565b612352565b612332612319876103e8614473565b60405160200161234291906148ba565b6040516020818303038152906040525b90508861236189848685612deb565b6040516020016123729291906148e3565b604051602081830303815290604052985050808061238f90614912565b915050612267565b50806123a281614912565b9150506121e4565b5061243b565b60005b60088160ff1610156124395760005b60088160ff161015612426576123da87828488612e78565b9450876123f18883856123ec8a6112eb565b612deb565b6040516020016124029291906148e3565b6040516020818303038152906040529750808061241e90614912565b9150506123c2565b508061243181614912565b9150506123b3565b505b50939695505050505050565b600061245383836136fa565b60f81b9392505050565b60008160031a60f81b8260041a60f81b8360051a60f81b8460061a60f81b8560071a60f81b8660081a60f81b8760096040516001600160f81b03199889166020820152968816602188015294871660228701529286166023860152908516602485015284166025840152901a60f81b91909116602682015260270160405160208183030381529060405261032c90614932565b6124fa8383613786565b6125076000848484611de0565b61056f5760405162461bcd60e51b8152600401610439906140f6565b61252b6139fa565b6000612538836000611eed565b60f81b9050600061254a846001611eed565b60f81b9050600061255c856002611eed565b60f81b9050604051806040016040528061257c851960f81c60ff166112eb565b612589851960f81c6112eb565b612596851960f81c6112eb565b6040516020016125a893929190614965565b60408051601f1981840301815291905281526020016125ca841960f81c6112eb565b6125d7841960f81c6112eb565b6125e4871960f81c6112eb565b6040516020016125f693929190614965565b60408051601f19818403018152919052905295945050505050565b60408051610100810182526105dc8152610a8c60208201526113ec91810191909152612af86060820152613c8c60808201526161a860a0820152617d0060c082015261afc860e0820152600090806126698585611eed565b60ff166008811061267c5761267c613ef2565b6020020151949350505050565b606060006040518060a0016040528060405180606001604052806040518060400160405280601081526020016f6875652d726f7461746528306465672960801b8152508152602001604051806040016040528060128152602001716875652d726f74617465283138306465672960701b8152508152602001604051806040016040528060138152602001726875652d726f74617465282d3138306465672960681b815250815250815260200160405180606001604052806040518060400160405280601081526020016f6875652d726f7461746528306465672960801b8152508152602001604051806040016040528060128152602001716875652d726f74617465282d39306465672960701b8152508152602001604051806040016040528060118152602001706875652d726f746174652839306465672960781b8152508152508152602001604051806060016040528060405180604001604052806015815260200174736174757261746528312920696e7665727428302960581b81525081526020016040518060400160405280601781526020017f736174757261746528312e382920696e7665727428312900000000000000000081525081526020016040518060400160405280601981526020017f736174757261746528302e352920696e7665727428302e3229000000000000008152508152508152602001604051806060016040528060405180604001604052806008815260200167736570696128302960c01b81525081526020016040518060400160405280600a815260200169736570696128302e352960b01b81525081526020016040518060400160405280600a815260200169736570696128302e382960b01b8152508152508152602001604051806060016040528060405180604001604052806012815260200171736570696128302920696e7665727428302960701b815250815260200160405180604001604052806014815260200173736570696128302e352920696e7665727428312960601b815250815260200160405180604001604052806016815260200175736570696128302e382920696e7665727428302e362960501b815250815250815250905060006040518060a001604052806040518060600160405280604051806040016040528060088152602001677363616c6528312960c01b8152508152602001604051806040016040528060088152602001677363616c6528312960c01b8152508152602001604051806040016040528060088152602001677363616c6528312960c01b81525081525081526020016040518060600160405280604051806040016040528060088152602001677363616c6528312960c01b81525081526020016040518060400160405280600a8152602001697363616c6528302e382960b01b81525081526020016040518060400160405280600a8152602001697363616c6528312e322960b01b81525081525081526020016040518060600160405280604051806040016040528060088152602001677363616c6528312960c01b81525081526020016040518060400160405280600a8152602001697363616c6528312e362960b01b81525081526020016040518060400160405280600a8152602001697363616c6528312e322960b01b815250815250815260200160405180606001604052806040518060400160405280600c81526020016b726f7461746528306465672960a01b81525081526020016040518060400160405280600d81526020016c726f746174652834356465672960981b81525081526020016040518060400160405280600e81526020016d726f74617465282d34356465672960901b815250815250815260200160405180606001604052806040518060400160405280600c81526020016b7472616e736c61746528302960a01b81525081526020016040518060400160405280600f81526020016e7472616e736c61746528313670782960881b81525081526020016040518060400160405280601081526020016f7472616e736c617465282d313670782960801b8152508152508152509050600082612c74866004611eed565b60ff1660058110612c8757612c87613ef2565b60200201515182612c99876006611eed565b60ff1660058110612cac57612cac613ef2565b60200201515184612cbe886004611eed565b60ff1660058110612cd157612cd1613ef2565b60200201516001602002015184612ce9896006611eed565b60ff1660058110612cfc57612cfc613ef2565b60200201516001602002015186612d148a6004611eed565b60ff1660058110612d2757612d27613ef2565b60200201515186612d398b6006611eed565b60ff1660058110612d4c57612d4c613ef2565b60200201515188612d5e8c6004611eed565b60ff1660058110612d7157612d71613ef2565b60200201516040015188612d868d6006611eed565b60ff1660058110612d9957612d99613ef2565b602002015160026020020151604051602001612dbc9897969594939291906149bf565b60408051601f1981840301815291905295945050505050565b6000808212612de2575090565b61032c826147ea565b6060612e03612dfb856020614afd565b60ff166112eb565b612e11612dfb856020614afd565b612e29612e2188600089896138c8565b60f81c6112eb565b612e39612e218960018a8a6138c8565b612e49612e218a60028b8b6138c8565b86604051602001612e5f96959493929190614b26565b6040516020818303038152906040529050949350505050565b6000818560051a60f81b6001600160f81b031916612ea257612e9b606482613ebf565b90506136f1565b600160f81b6001600160f81b0319600588901a60f81b161415612ee357612eca606482613ebf565b90506103208111612edb5780612e9b565b5060006136f1565b600160f91b6001600160f81b0319600588901a60f81b161415612f845780612f0a57506103e85b612f15600285614c3a565b60ff16612f4c57612f27600286614c3a565b60ff1615612f355780612f45565b612f416103e8826140df565b9050805b9050612f78565b612f57600286614c3a565b60ff1615612f7357612f6b6103e8826140df565b905080612f75565b805b90505b612e9b6103e882613ebf565b600360f81b6001600160f81b0319600588901a60f81b1614156130595760ff8516158015612fb3575060ff8416155b80612fcd575060ff8516158015612fcd57508360ff166007145b80612fe757508460ff166007148015612fe7575060ff8416155b8061300357508460ff16600714801561300357508360ff166007145b1561301157506119646136f1565b8460ff166003148061302657508460ff166004145b8061303457508360ff166003145b8061304257508360ff166004145b1561304f575060006136f1565b50610fa05b6136f1565b600160fa1b6001600160f81b0319600588901a60f81b1614156133455760ff85166130a45761308d60ff85166101f4614c5c565b61309990610dac614c86565b61ffff1690506136f1565b60ff84166130c7576130bb60ff86166101f4614c5c565b61309990610dac614ca3565b8360ff16600114156131125760008560ff161180156130e9575060078560ff16105b15613109576130fd60ff86166101f4614c5c565b61309990614268614ca3565b506134bc6136f1565b8360ff1660021415613163578460ff166001141561313357506142686136f1565b8460ff166007141561314857506132c86136f1565b61315760ff86166101f4614c5c565b61309990616590614ca3565b8360ff16600314156131de578460ff1660011415613184575061445c6136f1565b8460ff166002141561319957506165906136f1565b8460ff16600614156131ae57506159d86136f1565b8460ff16600714156131c357506130d46136f1565b6131d260ff86166101f4614c5c565b61309990617d00614ca3565b8360ff166004141561326e578460ff16600114156131ff57506146506136f1565b8460ff166002141561321457506167846136f1565b8460ff166005141561322957506171486136f1565b8460ff166006141561323e57506157e46136f1565b8460ff16600714156132535750612ee06136f1565b61326260ff86166101f4614c5c565b6130999061733c614c86565b8360ff16600514156132e3578460ff166001141561328f57506148446136f1565b60018560ff161180156132a5575060068560ff16105b156132c5576132b960ff86166101f4614c5c565b61309990616590614c86565b8460ff16600614156132da57506155f06136f1565b50612cec6136f1565b8360ff166006141561331e578460ff166007146133155761330960ff86166101f4614c5c565b61309990614844614c86565b50612af86136f1565b8360ff16600714156130545761333960ff86166101f4614c5c565b61309990611b58614c86565b600560f81b6001600160f81b0319600588901a60f81b16141561353a5760ff8516158015613374575060ff8416155b8061339057508460ff16600714801561339057508360ff166007145b806133aa575060ff85161580156133aa57508360ff166007145b806133c457508460ff1660071480156133c4575060ff8416155b156133d257506103e86136f1565b8460ff1660011480156133e857508360ff166001145b8061340457508460ff16600614801561340457508360ff166006145b8061342057508460ff16600114801561342057508360ff166006145b8061343c57508460ff16600614801561343c57508360ff166001145b1561344a57506107d06136f1565b8460ff16600214801561346057508360ff166002145b8061347c57508460ff16600514801561347c57508360ff166005145b8061349857508460ff16600214801561349857508360ff166005145b806134b457508460ff1660051480156134b457508360ff166002145b156134c25750610bb86136f1565b8460ff1660031480156134d857508360ff166003145b806134f457508460ff1660041480156134f457508360ff166004145b8061351057508460ff16600314801561351057508360ff166004145b8061352c57508460ff16600414801561352c57508360ff166003145b15612edb5750610fa06136f1565b600360f91b6001600160f81b0319600588901a60f81b16141561356257612e9b868686613918565b60ff8516158015613574575060ff8416155b8061359057508460ff16600714801561359057508360ff166007145b806135aa575060ff85161580156135aa57508360ff166007145b806135c457508460ff1660071480156135c4575060ff8416155b806135e057508460ff1660021480156135e057508360ff166002145b806135fc57508460ff1660051480156135fc57508360ff166005145b8061361857508460ff16600214801561361857508360ff166005145b8061363457508460ff16600514801561363457508360ff166002145b8061366c57508360ff166002148061364f57508360ff166005145b801561366c575060028560ff1611801561366c575060068560ff16105b806136a4575060028460ff16118015613688575060058460ff16105b80156136a457508460ff16600214806136a457508460ff166005145b156136b257506103e86136f1565b60ff841615806136c557508360ff166007145b806136d1575060ff8516155b806136df57508460ff166007145b156136ec575060006136f1565b506107d05b95945050505050565b600e80546000918261370b83613ed7565b919050555081444233600e548760405160200161375c959493929190948552602085019390935260609190911b6bffffffffffffffffffffffff191660408401526054830152607482015260940190565b6040516020818303038152906040528051906020012060001c61377f9190614c3a565b9392505050565b6001600160a01b0382166137dc5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610439565b6000818152600260205260409020546001600160a01b0316156138415760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610439565b6001600160a01b038216600090815260036020526040812080546001929061386a908490613ebf565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006136f16138f086600187116138e9576138e4876001613ebf565b6139aa565b60006139aa565b6138fb600285614dc3565b613906600287614dc3565b6139109190614dd5565b60f81b6139c9565b600080600361392a60ff851682614473565b613935906023613ebf565b60ff8086169087168881600a811061394f5761394f613ef2565b61395b9291901a613ebf565b6139659190613ebf565b61396f9190614172565b6139799190614172565b90508061398a57600091505061377f565b806001141561399e57611b5891505061377f565b50613a98949350505050565b60008282600a81106139be576139be613ef2565b1a60f81b9392505050565b60005b6001600160f81b03198216156139f357818318921990911660011b607f60f91b16906139cc565b5090919050565b60405180604001604052806002905b6060815260200190600190039081613a095790505090565b6001600160e01b031981168114610f2a57600080fd5b600060208284031215613a4957600080fd5b813561377f81613a21565b60005b83811015613a6f578181015183820152602001613a57565b83811115610cee5750506000910152565b60008151808452613a98816020860160208601613a54565b601f01601f19169290920160200192915050565b60208152600061377f6020830184613a80565b600060208284031215613ad157600080fd5b5035919050565b80356001600160a01b0381168114613aef57600080fd5b919050565b60008060408385031215613b0757600080fd5b613b1083613ad8565b946020939093013593505050565b80358015158114613aef57600080fd5b600060208284031215613b4057600080fd5b61377f82613b1e565b600080600060608486031215613b5e57600080fd5b613b6784613ad8565b9250613b7560208501613ad8565b9150604084013590509250925092565b600060208284031215613b9757600080fd5b61377f82613ad8565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613bdf57613bdf613ba0565b604052919050565b60006020808385031215613bfa57600080fd5b823567ffffffffffffffff80821115613c1257600080fd5b818501915085601f830112613c2657600080fd5b813581811115613c3857613c38613ba0565b8060051b9150613c49848301613bb6565b8181529183018401918481019088841115613c6357600080fd5b938501935b83851015613c8857613c7985613ad8565b82529385019390850190613c68565b98975050505050505050565b60008060408385031215613ca757600080fd5b613cb083613ad8565b9150613cbe60208401613b1e565b90509250929050565b60008060008060808587031215613cdd57600080fd5b613ce685613ad8565b93506020613cf5818701613ad8565b935060408601359250606086013567ffffffffffffffff80821115613d1957600080fd5b818801915088601f830112613d2d57600080fd5b813581811115613d3f57613d3f613ba0565b613d51601f8201601f19168501613bb6565b91508082528984828501011115613d6757600080fd5b808484018584013760008482840101525080935050505092959194509250565b60008060408385031215613d9a57600080fd5b613da383613ad8565b9150613cbe60208401613ad8565b600181811c90821680613dc557607f821691505b60208210811415613de657634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b60008219821115613ed257613ed2613ea9565b500190565b6000600019821415613eeb57613eeb613ea9565b5060010190565b634e487b7160e01b600052603260045260246000fd5b60008151613f1a818560208601613a54565b9290920192915050565b693d913730b6b2911d101160b11b81528651600090613f4a81600a850160208c01613a54565b875190830190613f6181600a840160208c01613a54565b8751910190613f7781600a840160208b01613a54565b7f227d2c7b2274726169745f74797065223a2022416e696d6174696f6e20312044600a9290910191820152723ab930ba34b7b71116113b30b63ab2911d101160691b602a8201528551613fd181603d840160208a01613a54565b7f6d73227d2c7b2274726169745f74797065223a2022416e696d6174696f6e2032603d92909101918201527410223ab930ba34b7b71116113b30b63ab2911d101160591b605d820152845161402d816072840160208901613a54565b61408c61407e6140786072848601017f6d73227d5d2c22696d616765223a2022646174613a696d6167652f7376672b788152691b5b0ed8985cd94d8d0b60b21b6020820152602a0190565b87613f08565b61227d60f01b815260020190565b9a9950505050505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152600082516140d281601d850160208701613a54565b91909101601d0192915050565b6000828210156140f1576140f1613ea9565b500390565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b60008261416d5761416d614148565b500490565b60008261418157614181614148565b500690565b71222c202261747472696275746573223a205b60701b815286516000906141b4816012850160208c01613a54565b7f7b2274726169745f74797065223a20224261636b67726f756e64222c2276616c601291840191820152653ab2911d101160d11b603282018190528851614202816038850160208d01613a54565b7f227d2c7b2274726169745f74797065223a202246696c746572222c2276616c75603893909101928301526432911d101160d91b6058830152875161424e81605d850160208c01613a54565b7f227d2c7b2274726169745f74797065223a20225061747465726e222c2276616c605d9390910192830152607d82015261431361430d6142d76142d1614297608386018b613f08565b7f227d2c7b2274726169745f74797065223a20225472616e73666f726d222c227681526730b63ab2911d101160c11b602082015260280190565b88613f08565b7f227d2c7b2274726169745f74797065223a20225368617065222c2276616c7565815263111d101160e11b602082015260240190565b85613f08565b9998505050505050505050565b7f3c7376672077696474683d2232353622206865696768743d223235362220766581527f7273696f6e3d22312e312220786d6c6e733d22687474703a2f2f7777772e773360208201527f2e6f72672f323030302f7376672220636c6173733d22733122207374796c653d60408201526b113130b1b5b3b937bab7321d60a11b6060820152600086516143b981606c850160208b01613a54565b621d911f60e91b606c9184019182015286516143dc81606f840160208b01613a54565b651e3232b3399f60d11b606f92909101918201528551614403816075840160208a01613a54565b661e17b232b3399f60c91b91016075810191909152701e339034b21e9133911039ba3cb6329e9160791b607c820152613c8861445d614457614449608d85015b89613f08565b61111f60f11b815260020190565b86613f08565b691e17b39f1e17b9bb339f60b11b8152600a0190565b600081600019048311821515161561448d5761448d613ea9565b500290565b805160208201516001600160b01b0319808216929190600a8310156144c157808184600a0360031b1b83161693505b505050919050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906144fc90830184613a80565b9695505050505050565b60006020828403121561451857600080fd5b815161377f81613a21565b72078e6e8f2d8ca7c5ce662f65a5ac274e4cec45606b1b815260008751614551816013850160208c01613a54565b69052765a5ac474e4cec4560b31b601391840191820152875161457b81601d840160208c01613a54565b7f293b7472616e736974696f6e3a20616c6c20313030306d7320656173653b7d2e601d92909101918201527039989d3437bb32b9103db334b63a32b91d60791b603d82015286516145d381604e840160208b01613a54565b6e1dbe973abdb0b734b6b0ba34b7b71d60891b604e9290910191820152855161460381605d840160208a01613a54565b61408c6146d161468e6142d161464a614644605d878901017f6d7320696e66696e69746520616c7465726e61746520612c0000000000000000815260180190565b8b613f08565b7f6d7320696e66696e69746520616c7465726e61746520623b7472616e73666f728152716d2d6f726967696e3a353025203530253b7d60701b602082015260320190565b7f406b65796672616d657320627b66726f6d7b6f7061636974793a20313b7d746f815270207b6f7061636974793a20302e353b7d7d60781b602082015260310190565b671e17b9ba3cb6329f60c11b815260080190565b600081810b83820b8281128015607f1983018412161561470757614707613ea9565b81607f01831381161561471c5761471c613ea9565b5090039392505050565b60008082810b84820b82811383831382607f048411828216161561474c5761474c613ea9565b607f198584128281168683058612161561476857614768613ea9565b958512958387168583058712161561478257614782613ea9565b84607f058612818816161561479957614799613ea9565b505050910295945050505050565b60008160000b8360000b6000821282607f038213811516156147cb576147cb613ea9565b82607f190382128116156147e1576147e1613ea9565b50019392505050565b6000600160ff1b82141561480057614800613ea9565b5060000390565b60006001600160ff1b038184138284138082168684048611161561482d5761482d613ea9565b600160ff1b600087128281168783058912161561484c5761484c613ea9565b6000871292508782058712848416161561486857614868613ea9565b8785058712818416161561487e5761487e613ea9565b505050929093029392505050565b60008261489b5761489b614148565b600160ff1b8214600019841416156148b5576148b5613ea9565b500590565b602d60f81b8152600082516148d6816001850160208701613a54565b9190910160010192915050565b600083516148f5818460208801613a54565b835190830190614909818360208801613a54565b01949350505050565b600060ff821660ff81141561492957614929613ea9565b60010192915050565b805160208201516001600160d81b031980821692919060058310156144c15760059290920360031b82901b161692915050565b60008451614977818460208901613a54565b8083019050600b60fa1b8082528551614997816001850160208a01613a54565b600192019182015283516149b2816002840160208801613a54565b0160020195945050505050565b7f406b65796672616d657320617b3235257b66696c7465723a00000000000000008152600089516149f7816018850160208e01613a54565b80830190506a1dba3930b739b337b9369d60a91b8060188301528a51614a24816023850160208f01613a54565b6c1dbe9a9812bdb334b63a32b91d60991b602393909101928301528951614a52816030850160208e01613a54565b60309201918201528751614a6d81603b840160208c01613a54565b6c1dbe9b9a92bdb334b63a32b91d60991b603b9290910191820152614aee614adf614457614aa8614443614ac5614abf83604889018f613f08565b6a1dba3930b739b337b9369d60a91b8152600b0190565b8c613f08565b6d1dbe98981812bdb334b63a32b91d60911b8152600e0190565b623b7d7d60e81b815260030190565b9b9a5050505050505050505050565b600060ff821660ff84168160ff0481118215151615614b1e57614b1e613ea9565b029392505050565b7f3c75736520636c6173733d22752220687265663d2223722220783d2200000000815260008751614b5e81601c850160208c01613a54565b6411103c9e9160d91b601c918401918201528751614b83816021840160208c01613a54565b6b04440ccd2d8d87a44e4cec4560a31b602192909101918201528651614bb081602d840160208b01613a54565b808201915050600b60fa1b80602d8301528651614bd481602e850160208b01613a54565b602e9201918201528451614bef81602f840160208901613a54565b61408c614c27614078602f848601017f2922207374796c653d22616e696d6174696f6e2d64656c61793a0000000000008152601a0190565b6636b99d9110179f60c91b815260070190565b600060ff831680614c4d57614c4d614148565b8060ff84160691505092915050565b600061ffff80831681851681830481118215151615614c7d57614c7d613ea9565b02949350505050565b600061ffff80831681851680830382111561490957614909613ea9565b600061ffff83811690831681811015614cbe57614cbe613ea9565b039392505050565b600181815b80851115614d00578160ff04821115614ce657614ce6613ea9565b80851615614cf357918102915b93841c9390800290614ccb565b509250929050565b600082614d175750600161032c565b81614d245750600061032c565b8160018114614d3a5760028114614d4457614d72565b600191505061032c565b60ff841115614d5557614d55613ea9565b6001841b915060ff821115614d6c57614d6c613ea9565b5061032c565b5060208310610133831016604e8410600b8410161715614da6575081810a60ff811115614da157614da1613ea9565b61032c565b614db08383614cc6565b8060ff04821115614b1e57614b1e613ea9565b600061377f60ff841660ff8416614d08565b600060ff821660ff84168060ff03821115614df257614df2613ea9565b01939250505056fe6c696e6561722d6772616469656e7428766172282d2d61292c20766172282d2d6229293c726563742069643d227222206865696768743d223332222077696474683d223332223e3c2f726563743e7472616e73666f726d3a7363616c6528302e372920726f74617465283435646567293b7472616e73666f726d2d6f726967696e3a353025203530253b72616469616c2d6772616469656e7428766172282d2d61292c20766172282d2d6229294142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c636972636c652069643d2272222063783d223136222063793d22313622206865696768743d223332222077696474683d2233322220723d2238223e3c2f636972636c653e636f6e69632d6772616469656e7428766172282d2d61292c20766172282d2d6229297b2274726169745f74797065223a20225370656369616c222c2276616c7565223a2022416c62696e6f227d2ca2646970667358221220b3adf560980eb90ae74ac31a88901b24d48df3b38392c99f269e7b693146c2c964736f6c63430008090033

Deployed Bytecode Sourcemap

40314:23518:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27694:305;;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;27694:305:0;;;;;;;;28639:100;;;:::i;:::-;;;;;;;:::i;30198:221::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1714:32:1;;;1696:51;;1684:2;1669:18;30198:221:0;1550:203:1;29721:411:0;;;;;;:::i;:::-;;:::i;:::-;;41635:96;;;;;;:::i;:::-;;:::i;45066:85::-;45132:11;;45066:85;;;2691:25:1;;;2679:2;2664:18;45066:85:0;2545:177:1;42074:427:0;;;:::i;31088:339::-;;;;;;:::i;:::-;;:::i;31498:185::-;;;;;;:::i;:::-;;:::i;42542:295::-;;;:::i;42875:232::-;;;:::i;28333:239::-;;;;;;:::i;:::-;;:::i;28063:208::-;;;;;;:::i;:::-;;:::i;4567:94::-;;;:::i;41739:258::-;;;;;;:::i;:::-;;:::i;3916:87::-;3989:6;;-1:-1:-1;;;;;3989:6:0;3916:87;;28808:104;;;:::i;30491:295::-;;;;;;:::i;:::-;;:::i;31754:328::-;;;;;;:::i;:::-;;:::i;54896:1196::-;;;;;;:::i;:::-;;:::i;30857:164::-;;;;;;:::i;:::-;;:::i;4816:192::-;;;;;;:::i;:::-;;:::i;27694:305::-;27796:4;-1:-1:-1;;;;;;27833:40:0;;-1:-1:-1;;;27833:40:0;;:105;;-1:-1:-1;;;;;;;27890:48:0;;-1:-1:-1;;;27890:48:0;27833:105;:158;;;-1:-1:-1;;;;;;;;;;26307:40:0;;;27955:36;27813:178;27694:305;-1:-1:-1;;27694:305:0:o;28639:100::-;28693:13;28726:5;28719:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28639:100;:::o;30198:221::-;30274:7;33681:16;;;:7;:16;;;;;;-1:-1:-1;;;;;33681:16:0;30294:73;;;;-1:-1:-1;;;30294:73:0;;6716:2:1;30294:73:0;;;6698:21:1;6755:2;6735:18;;;6728:30;6794:34;6774:18;;;6767:62;-1:-1:-1;;;6845:18:1;;;6838:42;6897:19;;30294:73:0;;;;;;;;;-1:-1:-1;30387:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;30387:24:0;;30198:221::o;29721:411::-;29802:13;29818:23;29833:7;29818:14;:23::i;:::-;29802:39;;29866:5;-1:-1:-1;;;;;29860:11:0;:2;-1:-1:-1;;;;;29860:11:0;;;29852:57;;;;-1:-1:-1;;;29852:57:0;;7129:2:1;29852:57:0;;;7111:21:1;7168:2;7148:18;;;7141:30;7207:34;7187:18;;;7180:62;-1:-1:-1;;;7258:18:1;;;7251:31;7299:19;;29852:57:0;6927:397:1;29852:57:0;2784:10;-1:-1:-1;;;;;29944:21:0;;;;:62;;-1:-1:-1;29969:37:0;29986:5;2784:10;30857:164;:::i;29969:37::-;29922:168;;;;-1:-1:-1;;;29922:168:0;;7531:2:1;29922:168:0;;;7513:21:1;7570:2;7550:18;;;7543:30;7609:34;7589:18;;;7582:62;7680:26;7660:18;;;7653:54;7724:19;;29922:168:0;7329:420:1;29922:168:0;30103:21;30112:2;30116:7;30103:8;:21::i;:::-;29791:341;29721:411;;:::o;41635:96::-;6943:1;7539:7;;:19;;7531:63;;;;-1:-1:-1;;;7531:63:0;;;;;;;:::i;:::-;6943:1;7672:7;:18;3989:6;;-1:-1:-1;;;;;3989:6:0;2784:10;4136:23:::1;4128:68;;;;-1:-1:-1::0;;;4128:68:0::1;;;;;;;:::i;:::-;41707:6:::2;:16:::0;;-1:-1:-1;;41707:16:0::2;::::0;::::2;;::::0;;;::::2;::::0;;-1:-1:-1;7851:7:0;:22;41635:96::o;42074:427::-;6943:1;7539:7;;:19;;7531:63;;;;-1:-1:-1;;;7531:63:0;;;;;;;:::i;:::-;6943:1;7672:7;:18;42159:10:::1;42140:30;::::0;;;:18:::1;:30;::::0;;;;;::::1;;42131:72;;;::::0;-1:-1:-1;;;42131:72:0;;8677:2:1;42131:72:0::1;::::0;::::1;8659:21:1::0;8716:2;8696:18;;;8689:30;8755;8735:18;;;8728:58;8803:18;;42131:72:0::1;8475:352:1::0;42131:72:0::1;42246:10;42224:33;::::0;;;:21:::1;:33;::::0;;;;;::::1;;42223:34;42214:90;;;::::0;-1:-1:-1;;;42214:90:0;;9034:2:1;42214:90:0::1;::::0;::::1;9016:21:1::0;9073:2;9053:18;;;9046:30;9112:34;9092:18;;;9085:62;-1:-1:-1;;;9163:18:1;;;9156:40;9213:19;;42214:90:0::1;8832:406:1::0;42214:90:0::1;42315:10;42328:13;45132:11:::0;;;45066:85;42328:13:::1;42315:26;;42369:2;42360:5;:11;;:26;;;;;42383:3;42375:5;:11;42360:26;42352:59;;;::::0;-1:-1:-1;;;42352:59:0;;9445:2:1;42352:59:0::1;::::0;::::1;9427:21:1::0;9484:2;9464:18;;;9457:30;-1:-1:-1;;;9503:18:1;;;9496:50;9563:18;;42352:59:0::1;9243:344:1::0;42352:59:0::1;42422:20;42436:5;42422:13;:20::i;:::-;-1:-1:-1::0;42475:10:0::1;42453:33;::::0;;;:21:::1;:33;::::0;;;;:40;;-1:-1:-1;;42453:40:0::1;42489:4;42453:40:::0;;::::1;::::0;;;7851:7;:22;42074:427::o;31088:339::-;31283:41;2784:10;31316:7;31283:18;:41::i;:::-;31275:103;;;;-1:-1:-1;;;31275:103:0;;;;;;;:::i;:::-;31391:28;31401:4;31407:2;31411:7;31391:9;:28::i;31498:185::-;31636:39;31653:4;31659:2;31663:7;31636:39;;;;;;;;;;;;:16;:39::i;42542:295::-;6943:1;7539:7;;:19;;7531:63;;;;-1:-1:-1;;;7531:63:0;;;;;;;:::i;:::-;6943:1;7672:7;:18;3989:6;;-1:-1:-1;;;;;3989:6:0;2784:10;4136:23:::1;4128:68;;;;-1:-1:-1::0;;;4128:68:0::1;;;;;;;:::i;:::-;42605:10:::2;42618:13;45132:11:::0;;;45066:85;42618:13:::2;42605:26:::0;-1:-1:-1;42676:2:0::2;42664:9;:5:::0;42672:1:::2;42664:9;:::i;:::-;:14;42642:94;;;::::0;-1:-1:-1;;;42642:94:0;;10477:2:1;42642:94:0::2;::::0;::::2;10459:21:1::0;10516:2;10496:18;;;10489:30;10555:34;10535:18;;;10528:62;-1:-1:-1;;;10606:18:1;;;10599:51;10667:19;;42642:94:0::2;10275:417:1::0;42642:94:0::2;42761:5:::0;42747:83:::2;42772:10;:5:::0;42780:2:::2;42772:10;:::i;:::-;42768:1;:14;42747:83;;;42802:16;42816:1;42802:13;:16::i;:::-;42784:3:::0;::::2;::::0;::::2;:::i;:::-;;;;42747:83;;;-1:-1:-1::0;;6899:1:0;7851:7;:22;42542:295::o;42875:232::-;6943:1;7539:7;;:19;;7531:63;;;;-1:-1:-1;;;7531:63:0;;;;;;;:::i;:::-;6943:1;7672:7;:18;42933:6:::1;::::0;::::1;;42932:7;42923:38;;;::::0;-1:-1:-1;;;42923:38:0;;11039:2:1;42923:38:0::1;::::0;::::1;11021:21:1::0;11078:2;11058:18;;;11051:30;-1:-1:-1;;;11097:18:1;;;11090:47;11154:18;;42923:38:0::1;10837:341:1::0;42923:38:0::1;42972:10;42985:13;45132:11:::0;;;45066:85;42985:13:::1;42972:26;;43026:2;43017:5;:11;;:26;;;;;43040:3;43032:5;:11;43017:26;43009:59;;;::::0;-1:-1:-1;;;43009:59:0;;9445:2:1;43009:59:0::1;::::0;::::1;9427:21:1::0;9484:2;9464:18;;;9457:30;-1:-1:-1;;;9503:18:1;;;9496:50;9563:18;;43009:59:0::1;9243:344:1::0;43009:59:0::1;43079:20;43093:5;43079:13;:20::i;:::-;-1:-1:-1::0;6899:1:0;7851:7;:22;42875:232::o;28333:239::-;28405:7;28441:16;;;:7;:16;;;;;;-1:-1:-1;;;;;28441:16:0;28476:19;28468:73;;;;-1:-1:-1;;;28468:73:0;;11385:2:1;28468:73:0;;;11367:21:1;11424:2;11404:18;;;11397:30;11463:34;11443:18;;;11436:62;-1:-1:-1;;;11514:18:1;;;11507:39;11563:19;;28468:73:0;11183:405:1;28063:208:0;28135:7;-1:-1:-1;;;;;28163:19:0;;28155:74;;;;-1:-1:-1;;;28155:74:0;;11795:2:1;28155:74:0;;;11777:21:1;11834:2;11814:18;;;11807:30;11873:34;11853:18;;;11846:62;-1:-1:-1;;;11924:18:1;;;11917:40;11974:19;;28155:74:0;11593:406:1;28155:74:0;-1:-1:-1;;;;;;28247:16:0;;;;;:9;:16;;;;;;;28063:208::o;4567:94::-;3989:6;;-1:-1:-1;;;;;3989:6:0;2784:10;4136:23;4128:68;;;;-1:-1:-1;;;4128:68:0;;;;;;;:::i;:::-;4632:21:::1;4650:1;4632:9;:21::i;:::-;4567:94::o:0;41739:258::-;3989:6;;-1:-1:-1;;;;;3989:6:0;2784:10;4136:23;4128:68;;;;-1:-1:-1;;;4128:68:0;;;;;;;:::i;:::-;6943:1:::1;7539:7;;:19;;7531:63;;;;-1:-1:-1::0;;;7531:63:0::1;;;;;;;:::i;:::-;6943:1;7672:7;:18:::0;41833:6:::2;41828:156;41849:5;:12;41845:1;:16;41828:156;;;41914:4;41883:18;:28;41902:5;41908:1;41902:8;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;41883:28:0::2;-1:-1:-1::0;;;;;41883:28:0::2;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;41967:5;41933:21;:31;41955:5;41961:1;41955:8;;;;;;;;:::i;:::-;;::::0;;::::2;::::0;;;;;;;-1:-1:-1;;;;;41933:31:0::2;::::0;;;::::2;::::0;;;;;;-1:-1:-1;41933:31:0;:39;;-1:-1:-1;;41933:39:0::2;::::0;::::2;;::::0;;;::::2;::::0;;41863:3;::::2;::::0;::::2;:::i;:::-;;;;41828:156;;28808:104:::0;28864:13;28897:7;28890:14;;;;;:::i;30491:295::-;-1:-1:-1;;;;;30594:24:0;;2784:10;30594:24;;30586:62;;;;-1:-1:-1;;;30586:62:0;;12338:2:1;30586:62:0;;;12320:21:1;12377:2;12357:18;;;12350:30;12416:27;12396:18;;;12389:55;12461:18;;30586:62:0;12136:349:1;30586:62:0;2784:10;30661:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;30661:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;30661:53:0;;;;;;;;;;30730:48;;540:41:1;;;30661:42:0;;2784:10;30730:48;;513:18:1;30730:48:0;;;;;;;30491:295;;:::o;31754:328::-;31929:41;2784:10;31962:7;31929:18;:41::i;:::-;31921:103;;;;-1:-1:-1;;;31921:103:0;;;;;;;:::i;:::-;32035:39;32049:4;32055:2;32059:7;32068:5;32035:13;:39::i;:::-;31754:328;;;;:::o;54896:1196::-;33657:4;33681:16;;;:7;:16;;;;;;54961:13;;-1:-1:-1;;;;;33681:16:0;54987:75;;;;-1:-1:-1;;;54987:75:0;;12692:2:1;54987:75:0;;;12674:21:1;12731:2;12711:18;;;12704:30;12770:34;12750:18;;;12743:62;-1:-1:-1;;;12821:18:1;;;12814:45;12876:19;;54987:75:0;12490:411:1;54987:75:0;55160:912;55287:7;55298:5;55287:16;:35;;;;55307:7;55318:4;55307:15;55287:35;55286:73;;;;;;;;;;;;;;;-1:-1:-1;;;55286:73:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;55286:73:0;;;;55380:17;55389:7;55380:8;:17::i;:::-;55418:22;55432:7;55418:13;:22::i;:::-;55643:35;55667:7;55676:1;55643:23;:35::i;:::-;55775;55799:7;55808:1;55775:23;:35::i;:::-;55899:84;55941:20;55953:7;55941:11;:20::i;:::-;55899:13;:84::i;:::-;55235:792;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55160:13;:912::i;:::-;55087:996;;;;;;;;:::i;:::-;;;;;;;;;;;;;55073:1011;;54896:1196;;;:::o;30857:164::-;-1:-1:-1;;;;;30978:25:0;;;30954:4;30978:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;30857:164::o;4816:192::-;3989:6;;-1:-1:-1;;;;;3989:6:0;2784:10;4136:23;4128:68;;;;-1:-1:-1;;;4128:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;4905:22:0;::::1;4897:73;;;::::0;-1:-1:-1;;;4897:73:0;;16235:2:1;4897:73:0::1;::::0;::::1;16217:21:1::0;16274:2;16254:18;;;16247:30;16313:34;16293:18;;;16286:62;-1:-1:-1;;;16364:18:1;;;16357:36;16410:19;;4897:73:0::1;16033:402:1::0;4897:73:0::1;4981:19;4991:8;4981:9;:19::i;:::-;4816:192:::0;:::o;37574:174::-;37649:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;37649:29:0;-1:-1:-1;;;;;37649:29:0;;;;;;;;:24;;37703:23;37649:24;37703:14;:23::i;:::-;-1:-1:-1;;;;;37694:46:0;;;;;;;;;;;37574:174;;:::o;43115:179::-;43198:21;43211:7;43198:12;:21::i;:::-;43174;;;;:12;:21;;;;;:45;;-1:-1:-1;;43174:45:0;;;;;;;;;;;;43230:32;2784:10;43254:7;43230:9;:32::i;:::-;43273:11;:13;;;:11;:13;;;:::i;:::-;;;;;;43115:179;:::o;33886:348::-;33979:4;33681:16;;;:7;:16;;;;;;-1:-1:-1;;;;;33681:16:0;33996:73;;;;-1:-1:-1;;;33996:73:0;;16642:2:1;33996:73:0;;;16624:21:1;16681:2;16661:18;;;16654:30;16720:34;16700:18;;;16693:62;-1:-1:-1;;;16771:18:1;;;16764:42;16823:19;;33996:73:0;16440:408:1;33996:73:0;34080:13;34096:23;34111:7;34096:14;:23::i;:::-;34080:39;;34149:5;-1:-1:-1;;;;;34138:16:0;:7;-1:-1:-1;;;;;34138:16:0;;:51;;;;34182:7;-1:-1:-1;;;;;34158:31:0;:20;34170:7;34158:11;:20::i;:::-;-1:-1:-1;;;;;34158:31:0;;34138:51;:87;;;;34193:32;34210:5;34217:7;34193:16;:32::i;:::-;34130:96;33886:348;-1:-1:-1;;;;33886:348:0:o;36878:578::-;37037:4;-1:-1:-1;;;;;37010:31:0;:23;37025:7;37010:14;:23::i;:::-;-1:-1:-1;;;;;37010:31:0;;37002:85;;;;-1:-1:-1;;;37002:85:0;;17055:2:1;37002:85:0;;;17037:21:1;17094:2;17074:18;;;17067:30;17133:34;17113:18;;;17106:62;-1:-1:-1;;;17184:18:1;;;17177:39;17233:19;;37002:85:0;16853:405:1;37002:85:0;-1:-1:-1;;;;;37106:16:0;;37098:65;;;;-1:-1:-1;;;37098:65:0;;17465:2:1;37098:65:0;;;17447:21:1;17504:2;17484:18;;;17477:30;17543:34;17523:18;;;17516:62;-1:-1:-1;;;17594:18:1;;;17587:34;17638:19;;37098:65:0;17263:400:1;37098:65:0;37280:29;37297:1;37301:7;37280:8;:29::i;:::-;-1:-1:-1;;;;;37322:15:0;;;;;;:9;:15;;;;;:20;;37341:1;;37322:15;:20;;37341:1;;37322:20;:::i;:::-;;;;-1:-1:-1;;;;;;;37353:13:0;;;;;;:9;:13;;;;;:18;;37370:1;;37353:13;:18;;37370:1;;37353:18;:::i;:::-;;;;-1:-1:-1;;37382:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;37382:21:0;-1:-1:-1;;;;;37382:21:0;;;;;;;;;37421:27;;37382:16;;37421:27;;;;;;;36878:578;;;:::o;5016:173::-;5091:6;;;-1:-1:-1;;;;;5108:17:0;;;-1:-1:-1;;;;;;5108:17:0;;;;;;;5141:40;;5091:6;;;5108:17;5091:6;;5141:40;;5072:16;;5141:40;5061:128;5016:173;:::o;32964:315::-;33121:28;33131:4;33137:2;33141:7;33121:9;:28::i;:::-;33168:48;33191:4;33197:2;33201:7;33210:5;33168:22;:48::i;:::-;33160:111;;;;-1:-1:-1;;;33160:111:0;;;;;;;:::i;62315:723::-;62371:13;62592:10;62588:53;;-1:-1:-1;;62619:10:0;;;;;;;;;;;;-1:-1:-1;;;62619:10:0;;;;;62315:723::o;62588:53::-;62666:5;62651:12;62707:78;62714:9;;62707:78;;62740:8;;;;:::i;:::-;;-1:-1:-1;62763:10:0;;-1:-1:-1;62771:2:0;62763:10;;:::i;:::-;;;62707:78;;;62795:19;62827:6;62817:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;62817:17:0;;62795:39;;62845:154;62852:10;;62845:154;;62879:11;62889:1;62879:11;;:::i;:::-;;-1:-1:-1;62948:10:0;62956:2;62948:5;:10;:::i;:::-;62935:24;;:2;:24;:::i;:::-;62922:39;;62905:6;62912;62905:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;62905:56:0;;;;;;;;-1:-1:-1;62976:11:0;62985:2;62976:11;;:::i;:::-;;;62845:154;;56152:784;56215:13;56314:7;56325:5;56314:16;:35;;;;56334:7;56345:4;56334:15;56314:35;56313:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56470:35;56494:7;56503:1;56470:23;:35::i;:::-;56570;56594:7;56603:1;56570:23;:35::i;:::-;56671;56695:7;56704:1;56671:23;:35::i;:::-;56774;56798:7;56807:1;56774:23;:35::i;:::-;56873;56897:7;56906:1;56873:23;:35::i;:::-;56263:656;;;;;;;;;;;;;:::i;56992:1470::-;57076:13;57104:3;:8;;57111:1;57104:8;57100:193;;;57132:151;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;57132:151:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;57132:151:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;57132:151:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;57132:151:0;;;;;;57253:29;57271:7;57280:1;57253:17;:29::i;:::-;57132:151;;;;;;;;;:::i;:::-;;;;;57125:158;;;;57100:193;57305:3;:8;;57312:1;57305:8;57301:219;;;57333:177;;;;;;;;;;;;;;;-1:-1:-1;;;57333:177:0;;;;;;;;;;;;;;;;-1:-1:-1;;;57333:177:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;57333:177:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;57333:177:0;;;;-1:-1:-1;;;57333:177:0;;;;;;;;;;;;-1:-1:-1;;;57333:177:0;;;;-1:-1:-1;;;57333:177:0;;;;57480:29;57498:7;57507:1;57480:17;:29::i;:::-;57333:177;;;;;;;;;:::i;57301:219::-;57532:3;:8;;57539:1;57532:8;57528:351;;;57553:11;57567:29;57585:7;57594:1;57567:17;:29::i;:::-;57553:43;;57622:1;57614:5;:9;;;:255;;57640:229;;;;;;;;;;;;;;;-1:-1:-1;;;57640:229:0;;;;;;;;;;;;;;;;-1:-1:-1;;;57640:229:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;57640:229:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;57640:229:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;57640:229:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;57640:229:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;57640:229:0;;;;-1:-1:-1;;;57640:229:0;;;;;;;;;;;;-1:-1:-1;;;57640:229:0;;;;-1:-1:-1;;;57640:229:0;;;;57839:29;57857:7;57866:1;57839:17;:29::i;:::-;57640:229;;;;;;;;;:::i;:::-;;;;;57614:255;;;;;;;;;;;;;;;;-1:-1:-1;;;57614:255:0;;;;57607:262;;;;;57528:351;57891:3;:8;;57898:1;57891:8;57887:222;;;57919:180;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;57919:180:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;57919:180:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;57919:180:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;57919:180:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;57919:180:0;;;;;;58069:29;58087:7;58096:1;58069:17;:29::i;57887:222::-;58121:3;:8;;58128:1;58121:8;58117:126;;;58149:84;;;;;;;;;;;;;;;-1:-1:-1;;;58149:84:0;;;;;;;;;;;;;;;;-1:-1:-1;;;58149:84:0;;;;;;;;;;;;;;58203:29;58221:7;58230:1;58203:17;:29::i;:::-;58149:84;;;;;;;;;:::i;58117:126::-;58258:196;;;;;;;;;;;;;;;-1:-1:-1;;;58258:196:0;;;;;;;;;;;;;;;;-1:-1:-1;;;58258:196:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;58258:196:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;58258:196:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;58258:196:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;58258:196:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;58258:196:0;;;;-1:-1:-1;;;58258:196:0;;;;;;;;;;;-1:-1:-1;;;58258:196:0;;;;-1:-1:-1;;;58258:196:0;;;;58409:44;58427:7;58443:1;58436:8;;;;:16;;58451:1;58409:17;:44::i;58436:16::-;58447:1;58409:17;:44::i;:::-;58258:196;;;;;;;;;:::i;:::-;;;;;;56992:1470;-1:-1:-1;;;56992:1470:0:o;45223:559::-;45284:13;45465:24;45481:7;45465:15;:24::i;:::-;45509:22;45523:7;45509:13;:22::i;:::-;45554:19;45565:7;45554:10;:19::i;:::-;45617:11;45627:1;45617:7;:11;:::i;:::-;:16;:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45721:16;45729:7;45721;:16::i;:::-;45324:449;;;;;;;;;;;;:::i;300:1774::-;398:11;;358:13;;424:8;420:23;;-1:-1:-1;;434:9:0;;;;;;;;;-1:-1:-1;434:9:0;;;300:1774;-1:-1:-1;300:1774:0:o;420:23::-;495:18;533:1;522:7;:3;528:1;522:7;:::i;:::-;521:13;;;;:::i;:::-;516:19;;:1;:19;:::i;:::-;495:40;-1:-1:-1;593:19:0;625:15;495:40;638:2;625:15;:::i;:::-;615:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;615:26:0;;593:48;;652:18;673:5;;;;;;;;;;;;;;;;;652:26;;742:1;735:5;731:13;787:2;779:6;775:15;836:1;804:954;859:3;856:1;853:10;804:954;;;914:1;957:12;;;;;951:19;1050:4;1038:2;1034:14;;;;;1016:40;;1010:47;1202:2;1198:14;;;1194:25;;1180:40;;1174:47;1392:1;1388:13;;;1384:24;;1370:39;;1364:46;1573:16;;;;1559:31;;1553:38;1086:1;1082:11;;;1223:4;1170:58;;;1118:129;1272:11;;1360:57;;;1308:128;;;;1461:11;;1549:49;;1497:120;1646:3;1642:13;1673:22;;1741:1;1726:17;;;;907:9;804:954;;;808:44;1788:1;1783:3;1779:11;1809:1;1804:84;;;;1907:1;1902:82;;;;1772:212;;1804:84;-1:-1:-1;;;;;1837:17:0;;1830:43;1804:84;;1902:82;-1:-1:-1;;;;;1935:17:0;;1928:41;1772:212;-1:-1:-1;;;1998:26:0;;;2005:6;300:1774;-1:-1:-1;;;;300:1774:0:o;43302:1521::-;43359:7;43592:11;43616:7;43627:4;43616:15;:35;;;;43635:7;43646:5;43635:16;43616:35;43612:815;;;-1:-1:-1;;43671:15:0;;;;:6;:15;;;;;;;;;43302:1521::o;43612:815::-;43776:26;43789:7;43798:3;43776:12;:26::i;:::-;43834;43847:7;43856:3;43834:12;:26::i;:::-;43894;43907:7;43916:3;43894:12;:26::i;:::-;43953:24;43966:7;43975:1;43953:12;:24::i;:::-;44018;44031:7;44040:1;44018:12;:24::i;:::-;44079;44092:7;44101:1;44079:12;:24::i;:::-;44141;44154:7;44163:1;44141:12;:24::i;:::-;44205;44218:7;44227:1;44205:12;:24::i;:::-;44265;44278:7;44287:1;44265:12;:24::i;:::-;44334;44347:7;44356:1;44334:12;:24::i;:::-;43743:659;;-1:-1:-1;;;;;;24319:15:1;;;43743:659:0;;;24307:28:1;24364:15;;;24351:11;;;24344:36;24409:15;;;24396:11;;;24389:36;24454:15;;;24441:11;;;24434:36;24499:15;;;24486:11;;;24479:36;24544:15;;;24531:11;;;24524:36;24589:15;;24576:11;;;24569:36;24634:15;;24621:11;;;24614:36;24679:15;;24666:11;;;24659:36;24724:15;;;24711:11;;;24704:36;24756:12;;43743:659:0;;;;;;;;;;;;43721:694;;;:::i;:::-;43715:700;;44558:20;44581:21;44598:3;44581:16;:21::i;:::-;-1:-1:-1;;;;;;44638:27:0;;;;;;:12;:27;;;;;;44558:44;;-1:-1:-1;44638:27:0;;44634:110;;;44680:9;:11;;;:9;:11;;;:::i;:::-;;;;;;44711:21;44724:7;44711:12;:21::i;44634:110::-;-1:-1:-1;;;;;;44754:27:0;;;;;:12;:27;;;;;:34;;-1:-1:-1;;44754:34:0;44784:4;44754:34;;;44806:3;43302:1521;-1:-1:-1;;43302:1521:0:o;34576:110::-;34652:26;34662:2;34666:7;34652:26;;;;;;;;;;;;:9;:26::i;:::-;34576:110;;:::o;38313:799::-;38468:4;-1:-1:-1;;;;;38489:13:0;;16322:20;16370:8;38485:620;;38525:72;;-1:-1:-1;;;38525:72:0;;-1:-1:-1;;;;;38525:36:0;;;;;:72;;2784:10;;38576:4;;38582:7;;38591:5;;38525:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38525:72:0;;;;;;;;-1:-1:-1;;38525:72:0;;;;;;;;;;;;:::i;:::-;;;38521:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38767:13:0;;38763:272;;38810:60;;-1:-1:-1;;;38810:60:0;;;;;;;:::i;38763:272::-;38985:6;38979:13;38970:6;38966:2;38962:15;38955:38;38521:529;-1:-1:-1;;;;;;38648:51:0;-1:-1:-1;;;38648:51:0;;-1:-1:-1;38641:58:0;;38485:620;-1:-1:-1;39089:4:0;38313:799;;;;;;:::o;61846:142::-;61924:5;61953:21;;;:12;:21;;;;;;;;;;;:26;;;;;;;;;;:::i;:::-;;;61846:142;-1:-1:-1;;;61846:142:0:o;58886:359::-;58951:13;58975:28;:204;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;58975:204:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58975:204:0;59207:29;59225:7;59234:1;59207:17;:29::i;:::-;59195:42;;;;;;;;;:::i;45822:758::-;45885:13;45909:25;45937:21;45950:7;45937:12;:21::i;:::-;46031:11;;;46067;;;45909:49;;-1:-1:-1;46031:11:0;46143:4;46132:15;;:124;;46164:7;46175:5;46164:16;:91;;46200:11;46210:1;46200:7;:11;:::i;:::-;:16;:54;;;;;;;;;;;;;;;-1:-1:-1;;;46200:54:0;;;46132:124;;46200:54;;;;;;;;;;;;;;-1:-1:-1;;;46200:54:0;;;46132:124;;46164:91;;;;;;;;;;;;;;-1:-1:-1;;;46164:91:0;;;46132:124;;;;;;;;;;;;;;;;-1:-1:-1;;;46132:124:0;;;;46275:44;46284:34;46307:7;46316:1;46284:22;:34::i;:::-;46275:44;;:8;:44::i;:::-;46348;46357:34;46380:7;46389:1;46357:22;:34::i;46348:44::-;46456:23;46471:7;46456:14;:23::i;:::-;45981:590;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45967:605;;;45822:758;;;:::o;54527:318::-;54587:13;54611:23;:173;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54611:173:0;54807:29;54825:7;54834:1;54807:17;:29::i;:::-;54800:37;;;;;;;;;:::i;46649:1939::-;46758:11;46772:21;;;:12;:21;;;;;;46706:13;;;;46772:21;;;46819:24;46772:21;46785:7;62200:67;;-1:-1:-1;;;;;;37089:45:1;;62200:67:0;;;37077:58:1;37151:12;;;37144:28;;;62149:6:0;;37188:12:1;;62200:67:0;;;-1:-1:-1;;62200:67:0;;;;;;;;;62190:78;;62200:67;62190:78;;;;;62076:202;-1:-1:-1;;;62076:202:0;46819:24;46804:39;;;-1:-1:-1;46854:9:0;;;47292:1;47282:3;47286:1;47282:6;47276:17;47272:1290;;;47313:7;47308:887;47330:1;47326;:5;;;47308:887;;;47365:11;47375:1;47370;47365:11;:::i;:::-;47360:17;;:1;:17;:::i;:::-;:21;;47380:1;47360:21;:::i;:::-;47355:27;;;-1:-1:-1;47403:8:0;47410:1;47403:4;:8;:::i;:::-;47415:1;47403:13;47399:134;;;47441:2;47442:1;47441:2;:::i;:::-;47437:6;;47399:134;;;47471:8;47478:1;47471:4;:8;:::i;:::-;47483:1;47471:13;47467:66;;;47509:6;47513:1;47509:3;:6::i;:::-;47505:10;;47467:66;47553:13;47561:4;47553:1;:13;:::i;:::-;47549:17;;47588:7;47583:599;47605:1;47601;:5;;;47583:599;;;47644:11;47654:1;47649;47644:11;:::i;:::-;47639:17;;:1;:17;:::i;:::-;:21;;47659:1;47639:21;:::i;:::-;47634:27;;;-1:-1:-1;47686:8:0;47693:1;47686:4;:8;:::i;:::-;47698:1;47686:13;47682:74;;;47728:6;47732:1;47728:3;:6::i;:::-;47724:10;;47682:74;47780:13;47788:4;47780:1;:13;:::i;:::-;47776:17;-1:-1:-1;47853:9:0;47860:2;47853:4;:9;:::i;:::-;47852:15;;47866:1;47852:15;:::i;:::-;47835:11;47823:5;47827:1;47823;:5;:::i;:::-;:24;;;;:::i;:::-;47818:50;;;;:::i;:::-;47814:54;;47889:21;47917:2;47913:1;:6;:79;;47974:18;47983:8;:1;47987:4;47983:8;:::i;:::-;47974;:18::i;:::-;47913:79;;;47951:18;47960:8;:1;47964:4;47960:8;:::i;47951:18::-;47929:41;;;;;;;;:::i;:::-;;;;;;;;;;;;;47913:79;47889:103;;48085:1;48111:31;48123:3;48128:1;48131;48134:7;48111:11;:31::i;:::-;48044:119;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48033:131;;47613:569;47608:3;;;;;:::i;:::-;;;;47583:599;;;-1:-1:-1;47333:3:0;;;;:::i;:::-;;;;47308:887;;;;47272:1290;;;48260:7;48255:296;48277:1;48273;:5;;;48255:296;;;48305:7;48300:238;48322:1;48318;:5;;;48300:238;;;48351:31;48369:3;48374:1;48377;48380;48351:17;:31::i;:::-;48347:35;;48447:1;48469:35;48481:3;48486:1;48489;48492:11;48501:1;48492:8;:11::i;:::-;48469;:35::i;:::-;48410:111;;;;;;;;;:::i;:::-;;;;;;;;;;;;;48399:123;;48325:3;;;;;:::i;:::-;;;;48300:238;;;-1:-1:-1;48280:3:0;;;;:::i;:::-;;;;48255:296;;;;47272:1290;-1:-1:-1;48579:1:0;;46649:1939;-1:-1:-1;;;;;;46649:1939:0:o;61642:129::-;61710:6;61741:21;61749:7;61758:3;61741:7;:21::i;:::-;61734:29;;;61642:129;-1:-1:-1;;;61642:129:0:o;44831:227::-;44892:6;44968:3;44972:1;44968:6;;;44976:3;44980:1;44976:6;;;44984:3;44988:1;44984:6;;;44992:3;44996:1;44992:6;;;45000:3;45004:1;45000:6;;;45008:3;45012:1;45008:6;;;45016:3;45020:1;44935:106;;-1:-1:-1;;;;;;32410:15:1;;;44935:106:0;;;32398:28:1;32455:15;;;32442:11;;;32435:36;32500:15;;;32487:11;;;32480:36;32545:15;;;32532:11;;;32525:36;32590:15;;;32577:11;;;32570:36;32635:15;;32622:11;;;32615:36;45016:6:0;;;;32680:15:1;;;;32667:11;;;32660:36;32712:11;;44935:106:0;;;;;;;;;;;;44916:134;;;:::i;34913:321::-;35043:18;35049:2;35053:7;35043:5;:18::i;:::-;35094:54;35125:1;35129:2;35133:7;35142:5;35094:22;:54::i;:::-;35072:154;;;;-1:-1:-1;;;35072:154:0;;;;;;;:::i;59365:523::-;59427:16;;:::i;:::-;59454:10;59474:29;59492:7;59501:1;59474:17;:29::i;:::-;59467:37;;59454:50;;59513:12;59535:29;59553:7;59562:1;59535:17;:29::i;:::-;59528:37;;59513:52;;59574:11;59595:29;59613:7;59622:1;59595:17;:29::i;:::-;59588:37;;59574:51;;59634:246;;;;;;;;59676:21;59692:3;59691:4;59685:11;;59676:21;;:8;:21::i;:::-;59703:23;59718:6;;59712:13;;59703:8;:23::i;:::-;59732:22;59747:5;;59741:12;;59732:8;:22::i;:::-;59659:96;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;59659:96:0;;;;;;;;;59634:246;;59659:96;59634:246;59791:23;59806:6;;59800:13;;59791:8;:23::i;:::-;59820:22;59835:5;;59829:12;;59820:8;:22::i;:::-;59848:21;59863:4;;59857:11;;59848:8;:21::i;:::-;59774:96;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;59774:96:0;;;;;;;;;59634:246;;;59365:523;-1:-1:-1;;;;;59365:523:0:o;58511:319::-;58611:158;;;;;;;;58646:4;58611:158;;58661:4;58611:158;;;;58676:4;58611:158;;;;;;;58691:5;58611:158;;;;58707:5;58611:158;;;;58723:5;58611:158;;;;58739:5;58611:158;;;;58755:5;58611:158;;;;58594:6;;58611:158;58790:31;58808:7;58817:3;58790:17;:31::i;:::-;58785:37;;;;;;;;;:::i;:::-;;;;;;58511:319;-1:-1:-1;;;;58511:319:0:o;59958:1598::-;60022:13;60046:27;:415;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;60046:415:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;60046:415:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;60046:415:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;60046:415:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;60046:415:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;60046:415:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;60046:415:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;60046:415:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;60046:415:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;60046:415:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;60046:415:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;60046:415:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;60046:415:0;;;;;;;;;;;60470:30;:367;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;60470:367:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;60470:367:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;60470:367:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;60470:367:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;60470:367:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;60470:367:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;60470:367:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;60470:367:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;60470:367:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;60470:367:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;60470:367:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;60470:367:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;60470:367:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;60470:367:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;60470:367:0;;;;;;;;;;;60852:15;60955:7;60963:29;60981:7;60990:1;60963:17;:29::i;:::-;60955:38;;;;;;;;;:::i;:::-;;;;;:41;61023:10;61034:29;61052:7;61061:1;61034:17;:29::i;:::-;61023:41;;;;;;;;;:::i;:::-;;;;;:44;61108:7;61116:29;61134:7;61143:1;61116:17;:29::i;:::-;61108:38;;;;;;;;;:::i;:::-;;;;;61147:1;61108:41;;;;61176:10;61187:29;61205:7;61214:1;61187:17;:29::i;:::-;61176:41;;;;;;;;;:::i;:::-;;;;;61218:1;61176:44;;;;61249:7;61257:29;61275:7;61284:1;61257:17;:29::i;:::-;61249:38;;;;;;;;;:::i;:::-;;;;;:41;61317:10;61328:29;61346:7;61355:1;61328:17;:29::i;:::-;61317:41;;;;;;;;;:::i;:::-;;;;;:44;61391:7;61399:29;61417:7;61426:1;61399:17;:29::i;:::-;61391:38;;;;;;;;;:::i;:::-;;;;;:41;;;61459:10;61470:29;61488:7;61497:1;61470:17;:29::i;:::-;61459:41;;;;;;;;;:::i;:::-;;;;;61501:1;61459:44;;;;60887:633;;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;60887:633:0;;;;;;;;;;59958:1598;-1:-1:-1;;;;;59958:1598:0:o;63499:107::-;63542:3;63567:1;63562;:6;63558:20;;-1:-1:-1;63577:1:0;63499:107::o;63558:20::-;63596:2;63597:1;63596:2;:::i;53886:587::-;53982:13;54101:23;54110:13;54116:1;54121:2;54110:13;:::i;:::-;54101:23;;:8;:23::i;:::-;54150;54159:13;54165:1;54170:2;54159:13;:::i;54150:23::-;54206:42;54221:25;54233:3;54238:1;54241;54244;54221:11;:25::i;:::-;54215:32;;54206:8;:42::i;:::-;54270;54285:25;54297:3;54302:1;54305;54308;54285:11;:25::i;54270:42::-;54334;54349:25;54361:3;54366:1;54369;54372;54349:11;:25::i;54334:42::-;54423:5;54036:418;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54008:457;;53886:587;;;;;;:::o;48718:4094::-;48811:4;48840:5;48857:3;48861:1;48857:6;;;-1:-1:-1;;;;;;48857:14:0;48854:3929;;48903:13;48913:3;48903:13;;:::i;:::-;;;48854:3929;;;-1:-1:-1;;;;;;;;;48940:1:0;48936:6;;;;;:14;;48932:3851;;;48985:13;48995:3;48985:13;;:::i;:::-;;;49027:3;49018:6;:12;:25;;49037:6;49018:25;;;-1:-1:-1;49033:1:0;48932:3851;;;-1:-1:-1;;;;;;;;;49067:1:0;49063:6;;;;;:14;;49059:3724;;;49113:11;49109:55;;-1:-1:-1;49148:4:0;49109:55;49178:5;49182:1;49178;:5;:::i;:::-;:10;;49174:162;;49212:5;49216:1;49212;:5;:::i;:::-;:10;;;:36;;49242:6;49212:36;;;49225:14;49235:4;49225:14;;:::i;:::-;;;;49212:36;49203:45;;49174:162;;;49288:5;49292:1;49288;:5;:::i;:::-;:10;;;:36;;49310:14;49320:4;49310:14;;:::i;:::-;;;;49288:36;;;49301:6;49288:36;49279:45;;49174:162;49346:14;49356:4;49346:14;;:::i;49059:3724::-;-1:-1:-1;;;;;;;;;49384:1:0;49380:6;;;;;:14;;49376:3407;;;49440:6;;;;:16;;;;-1:-1:-1;49450:6:0;;;;49440:16;49439:40;;;-1:-1:-1;49462:6:0;;;;:16;;;;;49472:1;:6;;49477:1;49472:6;49462:16;49439:62;;;;49484:1;:6;;49489:1;49484:6;:16;;;;-1:-1:-1;49494:6:0;;;;49484:16;49439:84;;;;49506:1;:6;;49511:1;49506:6;:16;;;;;49516:1;:6;;49521:1;49516:6;49506:16;49435:255;;;-1:-1:-1;49547:4:0;49376:3407;;49435:255;49573:1;:6;;49578:1;49573:6;:16;;;;49583:1;:6;;49588:1;49583:6;49573:16;:26;;;;49593:1;:6;;49598:1;49593:6;49573:26;:36;;;;49603:1;:6;;49608:1;49603:6;49573:36;49569:121;;;-1:-1:-1;49633:1:0;49376:3407;;49569:121;-1:-1:-1;49674:4:0;49569:121;49376:3407;;;-1:-1:-1;;;;;;;;;49713:1:0;49709:6;;;;;:14;;49705:3078;;;49759:6;;;49755:1754;;49796:7;;;;:3;:7;:::i;:::-;49789:14;;:4;:14;:::i;:::-;49780:23;;;;49705:3078;;49755:1754;49825:6;;;49821:1688;;49862:7;;;;:3;:7;:::i;:::-;49855:14;;:4;:14;:::i;49821:1688::-;49891:1;:6;;49896:1;49891:6;49887:1622;;;49920:1;49916;:5;;;:14;;;;;49929:1;49925;:5;;;49916:14;49912:122;;;49964:7;;;;:3;:7;:::i;:::-;49956:15;;:5;:15;:::i;49912:122::-;-1:-1:-1;50015:5:0;49376:3407;;49887:1622;50055:1;:6;;50060:1;50055:6;50051:1458;;;50080:1;:6;;50085:1;50080:6;50076:175;;;-1:-1:-1;50112:5:0;49376:3407;;50076:175;50141:1;:6;;50146:1;50141:6;50137:114;;;-1:-1:-1;50173:5:0;49376:3407;;50137:114;50230:7;;;;:3;:7;:::i;:::-;50222:15;;:5;:15;:::i;50051:1458::-;50272:1;:6;;50277:1;50272:6;50268:1241;;;50297:1;:6;;50302:1;50297:6;50293:297;;;-1:-1:-1;50329:5:0;49376:3407;;50293:297;50358:1;:6;;50363:1;50358:6;50354:236;;;-1:-1:-1;50390:5:0;49376:3407;;50354:236;50419:1;:6;;50424:1;50419:6;50415:175;;;-1:-1:-1;50451:5:0;49376:3407;;50415:175;50480:1;:6;;50485:1;50480:6;50476:114;;;-1:-1:-1;50512:5:0;49376:3407;;50476:114;50569:7;;;;:3;:7;:::i;:::-;50561:15;;:5;:15;:::i;50268:1241::-;50611:1;:6;;50616:1;50611:6;50607:902;;;50636:1;:6;;50641:1;50636:6;50632:358;;;-1:-1:-1;50668:5:0;49376:3407;;50632:358;50697:1;:6;;50702:1;50697:6;50693:297;;;-1:-1:-1;50729:5:0;49376:3407;;50693:297;50758:1;:6;;50763:1;50758:6;50754:236;;;-1:-1:-1;50790:5:0;49376:3407;;50754:236;50819:1;:6;;50824:1;50819:6;50815:175;;;-1:-1:-1;50851:5:0;49376:3407;;50815:175;50880:1;:6;;50885:1;50880:6;50876:114;;;-1:-1:-1;50912:5:0;49376:3407;;50876:114;50969:7;;;;:3;:7;:::i;:::-;50961:15;;:5;:15;:::i;50607:902::-;51011:1;:6;;51016:1;51011:6;51007:502;;;51036:1;:6;;51041:1;51036:6;51032:244;;;-1:-1:-1;51068:5:0;49376:3407;;51032:244;51101:1;51097;:5;;;:14;;;;;51110:1;51106;:5;;;51097:14;51093:183;;;51145:7;;;;:3;:7;:::i;:::-;51137:15;;:5;:15;:::i;51093:183::-;51176:1;:6;;51181:1;51176:6;51172:104;;;-1:-1:-1;51208:5:0;49376:3407;;51172:104;-1:-1:-1;51257:5:0;49376:3407;;51007:502;51297:1;:6;;51302:1;51297:6;51293:216;;;51322:1;:6;;51327:1;51322:6;51318:114;;51362:7;;;;:3;:7;:::i;:::-;51354:15;;:5;:15;:::i;51318:114::-;-1:-1:-1;51413:5:0;49376:3407;;51293:216;51453:1;:6;;51458:1;51453:6;51449:60;;;51490:7;;;;:3;:7;:::i;:::-;51483:14;;:4;:14;:::i;49705:3078::-;-1:-1:-1;;;;;;;;;51532:1:0;51528:6;;;;;:14;;51524:1259;;;51582:6;;;;:16;;;;-1:-1:-1;51592:6:0;;;;51582:16;51581:40;;;;51604:1;:6;;51609:1;51604:6;:16;;;;;51614:1;:6;;51619:1;51614:6;51604:16;51581:62;;;-1:-1:-1;51626:6:0;;;;:16;;;;;51636:1;:6;;51641:1;51636:6;51626:16;51581:84;;;;51648:1;:6;;51653:1;51648:6;:16;;;;-1:-1:-1;51658:6:0;;;;51648:16;51577:571;;;-1:-1:-1;51689:4:0;51524:1259;;51577:571;51716:1;:6;;51721:1;51716:6;:16;;;;;51726:1;:6;;51731:1;51726:6;51716:16;51715:40;;;;51738:1;:6;;51743:1;51738:6;:16;;;;;51748:1;:6;;51753:1;51748:6;51738:16;51715:62;;;;51760:1;:6;;51765:1;51760:6;:16;;;;;51770:1;:6;;51775:1;51770:6;51760:16;51715:84;;;;51782:1;:6;;51787:1;51782:6;:16;;;;;51792:1;:6;;51797:1;51792:6;51782:16;51711:437;;;-1:-1:-1;51823:4:0;49376:3407;;51711:437;51850:1;:6;;51855:1;51850:6;:16;;;;;51860:1;:6;;51865:1;51860:6;51850:16;51849:40;;;;51872:1;:6;;51877:1;51872:6;:16;;;;;51882:1;:6;;51887:1;51882:6;51872:16;51849:62;;;;51894:1;:6;;51899:1;51894:6;:16;;;;;51904:1;:6;;51909:1;51904:6;51894:16;51849:84;;;;51916:1;:6;;51921:1;51916:6;:16;;;;;51926:1;:6;;51931:1;51926:6;51916:16;51845:303;;;-1:-1:-1;51957:4:0;49376:3407;;51845:303;51984:1;:6;;51989:1;51984:6;:16;;;;;51994:1;:6;;51999:1;51994:6;51984:16;51983:40;;;;52006:1;:6;;52011:1;52006:6;:16;;;;;52016:1;:6;;52021:1;52016:6;52006:16;51983:62;;;;52028:1;:6;;52033:1;52028:6;:16;;;;;52038:1;:6;;52043:1;52038:6;52028:16;51983:84;;;;52050:1;:6;;52055:1;52050:6;:16;;;;;52060:1;:6;;52065:1;52060:6;52050:16;51979:169;;;-1:-1:-1;52091:4:0;49376:3407;;51524:1259;-1:-1:-1;;;;;;;;;52171:1:0;52167:6;;;;;:14;;52163:620;;;52223:19;52232:3;52237:1;52240;52223:8;:19::i;52163:620::-;52317:6;;;;:16;;;;-1:-1:-1;52327:6:0;;;;52317:16;52316:40;;;;52339:1;:6;;52344:1;52339:6;:16;;;;;52349:1;:6;;52354:1;52349:6;52339:16;52316:62;;;-1:-1:-1;52361:6:0;;;;:16;;;;;52371:1;:6;;52376:1;52371:6;52361:16;52316:84;;;;52383:1;:6;;52388:1;52383:6;:16;;;;-1:-1:-1;52393:6:0;;;;52383:16;52316:117;;;;52416:1;:6;;52421:1;52416:6;:16;;;;;52426:1;:6;;52431:1;52426:6;52416:16;52316:139;;;;52438:1;:6;;52443:1;52438:6;:16;;;;;52448:1;:6;;52453:1;52448:6;52438:16;52316:161;;;;52460:1;:6;;52465:1;52460:6;:16;;;;;52470:1;:6;;52475:1;52470:6;52460:16;52316:183;;;;52482:1;:6;;52487:1;52482:6;:16;;;;;52492:1;:6;;52497:1;52492:6;52482:16;52316:238;;;;52516:1;:6;;52521:1;52516:6;:16;;;;52526:1;:6;;52531:1;52526:6;52516:16;52515:38;;;;;52542:1;52538;:5;;;:14;;;;;52551:1;52547;:5;;;52538:14;52316:291;;;;52574:1;52570;:5;;;:14;;;;;52583:1;52579;:5;;;52570:14;52569:38;;;;;52590:1;:6;;52595:1;52590:6;:16;;;;52600:1;:6;;52605:1;52600:6;52590:16;52300:474;;;-1:-1:-1;52631:4:0;52300:474;;;52657:6;;;;;:16;;;52667:1;:6;;52672:1;52667:6;52657:16;:26;;;-1:-1:-1;52677:6:0;;;;52657:26;:36;;;;52687:1;:6;;52692:1;52687:6;52657:36;52653:121;;;-1:-1:-1;52717:1:0;52653:121;;;-1:-1:-1;52758:4:0;52653:121;52798:6;48718:4094;-1:-1:-1;;;;;48718:4094:0:o;63050:397::-;63161:9;:11;;63116:5;;;63161:11;;;:::i;:::-;;;;;;63432:7;63274:16;63307:15;63339:10;63366:9;;63392:7;63241:159;;;;;;;;;;;41107:19:1;;;41151:2;41142:12;;41135:28;;;;41201:2;41197:15;;;;-1:-1:-1;;41193:53:1;41188:2;41179:12;;41172:75;41272:2;41263:12;;41256:28;41309:3;41300:13;;41293:29;41347:3;41338:13;;40866:491;63241:159:0;;;;;;;;;;;;;63217:198;;;;;;63197:231;;63191:248;;;;:::i;:::-;63184:255;63050:397;-1:-1:-1;;;63050:397:0:o;35570:382::-;-1:-1:-1;;;;;35650:16:0;;35642:61;;;;-1:-1:-1;;;35642:61:0;;41564:2:1;35642:61:0;;;41546:21:1;;;41583:18;;;41576:30;41642:34;41622:18;;;41615:62;41694:18;;35642:61:0;41362:356:1;35642:61:0;33657:4;33681:16;;;:7;:16;;;;;;-1:-1:-1;;;;;33681:16:0;:30;35714:58;;;;-1:-1:-1;;;35714:58:0;;41925:2:1;35714:58:0;;;41907:21:1;41964:2;41944:18;;;41937:30;42003;41983:18;;;41976:58;42051:18;;35714:58:0;41723:352:1;35714:58:0;-1:-1:-1;;;;;35843:13:0;;;;;;:9;:13;;;;;:18;;35860:1;;35843:13;:18;;35860:1;;35843:18;:::i;:::-;;;;-1:-1:-1;;35872:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;35872:21:0;-1:-1:-1;;;;;35872:21:0;;;;;;;;35911:33;;35872:16;;;35911:33;;35872:16;;35911:33;35570:382;;:::o;53411:228::-;53502:6;53528:103;53544:47;53553:4;53570:1;53559:8;:12;:31;;53578:12;:8;53589:1;53578:12;:::i;:::-;53544:8;:47::i;53559:31::-;53574:1;53544:8;:47::i;:::-;53622:6;53627:1;53622;:6;:::i;:::-;53606;53611:1;53606;:6;:::i;:::-;53600:29;;;;:::i;:::-;53593:37;;53528:15;:103::i;52911:307::-;52983:4;;53081:1;53060:11;:7;;;53081:1;53060:11;:::i;:::-;:16;;53074:2;53060:16;:::i;:::-;53048:7;;;;;53038;;53027:3;53038:7;53027:6;;;;;;;:::i;:::-;53016:29;;;53027:6;;53016:29;:::i;:::-;:39;;;;:::i;:::-;53011:66;;;;:::i;:::-;53010:72;;;;:::i;:::-;52998:84;-1:-1:-1;53095:9:0;53091:44;;53124:1;53117:8;;;;;53091:44;53147:4;53155:1;53147:9;53143:47;;;53176:4;53169:11;;;;;53143:47;-1:-1:-1;53205:5:0;;52911:307;-1:-1:-1;;;;52911:307:0:o;53674:118::-;53744:6;53770:4;53775:8;53770:14;;;;;;;:::i;:::-;;;;;53674:118;-1:-1:-1;;;53674:118:0:o;63614:215::-;63682:6;63699:106;-1:-1:-1;;;;;;63706:6:0;;;63699:106;;63764:5;;;;63742:2;63741:8;;;63794:1;63784:11;-1:-1:-1;;;63784:11:0;;63699:106;;;-1:-1:-1;63820:1:0;;63614:215;-1:-1:-1;63614:215:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:269::-;908:3;946:5;940:12;973:6;968:3;961:19;989:63;1045:6;1038:4;1033:3;1029:14;1022:4;1015:5;1011:16;989:63;:::i;:::-;1106:2;1085:15;-1:-1:-1;;1081:29:1;1072:39;;;;1113:4;1068:50;;855:269;-1:-1:-1;;855:269:1:o;1129:231::-;1278:2;1267:9;1260:21;1241:4;1298:56;1350:2;1339:9;1335:18;1327:6;1298:56;:::i;1365:180::-;1424:6;1477:2;1465:9;1456:7;1452:23;1448:32;1445:52;;;1493:1;1490;1483:12;1445:52;-1:-1:-1;1516:23:1;;1365:180;-1:-1:-1;1365:180:1:o;1758:173::-;1826:20;;-1:-1:-1;;;;;1875:31:1;;1865:42;;1855:70;;1921:1;1918;1911:12;1855:70;1758:173;;;:::o;1936:254::-;2004:6;2012;2065:2;2053:9;2044:7;2040:23;2036:32;2033:52;;;2081:1;2078;2071:12;2033:52;2104:29;2123:9;2104:29;:::i;:::-;2094:39;2180:2;2165:18;;;;2152:32;;-1:-1:-1;;;1936:254:1:o;2195:160::-;2260:20;;2316:13;;2309:21;2299:32;;2289:60;;2345:1;2342;2335:12;2360:180;2416:6;2469:2;2457:9;2448:7;2444:23;2440:32;2437:52;;;2485:1;2482;2475:12;2437:52;2508:26;2524:9;2508:26;:::i;2727:328::-;2804:6;2812;2820;2873:2;2861:9;2852:7;2848:23;2844:32;2841:52;;;2889:1;2886;2879:12;2841:52;2912:29;2931:9;2912:29;:::i;:::-;2902:39;;2960:38;2994:2;2983:9;2979:18;2960:38;:::i;:::-;2950:48;;3045:2;3034:9;3030:18;3017:32;3007:42;;2727:328;;;;;:::o;3060:186::-;3119:6;3172:2;3160:9;3151:7;3147:23;3143:32;3140:52;;;3188:1;3185;3178:12;3140:52;3211:29;3230:9;3211:29;:::i;3251:127::-;3312:10;3307:3;3303:20;3300:1;3293:31;3343:4;3340:1;3333:15;3367:4;3364:1;3357:15;3383:275;3454:2;3448:9;3519:2;3500:13;;-1:-1:-1;;3496:27:1;3484:40;;3554:18;3539:34;;3575:22;;;3536:62;3533:88;;;3601:18;;:::i;:::-;3637:2;3630:22;3383:275;;-1:-1:-1;3383:275:1:o;3663:952::-;3747:6;3778:2;3821;3809:9;3800:7;3796:23;3792:32;3789:52;;;3837:1;3834;3827:12;3789:52;3877:9;3864:23;3906:18;3947:2;3939:6;3936:14;3933:34;;;3963:1;3960;3953:12;3933:34;4001:6;3990:9;3986:22;3976:32;;4046:7;4039:4;4035:2;4031:13;4027:27;4017:55;;4068:1;4065;4058:12;4017:55;4104:2;4091:16;4126:2;4122;4119:10;4116:36;;;4132:18;;:::i;:::-;4178:2;4175:1;4171:10;4161:20;;4201:28;4225:2;4221;4217:11;4201:28;:::i;:::-;4263:15;;;4333:11;;;4329:20;;;4294:12;;;;4361:19;;;4358:39;;;4393:1;4390;4383:12;4358:39;4417:11;;;;4437:148;4453:6;4448:3;4445:15;4437:148;;;4519:23;4538:3;4519:23;:::i;:::-;4507:36;;4470:12;;;;4563;;;;4437:148;;;4604:5;3663:952;-1:-1:-1;;;;;;;;3663:952:1:o;4620:254::-;4685:6;4693;4746:2;4734:9;4725:7;4721:23;4717:32;4714:52;;;4762:1;4759;4752:12;4714:52;4785:29;4804:9;4785:29;:::i;:::-;4775:39;;4833:35;4864:2;4853:9;4849:18;4833:35;:::i;:::-;4823:45;;4620:254;;;;;:::o;4879:980::-;4974:6;4982;4990;4998;5051:3;5039:9;5030:7;5026:23;5022:33;5019:53;;;5068:1;5065;5058:12;5019:53;5091:29;5110:9;5091:29;:::i;:::-;5081:39;;5139:2;5160:38;5194:2;5183:9;5179:18;5160:38;:::i;:::-;5150:48;;5245:2;5234:9;5230:18;5217:32;5207:42;;5300:2;5289:9;5285:18;5272:32;5323:18;5364:2;5356:6;5353:14;5350:34;;;5380:1;5377;5370:12;5350:34;5418:6;5407:9;5403:22;5393:32;;5463:7;5456:4;5452:2;5448:13;5444:27;5434:55;;5485:1;5482;5475:12;5434:55;5521:2;5508:16;5543:2;5539;5536:10;5533:36;;;5549:18;;:::i;:::-;5591:53;5634:2;5615:13;;-1:-1:-1;;5611:27:1;5607:36;;5591:53;:::i;:::-;5578:66;;5667:2;5660:5;5653:17;5707:7;5702:2;5697;5693;5689:11;5685:20;5682:33;5679:53;;;5728:1;5725;5718:12;5679:53;5783:2;5778;5774;5770:11;5765:2;5758:5;5754:14;5741:45;5827:1;5822:2;5817;5810:5;5806:14;5802:23;5795:34;;5848:5;5838:15;;;;;4879:980;;;;;;;:::o;5864:260::-;5932:6;5940;5993:2;5981:9;5972:7;5968:23;5964:32;5961:52;;;6009:1;6006;5999:12;5961:52;6032:29;6051:9;6032:29;:::i;:::-;6022:39;;6080:38;6114:2;6103:9;6099:18;6080:38;:::i;6129:380::-;6208:1;6204:12;;;;6251;;;6272:61;;6326:4;6318:6;6314:17;6304:27;;6272:61;6379:2;6371:6;6368:14;6348:18;6345:38;6342:161;;;6425:10;6420:3;6416:20;6413:1;6406:31;6460:4;6457:1;6450:15;6488:4;6485:1;6478:15;6342:161;;6129:380;;;:::o;7754:355::-;7956:2;7938:21;;;7995:2;7975:18;;;7968:30;8034:33;8029:2;8014:18;;8007:61;8100:2;8085:18;;7754:355::o;8114:356::-;8316:2;8298:21;;;8335:18;;;8328:30;8394:34;8389:2;8374:18;;8367:62;8461:2;8446:18;;8114:356::o;9592:413::-;9794:2;9776:21;;;9833:2;9813:18;;;9806:30;9872:34;9867:2;9852:18;;9845:62;-1:-1:-1;;;9938:2:1;9923:18;;9916:47;9995:3;9980:19;;9592:413::o;10010:127::-;10071:10;10066:3;10062:20;10059:1;10052:31;10102:4;10099:1;10092:15;10126:4;10123:1;10116:15;10142:128;10182:3;10213:1;10209:6;10206:1;10203:13;10200:39;;;10219:18;;:::i;:::-;-1:-1:-1;10255:9:1;;10142:128::o;10697:135::-;10736:3;-1:-1:-1;;10757:17:1;;10754:43;;;10777:18;;:::i;:::-;-1:-1:-1;10824:1:1;10813:13;;10697:135::o;12004:127::-;12065:10;12060:3;12056:20;12053:1;12046:31;12096:4;12093:1;12086:15;12120:4;12117:1;12110:15;12906:185;12948:3;12986:5;12980:12;13001:52;13046:6;13041:3;13034:4;13027:5;13023:16;13001:52;:::i;:::-;13069:16;;;;;12906:185;-1:-1:-1;;12906:185:1:o;13452:2123::-;-1:-1:-1;;;14346:45:1;;14414:13;;14328:3;;14436:62;14414:13;14486:2;14477:12;;14470:4;14458:17;;14436:62;:::i;:::-;14558:13;;14517:16;;;;14580:63;14558:13;14629:2;14621:11;;14614:4;14602:17;;14580:63;:::i;:::-;14704:13;;14662:17;;;14726:63;14704:13;14775:2;14767:11;;14760:4;14748:17;;14726:63;:::i;:::-;14854:66;14849:2;14808:17;;;;14841:11;;;14834:87;-1:-1:-1;;;14945:2:1;14937:11;;14930:71;15026:13;;15048:63;15026:13;15097:2;15089:11;;15082:4;15070:17;;15048:63;:::i;:::-;15176:66;15171:2;15130:17;;;;15163:11;;;15156:87;-1:-1:-1;;;15267:2:1;15259:11;;15252:74;15351:13;;15373:64;15351:13;15422:3;15414:12;;15407:4;15395:17;;15373:64;:::i;:::-;15453:116;15483:85;15509:58;15562:3;15551:8;15547:2;15543:17;15539:27;13173:66;13161:79;;-1:-1:-1;;;13265:2:1;13256:12;;13249:34;13308:2;13299:12;;13096:221;15509:58;15501:6;15483:85;:::i;:::-;-1:-1:-1;;;13387:27:1;;13439:1;13430:11;;13322:125;15453:116;15446:123;13452:2123;-1:-1:-1;;;;;;;;;;13452:2123:1:o;15580:448::-;15842:31;15837:3;15830:44;15812:3;15903:6;15897:13;15919:62;15974:6;15969:2;15964:3;15960:12;15953:4;15945:6;15941:17;15919:62;:::i;:::-;16001:16;;;;16019:2;15997:25;;15580:448;-1:-1:-1;;15580:448:1:o;17668:125::-;17708:4;17736:1;17733;17730:8;17727:34;;;17741:18;;:::i;:::-;-1:-1:-1;17778:9:1;;17668:125::o;17798:414::-;18000:2;17982:21;;;18039:2;18019:18;;;18012:30;18078:34;18073:2;18058:18;;18051:62;-1:-1:-1;;;18144:2:1;18129:18;;18122:48;18202:3;18187:19;;17798:414::o;18217:127::-;18278:10;18273:3;18269:20;18266:1;18259:31;18309:4;18306:1;18299:15;18333:4;18330:1;18323:15;18349:120;18389:1;18415;18405:35;;18420:18;;:::i;:::-;-1:-1:-1;18454:9:1;;18349:120::o;18474:112::-;18506:1;18532;18522:35;;18537:18;;:::i;:::-;-1:-1:-1;18571:9:1;;18474:112::o;19067:2115::-;-1:-1:-1;;;20062:61:1;;20146:13;;20044:3;;20168:62;20146:13;20218:2;20209:12;;20202:4;20190:17;;20168:62;:::i;:::-;20294:66;20289:2;20249:16;;;20281:11;;;20274:87;-1:-1:-1;;;20428:2:1;20420:11;;20413:23;;;20461:13;;20483:63;20461:13;20532:2;20524:11;;20517:4;20505:17;;20483:63;:::i;:::-;20611:66;20606:2;20565:17;;;;20598:11;;;20591:87;-1:-1:-1;;;20702:2:1;20694:11;;20687:43;20755:13;;20777:63;20755:13;20826:2;20818:11;;20811:4;20799:17;;20777:63;:::i;:::-;20905:66;20900:2;20859:17;;;;20892:11;;;20885:87;20996:3;20988:12;;20981:24;21021:155;21047:128;21077:97;21103:70;21133:39;21167:3;21159:12;;21151:6;21133:39;:::i;:::-;18668:66;18656:79;;-1:-1:-1;;;18760:2:1;18751:12;;18744:50;18819:2;18810:12;;18591:237;21103:70;21095:6;21077:97;:::i;:::-;18910:66;18898:79;;-1:-1:-1;;;19002:2:1;18993:12;;18986:42;19053:2;19044:12;;18833:229;21047:128;21039:6;21021:155;:::i;:::-;21014:162;19067:2115;-1:-1:-1;;;;;;;;;19067:2115:1:o;21609:2127::-;22669:66;22664:3;22657:79;22766:66;22761:2;22756:3;22752:12;22745:88;22863:66;22858:2;22853:3;22849:12;22842:88;22969:26;22964:3;22960:36;22955:2;22950:3;22946:12;22939:58;22639:3;23026:6;23020:13;23042:61;23096:6;23090:3;23085;23081:13;23076:2;23068:6;23064:15;23042:61;:::i;:::-;-1:-1:-1;;;23162:3:1;23122:16;;;23154:12;;;23147:39;23211:13;;23233:62;23211:13;23280:3;23272:12;;23267:2;23255:15;;23233:62;:::i;:::-;-1:-1:-1;;;23355:3:1;23314:17;;;;23347:12;;;23340:30;23395:13;;23417:62;23395:13;23464:3;23456:12;;23451:2;23439:15;;23417:62;:::i;:::-;-1:-1:-1;;;23498:17:1;;23539:3;23531:12;;23524:31;;;;-1:-1:-1;;;23721:3:1;23713:12;;21252:59;23571:159;23601:128;23627:101;23657:70;21327:12;;;23683:43;23675:6;23657:70;:::i;:::-;-1:-1:-1;;;21415:27:1;;21467:1;21458:11;;21350:125;23627:101;23619:6;23601:128;:::i;:::-;-1:-1:-1;;;21545:25:1;;21595:2;21586:12;;21480:124;23741:168;23781:7;23847:1;23843;23839:6;23835:14;23832:1;23829:21;23824:1;23817:9;23810:17;23806:45;23803:71;;;23854:18;;:::i;:::-;-1:-1:-1;23894:9:1;;23741:168::o;24779:376::-;24897:12;;24945:4;24934:16;;24928:23;-1:-1:-1;;;;;;25020:11:1;;;;24897:12;24928:23;25054:2;25043:14;;25040:109;;;25136:2;25130;25120:6;25116:2;25112:15;25109:1;25105:23;25101:32;25097:2;25093:41;25089:50;25080:59;;25040:109;;;;24779:376;;;:::o;25160:500::-;-1:-1:-1;;;;;25429:15:1;;;25411:34;;25481:15;;25476:2;25461:18;;25454:43;25528:2;25513:18;;25506:34;;;25576:3;25571:2;25556:18;;25549:31;;;25354:4;;25597:57;;25634:19;;25626:6;25597:57;:::i;:::-;25589:65;25160:500;-1:-1:-1;;;;;;25160:500:1:o;25665:249::-;25734:6;25787:2;25775:9;25766:7;25762:23;25758:32;25755:52;;;25803:1;25800;25793:12;25755:52;25835:9;25829:16;25854:30;25878:5;25854:30;:::i;26586:2198::-;-1:-1:-1;;;27790:3:1;27783:34;27765:3;27846:6;27840:13;27862:62;27917:6;27912:2;27907:3;27903:12;27896:4;27888:6;27884:17;27862:62;:::i;:::-;-1:-1:-1;;;27983:2:1;27943:16;;;27975:11;;;27968:33;28026:13;;28048:63;28026:13;28097:2;28089:11;;28082:4;28070:17;;28048:63;:::i;:::-;28176:34;28171:2;28130:17;;;;28163:11;;;28156:55;-1:-1:-1;;;28235:2:1;28227:11;;28220:40;28285:13;;28307:63;28285:13;28356:2;28348:11;;28341:4;28329:17;;28307:63;:::i;:::-;-1:-1:-1;;;28430:2:1;28389:17;;;;28422:11;;;28415:38;28478:13;;28500:63;28478:13;28549:2;28541:11;;28534:4;28522:17;;28500:63;:::i;:::-;28579:199;28609:168;28639:137;28665:110;28690:84;28716:57;28769:2;28758:8;28754:2;28750:17;28746:26;25996;25984:39;;26048:2;26039:12;;25919:138;28716:57;28708:6;28690:84;:::i;:::-;26134:34;26122:47;;-1:-1:-1;;;26194:2:1;26185:12;;26178:42;26245:2;26236:12;;26062:192;28639:137;26336:34;26324:47;;-1:-1:-1;;;26396:2:1;26387:12;;26380:41;26446:2;26437:12;;26259:196;28609:168;-1:-1:-1;;;26525:23:1;;26573:1;26564:11;;26460:121;28789:333;28826:4;28856:16;;;28892;;;28927:11;;;28954:10;;-1:-1:-1;;28975:18:1;;28966:28;;28950:45;28947:71;;;28998:18;;:::i;:::-;29057:3;29051:4;29047:14;29042:3;29038:24;29034:2;29030:33;29027:59;;;29066:18;;:::i;:::-;-1:-1:-1;29103:13:1;;;28789:333;-1:-1:-1;;;28789:333:1:o;29127:640::-;29164:7;29196:1;29232;29228:2;29217:17;29269:1;29265:2;29254:17;29299:2;29294:3;29290:12;29330:2;29325:3;29321:12;29380:3;29374:4;29370:14;29365:3;29362:23;29357:2;29353;29349:11;29345:41;29342:67;;;29389:18;;:::i;:::-;-1:-1:-1;;29455:12:1;;;29483:11;;;29505:13;;;29496:23;;29479:41;29476:67;;;29523:18;;:::i;:::-;29562:12;;;;29590:11;;;29612:13;;;29603:23;;29586:41;29583:67;;;29630:18;;:::i;:::-;29699:3;29693:4;29688:15;29683:3;29679:25;29674:2;29670;29666:11;29662:43;29659:69;;;29708:18;;:::i;:::-;-1:-1:-1;;;29748:13:1;;;29127:640;-1:-1:-1;;;;;29127:640:1:o;29772:331::-;29809:3;29852:1;29849;29838:16;29888:1;29885;29874:16;29918:1;29913:3;29909:11;29967:3;29961:4;29957:14;29952:3;29948:24;29943:2;29936:10;29932:41;29929:67;;;29976:18;;:::i;:::-;30039:3;30033;30029:8;30025:18;30020:3;30016:28;30012:2;30008:37;30005:63;;;30048:18;;:::i;:::-;-1:-1:-1;30084:13:1;;29772:331;-1:-1:-1;;;29772:331:1:o;30108:136::-;30143:3;-1:-1:-1;;;30164:22:1;;30161:48;;;30189:18;;:::i;:::-;-1:-1:-1;30229:1:1;30225:13;;30108:136::o;30249:553::-;30288:7;-1:-1:-1;;;;;30358:9:1;;;30386;;;30411:11;;;30430:10;;;30424:17;;30407:35;30404:61;;;30445:18;;:::i;:::-;-1:-1:-1;;;30521:1:1;30514:9;;30539:11;;;30559;;;30552:19;;30535:37;30532:63;;;30575:18;;:::i;:::-;30621:1;30618;30614:9;30604:19;;30668:1;30664:2;30659:11;30656:1;30652:19;30647:2;30643;30639:11;30635:37;30632:63;;;30675:18;;:::i;:::-;30740:1;30736:2;30731:11;30728:1;30724:19;30719:2;30715;30711:11;30707:37;30704:63;;;30747:18;;:::i;:::-;-1:-1:-1;;;30787:9:1;;;;;30249:553;-1:-1:-1;;;30249:553:1:o;30807:193::-;30846:1;30872;30862:35;;30877:18;;:::i;:::-;-1:-1:-1;;;30913:18:1;;-1:-1:-1;;30933:13:1;;30909:38;30906:64;;;30950:18;;:::i;:::-;-1:-1:-1;30984:10:1;;30807:193::o;31005:418::-;-1:-1:-1;;;31262:3:1;31255:16;31237:3;31300:6;31294:13;31316:61;31370:6;31366:1;31361:3;31357:11;31350:4;31342:6;31338:17;31316:61;:::i;:::-;31397:16;;;;31415:1;31393:24;;31005:418;-1:-1:-1;;31005:418:1:o;31428:470::-;31607:3;31645:6;31639:13;31661:53;31707:6;31702:3;31695:4;31687:6;31683:17;31661:53;:::i;:::-;31777:13;;31736:16;;;;31799:57;31777:13;31736:16;31833:4;31821:17;;31799:57;:::i;:::-;31872:20;;31428:470;-1:-1:-1;;;;31428:470:1:o;31903:175::-;31940:3;31984:4;31977:5;31973:16;32013:4;32004:7;32001:17;31998:43;;;32021:18;;:::i;:::-;32070:1;32057:15;;31903:175;-1:-1:-1;;31903:175:1:o;32734:363::-;32851:12;;32899:4;32888:16;;32882:23;-1:-1:-1;;;;;;32964:11:1;;;;32851:12;32882:23;32998:1;32987:13;;32984:107;;;33059:1;33055:14;;;;33052:1;33048:22;33044:31;;;33036:40;33032:49;;32734:363;-1:-1:-1;;32734:363:1:o;33102:960::-;33531:3;33569:6;33563:13;33585:53;33631:6;33626:3;33619:4;33611:6;33607:17;33585:53;:::i;:::-;33669:6;33664:3;33660:16;33647:29;;-1:-1:-1;;;33721:2:1;33714:5;33707:17;33755:6;33749:13;33771:65;33827:8;33823:1;33816:5;33812:13;33805:4;33797:6;33793:17;33771:65;:::i;:::-;33899:1;33855:20;;33891:10;;;33884:22;33931:13;;33953:62;33931:13;34002:1;33994:10;;33987:4;33975:17;;33953:62;:::i;:::-;34035:17;34054:1;34031:25;;33102:960;-1:-1:-1;;;;;33102:960:1:o;34451:2464::-;35857:26;35852:3;35845:39;35827:3;35913:6;35907:13;35929:62;35984:6;35979:2;35974:3;35970:12;35963:4;35955:6;35951:17;35929:62;:::i;:::-;36019:6;36014:3;36010:16;36000:26;;-1:-1:-1;;;36087:2:1;36082;36078;36074:11;36067:23;36121:6;36115:13;36137:63;36191:8;36186:2;36182;36178:11;36171:4;36163:6;36159:17;36137:63;:::i;:::-;-1:-1:-1;;;36260:2:1;36219:17;;;;36252:11;;;36245:36;36306:13;;36328:63;36306:13;36377:2;36369:11;;36362:4;36350:17;;36328:63;:::i;:::-;36451:2;36410:17;;36443:11;;;36436:23;36484:13;;36506:63;36484:13;36555:2;36547:11;;36540:4;36528:17;;36506:63;:::i;:::-;-1:-1:-1;;;36629:2:1;36588:17;;;;36621:11;;;36614:36;36666:243;36696:212;36722:185;36752:154;36778:127;36808:96;36834:69;36752:154;36898:2;36890:11;;36882:6;36864:38;:::i;:::-;-1:-1:-1;;;34132:26:1;;34183:2;34174:12;;34067:125;36834:69;36826:6;36808:96;:::i;:::-;-1:-1:-1;;;34262:29:1;;34316:2;34307:12;;34197:128;36696:212;-1:-1:-1;;;34395:18:1;;34438:1;34429:11;;34330:116;36666:243;36659:250;34451:2464;-1:-1:-1;;;;;;;;;;;34451:2464:1:o;37211:238::-;37249:7;37289:4;37286:1;37282:12;37321:4;37318:1;37314:12;37381:3;37375:4;37371:14;37366:3;37363:23;37356:3;37349:11;37342:19;37338:49;37335:75;;;37390:18;;:::i;:::-;37430:13;;37211:238;-1:-1:-1;;;37211:238:1:o;37779:2206::-;38887:66;38882:3;38875:79;38857:3;38983:6;38977:13;38999:62;39054:6;39049:2;39044:3;39040:12;39033:4;39025:6;39021:17;38999:62;:::i;:::-;-1:-1:-1;;;39120:2:1;39080:16;;;39112:11;;;39105:43;39173:13;;39195:63;39173:13;39244:2;39236:11;;39229:4;39217:17;;39195:63;:::i;:::-;-1:-1:-1;;;39318:2:1;39277:17;;;;39310:11;;;39303:57;39385:13;;39407:63;39385:13;39456:2;39448:11;;39441:4;39429:17;;39407:63;:::i;:::-;39497:8;39493:2;39489:17;39479:27;;;-1:-1:-1;;;39557:2:1;39552;39548;39544:11;39537:23;39591:6;39585:13;39607:63;39661:8;39656:2;39652;39648:11;39641:4;39633:6;39629:17;39607:63;:::i;:::-;39730:2;39689:17;;39722:11;;;39715:23;39763:13;;39785:63;39763:13;39834:2;39826:11;;39819:4;39807:17;;39785:63;:::i;:::-;39864:115;39894:84;39920:57;39973:2;39962:8;39958:2;39954:17;39950:26;37531:66;37519:79;;37623:2;37614:12;;37454:178;39894:84;-1:-1:-1;;;37702:39:1;;37766:1;37757:11;;37637:137;39990:157;40020:1;40054:4;40051:1;40047:12;40078:3;40068:37;;40085:18;;:::i;:::-;40137:3;40130:4;40127:1;40123:12;40119:22;40114:27;;;39990:157;;;;:::o;40152:258::-;40191:7;40223:6;40256:2;40253:1;40249:10;40286:2;40283:1;40279:10;40342:3;40338:2;40334:12;40329:3;40326:21;40319:3;40312:11;40305:19;40301:47;40298:73;;;40351:18;;:::i;:::-;40391:13;;40152:258;-1:-1:-1;;;;40152:258:1:o;40415:224::-;40454:3;40482:6;40515:2;40512:1;40508:10;40545:2;40542:1;40538:10;40576:3;40572:2;40568:12;40563:3;40560:21;40557:47;;;40584:18;;:::i;40644:217::-;40683:4;40712:6;40768:10;;;;40738;;40790:12;;;40787:38;;;40805:18;;:::i;:::-;40842:13;;40644:217;-1:-1:-1;;;40644:217:1:o;42080:420::-;42169:1;42212:5;42169:1;42226:268;42247:7;42237:8;42234:21;42226:268;;;42304:4;42298;42294:15;42288:4;42285:25;42282:51;;;42313:18;;:::i;:::-;42363:7;42353:8;42349:22;42346:55;;;42383:16;;;;42346:55;42462:22;;;;42422:15;;;;42226:268;;;42230:3;42080:420;;;;;:::o;42505:913::-;42554:5;42584:8;42574:80;;-1:-1:-1;42625:1:1;42639:5;;42574:80;42673:4;42663:76;;-1:-1:-1;42710:1:1;42724:5;;42663:76;42755:4;42773:1;42768:59;;;;42841:1;42836:185;;;;42748:273;;42768:59;42798:1;42789:10;;42812:5;;;42836:185;42873:4;42863:8;42860:18;42857:44;;;42881:18;;:::i;:::-;42937:1;42927:8;42923:16;42914:25;;42965:4;42958:5;42955:15;42952:41;;;42973:18;;:::i;:::-;43006:5;;;42748:273;;43105:2;43095:8;43092:16;43086:3;43080:4;43077:13;43073:36;43067:2;43057:8;43054:16;43049:2;43043:4;43040:12;43036:35;43033:77;43030:213;;;-1:-1:-1;43142:19:1;;;43187:4;43177:15;;43174:41;;;43195:18;;:::i;:::-;43228:5;;43030:213;43275:34;43300:8;43294:4;43275:34;:::i;:::-;43343:6;43337:4;43333:17;43324:7;43321:30;43318:56;;;43354:18;;:::i;43423:149::-;43479:5;43508:58;43560:4;43550:8;43546:19;43539:4;43533;43529:15;43508:58;:::i;43577:204::-;43615:3;43651:4;43648:1;43644:12;43683:4;43680:1;43676:12;43718:3;43712:4;43708:14;43703:3;43700:23;43697:49;;;43726:18;;:::i;:::-;43762:13;;43577:204;-1:-1:-1;;;43577:204:1:o

Swarm Source

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