ERC-1155
Overview
Max Total Supply
10,000 NFL
Holders
37
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
NFL_ERCND_404
Compiler Version
v0.8.24+commit.e11b9ed9
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-02-12 */ /** *Submitted for verification at Etherscan.io on 2024-02-12 */ /* We are not actually the real DN404 protocol; we waited all day for DN404 to launch, but it never happened. Now I am bored, watching the Super Bowl, so I launched this token. Let's watch it together. */ //Inspired by all the great work out there from ERC20, 404, 721, 721a, 721Psi, 1155, 1155Delta // SPDX-License-Identifier: MIT pragma solidity 0.8.24; abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } /** * @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. * * The initial owner is set to the address provided by the deployer. 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; /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ constructor(address initialOwner) { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } interface IERC20 { event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function transfer(address to, uint256 value) external returns (bool); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 value) external returns (bool); function transferFrom(address from, address to, uint256 value) external returns (bool); } interface IERC20Metadata is IERC20 { function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint8); } interface IERC20Errors { error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed); error ERC20InvalidSender(address sender); error ERC20InvalidReceiver(address receiver); error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed); error ERC20InvalidApprover(address approver); error ERC20InvalidSpender(address spender); } /** * @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); } } } } /** * @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); } } interface IERCX { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * Cannot burn from the zero address. */ error BurnFromZeroAddress(); /** * Cannot burn from the address that doesn't owne the token. */ error BurnFromNonOnwerAddress(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from` or the `amount` is not 1. */ error TransferFromIncorrectOwnerOrInvalidAmount(); /** * Cannot safely transfer to a contract that does not implement the * ERC1155Receiver interface. */ error TransferToNonERC1155ReceiverImplementer(); error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The length of input arraies is not matching. */ error InputLengthMistmatch(); function isOwnerOf(address account, uint256 id) external view returns(bool); } /** * @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); } /** * @dev Interface that must be implemented by smart contracts in order to receive * ERC-1155 token transfers. */ interface IERC1155Receiver is IERC165 { /** * @dev Handles the receipt of a single ERC1155 token type. This function is * called at the end of a `safeTransferFrom` after the balance has been updated. * * NOTE: To accept the transfer, this must return * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` * (i.e. 0xf23a6e61, or its own function selector). * * @param operator The address which initiated the transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param id The ID of the token being transferred * @param value The amount of tokens being transferred * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns (bytes4); /** * @dev Handles the receipt of a multiple ERC1155 token types. This function * is called at the end of a `safeBatchTransferFrom` after the balances have * been updated. * * NOTE: To accept the transfer(s), this must return * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` * (i.e. 0xbc197c81, or its own function selector). * * @param operator The address which initiated the batch transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param ids An array containing ids of each token being transferred (order and length must match values array) * @param values An array containing amounts of each token being transferred (order and length must match ids array) * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4); } abstract contract ERC721Receiver { function onERC721Received( address, address, uint256, bytes calldata ) external virtual returns (bytes4) { return ERC721Receiver.onERC721Received.selector; } } /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155 is IERC165 { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes calldata data ) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) external; } /** * @dev Interface of the optional ERC1155MetadataExtension interface, as defined * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP]. * * _Available since v3.1._ */ interface IERC1155MetadataURI is IERC1155 { /** * @dev Returns the URI for token type `id`. * * If the `\{id\}` substring is present in the URI, it must be replaced by * clients with the actual token type ID. */ function uri(uint256 id) external view returns (string memory); } /** * @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; } } /// @notice Library for bit twiddling and boolean operations. /// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/LibBit.sol) /// @author Inspired by (https://graphics.stanford.edu/~seander/bithacks.html) library LibBit { /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* BIT TWIDDLING OPERATIONS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Find last set. /// Returns the index of the most significant bit of `x`, /// counting from the least significant bit position. /// If `x` is zero, returns 256. function fls(uint256 x) internal pure returns (uint256 r) { /// @solidity memory-safe-assembly assembly { r := or(shl(8, iszero(x)), shl(7, lt(0xffffffffffffffffffffffffffffffff, x))) r := or(r, shl(6, lt(0xffffffffffffffff, shr(r, x)))) r := or(r, shl(5, lt(0xffffffff, shr(r, x)))) r := or(r, shl(4, lt(0xffff, shr(r, x)))) r := or(r, shl(3, lt(0xff, shr(r, x)))) // forgefmt: disable-next-item r := or(r, byte(and(0x1f, shr(shr(r, x), 0x8421084210842108cc6318c6db6d54be)), 0x0706060506020504060203020504030106050205030304010505030400000000)) } } /// @dev Count leading zeros. /// Returns the number of zeros preceding the most significant one bit. /// If `x` is zero, returns 256. function clz(uint256 x) internal pure returns (uint256 r) { /// @solidity memory-safe-assembly assembly { r := shl(7, lt(0xffffffffffffffffffffffffffffffff, x)) r := or(r, shl(6, lt(0xffffffffffffffff, shr(r, x)))) r := or(r, shl(5, lt(0xffffffff, shr(r, x)))) r := or(r, shl(4, lt(0xffff, shr(r, x)))) r := or(r, shl(3, lt(0xff, shr(r, x)))) // forgefmt: disable-next-item r := add(xor(r, byte(and(0x1f, shr(shr(r, x), 0x8421084210842108cc6318c6db6d54be)), 0xf8f9f9faf9fdfafbf9fdfcfdfafbfcfef9fafdfafcfcfbfefafafcfbffffffff)), iszero(x)) } } /// @dev Find first set. /// Returns the index of the least significant bit of `x`, /// counting from the least significant bit position. /// If `x` is zero, returns 256. /// Equivalent to `ctz` (count trailing zeros), which gives /// the number of zeros following the least significant one bit. function ffs(uint256 x) internal pure returns (uint256 r) { /// @solidity memory-safe-assembly assembly { // Isolate the least significant bit. let b := and(x, add(not(x), 1)) r := or(shl(8, iszero(x)), shl(7, lt(0xffffffffffffffffffffffffffffffff, b))) r := or(r, shl(6, lt(0xffffffffffffffff, shr(r, b)))) r := or(r, shl(5, lt(0xffffffff, shr(r, b)))) // For the remaining 32 bits, use a De Bruijn lookup. // forgefmt: disable-next-item r := or(r, byte(and(div(0xd76453e0, shr(r, b)), 0x1f), 0x001f0d1e100c1d070f090b19131c1706010e11080a1a141802121b1503160405)) } } /// @dev Returns the number of set bits in `x`. function popCount(uint256 x) internal pure returns (uint256 c) { /// @solidity memory-safe-assembly assembly { let max := not(0) let isMax := eq(x, max) x := sub(x, and(shr(1, x), div(max, 3))) x := add(and(x, div(max, 5)), and(shr(2, x), div(max, 5))) x := and(add(x, shr(4, x)), div(max, 17)) c := or(shl(8, isMax), shr(248, mul(x, div(max, 255)))) } } /// @dev Returns whether `x` is a power of 2. function isPo2(uint256 x) internal pure returns (bool result) { /// @solidity memory-safe-assembly assembly { // Equivalent to `x && !(x & (x - 1))`. result := iszero(add(and(x, sub(x, 1)), iszero(x))) } } /// @dev Returns `x` reversed at the bit level. function reverseBits(uint256 x) internal pure returns (uint256 r) { uint256 m0 = 0x0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f0f; uint256 m1 = m0 ^ (m0 << 2); uint256 m2 = m1 ^ (m1 << 1); r = reverseBytes(x); r = (m2 & (r >> 1)) | ((m2 & r) << 1); r = (m1 & (r >> 2)) | ((m1 & r) << 2); r = (m0 & (r >> 4)) | ((m0 & r) << 4); } /// @dev Returns `x` reversed at the byte level. function reverseBytes(uint256 x) internal pure returns (uint256 r) { unchecked { // Computing masks on-the-fly reduces bytecode size by about 200 bytes. uint256 m0 = 0x100000000000000000000000000000001 * (~toUint(x == 0) >> 192); uint256 m1 = m0 ^ (m0 << 32); uint256 m2 = m1 ^ (m1 << 16); uint256 m3 = m2 ^ (m2 << 8); r = (m3 & (x >> 8)) | ((m3 & x) << 8); r = (m2 & (r >> 16)) | ((m2 & r) << 16); r = (m1 & (r >> 32)) | ((m1 & r) << 32); r = (m0 & (r >> 64)) | ((m0 & r) << 64); r = (r >> 128) | (r << 128); } } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* BOOLEAN OPERATIONS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ // A Solidity bool on the stack or memory is represented as a 256-bit word. // Non-zero values are true, zero is false. // A clean bool is either 0 (false) or 1 (true) under the hood. // Usually, if not always, the bool result of a regular Solidity expression, // or the argument of a public/external function will be a clean bool. // You can usually use the raw variants for more performance. // If uncertain, test (best with exact compiler settings). // Or use the non-raw variants (compiler can sometimes optimize out the double `iszero`s). /// @dev Returns `x & y`. Inputs must be clean. function rawAnd(bool x, bool y) internal pure returns (bool z) { /// @solidity memory-safe-assembly assembly { z := and(x, y) } } /// @dev Returns `x & y`. function and(bool x, bool y) internal pure returns (bool z) { /// @solidity memory-safe-assembly assembly { z := and(iszero(iszero(x)), iszero(iszero(y))) } } /// @dev Returns `x | y`. Inputs must be clean. function rawOr(bool x, bool y) internal pure returns (bool z) { /// @solidity memory-safe-assembly assembly { z := or(x, y) } } /// @dev Returns `x | y`. function or(bool x, bool y) internal pure returns (bool z) { /// @solidity memory-safe-assembly assembly { z := or(iszero(iszero(x)), iszero(iszero(y))) } } /// @dev Returns 1 if `b` is true, else 0. Input must be clean. function rawToUint(bool b) internal pure returns (uint256 z) { /// @solidity memory-safe-assembly assembly { z := b } } /// @dev Returns 1 if `b` is true, else 0. function toUint(bool b) internal pure returns (uint256 z) { /// @solidity memory-safe-assembly assembly { z := iszero(iszero(b)) } } } /// @notice Library for storage of packed unsigned booleans. /// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/LibBitmap.sol) /// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/LibBitmap.sol) /// @author Modified from Solidity-Bits (https://github.com/estarriolvetch/solidity-bits/blob/main/contracts/BitMaps.sol) library LibBitmap { /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* CONSTANTS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev The constant returned when a bitmap scan does not find a result. uint256 internal constant NOT_FOUND = type(uint256).max; /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* STRUCTS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev A bitmap in storage. struct Bitmap { mapping(uint256 => uint256) map; } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* OPERATIONS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Returns the boolean value of the bit at `index` in `bitmap`. function get(Bitmap storage bitmap, uint256 index) internal view returns (bool isSet) { // It is better to set `isSet` to either 0 or 1, than zero vs non-zero. // Both cost the same amount of gas, but the former allows the returned value // to be reused without cleaning the upper bits. uint256 b = (bitmap.map[index >> 8] >> (index & 0xff)) & 1; /// @solidity memory-safe-assembly assembly { isSet := b } } /// @dev Updates the bit at `index` in `bitmap` to true. function set(Bitmap storage bitmap, uint256 index) internal { bitmap.map[index >> 8] |= (1 << (index & 0xff)); } /// @dev Updates the bit at `index` in `bitmap` to false. function unset(Bitmap storage bitmap, uint256 index) internal { bitmap.map[index >> 8] &= ~(1 << (index & 0xff)); } /// @dev Flips the bit at `index` in `bitmap`. /// Returns the boolean result of the flipped bit. function toggle(Bitmap storage bitmap, uint256 index) internal returns (bool newIsSet) { /// @solidity memory-safe-assembly assembly { mstore(0x20, bitmap.slot) mstore(0x00, shr(8, index)) let storageSlot := keccak256(0x00, 0x40) let shift := and(index, 0xff) let storageValue := xor(sload(storageSlot), shl(shift, 1)) // It makes sense to return the `newIsSet`, // as it allow us to skip an additional warm `sload`, // and it costs minimal gas (about 15), // which may be optimized away if the returned value is unused. newIsSet := and(1, shr(shift, storageValue)) sstore(storageSlot, storageValue) } } /// @dev Updates the bit at `index` in `bitmap` to `shouldSet`. function setTo(Bitmap storage bitmap, uint256 index, bool shouldSet) internal { /// @solidity memory-safe-assembly assembly { mstore(0x20, bitmap.slot) mstore(0x00, shr(8, index)) let storageSlot := keccak256(0x00, 0x40) let storageValue := sload(storageSlot) let shift := and(index, 0xff) sstore( storageSlot, // Unsets the bit at `shift` via `and`, then sets its new value via `or`. or(and(storageValue, not(shl(shift, 1))), shl(shift, iszero(iszero(shouldSet)))) ) } } /// @dev Consecutively sets `amount` of bits starting from the bit at `start`. function setBatch(Bitmap storage bitmap, uint256 start, uint256 amount) internal { /// @solidity memory-safe-assembly assembly { let max := not(0) let shift := and(start, 0xff) mstore(0x20, bitmap.slot) mstore(0x00, shr(8, start)) if iszero(lt(add(shift, amount), 257)) { let storageSlot := keccak256(0x00, 0x40) sstore(storageSlot, or(sload(storageSlot), shl(shift, max))) let bucket := add(mload(0x00), 1) let bucketEnd := add(mload(0x00), shr(8, add(amount, shift))) amount := and(add(amount, shift), 0xff) shift := 0 for {} iszero(eq(bucket, bucketEnd)) { bucket := add(bucket, 1) } { mstore(0x00, bucket) sstore(keccak256(0x00, 0x40), max) } mstore(0x00, bucket) } let storageSlot := keccak256(0x00, 0x40) sstore(storageSlot, or(sload(storageSlot), shl(shift, shr(sub(256, amount), max)))) } } /// @dev Consecutively unsets `amount` of bits starting from the bit at `start`. function unsetBatch(Bitmap storage bitmap, uint256 start, uint256 amount) internal { /// @solidity memory-safe-assembly assembly { let shift := and(start, 0xff) mstore(0x20, bitmap.slot) mstore(0x00, shr(8, start)) if iszero(lt(add(shift, amount), 257)) { let storageSlot := keccak256(0x00, 0x40) sstore(storageSlot, and(sload(storageSlot), not(shl(shift, not(0))))) let bucket := add(mload(0x00), 1) let bucketEnd := add(mload(0x00), shr(8, add(amount, shift))) amount := and(add(amount, shift), 0xff) shift := 0 for {} iszero(eq(bucket, bucketEnd)) { bucket := add(bucket, 1) } { mstore(0x00, bucket) sstore(keccak256(0x00, 0x40), 0) } mstore(0x00, bucket) } let storageSlot := keccak256(0x00, 0x40) sstore( storageSlot, and(sload(storageSlot), not(shl(shift, shr(sub(256, amount), not(0))))) ) } } /// @dev Returns number of set bits within a range by /// scanning `amount` of bits starting from the bit at `start`. function popCount(Bitmap storage bitmap, uint256 start, uint256 amount) internal view returns (uint256 count) { unchecked { uint256 bucket = start >> 8; uint256 shift = start & 0xff; if (!(amount + shift < 257)) { count = LibBit.popCount(bitmap.map[bucket] >> shift); uint256 bucketEnd = bucket + ((amount + shift) >> 8); amount = (amount + shift) & 0xff; shift = 0; for (++bucket; bucket != bucketEnd; ++bucket) { count += LibBit.popCount(bitmap.map[bucket]); } } count += LibBit.popCount((bitmap.map[bucket] >> shift) << (256 - amount)); } } /// @dev Returns the index of the most significant set bit before the bit at `before`. /// If no set bit is found, returns `NOT_FOUND`. function findLastSet(Bitmap storage bitmap, uint256 before) internal view returns (uint256 setBitIndex) { uint256 bucket; uint256 bucketBits; /// @solidity memory-safe-assembly assembly { setBitIndex := not(0) bucket := shr(8, before) mstore(0x00, bucket) mstore(0x20, bitmap.slot) let offset := and(0xff, not(before)) // `256 - (255 & before) - 1`. bucketBits := shr(offset, shl(offset, sload(keccak256(0x00, 0x40)))) if iszero(or(bucketBits, iszero(bucket))) { for {} 1 {} { bucket := add(bucket, setBitIndex) // `sub(bucket, 1)`. mstore(0x00, bucket) bucketBits := sload(keccak256(0x00, 0x40)) if or(bucketBits, iszero(bucket)) { break } } } } if (bucketBits != 0) { setBitIndex = (bucket << 8) | LibBit.fls(bucketBits); /// @solidity memory-safe-assembly assembly { setBitIndex := or(setBitIndex, sub(0, gt(setBitIndex, before))) } } } } contract ERCX is Context, ERC165, IERC1155, IERC1155MetadataURI, IERCX, IERC20Metadata, IERC20Errors, Ownable { using Address for address; using LibBitmap for LibBitmap.Bitmap; error InvalidQueryRange(); // The mask of the lower 160 bits for addresses. uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1; // The `Transfer` event signature is given by: // `keccak256(bytes("Transfer(address,address,uint256)"))`. bytes32 private constant _TRANSFER_EVENT_SIGNATURE = 0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef; // Mapping from accout to owned tokens mapping(address => LibBitmap.Bitmap) internal _owned; // Mapping from account to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json string private _uri; // The next token ID to be minted. uint256 private _currentIndex; // NFT Approval mapping(uint256 => address) public getApproved; //Token balances mapping(address => uint256) internal _balances; //Token allowances mapping(address account => mapping(address spender => uint256)) private _allowances; // Token name string public name; // Token symbol string public symbol; // Decimals for supply uint8 public immutable decimals; // Total ERC20 supply uint256 public immutable totalSupply; // Tokens Per NFT uint256 public immutable decimalFactor; uint256 public immutable tokensPerNFT; // Don't mint for these wallets mapping(address => bool) public whitelist; // Easy Launch - auto-whitelist first transfer which is probably the LP uint256 public easyLaunch = 1; /** * @dev See {_setURI}. */ constructor(string memory uri_, string memory _name, string memory _symbol, uint8 _decimals, uint256 _totalNativeSupply, uint256 _tokensPerNFT) Ownable(msg.sender) { _setURI(uri_); _currentIndex = _startTokenId(); name = _name; symbol = _symbol; decimals = _decimals; decimalFactor = 10 ** decimals; tokensPerNFT = _tokensPerNFT * decimalFactor; totalSupply = _totalNativeSupply * decimalFactor; whitelist[msg.sender] = true; _balances[msg.sender] = totalSupply; emit Transfer(address(0), msg.sender, totalSupply); } /** @notice Initialization function to set pairs / etc * saving gas by avoiding mint / burn on unnecessary targets */ function setWhitelist(address target, bool state) public virtual onlyOwner { whitelist[target] = state; } /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal pure virtual returns (uint256) { return 1; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view returns (uint256) { return _currentIndex; } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { return _nextTokenId() - _startTokenId(); } /** * @dev Returns true if the account owns the `id` token. */ function isOwnerOf(address account, uint256 id) public view virtual override returns(bool) { return _owned[account].get(id); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC1155).interfaceId || interfaceId == type(IERC1155MetadataURI).interfaceId || interfaceId == type(IERCX).interfaceId || interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f || // ERC165 interface ID for ERC721Metadata. super.supportsInterface(interfaceId); } /** * @dev See {IERC1155MetadataURI-uri}. * * This implementation returns the same URI for *all* token types. It relies * on the token type ID substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * Clients calling this function must replace the `\{id\}` substring with the * actual token type ID. */ function uri(uint256) public view virtual override returns (string memory) { return _uri; } /** * @dev Returns the number of tokens owned by `owner`. */ function balanceOf(address owner) public view virtual returns (uint256) { return _balances[owner]; } /** * @dev Returns the number of nfts owned by `owner`, * in the range [`start`, `stop`) * (i.e. `start <= tokenId < stop`). * * Requirements: * * - `start < stop` */ function balanceOf(address owner, uint256 start, uint256 stop) public view virtual returns (uint256) { return _owned[owner].popCount(start, stop - start); } /** * @dev See {IERC1155-balanceOf}. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) public view virtual override returns (uint256) { if(account == address(0)) { revert BalanceQueryForZeroAddress(); } if(_owned[account].get(id)) { return 1; } else { return 0; } } /** * @dev See {IERC1155-balanceOfBatch}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] memory accounts, uint256[] memory ids) public view virtual override returns (uint256[] memory) { if(accounts.length != ids.length) { revert InputLengthMistmatch(); } uint256[] memory batchBalances = new uint256[](accounts.length); for (uint256 i = 0; i < accounts.length; ++i) { batchBalances[i] = balanceOf(accounts[i], ids[i]); } return batchBalances; } /** * @dev See {IERC1155-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC1155-isApprovedForAll}. */ function isApprovedForAll(address account, address operator) public view virtual override returns (bool) { return _operatorApprovals[account][operator]; } /** * @dev See {IERC1155-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) public virtual override { if(from == _msgSender() || isApprovedForAll(from, _msgSender())){ _safeTransferFrom(from, to, id, amount, data, true); } else { revert TransferCallerNotOwnerNorApproved(); } } /** * @dev See {IERC1155-safeBatchTransferFrom}. */ function safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) public virtual override { if(!(from == _msgSender() || isApprovedForAll(from, _msgSender()))) { revert TransferCallerNotOwnerNorApproved(); } _safeBatchTransferFrom(from, to, ids, amounts, data); } /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - `amount` cannot be zero. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data, bool check ) internal virtual { if(to == address(0)) { revert TransferToZeroAddress(); } address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); _beforeTokenTransfer(operator, from, to, ids); if(amount == 1 && _owned[from].get(id)) { _owned[from].unset(id); _owned[to].set(id); _transfer(from, to, tokensPerNFT, false); } else { revert TransferFromIncorrectOwnerOrInvalidAmount(); } uint256 toMasked; uint256 fromMasked; assembly { // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. toMasked := and(to, _BITMASK_ADDRESS) fromMasked := and(from, _BITMASK_ADDRESS) // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. fromMasked, // `from`. toMasked, // `to`. amount // `tokenId`. ) } emit TransferSingle(operator, from, to, id, amount); _afterTokenTransfer(operator, from, to, ids); if(check) _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { if(ids.length != amounts.length) { revert InputLengthMistmatch(); } if(to == address(0)) { revert TransferToZeroAddress(); } address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, ids); for (uint256 i = 0; i < ids.length; ++i) { uint256 id = ids[i]; uint256 amount = amounts[i]; if(amount == 1 && _owned[from].get(id)) { _owned[from].unset(id); _owned[to].set(id); } else { revert TransferFromIncorrectOwnerOrInvalidAmount(); } } _transfer(from, to, tokensPerNFT * ids.length, false); uint256 toMasked; uint256 fromMasked; uint256 end = ids.length + 1; // Use assembly to loop and emit the `Transfer` event for gas savings. // The duplicated `log4` removes an extra check and reduces stack juggling. // The assembly, together with the surrounding Solidity code, have been // delicately arranged to nudge the compiler into producing optimized opcodes. assembly { // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean. fromMasked := and(from, _BITMASK_ADDRESS) toMasked := and(to, _BITMASK_ADDRESS) // Emit the `Transfer` event. log4( 0, // Start of data (0, since no data). 0, // End of data (0, since no data). _TRANSFER_EVENT_SIGNATURE, // Signature. fromMasked, // `from`. toMasked, // `to`. mload(add(ids, 0x20)) // `tokenId`. ) // The `iszero(eq(,))` check ensures that large values of `quantity` // that overflows uint256 will make the loop run out of gas. // The compiler will optimize the `iszero` away for performance. for { let arrayId := 2 } iszero(eq(arrayId, end)) { arrayId := add(arrayId, 1) } { // Emit the `Transfer` event. Similar to above. log4(0, 0, _TRANSFER_EVENT_SIGNATURE, fromMasked, toMasked, mload(add(ids, mul(0x20, arrayId)))) } } emit TransferBatch(operator, from, to, ids, amounts); _afterTokenTransfer(operator, from, to, ids); _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data); } /** * @dev Sets a new URI for all token types, by relying on the token type ID * substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * By this mechanism, any occurrence of the `\{id\}` substring in either the * URI or any of the amounts in the JSON file at said URI will be replaced by * clients with the token type ID. * * For example, the `https://token-cdn-domain/\{id\}.json` URI would be * interpreted by clients as * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json` * for token type ID 0x4cce0. * * See {uri}. * * Because these URIs cannot be meaningfully represented by the {URI} event, * this function emits no events. */ function _setURI(string memory newuri) internal virtual { _uri = newuri; } function _mint( address to, uint256 amount ) internal virtual { _mint(to, amount, ""); } /** * @dev Creates `amount` tokens, and assigns them to `to`. * * Emits a {TransferBatch} event. * * Requirements: * * - `to` cannot be the zero address. * - `amount` cannot be zero. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _mint( address to, uint256 amount, bytes memory data ) internal virtual { (uint256[] memory ids, uint256[] memory amounts) = _mintWithoutCheck(to, amount); uint256 end = _currentIndex; _doSafeBatchTransferAcceptanceCheck(_msgSender(), address(0), to, ids, amounts, data); if (_currentIndex != end) revert(); } function _mintWithoutCheck( address to, uint256 amount ) internal virtual returns(uint256[] memory ids, uint256[] memory amounts) { if(to == address(0)) { revert MintToZeroAddress(); } if(amount == 0) { revert MintZeroQuantity(); } address operator = _msgSender(); ids = new uint256[](amount); amounts = new uint256[](amount); uint256 startTokenId = _nextTokenId(); unchecked { require(type(uint256).max - amount >= startTokenId); for(uint256 i = 0; i < amount; i++) { ids[i] = startTokenId + i; amounts[i] = 1; } } _beforeTokenTransfer(operator, address(0), to, ids); _owned[to].setBatch(startTokenId, amount); _currentIndex += amount; uint256 toMasked; uint256 end = startTokenId + amount; assembly { toMasked := and(to, _BITMASK_ADDRESS) log4( 0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, startTokenId ) for { let tokenId := add(startTokenId, 1) } iszero(eq(tokenId, end)) { tokenId := add(tokenId, 1) } { log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId) } } emit TransferBatch(operator, address(0), to, ids, amounts); _afterTokenTransfer(operator, address(0), to, ids); } /** * @dev Destroys token of token type `id` from `from` * * Emits a {TransferSingle} event. * * Requirements: * * - `from` cannot be the zero address. * - `from` must have the token of token type `id`. */ function _burn( address from, uint256 id ) internal virtual { if(from == address(0)){ revert BurnFromZeroAddress(); } address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); _beforeTokenTransfer(operator, from, address(0), ids); if(!_owned[from].get(id)) { revert BurnFromNonOnwerAddress(); } _owned[from].unset(id); uint256 fromMasked; assembly { fromMasked := and(from, _BITMASK_ADDRESS) log4( 0, 0, _TRANSFER_EVENT_SIGNATURE, fromMasked, 0, id ) } emit TransferSingle(operator, from, address(0), id, 1); _afterTokenTransfer(operator, from, address(0), ids); } /** * @dev Destroys tokens of token types in `ids` from `from` * * Emits a {TransferBatch} event. * * Requirements: * * - `from` cannot be the zero address. * - `from` must have the token of token types in `ids`. */ function _burnBatch( address from, uint256[] memory ids ) internal virtual { if(from == address(0)){ revert BurnFromZeroAddress(); } address operator = _msgSender(); uint256[] memory amounts = new uint256[](ids.length); _beforeTokenTransfer(operator, from, address(0), ids); unchecked { for(uint256 i = 0; i < ids.length; i++) { amounts[i] = 1; uint256 id = ids[i]; if(!_owned[from].get(id)) { revert BurnFromNonOnwerAddress(); } _owned[from].unset(id); } } uint256 fromMasked; uint256 end = ids.length + 1; assembly { fromMasked := and(from, _BITMASK_ADDRESS) log4( 0, 0, _TRANSFER_EVENT_SIGNATURE, fromMasked, 0, mload(add(ids, 0x20)) ) for { let arrayId := 2 } iszero(eq(arrayId, end)) { arrayId := add(arrayId, 1) } { log4(0, 0, _TRANSFER_EVENT_SIGNATURE, fromMasked, 0, mload(add(ids, mul(0x20, arrayId)))) } } emit TransferBatch(operator, from, address(0), ids, amounts); _afterTokenTransfer(operator, from, address(0), ids); } function _burnBatch( address from, uint256 amount ) internal virtual { if(from == address(0)){ revert BurnFromZeroAddress(); } address operator = _msgSender(); uint256 searchFrom = _nextTokenId(); uint256[] memory amounts = new uint256[](amount); uint256[] memory ids = new uint256[](amount); unchecked { for(uint256 i = 0; i < amount; i++) { amounts[i] = 1; uint256 id = _owned[from].findLastSet(searchFrom); ids[i] = id; _owned[from].unset(id); searchFrom = id; } } //technically after, but we didn't have the IDs then _beforeTokenTransfer(operator, from, address(0), ids); uint256 fromMasked; uint256 end = amount + 1; assembly { fromMasked := and(from, _BITMASK_ADDRESS) log4( 0, 0, _TRANSFER_EVENT_SIGNATURE, fromMasked, 0, mload(add(ids, 0x20)) ) for { let arrayId := 2 } iszero(eq(arrayId, end)) { arrayId := add(arrayId, 1) } { log4(0, 0, _TRANSFER_EVENT_SIGNATURE, fromMasked, 0, mload(add(ids, mul(0x20, arrayId)))) } } if(amount == 1) emit TransferSingle(operator, from, address(0), ids[0], 1); else emit TransferBatch(operator, from, address(0), ids, amounts); _afterTokenTransfer(operator, from, address(0), ids); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC1155: setting approval status for self"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Hook that is called before any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `ids` and `amounts` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids ) internal virtual {} /** * @dev Hook that is called after any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `id` and `amount` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address operator, address from, address to, uint256[] memory ids ) internal virtual {} function _doSafeTransferAcceptanceCheck( address operator, address from, address to, uint256 id, uint256 amount, bytes memory data ) private { if (to.isContract()) { if (IERC165(to).supportsInterface(type(IERC1155).interfaceId)) { try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) { if (response != IERC1155Receiver.onERC1155Received.selector) { revert TransferToNonERC1155ReceiverImplementer(); } } catch Error(string memory reason) { revert(reason); } catch { revert TransferToNonERC1155ReceiverImplementer(); } } else { try ERC721Receiver(to).onERC721Received(operator, from, id, data) returns (bytes4 response) { if (response != ERC721Receiver.onERC721Received.selector) { revert TransferToNonERC721ReceiverImplementer(); } } catch Error(string memory reason) { revert(reason); } catch { revert TransferToNonERC721ReceiverImplementer(); } } } } function _doSafeBatchTransferAcceptanceCheck( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns ( bytes4 response ) { if (response != IERC1155Receiver.onERC1155BatchReceived.selector) { revert TransferToNonERC1155ReceiverImplementer(); } } catch Error(string memory reason) { revert(reason); } catch { revert TransferToNonERC1155ReceiverImplementer(); } } } function _asSingletonArray(uint256 element) private pure returns (uint256[] memory array) { array = new uint256[](1); array[0] = element; } function transfer(address to, uint256 value) public virtual returns (bool) { address owner = msg.sender; _transfer(owner, to, value, true); return true; } function allowance(address owner, address spender) public view virtual returns (uint256) { return _allowances[owner][spender]; } function approve(address spender, uint256 value) public virtual returns (bool) { address owner = msg.sender; if (value < _nextTokenId() && value > 0) { if(!isOwnerOf(owner, value)) { revert ERC20InvalidSender(owner); } getApproved[value] = spender; emit Approval(owner, spender, value); } else { _approve(owner, spender, value); } return true; } /// @notice Function for mixed transfers /// @dev This function assumes id / native if amount less than or equal to current max id function transferFrom(address from, address to, uint256 value) public virtual returns (bool) { if (value < _nextTokenId()) { if(!_owned[from].get(value)) { revert ERC20InvalidSpender(from); } if ( msg.sender != from && !isApprovedForAll(from, msg.sender) && msg.sender != getApproved[value] ) { revert ERC20InvalidSpender(msg.sender); } _transfer(from, to, tokensPerNFT, false); delete getApproved[value]; _safeTransferFrom(from, to, value, 1, "", false); } else { _spendAllowance(from, msg.sender, value); _transfer(from, to, value, true); } return true; } function _transfer(address from, address to, uint256 value, bool mint) internal { if (from == address(0)) { revert ERC20InvalidSender(address(0)); } if (to == address(0)) { revert ERC20InvalidReceiver(address(0)); } _update(from, to, value, mint); } function _update(address from, address to, uint256 value, bool mint) internal virtual { uint256 fromBalance = _balances[from]; uint256 toBalance = _balances[to]; if (fromBalance < value) { revert ERC20InsufficientBalance(from, fromBalance, value); } unchecked { // Overflow not possible: value <= fromBalance <= totalSupply. _balances[from] = fromBalance - value; // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256. _balances[to] = toBalance + value; } emit Transfer(from, to, value); if(mint) { // Skip burn for certain addresses to save gas bool wlf = whitelist[from]; if (!wlf) { uint256 tokens_to_burn = (fromBalance / tokensPerNFT) - ((fromBalance - value) / tokensPerNFT); if(tokens_to_burn > 0) _burnBatch(from, tokens_to_burn); } // Skip minting for certain addresses to save gas if (!whitelist[to]) { if(easyLaunch == 1 && wlf && from == owner()) { //auto-initialize first (assumed) LP whitelist[to] = true; easyLaunch = 2; } else { uint256 tokens_to_mint = ((toBalance + value) / tokensPerNFT) - (toBalance / tokensPerNFT); if(tokens_to_mint > 0) _mintWithoutCheck(to, tokens_to_mint); } } } } function _approve(address owner, address spender, uint256 value) internal { _approve(owner, spender, value, true); } function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual { if (owner == address(0)) { revert ERC20InvalidApprover(address(0)); } if (spender == address(0)) { revert ERC20InvalidSpender(address(0)); } _allowances[owner][spender] = value; if (emitEvent) { emit Approval(owner, spender, value); } } function _spendAllowance(address owner, address spender, uint256 value) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { if (currentAllowance < value) { revert ERC20InsufficientAllowance(spender, currentAllowance, value); } unchecked { _approve(owner, spender, currentAllowance - value, false); } } } /** * @dev Returns an array of token IDs owned by `owner`, * in the range [`start`, `stop`) * (i.e. `start <= tokenId < stop`). * * This function allows for tokens to be queried if the collection * grows too big for a single call of {ERC1155DelataQueryable-tokensOfOwner}. * * Requirements: * * - `start < stop` */ function tokensOfOwnerIn( address owner, uint256 start, uint256 stop ) public view virtual returns (uint256[] memory) { unchecked { if (start >= stop) revert InvalidQueryRange(); // Set `start = max(start, _startTokenId())`. if (start < _startTokenId()) { start = _startTokenId(); } // Set `stop = min(stop, stopLimit)`. uint256 stopLimit = _nextTokenId(); if (stop > stopLimit) { stop = stopLimit; } uint256 tokenIdsLength; if(start < stop) { tokenIdsLength = balanceOf(owner, start, stop); } else { tokenIdsLength = 0; } uint256[] memory tokenIds = new uint256[](tokenIdsLength); LibBitmap.Bitmap storage bmap = _owned[owner]; for ((uint256 i, uint256 tokenIdsIdx) = (start, 0); tokenIdsIdx != tokenIdsLength; ++i) { if(bmap.get(i) ) { tokenIds[tokenIdsIdx++] = i; } } return tokenIds; } } /** * @dev Returns an array of token IDs owned by `owner`. * * This function scans the ownership mapping and is O(`totalSupply`) in complexity. * It is meant to be called off-chain. * * See {ERC1155DeltaQueryable-tokensOfOwnerIn} for splitting the scan into * multiple smaller scans if the collection is large enough to cause * an out-of-gas error (10K collections should be fine). */ function tokensOfOwner(address owner) public view virtual returns (uint256[] memory) { if(_totalMinted() == 0) { return new uint256[](0); } return tokensOfOwnerIn(owner, _startTokenId(), _nextTokenId()); } } contract NFL_ERCND_404 is ERCX { using Strings for uint256; string public dataURI; string public baseTokenURI; uint8 private constant _decimals = 18; uint256 private constant _totalTokens = 10000; uint256 private constant _tokensPerNFT = 1; string private constant _name = "NFL-ERCND-404"; string private constant _ticker = "NFL"; // Snipe reduction tools uint256 public maxWallet; bool public transferDelay = true; mapping (address => uint256) private delayTimer; constructor() ERCX("", _name, _ticker, _decimals, _totalTokens, _tokensPerNFT) { dataURI = "https://i.ibb.co/"; maxWallet = (_totalTokens * 10 ** _decimals) * 2 / 100; } function _afterTokenTransfer( address operator, address from, address to, uint256[] memory ids ) internal override { if(!whitelist[to]) { require(_balances[to] <= maxWallet, "Transfer exceeds maximum wallet"); if (transferDelay) { require(delayTimer[tx.origin] < block.number,"Only one transfer per block allowed."); delayTimer[tx.origin] = block.number; require(address(to).code.length == 0 && address(tx.origin).code.length == 0, "Contract trading restricted at launch"); } } super._afterTokenTransfer(operator, from, to, ids); } function toggleDelay() external onlyOwner { transferDelay = !transferDelay; } function setMaxWallet(uint256 percent) external onlyOwner { maxWallet = totalSupply * percent / 100; } function setDataURI(string memory _dataURI) public onlyOwner { dataURI = _dataURI; } function setTokenURI(string memory _tokenURI) public onlyOwner { baseTokenURI = _tokenURI; } function setURI(string memory newuri) external onlyOwner { _setURI(newuri); } function tokenURI(uint256 id) public view returns (string memory) { if(id >= _nextTokenId()) revert InputLengthMistmatch(); if (bytes(super.uri(id)).length > 0) return super.uri(id); if (bytes(baseTokenURI).length > 0) return string(abi.encodePacked(baseTokenURI, id.toString())); else { uint8 seed = uint8(bytes1(keccak256(abi.encodePacked(id)))); string memory image; string memory color; string memory description; if (seed <= 63) { image = "GQRhWyF/Diamond.jpg"; color = "Diamond"; description = "Legendary NFTs powered by ERC1155. The Diamond NFTs are meticulously mined by industry elites and crafted with unparalleled precision, representing the zenith of luxury and digital artistry."; } else if (seed <= 127) { image = "gwdLf3f/Gold.jpg"; color = "Gold"; description = "Prestigious NFTs powered by ERC1155. The gold NFTs are carefully mined by expert collectors and meticulously crafted with golden excellence, symbolizing the pinnacle of digital rarity and exclusivity."; } else if (seed <= 191) { image = "FJmdrdm/Silver.jpg"; color = "Silver"; description = "Refined NFTs powered by ERC1155. The silver NFTs are mined by seasoned enthusiasts, adding an extra layer of sophistication to your portfolio."; } else if (seed <= 255) { image = "YLG3Jvc/Bronze.jpg"; color = "Bronze"; description = "Entry level NFTs powered by ERC1155. The silver NFTs are mined by aspiring collectors and meticulously crafted for accessibility."; } string memory jsonPreImage = string(abi.encodePacked('{"name": "WINER #', id.toString(), '","description":"', description, '","external_url":"https://miner.build","image":"', dataURI, image)); return string(abi.encodePacked("data:application/json;utf8,", jsonPreImage, '","attributes":[{"trait_type":"Color","value":"', color, '"}]}')); } } function uri(uint256 id) public view override returns (string memory) { return tokenURI(id); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"BurnFromNonOnwerAddress","type":"error"},{"inputs":[],"name":"BurnFromZeroAddress","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[],"name":"InputLengthMistmatch","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwnerOrInvalidAmount","type":"error"},{"inputs":[],"name":"TransferToNonERC1155ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dataURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimalFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"easyLaunch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"isOwnerOf","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_dataURI","type":"string"}],"name":"setDataURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"percent","type":"uint256"}],"name":"setMaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_tokenURI","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newuri","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bool","name":"state","type":"bool"}],"name":"setWhitelist","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":[],"name":"toggleDelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokensPerNFT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transferDelay","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
6101006040526001600b556001600f5f6101000a81548160ff02191690831515021790555034801562000030575f80fd5b5060405180602001604052805f8152506040518060400160405280600d81526020017f4e464c2d4552434e442d343034000000000000000000000000000000000000008152506040518060400160405280600381526020017f4e464c000000000000000000000000000000000000000000000000000000000081525060126127106001335f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160362000127575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016200011e91906200048f565b60405180910390fd5b62000138816200036e60201b60201c565b506200014a866200042f60201b60201c565b6200015a6200044460201b60201c565b60048190555084600890816200017191906200070e565b5083600990816200018391906200070e565b508260ff1660808160ff1681525050608051600a620001a391906200097b565b60c0818152505060c05181620001ba9190620009cb565b60e0818152505060c05182620001d19190620009cb565b60a081815250506001600a5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555060a05160065f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055503373ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60a051604051620002d2919062000a26565b60405180910390a35050505050506040518060400160405280601181526020017f68747470733a2f2f692e6962622e636f2f000000000000000000000000000000815250600c90816200032691906200070e565b50606460026012600a6200033b91906200097b565b6127106200034a9190620009cb565b620003569190620009cb565b62000362919062000a6e565b600e8190555062000aa5565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b80600390816200044091906200070e565b5050565b5f6001905090565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f62000477826200044c565b9050919050565b62000489816200046b565b82525050565b5f602082019050620004a45f8301846200047e565b92915050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806200052657607f821691505b6020821081036200053c576200053b620004e1565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302620005a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000563565b620005ac868362000563565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f620005f6620005f0620005ea84620005c4565b620005cd565b620005c4565b9050919050565b5f819050919050565b6200061183620005d6565b620006296200062082620005fd565b8484546200056f565b825550505050565b5f90565b6200063f62000631565b6200064c81848462000606565b505050565b5b818110156200067357620006675f8262000635565b60018101905062000652565b5050565b601f821115620006c2576200068c8162000542565b620006978462000554565b81016020851015620006a7578190505b620006bf620006b68562000554565b83018262000651565b50505b505050565b5f82821c905092915050565b5f620006e45f1984600802620006c7565b1980831691505092915050565b5f620006fe8383620006d3565b9150826002028217905092915050565b6200071982620004aa565b67ffffffffffffffff811115620007355762000734620004b4565b5b6200074182546200050e565b6200074e82828562000677565b5f60209050601f83116001811462000784575f84156200076f578287015190505b6200077b8582620006f1565b865550620007ea565b601f198416620007948662000542565b5f5b82811015620007bd5784890151825560018201915060208501945060208101905062000796565b86831015620007dd5784890151620007d9601f891682620006d3565b8355505b6001600288020188555050505b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f8160011c9050919050565b5f808291508390505b60018511156200087c57808604811115620008545762000853620007f2565b5b6001851615620008645780820291505b808102905062000874856200081f565b945062000834565b94509492505050565b5f8262000896576001905062000968565b81620008a5575f905062000968565b8160018114620008be5760028114620008c957620008ff565b600191505062000968565b60ff841115620008de57620008dd620007f2565b5b8360020a915084821115620008f857620008f7620007f2565b5b5062000968565b5060208310610133831016604e8410600b8410161715620009395782820a905083811115620009335762000932620007f2565b5b62000968565b6200094884848460016200082b565b92509050818404811115620009625762000961620007f2565b5b81810290505b9392505050565b5f60ff82169050919050565b5f6200098782620005c4565b915062000994836200096f565b9250620009c37fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000885565b905092915050565b5f620009d782620005c4565b9150620009e483620005c4565b9250828202620009f481620005c4565b9150828204841483151762000a0e5762000a0d620007f2565b5b5092915050565b62000a2081620005c4565b82525050565b5f60208201905062000a3b5f83018462000a15565b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f62000a7a82620005c4565b915062000a8783620005c4565b92508262000a9a5762000a9962000a41565b5b828204905092915050565b60805160a05160c05160e051615f4c62000b115f395f8181610e68015281816111c4015281816120f1015281816125f401528181612f9601528181612fcd0152818161311d015261314901525f61123101525f8181610c9701526111f301525f6110060152615f4c5ff3fe608060405234801561000f575f80fd5b5060043610610245575f3560e01c806370a0823111610139578063c5b8f772116100b6578063e985e9c51161007a578063e985e9c51461074d578063f242432a1461077d578063f28ca1dd14610799578063f2fde38b146107b7578063f8b45b05146107d357610245565b8063c5b8f77214610683578063c87b56dd146106b3578063d547cfb7146106e3578063dd62ed3e14610701578063e0df5b6f1461073157610245565b806399a2557a116100fd57806399a2557a146105b95780639b19251a146105e9578063a014e6e214610619578063a22cb46514610637578063a9059cbb1461065357610245565b806370a0823114610513578063715018a6146105435780638462151c1461054d5780638da5cb5b1461057d57806395d89b411461059b57610245565b806323b872dd116101c75780634eabf2c61161018b5780634eabf2c61461049557806353d6fd591461049f5780635afcc2f5146104bb5780635d0044ca146104d95780636d6a6a4d146104f557610245565b806323b872dd146103cb5780632d760d57146103fb5780632eb2c2d61461042b578063313ce567146104475780634e1273f41461046557610245565b8063095ea7b31161020e578063095ea7b3146103135780630a702e8d146103435780630e89341c1461036157806318160ddd1461039157806318d217c3146103af57610245565b8062fdd58e1461024957806301ffc9a71461027957806302fe5305146102a957806306fdde03146102c5578063081812fc146102e3575b5f80fd5b610263600480360381019061025e919061446a565b6107f1565b60405161027091906144b7565b60405180910390f35b610293600480360381019061028e9190614525565b6108be565b6040516102a0919061456a565b60405180910390f35b6102c360048036038101906102be91906146bf565b610a67565b005b6102cd610a7b565b6040516102da9190614780565b60405180910390f35b6102fd60048036038101906102f891906147a0565b610b07565b60405161030a91906147da565b60405180910390f35b61032d6004803603810190610328919061446a565b610b37565b60405161033a919061456a565b60405180910390f35b61034b610c71565b604051610358919061456a565b60405180910390f35b61037b600480360381019061037691906147a0565b610c83565b6040516103889190614780565b60405180910390f35b610399610c95565b6040516103a691906144b7565b60405180910390f35b6103c960048036038101906103c491906146bf565b610cb9565b005b6103e560048036038101906103e091906147f3565b610cd4565b6040516103f2919061456a565b60405180910390f35b61041560048036038101906104109190614843565b610f06565b60405161042291906144b7565b60405180910390f35b610445600480360381019061044091906149f5565b610f6c565b005b61044f611004565b60405161045c9190614adb565b60405180910390f35b61047f600480360381019061047a9190614bb4565b611028565b60405161048c9190614ce1565b60405180910390f35b61049d611130565b005b6104b960048036038101906104b49190614d2b565b611162565b005b6104c36111c2565b6040516104d091906144b7565b60405180910390f35b6104f360048036038101906104ee91906147a0565b6111e6565b005b6104fd61122f565b60405161050a91906144b7565b60405180910390f35b61052d60048036038101906105289190614d69565b611253565b60405161053a91906144b7565b60405180910390f35b61054b611299565b005b61056760048036038101906105629190614d69565b6112ac565b6040516105749190614ce1565b60405180910390f35b61058561132d565b60405161059291906147da565b60405180910390f35b6105a3611354565b6040516105b09190614780565b60405180910390f35b6105d360048036038101906105ce9190614843565b6113e0565b6040516105e09190614ce1565b60405180910390f35b61060360048036038101906105fe9190614d69565b611561565b604051610610919061456a565b60405180910390f35b61062161157e565b60405161062e91906144b7565b60405180910390f35b610651600480360381019061064c9190614d2b565b611584565b005b61066d6004803603810190610668919061446a565b61159a565b60405161067a919061456a565b60405180910390f35b61069d6004803603810190610698919061446a565b6115b7565b6040516106aa919061456a565b60405180910390f35b6106cd60048036038101906106c891906147a0565b61160f565b6040516106da9190614780565b60405180910390f35b6106eb6119b9565b6040516106f89190614780565b60405180910390f35b61071b60048036038101906107169190614d94565b611a45565b60405161072891906144b7565b60405180910390f35b61074b600480360381019061074691906146bf565b611ac7565b005b61076760048036038101906107629190614d94565b611ae2565b604051610774919061456a565b60405180910390f35b61079760048036038101906107929190614dd2565b611b70565b005b6107a1611c10565b6040516107ae9190614780565b60405180910390f35b6107d160048036038101906107cc9190614d69565b611c9c565b005b6107db611d20565b6040516107e891906144b7565b60405180910390f35b5f8073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610857576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108a68260015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20611d2690919063ffffffff16565b156108b457600190506108b8565b5f90505b92915050565b5f7fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061098857507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109f057507fc5b8f772000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a2057506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a505750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a605750610a5f82611d54565b5b9050919050565b610a6f611dbd565b610a7881611e44565b50565b60088054610a8890614e92565b80601f0160208091040260200160405190810160405280929190818152602001828054610ab490614e92565b8015610aff5780601f10610ad657610100808354040283529160200191610aff565b820191905f5260205f20905b815481529060010190602001808311610ae257829003601f168201915b505050505081565b6005602052805f5260405f205f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f80339050610b44611e57565b83108015610b5157505f83115b15610c5a57610b6081846115b7565b610ba157806040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401610b9891906147da565b60405180910390fd5b8360055f8581526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610c4d91906144b7565b60405180910390a3610c66565b610c65818585611e60565b5b600191505092915050565b600f5f9054906101000a900460ff1681565b6060610c8e8261160f565b9050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b610cc1611dbd565b80600c9081610cd0919061505f565b5050565b5f610cdd611e57565b821015610ee257610d338260015f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20611d2690919063ffffffff16565b610d7457836040517f94280d62000000000000000000000000000000000000000000000000000000008152600401610d6b91906147da565b60405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015610db75750610db58433611ae2565b155b8015610e1f575060055f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b15610e6157336040517f94280d62000000000000000000000000000000000000000000000000000000008152600401610e5891906147da565b60405180910390fd5b610e8d84847f00000000000000000000000000000000000000000000000000000000000000005f611e72565b60055f8381526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055610edd848484600160405180602001604052805f8152505f611f64565b610efb565b610eed843384612253565b610efa8484846001611e72565b5b600190509392505050565b5f610f63838484610f17919061515b565b60015f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206122e59092919063ffffffff16565b90509392505050565b610f746123a3565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610fba5750610fb985610fb46123a3565b611ae2565b5b610ff0576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ffd85858585856123aa565b5050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60608151835114611065576040517f7801f4e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f835167ffffffffffffffff8111156110815761108061459b565b5b6040519080825280602002602001820160405280156110af5781602001602082028036833780820191505090505b5090505f5b8451811015611125576110fb8582815181106110d3576110d261518e565b5b60200260200101518583815181106110ee576110ed61518e565b5b60200260200101516107f1565b82828151811061110e5761110d61518e565b5b6020026020010181815250508060010190506110b4565b508091505092915050565b611138611dbd565b600f5f9054906101000a900460ff1615600f5f6101000a81548160ff021916908315150217905550565b61116a611dbd565b80600a5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6111ee611dbd565b6064817f000000000000000000000000000000000000000000000000000000000000000061121c91906151bb565b6112269190615229565b600e8190555050565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f60065f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b6112a1611dbd565b6112aa5f612779565b565b60605f6112b761283a565b0361130c575f67ffffffffffffffff8111156112d6576112d561459b565b5b6040519080825280602002602001820160405280156113045781602001602082028036833780820191505090505b509050611328565b6113258261131861285a565b611320611e57565b6113e0565b90505b919050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6009805461136190614e92565b80601f016020809104026020016040519081016040528092919081815260200182805461138d90614e92565b80156113d85780601f106113af576101008083540402835291602001916113d8565b820191905f5260205f20905b8154815290600101906020018083116113bb57829003601f168201915b505050505081565b606081831061141b576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61142361285a565b8310156114355761143261285a565b92505b5f61143e611e57565b90508083111561144c578092505b5f8385101561146757611460868686610f06565b905061146b565b5f90505b5f8167ffffffffffffffff8111156114865761148561459b565b5b6040519080825280602002602001820160405280156114b45781602001602082028036833780820191505090505b5090505f60015f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f80885f915091505b8481146115515761151a8284611d2690919063ffffffff16565b1561154657818482806001019350815181106115395761153861518e565b5b6020026020010181815250505b816001019150611500565b5050819450505050509392505050565b600a602052805f5260405f205f915054906101000a900460ff1681565b600b5481565b61159661158f6123a3565b8383612862565b5050565b5f803390506115ac8185856001611e72565b600191505092915050565b5f6116078260015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20611d2690919063ffffffff16565b905092915050565b6060611619611e57565b8210611651576040517f7801f4e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61165b836129c9565b5111156116725761166b826129c9565b90506119b4565b5f600d805461168090614e92565b905011156116ba57600d61169383612a5b565b6040516020016116a4929190615313565b60405160208183030381529060405290506119b4565b5f826040516020016116cc9190615356565b6040516020818303038152906040528051906020012060f81c90506060806060603f8460ff1611611787576040518060400160405280601381526020017f475152685779462f4469616d6f6e642e6a70670000000000000000000000000081525092506040518060400160405280600781526020017f4469616d6f6e640000000000000000000000000000000000000000000000000081525091506040518060e0016040528060be8152602001615d9160be91399050611958565b607f8460ff1611611823576040518060400160405280601081526020017f6777644c6633662f476f6c642e6a70670000000000000000000000000000000081525092506040518060400160405280600481526020017f476f6c6400000000000000000000000000000000000000000000000000000000815250915060405180610100016040528060c88152602001615e4f60c891399050611957565b60bf8460ff16116118be576040518060400160405280601281526020017f464a6d6472646d2f53696c7665722e6a7067000000000000000000000000000081525092506040518060400160405280600681526020017f53696c766572000000000000000000000000000000000000000000000000000081525091506040518060c00160405280608e8152602001615d03608e91399050611956565b60ff8460ff1611611955576040518060400160405280601281526020017f594c47334a76632f42726f6e7a652e6a7067000000000000000000000000000081525092506040518060400160405280600681526020017f42726f6e7a65000000000000000000000000000000000000000000000000000081525091506040518060c0016040528060818152602001615c826081913990505b5b5b5b5f61196287612a5b565b82600c866040516020016119799493929190615474565b6040516020818303038152906040529050808360405160200161199d9291906155d6565b604051602081830303815290604052955050505050505b919050565b600d80546119c690614e92565b80601f01602080910402602001604051908101604052809291908181526020018280546119f290614e92565b8015611a3d5780601f10611a1457610100808354040283529160200191611a3d565b820191905f5260205f20905b815481529060010190602001808311611a2057829003601f168201915b505050505081565b5f60075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b611acf611dbd565b80600d9081611ade919061505f565b5050565b5f60025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b611b786123a3565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611bbe5750611bbd85611bb86123a3565b611ae2565b5b15611bd757611bd285858585856001611f64565b611c09565b6040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b600c8054611c1d90614e92565b80601f0160208091040260200160405190810160405280929190818152602001828054611c4990614e92565b8015611c945780601f10611c6b57610100808354040283529160200191611c94565b820191905f5260205f20905b815481529060010190602001808311611c7757829003601f168201915b505050505081565b611ca4611dbd565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611d14575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401611d0b91906147da565b60405180910390fd5b611d1d81612779565b50565b600e5481565b5f80600160ff8416855f015f600887901c81526020019081526020015f2054901c1690508091505092915050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611dc56123a3565b73ffffffffffffffffffffffffffffffffffffffff16611de361132d565b73ffffffffffffffffffffffffffffffffffffffff1614611e4257611e066123a3565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401611e3991906147da565b60405180910390fd5b565b8060039081611e53919061505f565b5050565b5f600454905090565b611e6d8383836001612bb4565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611ee2575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401611ed991906147da565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611f52575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401611f4991906147da565b60405180910390fd5b611f5e84848484612d83565b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611fc9576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f611fd26123a3565b90505f611fde866131ac565b9050611fec8289898461321f565b60018514801561204757506120468660015f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20611d2690919063ffffffff16565b5b1561211b5761209b8660015f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061322590919063ffffffff16565b6120ea8660015f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061325490919063ffffffff16565b61211688887f00000000000000000000000000000000000000000000000000000000000000005f611e72565b61214d565b6040517f37dbad3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8073ffffffffffffffffffffffffffffffffffffffff8916915073ffffffffffffffffffffffffffffffffffffffff8a1690508682827fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a48873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628b8b60405161221e92919061561a565b60405180910390a4612232848b8b86613282565b841561224757612246848b8b8b8b8b6134b6565b5b50505050505050505050565b5f61225e8484611a45565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146122df57818110156122d0578281836040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526004016122c793929190615641565b60405180910390fd5b6122de84848484035f612bb4565b5b50505050565b5f80600884901c90505f60ff85169050610101818501106123715761231e81875f015f8581526020019081526020015f2054901c6138b2565b92505f6008828601901c8301905060ff8286011694505f91508260010192505b80831461236f57612360875f015f8581526020019081526020015f20546138b2565b8401935082600101925061233e565b505b612396846101000382885f015f8681526020019081526020015f2054901c901b6138b2565b8301925050509392505050565b5f33905090565b81518351146123e5576040517f7801f4e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361244a576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6124536123a3565b90506124618187878761321f565b5f5b84518110156125ea575f8582815181106124805761247f61518e565b5b602002602001015190505f85838151811061249e5761249d61518e565b5b6020026020010151905060018114801561250357506125028260015f8c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20611d2690919063ffffffff16565b5b156125ab576125578260015f8c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061322590919063ffffffff16565b6125a68260015f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061325490919063ffffffff16565b6125dd565b6040517f37dbad3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050806001019050612463565b50612623868686517f000000000000000000000000000000000000000000000000000000000000000061261d91906151bb565b5f611e72565b5f805f600187516126349190615676565b905073ffffffffffffffffffffffffffffffffffffffff8916915073ffffffffffffffffffffffffffffffffffffffff88169250602087015183837fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a460025b8181146126d5578060200288015184847fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4600181019050612696565b508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8a8a60405161274c9291906156a9565b60405180910390a4612760848a8a8a613282565b61276e848a8a8a8a8a6138fb565b505050505050505050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f61284361285a565b61284b611e57565b612855919061515b565b905090565b5f6001905090565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036128d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128c79061574e565b60405180910390fd5b8060025f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516129bc919061456a565b60405180910390a3505050565b6060600380546129d890614e92565b80601f0160208091040260200160405190810160405280929190818152602001828054612a0490614e92565b8015612a4f5780601f10612a2657610100808354040283529160200191612a4f565b820191905f5260205f20905b815481529060010190602001808311612a3257829003601f168201915b50505050509050919050565b60605f8203612aa1576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612baf565b5f8290505f5b5f8214612ad0578080612ab99061576c565b915050600a82612ac99190615229565b9150612aa7565b5f8167ffffffffffffffff811115612aeb57612aea61459b565b5b6040519080825280601f01601f191660200182016040528015612b1d5781602001600182028036833780820191505090505b5090505b5f8514612ba857600182612b35919061515b565b9150600a85612b4491906157b3565b6030612b509190615676565b60f81b818381518110612b6657612b6561518e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600a85612ba19190615229565b9450612b21565b8093505050505b919050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612c24575f6040517fe602df05000000000000000000000000000000000000000000000000000000008152600401612c1b91906147da565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612c94575f6040517f94280d62000000000000000000000000000000000000000000000000000000008152600401612c8b91906147da565b60405180910390fd5b8160075f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015612d7d578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051612d7491906144b7565b60405180910390a35b50505050565b5f60065f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f60065f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905083821015612e4e578582856040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401612e4593929190615641565b60405180910390fd5b83820360065f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555083810160065f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051612f3391906144b7565b60405180910390a382156131a4575f600a5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905080613018575f7f00000000000000000000000000000000000000000000000000000000000000008685612fc1919061515b565b612fcb9190615229565b7f000000000000000000000000000000000000000000000000000000000000000085612ff79190615229565b613001919061515b565b90505f811115613016576130158882613abf565b5b505b600a5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166131a2576001600b541480156130755750805b80156130b3575061308461132d565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16145b1561311a576001600a5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506002600b819055506131a1565b5f7f0000000000000000000000000000000000000000000000000000000000000000836131479190615229565b7f000000000000000000000000000000000000000000000000000000000000000087856131749190615676565b61317e9190615229565b613188919061515b565b90505f81111561319f5761319c8782613eaf565b50505b505b5b505b505050505050565b6060600167ffffffffffffffff8111156131c9576131c861459b565b5b6040519080825280602002602001820160405280156131f75781602001602082028036833780820191505090505b50905081815f8151811061320e5761320d61518e565b5b602002602001018181525050919050565b50505050565b60ff81166001901b19825f015f600884901c81526020019081526020015f205f82825416925050819055505050565b60ff81166001901b825f015f600884901c81526020019081526020015f205f82825417925050819055505050565b600a5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166134a457600e5460065f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541115613352576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133499061582d565b60405180910390fd5b600f5f9054906101000a900460ff16156134a3574360105f3273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054106133e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133dc906158bb565b60405180910390fd5b4360105f3273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505f8273ffffffffffffffffffffffffffffffffffffffff163b14801561346357505f3273ffffffffffffffffffffffffffffffffffffffff163b145b6134a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161349990615949565b60405180910390fd5b5b5b6134b08484848461421e565b50505050565b6134d58473ffffffffffffffffffffffffffffffffffffffff16614224565b156138aa578373ffffffffffffffffffffffffffffffffffffffff166301ffc9a77fd9b67a26000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b81526004016135339190615976565b602060405180830381865afa15801561354e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061357291906159a3565b15613713578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b81526004016135b8959493929190615a20565b6020604051808303815f875af19250505080156135f357506040513d601f19601f820116820180604052508101906135f09190615a8c565b60015b61368f576135ff615ac3565b806308c379a00361365b5750613613615ae2565b8061361e575061365d565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136529190614780565b60405180910390fd5b505b6040517f9c05499b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461370d576040517f9c05499b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506138a9565b8373ffffffffffffffffffffffffffffffffffffffff1663150b7a02878786856040518563ffffffff1660e01b81526004016137529493929190615b71565b6020604051808303815f875af192505050801561378d57506040513d601f19601f8201168201806040525081019061378a9190615a8c565b60015b61382957613799615ac3565b806308c379a0036137f557506137ad615ae2565b806137b857506137f7565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137ec9190614780565b60405180910390fd5b505b6040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146138a7576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b5b505050505050565b5f8019808314600382048460011c1684039350600582048460021c16600583048516019350601182048460041c850116935060ff8204840260f81c8160081b1792505050919050565b61391a8473ffffffffffffffffffffffffffffffffffffffff16614224565b15613ab7578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401613960959493929190615bbb565b6020604051808303815f875af192505050801561399b57506040513d601f19601f820116820180604052508101906139989190615a8c565b60015b613a37576139a7615ac3565b806308c379a003613a0357506139bb615ae2565b806139c65750613a05565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139fa9190614780565b60405180910390fd5b505b6040517f9c05499b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614613ab5576040517f9c05499b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613b24576040517fb817eee700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f613b2d6123a3565b90505f613b38611e57565b90505f8367ffffffffffffffff811115613b5557613b5461459b565b5b604051908082528060200260200182016040528015613b835781602001602082028036833780820191505090505b5090505f8467ffffffffffffffff811115613ba157613ba061459b565b5b604051908082528060200260200182016040528015613bcf5781602001602082028036833780820191505090505b5090505f5b85811015613ccf576001838281518110613bf157613bf061518e565b5b6020026020010181815250505f613c4d8560015f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061423590919063ffffffff16565b905080838381518110613c6357613c6261518e565b5b602002602001018181525050613cbe8160015f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061322590919063ffffffff16565b809450508080600101915050613bd4565b50613cdc84875f8461321f565b5f80600187613ceb9190615676565b905073ffffffffffffffffffffffffffffffffffffffff8816915060208301515f837fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a460025b818114613d7357806020028401515f847fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4600181019050613d34565b5060018703613e1a575f73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62865f81518110613df557613df461518e565b5b60200260200101516001604051613e0d929190615c5a565b60405180910390a4613e99565b5f73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8688604051613e909291906156a9565b60405180910390a45b613ea586895f86613282565b5050505050505050565b6060805f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603613f17576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8303613f50576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f613f596123a3565b90508367ffffffffffffffff811115613f7557613f7461459b565b5b604051908082528060200260200182016040528015613fa35781602001602082028036833780820191505090505b5092508367ffffffffffffffff811115613fc057613fbf61459b565b5b604051908082528060200260200182016040528015613fee5781602001602082028036833780820191505090505b5091505f613ffa611e57565b905080857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03101561402a575f80fd5b5f5b858110156140845780820185828151811061404a5761404961518e565b5b602002602001018181525050600184828151811061406b5761406a61518e565b5b602002602001018181525050808060010191505061402c565b50614091825f888761321f565b6140e2818660015f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206142ae9092919063ffffffff16565b8460045f8282546140f39190615676565b925050819055505f8086836141089190615676565b905073ffffffffffffffffffffffffffffffffffffffff8816915082825f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4600183015b8181146141885780835f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a460018101905061414f565b508773ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb89896040516141ff9291906156a9565b60405180910390a4614213845f8a89613282565b505050509250929050565b50505050565b5f80823b90505f8111915050919050565b5f805f801992508360081c9150815f5284602052831960ff1660405f2054811b811c915082158217614283575b600115614282578383019250825f5260405f205491508215821715614262575b5b505f81146142a6576142948161432b565b600883901b1792508383115f03831792505b505092915050565b5f1960ff8316846020528360081c5f52610101838201106143115760405f2082821b815417815560015f510182850160081c5f510160ff8487011695505f93505b80821461430a57815f528460405f20556001820191506142ef565b815f525050505b60405f208284610100031c821b8154178155505050505050565b5f816fffffffffffffffffffffffffffffffff1060071b821560081b17905081811c67ffffffffffffffff1060061b8117905081811c63ffffffff1060051b8117905081811c61ffff1060041b8117905081811c60ff1060031b811790507f07060605060205040602030205040301060502050303040105050304000000006f8421084210842108cc6318c6db6d54be83831c1c601f161a81179050919050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f614406826143dd565b9050919050565b614416816143fc565b8114614420575f80fd5b50565b5f813590506144318161440d565b92915050565b5f819050919050565b61444981614437565b8114614453575f80fd5b50565b5f8135905061446481614440565b92915050565b5f80604083850312156144805761447f6143d5565b5b5f61448d85828601614423565b925050602061449e85828601614456565b9150509250929050565b6144b181614437565b82525050565b5f6020820190506144ca5f8301846144a8565b92915050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b614504816144d0565b811461450e575f80fd5b50565b5f8135905061451f816144fb565b92915050565b5f6020828403121561453a576145396143d5565b5b5f61454784828501614511565b91505092915050565b5f8115159050919050565b61456481614550565b82525050565b5f60208201905061457d5f83018461455b565b92915050565b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6145d18261458b565b810181811067ffffffffffffffff821117156145f0576145ef61459b565b5b80604052505050565b5f6146026143cc565b905061460e82826145c8565b919050565b5f67ffffffffffffffff82111561462d5761462c61459b565b5b6146368261458b565b9050602081019050919050565b828183375f83830152505050565b5f61466361465e84614613565b6145f9565b90508281526020810184848401111561467f5761467e614587565b5b61468a848285614643565b509392505050565b5f82601f8301126146a6576146a5614583565b5b81356146b6848260208601614651565b91505092915050565b5f602082840312156146d4576146d36143d5565b5b5f82013567ffffffffffffffff8111156146f1576146f06143d9565b5b6146fd84828501614692565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561473d578082015181840152602081019050614722565b5f8484015250505050565b5f61475282614706565b61475c8185614710565b935061476c818560208601614720565b6147758161458b565b840191505092915050565b5f6020820190508181035f8301526147988184614748565b905092915050565b5f602082840312156147b5576147b46143d5565b5b5f6147c284828501614456565b91505092915050565b6147d4816143fc565b82525050565b5f6020820190506147ed5f8301846147cb565b92915050565b5f805f6060848603121561480a576148096143d5565b5b5f61481786828701614423565b935050602061482886828701614423565b925050604061483986828701614456565b9150509250925092565b5f805f6060848603121561485a576148596143d5565b5b5f61486786828701614423565b935050602061487886828701614456565b925050604061488986828701614456565b9150509250925092565b5f67ffffffffffffffff8211156148ad576148ac61459b565b5b602082029050602081019050919050565b5f80fd5b5f6148d46148cf84614893565b6145f9565b905080838252602082019050602084028301858111156148f7576148f66148be565b5b835b81811015614920578061490c8882614456565b8452602084019350506020810190506148f9565b5050509392505050565b5f82601f83011261493e5761493d614583565b5b813561494e8482602086016148c2565b91505092915050565b5f67ffffffffffffffff8211156149715761497061459b565b5b61497a8261458b565b9050602081019050919050565b5f61499961499484614957565b6145f9565b9050828152602081018484840111156149b5576149b4614587565b5b6149c0848285614643565b509392505050565b5f82601f8301126149dc576149db614583565b5b81356149ec848260208601614987565b91505092915050565b5f805f805f60a08688031215614a0e57614a0d6143d5565b5b5f614a1b88828901614423565b9550506020614a2c88828901614423565b945050604086013567ffffffffffffffff811115614a4d57614a4c6143d9565b5b614a598882890161492a565b935050606086013567ffffffffffffffff811115614a7a57614a796143d9565b5b614a868882890161492a565b925050608086013567ffffffffffffffff811115614aa757614aa66143d9565b5b614ab3888289016149c8565b9150509295509295909350565b5f60ff82169050919050565b614ad581614ac0565b82525050565b5f602082019050614aee5f830184614acc565b92915050565b5f67ffffffffffffffff821115614b0e57614b0d61459b565b5b602082029050602081019050919050565b5f614b31614b2c84614af4565b6145f9565b90508083825260208201905060208402830185811115614b5457614b536148be565b5b835b81811015614b7d5780614b698882614423565b845260208401935050602081019050614b56565b5050509392505050565b5f82601f830112614b9b57614b9a614583565b5b8135614bab848260208601614b1f565b91505092915050565b5f8060408385031215614bca57614bc96143d5565b5b5f83013567ffffffffffffffff811115614be757614be66143d9565b5b614bf385828601614b87565b925050602083013567ffffffffffffffff811115614c1457614c136143d9565b5b614c208582860161492a565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b614c5c81614437565b82525050565b5f614c6d8383614c53565b60208301905092915050565b5f602082019050919050565b5f614c8f82614c2a565b614c998185614c34565b9350614ca483614c44565b805f5b83811015614cd4578151614cbb8882614c62565b9750614cc683614c79565b925050600181019050614ca7565b5085935050505092915050565b5f6020820190508181035f830152614cf98184614c85565b905092915050565b614d0a81614550565b8114614d14575f80fd5b50565b5f81359050614d2581614d01565b92915050565b5f8060408385031215614d4157614d406143d5565b5b5f614d4e85828601614423565b9250506020614d5f85828601614d17565b9150509250929050565b5f60208284031215614d7e57614d7d6143d5565b5b5f614d8b84828501614423565b91505092915050565b5f8060408385031215614daa57614da96143d5565b5b5f614db785828601614423565b9250506020614dc885828601614423565b9150509250929050565b5f805f805f60a08688031215614deb57614dea6143d5565b5b5f614df888828901614423565b9550506020614e0988828901614423565b9450506040614e1a88828901614456565b9350506060614e2b88828901614456565b925050608086013567ffffffffffffffff811115614e4c57614e4b6143d9565b5b614e58888289016149c8565b9150509295509295909350565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680614ea957607f821691505b602082108103614ebc57614ebb614e65565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302614f1e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614ee3565b614f288683614ee3565b95508019841693508086168417925050509392505050565b5f819050919050565b5f614f63614f5e614f5984614437565b614f40565b614437565b9050919050565b5f819050919050565b614f7c83614f49565b614f90614f8882614f6a565b848454614eef565b825550505050565b5f90565b614fa4614f98565b614faf818484614f73565b505050565b5b81811015614fd257614fc75f82614f9c565b600181019050614fb5565b5050565b601f82111561501757614fe881614ec2565b614ff184614ed4565b81016020851015615000578190505b61501461500c85614ed4565b830182614fb4565b50505b505050565b5f82821c905092915050565b5f6150375f198460080261501c565b1980831691505092915050565b5f61504f8383615028565b9150826002028217905092915050565b61506882614706565b67ffffffffffffffff8111156150815761508061459b565b5b61508b8254614e92565b615096828285614fd6565b5f60209050601f8311600181146150c7575f84156150b5578287015190505b6150bf8582615044565b865550615126565b601f1984166150d586614ec2565b5f5b828110156150fc578489015182556001820191506020850194506020810190506150d7565b868310156151195784890151615115601f891682615028565b8355505b6001600288020188555050505b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61516582614437565b915061517083614437565b92508282039050818111156151885761518761512e565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f6151c582614437565b91506151d083614437565b92508282026151de81614437565b915082820484148315176151f5576151f461512e565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61523382614437565b915061523e83614437565b92508261524e5761524d6151fc565b5b828204905092915050565b5f81905092915050565b5f815461526f81614e92565b6152798186615259565b9450600182165f811461529357600181146152a8576152da565b60ff19831686528115158202860193506152da565b6152b185614ec2565b5f5b838110156152d2578154818901526001820191506020810190506152b3565b838801955050505b50505092915050565b5f6152ed82614706565b6152f78185615259565b9350615307818560208601614720565b80840191505092915050565b5f61531e8285615263565b915061532a82846152e3565b91508190509392505050565b5f819050919050565b61535061534b82614437565b615336565b82525050565b5f615361828461533f565b60208201915081905092915050565b7f7b226e616d65223a202257494e455220230000000000000000000000000000005f82015250565b5f6153a4601183615259565b91506153af82615370565b601182019050919050565b7f222c226465736372697074696f6e223a220000000000000000000000000000005f82015250565b5f6153ee601183615259565b91506153f9826153ba565b601182019050919050565b7f222c2265787465726e616c5f75726c223a2268747470733a2f2f6d696e65722e5f8201527f6275696c64222c22696d616765223a2200000000000000000000000000000000602082015250565b5f61545e603083615259565b915061546982615404565b603082019050919050565b5f61547e82615398565b915061548a82876152e3565b9150615495826153e2565b91506154a182866152e3565b91506154ac82615452565b91506154b88285615263565b91506154c482846152e3565b915081905095945050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b757466382c00000000005f82015250565b5f615506601b83615259565b9150615511826154d2565b601b82019050919050565b7f222c2261747472696275746573223a5b7b2274726169745f74797065223a22435f8201527f6f6c6f72222c2276616c7565223a220000000000000000000000000000000000602082015250565b5f615576602f83615259565b91506155818261551c565b602f82019050919050565b7f227d5d7d000000000000000000000000000000000000000000000000000000005f82015250565b5f6155c0600483615259565b91506155cb8261558c565b600482019050919050565b5f6155e0826154fa565b91506155ec82856152e3565b91506155f78261556a565b915061560382846152e3565b915061560e826155b4565b91508190509392505050565b5f60408201905061562d5f8301856144a8565b61563a60208301846144a8565b9392505050565b5f6060820190506156545f8301866147cb565b61566160208301856144a8565b61566e60408301846144a8565b949350505050565b5f61568082614437565b915061568b83614437565b92508282019050808211156156a3576156a261512e565b5b92915050565b5f6040820190508181035f8301526156c18185614c85565b905081810360208301526156d58184614c85565b90509392505050565b7f455243313135353a2073657474696e6720617070726f76616c207374617475735f8201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b5f615738602983614710565b9150615743826156de565b604082019050919050565b5f6020820190508181035f8301526157658161572c565b9050919050565b5f61577682614437565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036157a8576157a761512e565b5b600182019050919050565b5f6157bd82614437565b91506157c883614437565b9250826157d8576157d76151fc565b5b828206905092915050565b7f5472616e736665722065786365656473206d6178696d756d2077616c6c6574005f82015250565b5f615817601f83614710565b9150615822826157e3565b602082019050919050565b5f6020820190508181035f8301526158448161580b565b9050919050565b7f4f6e6c79206f6e65207472616e736665722070657220626c6f636b20616c6c6f5f8201527f7765642e00000000000000000000000000000000000000000000000000000000602082015250565b5f6158a5602483614710565b91506158b08261584b565b604082019050919050565b5f6020820190508181035f8301526158d281615899565b9050919050565b7f436f6e74726163742074726164696e672072657374726963746564206174206c5f8201527f61756e6368000000000000000000000000000000000000000000000000000000602082015250565b5f615933602583614710565b915061593e826158d9565b604082019050919050565b5f6020820190508181035f83015261596081615927565b9050919050565b615970816144d0565b82525050565b5f6020820190506159895f830184615967565b92915050565b5f8151905061599d81614d01565b92915050565b5f602082840312156159b8576159b76143d5565b5b5f6159c58482850161598f565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f6159f2826159ce565b6159fc81856159d8565b9350615a0c818560208601614720565b615a158161458b565b840191505092915050565b5f60a082019050615a335f8301886147cb565b615a4060208301876147cb565b615a4d60408301866144a8565b615a5a60608301856144a8565b8181036080830152615a6c81846159e8565b90509695505050505050565b5f81519050615a86816144fb565b92915050565b5f60208284031215615aa157615aa06143d5565b5b5f615aae84828501615a78565b91505092915050565b5f8160e01c9050919050565b5f60033d1115615adf5760045f803e615adc5f51615ab7565b90505b90565b5f60443d10615b6e57615af36143cc565b60043d036004823e80513d602482011167ffffffffffffffff82111715615b1b575050615b6e565b808201805167ffffffffffffffff811115615b395750505050615b6e565b80602083010160043d038501811115615b56575050505050615b6e565b615b65826020018501866145c8565b82955050505050505b90565b5f608082019050615b845f8301876147cb565b615b9160208301866147cb565b615b9e60408301856144a8565b8181036060830152615bb081846159e8565b905095945050505050565b5f60a082019050615bce5f8301886147cb565b615bdb60208301876147cb565b8181036040830152615bed8186614c85565b90508181036060830152615c018185614c85565b90508181036080830152615c1581846159e8565b90509695505050505050565b5f819050919050565b5f615c44615c3f615c3a84615c21565b614f40565b614437565b9050919050565b615c5481615c2a565b82525050565b5f604082019050615c6d5f8301856144a8565b615c7a6020830184615c4b565b939250505056fe456e747279206c6576656c204e46547320706f776572656420627920455243313135352e205468652073696c766572204e46547320617265206d696e6564206279206173706972696e6720636f6c6c6563746f727320616e64206d65746963756c6f75736c79206372616674656420666f72206163636573736962696c6974792e526566696e6564204e46547320706f776572656420627920455243313135352e205468652073696c766572204e46547320617265206d696e656420627920736561736f6e656420656e7468757369617374732c20616464696e6720616e206578747261206c61796572206f6620736f706869737469636174696f6e20746f20796f757220706f7274666f6c696f2e4c6567656e64617279204e46547320706f776572656420627920455243313135352e20546865204469616d6f6e64204e46547320617265206d65746963756c6f75736c79206d696e656420627920696e64757374727920656c6974657320616e642063726166746564207769746820756e706172616c6c656c656420707265636973696f6e2c20726570726573656e74696e6720746865207a656e697468206f66206c757875727920616e64206469676974616c2061727469737472792e50726573746967696f7573204e46547320706f776572656420627920455243313135352e2054686520676f6c64204e46547320617265206361726566756c6c79206d696e65642062792065787065727420636f6c6c6563746f727320616e64206d65746963756c6f75736c792063726166746564207769746820676f6c64656e20657863656c6c656e63652c2073796d626f6c697a696e67207468652070696e6e61636c65206f66206469676974616c2072617269747920616e64206578636c757369766974792ea26469706673582212209e3afb3651f1ccb66377c91c3dc84aba09bd01d49d37899c5da2eec423755b3764736f6c63430008180033
Deployed Bytecode
0x608060405234801561000f575f80fd5b5060043610610245575f3560e01c806370a0823111610139578063c5b8f772116100b6578063e985e9c51161007a578063e985e9c51461074d578063f242432a1461077d578063f28ca1dd14610799578063f2fde38b146107b7578063f8b45b05146107d357610245565b8063c5b8f77214610683578063c87b56dd146106b3578063d547cfb7146106e3578063dd62ed3e14610701578063e0df5b6f1461073157610245565b806399a2557a116100fd57806399a2557a146105b95780639b19251a146105e9578063a014e6e214610619578063a22cb46514610637578063a9059cbb1461065357610245565b806370a0823114610513578063715018a6146105435780638462151c1461054d5780638da5cb5b1461057d57806395d89b411461059b57610245565b806323b872dd116101c75780634eabf2c61161018b5780634eabf2c61461049557806353d6fd591461049f5780635afcc2f5146104bb5780635d0044ca146104d95780636d6a6a4d146104f557610245565b806323b872dd146103cb5780632d760d57146103fb5780632eb2c2d61461042b578063313ce567146104475780634e1273f41461046557610245565b8063095ea7b31161020e578063095ea7b3146103135780630a702e8d146103435780630e89341c1461036157806318160ddd1461039157806318d217c3146103af57610245565b8062fdd58e1461024957806301ffc9a71461027957806302fe5305146102a957806306fdde03146102c5578063081812fc146102e3575b5f80fd5b610263600480360381019061025e919061446a565b6107f1565b60405161027091906144b7565b60405180910390f35b610293600480360381019061028e9190614525565b6108be565b6040516102a0919061456a565b60405180910390f35b6102c360048036038101906102be91906146bf565b610a67565b005b6102cd610a7b565b6040516102da9190614780565b60405180910390f35b6102fd60048036038101906102f891906147a0565b610b07565b60405161030a91906147da565b60405180910390f35b61032d6004803603810190610328919061446a565b610b37565b60405161033a919061456a565b60405180910390f35b61034b610c71565b604051610358919061456a565b60405180910390f35b61037b600480360381019061037691906147a0565b610c83565b6040516103889190614780565b60405180910390f35b610399610c95565b6040516103a691906144b7565b60405180910390f35b6103c960048036038101906103c491906146bf565b610cb9565b005b6103e560048036038101906103e091906147f3565b610cd4565b6040516103f2919061456a565b60405180910390f35b61041560048036038101906104109190614843565b610f06565b60405161042291906144b7565b60405180910390f35b610445600480360381019061044091906149f5565b610f6c565b005b61044f611004565b60405161045c9190614adb565b60405180910390f35b61047f600480360381019061047a9190614bb4565b611028565b60405161048c9190614ce1565b60405180910390f35b61049d611130565b005b6104b960048036038101906104b49190614d2b565b611162565b005b6104c36111c2565b6040516104d091906144b7565b60405180910390f35b6104f360048036038101906104ee91906147a0565b6111e6565b005b6104fd61122f565b60405161050a91906144b7565b60405180910390f35b61052d60048036038101906105289190614d69565b611253565b60405161053a91906144b7565b60405180910390f35b61054b611299565b005b61056760048036038101906105629190614d69565b6112ac565b6040516105749190614ce1565b60405180910390f35b61058561132d565b60405161059291906147da565b60405180910390f35b6105a3611354565b6040516105b09190614780565b60405180910390f35b6105d360048036038101906105ce9190614843565b6113e0565b6040516105e09190614ce1565b60405180910390f35b61060360048036038101906105fe9190614d69565b611561565b604051610610919061456a565b60405180910390f35b61062161157e565b60405161062e91906144b7565b60405180910390f35b610651600480360381019061064c9190614d2b565b611584565b005b61066d6004803603810190610668919061446a565b61159a565b60405161067a919061456a565b60405180910390f35b61069d6004803603810190610698919061446a565b6115b7565b6040516106aa919061456a565b60405180910390f35b6106cd60048036038101906106c891906147a0565b61160f565b6040516106da9190614780565b60405180910390f35b6106eb6119b9565b6040516106f89190614780565b60405180910390f35b61071b60048036038101906107169190614d94565b611a45565b60405161072891906144b7565b60405180910390f35b61074b600480360381019061074691906146bf565b611ac7565b005b61076760048036038101906107629190614d94565b611ae2565b604051610774919061456a565b60405180910390f35b61079760048036038101906107929190614dd2565b611b70565b005b6107a1611c10565b6040516107ae9190614780565b60405180910390f35b6107d160048036038101906107cc9190614d69565b611c9c565b005b6107db611d20565b6040516107e891906144b7565b60405180910390f35b5f8073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610857576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108a68260015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20611d2690919063ffffffff16565b156108b457600190506108b8565b5f90505b92915050565b5f7fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061098857507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109f057507fc5b8f772000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a2057506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a505750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a605750610a5f82611d54565b5b9050919050565b610a6f611dbd565b610a7881611e44565b50565b60088054610a8890614e92565b80601f0160208091040260200160405190810160405280929190818152602001828054610ab490614e92565b8015610aff5780601f10610ad657610100808354040283529160200191610aff565b820191905f5260205f20905b815481529060010190602001808311610ae257829003601f168201915b505050505081565b6005602052805f5260405f205f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f80339050610b44611e57565b83108015610b5157505f83115b15610c5a57610b6081846115b7565b610ba157806040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401610b9891906147da565b60405180910390fd5b8360055f8581526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92585604051610c4d91906144b7565b60405180910390a3610c66565b610c65818585611e60565b5b600191505092915050565b600f5f9054906101000a900460ff1681565b6060610c8e8261160f565b9050919050565b7f00000000000000000000000000000000000000000000021e19e0c9bab240000081565b610cc1611dbd565b80600c9081610cd0919061505f565b5050565b5f610cdd611e57565b821015610ee257610d338260015f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20611d2690919063ffffffff16565b610d7457836040517f94280d62000000000000000000000000000000000000000000000000000000008152600401610d6b91906147da565b60405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015610db75750610db58433611ae2565b155b8015610e1f575060055f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b15610e6157336040517f94280d62000000000000000000000000000000000000000000000000000000008152600401610e5891906147da565b60405180910390fd5b610e8d84847f0000000000000000000000000000000000000000000000000de0b6b3a76400005f611e72565b60055f8381526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055610edd848484600160405180602001604052805f8152505f611f64565b610efb565b610eed843384612253565b610efa8484846001611e72565b5b600190509392505050565b5f610f63838484610f17919061515b565b60015f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206122e59092919063ffffffff16565b90509392505050565b610f746123a3565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610fba5750610fb985610fb46123a3565b611ae2565b5b610ff0576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ffd85858585856123aa565b5050505050565b7f000000000000000000000000000000000000000000000000000000000000001281565b60608151835114611065576040517f7801f4e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f835167ffffffffffffffff8111156110815761108061459b565b5b6040519080825280602002602001820160405280156110af5781602001602082028036833780820191505090505b5090505f5b8451811015611125576110fb8582815181106110d3576110d261518e565b5b60200260200101518583815181106110ee576110ed61518e565b5b60200260200101516107f1565b82828151811061110e5761110d61518e565b5b6020026020010181815250508060010190506110b4565b508091505092915050565b611138611dbd565b600f5f9054906101000a900460ff1615600f5f6101000a81548160ff021916908315150217905550565b61116a611dbd565b80600a5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b7f0000000000000000000000000000000000000000000000000de0b6b3a764000081565b6111ee611dbd565b6064817f00000000000000000000000000000000000000000000021e19e0c9bab240000061121c91906151bb565b6112269190615229565b600e8190555050565b7f0000000000000000000000000000000000000000000000000de0b6b3a764000081565b5f60065f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b6112a1611dbd565b6112aa5f612779565b565b60605f6112b761283a565b0361130c575f67ffffffffffffffff8111156112d6576112d561459b565b5b6040519080825280602002602001820160405280156113045781602001602082028036833780820191505090505b509050611328565b6113258261131861285a565b611320611e57565b6113e0565b90505b919050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6009805461136190614e92565b80601f016020809104026020016040519081016040528092919081815260200182805461138d90614e92565b80156113d85780601f106113af576101008083540402835291602001916113d8565b820191905f5260205f20905b8154815290600101906020018083116113bb57829003601f168201915b505050505081565b606081831061141b576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61142361285a565b8310156114355761143261285a565b92505b5f61143e611e57565b90508083111561144c578092505b5f8385101561146757611460868686610f06565b905061146b565b5f90505b5f8167ffffffffffffffff8111156114865761148561459b565b5b6040519080825280602002602001820160405280156114b45781602001602082028036833780820191505090505b5090505f60015f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2090505f80885f915091505b8481146115515761151a8284611d2690919063ffffffff16565b1561154657818482806001019350815181106115395761153861518e565b5b6020026020010181815250505b816001019150611500565b5050819450505050509392505050565b600a602052805f5260405f205f915054906101000a900460ff1681565b600b5481565b61159661158f6123a3565b8383612862565b5050565b5f803390506115ac8185856001611e72565b600191505092915050565b5f6116078260015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20611d2690919063ffffffff16565b905092915050565b6060611619611e57565b8210611651576040517f7801f4e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f61165b836129c9565b5111156116725761166b826129c9565b90506119b4565b5f600d805461168090614e92565b905011156116ba57600d61169383612a5b565b6040516020016116a4929190615313565b60405160208183030381529060405290506119b4565b5f826040516020016116cc9190615356565b6040516020818303038152906040528051906020012060f81c90506060806060603f8460ff1611611787576040518060400160405280601381526020017f475152685779462f4469616d6f6e642e6a70670000000000000000000000000081525092506040518060400160405280600781526020017f4469616d6f6e640000000000000000000000000000000000000000000000000081525091506040518060e0016040528060be8152602001615d9160be91399050611958565b607f8460ff1611611823576040518060400160405280601081526020017f6777644c6633662f476f6c642e6a70670000000000000000000000000000000081525092506040518060400160405280600481526020017f476f6c6400000000000000000000000000000000000000000000000000000000815250915060405180610100016040528060c88152602001615e4f60c891399050611957565b60bf8460ff16116118be576040518060400160405280601281526020017f464a6d6472646d2f53696c7665722e6a7067000000000000000000000000000081525092506040518060400160405280600681526020017f53696c766572000000000000000000000000000000000000000000000000000081525091506040518060c00160405280608e8152602001615d03608e91399050611956565b60ff8460ff1611611955576040518060400160405280601281526020017f594c47334a76632f42726f6e7a652e6a7067000000000000000000000000000081525092506040518060400160405280600681526020017f42726f6e7a65000000000000000000000000000000000000000000000000000081525091506040518060c0016040528060818152602001615c826081913990505b5b5b5b5f61196287612a5b565b82600c866040516020016119799493929190615474565b6040516020818303038152906040529050808360405160200161199d9291906155d6565b604051602081830303815290604052955050505050505b919050565b600d80546119c690614e92565b80601f01602080910402602001604051908101604052809291908181526020018280546119f290614e92565b8015611a3d5780601f10611a1457610100808354040283529160200191611a3d565b820191905f5260205f20905b815481529060010190602001808311611a2057829003601f168201915b505050505081565b5f60075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b611acf611dbd565b80600d9081611ade919061505f565b5050565b5f60025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b611b786123a3565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611bbe5750611bbd85611bb86123a3565b611ae2565b5b15611bd757611bd285858585856001611f64565b611c09565b6040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b600c8054611c1d90614e92565b80601f0160208091040260200160405190810160405280929190818152602001828054611c4990614e92565b8015611c945780601f10611c6b57610100808354040283529160200191611c94565b820191905f5260205f20905b815481529060010190602001808311611c7757829003601f168201915b505050505081565b611ca4611dbd565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611d14575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401611d0b91906147da565b60405180910390fd5b611d1d81612779565b50565b600e5481565b5f80600160ff8416855f015f600887901c81526020019081526020015f2054901c1690508091505092915050565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b611dc56123a3565b73ffffffffffffffffffffffffffffffffffffffff16611de361132d565b73ffffffffffffffffffffffffffffffffffffffff1614611e4257611e066123a3565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401611e3991906147da565b60405180910390fd5b565b8060039081611e53919061505f565b5050565b5f600454905090565b611e6d8383836001612bb4565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611ee2575f6040517f96c6fd1e000000000000000000000000000000000000000000000000000000008152600401611ed991906147da565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611f52575f6040517fec442f05000000000000000000000000000000000000000000000000000000008152600401611f4991906147da565b60405180910390fd5b611f5e84848484612d83565b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611fc9576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f611fd26123a3565b90505f611fde866131ac565b9050611fec8289898461321f565b60018514801561204757506120468660015f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20611d2690919063ffffffff16565b5b1561211b5761209b8660015f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061322590919063ffffffff16565b6120ea8660015f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061325490919063ffffffff16565b61211688887f0000000000000000000000000000000000000000000000000de0b6b3a76400005f611e72565b61214d565b6040517f37dbad3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8073ffffffffffffffffffffffffffffffffffffffff8916915073ffffffffffffffffffffffffffffffffffffffff8a1690508682827fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a48873ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628b8b60405161221e92919061561a565b60405180910390a4612232848b8b86613282565b841561224757612246848b8b8b8b8b6134b6565b5b50505050505050505050565b5f61225e8484611a45565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146122df57818110156122d0578281836040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526004016122c793929190615641565b60405180910390fd5b6122de84848484035f612bb4565b5b50505050565b5f80600884901c90505f60ff85169050610101818501106123715761231e81875f015f8581526020019081526020015f2054901c6138b2565b92505f6008828601901c8301905060ff8286011694505f91508260010192505b80831461236f57612360875f015f8581526020019081526020015f20546138b2565b8401935082600101925061233e565b505b612396846101000382885f015f8681526020019081526020015f2054901c901b6138b2565b8301925050509392505050565b5f33905090565b81518351146123e5576040517f7801f4e900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361244a576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6124536123a3565b90506124618187878761321f565b5f5b84518110156125ea575f8582815181106124805761247f61518e565b5b602002602001015190505f85838151811061249e5761249d61518e565b5b6020026020010151905060018114801561250357506125028260015f8c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20611d2690919063ffffffff16565b5b156125ab576125578260015f8c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061322590919063ffffffff16565b6125a68260015f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061325490919063ffffffff16565b6125dd565b6040517f37dbad3d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050806001019050612463565b50612623868686517f0000000000000000000000000000000000000000000000000de0b6b3a764000061261d91906151bb565b5f611e72565b5f805f600187516126349190615676565b905073ffffffffffffffffffffffffffffffffffffffff8916915073ffffffffffffffffffffffffffffffffffffffff88169250602087015183837fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a460025b8181146126d5578060200288015184847fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4600181019050612696565b508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8a8a60405161274c9291906156a9565b60405180910390a4612760848a8a8a613282565b61276e848a8a8a8a8a6138fb565b505050505050505050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f61284361285a565b61284b611e57565b612855919061515b565b905090565b5f6001905090565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036128d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128c79061574e565b60405180910390fd5b8060025f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516129bc919061456a565b60405180910390a3505050565b6060600380546129d890614e92565b80601f0160208091040260200160405190810160405280929190818152602001828054612a0490614e92565b8015612a4f5780601f10612a2657610100808354040283529160200191612a4f565b820191905f5260205f20905b815481529060010190602001808311612a3257829003601f168201915b50505050509050919050565b60605f8203612aa1576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612baf565b5f8290505f5b5f8214612ad0578080612ab99061576c565b915050600a82612ac99190615229565b9150612aa7565b5f8167ffffffffffffffff811115612aeb57612aea61459b565b5b6040519080825280601f01601f191660200182016040528015612b1d5781602001600182028036833780820191505090505b5090505b5f8514612ba857600182612b35919061515b565b9150600a85612b4491906157b3565b6030612b509190615676565b60f81b818381518110612b6657612b6561518e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600a85612ba19190615229565b9450612b21565b8093505050505b919050565b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612c24575f6040517fe602df05000000000000000000000000000000000000000000000000000000008152600401612c1b91906147da565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612c94575f6040517f94280d62000000000000000000000000000000000000000000000000000000008152600401612c8b91906147da565b60405180910390fd5b8160075f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508015612d7d578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051612d7491906144b7565b60405180910390a35b50505050565b5f60065f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f60065f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905083821015612e4e578582856040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401612e4593929190615641565b60405180910390fd5b83820360065f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555083810160065f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef86604051612f3391906144b7565b60405180910390a382156131a4575f600a5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905080613018575f7f0000000000000000000000000000000000000000000000000de0b6b3a76400008685612fc1919061515b565b612fcb9190615229565b7f0000000000000000000000000000000000000000000000000de0b6b3a764000085612ff79190615229565b613001919061515b565b90505f811115613016576130158882613abf565b5b505b600a5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166131a2576001600b541480156130755750805b80156130b3575061308461132d565b73ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff16145b1561311a576001600a5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506002600b819055506131a1565b5f7f0000000000000000000000000000000000000000000000000de0b6b3a7640000836131479190615229565b7f0000000000000000000000000000000000000000000000000de0b6b3a764000087856131749190615676565b61317e9190615229565b613188919061515b565b90505f81111561319f5761319c8782613eaf565b50505b505b5b505b505050505050565b6060600167ffffffffffffffff8111156131c9576131c861459b565b5b6040519080825280602002602001820160405280156131f75781602001602082028036833780820191505090505b50905081815f8151811061320e5761320d61518e565b5b602002602001018181525050919050565b50505050565b60ff81166001901b19825f015f600884901c81526020019081526020015f205f82825416925050819055505050565b60ff81166001901b825f015f600884901c81526020019081526020015f205f82825417925050819055505050565b600a5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff166134a457600e5460065f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541115613352576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133499061582d565b60405180910390fd5b600f5f9054906101000a900460ff16156134a3574360105f3273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054106133e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133dc906158bb565b60405180910390fd5b4360105f3273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505f8273ffffffffffffffffffffffffffffffffffffffff163b14801561346357505f3273ffffffffffffffffffffffffffffffffffffffff163b145b6134a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161349990615949565b60405180910390fd5b5b5b6134b08484848461421e565b50505050565b6134d58473ffffffffffffffffffffffffffffffffffffffff16614224565b156138aa578373ffffffffffffffffffffffffffffffffffffffff166301ffc9a77fd9b67a26000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b81526004016135339190615976565b602060405180830381865afa15801561354e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061357291906159a3565b15613713578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b81526004016135b8959493929190615a20565b6020604051808303815f875af19250505080156135f357506040513d601f19601f820116820180604052508101906135f09190615a8c565b60015b61368f576135ff615ac3565b806308c379a00361365b5750613613615ae2565b8061361e575061365d565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136529190614780565b60405180910390fd5b505b6040517f9c05499b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161461370d576040517f9c05499b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506138a9565b8373ffffffffffffffffffffffffffffffffffffffff1663150b7a02878786856040518563ffffffff1660e01b81526004016137529493929190615b71565b6020604051808303815f875af192505050801561378d57506040513d601f19601f8201168201806040525081019061378a9190615a8c565b60015b61382957613799615ac3565b806308c379a0036137f557506137ad615ae2565b806137b857506137f7565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137ec9190614780565b60405180910390fd5b505b6040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916146138a7576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b5b505050505050565b5f8019808314600382048460011c1684039350600582048460021c16600583048516019350601182048460041c850116935060ff8204840260f81c8160081b1792505050919050565b61391a8473ffffffffffffffffffffffffffffffffffffffff16614224565b15613ab7578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b8152600401613960959493929190615bbb565b6020604051808303815f875af192505050801561399b57506040513d601f19601f820116820180604052508101906139989190615a8c565b60015b613a37576139a7615ac3565b806308c379a003613a0357506139bb615ae2565b806139c65750613a05565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016139fa9190614780565b60405180910390fd5b505b6040517f9c05499b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614613ab5576040517f9c05499b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b505050505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603613b24576040517fb817eee700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f613b2d6123a3565b90505f613b38611e57565b90505f8367ffffffffffffffff811115613b5557613b5461459b565b5b604051908082528060200260200182016040528015613b835781602001602082028036833780820191505090505b5090505f8467ffffffffffffffff811115613ba157613ba061459b565b5b604051908082528060200260200182016040528015613bcf5781602001602082028036833780820191505090505b5090505f5b85811015613ccf576001838281518110613bf157613bf061518e565b5b6020026020010181815250505f613c4d8560015f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061423590919063ffffffff16565b905080838381518110613c6357613c6261518e565b5b602002602001018181525050613cbe8160015f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2061322590919063ffffffff16565b809450508080600101915050613bd4565b50613cdc84875f8461321f565b5f80600187613ceb9190615676565b905073ffffffffffffffffffffffffffffffffffffffff8816915060208301515f837fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a460025b818114613d7357806020028401515f847fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4600181019050613d34565b5060018703613e1a575f73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62865f81518110613df557613df461518e565b5b60200260200101516001604051613e0d929190615c5a565b60405180910390a4613e99565b5f73ffffffffffffffffffffffffffffffffffffffff168873ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8688604051613e909291906156a9565b60405180910390a45b613ea586895f86613282565b5050505050505050565b6060805f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603613f17576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8303613f50576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f613f596123a3565b90508367ffffffffffffffff811115613f7557613f7461459b565b5b604051908082528060200260200182016040528015613fa35781602001602082028036833780820191505090505b5092508367ffffffffffffffff811115613fc057613fbf61459b565b5b604051908082528060200260200182016040528015613fee5781602001602082028036833780820191505090505b5091505f613ffa611e57565b905080857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03101561402a575f80fd5b5f5b858110156140845780820185828151811061404a5761404961518e565b5b602002602001018181525050600184828151811061406b5761406a61518e565b5b602002602001018181525050808060010191505061402c565b50614091825f888761321f565b6140e2818660015f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206142ae9092919063ffffffff16565b8460045f8282546140f39190615676565b925050819055505f8086836141089190615676565b905073ffffffffffffffffffffffffffffffffffffffff8816915082825f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4600183015b8181146141885780835f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a460018101905061414f565b508773ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb89896040516141ff9291906156a9565b60405180910390a4614213845f8a89613282565b505050509250929050565b50505050565b5f80823b90505f8111915050919050565b5f805f801992508360081c9150815f5284602052831960ff1660405f2054811b811c915082158217614283575b600115614282578383019250825f5260405f205491508215821715614262575b5b505f81146142a6576142948161432b565b600883901b1792508383115f03831792505b505092915050565b5f1960ff8316846020528360081c5f52610101838201106143115760405f2082821b815417815560015f510182850160081c5f510160ff8487011695505f93505b80821461430a57815f528460405f20556001820191506142ef565b815f525050505b60405f208284610100031c821b8154178155505050505050565b5f816fffffffffffffffffffffffffffffffff1060071b821560081b17905081811c67ffffffffffffffff1060061b8117905081811c63ffffffff1060051b8117905081811c61ffff1060041b8117905081811c60ff1060031b811790507f07060605060205040602030205040301060502050303040105050304000000006f8421084210842108cc6318c6db6d54be83831c1c601f161a81179050919050565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f614406826143dd565b9050919050565b614416816143fc565b8114614420575f80fd5b50565b5f813590506144318161440d565b92915050565b5f819050919050565b61444981614437565b8114614453575f80fd5b50565b5f8135905061446481614440565b92915050565b5f80604083850312156144805761447f6143d5565b5b5f61448d85828601614423565b925050602061449e85828601614456565b9150509250929050565b6144b181614437565b82525050565b5f6020820190506144ca5f8301846144a8565b92915050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b614504816144d0565b811461450e575f80fd5b50565b5f8135905061451f816144fb565b92915050565b5f6020828403121561453a576145396143d5565b5b5f61454784828501614511565b91505092915050565b5f8115159050919050565b61456481614550565b82525050565b5f60208201905061457d5f83018461455b565b92915050565b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6145d18261458b565b810181811067ffffffffffffffff821117156145f0576145ef61459b565b5b80604052505050565b5f6146026143cc565b905061460e82826145c8565b919050565b5f67ffffffffffffffff82111561462d5761462c61459b565b5b6146368261458b565b9050602081019050919050565b828183375f83830152505050565b5f61466361465e84614613565b6145f9565b90508281526020810184848401111561467f5761467e614587565b5b61468a848285614643565b509392505050565b5f82601f8301126146a6576146a5614583565b5b81356146b6848260208601614651565b91505092915050565b5f602082840312156146d4576146d36143d5565b5b5f82013567ffffffffffffffff8111156146f1576146f06143d9565b5b6146fd84828501614692565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b8381101561473d578082015181840152602081019050614722565b5f8484015250505050565b5f61475282614706565b61475c8185614710565b935061476c818560208601614720565b6147758161458b565b840191505092915050565b5f6020820190508181035f8301526147988184614748565b905092915050565b5f602082840312156147b5576147b46143d5565b5b5f6147c284828501614456565b91505092915050565b6147d4816143fc565b82525050565b5f6020820190506147ed5f8301846147cb565b92915050565b5f805f6060848603121561480a576148096143d5565b5b5f61481786828701614423565b935050602061482886828701614423565b925050604061483986828701614456565b9150509250925092565b5f805f6060848603121561485a576148596143d5565b5b5f61486786828701614423565b935050602061487886828701614456565b925050604061488986828701614456565b9150509250925092565b5f67ffffffffffffffff8211156148ad576148ac61459b565b5b602082029050602081019050919050565b5f80fd5b5f6148d46148cf84614893565b6145f9565b905080838252602082019050602084028301858111156148f7576148f66148be565b5b835b81811015614920578061490c8882614456565b8452602084019350506020810190506148f9565b5050509392505050565b5f82601f83011261493e5761493d614583565b5b813561494e8482602086016148c2565b91505092915050565b5f67ffffffffffffffff8211156149715761497061459b565b5b61497a8261458b565b9050602081019050919050565b5f61499961499484614957565b6145f9565b9050828152602081018484840111156149b5576149b4614587565b5b6149c0848285614643565b509392505050565b5f82601f8301126149dc576149db614583565b5b81356149ec848260208601614987565b91505092915050565b5f805f805f60a08688031215614a0e57614a0d6143d5565b5b5f614a1b88828901614423565b9550506020614a2c88828901614423565b945050604086013567ffffffffffffffff811115614a4d57614a4c6143d9565b5b614a598882890161492a565b935050606086013567ffffffffffffffff811115614a7a57614a796143d9565b5b614a868882890161492a565b925050608086013567ffffffffffffffff811115614aa757614aa66143d9565b5b614ab3888289016149c8565b9150509295509295909350565b5f60ff82169050919050565b614ad581614ac0565b82525050565b5f602082019050614aee5f830184614acc565b92915050565b5f67ffffffffffffffff821115614b0e57614b0d61459b565b5b602082029050602081019050919050565b5f614b31614b2c84614af4565b6145f9565b90508083825260208201905060208402830185811115614b5457614b536148be565b5b835b81811015614b7d5780614b698882614423565b845260208401935050602081019050614b56565b5050509392505050565b5f82601f830112614b9b57614b9a614583565b5b8135614bab848260208601614b1f565b91505092915050565b5f8060408385031215614bca57614bc96143d5565b5b5f83013567ffffffffffffffff811115614be757614be66143d9565b5b614bf385828601614b87565b925050602083013567ffffffffffffffff811115614c1457614c136143d9565b5b614c208582860161492a565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b614c5c81614437565b82525050565b5f614c6d8383614c53565b60208301905092915050565b5f602082019050919050565b5f614c8f82614c2a565b614c998185614c34565b9350614ca483614c44565b805f5b83811015614cd4578151614cbb8882614c62565b9750614cc683614c79565b925050600181019050614ca7565b5085935050505092915050565b5f6020820190508181035f830152614cf98184614c85565b905092915050565b614d0a81614550565b8114614d14575f80fd5b50565b5f81359050614d2581614d01565b92915050565b5f8060408385031215614d4157614d406143d5565b5b5f614d4e85828601614423565b9250506020614d5f85828601614d17565b9150509250929050565b5f60208284031215614d7e57614d7d6143d5565b5b5f614d8b84828501614423565b91505092915050565b5f8060408385031215614daa57614da96143d5565b5b5f614db785828601614423565b9250506020614dc885828601614423565b9150509250929050565b5f805f805f60a08688031215614deb57614dea6143d5565b5b5f614df888828901614423565b9550506020614e0988828901614423565b9450506040614e1a88828901614456565b9350506060614e2b88828901614456565b925050608086013567ffffffffffffffff811115614e4c57614e4b6143d9565b5b614e58888289016149c8565b9150509295509295909350565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680614ea957607f821691505b602082108103614ebc57614ebb614e65565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302614f1e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614ee3565b614f288683614ee3565b95508019841693508086168417925050509392505050565b5f819050919050565b5f614f63614f5e614f5984614437565b614f40565b614437565b9050919050565b5f819050919050565b614f7c83614f49565b614f90614f8882614f6a565b848454614eef565b825550505050565b5f90565b614fa4614f98565b614faf818484614f73565b505050565b5b81811015614fd257614fc75f82614f9c565b600181019050614fb5565b5050565b601f82111561501757614fe881614ec2565b614ff184614ed4565b81016020851015615000578190505b61501461500c85614ed4565b830182614fb4565b50505b505050565b5f82821c905092915050565b5f6150375f198460080261501c565b1980831691505092915050565b5f61504f8383615028565b9150826002028217905092915050565b61506882614706565b67ffffffffffffffff8111156150815761508061459b565b5b61508b8254614e92565b615096828285614fd6565b5f60209050601f8311600181146150c7575f84156150b5578287015190505b6150bf8582615044565b865550615126565b601f1984166150d586614ec2565b5f5b828110156150fc578489015182556001820191506020850194506020810190506150d7565b868310156151195784890151615115601f891682615028565b8355505b6001600288020188555050505b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61516582614437565b915061517083614437565b92508282039050818111156151885761518761512e565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f6151c582614437565b91506151d083614437565b92508282026151de81614437565b915082820484148315176151f5576151f461512e565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61523382614437565b915061523e83614437565b92508261524e5761524d6151fc565b5b828204905092915050565b5f81905092915050565b5f815461526f81614e92565b6152798186615259565b9450600182165f811461529357600181146152a8576152da565b60ff19831686528115158202860193506152da565b6152b185614ec2565b5f5b838110156152d2578154818901526001820191506020810190506152b3565b838801955050505b50505092915050565b5f6152ed82614706565b6152f78185615259565b9350615307818560208601614720565b80840191505092915050565b5f61531e8285615263565b915061532a82846152e3565b91508190509392505050565b5f819050919050565b61535061534b82614437565b615336565b82525050565b5f615361828461533f565b60208201915081905092915050565b7f7b226e616d65223a202257494e455220230000000000000000000000000000005f82015250565b5f6153a4601183615259565b91506153af82615370565b601182019050919050565b7f222c226465736372697074696f6e223a220000000000000000000000000000005f82015250565b5f6153ee601183615259565b91506153f9826153ba565b601182019050919050565b7f222c2265787465726e616c5f75726c223a2268747470733a2f2f6d696e65722e5f8201527f6275696c64222c22696d616765223a2200000000000000000000000000000000602082015250565b5f61545e603083615259565b915061546982615404565b603082019050919050565b5f61547e82615398565b915061548a82876152e3565b9150615495826153e2565b91506154a182866152e3565b91506154ac82615452565b91506154b88285615263565b91506154c482846152e3565b915081905095945050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b757466382c00000000005f82015250565b5f615506601b83615259565b9150615511826154d2565b601b82019050919050565b7f222c2261747472696275746573223a5b7b2274726169745f74797065223a22435f8201527f6f6c6f72222c2276616c7565223a220000000000000000000000000000000000602082015250565b5f615576602f83615259565b91506155818261551c565b602f82019050919050565b7f227d5d7d000000000000000000000000000000000000000000000000000000005f82015250565b5f6155c0600483615259565b91506155cb8261558c565b600482019050919050565b5f6155e0826154fa565b91506155ec82856152e3565b91506155f78261556a565b915061560382846152e3565b915061560e826155b4565b91508190509392505050565b5f60408201905061562d5f8301856144a8565b61563a60208301846144a8565b9392505050565b5f6060820190506156545f8301866147cb565b61566160208301856144a8565b61566e60408301846144a8565b949350505050565b5f61568082614437565b915061568b83614437565b92508282019050808211156156a3576156a261512e565b5b92915050565b5f6040820190508181035f8301526156c18185614c85565b905081810360208301526156d58184614c85565b90509392505050565b7f455243313135353a2073657474696e6720617070726f76616c207374617475735f8201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b5f615738602983614710565b9150615743826156de565b604082019050919050565b5f6020820190508181035f8301526157658161572c565b9050919050565b5f61577682614437565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036157a8576157a761512e565b5b600182019050919050565b5f6157bd82614437565b91506157c883614437565b9250826157d8576157d76151fc565b5b828206905092915050565b7f5472616e736665722065786365656473206d6178696d756d2077616c6c6574005f82015250565b5f615817601f83614710565b9150615822826157e3565b602082019050919050565b5f6020820190508181035f8301526158448161580b565b9050919050565b7f4f6e6c79206f6e65207472616e736665722070657220626c6f636b20616c6c6f5f8201527f7765642e00000000000000000000000000000000000000000000000000000000602082015250565b5f6158a5602483614710565b91506158b08261584b565b604082019050919050565b5f6020820190508181035f8301526158d281615899565b9050919050565b7f436f6e74726163742074726164696e672072657374726963746564206174206c5f8201527f61756e6368000000000000000000000000000000000000000000000000000000602082015250565b5f615933602583614710565b915061593e826158d9565b604082019050919050565b5f6020820190508181035f83015261596081615927565b9050919050565b615970816144d0565b82525050565b5f6020820190506159895f830184615967565b92915050565b5f8151905061599d81614d01565b92915050565b5f602082840312156159b8576159b76143d5565b5b5f6159c58482850161598f565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f6159f2826159ce565b6159fc81856159d8565b9350615a0c818560208601614720565b615a158161458b565b840191505092915050565b5f60a082019050615a335f8301886147cb565b615a4060208301876147cb565b615a4d60408301866144a8565b615a5a60608301856144a8565b8181036080830152615a6c81846159e8565b90509695505050505050565b5f81519050615a86816144fb565b92915050565b5f60208284031215615aa157615aa06143d5565b5b5f615aae84828501615a78565b91505092915050565b5f8160e01c9050919050565b5f60033d1115615adf5760045f803e615adc5f51615ab7565b90505b90565b5f60443d10615b6e57615af36143cc565b60043d036004823e80513d602482011167ffffffffffffffff82111715615b1b575050615b6e565b808201805167ffffffffffffffff811115615b395750505050615b6e565b80602083010160043d038501811115615b56575050505050615b6e565b615b65826020018501866145c8565b82955050505050505b90565b5f608082019050615b845f8301876147cb565b615b9160208301866147cb565b615b9e60408301856144a8565b8181036060830152615bb081846159e8565b905095945050505050565b5f60a082019050615bce5f8301886147cb565b615bdb60208301876147cb565b8181036040830152615bed8186614c85565b90508181036060830152615c018185614c85565b90508181036080830152615c1581846159e8565b90509695505050505050565b5f819050919050565b5f615c44615c3f615c3a84615c21565b614f40565b614437565b9050919050565b615c5481615c2a565b82525050565b5f604082019050615c6d5f8301856144a8565b615c7a6020830184615c4b565b939250505056fe456e747279206c6576656c204e46547320706f776572656420627920455243313135352e205468652073696c766572204e46547320617265206d696e6564206279206173706972696e6720636f6c6c6563746f727320616e64206d65746963756c6f75736c79206372616674656420666f72206163636573736962696c6974792e526566696e6564204e46547320706f776572656420627920455243313135352e205468652073696c766572204e46547320617265206d696e656420627920736561736f6e656420656e7468757369617374732c20616464696e6720616e206578747261206c61796572206f6620736f706869737469636174696f6e20746f20796f757220706f7274666f6c696f2e4c6567656e64617279204e46547320706f776572656420627920455243313135352e20546865204469616d6f6e64204e46547320617265206d65746963756c6f75736c79206d696e656420627920696e64757374727920656c6974657320616e642063726166746564207769746820756e706172616c6c656c656420707265636973696f6e2c20726570726573656e74696e6720746865207a656e697468206f66206c757875727920616e64206469676974616c2061727469737472792e50726573746967696f7573204e46547320706f776572656420627920455243313135352e2054686520676f6c64204e46547320617265206361726566756c6c79206d696e65642062792065787065727420636f6c6c6563746f727320616e64206d65746963756c6f75736c792063726166746564207769746820676f6c64656e20657863656c6c656e63652c2073796d626f6c697a696e67207468652070696e6e61636c65206f66206469676974616c2072617269747920616e64206578636c757369766974792ea26469706673582212209e3afb3651f1ccb66377c91c3dc84aba09bd01d49d37899c5da2eec423755b3764736f6c63430008180033
Deployed Bytecode Sourcemap
74760:4335:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46528:318;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44736:527;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76667:91;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42354:18;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42083:46;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67869:483;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75205:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;78984:108;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42526:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76447:98;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68501:827;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46207:170;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48569:418;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42459:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47012:530;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76224:91;;;:::i;:::-;;43697:119;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42639:37;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76323:116;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42594:38;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45865:114;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3008:103;;;:::i;:::-;;74503:250;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2333:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42402:20;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72787:1264;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42722:41;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42849:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47615:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67525:186;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44524:140;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76766:2210;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74858:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67719:142;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76553:106;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47842:168;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48082:410;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74830:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3266:220;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75174:24;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46528:318;46614:7;46656:1;46637:21;;:7;:21;;;46634:88;;46682:28;;;;;;;;;;;;;;46634:88;46735:23;46755:2;46735:6;:15;46742:7;46735:15;;;;;;;;;;;;;;;:19;;:23;;;;:::i;:::-;46732:104;;;46782:1;46775:8;;;;46732:104;46823:1;46816:8;;46528:318;;;;;:::o;44736:527::-;44838:4;44890:26;44875:41;;;:11;:41;;;;:110;;;;44948:37;44933:52;;;:11;:52;;;;44875:110;:165;;;;45017:23;45002:38;;;:11;:38;;;;44875:165;:207;;;;45072:10;45057:25;;:11;:25;;;;44875:207;:284;;;;45149:10;45134:25;;:11;:25;;;;44875:284;:380;;;;45219:36;45243:11;45219:23;:36::i;:::-;44875:380;44855:400;;44736:527;;;:::o;76667:91::-;2219:13;:11;:13::i;:::-;76735:15:::1;76743:6;76735:7;:15::i;:::-;76667:91:::0;:::o;42354:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;42083:46::-;;;;;;;;;;;;;;;;;;;;;;:::o;67869:483::-;67942:4;67959:13;67975:10;67959:26;;68008:14;:12;:14::i;:::-;68000:5;:22;:35;;;;;68034:1;68026:5;:9;68000:35;67996:327;;;68058:23;68068:5;68075;68058:9;:23::i;:::-;68054:96;;68128:5;68109:25;;;;;;;;;;;:::i;:::-;;;;;;;;68054:96;68187:7;68166:11;:18;68178:5;68166:18;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;68232:7;68216:31;;68225:5;68216:31;;;68241:5;68216:31;;;;;;:::i;:::-;;;;;;;;67996:327;;;68280:31;68289:5;68296:7;68305:5;68280:8;:31::i;:::-;67996:327;68340:4;68333:11;;;67869:483;;;;:::o;75205:32::-;;;;;;;;;;;;;:::o;78984:108::-;79039:13;79072:12;79081:2;79072:8;:12::i;:::-;79065:19;;78984:108;;;:::o;42526:36::-;;;:::o;76447:98::-;2219:13;:11;:13::i;:::-;76529:8:::1;76519:7;:18;;;;;;:::i;:::-;;76447:98:::0;:::o;68501:827::-;68588:4;68617:14;:12;:14::i;:::-;68609:5;:22;68605:694;;;68652:23;68669:5;68652:6;:12;68659:4;68652:12;;;;;;;;;;;;;;;:16;;:23;;;;:::i;:::-;68648:96;;68723:4;68703:25;;;;;;;;;;;:::i;:::-;;;;;;;;68648:96;68800:4;68786:18;;:10;:18;;;;:74;;;;;68826:34;68843:4;68849:10;68826:16;:34::i;:::-;68825:35;68786:74;:127;;;;;68895:11;:18;68907:5;68895:18;;;;;;;;;;;;;;;;;;;;;68881:32;;:10;:32;;;;68786:127;68764:238;;;68975:10;68955:31;;;;;;;;;;;:::i;:::-;;;;;;;;68764:238;69018:40;69028:4;69034:2;69038:12;69052:5;69018:9;:40::i;:::-;69082:11;:18;69094:5;69082:18;;;;;;;;;;;;69075:25;;;;;;;;;;;69117:48;69135:4;69141:2;69145:5;69152:1;69117:48;;;;;;;;;;;;69159:5;69117:17;:48::i;:::-;68605:694;;;69200:40;69216:4;69222:10;69234:5;69200:15;:40::i;:::-;69255:32;69265:4;69271:2;69275:5;69282:4;69255:9;:32::i;:::-;68605:694;69316:4;69309:11;;68501:827;;;;;:::o;46207:170::-;46299:7;46326:43;46349:5;46363;46356:4;:12;;;;:::i;:::-;46326:6;:13;46333:5;46326:13;;;;;;;;;;;;;;;:22;;:43;;;;;:::i;:::-;46319:50;;46207:170;;;;;:::o;48569:418::-;48793:12;:10;:12::i;:::-;48785:20;;:4;:20;;;:60;;;;48809:36;48826:4;48832:12;:10;:12::i;:::-;48809:16;:36::i;:::-;48785:60;48780:137;;48870:35;;;;;;;;;;;;;;48780:137;48927:52;48950:4;48956:2;48960:3;48965:7;48974:4;48927:22;:52::i;:::-;48569:418;;;;;:::o;42459:31::-;;;:::o;47012:530::-;47168:16;47224:3;:10;47205:8;:15;:29;47202:90;;47258:22;;;;;;;;;;;;;;47202:90;47304:30;47351:8;:15;47337:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47304:63;;47385:9;47380:122;47404:8;:15;47400:1;:19;47380:122;;;47460:30;47470:8;47479:1;47470:11;;;;;;;;:::i;:::-;;;;;;;;47483:3;47487:1;47483:6;;;;;;;;:::i;:::-;;;;;;;;47460:9;:30::i;:::-;47441:13;47455:1;47441:16;;;;;;;;:::i;:::-;;;;;;;:49;;;;;47421:3;;;;;47380:122;;;;47521:13;47514:20;;;47012:530;;;;:::o;76224:91::-;2219:13;:11;:13::i;:::-;76294::::1;;;;;;;;;;;76293:14;76277:13;;:30;;;;;;;;;;;;;;;;;;76224:91::o:0;43697:119::-;2219:13;:11;:13::i;:::-;43803:5:::1;43783:9;:17;43793:6;43783:17;;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;43697:119:::0;;:::o;42639:37::-;;;:::o;76323:116::-;2219:13;:11;:13::i;:::-;76428:3:::1;76418:7;76404:11;:21;;;;:::i;:::-;:27;;;;:::i;:::-;76392:9;:39;;;;76323:116:::0;:::o;42594:38::-;;;:::o;45865:114::-;45928:7;45955:9;:16;45965:5;45955:16;;;;;;;;;;;;;;;;45948:23;;45865:114;;;:::o;3008:103::-;2219:13;:11;:13::i;:::-;3073:30:::1;3100:1;3073:18;:30::i;:::-;3008:103::o:0;74503:250::-;74570:16;74620:1;74602:14;:12;:14::i;:::-;:19;74599:74;;74659:1;74645:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74638:23;;;;74599:74;74690:55;74706:5;74713:15;:13;:15::i;:::-;74730:14;:12;:14::i;:::-;74690:15;:55::i;:::-;74683:62;;74503:250;;;;:::o;2333:87::-;2379:7;2406:6;;;;;;;;;;;2399:13;;2333:87;:::o;42402:20::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;72787:1264::-;72919:16;72986:4;72977:5;:13;72973:45;;72999:19;;;;;;;;;;;;;;72973:45;73132:15;:13;:15::i;:::-;73124:5;:23;73120:87;;;73176:15;:13;:15::i;:::-;73168:23;;73120:87;73286:17;73306:14;:12;:14::i;:::-;73286:34;;73346:9;73339:4;:16;73335:73;;;73383:9;73376:16;;73335:73;73424:22;73472:4;73464:5;:12;73461:157;;;73514:29;73524:5;73531;73538:4;73514:9;:29::i;:::-;73497:46;;73461:157;;;73601:1;73584:18;;73461:157;73646:25;73688:14;73674:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73646:57;;73720:29;73752:6;:13;73759:5;73752:13;;;;;;;;;;;;;;;73720:45;;73800:9;73811:19;73835:5;73842:1;73799:45;;;;73794:209;73861:14;73846:11;:29;73794:209;;73904:11;73913:1;73904:4;:8;;:11;;;;:::i;:::-;73901:87;;;73967:1;73941:8;73950:13;;;;;;73941:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;73901:87;73877:3;;;;;73794:209;;;;;74024:8;74017:15;;;;;;72787:1264;;;;;:::o;42722:41::-;;;;;;;;;;;;;;;;;;;;;;:::o;42849:29::-;;;;:::o;47615:155::-;47710:52;47729:12;:10;:12::i;:::-;47743:8;47753;47710:18;:52::i;:::-;47615:155;;:::o;67525:186::-;67594:4;67611:13;67627:10;67611:26;;67648:33;67658:5;67665:2;67669:5;67676:4;67648:9;:33::i;:::-;67699:4;67692:11;;;67525:186;;;;:::o;44524:140::-;44609:4;44633:23;44653:2;44633:6;:15;44640:7;44633:15;;;;;;;;;;;;;;;:19;;:23;;;;:::i;:::-;44626:30;;44524:140;;;;:::o;76766:2210::-;76817:13;76852:14;:12;:14::i;:::-;76846:2;:20;76843:54;;76875:22;;;;;;;;;;;;;;76843:54;76944:1;76920:13;76930:2;76920:9;:13::i;:::-;76914:27;:31;76910:70;;;76967:13;76977:2;76967:9;:13::i;:::-;76960:20;;;;76910:70;77024:1;77001:12;76995:26;;;;;:::i;:::-;;;:30;76991:1978;;;77071:12;77085:13;:2;:11;:13::i;:::-;77054:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;77040:60;;;;76991:1978;77131:10;77184:2;77167:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;77157:31;;;;;;77144:46;;77131:59;;77207:19;77241;77275:25;77329:2;77321:4;:10;;;77317:1276;;77352:29;;;;;;;;;;;;;;;;;;;77400:17;;;;;;;;;;;;;;;;;;;77436:206;;;;;;;;;;;;;;;;;;;77317:1276;;;77676:3;77668:4;:11;;;77664:929;;77700:26;;;;;;;;;;;;;;;;;;;77745:14;;;;;;;;;;;;;;;;;;;77778:216;;;;;;;;;;;;;;;;;;;77664:929;;;78028:3;78020:4;:11;;;78016:577;;78052:28;;;;;;;;;;;;;;;;;;;78099:16;;;;;;;;;;;;;;;;;;;78134:158;;;;;;;;;;;;;;;;;;;78016:577;;;78326:3;78318:4;:11;;;78314:279;;78350:28;;;;;;;;;;;;;;;;;;;78397:16;;;;;;;;;;;;;;;;;;;78432:145;;;;;;;;;;;;;;;;;;;78314:279;78016:577;77664:929;77317:1276;78609:26;78683:13;:2;:11;:13::i;:::-;78719:11;78784:7;78793:5;78645:154;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;78609:191;;78877:12;78942:5;78829:127;;;;;;;;;:::i;:::-;;;;;;;;;;;;;78815:142;;;;;;;76766:2210;;;;:::o;74858:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;67719:142::-;67799:7;67826:11;:18;67838:5;67826:18;;;;;;;;;;;;;;;:27;67845:7;67826:27;;;;;;;;;;;;;;;;67819:34;;67719:142;;;;:::o;76553:106::-;2219:13;:11;:13::i;:::-;76642:9:::1;76627:12;:24;;;;;;:::i;:::-;;76553:106:::0;:::o;47842:168::-;47941:4;47965:18;:27;47984:7;47965:27;;;;;;;;;;;;;;;:37;47993:8;47965:37;;;;;;;;;;;;;;;;;;;;;;;;;47958:44;;47842:168;;;;:::o;48082:410::-;48279:12;:10;:12::i;:::-;48271:20;;:4;:20;;;:60;;;;48295:36;48312:4;48318:12;:10;:12::i;:::-;48295:16;:36::i;:::-;48271:60;48268:217;;;48347:51;48365:4;48371:2;48375;48379:6;48387:4;48393;48347:17;:51::i;:::-;48268:217;;;48438:35;;;;;;;;;;;;;;48268:217;48082:410;;;;;:::o;74830:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3266:220::-;2219:13;:11;:13::i;:::-;3371:1:::1;3351:22;;:8;:22;;::::0;3347:93:::1;;3425:1;3397:31;;;;;;;;;;;:::i;:::-;;;;;;;;3347:93;3450:28;3469:8;3450:18;:28::i;:::-;3266:220:::0;:::o;75174:24::-;;;;:::o;33731:488::-;33805:10;34054:9;34111:1;34102:4;34094:5;:12;34067:6;:10;;:22;34087:1;34078:5;:10;;34067:22;;;;;;;;;;;;:40;;34066:46;34054:58;;34200:1;34191:10;;34176:36;33731:488;;;;:::o;24292:157::-;24377:4;24416:25;24401:40;;;:11;:40;;;;24394:47;;24292:157;;;:::o;2498:166::-;2569:12;:10;:12::i;:::-;2558:23;;:7;:5;:7::i;:::-;:23;;;2554:103;;2632:12;:10;:12::i;:::-;2605:40;;;;;;;;;;;:::i;:::-;;;;;;;;2554:103;2498:166::o;55051:88::-;55125:6;55118:4;:13;;;;;;:::i;:::-;;55051:88;:::o;44129:95::-;44176:7;44203:13;;44196:20;;44129:95;:::o;71317:130::-;71402:37;71411:5;71418:7;71427:5;71434:4;71402:8;:37::i;:::-;71317:130;;;:::o;69336:325::-;69447:1;69431:18;;:4;:18;;;69427:88;;69500:1;69473:30;;;;;;;;;;;:::i;:::-;;;;;;;;69427:88;69543:1;69529:16;;:2;:16;;;69525:88;;69598:1;69569:32;;;;;;;;;;;:::i;:::-;;;;;;;;69525:88;69623:30;69631:4;69637:2;69641:5;69648:4;69623:7;:30::i;:::-;69336:325;;;;:::o;49486:1590::-;49704:1;49690:16;;:2;:16;;;49687:78;;49730:23;;;;;;;;;;;;;;49687:78;49777:16;49796:12;:10;:12::i;:::-;49777:31;;49819:20;49842:21;49860:2;49842:17;:21::i;:::-;49819:44;;49876:45;49897:8;49907:4;49913:2;49917:3;49876:20;:45::i;:::-;49947:1;49937:6;:11;:35;;;;;49952:20;49969:2;49952:6;:12;49959:4;49952:12;;;;;;;;;;;;;;;:16;;:20;;;;:::i;:::-;49937:35;49934:260;;;49989:22;50008:2;49989:6;:12;49996:4;49989:12;;;;;;;;;;;;;;;:18;;:22;;;;:::i;:::-;50026:18;50041:2;50026:6;:10;50033:2;50026:10;;;;;;;;;;;;;;;:14;;:18;;;;:::i;:::-;50059:40;50069:4;50075:2;50079:12;50093:5;50059:9;:40::i;:::-;49934:260;;;50139:43;;;;;;;;;;;;;;49934:260;50206:16;50233:18;50400:16;50396:2;50392:25;50380:37;;50455:16;50449:4;50445:27;50431:41;;50798:6;50762:8;50722:10;50664:25;50609:1;50552;50529:304;50892:2;50861:46;;50886:4;50861:46;;50876:8;50861:46;;;50896:2;50900:6;50861:46;;;;;;;:::i;:::-;;;;;;;;50920:44;50940:8;50950:4;50956:2;50960:3;50920:19;:44::i;:::-;50980:5;50977:91;;;51000:68;51031:8;51041:4;51047:2;51051;51055:6;51063:4;51000:30;:68::i;:::-;50977:91;49676:1400;;;;49486:1590;;;;;;:::o;71906:487::-;72006:24;72033:25;72043:5;72050:7;72033:9;:25::i;:::-;72006:52;;72093:17;72073:16;:37;72069:317;;72150:5;72131:16;:24;72127:132;;;72210:7;72219:16;72237:5;72183:60;;;;;;;;;;;;;:::i;:::-;;;;;;;;72127:132;72302:57;72311:5;72318:7;72346:5;72327:16;:24;72353:5;72302:8;:57::i;:::-;72069:317;71995:398;71906:487;;;:::o;38830:786::-;38952:13;39008:14;39034:1;39025:5;:10;;39008:27;;39050:13;39074:4;39066:5;:12;39050:28;;39116:3;39108:5;39099:6;:14;:20;39093:417;;39149:44;39187:5;39165:6;:10;;:18;39176:6;39165:18;;;;;;;;;;;;:27;;39149:15;:44::i;:::-;39141:52;;39212:17;39262:1;39252:5;39243:6;:14;39242:21;;39232:6;:32;39212:52;;39311:4;39302:5;39293:6;:14;39292:23;39283:32;;39342:1;39334:9;;39367:8;;;;;39362:133;39387:9;39377:6;:19;39362:133;;39440:35;39456:6;:10;;:18;39467:6;39456:18;;;;;;;;;;;;39440:15;:35::i;:::-;39431:44;;;;39398:8;;;;;39362:133;;;39122:388;39093:417;39533:64;39589:6;39583:3;:12;39572:5;39550:6;:10;;:18;39561:6;39550:18;;;;;;;;;;;;:27;;39549:47;;39533:15;:64::i;:::-;39524:73;;;;38983:626;;38830:786;;;;;:::o;474:98::-;527:7;554:10;547:17;;474:98;:::o;51434:2773::-;51656:7;:14;51642:3;:10;:28;51639:89;;51694:22;;;;;;;;;;;;;;51639:89;51757:1;51743:16;;:2;:16;;;51740:78;;51783:23;;;;;;;;;;;;;;51740:78;51828:16;51847:12;:10;:12::i;:::-;51828:31;;51872:45;51893:8;51903:4;51909:2;51913:3;51872:20;:45::i;:::-;51935:9;51930:370;51954:3;:10;51950:1;:14;51930:370;;;51986:10;51999:3;52003:1;51999:6;;;;;;;;:::i;:::-;;;;;;;;51986:19;;52020:14;52037:7;52045:1;52037:10;;;;;;;;:::i;:::-;;;;;;;;52020:27;;52077:1;52067:6;:11;:35;;;;;52082:20;52099:2;52082:6;:12;52089:4;52082:12;;;;;;;;;;;;;;;:16;;:20;;;;:::i;:::-;52067:35;52064:225;;;52123:22;52142:2;52123:6;:12;52130:4;52123:12;;;;;;;;;;;;;;;:18;;:22;;;;:::i;:::-;52164:18;52179:2;52164:6;:10;52171:2;52164:10;;;;;;;;;;;;;;;:14;;:18;;;;:::i;:::-;52064:225;;;52230:43;;;;;;;;;;;;;;52064:225;51971:329;;51966:3;;;;;51930:370;;;;52310:53;52320:4;52326:2;52345:3;:10;52330:12;:25;;;;:::i;:::-;52357:5;52310:9;:53::i;:::-;52376:16;52403:18;52432:11;52459:1;52446:3;:10;:14;;;;:::i;:::-;52432:28;;52949:16;52943:4;52939:27;52925:41;;53000:16;52996:2;52992:25;52980:37;;53358:4;53353:3;53349:14;53343:21;53307:8;53267:10;53209:25;53154:1;53097;53074:319;53681:1;53643:336;53717:3;53708:7;53705:16;53643:336;;53953:7;53947:4;53943:18;53938:3;53934:28;53928:35;53918:8;53906:10;53879:25;53876:1;53873;53868:96;53766:1;53757:7;53753:15;53742:26;;53643:336;;;53647:50;54037:2;54007:47;;54031:4;54007:47;;54021:8;54007:47;;;54041:3;54046:7;54007:47;;;;;;;:::i;:::-;;;;;;;;54067:44;54087:8;54097:4;54103:2;54107:3;54067:19;:44::i;:::-;54124:75;54160:8;54170:4;54176:2;54180:3;54185:7;54194:4;54124:35;:75::i;:::-;51628:2579;;;;51434:2773;;;;;:::o;3646:191::-;3720:16;3739:6;;;;;;;;;;;3720:25;;3765:8;3756:6;;:17;;;;;;;;;;;;;;;;;;3820:8;3789:40;;3810:8;3789:40;;;;;;;;;;;;3709:128;3646:191;:::o;44322:114::-;44369:7;44413:15;:13;:15::i;:::-;44396:14;:12;:14::i;:::-;:32;;;;:::i;:::-;44389:39;;44322:114;:::o;43958:92::-;44014:7;44041:1;44034:8;;43958:92;:::o;62586:331::-;62741:8;62732:17;;:5;:17;;;62724:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;62844:8;62806:18;:25;62825:5;62806:25;;;;;;;;;;;;;;;:35;62832:8;62806:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;62890:8;62868:41;;62883:5;62868:41;;;62900:8;62868:41;;;;;;:::i;:::-;;;;;;;;62586:331;;;:::o;45674:105::-;45734:13;45767:4;45760:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45674:105;;;:::o;13369:723::-;13425:13;13655:1;13646:5;:10;13642:53;;13673:10;;;;;;;;;;;;;;;;;;;;;13642:53;13705:12;13720:5;13705:20;;13736:14;13761:78;13776:1;13768:4;:9;13761:78;;13794:8;;;;;:::i;:::-;;;;13825:2;13817:10;;;;;:::i;:::-;;;13761:78;;;13849:19;13881:6;13871:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13849:39;;13899:154;13915:1;13906:5;:10;13899:154;;13943:1;13933:11;;;;;:::i;:::-;;;14010:2;14002:5;:10;;;;:::i;:::-;13989:2;:24;;;;:::i;:::-;13976:39;;13959:6;13966;13959:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;14039:2;14030:11;;;;;:::i;:::-;;;13899:154;;;14077:6;14063:21;;;;;13369:723;;;;:::o;71455:443::-;71585:1;71568:19;;:5;:19;;;71564:91;;71640:1;71611:32;;;;;;;;;;;:::i;:::-;;;;;;;;71564:91;71688:1;71669:21;;:7;:21;;;71665:92;;71742:1;71714:31;;;;;;;;;;;:::i;:::-;;;;;;;;71665:92;71797:5;71767:11;:18;71779:5;71767:18;;;;;;;;;;;;;;;:27;71786:7;71767:27;;;;;;;;;;;;;;;:35;;;;71817:9;71813:78;;;71864:7;71848:31;;71857:5;71848:31;;;71873:5;71848:31;;;;;;:::i;:::-;;;;;;;;71813:78;71455:443;;;;:::o;69669:1640::-;69766:19;69788:9;:15;69798:4;69788:15;;;;;;;;;;;;;;;;69766:37;;69814:17;69834:9;:13;69844:2;69834:13;;;;;;;;;;;;;;;;69814:33;;69876:5;69862:11;:19;69858:109;;;69930:4;69936:11;69949:5;69905:50;;;;;;;;;;;;;:::i;:::-;;;;;;;;69858:109;70112:5;70098:11;:19;70080:9;:15;70090:4;70080:15;;;;;;;;;;;;;;;:37;;;;70276:5;70264:9;:17;70248:9;:13;70258:2;70248:13;;;;;;;;;;;;;;;:33;;;;70325:2;70310:25;;70319:4;70310:25;;;70329:5;70310:25;;;;;;:::i;:::-;;;;;;;;70351:4;70348:954;;;70432:8;70443:9;:15;70453:4;70443:15;;;;;;;;;;;;;;;;;;;;;;;;;70432:26;;70478:3;70473:234;;70502:22;70583:12;70574:5;70560:11;:19;;;;:::i;:::-;70559:36;;;;:::i;:::-;70542:12;70528:11;:26;;;;:::i;:::-;70527:69;;;;:::i;:::-;70502:94;;70635:1;70618:14;:18;70615:76;;;70659:32;70670:4;70676:14;70659:10;:32::i;:::-;70615:76;70483:224;70473:234;70791:9;:13;70801:2;70791:13;;;;;;;;;;;;;;;;;;;;;;;;;70786:505;;70842:1;70828:10;;:15;:22;;;;;70847:3;70828:22;:41;;;;;70862:7;:5;:7::i;:::-;70854:15;;:4;:15;;;70828:41;70825:451;;;70968:4;70952:9;:13;70962:2;70952:13;;;;;;;;;;;;;;;;:20;;;;;;;;;;;;;;;;;;71008:1;70995:10;:14;;;;70825:451;;;71058:22;71135:12;71123:9;:24;;;;:::i;:::-;71106:12;71097:5;71085:9;:17;;;;:::i;:::-;71084:34;;;;:::i;:::-;71083:65;;;;:::i;:::-;71058:90;;71191:1;71174:14;:18;71171:85;;;71219:37;71237:2;71241:14;71219:17;:37::i;:::-;;;71171:85;71035:241;70825:451;70786:505;70357:945;70348:954;69755:1554;;69669:1640;;;;:::o;67355:162::-;67421:22;67478:1;67464:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67456:24;;67502:7;67491:5;67497:1;67491:8;;;;;;;;:::i;:::-;;;;;;;:18;;;;;67355:162;;;:::o;63875:158::-;;;;;:::o;34486:129::-;34601:4;34593:5;:12;34587:1;:19;;34585:22;34559:6;:10;;:22;34579:1;34570:5;:10;;34559:22;;;;;;;;;;;;:48;;;;;;;;;;;34486:129;;:::o;34289:126::-;34401:4;34393:5;:12;34387:1;:19;;34360:6;:10;;:22;34380:1;34371:5;:10;;34360:22;;;;;;;;;;;;:47;;;;;;;;;;;34289:126;;:::o;75500:716::-;75671:9;:13;75681:2;75671:13;;;;;;;;;;;;;;;;;;;;;;;;;75667:461;;75726:9;;75709;:13;75719:2;75709:13;;;;;;;;;;;;;;;;:26;;75701:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;75790:13;;;;;;;;;;;75786:331;;;75856:12;75832:10;:21;75843:9;75832:21;;;;;;;;;;;;;;;;:36;75824:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;75951:12;75927:10;:21;75938:9;75927:21;;;;;;;;;;;;;;;:36;;;;76019:1;76000:2;75992:23;;;:28;:67;;;;;76058:1;76032:9;76024:30;;;:35;75992:67;75984:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;75786:331;75667:461;76158:50;76184:8;76194:4;76200:2;76204:3;76158:25;:50::i;:::-;75500:716;;;;:::o;65153:1389::-;65368:15;:2;:13;;;:15::i;:::-;65364:1171;;;65412:2;65404:29;;;65434:26;65404:57;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;65400:1124;;;65503:2;65486:38;;;65525:8;65535:4;65541:2;65545:6;65553:4;65486:72;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;65482:495;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;65852:6;65845:14;;;;;;;;;;;:::i;:::-;;;;;;;;65482:495;;;65916:41;;;;;;;;;;;;;;65482:495;65624:43;;;65612:55;;;:8;:55;;;;65608:160;;65703:41;;;;;;;;;;;;;;65608:160;65559:228;65400:1124;;;66049:2;66034:35;;;66070:8;66080:4;66086:2;66090:4;66034:61;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;66030:479;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;66385:6;66378:14;;;;;;;;;;;:::i;:::-;;;;;;;;66030:479;;;66449:40;;;;;;;;;;;;;;66030:479;66161:40;;;66149:52;;;:8;:52;;;;66145:156;;66237:40;;;;;;;;;;;;;;66145:156;66096:224;65400:1124;65364:1171;65153:1389;;;;;;:::o;27835:464::-;27887:9;27992:1;27988:6;28027:3;28024:1;28021:10;28081:1;28076:3;28072:11;28068:1;28065;28061:9;28057:27;28054:1;28050:35;28045:40;;28153:1;28148:3;28144:11;28140:1;28137;28133:9;28129:27;28124:1;28119:3;28115:11;28112:1;28108:19;28104:53;28099:58;;28208:2;28203:3;28199:12;28194:1;28191;28187:9;28184:1;28180:17;28176:36;28171:41;;28274:3;28269;28265:13;28262:1;28258:21;28253:3;28249:31;28241:5;28238:1;28234:13;28231:50;28226:55;;27962:330;;27835:464;;;:::o;66550:797::-;66790:15;:2;:13;;;:15::i;:::-;66786:554;;;66843:2;66826:43;;;66870:8;66880:4;66886:3;66891:7;66900:4;66826:79;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;66822:507;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;67216:6;67209:14;;;;;;;;;;;:::i;:::-;;;;;;;;66822:507;;;67272:41;;;;;;;;;;;;;;66822:507;66999:48;;;66987:60;;;:8;:60;;;;66983:157;;67079:41;;;;;;;;;;;;;;66983:157;66906:249;66786:554;66550:797;;;;;;:::o;60705:1735::-;60827:1;60811:18;;:4;:18;;;60808:77;;60852:21;;;;;;;;;;;;;;60808:77;60897:16;60916:12;:10;:12::i;:::-;60897:31;;60941:18;60962:14;:12;:14::i;:::-;60941:35;;60989:24;61030:6;61016:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60989:48;;61048:20;61085:6;61071:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61048:44;;61134:9;61130:258;61153:6;61149:1;:10;61130:258;;;61198:1;61185:7;61193:1;61185:10;;;;;;;;:::i;:::-;;;;;;;:14;;;;;61218:10;61231:36;61256:10;61231:6;:12;61238:4;61231:12;;;;;;;;;;;;;;;:24;;:36;;;;:::i;:::-;61218:49;;61295:2;61286:3;61290:1;61286:6;;;;;;;;:::i;:::-;;;;;;;:11;;;;;61316:22;61335:2;61316:6;:12;61323:4;61316:12;;;;;;;;;;;;;;;:18;;:22;;;;:::i;:::-;61370:2;61357:15;;61166:222;61161:3;;;;;;;61130:258;;;;61473:53;61494:8;61504:4;61518:1;61522:3;61473:20;:53::i;:::-;61539:18;61568:11;61591:1;61582:6;:10;;;;:::i;:::-;61568:24;;61653:16;61647:4;61643:27;61629:41;;61855:4;61850:3;61846:14;61840:21;61820:1;61791:10;61747:25;61727:1;61707;61684:192;61930:1;61892:264;61966:3;61957:7;61954:16;61892:264;;62130:7;62124:4;62120:18;62115:3;62111:28;62105:35;62102:1;62090:10;62063:25;62060:1;62057;62052:89;62015:1;62006:7;62002:15;61991:26;;61892:264;;;61896:50;62192:1;62182:6;:11;62179:176;;62252:1;62213:53;;62238:4;62213:53;;62228:8;62213:53;;;62256:3;62260:1;62256:6;;;;;;;;:::i;:::-;;;;;;;;62264:1;62213:53;;;;;;;:::i;:::-;;;;;;;;62179:176;;;62338:1;62300:55;;62324:4;62300:55;;62314:8;62300:55;;;62342:3;62347:7;62300:55;;;;;;;:::i;:::-;;;;;;;;62179:176;62378:52;62398:8;62408:4;62422:1;62426:3;62378:19;:52::i;:::-;60797:1643;;;;;;60705:1735;;:::o;56074:1661::-;56179:20;56201:24;56257:1;56243:16;;:2;:16;;;56240:74;;56283:19;;;;;;;;;;;;;;56240:74;56337:1;56327:6;:11;56324:68;;56362:18;;;;;;;;;;;;;;56324:68;56404:16;56423:12;:10;:12::i;:::-;56404:31;;56468:6;56454:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56448:27;;56510:6;56496:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56486:31;;56528:20;56551:14;:12;:14::i;:::-;56528:37;;56641:12;56631:6;56611:17;:26;:42;;56603:51;;;;;;56673:9;56669:129;56692:6;56688:1;:10;56669:129;;;56748:1;56733:12;:16;56724:3;56728:1;56724:6;;;;;;;;:::i;:::-;;;;;;;:25;;;;;56781:1;56768:7;56776:1;56768:10;;;;;;;;:::i;:::-;;;;;;;:14;;;;;56700:3;;;;;;;56669:129;;;;56829:51;56850:8;56868:1;56872:2;56876:3;56829:20;:51::i;:::-;56893:41;56913:12;56927:6;56893;:10;56900:2;56893:10;;;;;;;;;;;;;;;:19;;:41;;;;;:::i;:::-;56962:6;56945:13;;:23;;;;;;;:::i;:::-;;;;;;;;56981:16;57008:11;57037:6;57022:12;:21;;;;:::i;:::-;57008:35;;57100:16;57096:2;57092:25;57080:37;;57285:12;57258:8;57238:1;57194:25;57174:1;57154;57131:181;57384:1;57370:12;57366:20;57328:253;57421:3;57412:7;57409:16;57328:253;;57558:7;57548:8;57545:1;57518:25;57515:1;57512;57507:59;57470:1;57461:7;57457:15;57446:26;;57328:253;;;57332:69;57645:2;57609:53;;57641:1;57609:53;;57623:8;57609:53;;;57649:3;57654:7;57609:53;;;;;;;:::i;:::-;;;;;;;;57675:50;57695:8;57713:1;57717:2;57721:3;57675:19;:50::i;:::-;56227:1508;;;;56074:1661;;;;;:::o;64988:157::-;;;;;:::o;5810:387::-;5870:4;6078:12;6145:7;6133:20;6125:28;;6188:1;6181:4;:8;6174:15;;;5810:387;;;:::o;39770:1230::-;39880:19;39917:14;39942:18;40058:1;40054:6;40039:21;;40091:6;40088:1;40084:14;40074:24;;40125:6;40119:4;40112:20;40159:11;40153:4;40146:25;40213:6;40209:11;40203:4;40199:22;40326:4;40320;40310:21;40304:28;40296:6;40292:41;40284:6;40280:54;40266:68;;40380:6;40373:14;40361:10;40358:30;40348:356;;40409:280;40416:1;40409:280;;;40466:11;40458:6;40454:24;40444:34;;40534:6;40528:4;40521:20;40599:4;40593;40583:21;40577:28;40563:42;;40652:6;40645:14;40633:10;40630:30;40627:43;40409:280;40627:43;40409:280;40348:356;40024:691;40743:1;40729:10;:15;40725:268;;40791:22;40802:10;40791;:22::i;:::-;40786:1;40776:6;:11;;40775:38;40761:52;;40958:6;40945:11;40942:23;40939:1;40935:31;40922:11;40919:48;40904:63;;40725:268;39906:1094;;39770:1230;;;;:::o;36323:1129::-;36498:1;36494:6;36538:4;36531:5;36527:16;36570:11;36564:4;36557:25;36616:5;36613:1;36609:13;36603:4;36596:27;36670:3;36661:6;36654:5;36650:18;36647:27;36637:646;;36730:4;36724;36714:21;36807:3;36800:5;36796:15;36782:11;36776:18;36773:39;36760:11;36753:60;36862:1;36855:4;36849:11;36845:19;36935:5;36927:6;36923:18;36920:1;36916:26;36909:4;36903:11;36899:44;36995:4;36987:5;36979:6;36975:18;36971:29;36961:39;;37027:1;37018:10;;37046:184;37071:9;37063:6;37060:21;37046:184;;37148:6;37142:4;37135:20;37207:3;37200:4;37194;37184:21;37177:34;37107:1;37099:6;37095:14;37085:24;;37046:184;;;37261:6;37255:4;37248:20;36676:607;;;36637:646;37332:4;37326;37316:21;37427:3;37418:6;37413:3;37409:16;37405:26;37398:5;37394:38;37380:11;37374:18;37371:62;37358:11;37351:83;36468:977;;;36323:1129;;;:::o;25189:688::-;25236:9;25399:1;25363:34;25360:41;25357:1;25353:49;25348:1;25341:9;25338:1;25334:17;25331:72;25326:77;;25465:1;25462;25458:9;25438:18;25435:33;25432:1;25428:41;25425:1;25422:48;25417:53;;25524:1;25521;25517:9;25505:10;25502:25;25499:1;25495:33;25492:1;25489:40;25484:45;;25579:1;25576;25572:9;25564:6;25561:21;25558:1;25554:29;25551:1;25548:36;25543:41;;25632:1;25629;25625:9;25619:4;25616:19;25613:1;25609:27;25606:1;25603:34;25598:39;;25791:66;25736:34;25732:1;25729;25725:9;25721:50;25715:4;25711:61;25706:152;25703:1;25700:159;25695:164;;25189:688;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:77::-;878:7;907:5;896:16;;841:77;;;:::o;924:122::-;997:24;1015:5;997:24;:::i;:::-;990:5;987:35;977:63;;1036:1;1033;1026:12;977:63;924:122;:::o;1052:139::-;1098:5;1136:6;1123:20;1114:29;;1152:33;1179:5;1152:33;:::i;:::-;1052:139;;;;:::o;1197:474::-;1265:6;1273;1322:2;1310:9;1301:7;1297:23;1293:32;1290:119;;;1328:79;;:::i;:::-;1290:119;1448:1;1473:53;1518:7;1509:6;1498:9;1494:22;1473:53;:::i;:::-;1463:63;;1419:117;1575:2;1601:53;1646:7;1637:6;1626:9;1622:22;1601:53;:::i;:::-;1591:63;;1546:118;1197:474;;;;;:::o;1677:118::-;1764:24;1782:5;1764:24;:::i;:::-;1759:3;1752:37;1677:118;;:::o;1801:222::-;1894:4;1932:2;1921:9;1917:18;1909:26;;1945:71;2013:1;2002:9;1998:17;1989:6;1945:71;:::i;:::-;1801:222;;;;:::o;2029:149::-;2065:7;2105:66;2098:5;2094:78;2083:89;;2029:149;;;:::o;2184:120::-;2256:23;2273:5;2256:23;:::i;:::-;2249:5;2246:34;2236:62;;2294:1;2291;2284:12;2236:62;2184:120;:::o;2310:137::-;2355:5;2393:6;2380:20;2371:29;;2409:32;2435:5;2409:32;:::i;:::-;2310:137;;;;:::o;2453:327::-;2511:6;2560:2;2548:9;2539:7;2535:23;2531:32;2528:119;;;2566:79;;:::i;:::-;2528:119;2686:1;2711:52;2755:7;2746:6;2735:9;2731:22;2711:52;:::i;:::-;2701:62;;2657:116;2453:327;;;;:::o;2786:90::-;2820:7;2863:5;2856:13;2849:21;2838:32;;2786:90;;;:::o;2882:109::-;2963:21;2978:5;2963:21;:::i;:::-;2958:3;2951:34;2882:109;;:::o;2997:210::-;3084:4;3122:2;3111:9;3107:18;3099:26;;3135:65;3197:1;3186:9;3182:17;3173:6;3135:65;:::i;:::-;2997:210;;;;:::o;3213:117::-;3322:1;3319;3312:12;3336:117;3445:1;3442;3435:12;3459:102;3500:6;3551:2;3547:7;3542:2;3535:5;3531:14;3527:28;3517:38;;3459:102;;;:::o;3567:180::-;3615:77;3612:1;3605:88;3712:4;3709:1;3702:15;3736:4;3733:1;3726:15;3753:281;3836:27;3858:4;3836:27;:::i;:::-;3828:6;3824:40;3966:6;3954:10;3951:22;3930:18;3918:10;3915:34;3912:62;3909:88;;;3977:18;;:::i;:::-;3909:88;4017:10;4013:2;4006:22;3796:238;3753:281;;:::o;4040:129::-;4074:6;4101:20;;:::i;:::-;4091:30;;4130:33;4158:4;4150:6;4130:33;:::i;:::-;4040:129;;;:::o;4175:308::-;4237:4;4327:18;4319:6;4316:30;4313:56;;;4349:18;;:::i;:::-;4313:56;4387:29;4409:6;4387:29;:::i;:::-;4379:37;;4471:4;4465;4461:15;4453:23;;4175:308;;;:::o;4489:146::-;4586:6;4581:3;4576;4563:30;4627:1;4618:6;4613:3;4609:16;4602:27;4489:146;;;:::o;4641:425::-;4719:5;4744:66;4760:49;4802:6;4760:49;:::i;:::-;4744:66;:::i;:::-;4735:75;;4833:6;4826:5;4819:21;4871:4;4864:5;4860:16;4909:3;4900:6;4895:3;4891:16;4888:25;4885:112;;;4916:79;;:::i;:::-;4885:112;5006:54;5053:6;5048:3;5043;5006:54;:::i;:::-;4725:341;4641:425;;;;;:::o;5086:340::-;5142:5;5191:3;5184:4;5176:6;5172:17;5168:27;5158:122;;5199:79;;:::i;:::-;5158:122;5316:6;5303:20;5341:79;5416:3;5408:6;5401:4;5393:6;5389:17;5341:79;:::i;:::-;5332:88;;5148:278;5086:340;;;;:::o;5432:509::-;5501:6;5550:2;5538:9;5529:7;5525:23;5521:32;5518:119;;;5556:79;;:::i;:::-;5518:119;5704:1;5693:9;5689:17;5676:31;5734:18;5726:6;5723:30;5720:117;;;5756:79;;:::i;:::-;5720:117;5861:63;5916:7;5907:6;5896:9;5892:22;5861:63;:::i;:::-;5851:73;;5647:287;5432:509;;;;:::o;5947:99::-;5999:6;6033:5;6027:12;6017:22;;5947:99;;;:::o;6052:169::-;6136:11;6170:6;6165:3;6158:19;6210:4;6205:3;6201:14;6186:29;;6052:169;;;;:::o;6227:246::-;6308:1;6318:113;6332:6;6329:1;6326:13;6318:113;;;6417:1;6412:3;6408:11;6402:18;6398:1;6393:3;6389:11;6382:39;6354:2;6351:1;6347:10;6342:15;;6318:113;;;6465:1;6456:6;6451:3;6447:16;6440:27;6289:184;6227:246;;;:::o;6479:377::-;6567:3;6595:39;6628:5;6595:39;:::i;:::-;6650:71;6714:6;6709:3;6650:71;:::i;:::-;6643:78;;6730:65;6788:6;6783:3;6776:4;6769:5;6765:16;6730:65;:::i;:::-;6820:29;6842:6;6820:29;:::i;:::-;6815:3;6811:39;6804:46;;6571:285;6479:377;;;;:::o;6862:313::-;6975:4;7013:2;7002:9;6998:18;6990:26;;7062:9;7056:4;7052:20;7048:1;7037:9;7033:17;7026:47;7090:78;7163:4;7154:6;7090:78;:::i;:::-;7082:86;;6862:313;;;;:::o;7181:329::-;7240:6;7289:2;7277:9;7268:7;7264:23;7260:32;7257:119;;;7295:79;;:::i;:::-;7257:119;7415:1;7440:53;7485:7;7476:6;7465:9;7461:22;7440:53;:::i;:::-;7430:63;;7386:117;7181:329;;;;:::o;7516:118::-;7603:24;7621:5;7603:24;:::i;:::-;7598:3;7591:37;7516:118;;:::o;7640:222::-;7733:4;7771:2;7760:9;7756:18;7748:26;;7784:71;7852:1;7841:9;7837:17;7828:6;7784:71;:::i;:::-;7640:222;;;;:::o;7868:619::-;7945:6;7953;7961;8010:2;7998:9;7989:7;7985:23;7981:32;7978:119;;;8016:79;;:::i;:::-;7978:119;8136:1;8161:53;8206:7;8197:6;8186:9;8182:22;8161:53;:::i;:::-;8151:63;;8107:117;8263:2;8289:53;8334:7;8325:6;8314:9;8310:22;8289:53;:::i;:::-;8279:63;;8234:118;8391:2;8417:53;8462:7;8453:6;8442:9;8438:22;8417:53;:::i;:::-;8407:63;;8362:118;7868:619;;;;;:::o;8493:::-;8570:6;8578;8586;8635:2;8623:9;8614:7;8610:23;8606:32;8603:119;;;8641:79;;:::i;:::-;8603:119;8761:1;8786:53;8831:7;8822:6;8811:9;8807:22;8786:53;:::i;:::-;8776:63;;8732:117;8888:2;8914:53;8959:7;8950:6;8939:9;8935:22;8914:53;:::i;:::-;8904:63;;8859:118;9016:2;9042:53;9087:7;9078:6;9067:9;9063:22;9042:53;:::i;:::-;9032:63;;8987:118;8493:619;;;;;:::o;9118:311::-;9195:4;9285:18;9277:6;9274:30;9271:56;;;9307:18;;:::i;:::-;9271:56;9357:4;9349:6;9345:17;9337:25;;9417:4;9411;9407:15;9399:23;;9118:311;;;:::o;9435:117::-;9544:1;9541;9534:12;9575:710;9671:5;9696:81;9712:64;9769:6;9712:64;:::i;:::-;9696:81;:::i;:::-;9687:90;;9797:5;9826:6;9819:5;9812:21;9860:4;9853:5;9849:16;9842:23;;9913:4;9905:6;9901:17;9893:6;9889:30;9942:3;9934:6;9931:15;9928:122;;;9961:79;;:::i;:::-;9928:122;10076:6;10059:220;10093:6;10088:3;10085:15;10059:220;;;10168:3;10197:37;10230:3;10218:10;10197:37;:::i;:::-;10192:3;10185:50;10264:4;10259:3;10255:14;10248:21;;10135:144;10119:4;10114:3;10110:14;10103:21;;10059:220;;;10063:21;9677:608;;9575:710;;;;;:::o;10308:370::-;10379:5;10428:3;10421:4;10413:6;10409:17;10405:27;10395:122;;10436:79;;:::i;:::-;10395:122;10553:6;10540:20;10578:94;10668:3;10660:6;10653:4;10645:6;10641:17;10578:94;:::i;:::-;10569:103;;10385:293;10308:370;;;;:::o;10684:307::-;10745:4;10835:18;10827:6;10824:30;10821:56;;;10857:18;;:::i;:::-;10821:56;10895:29;10917:6;10895:29;:::i;:::-;10887:37;;10979:4;10973;10969:15;10961:23;;10684:307;;;:::o;10997:423::-;11074:5;11099:65;11115:48;11156:6;11115:48;:::i;:::-;11099:65;:::i;:::-;11090:74;;11187:6;11180:5;11173:21;11225:4;11218:5;11214:16;11263:3;11254:6;11249:3;11245:16;11242:25;11239:112;;;11270:79;;:::i;:::-;11239:112;11360:54;11407:6;11402:3;11397;11360:54;:::i;:::-;11080:340;10997:423;;;;;:::o;11439:338::-;11494:5;11543:3;11536:4;11528:6;11524:17;11520:27;11510:122;;11551:79;;:::i;:::-;11510:122;11668:6;11655:20;11693:78;11767:3;11759:6;11752:4;11744:6;11740:17;11693:78;:::i;:::-;11684:87;;11500:277;11439:338;;;;:::o;11783:1509::-;11937:6;11945;11953;11961;11969;12018:3;12006:9;11997:7;11993:23;11989:33;11986:120;;;12025:79;;:::i;:::-;11986:120;12145:1;12170:53;12215:7;12206:6;12195:9;12191:22;12170:53;:::i;:::-;12160:63;;12116:117;12272:2;12298:53;12343:7;12334:6;12323:9;12319:22;12298:53;:::i;:::-;12288:63;;12243:118;12428:2;12417:9;12413:18;12400:32;12459:18;12451:6;12448:30;12445:117;;;12481:79;;:::i;:::-;12445:117;12586:78;12656:7;12647:6;12636:9;12632:22;12586:78;:::i;:::-;12576:88;;12371:303;12741:2;12730:9;12726:18;12713:32;12772:18;12764:6;12761:30;12758:117;;;12794:79;;:::i;:::-;12758:117;12899:78;12969:7;12960:6;12949:9;12945:22;12899:78;:::i;:::-;12889:88;;12684:303;13054:3;13043:9;13039:19;13026:33;13086:18;13078:6;13075:30;13072:117;;;13108:79;;:::i;:::-;13072:117;13213:62;13267:7;13258:6;13247:9;13243:22;13213:62;:::i;:::-;13203:72;;12997:288;11783:1509;;;;;;;;:::o;13298:86::-;13333:7;13373:4;13366:5;13362:16;13351:27;;13298:86;;;:::o;13390:112::-;13473:22;13489:5;13473:22;:::i;:::-;13468:3;13461:35;13390:112;;:::o;13508:214::-;13597:4;13635:2;13624:9;13620:18;13612:26;;13648:67;13712:1;13701:9;13697:17;13688:6;13648:67;:::i;:::-;13508:214;;;;:::o;13728:311::-;13805:4;13895:18;13887:6;13884:30;13881:56;;;13917:18;;:::i;:::-;13881:56;13967:4;13959:6;13955:17;13947:25;;14027:4;14021;14017:15;14009:23;;13728:311;;;:::o;14062:710::-;14158:5;14183:81;14199:64;14256:6;14199:64;:::i;:::-;14183:81;:::i;:::-;14174:90;;14284:5;14313:6;14306:5;14299:21;14347:4;14340:5;14336:16;14329:23;;14400:4;14392:6;14388:17;14380:6;14376:30;14429:3;14421:6;14418:15;14415:122;;;14448:79;;:::i;:::-;14415:122;14563:6;14546:220;14580:6;14575:3;14572:15;14546:220;;;14655:3;14684:37;14717:3;14705:10;14684:37;:::i;:::-;14679:3;14672:50;14751:4;14746:3;14742:14;14735:21;;14622:144;14606:4;14601:3;14597:14;14590:21;;14546:220;;;14550:21;14164:608;;14062:710;;;;;:::o;14795:370::-;14866:5;14915:3;14908:4;14900:6;14896:17;14892:27;14882:122;;14923:79;;:::i;:::-;14882:122;15040:6;15027:20;15065:94;15155:3;15147:6;15140:4;15132:6;15128:17;15065:94;:::i;:::-;15056:103;;14872:293;14795:370;;;;:::o;15171:894::-;15289:6;15297;15346:2;15334:9;15325:7;15321:23;15317:32;15314:119;;;15352:79;;:::i;:::-;15314:119;15500:1;15489:9;15485:17;15472:31;15530:18;15522:6;15519:30;15516:117;;;15552:79;;:::i;:::-;15516:117;15657:78;15727:7;15718:6;15707:9;15703:22;15657:78;:::i;:::-;15647:88;;15443:302;15812:2;15801:9;15797:18;15784:32;15843:18;15835:6;15832:30;15829:117;;;15865:79;;:::i;:::-;15829:117;15970:78;16040:7;16031:6;16020:9;16016:22;15970:78;:::i;:::-;15960:88;;15755:303;15171:894;;;;;:::o;16071:114::-;16138:6;16172:5;16166:12;16156:22;;16071:114;;;:::o;16191:184::-;16290:11;16324:6;16319:3;16312:19;16364:4;16359:3;16355:14;16340:29;;16191:184;;;;:::o;16381:132::-;16448:4;16471:3;16463:11;;16501:4;16496:3;16492:14;16484:22;;16381:132;;;:::o;16519:108::-;16596:24;16614:5;16596:24;:::i;:::-;16591:3;16584:37;16519:108;;:::o;16633:179::-;16702:10;16723:46;16765:3;16757:6;16723:46;:::i;:::-;16801:4;16796:3;16792:14;16778:28;;16633:179;;;;:::o;16818:113::-;16888:4;16920;16915:3;16911:14;16903:22;;16818:113;;;:::o;16967:732::-;17086:3;17115:54;17163:5;17115:54;:::i;:::-;17185:86;17264:6;17259:3;17185:86;:::i;:::-;17178:93;;17295:56;17345:5;17295:56;:::i;:::-;17374:7;17405:1;17390:284;17415:6;17412:1;17409:13;17390:284;;;17491:6;17485:13;17518:63;17577:3;17562:13;17518:63;:::i;:::-;17511:70;;17604:60;17657:6;17604:60;:::i;:::-;17594:70;;17450:224;17437:1;17434;17430:9;17425:14;;17390:284;;;17394:14;17690:3;17683:10;;17091:608;;;16967:732;;;;:::o;17705:373::-;17848:4;17886:2;17875:9;17871:18;17863:26;;17935:9;17929:4;17925:20;17921:1;17910:9;17906:17;17899:47;17963:108;18066:4;18057:6;17963:108;:::i;:::-;17955:116;;17705:373;;;;:::o;18084:116::-;18154:21;18169:5;18154:21;:::i;:::-;18147:5;18144:32;18134:60;;18190:1;18187;18180:12;18134:60;18084:116;:::o;18206:133::-;18249:5;18287:6;18274:20;18265:29;;18303:30;18327:5;18303:30;:::i;:::-;18206:133;;;;:::o;18345:468::-;18410:6;18418;18467:2;18455:9;18446:7;18442:23;18438:32;18435:119;;;18473:79;;:::i;:::-;18435:119;18593:1;18618:53;18663:7;18654:6;18643:9;18639:22;18618:53;:::i;:::-;18608:63;;18564:117;18720:2;18746:50;18788:7;18779:6;18768:9;18764:22;18746:50;:::i;:::-;18736:60;;18691:115;18345:468;;;;;:::o;18819:329::-;18878:6;18927:2;18915:9;18906:7;18902:23;18898:32;18895:119;;;18933:79;;:::i;:::-;18895:119;19053:1;19078:53;19123:7;19114:6;19103:9;19099:22;19078:53;:::i;:::-;19068:63;;19024:117;18819:329;;;;:::o;19154:474::-;19222:6;19230;19279:2;19267:9;19258:7;19254:23;19250:32;19247:119;;;19285:79;;:::i;:::-;19247:119;19405:1;19430:53;19475:7;19466:6;19455:9;19451:22;19430:53;:::i;:::-;19420:63;;19376:117;19532:2;19558:53;19603:7;19594:6;19583:9;19579:22;19558:53;:::i;:::-;19548:63;;19503:118;19154:474;;;;;:::o;19634:1089::-;19738:6;19746;19754;19762;19770;19819:3;19807:9;19798:7;19794:23;19790:33;19787:120;;;19826:79;;:::i;:::-;19787:120;19946:1;19971:53;20016:7;20007:6;19996:9;19992:22;19971:53;:::i;:::-;19961:63;;19917:117;20073:2;20099:53;20144:7;20135:6;20124:9;20120:22;20099:53;:::i;:::-;20089:63;;20044:118;20201:2;20227:53;20272:7;20263:6;20252:9;20248:22;20227:53;:::i;:::-;20217:63;;20172:118;20329:2;20355:53;20400:7;20391:6;20380:9;20376:22;20355:53;:::i;:::-;20345:63;;20300:118;20485:3;20474:9;20470:19;20457:33;20517:18;20509:6;20506:30;20503:117;;;20539:79;;:::i;:::-;20503:117;20644:62;20698:7;20689:6;20678:9;20674:22;20644:62;:::i;:::-;20634:72;;20428:288;19634:1089;;;;;;;;:::o;20729:180::-;20777:77;20774:1;20767:88;20874:4;20871:1;20864:15;20898:4;20895:1;20888:15;20915:320;20959:6;20996:1;20990:4;20986:12;20976:22;;21043:1;21037:4;21033:12;21064:18;21054:81;;21120:4;21112:6;21108:17;21098:27;;21054:81;21182:2;21174:6;21171:14;21151:18;21148:38;21145:84;;21201:18;;:::i;:::-;21145:84;20966:269;20915:320;;;:::o;21241:141::-;21290:4;21313:3;21305:11;;21336:3;21333:1;21326:14;21370:4;21367:1;21357:18;21349:26;;21241:141;;;:::o;21388:93::-;21425:6;21472:2;21467;21460:5;21456:14;21452:23;21442:33;;21388:93;;;:::o;21487:107::-;21531:8;21581:5;21575:4;21571:16;21550:37;;21487:107;;;;:::o;21600:393::-;21669:6;21719:1;21707:10;21703:18;21742:97;21772:66;21761:9;21742:97;:::i;:::-;21860:39;21890:8;21879:9;21860:39;:::i;:::-;21848:51;;21932:4;21928:9;21921:5;21917:21;21908:30;;21981:4;21971:8;21967:19;21960:5;21957:30;21947:40;;21676:317;;21600:393;;;;;:::o;21999:60::-;22027:3;22048:5;22041:12;;21999:60;;;:::o;22065:142::-;22115:9;22148:53;22166:34;22175:24;22193:5;22175:24;:::i;:::-;22166:34;:::i;:::-;22148:53;:::i;:::-;22135:66;;22065:142;;;:::o;22213:75::-;22256:3;22277:5;22270:12;;22213:75;;;:::o;22294:269::-;22404:39;22435:7;22404:39;:::i;:::-;22465:91;22514:41;22538:16;22514:41;:::i;:::-;22506:6;22499:4;22493:11;22465:91;:::i;:::-;22459:4;22452:105;22370:193;22294:269;;;:::o;22569:73::-;22614:3;22569:73;:::o;22648:189::-;22725:32;;:::i;:::-;22766:65;22824:6;22816;22810:4;22766:65;:::i;:::-;22701:136;22648:189;;:::o;22843:186::-;22903:120;22920:3;22913:5;22910:14;22903:120;;;22974:39;23011:1;23004:5;22974:39;:::i;:::-;22947:1;22940:5;22936:13;22927:22;;22903:120;;;22843:186;;:::o;23035:543::-;23136:2;23131:3;23128:11;23125:446;;;23170:38;23202:5;23170:38;:::i;:::-;23254:29;23272:10;23254:29;:::i;:::-;23244:8;23240:44;23437:2;23425:10;23422:18;23419:49;;;23458:8;23443:23;;23419:49;23481:80;23537:22;23555:3;23537:22;:::i;:::-;23527:8;23523:37;23510:11;23481:80;:::i;:::-;23140:431;;23125:446;23035:543;;;:::o;23584:117::-;23638:8;23688:5;23682:4;23678:16;23657:37;;23584:117;;;;:::o;23707:169::-;23751:6;23784:51;23832:1;23828:6;23820:5;23817:1;23813:13;23784:51;:::i;:::-;23780:56;23865:4;23859;23855:15;23845:25;;23758:118;23707:169;;;;:::o;23881:295::-;23957:4;24103:29;24128:3;24122:4;24103:29;:::i;:::-;24095:37;;24165:3;24162:1;24158:11;24152:4;24149:21;24141:29;;23881:295;;;;:::o;24181:1395::-;24298:37;24331:3;24298:37;:::i;:::-;24400:18;24392:6;24389:30;24386:56;;;24422:18;;:::i;:::-;24386:56;24466:38;24498:4;24492:11;24466:38;:::i;:::-;24551:67;24611:6;24603;24597:4;24551:67;:::i;:::-;24645:1;24669:4;24656:17;;24701:2;24693:6;24690:14;24718:1;24713:618;;;;25375:1;25392:6;25389:77;;;25441:9;25436:3;25432:19;25426:26;25417:35;;25389:77;25492:67;25552:6;25545:5;25492:67;:::i;:::-;25486:4;25479:81;25348:222;24683:887;;24713:618;24765:4;24761:9;24753:6;24749:22;24799:37;24831:4;24799:37;:::i;:::-;24858:1;24872:208;24886:7;24883:1;24880:14;24872:208;;;24965:9;24960:3;24956:19;24950:26;24942:6;24935:42;25016:1;25008:6;25004:14;24994:24;;25063:2;25052:9;25048:18;25035:31;;24909:4;24906:1;24902:12;24897:17;;24872:208;;;25108:6;25099:7;25096:19;25093:179;;;25166:9;25161:3;25157:19;25151:26;25209:48;25251:4;25243:6;25239:17;25228:9;25209:48;:::i;:::-;25201:6;25194:64;25116:156;25093:179;25318:1;25314;25306:6;25302:14;25298:22;25292:4;25285:36;24720:611;;;24683:887;;24273:1303;;;24181:1395;;:::o;25582:180::-;25630:77;25627:1;25620:88;25727:4;25724:1;25717:15;25751:4;25748:1;25741:15;25768:194;25808:4;25828:20;25846:1;25828:20;:::i;:::-;25823:25;;25862:20;25880:1;25862:20;:::i;:::-;25857:25;;25906:1;25903;25899:9;25891:17;;25930:1;25924:4;25921:11;25918:37;;;25935:18;;:::i;:::-;25918:37;25768:194;;;;:::o;25968:180::-;26016:77;26013:1;26006:88;26113:4;26110:1;26103:15;26137:4;26134:1;26127:15;26154:410;26194:7;26217:20;26235:1;26217:20;:::i;:::-;26212:25;;26251:20;26269:1;26251:20;:::i;:::-;26246:25;;26306:1;26303;26299:9;26328:30;26346:11;26328:30;:::i;:::-;26317:41;;26507:1;26498:7;26494:15;26491:1;26488:22;26468:1;26461:9;26441:83;26418:139;;26537:18;;:::i;:::-;26418:139;26202:362;26154:410;;;;:::o;26570:180::-;26618:77;26615:1;26608:88;26715:4;26712:1;26705:15;26739:4;26736:1;26729:15;26756:185;26796:1;26813:20;26831:1;26813:20;:::i;:::-;26808:25;;26847:20;26865:1;26847:20;:::i;:::-;26842:25;;26886:1;26876:35;;26891:18;;:::i;:::-;26876:35;26933:1;26930;26926:9;26921:14;;26756:185;;;;:::o;26947:148::-;27049:11;27086:3;27071:18;;26947:148;;;;:::o;27125:874::-;27228:3;27265:5;27259:12;27294:36;27320:9;27294:36;:::i;:::-;27346:89;27428:6;27423:3;27346:89;:::i;:::-;27339:96;;27466:1;27455:9;27451:17;27482:1;27477:166;;;;27657:1;27652:341;;;;27444:549;;27477:166;27561:4;27557:9;27546;27542:25;27537:3;27530:38;27623:6;27616:14;27609:22;27601:6;27597:35;27592:3;27588:45;27581:52;;27477:166;;27652:341;27719:38;27751:5;27719:38;:::i;:::-;27779:1;27793:154;27807:6;27804:1;27801:13;27793:154;;;27881:7;27875:14;27871:1;27866:3;27862:11;27855:35;27931:1;27922:7;27918:15;27907:26;;27829:4;27826:1;27822:12;27817:17;;27793:154;;;27976:6;27971:3;27967:16;27960:23;;27659:334;;27444:549;;27232:767;;27125:874;;;;:::o;28005:390::-;28111:3;28139:39;28172:5;28139:39;:::i;:::-;28194:89;28276:6;28271:3;28194:89;:::i;:::-;28187:96;;28292:65;28350:6;28345:3;28338:4;28331:5;28327:16;28292:65;:::i;:::-;28382:6;28377:3;28373:16;28366:23;;28115:280;28005:390;;;;:::o;28401:429::-;28578:3;28600:92;28688:3;28679:6;28600:92;:::i;:::-;28593:99;;28709:95;28800:3;28791:6;28709:95;:::i;:::-;28702:102;;28821:3;28814:10;;28401:429;;;;;:::o;28836:79::-;28875:7;28904:5;28893:16;;28836:79;;;:::o;28921:157::-;29026:45;29046:24;29064:5;29046:24;:::i;:::-;29026:45;:::i;:::-;29021:3;29014:58;28921:157;;:::o;29084:256::-;29196:3;29211:75;29282:3;29273:6;29211:75;:::i;:::-;29311:2;29306:3;29302:12;29295:19;;29331:3;29324:10;;29084:256;;;;:::o;29346:214::-;29486:66;29482:1;29474:6;29470:14;29463:90;29346:214;:::o;29566:402::-;29726:3;29747:85;29829:2;29824:3;29747:85;:::i;:::-;29740:92;;29841:93;29930:3;29841:93;:::i;:::-;29959:2;29954:3;29950:12;29943:19;;29566:402;;;:::o;29974:214::-;30114:66;30110:1;30102:6;30098:14;30091:90;29974:214;:::o;30194:402::-;30354:3;30375:85;30457:2;30452:3;30375:85;:::i;:::-;30368:92;;30469:93;30558:3;30469:93;:::i;:::-;30587:2;30582:3;30578:12;30571:19;;30194:402;;;:::o;30602:315::-;30742:66;30738:1;30730:6;30726:14;30719:90;30843:66;30838:2;30830:6;30826:15;30819:91;30602:315;:::o;30923:402::-;31083:3;31104:85;31186:2;31181:3;31104:85;:::i;:::-;31097:92;;31198:93;31287:3;31198:93;:::i;:::-;31316:2;31311:3;31307:12;31300:19;;30923:402;;;:::o;31331:1547::-;31907:3;31929:148;32073:3;31929:148;:::i;:::-;31922:155;;32094:95;32185:3;32176:6;32094:95;:::i;:::-;32087:102;;32206:148;32350:3;32206:148;:::i;:::-;32199:155;;32371:95;32462:3;32453:6;32371:95;:::i;:::-;32364:102;;32483:148;32627:3;32483:148;:::i;:::-;32476:155;;32648:92;32736:3;32727:6;32648:92;:::i;:::-;32641:99;;32757:95;32848:3;32839:6;32757:95;:::i;:::-;32750:102;;32869:3;32862:10;;31331:1547;;;;;;;:::o;32884:177::-;33024:29;33020:1;33012:6;33008:14;33001:53;32884:177;:::o;33067:402::-;33227:3;33248:85;33330:2;33325:3;33248:85;:::i;:::-;33241:92;;33342:93;33431:3;33342:93;:::i;:::-;33460:2;33455:3;33451:12;33444:19;;33067:402;;;:::o;33475:315::-;33615:66;33611:1;33603:6;33599:14;33592:90;33716:66;33711:2;33703:6;33699:15;33692:91;33475:315;:::o;33796:402::-;33956:3;33977:85;34059:2;34054:3;33977:85;:::i;:::-;33970:92;;34071:93;34160:3;34071:93;:::i;:::-;34189:2;34184:3;34180:12;34173:19;;33796:402;;;:::o;34204:214::-;34344:66;34340:1;34332:6;34328:14;34321:90;34204:214;:::o;34424:400::-;34584:3;34605:84;34687:1;34682:3;34605:84;:::i;:::-;34598:91;;34698:93;34787:3;34698:93;:::i;:::-;34816:1;34811:3;34807:11;34800:18;;34424:400;;;:::o;34830:1233::-;35313:3;35335:148;35479:3;35335:148;:::i;:::-;35328:155;;35500:95;35591:3;35582:6;35500:95;:::i;:::-;35493:102;;35612:148;35756:3;35612:148;:::i;:::-;35605:155;;35777:95;35868:3;35859:6;35777:95;:::i;:::-;35770:102;;35889:148;36033:3;35889:148;:::i;:::-;35882:155;;36054:3;36047:10;;34830:1233;;;;;:::o;36069:332::-;36190:4;36228:2;36217:9;36213:18;36205:26;;36241:71;36309:1;36298:9;36294:17;36285:6;36241:71;:::i;:::-;36322:72;36390:2;36379:9;36375:18;36366:6;36322:72;:::i;:::-;36069:332;;;;;:::o;36407:442::-;36556:4;36594:2;36583:9;36579:18;36571:26;;36607:71;36675:1;36664:9;36660:17;36651:6;36607:71;:::i;:::-;36688:72;36756:2;36745:9;36741:18;36732:6;36688:72;:::i;:::-;36770;36838:2;36827:9;36823:18;36814:6;36770:72;:::i;:::-;36407:442;;;;;;:::o;36855:191::-;36895:3;36914:20;36932:1;36914:20;:::i;:::-;36909:25;;36948:20;36966:1;36948:20;:::i;:::-;36943:25;;36991:1;36988;36984:9;36977:16;;37012:3;37009:1;37006:10;37003:36;;;37019:18;;:::i;:::-;37003:36;36855:191;;;;:::o;37052:634::-;37273:4;37311:2;37300:9;37296:18;37288:26;;37360:9;37354:4;37350:20;37346:1;37335:9;37331:17;37324:47;37388:108;37491:4;37482:6;37388:108;:::i;:::-;37380:116;;37543:9;37537:4;37533:20;37528:2;37517:9;37513:18;37506:48;37571:108;37674:4;37665:6;37571:108;:::i;:::-;37563:116;;37052:634;;;;;:::o;37692:228::-;37832:34;37828:1;37820:6;37816:14;37809:58;37901:11;37896:2;37888:6;37884:15;37877:36;37692:228;:::o;37926:366::-;38068:3;38089:67;38153:2;38148:3;38089:67;:::i;:::-;38082:74;;38165:93;38254:3;38165:93;:::i;:::-;38283:2;38278:3;38274:12;38267:19;;37926:366;;;:::o;38298:419::-;38464:4;38502:2;38491:9;38487:18;38479:26;;38551:9;38545:4;38541:20;38537:1;38526:9;38522:17;38515:47;38579:131;38705:4;38579:131;:::i;:::-;38571:139;;38298:419;;;:::o;38723:233::-;38762:3;38785:24;38803:5;38785:24;:::i;:::-;38776:33;;38831:66;38824:5;38821:77;38818:103;;38901:18;;:::i;:::-;38818:103;38948:1;38941:5;38937:13;38930:20;;38723:233;;;:::o;38962:176::-;38994:1;39011:20;39029:1;39011:20;:::i;:::-;39006:25;;39045:20;39063:1;39045:20;:::i;:::-;39040:25;;39084:1;39074:35;;39089:18;;:::i;:::-;39074:35;39130:1;39127;39123:9;39118:14;;38962:176;;;;:::o;39144:181::-;39284:33;39280:1;39272:6;39268:14;39261:57;39144:181;:::o;39331:366::-;39473:3;39494:67;39558:2;39553:3;39494:67;:::i;:::-;39487:74;;39570:93;39659:3;39570:93;:::i;:::-;39688:2;39683:3;39679:12;39672:19;;39331:366;;;:::o;39703:419::-;39869:4;39907:2;39896:9;39892:18;39884:26;;39956:9;39950:4;39946:20;39942:1;39931:9;39927:17;39920:47;39984:131;40110:4;39984:131;:::i;:::-;39976:139;;39703:419;;;:::o;40128:223::-;40268:34;40264:1;40256:6;40252:14;40245:58;40337:6;40332:2;40324:6;40320:15;40313:31;40128:223;:::o;40357:366::-;40499:3;40520:67;40584:2;40579:3;40520:67;:::i;:::-;40513:74;;40596:93;40685:3;40596:93;:::i;:::-;40714:2;40709:3;40705:12;40698:19;;40357:366;;;:::o;40729:419::-;40895:4;40933:2;40922:9;40918:18;40910:26;;40982:9;40976:4;40972:20;40968:1;40957:9;40953:17;40946:47;41010:131;41136:4;41010:131;:::i;:::-;41002:139;;40729:419;;;:::o;41154:224::-;41294:34;41290:1;41282:6;41278:14;41271:58;41363:7;41358:2;41350:6;41346:15;41339:32;41154:224;:::o;41384:366::-;41526:3;41547:67;41611:2;41606:3;41547:67;:::i;:::-;41540:74;;41623:93;41712:3;41623:93;:::i;:::-;41741:2;41736:3;41732:12;41725:19;;41384:366;;;:::o;41756:419::-;41922:4;41960:2;41949:9;41945:18;41937:26;;42009:9;42003:4;41999:20;41995:1;41984:9;41980:17;41973:47;42037:131;42163:4;42037:131;:::i;:::-;42029:139;;41756:419;;;:::o;42181:115::-;42266:23;42283:5;42266:23;:::i;:::-;42261:3;42254:36;42181:115;;:::o;42302:218::-;42393:4;42431:2;42420:9;42416:18;42408:26;;42444:69;42510:1;42499:9;42495:17;42486:6;42444:69;:::i;:::-;42302:218;;;;:::o;42526:137::-;42580:5;42611:6;42605:13;42596:22;;42627:30;42651:5;42627:30;:::i;:::-;42526:137;;;;:::o;42669:345::-;42736:6;42785:2;42773:9;42764:7;42760:23;42756:32;42753:119;;;42791:79;;:::i;:::-;42753:119;42911:1;42936:61;42989:7;42980:6;42969:9;42965:22;42936:61;:::i;:::-;42926:71;;42882:125;42669:345;;;;:::o;43020:98::-;43071:6;43105:5;43099:12;43089:22;;43020:98;;;:::o;43124:168::-;43207:11;43241:6;43236:3;43229:19;43281:4;43276:3;43272:14;43257:29;;43124:168;;;;:::o;43298:373::-;43384:3;43412:38;43444:5;43412:38;:::i;:::-;43466:70;43529:6;43524:3;43466:70;:::i;:::-;43459:77;;43545:65;43603:6;43598:3;43591:4;43584:5;43580:16;43545:65;:::i;:::-;43635:29;43657:6;43635:29;:::i;:::-;43630:3;43626:39;43619:46;;43388:283;43298:373;;;;:::o;43677:751::-;43900:4;43938:3;43927:9;43923:19;43915:27;;43952:71;44020:1;44009:9;44005:17;43996:6;43952:71;:::i;:::-;44033:72;44101:2;44090:9;44086:18;44077:6;44033:72;:::i;:::-;44115;44183:2;44172:9;44168:18;44159:6;44115:72;:::i;:::-;44197;44265:2;44254:9;44250:18;44241:6;44197:72;:::i;:::-;44317:9;44311:4;44307:20;44301:3;44290:9;44286:19;44279:49;44345:76;44416:4;44407:6;44345:76;:::i;:::-;44337:84;;43677:751;;;;;;;;:::o;44434:141::-;44490:5;44521:6;44515:13;44506:22;;44537:32;44563:5;44537:32;:::i;:::-;44434:141;;;;:::o;44581:349::-;44650:6;44699:2;44687:9;44678:7;44674:23;44670:32;44667:119;;;44705:79;;:::i;:::-;44667:119;44825:1;44850:63;44905:7;44896:6;44885:9;44881:22;44850:63;:::i;:::-;44840:73;;44796:127;44581:349;;;;:::o;44936:106::-;44980:8;45029:5;45024:3;45020:15;44999:36;;44936:106;;;:::o;45048:183::-;45083:3;45121:1;45103:16;45100:23;45097:128;;;45159:1;45156;45153;45138:23;45181:34;45212:1;45206:8;45181:34;:::i;:::-;45174:41;;45097:128;45048:183;:::o;45237:711::-;45276:3;45314:4;45296:16;45293:26;45322:5;45290:39;45351:20;;:::i;:::-;45426:1;45408:16;45404:24;45401:1;45395:4;45380:49;45459:4;45453:11;45558:16;45551:4;45543:6;45539:17;45536:39;45503:18;45495:6;45492:30;45476:113;45473:146;;;45604:5;;;;45473:146;45650:6;45644:4;45640:17;45686:3;45680:10;45713:18;45705:6;45702:30;45699:43;;;45735:5;;;;;;45699:43;45783:6;45776:4;45771:3;45767:14;45763:27;45842:1;45824:16;45820:24;45814:4;45810:35;45805:3;45802:44;45799:57;;;45849:5;;;;;;;45799:57;45866;45914:6;45908:4;45904:17;45896:6;45892:30;45886:4;45866:57;:::i;:::-;45939:3;45932:10;;45280:668;;;;;45237:711;;:::o;45954:640::-;46149:4;46187:3;46176:9;46172:19;46164:27;;46201:71;46269:1;46258:9;46254:17;46245:6;46201:71;:::i;:::-;46282:72;46350:2;46339:9;46335:18;46326:6;46282:72;:::i;:::-;46364;46432:2;46421:9;46417:18;46408:6;46364:72;:::i;:::-;46483:9;46477:4;46473:20;46468:2;46457:9;46453:18;46446:48;46511:76;46582:4;46573:6;46511:76;:::i;:::-;46503:84;;45954:640;;;;;;;:::o;46600:1053::-;46923:4;46961:3;46950:9;46946:19;46938:27;;46975:71;47043:1;47032:9;47028:17;47019:6;46975:71;:::i;:::-;47056:72;47124:2;47113:9;47109:18;47100:6;47056:72;:::i;:::-;47175:9;47169:4;47165:20;47160:2;47149:9;47145:18;47138:48;47203:108;47306:4;47297:6;47203:108;:::i;:::-;47195:116;;47358:9;47352:4;47348:20;47343:2;47332:9;47328:18;47321:48;47386:108;47489:4;47480:6;47386:108;:::i;:::-;47378:116;;47542:9;47536:4;47532:20;47526:3;47515:9;47511:19;47504:49;47570:76;47641:4;47632:6;47570:76;:::i;:::-;47562:84;;46600:1053;;;;;;;;:::o;47659:85::-;47704:7;47733:5;47722:16;;47659:85;;;:::o;47750:158::-;47808:9;47841:61;47859:42;47868:32;47894:5;47868:32;:::i;:::-;47859:42;:::i;:::-;47841:61;:::i;:::-;47828:74;;47750:158;;;:::o;47914:147::-;48009:45;48048:5;48009:45;:::i;:::-;48004:3;47997:58;47914:147;;:::o;48067:348::-;48196:4;48234:2;48223:9;48219:18;48211:26;;48247:71;48315:1;48304:9;48300:17;48291:6;48247:71;:::i;:::-;48328:80;48404:2;48393:9;48389:18;48380:6;48328:80;:::i;:::-;48067:348;;;;;:::o
Swarm Source
ipfs://9e3afb3651f1ccb66377c91c3dc84aba09bd01d49d37899c5da2eec423755b37
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.