ETH Price: $2,441.02 (-0.68%)
 

Overview

Max Total Supply

0 OSOC

Holders

623

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 OSOC
0xe631006bb6c774fde23cb213e5abcdd2efd51541
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
OrdinalSignOnChain

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-02-09
*/

// File: contracts/Base64.sol


pragma solidity ^0.8.2;

/// @title Base64
/// @author Brecht Devos - <[email protected]>
/// @notice Provides a function for encoding some bytes in base64
library Base64 {
    string internal constant TABLE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';

    function encode(bytes memory data) internal pure returns (string memory) {
        if (data.length == 0) return '';
        
        // load the table into memory
        string memory table = TABLE;

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

        // add some extra buffer at the end required for the writing
        string memory result = new string(encodedLen + 32);

        assembly {
            // set the actual output length
            mstore(result, encodedLen)
            
            // prepare the lookup table
            let tablePtr := add(table, 1)
            
            // input ptr
            let dataPtr := data
            let endPtr := add(dataPtr, mload(data))
            
            // result ptr, jump over length
            let resultPtr := add(result, 32)
            
            // run over the input, 3 bytes at a time
            for {} lt(dataPtr, endPtr) {}
            {
               dataPtr := add(dataPtr, 3)
               
               // read 3 bytes
               let input := mload(dataPtr)
               
               // write 4 characters
               mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr(18, input), 0x3F)))))
               resultPtr := add(resultPtr, 1)
               mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr(12, input), 0x3F)))))
               resultPtr := add(resultPtr, 1)
               mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr( 6, input), 0x3F)))))
               resultPtr := add(resultPtr, 1)
               mstore(resultPtr, shl(248, mload(add(tablePtr, and(        input,  0x3F)))))
               resultPtr := add(resultPtr, 1)
            }
            
            // padding with '='
            switch mod(mload(data), 3)
            case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) }
            case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) }
        }
        
        return result;
    }
}

// File: contracts/Bytes.sol


/*
 * @title Solidity Bytes Arrays Utils
 * @author Gonçalo Sá <[email protected]>
 *
 * @dev Bytes tightly packed arrays utility library for ethereum contracts written in Solidity.
 *      The library lets you concatenate, slice and type cast bytes arrays both in memory and storage.
 */
pragma solidity ^0.8.2;


library BytesLib {
    
    function concat(
        bytes memory _preBytes,
        bytes memory _postBytes
    )
        internal
        pure
        returns (bytes memory)
    {
        bytes memory tempBytes;

        assembly {
            // Get a location of some free memory and store it in tempBytes as
            // Solidity does for memory variables.
            tempBytes := mload(0x40)

            // Store the length of the first bytes array at the beginning of
            // the memory for tempBytes.
            let length := mload(_preBytes)
            mstore(tempBytes, length)

            // Maintain a memory counter for the current write location in the
            // temp bytes array by adding the 32 bytes for the array length to
            // the starting location.
            let mc := add(tempBytes, 0x20)
            // Stop copying when the memory counter reaches the length of the
            // first bytes array.
            let end := add(mc, length)

            for {
                // Initialize a copy counter to the start of the _preBytes data,
                // 32 bytes into its memory.
                let cc := add(_preBytes, 0x20)
            } lt(mc, end) {
                // Increase both counters by 32 bytes each iteration.
                mc := add(mc, 0x20)
                cc := add(cc, 0x20)
            } {
                // Write the _preBytes data into the tempBytes memory 32 bytes
                // at a time.
                mstore(mc, mload(cc))
            }

            // Add the length of _postBytes to the current length of tempBytes
            // and store it as the new length in the first 32 bytes of the
            // tempBytes memory.
            length := mload(_postBytes)
            mstore(tempBytes, add(length, mload(tempBytes)))

            // Move the memory counter back from a multiple of 0x20 to the
            // actual end of the _preBytes data.
            mc := end
            // Stop copying when the memory counter reaches the new combined
            // length of the arrays.
            end := add(mc, length)

            for {
                let cc := add(_postBytes, 0x20)
            } lt(mc, end) {
                mc := add(mc, 0x20)
                cc := add(cc, 0x20)
            } {
                mstore(mc, mload(cc))
            }

            // Update the free-memory pointer by padding our last write location
            // to 32 bytes: add 31 bytes to the end of tempBytes to move to the
            // next 32 byte block, then round down to the nearest multiple of
            // 32. If the sum of the length of the two arrays is zero then add
            // one before rounding down to leave a blank 32 bytes (the length block with 0).
            mstore(0x40, and(
              add(add(end, iszero(add(length, mload(_preBytes)))), 31),
              not(31) // Round down to the nearest 32 bytes.
            ))
        }

        return tempBytes;
    }

}
// File: @openzeppelin/[email protected]/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/[email protected]/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/[email protected]/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/[email protected]/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/[email protected]/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/[email protected]/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/[email protected]/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/[email protected]/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/[email protected]/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/[email protected]/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/ordinalSignOnChain.sol


pragma solidity ^0.8.2;





contract OrdinalSignOnChain is ERC721, Ownable {
    
    /* Members */
    using Strings   for uint256;
    using BytesLib  for bytes;
    
    struct Particle { uint x; uint y; uint r; }
    struct Owner    { address _address; uint _tokenId; uint _paletteIndex;}

    mapping(uint => Owner)  _owners;

    uint        private _signPrice      = .01 ether;
    uint        private _saleIsOpen     = 1;
    uint        private _counter        = 0;
    uint[27]    private _consumed       = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];

    /* Members */

    /* Constructors */
    constructor() ERC721("OrdinalSignOnChain", "OSOC") {}
    /* Constructors */
    
    /* Private methods */
    function getIterations(bytes memory _data) private pure returns (uint) {
        
        uint[9] memory _iterations = [uint(35),uint(40),uint(45),uint(50),uint(55),uint(60),uint(65),uint(70),uint(75)];

        uint _its = _iterations[((uint(uint8(_data[0])) + uint(uint8(_data[_data.length-1]))) / 2) % _iterations.length];
        
        return _its;
        
    }
    
    function getPalette(uint _pIdx) public pure returns (string[8] memory) {
        string[8][27] memory _palette        = [
    		["Pantone's Glowing Gone*",         "#FFFFFF","#000000","#0f28f0","#dc609f","#fefe55","#841bf0","#841bf0"],
    		["Autumn",          				"#f5efdd","#411d13","#753422","#B05B3B","#D79771","#d6c28c","#d6ad9b"],
            ["Winter",          				"#ffffff","#08022a","#0F044C","#141E61","#787A91","#bfd4ee","#dadada"],
            ["Summer",          				"#edf3ff","#214e4b","#236e96","#15b2d3","#ffd700","#f3872f","#ff598f"],
            ["Spring",          				"#f6fff4","#14403b","#134a1b","#96bb7c","#bcef96","#eece4d","#d58be5"],
            ["Happy",           				"#fff5fc","#2e2269","#845EC2","#ec873a","#ebe300","#FF5E78","#32b9ff"],
            ["CyberPunk v1",   	 				"#270446","#a26df9","#0e2ea8","#e716dd","#f9143a","#0cffe1","#f7ff13"],
            ["Neon",            				"#000000","#c8ff07","#b31fc6","#f21170","#04daf6","#ff5200","#fcff00"],
            ["Blossom",        					"#fff6fc","#736a64","#f1d1d6","#ffabe1","#a685e2","#6155a6","#40274f"],
            ["Oriental",        				"#f5efdd","#000000","#9f0c28","#1A90D9","#f0a612","#f08808","#F23E16"],
            ["ViceCity",        				"#1c1241","#ffffff","#ecc720","#74aae8","#8f6cbf","#c05b85","#ca1481"],
            ["Volcano",         				"#f9f7ef","#000000","#38001C","#b92200","#f57e00","#fac30c","#86806b"],
            ["God of War",      				"#f9f7ef","#730215","#443737","#400909","#FF0000","#000000","#960c33"],
            ["Rainbow",         				"#FFFFFF","#8d5a00","#970ff2","#0597f2","#49d907","#f2e404","#c60835"],
            ["Halloween",       				"#f9f7ef","#000000","#000000","#150050","#3F0071","#610094","#ef8c29"],
            ["Red",             				"#FFFFFF","#C50000","#C50000","#D43434","#E26767","#F19B9B","#FFCECE"],
            ["Pink",            				"#f8f0fd","#b300b0","#EB00E7","#ED30E5","#EF60E3","#F08FE1","#F2BFDF"],
            ["Pantone's Glowing Purple*", 		"#FFFFFF","#5912a3","#5912a3","#831bf1","#8b47d0","#af7fe1","#cba3f3"],
            ["Pantone's Glowing Blue*",   		"#FFFFFF","#091998","#0a1ba7","#0e28f0","#0D0D98","#120DC3","#180DED"],
            ["SkyBlue",        				 	"#FFFFFF","#188BFF","#188BFF","#4AA2FF","#7CBAFF","#AED1FF","#abb9d2"],
            ["Turquise",        				"#FFFFFF","#0CC69E","#0CC69E","#37CFAF","#61D8C1","#8CE0D2","#B6E9E3"],
            ["Green",           				"#FFFFFF","#0A7105","#0A7105","#2C952B","#4EB852","#6FDC78","#91FF9E"],
            ["Grass Green",     				"#FFFFFF","#658505","#A1D408","#B0DC37","#BFE367","#CDEB96","#DCF2C5"],
            ["Pantone's Glowing Yellow*", 		"#000000","#fff000","#fff000","#fefe55","#FFF56F","#FFF9A7","#fffcce"],
            ["Orange",          				"#FFFFFF","#a14600","#cb5800","#FF6F00","#F87F21","#F18E42","#EA9E63"],
            ["Black",           				"#ffffff","#000000","#000000","#282828","#505050","#777777","#9F9F9F"],
            ["Rome Purple",     				"#FFFFFF","#483659","#603d7c","#644b7c","#644b7c","#80609f","#ac7ad3"] 
        ];
        
        return _palette[_pIdx];
    }

    function getPaletteIndex(uint _tokenId) private view returns (uint) {
        
        uint _r = uint(keccak256(abi.encodePacked(_tokenId))) % 27;
        
        uint _s = _r;
        
        uint[27] memory __consumed  = _consumed;
        uint[27] memory _limits     = [uint(8),uint(51),uint(51),uint(39),uint(40),uint(42),uint(18),uint(42),uint(30),uint(48),uint(32),uint(24),uint(18),uint(44),uint(52),uint(76),uint(65),uint(8),uint(8),uint(66),uint(60),uint(65),uint(55),uint(8),uint(65),uint(81),uint(15)];

        while (__consumed[_r] + 1 > _limits[_r])
        {
            _r++;
            
            if (_r >= 27)
            {
                _r = 0;
            }
            
            if (_r == _s)
            {
                revert("Can not produce random from palette id!");
            }
        }
        
        return _r;

    }

    function sqrt(uint x) private pure returns (uint y) {
        
        uint z = (x + 1) / 2;
        y = x;
        while (z < y) 
        {
            y = z;
            z = (x / z + z) / 2;
        }
        
    }

    function distance(uint x1, uint y1, uint x2, uint y2) private pure returns (uint) {
        
        uint x = x1 > x2 ? x1 - x2 : x2 - x1;
        uint y = y1 > y2 ? y1 - y2 : y2 - y1;
        return sqrt(x * x + y * y);
        
    }
    
    function betweenUInt(uint _v, uint _min, uint _max) private pure returns (uint) {
        
        return (_v < _min) ? _min : (_v > _max ? _max : _v);
        
    }
    
    function inRect(uint _v, uint _r) private pure returns (uint) {
        
        return _r > _v ? _r : (_v + _r > 500 ? 500 - _r : _v);
        
    }

    function intersect(Particle[] memory _particles, Particle memory _p, uint _its) private pure returns (bool) {
        
        if (_particles.length == 0)
        {
            return false;
        }
        
        for (uint _index = 0; _index < _its; _index++)
        {
            if (distance(_p.x, _p.y, _particles[_index].x, _particles[_index].y) < _p.r + _particles[_index].r)
            {
                return true;
            }
        }
        
        return false;
    }
    
    function createParticles(bytes memory _data, uint _its) private pure returns (Particle[] memory) {
        
        uint[42] memory _radius = [uint(2),uint(3),uint(4),uint(5),uint(5),uint(5),uint(5),uint(5),uint(6),uint(6),uint(6),uint(6),uint(6),uint(7),uint(7),uint(7),uint(7),uint(7),uint(8),uint(8),uint(8),uint(8),uint(8),uint(9),uint(9),uint(9),uint(9),uint(9),uint(9),uint(9),uint(9),uint(9),uint(12),uint(14),uint(14),uint(14),uint(15),uint(16),uint(18),uint(19),uint(22),uint(32)];
        uint _di = 0;
        uint _r;
        uint _x;
        uint _y;
        uint _t; 
        
        Particle memory _p;

        Particle[] memory _particles = new Particle[](_its);

        for (uint _i = 0; _i < _its; _i++)
        {
            _t = 0;
                  
            do
            {
                _x = uint(uint8(_data[_di % _data.length]));
                
                _r = _radius[_x % 42];
                
                _y = uint(uint8(_data[(_di+1) % _data.length]));

                _p = Particle(inRect((_x * (_i+1)) % 500, _r), inRect((_y * (_i+1)) % 500, _r), _r);
                
                _di += 2;
                
                _t++;
                
                if (_t > 20)
                {
                    break;
                }
            
            } while (intersect(_particles, _p, _its));
            
            _particles[_i] = _p;
        }

        return _particles;
    }
    
    function drawLines(Particle[] memory _p, string memory _c, uint _a, uint _its, bytes memory _l, uint _e, string[4] memory _o) private pure returns (bytes memory, uint) {
        
        uint _d;

        for (uint _b = 0; _b < _its; _b++)
        {
            if (_a != _b)
            {
                _d = distance(_p[_a].x, _p[_a].y, _p[_b].x, _p[_b].y);
                if (_d > 0 && _d < 71)
                {
                    _e++;
                    _l = _l.concat(
                        abi.encodePacked(
                            '<line x1="',_p[_a].x.toString(),'" y1="',_p[_a].y.toString(),'" x2="',_p[_b].x.toString(),'" y2="',_p[_b].y.toString(),'" stroke="', _c, '" stroke-opacity="',_o[_d % _o.length],'"/>'
                        )
                    );
                    
                }
            }
        }
        
        return (_l, _e);
    }
    
    function draw(string[8] memory _palette, Particle[] memory _p, uint _its) private pure returns (bytes memory _r, uint _e){
 
        bytes memory _n;
        bytes memory _l;
        
        string[4] memory _o  = ["0.09","0.11","0.18","0.30"];
        string[4] memory _d  = ["0.5","0.9","1","1.2"];

        _e = 0;
        
        for (uint _a = 0; _a < _its; _a++)
        {
            _n = _n.concat(
                abi.encodePacked(
                    '<circle cx="',_p[_a].x.toString(),'" cy="',_p[_a].y.toString(),'" r="',_p[_a].r.toString(),'" fill="', _palette[(_a % 5)+3], '" opacity="0"><animate attributeName="opacity" dur="0.8s" keyTimes="0;0.25;0.5;0.75;1" values="0;0.25;0.5;0.75;1" repeatCount="1" begin="',_d[_a % 4],'s" fill="freeze"/></circle>'
                )
            );
            
            (_l, _e) = drawLines(_p, _palette[2], _a, _its, _l, _e, _o);
        }
        
        _r = _r.concat(abi.encodePacked('<svg width="500" height="500" viewBox="0 0 500 500" xmlns="http://www.w3.org/2000/svg"><path d="M 0 0 H 500 V 500 H 0 V 0" fill="', _palette[1], '"/><g opacity="0"><animate attributeName="opacity" dur="0.8s" keyTimes="0;0.25;0.5;0.75;1" values="0;0.25;0.5;0.75;1" repeatCount="1" begin="2s" fill="freeze"/>'));
        _r = _r.concat(_l);
        _r = _r.concat(abi.encodePacked("</g>"));
        _r = _r.concat(_n);
        _r = _r.concat(abi.encodePacked('</svg>'));
    }

    function plot(address _address, uint _tokenId, uint _pIdx) private pure returns (bytes memory)  {
        
        bytes memory _data = abi.encodePacked(keccak256(abi.encodePacked(_tokenId))).concat(abi.encodePacked(_address));
        
        string[8] memory _palette = getPalette(_pIdx);

        uint _its = getIterations(_data);

        (bytes memory _s, uint _e) = draw(_palette, createParticles(_data, _its), _its);

        return abi.encodePacked(
            '", "attributes": [{"trait_type": "Name","value": "', _palette[0],
            '"},{"trait_type": "Complexity","value": "', (_its * _e).toString(),
            '"},{"trait_type": "NodeCount","value": "', _its.toString(),
            '"},{"trait_type": "EdgeCount","value": "', _e.toString(),
            '"}],"image": "data:image/svg+xml;base64,', Base64.encode(_s)
        );

    }
    /* Private methods */

    /* Public methods */
    function tokenURI(uint256 tokenId) override public view returns (string memory) {
        
        Owner memory _owner = _owners[tokenId];
        
        require(_owner._address != address(0x0), "Invalid token id!");

        return string(
            abi.encodePacked(
                'data:application/json;base64,', 
                Base64.encode(
                    abi.encodePacked(
                        '{"name": "Your Sign OnChain #',
                        tokenId.toString(),
                        string(plot(_owner._address, tokenId, _owner._paletteIndex)),
                        '"}'
                    )
                )
            )
        );
        
    }
    
    function freeMint() public {
        
        require(_saleIsOpen == 1, "Sales not open at the moment!");
        
        uint __counter = _counter;
        
        require(__counter + 1 < 1091, "Too many sign minting request!");

        require(this.balanceOf(msg.sender) + 1 <= 1, "Per wallet limit reached! Per wallet limit is 1 tokens.");

        uint _pIdx;

        _pIdx = getPaletteIndex(_counter + 1);
        
        _safeMint(msg.sender, _counter + 1);
        
        _counter++;
        
        __counter = _counter;
        
        _consumed[_pIdx]++;
        
        _owners[_counter] = Owner(msg.sender, __counter, _pIdx);
    }

    function buy(uint numberOfTokens) public payable {
        
        require(_saleIsOpen == 1, "Sales not open at the moment!");
        
        require(_signPrice > 0, "No sign price set at the moment!");
        
        require(numberOfTokens > 0 && numberOfTokens <= 10, "Too many sign minting request!");
        
        uint __counter = _counter;
        
        require(__counter + numberOfTokens < 1091, "Too many sign minting request!");

        require(_signPrice * numberOfTokens <= msg.value, "Insufficient funds!");

        uint _pIdx;

        for (uint _index = 0; _index < numberOfTokens; _index++)
        {
            _pIdx = getPaletteIndex(_counter + 1);
            
            _safeMint(msg.sender, _counter + 1);
            
            _counter++;
            
            __counter = _counter;
            
            _consumed[_pIdx]++;
            
            _owners[_counter] = Owner(msg.sender, __counter, _pIdx);
        }

    }

    function ownerMint() public onlyOwner {
        for (uint _index = 1092; _index <= 1111; _index++)
        {
            uint _pIdx = getPaletteIndex(_index);
        
            _safeMint(owner(), _index);

            _owners[_index] = Owner(owner(), _index, _pIdx);
        }
    }
    
    function withdraw() public onlyOwner {
        uint256 balance = address(this).balance;
        payable(msg.sender).transfer(balance);
    }

    /* Public methods */
 

}

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":"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":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"buy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"freeMint","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":"uint256","name":"_pIdx","type":"uint256"}],"name":"getPalette","outputs":[{"internalType":"string[8]","name":"","type":"string[8]"}],"stateMutability":"pure","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":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","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":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

