Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00Latest 25 from a total of 290 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Commit | 20453567 | 568 days ago | IN | 0 ETH | 0.00002107 | ||||
| Commit | 18286587 | 871 days ago | IN | 0 ETH | 0.00070332 | ||||
| Register | 18286558 | 871 days ago | IN | 0 ETH | 0.00459803 | ||||
| Commit | 18286549 | 871 days ago | IN | 0 ETH | 0.0008796 | ||||
| Register | 18158989 | 889 days ago | IN | 0 ETH | 0.00269939 | ||||
| Commit | 18158757 | 889 days ago | IN | 0 ETH | 0.00058519 | ||||
| Register | 18111137 | 896 days ago | IN | 0 ETH | 0.00309915 | ||||
| Commit | 18111121 | 896 days ago | IN | 0 ETH | 0.00060451 | ||||
| Register | 18111101 | 896 days ago | IN | 0 ETH | 0.00288771 | ||||
| Commit | 18111086 | 896 days ago | IN | 0 ETH | 0.00055281 | ||||
| Register | 18111040 | 896 days ago | IN | 0 ETH | 0.00380939 | ||||
| Commit | 18111011 | 896 days ago | IN | 0 ETH | 0.00055348 | ||||
| Commit | 18058791 | 903 days ago | IN | 0 ETH | 0.0006553 | ||||
| Commit | 18033468 | 907 days ago | IN | 0 ETH | 0.00121387 | ||||
| Commit | 18014027 | 910 days ago | IN | 0 ETH | 0.00355133 | ||||
| Commit | 18011878 | 910 days ago | IN | 0 ETH | 0.00160143 | ||||
| Register | 17900701 | 925 days ago | IN | 0 ETH | 0.00490661 | ||||
| Commit | 17900694 | 925 days ago | IN | 0 ETH | 0.00100074 | ||||
| Commit | 17886340 | 927 days ago | IN | 0 ETH | 0.00187901 | ||||
| Commit | 17886337 | 927 days ago | IN | 0 ETH | 0.00173983 | ||||
| Commit | 17857379 | 932 days ago | IN | 0 ETH | 0.00096653 | ||||
| Commit | 17816607 | 937 days ago | IN | 0 ETH | 0.00134318 | ||||
| Commit | 17759089 | 945 days ago | IN | 0 ETH | 0.00111028 | ||||
| Register | 17747422 | 947 days ago | IN | 0 ETH | 0.00611018 | ||||
| Commit | 17747412 | 947 days ago | IN | 0 ETH | 0.00104039 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
KEY3RegistrarControllerV3
Compiler Version
v0.8.17+commit.8df45f5f
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;
import "@openzeppelin/contracts/security/Pausable.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/token/ERC721/IERC721.sol";
import "../utils/StringUtilsV2.sol";
import "../IKEY3FreeRegistrar.sol";
import "../resolvers/AddrResolver.sol";
import "../validators/IKEY3Validator.sol";
import "../validators/IKEY3MerkleValidator.sol";
import "../IKEY3InvitationRegistry.sol";
import "../IKEY3RewardRegistry.sol";
import "../IKEY3ClaimRegistry.sol";
contract KEY3RegistrarControllerV3 is Pausable, Ownable {
using StringUtilsV2 for *;
uint256 public constant EARLYBIRD_PERIOD = 0 hours;
IKEY3FreeRegistrar public base;
IKEY3MerkleValidator public merkleValidator;
IKEY3Validator public validator;
IKEY3InvitationRegistry public invitationRegistry;
IKEY3RewardRegistry public rewardRegistry;
IKEY3ClaimRegistry public claimRegistry;
uint256 public minCommitmentAge;
uint256 public maxCommitmentAge;
mapping(bytes32 => uint256) public commitments;
uint256 public startedTime;
event Start();
event NameRegistered(
string name,
bytes32 indexed label,
address indexed owner
);
event SetBaseRegistrar(address indexed registrar);
event SetMerkleValidator(address indexed validator);
event SetValidator(address indexed validator);
event SetInvitationRegistry(address indexed registry);
event SetRewardRegistry(address indexed registry);
event SetClaimRegistry(address indexed registry);
modifier whenStarted() {
require(startedTime > 0, "not started yet");
_;
}
constructor(
IKEY3FreeRegistrar freeRegistrar_,
IKEY3InvitationRegistry invitationRegistry_,
IKEY3Validator validator_,
IKEY3MerkleValidator merkleValidator_,
IKEY3RewardRegistry rewardRegistry_,
IKEY3ClaimRegistry claimRegistry_,
uint256 minCommitmentAge_,
uint256 maxCommitmentAge_
) {
require(maxCommitmentAge_ > minCommitmentAge_);
base = freeRegistrar_;
invitationRegistry = invitationRegistry_;
validator = validator_;
merkleValidator = merkleValidator_;
rewardRegistry = rewardRegistry_;
claimRegistry = claimRegistry_;
minCommitmentAge = minCommitmentAge_;
maxCommitmentAge = maxCommitmentAge_;
}
function pause() public onlyOwner {
_pause();
}
function unpause() public onlyOwner {
_unpause();
}
function _invitationsOf(
address inviter_
) internal view returns (address[] memory) {
return invitationRegistry.invitationsOf(inviter_);
}
function invitationsOf(
address inviter_
) public view returns (address[] memory) {
return _invitationsOf(inviter_);
}
function claimsOf(address user_) public view returns (uint256) {
return claimRegistry.claimsOf(user_);
}
function claimLimit() public view returns (uint256) {
return claimRegistry.claimLimit();
}
function _validate(string memory name_) internal view returns (bool) {
if (address(validator) == address(0)) {
return true;
}
return validator.validate(name_.toLowerCase());
}
function validate(string memory name_) public view returns (bool) {
return _validate(name_);
}
function _available(string memory name_) internal view returns (bool) {
string memory name = name_.toLowerCase();
bytes32 label = keccak256(bytes(name));
if (!base.available(uint256(label))) {
return false;
}
if (address(rewardRegistry) != address(0)) {
(bool exist, ) = rewardRegistry.exists(msg.sender, name);
if (exist) {
return true;
}
}
return _validate(name);
}
function available(string memory name_) public view returns (bool) {
return _available(name_);
}
function start() public onlyOwner {
require(startedTime == 0);
require(address(validator) != address(0));
require(address(merkleValidator) != address(0));
require(address(invitationRegistry) != address(0));
require(address(rewardRegistry) != address(0));
require(address(claimRegistry) != address(0));
startedTime = block.timestamp;
emit Start();
}
function setMerkleValidator(
address validator_
) public onlyOwner whenPaused {
merkleValidator = IKEY3MerkleValidator(validator_);
emit SetMerkleValidator(validator_);
}
function setBaseRegistrar(address registrar_) public onlyOwner whenPaused {
base = IKEY3FreeRegistrar(registrar_);
emit SetBaseRegistrar(registrar_);
}
function setValidator(address validator_) public onlyOwner whenPaused {
validator = IKEY3Validator(validator_);
emit SetValidator(validator_);
}
function setInvitationRegistry(
address registry_
) public onlyOwner whenPaused {
invitationRegistry = IKEY3InvitationRegistry(registry_);
emit SetInvitationRegistry(registry_);
}
function setRewardRegistry(address registry_) public onlyOwner whenPaused {
require(
base.baseNode() == IKEY3RewardRegistry(registry_).baseNode(),
"invalid base node"
);
rewardRegistry = IKEY3RewardRegistry(registry_);
emit SetRewardRegistry(registry_);
}
function setClaimRegistry(address registry_) public onlyOwner whenPaused {
require(
base.baseNode() == IKEY3ClaimRegistry(registry_).baseNode(),
"invalid base node"
);
claimRegistry = IKEY3ClaimRegistry(registry_);
emit SetClaimRegistry(registry_);
}
function setCommitmentAges(
uint256 minCommitmentAge_,
uint256 maxCommitmentAge_
) public onlyOwner {
require(maxCommitmentAge_ > minCommitmentAge_);
minCommitmentAge = minCommitmentAge_;
maxCommitmentAge = maxCommitmentAge_;
}
function generateCommitment(
string memory name_,
address owner_,
bytes32 secret_,
address resolver_,
address addr_
) public pure returns (bytes32) {
return _generateCommitment(name_, owner_, secret_, resolver_, addr_);
}
function _generateCommitment(
string memory name_,
address owner_,
bytes32 secret_,
address resolver_,
address addr_
) internal pure returns (bytes32) {
bytes32 label = keccak256(bytes(name_.toLowerCase()));
if (resolver_ == address(0) && addr_ == address(0)) {
return keccak256(abi.encodePacked(label, owner_, secret_));
}
require(resolver_ != address(0), "resolver_ != 0x0 required");
return
keccak256(
abi.encodePacked(label, owner_, resolver_, addr_, secret_)
);
}
function commit(
bytes32 commitment_,
bytes32[] memory merkleProofs_
) public whenStarted {
if (
block.timestamp <= startedTime + EARLYBIRD_PERIOD &&
address(merkleValidator) != address(0)
) {
require(
merkleValidator.validate(msg.sender, merkleProofs_),
"not on allowlist"
);
}
require(claimRegistry.claimable(msg.sender), "reached maximum limit");
require(
commitments[commitment_] + maxCommitmentAge < block.timestamp,
"commitment exists"
);
commitments[commitment_] = block.timestamp;
}
function register(
string memory name_,
address resolver_,
address inviter_,
bytes32 secret_
) public whenStarted {
bytes32 commitment = _generateCommitment(
name_,
msg.sender,
secret_,
resolver_,
msg.sender
);
require(commitments[commitment] + minCommitmentAge <= block.timestamp);
require(commitments[commitment] + maxCommitmentAge > block.timestamp);
_register(name_, resolver_, msg.sender, false);
delete (commitments[commitment]);
invitationRegistry.register(msg.sender, inviter_);
}
function claimRewards(address resolver_) public whenStarted {
require(base.baseNode() == rewardRegistry.baseNode(), "invalid claim");
string[] memory names = rewardRegistry.claim(msg.sender);
if (names.length == 0) {
return;
}
for (uint i = 0; i < names.length; i++) {
_register(names[i], resolver_, msg.sender, true);
}
}
function _register(
string memory name_,
address resolver_,
address addr_,
bool freeClaim_
) internal whenNotPaused {
string memory name = name_.toLowerCase();
require(_available(name), "this did is not available");
bytes32 label = keccak256(bytes(name));
uint256 tokenId = uint256(label);
if (resolver_ != address(0)) {
// Set this contract as the (temporary) owner, giving it
// permission to set up the resolver.
base.register(tokenId, address(this));
// The nodehash of this label
bytes32 nodehash = keccak256(
abi.encodePacked(base.baseNode(), label)
);
// Set the resolver
base.key3().setResolver(nodehash, resolver_);
// Configure the resolver
if (addr_ != address(0)) {
AddrResolver(resolver_).setAddr(nodehash, addr_);
}
// Now transfer full ownership to the expected owner
base.transferFrom(address(this), msg.sender, tokenId);
} else {
require(addr_ == address(0));
base.register(tokenId, msg.sender);
}
if (!freeClaim_) {
require(
base.baseNode() == claimRegistry.baseNode(),
"invalid claim"
);
claimRegistry.claim(msg.sender);
}
emit NameRegistered(name, label, msg.sender);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)
pragma solidity ^0.8.0;
import "../utils/Context.sol";
/**
* @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 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 {
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);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)
pragma solidity ^0.8.0;
import "../utils/Context.sol";
/**
* @dev Contract module which allows children to implement an emergency stop
* mechanism that can be triggered by an authorized account.
*
* This module is used through inheritance. It will make available the
* modifiers `whenNotPaused` and `whenPaused`, which can be applied to
* the functions of your contract. Note that they will not be pausable by
* simply including this module, only once the modifiers are put in place.
*/
abstract contract Pausable is Context {
/**
* @dev Emitted when the pause is triggered by `account`.
*/
event Paused(address account);
/**
* @dev Emitted when the pause is lifted by `account`.
*/
event Unpaused(address account);
bool private _paused;
/**
* @dev Initializes the contract in unpaused state.
*/
constructor() {
_paused = false;
}
/**
* @dev Modifier to make a function callable only when the contract is not paused.
*
* Requirements:
*
* - The contract must not be paused.
*/
modifier whenNotPaused() {
_requireNotPaused();
_;
}
/**
* @dev Modifier to make a function callable only when the contract is paused.
*
* Requirements:
*
* - The contract must be paused.
*/
modifier whenPaused() {
_requirePaused();
_;
}
/**
* @dev Returns true if the contract is paused, and false otherwise.
*/
function paused() public view virtual returns (bool) {
return _paused;
}
/**
* @dev Throws if the contract is paused.
*/
function _requireNotPaused() internal view virtual {
require(!paused(), "Pausable: paused");
}
/**
* @dev Throws if the contract is not paused.
*/
function _requirePaused() internal view virtual {
require(paused(), "Pausable: not paused");
}
/**
* @dev Triggers stopped state.
*
* Requirements:
*
* - The contract must not be paused.
*/
function _pause() internal virtual whenNotPaused {
_paused = true;
emit Paused(_msgSender());
}
/**
* @dev Returns to normal state.
*
* Requirements:
*
* - The contract must be paused.
*/
function _unpause() internal virtual whenPaused {
_paused = false;
emit Unpaused(_msgSender());
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol)
pragma solidity ^0.8.0;
import "../../utils/introspection/IERC165.sol";
/**
* @dev Required interface of an ERC721 compliant contract.
*/
interface IERC721 is IERC165 {
/**
* @dev Emitted when `tokenId` token is transferred from `from` to `to`.
*/
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
*/
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
/**
* @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
*/
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
/**
* @dev Returns the number of tokens in ``owner``'s account.
*/
function balanceOf(address owner) external view returns (uint256 balance);
/**
* @dev Returns the owner of the `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function ownerOf(uint256 tokenId) external view returns (address owner);
/**
* @dev Safely transfers `tokenId` token from `from` to `to`.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes calldata data
) external;
/**
* @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
* are aware of the ERC721 protocol to prevent tokens from being forever locked.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must exist and be owned by `from`.
* - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.
* - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
*
* Emits a {Transfer} event.
*/
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Transfers `tokenId` token from `from` to `to`.
*
* WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
* or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
* understand this adds an external call which potentially creates a reentrancy vulnerability.
*
* Requirements:
*
* - `from` cannot be the zero address.
* - `to` cannot be the zero address.
* - `tokenId` token must be owned by `from`.
* - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address from,
address to,
uint256 tokenId
) external;
/**
* @dev Gives permission to `to` to transfer `tokenId` token to another account.
* The approval is cleared when the token is transferred.
*
* Only a single account can be approved at a time, so approving the zero address clears previous approvals.
*
* Requirements:
*
* - The caller must own the token or be an approved operator.
* - `tokenId` must exist.
*
* Emits an {Approval} event.
*/
function approve(address to, uint256 tokenId) external;
/**
* @dev Approve or remove `operator` as an operator for the caller.
* Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
*
* Requirements:
*
* - The `operator` cannot be the caller.
*
* Emits an {ApprovalForAll} event.
*/
function setApprovalForAll(address operator, bool _approved) external;
/**
* @dev Returns the account approved for `tokenId` token.
*
* Requirements:
*
* - `tokenId` must exist.
*/
function getApproved(uint256 tokenId) external view returns (address operator);
/**
* @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
*
* See {setApprovalForAll}
*/
function isApprovedForAll(address owner, address operator) external view returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (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;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)
pragma solidity ^0.8.0;
import "./IERC165.sol";
/**
* @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;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;
interface IKEY3 {
// Logged when the owner of a node assigns a new owner to a subnode.
event NewOwner(bytes32 indexed node, bytes32 indexed label, address owner);
// Logged when the owner of a node transfers ownership to a new account.
event Transfer(bytes32 indexed node, address owner);
// Logged when the resolver for a node changes.
event NewResolver(bytes32 indexed node, address resolver);
// Logged when the TTL of a node changes
event NewTTL(bytes32 indexed node, uint64 ttl);
// Logged when an operator is added or removed.
event ApprovalForAll(
address indexed owner,
address indexed operator,
bool approved
);
function setRecord(
bytes32 node,
address owner,
address resolver,
uint64 ttl
) external;
function setSubnodeRecord(
bytes32 node,
bytes32 label,
address owner,
address resolver,
uint64 ttl
) external;
function setSubnodeOwner(
bytes32 node,
bytes32 label,
address owner
) external returns (bytes32);
function setResolver(bytes32 node, address resolver) external;
function setOwner(bytes32 node, address owner) external;
function setTTL(bytes32 node, uint64 ttl) external;
function setApprovalForAll(address operator, bool approved) external;
function owner(bytes32 node) external view returns (address);
function resolver(bytes32 node) external view returns (address);
function ttl(bytes32 node) external view returns (uint64);
function recordExists(bytes32 node) external view returns (bool);
function isApprovedForAll(address owner, address operator)
external
view
returns (bool);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;
interface IKEY3ClaimRegistry {
event SetClaimLimit(uint256 indexed claimLimit);
function claimLimit() external view returns (uint256);
function baseNode() external view returns (bytes32);
function claimable(address user_) external view returns (bool);
function claimsOf(address user_) external view returns (uint256);
function claim(address user_) external;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;
import "@openzeppelin/contracts/token/ERC721/IERC721.sol";
import "./IKEY3.sol";
interface IKEY3FreeRegistrar is IERC721 {
event NameRegistered(uint256 indexed id, address indexed owner);
function baseNode() external view returns (bytes32);
function key3() external view returns (IKEY3);
// Authorizes a controller, who can register and renew domains.
function addController(address controller) external;
// Revoke controller permission for an address.
function removeController(address controller) external;
// Set the resolver for the TLD this registrar manages.
function setResolver(address resolver) external;
// Returns true iff the specified name is available for registration.
function available(uint256 id) external view returns (bool);
/**
* @dev Register a name.
*/
function register(uint256 id, address owner) external;
/**
* @dev Reclaim ownership of a name in KEY3, if you own it in the registrar.`
*/
function reclaim(uint256 id, address owner) external;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;
interface IKEY3InvitationRegistry {
event CloseRound(uint256 indexed round, uint256 maxTicket);
event NewRound(uint256 indexed round, uint256 minTicket);
function addController(address controller) external;
function removeController(address controller) external;
function startNewRound() external;
function register(address user, address inviter) external;
function currentTicket() external view returns (uint256);
function currentRound() external view returns (uint256);
function ticketsOf(address inviter)
external
view
returns (uint256[] memory);
function invitationsOf(address inviter_)
external
view
returns (address[] memory);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;
interface IKEY3RewardRegistry {
struct Reward {
string name;
uint256 claimedAt;
uint256 expiredAt;
bool claimed;
}
event Claim(address indexed user, string name);
function baseNode() external view returns (bytes32);
function rewardsOf(address user) external view returns (Reward[] memory);
function exists(address user, string memory name)
external
view
returns (bool, uint);
function claim(address user) external returns (string[] memory);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;
import "./BaseResolver.sol";
abstract contract AddrResolver is BaseResolver {
bytes4 private constant ADDR_INTERFACE_ID = 0x3b3b57de;
bytes4 private constant ADDRESS_INTERFACE_ID = 0xf1cb7e06;
uint private constant COIN_TYPE_ETH = 60;
event AddrChanged(bytes32 indexed node, address a);
event AddressChanged(bytes32 indexed node, uint coinType, bytes newAddress);
mapping(bytes32 => mapping(uint => bytes)) _addresses;
/**
* Sets the address associated with an KEY3 node.
* May only be called by the owner of that node in the KEY3 registry.
* @param node The node to update.
* @param a The address to set.
*/
function setAddr(bytes32 node, address a) external authorised(node) {
setAddr(node, COIN_TYPE_ETH, _addressToBytes(a));
}
/**
* Returns the address associated with an KEY3 node.
* @param node The KEY3 node to query.
* @return The associated address.
*/
function addr(bytes32 node) public view returns (address payable) {
bytes memory a = addr(node, COIN_TYPE_ETH);
if (a.length == 0) {
return payable(address(0));
}
return _bytesToAddress(a);
}
function setAddr(
bytes32 node,
uint coinType,
bytes memory a
) public authorised(node) {
emit AddressChanged(node, coinType, a);
if (coinType == COIN_TYPE_ETH) {
emit AddrChanged(node, _bytesToAddress(a));
}
_addresses[node][coinType] = a;
}
function addr(bytes32 node, uint coinType)
public
view
returns (bytes memory)
{
return _addresses[node][coinType];
}
function supportsInterface(bytes4 interfaceId)
public
view
virtual
override
returns (bool)
{
return
interfaceId == ADDR_INTERFACE_ID ||
interfaceId == ADDRESS_INTERFACE_ID ||
super.supportsInterface(interfaceId);
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;
import "@openzeppelin/contracts/utils/introspection/ERC165.sol";
abstract contract BaseResolver is ERC165 {
modifier authorised(bytes32 node) {
require(_isAuthorised(node));
_;
}
function _isAuthorised(bytes32 node) internal view virtual returns (bool);
function _bytesToAddress(bytes memory b)
internal
pure
returns (address payable a)
{
require(b.length == 20);
assembly {
a := div(mload(add(b, 32)), exp(256, 12))
}
}
function _addressToBytes(address a) internal pure returns (bytes memory b) {
b = new bytes(20);
assembly {
mstore(add(b, 32), mul(a, exp(256, 12)))
}
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;
library StringUtilsV2 {
function strlen(string memory s) internal pure returns (uint) {
uint len;
uint i = 0;
bytes memory b = bytes(s);
for (len = 0; i < b.length; len++) {
bytes1 char = b[i];
if (char < 0x80) {
i += 1;
} else if (char < 0xE0) {
i += 2;
} else if (char < 0xF0) {
i += 3;
} else if (char < 0xF8) {
i += 4;
} else if (char < 0xFC) {
i += 5;
} else {
i += 6;
}
}
return len;
}
function onlyContainNumbers(string memory s) internal pure returns (bool) {
bytes memory b = bytes(s);
if (b.length == 0) {
return false;
}
for (uint i; i < b.length; i++) {
bytes1 char = b[i];
if (!(char >= 0x30 && char <= 0x39)) {
return false;
}
}
return true;
}
function onlyContainLetters(string memory s) internal pure returns (bool) {
bytes memory b = bytes(s);
if (b.length == 0) {
return false;
}
for (uint i; i < b.length; i++) {
bytes1 char = b[i];
if (
!(char >= 0x41 && char <= 0x5A) &&
!(char >= 0x61 && char <= 0x7A)
) {
return false;
}
}
return true;
}
function onlyContainNumbersAndLetters(
string memory s
) internal pure returns (bool) {
bytes memory b = bytes(s);
if (b.length == 0) {
return false;
}
for (uint i; i < b.length; i++) {
bytes1 char = b[i];
if (
!(char >= 0x30 && char <= 0x39) &&
!(char >= 0x41 && char <= 0x5A) &&
!(char >= 0x61 && char <= 0x7A)
) {
return false;
}
}
return true;
}
function toLowerCase(
string memory s
) internal pure returns (string memory) {
bytes memory b = bytes(s);
bytes memory lowers = new bytes(b.length);
for (uint i = 0; i < b.length; i++) {
bytes1 char = b[i];
if (char >= 0x41 && char <= 0x5A) {
lowers[i] = bytes1(uint8(char) + 0x20);
} else {
lowers[i] = b[i];
}
}
return string(lowers);
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;
interface IKEY3MerkleValidator {
function validate(address addr_, bytes32[] calldata merkleProofs_)
external
view
returns (bool);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;
interface IKEY3Validator {
function validate(string memory name) external view returns (bool);
}{
"optimizer": {
"enabled": false,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"contract IKEY3FreeRegistrar","name":"freeRegistrar_","type":"address"},{"internalType":"contract IKEY3InvitationRegistry","name":"invitationRegistry_","type":"address"},{"internalType":"contract IKEY3Validator","name":"validator_","type":"address"},{"internalType":"contract IKEY3MerkleValidator","name":"merkleValidator_","type":"address"},{"internalType":"contract IKEY3RewardRegistry","name":"rewardRegistry_","type":"address"},{"internalType":"contract IKEY3ClaimRegistry","name":"claimRegistry_","type":"address"},{"internalType":"uint256","name":"minCommitmentAge_","type":"uint256"},{"internalType":"uint256","name":"maxCommitmentAge_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":true,"internalType":"bytes32","name":"label","type":"bytes32"},{"indexed":true,"internalType":"address","name":"owner","type":"address"}],"name":"NameRegistered","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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"registrar","type":"address"}],"name":"SetBaseRegistrar","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"registry","type":"address"}],"name":"SetClaimRegistry","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"registry","type":"address"}],"name":"SetInvitationRegistry","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"validator","type":"address"}],"name":"SetMerkleValidator","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"registry","type":"address"}],"name":"SetRewardRegistry","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"validator","type":"address"}],"name":"SetValidator","type":"event"},{"anonymous":false,"inputs":[],"name":"Start","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"EARLYBIRD_PERIOD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"name_","type":"string"}],"name":"available","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"base","outputs":[{"internalType":"contract IKEY3FreeRegistrar","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimRegistry","outputs":[{"internalType":"contract IKEY3ClaimRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"resolver_","type":"address"}],"name":"claimRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user_","type":"address"}],"name":"claimsOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"commitment_","type":"bytes32"},{"internalType":"bytes32[]","name":"merkleProofs_","type":"bytes32[]"}],"name":"commit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"commitments","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"address","name":"owner_","type":"address"},{"internalType":"bytes32","name":"secret_","type":"bytes32"},{"internalType":"address","name":"resolver_","type":"address"},{"internalType":"address","name":"addr_","type":"address"}],"name":"generateCommitment","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"invitationRegistry","outputs":[{"internalType":"contract IKEY3InvitationRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"inviter_","type":"address"}],"name":"invitationsOf","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxCommitmentAge","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleValidator","outputs":[{"internalType":"contract IKEY3MerkleValidator","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minCommitmentAge","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"address","name":"resolver_","type":"address"},{"internalType":"address","name":"inviter_","type":"address"},{"internalType":"bytes32","name":"secret_","type":"bytes32"}],"name":"register","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardRegistry","outputs":[{"internalType":"contract IKEY3RewardRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"registrar_","type":"address"}],"name":"setBaseRegistrar","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"registry_","type":"address"}],"name":"setClaimRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"minCommitmentAge_","type":"uint256"},{"internalType":"uint256","name":"maxCommitmentAge_","type":"uint256"}],"name":"setCommitmentAges","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"registry_","type":"address"}],"name":"setInvitationRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"validator_","type":"address"}],"name":"setMerkleValidator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"registry_","type":"address"}],"name":"setRewardRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"validator_","type":"address"}],"name":"setValidator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"start","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startedTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name_","type":"string"}],"name":"validate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"validator","outputs":[{"internalType":"contract IKEY3Validator","name":"","type":"address"}],"stateMutability":"view","type":"function"}]Contract Creation Code
60806040523480156200001157600080fd5b506040516200464c3803806200464c8339818101604052810190620000379190620004ff565b60008060006101000a81548160ff02191690831515021790555062000071620000656200022060201b60201c565b6200022860201b60201c565b8181116200007e57600080fd5b87600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555086600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600781905550806008819055505050505050505050620005c8565b600033905090565b60008060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600060016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200031f82620002f2565b9050919050565b6000620003338262000312565b9050919050565b620003458162000326565b81146200035157600080fd5b50565b60008151905062000365816200033a565b92915050565b6000620003788262000312565b9050919050565b6200038a816200036b565b81146200039657600080fd5b50565b600081519050620003aa816200037f565b92915050565b6000620003bd8262000312565b9050919050565b620003cf81620003b0565b8114620003db57600080fd5b50565b600081519050620003ef81620003c4565b92915050565b6000620004028262000312565b9050919050565b6200041481620003f5565b81146200042057600080fd5b50565b600081519050620004348162000409565b92915050565b6000620004478262000312565b9050919050565b62000459816200043a565b81146200046557600080fd5b50565b60008151905062000479816200044e565b92915050565b60006200048c8262000312565b9050919050565b6200049e816200047f565b8114620004aa57600080fd5b50565b600081519050620004be8162000493565b92915050565b6000819050919050565b620004d981620004c4565b8114620004e557600080fd5b50565b600081519050620004f981620004ce565b92915050565b600080600080600080600080610100898b031215620005235762000522620002ed565b5b6000620005338b828c0162000354565b9850506020620005468b828c0162000399565b9750506040620005598b828c01620003de565b96505060606200056c8b828c0162000423565b95505060806200057f8b828c0162000468565b94505060a0620005928b828c01620004ad565b93505060c0620005a58b828c01620004e8565b92505060e0620005b88b828c01620004e8565b9150509295985092959890939650565b61407480620005d86000396000f3fe608060405234801561001057600080fd5b50600436106102065760003560e01c80638456cb591161011a578063be610676116100ad578063ce1e09c01161007c578063ce1e09c014610569578063cebc6ad514610587578063d182b83b146105a5578063ef5cfb8c146105d5578063f2fde38b146105f157610206565b8063be610676146104f5578063be9a655514610513578063c98a2b6f1461051d578063cc7f29c11461053957610206565b8063a7af6638116100e9578063a7af66381461046d578063a878e1561461048b578063aeb8ce9b146104a9578063b09ce6b7146104d957610206565b80638456cb591461040957806389f804b6146104135780638d839ffe146104315780638da5cb5b1461044f57610206565b80635001f3b51161019d5780636a8be89e1161016c5780636a8be89e1461037b578063715018a614610397578063787c7cf2146103a15780637e324479146103bd578063839df945146103d957610206565b80635001f3b514610307578063589e7671146103255780635b1fad33146103415780635c975abb1461035d57610206565b80632c565913116101d95780632c56591314610291578063394865d8146102af5780633a5381b5146102df5780633f4ba83a146102fd57610206565b806301d81d921461020b5780630e623f431461023b5780631327d3d8146102595780631ea2413314610275575b600080fd5b610225600480360381019061022091906129fa565b61060d565b6040516102329190612a40565b60405180910390f35b6102436106b2565b6040516102509190612a40565b60405180910390f35b610273600480360381019061026e91906129fa565b6106b7565b005b61028f600480360381019061028a91906129fa565b61074e565b005b6102996107e5565b6040516102a69190612aba565b60405180910390f35b6102c960048036038101906102c491906129fa565b61080b565b6040516102d69190612b93565b60405180910390f35b6102e761081d565b6040516102f49190612bd6565b60405180910390f35b610305610843565b005b61030f610855565b60405161031c9190612c12565b60405180910390f35b61033f600480360381019061033a91906129fa565b61087b565b005b61035b600480360381019061035691906129fa565b610912565b005b610365610ae9565b6040516103729190612c48565b60405180910390f35b610395600480360381019061039091906129fa565b610aff565b005b61039f610b96565b005b6103bb60048036038101906103b69190612ddf565b610baa565b005b6103d760048036038101906103d29190612e8e565b610d13565b005b6103f360048036038101906103ee9190612ece565b610d39565b6040516104009190612a40565b60405180910390f35b610411610d51565b005b61041b610d63565b6040516104289190612f1c565b60405180910390f35b610439610d89565b6040516104469190612a40565b60405180910390f35b610457610d8f565b6040516104649190612f46565b60405180910390f35b610475610db8565b6040516104829190612f82565b60405180910390f35b610493610dde565b6040516104a09190612fbe565b60405180910390f35b6104c360048036038101906104be9190612fd9565b610e04565b6040516104d09190612c48565b60405180910390f35b6104f360048036038101906104ee91906130ea565b610e16565b005b6104fd611104565b60405161050a9190612a40565b60405180910390f35b61051b61119c565b005b610537600480360381019061053291906129fa565b6113af565b005b610553600480360381019061054e9190613146565b611586565b60405161056091906131ec565b60405180910390f35b6105716115a0565b60405161057e9190612a40565b60405180910390f35b61058f6115a6565b60405161059c9190612a40565b60405180910390f35b6105bf60048036038101906105ba9190612fd9565b6115ac565b6040516105cc9190612c48565b60405180910390f35b6105ef60048036038101906105ea91906129fa565b6115be565b005b61060b600480360381019061060691906129fa565b611867565b005b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166301d81d92836040518263ffffffff1660e01b815260040161066a9190612f46565b602060405180830381865afa158015610687573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106ab919061321c565b9050919050565b600081565b6106bf6118ea565b6106c7611968565b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167f21d3d3ada22c7ffb7b7427148ebc4beb24ec7311a63bac56cad88bd84d385cf660405160405180910390a250565b6107566118ea565b61075e611968565b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167f412a714e6489eabf52cb97289e052ef9468949bf91ff69a1f977818f9135e84760405160405180910390a250565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060610816826119b1565b9050919050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61084b6118ea565b610853611a5b565b565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6108836118ea565b61088b611968565b80600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167f01b4dffed1b9e102e326e4fc9e11aee3ef6e6625ad6cc593a3888ad2e477e6ee60405160405180910390a250565b61091a6118ea565b610922611968565b8073ffffffffffffffffffffffffffffffffffffffff1663ddf7fcb06040518163ffffffff1660e01b8152600401602060405180830381865afa15801561096d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610991919061325e565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ddf7fcb06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109fe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a22919061325e565b14610a62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a59906132e8565b60405180910390fd5b80600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167fc3e625fa7d60a9642301c516193bd733a6aa0fd312120fc78b9136b03df5e10960405160405180910390a250565b60008060009054906101000a900460ff16905090565b610b076118ea565b610b0f611968565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167febb0bd756139c615ad1b003de5725e650bb2e5536431f446452bfcf91c04f5cc60405160405180910390a250565b610b9e6118ea565b610ba86000611abd565b565b6000600a5411610bef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be690613354565b60405180910390fd5b6000610bfe8533848733611b82565b9050426007546009600084815260200190815260200160002054610c2291906133a3565b1115610c2d57600080fd5b426008546009600084815260200190815260200160002054610c4f91906133a3565b11610c5957600080fd5b610c668585336000611ce2565b6009600082815260200190815260200160002060009055600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663aa67735433856040518363ffffffff1660e01b8152600401610cda9291906133d7565b600060405180830381600087803b158015610cf457600080fd5b505af1158015610d08573d6000803e3d6000fd5b505050505050505050565b610d1b6118ea565b818111610d2757600080fd5b81600781905550806008819055505050565b60096020528060005260406000206000915090505481565b610d596118ea565b610d6161241f565b565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60075481565b60008060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000610e0f82612481565b9050919050565b6000600a5411610e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5290613354565b60405180910390fd5b6000600a54610e6a91906133a3565b4211158015610ec85750600073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b15610fab57600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a3b0f19b33836040518363ffffffff1660e01b8152600401610f2a9291906134be565b602060405180830381865afa158015610f47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f6b919061351a565b610faa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa190613593565b60405180910390fd5b5b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663402914f5336040518263ffffffff1660e01b81526004016110069190612f46565b602060405180830381865afa158015611023573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611047919061351a565b611086576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107d906135ff565b60405180910390fd5b4260085460096000858152602001908152602001600020546110a891906133a3565b106110e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110df9061366b565b60405180910390fd5b4260096000848152602001908152602001600020819055505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663be6106766040518163ffffffff1660e01b8152600401602060405180830381865afa158015611173573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611197919061321c565b905090565b6111a46118ea565b6000600a54146111b357600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361120e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361126957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036112c457600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361131f57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361137a57600080fd5b42600a819055507f1b55ba3aa851a46be3b365aee5b5c140edd620d578922f3e8466d2cbd96f954b60405160405180910390a1565b6113b76118ea565b6113bf611968565b8073ffffffffffffffffffffffffffffffffffffffff1663ddf7fcb06040518163ffffffff1660e01b8152600401602060405180830381865afa15801561140a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061142e919061325e565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ddf7fcb06040518163ffffffff1660e01b8152600401602060405180830381865afa15801561149b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114bf919061325e565b146114ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f6906132e8565b60405180910390fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167f24b737ada31f5257b100113988070275845d6c9bebb12eea424881f0622bec2460405160405180910390a250565b60006115958686868686611b82565b905095945050505050565b60085481565b600a5481565b60006115b782612668565b9050919050565b6000600a5411611603576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fa90613354565b60405180910390fd5b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ddf7fcb06040518163ffffffff1660e01b8152600401602060405180830381865afa158015611670573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611694919061325e565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ddf7fcb06040518163ffffffff1660e01b8152600401602060405180830381865afa158015611701573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611725919061325e565b14611765576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175c906136d7565b60405180910390fd5b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631e83409a336040518263ffffffff1660e01b81526004016117c29190612f46565b6000604051808303816000875af11580156117e1573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061180a9190613872565b9050600081510361181b5750611864565b60005b81518110156118615761184e82828151811061183d5761183c6138bb565b5b602002602001015184336001611ce2565b8080611859906138ea565b91505061181e565b50505b50565b61186f6118ea565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036118de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d5906139a4565b60405180910390fd5b6118e781611abd565b50565b6118f2612774565b73ffffffffffffffffffffffffffffffffffffffff16611910610d8f565b73ffffffffffffffffffffffffffffffffffffffff1614611966576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195d90613a10565b60405180910390fd5b565b611970610ae9565b6119af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a690613a7c565b60405180910390fd5b565b6060600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663394865d8836040518263ffffffff1660e01b8152600401611a0e9190612f46565b600060405180830381865afa158015611a2b573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611a549190613b74565b9050919050565b611a63611968565b60008060006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611aa6612774565b604051611ab39190612f46565b60405180910390a1565b60008060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600060016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080611b8e8761277c565b805190602001209050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148015611bff5750600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b15611c3757808686604051602001611c1993929190613c26565b60405160208183030381529060405280519060200120915050611cd9565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611ca6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9d90613caf565b60405180910390fd5b8086858588604051602001611cbf959493929190613ccf565b604051602081830303815290604052805190602001209150505b95945050505050565b611cea61293e565b6000611cf58561277c565b9050611d0081612481565b611d3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3690613d7a565b60405180910390fd5b60008180519060200120905060008160001c9050600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161461210957600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dbbdf08382306040518363ffffffff1660e01b8152600401611de4929190613d9a565b600060405180830381600087803b158015611dfe57600080fd5b505af1158015611e12573d6000803e3d6000fd5b505050506000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ddf7fcb06040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ea9919061325e565b83604051602001611ebb929190613dc3565b604051602081830303815290604052805190602001209050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663513ddfc06040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f649190613e2d565b73ffffffffffffffffffffffffffffffffffffffff16631896f70a82896040518363ffffffff1660e01b8152600401611f9e929190613e5a565b600060405180830381600087803b158015611fb857600080fd5b505af1158015611fcc573d6000803e3d6000fd5b50505050600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614612072578673ffffffffffffffffffffffffffffffffffffffff1663d5fa2b0082886040518363ffffffff1660e01b815260040161203f929190613e5a565b600060405180830381600087803b15801561205957600080fd5b505af115801561206d573d6000803e3d6000fd5b505050505b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3033856040518463ffffffff1660e01b81526004016120d193929190613e83565b600060405180830381600087803b1580156120eb57600080fd5b505af11580156120ff573d6000803e3d6000fd5b50505050506121d2565b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161461214257600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dbbdf08382336040518363ffffffff1660e01b815260040161219f929190613d9a565b600060405180830381600087803b1580156121b957600080fd5b505af11580156121cd573d6000803e3d6000fd5b505050505b836123c757600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ddf7fcb06040518163ffffffff1660e01b8152600401602060405180830381865afa158015612244573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612268919061325e565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ddf7fcb06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156122d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122f9919061325e565b14612339576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612330906136d7565b60405180910390fd5b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631e83409a336040518263ffffffff1660e01b81526004016123949190612f46565b600060405180830381600087803b1580156123ae57600080fd5b505af11580156123c2573d6000803e3d6000fd5b505050505b3373ffffffffffffffffffffffffffffffffffffffff16827f949d23b49bd03f2681389f579003c80eeb63fea84d0c36204dab1be0937852168560405161240e9190613efe565b60405180910390a350505050505050565b61242761293e565b60016000806101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861246a612774565b6040516124779190612f46565b60405180910390a1565b60008061248d8361277c565b9050600081805190602001209050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166396e494e88260001c6040518263ffffffff1660e01b81526004016124f99190612a40565b602060405180830381865afa158015612516573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061253a919061351a565b61254957600092505050612663565b600073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612655576000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663775a4cb033856040518363ffffffff1660e01b81526004016125fe929190613f20565b6040805180830381865afa15801561261a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061263e9190613f50565b50905080156126535760019350505050612663565b505b61265e82612668565b925050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036126c8576001905061276f565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d182b83b61270f8461277c565b6040518263ffffffff1660e01b815260040161272b9190613efe565b602060405180830381865afa158015612748573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061276c919061351a565b90505b919050565b600033905090565b606060008290506000815167ffffffffffffffff8111156127a05761279f612c7e565b5b6040519080825280601f01601f1916602001820160405280156127d25781602001600182028036833780820191505090505b50905060005b82518110156129335760008382815181106127f6576127f56138bb565b5b602001015160f81c60f81b9050604160f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161015801561285f5750605a60f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191611155b156128be5760208160f81c6128749190613f9d565b60f81b83838151811061288a576128896138bb565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061291f565b8382815181106128d1576128d06138bb565b5b602001015160f81c60f81b8383815181106128ef576128ee6138bb565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b50808061292b906138ea565b9150506127d8565b508092505050919050565b612946610ae9565b15612986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161297d9061401e565b60405180910390fd5b565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006129c78261299c565b9050919050565b6129d7816129bc565b81146129e257600080fd5b50565b6000813590506129f4816129ce565b92915050565b600060208284031215612a1057612a0f612992565b5b6000612a1e848285016129e5565b91505092915050565b6000819050919050565b612a3a81612a27565b82525050565b6000602082019050612a556000830184612a31565b92915050565b6000819050919050565b6000612a80612a7b612a768461299c565b612a5b565b61299c565b9050919050565b6000612a9282612a65565b9050919050565b6000612aa482612a87565b9050919050565b612ab481612a99565b82525050565b6000602082019050612acf6000830184612aab565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612b0a816129bc565b82525050565b6000612b1c8383612b01565b60208301905092915050565b6000602082019050919050565b6000612b4082612ad5565b612b4a8185612ae0565b9350612b5583612af1565b8060005b83811015612b86578151612b6d8882612b10565b9750612b7883612b28565b925050600181019050612b59565b5085935050505092915050565b60006020820190508181036000830152612bad8184612b35565b905092915050565b6000612bc082612a87565b9050919050565b612bd081612bb5565b82525050565b6000602082019050612beb6000830184612bc7565b92915050565b6000612bfc82612a87565b9050919050565b612c0c81612bf1565b82525050565b6000602082019050612c276000830184612c03565b92915050565b60008115159050919050565b612c4281612c2d565b82525050565b6000602082019050612c5d6000830184612c39565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612cb682612c6d565b810181811067ffffffffffffffff82111715612cd557612cd4612c7e565b5b80604052505050565b6000612ce8612988565b9050612cf48282612cad565b919050565b600067ffffffffffffffff821115612d1457612d13612c7e565b5b612d1d82612c6d565b9050602081019050919050565b82818337600083830152505050565b6000612d4c612d4784612cf9565b612cde565b905082815260208101848484011115612d6857612d67612c68565b5b612d73848285612d2a565b509392505050565b600082601f830112612d9057612d8f612c63565b5b8135612da0848260208601612d39565b91505092915050565b6000819050919050565b612dbc81612da9565b8114612dc757600080fd5b50565b600081359050612dd981612db3565b92915050565b60008060008060808587031215612df957612df8612992565b5b600085013567ffffffffffffffff811115612e1757612e16612997565b5b612e2387828801612d7b565b9450506020612e34878288016129e5565b9350506040612e45878288016129e5565b9250506060612e5687828801612dca565b91505092959194509250565b612e6b81612a27565b8114612e7657600080fd5b50565b600081359050612e8881612e62565b92915050565b60008060408385031215612ea557612ea4612992565b5b6000612eb385828601612e79565b9250506020612ec485828601612e79565b9150509250929050565b600060208284031215612ee457612ee3612992565b5b6000612ef284828501612dca565b91505092915050565b6000612f0682612a87565b9050919050565b612f1681612efb565b82525050565b6000602082019050612f316000830184612f0d565b92915050565b612f40816129bc565b82525050565b6000602082019050612f5b6000830184612f37565b92915050565b6000612f6c82612a87565b9050919050565b612f7c81612f61565b82525050565b6000602082019050612f976000830184612f73565b92915050565b6000612fa882612a87565b9050919050565b612fb881612f9d565b82525050565b6000602082019050612fd36000830184612faf565b92915050565b600060208284031215612fef57612fee612992565b5b600082013567ffffffffffffffff81111561300d5761300c612997565b5b61301984828501612d7b565b91505092915050565b600067ffffffffffffffff82111561303d5761303c612c7e565b5b602082029050602081019050919050565b600080fd5b600061306661306184613022565b612cde565b905080838252602082019050602084028301858111156130895761308861304e565b5b835b818110156130b2578061309e8882612dca565b84526020840193505060208101905061308b565b5050509392505050565b600082601f8301126130d1576130d0612c63565b5b81356130e1848260208601613053565b91505092915050565b6000806040838503121561310157613100612992565b5b600061310f85828601612dca565b925050602083013567ffffffffffffffff8111156131305761312f612997565b5b61313c858286016130bc565b9150509250929050565b600080600080600060a0868803121561316257613161612992565b5b600086013567ffffffffffffffff8111156131805761317f612997565b5b61318c88828901612d7b565b955050602061319d888289016129e5565b94505060406131ae88828901612dca565b93505060606131bf888289016129e5565b92505060806131d0888289016129e5565b9150509295509295909350565b6131e681612da9565b82525050565b600060208201905061320160008301846131dd565b92915050565b60008151905061321681612e62565b92915050565b60006020828403121561323257613231612992565b5b600061324084828501613207565b91505092915050565b60008151905061325881612db3565b92915050565b60006020828403121561327457613273612992565b5b600061328284828501613249565b91505092915050565b600082825260208201905092915050565b7f696e76616c69642062617365206e6f6465000000000000000000000000000000600082015250565b60006132d260118361328b565b91506132dd8261329c565b602082019050919050565b60006020820190508181036000830152613301816132c5565b9050919050565b7f6e6f742073746172746564207965740000000000000000000000000000000000600082015250565b600061333e600f8361328b565b915061334982613308565b602082019050919050565b6000602082019050818103600083015261336d81613331565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006133ae82612a27565b91506133b983612a27565b92508282019050808211156133d1576133d0613374565b5b92915050565b60006040820190506133ec6000830185612f37565b6133f96020830184612f37565b9392505050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61343581612da9565b82525050565b6000613447838361342c565b60208301905092915050565b6000602082019050919050565b600061346b82613400565b613475818561340b565b93506134808361341c565b8060005b838110156134b1578151613498888261343b565b97506134a383613453565b925050600181019050613484565b5085935050505092915050565b60006040820190506134d36000830185612f37565b81810360208301526134e58184613460565b90509392505050565b6134f781612c2d565b811461350257600080fd5b50565b600081519050613514816134ee565b92915050565b6000602082840312156135305761352f612992565b5b600061353e84828501613505565b91505092915050565b7f6e6f74206f6e20616c6c6f776c69737400000000000000000000000000000000600082015250565b600061357d60108361328b565b915061358882613547565b602082019050919050565b600060208201905081810360008301526135ac81613570565b9050919050565b7f72656163686564206d6178696d756d206c696d69740000000000000000000000600082015250565b60006135e960158361328b565b91506135f4826135b3565b602082019050919050565b60006020820190508181036000830152613618816135dc565b9050919050565b7f636f6d6d69746d656e7420657869737473000000000000000000000000000000600082015250565b600061365560118361328b565b91506136608261361f565b602082019050919050565b6000602082019050818103600083015261368481613648565b9050919050565b7f696e76616c696420636c61696d00000000000000000000000000000000000000600082015250565b60006136c1600d8361328b565b91506136cc8261368b565b602082019050919050565b600060208201905081810360008301526136f0816136b4565b9050919050565b600067ffffffffffffffff82111561371257613711612c7e565b5b602082029050602081019050919050565b60005b83811015613741578082015181840152602081019050613726565b60008484015250505050565b600061376061375b84612cf9565b612cde565b90508281526020810184848401111561377c5761377b612c68565b5b613787848285613723565b509392505050565b600082601f8301126137a4576137a3612c63565b5b81516137b484826020860161374d565b91505092915050565b60006137d06137cb846136f7565b612cde565b905080838252602082019050602084028301858111156137f3576137f261304e565b5b835b8181101561383a57805167ffffffffffffffff81111561381857613817612c63565b5b808601613825898261378f565b855260208501945050506020810190506137f5565b5050509392505050565b600082601f83011261385957613858612c63565b5b81516138698482602086016137bd565b91505092915050565b60006020828403121561388857613887612992565b5b600082015167ffffffffffffffff8111156138a6576138a5612997565b5b6138b284828501613844565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006138f582612a27565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361392757613926613374565b5b600182019050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061398e60268361328b565b915061399982613932565b604082019050919050565b600060208201905081810360008301526139bd81613981565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006139fa60208361328b565b9150613a05826139c4565b602082019050919050565b60006020820190508181036000830152613a29816139ed565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000613a6660148361328b565b9150613a7182613a30565b602082019050919050565b60006020820190508181036000830152613a9581613a59565b9050919050565b600067ffffffffffffffff821115613ab757613ab6612c7e565b5b602082029050602081019050919050565b600081519050613ad7816129ce565b92915050565b6000613af0613aeb84613a9c565b612cde565b90508083825260208201905060208402830185811115613b1357613b1261304e565b5b835b81811015613b3c5780613b288882613ac8565b845260208401935050602081019050613b15565b5050509392505050565b600082601f830112613b5b57613b5a612c63565b5b8151613b6b848260208601613add565b91505092915050565b600060208284031215613b8a57613b89612992565b5b600082015167ffffffffffffffff811115613ba857613ba7612997565b5b613bb484828501613b46565b91505092915050565b6000819050919050565b613bd8613bd382612da9565b613bbd565b82525050565b60008160601b9050919050565b6000613bf682613bde565b9050919050565b6000613c0882613beb565b9050919050565b613c20613c1b826129bc565b613bfd565b82525050565b6000613c328286613bc7565b602082019150613c428285613c0f565b601482019150613c528284613bc7565b602082019150819050949350505050565b7f7265736f6c7665725f20213d2030783020726571756972656400000000000000600082015250565b6000613c9960198361328b565b9150613ca482613c63565b602082019050919050565b60006020820190508181036000830152613cc881613c8c565b9050919050565b6000613cdb8288613bc7565b602082019150613ceb8287613c0f565b601482019150613cfb8286613c0f565b601482019150613d0b8285613c0f565b601482019150613d1b8284613bc7565b6020820191508190509695505050505050565b7f7468697320646964206973206e6f7420617661696c61626c6500000000000000600082015250565b6000613d6460198361328b565b9150613d6f82613d2e565b602082019050919050565b60006020820190508181036000830152613d9381613d57565b9050919050565b6000604082019050613daf6000830185612a31565b613dbc6020830184612f37565b9392505050565b6000613dcf8285613bc7565b602082019150613ddf8284613bc7565b6020820191508190509392505050565b6000613dfa826129bc565b9050919050565b613e0a81613def565b8114613e1557600080fd5b50565b600081519050613e2781613e01565b92915050565b600060208284031215613e4357613e42612992565b5b6000613e5184828501613e18565b91505092915050565b6000604082019050613e6f60008301856131dd565b613e7c6020830184612f37565b9392505050565b6000606082019050613e986000830186612f37565b613ea56020830185612f37565b613eb26040830184612a31565b949350505050565b600081519050919050565b6000613ed082613eba565b613eda818561328b565b9350613eea818560208601613723565b613ef381612c6d565b840191505092915050565b60006020820190508181036000830152613f188184613ec5565b905092915050565b6000604082019050613f356000830185612f37565b8181036020830152613f478184613ec5565b90509392505050565b60008060408385031215613f6757613f66612992565b5b6000613f7585828601613505565b9250506020613f8685828601613207565b9150509250929050565b600060ff82169050919050565b6000613fa882613f90565b9150613fb383613f90565b9250828201905060ff811115613fcc57613fcb613374565b5b92915050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b600061400860108361328b565b915061401382613fd2565b602082019050919050565b6000602082019050818103600083015261403781613ffb565b905091905056fea2646970667358221220f129cddcaa550160f6a466c3d0321def1de0866546b5404b61553fa57a18412564736f6c63430008110033000000000000000000000000fc0d0430cc11effb068007306d6efd9b2ac7a460000000000000000000000000b07c4eef48b49aaf2199f59e8b1afbfefe2f26e800000000000000000000000087a61acb41776678e42231431e196e628eea7e4e000000000000000000000000f53248157e844885cf9f47e25c5af0a74f7d52b90000000000000000000000005ef31d5cd95dcd29f545275415c2caa13bc68362000000000000000000000000d8d2a8aa0b27e3d34a46a6cbd2ee7d81da441c84000000000000000000000000000000000000000000000000000000000000003c0000000000000000000000000000000000000000000000000000000000093a80
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102065760003560e01c80638456cb591161011a578063be610676116100ad578063ce1e09c01161007c578063ce1e09c014610569578063cebc6ad514610587578063d182b83b146105a5578063ef5cfb8c146105d5578063f2fde38b146105f157610206565b8063be610676146104f5578063be9a655514610513578063c98a2b6f1461051d578063cc7f29c11461053957610206565b8063a7af6638116100e9578063a7af66381461046d578063a878e1561461048b578063aeb8ce9b146104a9578063b09ce6b7146104d957610206565b80638456cb591461040957806389f804b6146104135780638d839ffe146104315780638da5cb5b1461044f57610206565b80635001f3b51161019d5780636a8be89e1161016c5780636a8be89e1461037b578063715018a614610397578063787c7cf2146103a15780637e324479146103bd578063839df945146103d957610206565b80635001f3b514610307578063589e7671146103255780635b1fad33146103415780635c975abb1461035d57610206565b80632c565913116101d95780632c56591314610291578063394865d8146102af5780633a5381b5146102df5780633f4ba83a146102fd57610206565b806301d81d921461020b5780630e623f431461023b5780631327d3d8146102595780631ea2413314610275575b600080fd5b610225600480360381019061022091906129fa565b61060d565b6040516102329190612a40565b60405180910390f35b6102436106b2565b6040516102509190612a40565b60405180910390f35b610273600480360381019061026e91906129fa565b6106b7565b005b61028f600480360381019061028a91906129fa565b61074e565b005b6102996107e5565b6040516102a69190612aba565b60405180910390f35b6102c960048036038101906102c491906129fa565b61080b565b6040516102d69190612b93565b60405180910390f35b6102e761081d565b6040516102f49190612bd6565b60405180910390f35b610305610843565b005b61030f610855565b60405161031c9190612c12565b60405180910390f35b61033f600480360381019061033a91906129fa565b61087b565b005b61035b600480360381019061035691906129fa565b610912565b005b610365610ae9565b6040516103729190612c48565b60405180910390f35b610395600480360381019061039091906129fa565b610aff565b005b61039f610b96565b005b6103bb60048036038101906103b69190612ddf565b610baa565b005b6103d760048036038101906103d29190612e8e565b610d13565b005b6103f360048036038101906103ee9190612ece565b610d39565b6040516104009190612a40565b60405180910390f35b610411610d51565b005b61041b610d63565b6040516104289190612f1c565b60405180910390f35b610439610d89565b6040516104469190612a40565b60405180910390f35b610457610d8f565b6040516104649190612f46565b60405180910390f35b610475610db8565b6040516104829190612f82565b60405180910390f35b610493610dde565b6040516104a09190612fbe565b60405180910390f35b6104c360048036038101906104be9190612fd9565b610e04565b6040516104d09190612c48565b60405180910390f35b6104f360048036038101906104ee91906130ea565b610e16565b005b6104fd611104565b60405161050a9190612a40565b60405180910390f35b61051b61119c565b005b610537600480360381019061053291906129fa565b6113af565b005b610553600480360381019061054e9190613146565b611586565b60405161056091906131ec565b60405180910390f35b6105716115a0565b60405161057e9190612a40565b60405180910390f35b61058f6115a6565b60405161059c9190612a40565b60405180910390f35b6105bf60048036038101906105ba9190612fd9565b6115ac565b6040516105cc9190612c48565b60405180910390f35b6105ef60048036038101906105ea91906129fa565b6115be565b005b61060b600480360381019061060691906129fa565b611867565b005b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166301d81d92836040518263ffffffff1660e01b815260040161066a9190612f46565b602060405180830381865afa158015610687573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106ab919061321c565b9050919050565b600081565b6106bf6118ea565b6106c7611968565b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167f21d3d3ada22c7ffb7b7427148ebc4beb24ec7311a63bac56cad88bd84d385cf660405160405180910390a250565b6107566118ea565b61075e611968565b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167f412a714e6489eabf52cb97289e052ef9468949bf91ff69a1f977818f9135e84760405160405180910390a250565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060610816826119b1565b9050919050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61084b6118ea565b610853611a5b565b565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6108836118ea565b61088b611968565b80600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167f01b4dffed1b9e102e326e4fc9e11aee3ef6e6625ad6cc593a3888ad2e477e6ee60405160405180910390a250565b61091a6118ea565b610922611968565b8073ffffffffffffffffffffffffffffffffffffffff1663ddf7fcb06040518163ffffffff1660e01b8152600401602060405180830381865afa15801561096d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610991919061325e565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ddf7fcb06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109fe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a22919061325e565b14610a62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a59906132e8565b60405180910390fd5b80600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167fc3e625fa7d60a9642301c516193bd733a6aa0fd312120fc78b9136b03df5e10960405160405180910390a250565b60008060009054906101000a900460ff16905090565b610b076118ea565b610b0f611968565b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167febb0bd756139c615ad1b003de5725e650bb2e5536431f446452bfcf91c04f5cc60405160405180910390a250565b610b9e6118ea565b610ba86000611abd565b565b6000600a5411610bef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be690613354565b60405180910390fd5b6000610bfe8533848733611b82565b9050426007546009600084815260200190815260200160002054610c2291906133a3565b1115610c2d57600080fd5b426008546009600084815260200190815260200160002054610c4f91906133a3565b11610c5957600080fd5b610c668585336000611ce2565b6009600082815260200190815260200160002060009055600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663aa67735433856040518363ffffffff1660e01b8152600401610cda9291906133d7565b600060405180830381600087803b158015610cf457600080fd5b505af1158015610d08573d6000803e3d6000fd5b505050505050505050565b610d1b6118ea565b818111610d2757600080fd5b81600781905550806008819055505050565b60096020528060005260406000206000915090505481565b610d596118ea565b610d6161241f565b565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60075481565b60008060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000610e0f82612481565b9050919050565b6000600a5411610e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5290613354565b60405180910390fd5b6000600a54610e6a91906133a3565b4211158015610ec85750600073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b15610fab57600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a3b0f19b33836040518363ffffffff1660e01b8152600401610f2a9291906134be565b602060405180830381865afa158015610f47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f6b919061351a565b610faa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa190613593565b60405180910390fd5b5b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663402914f5336040518263ffffffff1660e01b81526004016110069190612f46565b602060405180830381865afa158015611023573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611047919061351a565b611086576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107d906135ff565b60405180910390fd5b4260085460096000858152602001908152602001600020546110a891906133a3565b106110e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110df9061366b565b60405180910390fd5b4260096000848152602001908152602001600020819055505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663be6106766040518163ffffffff1660e01b8152600401602060405180830381865afa158015611173573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611197919061321c565b905090565b6111a46118ea565b6000600a54146111b357600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361120e57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361126957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036112c457600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361131f57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361137a57600080fd5b42600a819055507f1b55ba3aa851a46be3b365aee5b5c140edd620d578922f3e8466d2cbd96f954b60405160405180910390a1565b6113b76118ea565b6113bf611968565b8073ffffffffffffffffffffffffffffffffffffffff1663ddf7fcb06040518163ffffffff1660e01b8152600401602060405180830381865afa15801561140a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061142e919061325e565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ddf7fcb06040518163ffffffff1660e01b8152600401602060405180830381865afa15801561149b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114bf919061325e565b146114ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f6906132e8565b60405180910390fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167f24b737ada31f5257b100113988070275845d6c9bebb12eea424881f0622bec2460405160405180910390a250565b60006115958686868686611b82565b905095945050505050565b60085481565b600a5481565b60006115b782612668565b9050919050565b6000600a5411611603576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fa90613354565b60405180910390fd5b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ddf7fcb06040518163ffffffff1660e01b8152600401602060405180830381865afa158015611670573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611694919061325e565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ddf7fcb06040518163ffffffff1660e01b8152600401602060405180830381865afa158015611701573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611725919061325e565b14611765576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175c906136d7565b60405180910390fd5b6000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631e83409a336040518263ffffffff1660e01b81526004016117c29190612f46565b6000604051808303816000875af11580156117e1573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525081019061180a9190613872565b9050600081510361181b5750611864565b60005b81518110156118615761184e82828151811061183d5761183c6138bb565b5b602002602001015184336001611ce2565b8080611859906138ea565b91505061181e565b50505b50565b61186f6118ea565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036118de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d5906139a4565b60405180910390fd5b6118e781611abd565b50565b6118f2612774565b73ffffffffffffffffffffffffffffffffffffffff16611910610d8f565b73ffffffffffffffffffffffffffffffffffffffff1614611966576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161195d90613a10565b60405180910390fd5b565b611970610ae9565b6119af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a690613a7c565b60405180910390fd5b565b6060600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663394865d8836040518263ffffffff1660e01b8152600401611a0e9190612f46565b600060405180830381865afa158015611a2b573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250810190611a549190613b74565b9050919050565b611a63611968565b60008060006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611aa6612774565b604051611ab39190612f46565b60405180910390a1565b60008060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600060016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080611b8e8761277c565b805190602001209050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148015611bff5750600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b15611c3757808686604051602001611c1993929190613c26565b60405160208183030381529060405280519060200120915050611cd9565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611ca6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9d90613caf565b60405180910390fd5b8086858588604051602001611cbf959493929190613ccf565b604051602081830303815290604052805190602001209150505b95945050505050565b611cea61293e565b6000611cf58561277c565b9050611d0081612481565b611d3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3690613d7a565b60405180910390fd5b60008180519060200120905060008160001c9050600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff161461210957600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dbbdf08382306040518363ffffffff1660e01b8152600401611de4929190613d9a565b600060405180830381600087803b158015611dfe57600080fd5b505af1158015611e12573d6000803e3d6000fd5b505050506000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ddf7fcb06040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ea9919061325e565b83604051602001611ebb929190613dc3565b604051602081830303815290604052805190602001209050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663513ddfc06040518163ffffffff1660e01b8152600401602060405180830381865afa158015611f40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f649190613e2d565b73ffffffffffffffffffffffffffffffffffffffff16631896f70a82896040518363ffffffff1660e01b8152600401611f9e929190613e5a565b600060405180830381600087803b158015611fb857600080fd5b505af1158015611fcc573d6000803e3d6000fd5b50505050600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614612072578673ffffffffffffffffffffffffffffffffffffffff1663d5fa2b0082886040518363ffffffff1660e01b815260040161203f929190613e5a565b600060405180830381600087803b15801561205957600080fd5b505af115801561206d573d6000803e3d6000fd5b505050505b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3033856040518463ffffffff1660e01b81526004016120d193929190613e83565b600060405180830381600087803b1580156120eb57600080fd5b505af11580156120ff573d6000803e3d6000fd5b50505050506121d2565b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161461214257600080fd5b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dbbdf08382336040518363ffffffff1660e01b815260040161219f929190613d9a565b600060405180830381600087803b1580156121b957600080fd5b505af11580156121cd573d6000803e3d6000fd5b505050505b836123c757600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ddf7fcb06040518163ffffffff1660e01b8152600401602060405180830381865afa158015612244573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612268919061325e565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ddf7fcb06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156122d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122f9919061325e565b14612339576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612330906136d7565b60405180910390fd5b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631e83409a336040518263ffffffff1660e01b81526004016123949190612f46565b600060405180830381600087803b1580156123ae57600080fd5b505af11580156123c2573d6000803e3d6000fd5b505050505b3373ffffffffffffffffffffffffffffffffffffffff16827f949d23b49bd03f2681389f579003c80eeb63fea84d0c36204dab1be0937852168560405161240e9190613efe565b60405180910390a350505050505050565b61242761293e565b60016000806101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861246a612774565b6040516124779190612f46565b60405180910390a1565b60008061248d8361277c565b9050600081805190602001209050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166396e494e88260001c6040518263ffffffff1660e01b81526004016124f99190612a40565b602060405180830381865afa158015612516573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061253a919061351a565b61254957600092505050612663565b600073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612655576000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663775a4cb033856040518363ffffffff1660e01b81526004016125fe929190613f20565b6040805180830381865afa15801561261a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061263e9190613f50565b50905080156126535760019350505050612663565b505b61265e82612668565b925050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036126c8576001905061276f565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d182b83b61270f8461277c565b6040518263ffffffff1660e01b815260040161272b9190613efe565b602060405180830381865afa158015612748573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061276c919061351a565b90505b919050565b600033905090565b606060008290506000815167ffffffffffffffff8111156127a05761279f612c7e565b5b6040519080825280601f01601f1916602001820160405280156127d25781602001600182028036833780820191505090505b50905060005b82518110156129335760008382815181106127f6576127f56138bb565b5b602001015160f81c60f81b9050604160f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161015801561285f5750605a60f81b817effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191611155b156128be5760208160f81c6128749190613f9d565b60f81b83838151811061288a576128896138bb565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061291f565b8382815181106128d1576128d06138bb565b5b602001015160f81c60f81b8383815181106128ef576128ee6138bb565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505b50808061292b906138ea565b9150506127d8565b508092505050919050565b612946610ae9565b15612986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161297d9061401e565b60405180910390fd5b565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006129c78261299c565b9050919050565b6129d7816129bc565b81146129e257600080fd5b50565b6000813590506129f4816129ce565b92915050565b600060208284031215612a1057612a0f612992565b5b6000612a1e848285016129e5565b91505092915050565b6000819050919050565b612a3a81612a27565b82525050565b6000602082019050612a556000830184612a31565b92915050565b6000819050919050565b6000612a80612a7b612a768461299c565b612a5b565b61299c565b9050919050565b6000612a9282612a65565b9050919050565b6000612aa482612a87565b9050919050565b612ab481612a99565b82525050565b6000602082019050612acf6000830184612aab565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612b0a816129bc565b82525050565b6000612b1c8383612b01565b60208301905092915050565b6000602082019050919050565b6000612b4082612ad5565b612b4a8185612ae0565b9350612b5583612af1565b8060005b83811015612b86578151612b6d8882612b10565b9750612b7883612b28565b925050600181019050612b59565b5085935050505092915050565b60006020820190508181036000830152612bad8184612b35565b905092915050565b6000612bc082612a87565b9050919050565b612bd081612bb5565b82525050565b6000602082019050612beb6000830184612bc7565b92915050565b6000612bfc82612a87565b9050919050565b612c0c81612bf1565b82525050565b6000602082019050612c276000830184612c03565b92915050565b60008115159050919050565b612c4281612c2d565b82525050565b6000602082019050612c5d6000830184612c39565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612cb682612c6d565b810181811067ffffffffffffffff82111715612cd557612cd4612c7e565b5b80604052505050565b6000612ce8612988565b9050612cf48282612cad565b919050565b600067ffffffffffffffff821115612d1457612d13612c7e565b5b612d1d82612c6d565b9050602081019050919050565b82818337600083830152505050565b6000612d4c612d4784612cf9565b612cde565b905082815260208101848484011115612d6857612d67612c68565b5b612d73848285612d2a565b509392505050565b600082601f830112612d9057612d8f612c63565b5b8135612da0848260208601612d39565b91505092915050565b6000819050919050565b612dbc81612da9565b8114612dc757600080fd5b50565b600081359050612dd981612db3565b92915050565b60008060008060808587031215612df957612df8612992565b5b600085013567ffffffffffffffff811115612e1757612e16612997565b5b612e2387828801612d7b565b9450506020612e34878288016129e5565b9350506040612e45878288016129e5565b9250506060612e5687828801612dca565b91505092959194509250565b612e6b81612a27565b8114612e7657600080fd5b50565b600081359050612e8881612e62565b92915050565b60008060408385031215612ea557612ea4612992565b5b6000612eb385828601612e79565b9250506020612ec485828601612e79565b9150509250929050565b600060208284031215612ee457612ee3612992565b5b6000612ef284828501612dca565b91505092915050565b6000612f0682612a87565b9050919050565b612f1681612efb565b82525050565b6000602082019050612f316000830184612f0d565b92915050565b612f40816129bc565b82525050565b6000602082019050612f5b6000830184612f37565b92915050565b6000612f6c82612a87565b9050919050565b612f7c81612f61565b82525050565b6000602082019050612f976000830184612f73565b92915050565b6000612fa882612a87565b9050919050565b612fb881612f9d565b82525050565b6000602082019050612fd36000830184612faf565b92915050565b600060208284031215612fef57612fee612992565b5b600082013567ffffffffffffffff81111561300d5761300c612997565b5b61301984828501612d7b565b91505092915050565b600067ffffffffffffffff82111561303d5761303c612c7e565b5b602082029050602081019050919050565b600080fd5b600061306661306184613022565b612cde565b905080838252602082019050602084028301858111156130895761308861304e565b5b835b818110156130b2578061309e8882612dca565b84526020840193505060208101905061308b565b5050509392505050565b600082601f8301126130d1576130d0612c63565b5b81356130e1848260208601613053565b91505092915050565b6000806040838503121561310157613100612992565b5b600061310f85828601612dca565b925050602083013567ffffffffffffffff8111156131305761312f612997565b5b61313c858286016130bc565b9150509250929050565b600080600080600060a0868803121561316257613161612992565b5b600086013567ffffffffffffffff8111156131805761317f612997565b5b61318c88828901612d7b565b955050602061319d888289016129e5565b94505060406131ae88828901612dca565b93505060606131bf888289016129e5565b92505060806131d0888289016129e5565b9150509295509295909350565b6131e681612da9565b82525050565b600060208201905061320160008301846131dd565b92915050565b60008151905061321681612e62565b92915050565b60006020828403121561323257613231612992565b5b600061324084828501613207565b91505092915050565b60008151905061325881612db3565b92915050565b60006020828403121561327457613273612992565b5b600061328284828501613249565b91505092915050565b600082825260208201905092915050565b7f696e76616c69642062617365206e6f6465000000000000000000000000000000600082015250565b60006132d260118361328b565b91506132dd8261329c565b602082019050919050565b60006020820190508181036000830152613301816132c5565b9050919050565b7f6e6f742073746172746564207965740000000000000000000000000000000000600082015250565b600061333e600f8361328b565b915061334982613308565b602082019050919050565b6000602082019050818103600083015261336d81613331565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006133ae82612a27565b91506133b983612a27565b92508282019050808211156133d1576133d0613374565b5b92915050565b60006040820190506133ec6000830185612f37565b6133f96020830184612f37565b9392505050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61343581612da9565b82525050565b6000613447838361342c565b60208301905092915050565b6000602082019050919050565b600061346b82613400565b613475818561340b565b93506134808361341c565b8060005b838110156134b1578151613498888261343b565b97506134a383613453565b925050600181019050613484565b5085935050505092915050565b60006040820190506134d36000830185612f37565b81810360208301526134e58184613460565b90509392505050565b6134f781612c2d565b811461350257600080fd5b50565b600081519050613514816134ee565b92915050565b6000602082840312156135305761352f612992565b5b600061353e84828501613505565b91505092915050565b7f6e6f74206f6e20616c6c6f776c69737400000000000000000000000000000000600082015250565b600061357d60108361328b565b915061358882613547565b602082019050919050565b600060208201905081810360008301526135ac81613570565b9050919050565b7f72656163686564206d6178696d756d206c696d69740000000000000000000000600082015250565b60006135e960158361328b565b91506135f4826135b3565b602082019050919050565b60006020820190508181036000830152613618816135dc565b9050919050565b7f636f6d6d69746d656e7420657869737473000000000000000000000000000000600082015250565b600061365560118361328b565b91506136608261361f565b602082019050919050565b6000602082019050818103600083015261368481613648565b9050919050565b7f696e76616c696420636c61696d00000000000000000000000000000000000000600082015250565b60006136c1600d8361328b565b91506136cc8261368b565b602082019050919050565b600060208201905081810360008301526136f0816136b4565b9050919050565b600067ffffffffffffffff82111561371257613711612c7e565b5b602082029050602081019050919050565b60005b83811015613741578082015181840152602081019050613726565b60008484015250505050565b600061376061375b84612cf9565b612cde565b90508281526020810184848401111561377c5761377b612c68565b5b613787848285613723565b509392505050565b600082601f8301126137a4576137a3612c63565b5b81516137b484826020860161374d565b91505092915050565b60006137d06137cb846136f7565b612cde565b905080838252602082019050602084028301858111156137f3576137f261304e565b5b835b8181101561383a57805167ffffffffffffffff81111561381857613817612c63565b5b808601613825898261378f565b855260208501945050506020810190506137f5565b5050509392505050565b600082601f83011261385957613858612c63565b5b81516138698482602086016137bd565b91505092915050565b60006020828403121561388857613887612992565b5b600082015167ffffffffffffffff8111156138a6576138a5612997565b5b6138b284828501613844565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006138f582612a27565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361392757613926613374565b5b600182019050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061398e60268361328b565b915061399982613932565b604082019050919050565b600060208201905081810360008301526139bd81613981565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006139fa60208361328b565b9150613a05826139c4565b602082019050919050565b60006020820190508181036000830152613a29816139ed565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000613a6660148361328b565b9150613a7182613a30565b602082019050919050565b60006020820190508181036000830152613a9581613a59565b9050919050565b600067ffffffffffffffff821115613ab757613ab6612c7e565b5b602082029050602081019050919050565b600081519050613ad7816129ce565b92915050565b6000613af0613aeb84613a9c565b612cde565b90508083825260208201905060208402830185811115613b1357613b1261304e565b5b835b81811015613b3c5780613b288882613ac8565b845260208401935050602081019050613b15565b5050509392505050565b600082601f830112613b5b57613b5a612c63565b5b8151613b6b848260208601613add565b91505092915050565b600060208284031215613b8a57613b89612992565b5b600082015167ffffffffffffffff811115613ba857613ba7612997565b5b613bb484828501613b46565b91505092915050565b6000819050919050565b613bd8613bd382612da9565b613bbd565b82525050565b60008160601b9050919050565b6000613bf682613bde565b9050919050565b6000613c0882613beb565b9050919050565b613c20613c1b826129bc565b613bfd565b82525050565b6000613c328286613bc7565b602082019150613c428285613c0f565b601482019150613c528284613bc7565b602082019150819050949350505050565b7f7265736f6c7665725f20213d2030783020726571756972656400000000000000600082015250565b6000613c9960198361328b565b9150613ca482613c63565b602082019050919050565b60006020820190508181036000830152613cc881613c8c565b9050919050565b6000613cdb8288613bc7565b602082019150613ceb8287613c0f565b601482019150613cfb8286613c0f565b601482019150613d0b8285613c0f565b601482019150613d1b8284613bc7565b6020820191508190509695505050505050565b7f7468697320646964206973206e6f7420617661696c61626c6500000000000000600082015250565b6000613d6460198361328b565b9150613d6f82613d2e565b602082019050919050565b60006020820190508181036000830152613d9381613d57565b9050919050565b6000604082019050613daf6000830185612a31565b613dbc6020830184612f37565b9392505050565b6000613dcf8285613bc7565b602082019150613ddf8284613bc7565b6020820191508190509392505050565b6000613dfa826129bc565b9050919050565b613e0a81613def565b8114613e1557600080fd5b50565b600081519050613e2781613e01565b92915050565b600060208284031215613e4357613e42612992565b5b6000613e5184828501613e18565b91505092915050565b6000604082019050613e6f60008301856131dd565b613e7c6020830184612f37565b9392505050565b6000606082019050613e986000830186612f37565b613ea56020830185612f37565b613eb26040830184612a31565b949350505050565b600081519050919050565b6000613ed082613eba565b613eda818561328b565b9350613eea818560208601613723565b613ef381612c6d565b840191505092915050565b60006020820190508181036000830152613f188184613ec5565b905092915050565b6000604082019050613f356000830185612f37565b8181036020830152613f478184613ec5565b90509392505050565b60008060408385031215613f6757613f66612992565b5b6000613f7585828601613505565b9250506020613f8685828601613207565b9150509250929050565b600060ff82169050919050565b6000613fa882613f90565b9150613fb383613f90565b9250828201905060ff811115613fcc57613fcb613374565b5b92915050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b600061400860108361328b565b915061401382613fd2565b602082019050919050565b6000602082019050818103600083015261403781613ffb565b905091905056fea2646970667358221220f129cddcaa550160f6a466c3d0321def1de0866546b5404b61553fa57a18412564736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000fc0d0430cc11effb068007306d6efd9b2ac7a460000000000000000000000000b07c4eef48b49aaf2199f59e8b1afbfefe2f26e800000000000000000000000087a61acb41776678e42231431e196e628eea7e4e000000000000000000000000f53248157e844885cf9f47e25c5af0a74f7d52b90000000000000000000000005ef31d5cd95dcd29f545275415c2caa13bc68362000000000000000000000000d8d2a8aa0b27e3d34a46a6cbd2ee7d81da441c84000000000000000000000000000000000000000000000000000000000000003c0000000000000000000000000000000000000000000000000000000000093a80
-----Decoded View---------------
Arg [0] : freeRegistrar_ (address): 0xFC0d0430cc11eFfB068007306d6EfD9b2Ac7a460
Arg [1] : invitationRegistry_ (address): 0xB07C4EeF48b49AAF2199f59e8B1aFBfEfE2f26E8
Arg [2] : validator_ (address): 0x87A61aCb41776678E42231431E196E628EEa7e4e
Arg [3] : merkleValidator_ (address): 0xf53248157E844885CF9f47e25c5Af0a74F7D52b9
Arg [4] : rewardRegistry_ (address): 0x5EF31d5Cd95dcd29f545275415c2Caa13Bc68362
Arg [5] : claimRegistry_ (address): 0xd8D2A8aA0B27E3d34a46a6Cbd2ee7d81DA441c84
Arg [6] : minCommitmentAge_ (uint256): 60
Arg [7] : maxCommitmentAge_ (uint256): 604800
-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 000000000000000000000000fc0d0430cc11effb068007306d6efd9b2ac7a460
Arg [1] : 000000000000000000000000b07c4eef48b49aaf2199f59e8b1afbfefe2f26e8
Arg [2] : 00000000000000000000000087a61acb41776678e42231431e196e628eea7e4e
Arg [3] : 000000000000000000000000f53248157e844885cf9f47e25c5af0a74f7d52b9
Arg [4] : 0000000000000000000000005ef31d5cd95dcd29f545275415c2caa13bc68362
Arg [5] : 000000000000000000000000d8d2a8aa0b27e3d34a46a6cbd2ee7d81da441c84
Arg [6] : 000000000000000000000000000000000000000000000000000000000000003c
Arg [7] : 0000000000000000000000000000000000000000000000000000000000093a80
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
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.