More Info
Private Name Tags
ContractCreator
TokenTracker
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Loading...
Loading
Contract Name:
SNS
Compiler Version
v0.8.18+commit.87f61d96
Contract Source Code (Solidity)
/** *Submitted for verification at scrollscan.com on 2023-12-30 */ // Sources flattened with hardhat v2.7.0 https://hardhat.org // File @openzeppelin/contracts/utils/[email protected] // SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File @openzeppelin/contracts/access/[email protected] // OpenZeppelin Contracts v4.4.0 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File @openzeppelin/contracts/token/ERC20/[email protected] // OpenZeppelin Contracts v4.4.0 (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File @openzeppelin/contracts/token/ERC20/extensions/[email protected] // OpenZeppelin Contracts v4.4.0 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // File @openzeppelin/contracts/token/ERC20/[email protected] // OpenZeppelin Contracts v4.4.0 (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[sender][_msgSender()]; require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance"); unchecked { _approve(sender, _msgSender(), currentAllowance - amount); } return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(_msgSender(), spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer( address sender, address recipient, uint256 amount ) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); uint256 senderBalance = _balances[sender]; require(senderBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[sender] = senderBalance - amount; } _balances[recipient] += amount; emit Transfer(sender, recipient, amount); _afterTokenTransfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } pragma solidity ^0.8.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { enum RecoverError { NoError, InvalidSignature, InvalidSignatureLength, InvalidSignatureS, InvalidSignatureV // Deprecated in v4.8 } function _throwError(RecoverError error) private pure { if (error == RecoverError.NoError) { return; // no error: do nothing } else if (error == RecoverError.InvalidSignature) { revert("ECDSA: invalid signature"); } else if (error == RecoverError.InvalidSignatureLength) { revert("ECDSA: invalid signature length"); } else if (error == RecoverError.InvalidSignatureS) { revert("ECDSA: invalid signature 's' value"); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature` or error string. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. * * Documentation for signature generation: * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js] * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) { if (signature.length == 65) { bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. /// @solidity memory-safe-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } return tryRecover(hash, v, r, s); } else { return (address(0), RecoverError.InvalidSignatureLength); } } /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * IMPORTANT: `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise * be too long), and then calling {toEthSignedMessageHash} on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, signature); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately. * * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures] * * _Available since v4.3._ */ function tryRecover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address, RecoverError) { bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff); uint8 v = uint8((uint256(vs) >> 255) + 27); return tryRecover(hash, v, r, s); } /** * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately. * * _Available since v4.2._ */ function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, r, vs); _throwError(error); return recovered; } /** * @dev Overload of {ECDSA-tryRecover} that receives the `v`, * `r` and `s` signature fields separately. * * _Available since v4.3._ */ function tryRecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address, RecoverError) { // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return (address(0), RecoverError.InvalidSignatureS); } // If the signature is valid (and not malleable), return the signer address address signer = ecrecover(hash, v, r, s); if (signer == address(0)) { return (address(0), RecoverError.InvalidSignature); } return (signer, RecoverError.NoError); } /** * @dev Overload of {ECDSA-recover} that receives the `v`, * `r` and `s` signature fields separately. */ function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address) { (address recovered, RecoverError error) = tryRecover(hash, v, r, s); _throwError(error); return recovered; } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32 message) { // 32 is the length in bytes of hash, // enforced by the type signature above /// @solidity memory-safe-assembly assembly { mstore(0x00, "\x19Ethereum Signed Message:\n32") mstore(0x1c, hash) message := keccak256(0x00, 0x3c) } } /** * @dev Returns an Ethereum Signed Message, created from `s`. This * produces hash corresponding to the one signed with the * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`] * JSON-RPC method as part of EIP-191. * * See {recover}. */ function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s)); } /** * @dev Returns an Ethereum Signed Typed Data, created from a * `domainSeparator` and a `structHash`. This produces hash corresponding * to the one signed with the * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] * JSON-RPC method as part of EIP-712. * * See {recover}. */ function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32 data) { /// @solidity memory-safe-assembly assembly { let ptr := mload(0x40) mstore(ptr, "\x19\x01") mstore(add(ptr, 0x02), domainSeparator) mstore(add(ptr, 0x22), structHash) data := keccak256(ptr, 0x42) } } /** * @dev Returns an Ethereum Signed Data with intended validator, created from a * `validator` and `data` according to the version 0 of EIP-191. * * See {recover}. */ function toDataWithIntendedValidatorHash(address validator, bytes memory data) internal pure returns (bytes32) { return keccak256(abi.encodePacked("\x19\x00", validator, data)); } } pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `int256` to its ASCII `string` decimal representation. */ function toString(int256 value) internal pure returns (string memory) { return string(abi.encodePacked(value < 0 ? "-" : "", toString(SignedMath.abs(value)))); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } /** * @dev Returns true if the two strings are equal. */ function equal(string memory a, string memory b) internal pure returns (bool) { return keccak256(bytes(a)) == keccak256(bytes(b)); } } pragma solidity ^0.8.0; /** * @dev Standard signed math utilities missing in the Solidity language. */ library SignedMath { /** * @dev Returns the largest of two signed numbers. */ function max(int256 a, int256 b) internal pure returns (int256) { return a > b ? a : b; } /** * @dev Returns the smallest of two signed numbers. */ function min(int256 a, int256 b) internal pure returns (int256) { return a < b ? a : b; } /** * @dev Returns the average of two signed numbers without overflow. * The result is rounded towards zero. */ function average(int256 a, int256 b) internal pure returns (int256) { // Formula from the book "Hacker's Delight" int256 x = (a & b) + ((a ^ b) >> 1); return x + (int256(uint256(x) >> 255) & (a ^ b)); } /** * @dev Returns the absolute unsigned value of a signed value. */ function abs(int256 n) internal pure returns (uint256) { unchecked { // must be unchecked in order to support `n = type(int256).min` return uint256(n >= 0 ? n : -n); } } } pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { // Solidity will revert if denominator == 0, unlike the div opcode on its own. // The surrounding unchecked block does not change this fact. // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1, "Math: mulDiv overflow"); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10 ** 64) { value /= 10 ** 64; result += 64; } if (value >= 10 ** 32) { value /= 10 ** 32; result += 32; } if (value >= 10 ** 16) { value /= 10 ** 16; result += 16; } if (value >= 10 ** 8) { value /= 10 ** 8; result += 8; } if (value >= 10 ** 4) { value /= 10 ** 4; result += 4; } if (value >= 10 ** 2) { value /= 10 ** 2; result += 2; } if (value >= 10 ** 1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 256, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0); } } } interface ScrollNameService { function primaryAddress(address account) external view returns (string memory); } pragma solidity ^0.8.0; contract SNS is Ownable, ERC20 { uint256 public _totalSupply=500000000*10**decimals(); bool public Active=false; mapping(address => bool) public claimed; mapping(uint8 => uint256) public categoryAmount; mapping(uint8 => address) public categorySigner; address scroll_contract=0xe2e1D82b050Bb5BFeC776b2653A72f093A8373AB; constructor() ERC20("SCROLL NS", "SNS") { _mint(owner(), 175000000*10**decimals()); } function scrollPrimaryAddress(address _address) public view returns(string memory){ return ScrollNameService(scroll_contract).primaryAddress(_address); } function setCategory(uint8 _category,uint256 maxAmount, address _signer) external onlyOwner { categoryAmount[_category]=maxAmount; categorySigner[_category]=_signer; } function setActive(bool _setActive) external onlyOwner { Active = _setActive; } function Claim(uint256 _amount, uint8 category, bytes calldata signature) public payable { require(Active, "Not ready yet"); require(_amount+totalSupply()<_totalSupply,"SOLD OUT!"); require(categoryAmount[category]>=_amount, "ERROR"); require(canClaimAirdrop(signature,category,msg.sender),"Claimed!"); if (msg.value>0) { (bool success, ) = payable(owner()).call{value:msg.value}(''); } claimed[msg.sender]=true; _mint(msg.sender, _amount); } function canClaimAirdrop(bytes calldata signature,uint8 _category, address _caller) public view returns(bool) { if (recoverSigner(signature,_caller)==categorySigner[_category]) { if (claimed[msg.sender]==false) { return true; } else { return false; } } else { return false; } } function recoverSigner(bytes memory signature, address _caller) public pure returns (address) { bytes32 message = keccak256(abi.encodePacked(_caller)); bytes32 hash = ECDSA.toEthSignedMessageHash(message); address signer_ = ECDSA.recover(hash, signature); return signer_; } function burn(uint256 value) external { _burn(msg.sender, value); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"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":"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"},{"inputs":[],"name":"Active","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint8","name":"category","type":"uint8"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"Claim","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"_totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"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":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"uint8","name":"_category","type":"uint8"},{"internalType":"address","name":"_caller","type":"address"}],"name":"canClaimAirdrop","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"categoryAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"categorySigner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","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":[{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"address","name":"_caller","type":"address"}],"name":"recoverSigner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"scrollPrimaryAddress","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_setActive","type":"bool"}],"name":"setActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_category","type":"uint8"},{"internalType":"uint256","name":"maxAmount","type":"uint256"},{"internalType":"address","name":"_signer","type":"address"}],"name":"setCategory","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","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"}]
Contract Creation Code
6080604052620000126012600a6200037e565b6200002290631dcd650062000396565b6006556007805460ff19169055600b80546001600160a01b03191673e2e1d82b050bb5bfec776b2653a72f093a8373ab1790553480156200006257600080fd5b50604051806040016040528060098152602001685343524f4c4c204e5360b81b81525060405180604001604052806003815260200162534e5360e81b815250620000bb620000b56200011960201b60201c565b6200011d565b6004620000c9838262000454565b506005620000d8828262000454565b50505062000113620000ef6200016d60201b60201c565b620000fd6012600a6200037e565b6200010d90630a6e49c062000396565b6200017c565b62000536565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000546001600160a01b031690565b6001600160a01b038216620001d75760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640160405180910390fd5b8060036000828254620001eb919062000520565b90915550506001600160a01b038216600090815260016020526040812080548392906200021a90849062000520565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b505050565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620002c0578160001904821115620002a457620002a462000269565b80851615620002b257918102915b93841c939080029062000284565b509250929050565b600082620002d95750600162000378565b81620002e85750600062000378565b81600181146200030157600281146200030c576200032c565b600191505062000378565b60ff84111562000320576200032062000269565b50506001821b62000378565b5060208310610133831016604e8410600b841016171562000351575081810a62000378565b6200035d83836200027f565b806000190482111562000374576200037462000269565b0290505b92915050565b60006200038f60ff841683620002c8565b9392505050565b808202811582820484141762000378576200037862000269565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620003db57607f821691505b602082108103620003fc57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200026457600081815260208120601f850160051c810160208610156200042b5750805b601f850160051c820191505b818110156200044c5782815560010162000437565b505050505050565b81516001600160401b03811115620004705762000470620003b0565b6200048881620004818454620003c6565b8462000402565b602080601f831160018114620004c05760008415620004a75750858301515b600019600386901b1c1916600185901b1785556200044c565b600085815260208120601f198616915b82811015620004f157888601518255948401946001909101908401620004d0565b5085821015620005105787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b8082018082111562000378576200037862000269565b61194880620005466000396000f3fe6080604052600436106101815760003560e01c80637806d616116100d1578063adeb0d881161008a578063cd2fcc2c11610064578063cd2fcc2c1461048a578063dd62ed3e146104aa578063e95c8900146104f0578063f2fde38b1461051057600080fd5b8063adeb0d8814610420578063c884ef8314610440578063c9b0a2a71461047057600080fd5b80637806d6161461036d5780638da5cb5b1461038d57806395d89b41146103ab578063a457c2d7146103c0578063a9059cbb146103e0578063acec338a1461040057600080fd5b8063395093511161013e5780635eb8f05b116101185780635eb8f05b146102e257806370a082311461030f578063715018a614610345578063754a83771461035a57600080fd5b8063395093511461028a5780633eaaf86b146102aa57806342966c68146102c057600080fd5b806306fdde0314610186578063095ea7b3146101b1578063095fe2c3146101e157806318160ddd1461022f57806323b872dd1461024e578063313ce5671461026e575b600080fd5b34801561019257600080fd5b5061019b610530565b6040516101a89190611435565b60405180910390f35b3480156101bd57600080fd5b506101d16101cc366004611484565b6105c2565b60405190151581526020016101a8565b3480156101ed57600080fd5b506102176101fc3660046114bf565b600a602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016101a8565b34801561023b57600080fd5b506003545b6040519081526020016101a8565b34801561025a57600080fd5b506101d16102693660046114e1565b6105d9565b34801561027a57600080fd5b50604051601281526020016101a8565b34801561029657600080fd5b506101d16102a5366004611484565b610688565b3480156102b657600080fd5b5061024060065481565b3480156102cc57600080fd5b506102e06102db36600461151d565b6106c4565b005b3480156102ee57600080fd5b506102406102fd3660046114bf565b60096020526000908152604090205481565b34801561031b57600080fd5b5061024061032a366004611536565b6001600160a01b031660009081526001602052604090205490565b34801561035157600080fd5b506102e06106d1565b6102e0610368366004611593565b610707565b34801561037957600080fd5b506102e06103883660046115ed565b6108a6565b34801561039957600080fd5b506000546001600160a01b0316610217565b3480156103b757600080fd5b5061019b61090f565b3480156103cc57600080fd5b506101d16103db366004611484565b61091e565b3480156103ec57600080fd5b506101d16103fb366004611484565b6109b7565b34801561040c57600080fd5b506102e061041b366004611629565b6109c4565b34801561042c57600080fd5b5061021761043b3660046116ba565b610a01565b34801561044c57600080fd5b506101d161045b366004611536565b60086020526000908152604090205460ff1681565b34801561047c57600080fd5b506007546101d19060ff1681565b34801561049657600080fd5b506101d16104a536600461174b565b610a8e565b3480156104b657600080fd5b506102406104c53660046117b0565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b3480156104fc57600080fd5b5061019b61050b366004611536565b610b27565b34801561051c57600080fd5b506102e061052b366004611536565b610b9a565b60606004805461053f906117da565b80601f016020809104026020016040519081016040528092919081815260200182805461056b906117da565b80156105b85780601f1061058d576101008083540402835291602001916105b8565b820191906000526020600020905b81548152906001019060200180831161059b57829003601f168201915b5050505050905090565b60006105cf338484610c32565b5060015b92915050565b60006105e6848484610d57565b6001600160a01b0384166000908152600260209081526040808320338452909152902054828110156106705760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b61067d8533858403610c32565b506001949350505050565b3360008181526002602090815260408083206001600160a01b038716845290915281205490916105cf9185906106bf90869061182a565b610c32565b6106ce3382610f25565b50565b6000546001600160a01b031633146106fb5760405162461bcd60e51b81526004016106679061183d565b610705600061106b565b565b60075460ff166107495760405162461bcd60e51b815260206004820152600d60248201526c139bdd081c9958591e481e595d609a1b6044820152606401610667565b600654600354610759908661182a565b106107925760405162461bcd60e51b8152602060048201526009602482015268534f4c44204f55542160b81b6044820152606401610667565b60ff83166000908152600960205260409020548411156107dc5760405162461bcd60e51b815260206004820152600560248201526422a92927a960d91b6044820152606401610667565b6107e882828533610a8e565b61081f5760405162461bcd60e51b8152602060048201526008602482015267436c61696d65642160c01b6044820152606401610667565b341561087c57600080546040516001600160a01b039091169034908381818185875af1925050503d8060008114610872576040519150601f19603f3d011682016040523d82523d6000602084013e610877565b606091505b505050505b336000818152600860205260409020805460ff191660011790556108a090856110bb565b50505050565b6000546001600160a01b031633146108d05760405162461bcd60e51b81526004016106679061183d565b60ff92909216600090815260096020908152604080832093909355600a90522080546001600160a01b0319166001600160a01b03909216919091179055565b60606005805461053f906117da565b3360009081526002602090815260408083206001600160a01b0386168452909152812054828110156109a05760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610667565b6109ad3385858403610c32565b5060019392505050565b60006105cf338484610d57565b6000546001600160a01b031633146109ee5760405162461bcd60e51b81526004016106679061183d565b6007805460ff1916911515919091179055565b6040516bffffffffffffffffffffffff19606083901b16602082015260009081906034016040516020818303038152906040528051906020012090506000610a76827f19457468657265756d205369676e6564204d6573736167653a0a3332000000006000908152601c91909152603c902090565b90506000610a84828761119a565b9695505050505050565b60ff82166000908152600a60209081526040808320548151601f88018490048402810184019092528682526001600160a01b031691610aea91908890889081908401838280828437600092019190915250879250610a01915050565b6001600160a01b031603610b1b573360009081526008602052604081205460ff1615159003610b1b57506001610b1f565b5060005b949350505050565b600b546040516310d33ce760e31b81526001600160a01b0383811660048301526060921690638699e73890602401600060405180830381865afa158015610b72573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526105d39190810190611872565b6000546001600160a01b03163314610bc45760405162461bcd60e51b81526004016106679061183d565b6001600160a01b038116610c295760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610667565b6106ce8161106b565b6001600160a01b038316610c945760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610667565b6001600160a01b038216610cf55760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610667565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038316610dbb5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610667565b6001600160a01b038216610e1d5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610667565b6001600160a01b03831660009081526001602052604090205481811015610e955760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610667565b6001600160a01b03808516600090815260016020526040808220858503905591851681529081208054849290610ecc90849061182a565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610f1891815260200190565b60405180910390a36108a0565b6001600160a01b038216610f855760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610667565b6001600160a01b03821660009081526001602052604090205481811015610ff95760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610667565b6001600160a01b03831660009081526001602052604081208383039055600380548492906110289084906118e9565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610d4a565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0382166111115760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610667565b8060036000828254611123919061182a565b90915550506001600160a01b0382166000908152600160205260408120805483929061115090849061182a565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b60008060006111a985856111be565b915091506111b681611203565b509392505050565b60008082516041036111f45760208301516040840151606085015160001a6111e88782858561134d565b945094505050506111fc565b506000905060025b9250929050565b6000816004811115611217576112176118fc565b0361121f5750565b6001816004811115611233576112336118fc565b036112805760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610667565b6002816004811115611294576112946118fc565b036112e15760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610667565b60038160048111156112f5576112f56118fc565b036106ce5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610667565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156113845750600090506003611408565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156113d8573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661140157600060019250925050611408565b9150600090505b94509492505050565b60005b8381101561142c578181015183820152602001611414565b50506000910152565b6020815260008251806020840152611454816040850160208701611411565b601f01601f19169190910160400192915050565b80356001600160a01b038116811461147f57600080fd5b919050565b6000806040838503121561149757600080fd5b6114a083611468565b946020939093013593505050565b803560ff8116811461147f57600080fd5b6000602082840312156114d157600080fd5b6114da826114ae565b9392505050565b6000806000606084860312156114f657600080fd5b6114ff84611468565b925061150d60208501611468565b9150604084013590509250925092565b60006020828403121561152f57600080fd5b5035919050565b60006020828403121561154857600080fd5b6114da82611468565b60008083601f84011261156357600080fd5b50813567ffffffffffffffff81111561157b57600080fd5b6020830191508360208285010111156111fc57600080fd5b600080600080606085870312156115a957600080fd5b843593506115b9602086016114ae565b9250604085013567ffffffffffffffff8111156115d557600080fd5b6115e187828801611551565b95989497509550505050565b60008060006060848603121561160257600080fd5b61160b846114ae565b92506020840135915061162060408501611468565b90509250925092565b60006020828403121561163b57600080fd5b813580151581146114da57600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561168a5761168a61164b565b604052919050565b600067ffffffffffffffff8211156116ac576116ac61164b565b50601f01601f191660200190565b600080604083850312156116cd57600080fd5b823567ffffffffffffffff8111156116e457600080fd5b8301601f810185136116f557600080fd5b803561170861170382611692565b611661565b81815286602083850101111561171d57600080fd5b8160208401602083013760006020838301015280945050505061174260208401611468565b90509250929050565b6000806000806060858703121561176157600080fd5b843567ffffffffffffffff81111561177857600080fd5b61178487828801611551565b90955093506117979050602086016114ae565b91506117a560408601611468565b905092959194509250565b600080604083850312156117c357600080fd5b6117cc83611468565b915061174260208401611468565b600181811c908216806117ee57607f821691505b60208210810361180e57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156105d3576105d3611814565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60006020828403121561188457600080fd5b815167ffffffffffffffff81111561189b57600080fd5b8201601f810184136118ac57600080fd5b80516118ba61170382611692565b8181528560208385010111156118cf57600080fd5b6118e0826020830160208601611411565b95945050505050565b818103818111156105d3576105d3611814565b634e487b7160e01b600052602160045260246000fdfea264697066735822122041395ceb1047f00882596871e11a2f667f88aeda4c72cfeef910a186d07ec33c64736f6c63430008120033
Deployed Bytecode
0x6080604052600436106101815760003560e01c80637806d616116100d1578063adeb0d881161008a578063cd2fcc2c11610064578063cd2fcc2c1461048a578063dd62ed3e146104aa578063e95c8900146104f0578063f2fde38b1461051057600080fd5b8063adeb0d8814610420578063c884ef8314610440578063c9b0a2a71461047057600080fd5b80637806d6161461036d5780638da5cb5b1461038d57806395d89b41146103ab578063a457c2d7146103c0578063a9059cbb146103e0578063acec338a1461040057600080fd5b8063395093511161013e5780635eb8f05b116101185780635eb8f05b146102e257806370a082311461030f578063715018a614610345578063754a83771461035a57600080fd5b8063395093511461028a5780633eaaf86b146102aa57806342966c68146102c057600080fd5b806306fdde0314610186578063095ea7b3146101b1578063095fe2c3146101e157806318160ddd1461022f57806323b872dd1461024e578063313ce5671461026e575b600080fd5b34801561019257600080fd5b5061019b610530565b6040516101a89190611435565b60405180910390f35b3480156101bd57600080fd5b506101d16101cc366004611484565b6105c2565b60405190151581526020016101a8565b3480156101ed57600080fd5b506102176101fc3660046114bf565b600a602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016101a8565b34801561023b57600080fd5b506003545b6040519081526020016101a8565b34801561025a57600080fd5b506101d16102693660046114e1565b6105d9565b34801561027a57600080fd5b50604051601281526020016101a8565b34801561029657600080fd5b506101d16102a5366004611484565b610688565b3480156102b657600080fd5b5061024060065481565b3480156102cc57600080fd5b506102e06102db36600461151d565b6106c4565b005b3480156102ee57600080fd5b506102406102fd3660046114bf565b60096020526000908152604090205481565b34801561031b57600080fd5b5061024061032a366004611536565b6001600160a01b031660009081526001602052604090205490565b34801561035157600080fd5b506102e06106d1565b6102e0610368366004611593565b610707565b34801561037957600080fd5b506102e06103883660046115ed565b6108a6565b34801561039957600080fd5b506000546001600160a01b0316610217565b3480156103b757600080fd5b5061019b61090f565b3480156103cc57600080fd5b506101d16103db366004611484565b61091e565b3480156103ec57600080fd5b506101d16103fb366004611484565b6109b7565b34801561040c57600080fd5b506102e061041b366004611629565b6109c4565b34801561042c57600080fd5b5061021761043b3660046116ba565b610a01565b34801561044c57600080fd5b506101d161045b366004611536565b60086020526000908152604090205460ff1681565b34801561047c57600080fd5b506007546101d19060ff1681565b34801561049657600080fd5b506101d16104a536600461174b565b610a8e565b3480156104b657600080fd5b506102406104c53660046117b0565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b3480156104fc57600080fd5b5061019b61050b366004611536565b610b27565b34801561051c57600080fd5b506102e061052b366004611536565b610b9a565b60606004805461053f906117da565b80601f016020809104026020016040519081016040528092919081815260200182805461056b906117da565b80156105b85780601f1061058d576101008083540402835291602001916105b8565b820191906000526020600020905b81548152906001019060200180831161059b57829003601f168201915b5050505050905090565b60006105cf338484610c32565b5060015b92915050565b60006105e6848484610d57565b6001600160a01b0384166000908152600260209081526040808320338452909152902054828110156106705760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b60648201526084015b60405180910390fd5b61067d8533858403610c32565b506001949350505050565b3360008181526002602090815260408083206001600160a01b038716845290915281205490916105cf9185906106bf90869061182a565b610c32565b6106ce3382610f25565b50565b6000546001600160a01b031633146106fb5760405162461bcd60e51b81526004016106679061183d565b610705600061106b565b565b60075460ff166107495760405162461bcd60e51b815260206004820152600d60248201526c139bdd081c9958591e481e595d609a1b6044820152606401610667565b600654600354610759908661182a565b106107925760405162461bcd60e51b8152602060048201526009602482015268534f4c44204f55542160b81b6044820152606401610667565b60ff83166000908152600960205260409020548411156107dc5760405162461bcd60e51b815260206004820152600560248201526422a92927a960d91b6044820152606401610667565b6107e882828533610a8e565b61081f5760405162461bcd60e51b8152602060048201526008602482015267436c61696d65642160c01b6044820152606401610667565b341561087c57600080546040516001600160a01b039091169034908381818185875af1925050503d8060008114610872576040519150601f19603f3d011682016040523d82523d6000602084013e610877565b606091505b505050505b336000818152600860205260409020805460ff191660011790556108a090856110bb565b50505050565b6000546001600160a01b031633146108d05760405162461bcd60e51b81526004016106679061183d565b60ff92909216600090815260096020908152604080832093909355600a90522080546001600160a01b0319166001600160a01b03909216919091179055565b60606005805461053f906117da565b3360009081526002602090815260408083206001600160a01b0386168452909152812054828110156109a05760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610667565b6109ad3385858403610c32565b5060019392505050565b60006105cf338484610d57565b6000546001600160a01b031633146109ee5760405162461bcd60e51b81526004016106679061183d565b6007805460ff1916911515919091179055565b6040516bffffffffffffffffffffffff19606083901b16602082015260009081906034016040516020818303038152906040528051906020012090506000610a76827f19457468657265756d205369676e6564204d6573736167653a0a3332000000006000908152601c91909152603c902090565b90506000610a84828761119a565b9695505050505050565b60ff82166000908152600a60209081526040808320548151601f88018490048402810184019092528682526001600160a01b031691610aea91908890889081908401838280828437600092019190915250879250610a01915050565b6001600160a01b031603610b1b573360009081526008602052604081205460ff1615159003610b1b57506001610b1f565b5060005b949350505050565b600b546040516310d33ce760e31b81526001600160a01b0383811660048301526060921690638699e73890602401600060405180830381865afa158015610b72573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526105d39190810190611872565b6000546001600160a01b03163314610bc45760405162461bcd60e51b81526004016106679061183d565b6001600160a01b038116610c295760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610667565b6106ce8161106b565b6001600160a01b038316610c945760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610667565b6001600160a01b038216610cf55760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610667565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038316610dbb5760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610667565b6001600160a01b038216610e1d5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610667565b6001600160a01b03831660009081526001602052604090205481811015610e955760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610667565b6001600160a01b03808516600090815260016020526040808220858503905591851681529081208054849290610ecc90849061182a565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610f1891815260200190565b60405180910390a36108a0565b6001600160a01b038216610f855760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610667565b6001600160a01b03821660009081526001602052604090205481811015610ff95760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610667565b6001600160a01b03831660009081526001602052604081208383039055600380548492906110289084906118e9565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610d4a565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0382166111115760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610667565b8060036000828254611123919061182a565b90915550506001600160a01b0382166000908152600160205260408120805483929061115090849061182a565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b60008060006111a985856111be565b915091506111b681611203565b509392505050565b60008082516041036111f45760208301516040840151606085015160001a6111e88782858561134d565b945094505050506111fc565b506000905060025b9250929050565b6000816004811115611217576112176118fc565b0361121f5750565b6001816004811115611233576112336118fc565b036112805760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610667565b6002816004811115611294576112946118fc565b036112e15760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610667565b60038160048111156112f5576112f56118fc565b036106ce5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610667565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156113845750600090506003611408565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156113d8573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661140157600060019250925050611408565b9150600090505b94509492505050565b60005b8381101561142c578181015183820152602001611414565b50506000910152565b6020815260008251806020840152611454816040850160208701611411565b601f01601f19169190910160400192915050565b80356001600160a01b038116811461147f57600080fd5b919050565b6000806040838503121561149757600080fd5b6114a083611468565b946020939093013593505050565b803560ff8116811461147f57600080fd5b6000602082840312156114d157600080fd5b6114da826114ae565b9392505050565b6000806000606084860312156114f657600080fd5b6114ff84611468565b925061150d60208501611468565b9150604084013590509250925092565b60006020828403121561152f57600080fd5b5035919050565b60006020828403121561154857600080fd5b6114da82611468565b60008083601f84011261156357600080fd5b50813567ffffffffffffffff81111561157b57600080fd5b6020830191508360208285010111156111fc57600080fd5b600080600080606085870312156115a957600080fd5b843593506115b9602086016114ae565b9250604085013567ffffffffffffffff8111156115d557600080fd5b6115e187828801611551565b95989497509550505050565b60008060006060848603121561160257600080fd5b61160b846114ae565b92506020840135915061162060408501611468565b90509250925092565b60006020828403121561163b57600080fd5b813580151581146114da57600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561168a5761168a61164b565b604052919050565b600067ffffffffffffffff8211156116ac576116ac61164b565b50601f01601f191660200190565b600080604083850312156116cd57600080fd5b823567ffffffffffffffff8111156116e457600080fd5b8301601f810185136116f557600080fd5b803561170861170382611692565b611661565b81815286602083850101111561171d57600080fd5b8160208401602083013760006020838301015280945050505061174260208401611468565b90509250929050565b6000806000806060858703121561176157600080fd5b843567ffffffffffffffff81111561177857600080fd5b61178487828801611551565b90955093506117979050602086016114ae565b91506117a560408601611468565b905092959194509250565b600080604083850312156117c357600080fd5b6117cc83611468565b915061174260208401611468565b600181811c908216806117ee57607f821691505b60208210810361180e57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156105d3576105d3611814565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60006020828403121561188457600080fd5b815167ffffffffffffffff81111561189b57600080fd5b8201601f810184136118ac57600080fd5b80516118ba61170382611692565b8181528560208385010111156118cf57600080fd5b6118e0826020830160208601611411565b95945050505050565b818103818111156105d3576105d3611814565b634e487b7160e01b600052602160045260246000fdfea264697066735822122041395ceb1047f00882596871e11a2f667f88aeda4c72cfeef910a186d07ec33c64736f6c63430008120033
Deployed Bytecode Sourcemap
45548:2347:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9312:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11479:169;;;;;;;;;;-1:-1:-1;11479:169:0;;;;;:::i;:::-;;:::i;:::-;;;1272:14:1;;1265:22;1247:41;;1235:2;1220:18;11479:169:0;1107:187:1;45776:47:0;;;;;;;;;;-1:-1:-1;45776:47:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;45776:47:0;;;;;;-1:-1:-1;;;;;1811:32:1;;;1793:51;;1781:2;1766:18;45776:47:0;1647:203:1;10432:108:0;;;;;;;;;;-1:-1:-1;10520:12:0;;10432:108;;;2001:25:1;;;1989:2;1974:18;10432:108:0;1855:177:1;12130:492:0;;;;;;;;;;-1:-1:-1;12130:492:0;;;;;:::i;:::-;;:::i;10274:93::-;;;;;;;;;;-1:-1:-1;10274:93:0;;10357:2;2512:36:1;;2500:2;2485:18;10274:93:0;2370:184:1;13031:215:0;;;;;;;;;;-1:-1:-1;13031:215:0;;;;;:::i;:::-;;:::i;45586:52::-;;;;;;;;;;;;;;;;47811:81;;;;;;;;;;-1:-1:-1;47811:81:0;;;;;:::i;:::-;;:::i;:::-;;45722:47;;;;;;;;;;-1:-1:-1;45722:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;10603:127;;;;;;;;;;-1:-1:-1;10603:127:0;;;;;:::i;:::-;-1:-1:-1;;;;;10704:18:0;10677:7;10704:18;;;:9;:18;;;;;;;10603:127;2713:103;;;;;;;;;;;;;:::i;46512:563::-;;;;;;:::i;:::-;;:::i;46200:190::-;;;;;;;;;;-1:-1:-1;46200:190:0;;;;;:::i;:::-;;:::i;2062:87::-;;;;;;;;;;-1:-1:-1;2108:7:0;2135:6;-1:-1:-1;;;;;2135:6:0;2062:87;;9531:104;;;;;;;;;;;;;:::i;13749:413::-;;;;;;;;;;-1:-1:-1;13749:413:0;;;;;:::i;:::-;;:::i;10943:175::-;;;;;;;;;;-1:-1:-1;10943:175:0;;;;;:::i;:::-;;:::i;46405:93::-;;;;;;;;;;-1:-1:-1;46405:93:0;;;;;:::i;:::-;;:::i;47487:314::-;;;;;;;;;;-1:-1:-1;47487:314:0;;;;;:::i;:::-;;:::i;45676:39::-;;;;;;;;;;-1:-1:-1;45676:39:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;45645:24;;;;;;;;;;-1:-1:-1;45645:24:0;;;;;;;;47089:390;;;;;;;;;;-1:-1:-1;47089:390:0;;;;;:::i;:::-;;:::i;11181:151::-;;;;;;;;;;-1:-1:-1;11181:151:0;;;;;:::i;:::-;-1:-1:-1;;;;;11297:18:0;;;11270:7;11297:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;11181:151;46023:167;;;;;;;;;;-1:-1:-1;46023:167:0;;;;;:::i;:::-;;:::i;2971:201::-;;;;;;;;;;-1:-1:-1;2971:201:0;;;;;:::i;:::-;;:::i;9312:100::-;9366:13;9399:5;9392:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9312:100;:::o;11479:169::-;11562:4;11579:39;860:10;11602:7;11611:6;11579:8;:39::i;:::-;-1:-1:-1;11636:4:0;11479:169;;;;;:::o;12130:492::-;12270:4;12287:36;12297:6;12305:9;12316:6;12287:9;:36::i;:::-;-1:-1:-1;;;;;12363:19:0;;12336:24;12363:19;;;:11;:19;;;;;;;;860:10;12363:33;;;;;;;;12415:26;;;;12407:79;;;;-1:-1:-1;;;12407:79:0;;7219:2:1;12407:79:0;;;7201:21:1;7258:2;7238:18;;;7231:30;7297:34;7277:18;;;7270:62;-1:-1:-1;;;7348:18:1;;;7341:38;7396:19;;12407:79:0;;;;;;;;;12522:57;12531:6;860:10;12572:6;12553:16;:25;12522:8;:57::i;:::-;-1:-1:-1;12610:4:0;;12130:492;-1:-1:-1;;;;12130:492:0:o;13031:215::-;860:10;13119:4;13168:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;13168:34:0;;;;;;;;;;13119:4;;13136:80;;13159:7;;13168:47;;13205:10;;13168:47;:::i;:::-;13136:8;:80::i;47811:81::-;47860:24;47866:10;47878:5;47860;:24::i;:::-;47811:81;:::o;2713:103::-;2108:7;2135:6;-1:-1:-1;;;;;2135:6:0;860:10;2282:23;2274:68;;;;-1:-1:-1;;;2274:68:0;;;;;;;:::i;:::-;2778:30:::1;2805:1;2778:18;:30::i;:::-;2713:103::o:0;46512:563::-;46646:6;;;;46638:32;;;;-1:-1:-1;;;46638:32:0;;8251:2:1;46638:32:0;;;8233:21:1;8290:2;8270:18;;;8263:30;-1:-1:-1;;;8309:18:1;;;8302:43;8362:18;;46638:32:0;8049:337:1;46638:32:0;46711:12;;10520;;46689:21;;:7;:21;:::i;:::-;:34;46681:55;;;;-1:-1:-1;;;46681:55:0;;8593:2:1;46681:55:0;;;8575:21:1;8632:1;8612:18;;;8605:29;-1:-1:-1;;;8650:18:1;;;8643:39;8699:18;;46681:55:0;8391:332:1;46681:55:0;46756:24;;;;;;;:14;:24;;;;;;:33;-1:-1:-1;46756:33:0;46748:51;;;;-1:-1:-1;;;46748:51:0;;8930:2:1;46748:51:0;;;8912:21:1;8969:1;8949:18;;;8942:29;-1:-1:-1;;;8987:18:1;;;8980:35;9032:18;;46748:51:0;8728:328:1;46748:51:0;46819:46;46835:9;;46845:8;46854:10;46819:15;:46::i;:::-;46811:66;;;;-1:-1:-1;;;46811:66:0;;9263:2:1;46811:66:0;;;9245:21:1;9302:1;9282:18;;;9275:29;-1:-1:-1;;;9320:18:1;;;9313:38;9368:18;;46811:66:0;9061:331:1;46811:66:0;46894:9;:11;46890:106;;46919:12;2135:6;;46937:42;;-1:-1:-1;;;;;2135:6:0;;;;46965:9;;46919:12;46937:42;46919:12;46937:42;46965:9;2135:6;46937:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;46890:106:0;47014:10;47006:19;;;;:7;:19;;;;;:24;;-1:-1:-1;;47006:24:0;47026:4;47006:24;;;47041:26;;47059:7;47041:5;:26::i;:::-;46512:563;;;;:::o;46200:190::-;2108:7;2135:6;-1:-1:-1;;;;;2135:6:0;860:10;2282:23;2274:68;;;;-1:-1:-1;;;2274:68:0;;;;;;;:::i;:::-;46303:25:::1;::::0;;;::::1;;::::0;;;:14:::1;:25;::::0;;;;;;;:35;;;;46349:14:::1;:25:::0;;;:33;;-1:-1:-1;;;;;;46349:33:0::1;-1:-1:-1::0;;;;;46349:33:0;;::::1;::::0;;;::::1;::::0;;46200:190::o;9531:104::-;9587:13;9620:7;9613:14;;;;;:::i;13749:413::-;860:10;13842:4;13886:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;13886:34:0;;;;;;;;;;13939:35;;;;13931:85;;;;-1:-1:-1;;;13931:85:0;;9809:2:1;13931:85:0;;;9791:21:1;9848:2;9828:18;;;9821:30;9887:34;9867:18;;;9860:62;-1:-1:-1;;;9938:18:1;;;9931:35;9983:19;;13931:85:0;9607:401:1;13931:85:0;14052:67;860:10;14075:7;14103:15;14084:16;:34;14052:8;:67::i;:::-;-1:-1:-1;14150:4:0;;13749:413;-1:-1:-1;;;13749:413:0:o;10943:175::-;11029:4;11046:42;860:10;11070:9;11081:6;11046:9;:42::i;46405:93::-;2108:7;2135:6;-1:-1:-1;;;;;2135:6:0;860:10;2282:23;2274:68;;;;-1:-1:-1;;;2274:68:0;;;;;;;:::i;:::-;46471:6:::1;:19:::0;;-1:-1:-1;;46471:19:0::1;::::0;::::1;;::::0;;;::::1;::::0;;46405:93::o;47487:314::-;47620:25;;-1:-1:-1;;10162:2:1;10158:15;;;10154:53;47620:25:0;;;10142:66:1;47572:7:0;;;;10224:12:1;;47620:25:0;;;;;;;;;;;;47610:36;;;;;;47592:54;;47657:12;47672:37;47701:7;26691:34;26486:15;26678:48;;;26747:4;26740:18;;;;26799:4;26783:21;;;26417:405;47672:37;47657:52;;47720:15;47738:30;47752:4;47758:9;47738:13;:30::i;:::-;47720:48;47487:314;-1:-1:-1;;;;;;47487:314:0:o;47089:390::-;47248:25;;;47193:4;47248:25;;;:14;:25;;;;;;;;;47214:32;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47248:25:0;;47214:32;;;47228:9;;;;;;47214:32;;47228:9;;;;47214:32;;;;;;;;;-1:-1:-1;47238:7:0;;-1:-1:-1;47214:13:0;;-1:-1:-1;;47214:32:0:i;:::-;-1:-1:-1;;;;;47214:59:0;;47210:262;;47302:10;47294:19;;;;:7;:19;;;;;;;;:26;;;;47290:133;;-1:-1:-1;47349:4:0;47342:11;;47290:133;-1:-1:-1;47401:5:0;47210:262;47089:390;;;;;;:::o;46023:167::-;46141:15;;46123:59;;-1:-1:-1;;;46123:59:0;;-1:-1:-1;;;;;1811:32:1;;;46123:59:0;;;1793:51:1;46091:13:0;;46141:15;;46123:49;;1766:18:1;;46123:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;46123:59:0;;;;;;;;;;;;:::i;2971:201::-;2108:7;2135:6;-1:-1:-1;;;;;2135:6:0;860:10;2282:23;2274:68;;;;-1:-1:-1;;;2274:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;3060:22:0;::::1;3052:73;;;::::0;-1:-1:-1;;;3052:73:0;;11102:2:1;3052:73:0::1;::::0;::::1;11084:21:1::0;11141:2;11121:18;;;11114:30;11180:34;11160:18;;;11153:62;-1:-1:-1;;;11231:18:1;;;11224:36;11277:19;;3052:73:0::1;10900:402:1::0;3052:73:0::1;3136:28;3155:8;3136:18;:28::i;17433:380::-:0;-1:-1:-1;;;;;17569:19:0;;17561:68;;;;-1:-1:-1;;;17561:68:0;;11509:2:1;17561:68:0;;;11491:21:1;11548:2;11528:18;;;11521:30;11587:34;11567:18;;;11560:62;-1:-1:-1;;;11638:18:1;;;11631:34;11682:19;;17561:68:0;11307:400:1;17561:68:0;-1:-1:-1;;;;;17648:21:0;;17640:68;;;;-1:-1:-1;;;17640:68:0;;11914:2:1;17640:68:0;;;11896:21:1;11953:2;11933:18;;;11926:30;11992:34;11972:18;;;11965:62;-1:-1:-1;;;12043:18:1;;;12036:32;12085:19;;17640:68:0;11712:398:1;17640:68:0;-1:-1:-1;;;;;17721:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;17773:32;;2001:25:1;;;17773:32:0;;1974:18:1;17773:32:0;;;;;;;;17433:380;;;:::o;14652:733::-;-1:-1:-1;;;;;14792:20:0;;14784:70;;;;-1:-1:-1;;;14784:70:0;;12317:2:1;14784:70:0;;;12299:21:1;12356:2;12336:18;;;12329:30;12395:34;12375:18;;;12368:62;-1:-1:-1;;;12446:18:1;;;12439:35;12491:19;;14784:70:0;12115:401:1;14784:70:0;-1:-1:-1;;;;;14873:23:0;;14865:71;;;;-1:-1:-1;;;14865:71:0;;12723:2:1;14865:71:0;;;12705:21:1;12762:2;12742:18;;;12735:30;12801:34;12781:18;;;12774:62;-1:-1:-1;;;12852:18:1;;;12845:33;12895:19;;14865:71:0;12521:399:1;14865:71:0;-1:-1:-1;;;;;15033:17:0;;15009:21;15033:17;;;:9;:17;;;;;;15069:23;;;;15061:74;;;;-1:-1:-1;;;15061:74:0;;13127:2:1;15061:74:0;;;13109:21:1;13166:2;13146:18;;;13139:30;13205:34;13185:18;;;13178:62;-1:-1:-1;;;13256:18:1;;;13249:36;13302:19;;15061:74:0;12925:402:1;15061:74:0;-1:-1:-1;;;;;15171:17:0;;;;;;;:9;:17;;;;;;15191:22;;;15171:42;;15235:20;;;;;;;;:30;;15207:6;;15171:17;15235:30;;15207:6;;15235:30;:::i;:::-;;;;;;;;15300:9;-1:-1:-1;;;;;15283:35:0;15292:6;-1:-1:-1;;;;;15283:35:0;;15311:6;15283:35;;;;2001:25:1;;1989:2;1974:18;;1855:177;15283:35:0;;;;;;;;15331:46;16404:591;;-1:-1:-1;;;;;16488:21:0;;16480:67;;;;-1:-1:-1;;;16480:67:0;;13534:2:1;16480:67:0;;;13516:21:1;13573:2;13553:18;;;13546:30;13612:34;13592:18;;;13585:62;-1:-1:-1;;;13663:18:1;;;13656:31;13704:19;;16480:67:0;13332:397:1;16480:67:0;-1:-1:-1;;;;;16647:18:0;;16622:22;16647:18;;;:9;:18;;;;;;16684:24;;;;16676:71;;;;-1:-1:-1;;;16676:71:0;;13936:2:1;16676:71:0;;;13918:21:1;13975:2;13955:18;;;13948:30;14014:34;13994:18;;;13987:62;-1:-1:-1;;;14065:18:1;;;14058:32;14107:19;;16676:71:0;13734:398:1;16676:71:0;-1:-1:-1;;;;;16783:18:0;;;;;;:9;:18;;;;;16804:23;;;16783:44;;16849:12;:22;;16821:6;;16783:18;16849:22;;16821:6;;16849:22;:::i;:::-;;;;-1:-1:-1;;16889:37:0;;2001:25:1;;;16915:1:0;;-1:-1:-1;;;;;16889:37:0;;;;;1989:2:1;1974:18;16889:37:0;1855:177:1;3332:191:0;3406:16;3425:6;;-1:-1:-1;;;;;3442:17:0;;;-1:-1:-1;;;;;;3442:17:0;;;;;;3475:40;;3425:6;;;;;;;3475:40;;3406:16;3475:40;3395:128;3332:191;:::o;15672:399::-;-1:-1:-1;;;;;15756:21:0;;15748:65;;;;-1:-1:-1;;;15748:65:0;;14472:2:1;15748:65:0;;;14454:21:1;14511:2;14491:18;;;14484:30;14550:33;14530:18;;;14523:61;14601:18;;15748:65:0;14270:355:1;15748:65:0;15904:6;15888:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;15921:18:0;;;;;;:9;:18;;;;;:28;;15943:6;;15921:18;:28;;15943:6;;15921:28;:::i;:::-;;;;-1:-1:-1;;15965:37:0;;2001:25:1;;;-1:-1:-1;;;;;15965:37:0;;;15982:1;;15965:37;;1989:2:1;1974:18;15965:37:0;;;;;;;15672:399;;:::o;22881:231::-;22959:7;22980:17;22999:18;23021:27;23032:4;23038:9;23021:10;:27::i;:::-;22979:69;;;;23059:18;23071:5;23059:11;:18::i;:::-;-1:-1:-1;23095:9:0;22881:231;-1:-1:-1;;;22881:231:0:o;21332:747::-;21413:7;21422:12;21451:9;:16;21471:2;21451:22;21447:625;;21795:4;21780:20;;21774:27;21845:4;21830:20;;21824:27;21903:4;21888:20;;21882:27;21490:9;21874:36;21946:25;21957:4;21874:36;21774:27;21824;21946:10;:25::i;:::-;21939:32;;;;;;;;;21447:625;-1:-1:-1;22020:1:0;;-1:-1:-1;22024:35:0;21447:625;21332:747;;;;;:::o;19725:521::-;19803:20;19794:5;:29;;;;;;;;:::i;:::-;;19790:449;;19725:521;:::o;19790:449::-;19901:29;19892:5;:38;;;;;;;;:::i;:::-;;19888:351;;19947:34;;-1:-1:-1;;;19947:34:0;;14964:2:1;19947:34:0;;;14946:21:1;15003:2;14983:18;;;14976:30;15042:26;15022:18;;;15015:54;15086:18;;19947:34:0;14762:348:1;19888:351:0;20012:35;20003:5;:44;;;;;;;;:::i;:::-;;19999:240;;20064:41;;-1:-1:-1;;;20064:41:0;;15317:2:1;20064:41:0;;;15299:21:1;15356:2;15336:18;;;15329:30;15395:33;15375:18;;;15368:61;15446:18;;20064:41:0;15115:355:1;19999:240:0;20136:30;20127:5;:39;;;;;;;;:::i;:::-;;20123:116;;20183:44;;-1:-1:-1;;;20183:44:0;;15677:2:1;20183:44:0;;;15659:21:1;15716:2;15696:18;;;15689:30;15755:34;15735:18;;;15728:62;-1:-1:-1;;;15806:18:1;;;15799:32;15848:19;;20183:44:0;15475:398:1;24265:1477:0;24353:7;;25287:66;25274:79;;25270:163;;;-1:-1:-1;25386:1:0;;-1:-1:-1;25390:30:0;25370:51;;25270:163;25547:24;;;25530:14;25547:24;;;;;;;;;16105:25:1;;;16178:4;16166:17;;16146:18;;;16139:45;;;;16200:18;;;16193:34;;;16243:18;;;16236:34;;;25547:24:0;;16077:19:1;;25547:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;25547:24:0;;-1:-1:-1;;25547:24:0;;;-1:-1:-1;;;;;;;25586:20:0;;25582:103;;25639:1;25643:29;25623:50;;;;;;;25582:103;25705:6;-1:-1:-1;25713:20:0;;-1:-1:-1;24265:1477:0;;;;;;;;:::o;14:250:1:-;99:1;109:113;123:6;120:1;117:13;109:113;;;199:11;;;193:18;180:11;;;173:39;145:2;138:10;109:113;;;-1:-1:-1;;256:1:1;238:16;;231:27;14:250::o;269:396::-;418:2;407:9;400:21;381:4;450:6;444:13;493:6;488:2;477:9;473:18;466:34;509:79;581:6;576:2;565:9;561:18;556:2;548:6;544:15;509:79;:::i;:::-;649:2;628:15;-1:-1:-1;;624:29:1;609:45;;;;656:2;605:54;;269:396;-1:-1:-1;;269:396:1:o;670:173::-;738:20;;-1:-1:-1;;;;;787:31:1;;777:42;;767:70;;833:1;830;823:12;767:70;670:173;;;:::o;848:254::-;916:6;924;977:2;965:9;956:7;952:23;948:32;945:52;;;993:1;990;983:12;945:52;1016:29;1035:9;1016:29;:::i;:::-;1006:39;1092:2;1077:18;;;;1064:32;;-1:-1:-1;;;848:254:1:o;1299:156::-;1365:20;;1425:4;1414:16;;1404:27;;1394:55;;1445:1;1442;1435:12;1460:182;1517:6;1570:2;1558:9;1549:7;1545:23;1541:32;1538:52;;;1586:1;1583;1576:12;1538:52;1609:27;1626:9;1609:27;:::i;:::-;1599:37;1460:182;-1:-1:-1;;;1460:182:1:o;2037:328::-;2114:6;2122;2130;2183:2;2171:9;2162:7;2158:23;2154:32;2151:52;;;2199:1;2196;2189:12;2151:52;2222:29;2241:9;2222:29;:::i;:::-;2212:39;;2270:38;2304:2;2293:9;2289:18;2270:38;:::i;:::-;2260:48;;2355:2;2344:9;2340:18;2327:32;2317:42;;2037:328;;;;;:::o;2559:180::-;2618:6;2671:2;2659:9;2650:7;2646:23;2642:32;2639:52;;;2687:1;2684;2677:12;2639:52;-1:-1:-1;2710:23:1;;2559:180;-1:-1:-1;2559:180:1:o;2744:186::-;2803:6;2856:2;2844:9;2835:7;2831:23;2827:32;2824:52;;;2872:1;2869;2862:12;2824:52;2895:29;2914:9;2895:29;:::i;2935:347::-;2986:8;2996:6;3050:3;3043:4;3035:6;3031:17;3027:27;3017:55;;3068:1;3065;3058:12;3017:55;-1:-1:-1;3091:20:1;;3134:18;3123:30;;3120:50;;;3166:1;3163;3156:12;3120:50;3203:4;3195:6;3191:17;3179:29;;3255:3;3248:4;3239:6;3231;3227:19;3223:30;3220:39;3217:59;;;3272:1;3269;3262:12;3287:547;3373:6;3381;3389;3397;3450:2;3438:9;3429:7;3425:23;3421:32;3418:52;;;3466:1;3463;3456:12;3418:52;3502:9;3489:23;3479:33;;3531:36;3563:2;3552:9;3548:18;3531:36;:::i;:::-;3521:46;;3618:2;3607:9;3603:18;3590:32;3645:18;3637:6;3634:30;3631:50;;;3677:1;3674;3667:12;3631:50;3716:58;3766:7;3757:6;3746:9;3742:22;3716:58;:::i;:::-;3287:547;;;;-1:-1:-1;3793:8:1;-1:-1:-1;;;;3287:547:1:o;3839:324::-;3914:6;3922;3930;3983:2;3971:9;3962:7;3958:23;3954:32;3951:52;;;3999:1;3996;3989:12;3951:52;4022:27;4039:9;4022:27;:::i;:::-;4012:37;;4096:2;4085:9;4081:18;4068:32;4058:42;;4119:38;4153:2;4142:9;4138:18;4119:38;:::i;:::-;4109:48;;3839:324;;;;;:::o;4168:273::-;4224:6;4277:2;4265:9;4256:7;4252:23;4248:32;4245:52;;;4293:1;4290;4283:12;4245:52;4332:9;4319:23;4385:5;4378:13;4371:21;4364:5;4361:32;4351:60;;4407:1;4404;4397:12;4446:127;4507:10;4502:3;4498:20;4495:1;4488:31;4538:4;4535:1;4528:15;4562:4;4559:1;4552:15;4578:275;4649:2;4643:9;4714:2;4695:13;;-1:-1:-1;;4691:27:1;4679:40;;4749:18;4734:34;;4770:22;;;4731:62;4728:88;;;4796:18;;:::i;:::-;4832:2;4825:22;4578:275;;-1:-1:-1;4578:275:1:o;4858:186::-;4906:4;4939:18;4931:6;4928:30;4925:56;;;4961:18;;:::i;:::-;-1:-1:-1;5027:2:1;5006:15;-1:-1:-1;;5002:29:1;5033:4;4998:40;;4858:186::o;5049:755::-;5126:6;5134;5187:2;5175:9;5166:7;5162:23;5158:32;5155:52;;;5203:1;5200;5193:12;5155:52;5243:9;5230:23;5276:18;5268:6;5265:30;5262:50;;;5308:1;5305;5298:12;5262:50;5331:22;;5384:4;5376:13;;5372:27;-1:-1:-1;5362:55:1;;5413:1;5410;5403:12;5362:55;5449:2;5436:16;5474:48;5490:31;5518:2;5490:31;:::i;:::-;5474:48;:::i;:::-;5545:2;5538:5;5531:17;5587:7;5580:4;5575:2;5571;5567:11;5563:22;5560:35;5557:55;;;5608:1;5605;5598:12;5557:55;5667:2;5660:4;5656:2;5652:13;5645:4;5638:5;5634:16;5621:49;5713:1;5706:4;5701:2;5694:5;5690:14;5686:25;5679:36;5734:5;5724:15;;;;;5758:40;5792:4;5781:9;5777:20;5758:40;:::i;:::-;5748:50;;5049:755;;;;;:::o;5809:553::-;5895:6;5903;5911;5919;5972:2;5960:9;5951:7;5947:23;5943:32;5940:52;;;5988:1;5985;5978:12;5940:52;6028:9;6015:23;6061:18;6053:6;6050:30;6047:50;;;6093:1;6090;6083:12;6047:50;6132:58;6182:7;6173:6;6162:9;6158:22;6132:58;:::i;:::-;6209:8;;-1:-1:-1;6106:84:1;-1:-1:-1;6263:36:1;;-1:-1:-1;6295:2:1;6280:18;;6263:36;:::i;:::-;6253:46;;6318:38;6352:2;6341:9;6337:18;6318:38;:::i;:::-;6308:48;;5809:553;;;;;;;:::o;6367:260::-;6435:6;6443;6496:2;6484:9;6475:7;6471:23;6467:32;6464:52;;;6512:1;6509;6502:12;6464:52;6535:29;6554:9;6535:29;:::i;:::-;6525:39;;6583:38;6617:2;6606:9;6602:18;6583:38;:::i;6632:380::-;6711:1;6707:12;;;;6754;;;6775:61;;6829:4;6821:6;6817:17;6807:27;;6775:61;6882:2;6874:6;6871:14;6851:18;6848:38;6845:161;;6928:10;6923:3;6919:20;6916:1;6909:31;6963:4;6960:1;6953:15;6991:4;6988:1;6981:15;6845:161;;6632:380;;;:::o;7426:127::-;7487:10;7482:3;7478:20;7475:1;7468:31;7518:4;7515:1;7508:15;7542:4;7539:1;7532:15;7558:125;7623:9;;;7644:10;;;7641:36;;;7657:18;;:::i;7688:356::-;7890:2;7872:21;;;7909:18;;;7902:30;7968:34;7963:2;7948:18;;7941:62;8035:2;8020:18;;7688:356::o;10247:648::-;10327:6;10380:2;10368:9;10359:7;10355:23;10351:32;10348:52;;;10396:1;10393;10386:12;10348:52;10429:9;10423:16;10462:18;10454:6;10451:30;10448:50;;;10494:1;10491;10484:12;10448:50;10517:22;;10570:4;10562:13;;10558:27;-1:-1:-1;10548:55:1;;10599:1;10596;10589:12;10548:55;10628:2;10622:9;10653:48;10669:31;10697:2;10669:31;:::i;10653:48::-;10724:2;10717:5;10710:17;10764:7;10759:2;10754;10750;10746:11;10742:20;10739:33;10736:53;;;10785:1;10782;10775:12;10736:53;10798:67;10862:2;10857;10850:5;10846:14;10841:2;10837;10833:11;10798:67;:::i;:::-;10884:5;10247:648;-1:-1:-1;;;;;10247:648:1:o;14137:128::-;14204:9;;;14225:11;;;14222:37;;;14239:18;;:::i;14630:127::-;14691:10;14686:3;14682:20;14679:1;14672:31;14722:4;14719:1;14712:15;14746:4;14743:1;14736:15
Swarm Source
ipfs://41395ceb1047f00882596871e11a2f667f88aeda4c72cfeef910a186d07ec33c
Loading...
Loading
Loading...
Loading
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.