662386f26fc1000060085560016009556000600a8190556103e0604052608081815260a082905260c082905260e08290526101008290526101208290526101408290526101608290526101808290526101a08290526101c08290526101e08290526102008290526102208290526102408290526102608290526102808290526102a08290526102c08290526102e08290526103008290526103208290526103408290526103608290526103808290526103a08290526103c091909152620000cb90600b90601b620001bb565b50348015620000d957600080fd5b506040518060400160405280601281526020017127b93234b730b629b4b3b727b721b430b4b760711b815250604051806040016040528060048152602001634f534f4360e01b8152508160009081620001339190620002bf565b506001620001428282620002bf565b5050506200015f620001596200016560201b60201c565b62000169565b6200038b565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b82601b8101928215620001f1579160200282015b82811115620001f1578251829060ff16905591602001919060010190620001cf565b50620001ff92915062000203565b5090565b5b80821115620001ff576000815560010162000204565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200024557607f821691505b6020821081036200026657634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620002ba57600081815260208120601f850160051c81016020861015620002955750805b601f850160051c820191505b81811015620002b657828155600101620002a1565b5050505b505050565b81516001600160401b03811115620002db57620002db6200021a565b620002f381620002ec845462000230565b846200026c565b602080601f8311600181146200032b5760008415620003125750858301515b600019600386901b1c1916600185901b178555620002b6565b600085815260208120601f198616915b828110156200035c578886015182559484019460019091019084016200033b565b50858210156200037b5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6152fb806200039b6000396000f3fe60806040526004361061012a5760003560e01c806370a08231116100ab578063b12dc9911161006f578063b12dc9911461032d578063b88d4fde14610342578063c87b56dd14610362578063d96a094a14610382578063e985e9c514610395578063f2fde38b146103b557600080fd5b806370a0823114610297578063715018a6146102c55780638da5cb5b146102da57806395d89b41146102f8578063a22cb4651461030d57600080fd5b80633ccfd60b116100f25780633ccfd60b1461020057806342842e0e14610215578063505e570a146102355780635b70ea9f146102625780636352211e1461027757600080fd5b806301ffc9a71461012f57806306fdde0314610164578063081812fc14610186578063095ea7b3146101be57806323b872dd146101e0575b600080fd5b34801561013b57600080fd5b5061014f61014a3660046146c1565b6103d5565b60405190151581526020015b60405180910390f35b34801561017057600080fd5b50610179610427565b60405161015b919061472e565b34801561019257600080fd5b506101a66101a1366004614741565b6104b9565b6040516001600160a01b03909116815260200161015b565b3480156101ca57600080fd5b506101de6101d9366004614776565b610553565b005b3480156101ec57600080fd5b506101de6101fb3660046147a0565b610668565b34801561020c57600080fd5b506101de610699565b34801561022157600080fd5b506101de6102303660046147a0565b6106f6565b34801561024157600080fd5b50610255610250366004614741565b610711565b60405161015b91906147dc565b34801561026e57600080fd5b506101de612750565b34801561028357600080fd5b506101a6610292366004614741565b61297d565b3480156102a357600080fd5b506102b76102b236600461482a565b6129f4565b60405190815260200161015b565b3480156102d157600080fd5b506101de612a7b565b3480156102e657600080fd5b506006546001600160a01b03166101a6565b34801561030457600080fd5b50610179612ab1565b34801561031957600080fd5b506101de610328366004614845565b612ac0565b34801561033957600080fd5b506101de612b84565b34801561034e57600080fd5b506101de61035d366004614897565b612c66565b34801561036e57600080fd5b5061017961037d366004614741565b612c9e565b6101de610390366004614741565b612d8d565b3480156103a157600080fd5b5061014f6103b0366004614973565b612fba565b3480156103c157600080fd5b506101de6103d036600461482a565b612fe8565b60006001600160e01b031982166380ac58cd60e01b148061040657506001600160e01b03198216635b5e139f60e01b145b8061042157506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060008054610436906149a6565b80601f0160208091040260200160405190810160405280929190818152602001828054610462906149a6565b80156104af5780601f10610484576101008083540402835291602001916104af565b820191906000526020600020905b81548152906001019060200180831161049257829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166105375760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061055e8261297d565b9050806001600160a01b0316836001600160a01b0316036105cb5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161052e565b336001600160a01b03821614806105e757506105e78133612fba565b6106595760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161052e565b6106638383613080565b505050565b61067233826130ee565b61068e5760405162461bcd60e51b815260040161052e906149da565b6106638383836131c5565b6006546001600160a01b031633146106c35760405162461bcd60e51b815260040161052e90614a2b565b6040514790339082156108fc029083906000818181858888f193505050501580156106f2573d6000803e3d6000fd5b5050565b61066383838360405180602001604052806000815250612c66565b610719614683565b60006040518061036001604052806040518061010001604052806040518060400160405280601781526020017f50616e746f6e65277320476c6f77696e6720476f6e652a00000000000000000081525081526020016040518060400160405280600781526020016611a3232323232360c91b8152508152602001604051806040016040528060078152602001660233030303030360cc1b8152508152602001604051806040016040528060078152602001660233066323866360cc1b81525081526020016040518060400160405280600781526020016611b2319b181cb360c91b8152508152602001604051806040016040528060078152602001662366656665353560c81b8152508152602001604051806040016040528060078152602001660233834316266360cc1b8152508152602001604051806040016040528060078152602001660233834316266360cc1b81525081525081526020016040518061010001604052806040518060400160405280600681526020016520baba3ab6b760d11b81525081526020016040518060400160405280600781526020016608d98d5959991960ca1b8152508152602001604051806040016040528060078152602001662334313164313360c81b815250815260200160405180604001604052806007815260200166119b9a999a191960c91b81525081526020016040518060400160405280600781526020016611a1181aa119a160c91b8152508152602001604051806040016040528060078152602001662344373937373160c81b8152508152602001604051806040016040528060078152602001662364366332386360c81b81525081526020016040518060400160405280600781526020016611b21b30b21cb160c91b8152508152508152602001604051806101000160405280604051806040016040528060068152602001652bb4b73a32b960d11b81525081526020016040518060400160405280600781526020016611b3333333333360c91b8152508152602001604051806040016040528060078152602001662330383032326160c81b8152508152602001604051806040016040528060078152602001662330463034344360c81b8152508152602001604051806040016040528060078152602001662331343145363160c81b8152508152602001604051806040016040528060078152602001662337383741393160c81b8152508152602001604051806040016040528060078152602001662362666434656560c81b8152508152602001604051806040016040528060078152602001662364616461646160c81b81525081525081526020016040518061010001604052806040518060400160405280600681526020016529bab6b6b2b960d11b81525081526020016040518060400160405280600781526020016611b2b23319b33360c91b8152508152602001604051806040016040528060078152602001661199189a329a3160c91b8152508152602001604051806040016040528060078152602001661199199b329c9b60c91b8152508152602001604051806040016040528060078152602001662331356232643360c81b8152508152602001604051806040016040528060078152602001660236666643730360cc1b81525081526020016040518060400160405280600781526020016611b3199c1b993360c91b81525081526020016040518060400160405280600781526020016611b3331a9c9c3360c91b815250815250815260200160405180610100016040528060405180604001604052806006815260200165537072696e6760d01b81525081526020016040518060400160405280600781526020016608d98d9999998d60ca1b81525081526020016040518060400160405280600781526020016611989a1a1819b160c91b8152508152602001604051806040016040528060078152602001661198999a3098b160c91b8152508152602001604051806040016040528060078152602001662339366262376360c81b81525081526020016040518060400160405280600781526020016611b131b2b31c9b60c91b81525081526020016040518060400160405280600781526020016608d95958d94d1960ca1b8152508152602001604051806040016040528060078152602001662364353862653560c81b815250815250815260200160405180610100016040528060405180604001604052806005815260200164486170707960d81b8152508152602001604051806040016040528060078152602001662366666635666360c81b8152508152602001604051806040016040528060078152602001662332653232363960c81b815250815260200160405180604001604052806007815260200166119c1a1aa2a19960c91b8152508152602001604051806040016040528060078152602001662365633837336160c81b8152508152602001604051806040016040528060078152602001660236562653330360cc1b8152508152602001604051806040016040528060078152602001660468c8c6a8a6e760cb1b815250815260200160405180604001604052806007815260200166119999311cb33360c91b81525081525081526020016040518061010001604052806040518060400160405280600c81526020016b437962657250756e6b20763160a01b81525081526020016040518060400160405280600781526020016611991b981a1a1b60c91b8152508152602001604051806040016040528060078152602001662361323664663960c81b81525081526020016040518060400160405280600781526020016604660ca64cac2760cb1b81525081526020016040518060400160405280600781526020016608d94dcc4d991960ca1b8152508152602001604051806040016040528060078152602001662366393134336160c81b8152508152602001604051806040016040528060078152602001662330636666653160c81b8152508152602001604051806040016040528060078152602001662366376666313360c81b8152508152508152602001604051806101000160405280604051806040016040528060048152602001632732b7b760e11b8152508152602001604051806040016040528060078152602001660233030303030360cc1b8152508152602001604051806040016040528060078152602001662363386666303760c81b81525081526020016040518060400160405280600781526020016611b11998b3319b60c91b8152508152602001604051806040016040528060078152602001660236632313137360cc1b81525081526020016040518060400160405280600781526020016611981a3230b31b60c91b8152508152602001604051806040016040528060078152602001660236666353230360cc1b8152508152602001604051806040016040528060078152602001660236663666630360cc1b815250815250815260200160405180610100016040528060405180604001604052806007815260200166426c6f73736f6d60c81b8152508152602001604051806040016040528060078152602001662366666636666360c81b81525081526020016040518060400160405280600781526020016608cdcccd984d8d60ca1b81525081526020016040518060400160405280600781526020016611b318b218b21b60c91b8152508152602001604051806040016040528060078152602001662366666162653160c81b81525081526020016040518060400160405280600781526020016611b09b1c1ab29960c91b815250815260200160405180604001604052806007815260200166119b189a9ab09b60c91b815250815260200160405180604001604052806007815260200166119a18191b9a3360c91b81525081525081526020016040518061010001604052806040518060400160405280600881526020016713dc9a595b9d185b60c21b81525081526020016040518060400160405280600781526020016608d98d5959991960ca1b8152508152602001604051806040016040528060078152602001660233030303030360cc1b81525081526020016040518060400160405280600781526020016604672cc60c664760cb1b8152508152602001604051806040016040528060078152602001662331413930443960c81b81525081526020016040518060400160405280600781526020016611b318309b189960c91b815250815260200160405180604001604052806007815260200166046cc60707060760cb1b81525081526020016040518060400160405280600781526020016611a31919a2989b60c91b815250815250815260200160405180610100016040528060405180604001604052806008815260200167566963654369747960c01b8152508152602001604051806040016040528060078152602001662331633132343160c81b81525081526020016040518060400160405280600781526020016611b3333333333360c91b8152508152602001604051806040016040528060078152602001660236563633732360cc1b8152508152602001604051806040016040528060078152602001660466e68c2c2ca760cb1b815250815260200160405180604001604052806007815260200166119c331b31b13360c91b8152508152602001604051806040016040528060078152602001662363303562383560c81b8152508152602001604051806040016040528060078152602001662363613134383160c81b815250815250815260200160405180610100016040528060405180604001604052806007815260200166566f6c63616e6f60c81b81525081526020016040518060400160405280600781526020016611b31cb31bb2b360c91b8152508152602001604051806040016040528060078152602001660233030303030360cc1b8152508152602001604051806040016040528060078152602001662333383030314360c81b8152508152602001604051806040016040528060078152602001660236239323230360cc1b8152508152602001604051806040016040528060078152602001660236635376530360cc1b8152508152602001604051806040016040528060078152602001662366616333306360c81b815250815260200160405180604001604052806007815260200166119c1b1c181b3160c91b81525081525081526020016040518061010001604052806040518060400160405280600a81526020016923b7b21037b3102bb0b960b11b81525081526020016040518060400160405280600781526020016611b31cb31bb2b360c91b8152508152602001604051806040016040528060078152602001662337333032313560c81b8152508152602001604051806040016040528060078152602001662334343337333760c81b8152508152602001604051806040016040528060078152602001662334303039303960c81b8152508152602001604051806040016040528060078152602001660234646303030360cc1b8152508152602001604051806040016040528060078152602001660233030303030360cc1b8152508152602001604051806040016040528060078152602001662339363063333360c81b8152508152508152602001604051806101000160405280604051806040016040528060078152602001665261696e626f7760c81b81525081526020016040518060400160405280600781526020016611a3232323232360c91b8152508152602001604051806040016040528060078152602001660233864356130360cc1b815250815260200160405180604001604052806007815260200166119c9b9833331960c91b81525081526020016040518060400160405280600781526020016611981a9c9bb31960c91b8152508152602001604051806040016040528060078152602001662334396439303760c81b81525081526020016040518060400160405280600781526020016608d98c994d0c0d60ca1b8152508152602001604051806040016040528060078152602001662363363038333560c81b8152508152508152602001604051806101000160405280604051806040016040528060098152602001682430b63637bbb2b2b760b91b81525081526020016040518060400160405280600781526020016611b31cb31bb2b360c91b8152508152602001604051806040016040528060078152602001660233030303030360cc1b8152508152602001604051806040016040528060078152602001660233030303030360cc1b8152508152602001604051806040016040528060078152602001660233135303035360cc1b8152508152602001604051806040016040528060078152602001662333463030373160c81b81525081526020016040518060400160405280600781526020016608cd8c4c0c0e4d60ca1b8152508152602001604051806040016040528060078152602001662365663863323960c81b81525081525081526020016040518061010001604052806040518060400160405280600381526020016214995960ea1b81525081526020016040518060400160405280600781526020016611a3232323232360c91b8152508152602001604051806040016040528060078152602001660234335303030360cc1b8152508152602001604051806040016040528060078152602001660234335303030360cc1b81525081526020016040518060400160405280600781526020016608d10d0ccd0ccd60ca1b8152508152602001604051806040016040528060078152602001662345323637363760c81b81525081526020016040518060400160405280600781526020016611a3189ca11ca160c91b8152508152602001604051806040016040528060078152602001662346464345434560c81b81525081525081526020016040518061010001604052806040518060400160405280600481526020016350696e6b60e01b81525081526020016040518060400160405280600781526020016608d98e198c199960ca1b8152508152602001604051806040016040528060078152602001660236233303062360cc1b8152508152602001604051806040016040528060078152602001662345423030453760c81b8152508152602001604051806040016040528060078152602001662345443330453560c81b8152508152602001604051806040016040528060078152602001662345463630453360c81b8152508152602001604051806040016040528060078152602001662346303846453160c81b81525081526020016040518060400160405280600781526020016611a3192123222360c91b81525081525081526020016040518061010001604052806040518060400160405280601981526020017f50616e746f6e65277320476c6f77696e6720507572706c652a0000000000000081525081526020016040518060400160405280600781526020016611a3232323232360c91b8152508152602001604051806040016040528060078152602001662335393132613360c81b8152508152602001604051806040016040528060078152602001662335393132613360c81b8152508152602001604051806040016040528060078152602001662338333162663160c81b8152508152602001604051806040016040528060078152602001660233862343764360cc1b8152508152602001604051806040016040528060078152602001662361663766653160c81b8152508152602001604051806040016040528060078152602001662363626133663360c81b81525081525081526020016040518061010001604052806040518060400160405280601781526020017f50616e746f6e65277320476c6f77696e6720426c75652a00000000000000000081525081526020016040518060400160405280600781526020016611a3232323232360c91b8152508152602001604051806040016040528060078152602001660466072627272760cb1b8152508152602001604051806040016040528060078152602001662330613162613760c81b8152508152602001604051806040016040528060078152602001660233065323866360cc1b8152508152602001604051806040016040528060078152602001660466088608872760cb1b8152508152602001604051806040016040528060078152602001662331323044433360c81b81525081526020016040518060400160405280600781526020016608cc4e0c11115160ca1b815250815250815260200160405180610100016040528060405180604001604052806007815260200166536b79426c756560c81b81525081526020016040518060400160405280600781526020016611a3232323232360c91b81525081526020016040518060400160405280600781526020016611989c1c21232360c91b81525081526020016040518060400160405280600781526020016611989c1c21232360c91b815250815260200160405180604001604052806007815260200166119a20a099232360c91b815250815260200160405180604001604052806007815260200166119ba1a120a32360c91b81525081526020016040518060400160405280600781526020016611a0a2a218a32360c91b81525081526020016040518060400160405280600781526020016611b0b1311cb21960c91b815250815250815260200160405180610100016040528060405180604001604052806008815260200167547572717569736560c01b81525081526020016040518060400160405280600781526020016611a3232323232360c91b8152508152602001604051806040016040528060078152602001662330434336394560c81b8152508152602001604051806040016040528060078152602001662330434336394560c81b81525081526020016040518060400160405280600781526020016611999ba1a320a360c91b8152508152602001604051806040016040528060078152602001662336314438433160c81b815250815260200160405180604001604052806007815260200166119c21a298221960c91b8152508152602001604051806040016040528060078152602001662342364539453360c81b81525081525081526020016040518061010001604052806040518060400160405280600581526020016423b932b2b760d91b81525081526020016040518060400160405280600781526020016611a3232323232360c91b8152508152602001604051806040016040528060078152602001662330413731303560c81b8152508152602001604051806040016040528060078152602001662330413731303560c81b8152508152602001604051806040016040528060078152602001661199219c9a992160c91b815250815260200160405180604001604052806007815260200166119a22a11c1a9960c91b8152508152602001604051806040016040528060078152602001660466c8c88866e760cb1b8152508152602001604051806040016040528060078152602001662339314646394560c81b81525081525081526020016040518061010001604052806040518060400160405280600b81526020016a23b930b9b99023b932b2b760a91b81525081526020016040518060400160405280600781526020016611a3232323232360c91b815250815260200160405180604090810181526007808352662336353835303560c81b60208085019190915292845281518083018352818152660468262886860760cb1b818501528484015281518083018352818152662342304443333760c81b818501528483015281518083018352818152662342464533363760c81b81850152606080860191909152825180840184528281526611a1a222a11c9b60c91b8186015260808087019190915283518085018552838152662344434632433560c81b8187015260a0968701529587528251610140808201855260196101008084019182527f50616e746f6e65277320476c6f77696e672059656c6c6f772a000000000000006101208086019190915291845286518088018852868152660233030303030360cc1b818a01819052858a019190915287518089018952878152660236666663030360cc1b818b01819052868a01919091528851808a018a52888152808b01919091528587015287518089018952878152662366656665353560c81b818b0152858c0152875180890189528781526611a323231a9b2360c91b818b0152858b015287518089018952878152662346464639413760c81b818b015260c0808701919091528851808a018a52888152662366666663636560c81b818c015260e0808801919091528d8b019690965288518086018a526006818501908152654f72616e676560d01b8287015281528951808b018b528981526611a3232323232360c91b818d01819052828d01919091528a51808c018c528a8152660236131343630360cc1b818e0152828c01528a51808c018c528a8152660236362353830360cc1b818e0152828a01528a51808c018c528a8152660234646364630360cc1b818e0152828f01528a51808c018c528a8152662346383746323160c81b818e0152828e01528a51808c018c528a81526611a3189c229a1960c91b818e0152828401528a51808c018c528a8152662345413945363360c81b818e0152828901528e8b019190915289518087018b52600581860190815264426c61636b60d81b8288015281528a51808c018c528a81526611b3333333333360c91b818e0152818d01528a51808c018c528a8152808d01859052818c01528a51808c018c528a8152808d0194909452808901939093528951808b018b52898152660466470647064760cb1b818d0152838e01528951808b018b52898152660233530353035360cc1b818d0152838d01528951808b018b52898152662337373737373760c81b818d0152838301528951808b018b5289815266119ca31ca31ca360c91b818d0152838801528d88019290925288519485018952600b9285019283526a526f6d6520507572706c6560a81b9385019390935290835286518088018852868152808901919091528288015285518087018752858152662334383336353960c81b818901528287015285518087018752858152662336303364376360c81b818901529382019390935284518086018652848152662336343462376360c81b818801819052828a01919091528551808701875285815280880191909152968101969096528351808501855283815266119c181b181cb360c91b81870152918601919091528251808401909352908252662361633761643360c81b928201929092529082015291015290508083601b811061274457612744614a60565b60200201519392505050565b6009546001146127a25760405162461bcd60e51b815260206004820152601d60248201527f53616c6573206e6f74206f70656e20617420746865206d6f6d656e7421000000604482015260640161052e565b600a546104436127b3826001614a8c565b106127d05760405162461bcd60e51b815260040161052e90614a9f565b6040516370a0823160e01b815233600482015260019030906370a0823190602401602060405180830381865afa15801561280e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128329190614ad6565b61283d906001614a8c565b11156128b15760405162461bcd60e51b815260206004820152603760248201527f5065722077616c6c6574206c696d69742072656163686564212050657220776160448201527f6c6c6574206c696d6974206973203120746f6b656e732e000000000000000000606482015260840161052e565b60006128ca600a5460016128c59190614a8c565b613365565b90506128e433600a5460016128df9190614a8c565b61356b565b600a80549060006128f483614aef565b9190505550600a549150600b81601b811061291157612911614a60565b01805490600061292083614aef565b9091555050604080516060810182523381526020808201948552818301938452600a546000908152600790915291909120905181546001600160a01b0319166001600160a01b039091161781559151600183015551600290910155565b6000818152600260205260408120546001600160a01b0316806104215760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161052e565b60006001600160a01b038216612a5f5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161052e565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b03163314612aa55760405162461bcd60e51b815260040161052e90614a2b565b612aaf6000613585565b565b606060018054610436906149a6565b336001600160a01b03831603612b185760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161052e565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6006546001600160a01b03163314612bae5760405162461bcd60e51b815260040161052e90614a2b565b6104445b6104578111612c63576000612bc682613365565b9050612be3612bdd6006546001600160a01b031690565b8361356b565b6040518060600160405280612c006006546001600160a01b031690565b6001600160a01b0390811682526020808301869052604092830194909452600085815260078552829020835181546001600160a01b0319169216919091178155928201516001840155015160029091015580612c5b81614aef565b915050612bb2565b50565b612c7033836130ee565b612c8c5760405162461bcd60e51b815260040161052e906149da565b612c98848484846135d7565b50505050565b60008181526007602090815260409182902082516060818101855282546001600160a01b0316808352600184015494830194909452600290920154938101939093529190612d225760405162461bcd60e51b8152602060048201526011602482015270496e76616c696420746f6b656e2069642160781b604482015260640161052e565b612d66612d2e8461360a565b612d41836000015186856040015161370b565b604051602001612d52929190614b24565b604051602081830303815290604052613820565b604051602001612d769190614b8e565b604051602081830303815290604052915050919050565b600954600114612ddf5760405162461bcd60e51b815260206004820152601d60248201527f53616c6573206e6f74206f70656e20617420746865206d6f6d656e7421000000604482015260640161052e565b600060085411612e315760405162461bcd60e51b815260206004820181905260248201527f4e6f207369676e2070726963652073657420617420746865206d6f6d656e7421604482015260640161052e565b600081118015612e425750600a8111155b612e5e5760405162461bcd60e51b815260040161052e90614a9f565b600a54610443612e6e8383614a8c565b10612e8b5760405162461bcd60e51b815260040161052e90614a9f565b3482600854612e9a9190614bd3565b1115612ede5760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e742066756e64732160681b604482015260640161052e565b6000805b83811015612c9857612efc600a5460016128c59190614a8c565b9150612f1133600a5460016128df9190614a8c565b600a8054906000612f2183614aef565b9190505550600a549250600b82601b8110612f3e57612f3e614a60565b018054906000612f4d83614aef565b9091555050604080516060810182523381526020808201868152828401868152600a546000908152600790935293909120915182546001600160a01b0319166001600160a01b03909116178255516001820155905160029091015580612fb281614aef565b915050612ee2565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6006546001600160a01b031633146130125760405162461bcd60e51b815260040161052e90614a2b565b6001600160a01b0381166130775760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161052e565b612c6381613585565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906130b58261297d565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166131675760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161052e565b60006131728361297d565b9050806001600160a01b0316846001600160a01b031614806131ad5750836001600160a01b03166131a2846104b9565b6001600160a01b0316145b806131bd57506131bd8185612fba565b949350505050565b826001600160a01b03166131d88261297d565b6001600160a01b0316146132405760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161052e565b6001600160a01b0382166132a25760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161052e565b6132ad600082613080565b6001600160a01b03831660009081526003602052604081208054600192906132d6908490614bea565b90915550506001600160a01b0382166000908152600360205260408120805460019290613304908490614a8c565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600080601b8360405160200161337d91815260200190565b6040516020818303038152906040528051906020012060001c6133a09190614c13565b604080516103608101918290529192508291600091600b90601b9082845b8154815260200190600101908083116133be575050505050905060006040518061036001604052806008815260200160338152602001603381526020016027815260200160288152602001602a815260200160128152602001602a8152602001601e815260200160308152602001602081526020016018815260200160128152602001602c815260200160348152602001604c815260200160418152602001600881526020016008815260200160428152602001603c81526020016041815260200160378152602001600881526020016041815260200160518152602001600f81525090505b8084601b81106134b6576134b6614a60565b60200201518285601b81106134cd576134cd614a60565b60200201516134dd906001614a8c565b111561356157836134ed81614aef565b945050601b84106134fd57600093505b82840361355c5760405162461bcd60e51b815260206004820152602760248201527f43616e206e6f742070726f647563652072616e646f6d2066726f6d2070616c656044820152667474652069642160c81b606482015260840161052e565b6134a4565b5091949350505050565b6106f2828260405180602001604052806000815250613987565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6135e28484846131c5565b6135ee848484846139ba565b612c985760405162461bcd60e51b815260040161052e90614c27565b6060816000036136315750506040805180820190915260018152600360fc1b602082015290565b8160005b811561365b578061364581614aef565b91506136549050600a83614c79565b9150613635565b60008167ffffffffffffffff81111561367657613676614881565b6040519080825280601f01601f1916602001820160405280156136a0576020820181803683370190505b5090505b84156131bd576136b5600183614bea565b91506136c2600a86614c13565b6136cd906030614a8c565b60f81b8183815181106136e2576136e2614a60565b60200101906001600160f81b031916908160001a905350613704600a86614c79565b94506136a4565b606060006137878560405160200161373b919060609190911b6bffffffffffffffffffffffff1916815260140190565b60408051601f1981840301815282825260208301889052910160408051601f198184030181528282528051602091820120908301520160408051601f1981840301815291905290613abb565b9050600061379484610711565b905060006137a183613b38565b90506000806137ba846137b48786613c13565b85613f4c565b855191935091506137d36137ce8386614bd3565b61360a565b6137dc8561360a565b6137e58461360a565b6137ee86613820565b604051602001613802959493929190614c8d565b604051602081830303815290604052955050505050505b9392505050565b6060815160000361383f57505060408051602081019091526000815290565b6000604051806060016040528060408152602001615286604091399050600060038451600261386e9190614a8c565b6138789190614c79565b613883906004614bd3565b90506000613892826020614a8c565b67ffffffffffffffff8111156138aa576138aa614881565b6040519080825280601f01601f1916602001820160405280156138d4576020820181803683370190505b509050818152600183018586518101602084015b818310156139425760039283018051603f601282901c811687015160f890811b8552600c83901c8216880151811b6001860152600683901c8216880151811b60028601529116860151901b938201939093526004016138e8565b60038951066001811461395c576002811461396d57613979565b613d3d60f01b600119830152613979565b603d60f81b6000198301525b509398975050505050505050565b6139918383614201565b61399e60008484846139ba565b6106635760405162461bcd60e51b815260040161052e90614c27565b60006001600160a01b0384163b15613ab057604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906139fe903390899088908890600401614e0f565b6020604051808303816000875af1925050508015613a39575060408051601f3d908101601f19168201909252613a3691810190614e4c565b60015b613a96573d808015613a67576040519150601f19603f3d011682016040523d82523d6000602084013e613a6c565b606091505b508051600003613a8e5760405162461bcd60e51b815260040161052e90614c27565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506131bd565b506001949350505050565b6060806040519050835180825260208201818101602087015b81831015613aec578051835260209283019201613ad4565b50855184518101855292509050808201602086015b81831015613b19578051835260209283019201613b01565b508651929092011591909101601f01601f191660405250905092915050565b6000806040518061012001604052806023815260200160288152602001602d81526020016032815260200160378152602001603c81526020016041815260200160468152602001604b8152509050600081600960028660018851613b9c9190614bea565b81518110613bac57613bac614a60565b602001015160f81c60f81b60f81c60ff1687600081518110613bd057613bd0614a60565b0160200151613be2919060f81c614a8c565b613bec9190614c79565b613bf69190614c13565b60098110613c0657613c06614a60565b6020020151949350505050565b606060006040518061054001604052806002815260200160038152602001600481526020016005815260200160058152602001600581526020016005815260200160058152602001600681526020016006815260200160068152602001600681526020016006815260200160078152602001600781526020016007815260200160078152602001600781526020016008815260200160088152602001600881526020016008815260200160088152602001600981526020016009815260200160098152602001600981526020016009815260200160098152602001600981526020016009815260200160098152602001600c8152602001600e8152602001600e8152602001600e8152602001600f8152602001601081526020016012815260200160138152602001601681526020016020815250905060008080600080613d7460405180606001604052806000815260200160008152602001600081525090565b60008967ffffffffffffffff811115613d8f57613d8f614881565b604051908082528060200260200182016040528015613de457816020015b613dd160405180606001604052806000815260200160008152602001600081525090565b815260200190600190039081613dad5790505b50905060005b8a811015613f3d57600093505b8b8c5189613e059190614c13565b81518110613e1557613e15614a60565b016020015160f81c955088613e2b602a88614c13565b602a8110613e3b57613e3b614a60565b602002015196508b8c51896001613e529190614a8c565b613e5c9190614c13565b81518110613e6c57613e6c614a60565b0160200151604080516060810190915260f89190911c955080613eb06101f4613e96856001614a8c565b613ea0908b614bd3565b613eaa9190614c13565b8a614343565b8152602001613ed06101f4613ec6856001614a8c565b613ea0908a614bd3565b81526020018890529250613ee5600289614a8c565b975083613ef181614aef565b94505060148411613f0c57613f0782848d61437b565b613df7575b82828281518110613f1f57613f1f614a60565b60200260200101819052508080613f3590614aef565b915050613dea565b509a9950505050505050505050565b6040805160c080820183526004608080840182815263302e303960e01b60a0808701919091529085528551808701875283815263302e313160e01b6020828101919091528087019190915286518088018852848152630605c62760e31b818301528688015286518088018852938452630302e33360e41b8482015260608681019490945286519485018752600392850183815262302e3560e81b928601929092529084528551808701875282815262302e3960e81b81830152848201528551808701875260018152603160f81b818301528487015285518087019096529085526218971960e91b90850152818101939093526000918391829190845b8781101561416b5761413d6140798a838151811061406857614068614a60565b60200260200101516000015161360a565b61409f8b848151811061408e5761408e614a60565b60200260200101516020015161360a565b6140c58c85815181106140b4576140b4614a60565b60200260200101516040015161360a565b8d6140d1600587614c13565b6140dc906003614a8c565b600881106140ec576140ec614a60565b6020020151866140fd600488614c13565b6004811061410d5761410d614a60565b6020020151604051602001614126959493929190614e69565b60408051601f198184030181529190528690613abb565b9450614155898b60026020020151838b888b89614441565b965093508061416381614aef565b915050614048565b506020808a015160405161419b92614184929101614fee565b60408051601f198184030181529190528790613abb565b95506141a78684613abb565b95506141c660405160200161418490631e17b39f60e11b815260040190565b95506141d28685613abb565b95506141f360405160200161418490651e17b9bb339f60d11b815260060190565b955050505050935093915050565b6001600160a01b0382166142575760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161052e565b6000818152600260205260409020546001600160a01b0316156142bc5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161052e565b6001600160a01b03821660009081526003602052604081208054600192906142e5908490614a8c565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000828211614375576101f46143598385614a8c565b116143645782613819565b614370826101f4614bea565b613819565b50919050565b6000835160000361438e57506000613819565b60005b82811015614436578481815181106143ab576143ab614a60565b60200260200101516040015184604001516143c69190614a8c565b614414856000015186602001518885815181106143e5576143e5614a60565b60200260200101516000015189868151811061440357614403614a60565b6020026020010151602001516145b6565b1015614424576001915050613819565b8061442e81614aef565b915050614391565b506000949350505050565b606060008060005b878110156145a557808914614593576144c78b8a8151811061446d5761446d614a60565b6020026020010151600001518c8b8151811061448b5761448b614a60565b6020026020010151602001518d84815181106144a9576144a9614a60565b6020026020010151600001518e858151811061440357614403614a60565b91506000821180156144d95750604782105b1561459357856144e881614aef565b9650506145906145038c8b8151811061406857614068614a60565b6145188d8c8151811061408e5761408e614a60565b61452d8e858151811061406857614068614a60565b6145428f868151811061408e5761408e614a60565b8e8a61454f60048a614c13565b6004811061455f5761455f614a60565b602002015160405160200161457996959493929190615170565b60408051601f198184030181529190528890613abb565b96505b8061459d81614aef565b915050614449565b509499939850929650505050505050565b6000808386116145cf576145ca8685614bea565b6145d9565b6145d98487614bea565b905060008386116145f3576145ee8685614bea565b6145fd565b6145fd8487614bea565b905061462561460c8280614bd3565b6146168480614bd3565b6146209190614a8c565b614630565b979650505050505050565b6000806002614640846001614a8c565b61464a9190614c79565b90508291505b81811015614375579050806002816146688186614c79565b6146729190614a8c565b61467c9190614c79565b9050614650565b6040518061010001604052806008905b60608152602001906001900390816146935790505090565b6001600160e01b031981168114612c6357600080fd5b6000602082840312156146d357600080fd5b8135613819816146ab565b60005b838110156146f95781810151838201526020016146e1565b50506000910152565b6000815180845261471a8160208601602086016146de565b601f01601f19169290920160200192915050565b6020815260006138196020830184614702565b60006020828403121561475357600080fd5b5035919050565b80356001600160a01b038116811461477157600080fd5b919050565b6000806040838503121561478957600080fd5b6147928361475a565b946020939093013593505050565b6000806000606084860312156147b557600080fd5b6147be8461475a565b92506147cc6020850161475a565b9150604084013590509250925092565b6020808252600090610120830183820185845b600881101561481e57601f1987850301835261480c848351614702565b935091840191908401906001016147ef565b50919695505050505050565b60006020828403121561483c57600080fd5b6138198261475a565b6000806040838503121561485857600080fd5b6148618361475a565b91506020830135801515811461487657600080fd5b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b600080600080608085870312156148ad57600080fd5b6148b68561475a565b93506148c46020860161475a565b925060408501359150606085013567ffffffffffffffff808211156148e857600080fd5b818701915087601f8301126148fc57600080fd5b81358181111561490e5761490e614881565b604051601f8201601f19908116603f0116810190838211818310171561493657614936614881565b816040528281528a602084870101111561494f57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806040838503121561498657600080fd5b61498f8361475a565b915061499d6020840161475a565b90509250929050565b600181811c908216806149ba57607f821691505b60208210810361437557634e487b7160e01b600052602260045260246000fd5b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b8082018082111561042157610421614a76565b6020808252601e908201527f546f6f206d616e79207369676e206d696e74696e672072657175657374210000604082015260600190565b600060208284031215614ae857600080fd5b5051919050565b600060018201614b0157614b01614a76565b5060010190565b60008151614b1a8185602086016146de565b9290920192915050565b7f7b226e616d65223a2022596f7572205369676e204f6e436861696e2023000000815260008351614b5c81601d8501602088016146de565b835190830190614b7381601d8401602088016146de565b61227d60f01b601d9290910191820152601f01949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251614bc681601d8501602087016146de565b91909101601d0192915050565b808202811582820484141761042157610421614a76565b8181038181111561042157610421614a76565b634e487b7160e01b600052601260045260246000fd5b600082614c2257614c22614bfd565b500690565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600082614c8857614c88614bfd565b500490565b7f222c202261747472696275746573223a205b7b2274726169745f74797065223a81527110112730b6b29116113b30b63ab2911d101160711b602082015260008651614ce0816032850160208b016146de565b7f227d2c7b2274726169745f74797065223a2022436f6d706c6578697479222c22603291840191820152683b30b63ab2911d101160b91b60528201528651614d2f81605b840160208b016146de565b7f227d2c7b2274726169745f74797065223a20224e6f6465436f756e74222c2276605b92909101918201526730b63ab2911d101160c11b607b82018190528651614d80816083850160208b016146de565b7f227d2c7b2274726169745f74797065223a202245646765436f756e74222c22766083939091019283015260a3820152614e03614dfd614dc360ab840188614b08565b7f227d5d2c22696d616765223a2022646174613a696d6167652f7376672b786d6c8152670ed8985cd94d8d0b60c21b602082015260280190565b85614b08565b98975050505050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090614e4290830184614702565b9695505050505050565b600060208284031215614e5e57600080fd5b8151613819816146ab565b6b1e31b4b931b6329031bc1e9160a11b81528551600090614e9181600c850160208b016146de565b65111031bc9e9160d11b600c918401918201528651614eb7816012840160208b016146de565b641110391e9160d91b601292909101918201528551614edd816017840160208a016146de565b6711103334b6361e9160c11b601792909101918201528451614f0681601f8401602089016146de565b7f22206f7061636974793d2230223e3c616e696d61746520617474726962757465601f92909101918201527f4e616d653d226f70616369747922206475723d22302e387322206b657954696d603f8201527f65733d22303b302e32353b302e353b302e37353b31222076616c7565733d2230605f8201527f3b302e32353b302e353b302e37353b312220726570656174436f756e743d2231607f8201526811103132b3b4b71e9160b91b609f820152614e03614fc560a8830186614b08565b7f73222066696c6c3d22667265657a65222f3e3c2f636972636c653e00000000008152601b0190565b7f3c7376672077696474683d2235303022206865696768743d223530302220766981527f6577426f783d2230203020353030203530302220786d6c6e733d22687474703a60208201527f2f2f7777772e77332e6f72672f323030302f737667223e3c7061746820643d2260408201527f4d203020302048203530302056203530302048203020562030222066696c6c3d6060820152601160f91b6080820152600082516150a28160818501602087016146de565b7f222f3e3c67206f7061636974793d2230223e3c616e696d61746520617474726960819390910192830152507f627574654e616d653d226f70616369747922206475723d22302e387322206b6560a18201527f7954696d65733d22303b302e32353b302e353b302e37353b31222076616c756560c18201527f733d22303b302e32353b302e353b302e37353b312220726570656174436f756e60e18201527f743d22312220626567696e3d223273222066696c6c3d22667265657a65222f3e61010182015261012101919050565b691e3634b732903c189e9160b11b8152865160009061519681600a850160208c016146de565b6511103c989e9160d11b600a9184019182015287516151bc816010840160208c016146de565b6511103c191e9160d11b6010929091019182015286516151e3816016840160208b016146de565b6511103c991e9160d11b60169290910191820152855161520a81601c840160208a016146de565b69111039ba3937b5b29e9160b11b601c929091019182015284516152358160268401602089016146de565b61527761526861526260268486010171111039ba3937b5b296b7b830b1b4ba3c9e9160711b815260120190565b87614b08565b6211179f60e91b815260030190565b9a995050505050505050505056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220d3a2ff6e92e939b29fee6c449a30cfd207e546c829b9da50d09cdffb61e4787964736f6c63430008110033

