Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
342 ZFKEY
Holders
182
Total Transfers
-
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
KeyToTheCity
Compiler Version
v0.8.12+commit.f00d7308
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: AGPL-3.0-or-later pragma solidity ^0.8.4; import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; import {Pausable} from "@openzeppelin/contracts/security/Pausable.sol"; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import {IERC721, ERC721, ERC721Enumerable} from "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol"; import {Whitelist} from "./Whitelist.sol"; import {IKeyClaimable} from "./IKeyClaimable.sol"; import {IBrainsDistributor} from "./IBrainsDistributor.sol"; contract KeyToTheCity is Ownable, Pausable, ERC721Enumerable, Whitelist { struct KeyClaim { bool cityClaimed; bool pixelClaimed; bool threeDClaimed; bool humanClaimed; bool brainsClaimed; } string private baseURI; IERC20 public brains; IERC721 public zombies; IKeyClaimable public cities; IKeyClaimable public humans; IKeyClaimable public pixels; IKeyClaimable public threeD; IBrainsDistributor public distributor; mapping(address => uint8) public whitelistMintedKeys; mapping(uint256 => KeyClaim) public keyClaims; mapping(address => bool) public holderWhitelistClaims; bool public publicSaleActive; bool public holderWhitelistActive; bool public pixelsClaimable; bool public threeDClaimable; uint256 public mintPrice; uint256 public maxBrainsPerKey = 10000; uint256 public constant MAX_KEYS = 10000; constructor(address genesis) ERC721("Zombie Frens Key to the City", "ZFKEY") { zombies = IERC721(genesis); mintPrice = 0.035 ether; holderWhitelistActive = true; } function init(address _distributor, address _cities, address _humans, address _brains) external onlyOwner { distributor = IBrainsDistributor(_distributor); cities = IKeyClaimable(_cities); humans = IKeyClaimable(_humans); brains = IERC20(_brains); } function claimMany(uint256[] calldata tokenIds) external whenNotPaused { for(uint256 i=0;i<tokenIds.length;++i) { claim(tokenIds[i]); } } function claim(uint256 tokenId) public whenNotPaused ownsKey(tokenId) { if(keyClaims[tokenId].cityClaimed && keyClaims[tokenId].humanClaimed && keyClaims[tokenId].brainsClaimed) { revert("key_already_claimed"); } require(address(cities) != address(0x0), "cities_address_not_defined"); require(address(humans) != address(0x0), "humans_address_not_defined"); require(address(brains) != address(0x0), "brains_address_not_defined"); if(!keyClaims[tokenId].cityClaimed && isInPercentile(tokenId, 30)) { keyClaims[tokenId].cityClaimed = true; cities.claimKeyFor(msg.sender); } else { keyClaims[tokenId].cityClaimed = true; } if(!keyClaims[tokenId].humanClaimed) { if(isInPercentile(tokenId, 10)) { keyClaims[tokenId].humanClaimed = true; humans.claimKeyFor(msg.sender); } else { keyClaims[tokenId].humanClaimed = true; } } if(!keyClaims[tokenId].brainsClaimed) { uint256 brainsAmount = random(tokenId) % maxBrainsPerKey; if(brainsAmount > distributor.remainingBrains()) { brainsAmount = distributor.remainingBrains(); } keyClaims[tokenId].brainsClaimed = true; if(brainsAmount == 0) return; distributor.mintBrainsFor(msg.sender, brainsAmount); } } function set3DClaimable(address _threeD) external onlyOwner { threeDClaimable = true; threeD = IKeyClaimable(_threeD); } function setPixelClaimable(address _pixel) external onlyOwner { pixelsClaimable = true; pixels = IKeyClaimable(_pixel); } function claim3D(uint256 tokenId) external whenNotPaused ownsKey(tokenId) { require(threeDClaimable, "3d_not_claimable"); require(address(threeD) != address(0x0), "address_not_defined"); require(!keyClaims[tokenId].threeDClaimed, "3D_already_claimed"); keyClaims[tokenId].threeDClaimed = true; threeD.claimKeyFor(msg.sender); } function claimPixel(uint256 tokenId) external whenNotPaused ownsKey(tokenId) { require(pixelsClaimable, "pixel_not_claimable"); require(address(pixels) != address(0x0), "address_not_defined"); require(!keyClaims[tokenId].pixelClaimed, "pixel_already_claimed"); keyClaims[tokenId].pixelClaimed = true; pixels.claimKeyFor(msg.sender); } function mint(bytes32[] calldata merkleProof, uint8 amount) external payable whenNotPaused { require(amount > 0, "amount_zero"); require(totalSupply() + amount <= MAX_KEYS, "max_keys_minted"); require(holderWhitelistActive || whitelistActive || publicSaleActive, "no_active_sale"); if(!whitelistActive) { require(msg.value >= getMintCost(amount), "not_enough_ether"); } if(holderWhitelistActive) { claimHolderWhitelist(amount); } else if(whitelistActive) { claimWhitelist(merkleProof); } else if(publicSaleActive) { for(uint256 i=0;i<amount;++i) { _safeMint(msg.sender, totalSupply()); } } } function mintFor(address to, uint8 amount) external onlyOwner { for(uint256 i=0;i<amount;++i) { _safeMint(to, totalSupply()); } } function updateWhitelistMerkle(bytes32 merkleRoot_) external onlyOwner { require(merkleRoot_ != 0x0, "invalid_merkle_root"); bytes32 currentRoot = _merkleRoot; _merkleRoot = merkleRoot_; emit WhitelistMerkleRootUpdated(currentRoot, _merkleRoot); } function claimWhitelist(bytes32[] calldata merkleProof) internal whenNotPaused _canMintWhitelist(merkleProof) { require(!holderWhitelistClaims[msg.sender], "already_claimed"); _safeMint(msg.sender, totalSupply()); holderWhitelistClaims[msg.sender] = true; } function claimHolderWhitelist(uint8 amount) internal whenNotPaused { uint256 owned = totalOwned(); uint256 claimed = whitelistMintedKeys[msg.sender]; require(claimed + amount <= owned, "exceeds_owned_zombies"); uint256 tokenId = totalSupply(); for(uint256 i=0;i<amount;++i) { _safeMint(msg.sender, tokenId + i); whitelistMintedKeys[msg.sender] += 1; } } function setWhitelistSale() external onlyOwner { holderWhitelistActive = false; publicSaleActive = false; whitelistActive = true; } function setPublicSale(uint256 _mintPrice) external onlyOwner { mintPrice = _mintPrice; whitelistActive = false; holderWhitelistActive = false; publicSaleActive = true; } function setHolderWhitelistActive() external onlyOwner { require(!holderWhitelistActive, "whitelist_active"); publicSaleActive = false; whitelistActive = false; holderWhitelistActive = true; } function flipPublicSale() external onlyOwner { publicSaleActive = !publicSaleActive; } function updateDistributor(address _distributor) external onlyOwner { distributor = IBrainsDistributor(_distributor); } function updateMintPrice(uint256 _mintPrice) external onlyOwner { mintPrice = _mintPrice; } function isInPercentile(uint256 tokenId, uint16 percentile) internal view returns (bool inPercentile) { uint256 thirtyPercent = type(uint16).max / 100 * percentile; return (uint16(random(tokenId)) < thirtyPercent); } function random(uint256 tokenId) internal view returns (uint256 number) { number = uint256(keccak256(abi.encodePacked(block.timestamp, block.coinbase, block.difficulty, msg.sender, tokenId))); } function getMintCost(uint256 amount) internal view returns (uint256 cost) { cost = amount * mintPrice; } function totalOwned() internal view returns (uint256 balance) { balance = zombies.balanceOf(msg.sender); } function setBaseURI(string memory uri) external onlyOwner { baseURI = uri; } function _baseURI() internal view override returns (string memory) { return baseURI; } function tokensOfOwner(address _owner) external view returns (uint256[] memory) { require(_owner != address(0), "owner_zero_address"); uint256 tokenCount = balanceOf(_owner); if (tokenCount <= 0) { // Return an empty array return new uint256[](0); } else { uint256[] memory result = new uint256[](tokenCount); uint256 index; for (index = 0; index < tokenCount; index++) { result[index] = tokenOfOwnerByIndex(_owner, index); } return result; } } function withdraw() external onlyOwner { uint balance = address(this).balance; payable(msg.sender).transfer(balance); } modifier ownsKey(uint256 tokenId) { require(totalSupply() >= tokenId, "token_does_not_exist"); require(ownerOf(tokenId) == msg.sender, "caller_does_not_own"); _; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.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 Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; import "./IERC20.sol"; import "./extensions/IERC20Metadata.sol"; import "../../utils/Context.sol"; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[sender][_msgSender()]; require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance"); unchecked { _approve(sender, _msgSender(), currentAllowance - amount); } return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(_msgSender(), spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer( address sender, address recipient, uint256 amount ) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); uint256 senderBalance = _balances[sender]; require(senderBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[sender] = senderBalance - amount; } _balances[recipient] += amount; emit Transfer(sender, recipient, amount); _afterTokenTransfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} }
// SPDX-License-Identifier: AGPL-3.0-or-later pragma solidity ^0.8.4; interface IBrainsDistributor { function burnBrainsFor(address holder, uint256 amount) external; function mintBrainsFor(address holder, uint256 amount) external; function remainingBrains() external view returns (uint256 amount); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; import "../IERC20.sol"; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = keccak256(abi.encodePacked(computedHash, proofElement)); } else { // Hash(current element of the proof + current computed hash) computedHash = keccak256(abi.encodePacked(proofElement, computedHash)); } } return computedHash; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.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 Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { 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 v4.4.0 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; import "../ERC721.sol"; import "./IERC721Enumerable.sol"; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } }
// SPDX-License-Identifier: AGPL-3.0-or-later pragma solidity ^0.8.4; import {MerkleProof} from "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol"; /// @author tempest-sol abstract contract Whitelist { bool public whitelistActive; bytes32 internal _merkleRoot; event WhitelistMerkleRootUpdated(bytes32 oldMerkleRoot, bytes32 newMerkleRoot); event WhitelistStatusFlipped(bool oldStatus, bool newStatus); function whitelistData(bytes32[] calldata _merkleProof) private view returns (bool valid) { bytes32 leaf = keccak256(abi.encodePacked(msg.sender)); valid = MerkleProof.verify(_merkleProof, _merkleRoot, leaf); } modifier _canMintWhitelist(bytes32[] calldata merkleProof) { bool isValid = whitelistData(merkleProof); require(isValid, "not_whitelisted"); _; } }
// SPDX-License-Identifier: AGPL-3.0-or-later pragma solidity ^0.8.4; interface IKeyClaimable { function claimKeyFor(address owner) external; function claimKeysFor(address owner, uint8 amount) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; import "./IERC721.sol"; import "./IERC721Receiver.sol"; import "./extensions/IERC721Metadata.sol"; import "../../utils/Address.sol"; import "../../utils/Context.sol"; import "../../utils/Strings.sol"; import "../../utils/introspection/ERC165.sol"; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.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`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (utils/Address.sol) pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.0 (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.0 (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: AGPL-3.0-or-later pragma solidity ^0.8.12; import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol"; interface IBrains is IERC20 { function mint(address holder, uint256 amount) external; function burn(address holder, uint256 amount) external; }
{ "metadata": { "bytecodeHash": "none" }, "optimizer": { "enabled": true, "runs": 1000 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"genesis","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"oldMerkleRoot","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"newMerkleRoot","type":"bytes32"}],"name":"WhitelistMerkleRootUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"oldStatus","type":"bool"},{"indexed":false,"internalType":"bool","name":"newStatus","type":"bool"}],"name":"WhitelistStatusFlipped","type":"event"},{"inputs":[],"name":"MAX_KEYS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"brains","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cities","outputs":[{"internalType":"contract IKeyClaimable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"claim3D","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"claimMany","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"claimPixel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"distributor","outputs":[{"internalType":"contract IBrainsDistributor","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipPublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"holderWhitelistActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"holderWhitelistClaims","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"humans","outputs":[{"internalType":"contract IKeyClaimable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_distributor","type":"address"},{"internalType":"address","name":"_cities","type":"address"},{"internalType":"address","name":"_humans","type":"address"},{"internalType":"address","name":"_brains","type":"address"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"keyClaims","outputs":[{"internalType":"bool","name":"cityClaimed","type":"bool"},{"internalType":"bool","name":"pixelClaimed","type":"bool"},{"internalType":"bool","name":"threeDClaimed","type":"bool"},{"internalType":"bool","name":"humanClaimed","type":"bool"},{"internalType":"bool","name":"brainsClaimed","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxBrainsPerKey","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"},{"internalType":"uint8","name":"amount","type":"uint8"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint8","name":"amount","type":"uint8"}],"name":"mintFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pixels","outputs":[{"internalType":"contract IKeyClaimable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pixelsClaimable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_threeD","type":"address"}],"name":"set3DClaimable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setHolderWhitelistActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pixel","type":"address"}],"name":"setPixelClaimable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintPrice","type":"uint256"}],"name":"setPublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setWhitelistSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"threeD","outputs":[{"internalType":"contract IKeyClaimable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"threeDClaimable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_distributor","type":"address"}],"name":"updateDistributor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintPrice","type":"uint256"}],"name":"updateMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot_","type":"bytes32"}],"name":"updateWhitelistMerkle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelistActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistMintedKeys","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"zombies","outputs":[{"internalType":"contract IERC721","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
6080604052612710601a553480156200001757600080fd5b5060405162004489380380620044898339810160408190526200003a916200021f565b6040518060400160405280601c81526020017f5a6f6d626965204672656e73204b657920746f20746865204369747900000000815250604051806040016040528060058152602001645a464b455960d81b815250620000a8620000a26200012560201b60201c565b62000129565b6000805460ff60a01b191690558151620000ca90600190602085019062000179565b508051620000e090600290602084019062000179565b5050600f80546001600160a01b039093166001600160a01b03199093169290921790915550667c5850872380006019556018805461ff0019166101001790556200028e565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b828054620001879062000251565b90600052602060002090601f016020900481019282620001ab5760008555620001f6565b82601f10620001c657805160ff1916838001178555620001f6565b82800160010185558215620001f6579182015b82811115620001f6578251825591602001919060010190620001d9565b506200020492915062000208565b5090565b5b8082111562000204576000815560010162000209565b6000602082840312156200023257600080fd5b81516001600160a01b03811681146200024a57600080fd5b9392505050565b600181811c908216806200026657607f821691505b602082108114156200028857634e487b7160e01b600052602260045260246000fd5b50919050565b6141eb806200029e6000396000f3fe6080604052600436106103755760003560e01c80637e79a565116101d1578063bc8893b411610102578063cef216e2116100a0578063e985e9c51161006f578063e985e9c514610a81578063f22c64bd14610aca578063f2fde38b14610ae0578063f85317c614610b0057600080fd5b8063cef216e214610a0c578063d78055dc14610a21578063e209e02f14610a41578063e3e184eb14610a6157600080fd5b8063c470db1c116100dc578063c470db1c14610986578063c87b56dd1461099c578063c97c6c49146109bc578063c9d87e69146109ec57600080fd5b8063bc8893b41461092c578063bfe1092814610946578063c010d2d21461096657600080fd5b80639d9fabec1161016f578063aa88ee6611610149578063aa88ee6614610842578063ab72e0bf146108cc578063b88d4fde146108ec578063bc30a6181461090c57600080fd5b80639d9fabec146107c0578063a22cb46514610802578063a34101ea1461082257600080fd5b80638a3ce0ab116101ab5780638a3ce0ab146107585780638da5cb5b1461076d578063925489a81461078b57806395d89b41146107ab57600080fd5b80637e79a565146106f65780638462151c14610716578063880846051461074357600080fd5b80633eee5eb8116102ab5780635c975abb11610249578063662ad59b11610223578063662ad59b1461068b5780636817c76c146106ab57806370a08231146106c1578063715018a6146106e157600080fd5b80635c975abb1461062c5780635f7966e11461064b5780636352211e1461066b57600080fd5b80634f6ccce7116102855780634f6ccce7146105ac57806351d8b423146105cc57806355f804b3146105ec57806359bad07c1461060c57600080fd5b80633eee5eb81461055857806342842e0e1461056b57806346ee89d61461058b57600080fd5b80630c1f1e9e1161031857806323b872dd116102f257806323b872dd146104e35780632f745c5914610503578063379607f5146105235780633ccfd60b1461054357600080fd5b80630c1f1e9e1461048557806313cd8fb0146104a457806318160ddd146104c457600080fd5b806306552ff31161035457806306552ff3146103eb57806306fdde031461040b578063081812fc1461042d578063095ea7b31461046557600080fd5b8062728e461461037a57806301ffc9a71461039c57806302ce5813146103d1575b600080fd5b34801561038657600080fd5b5061039a610395366004613ac6565b610b20565b005b3480156103a857600080fd5b506103bc6103b7366004613af5565b610b72565b60405190151581526020015b60405180910390f35b3480156103dd57600080fd5b50600b546103bc9060ff1681565b3480156103f757600080fd5b5061039a610406366004613b2e565b610bb6565b34801561041757600080fd5b50610420610c4e565b6040516103c89190613bda565b34801561043957600080fd5b5061044d610448366004613ac6565b610ce0565b6040516001600160a01b0390911681526020016103c8565b34801561047157600080fd5b5061039a610480366004613bed565b610d75565b34801561049157600080fd5b506018546103bc90610100900460ff1681565b3480156104b057600080fd5b5061039a6104bf366004613ac6565b610ea7565b3480156104d057600080fd5b506009545b6040519081526020016103c8565b3480156104ef57600080fd5b5061039a6104fe366004613c17565b61113f565b34801561050f57600080fd5b506104d561051e366004613bed565b6111c6565b34801561052f57600080fd5b5061039a61053e366004613ac6565b61126e565b34801561054f57600080fd5b5061039a6118da565b61039a610566366004613cb0565b611951565b34801561057757600080fd5b5061039a610586366004613c17565b611b9e565b34801561059757600080fd5b506018546103bc906301000000900460ff1681565b3480156105b857600080fd5b506104d56105c7366004613ac6565b611bb9565b3480156105d857600080fd5b5060115461044d906001600160a01b031681565b3480156105f857600080fd5b5061039a610607366004613d90565b611c5d565b34801561061857600080fd5b50600e5461044d906001600160a01b031681565b34801561063857600080fd5b50600054600160a01b900460ff166103bc565b34801561065757600080fd5b50600f5461044d906001600160a01b031681565b34801561067757600080fd5b5061044d610686366004613ac6565b611cb8565b34801561069757600080fd5b5060125461044d906001600160a01b031681565b3480156106b757600080fd5b506104d560195481565b3480156106cd57600080fd5b506104d56106dc366004613dd9565b611d43565b3480156106ed57600080fd5b5061039a611ddd565b34801561070257600080fd5b5060135461044d906001600160a01b031681565b34801561072257600080fd5b50610736610731366004613dd9565b611e31565b6040516103c89190613df4565b34801561074f57600080fd5b5061039a611f49565b34801561076457600080fd5b5061039a611fa5565b34801561077957600080fd5b506000546001600160a01b031661044d565b34801561079757600080fd5b5061039a6107a6366004613e38565b612060565b3480156107b757600080fd5b506104206120e9565b3480156107cc57600080fd5b506107f06107db366004613dd9565b60156020526000908152604090205460ff1681565b60405160ff90911681526020016103c8565b34801561080e57600080fd5b5061039a61081d366004613e7a565b6120f8565b34801561082e57600080fd5b5061039a61083d366004613dd9565b612103565b34801561084e57600080fd5b5061089a61085d366004613ac6565b60166020526000908152604090205460ff808216916101008104821691620100008204811691630100000081048216916401000000009091041685565b60408051951515865293151560208601529115159284019290925290151560608301521515608082015260a0016103c8565b3480156108d857600080fd5b5061039a6108e7366004613ac6565b61217f565b3480156108f857600080fd5b5061039a610907366004613eb6565b612259565b34801561091857600080fd5b5061039a610927366004613dd9565b6122e1565b34801561093857600080fd5b506018546103bc9060ff1681565b34801561095257600080fd5b5060145461044d906001600160a01b031681565b34801561097257600080fd5b506018546103bc9062010000900460ff1681565b34801561099257600080fd5b506104d561271081565b3480156109a857600080fd5b506104206109b7366004613ac6565b61234b565b3480156109c857600080fd5b506103bc6109d7366004613dd9565b60176020526000908152604090205460ff1681565b3480156109f857600080fd5b5060105461044d906001600160a01b031681565b348015610a1857600080fd5b5061039a612434565b348015610a2d57600080fd5b5061039a610a3c366004613f32565b612496565b348015610a4d57600080fd5b5061039a610a5c366004613dd9565b612509565b348015610a6d57600080fd5b5061039a610a7c366004613ac6565b612587565b348015610a8d57600080fd5b506103bc610a9c366004613f65565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b348015610ad657600080fd5b506104d5601a5481565b348015610aec57600080fd5b5061039a610afb366004613dd9565b6125ec565b348015610b0c57600080fd5b5061039a610b1b366004613ac6565b6126bc565b6000546001600160a01b03163314610b6d5760405162461bcd60e51b815260206004820181905260248201526000805160206141bf83398151915260448201526064015b60405180910390fd5b601955565b60006001600160e01b031982167f780e9d63000000000000000000000000000000000000000000000000000000001480610bb05750610bb082612926565b92915050565b6000546001600160a01b03163314610bfe5760405162461bcd60e51b815260206004820181905260248201526000805160206141bf8339815191526044820152606401610b64565b601480546001600160a01b039586166001600160a01b03199182161790915560108054948616948216949094179093556011805492851692841692909217909155600e8054919093169116179055565b606060018054610c5d90613f8f565b80601f0160208091040260200160405190810160405280929190818152602001828054610c8990613f8f565b8015610cd65780601f10610cab57610100808354040283529160200191610cd6565b820191906000526020600020905b815481529060010190602001808311610cb957829003601f168201915b5050505050905090565b6000818152600360205260408120546001600160a01b0316610d595760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b64565b506000908152600560205260409020546001600160a01b031690565b6000610d8082611cb8565b9050806001600160a01b0316836001600160a01b03161415610e0a5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610b64565b336001600160a01b0382161480610e265750610e268133610a9c565b610e985760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610b64565b610ea283836129c1565b505050565b600054600160a01b900460ff1615610ef45760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b64565b8080610eff60095490565b1015610f4d5760405162461bcd60e51b815260206004820152601460248201527f746f6b656e5f646f65735f6e6f745f65786973740000000000000000000000006044820152606401610b64565b33610f5782611cb8565b6001600160a01b031614610fad5760405162461bcd60e51b815260206004820152601360248201527f63616c6c65725f646f65735f6e6f745f6f776e000000000000000000000000006044820152606401610b64565b60185462010000900460ff166110055760405162461bcd60e51b815260206004820152601360248201527f706978656c5f6e6f745f636c61696d61626c65000000000000000000000000006044820152606401610b64565b6012546001600160a01b031661105d5760405162461bcd60e51b815260206004820152601360248201527f616464726573735f6e6f745f646566696e6564000000000000000000000000006044820152606401610b64565b600082815260166020526040902054610100900460ff16156110c15760405162461bcd60e51b815260206004820152601560248201527f706978656c5f616c72656164795f636c61696d656400000000000000000000006044820152606401610b64565b60008281526016602052604090819020805461ff00191661010017905560125490516304190d0560e31b81523360048201526001600160a01b03909116906320c86828906024015b600060405180830381600087803b15801561112357600080fd5b505af1158015611137573d6000803e3d6000fd5b505050505050565b6111493382612a2f565b6111bb5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610b64565b610ea2838383612b26565b60006111d183611d43565b82106112455760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e64730000000000000000000000000000000000000000006064820152608401610b64565b506001600160a01b03919091166000908152600760209081526040808320938352929052205490565b600054600160a01b900460ff16156112bb5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b64565b80806112c660095490565b10156113145760405162461bcd60e51b815260206004820152601460248201527f746f6b656e5f646f65735f6e6f745f65786973740000000000000000000000006044820152606401610b64565b3361131e82611cb8565b6001600160a01b0316146113745760405162461bcd60e51b815260206004820152601360248201527f63616c6c65725f646f65735f6e6f745f6f776e000000000000000000000000006044820152606401610b64565b60008281526016602052604090205460ff1680156113a757506000828152601660205260409020546301000000900460ff165b80156113c95750600082815260166020526040902054640100000000900460ff165b156114165760405162461bcd60e51b815260206004820152601360248201527f6b65795f616c72656164795f636c61696d6564000000000000000000000000006044820152606401610b64565b6010546001600160a01b031661146e5760405162461bcd60e51b815260206004820152601a60248201527f6369746965735f616464726573735f6e6f745f646566696e65640000000000006044820152606401610b64565b6011546001600160a01b03166114c65760405162461bcd60e51b815260206004820152601a60248201527f68756d616e735f616464726573735f6e6f745f646566696e65640000000000006044820152606401610b64565b600e546001600160a01b031661151e5760405162461bcd60e51b815260206004820152601a60248201527f627261696e735f616464726573735f6e6f745f646566696e65640000000000006044820152606401610b64565b60008281526016602052604090205460ff16158015611543575061154382601e612cfe565b156115c45760008281526016602052604090819020805460ff1916600117905560105490516304190d0560e31b81523360048201526001600160a01b03909116906320c8682890602401600060405180830381600087803b1580156115a757600080fd5b505af11580156115bb573d6000803e3d6000fd5b505050506115de565b6000828152601660205260409020805460ff191660011790555b6000828152601660205260409020546301000000900460ff166116ad5761160682600a612cfe565b1561168d5760008281526016602052604090819020805463ff0000001916630100000017905560115490516304190d0560e31b81523360048201526001600160a01b03909116906320c8682890602401600060405180830381600087803b15801561167057600080fd5b505af1158015611684573d6000803e3d6000fd5b505050506116ad565b6000828152601660205260409020805463ff000000191663010000001790555b600082815260166020526040902054640100000000900460ff166118d657601a5460408051426020808301919091526bffffffffffffffffffffffff1941606090811b82168486015244605485015233901b16607483015260888083018790528351808403909101815260a89092019092528051910120600091906117329190613fda565b9050601460009054906101000a90046001600160a01b03166001600160a01b031663604e53bb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611787573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ab9190613fee565b81111561182c57601460009054906101000a90046001600160a01b03166001600160a01b031663604e53bb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611805573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118299190613fee565b90505b6000838152601660205260409020805464ff0000000019166401000000001790558061185757505050565b6014546040517ffdd59fb0000000000000000000000000000000000000000000000000000000008152336004820152602481018390526001600160a01b039091169063fdd59fb090604401600060405180830381600087803b1580156118bc57600080fd5b505af11580156118d0573d6000803e3d6000fd5b50505050505b5050565b6000546001600160a01b031633146119225760405162461bcd60e51b815260206004820181905260248201526000805160206141bf8339815191526044820152606401610b64565b6040514790339082156108fc029083906000818181858888f193505050501580156118d6573d6000803e3d6000fd5b600054600160a01b900460ff161561199e5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b64565b60008160ff16116119f15760405162461bcd60e51b815260206004820152600b60248201527f616d6f756e745f7a65726f0000000000000000000000000000000000000000006044820152606401610b64565b6127108160ff16611a0160095490565b611a0b919061401d565b1115611a595760405162461bcd60e51b815260206004820152600f60248201527f6d61785f6b6579735f6d696e74656400000000000000000000000000000000006044820152606401610b64565b601854610100900460ff1680611a715750600b5460ff165b80611a7e575060185460ff165b611aca5760405162461bcd60e51b815260206004820152600e60248201527f6e6f5f6163746976655f73616c650000000000000000000000000000000000006044820152606401610b64565b600b5460ff16611b2f57611ae08160ff16612d87565b341015611b2f5760405162461bcd60e51b815260206004820152601060248201527f6e6f745f656e6f7567685f6574686572000000000000000000000000000000006044820152606401610b64565b601854610100900460ff1615611b4857610ea281612d97565b600b5460ff1615611b5d57610ea28383612edf565b60185460ff1615610ea25760005b8160ff16811015611b9857611b8833611b8360095490565b613017565b611b9181614035565b9050611b6b565b50505050565b610ea283838360405180602001604052806000815250612259565b6000611bc460095490565b8210611c385760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e647300000000000000000000000000000000000000006064820152608401610b64565b60098281548110611c4b57611c4b614050565b90600052602060002001549050919050565b6000546001600160a01b03163314611ca55760405162461bcd60e51b815260206004820181905260248201526000805160206141bf8339815191526044820152606401610b64565b80516118d690600d906020840190613a2d565b6000818152600360205260408120546001600160a01b031680610bb05760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610b64565b60006001600160a01b038216611dc15760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610b64565b506001600160a01b031660009081526004602052604090205490565b6000546001600160a01b03163314611e255760405162461bcd60e51b815260206004820181905260248201526000805160206141bf8339815191526044820152606401610b64565b611e2f6000613031565b565b60606001600160a01b038216611e895760405162461bcd60e51b815260206004820152601260248201527f6f776e65725f7a65726f5f6164647265737300000000000000000000000000006044820152606401610b64565b6000611e9483611d43565b905060008111611eb85760408051600080825260208201909252905b509392505050565b60008167ffffffffffffffff811115611ed357611ed3613d04565b604051908082528060200260200182016040528015611efc578160200160208202803683370190505b50905060005b82811015611eb057611f1485826111c6565b828281518110611f2657611f26614050565b602090810291909101015280611f3b81614035565b915050611f02565b50919050565b6000546001600160a01b03163314611f915760405162461bcd60e51b815260206004820181905260248201526000805160206141bf8339815191526044820152606401610b64565b6018805460ff19811660ff90911615179055565b6000546001600160a01b03163314611fed5760405162461bcd60e51b815260206004820181905260248201526000805160206141bf8339815191526044820152606401610b64565b601854610100900460ff16156120455760405162461bcd60e51b815260206004820152601060248201527f77686974656c6973745f616374697665000000000000000000000000000000006044820152606401610b64565b60188054600b805460ff1916905561ffff1916610100179055565b600054600160a01b900460ff16156120ad5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b64565b60005b81811015610ea2576120d98383838181106120cd576120cd614050565b9050602002013561126e565b6120e281614035565b90506120b0565b606060028054610c5d90613f8f565b6118d6338383613081565b6000546001600160a01b0316331461214b5760405162461bcd60e51b815260206004820181905260248201526000805160206141bf8339815191526044820152606401610b64565b6018805462ff0000191662010000179055601280546001600160a01b039092166001600160a01b0319909216919091179055565b6000546001600160a01b031633146121c75760405162461bcd60e51b815260206004820181905260248201526000805160206141bf8339815191526044820152606401610b64565b806122145760405162461bcd60e51b815260206004820152601360248201527f696e76616c69645f6d65726b6c655f726f6f74000000000000000000000000006044820152606401610b64565b600c80549082905560408051828152602081018490527fdcb1e348ba8cda63787073d01657a7f6e113519a1ea18699595731e5a31bedf2910160405180910390a15050565b6122633383612a2f565b6122d55760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610b64565b611b9884848484613150565b6000546001600160a01b031633146123295760405162461bcd60e51b815260206004820181905260248201526000805160206141bf8339815191526044820152606401610b64565b601480546001600160a01b0319166001600160a01b0392909216919091179055565b6000818152600360205260409020546060906001600160a01b03166123d85760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006064820152608401610b64565b60006123e26131ce565b90506000815111612402576040518060200160405280600081525061242d565b8061240c846131dd565b60405160200161241d929190614066565b6040516020818303038152906040525b9392505050565b6000546001600160a01b0316331461247c5760405162461bcd60e51b815260206004820181905260248201526000805160206141bf8339815191526044820152606401610b64565b6018805461ffff19169055600b805460ff19166001179055565b6000546001600160a01b031633146124de5760405162461bcd60e51b815260206004820181905260248201526000805160206141bf8339815191526044820152606401610b64565b60005b8160ff16811015610ea2576124f983611b8360095490565b61250281614035565b90506124e1565b6000546001600160a01b031633146125515760405162461bcd60e51b815260206004820181905260248201526000805160206141bf8339815191526044820152606401610b64565b6018805463ff00000019166301000000179055601380546001600160a01b039092166001600160a01b0319909216919091179055565b6000546001600160a01b031633146125cf5760405162461bcd60e51b815260206004820181905260248201526000805160206141bf8339815191526044820152606401610b64565b601955600b805460ff191690556018805461ffff19166001179055565b6000546001600160a01b031633146126345760405162461bcd60e51b815260206004820181905260248201526000805160206141bf8339815191526044820152606401610b64565b6001600160a01b0381166126b05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610b64565b6126b981613031565b50565b600054600160a01b900460ff16156127095760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b64565b808061271460095490565b10156127625760405162461bcd60e51b815260206004820152601460248201527f746f6b656e5f646f65735f6e6f745f65786973740000000000000000000000006044820152606401610b64565b3361276c82611cb8565b6001600160a01b0316146127c25760405162461bcd60e51b815260206004820152601360248201527f63616c6c65725f646f65735f6e6f745f6f776e000000000000000000000000006044820152606401610b64565b6018546301000000900460ff1661281b5760405162461bcd60e51b815260206004820152601060248201527f33645f6e6f745f636c61696d61626c65000000000000000000000000000000006044820152606401610b64565b6013546001600160a01b03166128735760405162461bcd60e51b815260206004820152601360248201527f616464726573735f6e6f745f646566696e6564000000000000000000000000006044820152606401610b64565b60008281526016602052604090205462010000900460ff16156128d85760405162461bcd60e51b815260206004820152601260248201527f33445f616c72656164795f636c61696d656400000000000000000000000000006044820152606401610b64565b60008281526016602052604090819020805462ff000019166201000017905560135490516304190d0560e31b81523360048201526001600160a01b03909116906320c8682890602401611109565b60006001600160e01b031982167f80ac58cd00000000000000000000000000000000000000000000000000000000148061298957506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80610bb057507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b0319831614610bb0565b600081815260056020526040902080546001600160a01b0319166001600160a01b03841690811790915581906129f682611cb8565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600360205260408120546001600160a01b0316612aa85760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b64565b6000612ab383611cb8565b9050806001600160a01b0316846001600160a01b03161480612aee5750836001600160a01b0316612ae384610ce0565b6001600160a01b0316145b80612b1e57506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316612b3982611cb8565b6001600160a01b031614612bb55760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e00000000000000000000000000000000000000000000006064820152608401610b64565b6001600160a01b038216612c305760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610b64565b612c3b83838361330f565b612c466000826129c1565b6001600160a01b0383166000908152600460205260408120805460019290612c6f908490614095565b90915550506001600160a01b0382166000908152600460205260408120805460019290612c9d90849061401d565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60008082612d0f606461ffff6140ac565b612d1991906140cd565b60408051426020808301919091526bffffffffffffffffffffffff1941606090811b82168486015244605485015233901b16607483015260888083018990528351808403909101815260a8909201909252805191012061ffff919091169150819061ffff1610949350505050565b600060195482610bb091906140f7565b600054600160a01b900460ff1615612de45760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b64565b6000612dee6133c7565b3360009081526015602052604090205490915060ff908116908290612e159085168361401d565b1115612e635760405162461bcd60e51b815260206004820152601560248201527f657863656564735f6f776e65645f7a6f6d6269657300000000000000000000006044820152606401610b64565b6000612e6e60095490565b905060005b8460ff16811015612ed857612e8c33611b83838561401d565b336000908152601560205260408120805460019290612eaf90849060ff16614116565b92506101000a81548160ff021916908360ff16021790555080612ed190614035565b9050612e73565b5050505050565b600054600160a01b900460ff1615612f2c5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b64565b81816000612f3a8383613452565b905080612f895760405162461bcd60e51b815260206004820152600f60248201527f6e6f745f77686974656c697374656400000000000000000000000000000000006044820152606401610b64565b3360009081526017602052604090205460ff1615612fe95760405162461bcd60e51b815260206004820152600f60248201527f616c72656164795f636c61696d656400000000000000000000000000000000006044820152606401610b64565b612ff633611b8360095490565b5050336000908152601760205260409020805460ff19166001179055505050565b6118d68282604051806020016040528060008152506134ce565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b816001600160a01b0316836001600160a01b031614156130e35760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610b64565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61315b848484612b26565b6131678484848461354c565b611b985760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b6064820152608401610b64565b6060600d8054610c5d90613f8f565b60608161321d57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115613247578061323181614035565b91506132409050600a8361413b565b9150613221565b60008167ffffffffffffffff81111561326257613262613d04565b6040519080825280601f01601f19166020018201604052801561328c576020820181803683370190505b5090505b8415612b1e576132a1600183614095565b91506132ae600a86613fda565b6132b990603061401d565b60f81b8183815181106132ce576132ce614050565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350613308600a8661413b565b9450613290565b6001600160a01b03831661336a5761336581600980546000838152600a60205260408120829055600182018355919091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0155565b61338d565b816001600160a01b0316836001600160a01b03161461338d5761338d8382613695565b6001600160a01b0382166133a457610ea281613732565b826001600160a01b0316826001600160a01b031614610ea257610ea282826137e1565b600f546040517f70a082310000000000000000000000000000000000000000000000000000000081523360048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015613429573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061344d9190613fee565b905090565b6040516bffffffffffffffffffffffff193360601b1660208201526000908190603401604051602081830303815290604052805190602001209050612b1e84848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600c549150849050613825565b6134d8838361383b565b6134e5600084848461354c565b610ea25760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b6064820152608401610b64565b60006001600160a01b0384163b1561368a57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061359090339089908890889060040161414f565b6020604051808303816000875af19250505080156135cb575060408051601f3d908101601f191682019092526135c89181019061418b565b60015b613670573d8080156135f9576040519150601f19603f3d011682016040523d82523d6000602084013e6135fe565b606091505b5080516136685760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b6064820152608401610b64565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612b1e565b506001949350505050565b600060016136a284611d43565b6136ac9190614095565b6000838152600860205260409020549091508082146136ff576001600160a01b03841660009081526007602090815260408083208584528252808320548484528184208190558352600890915290208190555b5060009182526008602090815260408084208490556001600160a01b039094168352600781528383209183525290812055565b60095460009061374490600190614095565b6000838152600a60205260408120546009805493945090928490811061376c5761376c614050565b90600052602060002001549050806009838154811061378d5761378d614050565b6000918252602080832090910192909255828152600a909152604080822084905585825281205560098054806137c5576137c56141a8565b6001900381819060005260206000200160009055905550505050565b60006137ec83611d43565b6001600160a01b039093166000908152600760209081526040808320868452825280832085905593825260089052919091209190915550565b6000826138328584613989565b14949350505050565b6001600160a01b0382166138915760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610b64565b6000818152600360205260409020546001600160a01b0316156138f65760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610b64565b6139026000838361330f565b6001600160a01b038216600090815260046020526040812080546001929061392b90849061401d565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600081815b8451811015611eb05760008582815181106139ab576139ab614050565b602002602001015190508083116139ed576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250613a1a565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080613a2581614035565b91505061398e565b828054613a3990613f8f565b90600052602060002090601f016020900481019282613a5b5760008555613aa1565b82601f10613a7457805160ff1916838001178555613aa1565b82800160010185558215613aa1579182015b82811115613aa1578251825591602001919060010190613a86565b50613aad929150613ab1565b5090565b5b80821115613aad5760008155600101613ab2565b600060208284031215613ad857600080fd5b5035919050565b6001600160e01b0319811681146126b957600080fd5b600060208284031215613b0757600080fd5b813561242d81613adf565b80356001600160a01b0381168114613b2957600080fd5b919050565b60008060008060808587031215613b4457600080fd5b613b4d85613b12565b9350613b5b60208601613b12565b9250613b6960408601613b12565b9150613b7760608601613b12565b905092959194509250565b60005b83811015613b9d578181015183820152602001613b85565b83811115611b985750506000910152565b60008151808452613bc6816020860160208601613b82565b601f01601f19169290920160200192915050565b60208152600061242d6020830184613bae565b60008060408385031215613c0057600080fd5b613c0983613b12565b946020939093013593505050565b600080600060608486031215613c2c57600080fd5b613c3584613b12565b9250613c4360208501613b12565b9150604084013590509250925092565b60008083601f840112613c6557600080fd5b50813567ffffffffffffffff811115613c7d57600080fd5b6020830191508360208260051b8501011115613c9857600080fd5b9250929050565b803560ff81168114613b2957600080fd5b600080600060408486031215613cc557600080fd5b833567ffffffffffffffff811115613cdc57600080fd5b613ce886828701613c53565b9094509250613cfb905060208501613c9f565b90509250925092565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115613d3557613d35613d04565b604051601f8501601f19908116603f01168101908282118183101715613d5d57613d5d613d04565b81604052809350858152868686011115613d7657600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215613da257600080fd5b813567ffffffffffffffff811115613db957600080fd5b8201601f81018413613dca57600080fd5b612b1e84823560208401613d1a565b600060208284031215613deb57600080fd5b61242d82613b12565b6020808252825182820181905260009190848201906040850190845b81811015613e2c57835183529284019291840191600101613e10565b50909695505050505050565b60008060208385031215613e4b57600080fd5b823567ffffffffffffffff811115613e6257600080fd5b613e6e85828601613c53565b90969095509350505050565b60008060408385031215613e8d57600080fd5b613e9683613b12565b915060208301358015158114613eab57600080fd5b809150509250929050565b60008060008060808587031215613ecc57600080fd5b613ed585613b12565b9350613ee360208601613b12565b925060408501359150606085013567ffffffffffffffff811115613f0657600080fd5b8501601f81018713613f1757600080fd5b613f2687823560208401613d1a565b91505092959194509250565b60008060408385031215613f4557600080fd5b613f4e83613b12565b9150613f5c60208401613c9f565b90509250929050565b60008060408385031215613f7857600080fd5b613f8183613b12565b9150613f5c60208401613b12565b600181811c90821680613fa357607f821691505b60208210811415611f4357634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601260045260246000fd5b600082613fe957613fe9613fc4565b500690565b60006020828403121561400057600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b6000821982111561403057614030614007565b500190565b600060001982141561404957614049614007565b5060010190565b634e487b7160e01b600052603260045260246000fd5b60008351614078818460208801613b82565b83519083019061408c818360208801613b82565b01949350505050565b6000828210156140a7576140a7614007565b500390565b600061ffff808416806140c1576140c1613fc4565b92169190910492915050565b600061ffff808316818516818304811182151516156140ee576140ee614007565b02949350505050565b600081600019048311821515161561411157614111614007565b500290565b600060ff821660ff84168060ff0382111561413357614133614007565b019392505050565b60008261414a5761414a613fc4565b500490565b60006001600160a01b038087168352808616602084015250836040830152608060608301526141816080830184613bae565b9695505050505050565b60006020828403121561419d57600080fd5b815161242d81613adf565b634e487b7160e01b600052603160045260246000fdfe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a164736f6c634300080c000a000000000000000000000000daf2760578f4bcc52b1f451b5b8b04d3dc49c9fb
Deployed Bytecode
0x6080604052600436106103755760003560e01c80637e79a565116101d1578063bc8893b411610102578063cef216e2116100a0578063e985e9c51161006f578063e985e9c514610a81578063f22c64bd14610aca578063f2fde38b14610ae0578063f85317c614610b0057600080fd5b8063cef216e214610a0c578063d78055dc14610a21578063e209e02f14610a41578063e3e184eb14610a6157600080fd5b8063c470db1c116100dc578063c470db1c14610986578063c87b56dd1461099c578063c97c6c49146109bc578063c9d87e69146109ec57600080fd5b8063bc8893b41461092c578063bfe1092814610946578063c010d2d21461096657600080fd5b80639d9fabec1161016f578063aa88ee6611610149578063aa88ee6614610842578063ab72e0bf146108cc578063b88d4fde146108ec578063bc30a6181461090c57600080fd5b80639d9fabec146107c0578063a22cb46514610802578063a34101ea1461082257600080fd5b80638a3ce0ab116101ab5780638a3ce0ab146107585780638da5cb5b1461076d578063925489a81461078b57806395d89b41146107ab57600080fd5b80637e79a565146106f65780638462151c14610716578063880846051461074357600080fd5b80633eee5eb8116102ab5780635c975abb11610249578063662ad59b11610223578063662ad59b1461068b5780636817c76c146106ab57806370a08231146106c1578063715018a6146106e157600080fd5b80635c975abb1461062c5780635f7966e11461064b5780636352211e1461066b57600080fd5b80634f6ccce7116102855780634f6ccce7146105ac57806351d8b423146105cc57806355f804b3146105ec57806359bad07c1461060c57600080fd5b80633eee5eb81461055857806342842e0e1461056b57806346ee89d61461058b57600080fd5b80630c1f1e9e1161031857806323b872dd116102f257806323b872dd146104e35780632f745c5914610503578063379607f5146105235780633ccfd60b1461054357600080fd5b80630c1f1e9e1461048557806313cd8fb0146104a457806318160ddd146104c457600080fd5b806306552ff31161035457806306552ff3146103eb57806306fdde031461040b578063081812fc1461042d578063095ea7b31461046557600080fd5b8062728e461461037a57806301ffc9a71461039c57806302ce5813146103d1575b600080fd5b34801561038657600080fd5b5061039a610395366004613ac6565b610b20565b005b3480156103a857600080fd5b506103bc6103b7366004613af5565b610b72565b60405190151581526020015b60405180910390f35b3480156103dd57600080fd5b50600b546103bc9060ff1681565b3480156103f757600080fd5b5061039a610406366004613b2e565b610bb6565b34801561041757600080fd5b50610420610c4e565b6040516103c89190613bda565b34801561043957600080fd5b5061044d610448366004613ac6565b610ce0565b6040516001600160a01b0390911681526020016103c8565b34801561047157600080fd5b5061039a610480366004613bed565b610d75565b34801561049157600080fd5b506018546103bc90610100900460ff1681565b3480156104b057600080fd5b5061039a6104bf366004613ac6565b610ea7565b3480156104d057600080fd5b506009545b6040519081526020016103c8565b3480156104ef57600080fd5b5061039a6104fe366004613c17565b61113f565b34801561050f57600080fd5b506104d561051e366004613bed565b6111c6565b34801561052f57600080fd5b5061039a61053e366004613ac6565b61126e565b34801561054f57600080fd5b5061039a6118da565b61039a610566366004613cb0565b611951565b34801561057757600080fd5b5061039a610586366004613c17565b611b9e565b34801561059757600080fd5b506018546103bc906301000000900460ff1681565b3480156105b857600080fd5b506104d56105c7366004613ac6565b611bb9565b3480156105d857600080fd5b5060115461044d906001600160a01b031681565b3480156105f857600080fd5b5061039a610607366004613d90565b611c5d565b34801561061857600080fd5b50600e5461044d906001600160a01b031681565b34801561063857600080fd5b50600054600160a01b900460ff166103bc565b34801561065757600080fd5b50600f5461044d906001600160a01b031681565b34801561067757600080fd5b5061044d610686366004613ac6565b611cb8565b34801561069757600080fd5b5060125461044d906001600160a01b031681565b3480156106b757600080fd5b506104d560195481565b3480156106cd57600080fd5b506104d56106dc366004613dd9565b611d43565b3480156106ed57600080fd5b5061039a611ddd565b34801561070257600080fd5b5060135461044d906001600160a01b031681565b34801561072257600080fd5b50610736610731366004613dd9565b611e31565b6040516103c89190613df4565b34801561074f57600080fd5b5061039a611f49565b34801561076457600080fd5b5061039a611fa5565b34801561077957600080fd5b506000546001600160a01b031661044d565b34801561079757600080fd5b5061039a6107a6366004613e38565b612060565b3480156107b757600080fd5b506104206120e9565b3480156107cc57600080fd5b506107f06107db366004613dd9565b60156020526000908152604090205460ff1681565b60405160ff90911681526020016103c8565b34801561080e57600080fd5b5061039a61081d366004613e7a565b6120f8565b34801561082e57600080fd5b5061039a61083d366004613dd9565b612103565b34801561084e57600080fd5b5061089a61085d366004613ac6565b60166020526000908152604090205460ff808216916101008104821691620100008204811691630100000081048216916401000000009091041685565b60408051951515865293151560208601529115159284019290925290151560608301521515608082015260a0016103c8565b3480156108d857600080fd5b5061039a6108e7366004613ac6565b61217f565b3480156108f857600080fd5b5061039a610907366004613eb6565b612259565b34801561091857600080fd5b5061039a610927366004613dd9565b6122e1565b34801561093857600080fd5b506018546103bc9060ff1681565b34801561095257600080fd5b5060145461044d906001600160a01b031681565b34801561097257600080fd5b506018546103bc9062010000900460ff1681565b34801561099257600080fd5b506104d561271081565b3480156109a857600080fd5b506104206109b7366004613ac6565b61234b565b3480156109c857600080fd5b506103bc6109d7366004613dd9565b60176020526000908152604090205460ff1681565b3480156109f857600080fd5b5060105461044d906001600160a01b031681565b348015610a1857600080fd5b5061039a612434565b348015610a2d57600080fd5b5061039a610a3c366004613f32565b612496565b348015610a4d57600080fd5b5061039a610a5c366004613dd9565b612509565b348015610a6d57600080fd5b5061039a610a7c366004613ac6565b612587565b348015610a8d57600080fd5b506103bc610a9c366004613f65565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b348015610ad657600080fd5b506104d5601a5481565b348015610aec57600080fd5b5061039a610afb366004613dd9565b6125ec565b348015610b0c57600080fd5b5061039a610b1b366004613ac6565b6126bc565b6000546001600160a01b03163314610b6d5760405162461bcd60e51b815260206004820181905260248201526000805160206141bf83398151915260448201526064015b60405180910390fd5b601955565b60006001600160e01b031982167f780e9d63000000000000000000000000000000000000000000000000000000001480610bb05750610bb082612926565b92915050565b6000546001600160a01b03163314610bfe5760405162461bcd60e51b815260206004820181905260248201526000805160206141bf8339815191526044820152606401610b64565b601480546001600160a01b039586166001600160a01b03199182161790915560108054948616948216949094179093556011805492851692841692909217909155600e8054919093169116179055565b606060018054610c5d90613f8f565b80601f0160208091040260200160405190810160405280929190818152602001828054610c8990613f8f565b8015610cd65780601f10610cab57610100808354040283529160200191610cd6565b820191906000526020600020905b815481529060010190602001808311610cb957829003601f168201915b5050505050905090565b6000818152600360205260408120546001600160a01b0316610d595760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b64565b506000908152600560205260409020546001600160a01b031690565b6000610d8082611cb8565b9050806001600160a01b0316836001600160a01b03161415610e0a5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610b64565b336001600160a01b0382161480610e265750610e268133610a9c565b610e985760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610b64565b610ea283836129c1565b505050565b600054600160a01b900460ff1615610ef45760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b64565b8080610eff60095490565b1015610f4d5760405162461bcd60e51b815260206004820152601460248201527f746f6b656e5f646f65735f6e6f745f65786973740000000000000000000000006044820152606401610b64565b33610f5782611cb8565b6001600160a01b031614610fad5760405162461bcd60e51b815260206004820152601360248201527f63616c6c65725f646f65735f6e6f745f6f776e000000000000000000000000006044820152606401610b64565b60185462010000900460ff166110055760405162461bcd60e51b815260206004820152601360248201527f706978656c5f6e6f745f636c61696d61626c65000000000000000000000000006044820152606401610b64565b6012546001600160a01b031661105d5760405162461bcd60e51b815260206004820152601360248201527f616464726573735f6e6f745f646566696e6564000000000000000000000000006044820152606401610b64565b600082815260166020526040902054610100900460ff16156110c15760405162461bcd60e51b815260206004820152601560248201527f706978656c5f616c72656164795f636c61696d656400000000000000000000006044820152606401610b64565b60008281526016602052604090819020805461ff00191661010017905560125490516304190d0560e31b81523360048201526001600160a01b03909116906320c86828906024015b600060405180830381600087803b15801561112357600080fd5b505af1158015611137573d6000803e3d6000fd5b505050505050565b6111493382612a2f565b6111bb5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610b64565b610ea2838383612b26565b60006111d183611d43565b82106112455760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e64730000000000000000000000000000000000000000006064820152608401610b64565b506001600160a01b03919091166000908152600760209081526040808320938352929052205490565b600054600160a01b900460ff16156112bb5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b64565b80806112c660095490565b10156113145760405162461bcd60e51b815260206004820152601460248201527f746f6b656e5f646f65735f6e6f745f65786973740000000000000000000000006044820152606401610b64565b3361131e82611cb8565b6001600160a01b0316146113745760405162461bcd60e51b815260206004820152601360248201527f63616c6c65725f646f65735f6e6f745f6f776e000000000000000000000000006044820152606401610b64565b60008281526016602052604090205460ff1680156113a757506000828152601660205260409020546301000000900460ff165b80156113c95750600082815260166020526040902054640100000000900460ff165b156114165760405162461bcd60e51b815260206004820152601360248201527f6b65795f616c72656164795f636c61696d6564000000000000000000000000006044820152606401610b64565b6010546001600160a01b031661146e5760405162461bcd60e51b815260206004820152601a60248201527f6369746965735f616464726573735f6e6f745f646566696e65640000000000006044820152606401610b64565b6011546001600160a01b03166114c65760405162461bcd60e51b815260206004820152601a60248201527f68756d616e735f616464726573735f6e6f745f646566696e65640000000000006044820152606401610b64565b600e546001600160a01b031661151e5760405162461bcd60e51b815260206004820152601a60248201527f627261696e735f616464726573735f6e6f745f646566696e65640000000000006044820152606401610b64565b60008281526016602052604090205460ff16158015611543575061154382601e612cfe565b156115c45760008281526016602052604090819020805460ff1916600117905560105490516304190d0560e31b81523360048201526001600160a01b03909116906320c8682890602401600060405180830381600087803b1580156115a757600080fd5b505af11580156115bb573d6000803e3d6000fd5b505050506115de565b6000828152601660205260409020805460ff191660011790555b6000828152601660205260409020546301000000900460ff166116ad5761160682600a612cfe565b1561168d5760008281526016602052604090819020805463ff0000001916630100000017905560115490516304190d0560e31b81523360048201526001600160a01b03909116906320c8682890602401600060405180830381600087803b15801561167057600080fd5b505af1158015611684573d6000803e3d6000fd5b505050506116ad565b6000828152601660205260409020805463ff000000191663010000001790555b600082815260166020526040902054640100000000900460ff166118d657601a5460408051426020808301919091526bffffffffffffffffffffffff1941606090811b82168486015244605485015233901b16607483015260888083018790528351808403909101815260a89092019092528051910120600091906117329190613fda565b9050601460009054906101000a90046001600160a01b03166001600160a01b031663604e53bb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611787573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ab9190613fee565b81111561182c57601460009054906101000a90046001600160a01b03166001600160a01b031663604e53bb6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611805573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118299190613fee565b90505b6000838152601660205260409020805464ff0000000019166401000000001790558061185757505050565b6014546040517ffdd59fb0000000000000000000000000000000000000000000000000000000008152336004820152602481018390526001600160a01b039091169063fdd59fb090604401600060405180830381600087803b1580156118bc57600080fd5b505af11580156118d0573d6000803e3d6000fd5b50505050505b5050565b6000546001600160a01b031633146119225760405162461bcd60e51b815260206004820181905260248201526000805160206141bf8339815191526044820152606401610b64565b6040514790339082156108fc029083906000818181858888f193505050501580156118d6573d6000803e3d6000fd5b600054600160a01b900460ff161561199e5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b64565b60008160ff16116119f15760405162461bcd60e51b815260206004820152600b60248201527f616d6f756e745f7a65726f0000000000000000000000000000000000000000006044820152606401610b64565b6127108160ff16611a0160095490565b611a0b919061401d565b1115611a595760405162461bcd60e51b815260206004820152600f60248201527f6d61785f6b6579735f6d696e74656400000000000000000000000000000000006044820152606401610b64565b601854610100900460ff1680611a715750600b5460ff165b80611a7e575060185460ff165b611aca5760405162461bcd60e51b815260206004820152600e60248201527f6e6f5f6163746976655f73616c650000000000000000000000000000000000006044820152606401610b64565b600b5460ff16611b2f57611ae08160ff16612d87565b341015611b2f5760405162461bcd60e51b815260206004820152601060248201527f6e6f745f656e6f7567685f6574686572000000000000000000000000000000006044820152606401610b64565b601854610100900460ff1615611b4857610ea281612d97565b600b5460ff1615611b5d57610ea28383612edf565b60185460ff1615610ea25760005b8160ff16811015611b9857611b8833611b8360095490565b613017565b611b9181614035565b9050611b6b565b50505050565b610ea283838360405180602001604052806000815250612259565b6000611bc460095490565b8210611c385760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e647300000000000000000000000000000000000000006064820152608401610b64565b60098281548110611c4b57611c4b614050565b90600052602060002001549050919050565b6000546001600160a01b03163314611ca55760405162461bcd60e51b815260206004820181905260248201526000805160206141bf8339815191526044820152606401610b64565b80516118d690600d906020840190613a2d565b6000818152600360205260408120546001600160a01b031680610bb05760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610b64565b60006001600160a01b038216611dc15760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610b64565b506001600160a01b031660009081526004602052604090205490565b6000546001600160a01b03163314611e255760405162461bcd60e51b815260206004820181905260248201526000805160206141bf8339815191526044820152606401610b64565b611e2f6000613031565b565b60606001600160a01b038216611e895760405162461bcd60e51b815260206004820152601260248201527f6f776e65725f7a65726f5f6164647265737300000000000000000000000000006044820152606401610b64565b6000611e9483611d43565b905060008111611eb85760408051600080825260208201909252905b509392505050565b60008167ffffffffffffffff811115611ed357611ed3613d04565b604051908082528060200260200182016040528015611efc578160200160208202803683370190505b50905060005b82811015611eb057611f1485826111c6565b828281518110611f2657611f26614050565b602090810291909101015280611f3b81614035565b915050611f02565b50919050565b6000546001600160a01b03163314611f915760405162461bcd60e51b815260206004820181905260248201526000805160206141bf8339815191526044820152606401610b64565b6018805460ff19811660ff90911615179055565b6000546001600160a01b03163314611fed5760405162461bcd60e51b815260206004820181905260248201526000805160206141bf8339815191526044820152606401610b64565b601854610100900460ff16156120455760405162461bcd60e51b815260206004820152601060248201527f77686974656c6973745f616374697665000000000000000000000000000000006044820152606401610b64565b60188054600b805460ff1916905561ffff1916610100179055565b600054600160a01b900460ff16156120ad5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b64565b60005b81811015610ea2576120d98383838181106120cd576120cd614050565b9050602002013561126e565b6120e281614035565b90506120b0565b606060028054610c5d90613f8f565b6118d6338383613081565b6000546001600160a01b0316331461214b5760405162461bcd60e51b815260206004820181905260248201526000805160206141bf8339815191526044820152606401610b64565b6018805462ff0000191662010000179055601280546001600160a01b039092166001600160a01b0319909216919091179055565b6000546001600160a01b031633146121c75760405162461bcd60e51b815260206004820181905260248201526000805160206141bf8339815191526044820152606401610b64565b806122145760405162461bcd60e51b815260206004820152601360248201527f696e76616c69645f6d65726b6c655f726f6f74000000000000000000000000006044820152606401610b64565b600c80549082905560408051828152602081018490527fdcb1e348ba8cda63787073d01657a7f6e113519a1ea18699595731e5a31bedf2910160405180910390a15050565b6122633383612a2f565b6122d55760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610b64565b611b9884848484613150565b6000546001600160a01b031633146123295760405162461bcd60e51b815260206004820181905260248201526000805160206141bf8339815191526044820152606401610b64565b601480546001600160a01b0319166001600160a01b0392909216919091179055565b6000818152600360205260409020546060906001600160a01b03166123d85760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006064820152608401610b64565b60006123e26131ce565b90506000815111612402576040518060200160405280600081525061242d565b8061240c846131dd565b60405160200161241d929190614066565b6040516020818303038152906040525b9392505050565b6000546001600160a01b0316331461247c5760405162461bcd60e51b815260206004820181905260248201526000805160206141bf8339815191526044820152606401610b64565b6018805461ffff19169055600b805460ff19166001179055565b6000546001600160a01b031633146124de5760405162461bcd60e51b815260206004820181905260248201526000805160206141bf8339815191526044820152606401610b64565b60005b8160ff16811015610ea2576124f983611b8360095490565b61250281614035565b90506124e1565b6000546001600160a01b031633146125515760405162461bcd60e51b815260206004820181905260248201526000805160206141bf8339815191526044820152606401610b64565b6018805463ff00000019166301000000179055601380546001600160a01b039092166001600160a01b0319909216919091179055565b6000546001600160a01b031633146125cf5760405162461bcd60e51b815260206004820181905260248201526000805160206141bf8339815191526044820152606401610b64565b601955600b805460ff191690556018805461ffff19166001179055565b6000546001600160a01b031633146126345760405162461bcd60e51b815260206004820181905260248201526000805160206141bf8339815191526044820152606401610b64565b6001600160a01b0381166126b05760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610b64565b6126b981613031565b50565b600054600160a01b900460ff16156127095760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b64565b808061271460095490565b10156127625760405162461bcd60e51b815260206004820152601460248201527f746f6b656e5f646f65735f6e6f745f65786973740000000000000000000000006044820152606401610b64565b3361276c82611cb8565b6001600160a01b0316146127c25760405162461bcd60e51b815260206004820152601360248201527f63616c6c65725f646f65735f6e6f745f6f776e000000000000000000000000006044820152606401610b64565b6018546301000000900460ff1661281b5760405162461bcd60e51b815260206004820152601060248201527f33645f6e6f745f636c61696d61626c65000000000000000000000000000000006044820152606401610b64565b6013546001600160a01b03166128735760405162461bcd60e51b815260206004820152601360248201527f616464726573735f6e6f745f646566696e6564000000000000000000000000006044820152606401610b64565b60008281526016602052604090205462010000900460ff16156128d85760405162461bcd60e51b815260206004820152601260248201527f33445f616c72656164795f636c61696d656400000000000000000000000000006044820152606401610b64565b60008281526016602052604090819020805462ff000019166201000017905560135490516304190d0560e31b81523360048201526001600160a01b03909116906320c8682890602401611109565b60006001600160e01b031982167f80ac58cd00000000000000000000000000000000000000000000000000000000148061298957506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80610bb057507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b0319831614610bb0565b600081815260056020526040902080546001600160a01b0319166001600160a01b03841690811790915581906129f682611cb8565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600360205260408120546001600160a01b0316612aa85760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b64565b6000612ab383611cb8565b9050806001600160a01b0316846001600160a01b03161480612aee5750836001600160a01b0316612ae384610ce0565b6001600160a01b0316145b80612b1e57506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316612b3982611cb8565b6001600160a01b031614612bb55760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e00000000000000000000000000000000000000000000006064820152608401610b64565b6001600160a01b038216612c305760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610b64565b612c3b83838361330f565b612c466000826129c1565b6001600160a01b0383166000908152600460205260408120805460019290612c6f908490614095565b90915550506001600160a01b0382166000908152600460205260408120805460019290612c9d90849061401d565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60008082612d0f606461ffff6140ac565b612d1991906140cd565b60408051426020808301919091526bffffffffffffffffffffffff1941606090811b82168486015244605485015233901b16607483015260888083018990528351808403909101815260a8909201909252805191012061ffff919091169150819061ffff1610949350505050565b600060195482610bb091906140f7565b600054600160a01b900460ff1615612de45760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b64565b6000612dee6133c7565b3360009081526015602052604090205490915060ff908116908290612e159085168361401d565b1115612e635760405162461bcd60e51b815260206004820152601560248201527f657863656564735f6f776e65645f7a6f6d6269657300000000000000000000006044820152606401610b64565b6000612e6e60095490565b905060005b8460ff16811015612ed857612e8c33611b83838561401d565b336000908152601560205260408120805460019290612eaf90849060ff16614116565b92506101000a81548160ff021916908360ff16021790555080612ed190614035565b9050612e73565b5050505050565b600054600160a01b900460ff1615612f2c5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610b64565b81816000612f3a8383613452565b905080612f895760405162461bcd60e51b815260206004820152600f60248201527f6e6f745f77686974656c697374656400000000000000000000000000000000006044820152606401610b64565b3360009081526017602052604090205460ff1615612fe95760405162461bcd60e51b815260206004820152600f60248201527f616c72656164795f636c61696d656400000000000000000000000000000000006044820152606401610b64565b612ff633611b8360095490565b5050336000908152601760205260409020805460ff19166001179055505050565b6118d68282604051806020016040528060008152506134ce565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b816001600160a01b0316836001600160a01b031614156130e35760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610b64565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61315b848484612b26565b6131678484848461354c565b611b985760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b6064820152608401610b64565b6060600d8054610c5d90613f8f565b60608161321d57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115613247578061323181614035565b91506132409050600a8361413b565b9150613221565b60008167ffffffffffffffff81111561326257613262613d04565b6040519080825280601f01601f19166020018201604052801561328c576020820181803683370190505b5090505b8415612b1e576132a1600183614095565b91506132ae600a86613fda565b6132b990603061401d565b60f81b8183815181106132ce576132ce614050565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350613308600a8661413b565b9450613290565b6001600160a01b03831661336a5761336581600980546000838152600a60205260408120829055600182018355919091527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0155565b61338d565b816001600160a01b0316836001600160a01b03161461338d5761338d8382613695565b6001600160a01b0382166133a457610ea281613732565b826001600160a01b0316826001600160a01b031614610ea257610ea282826137e1565b600f546040517f70a082310000000000000000000000000000000000000000000000000000000081523360048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015613429573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061344d9190613fee565b905090565b6040516bffffffffffffffffffffffff193360601b1660208201526000908190603401604051602081830303815290604052805190602001209050612b1e84848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600c549150849050613825565b6134d8838361383b565b6134e5600084848461354c565b610ea25760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b6064820152608401610b64565b60006001600160a01b0384163b1561368a57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061359090339089908890889060040161414f565b6020604051808303816000875af19250505080156135cb575060408051601f3d908101601f191682019092526135c89181019061418b565b60015b613670573d8080156135f9576040519150601f19603f3d011682016040523d82523d6000602084013e6135fe565b606091505b5080516136685760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b6064820152608401610b64565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612b1e565b506001949350505050565b600060016136a284611d43565b6136ac9190614095565b6000838152600860205260409020549091508082146136ff576001600160a01b03841660009081526007602090815260408083208584528252808320548484528184208190558352600890915290208190555b5060009182526008602090815260408084208490556001600160a01b039094168352600781528383209183525290812055565b60095460009061374490600190614095565b6000838152600a60205260408120546009805493945090928490811061376c5761376c614050565b90600052602060002001549050806009838154811061378d5761378d614050565b6000918252602080832090910192909255828152600a909152604080822084905585825281205560098054806137c5576137c56141a8565b6001900381819060005260206000200160009055905550505050565b60006137ec83611d43565b6001600160a01b039093166000908152600760209081526040808320868452825280832085905593825260089052919091209190915550565b6000826138328584613989565b14949350505050565b6001600160a01b0382166138915760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610b64565b6000818152600360205260409020546001600160a01b0316156138f65760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610b64565b6139026000838361330f565b6001600160a01b038216600090815260046020526040812080546001929061392b90849061401d565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600081815b8451811015611eb05760008582815181106139ab576139ab614050565b602002602001015190508083116139ed576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250613a1a565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080613a2581614035565b91505061398e565b828054613a3990613f8f565b90600052602060002090601f016020900481019282613a5b5760008555613aa1565b82601f10613a7457805160ff1916838001178555613aa1565b82800160010185558215613aa1579182015b82811115613aa1578251825591602001919060010190613a86565b50613aad929150613ab1565b5090565b5b80821115613aad5760008155600101613ab2565b600060208284031215613ad857600080fd5b5035919050565b6001600160e01b0319811681146126b957600080fd5b600060208284031215613b0757600080fd5b813561242d81613adf565b80356001600160a01b0381168114613b2957600080fd5b919050565b60008060008060808587031215613b4457600080fd5b613b4d85613b12565b9350613b5b60208601613b12565b9250613b6960408601613b12565b9150613b7760608601613b12565b905092959194509250565b60005b83811015613b9d578181015183820152602001613b85565b83811115611b985750506000910152565b60008151808452613bc6816020860160208601613b82565b601f01601f19169290920160200192915050565b60208152600061242d6020830184613bae565b60008060408385031215613c0057600080fd5b613c0983613b12565b946020939093013593505050565b600080600060608486031215613c2c57600080fd5b613c3584613b12565b9250613c4360208501613b12565b9150604084013590509250925092565b60008083601f840112613c6557600080fd5b50813567ffffffffffffffff811115613c7d57600080fd5b6020830191508360208260051b8501011115613c9857600080fd5b9250929050565b803560ff81168114613b2957600080fd5b600080600060408486031215613cc557600080fd5b833567ffffffffffffffff811115613cdc57600080fd5b613ce886828701613c53565b9094509250613cfb905060208501613c9f565b90509250925092565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff80841115613d3557613d35613d04565b604051601f8501601f19908116603f01168101908282118183101715613d5d57613d5d613d04565b81604052809350858152868686011115613d7657600080fd5b858560208301376000602087830101525050509392505050565b600060208284031215613da257600080fd5b813567ffffffffffffffff811115613db957600080fd5b8201601f81018413613dca57600080fd5b612b1e84823560208401613d1a565b600060208284031215613deb57600080fd5b61242d82613b12565b6020808252825182820181905260009190848201906040850190845b81811015613e2c57835183529284019291840191600101613e10565b50909695505050505050565b60008060208385031215613e4b57600080fd5b823567ffffffffffffffff811115613e6257600080fd5b613e6e85828601613c53565b90969095509350505050565b60008060408385031215613e8d57600080fd5b613e9683613b12565b915060208301358015158114613eab57600080fd5b809150509250929050565b60008060008060808587031215613ecc57600080fd5b613ed585613b12565b9350613ee360208601613b12565b925060408501359150606085013567ffffffffffffffff811115613f0657600080fd5b8501601f81018713613f1757600080fd5b613f2687823560208401613d1a565b91505092959194509250565b60008060408385031215613f4557600080fd5b613f4e83613b12565b9150613f5c60208401613c9f565b90509250929050565b60008060408385031215613f7857600080fd5b613f8183613b12565b9150613f5c60208401613b12565b600181811c90821680613fa357607f821691505b60208210811415611f4357634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052601260045260246000fd5b600082613fe957613fe9613fc4565b500690565b60006020828403121561400057600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b6000821982111561403057614030614007565b500190565b600060001982141561404957614049614007565b5060010190565b634e487b7160e01b600052603260045260246000fd5b60008351614078818460208801613b82565b83519083019061408c818360208801613b82565b01949350505050565b6000828210156140a7576140a7614007565b500390565b600061ffff808416806140c1576140c1613fc4565b92169190910492915050565b600061ffff808316818516818304811182151516156140ee576140ee614007565b02949350505050565b600081600019048311821515161561411157614111614007565b500290565b600060ff821660ff84168060ff0382111561413357614133614007565b019392505050565b60008261414a5761414a613fc4565b500490565b60006001600160a01b038087168352808616602084015250836040830152608060608301526141816080830184613bae565b9695505050505050565b60006020828403121561419d57600080fd5b815161242d81613adf565b634e487b7160e01b600052603160045260246000fdfe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a164736f6c634300080c000a
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000daf2760578f4bcc52b1f451b5b8b04d3dc49c9fb
-----Decoded View---------------
Arg [0] : genesis (address): 0xDAF2760578f4bCc52B1F451b5b8b04d3Dc49c9FB
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000daf2760578f4bcc52b1f451b5b8b04d3dc49c9fb
Deployed Bytecode Sourcemap
569:9089:20:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7664:105;;;;;;;;;;-1:-1:-1;7664:105:20;;;;;:::i;:::-;;:::i;:::-;;990:222:8;;;;;;;;;;-1:-1:-1;990:222:8;;;;;:::i;:::-;;:::i;:::-;;;796:14:22;;789:22;771:41;;759:2;744:18;990:222:8;;;;;;;;227:27:21;;;;;;;;;;-1:-1:-1;227:27:21;;;;;;;;1742:290:20;;;;;;;;;;-1:-1:-1;1742:290:20;;;;;:::i;:::-;;:::i;2473:98:5:-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;3984:217::-;;;;;;;;;;-1:-1:-1;3984:217:5;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2353:55:22;;;2335:74;;2323:2;2308:18;3984:217:5;2189:226:22;3522:401:5;;;;;;;;;;-1:-1:-1;3522:401:5;;;;;:::i;:::-;;:::i;1302:33:20:-;;;;;;;;;;-1:-1:-1;1302:33:20;;;;;;;;;;;4409:384;;;;;;;;;;-1:-1:-1;4409:384:20;;;;;:::i;:::-;;:::i;1615:111:8:-;;;;;;;;;;-1:-1:-1;1702:10:8;:17;1615:111;;;2825:25:22;;;2813:2;2798:18;1615:111:8;2679:177:22;4711:330:5;;;;;;;;;;-1:-1:-1;4711:330:5;;;;;:::i;:::-;;:::i;1291:253:8:-;;;;;;;;;;-1:-1:-1;1291:253:8;;;;;:::i;:::-;;:::i;2221:1492:20:-;;;;;;;;;;-1:-1:-1;2221:1492:20;;;;;:::i;:::-;;:::i;9310:142::-;;;;;;;;;;;;;:::i;4801:759::-;;;;;;:::i;:::-;;:::i;5107:179:5:-;;;;;;;;;;-1:-1:-1;5107:179:5;;;;;:::i;:::-;;:::i;1376:27:20:-;;;;;;;;;;-1:-1:-1;1376:27:20;;;;;;;;;;;1798:230:8;;;;;;;;;;-1:-1:-1;1798:230:8;;;;;:::i;:::-;;:::i;944:27:20:-;;;;;;;;;;-1:-1:-1;944:27:20;;;;-1:-1:-1;;;;;944:27:20;;;8494:90;;;;;;;;;;-1:-1:-1;8494:90:20;;;;;:::i;:::-;;:::i;854:20::-;;;;;;;;;;-1:-1:-1;854:20:20;;;;-1:-1:-1;;;;;854:20:20;;;1098:84:1;;;;;;;;;;-1:-1:-1;1145:4:1;1168:7;-1:-1:-1;;;1168:7:1;;;;1098:84;;881:22:20;;;;;;;;;;-1:-1:-1;881:22:20;;;;-1:-1:-1;;;;;881:22:20;;;2176:235:5;;;;;;;;;;-1:-1:-1;2176:235:5;;;;;:::i;:::-;;:::i;978:27:20:-;;;;;;;;;;-1:-1:-1;978:27:20;;;;-1:-1:-1;;;;;978:27:20;;;1412:24;;;;;;;;;;;;;;;;1914:205:5;;;;;;;;;;-1:-1:-1;1914:205:5;;;;;:::i;:::-;;:::i;1668:101:0:-;;;;;;;;;;;;;:::i;1012:27:20:-;;;;;;;;;;-1:-1:-1;1012:27:20;;;;-1:-1:-1;;;;;1012:27:20;;;8700:602;;;;;;;;;;-1:-1:-1;8700:602:20;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;7415:100::-;;;;;;;;;;;;;:::i;7174:233::-;;;;;;;;;;;;;:::i;1036:85:0:-;;;;;;;;;;-1:-1:-1;1082:7:0;1108:6;-1:-1:-1;;;;;1108:6:0;1036:85;;2040:173:20;;;;;;;;;;-1:-1:-1;2040:173:20;;;;;:::i;:::-;;:::i;2635:102:5:-;;;;;;;;;;;;;:::i;1094:52:20:-;;;;;;;;;;-1:-1:-1;1094:52:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;7708:4:22;7696:17;;;7678:36;;7666:2;7651:18;1094:52:20;7536:184:22;4268:153:5;;;;;;;;;;-1:-1:-1;4268:153:5;;;;;:::i;:::-;;:::i;3872:144:20:-;;;;;;;;;;-1:-1:-1;3872:144:20;;;;;:::i;:::-;;:::i;1153:45::-;;;;;;;;;;-1:-1:-1;1153:45:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8331:14:22;;8324:22;8306:41;;8390:14;;8383:22;8378:2;8363:18;;8356:50;8449:14;;8442:22;8422:18;;;8415:50;;;;8508:14;;8501:22;8496:2;8481:18;;8474:50;8568:14;8561:22;8555:3;8540:19;;8533:51;8293:3;8278:19;1153:45:20;8077:513:22;5741:290:20;;;;;;;;;;-1:-1:-1;5741:290:20;;;;;:::i;:::-;;:::i;5352:320:5:-;;;;;;;;;;-1:-1:-1;5352:320:5;;;;;:::i;:::-;;:::i;7523:133:20:-;;;;;;;;;;-1:-1:-1;7523:133:20;;;;;:::i;:::-;;:::i;1267:28::-;;;;;;;;;;-1:-1:-1;1267:28:20;;;;;;;;1048:37;;;;;;;;;;-1:-1:-1;1048:37:20;;;;-1:-1:-1;;;;;1048:37:20;;;1342:27;;;;;;;;;;-1:-1:-1;1342:27:20;;;;;;;;;;;1490:40;;;;;;;;;;;;1525:5;1490:40;;2803:329:5;;;;;;;;;;-1:-1:-1;2803:329:5;;;;;:::i;:::-;;:::i;1205:53:20:-;;;;;;;;;;-1:-1:-1;1205:53:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;910:27;;;;;;;;;;-1:-1:-1;910:27:20;;;;-1:-1:-1;;;;;910:27:20;;;6782:164;;;;;;;;;;;;;:::i;5568:165::-;;;;;;;;;;-1:-1:-1;5568:165:20;;;;;:::i;:::-;;:::i;3721:143::-;;;;;;;;;;-1:-1:-1;3721:143:20;;;;;:::i;:::-;;:::i;6954:212::-;;;;;;;;;;-1:-1:-1;6954:212:20;;;;;:::i;:::-;;:::i;4487:162:5:-;;;;;;;;;;-1:-1:-1;4487:162:5;;;;;:::i;:::-;-1:-1:-1;;;;;4607:25:5;;;4584:4;4607:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;4487:162;1443:38:20;;;;;;;;;;;;;;;;1918:198:0;;;;;;;;;;-1:-1:-1;1918:198:0;;;;;:::i;:::-;;:::i;4024:377:20:-;;;;;;;;;;-1:-1:-1;4024:377:20;;;;;:::i;:::-;;:::i;7664:105::-;1082:7:0;1108:6;-1:-1:-1;;;;;1108:6:0;719:10:12;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;10438:2:22;1240:68:0;;;10420:21:22;;;10457:18;;;10450:30;-1:-1:-1;;;;;;;;;;;10496:18:22;;;10489:62;10568:18;;1240:68:0;;;;;;;;;7739:9:20::1;:22:::0;7664:105::o;990:222:8:-;1092:4;-1:-1:-1;;;;;;1115:50:8;;1130:35;1115:50;;:90;;;1169:36;1193:11;1169:23;:36::i;:::-;1108:97;990:222;-1:-1:-1;;990:222:8:o;1742:290:20:-;1082:7:0;1108:6;-1:-1:-1;;;;;1108:6:0;719:10:12;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;10438:2:22;1240:68:0;;;10420:21:22;;;10457:18;;;10450:30;-1:-1:-1;;;;;;;;;;;10496:18:22;;;10489:62;10568:18;;1240:68:0;10236:356:22;1240:68:0;1859:11:20::1;:46:::0;;-1:-1:-1;;;;;1859:46:20;;::::1;-1:-1:-1::0;;;;;;1859:46:20;;::::1;;::::0;;;1916:6:::1;:31:::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;1958:6:::1;:31:::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;2000:6:::1;:24:::0;;;;;::::1;::::0;::::1;;::::0;;1742:290::o;2473:98:5:-;2527:13;2559:5;2552:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2473:98;:::o;3984:217::-;4060:7;7232:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7232:16:5;4079:73;;;;-1:-1:-1;;;4079:73:5;;11241:2:22;4079:73:5;;;11223:21:22;11280:2;11260:18;;;11253:30;11319:34;11299:18;;;11292:62;-1:-1:-1;;;11370:18:22;;;11363:42;11422:19;;4079:73:5;11039:408:22;4079:73:5;-1:-1:-1;4170:24:5;;;;:15;:24;;;;;;-1:-1:-1;;;;;4170:24:5;;3984:217::o;3522:401::-;3602:13;3618:23;3633:7;3618:14;:23::i;:::-;3602:39;;3665:5;-1:-1:-1;;;;;3659:11:5;:2;-1:-1:-1;;;;;3659:11:5;;;3651:57;;;;-1:-1:-1;;;3651:57:5;;11654:2:22;3651:57:5;;;11636:21:22;11693:2;11673:18;;;11666:30;11732:34;11712:18;;;11705:62;11803:3;11783:18;;;11776:31;11824:19;;3651:57:5;11452:397:22;3651:57:5;719:10:12;-1:-1:-1;;;;;3740:21:5;;;;:62;;-1:-1:-1;3765:37:5;3782:5;719:10:12;4487:162:5;:::i;3765:37::-;3719:165;;;;-1:-1:-1;;;3719:165:5;;12056:2:22;3719:165:5;;;12038:21:22;12095:2;12075:18;;;12068:30;12134:34;12114:18;;;12107:62;12205:26;12185:18;;;12178:54;12249:19;;3719:165:5;11854:420:22;3719:165:5;3895:21;3904:2;3908:7;3895:8;:21::i;:::-;3592:331;3522:401;;:::o;4409:384:20:-;1145:4:1;1168:7;-1:-1:-1;;;1168:7:1;;;;1411:9;1403:38;;;;-1:-1:-1;;;1403:38:1;;12481:2:22;1403:38:1;;;12463:21:22;12520:2;12500:18;;;12493:30;-1:-1:-1;;;12539:18:22;;;12532:46;12595:18;;1403:38:1;12279:340:22;1403:38:1;4477:7:20::1;9530;9513:13;1702:10:8::0;:17;;1615:111;9513:13:20::1;:24;;9505:57;;;::::0;-1:-1:-1;;;9505:57:20;;12826:2:22;9505:57:20::1;::::0;::::1;12808:21:22::0;12865:2;12845:18;;;12838:30;12904:22;12884:18;;;12877:50;12944:18;;9505:57:20::1;12624:344:22::0;9505:57:20::1;9601:10;9581:16;9589:7:::0;9581::::1;:16::i;:::-;-1:-1:-1::0;;;;;9581:30:20::1;;9573:62;;;::::0;-1:-1:-1;;;9573:62:20;;13175:2:22;9573:62:20::1;::::0;::::1;13157:21:22::0;13214:2;13194:18;;;13187:30;13253:21;13233:18;;;13226:49;13292:18;;9573:62:20::1;12973:343:22::0;9573:62:20::1;4505:15:::2;::::0;;;::::2;;;4497:47;;;::::0;-1:-1:-1;;;4497:47:20;;13523:2:22;4497:47:20::2;::::0;::::2;13505:21:22::0;13562:2;13542:18;;;13535:30;13601:21;13581:18;;;13574:49;13640:18;;4497:47:20::2;13321:343:22::0;4497:47:20::2;4571:6;::::0;-1:-1:-1;;;;;4571:6:20::2;4555:63;;;::::0;-1:-1:-1;;;4555:63:20;;13871:2:22;4555:63:20::2;::::0;::::2;13853:21:22::0;13910:2;13890:18;;;13883:30;13949:21;13929:18;;;13922:49;13988:18;;4555:63:20::2;13669:343:22::0;4555:63:20::2;4638:18;::::0;;;:9:::2;:18;::::0;;;;:31;::::2;::::0;::::2;;;4637:32;4629:66;;;::::0;-1:-1:-1;;;4629:66:20;;14219:2:22;4629:66:20::2;::::0;::::2;14201:21:22::0;14258:2;14238:18;;;14231:30;14297:23;14277:18;;;14270:51;14338:18;;4629:66:20::2;14017:345:22::0;4629:66:20::2;4706:18;::::0;;;:9:::2;:18;::::0;;;;;;:38;;-1:-1:-1;;4706:38:20::2;;;::::0;;4755:6:::2;::::0;:30;;-1:-1:-1;;;4755:30:20;;4774:10:::2;4755:30;::::0;::::2;2335:74:22::0;-1:-1:-1;;;;;4755:6:20;;::::2;::::0;:18:::2;::::0;2308::22;;4755:30:20::2;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;1451:1:1::1;4409:384:20::0;:::o;4711:330:5:-;4900:41;719:10:12;4933:7:5;4900:18;:41::i;:::-;4892:103;;;;-1:-1:-1;;;4892:103:5;;14569:2:22;4892:103:5;;;14551:21:22;14608:2;14588:18;;;14581:30;14647:34;14627:18;;;14620:62;14718:19;14698:18;;;14691:47;14755:19;;4892:103:5;14367:413:22;4892:103:5;5006:28;5016:4;5022:2;5026:7;5006:9;:28::i;1291:253:8:-;1388:7;1423:23;1440:5;1423:16;:23::i;:::-;1415:5;:31;1407:87;;;;-1:-1:-1;;;1407:87:8;;14987:2:22;1407:87:8;;;14969:21:22;15026:2;15006:18;;;14999:30;15065:34;15045:18;;;15038:62;15136:13;15116:18;;;15109:41;15167:19;;1407:87:8;14785:407:22;1407:87:8;-1:-1:-1;;;;;;1511:19:8;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;1291:253::o;2221:1492:20:-;1145:4:1;1168:7;-1:-1:-1;;;1168:7:1;;;;1411:9;1403:38;;;;-1:-1:-1;;;1403:38:1;;12481:2:22;1403:38:1;;;12463:21:22;12520:2;12500:18;;;12493:30;-1:-1:-1;;;12539:18:22;;;12532:46;12595:18;;1403:38:1;12279:340:22;1403:38:1;2282:7:20::1;9530;9513:13;1702:10:8::0;:17;;1615:111;9513:13:20::1;:24;;9505:57;;;::::0;-1:-1:-1;;;9505:57:20;;12826:2:22;9505:57:20::1;::::0;::::1;12808:21:22::0;12865:2;12845:18;;;12838:30;12904:22;12884:18;;;12877:50;12944:18;;9505:57:20::1;12624:344:22::0;9505:57:20::1;9601:10;9581:16;9589:7:::0;9581::::1;:16::i;:::-;-1:-1:-1::0;;;;;9581:30:20::1;;9573:62;;;::::0;-1:-1:-1;;;9573:62:20;;13175:2:22;9573:62:20::1;::::0;::::1;13157:21:22::0;13214:2;13194:18;;;13187:30;13253:21;13233:18;;;13226:49;13292:18;;9573:62:20::1;12973:343:22::0;9573:62:20::1;2305:18:::2;::::0;;;:9:::2;:18;::::0;;;;:30;::::2;;:65:::0;::::2;;;-1:-1:-1::0;2339:18:20::2;::::0;;;:9:::2;:18;::::0;;;;:31;;;::::2;;;2305:65;:101;;;;-1:-1:-1::0;2374:18:20::2;::::0;;;:9:::2;:18;::::0;;;;:32;;;::::2;;;2305:101;2302:162;;;2423:29;::::0;-1:-1:-1;;;2423:29:20;;15399:2:22;2423:29:20::2;::::0;::::2;15381:21:22::0;15438:2;15418:18;;;15411:30;15477:21;15457:18;;;15450:49;15516:18;;2423:29:20::2;15197:343:22::0;2302:162:20::2;2490:6;::::0;-1:-1:-1;;;;;2490:6:20::2;2474:70;;;::::0;-1:-1:-1;;;2474:70:20;;15747:2:22;2474:70:20::2;::::0;::::2;15729:21:22::0;15786:2;15766:18;;;15759:30;15825:28;15805:18;;;15798:56;15871:18;;2474:70:20::2;15545:350:22::0;2474:70:20::2;2571:6;::::0;-1:-1:-1;;;;;2571:6:20::2;2555:70;;;::::0;-1:-1:-1;;;2555:70:20;;16102:2:22;2555:70:20::2;::::0;::::2;16084:21:22::0;16141:2;16121:18;;;16114:30;16180:28;16160:18;;;16153:56;16226:18;;2555:70:20::2;15900:350:22::0;2555:70:20::2;2652:6;::::0;-1:-1:-1;;;;;2652:6:20::2;2636:70;;;::::0;-1:-1:-1;;;2636:70:20;;16457:2:22;2636:70:20::2;::::0;::::2;16439:21:22::0;16496:2;16476:18;;;16469:30;16535:28;16515:18;;;16508:56;16581:18;;2636:70:20::2;16255:350:22::0;2636:70:20::2;2721:18;::::0;;;:9:::2;:18;::::0;;;;:30;::::2;;2720:31;:62:::0;::::2;;;;2755:27;2770:7;2779:2;2755:14;:27::i;:::-;2717:246;;;2799:18;::::0;;;:9:::2;:18;::::0;;;;;;:37;;-1:-1:-1;;2799:37:20::2;2832:4;2799:37;::::0;;2851:6:::2;::::0;:30;;-1:-1:-1;;;2851:30:20;;2870:10:::2;2851:30;::::0;::::2;2335:74:22::0;-1:-1:-1;;;;;2851:6:20;;::::2;::::0;:18:::2;::::0;2308::22;;2851:30:20::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;2717:246;;;2914:18;::::0;;;:9:::2;:18;::::0;;;;:37;;-1:-1:-1;;2914:37:20::2;2947:4;2914:37;::::0;;2717:246:::2;2977:18;::::0;;;:9:::2;:18;::::0;;;;:31;;;::::2;;;2973:296;;3028:27;3043:7;3052:2;3028:14;:27::i;:::-;3025:233;;;3076:18;::::0;;;:9:::2;:18;::::0;;;;;;:38;;-1:-1:-1;;3076:38:20::2;::::0;::::2;::::0;;3133:6:::2;::::0;:30;;-1:-1:-1;;;3133:30:20;;3152:10:::2;3133:30;::::0;::::2;2335:74:22::0;-1:-1:-1;;;;;3133:6:20;;::::2;::::0;:18:::2;::::0;2308::22;;3133:30:20::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;3025:233;;;3204:18;::::0;;;:9:::2;:18;::::0;;;;:38;;-1:-1:-1;;3204:38:20::2;::::0;::::2;::::0;;3025:233:::2;3283:18;::::0;;;:9:::2;:18;::::0;;;;:32;;;::::2;;;3279:427;;3373:15;::::0;8134:88;;;8151:15;8134:88;;;;26017:19:22;;;;-1:-1:-1;;8168:14:20;26124:2:22;26120:15;;;26116:24;;26102:12;;;26095:46;8184:16:20;26157:12:22;;;26150:28;8202:10:20;26212:15:22;;26208:24;26194:12;;;26187:46;26249:13;;;;26242:29;;;8134:88:20;;;;;;;;;;26287:13:22;;;;8134:88:20;;;8124:99;;;;;3332:20:::2;::::0;3373:15;3355:33:::2;;;;:::i;:::-;3332:56;;3421:11;;;;;;;;;-1:-1:-1::0;;;;;3421:11:20::2;-1:-1:-1::0;;;;;3421:27:20::2;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3406:12;:44;3403:128;;;3486:11;;;;;;;;;-1:-1:-1::0;;;;;3486:11:20::2;-1:-1:-1::0;;;;;3486:27:20::2;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3471:44;;3403:128;3546:18;::::0;;;:9:::2;:18;::::0;;;;:39;;-1:-1:-1;;3546:39:20::2;::::0;::::2;::::0;;3603:17;3600:29:::2;;3622:7;1451:1:1::1;2221:1492:20::0;:::o;3600:29::-:2;3643:11;::::0;:51:::2;::::0;;;;3669:10:::2;3643:51;::::0;::::2;17279:74:22::0;17369:18;;;17362:34;;;-1:-1:-1;;;;;3643:11:20;;::::2;::::0;:25:::2;::::0;17252:18:22;;3643:51:20::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;3317:389;3279:427;1451:1:1::1;2221:1492:20::0;:::o;9310:142::-;1082:7:0;1108:6;-1:-1:-1;;;;;1108:6:0;719:10:12;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;10438:2:22;1240:68:0;;;10420:21:22;;;10457:18;;;10450:30;-1:-1:-1;;;;;;;;;;;10496:18:22;;;10489:62;10568:18;;1240:68:0;10236:356:22;1240:68:0;9407:37:20::1;::::0;9375:21:::1;::::0;9415:10:::1;::::0;9407:37;::::1;;;::::0;9375:21;;9360:12:::1;9407:37:::0;9360:12;9407:37;9375:21;9415:10;9407:37;::::1;;;;;;;;;;;;;::::0;::::1;;;;4801:759:::0;1145:4:1;1168:7;-1:-1:-1;;;1168:7:1;;;;1411:9;1403:38;;;;-1:-1:-1;;;1403:38:1;;12481:2:22;1403:38:1;;;12463:21:22;12520:2;12500:18;;;12493:30;-1:-1:-1;;;12539:18:22;;;12532:46;12595:18;;1403:38:1;12279:340:22;1403:38:1;4920:1:20::1;4911:6;:10;;;4903:34;;;::::0;-1:-1:-1;;;4903:34:20;;17609:2:22;4903:34:20::1;::::0;::::1;17591:21:22::0;17648:2;17628:18;;;17621:30;17687:13;17667:18;;;17660:41;17718:18;;4903:34:20::1;17407:335:22::0;4903:34:20::1;1525:5;4972:6;4956:22;;:13;1702:10:8::0;:17;;1615:111;4956:13:20::1;:22;;;;:::i;:::-;:34;;4948:62;;;::::0;-1:-1:-1;;;4948:62:20;;18271:2:22;4948:62:20::1;::::0;::::1;18253:21:22::0;18310:2;18290:18;;;18283:30;18349:17;18329:18;;;18322:45;18384:18;;4948:62:20::1;18069:339:22::0;4948:62:20::1;5029:21;::::0;::::1;::::0;::::1;;;::::0;:40:::1;;-1:-1:-1::0;5054:15:20::1;::::0;::::1;;5029:40;:60;;;-1:-1:-1::0;5073:16:20::1;::::0;::::1;;5029:60;5021:87;;;::::0;-1:-1:-1;;;5021:87:20;;18615:2:22;5021:87:20::1;::::0;::::1;18597:21:22::0;18654:2;18634:18;;;18627:30;18693:16;18673:18;;;18666:44;18727:18;;5021:87:20::1;18413:338:22::0;5021:87:20::1;5123:15;::::0;::::1;;5119:109;;5176:19;5188:6;5176:19;;:11;:19::i;:::-;5163:9;:32;;5155:61;;;::::0;-1:-1:-1;;;5155:61:20;;18958:2:22;5155:61:20::1;::::0;::::1;18940:21:22::0;18997:2;18977:18;;;18970:30;19036:18;19016;;;19009:46;19072:18;;5155:61:20::1;18756:340:22::0;5155:61:20::1;5241:21;::::0;::::1;::::0;::::1;;;5238:315;;;5279:28;5300:6;5279:20;:28::i;5238:315::-;5328:15;::::0;::::1;;5325:228;;;5360:27;5375:11;;5360:14;:27::i;5325:228::-;5408:16;::::0;::::1;;5405:148;;;5445:9;5441:101;5459:6;5457:8;;:1;:8;5441:101;;;5490:36;5500:10;5512:13;1702:10:8::0;:17;;1615:111;5512:13:20::1;5490:9;:36::i;:::-;5466:3;::::0;::::1;:::i;:::-;;;5441:101;;;;4801:759:::0;;;:::o;5107:179:5:-;5240:39;5257:4;5263:2;5267:7;5240:39;;;;;;;;;;;;:16;:39::i;1798:230:8:-;1873:7;1908:30;1702:10;:17;;1615:111;1908:30;1900:5;:38;1892:95;;;;-1:-1:-1;;;1892:95:8;;19443:2:22;1892:95:8;;;19425:21:22;19482:2;19462:18;;;19455:30;19521:34;19501:18;;;19494:62;19592:14;19572:18;;;19565:42;19624:19;;1892:95:8;19241:408:22;1892:95:8;2004:10;2015:5;2004:17;;;;;;;;:::i;:::-;;;;;;;;;1997:24;;1798:230;;;:::o;8494:90:20:-;1082:7:0;1108:6;-1:-1:-1;;;;;1108:6:0;719:10:12;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;10438:2:22;1240:68:0;;;10420:21:22;;;10457:18;;;10450:30;-1:-1:-1;;;;;;;;;;;10496:18:22;;;10489:62;10568:18;;1240:68:0;10236:356:22;1240:68:0;8563:13:20;;::::1;::::0;:7:::1;::::0;:13:::1;::::0;::::1;::::0;::::1;:::i;2176:235:5:-:0;2248:7;2283:16;;;:7;:16;;;;;;-1:-1:-1;;;;;2283:16:5;2317:19;2309:73;;;;-1:-1:-1;;;2309:73:5;;20045:2:22;2309:73:5;;;20027:21:22;20084:2;20064:18;;;20057:30;20123:34;20103:18;;;20096:62;20194:11;20174:18;;;20167:39;20223:19;;2309:73:5;19843:405:22;1914:205:5;1986:7;-1:-1:-1;;;;;2013:19:5;;2005:74;;;;-1:-1:-1;;;2005:74:5;;20455:2:22;2005:74:5;;;20437:21:22;20494:2;20474:18;;;20467:30;20533:34;20513:18;;;20506:62;20604:12;20584:18;;;20577:40;20634:19;;2005:74:5;20253:406:22;2005:74:5;-1:-1:-1;;;;;;2096:16:5;;;;;:9;:16;;;;;;;1914:205::o;1668:101:0:-;1082:7;1108:6;-1:-1:-1;;;;;1108:6:0;719:10:12;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;10438:2:22;1240:68:0;;;10420:21:22;;;10457:18;;;10450:30;-1:-1:-1;;;;;;;;;;;10496:18:22;;;10489:62;10568:18;;1240:68:0;10236:356:22;1240:68:0;1732:30:::1;1759:1;1732:18;:30::i;:::-;1668:101::o:0;8700:602:20:-;8762:16;-1:-1:-1;;;;;8799:20:20;;8791:51;;;;-1:-1:-1;;;8791:51:20;;20866:2:22;8791:51:20;;;20848:21:22;20905:2;20885:18;;;20878:30;20944:20;20924:18;;;20917:48;20982:18;;8791:51:20;20664:342:22;8791:51:20;8853:18;8874:17;8884:6;8874:9;:17::i;:::-;8853:38;;8920:1;8906:10;:15;8902:393;;8983:16;;;8997:1;8983:16;;;;;;;;;;;-1:-1:-1;8976:23:20;8700:602;-1:-1:-1;;;8700:602:20:o;8902:393::-;9032:23;9072:10;9058:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9058:25:20;;9032:51;;9098:13;9126:130;9150:10;9142:5;:18;9126:130;;;9206:34;9226:6;9234:5;9206:19;:34::i;:::-;9190:6;9197:5;9190:13;;;;;;;;:::i;:::-;;;;;;;;;;:50;9162:7;;;;:::i;:::-;;;;9126:130;;8902:393;8780:522;8700:602;;;:::o;7415:100::-;1082:7:0;1108:6;-1:-1:-1;;;;;1108:6:0;719:10:12;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;10438:2:22;1240:68:0;;;10420:21:22;;;10457:18;;;10450:30;-1:-1:-1;;;;;;;;;;;10496:18:22;;;10489:62;10568:18;;1240:68:0;10236:356:22;1240:68:0;7491:16:20::1;::::0;;-1:-1:-1;;7471:36:20;::::1;7491:16;::::0;;::::1;7490:17;7471:36;::::0;;7415:100::o;7174:233::-;1082:7:0;1108:6;-1:-1:-1;;;;;1108:6:0;719:10:12;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;10438:2:22;1240:68:0;;;10420:21:22;;;10457:18;;;10450:30;-1:-1:-1;;;;;;;;;;;10496:18:22;;;10489:62;10568:18;;1240:68:0;10236:356:22;1240:68:0;7249:21:20::1;::::0;::::1;::::0;::::1;;;7248:22;7240:51;;;::::0;-1:-1:-1;;;7240:51:20;;21213:2:22;7240:51:20::1;::::0;::::1;21195:21:22::0;21252:2;21232:18;;;21225:30;21291:18;21271;;;21264:46;21327:18;;7240:51:20::1;21011:340:22::0;7240:51:20::1;7302:16;:24:::0;;7337:15:::1;:23:::0;;-1:-1:-1;;7337:23:20::1;::::0;;-1:-1:-1;;7371:28:20;7302:24:::1;7371:28;::::0;;7174:233::o;2040:173::-;1145:4:1;1168:7;-1:-1:-1;;;1168:7:1;;;;1411:9;1403:38;;;;-1:-1:-1;;;1403:38:1;;12481:2:22;1403:38:1;;;12463:21:22;12520:2;12500:18;;;12493:30;-1:-1:-1;;;12539:18:22;;;12532:46;12595:18;;1403:38:1;12279:340:22;1403:38:1;2126:9:20::1;2122:84;2138:17:::0;;::::1;2122:84;;;2176:18;2182:8;;2191:1;2182:11;;;;;;;:::i;:::-;;;;;;;2176:5;:18::i;:::-;2156:3;::::0;::::1;:::i;:::-;;;2122:84;;2635:102:5::0;2691:13;2723:7;2716:14;;;;;:::i;4268:153::-;4362:52;719:10:12;4395:8:5;4405;4362:18;:52::i;3872:144:20:-;1082:7:0;1108:6;-1:-1:-1;;;;;1108:6:0;719:10:12;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;10438:2:22;1240:68:0;;;10420:21:22;;;10457:18;;;10450:30;-1:-1:-1;;;;;;;;;;;10496:18:22;;;10489:62;10568:18;;1240:68:0;10236:356:22;1240:68:0;3945:15:20::1;:22:::0;;-1:-1:-1;;3945:22:20::1;::::0;::::1;::::0;;3978:6:::1;:30:::0;;-1:-1:-1;;;;;3978:30:20;;::::1;-1:-1:-1::0;;;;;;3978:30:20;;::::1;::::0;;;::::1;::::0;;3872:144::o;5741:290::-;1082:7:0;1108:6;-1:-1:-1;;;;;1108:6:0;719:10:12;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;10438:2:22;1240:68:0;;;10420:21:22;;;10457:18;;;10450:30;-1:-1:-1;;;;;;;;;;;10496:18:22;;;10489:62;10568:18;;1240:68:0;10236:356:22;1240:68:0;5831:18:20;5823:50:::1;;;::::0;-1:-1:-1;;;5823:50:20;;21558:2:22;5823:50:20::1;::::0;::::1;21540:21:22::0;21597:2;21577:18;;;21570:30;21636:21;21616:18;;;21609:49;21675:18;;5823:50:20::1;21356:343:22::0;5823:50:20::1;5906:11;::::0;;5928:25;;;;5971:52:::1;::::0;;21878:25:22;;;21934:2;21919:18;;21912:34;;;5971:52:20::1;::::0;21851:18:22;5971:52:20::1;;;;;;;5812:219;5741:290:::0;:::o;5352:320:5:-;5521:41;719:10:12;5554:7:5;5521:18;:41::i;:::-;5513:103;;;;-1:-1:-1;;;5513:103:5;;14569:2:22;5513:103:5;;;14551:21:22;14608:2;14588:18;;;14581:30;14647:34;14627:18;;;14620:62;14718:19;14698:18;;;14691:47;14755:19;;5513:103:5;14367:413:22;5513:103:5;5626:39;5640:4;5646:2;5650:7;5659:5;5626:13;:39::i;7523:133:20:-;1082:7:0;1108:6;-1:-1:-1;;;;;1108:6:0;719:10:12;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;10438:2:22;1240:68:0;;;10420:21:22;;;10457:18;;;10450:30;-1:-1:-1;;;;;;;;;;;10496:18:22;;;10489:62;10568:18;;1240:68:0;10236:356:22;1240:68:0;7602:11:20::1;:46:::0;;-1:-1:-1;;;;;;7602:46:20::1;-1:-1:-1::0;;;;;7602:46:20;;;::::1;::::0;;;::::1;::::0;;7523:133::o;2803:329:5:-;7209:4;7232:16;;;:7;:16;;;;;;2876:13;;-1:-1:-1;;;;;7232:16:5;2901:76;;;;-1:-1:-1;;;2901:76:5;;22159:2:22;2901:76:5;;;22141:21:22;22198:2;22178:18;;;22171:30;22237:34;22217:18;;;22210:62;22308:17;22288:18;;;22281:45;22343:19;;2901:76:5;21957:411:22;2901:76:5;2988:21;3012:10;:8;:10::i;:::-;2988:34;;3063:1;3045:7;3039:21;:25;:86;;;;;;;;;;;;;;;;;3091:7;3100:18;:7;:16;:18::i;:::-;3074:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3039:86;3032:93;2803:329;-1:-1:-1;;;2803:329:5:o;6782:164:20:-;1082:7:0;1108:6;-1:-1:-1;;;;;1108:6:0;719:10:12;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;10438:2:22;1240:68:0;;;10420:21:22;;;10457:18;;;10450:30;-1:-1:-1;;;;;;;;;;;10496:18:22;;;10489:62;10568:18;;1240:68:0;10236:356:22;1240:68:0;6840:21:20::1;:29:::0;;-1:-1:-1;;6880:24:20;;;6915:15:::1;:23:::0;;-1:-1:-1;;6915:23:20::1;6840:21;6915:23;::::0;;6782:164::o;5568:165::-;1082:7:0;1108:6;-1:-1:-1;;;;;1108:6:0;719:10:12;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;10438:2:22;1240:68:0;;;10420:21:22;;;10457:18;;;10450:30;-1:-1:-1;;;;;;;;;;;10496:18:22;;;10489:62;10568:18;;1240:68:0;10236:356:22;1240:68:0;5645:9:20::1;5641:85;5659:6;5657:8;;:1;:8;5641:85;;;5686:28;5696:2;5700:13;1702:10:8::0;:17;;1615:111;5686:28:20::1;5666:3;::::0;::::1;:::i;:::-;;;5641:85;;3721:143:::0;1082:7:0;1108:6;-1:-1:-1;;;;;1108:6:0;719:10:12;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;10438:2:22;1240:68:0;;;10420:21:22;;;10457:18;;;10450:30;-1:-1:-1;;;;;;;;;;;10496:18:22;;;10489:62;10568:18;;1240:68:0;10236:356:22;1240:68:0;3792:15:20::1;:22:::0;;-1:-1:-1;;3792:22:20::1;::::0;::::1;::::0;;3825:6:::1;:31:::0;;-1:-1:-1;;;;;3825:31:20;;::::1;-1:-1:-1::0;;;;;;3825:31:20;;::::1;::::0;;;::::1;::::0;;3721:143::o;6954:212::-;1082:7:0;1108:6;-1:-1:-1;;;;;1108:6:0;719:10:12;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;10438:2:22;1240:68:0;;;10420:21:22;;;10457:18;;;10450:30;-1:-1:-1;;;;;;;;;;;10496:18:22;;;10489:62;10568:18;;1240:68:0;10236:356:22;1240:68:0;7027:9:20::1;:22:::0;7060:15:::1;:24:::0;;-1:-1:-1;;7060:24:20::1;::::0;;7095:21:::1;:29:::0;;-1:-1:-1;;7135:23:20;7060:24;7135:23:::1;::::0;;6954:212::o;1918:198:0:-;1082:7;1108:6;-1:-1:-1;;;;;1108:6:0;719:10:12;1248:23:0;1240:68;;;;-1:-1:-1;;;1240:68:0;;10438:2:22;1240:68:0;;;10420:21:22;;;10457:18;;;10450:30;-1:-1:-1;;;;;;;;;;;10496:18:22;;;10489:62;10568:18;;1240:68:0;10236:356:22;1240:68:0;-1:-1:-1;;;;;2006:22:0;::::1;1998:73;;;::::0;-1:-1:-1;;;1998:73:0;;23050:2:22;1998:73:0::1;::::0;::::1;23032:21:22::0;23089:2;23069:18;;;23062:30;23128:34;23108:18;;;23101:62;23199:8;23179:18;;;23172:36;23225:19;;1998:73:0::1;22848:402:22::0;1998:73:0::1;2081:28;2100:8;2081:18;:28::i;:::-;1918:198:::0;:::o;4024:377:20:-;1145:4:1;1168:7;-1:-1:-1;;;1168:7:1;;;;1411:9;1403:38;;;;-1:-1:-1;;;1403:38:1;;12481:2:22;1403:38:1;;;12463:21:22;12520:2;12500:18;;;12493:30;-1:-1:-1;;;12539:18:22;;;12532:46;12595:18;;1403:38:1;12279:340:22;1403:38:1;4089:7:20::1;9530;9513:13;1702:10:8::0;:17;;1615:111;9513:13:20::1;:24;;9505:57;;;::::0;-1:-1:-1;;;9505:57:20;;12826:2:22;9505:57:20::1;::::0;::::1;12808:21:22::0;12865:2;12845:18;;;12838:30;12904:22;12884:18;;;12877:50;12944:18;;9505:57:20::1;12624:344:22::0;9505:57:20::1;9601:10;9581:16;9589:7:::0;9581::::1;:16::i;:::-;-1:-1:-1::0;;;;;9581:30:20::1;;9573:62;;;::::0;-1:-1:-1;;;9573:62:20;;13175:2:22;9573:62:20::1;::::0;::::1;13157:21:22::0;13214:2;13194:18;;;13187:30;13253:21;13233:18;;;13226:49;13292:18;;9573:62:20::1;12973:343:22::0;9573:62:20::1;4117:15:::2;::::0;;;::::2;;;4109:44;;;::::0;-1:-1:-1;;;4109:44:20;;23457:2:22;4109:44:20::2;::::0;::::2;23439:21:22::0;23496:2;23476:18;;;23469:30;23535:18;23515;;;23508:46;23571:18;;4109:44:20::2;23255:340:22::0;4109:44:20::2;4180:6;::::0;-1:-1:-1;;;;;4180:6:20::2;4164:63;;;::::0;-1:-1:-1;;;4164:63:20;;13871:2:22;4164:63:20::2;::::0;::::2;13853:21:22::0;13910:2;13890:18;;;13883:30;13949:21;13929:18;;;13922:49;13988:18;;4164:63:20::2;13669:343:22::0;4164:63:20::2;4247:18;::::0;;;:9:::2;:18;::::0;;;;:32;;;::::2;;;4246:33;4238:64;;;::::0;-1:-1:-1;;;4238:64:20;;23802:2:22;4238:64:20::2;::::0;::::2;23784:21:22::0;23841:2;23821:18;;;23814:30;23880:20;23860:18;;;23853:48;23918:18;;4238:64:20::2;23600:342:22::0;4238:64:20::2;4313:18;::::0;;;:9:::2;:18;::::0;;;;;;:39;;-1:-1:-1;;4313:39:20::2;::::0;::::2;::::0;;4363:6:::2;::::0;:30;;-1:-1:-1;;;4363:30:20;;4382:10:::2;4363:30;::::0;::::2;2335:74:22::0;-1:-1:-1;;;;;4363:6:20;;::::2;::::0;:18:::2;::::0;2308::22;;4363:30:20::2;2189:226:22::0;1555:300:5;1657:4;-1:-1:-1;;;;;;1692:40:5;;1707:25;1692:40;;:104;;-1:-1:-1;;;;;;;1748:48:5;;1763:33;1748:48;1692:104;:156;;;-1:-1:-1;952:25:15;-1:-1:-1;;;;;;937:40:15;;;1812:36:5;829:155:15;10995:171:5;11069:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;11069:29:5;-1:-1:-1;;;;;11069:29:5;;;;;;;;:24;;11122:23;11069:24;11122:14;:23::i;:::-;-1:-1:-1;;;;;11113:46:5;;;;;;;;;;;10995:171;;:::o;7427:344::-;7520:4;7232:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7232:16:5;7536:73;;;;-1:-1:-1;;;7536:73:5;;24149:2:22;7536:73:5;;;24131:21:22;24188:2;24168:18;;;24161:30;24227:34;24207:18;;;24200:62;-1:-1:-1;;;24278:18:22;;;24271:42;24330:19;;7536:73:5;23947:408:22;7536:73:5;7619:13;7635:23;7650:7;7635:14;:23::i;:::-;7619:39;;7687:5;-1:-1:-1;;;;;7676:16:5;:7;-1:-1:-1;;;;;7676:16:5;;:51;;;;7720:7;-1:-1:-1;;;;;7696:31:5;:20;7708:7;7696:11;:20::i;:::-;-1:-1:-1;;;;;7696:31:5;;7676:51;:87;;;-1:-1:-1;;;;;;4607:25:5;;;4584:4;4607:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;7731:32;7668:96;7427:344;-1:-1:-1;;;;7427:344:5:o;10324:560::-;10478:4;-1:-1:-1;;;;;10451:31:5;:23;10466:7;10451:14;:23::i;:::-;-1:-1:-1;;;;;10451:31:5;;10443:85;;;;-1:-1:-1;;;10443:85:5;;24562:2:22;10443:85:5;;;24544:21:22;24601:2;24581:18;;;24574:30;24640:34;24620:18;;;24613:62;24711:11;24691:18;;;24684:39;24740:19;;10443:85:5;24360:405:22;10443:85:5;-1:-1:-1;;;;;10546:16:5;;10538:65;;;;-1:-1:-1;;;10538:65:5;;24972:2:22;10538:65:5;;;24954:21:22;25011:2;24991:18;;;24984:30;25050:34;25030:18;;;25023:62;25121:6;25101:18;;;25094:34;25145:19;;10538:65:5;24770:400:22;10538:65:5;10614:39;10635:4;10641:2;10645:7;10614:20;:39::i;:::-;10715:29;10732:1;10736:7;10715:8;:29::i;:::-;-1:-1:-1;;;;;10755:15:5;;;;;;:9;:15;;;;;:20;;10774:1;;10755:15;:20;;10774:1;;10755:20;:::i;:::-;;;;-1:-1:-1;;;;;;;10785:13:5;;;;;;:9;:13;;;;;:18;;10802:1;;10785:13;:18;;10802:1;;10785:18;:::i;:::-;;;;-1:-1:-1;;10813:16:5;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;10813:21:5;-1:-1:-1;;;;;10813:21:5;;;;;;;;;10850:27;;10813:16;;10850:27;;;;;;;10324:560;;;:::o;7777:239:20:-;7860:17;;7939:10;7914:22;7933:3;7914:16;:22;:::i;:::-;:35;;;;:::i;:::-;8134:88;;;8151:15;8134:88;;;;26017:19:22;;;;-1:-1:-1;;8168:14:20;26124:2:22;26120:15;;;26116:24;;26102:12;;;26095:46;8184:16:20;26157:12:22;;;26150:28;8202:10:20;26212:15:22;;26208:24;26194:12;;;26187:46;26249:13;;;;26242:29;;;8134:88:20;;;;;;;;;;26287:13:22;;;;8134:88:20;;;8124:99;;;;;7890:59;;;;;;-1:-1:-1;7890:59:20;;7968:39;;;;7777:239;-1:-1:-1;;;;7777:239:20:o;8240:118::-;8300:12;8341:9;;8332:6;:18;;;;:::i;6336:438::-;1145:4:1;1168:7;-1:-1:-1;;;1168:7:1;;;;1411:9;1403:38;;;;-1:-1:-1;;;1403:38:1;;12481:2:22;1403:38:1;;;12463:21:22;12520:2;12500:18;;;12493:30;-1:-1:-1;;;12539:18:22;;;12532:46;12595:18;;1403:38:1;12279:340:22;1403:38:1;6414:13:20::1;6430:12;:10;:12::i;:::-;6491:10;6453:15;6471:31:::0;;;:19:::1;:31;::::0;;;;;6414:28;;-1:-1:-1;6471:31:20::1;::::0;;::::1;::::0;6414:28;;6521:16:::1;::::0;;::::1;6471:31:::0;6521:16:::1;:::i;:::-;:25;;6513:59;;;::::0;-1:-1:-1;;;6513:59:20;;26686:2:22;6513:59:20::1;::::0;::::1;26668:21:22::0;26725:2;26705:18;;;26698:30;26764:23;26744:18;;;26737:51;26805:18;;6513:59:20::1;26484:345:22::0;6513:59:20::1;6583:15;6601:13;1702:10:8::0;:17;;1615:111;6601:13:20::1;6583:31;;6629:9;6625:142;6643:6;6641:8;;:1;:8;6625:142;;;6670:34;6680:10;6692:11;6702:1:::0;6692:7;:11:::1;:::i;6670:34::-;6739:10;6719:31;::::0;;;:19:::1;:31;::::0;;;;:36;;6754:1:::1;::::0;6719:31;:36:::1;::::0;6754:1;;6719:36:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;6650:3;;;;:::i;:::-;;;6625:142;;;;6403:371;;;6336:438:::0;:::o;6039:289::-;1145:4:1;1168:7;-1:-1:-1;;;1168:7:1;;;;1411:9;1403:38;;;;-1:-1:-1;;;1403:38:1;;12481:2:22;1403:38:1;;;12463:21:22;12520:2;12500:18;;;12493:30;-1:-1:-1;;;12539:18:22;;;12532:46;12595:18;;1403:38:1;12279:340:22;1403:38:1;6136:11:20::1;;767:12:21;782:26;796:11;;782:13;:26::i;:::-;767:41;;827:7;819:35;;;::::0;-1:-1:-1;;;819:35:21;;27245:2:22;819:35:21::1;::::0;::::1;27227:21:22::0;27284:2;27264:18;;;27257:30;27323:17;27303:18;;;27296:45;27358:18;;819:35:21::1;27043:339:22::0;819:35:21::1;6191:10:20::2;6169:33;::::0;;;:21:::2;:33;::::0;;;;;::::2;;6168:34;6160:62;;;::::0;-1:-1:-1;;;6160:62:20;;27589:2:22;6160:62:20::2;::::0;::::2;27571:21:22::0;27628:2;27608:18;;;27601:30;27667:17;27647:18;;;27640:45;27702:18;;6160:62:20::2;27387:339:22::0;6160:62:20::2;6233:36;6243:10;6255:13;1702:10:8::0;:17;;1615:111;6233:36:20::2;-1:-1:-1::0;;6302:10:20::2;6280:33;::::0;;;:21:::2;:33;::::0;;;;:40;;-1:-1:-1;;6280:40:20::2;6316:4;6280:40;::::0;;-1:-1:-1;;;6039:289:20:o;8101:108:5:-;8176:26;8186:2;8190:7;8176:26;;;;;;;;;;;;:9;:26::i;2270:187:0:-;2343:16;2362:6;;-1:-1:-1;;;;;2378:17:0;;;-1:-1:-1;;;;;;2378:17:0;;;;;;2410:40;;2362:6;;;;;;;2410:40;;2343:16;2410:40;2333:124;2270:187;:::o;11301:307:5:-;11451:8;-1:-1:-1;;;;;11442:17:5;:5;-1:-1:-1;;;;;11442:17:5;;;11434:55;;;;-1:-1:-1;;;11434:55:5;;27933:2:22;11434:55:5;;;27915:21:22;27972:2;27952:18;;;27945:30;28011:27;27991:18;;;27984:55;28056:18;;11434:55:5;27731:349:22;11434:55:5;-1:-1:-1;;;;;11499:25:5;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;11499:46:5;;;;;;;;;;11560:41;;771::22;;;11560::5;;744:18:22;11560:41:5;;;;;;;11301:307;;;:::o;6534:::-;6685:28;6695:4;6701:2;6705:7;6685:9;:28::i;:::-;6731:48;6754:4;6760:2;6764:7;6773:5;6731:22;:48::i;:::-;6723:111;;;;-1:-1:-1;;;6723:111:5;;28287:2:22;6723:111:5;;;28269:21:22;28326:2;28306:18;;;28299:30;28365:34;28345:18;;;28338:62;-1:-1:-1;;;28416:18:22;;;28409:48;28474:19;;6723:111:5;28085:414:22;8592:100:20;8644:13;8677:7;8670:14;;;;;:::i;328:703:13:-;384:13;601:10;597:51;;-1:-1:-1;;627:10:13;;;;;;;;;;;;;;;;;;328:703::o;597:51::-;672:5;657:12;711:75;718:9;;711:75;;743:8;;;;:::i;:::-;;-1:-1:-1;765:10:13;;-1:-1:-1;773:2:13;765:10;;:::i;:::-;;;711:75;;;795:19;827:6;817:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;817:17:13;;795:39;;844:150;851:10;;844:150;;877:11;887:1;877:11;;:::i;:::-;;-1:-1:-1;945:10:13;953:2;945:5;:10;:::i;:::-;932:24;;:2;:24;:::i;:::-;919:39;;902:6;909;902:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;972:11:13;981:2;972:11;;:::i;:::-;;;844:150;;2624:572:8;-1:-1:-1;;;;;2823:18:8;;2819:183;;2857:40;2889:7;4005:10;:17;;3978:24;;;;:15;:24;;;;;:44;;;4032:24;;;;;;;;;;;;3902:161;2857:40;2819:183;;;2926:2;-1:-1:-1;;;;;2918:10:8;:4;-1:-1:-1;;;;;2918:10:8;;2914:88;;2944:47;2977:4;2983:7;2944:32;:47::i;:::-;-1:-1:-1;;;;;3015:16:8;;3011:179;;3047:45;3084:7;3047:36;:45::i;3011:179::-;3119:4;-1:-1:-1;;;;;3113:10:8;:2;-1:-1:-1;;;;;3113:10:8;;3109:81;;3139:40;3167:2;3171:7;3139:27;:40::i;8366:120:20:-;8449:7;;:29;;;;;8467:10;8449:29;;;2335:74:22;8411:15:20;;-1:-1:-1;;;;;8449:7:20;;:17;;2308:18:22;;8449:29:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8439:39;;8366:120;:::o;456:233:21:-;582:28;;-1:-1:-1;;599:10:21;28778:2:22;28774:15;28770:53;582:28:21;;;28758:66:22;534:10:21;;;;28840:12:22;;582:28:21;;;;;;;;;;;;572:39;;;;;;557:54;;630:51;649:12;;630:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;663:11:21;;;-1:-1:-1;676:4:21;;-1:-1:-1;630:18:21;:51::i;8430:311:5:-;8555:18;8561:2;8565:7;8555:5;:18::i;:::-;8604:54;8635:1;8639:2;8643:7;8652:5;8604:22;:54::i;:::-;8583:151;;;;-1:-1:-1;;;8583:151:5;;28287:2:22;8583:151:5;;;28269:21:22;28326:2;28306:18;;;28299:30;28365:34;28345:18;;;28338:62;-1:-1:-1;;;28416:18:22;;;28409:48;28474:19;;8583:151:5;28085:414:22;12161:778:5;12311:4;-1:-1:-1;;;;;12331:13:5;;1087:20:11;1133:8;12327:606:5;;12366:72;;-1:-1:-1;;;12366:72:5;;-1:-1:-1;;;;;12366:36:5;;;;;:72;;719:10:12;;12417:4:5;;12423:7;;12432:5;;12366:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12366:72:5;;;;;;;;-1:-1:-1;;12366:72:5;;;;;;;;;;;;:::i;:::-;;;12362:519;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12605:13:5;;12601:266;;12647:60;;-1:-1:-1;;;12647:60:5;;28287:2:22;12647:60:5;;;28269:21:22;28326:2;28306:18;;;28299:30;28365:34;28345:18;;;28338:62;-1:-1:-1;;;28416:18:22;;;28409:48;28474:19;;12647:60:5;28085:414:22;12601:266:5;12819:6;12813:13;12804:6;12800:2;12796:15;12789:38;12362:519;-1:-1:-1;;;;;;12488:51:5;-1:-1:-1;;;12488:51:5;;-1:-1:-1;12481:58:5;;12327:606;-1:-1:-1;12918:4:5;12161:778;;;;;;:::o;4680:970:8:-;4942:22;4992:1;4967:22;4984:4;4967:16;:22::i;:::-;:26;;;;:::i;:::-;5003:18;5024:26;;;:17;:26;;;;;;4942:51;;-1:-1:-1;5154:28:8;;;5150:323;;-1:-1:-1;;;;;5220:18:8;;5198:19;5220:18;;;:12;:18;;;;;;;;:34;;;;;;;;;5269:30;;;;;;:44;;;5385:30;;:17;:30;;;;;:43;;;5150:323;-1:-1:-1;5566:26:8;;;;:17;:26;;;;;;;;5559:33;;;-1:-1:-1;;;;;5609:18:8;;;;;:12;:18;;;;;:34;;;;;;;5602:41;4680:970::o;5938:1061::-;6212:10;:17;6187:22;;6212:21;;6232:1;;6212:21;:::i;:::-;6243:18;6264:24;;;:15;:24;;;;;;6632:10;:26;;6187:46;;-1:-1:-1;6264:24:8;;6187:46;;6632:26;;;;;;:::i;:::-;;;;;;;;;6610:48;;6694:11;6669:10;6680;6669:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;6773:28;;;:15;:28;;;;;;;:41;;;6942:24;;;;;6935:31;6976:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;6009:990;;;5938:1061;:::o;3490:217::-;3574:14;3591:20;3608:2;3591:16;:20::i;:::-;-1:-1:-1;;;;;3621:16:8;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;3665:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;3490:217:8:o;847:184:14:-;968:4;1020;991:25;1004:5;1011:4;991:12;:25::i;:::-;:33;;847:184;-1:-1:-1;;;;847:184:14:o;9063:372:5:-;-1:-1:-1;;;;;9142:16:5;;9134:61;;;;-1:-1:-1;;;9134:61:5;;30025:2:22;9134:61:5;;;30007:21:22;;;30044:18;;;30037:30;30103:34;30083:18;;;30076:62;30155:18;;9134:61:5;29823:356:22;9134:61:5;7209:4;7232:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7232:16:5;:30;9205:58;;;;-1:-1:-1;;;9205:58:5;;30386:2:22;9205:58:5;;;30368:21:22;30425:2;30405:18;;;30398:30;30464;30444:18;;;30437:58;30512:18;;9205:58:5;30184:352:22;9205:58:5;9274:45;9303:1;9307:2;9311:7;9274:20;:45::i;:::-;-1:-1:-1;;;;;9330:13:5;;;;;;:9;:13;;;;;:18;;9347:1;;9330:13;:18;;9347:1;;9330:18;:::i;:::-;;;;-1:-1:-1;;9358:16:5;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;9358:21:5;-1:-1:-1;;;;;9358:21:5;;;;;;;;9395:33;;9358:16;;;9395:33;;9358:16;;9395:33;9063:372;;:::o;1383:688:14:-;1466:7;1508:4;1466:7;1522:514;1546:5;:12;1542:1;:16;1522:514;;;1579:20;1602:5;1608:1;1602:8;;;;;;;;:::i;:::-;;;;;;;1579:31;;1644:12;1628;:28;1624:402;;1779:44;;;;;;30698:19:22;;;30733:12;;;30726:28;;;30770:12;;1779:44:14;;;;;;;;;;;;1769:55;;;;;;1754:70;;1624:402;;;1966:44;;;;;;30698:19:22;;;30733:12;;;30726:28;;;30770:12;;1966:44:14;;;;;;;;;;;;1956:55;;;;;;1941:70;;1624:402;-1:-1:-1;1560:3:14;;;;:::i;:::-;;;;1522:514;;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:180:22;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:22;;14:180;-1:-1:-1;14:180:22:o;199:177::-;-1:-1:-1;;;;;;277:5:22;273:78;266:5;263:89;253:117;;366:1;363;356:12;381:245;439:6;492:2;480:9;471:7;467:23;463:32;460:52;;;508:1;505;498:12;460:52;547:9;534:23;566:30;590:5;566:30;:::i;823:196::-;891:20;;-1:-1:-1;;;;;940:54:22;;930:65;;920:93;;1009:1;1006;999:12;920:93;823:196;;;:::o;1024:409::-;1110:6;1118;1126;1134;1187:3;1175:9;1166:7;1162:23;1158:33;1155:53;;;1204:1;1201;1194:12;1155:53;1227:29;1246:9;1227:29;:::i;:::-;1217:39;;1275:38;1309:2;1298:9;1294:18;1275:38;:::i;:::-;1265:48;;1332:38;1366:2;1355:9;1351:18;1332:38;:::i;:::-;1322:48;;1389:38;1423:2;1412:9;1408:18;1389:38;:::i;:::-;1379:48;;1024:409;;;;;;;:::o;1438:258::-;1510:1;1520:113;1534:6;1531:1;1528:13;1520:113;;;1610:11;;;1604:18;1591:11;;;1584:39;1556:2;1549:10;1520:113;;;1651:6;1648:1;1645:13;1642:48;;;-1:-1:-1;;1686:1:22;1668:16;;1661:27;1438:258::o;1701:::-;1743:3;1781:5;1775:12;1808:6;1803:3;1796:19;1824:63;1880:6;1873:4;1868:3;1864:14;1857:4;1850:5;1846:16;1824:63;:::i;:::-;1941:2;1920:15;-1:-1:-1;;1916:29:22;1907:39;;;;1948:4;1903:50;;1701:258;-1:-1:-1;;1701:258:22:o;1964:220::-;2113:2;2102:9;2095:21;2076:4;2133:45;2174:2;2163:9;2159:18;2151:6;2133:45;:::i;2420:254::-;2488:6;2496;2549:2;2537:9;2528:7;2524:23;2520:32;2517:52;;;2565:1;2562;2555:12;2517:52;2588:29;2607:9;2588:29;:::i;:::-;2578:39;2664:2;2649:18;;;;2636:32;;-1:-1:-1;;;2420:254:22:o;2861:328::-;2938:6;2946;2954;3007:2;2995:9;2986:7;2982:23;2978:32;2975:52;;;3023:1;3020;3013:12;2975:52;3046:29;3065:9;3046:29;:::i;:::-;3036:39;;3094:38;3128:2;3117:9;3113:18;3094:38;:::i;:::-;3084:48;;3179:2;3168:9;3164:18;3151:32;3141:42;;2861:328;;;;;:::o;3194:367::-;3257:8;3267:6;3321:3;3314:4;3306:6;3302:17;3298:27;3288:55;;3339:1;3336;3329:12;3288:55;-1:-1:-1;3362:20:22;;3405:18;3394:30;;3391:50;;;3437:1;3434;3427:12;3391:50;3474:4;3466:6;3462:17;3450:29;;3534:3;3527:4;3517:6;3514:1;3510:14;3502:6;3498:27;3494:38;3491:47;3488:67;;;3551:1;3548;3541:12;3488:67;3194:367;;;;;:::o;3566:156::-;3632:20;;3692:4;3681:16;;3671:27;;3661:55;;3712:1;3709;3702:12;3727:507;3820:6;3828;3836;3889:2;3877:9;3868:7;3864:23;3860:32;3857:52;;;3905:1;3902;3895:12;3857:52;3945:9;3932:23;3978:18;3970:6;3967:30;3964:50;;;4010:1;4007;4000:12;3964:50;4049:70;4111:7;4102:6;4091:9;4087:22;4049:70;:::i;:::-;4138:8;;-1:-1:-1;4023:96:22;-1:-1:-1;4192:36:22;;-1:-1:-1;4224:2:22;4209:18;;4192:36;:::i;:::-;4182:46;;3727:507;;;;;:::o;4492:184::-;-1:-1:-1;;;4541:1:22;4534:88;4641:4;4638:1;4631:15;4665:4;4662:1;4655:15;4681:632;4746:5;4776:18;4817:2;4809:6;4806:14;4803:40;;;4823:18;;:::i;:::-;4898:2;4892:9;4866:2;4952:15;;-1:-1:-1;;4948:24:22;;;4974:2;4944:33;4940:42;4928:55;;;4998:18;;;5018:22;;;4995:46;4992:72;;;5044:18;;:::i;:::-;5084:10;5080:2;5073:22;5113:6;5104:15;;5143:6;5135;5128:22;5183:3;5174:6;5169:3;5165:16;5162:25;5159:45;;;5200:1;5197;5190:12;5159:45;5250:6;5245:3;5238:4;5230:6;5226:17;5213:44;5305:1;5298:4;5289:6;5281;5277:19;5273:30;5266:41;;;;4681:632;;;;;:::o;5318:451::-;5387:6;5440:2;5428:9;5419:7;5415:23;5411:32;5408:52;;;5456:1;5453;5446:12;5408:52;5496:9;5483:23;5529:18;5521:6;5518:30;5515:50;;;5561:1;5558;5551:12;5515:50;5584:22;;5637:4;5629:13;;5625:27;-1:-1:-1;5615:55:22;;5666:1;5663;5656:12;5615:55;5689:74;5755:7;5750:2;5737:16;5732:2;5728;5724:11;5689:74;:::i;6266:186::-;6325:6;6378:2;6366:9;6357:7;6353:23;6349:32;6346:52;;;6394:1;6391;6384:12;6346:52;6417:29;6436:9;6417:29;:::i;6457:632::-;6628:2;6680:21;;;6750:13;;6653:18;;;6772:22;;;6599:4;;6628:2;6851:15;;;;6825:2;6810:18;;;6599:4;6894:169;6908:6;6905:1;6902:13;6894:169;;;6969:13;;6957:26;;7038:15;;;;7003:12;;;;6930:1;6923:9;6894:169;;;-1:-1:-1;7080:3:22;;6457:632;-1:-1:-1;;;;;;6457:632:22:o;7094:437::-;7180:6;7188;7241:2;7229:9;7220:7;7216:23;7212:32;7209:52;;;7257:1;7254;7247:12;7209:52;7297:9;7284:23;7330:18;7322:6;7319:30;7316:50;;;7362:1;7359;7352:12;7316:50;7401:70;7463:7;7454:6;7443:9;7439:22;7401:70;:::i;:::-;7490:8;;7375:96;;-1:-1:-1;7094:437:22;-1:-1:-1;;;;7094:437:22:o;7725:347::-;7790:6;7798;7851:2;7839:9;7830:7;7826:23;7822:32;7819:52;;;7867:1;7864;7857:12;7819:52;7890:29;7909:9;7890:29;:::i;:::-;7880:39;;7969:2;7958:9;7954:18;7941:32;8016:5;8009:13;8002:21;7995:5;7992:32;7982:60;;8038:1;8035;8028:12;7982:60;8061:5;8051:15;;;7725:347;;;;;:::o;8780:667::-;8875:6;8883;8891;8899;8952:3;8940:9;8931:7;8927:23;8923:33;8920:53;;;8969:1;8966;8959:12;8920:53;8992:29;9011:9;8992:29;:::i;:::-;8982:39;;9040:38;9074:2;9063:9;9059:18;9040:38;:::i;:::-;9030:48;;9125:2;9114:9;9110:18;9097:32;9087:42;;9180:2;9169:9;9165:18;9152:32;9207:18;9199:6;9196:30;9193:50;;;9239:1;9236;9229:12;9193:50;9262:22;;9315:4;9307:13;;9303:27;-1:-1:-1;9293:55:22;;9344:1;9341;9334:12;9293:55;9367:74;9433:7;9428:2;9415:16;9410:2;9406;9402:11;9367:74;:::i;:::-;9357:84;;;8780:667;;;;;;;:::o;9710:256::-;9776:6;9784;9837:2;9825:9;9816:7;9812:23;9808:32;9805:52;;;9853:1;9850;9843:12;9805:52;9876:29;9895:9;9876:29;:::i;:::-;9866:39;;9924:36;9956:2;9945:9;9941:18;9924:36;:::i;:::-;9914:46;;9710:256;;;;;:::o;9971:260::-;10039:6;10047;10100:2;10088:9;10079:7;10075:23;10071:32;10068:52;;;10116:1;10113;10106:12;10068:52;10139:29;10158:9;10139:29;:::i;:::-;10129:39;;10187:38;10221:2;10210:9;10206:18;10187:38;:::i;10597:437::-;10676:1;10672:12;;;;10719;;;10740:61;;10794:4;10786:6;10782:17;10772:27;;10740:61;10847:2;10839:6;10836:14;10816:18;10813:38;10810:218;;;-1:-1:-1;;;10881:1:22;10874:88;10985:4;10982:1;10975:15;11013:4;11010:1;11003:15;16610:184;-1:-1:-1;;;16659:1:22;16652:88;16759:4;16756:1;16749:15;16783:4;16780:1;16773:15;16799:112;16831:1;16857;16847:35;;16862:18;;:::i;:::-;-1:-1:-1;16896:9:22;;16799:112::o;16916:184::-;16986:6;17039:2;17027:9;17018:7;17014:23;17010:32;17007:52;;;17055:1;17052;17045:12;17007:52;-1:-1:-1;17078:16:22;;16916:184;-1:-1:-1;16916:184:22:o;17747:::-;-1:-1:-1;;;17796:1:22;17789:88;17896:4;17893:1;17886:15;17920:4;17917:1;17910:15;17936:128;17976:3;18007:1;18003:6;18000:1;17997:13;17994:39;;;18013:18;;:::i;:::-;-1:-1:-1;18049:9:22;;17936:128::o;19101:135::-;19140:3;-1:-1:-1;;19161:17:22;;19158:43;;;19181:18;;:::i;:::-;-1:-1:-1;19228:1:22;19217:13;;19101:135::o;19654:184::-;-1:-1:-1;;;19703:1:22;19696:88;19803:4;19800:1;19793:15;19827:4;19824:1;19817:15;22373:470;22552:3;22590:6;22584:13;22606:53;22652:6;22647:3;22640:4;22632:6;22628:17;22606:53;:::i;:::-;22722:13;;22681:16;;;;22744:57;22722:13;22681:16;22778:4;22766:17;;22744:57;:::i;:::-;22817:20;;22373:470;-1:-1:-1;;;;22373:470:22:o;25175:125::-;25215:4;25243:1;25240;25237:8;25234:34;;;25248:18;;:::i;:::-;-1:-1:-1;25285:9:22;;25175:125::o;25305:187::-;25344:1;25370:6;25403:2;25400:1;25396:10;25425:3;25415:37;;25432:18;;:::i;:::-;25470:10;;25466:20;;;;;25305:187;-1:-1:-1;;25305:187:22:o;25497:258::-;25536:7;25568:6;25601:2;25598:1;25594:10;25631:2;25628:1;25624:10;25687:3;25683:2;25679:12;25674:3;25671:21;25664:3;25657:11;25650:19;25646:47;25643:73;;;25696:18;;:::i;:::-;25736:13;;25497:258;-1:-1:-1;;;;25497:258:22:o;26311:168::-;26351:7;26417:1;26413;26409:6;26405:14;26402:1;26399:21;26394:1;26387:9;26380:17;26376:45;26373:71;;;26424:18;;:::i;:::-;-1:-1:-1;26464:9:22;;26311:168::o;26834:204::-;26872:3;26908:4;26905:1;26901:12;26940:4;26937:1;26933:12;26975:3;26969:4;26965:14;26960:3;26957:23;26954:49;;;26983:18;;:::i;:::-;27019:13;;26834:204;-1:-1:-1;;;26834:204:22:o;28504:120::-;28544:1;28570;28560:35;;28575:18;;:::i;:::-;-1:-1:-1;28609:9:22;;28504:120::o;28863:512::-;29057:4;-1:-1:-1;;;;;29167:2:22;29159:6;29155:15;29144:9;29137:34;29219:2;29211:6;29207:15;29202:2;29191:9;29187:18;29180:43;;29259:6;29254:2;29243:9;29239:18;29232:34;29302:3;29297:2;29286:9;29282:18;29275:31;29323:46;29364:3;29353:9;29349:19;29341:6;29323:46;:::i;:::-;29315:54;28863:512;-1:-1:-1;;;;;;28863:512:22:o;29380:249::-;29449:6;29502:2;29490:9;29481:7;29477:23;29473:32;29470:52;;;29518:1;29515;29508:12;29470:52;29550:9;29544:16;29569:30;29593:5;29569:30;:::i;29634:184::-;-1:-1:-1;;;29683:1:22;29676:88;29783:4;29780:1;29773:15;29807:4;29804:1;29797:15
Swarm Source
none
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.