Deployed Bytecode

0x60806040526004361061012a5760003560e01c806370a08231116100ab578063b12dc9911161006f578063b12dc9911461032d578063b88d4fde14610342578063c87b56dd14610362578063d96a094a14610382578063e985e9c514610395578063f2fde38b146103b557600080fd5b806370a0823114610297578063715018a6146102c55780638da5cb5b146102da57806395d89b41146102f8578063a22cb4651461030d57600080fd5b80633ccfd60b116100f25780633ccfd60b1461020057806342842e0e14610215578063505e570a146102355780635b70ea9f146102625780636352211e1461027757600080fd5b806301ffc9a71461012f57806306fdde0314610164578063081812fc14610186578063095ea7b3146101be57806323b872dd146101e0575b600080fd5b34801561013b57600080fd5b5061014f61014a3660046146c1565b6103d5565b60405190151581526020015b60405180910390f35b34801561017057600080fd5b50610179610427565b60405161015b919061472e565b34801561019257600080fd5b506101a66101a1366004614741565b6104b9565b6040516001600160a01b03909116815260200161015b565b3480156101ca57600080fd5b506101de6101d9366004614776565b610553565b005b3480156101ec57600080fd5b506101de6101fb3660046147a0565b610668565b34801561020c57600080fd5b506101de610699565b34801561022157600080fd5b506101de6102303660046147a0565b6106f6565b34801561024157600080fd5b50610255610250366004614741565b610711565b60405161015b91906147dc565b34801561026e57600080fd5b506101de612750565b34801561028357600080fd5b506101a6610292366004614741565b61297d565b3480156102a357600080fd5b506102b76102b236600461482a565b6129f4565b60405190815260200161015b565b3480156102d157600080fd5b506101de612a7b565b3480156102e657600080fd5b506006546001600160a01b03166101a6565b34801561030457600080fd5b50610179612ab1565b34801561031957600080fd5b506101de610328366004614845565b612ac0565b34801561033957600080fd5b506101de612b84565b34801561034e57600080fd5b506101de61035d366004614897565b612c66565b34801561036e57600080fd5b5061017961037d366004614741565b612c9e565b6101de610390366004614741565b612d8d565b3480156103a157600080fd5b5061014f6103b0366004614973565b612fba565b3480156103c157600080fd5b506101de6103d036600461482a565b612fe8565b60006001600160e01b031982166380ac58cd60e01b148061040657506001600160e01b03198216635b5e139f60e01b145b8061042157506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060008054610436906149a6565b80601f0160208091040260200160405190810160405280929190818152602001828054610462906149a6565b80156104af5780601f10610484576101008083540402835291602001916104af565b820191906000526020600020905b81548152906001019060200180831161049257829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166105375760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061055e8261297d565b9050806001600160a01b0316836001600160a01b0316036105cb5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161052e565b336001600160a01b03821614806105e757506105e78133612fba565b6106595760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161052e565b6106638383613080565b505050565b61067233826130ee565b61068e5760405162461bcd60e51b815260040161052e906149da565b6106638383836131c5565b6006546001600160a01b031633146106c35760405162461bcd60e51b815260040161052e90614a2b565b6040514790339082156108fc029083906000818181858888f193505050501580156106f2573d6000803e3d6000fd5b5050565b61066383838360405180602001604052806000815250612c66565b610719614683565b60006040518061036001604052806040518061010001604052806040518060400160405280601781526020017f50616e746f6e65277320476c6f77696e6720476f6e652a00000000000000000081525081526020016040518060400160405280600781526020016611a3232323232360c91b8152508152602001604051806040016040528060078152602001660233030303030360cc1b8152508152602001604051806040016040528060078152602001660233066323866360cc1b81525081526020016040518060400160405280600781526020016611b2319b181cb360c91b8152508152602001604051806040016040528060078152602001662366656665353560c81b8152508152602001604051806040016040528060078152602001660233834316266360cc1b8152508152602001604051806040016040528060078152602001660233834316266360cc1b81525081525081526020016040518061010001604052806040518060400160405280600681526020016520baba3ab6b760d11b81525081526020016040518060400160405280600781526020016608d98d5959991960ca1b8152508152602001604051806040016040528060078152602001662334313164313360c81b815250815260200160405180604001604052806007815260200166119b9a999a191960c91b81525081526020016040518060400160405280600781526020016611a1181aa119a160c91b8152508152602001604051806040016040528060078152602001662344373937373160c81b8152508152602001604051806040016040528060078152602001662364366332386360c81b81525081526020016040518060400160405280600781526020016611b21b30b21cb160c91b8152508152508152602001604051806101000160405280604051806040016040528060068152602001652bb4b73a32b960d11b81525081526020016040518060400160405280600781526020016611b3333333333360c91b8152508152602001604051806040016040528060078152602001662330383032326160c81b8152508152602001604051806040016040528060078152602001662330463034344360c81b8152508152602001604051806040016040528060078152602001662331343145363160c81b8152508152602001604051806040016040528060078152602001662337383741393160c81b8152508152602001604051806040016040528060078152602001662362666434656560c81b8152508152602001604051806040016040528060078152602001662364616461646160c81b81525081525081526020016040518061010001604052806040518060400160405280600681526020016529bab6b6b2b960d11b81525081526020016040518060400160405280600781526020016611b2b23319b33360c91b8152508152602001604051806040016040528060078152602001661199189a329a3160c91b8152508152602001604051806040016040528060078152602001661199199b329c9b60c91b8152508152602001604051806040016040528060078152602001662331356232643360c81b8152508152602001604051806040016040528060078152602001660236666643730360cc1b81525081526020016040518060400160405280600781526020016611b3199c1b993360c91b81525081526020016040518060400160405280600781526020016611b3331a9c9c3360c91b815250815250815260200160405180610100016040528060405180604001604052806006815260200165537072696e6760d01b81525081526020016040518060400160405280600781526020016608d98d9999998d60ca1b81525081526020016040518060400160405280600781526020016611989a1a1819b160c91b8152508152602001604051806040016040528060078152602001661198999a3098b160c91b8152508152602001604051806040016040528060078152602001662339366262376360c81b81525081526020016040518060400160405280600781526020016611b131b2b31c9b60c91b81525081526020016040518060400160405280600781526020016608d95958d94d1960ca1b8152508152602001604051806040016040528060078152602001662364353862653560c81b815250815250815260200160405180610100016040528060405180604001604052806005815260200164486170707960d81b8152508152602001604051806040016040528060078152602001662366666635666360c81b8152508152602001604051806040016040528060078152602001662332653232363960c81b815250815260200160405180604001604052806007815260200166119c1a1aa2a19960c91b8152508152602001604051806040016040528060078152602001662365633837336160c81b8152508152602001604051806040016040528060078152602001660236562653330360cc1b8152508152602001604051806040016040528060078152602001660468c8c6a8a6e760cb1b815250815260200160405180604001604052806007815260200166119999311cb33360c91b81525081525081526020016040518061010001604052806040518060400160405280600c81526020016b437962657250756e6b20763160a01b81525081526020016040518060400160405280600781526020016611991b981a1a1b60c91b8152508152602001604051806040016040528060078152602001662361323664663960c81b81525081526020016040518060400160405280600781526020016604660ca64cac2760cb1b81525081526020016040518060400160405280600781526020016608d94dcc4d991960ca1b8152508152602001604051806040016040528060078152602001662366393134336160c81b8152508152602001604051806040016040528060078152602001662330636666653160c81b8152508152602001604051806040016040528060078152602001662366376666313360c81b8152508152508152602001604051806101000160405280604051806040016040528060048152602001632732b7b760e11b8152508152602001604051806040016040528060078152602001660233030303030360cc1b8152508152602001604051806040016040528060078152602001662363386666303760c81b81525081526020016040518060400160405280600781526020016611b11998b3319b60c91b8152508152602001604051806040016040528060078152602001660236632313137360cc1b81525081526020016040518060400160405280600781526020016611981a3230b31b60c91b8152508152602001604051806040016040528060078152602001660236666353230360cc1b8152508152602001604051806040016040528060078152602001660236663666630360cc1b815250815250815260200160405180610100016040528060405180604001604052806007815260200166426c6f73736f6d60c81b8152508152602001604051806040016040528060078152602001662366666636666360c81b81525081526020016040518060400160405280600781526020016608cdcccd984d8d60ca1b81525081526020016040518060400160405280600781526020016611b318b218b21b60c91b8152508152602001604051806040016040528060078152602001662366666162653160c81b81525081526020016040518060400160405280600781526020016611b09b1c1ab29960c91b815250815260200160405180604001604052806007815260200166119b189a9ab09b60c91b815250815260200160405180604001604052806007815260200166119a18191b9a3360c91b81525081525081526020016040518061010001604052806040518060400160405280600881526020016713dc9a595b9d185b60c21b81525081526020016040518060400160405280600781526020016608d98d5959991960ca1b8152508152602001604051806040016040528060078152602001660233030303030360cc1b81525081526020016040518060400160405280600781526020016604672cc60c664760cb1b8152508152602001604051806040016040528060078152602001662331413930443960c81b81525081526020016040518060400160405280600781526020016611b318309b189960c91b815250815260200160405180604001604052806007815260200166046cc60707060760cb1b81525081526020016040518060400160405280600781526020016611a31919a2989b60c91b815250815250815260200160405180610100016040528060405180604001604052806008815260200167566963654369747960c01b8152508152602001604051806040016040528060078152602001662331633132343160c81b81525081526020016040518060400160405280600781526020016611b3333333333360c91b8152508152602001604051806040016040528060078152602001660236563633732360cc1b8152508152602001604051806040016040528060078152602001660466e68c2c2ca760cb1b815250815260200160405180604001604052806007815260200166119c331b31b13360c91b8152508152602001604051806040016040528060078152602001662363303562383560c81b8152508152602001604051806040016040528060078152602001662363613134383160c81b815250815250815260200160405180610100016040528060405180604001604052806007815260200166566f6c63616e6f60c81b81525081526020016040518060400160405280600781526020016611b31cb31bb2b360c91b8152508152602001604051806040016040528060078152602001660233030303030360cc1b8152508152602001604051806040016040528060078152602001662333383030314360c81b8152508152602001604051806040016040528060078152602001660236239323230360cc1b8152508152602001604051806040016040528060078152602001660236635376530360cc1b8152508152602001604051806040016040528060078152602001662366616333306360c81b815250815260200160405180604001604052806007815260200166119c1b1c181b3160c91b81525081525081526020016040518061010001604052806040518060400160405280600a81526020016923b7b21037b3102bb0b960b11b81525081526020016040518060400160405280600781526020016611b31cb31bb2b360c91b8152508152602001604051806040016040528060078152602001662337333032313560c81b8152508152602001604051806040016040528060078152602001662334343337333760c81b8152508152602001604051806040016040528060078152602001662334303039303960c81b8152508152602001604051806040016040528060078152602001660234646303030360cc1b8152508152602001604051806040016040528060078152602001660233030303030360cc1b8152508152602001604051806040016040528060078152602001662339363063333360c81b8152508152508152602001604051806101000160405280604051806040016040528060078152602001665261696e626f7760c81b81525081526020016040518060400160405280600781526020016611a3232323232360c91b8152508152602001604051806040016040528060078152602001660233864356130360cc1b815250815260200160405180604001604052806007815260200166119c9b9833331960c91b81525081526020016040518060400160405280600781526020016611981a9c9bb31960c91b8152508152602001604051806040016040528060078152602001662334396439303760c81b81525081526020016040518060400160405280600781526020016608d98c994d0c0d60ca1b8152508152602001604051806040016040528060078152602001662363363038333560c81b8152508152508152602001604051806101000160405280604051806040016040528060098152602001682430b63637bbb2b2b760b91b81525081526020016040518060400160405280600781526020016611b31cb31bb2b360c91b8152508152602001604051806040016040528060078152602001660233030303030360cc1b8152508152602001604051806040016040528060078152602001660233030303030360cc1b8152508152602001604051806040016040528060078152602001660233135303035360cc1b8152508152602001604051806040016040528060078152602001662333463030373160c81b81525081526020016040518060400160405280600781526020016608cd8c4c0c0e4d60ca1b8152508152602001604051806040016040528060078152602001662365663863323960c81b81525081525081526020016040518061010001604052806040518060400160405280600381526020016214995960ea1b81525081526020016040518060400160405280600781526020016611a3232323232360c91b8152508152602001604051806040016040528060078152602001660234335303030360cc1b8152508152602001604051806040016040528060078152602001660234335303030360cc1b81525081526020016040518060400160405280600781526020016608d10d0ccd0ccd60ca1b8152508152602001604051806040016040528060078152602001662345323637363760c81b81525081526020016040518060400160405280600781526020016611a3189ca11ca160c91b8152508152602001604051806040016040528060078152602001662346464345434560c81b81525081525081526020016040518061010001604052806040518060400160405280600481526020016350696e6b60e01b81525081526020016040518060400160405280600781526020016608d98e198c199960ca1b8152508152602001604051806040016040528060078152602001660236233303062360cc1b8152508152602001604051806040016040528060078152602001662345423030453760c81b8152508152602001604051806040016040528060078152602001662345443330453560c81b8152508152602001604051806040016040528060078152602001662345463630453360c81b8152508152602001604051806040016040528060078152602001662346303846453160c81b81525081526020016040518060400160405280600781526020016611a3192123222360c91b81525081525081526020016040518061010001604052806040518060400160405280601981526020017f50616e746f6e65277320476c6f77696e6720507572706c652a0000000000000081525081526020016040518060400160405280600781526020016611a3232323232360c91b8152508152602001604051806040016040528060078152602001662335393132613360c81b8152508152602001604051806040016040528060078152602001662335393132613360c81b8152508152602001604051806040016040528060078152602001662338333162663160c81b8152508152602001604051806040016040528060078152602001660233862343764360cc1b8152508152602001604051806040016040528060078152602001662361663766653160c81b8152508152602001604051806040016040528060078152602001662363626133663360c81b81525081525081526020016040518061010001604052806040518060400160405280601781526020017f50616e746f6e65277320476c6f77696e6720426c75652a00000000000000000081525081526020016040518060400160405280600781526020016611a3232323232360c91b8152508152602001604051806040016040528060078152602001660466072627272760cb1b8152508152602001604051806040016040528060078152602001662330613162613760c81b8152508152602001604051806040016040528060078152602001660233065323866360cc1b8152508152602001604051806040016040528060078152602001660466088608872760cb1b8152508152602001604051806040016040528060078152602001662331323044433360c81b81525081526020016040518060400160405280600781526020016608cc4e0c11115160ca1b815250815250815260200160405180610100016040528060405180604001604052806007815260200166536b79426c756560c81b81525081526020016040518060400160405280600781526020016611a3232323232360c91b81525081526020016040518060400160405280600781526020016611989c1c21232360c91b81525081526020016040518060400160405280600781526020016611989c1c21232360c91b815250815260200160405180604001604052806007815260200166119a20a099232360c91b815250815260200160405180604001604052806007815260200166119ba1a120a32360c91b81525081526020016040518060400160405280600781526020016611a0a2a218a32360c91b81525081526020016040518060400160405280600781526020016611b0b1311cb21960c91b815250815250815260200160405180610100016040528060405180604001604052806008815260200167547572717569736560c01b81525081526020016040518060400160405280600781526020016611a3232323232360c91b8152508152602001604051806040016040528060078152602001662330434336394560c81b8152508152602001604051806040016040528060078152602001662330434336394560c81b81525081526020016040518060400160405280600781526020016611999ba1a320a360c91b8152508152602001604051806040016040528060078152602001662336314438433160c81b815250815260200160405180604001604052806007815260200166119c21a298221960c91b8152508152602001604051806040016040528060078152602001662342364539453360c81b81525081525081526020016040518061010001604052806040518060400160405280600581526020016423b932b2b760d91b81525081526020016040518060400160405280600781526020016611a3232323232360c91b8152508152602001604051806040016040528060078152602001662330413731303560c81b8152508152602001604051806040016040528060078152602001662330413731303560c81b8152508152602001604051806040016040528060078152602001661199219c9a992160c91b815250815260200160405180604001604052806007815260200166119a22a11c1a9960c91b8152508152602001604051806040016040528060078152602001660466c8c88866e760cb1b8152508152602001604051806040016040528060078152602001662339314646394560c81b81525081525081526020016040518061010001604052806040518060400160405280600b81526020016a23b930b9b99023b932b2b760a91b81525081526020016040518060400160405280600781526020016611a3232323232360c91b815250815260200160405180604090810181526007808352662336353835303560c81b60208085019190915292845281518083018352818152660468262886860760cb1b818501528484015281518083018352818152662342304443333760c81b818501528483015281518083018352818152662342464533363760c81b81850152606080860191909152825180840184528281526611a1a222a11c9b60c91b8186015260808087019190915283518085018552838152662344434632433560c81b8187015260a0968701529587528251610140808201855260196101008084019182527f50616e746f6e65277320476c6f77696e672059656c6c6f772a000000000000006101208086019190915291845286518088018852868152660233030303030360cc1b818a01819052858a019190915287518089018952878152660236666663030360cc1b818b01819052868a01919091528851808a018a52888152808b01919091528587015287518089018952878152662366656665353560c81b818b0152858c0152875180890189528781526611a323231a9b2360c91b818b0152858b015287518089018952878152662346464639413760c81b818b015260c0808701919091528851808a018a52888152662366666663636560c81b818c015260e0808801919091528d8b019690965288518086018a526006818501908152654f72616e676560d01b8287015281528951808b018b528981526611a3232323232360c91b818d01819052828d01919091528a51808c018c528a8152660236131343630360cc1b818e0152828c01528a51808c018c528a8152660236362353830360cc1b818e0152828a01528a51808c018c528a8152660234646364630360cc1b818e0152828f01528a51808c018c528a8152662346383746323160c81b818e0152828e01528a51808c018c528a81526611a3189c229a1960c91b818e0152828401528a51808c018c528a8152662345413945363360c81b818e0152828901528e8b019190915289518087018b52600581860190815264426c61636b60d81b8288015281528a51808c018c528a81526611b3333333333360c91b818e0152818d01528a51808c018c528a8152808d01859052818c01528a51808c018c528a8152808d0194909452808901939093528951808b018b52898152660466470647064760cb1b818d0152838e01528951808b018b52898152660233530353035360cc1b818d0152838d01528951808b018b52898152662337373737373760c81b818d0152838301528951808b018b5289815266119ca31ca31ca360c91b818d0152838801528d88019290925288519485018952600b9285019283526a526f6d6520507572706c6560a81b9385019390935290835286518088018852868152808901919091528288015285518087018752858152662334383336353960c81b818901528287015285518087018752858152662336303364376360c81b818901529382019390935284518086018652848152662336343462376360c81b818801819052828a01919091528551808701875285815280880191909152968101969096528351808501855283815266119c181b181cb360c91b81870152918601919091528251808401909352908252662361633761643360c81b928201929092529082015291015290508083601b811061274457612744614a60565b60200201519392505050565b6009546001146127a25760405162461bcd60e51b815260206004820152601d60248201527f53616c6573206e6f74206f70656e20617420746865206d6f6d656e7421000000604482015260640161052e565b600a546104436127b3826001614a8c565b106127d05760405162461bcd60e51b815260040161052e90614a9f565b6040516370a0823160e01b815233600482015260019030906370a0823190602401602060405180830381865afa15801561280e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128329190614ad6565b61283d906001614a8c565b11156128b15760405162461bcd60e51b815260206004820152603760248201527f5065722077616c6c6574206c696d69742072656163686564212050657220776160448201527f6c6c6574206c696d6974206973203120746f6b656e732e000000000000000000606482015260840161052e565b60006128ca600a5460016128c59190614a8c565b613365565b90506128e433600a5460016128df9190614a8c565b61356b565b600a80549060006128f483614aef565b9190505550600a549150600b81601b811061291157612911614a60565b01805490600061292083614aef565b9091555050604080516060810182523381526020808201948552818301938452600a546000908152600790915291909120905181546001600160a01b0319166001600160a01b039091161781559151600183015551600290910155565b6000818152600260205260408120546001600160a01b0316806104215760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161052e565b60006001600160a01b038216612a5f5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161052e565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b03163314612aa55760405162461bcd60e51b815260040161052e90614a2b565b612aaf6000613585565b565b606060018054610436906149a6565b336001600160a01b03831603612b185760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161052e565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6006546001600160a01b03163314612bae5760405162461bcd60e51b815260040161052e90614a2b565b6104445b6104578111612c63576000612bc682613365565b9050612be3612bdd6006546001600160a01b031690565b8361356b565b6040518060600160405280612c006006546001600160a01b031690565b6001600160a01b0390811682526020808301869052604092830194909452600085815260078552829020835181546001600160a01b0319169216919091178155928201516001840155015160029091015580612c5b81614aef565b915050612bb2565b50565b612c7033836130ee565b612c8c5760405162461bcd60e51b815260040161052e906149da565b612c98848484846135d7565b50505050565b60008181526007602090815260409182902082516060818101855282546001600160a01b0316808352600184015494830194909452600290920154938101939093529190612d225760405162461bcd60e51b8152602060048201526011602482015270496e76616c696420746f6b656e2069642160781b604482015260640161052e565b612d66612d2e8461360a565b612d41836000015186856040015161370b565b604051602001612d52929190614b24565b604051602081830303815290604052613820565b604051602001612d769190614b8e565b604051602081830303815290604052915050919050565b600954600114612ddf5760405162461bcd60e51b815260206004820152601d60248201527f53616c6573206e6f74206f70656e20617420746865206d6f6d656e7421000000604482015260640161052e565b600060085411612e315760405162461bcd60e51b815260206004820181905260248201527f4e6f207369676e2070726963652073657420617420746865206d6f6d656e7421604482015260640161052e565b600081118015612e425750600a8111155b612e5e5760405162461bcd60e51b815260040161052e90614a9f565b600a54610443612e6e8383614a8c565b10612e8b5760405162461bcd60e51b815260040161052e90614a9f565b3482600854612e9a9190614bd3565b1115612ede5760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e742066756e64732160681b604482015260640161052e565b6000805b83811015612c9857612efc600a5460016128c59190614a8c565b9150612f1133600a5460016128df9190614a8c565b600a8054906000612f2183614aef565b9190505550600a549250600b82601b8110612f3e57612f3e614a60565b018054906000612f4d83614aef565b9091555050604080516060810182523381526020808201868152828401868152600a546000908152600790935293909120915182546001600160a01b0319166001600160a01b03909116178255516001820155905160029091015580612fb281614aef565b915050612ee2565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b6006546001600160a01b031633146130125760405162461bcd60e51b815260040161052e90614a2b565b6001600160a01b0381166130775760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161052e565b612c6381613585565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906130b58261297d565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166131675760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161052e565b60006131728361297d565b9050806001600160a01b0316846001600160a01b031614806131ad5750836001600160a01b03166131a2846104b9565b6001600160a01b0316145b806131bd57506131bd8185612fba565b949350505050565b826001600160a01b03166131d88261297d565b6001600160a01b0316146132405760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161052e565b6001600160a01b0382166132a25760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161052e565b6132ad600082613080565b6001600160a01b03831660009081526003602052604081208054600192906132d6908490614bea565b90915550506001600160a01b0382166000908152600360205260408120805460019290613304908490614a8c565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600080601b8360405160200161337d91815260200190565b6040516020818303038152906040528051906020012060001c6133a09190614c13565b604080516103608101918290529192508291600091600b90601b9082845b8154815260200190600101908083116133be575050505050905060006040518061036001604052806008815260200160338152602001603381526020016027815260200160288152602001602a815260200160128152602001602a8152602001601e815260200160308152602001602081526020016018815260200160128152602001602c815260200160348152602001604c815260200160418152602001600881526020016008815260200160428152602001603c81526020016041815260200160378152602001600881526020016041815260200160518152602001600f81525090505b8084601b81106134b6576134b6614a60565b60200201518285601b81106134cd576134cd614a60565b60200201516134dd906001614a8c565b111561356157836134ed81614aef565b945050601b84106134fd57600093505b82840361355c5760405162461bcd60e51b815260206004820152602760248201527f43616e206e6f742070726f647563652072616e646f6d2066726f6d2070616c656044820152667474652069642160c81b606482015260840161052e565b6134a4565b5091949350505050565b6106f2828260405180602001604052806000815250613987565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6135e28484846131c5565b6135ee848484846139ba565b612c985760405162461bcd60e51b815260040161052e90614c27565b6060816000036136315750506040805180820190915260018152600360fc1b602082015290565b8160005b811561365b578061364581614aef565b91506136549050600a83614c79565b9150613635565b60008167ffffffffffffffff81111561367657613676614881565b6040519080825280601f01601f1916602001820160405280156136a0576020820181803683370190505b5090505b84156131bd576136b5600183614bea565b91506136c2600a86614c13565b6136cd906030614a8c565b60f81b8183815181106136e2576136e2614a60565b60200101906001600160f81b031916908160001a905350613704600a86614c79565b94506136a4565b606060006137878560405160200161373b919060609190911b6bffffffffffffffffffffffff1916815260140190565b60408051601f1981840301815282825260208301889052910160408051601f198184030181528282528051602091820120908301520160408051601f1981840301815291905290613abb565b9050600061379484610711565b905060006137a183613b38565b90506000806137ba846137b48786613c13565b85613f4c565b855191935091506137d36137ce8386614bd3565b61360a565b6137dc8561360a565b6137e58461360a565b6137ee86613820565b604051602001613802959493929190614c8d565b604051602081830303815290604052955050505050505b9392505050565b6060815160000361383f57505060408051602081019091526000815290565b6000604051806060016040528060408152602001615286604091399050600060038451600261386e9190614a8c565b6138789190614c79565b613883906004614bd3565b90506000613892826020614a8c565b67ffffffffffffffff8111156138aa576138aa614881565b6040519080825280601f01601f1916602001820160405280156138d4576020820181803683370190505b509050818152600183018586518101602084015b818310156139425760039283018051603f601282901c811687015160f890811b8552600c83901c8216880151811b6001860152600683901c8216880151811b60028601529116860151901b938201939093526004016138e8565b60038951066001811461395c576002811461396d57613979565b613d3d60f01b600119830152613979565b603d60f81b6000198301525b509398975050505050505050565b6139918383614201565b61399e60008484846139ba565b6106635760405162461bcd60e51b815260040161052e90614c27565b60006001600160a01b0384163b15613ab057604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906139fe903390899088908890600401614e0f565b6020604051808303816000875af1925050508015613a39575060408051601f3d908101601f19168201909252613a3691810190614e4c565b60015b613a96573d808015613a67576040519150601f19603f3d011682016040523d82523d6000602084013e613a6c565b606091505b508051600003613a8e5760405162461bcd60e51b815260040161052e90614c27565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506131bd565b506001949350505050565b6060806040519050835180825260208201818101602087015b81831015613aec578051835260209283019201613ad4565b50855184518101855292509050808201602086015b81831015613b19578051835260209283019201613b01565b508651929092011591909101601f01601f191660405250905092915050565b6000806040518061012001604052806023815260200160288152602001602d81526020016032815260200160378152602001603c81526020016041815260200160468152602001604b8152509050600081600960028660018851613b9c9190614bea565b81518110613bac57613bac614a60565b602001015160f81c60f81b60f81c60ff1687600081518110613bd057613bd0614a60565b0160200151613be2919060f81c614a8c565b613bec9190614c79565b613bf69190614c13565b60098110613c0657613c06614a60565b6020020151949350505050565b606060006040518061054001604052806002815260200160038152602001600481526020016005815260200160058152602001600581526020016005815260200160058152602001600681526020016006815260200160068152602001600681526020016006815260200160078152602001600781526020016007815260200160078152602001600781526020016008815260200160088152602001600881526020016008815260200160088152602001600981526020016009815260200160098152602001600981526020016009815260200160098152602001600981526020016009815260200160098152602001600c8152602001600e8152602001600e8152602001600e8152602001600f8152602001601081526020016012815260200160138152602001601681526020016020815250905060008080600080613d7460405180606001604052806000815260200160008152602001600081525090565b60008967ffffffffffffffff811115613d8f57613d8f614881565b604051908082528060200260200182016040528015613de457816020015b613dd160405180606001604052806000815260200160008152602001600081525090565b815260200190600190039081613dad5790505b50905060005b8a811015613f3d57600093505b8b8c5189613e059190614c13565b81518110613e1557613e15614a60565b016020015160f81c955088613e2b602a88614c13565b602a8110613e3b57613e3b614a60565b602002015196508b8c51896001613e529190614a8c565b613e5c9190614c13565b81518110613e6c57613e6c614a60565b0160200151604080516060810190915260f89190911c955080613eb06101f4613e96856001614a8c565b613ea0908b614bd3565b613eaa9190614c13565b8a614343565b8152602001613ed06101f4613ec6856001614a8c565b613ea0908a614bd3565b81526020018890529250613ee5600289614a8c565b975083613ef181614aef565b94505060148411613f0c57613f0782848d61437b565b613df7575b82828281518110613f1f57613f1f614a60565b60200260200101819052508080613f3590614aef565b915050613dea565b509a9950505050505050505050565b6040805160c080820183526004608080840182815263302e303960e01b60a0808701919091529085528551808701875283815263302e313160e01b6020828101919091528087019190915286518088018852848152630605c62760e31b818301528688015286518088018852938452630302e33360e41b8482015260608681019490945286519485018752600392850183815262302e3560e81b928601929092529084528551808701875282815262302e3960e81b81830152848201528551808701875260018152603160f81b818301528487015285518087019096529085526218971960e91b90850152818101939093526000918391829190845b8781101561416b5761413d6140798a838151811061406857614068614a60565b60200260200101516000015161360a565b61409f8b848151811061408e5761408e614a60565b60200260200101516020015161360a565b6140c58c85815181106140b4576140b4614a60565b60200260200101516040015161360a565b8d6140d1600587614c13565b6140dc906003614a8c565b600881106140ec576140ec614a60565b6020020151866140fd600488614c13565b6004811061410d5761410d614a60565b6020020151604051602001614126959493929190614e69565b60408051601f198184030181529190528690613abb565b9450614155898b60026020020151838b888b89614441565b965093508061416381614aef565b915050614048565b506020808a015160405161419b92614184929101614fee565b60408051601f198184030181529190528790613abb565b95506141a78684613abb565b95506141c660405160200161418490631e17b39f60e11b815260040190565b95506141d28685613abb565b95506141f360405160200161418490651e17b9bb339f60d11b815260060190565b955050505050935093915050565b6001600160a01b0382166142575760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161052e565b6000818152600260205260409020546001600160a01b0316156142bc5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161052e565b6001600160a01b03821660009081526003602052604081208054600192906142e5908490614a8c565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000828211614375576101f46143598385614a8c565b116143645782613819565b614370826101f4614bea565b613819565b50919050565b6000835160000361438e57506000613819565b60005b82811015614436578481815181106143ab576143ab614a60565b60200260200101516040015184604001516143c69190614a8c565b614414856000015186602001518885815181106143e5576143e5614a60565b60200260200101516000015189868151811061440357614403614a60565b6020026020010151602001516145b6565b1015614424576001915050613819565b8061442e81614aef565b915050614391565b506000949350505050565b606060008060005b878110156145a557808914614593576144c78b8a8151811061446d5761446d614a60565b6020026020010151600001518c8b8151811061448b5761448b614a60565b6020026020010151602001518d84815181106144a9576144a9614a60565b6020026020010151600001518e858151811061440357614403614a60565b91506000821180156144d95750604782105b1561459357856144e881614aef565b9650506145906145038c8b8151811061406857614068614a60565b6145188d8c8151811061408e5761408e614a60565b61452d8e858151811061406857614068614a60565b6145428f868151811061408e5761408e614a60565b8e8a61454f60048a614c13565b6004811061455f5761455f614a60565b602002015160405160200161457996959493929190615170565b60408051601f198184030181529190528890613abb565b96505b8061459d81614aef565b915050614449565b509499939850929650505050505050565b6000808386116145cf576145ca8685614bea565b6145d9565b6145d98487614bea565b905060008386116145f3576145ee8685614bea565b6145fd565b6145fd8487614bea565b905061462561460c8280614bd3565b6146168480614bd3565b6146209190614a8c565b614630565b979650505050505050565b6000806002614640846001614a8c565b61464a9190614c79565b90508291505b81811015614375579050806002816146688186614c79565b6146729190614a8c565b61467c9190614c79565b9050614650565b6040518061010001604052806008905b60608152602001906001900390816146935790505090565b6001600160e01b031981168114612c6357600080fd5b6000602082840312156146d357600080fd5b8135613819816146ab565b60005b838110156146f95781810151838201526020016146e1565b50506000910152565b6000815180845261471a8160208601602086016146de565b601f01601f19169290920160200192915050565b6020815260006138196020830184614702565b60006020828403121561475357600080fd5b5035919050565b80356001600160a01b038116811461477157600080fd5b919050565b6000806040838503121561478957600080fd5b6147928361475a565b946020939093013593505050565b6000806000606084860312156147b557600080fd5b6147be8461475a565b92506147cc6020850161475a565b9150604084013590509250925092565b6020808252600090610120830183820185845b600881101561481e57601f1987850301835261480c848351614702565b935091840191908401906001016147ef565b50919695505050505050565b60006020828403121561483c57600080fd5b6138198261475a565b6000806040838503121561485857600080fd5b6148618361475a565b91506020830135801515811461487657600080fd5b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b600080600080608085870312156148ad57600080fd5b6148b68561475a565b93506148c46020860161475a565b925060408501359150606085013567ffffffffffffffff808211156148e857600080fd5b818701915087601f8301126148fc57600080fd5b81358181111561490e5761490e614881565b604051601f8201601f19908116603f0116810190838211818310171561493657614936614881565b816040528281528a602084870101111561494f57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806040838503121561498657600080fd5b61498f8361475a565b915061499d6020840161475a565b90509250929050565b600181811c908216806149ba57607f821691505b60208210810361437557634e487b7160e01b600052602260045260246000fd5b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b8082018082111561042157610421614a76565b6020808252601e908201527f546f6f206d616e79207369676e206d696e74696e672072657175657374210000604082015260600190565b600060208284031215614ae857600080fd5b5051919050565b600060018201614b0157614b01614a76565b5060010190565b60008151614b1a8185602086016146de565b9290920192915050565b7f7b226e616d65223a2022596f7572205369676e204f6e436861696e2023000000815260008351614b5c81601d8501602088016146de565b835190830190614b7381601d8401602088016146de565b61227d60f01b601d9290910191820152601f01949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251614bc681601d8501602087016146de565b91909101601d0192915050565b808202811582820484141761042157610421614a76565b8181038181111561042157610421614a76565b634e487b7160e01b600052601260045260246000fd5b600082614c2257614c22614bfd565b500690565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600082614c8857614c88614bfd565b500490565b7f222c202261747472696275746573223a205b7b2274726169745f74797065223a81527110112730b6b29116113b30b63ab2911d101160711b602082015260008651614ce0816032850160208b016146de565b7f227d2c7b2274726169745f74797065223a2022436f6d706c6578697479222c22603291840191820152683b30b63ab2911d101160b91b60528201528651614d2f81605b840160208b016146de565b7f227d2c7b2274726169745f74797065223a20224e6f6465436f756e74222c2276605b92909101918201526730b63ab2911d101160c11b607b82018190528651614d80816083850160208b016146de565b7f227d2c7b2274726169745f74797065223a202245646765436f756e74222c22766083939091019283015260a3820152614e03614dfd614dc360ab840188614b08565b7f227d5d2c22696d616765223a2022646174613a696d6167652f7376672b786d6c8152670ed8985cd94d8d0b60c21b602082015260280190565b85614b08565b98975050505050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090614e4290830184614702565b9695505050505050565b600060208284031215614e5e57600080fd5b8151613819816146ab565b6b1e31b4b931b6329031bc1e9160a11b81528551600090614e9181600c850160208b016146de565b65111031bc9e9160d11b600c918401918201528651614eb7816012840160208b016146de565b641110391e9160d91b601292909101918201528551614edd816017840160208a016146de565b6711103334b6361e9160c11b601792909101918201528451614f0681601f8401602089016146de565b7f22206f7061636974793d2230223e3c616e696d61746520617474726962757465601f92909101918201527f4e616d653d226f70616369747922206475723d22302e387322206b657954696d603f8201527f65733d22303b302e32353b302e353b302e37353b31222076616c7565733d2230605f8201527f3b302e32353b302e353b302e37353b312220726570656174436f756e743d2231607f8201526811103132b3b4b71e9160b91b609f820152614e03614fc560a8830186614b08565b7f73222066696c6c3d22667265657a65222f3e3c2f636972636c653e00000000008152601b0190565b7f3c7376672077696474683d2235303022206865696768743d223530302220766981527f6577426f783d2230203020353030203530302220786d6c6e733d22687474703a60208201527f2f2f7777772e77332e6f72672f323030302f737667223e3c7061746820643d2260408201527f4d203020302048203530302056203530302048203020562030222066696c6c3d6060820152601160f91b6080820152600082516150a28160818501602087016146de565b7f222f3e3c67206f7061636974793d2230223e3c616e696d61746520617474726960819390910192830152507f627574654e616d653d226f70616369747922206475723d22302e387322206b6560a18201527f7954696d65733d22303b302e32353b302e353b302e37353b31222076616c756560c18201527f733d22303b302e32353b302e353b302e37353b312220726570656174436f756e60e18201527f743d22312220626567696e3d223273222066696c6c3d22667265657a65222f3e61010182015261012101919050565b691e3634b732903c189e9160b11b8152865160009061519681600a850160208c016146de565b6511103c989e9160d11b600a9184019182015287516151bc816010840160208c016146de565b6511103c191e9160d11b6010929091019182015286516151e3816016840160208b016146de565b6511103c991e9160d11b60169290910191820152855161520a81601c840160208a016146de565b69111039ba3937b5b29e9160b11b601c929091019182015284516152358160268401602089016146de565b61527761526861526260268486010171111039ba3937b5b296b7b830b1b4ba3c9e9160711b815260120190565b87614b08565b6211179f60e91b815260030190565b9a995050505050505050505056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220d3a2ff6e92e939b29fee6c449a30cfd207e546c829b9da50d09cdffb61e4787964736f6c63430008110033

Deployed Bytecode Sourcemap

40996:14238:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28791:305;;;;;;;;;;-1:-1:-1;28791:305:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;28791:305:0;;;;;;;;29736:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;31295:221::-;;;;;;;;;;-1:-1:-1;31295:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1719:32:1;;;1701:51;;1689:2;1674:18;31295:221:0;1555:203:1;30818:411:0;;;;;;;;;;-1:-1:-1;30818:411:0;;;;;:::i;:::-;;:::i;:::-;;32185:339;;;;;;;;;;-1:-1:-1;32185:339:0;;;;;:::i;:::-;;:::i;55055:143::-;;;;;;;;;;;;;:::i;32595:185::-;;;;;;;;;;-1:-1:-1;32595:185:0;;;;;:::i;:::-;;:::i;42114:3153::-;;;;;;;;;;-1:-1:-1;42114:3153:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;53057:676::-;;;;;;;;;;;;;:::i;29430:239::-;;;;;;;;;;-1:-1:-1;29430:239:0;;;;;:::i;:::-;;:::i;29160:208::-;;;;;;;;;;-1:-1:-1;29160:208:0;;;;;:::i;:::-;;:::i;:::-;;;3575:25:1;;;3563:2;3548:18;29160:208:0;3429:177:1;10384:94:0;;;;;;;;;;;;;:::i;9733:87::-;;;;;;;;;;-1:-1:-1;9806:6:0;;-1:-1:-1;;;;;9806:6:0;9733:87;;29905:104;;;;;;;;;;;;;:::i;31588:295::-;;;;;;;;;;-1:-1:-1;31588:295:0;;;;;:::i;:::-;;:::i;54749:294::-;;;;;;;;;;;;;:::i;32851:328::-;;;;;;;;;;-1:-1:-1;32851:328:0;;;;;:::i;:::-;;:::i;52338:707::-;;;;;;;;;;-1:-1:-1;52338:707:0;;;;;:::i;:::-;;:::i;53741:1000::-;;;;;;:::i;:::-;;:::i;31954:164::-;;;;;;;;;;-1:-1:-1;31954:164:0;;;;;:::i;:::-;;:::i;10633:192::-;;;;;;;;;;-1:-1:-1;10633:192:0;;;;;:::i;:::-;;:::i;28791:305::-;28893:4;-1:-1:-1;;;;;;28930:40:0;;-1:-1:-1;;;28930:40:0;;:105;;-1:-1:-1;;;;;;;28987:48:0;;-1:-1:-1;;;28987:48:0;28930:105;:158;;;-1:-1:-1;;;;;;;;;;21852:40:0;;;29052:36;28910:178;28791:305;-1:-1:-1;;28791:305:0:o;29736:100::-;29790:13;29823:5;29816:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29736:100;:::o;31295:221::-;31371:7;34778:16;;;:7;:16;;;;;;-1:-1:-1;;;;;34778:16:0;31391:73;;;;-1:-1:-1;;;31391:73:0;;6090:2:1;31391:73:0;;;6072:21:1;6129:2;6109:18;;;6102:30;6168:34;6148:18;;;6141:62;-1:-1:-1;;;6219:18:1;;;6212:42;6271:19;;31391:73:0;;;;;;;;;-1:-1:-1;31484:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;31484:24:0;;31295:221::o;30818:411::-;30899:13;30915:23;30930:7;30915:14;:23::i;:::-;30899:39;;30963:5;-1:-1:-1;;;;;30957:11:0;:2;-1:-1:-1;;;;;30957:11:0;;30949:57;;;;-1:-1:-1;;;30949:57:0;;6503:2:1;30949:57:0;;;6485:21:1;6542:2;6522:18;;;6515:30;6581:34;6561:18;;;6554:62;-1:-1:-1;;;6632:18:1;;;6625:31;6673:19;;30949:57:0;6301:397:1;30949:57:0;8595:10;-1:-1:-1;;;;;31041:21:0;;;;:62;;-1:-1:-1;31066:37:0;31083:5;8595:10;31954:164;:::i;31066:37::-;31019:168;;;;-1:-1:-1;;;31019:168:0;;6905:2:1;31019:168:0;;;6887:21:1;6944:2;6924:18;;;6917:30;6983:34;6963:18;;;6956:62;7054:26;7034:18;;;7027:54;7098:19;;31019:168:0;6703:420:1;31019:168:0;31200:21;31209:2;31213:7;31200:8;:21::i;:::-;30888:341;30818:411;;:::o;32185:339::-;32380:41;8595:10;32413:7;32380:18;:41::i;:::-;32372:103;;;;-1:-1:-1;;;32372:103:0;;;;;;;:::i;:::-;32488:28;32498:4;32504:2;32508:7;32488:9;:28::i;55055:143::-;9806:6;;-1:-1:-1;;;;;9806:6:0;8595:10;9953:23;9945:68;;;;-1:-1:-1;;;9945:68:0;;;;;;;:::i;:::-;55153:37:::1;::::0;55121:21:::1;::::0;55161:10:::1;::::0;55153:37;::::1;;;::::0;55121:21;;55103:15:::1;55153:37:::0;55103:15;55153:37;55121:21;55161:10;55153:37;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;55092:106;55055:143::o:0;32595:185::-;32733:39;32750:4;32756:2;32760:7;32733:39;;;;;;;;;;;;:16;:39::i;42114:3153::-;42167:16;;:::i;:::-;42196:29;:3020;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;-1:-1:-1;;;;42196:3020:0;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;-1:-1:-1;;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;-1:-1:-1;;;42196:3020:0;;;;;;;;;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;;;-1:-1:-1;;;42196:3020:0;;;;;-1:-1:-1;42196:3020:0;45253:5;45244:15;;;;;;;:::i;:::-;;;;;;42114:3153;-1:-1:-1;;;42114:3153:0:o;53057:676::-;53113:11;;53128:1;53113:16;53105:58;;;;-1:-1:-1;;;53105:58:0;;8241:2:1;53105:58:0;;;8223:21:1;8280:2;8260:18;;;8253:30;8319:31;8299:18;;;8292:59;8368:18;;53105:58:0;8039:353:1;53105:58:0;53201:8;;53254:4;53238:13;53201:8;53250:1;53238:13;:::i;:::-;:20;53230:63;;;;-1:-1:-1;;;53230:63:0;;;;;;;:::i;:::-;53314:26;;-1:-1:-1;;;53314:26:0;;53329:10;53314:26;;;1701:51:1;53348:1:0;;53314:4;;:14;;1674:18:1;;53314:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:30;;53343:1;53314:30;:::i;:::-;:35;;53306:103;;;;-1:-1:-1;;;53306:103:0;;9409:2:1;53306:103:0;;;9391:21:1;9448:2;9428:18;;;9421:30;9487:34;9467:18;;;9460:62;9558:25;9538:18;;;9531:53;9601:19;;53306:103:0;9207:419:1;53306:103:0;53422:10;53453:29;53469:8;;53480:1;53469:12;;;;:::i;:::-;53453:15;:29::i;:::-;53445:37;;53503:35;53513:10;53525:8;;53536:1;53525:12;;;;:::i;:::-;53503:9;:35::i;:::-;53559:8;:10;;;:8;:10;;;:::i;:::-;;;;;;53602:8;;53590:20;;53631:9;53641:5;53631:16;;;;;;;:::i;:::-;;:18;;;:16;:18;;;:::i;:::-;;;;-1:-1:-1;;53690:35:0;;;;;;;;53696:10;53690:35;;;;;;;;;;;;;;;53678:8;;-1:-1:-1;53670:17:0;;;:7;:17;;;;;;;:55;;;;-1:-1:-1;;;;;;53670:55:0;-1:-1:-1;;;;;53670:55:0;;;;;;;;-1:-1:-1;53670:55:0;;;;;;;;;53057:676::o;29430:239::-;29502:7;29538:16;;;:7;:16;;;;;;-1:-1:-1;;;;;29538:16:0;;29565:73;;;;-1:-1:-1;;;29565:73:0;;9973:2:1;29565:73:0;;;9955:21:1;10012:2;9992:18;;;9985:30;10051:34;10031:18;;;10024:62;-1:-1:-1;;;10102:18:1;;;10095:39;10151:19;;29565:73:0;9771:405:1;29160:208:0;29232:7;-1:-1:-1;;;;;29260:19:0;;29252:74;;;;-1:-1:-1;;;29252:74:0;;10383:2:1;29252:74:0;;;10365:21:1;10422:2;10402:18;;;10395:30;10461:34;10441:18;;;10434:62;-1:-1:-1;;;10512:18:1;;;10505:40;10562:19;;29252:74:0;10181:406:1;29252:74:0;-1:-1:-1;;;;;;29344:16:0;;;;;:9;:16;;;;;;;29160:208::o;10384:94::-;9806:6;;-1:-1:-1;;;;;9806:6:0;8595:10;9953:23;9945:68;;;;-1:-1:-1;;;9945:68:0;;;;;;;:::i;:::-;10449:21:::1;10467:1;10449:9;:21::i;:::-;10384:94::o:0;29905:104::-;29961:13;29994:7;29987:14;;;;;:::i;31588:295::-;8595:10;-1:-1:-1;;;;;31691:24:0;;;31683:62;;;;-1:-1:-1;;;31683:62:0;;10794:2:1;31683:62:0;;;10776:21:1;10833:2;10813:18;;;10806:30;10872:27;10852:18;;;10845:55;10917:18;;31683:62:0;10592:349:1;31683:62:0;8595:10;31758:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;31758:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;31758:53:0;;;;;;;;;;31827:48;;540:41:1;;;31758:42:0;;8595:10;31827:48;;513:18:1;31827:48:0;;;;;;;31588:295;;:::o;54749:294::-;9806:6;;-1:-1:-1;;;;;9806:6:0;8595:10;9953:23;9945:68;;;;-1:-1:-1;;;9945:68:0;;;;;;;:::i;:::-;54817:4:::1;54798:238;54833:4;54823:6;:14;54798:238;;54873:10;54886:23;54902:6;54886:15;:23::i;:::-;54873:36;;54934:26;54944:7;9806:6:::0;;-1:-1:-1;;;;;9806:6:0;;9733:87;54944:7:::1;54953:6;54934:9;:26::i;:::-;54995:29;;;;;;;;55001:7;9806:6:::0;;-1:-1:-1;;;;;9806:6:0;;9733:87;55001:7:::1;-1:-1:-1::0;;;;;54995:29:0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;;;;-1:-1:-1;54977:15:0;;;:7:::1;:15:::0;;;;;:47;;;;-1:-1:-1;;;;;;54977:47:0::1;::::0;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;-1:-1:-1;54977:47:0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;54995:29;54839:8:::1;54995:29:::0;54839:8:::1;:::i;:::-;;;;54798:238;;;;54749:294::o:0;32851:328::-;33026:41;8595:10;33059:7;33026:18;:41::i;:::-;33018:103;;;;-1:-1:-1;;;33018:103:0;;;;;;;:::i;:::-;33132:39;33146:4;33152:2;33156:7;33165:5;33132:13;:39::i;:::-;32851:328;;;;:::o;52338:707::-;52439:19;52461:16;;;:7;:16;;;;;;;;;52439:38;;52403:13;52439:38;;;;;;;-1:-1:-1;;;;;52439:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;52403:13;52439:38;52498:61;;;;-1:-1:-1;;;52498:61:0;;11148:2:1;52498:61:0;;;11130:21:1;11187:2;11167:18;;;11160:30;-1:-1:-1;;;11206:18:1;;;11199:47;11263:18;;52498:61:0;10946:341:1;52498:61:0;52686:315;52823:18;:7;:16;:18::i;:::-;52875:52;52880:6;:15;;;52897:7;52906:6;:20;;;52875:4;:52::i;:::-;52722:260;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52686:13;:315::i;:::-;52600:416;;;;;;;;:::i;:::-;;;;;;;;;;;;;52572:455;;;52338:707;;;:::o;53741:1000::-;53819:11;;53834:1;53819:16;53811:58;;;;-1:-1:-1;;;53811:58:0;;8241:2:1;53811:58:0;;;8223:21:1;8280:2;8260:18;;;8253:30;8319:31;8299:18;;;8292:59;8368:18;;53811:58:0;8039:353:1;53811:58:0;53911:1;53898:10;;:14;53890:59;;;;-1:-1:-1;;;53890:59:0;;13037:2:1;53890:59:0;;;13019:21:1;;;13056:18;;;13049:30;13115:34;13095:18;;;13088:62;13167:18;;53890:59:0;12835:356:1;53890:59:0;53995:1;53978:14;:18;:42;;;;;54018:2;54000:14;:20;;53978:42;53970:85;;;;-1:-1:-1;;;53970:85:0;;;;;;;:::i;:::-;54093:8;;54159:4;54130:26;54142:14;54093:8;54130:26;:::i;:::-;:33;54122:76;;;;-1:-1:-1;;;54122:76:0;;;;;;;:::i;:::-;54250:9;54232:14;54219:10;;:27;;;;:::i;:::-;:40;;54211:72;;;;-1:-1:-1;;;54211:72:0;;13571:2:1;54211:72:0;;;13553:21:1;13610:2;13590:18;;;13583:30;-1:-1:-1;;;13629:18:1;;;13622:49;13688:18;;54211:72:0;13369:343:1;54211:72:0;54296:10;;54319:413;54350:14;54341:6;:23;54319:413;;;54408:29;54424:8;;54435:1;54424:12;;;;:::i;54408:29::-;54400:37;;54466:35;54476:10;54488:8;;54499:1;54488:12;;;;:::i;54466:35::-;54530:8;:10;;;:8;:10;;;:::i;:::-;;;;;;54581:8;;54569:20;;54618:9;54628:5;54618:16;;;;;;;:::i;:::-;;:18;;;:16;:18;;;:::i;:::-;;;;-1:-1:-1;;54685:35:0;;;;;;;;54691:10;54685:35;;;;;;;;;;;;;;;54673:8;;-1:-1:-1;54665:17:0;;;:7;:17;;;;;;;:55;;;;-1:-1:-1;;;;;;54665:55:0;-1:-1:-1;;;;;54665:55:0;;;;;;;-1:-1:-1;54665:55:0;;;;;;;;;;54366:8;;;;:::i;:::-;;;;54319:413;;31954:164;-1:-1:-1;;;;;32075:25:0;;;32051:4;32075:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;31954:164::o;10633:192::-;9806:6;;-1:-1:-1;;;;;9806:6:0;8595:10;9953:23;9945:68;;;;-1:-1:-1;;;9945:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;10722:22:0;::::1;10714:73;;;::::0;-1:-1:-1;;;10714:73:0;;13919:2:1;10714:73:0::1;::::0;::::1;13901:21:1::0;13958:2;13938:18;;;13931:30;13997:34;13977:18;;;13970:62;-1:-1:-1;;;14048:18:1;;;14041:36;14094:19;;10714:73:0::1;13717:402:1::0;10714:73:0::1;10798:19;10808:8;10798:9;:19::i;38671:174::-:0;38746:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;38746:29:0;-1:-1:-1;;;;;38746:29:0;;;;;;;;:24;;38800:23;38746:24;38800:14;:23::i;:::-;-1:-1:-1;;;;;38791:46:0;;;;;;;;;;;38671:174;;:::o;34983:348::-;35076:4;34778:16;;;:7;:16;;;;;;-1:-1:-1;;;;;34778:16:0;35093:73;;;;-1:-1:-1;;;35093:73:0;;14326:2:1;35093:73:0;;;14308:21:1;14365:2;14345:18;;;14338:30;14404:34;14384:18;;;14377:62;-1:-1:-1;;;14455:18:1;;;14448:42;14507:19;;35093:73:0;14124:408:1;35093:73:0;35177:13;35193:23;35208:7;35193:14;:23::i;:::-;35177:39;;35246:5;-1:-1:-1;;;;;35235:16:0;:7;-1:-1:-1;;;;;35235:16:0;;:51;;;;35279:7;-1:-1:-1;;;;;35255:31:0;:20;35267:7;35255:11;:20::i;:::-;-1:-1:-1;;;;;35255:31:0;;35235:51;:87;;;;35290:32;35307:5;35314:7;35290:16;:32::i;:::-;35227:96;34983:348;-1:-1:-1;;;;34983:348:0:o;37975:578::-;38134:4;-1:-1:-1;;;;;38107:31:0;:23;38122:7;38107:14;:23::i;:::-;-1:-1:-1;;;;;38107:31:0;;38099:85;;;;-1:-1:-1;;;38099:85:0;;14739:2:1;38099:85:0;;;14721:21:1;14778:2;14758:18;;;14751:30;14817:34;14797:18;;;14790:62;-1:-1:-1;;;14868:18:1;;;14861:39;14917:19;;38099:85:0;14537:405:1;38099:85:0;-1:-1:-1;;;;;38203:16:0;;38195:65;;;;-1:-1:-1;;;38195:65:0;;15149:2:1;38195:65:0;;;15131:21:1;15188:2;15168:18;;;15161:30;15227:34;15207:18;;;15200:62;-1:-1:-1;;;15278:18:1;;;15271:34;15322:19;;38195:65:0;14947:400:1;38195:65:0;38377:29;38394:1;38398:7;38377:8;:29::i;:::-;-1:-1:-1;;;;;38419:15:0;;;;;;:9;:15;;;;;:20;;38438:1;;38419:15;:20;;38438:1;;38419:20;:::i;:::-;;;;-1:-1:-1;;;;;;;38450:13:0;;;;;;:9;:13;;;;;:18;;38467:1;;38450:13;:18;;38467:1;;38450:18;:::i;:::-;;;;-1:-1:-1;;38479:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;38479:21:0;-1:-1:-1;;;;;38479:21:0;;;;;;;;;38518:27;;38479:16;;38518:27;;;;;;;37975:578;;;:::o;45275:889::-;45337:4;45364:7;45420:2;45406:8;45389:26;;;;;;15614:19:1;;15658:2;15649:12;;15485:182;45389:26:0;;;;;;;;;;;;;45379:37;;;;;;45374:43;;:48;;;;:::i;:::-;45476:39;;;;;;;;;;45364:58;;-1:-1:-1;45364:58:0;;-1:-1:-1;;45506:9:0;;45476:39;;45506:9;45476:39;;;;;;;;;;;;;;;;;;;;;;;;45526:23;:270;;;;;;;;45562:1;45526:270;;;;45570:2;45526:270;;;;45579:2;45526:270;;;;45588:2;45526:270;;;;45597:2;45526:270;;;;45606:2;45526:270;;;;45615:2;45526:270;;;;45624:2;45526:270;;;;45633:2;45526:270;;;;45642:2;45526:270;;;;45651:2;45526:270;;;;45660:2;45526:270;;;;45669:2;45526:270;;;;45678:2;45526:270;;;;45687:2;45526:270;;;;45696:2;45526:270;;;;45705:2;45526:270;;;;45714:1;45526:270;;;;45722:1;45526:270;;;;45730:2;45526:270;;;;45739:2;45526:270;;;;45748:2;45526:270;;;;45757:2;45526:270;;;;45766:1;45526:270;;;;45774:2;45526:270;;;;45783:2;45526:270;;;;45792:2;45526:270;;;;;45809:316;45837:7;45845:2;45837:11;;;;;;;:::i;:::-;;;;;45816:10;45827:2;45816:14;;;;;;;:::i;:::-;;;;;:18;;45833:1;45816:18;:::i;:::-;:32;45809:316;;;45874:4;;;;:::i;:::-;;;;45917:2;45911;:8;45907:68;;45958:1;45953:6;;45907:68;46013:2;46007;:8;46003:111;;46049:49;;-1:-1:-1;;;46049:49:0;;16123:2:1;46049:49:0;;;16105:21:1;16162:2;16142:18;;;16135:30;16201:34;16181:18;;;16174:62;-1:-1:-1;;;16252:18:1;;;16245:37;16299:19;;46049:49:0;15921:403:1;46003:111:0;45809:316;;;-1:-1:-1;46152:2:0;;45275:889;-1:-1:-1;;;;45275:889:0:o;35673:110::-;35749:26;35759:2;35763:7;35749:26;;;;;;;;;;;;:9;:26::i;10833:173::-;10908:6;;;-1:-1:-1;;;;;10925:17:0;;;-1:-1:-1;;;;;;10925:17:0;;;;;;;10958:40;;10908:6;;;10925:17;10908:6;;10958:40;;10889:16;;10958:40;10878:128;10833:173;:::o;34061:315::-;34218:28;34228:4;34234:2;34238:7;34218:9;:28::i;:::-;34265:48;34288:4;34294:2;34298:7;34307:5;34265:22;:48::i;:::-;34257:111;;;;-1:-1:-1;;;34257:111:0;;;;;;;:::i;6125:723::-;6181:13;6402:5;6411:1;6402:10;6398:53;;-1:-1:-1;;6429:10:0;;;;;;;;;;;;-1:-1:-1;;;6429:10:0;;;;;6125:723::o;6398:53::-;6476:5;6461:12;6517:78;6524:9;;6517:78;;6550:8;;;;:::i;:::-;;-1:-1:-1;6573:10:0;;-1:-1:-1;6581:2:0;6573:10;;:::i;:::-;;;6517:78;;;6605:19;6637:6;6627:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6627:17:0;;6605:39;;6655:154;6662:10;;6655:154;;6689:11;6699:1;6689:11;;:::i;:::-;;-1:-1:-1;6758:10:0;6766:2;6758:5;:10;:::i;:::-;6745:24;;:2;:24;:::i;:::-;6732:39;;6715:6;6722;6715:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;6715:56:0;;;;;;;;-1:-1:-1;6786:11:0;6795:2;6786:11;;:::i;:::-;;;6655:154;;51405:872;51486:12;51522:18;51543:90;51623:8;51606:26;;;;;;;17022:2:1;17018:15;;;;-1:-1:-1;;17014:53:1;17002:66;;17093:2;17084:12;;16873:229;51606:26:0;;;;-1:-1:-1;;51606:26:0;;;;;;;;;;51570;;15614:19:1;;;51606:26:0;15649:12:1;51570:26:0;;;-1:-1:-1;;51570:26:0;;;;;;;;;51560:37;;51570:26;51560:37;;;;51543:55;;;15614:19:1;15649:12;51543:55:0;;;-1:-1:-1;;51543:55:0;;;;;;;;;;:62;:90::i;:::-;51522:111;;51654:25;51682:17;51693:5;51682:10;:17::i;:::-;51654:45;;51712:9;51724:20;51738:5;51724:13;:20::i;:::-;51712:32;;51758:15;51775:7;51786:50;51791:8;51801:28;51817:5;51824:4;51801:15;:28::i;:::-;51831:4;51786;:50::i;:::-;51941:11;;51757:79;;-1:-1:-1;51757:79:0;-1:-1:-1;52012:22:0;52013:9;51757:79;52013:4;:9;:::i;:::-;52012:20;:22::i;:::-;52093:15;:4;:13;:15::i;:::-;52167:13;:2;:11;:13::i;:::-;52239:17;52253:2;52239:13;:17::i;:::-;51856:411;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51849:418;;;;;;;51405:872;;;;;;:::o;328:2037::-;386:13;416:4;:11;431:1;416:16;412:31;;-1:-1:-1;;434:9:0;;;;;;;;;-1:-1:-1;434:9:0;;;328:2037::o;412:31::-;503:19;525:5;;;;;;;;;;;;;;;;;503:27;;582:18;628:1;609:4;:11;623:1;609:15;;;;:::i;:::-;608:21;;;;:::i;:::-;603:27;;:1;:27;:::i;:::-;582:48;-1:-1:-1;713:20:0;747:15;582:48;760:2;747:15;:::i;:::-;736:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;736:27:0;;713:50;;860:10;852:6;845:26;967:1;960:5;956:13;1038:4;1089;1083:11;1074:7;1070:25;1197:2;1189:6;1185:15;1282:810;1301:6;1292:7;1289:19;1282:810;;;1367:1;1354:15;;;1448:14;;1601:4;1589:2;1585:14;;;1581:25;;1567:40;;1561:47;1556:3;1552:57;;;1534:76;;1729:2;1725:14;;;1721:25;;1707:40;;1701:47;1692:57;;1655:1;1640:17;;1674:76;1870:1;1865:14;;;1861:25;;1847:40;;1841:47;1832:57;;1780:17;;;1814:76;2001:25;;1987:40;;1981:47;1972:57;;1920:17;;;1954:76;;;;2060:17;;1282:810;;;2177:1;2170:4;2164:11;2160:19;2198:1;2193:54;;;;2266:1;2261:52;;;;2153:160;;2193:54;-1:-1:-1;;;;;2209:17:0;;2202:43;2193:54;;2261:52;-1:-1:-1;;;;;2277:17:0;;2270:41;2153:160;-1:-1:-1;2351:6:0;;328:2037;-1:-1:-1;;;;;;;;328:2037:0:o;36010:321::-;36140:18;36146:2;36150:7;36140:5;:18::i;:::-;36191:54;36222:1;36226:2;36230:7;36239:5;36191:22;:54::i;:::-;36169:154;;;;-1:-1:-1;;;36169:154:0;;;;;;;:::i;39410:799::-;39565:4;-1:-1:-1;;;;;39586:13:0;;12108:20;12156:8;39582:620;;39622:72;;-1:-1:-1;;;39622:72:0;;-1:-1:-1;;;;;39622:36:0;;;;;:72;;8595:10;;39673:4;;39679:7;;39688:5;;39622:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39622:72:0;;;;;;;;-1:-1:-1;;39622:72:0;;;;;;;;;;;;:::i;:::-;;;39618:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39864:6;:13;39881:1;39864:18;39860:272;;39907:60;;-1:-1:-1;;;39907:60:0;;;;;;;:::i;39860:272::-;40082:6;40076:13;40067:6;40063:2;40059:15;40052:38;39618:529;-1:-1:-1;;;;;;39745:51:0;-1:-1:-1;;;39745:51:0;;-1:-1:-1;39738:58:0;;39582:620;-1:-1:-1;40186:4:0;39410:799;;;;;;:::o;2770:3031::-;2910:12;2940:22;3150:4;3144:11;3131:24;;3311:9;3305:16;3353:6;3342:9;3335:25;3600:4;3589:9;3585:20;3752:6;3748:2;3744:15;3951:4;3940:9;3936:20;3775:537;3979:3;3975:2;3972:11;3775:537;;;4287:9;;4276:21;;4088:4;4080:13;;;;4117;3775:537;;;-1:-1:-1;4528:17:0;;4589:16;;4577:29;;4559:48;;4528:17;-1:-1:-1;4755:3:0;-1:-1:-1;4895:15:0;;;4975:4;4959:21;;4926:228;5003:3;4999:2;4996:11;4926:228;;;5129:9;;5118:21;;5041:4;5033:13;;;;5070;4926:228;;;-1:-1:-1;5651:16:0;;5639:29;;;;5632:37;5623:47;;;;5696:2;5619:56;-1:-1:-1;;5599:154:0;5593:4;5586:168;-1:-1:-1;5784:9:0;-1:-1:-1;2770:3031:0;;;;:::o;41724:378::-;41789:4;41816:26;:111;;;;;;;;41851:2;41816:111;;;;41860:2;41816:111;;;;41869:2;41816:111;;;;41878:2;41816:111;;;;41887:2;41816:111;;;;41896:2;41816:111;;;;41905:2;41816:111;;;;41914:2;41816:111;;;;41923:2;41816:111;;;;;41940:9;41952:11;42033:18;42028:1;42001:5;42020:1;42007:5;:12;:14;;;;:::i;:::-;42001:21;;;;;;;;:::i;:::-;;;;;;;;;41995:28;;41990:34;;41977:5;41983:1;41977:8;;;;;;;;:::i;:::-;;;;;41966:58;;;41977:8;;41966:58;:::i;:::-;41965:64;;;;:::i;:::-;41964:87;;;;:::i;:::-;41952:100;;;;;;;:::i;:::-;;;;;;41724:378;-1:-1:-1;;;;41724:378:0:o;47522:1494::-;47600:17;47640:23;:373;;;;;;;;47672:1;47640:373;;;;47680:1;47640:373;;;;47688:1;47640:373;;;;47696:1;47640:373;;;;47704:1;47640:373;;;;47712:1;47640:373;;;;47720:1;47640:373;;;;47728:1;47640:373;;;;47736:1;47640:373;;;;47744:1;47640:373;;;;47752:1;47640:373;;;;47760:1;47640:373;;;;47768:1;47640:373;;;;47776:1;47640:373;;;;47784:1;47640:373;;;;47792:1;47640:373;;;;47800:1;47640:373;;;;47808:1;47640:373;;;;47816:1;47640:373;;;;47824:1;47640:373;;;;47832:1;47640:373;;;;47840:1;47640:373;;;;47848:1;47640:373;;;;47856:1;47640:373;;;;47864:1;47640:373;;;;47872:1;47640:373;;;;47880:1;47640:373;;;;47888:1;47640:373;;;;47896:1;47640:373;;;;47904:1;47640:373;;;;47912:1;47640:373;;;;47920:1;47640:373;;;;47928:2;47640:373;;;;47937:2;47640:373;;;;47946:2;47640:373;;;;47955:2;47640:373;;;;47964:2;47640:373;;;;47973:2;47640:373;;;;47982:2;47640:373;;;;47991:2;47640:373;;;;48000:2;47640:373;;;;48009:2;47640:373;;;;;48024:8;48047:7;48065;48083;48101;48130:18;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;48130:18:0;48161:28;48207:4;48192:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;48192:20:0;;;;;;;;;;;;;;;;;48161:51;;48230:7;48225:754;48248:4;48243:2;:9;48225:754;;;48289:1;48284:6;;48325:595;48376:5;48388;:12;48382:3;:18;;;;:::i;:::-;48376:25;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;48445:7:0;48453;48458:2;48376:25;48453:7;:::i;:::-;48445:16;;;;;;;:::i;:::-;;;;;48440:21;;48514:5;48530;:12;48521:3;48525:1;48521:5;;;;:::i;:::-;48520:22;;;;:::i;:::-;48514:29;;;;;;;;:::i;:::-;;;;;48571:78;;;;;;;;;48514:29;;;;;;-1:-1:-1;48571:78:0;48580:31;48603:3;48594:4;:2;48597:1;48594:4;:::i;:::-;48588:11;;:2;:11;:::i;:::-;48587:19;;;;:::i;:::-;48608:2;48580:6;:31::i;:::-;48571:78;;;;48613:31;48636:3;48627:4;:2;48630:1;48627:4;:::i;:::-;48621:11;;:2;:11;:::i;48613:31::-;48571:78;;;;;;;48566:83;-1:-1:-1;48686:8:0;48693:1;48686:8;;:::i;:::-;;-1:-1:-1;48731:4:0;;;;:::i;:::-;;;;48781:2;48776;:7;48825:5;48772:78;48887:31;48897:10;48909:2;48913:4;48887:9;:31::i;:::-;48325:595;;;48965:2;48948:10;48959:2;48948:14;;;;;;;;:::i;:::-;;;;;;:19;;;;48254:4;;;;;:::i;:::-;;;;48225:754;;;-1:-1:-1;48998:10:0;47522:1494;-1:-1:-1;;;;;;;;;;47522:1494:0:o;49948:1449::-;50145:52;;;;;;;;;;;;;;;;;-1:-1:-1;;;50145:52:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;50145:52:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;50145:52:0;;;;-1:-1:-1;;;50145:52:0;;;;;;;;;;;-1:-1:-1;;;50145:52:0;;;;50044:15;-1:-1:-1;;;50145:52:0;;;;50208:46;;;;;;;;;;;;;;-1:-1:-1;;;50208:46:0;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;50208:46:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;50208:46:0;;;;-1:-1:-1;;;50208:46:0;;;;;;;;;;;;-1:-1:-1;;;50208:46:0;;;;-1:-1:-1;;;50208:46:0;;;;50061:7;;50044:15;;;;50145:52;50061:7;50294:571;50317:4;50312:2;:9;50294:571;;;50358:407;50440:19;:2;50443;50440:6;;;;;;;;:::i;:::-;;;;;;;:8;;;:17;:19::i;:::-;50469;:2;50472;50469:6;;;;;;;;:::i;:::-;;;;;;;:8;;;:17;:19::i;:::-;50497;:2;50500;50497:6;;;;;;;;:::i;:::-;;;;;;;:8;;;:17;:19::i;:::-;50529:8;50539:6;50544:1;50539:2;:6;:::i;:::-;50538:10;;50547:1;50538:10;:::i;:::-;50529:20;;;;;;;:::i;:::-;;;;;50691:2;50694:6;50699:1;50694:2;:6;:::i;:::-;50691:10;;;;;;;:::i;:::-;;;;;50386:364;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;50386:364:0;;;;;;;;;50358:2;;:9;:407::i;:::-;50353:412;-1:-1:-1;50805:48:0;50815:2;50819:8;50828:1;50819:11;;;;50832:2;50836:4;50842:2;50846;50850;50805:9;:48::i;:::-;50794:59;-1:-1:-1;50794:59:0;-1:-1:-1;50323:4:0;;;;:::i;:::-;;;;50294:571;;;-1:-1:-1;51050:11:0;;;;;50900:326;;50890:337;;50900:326;;51050:11;50900:326;;:::i;:::-;;;;-1:-1:-1;;50900:326:0;;;;;;;;;50890:2;;:9;:337::i;:::-;50885:342;-1:-1:-1;51243:13:0;50885:342;51253:2;51243:9;:13::i;:::-;51238:18;;51272:35;51282:24;;;;;;-1:-1:-1;;;24498:19:1;;24542:1;24533:11;;24296:254;51272:35:0;51267:40;-1:-1:-1;51323:13:0;51267:40;51333:2;51323:9;:13::i;:::-;51318:18;;51352:37;51362:26;;;;;;-1:-1:-1;;;24757:21:1;;24803:1;24794:11;;24555:256;51352:37:0;51347:42;;50069:1328;;;;49948:1449;;;;;;:::o;36667:382::-;-1:-1:-1;;;;;36747:16:0;;36739:61;;;;-1:-1:-1;;;36739:61:0;;25018:2:1;36739:61:0;;;25000:21:1;;;25037:18;;;25030:30;25096:34;25076:18;;;25069:62;25148:18;;36739:61:0;24816:356:1;36739:61:0;34754:4;34778:16;;;:7;:16;;;;;;-1:-1:-1;;;;;34778:16:0;:30;36811:58;;;;-1:-1:-1;;;36811:58:0;;25379:2:1;36811:58:0;;;25361:21:1;25418:2;25398:18;;;25391:30;25457;25437:18;;;25430:58;25505:18;;36811:58:0;25177:352:1;36811:58:0;-1:-1:-1;;;;;36940:13:0;;;;;;:9;:13;;;;;:18;;36957:1;;36940:13;:18;;36957:1;;36940:18;:::i;:::-;;;;-1:-1:-1;;36969:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;36969:21:0;-1:-1:-1;;;;;36969:21:0;;;;;;;;37008:33;;36969:16;;;37008:33;;36969:16;;37008:33;36667:382;;:::o;46842:154::-;46898:4;46937:2;46932;:7;:46;;46958:3;46948:7;46953:2;46948;:7;:::i;:::-;:13;:29;;46975:2;46932:46;;46948:29;46964:8;46970:2;46964:3;:8;:::i;:::-;46932:46;;;-1:-1:-1;46942:2:0;46925:53;-1:-1:-1;46842:154:0:o;47004:506::-;47106:4;47137:10;:17;47158:1;47137:22;47133:76;;-1:-1:-1;47192:5:0;47185:12;;47133:76;47234:11;47229:241;47260:4;47251:6;:13;47229:241;;;47378:10;47389:6;47378:18;;;;;;;;:::i;:::-;;;;;;;:20;;;47371:2;:4;;;:27;;;;:::i;:::-;47304:64;47313:2;:4;;;47319:2;:4;;;47325:10;47336:6;47325:18;;;;;;;;:::i;:::-;;;;;;;:20;;;47347:10;47358:6;47347:18;;;;;;;;:::i;:::-;;;;;;;:20;;;47304:8;:64::i;:::-;:94;47300:159;;;47439:4;47432:11;;;;;47300:159;47266:8;;;;:::i;:::-;;;;47229:241;;;-1:-1:-1;47497:5:0;;47004:506;-1:-1:-1;;;;47004:506:0:o;49028:908::-;49176:12;49190:4;49217:7;49242;49237:656;49260:4;49255:2;:9;49237:656;;;49306:2;49300;:8;49296:586;;49347:48;49356:2;49359;49356:6;;;;;;;;:::i;:::-;;;;;;;:8;;;49366:2;49369;49366:6;;;;;;;;:::i;:::-;;;;;;;:8;;;49376:2;49379;49376:6;;;;;;;;:::i;:::-;;;;;;;:8;;;49386:2;49389;49386:6;;;;;;;;:::i;49347:48::-;49342:53;;49423:1;49418:2;:6;:17;;;;;49433:2;49428;:7;49418:17;49414:453;;;49477:4;;;;:::i;:::-;;;;49509:316;49605:19;:2;49608;49605:6;;;;;;;;:::i;:19::-;49634;:2;49637;49634:6;;;;;;;;:::i;:19::-;49663;:2;49666;49663:6;;;;;;;;:::i;:19::-;49692;:2;49695;49692:6;;;;;;;;:::i;:19::-;49726:2;49751;49754:14;49759:9;49754:2;:14;:::i;:::-;49751:18;;;;;;;:::i;:::-;;;;;49545:257;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;49545:257:0;;;;;;;;;49509:2;;:9;:316::i;:::-;49504:321;;49414:453;49266:4;;;;:::i;:::-;;;;49237:656;;;-1:-1:-1;49921:2:0;;49925;;-1:-1:-1;49028:908:0;;-1:-1:-1;;;;;;;49028:908:0:o;46407:241::-;46483:4;46510:6;46524:2;46519;:7;:27;;46539:7;46544:2;46539;:7;:::i;:::-;46519:27;;;46529:7;46534:2;46529;:7;:::i;:::-;46510:36;;46557:6;46571:2;46566;:7;:27;;46586:7;46591:2;46586;:7;:::i;:::-;46566:27;;;46576:7;46581:2;46576;:7;:::i;:::-;46557:36;-1:-1:-1;46611:19:0;46624:5;46557:36;;46624:5;:::i;:::-;46616;46620:1;;46616:5;:::i;:::-;:13;;;;:::i;:::-;46611:4;:19::i;:::-;46604:26;46407:241;-1:-1:-1;;;;;;;46407:241:0:o;46172:227::-;46216:6;;46264:1;46255:5;:1;46259;46255:5;:::i;:::-;46254:11;;;;:::i;:::-;46245:20;;46280:1;46276:5;;46292:90;46303:1;46299;:5;46292:90;;;46335:1;-1:-1:-1;46335:1:0;46369;46335;46356:5;46335:1;46356;:5;:::i;:::-;:9;;;;:::i;:::-;46355:15;;;;:::i;:::-;46351:19;;46292:90;;-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:250::-;677:1;687:113;701:6;698:1;695:13;687:113;;;777:11;;;771:18;758:11;;;751:39;723:2;716:10;687:113;;;-1:-1:-1;;834:1:1;816:16;;809:27;592:250::o;847:282::-;900:3;938:5;932:12;965:6;960:3;953:19;981:76;1050:6;1043:4;1038:3;1034:14;1027:4;1020:5;1016:16;981:76;:::i;:::-;1111:2;1090:15;-1:-1:-1;;1086:29:1;1077:39;;;;1118:4;1073:50;;847:282;-1:-1:-1;;847:282:1:o;1134:231::-;1283:2;1272:9;1265:21;1246:4;1303:56;1355:2;1344:9;1340:18;1332:6;1303:56;:::i;1370:180::-;1429:6;1482:2;1470:9;1461:7;1457:23;1453:32;1450:52;;;1498:1;1495;1488:12;1450:52;-1:-1:-1;1521:23:1;;1370:180;-1:-1:-1;1370:180:1:o;1763:173::-;1831:20;;-1:-1:-1;;;;;1880:31:1;;1870:42;;1860:70;;1926:1;1923;1916:12;1860:70;1763:173;;;:::o;1941:254::-;2009:6;2017;2070:2;2058:9;2049:7;2045:23;2041:32;2038:52;;;2086:1;2083;2076:12;2038:52;2109:29;2128:9;2109:29;:::i;:::-;2099:39;2185:2;2170:18;;;;2157:32;;-1:-1:-1;;;1941:254:1:o;2200:328::-;2277:6;2285;2293;2346:2;2334:9;2325:7;2321:23;2317:32;2314:52;;;2362:1;2359;2352:12;2314:52;2385:29;2404:9;2385:29;:::i;:::-;2375:39;;2433:38;2467:2;2456:9;2452:18;2433:38;:::i;:::-;2423:48;;2518:2;2507:9;2503:18;2490:32;2480:42;;2200:328;;;;;:::o;2533:700::-;2720:2;2772:21;;;2691:4;;2879:3;2864:19;;2745:18;;;2906:6;2691:4;2940:264;2954:4;2951:1;2948:11;2940:264;;;3045:2;3041:7;3029:9;3021:6;3017:22;3013:36;3008:3;3001:49;3073:51;3117:6;3108;3102:13;3073:51;:::i;:::-;3063:61;-1:-1:-1;3182:12:1;;;;3147:15;;;;2974:1;2967:9;2940:264;;;-1:-1:-1;3221:6:1;;2533:700;-1:-1:-1;;;;;;2533:700:1:o;3238:186::-;3297:6;3350:2;3338:9;3329:7;3325:23;3321:32;3318:52;;;3366:1;3363;3356:12;3318:52;3389:29;3408:9;3389:29;:::i;3611:347::-;3676:6;3684;3737:2;3725:9;3716:7;3712:23;3708:32;3705:52;;;3753:1;3750;3743:12;3705:52;3776:29;3795:9;3776:29;:::i;:::-;3766:39;;3855:2;3844:9;3840:18;3827:32;3902:5;3895:13;3888:21;3881:5;3878:32;3868:60;;3924:1;3921;3914:12;3868:60;3947:5;3937:15;;;3611:347;;;;;:::o;3963:127::-;4024:10;4019:3;4015:20;4012:1;4005:31;4055:4;4052:1;4045:15;4079:4;4076:1;4069:15;4095:1138;4190:6;4198;4206;4214;4267:3;4255:9;4246:7;4242:23;4238:33;4235:53;;;4284:1;4281;4274:12;4235:53;4307:29;4326:9;4307:29;:::i;:::-;4297:39;;4355:38;4389:2;4378:9;4374:18;4355:38;:::i;:::-;4345:48;;4440:2;4429:9;4425:18;4412:32;4402:42;;4495:2;4484:9;4480:18;4467:32;4518:18;4559:2;4551:6;4548:14;4545:34;;;4575:1;4572;4565:12;4545:34;4613:6;4602:9;4598:22;4588:32;;4658:7;4651:4;4647:2;4643:13;4639:27;4629:55;;4680:1;4677;4670:12;4629:55;4716:2;4703:16;4738:2;4734;4731:10;4728:36;;;4744:18;;:::i;:::-;4819:2;4813:9;4787:2;4873:13;;-1:-1:-1;;4869:22:1;;;4893:2;4865:31;4861:40;4849:53;;;4917:18;;;4937:22;;;4914:46;4911:72;;;4963:18;;:::i;:::-;5003:10;4999:2;4992:22;5038:2;5030:6;5023:18;5078:7;5073:2;5068;5064;5060:11;5056:20;5053:33;5050:53;;;5099:1;5096;5089:12;5050:53;5155:2;5150;5146;5142:11;5137:2;5129:6;5125:15;5112:46;5200:1;5195:2;5190;5182:6;5178:15;5174:24;5167:35;5221:6;5211:16;;;;;;;4095:1138;;;;;;;:::o;5238:260::-;5306:6;5314;5367:2;5355:9;5346:7;5342:23;5338:32;5335:52;;;5383:1;5380;5373:12;5335:52;5406:29;5425:9;5406:29;:::i;:::-;5396:39;;5454:38;5488:2;5477:9;5473:18;5454:38;:::i;:::-;5444:48;;5238:260;;;;;:::o;5503:380::-;5582:1;5578:12;;;;5625;;;5646:61;;5700:4;5692:6;5688:17;5678:27;;5646:61;5753:2;5745:6;5742:14;5722:18;5719:38;5716:161;;5799:10;5794:3;5790:20;5787:1;5780:31;5834:4;5831:1;5824:15;5862:4;5859:1;5852:15;7128:413;7330:2;7312:21;;;7369:2;7349:18;;;7342:30;7408:34;7403:2;7388:18;;7381:62;-1:-1:-1;;;7474:2:1;7459:18;;7452:47;7531:3;7516:19;;7128:413::o;7546:356::-;7748:2;7730:21;;;7767:18;;;7760:30;7826:34;7821:2;7806:18;;7799:62;7893:2;7878:18;;7546:356::o;7907:127::-;7968:10;7963:3;7959:20;7956:1;7949:31;7999:4;7996:1;7989:15;8023:4;8020:1;8013:15;8397:127;8458:10;8453:3;8449:20;8446:1;8439:31;8489:4;8486:1;8479:15;8513:4;8510:1;8503:15;8529:125;8594:9;;;8615:10;;;8612:36;;;8628:18;;:::i;8659:354::-;8861:2;8843:21;;;8900:2;8880:18;;;8873:30;8939:32;8934:2;8919:18;;8912:60;9004:2;8989:18;;8659:354::o;9018:184::-;9088:6;9141:2;9129:9;9120:7;9116:23;9112:32;9109:52;;;9157:1;9154;9147:12;9109:52;-1:-1:-1;9180:16:1;;9018:184;-1:-1:-1;9018:184:1:o;9631:135::-;9670:3;9691:17;;;9688:43;;9711:18;;:::i;:::-;-1:-1:-1;9758:1:1;9747:13;;9631:135::o;11292:198::-;11334:3;11372:5;11366:12;11387:65;11445:6;11440:3;11433:4;11426:5;11422:16;11387:65;:::i;:::-;11468:16;;;;;11292:198;-1:-1:-1;;11292:198:1:o;11495:869::-;11906:66;11901:3;11894:79;11876:3;12002:6;11996:13;12018:75;12086:6;12081:2;12076:3;12072:12;12065:4;12057:6;12053:17;12018:75;:::i;:::-;12153:13;;12112:16;;;;12175:76;12153:13;12237:2;12229:11;;12222:4;12210:17;;12175:76;:::i;:::-;-1:-1:-1;;;12311:2:1;12270:17;;;;12303:11;;;12296:35;12355:2;12347:11;;11495:869;-1:-1:-1;;;;11495:869:1:o;12369:461::-;12631:31;12626:3;12619:44;12601:3;12692:6;12686:13;12708:75;12776:6;12771:2;12766:3;12762:12;12755:4;12747:6;12743:17;12708:75;:::i;:::-;12803:16;;;;12821:2;12799:25;;12369:461;-1:-1:-1;;12369:461:1:o;13196:168::-;13269:9;;;13300;;13317:15;;;13311:22;;13297:37;13287:71;;13338:18;;:::i;15352:128::-;15419:9;;;15440:11;;;15437:37;;;15454:18;;:::i;15672:127::-;15733:10;15728:3;15724:20;15721:1;15714:31;15764:4;15761:1;15754:15;15788:4;15785:1;15778:15;15804:112;15836:1;15862;15852:35;;15867:18;;:::i;:::-;-1:-1:-1;15901:9:1;;15804:112::o;16329:414::-;16531:2;16513:21;;;16570:2;16550:18;;;16543:30;16609:34;16604:2;16589:18;;16582:62;-1:-1:-1;;;16675:2:1;16660:18;;16653:48;16733:3;16718:19;;16329:414::o;16748:120::-;16788:1;16814;16804:35;;16819:18;;:::i;:::-;-1:-1:-1;16853:9:1;;16748:120::o;17518:2053::-;18376:66;18371:3;18364:79;18482:38;18477:3;18473:48;18468:2;18463:3;18459:12;18452:70;18346:3;18551:6;18545:13;18567:73;18633:6;18628:2;18623:3;18619:12;18614:2;18606:6;18602:15;18567:73;:::i;:::-;18704:66;18699:2;18659:16;;;18691:11;;;18684:87;-1:-1:-1;;;18795:2:1;18787:11;;18780:51;18856:13;;18878:74;18856:13;18938:2;18930:11;;18925:2;18913:15;;18878:74;:::i;:::-;19017:66;19012:2;18971:17;;;;19004:11;;;18997:87;-1:-1:-1;;;19155:3:1;19147:12;;19140:24;;;19189:13;;19211:75;19189:13;19271:3;19263:12;;19258:2;19246:15;;19211:75;:::i;:::-;19352:66;19346:3;19305:17;;;;19338:12;;;19331:88;19443:3;19435:12;;19428:24;19468:97;19494:70;19524:39;19558:3;19550:12;;19542:6;19524:39;:::i;:::-;17371:66;17359:79;;-1:-1:-1;;;17463:2:1;17454:12;;17447:32;17504:2;17495:12;;17294:219;19494:70;19486:6;19468:97;:::i;:::-;19461:104;17518:2053;-1:-1:-1;;;;;;;;17518:2053:1:o;19576:500::-;-1:-1:-1;;;;;19845:15:1;;;19827:34;;19897:15;;19892:2;19877:18;;19870:43;19944:2;19929:18;;19922:34;;;19992:3;19987:2;19972:18;;19965:31;;;19770:4;;20013:57;;20050:19;;20042:6;20013:57;:::i;:::-;20005:65;19576:500;-1:-1:-1;;;;;;19576:500:1:o;20081:249::-;20150:6;20203:2;20191:9;20182:7;20178:23;20174:32;20171:52;;;20219:1;20216;20209:12;20171:52;20251:9;20245:16;20270:30;20294:5;20270:30;:::i;20518:2330::-;-1:-1:-1;;;21465:49:1;;21537:13;;21447:3;;21559:75;21537:13;21622:2;21613:12;;21606:4;21594:17;;21559:75;:::i;:::-;-1:-1:-1;;;21693:2:1;21653:16;;;21685:11;;;21678:45;21748:13;;21770:76;21748:13;21832:2;21824:11;;21817:4;21805:17;;21770:76;:::i;:::-;-1:-1:-1;;;21906:2:1;21865:17;;;;21898:11;;;21891:43;21959:13;;21981:76;21959:13;22043:2;22035:11;;22028:4;22016:17;;21981:76;:::i;:::-;-1:-1:-1;;;22117:2:1;22076:17;;;;22109:11;;;22102:49;22176:13;;22198:76;22176:13;22260:2;22252:11;;22245:4;22233:17;;22198:76;:::i;:::-;22339:66;22334:2;22293:17;;;;22326:11;;;22319:87;22435:66;22430:2;22422:11;;22415:87;22531:66;22526:2;22518:11;;22511:87;22628:66;22622:3;22614:12;;22607:88;-1:-1:-1;;;22719:3:1;22711:12;;22704:52;22772:70;22802:39;22836:3;22828:12;;22820:6;22802:39;:::i;:::-;20412:66;20400:79;;20504:2;20495:12;;20335:178;22853:1438;23216:66;23211:3;23204:79;23313:66;23308:2;23303:3;23299:12;23292:88;23410:66;23405:2;23400:3;23396:12;23389:88;23507:66;23502:2;23497:3;23493:12;23486:88;23614:2;23609:3;23605:12;23599:3;23594;23590:13;23583:35;23186:3;23647:6;23641:13;23663:74;23730:6;23724:3;23719;23715:13;23710:2;23702:6;23698:15;23663:74;:::i;:::-;23802:66;23796:3;23756:16;;;;23788:12;;;23781:88;-1:-1:-1;23899:66:1;23893:3;23885:12;;23878:88;23996:66;23990:3;23982:12;;23975:88;24093:66;24087:3;24079:12;;24072:88;24190:66;24184:3;24176:12;;24169:88;24281:3;24273:12;;22853:1438;-1:-1:-1;22853:1438:1:o;25832:2257::-;-1:-1:-1;;;26928:45:1;;26996:13;;26910:3;;27018:75;26996:13;27081:2;27072:12;;27065:4;27053:17;;27018:75;:::i;:::-;-1:-1:-1;;;27152:2:1;27112:16;;;27144:11;;;27137:45;27207:13;;27229:76;27207:13;27291:2;27283:11;;27276:4;27264:17;;27229:76;:::i;:::-;-1:-1:-1;;;27365:2:1;27324:17;;;;27357:11;;;27350:45;27420:13;;27442:76;27420:13;27504:2;27496:11;;27489:4;27477:17;;27442:76;:::i;:::-;-1:-1:-1;;;27578:2:1;27537:17;;;;27570:11;;;27563:45;27633:13;;27655:76;27633:13;27717:2;27709:11;;27702:4;27690:17;;27655:76;:::i;:::-;-1:-1:-1;;;27791:2:1;27750:17;;;;27783:11;;;27776:53;27854:13;;27876:76;27854:13;27938:2;27930:11;;27923:4;27911:17;;27876:76;:::i;:::-;27968:115;27998:84;28024:57;28077:2;28066:8;28062:2;28058:17;28054:26;-1:-1:-1;;;25599:61:1;;25685:2;25676:12;;25534:160;28024:57;28016:6;27998:84;:::i;:::-;-1:-1:-1;;;25764:30:1;;25819:1;25810:11;;25699:128;27968:115;27961:122;25832:2257;-1:-1:-1;;;;;;;;;;25832:2257:1:o

Swarm Source

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