Polygon Sponsored slots available. Book your slot here!
Contract Overview
Txn Hash |
Method
|
Block
|
From
|
To
|
Value | [Txn Fee] | |||
---|---|---|---|---|---|---|---|---|---|
0xee8b02b3f509580a4200d315b0320baa5c5489d91358b0f32b7da5fd1c1598d1 | Safe Transfer Fr... | 43398392 | 9 days 18 hrs ago | 0x6c1c7b43f81cd620566b2247c2d763d2c36b13f5 | IN | 0xdc349913d53b446485e98b76800b6254f43df695 | 0 MATIC | 0.015239455566 | |
0xb7f85d90a517d8097ee56556ab38bf92171898cacd0b2be968830b1eb6344f41 | Safe Transfer Fr... | 43398385 | 9 days 18 hrs ago | 0x6c1c7b43f81cd620566b2247c2d763d2c36b13f5 | IN | 0xdc349913d53b446485e98b76800b6254f43df695 | 0 MATIC | 0.016758039613 | |
0xb05ade70d7fb76122165a311f72125d3285842960c3318d7300ec82b21bc02e2 | Safe Transfer Fr... | 43398380 | 9 days 18 hrs ago | 0x6c1c7b43f81cd620566b2247c2d763d2c36b13f5 | IN | 0xdc349913d53b446485e98b76800b6254f43df695 | 0 MATIC | 0.016676623993 | |
0xd8799d22e49267348846be8564cd6e82a89f5f987e99ba974e2f3ee58e216b6c | Safe Transfer Fr... | 43398373 | 9 days 18 hrs ago | 0x6c1c7b43f81cd620566b2247c2d763d2c36b13f5 | IN | 0xdc349913d53b446485e98b76800b6254f43df695 | 0 MATIC | 0.013214960723 | |
0x95ed5adfbeaeb4c1cedcc3d1201fc6f2ecfbcb5fbc6975d1713b64756b5a300c | Safe Transfer Fr... | 43398366 | 9 days 18 hrs ago | 0x6c1c7b43f81cd620566b2247c2d763d2c36b13f5 | IN | 0xdc349913d53b446485e98b76800b6254f43df695 | 0 MATIC | 0.014934333449 | |
0x6d07078b3e5a3eeca9da0242c168250e557f3d8edda32081a32674a4b2a3c71c | Safe Transfer Fr... | 43398360 | 9 days 18 hrs ago | 0x6c1c7b43f81cd620566b2247c2d763d2c36b13f5 | IN | 0xdc349913d53b446485e98b76800b6254f43df695 | 0 MATIC | 0.015163618871 | |
0x6cbf65f64a6b5256d61bbc83651ae772820e49c0d2b5e7366cb44b48f21f05af | Safe Transfer Fr... | 43398354 | 9 days 18 hrs ago | 0x6c1c7b43f81cd620566b2247c2d763d2c36b13f5 | IN | 0xdc349913d53b446485e98b76800b6254f43df695 | 0 MATIC | 0.019122527376 | |
0xdacdf08956346613160d07ce3ce9890553f3bfded65d9d993413b52e7a5dda09 | Safe Transfer Fr... | 43398349 | 9 days 18 hrs ago | 0x6c1c7b43f81cd620566b2247c2d763d2c36b13f5 | IN | 0xdc349913d53b446485e98b76800b6254f43df695 | 0 MATIC | 0.016666085975 | |
0xb2177fd7103f609766fb2d49411c5c74b4e3111592509bfb648e8882057ce9b1 | Safe Transfer Fr... | 43398342 | 9 days 18 hrs ago | 0x6c1c7b43f81cd620566b2247c2d763d2c36b13f5 | IN | 0xdc349913d53b446485e98b76800b6254f43df695 | 0 MATIC | 0.015251735094 | |
0xa4058d29ca337fc3d47cc54b13c9424b1f9fe8c652bbdd7d0fe3c4a6559c22b5 | Transfer From | 43235776 | 13 days 20 hrs ago | 0x302c418b11e8c57c6ef57e94266ca055e0b8da41 | IN | 0xdc349913d53b446485e98b76800b6254f43df695 | 0 MATIC | 0.005787632094 | |
0x70e2037634a458ba122ee5d0458b49d57f8b6cf67e21ffa989e01be4bacbeac6 | Transfer From | 43235776 | 13 days 20 hrs ago | 0x302c418b11e8c57c6ef57e94266ca055e0b8da41 | IN | 0xdc349913d53b446485e98b76800b6254f43df695 | 0 MATIC | 0.005623818905 | |
0x6f8d23ac87f8cdde2fe6eb44779caab68da9ff79de483f351db2444d34055e6e | Safe Transfer Fr... | 42589420 | 30 days 3 hrs ago |
| IN | 0xdc349913d53b446485e98b76800b6254f43df695 | 0 MATIC | 0.013266371992 | |
0x313584fbad163abfce4b7a82ae461dd819c54a03962fd5e307aef54ff490b87e | Safe Transfer Fr... | 42589411 | 30 days 3 hrs ago |
| IN | 0xdc349913d53b446485e98b76800b6254f43df695 | 0 MATIC | 0.012100879278 | |
0x1410d1dc710d21198b22931982b438376865cf3f0a76d6dd10dc0cce7f710205 | Safe Transfer Fr... | 42589402 | 30 days 3 hrs ago |
| IN | 0xdc349913d53b446485e98b76800b6254f43df695 | 0 MATIC | 0.012052470421 | |
0xa02ceeebe88f794b2d33d240cca3323d7b72fe8d19933b7631fe8506cf3ea7e2 | Safe Transfer Fr... | 42588942 | 30 days 3 hrs ago |
| IN | 0xdc349913d53b446485e98b76800b6254f43df695 | 0 MATIC | 0.011678208459 | |
0x0ec8b525c6ebdbf48d84ec32821bc69e70fadc7e2255eefe69eaccb8a16da896 | Safe Transfer Fr... | 42588934 | 30 days 3 hrs ago |
| IN | 0xdc349913d53b446485e98b76800b6254f43df695 | 0 MATIC | 0.011560666254 | |
0x45448cb21064b3149d3a7f8c9082d15b10d26e157535d246c19d26b6757be202 | Safe Transfer Fr... | 42588920 | 30 days 3 hrs ago |
| IN | 0xdc349913d53b446485e98b76800b6254f43df695 | 0 MATIC | 0.013865454274 | |
0x6896177c514266cfd7b977f8e5e6e6723752d395827b825ad0ffcddec3af7640 | Safe Transfer Fr... | 42588910 | 30 days 3 hrs ago |
| IN | 0xdc349913d53b446485e98b76800b6254f43df695 | 0 MATIC | 0.015347079018 | |
0x7a29a4f16f2cd390280be9408ae8562830749425ceb487300a4d44a66b703af3 | Safe Transfer Fr... | 42588902 | 30 days 3 hrs ago |
| IN | 0xdc349913d53b446485e98b76800b6254f43df695 | 0 MATIC | 0.014824351292 | |
0xb8f37bce4f0347e56b4cd75f04525de0cd69b2b925600c08da7c56eef841f69e | Safe Transfer Fr... | 42588892 | 30 days 3 hrs ago |
| IN | 0xdc349913d53b446485e98b76800b6254f43df695 | 0 MATIC | 0.012600190867 | |
0x4a9cb0f4e15c1401092d54dba44e2dfe1b88748404fe8d37afd2b12602a5f3f7 | Safe Transfer Fr... | 42588881 | 30 days 4 hrs ago |
| IN | 0xdc349913d53b446485e98b76800b6254f43df695 | 0 MATIC | 0.014444817373 | |
0x08d592c2ccc3bbec1d0e25e0089daf727a9cf8ce3a81e2fa4b47233a435e6ff0 | Set Approval For... | 41675593 | 53 days 10 hrs ago | 0x942967cec3e1037539e657c7ff97541a5deb7a0c | IN | 0xdc349913d53b446485e98b76800b6254f43df695 | 0 MATIC | 0.0104487072 | |
0x80b548dbfe3a314c028516a331ed74d3d2955c4f4d29c72ac76678e871e2c441 | Set Approval For... | 41675546 | 53 days 10 hrs ago | 0x377c04f6d765f9b3a0974b5ba1879db092d730b6 | IN | 0xdc349913d53b446485e98b76800b6254f43df695 | 0 MATIC | 0.015076783977 | |
0x7c84182fef1a00c246428d60aa967c1ae34759e48ae9497ef972670a99ea7669 | Set Approval For... | 41675492 | 53 days 10 hrs ago | 0xc5df6890bec9d51b9803c6d95aa2b8a2952334ac | IN | 0xdc349913d53b446485e98b76800b6254f43df695 | 0 MATIC | 0.019788884037 | |
0xf0ee774bf5635bbbc59ee43232f715657efaf1bf2f197fa68c22996cbd6a8fa1 | Set Approval For... | 41675444 | 53 days 10 hrs ago | 0x27fec6e36cc0b77619ad31bc4c9677351d4fcccc | IN | 0xdc349913d53b446485e98b76800b6254f43df695 | 0 MATIC | 0.021002345912 |
[ Download CSV Export ]
Contract Name:
Bezogis
Compiler Version
v0.8.0+commit.c7dfd78e
Contract Source Code (Solidity Multiple files format)
// @openzeppelin v3.2.0 // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./ERC20.sol"; import "./ERC721.sol"; import "./ERC721Enumerable.sol"; import "./ERC721Burnable.sol"; import "./ERC721Pausable.sol"; import "./AccessControlEnumerable.sol"; import "./Context.sol"; import "./Address.sol"; import "./EnumerableSet.sol"; import "./Ownable.sol"; import "./VRFConsumerBase.sol"; contract Bezogis is Context, AccessControlEnumerable, ERC721Enumerable, ERC721Burnable, ERC721Pausable , Ownable , VRFConsumerBase( 0x3d2341ADb2D31f1c5530cDC622016af293177AE0, // Polygon (Matic) Mainnet - VRF Coordinator 0xb0897686c545045aFc77CF20eC7A532E3120E0F1 // Polygon (Matic) Mainnet - LINK Token ) { using Strings for uint256; using Address for address; using EnumerableSet for EnumerableSet.UintSet; bytes32 private constant MINTER_ROLE = keccak256("MINTER_ROLE"); // 0=defaultURI uint256 private constant MIN_BEZOGI_URI = 1; // 0=defaultURI string private constant DEFAULT_BEZOGI_URI = "0"; // max NFT supply uint256 private MAX_NFT_SUPPLY = 0; // transfer the tokens from the sender to this contract IERC20 private _posWETHToken; // baseURI string private _baseTokenURI; // mapping for bezogi URIs=[1-4096](Uint256) EnumerableSet.UintSet private _uriSet; // mapping for token requestId mapping(bytes32 => uint256) private _requestIdTokenId; // total summoned bezogi uint256 private _totalSummonedBezogi = 0; // summoning mapping(uint256 => bool) private _summoning; // bezogi price,[4097-MAX] uint256 private _bezogiPrice = 1 ether; // sale available bool private _saleAvailable = false; // pre-sale available bool private _presaleAvailable = true; // transfer available bool private _transferAvailable = false; // summon available bool private _summonAvailable = false; // mapping for token URIs mapping(uint256 => string) private _tokenURIs; // presale whitelist mapping(address => bool) private _presaleWhitelist; // mapping for token transfer blacklist mapping (address => EnumerableSet.UintSet) private _tokenBlacklist; constructor( ) ERC721("Bezogis", "BEZOGIS") { _baseTokenURI = "https://api.bezoge.com/token/api/nft/"; // Polygon (Matic) Mainnet keyHash = 0xf86195cf7690c55907b2b611ebb7343a6f649bff128701cc542f0569e2c549da; fee = 0.0001 * 10 ** 18; // 0.0001 LINK (Varies by network) _posWETHToken = IERC20(0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619); _setupRole(DEFAULT_ADMIN_ROLE, msg.sender); } function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } function ownerInitMaxNFTSupply(uint256 maxNFTSupply) onlyOwner public { require(maxNFTSupply > MAX_NFT_SUPPLY, "ERC721: maxNFTSupply value is incorrect"); for (uint256 i = (MAX_NFT_SUPPLY + MIN_BEZOGI_URI); i <= maxNFTSupply; i++) { _uriSet.add(i); } MAX_NFT_SUPPLY = maxNFTSupply; } function ownerMintNFT(uint256 total) onlyOwner public { for (uint256 i = 0; i < total; i++) { uint256 mintIndex = totalSupply(); _safeMint(msg.sender, mintIndex); } } function minterMintWithSummon(address to) public { require(hasRole(MINTER_ROLE, msg.sender), "ERC721: must have minter role to mint"); require(to != address(0), "ERC721: cannot mint to zero address"); // 4096 uint256 mintIndex = totalSupply(); require(mintIndex >= MAX_NFT_SUPPLY, "ERC721: mintIndex value is incorrect"); // [4096,4120)=[4096,4119] _safeMint(to, mintIndex); summonTokenWithURI(mintIndex,(mintIndex + 1).toString()); MAX_NFT_SUPPLY = MAX_NFT_SUPPLY + 1; } function ownerSetBaseTokenURI(string memory baseTokenURI) onlyOwner public { _baseTokenURI = baseTokenURI; } function ownerSetSaleAvailable(bool saleAvailable) onlyOwner public { _saleAvailable = saleAvailable; } function ownerSetSummonAvailable(bool summonAvailable) onlyOwner public { _summonAvailable = summonAvailable; } function ownerSetTransferAvailable(bool transferAvailable) onlyOwner public { _transferAvailable = transferAvailable; } function ownerSetPresaleAvailable(bool presaleAvailable) onlyOwner public { _presaleAvailable = presaleAvailable; } function ownerSetBezogiPrice(uint256 bezogiPrice) onlyOwner public { _bezogiPrice = bezogiPrice; } /** * @dev Withdraw ether from this contract (Callable by owner) */ function ownerWithdrawWETH() onlyOwner public { require(_posWETHToken.transfer(msg.sender, _posWETHToken.balanceOf(address(this))), "Unable to transfer WETH"); } /** * @dev Withdraw LINK from this contract (Callable by owner) */ function ownerWithdrawLink() onlyOwner public { LinkTokenInterface link = LinkTokenInterface(chainlinkTokenAddress()); require(link.transfer(msg.sender, link.balanceOf(address(this))), "Unable to transfer LINK"); } function pause() onlyOwner public virtual { _pause(); } function unpause() onlyOwner public virtual { _unpause(); } function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override(ERC721, ERC721Enumerable, ERC721Pausable) { require(from == address(0) || getTransferAvailable(), "Unable to transfer during NFT sale."); require(!publicTokenBlacklisted(from,tokenId), "Unable to transfer, your token is blacklisted"); super._beforeTokenTransfer(from, to, tokenId); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(AccessControlEnumerable,ERC721, ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } function getUriSetAtIndex(uint256 index) public view returns (uint256) { return _uriSet.at(index); } function getSummonAvailable() public view returns (bool) { return _summonAvailable; } function getTransferAvailable() public view returns (bool) { return _transferAvailable; } function getSaleAvailable() public view returns (bool) { return _saleAvailable; } function getPresaleAvailable() public view returns (bool) { return _presaleAvailable; } function getMaxNFTSupply() public view returns (uint256) { return MAX_NFT_SUPPLY; } function getTotalSummonedBezogi() public view returns (uint256) { return _totalSummonedBezogi; } function getAvailableBezogiURILength() public view returns (uint256) { return MAX_NFT_SUPPLY - getTotalSummonedBezogi(); } function getTokenSummoned(uint256 tokenId) public view returns (bool) { return bytes(_tokenURIs[tokenId]).length != 0; } function getBaseTokenURI() public view returns (string memory) { return _baseTokenURI; } function getBezogiPrice() public view returns (uint256) { return _bezogiPrice; } function publicSummonNFT(uint256 tokenId) public{ require(getSummonAvailable(), "ERC721: summon unavailable"); require(_exists(tokenId), "ERC721: operator query for nonexistent token"); require(!getTokenSummoned(tokenId), "ERC721: token has been summoned"); require(!_summoning[tokenId], "ERC721: token is summoning"); uint256 availableBezogiURILength = getAvailableBezogiURILength(); require(availableBezogiURILength > 0, "ERC721: no available bezogi"); address owner = ownerOf(tokenId); require(msg.sender == owner,"ERC721: only owner can summon"); _summoning[tokenId] = true; bytes32 requestId = getRandomNumber(); _requestIdTokenId[requestId] = tokenId; } /** * @dev Mints bezogi */ function publicMintNFT(uint256 numberOfNfts) public { // totalSupply() = [0,4096],MAX_NFT_SUPPLY=4096 require(totalSupply() < MAX_NFT_SUPPLY, "Sale has already ended"); require(numberOfNfts > 0, "numberOfNfts cannot be 0"); require((totalSupply() + numberOfNfts) <= MAX_NFT_SUPPLY, "Exceeds MAX_NFT_SUPPLY"); require(getSaleAvailable(), "Sale has not started"); require(_posWETHToken.allowance(msg.sender, address(this)) >= (publicGetNFTPrice() * numberOfNfts), "Ether allowance value is incorrect"); require(_posWETHToken.balanceOf(msg.sender) >= (publicGetNFTPrice() * numberOfNfts), "Insufficient WETH balance"); if(getPresaleAvailable()){ require(publicPresaleWhitelisted(msg.sender), "You are not on the pre-sale whitelist"); require(numberOfNfts <= 3, "You may not mint more than 3 NFTs during presale"); // max 3 NFT uint256 nftBalance = balanceOf(msg.sender) + numberOfNfts; require(nftBalance <= 3, "ERC721: You cannot mint more than 3 NFTs during presale"); } else { require(numberOfNfts <= 10, "You may not mint more than 10 NFTs"); // max 10 NFT uint256 nftBalance = balanceOf(msg.sender) + numberOfNfts; require(nftBalance <= 10, "ERC721: You cannot mint more than 10 NFTs"); } _posWETHToken.transferFrom(msg.sender, address(this), (publicGetNFTPrice() * numberOfNfts)); for (uint256 i = 0; i < numberOfNfts; i++) { uint256 mintIndex = totalSupply(); _safeMint(msg.sender, mintIndex); } } function publicGetWETHAllowance(address _address) public view returns (uint256) { return _posWETHToken.allowance(_address, address(this)); } /** * @dev Gets current Bezogi Price */ function publicGetNFTPrice() public view returns (uint256) { uint currentSupply = totalSupply(); // totalSupply() = [0,4096],MAX_NFT_SUPPLY=4096 if (currentSupply >= 4096) { return _bezogiPrice; } else if (currentSupply >= 4000) { return 0.16 ether; } else if (currentSupply >= 3000) { return 0.096 ether; } else if (currentSupply >= 2000) { return 0.064 ether; } else if (currentSupply >= 750) { return 0.032 ether; } else if (currentSupply >= 0) { return 0.0032 ether; } else { return 0.16 ether; } } /***********************************CHAINLINK****************************************** */ bytes32 internal keyHash; uint256 internal fee; /** * Requests randomness */ function getRandomNumber() internal returns (bytes32 requestId) { require(LINK.balanceOf(address(this)) >= fee, "Not enough LINK"); return requestRandomness(keyHash, fee); } /** * Callback function used by VRF Coordinator */ function fulfillRandomness(bytes32 requestId, uint256 randomness) internal override { // [0-4096] uint256 availableBezogiURILength = getAvailableBezogiURILength(); uint256 tokenId = _requestIdTokenId[requestId]; uint256 randomIndex = 0; if(availableBezogiURILength > 0){ // [0,4096)=[0-4095] randomIndex = randomness % availableBezogiURILength; if(_exists(tokenId) && !getTokenSummoned(tokenId) && _summoning[tokenId]){ // _uriSet.length(); 4096 ,index=[0,4096) values=[1-4096] summonTokenWithURI(tokenId,_uriSet.at(randomIndex).toString()); _uriSet.remove(randomIndex); delete _summoning[tokenId]; } } } function summonTokenWithURI(uint256 tokenId, string memory bezogiURI) internal { _setTokenURI(tokenId, bezogiURI); _totalSummonedBezogi = _totalSummonedBezogi + 1; } function chainlinkTokenAddress() public pure returns (address) { return address(0xb0897686c545045aFc77CF20eC7A532E3120E0F1); } /***********************************CHAINLINK****************************************** */ /***********************************TOKEN URI****************************************** */ /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721URIStorage: URI query for nonexistent token"); string memory _tokenURI = _tokenURIs[tokenId]; string memory base = _baseURI(); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(base, _tokenURI)); } else { // return string(abi.encodePacked(base, "0")); return string(abi.encodePacked(base, DEFAULT_BEZOGI_URI)); } } /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token"); _tokenURIs[tokenId] = _tokenURI; } /** * @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 override { require(msg.sender == owner(), "ERC721URIStorage: owner required"); super._burn(tokenId); if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } } /***********************************TOKEN URI****************************************** */ /***********************************PRESALE-WHITELIST********************************** */ function ownerPresaleWhitelistAdd(address[] memory _addressArray) public onlyOwner { for (uint256 i = 0; i < _addressArray.length; i++) { _presaleWhitelist[_addressArray[i]] = true; } } function ownerPresaleWhitelistRemove(address[] memory _addressArray) public onlyOwner { for (uint256 i = 0; i < _addressArray.length; i++) { delete _presaleWhitelist[_addressArray[i]]; } } function publicPresaleWhitelisted(address _address) public view returns(bool) { return _presaleWhitelist[_address]; } /***********************************PRESALE-WHITELIST********************************** */ // /**********************************TOKEN-BLACKLIST********************************** */ function minterTokenBlacklistAdd(address _address,uint256 tokenId) public { require(hasRole(MINTER_ROLE, msg.sender) || hasRole(DEFAULT_ADMIN_ROLE, msg.sender), "ERC721: must have minter or admin role to add"); require(_address != address(0), "ERC721: Cannot add zero address to the blacklist"); _tokenBlacklist[_address].add(tokenId); } function minterTokenBlacklistRemove(address _address,uint256 tokenId) public { require(hasRole(MINTER_ROLE, msg.sender) || hasRole(DEFAULT_ADMIN_ROLE, msg.sender), "ERC721: must have minter or admin role to remove"); _tokenBlacklist[_address].remove(tokenId); } function publicTokenBlacklisted(address _address,uint256 tokenId) public view returns(bool) { return _tokenBlacklist[_address].contains(tokenId); } // /**********************************TOKEN-BLACKLIST********************************** */ }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./Context.sol"; import "./Strings.sol"; import "./ERC165.sol"; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { function hasRole(bytes32 role, address account) external view returns (bool); function getRoleAdmin(bytes32 role) external view returns (bytes32); function grantRole(bytes32 role, address account) external; function revokeRole(bytes32 role, address account) external; function renounceRole(bytes32 role, address account) external; } /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{20}) is missing role (0x[0-9a-f]{32})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role, _msgSender()); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{20}) is missing role (0x[0-9a-f]{32})$/ */ function _checkRole(bytes32 role, address account) internal view { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(uint160(account), 20), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { emit RoleAdminChanged(role, getRoleAdmin(role), adminRole); _roles[role].adminRole = adminRole; } function _grantRole(bytes32 role, address account) private { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } function _revokeRole(bytes32 role, address account) private { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./AccessControl.sol"; import "./EnumerableSet.sol"; /** * @dev External interface of AccessControlEnumerable declared to support ERC165 detection. */ interface IAccessControlEnumerable { function getRoleMember(bytes32 role, uint256 index) external view returns (address); function getRoleMemberCount(bytes32 role) external view returns (uint256); } /** * @dev Extension of {AccessControl} that allows enumerating the members of each role. */ abstract contract AccessControlEnumerable is IAccessControlEnumerable, AccessControl { using EnumerableSet for EnumerableSet.AddressSet; mapping(bytes32 => EnumerableSet.AddressSet) private _roleMembers; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControlEnumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) public view override returns (address) { return _roleMembers[role].at(index); } /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) public view override returns (uint256) { return _roleMembers[role].length(); } /** * @dev Overload {grantRole} to track enumerable memberships */ function grantRole(bytes32 role, address account) public virtual override { super.grantRole(role, account); _roleMembers[role].add(account); } /** * @dev Overload {revokeRole} to track enumerable memberships */ function revokeRole(bytes32 role, address account) public virtual override { super.revokeRole(role, account); _roleMembers[role].remove(account); } /** * @dev Overload {renounceRole} to track enumerable memberships */ function renounceRole(bytes32 role, address account) public virtual override { super.renounceRole(role, account); _roleMembers[role].remove(account); } /** * @dev Overload {_setupRole} to track enumerable memberships */ function _setupRole(bytes32 role, address account) internal virtual override { super._setupRole(role, account); _roleMembers[role].add(account); } }
// SPDX-License-Identifier: MIT 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); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private 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 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 pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } }
// SPDX-License-Identifier: MIT 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 pragma solidity ^0.8.0; import "./IERC20.sol"; import "./IERC20Metadata.sol"; import "./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 guidelines: functions revert instead * of 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: MIT pragma solidity ^0.8.0; import "./IERC721.sol"; import "./IERC721Receiver.sol"; import "./IERC721Metadata.sol"; import "./Address.sol"; import "./Context.sol"; import "./Strings.sol"; import "./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 { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).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 pragma solidity ^0.8.0; import "./ERC721.sol"; import "./Context.sol"; /** * @title ERC721 Burnable Token * @dev ERC721 Token that can be irreversibly burned (destroyed). */ abstract contract ERC721Burnable is Context, ERC721 { /** * @dev Burns `tokenId`. See {ERC721-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) public virtual { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved"); _burn(tokenId); } }
// SPDX-License-Identifier: MIT 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: MIT pragma solidity ^0.8.0; import "./ERC721.sol"; import "./Pausable.sol"; /** * @dev ERC721 token with pausable token transfers, minting and burning. * * Useful for scenarios such as preventing trades until the end of an evaluation * period, or having an emergency switch for freezing all token transfers in the * event of a large bug. */ abstract contract ERC721Pausable is ERC721, Pausable { /** * @dev See {ERC721-_beforeTokenTransfer}. * * Requirements: * * - the contract must not be paused. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); require(!paused(), "ERC721Pausable: token transfer while paused"); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.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 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 pragma solidity ^0.8.0; import "./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 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 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 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 pragma solidity ^0.8.0; interface LinkTokenInterface { function allowance( address owner, address spender ) external view returns ( uint256 remaining ); function approve( address spender, uint256 value ) external returns ( bool success ); function balanceOf( address owner ) external view returns ( uint256 balance ); function decimals() external view returns ( uint8 decimalPlaces ); function decreaseApproval( address spender, uint256 addedValue ) external returns ( bool success ); function increaseApproval( address spender, uint256 subtractedValue ) external; function name() external view returns ( string memory tokenName ); function symbol() external view returns ( string memory tokenSymbol ); function totalSupply() external view returns ( uint256 totalTokensIssued ); function transfer( address to, uint256 value ) external returns ( bool success ); function transferAndCall( address to, uint256 value, bytes calldata data ) external returns ( bool success ); function transferFrom( address from, address to, uint256 value ) external returns ( bool success ); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./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() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./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 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 pragma solidity ^0.8.0; import "./LinkTokenInterface.sol"; import "./VRFRequestIDBase.sol"; /** **************************************************************************** * @notice Interface for contracts using VRF randomness * ***************************************************************************** * @dev PURPOSE * * @dev Reggie the Random Oracle (not his real job) wants to provide randomness * @dev to Vera the verifier in such a way that Vera can be sure he's not * @dev making his output up to suit himself. Reggie provides Vera a public key * @dev to which he knows the secret key. Each time Vera provides a seed to * @dev Reggie, he gives back a value which is computed completely * @dev deterministically from the seed and the secret key. * * @dev Reggie provides a proof by which Vera can verify that the output was * @dev correctly computed once Reggie tells it to her, but without that proof, * @dev the output is indistinguishable to her from a uniform random sample * @dev from the output space. * * @dev The purpose of this contract is to make it easy for unrelated contracts * @dev to talk to Vera the verifier about the work Reggie is doing, to provide * @dev simple access to a verifiable source of randomness. * ***************************************************************************** * @dev USAGE * * @dev Calling contracts must inherit from VRFConsumerBase, and can * @dev initialize VRFConsumerBase's attributes in their constructor as * @dev shown: * * @dev contract VRFConsumer { * @dev constuctor(<other arguments>, address _vrfCoordinator, address _link) * @dev VRFConsumerBase(_vrfCoordinator, _link) public { * @dev <initialization with other arguments goes here> * @dev } * @dev } * * @dev The oracle will have given you an ID for the VRF keypair they have * @dev committed to (let's call it keyHash), and have told you the minimum LINK * @dev price for VRF service. Make sure your contract has sufficient LINK, and * @dev call requestRandomness(keyHash, fee, seed), where seed is the input you * @dev want to generate randomness from. * * @dev Once the VRFCoordinator has received and validated the oracle's response * @dev to your request, it will call your contract's fulfillRandomness method. * * @dev The randomness argument to fulfillRandomness is the actual random value * @dev generated from your seed. * * @dev The requestId argument is generated from the keyHash and the seed by * @dev makeRequestId(keyHash, seed). If your contract could have concurrent * @dev requests open, you can use the requestId to track which seed is * @dev associated with which randomness. See VRFRequestIDBase.sol for more * @dev details. (See "SECURITY CONSIDERATIONS" for principles to keep in mind, * @dev if your contract could have multiple requests in flight simultaneously.) * * @dev Colliding `requestId`s are cryptographically impossible as long as seeds * @dev differ. (Which is critical to making unpredictable randomness! See the * @dev next section.) * * ***************************************************************************** * @dev SECURITY CONSIDERATIONS * * @dev A method with the ability to call your fulfillRandomness method directly * @dev could spoof a VRF response with any random value, so it's critical that * @dev it cannot be directly called by anything other than this base contract * @dev (specifically, by the VRFConsumerBase.rawFulfillRandomness method). * * @dev For your users to trust that your contract's random behavior is free * @dev from malicious interference, it's best if you can write it so that all * @dev behaviors implied by a VRF response are executed *during* your * @dev fulfillRandomness method. If your contract must store the response (or * @dev anything derived from it) and use it later, you must ensure that any * @dev user-significant behavior which depends on that stored value cannot be * @dev manipulated by a subsequent VRF request. * * @dev Similarly, both miners and the VRF oracle itself have some influence * @dev over the order in which VRF responses appear on the blockchain, so if * @dev your contract could have multiple VRF requests in flight simultaneously, * @dev you must ensure that the order in which the VRF responses arrive cannot * @dev be used to manipulate your contract's user-significant behavior. * * @dev Since the ultimate input to the VRF is mixed with the block hash of the * @dev block in which the request is made, user-provided seeds have no impact * @dev on its economic security properties. They are only included for API * @dev compatability with previous versions of this contract. * * @dev Since the block hash of the block which contains the requestRandomness * @dev call is mixed into the input to the VRF *last*, a sufficiently powerful * @dev miner could, in principle, fork the blockchain to evict the block * @dev containing the request, forcing the request to be included in a * @dev different block with a different hash, and therefore a different input * @dev to the VRF. However, such an attack would incur a substantial economic * @dev cost. This cost scales with the number of blocks the VRF oracle waits * @dev until it calls responds to a request. */ abstract contract VRFConsumerBase is VRFRequestIDBase { /** * @notice fulfillRandomness handles the VRF response. Your contract must * @notice implement it. See "SECURITY CONSIDERATIONS" above for important * @notice principles to keep in mind when implementing your fulfillRandomness * @notice method. * * @dev VRFConsumerBase expects its subcontracts to have a method with this * @dev signature, and will call it once it has verified the proof * @dev associated with the randomness. (It is triggered via a call to * @dev rawFulfillRandomness, below.) * * @param requestId The Id initially returned by requestRandomness * @param randomness the VRF output */ function fulfillRandomness( bytes32 requestId, uint256 randomness ) internal virtual; /** * @dev In order to keep backwards compatibility we have kept the user * seed field around. We remove the use of it because given that the blockhash * enters later, it overrides whatever randomness the used seed provides. * Given that it adds no security, and can easily lead to misunderstandings, * we have removed it from usage and can now provide a simpler API. */ uint256 constant private USER_SEED_PLACEHOLDER = 0; /** * @notice requestRandomness initiates a request for VRF output given _seed * * @dev The fulfillRandomness method receives the output, once it's provided * @dev by the Oracle, and verified by the vrfCoordinator. * * @dev The _keyHash must already be registered with the VRFCoordinator, and * @dev the _fee must exceed the fee specified during registration of the * @dev _keyHash. * * @dev The _seed parameter is vestigial, and is kept only for API * @dev compatibility with older versions. It can't *hurt* to mix in some of * @dev your own randomness, here, but it's not necessary because the VRF * @dev oracle will mix the hash of the block containing your request into the * @dev VRF seed it ultimately uses. * * @param _keyHash ID of public key against which randomness is generated * @param _fee The amount of LINK to send with the request * * @return requestId unique ID for this request * * @dev The returned requestId can be used to distinguish responses to * @dev concurrent requests. It is passed as the first argument to * @dev fulfillRandomness. */ function requestRandomness( bytes32 _keyHash, uint256 _fee ) internal returns ( bytes32 requestId ) { LINK.transferAndCall(vrfCoordinator, _fee, abi.encode(_keyHash, USER_SEED_PLACEHOLDER)); // This is the seed passed to VRFCoordinator. The oracle will mix this with // the hash of the block containing this request to obtain the seed/input // which is finally passed to the VRF cryptographic machinery. uint256 vRFSeed = makeVRFInputSeed(_keyHash, USER_SEED_PLACEHOLDER, address(this), nonces[_keyHash]); // nonces[_keyHash] must stay in sync with // VRFCoordinator.nonces[_keyHash][this], which was incremented by the above // successful LINK.transferAndCall (in VRFCoordinator.randomnessRequest). // This provides protection against the user repeating their input seed, // which would result in a predictable/duplicate output, if multiple such // requests appeared in the same block. nonces[_keyHash] = nonces[_keyHash] + 1; return makeRequestId(_keyHash, vRFSeed); } LinkTokenInterface immutable internal LINK; address immutable private vrfCoordinator; // Nonces for each VRF key from which randomness has been requested. // // Must stay in sync with VRFCoordinator[_keyHash][this] mapping(bytes32 /* keyHash */ => uint256 /* nonce */) private nonces; /** * @param _vrfCoordinator address of VRFCoordinator contract * @param _link address of LINK token contract * * @dev https://docs.chain.link/docs/link-token-contracts */ constructor( address _vrfCoordinator, address _link ) { vrfCoordinator = _vrfCoordinator; LINK = LinkTokenInterface(_link); } // rawFulfillRandomness is called by VRFCoordinator when it receives a valid VRF // proof. rawFulfillRandomness then calls fulfillRandomness, after validating // the origin of the call function rawFulfillRandomness( bytes32 requestId, uint256 randomness ) external { require(msg.sender == vrfCoordinator, "Only VRFCoordinator can fulfill"); fulfillRandomness(requestId, randomness); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract VRFRequestIDBase { /** * @notice returns the seed which is actually input to the VRF coordinator * * @dev To prevent repetition of VRF output due to repetition of the * @dev user-supplied seed, that seed is combined in a hash with the * @dev user-specific nonce, and the address of the consuming contract. The * @dev risk of repetition is mostly mitigated by inclusion of a blockhash in * @dev the final seed, but the nonce does protect against repetition in * @dev requests which are included in a single block. * * @param _userSeed VRF seed input provided by user * @param _requester Address of the requesting contract * @param _nonce User-specific nonce at the time of the request */ function makeVRFInputSeed( bytes32 _keyHash, uint256 _userSeed, address _requester, uint256 _nonce ) internal pure returns ( uint256 ) { return uint256(keccak256(abi.encode(_keyHash, _userSeed, _requester, _nonce))); } /** * @notice Returns the id for this request * @param _keyHash The serviceAgreement ID to be used for this request * @param _vRFInputSeed The seed to be passed directly to the VRF * @return The id for this request * * @dev Note that _vRFInputSeed is not the seed passed by the consuming * @dev contract, but the one generated by makeVRFInputSeed */ function makeRequestId( bytes32 _keyHash, uint256 _vRFInputSeed ) internal pure returns ( bytes32 ) { return keccak256(abi.encodePacked(_keyHash, _vRFInputSeed)); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","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"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"chainlinkTokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAvailableBezogiURILength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBaseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBezogiPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxNFTSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPresaleAvailable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSaleAvailable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSummonAvailable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTokenSummoned","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalSummonedBezogi","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTransferAvailable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getUriSetAtIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"address","name":"to","type":"address"}],"name":"minterMintWithSummon","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"minterTokenBlacklistAdd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"minterTokenBlacklistRemove","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxNFTSupply","type":"uint256"}],"name":"ownerInitMaxNFTSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"total","type":"uint256"}],"name":"ownerMintNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addressArray","type":"address[]"}],"name":"ownerPresaleWhitelistAdd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addressArray","type":"address[]"}],"name":"ownerPresaleWhitelistRemove","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseTokenURI","type":"string"}],"name":"ownerSetBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"bezogiPrice","type":"uint256"}],"name":"ownerSetBezogiPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"presaleAvailable","type":"bool"}],"name":"ownerSetPresaleAvailable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"saleAvailable","type":"bool"}],"name":"ownerSetSaleAvailable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"summonAvailable","type":"bool"}],"name":"ownerSetSummonAvailable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"transferAvailable","type":"bool"}],"name":"ownerSetTransferAvailable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ownerWithdrawLink","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ownerWithdrawWETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicGetNFTPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"publicGetWETHAllowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfNfts","type":"uint256"}],"name":"publicMintNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"publicPresaleWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"publicSummonNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"publicTokenBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"},{"internalType":"uint256","name":"randomness","type":"uint256"}],"name":"rawFulfillRandomness","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"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":[],"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":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60c06040526000600e819055601455670de0b6b3a76400006016556017805463ffff00001961ffff19909116610100171690553480156200003f57600080fd5b50733d2341adb2d31f1c5530cdc622016af293177ae073b0897686c545045afc77cf20ec7a532e3120e0f16040518060400160405280600781526020016642657a6f67697360c81b8152506040518060400160405280600781526020016642455a4f47495360c81b8152508160029080519060200190620000c292919062000393565b508051620000d890600390602084019062000393565b5050600c805460ff1916905550620000f9620000f3620001a8565b620001ac565b6001600160601b0319606092831b811660a05290821b166080526040805191820190526025808252620050ca60208301398051620001409160109160209091019062000393565b507ff86195cf7690c55907b2b611ebb7343a6f649bff128701cc542f0569e2c549da601b55655af3107a4000601c55600f80546001600160a01b031916737ceb23fd6bc0add59e62ac25578270cff1b9f619179055620001a260003362000206565b62000476565b3390565b600c80546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6200021d82826200024960201b620020601760201c565b6000828152600160209081526040909120620002449183906200206a62000259821b17901c565b505050565b62000255828262000279565b5050565b600062000270836001600160a01b03841662000303565b90505b92915050565b62000285828262000352565b62000255576000828152602081815260408083206001600160a01b03851684529091529020805460ff19166001179055620002bf620001a8565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60006200031183836200037b565b620003495750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000273565b50600062000273565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b60009081526001919091016020526040902054151590565b828054620003a19062000439565b90600052602060002090601f016020900481019282620003c5576000855562000410565b82601f10620003e057805160ff191683800117855562000410565b8280016001018555821562000410579182015b8281111562000410578251825591602001919060010190620003f3565b506200041e92915062000422565b5090565b5b808211156200041e576000815560010162000423565b6002810460018216806200044e57607f821691505b602082108114156200047057634e487b7160e01b600052602260045260246000fd5b50919050565b60805160601c60a05160601c614c1a620004b06000396000818161135e0152612d180152600081816125ad0152612ce90152614c1a6000f3fe608060405234801561001057600080fd5b50600436106103db5760003560e01c806378b3689c1161020a578063a8061b2011610125578063d2f6b2f7116100b8578063e985e9c511610087578063e985e9c5146107ac578063f2fde38b146107bf578063f75adec8146107d2578063fb91676c146107e5578063fe2e4b85146107ed576103db565b8063d2f6b2f714610776578063d5444a3e1461077e578063d547741f14610786578063e50b8f9014610799576103db565b8063c5f5579c116100f4578063c5f5579c14610735578063c87b56dd1461073d578063ca15c87314610750578063cce2034e14610763576103db565b8063a8061b20146106f4578063b603595414610707578063b88d4fde1461071a578063bdc32be01461072d576103db565b806395d89b411161019d578063a165b1601161016c578063a165b160146106be578063a217fddf146106c6578063a22cb465146106ce578063a6472b34146106e1576103db565b806395d89b41146106935780639a1466831461069b5780639e63041b146106a3578063a0e5916e146106b6576103db565b80638da5cb5b116101d95780638da5cb5b146106525780639010d07c1461065a57806391d148541461066d57806394985ddd14610680576103db565b806378b3689c1461061c5780638028e80c14610624578063832cbfd6146106375780638456cb591461064a576103db565b8063464cecce116102fa5780636352211e1161028d578063715018a61161025c578063715018a6146105e65780637206e3e5146105ee578063775ce03314610601578063786234cc14610614576103db565b80636352211e146105b05780636c8c59d2146105c35780637020b511146105cb57806370a08231146105d3576103db565b806355b3da7e116102c957806355b3da7e1461056f5780635be51b67146105825780635c3d7419146105955780635c975abb146105a8576103db565b8063464cecce146105235780634ac4a792146105365780634d9181d4146105495780634f6ccce71461055c576103db565b8063248a9ca3116103725780633f4ba83a116103415780633f4ba83a146104e257806342842e0e146104ea57806342966c68146104fd578063461a409614610510576103db565b8063248a9ca3146104965780632f2ff15d146104a95780632f745c59146104bc57806336568abe146104cf576103db565b8063177e2cf8116103ae578063177e2cf81461045357806318160ddd1461046657806319b25db81461047b57806323b872dd14610483576103db565b806301ffc9a7146103e057806306fdde0314610409578063081812fc1461041e578063095ea7b31461043e575b600080fd5b6103f36103ee366004613989565b610800565b6040516104009190613bd5565b60405180910390f35b610411610813565b6040516104009190613c0d565b61043161042c36600461392e565b6108a6565b6040516104009190613afd565b61045161044c36600461381f565b6108f2565b005b61045161046136600461392e565b61098a565b61046e610a29565b6040516104009190613be0565b61046e610a2f565b610451610491366004613735565b610a35565b61046e6104a436600461392e565b610a6d565b6104516104b7366004613946565b610a82565b61046e6104ca36600461381f565b610aa4565b6104516104dd366004613946565b610af9565b610451610b1b565b6104516104f8366004613735565b610b64565b61045161050b36600461392e565b610b7f565b6103f361051e36600461392e565b610bb2565b6104516105313660046136e9565b610bd4565b61046e6105443660046136e9565b610ca9565b61045161055736600461392e565b610d2c565b61046e61056a36600461392e565b610e63565b61045161057d366004613848565b610ebe565b6104516105903660046138f6565b610f77565b61046e6105a336600461392e565b610fd2565b6103f3610fdf565b6104316105be36600461392e565b610fe8565b61046e61101d565b6104316110b7565b61046e6105e13660046136e9565b6110cf565b610451611113565b6104516105fc36600461392e565b61115c565b61045161060f3660046139c1565b6111cf565b6103f3611221565b6103f3611231565b6103f36106323660046136e9565b611240565b6104516106453660046138f6565b61125e565b6104516112b0565b6104316112f7565b610431610668366004613968565b61130b565b6103f361067b366004613946565b61132a565b61045161068e366004613968565b611353565b6104116113a5565b6104516113b4565b6104516106b1366004613848565b611508565b6103f36115b4565b61046e6115bd565b61046e6115c3565b6104516106dc3660046137e9565b6115c8565b6104516106ef36600461392e565b611696565b61045161070236600461381f565b611a53565b6104516107153660046138f6565b611acc565b610451610728366004613770565b611b29565b610411611b68565b61046e611b77565b61041161074b36600461392e565b611b7d565b61046e61075e36600461392e565b611cb9565b6103f361077136600461381f565b611cd0565b6103f3611cf2565b61046e611d00565b610451610794366004613946565b611d1c565b6104516107a736600461381f565b611d26565b6103f36107ba366004613703565b611dc5565b6104516107cd3660046136e9565b611df3565b6104516107e036600461392e565b611e61565b610451611ea5565b6104516107fb3660046138f6565b612007565b600061080b8261207f565b90505b919050565b60606002805461082290614b14565b80601f016020809104026020016040519081016040528092919081815260200182805461084e90614b14565b801561089b5780601f106108705761010080835404028352916020019161089b565b820191906000526020600020905b81548152906001019060200180831161087e57829003601f168201915b505050505090505b90565b60006108b1826120a4565b6108d65760405162461bcd60e51b81526004016108cd90614352565b60405180910390fd5b506000908152600660205260409020546001600160a01b031690565b60006108fd82610fe8565b9050806001600160a01b0316836001600160a01b031614156109315760405162461bcd60e51b81526004016108cd9061450a565b806001600160a01b03166109436120c1565b6001600160a01b0316148061095f575061095f816107ba6120c1565b61097b5760405162461bcd60e51b81526004016108cd9061413e565b61098583836120c5565b505050565b6109926120c1565b6001600160a01b03166109a36112f7565b6001600160a01b0316146109c95760405162461bcd60e51b81526004016108cd9061439e565b600e5481116109ea5760405162461bcd60e51b81526004016108cd906147b3565b60006001600e546109fb9190614a6f565b90505b818111610a2357610a10601182612133565b5080610a1b81614b4f565b9150506109fe565b50600e55565b600a5490565b60165490565b610a46610a406120c1565b8261213f565b610a625760405162461bcd60e51b81526004016108cd90614699565b6109858383836121c4565b60009081526020819052604090206001015490565b610a8c82826122f1565b6000828152600160205260409020610985908261206a565b6000610aaf836110cf565b8210610acd5760405162461bcd60e51b81526004016108cd90613d55565b506001600160a01b03821660009081526008602090815260408083208484529091529020545b92915050565b610b038282612315565b60008281526001602052604090206109859082612357565b610b236120c1565b6001600160a01b0316610b346112f7565b6001600160a01b031614610b5a5760405162461bcd60e51b81526004016108cd9061439e565b610b6261236c565b565b61098583838360405180602001604052806000815250611b29565b610b8a610a406120c1565b610ba65760405162461bcd60e51b81526004016108cd9061491e565b610baf816123da565b50565b60008181526018602052604081208054610bcb90614b14565b15159392505050565b610bfe7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a63361132a565b610c1a5760405162461bcd60e51b81526004016108cd9061496e565b6001600160a01b038116610c405760405162461bcd60e51b81526004016108cd906140a8565b6000610c4a610a29565b9050600e54811015610c6e5760405162461bcd60e51b81526004016108cd90614064565b610c788282612452565b610c9481610c8f610c8a826001614a6f565b61246c565b612587565b600e54610ca2906001614a6f565b600e555050565b600f54604051636eb1769f60e11b81526000916001600160a01b03169063dd62ed3e90610cdc9085903090600401613b11565b60206040518083038186803b158015610cf457600080fd5b505afa158015610d08573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061080b9190613a07565b610d34611221565b610d505760405162461bcd60e51b81526004016108cd906144d3565b610d59816120a4565b610d755760405162461bcd60e51b81526004016108cd90614018565b610d7e81610bb2565b15610d9b5760405162461bcd60e51b81526004016108cd9061441c565b60008181526015602052604090205460ff1615610dca5760405162461bcd60e51b81526004016108cd906145e9565b6000610dd4611d00565b905060008111610df65760405162461bcd60e51b81526004016108cd90613d1e565b6000610e0183610fe8565b9050336001600160a01b03821614610e2b5760405162461bcd60e51b81526004016108cd90614620565b6000838152601560205260408120805460ff19166001179055610e4c6125a6565b600090815260136020526040902093909355505050565b6000610e6d610a29565b8210610e8b5760405162461bcd60e51b81526004016108cd906147fa565b600a8281548110610eac57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b610ec66120c1565b6001600160a01b0316610ed76112f7565b6001600160a01b031614610efd5760405162461bcd60e51b81526004016108cd9061439e565b60005b8151811015610f7357600160196000848481518110610f2f57634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580610f6b81614b4f565b915050610f00565b5050565b610f7f6120c1565b6001600160a01b0316610f906112f7565b6001600160a01b031614610fb65760405162461bcd60e51b81526004016108cd9061439e565b60178054911515620100000262ff000019909216919091179055565b600061080b601183612673565b600c5460ff1690565b6000818152600460205260408120546001600160a01b03168061080b5760405162461bcd60e51b81526004016108cd906141e5565b600080611028610a29565b9050611000811061103d5750506016546108a3565b610fa08110611057576702386f26fc1000009150506108a3565b610bb88110611071576701550f7dca7000009150506108a3565b6107d0811061108a5766e35fa931a000009150506108a3565b6102ee81106110a3576671afd498d000009150506108a3565b660b5e620f4800009150506108a3565b5090565b73b0897686c545045afc77cf20ec7a532e3120e0f190565b60006001600160a01b0382166110f75760405162461bcd60e51b81526004016108cd9061419b565b506001600160a01b031660009081526005602052604090205490565b61111b6120c1565b6001600160a01b031661112c6112f7565b6001600160a01b0316146111525760405162461bcd60e51b81526004016108cd9061439e565b610b62600061267f565b6111646120c1565b6001600160a01b03166111756112f7565b6001600160a01b03161461119b5760405162461bcd60e51b81526004016108cd9061439e565b60005b81811015610f735760006111b0610a29565b90506111bc3382612452565b50806111c781614b4f565b91505061119e565b6111d76120c1565b6001600160a01b03166111e86112f7565b6001600160a01b03161461120e5760405162461bcd60e51b81526004016108cd9061439e565b8051610f739060109060208401906135ad565b6017546301000000900460ff1690565b60175462010000900460ff1690565b6001600160a01b031660009081526019602052604090205460ff1690565b6112666120c1565b6001600160a01b03166112776112f7565b6001600160a01b03161461129d5760405162461bcd60e51b81526004016108cd9061439e565b6017805460ff1916911515919091179055565b6112b86120c1565b6001600160a01b03166112c96112f7565b6001600160a01b0316146112ef5760405162461bcd60e51b81526004016108cd9061439e565b610b626126d9565b600c5461010090046001600160a01b031690565b60008281526001602052604081206113239083612673565b9392505050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461139b5760405162461bcd60e51b81526004016108cd90614453565b610f738282612734565b60606003805461082290614b14565b6113bc6120c1565b6001600160a01b03166113cd6112f7565b6001600160a01b0316146113f35760405162461bcd60e51b81526004016108cd9061439e565b600f546040516370a0823160e01b81526001600160a01b039091169063a9059cbb90339083906370a082319061142d903090600401613afd565b60206040518083038186803b15801561144557600080fd5b505afa158015611459573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061147d9190613a07565b6040518363ffffffff1660e01b815260040161149a929190613b8c565b602060405180830381600087803b1580156114b457600080fd5b505af11580156114c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ec9190613912565b610b625760405162461bcd60e51b81526004016108cd90613df2565b6115106120c1565b6001600160a01b03166115216112f7565b6001600160a01b0316146115475760405162461bcd60e51b81526004016108cd9061439e565b60005b8151811015610f73576019600083838151811061157757634e487b7160e01b600052603260045260246000fd5b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169055806115ac81614b4f565b91505061154a565b60175460ff1690565b600e5490565b600081565b6115d06120c1565b6001600160a01b0316826001600160a01b031614156116015760405162461bcd60e51b81526004016108cd90613f4f565b806007600061160e6120c1565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff1916921515929092179091556116526120c1565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161168a9190613bd5565b60405180910390a35050565b600e546116a1610a29565b106116be5760405162461bcd60e51b81526004016108cd9061454b565b600081116116de5760405162461bcd60e51b81526004016108cd906145b2565b600e54816116ea610a29565b6116f49190614a6f565b11156117125760405162461bcd60e51b81526004016108cd90613edb565b61171a6115b4565b6117365760405162461bcd60e51b81526004016108cd906148f0565b8061173f61101d565b6117499190614a9b565b600f54604051636eb1769f60e11b81526001600160a01b039091169063dd62ed3e9061177b9033903090600401613b11565b60206040518083038186803b15801561179357600080fd5b505afa1580156117a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117cb9190613a07565b10156117e95760405162461bcd60e51b81526004016108cd906146ea565b806117f261101d565b6117fc9190614a9b565b600f546040516370a0823160e01b81526001600160a01b03909116906370a082319061182c903390600401613afd565b60206040518083038186803b15801561184457600080fd5b505afa158015611858573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061187c9190613a07565b101561189a5760405162461bcd60e51b81526004016108cd9061457b565b6118a2611cf2565b1561192c576118b033611240565b6118cc5760405162461bcd60e51b81526004016108cd90613f86565b60038111156118ed5760405162461bcd60e51b81526004016108cd9061472c565b6000816118f9336110cf565b6119039190614a6f565b905060038111156119265760405162461bcd60e51b81526004016108cd90614893565b50611988565b600a81111561194d5760405162461bcd60e51b81526004016108cd90614657565b600081611959336110cf565b6119639190614a6f565b9050600a8111156119865760405162461bcd60e51b81526004016108cd9061448a565b505b600f546001600160a01b03166323b872dd3330846119a461101d565b6119ae9190614a9b565b6040518463ffffffff1660e01b81526004016119cc93929190613b2b565b602060405180830381600087803b1580156119e657600080fd5b505af11580156119fa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a1e9190613912565b5060005b81811015610f73576000611a34610a29565b9050611a403382612452565b5080611a4b81614b4f565b915050611a22565b611a7d7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a63361132a565b80611a8e5750611a8e60003361132a565b611aaa5760405162461bcd60e51b81526004016108cd906142b1565b6001600160a01b0382166000908152601a6020526040902061098590826127d8565b611ad46120c1565b6001600160a01b0316611ae56112f7565b6001600160a01b031614611b0b5760405162461bcd60e51b81526004016108cd9061439e565b6017805491151563010000000263ff00000019909216919091179055565b611b3a611b346120c1565b8361213f565b611b565760405162461bcd60e51b81526004016108cd90614699565b611b62848484846127e4565b50505050565b60606010805461082290614b14565b60145490565b6060611b88826120a4565b611ba45760405162461bcd60e51b81526004016108cd90614301565b60008281526018602052604081208054611bbd90614b14565b80601f0160208091040260200160405190810160405280929190818152602001828054611be990614b14565b8015611c365780601f10611c0b57610100808354040283529160200191611c36565b820191906000526020600020905b815481529060010190602001808311611c1957829003601f168201915b505050505090506000611c47611b68565b9050805160001415611c5b5750905061080e565b815115611c8d578082604051602001611c75929190613a59565b6040516020818303038152906040529250505061080e565b80604051806040016040528060018152602001600360fc1b815250604051602001611c75929190613a59565b600081815260016020526040812061080b90612817565b6001600160a01b0382166000908152601a602052604081206113239083612822565b601754610100900460ff1690565b6000611d0a611b77565b600e54611d179190614aba565b905090565b610b03828261282e565b611d507f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a63361132a565b80611d615750611d6160003361132a565b611d7d5760405162461bcd60e51b81526004016108cd90614846565b6001600160a01b038216611da35760405162461bcd60e51b81526004016108cd90613c55565b6001600160a01b0382166000908152601a602052604090206109859082612133565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b611dfb6120c1565b6001600160a01b0316611e0c6112f7565b6001600160a01b031614611e325760405162461bcd60e51b81526004016108cd9061439e565b6001600160a01b038116611e585760405162461bcd60e51b81526004016108cd90613e29565b610baf8161267f565b611e696120c1565b6001600160a01b0316611e7a6112f7565b6001600160a01b031614611ea05760405162461bcd60e51b81526004016108cd9061439e565b601655565b611ead6120c1565b6001600160a01b0316611ebe6112f7565b6001600160a01b031614611ee45760405162461bcd60e51b81526004016108cd9061439e565b6000611eee6110b7565b9050806001600160a01b031663a9059cbb33836001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401611f2c9190613afd565b60206040518083038186803b158015611f4457600080fd5b505afa158015611f58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f7c9190613a07565b6040518363ffffffff1660e01b8152600401611f99929190613b8c565b602060405180830381600087803b158015611fb357600080fd5b505af1158015611fc7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611feb9190613912565b610baf5760405162461bcd60e51b81526004016108cd9061477c565b61200f6120c1565b6001600160a01b03166120206112f7565b6001600160a01b0316146120465760405162461bcd60e51b81526004016108cd9061439e565b601780549115156101000261ff0019909216919091179055565b610f73828261284d565b6000611323836001600160a01b0384166128d2565b60006001600160e01b0319821663780e9d6360e01b148061080b575061080b8261291c565b6000908152600460205260409020546001600160a01b0316151590565b3390565b600081815260066020526040902080546001600160a01b0319166001600160a01b03841690811790915581906120fa82610fe8565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061132383836128d2565b600061214a826120a4565b6121665760405162461bcd60e51b81526004016108cd90614018565b600061217183610fe8565b9050806001600160a01b0316846001600160a01b031614806121ac5750836001600160a01b03166121a1846108a6565b6001600160a01b0316145b806121bc57506121bc8185611dc5565b949350505050565b826001600160a01b03166121d782610fe8565b6001600160a01b0316146121fd5760405162461bcd60e51b81526004016108cd906143d3565b6001600160a01b0382166122235760405162461bcd60e51b81526004016108cd90613f0b565b61222e83838361295c565b6122396000826120c5565b6001600160a01b0383166000908152600560205260408120805460019290612262908490614aba565b90915550506001600160a01b0382166000908152600560205260408120805460019290612290908490614a6f565b909155505060008181526004602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6122fa82610a6d565b61230b816123066120c1565b6129c3565b610985838361284d565b61231d6120c1565b6001600160a01b0316816001600160a01b03161461234d5760405162461bcd60e51b81526004016108cd906149b3565b610f738282612a27565b6000611323836001600160a01b038416612aaa565b612374610fdf565b6123905760405162461bcd60e51b81526004016108cd90613cf0565b600c805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6123c36120c1565b6040516123d09190613afd565b60405180910390a1565b6123e26112f7565b6001600160a01b0316336001600160a01b0316146124125760405162461bcd60e51b81526004016108cd90613e6f565b61241b81612bc7565b6000818152601860205260409020805461243490614b14565b159050610baf576000818152601860205260408120610baf9161362d565b610f73828260405180602001604052806000815250612c6e565b60608161249157506040805180820190915260018152600360fc1b602082015261080e565b8160005b81156124bb57806124a581614b4f565b91506124b49050600a83614a87565b9150612495565b60008167ffffffffffffffff8111156124e457634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561250e576020820181803683370190505b5090505b84156121bc57612523600183614aba565b9150612530600a86614b6a565b61253b906030614a6f565b60f81b81838151811061255e57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350612580600a86614a87565b9450612512565b6125918282612ca1565b60145461259f906001614a6f565b6014555050565b6000601c547f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016125f79190613afd565b60206040518083038186803b15801561260f57600080fd5b505afa158015612623573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126479190613a07565b10156126655760405162461bcd60e51b81526004016108cd90614115565b611d17601b54601c54612ce5565b60006113238383612e20565b600c80546001600160a01b03838116610100818102610100600160a81b031985161790945560405193909204169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6126e1610fdf565b156126fe5760405162461bcd60e51b81526004016108cd906140eb565b600c805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586123c36120c1565b600061273e611d00565b60008481526013602052604081205491925082156127d1576127608385614b6a565b905061276b826120a4565b801561277d575061277b82610bb2565b155b8015612797575060008281526015602052604090205460ff165b156127d1576127ae82610c8f610c8a601185612673565b6127b96011826127d8565b506000828152601560205260409020805460ff191690555b5050505050565b60006113238383612aaa565b6127ef8484846121c4565b6127fb84848484612e58565b611b625760405162461bcd60e51b81526004016108cd90613da0565b600061080b82612f73565b60006113238383612f77565b61283782610a6d565b612843816123066120c1565b6109858383612a27565b612857828261132a565b610f73576000828152602081815260408083206001600160a01b03851684529091529020805460ff1916600117905561288e6120c1565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60006128de8383612f77565b61291457508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610af3565b506000610af3565b60006001600160e01b031982166380ac58cd60e01b148061294d57506001600160e01b03198216635b5e139f60e01b145b8061080b575061080b82612f8f565b6001600160a01b03831615806129755750612975611231565b6129915760405162461bcd60e51b81526004016108cd90614a02565b61299b8382611cd0565b156129b85760405162461bcd60e51b81526004016108cd90613fcb565b610985838383612fb4565b6129cd828261132a565b610f73576129e5816001600160a01b03166014612fe4565b6129f0836020612fe4565b604051602001612a01929190613a88565b60408051601f198184030181529082905262461bcd60e51b82526108cd91600401613c0d565b612a31828261132a565b15610f73576000828152602081815260408083206001600160a01b03851684529091529020805460ff19169055612a666120c1565b6001600160a01b0316816001600160a01b0316837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45050565b60008181526001830160205260408120548015612bbd576000612ace600183614aba565b8554909150600090612ae290600190614aba565b9050818114612b63576000866000018281548110612b1057634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905080876000018481548110612b4157634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612b8257634e487b7160e01b600052603160045260246000fd5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610af3565b6000915050610af3565b6000612bd282610fe8565b9050612be08160008461295c565b612beb6000836120c5565b6001600160a01b0381166000908152600560205260408120805460019290612c14908490614aba565b909155505060008281526004602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b612c788383613196565b612c856000848484612e58565b6109855760405162461bcd60e51b81526004016108cd90613da0565b612caa826120a4565b612cc65760405162461bcd60e51b81526004016108cd9061422e565b60008281526018602090815260409091208251610985928401906135ad565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316634000aea07f000000000000000000000000000000000000000000000000000000000000000084866000604051602001612d4c929190613a4b565b6040516020818303038152906040526040518463ffffffff1660e01b8152600401612d7993929190613ba5565b602060405180830381600087803b158015612d9357600080fd5b505af1158015612da7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dcb9190613912565b506000838152600d6020526040812054612dea90859083903090613275565b6000858152600d6020526040902054909150612e07906001614a6f565b6000858152600d60205260409020556121bc84826132af565b6000826000018281548110612e4557634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905092915050565b6000612e6c846001600160a01b03166132e2565b15612f6857836001600160a01b031663150b7a02612e886120c1565b8786866040518563ffffffff1660e01b8152600401612eaa9493929190613b4f565b602060405180830381600087803b158015612ec457600080fd5b505af1925050508015612ef4575060408051601f3d908101601f19168201909252612ef1918101906139a5565b60015b612f4e573d808015612f22576040519150601f19603f3d011682016040523d82523d6000602084013e612f27565b606091505b508051612f465760405162461bcd60e51b81526004016108cd90613da0565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506121bc565b506001949350505050565b5490565b60009081526001919091016020526040902054151590565b60006001600160e01b03198216635a05180f60e01b148061080b575061080b826132e8565b612fbf83838361330d565b612fc7610fdf565b156109855760405162461bcd60e51b81526004016108cd90613ca5565b60606000612ff3836002614a9b565b612ffe906002614a6f565b67ffffffffffffffff81111561302457634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561304e576020820181803683370190505b509050600360fc1b8160008151811061307757634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106130b457634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060006130d8846002614a9b565b6130e3906001614a6f565b90505b6001811115613177576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061312557634e487b7160e01b600052603260045260246000fd5b1a60f81b82828151811061314957634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a90535060049490941c9361317081614afd565b90506130e6565b5083156113235760405162461bcd60e51b81526004016108cd90613c20565b6001600160a01b0382166131bc5760405162461bcd60e51b81526004016108cd9061427c565b6131c5816120a4565b156131e25760405162461bcd60e51b81526004016108cd90613ea4565b6131ee6000838361295c565b6001600160a01b0382166000908152600560205260408120805460019290613217908490614a6f565b909155505060008181526004602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60008484848460405160200161328e9493929190613be9565b60408051601f19818403018152919052805160209091012095945050505050565b600082826040516020016132c4929190613a4b565b60405160208183030381529060405280519060200120905092915050565b3b151590565b60006001600160e01b03198216637965db0b60e01b148061080b575061080b82613396565b613318838383610985565b6001600160a01b0383166133345761332f816133af565b613357565b816001600160a01b0316836001600160a01b0316146133575761335783826133f3565b6001600160a01b0382166133735761336e81613490565b610985565b826001600160a01b0316826001600160a01b031614610985576109858282613569565b6001600160e01b031981166301ffc9a760e01b14919050565b600a80546000838152600b60205260408120829055600182018355919091527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80155565b60006001613400846110cf565b61340a9190614aba565b60008381526009602052604090205490915080821461345d576001600160a01b03841660009081526008602090815260408083208584528252808320548484528184208190558352600990915290208190555b5060009182526009602090815260408084208490556001600160a01b039094168352600881528383209183525290812055565b600a546000906134a290600190614aba565b6000838152600b6020526040812054600a80549394509092849081106134d857634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905080600a838154811061350757634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255828152600b9091526040808220849055858252812055600a80548061354d57634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000613574836110cf565b6001600160a01b039093166000908152600860209081526040808320868452825280832085905593825260099052919091209190915550565b8280546135b990614b14565b90600052602060002090601f0160209004810192826135db5760008555613621565b82601f106135f457805160ff1916838001178555613621565b82800160010185558215613621579182015b82811115613621578251825591602001919060010190613606565b506110b3929150613665565b50805461363990614b14565b6000825580601f1061364b5750610baf565b601f016020900490600052602060002090810190610baf91905b5b808211156110b35760008155600101613666565b600067ffffffffffffffff83111561369457613694614baa565b6136a7601f8401601f1916602001614a45565b90508281528383830111156136bb57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461080e57600080fd5b6000602082840312156136fa578081fd5b611323826136d2565b60008060408385031215613715578081fd5b61371e836136d2565b915061372c602084016136d2565b90509250929050565b600080600060608486031215613749578081fd5b613752846136d2565b9250613760602085016136d2565b9150604084013590509250925092565b60008060008060808587031215613785578081fd5b61378e856136d2565b935061379c602086016136d2565b925060408501359150606085013567ffffffffffffffff8111156137be578182fd5b8501601f810187136137ce578182fd5b6137dd8782356020840161367a565b91505092959194509250565b600080604083850312156137fb578182fd5b613804836136d2565b9150602083013561381481614bc0565b809150509250929050565b60008060408385031215613831578182fd5b61383a836136d2565b946020939093013593505050565b6000602080838503121561385a578182fd5b823567ffffffffffffffff80821115613871578384fd5b818501915085601f830112613884578384fd5b81358181111561389657613896614baa565b83810291506138a6848301614a45565b8181528481019084860184860187018a10156138c0578788fd5b8795505b838610156138e9576138d5816136d2565b8352600195909501949186019186016138c4565b5098975050505050505050565b600060208284031215613907578081fd5b813561132381614bc0565b600060208284031215613923578081fd5b815161132381614bc0565b60006020828403121561393f578081fd5b5035919050565b60008060408385031215613958578182fd5b8235915061372c602084016136d2565b6000806040838503121561397a578182fd5b50508035926020909101359150565b60006020828403121561399a578081fd5b813561132381614bce565b6000602082840312156139b6578081fd5b815161132381614bce565b6000602082840312156139d2578081fd5b813567ffffffffffffffff8111156139e8578182fd5b8201601f810184136139f8578182fd5b6121bc8482356020840161367a565b600060208284031215613a18578081fd5b5051919050565b60008151808452613a37816020860160208601614ad1565b601f01601f19169290920160200192915050565b918252602082015260400190565b60008351613a6b818460208801614ad1565b835190830190613a7f818360208801614ad1565b01949350505050565b60007f416363657373436f6e74726f6c3a206163636f756e742000000000000000000082528351613ac0816017850160208801614ad1565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351613af1816028840160208801614ad1565b01602801949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613b8290830184613a1f565b9695505050505050565b6001600160a01b03929092168252602082015260400190565b600060018060a01b038516825283602083015260606040830152613bcc6060830184613a1f565b95945050505050565b901515815260200190565b90815260200190565b93845260208401929092526001600160a01b03166040830152606082015260800190565b6000602082526113236020830184613a1f565b6020808252818101527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604082015260600190565b60208082526030908201527f4552433732313a2043616e6e6f7420616464207a65726f20616464726573732060408201526f1d1bc81d1a1948189b1858dadb1a5cdd60821b606082015260800190565b6020808252602b908201527f4552433732315061757361626c653a20746f6b656e207472616e73666572207760408201526a1a1a5b19481c185d5cd95960aa1b606082015260800190565b60208082526014908201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604082015260600190565b6020808252601b908201527f4552433732313a206e6f20617661696c61626c652062657a6f67690000000000604082015260600190565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526017908201527f556e61626c6520746f207472616e736665722057455448000000000000000000604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252818101527f45524337323155524953746f726167653a206f776e6572207265717569726564604082015260600190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526016908201527545786365656473204d41585f4e46545f535550504c5960501b604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b60208082526025908201527f596f7520617265206e6f74206f6e20746865207072652d73616c652077686974604082015264195b1a5cdd60da1b606082015260800190565b6020808252602d908201527f556e61626c6520746f207472616e736665722c20796f757220746f6b656e206960408201526c1cc8189b1858dadb1a5cdd1959609a1b606082015260800190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526024908201527f4552433732313a206d696e74496e6465782076616c756520697320696e636f726040820152631c9958dd60e21b606082015260800190565b60208082526023908201527f4552433732313a2063616e6e6f74206d696e7420746f207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b6020808252600f908201526e4e6f7420656e6f756768204c494e4b60881b604082015260600190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201526832b73a103a37b5b2b760b91b606082015260800190565b6020808252602e908201527f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60408201526d32bc34b9ba32b73a103a37b5b2b760911b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b60208082526030908201527f4552433732313a206d7573742068617665206d696e746572206f722061646d6960408201526f6e20726f6c6520746f2072656d6f766560801b606082015260800190565b60208082526031908201527f45524337323155524953746f726167653a2055524920717565727920666f72206040820152703737b732bc34b9ba32b73a103a37b5b2b760791b606082015260800190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252601f908201527f4552433732313a20746f6b656e20686173206265656e2073756d6d6f6e656400604082015260600190565b6020808252601f908201527f4f6e6c7920565246436f6f7264696e61746f722063616e2066756c66696c6c00604082015260600190565b60208082526029908201527f4552433732313a20596f752063616e6e6f74206d696e74206d6f7265207468616040820152686e203130204e46547360b81b606082015260800190565b6020808252601a908201527f4552433732313a2073756d6d6f6e20756e617661696c61626c65000000000000604082015260600190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526016908201527514d85b19481a185cc8185b1c9958591e48195b99195960521b604082015260600190565b60208082526019908201527f496e73756666696369656e7420574554482062616c616e636500000000000000604082015260600190565b60208082526018908201527f6e756d6265724f664e6674732063616e6e6f7420626520300000000000000000604082015260600190565b6020808252601a908201527f4552433732313a20746f6b656e2069732073756d6d6f6e696e67000000000000604082015260600190565b6020808252601d908201527f4552433732313a206f6e6c79206f776e65722063616e2073756d6d6f6e000000604082015260600190565b60208082526022908201527f596f75206d6179206e6f74206d696e74206d6f7265207468616e203130204e46604082015261547360f01b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526022908201527f457468657220616c6c6f77616e63652076616c756520697320696e636f72726560408201526118dd60f21b606082015260800190565b60208082526030908201527f596f75206d6179206e6f74206d696e74206d6f7265207468616e2033204e465460408201526f7320647572696e672070726573616c6560801b606082015260800190565b60208082526017908201527f556e61626c6520746f207472616e73666572204c494e4b000000000000000000604082015260600190565b60208082526027908201527f4552433732313a206d61784e4654537570706c792076616c756520697320696e60408201526618dbdc9c9958dd60ca1b606082015260800190565b6020808252602c908201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60408201526b7574206f6620626f756e647360a01b606082015260800190565b6020808252602d908201527f4552433732313a206d7573742068617665206d696e746572206f722061646d6960408201526c1b881c9bdb19481d1bc8185919609a1b606082015260800190565b60208082526037908201527f4552433732313a20596f752063616e6e6f74206d696e74206d6f72652074686160408201527f6e2033204e46547320647572696e672070726573616c65000000000000000000606082015260800190565b60208082526014908201527314d85b19481a185cc81b9bdd081cdd185c9d195960621b604082015260600190565b60208082526030908201527f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760408201526f1b995c881b9bdc88185c1c1c9bdd995960821b606082015260800190565b60208082526025908201527f4552433732313a206d7573742068617665206d696e74657220726f6c6520746f604082015264081b5a5b9d60da1b606082015260800190565b6020808252602f908201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560408201526e103937b632b9903337b91039b2b63360891b606082015260800190565b60208082526023908201527f556e61626c6520746f207472616e7366657220647572696e67204e465420736160408201526236329760e91b606082015260800190565b60405181810167ffffffffffffffff81118282101715614a6757614a67614baa565b604052919050565b60008219821115614a8257614a82614b7e565b500190565b600082614a9657614a96614b94565b500490565b6000816000190483118215151615614ab557614ab5614b7e565b500290565b600082821015614acc57614acc614b7e565b500390565b60005b83811015614aec578181015183820152602001614ad4565b83811115611b625750506000910152565b600081614b0c57614b0c614b7e565b506000190190565b600281046001821680614b2857607f821691505b60208210811415614b4957634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415614b6357614b63614b7e565b5060010190565b600082614b7957614b79614b94565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b8015158114610baf57600080fd5b6001600160e01b031981168114610baf57600080fdfea264697066735822122006737d756cbda62a7f232e1119fc6581ae9e4fa56bbf98a4d5068689c1b243cf64736f6c6343000800003368747470733a2f2f6170692e62657a6f67652e636f6d2f746f6b656e2f6170692f6e66742f
Deployed ByteCode Sourcemap
404:15839:3:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5992:245;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2349:98:7;;;:::i;:::-;;;;;;;:::i;3860:217::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;3398:401::-;;;;;;:::i;:::-;;:::i;:::-;;2884:331:3;;;;;;:::i;:::-;;:::i;1534:111:9:-;;;:::i;:::-;;;;;;;:::i;7374:92:3:-;;;:::i;4724:330:7:-;;;;;;:::i;:::-;;:::i;5412:121:0:-;;;;;;:::i;:::-;;:::i;2129:162:1:-;;;;;;:::i;:::-;;:::i;1210:253:9:-;;;;;;:::i;:::-;;:::i;2636:171:1:-;;;;;;:::i;:::-;;:::i;5410:71:3:-;;;:::i;5120:179:7:-;;;;;;:::i;:::-;;:::i;437:241:8:-;;;;;;:::i;:::-;;:::i;7131:132:3:-;;;;;;:::i;:::-;;:::i;3435:550::-;;;;;;:::i;:::-;;:::i;10002:152::-;;;;;;:::i;:::-;;:::i;7478:761::-;;;;;;:::i;:::-;;:::i;1717:230:9:-;;;;;;:::i;:::-;;:::i;14554:217:3:-;;;;;;:::i;:::-;;:::i;4364:131::-;;;;;;:::i;:::-;;:::i;6245:112::-;;;;;;:::i;:::-;;:::i;1034:84:21:-;;;:::i;2052:235:7:-;;;;;;:::i;:::-;;:::i;10213:673:3:-;;;:::i;12331:138::-;;;:::i;1790:205:7:-;;;;;;:::i;:::-;;:::i;1598:92:20:-;;;:::i;3220:210:3:-;;;;;;:::i;:::-;;:::i;3991:120::-;;;;;;:::i;:::-;;:::i;6362:97::-;;;:::i;6464:101::-;;;:::i;15001:129::-;;;;;;:::i;:::-;;:::i;4116:115::-;;;;;;:::i;:::-;;:::i;5338:67::-;;;:::i;966:85:20:-;;;:::i;1599:143:1:-;;;;;;:::i;:::-;;:::i;4329:137:0:-;;;;;;:::i;:::-;;:::i;9628:225:23:-;;;;;;:::i;:::-;;:::i;2511:102:7:-;;;:::i;4840:173:3:-;;;:::i;14776:220::-;;;;;;:::i;:::-;;:::i;6570:93::-;;;:::i;6772:95::-;;;:::i;2361:49:0:-;;;:::i;4144:290:7:-;;;;;;:::i;:::-;;:::i;8291:1706:3:-;;;;;;:::i;:::-;;:::i;15698:282::-;;;;;;:::i;:::-;;:::i;4236:123::-;;;;;;:::i;:::-;;:::i;5365:320:7:-;;;;;;:::i;:::-;;:::i;7268:100:3:-;;;:::i;6875:108::-;;;:::i;12725:778::-;;;;;;:::i;:::-;;:::i;1910:132:1:-;;;;;;:::i;:::-;;:::i;15985:159:3:-;;;;;;:::i;:::-;;:::i;6668:99::-;;;:::i;6989:134::-;;;:::i;2379:167:1:-;;;;;;:::i;:::-;;:::i;15327:366:3:-;;;;;;:::i;:::-;;:::i;4500:162:7:-;;;;;;:::i;:::-;;:::i;1839:189:20:-;;;;;;:::i;:::-;;:::i;4632:110:3:-;;;;;;:::i;:::-;;:::i;5098:234::-;;;:::i;4500:127::-;;;;;;:::i;:::-;;:::i;5992:245::-;6167:4;6194:36;6218:11;6194:23;:36::i;:::-;6187:43;;5992:245;;;;:::o;2349:98:7:-;2403:13;2435:5;2428:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2349:98;;:::o;3860:217::-;3936:7;3963:16;3971:7;3963;:16::i;:::-;3955:73;;;;-1:-1:-1;;;3955:73:7;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;4046:24:7;;;;:15;:24;;;;;;-1:-1:-1;;;;;4046:24:7;;3860:217::o;3398:401::-;3478:13;3494:23;3509:7;3494:14;:23::i;:::-;3478:39;;3541:5;-1:-1:-1;;;;;3535:11:7;:2;-1:-1:-1;;;;;3535:11:7;;;3527:57;;;;-1:-1:-1;;;3527:57:7;;;;;;;:::i;:::-;3632:5;-1:-1:-1;;;;;3616:21:7;:12;:10;:12::i;:::-;-1:-1:-1;;;;;3616:21:7;;:62;;;;3641:37;3658:5;3665:12;:10;:12::i;3641:37::-;3595:165;;;;-1:-1:-1;;;3595:165:7;;;;;;;:::i;:::-;3771:21;3780:2;3784:7;3771:8;:21::i;:::-;3398:401;;;:::o;2884:331:3:-;1189:12:20;:10;:12::i;:::-;-1:-1:-1;;;;;1178:23:20;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:20;;1170:68;;;;-1:-1:-1;;;1170:68:20;;;;;;;:::i;:::-;2987:14:3::1;;2972:12;:29;2964:81;;;;-1:-1:-1::0;;;2964:81:3::1;;;;;;;:::i;:::-;3060:9;1018:1;3073:14;;:31;;;;:::i;:::-;3060:45;;3055:115;3112:12;3107:1;:17;3055:115;;3145:14;:7;3157:1:::0;3145:11:::1;:14::i;:::-;-1:-1:-1::0;3126:3:3;::::1;::::0;::::1;:::i;:::-;;;;3055:115;;;-1:-1:-1::0;3179:14:3::1;:29:::0;2884:331::o;1534:111:9:-;1621:10;:17;1534:111;:::o;7374:92:3:-;7447:12;;7374:92;:::o;4724:330:7:-;4913:41;4932:12;:10;:12::i;:::-;4946:7;4913:18;:41::i;:::-;4905:103;;;;-1:-1:-1;;;4905:103:7;;;;;;;:::i;:::-;5019:28;5029:4;5035:2;5039:7;5019:9;:28::i;5412:121:0:-;5478:7;5504:12;;;;;;;;;;:22;;;;5412:121::o;2129:162:1:-;2213:30;2229:4;2235:7;2213:15;:30::i;:::-;2253:18;;;;:12;:18;;;;;:31;;2276:7;2253:22;:31::i;1210:253:9:-;1307:7;1342:23;1359:5;1342:16;:23::i;:::-;1334:5;:31;1326:87;;;;-1:-1:-1;;;1326:87:9;;;;;;;:::i;:::-;-1:-1:-1;;;;;;1430:19:9;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;1210:253;;;;;:::o;2636:171:1:-;2723:33;2742:4;2748:7;2723:18;:33::i;:::-;2766:18;;;;:12;:18;;;;;:34;;2792:7;2766:25;:34::i;5410:71:3:-;1189:12:20;:10;:12::i;:::-;-1:-1:-1;;;;;1178:23:20;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:20;;1170:68;;;;-1:-1:-1;;;1170:68:20;;;;;;;:::i;:::-;5464:10:3::1;:8;:10::i;:::-;5410:71::o:0;5120:179:7:-;5253:39;5270:4;5276:2;5280:7;5253:39;;;;;;;;;;;;:16;:39::i;437:241:8:-;553:41;572:12;:10;:12::i;553:41::-;545:102;;;;-1:-1:-1;;;545:102:8;;;;;;;:::i;:::-;657:14;663:7;657:5;:14::i;:::-;437:241;:::o;7131:132:3:-;7195:4;7224:19;;;:10;:19;;;;;7218:33;;;;;:::i;:::-;:38;;;7131:132;-1:-1:-1;;;7131:132:3:o;3435:550::-;3503:32;926:24;3524:10;3503:7;:32::i;:::-;3495:82;;;;-1:-1:-1;;;3495:82:3;;;;;;;:::i;:::-;-1:-1:-1;;;;;3595:16:3;;3587:64;;;;-1:-1:-1;;;3587:64:3;;;;;;;:::i;:::-;3677:17;3697:13;:11;:13::i;:::-;3677:33;;3741:14;;3728:9;:27;;3720:76;;;;-1:-1:-1;;;3720:76:3;;;;;;;:::i;:::-;3841:24;3851:2;3855:9;3841;:24::i;:::-;3876:56;3895:9;3905:26;3906:13;3895:9;3918:1;3906:13;:::i;:::-;3905:24;:26::i;:::-;3876:18;:56::i;:::-;3959:14;;:19;;3977:1;3959:19;:::i;:::-;3942:14;:36;-1:-1:-1;;3435:550:3:o;10002:152::-;10099:13;;:48;;-1:-1:-1;;;10099:48:3;;10073:7;;-1:-1:-1;;;;;10099:13:3;;:23;;:48;;10123:8;;10141:4;;10099:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;7478:761::-;7544:20;:18;:20::i;:::-;7536:59;;;;-1:-1:-1;;;7536:59:3;;;;;;;:::i;:::-;7613:16;7621:7;7613;:16::i;:::-;7605:73;;;;-1:-1:-1;;;7605:73:3;;;;;;;:::i;:::-;7697:25;7714:7;7697:16;:25::i;:::-;7696:26;7688:70;;;;-1:-1:-1;;;7688:70:3;;;;;;;:::i;:::-;7777:19;;;;:10;:19;;;;;;;;7776:20;7768:59;;;;-1:-1:-1;;;7768:59:3;;;;;;;:::i;:::-;7837:32;7872:29;:27;:29::i;:::-;7837:64;;7946:1;7919:24;:28;7911:68;;;;-1:-1:-1;;;7911:68:3;;;;;;;:::i;:::-;7998:13;8014:16;8022:7;8014;:16::i;:::-;7998:32;-1:-1:-1;8048:10:3;-1:-1:-1;;;;;8048:19:3;;;8040:60;;;;-1:-1:-1;;;8040:60:3;;;;;;;:::i;:::-;8111:19;;;;:10;:19;;;;;:26;;-1:-1:-1;;8111:26:3;8133:4;8111:26;;;8167:17;:15;:17::i;:::-;8194:28;;;;:17;:28;;;;;:38;;;;-1:-1:-1;;;7478:761:3:o;1717:230:9:-;1792:7;1827:30;:28;:30::i;:::-;1819:5;:38;1811:95;;;;-1:-1:-1;;;1811:95:9;;;;;;;:::i;:::-;1923:10;1934:5;1923:17;;;;;;-1:-1:-1;;;1923:17:9;;;;;;;;;;;;;;;;;1916:24;;1717:230;;;:::o;14554:217:3:-;1189:12:20;:10;:12::i;:::-;-1:-1:-1;;;;;1178:23:20;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:20;;1170:68;;;;-1:-1:-1;;;1170:68:20;;;;;;;:::i;:::-;14652:9:3::1;14647:118;14671:13;:20;14667:1;:24;14647:118;;;14750:4;14712:17;:35;14730:13;14744:1;14730:16;;;;;;-1:-1:-1::0;;;14730:16:3::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;14712:35:3::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;14712:35:3;:42;;-1:-1:-1;;14712:42:3::1;::::0;::::1;;::::0;;;::::1;::::0;;14693:3;::::1;::::0;::::1;:::i;:::-;;;;14647:118;;;;14554:217:::0;:::o;4364:131::-;1189:12:20;:10;:12::i;:::-;-1:-1:-1;;;;;1178:23:20;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:20;;1170:68;;;;-1:-1:-1;;;1170:68:20;;;;;;;:::i;:::-;4450:18:3::1;:38:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;4450:38:3;;::::1;::::0;;;::::1;::::0;;4364:131::o;6245:112::-;6307:7;6333:17;:7;6344:5;6333:10;:17::i;1034:84:21:-;1104:7;;;;1034:84;:::o;2052:235:7:-;2124:7;2159:16;;;:7;:16;;;;;;-1:-1:-1;;;;;2159:16:7;2193:19;2185:73;;;;-1:-1:-1;;;2185:73:7;;;;;;;:::i;10213:673:3:-;10263:7;10282:18;10303:13;:11;:13::i;:::-;10282:34;;10404:4;10387:13;:21;10383:497;;-1:-1:-1;;10431:12:3;;10424:19;;10383:497;10481:4;10464:13;:21;10460:420;;10508:10;10501:17;;;;;10460:420;10557:4;10540:13;:21;10536:344;;10584:11;10577:18;;;;;10536:344;10633:4;10616:13;:21;10612:268;;10660:11;10653:18;;;;;10612:268;10709:3;10692:13;:20;10688:192;;10735:11;10728:18;;;;;10688:192;10808:12;10801:19;;;;;10763:117;10213:673;;:::o;12331:138::-;12419:42;12331:138;:::o;1790:205:7:-;1862:7;-1:-1:-1;;;;;1889:19:7;;1881:74;;;;-1:-1:-1;;;1881:74:7;;;;;;;:::i;:::-;-1:-1:-1;;;;;;1972:16:7;;;;;:9;:16;;;;;;;1790:205::o;1598:92:20:-;1189:12;:10;:12::i;:::-;-1:-1:-1;;;;;1178:23:20;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:20;;1170:68;;;;-1:-1:-1;;;1170:68:20;;;;;;;:::i;:::-;1662:21:::1;1680:1;1662:9;:21::i;3220:210:3:-:0;1189:12:20;:10;:12::i;:::-;-1:-1:-1;;;;;1178:23:20;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:20;;1170:68;;;;-1:-1:-1;;;1170:68:20;;;;;;;:::i;:::-;3289:9:3::1;3284:140;3308:5;3304:1;:9;3284:140;;;3334:17;3354:13;:11;:13::i;:::-;3334:33;;3381:32;3391:10;3403:9;3381;:32::i;:::-;-1:-1:-1::0;3315:3:3;::::1;::::0;::::1;:::i;:::-;;;;3284:140;;3991:120:::0;1189:12:20;:10;:12::i;:::-;-1:-1:-1;;;;;1178:23:20;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:20;;1170:68;;;;-1:-1:-1;;;1170:68:20;;;;;;;:::i;:::-;4076:28:3;;::::1;::::0;:13:::1;::::0;:28:::1;::::0;::::1;::::0;::::1;:::i;6362:97::-:0;6436:16;;;;;;;;6362:97::o;6464:101::-;6540:18;;;;;;;;6464:101::o;15001:129::-;-1:-1:-1;;;;;15096:27:3;15073:4;15096:27;;;:17;:27;;;;;;;;;15001:129::o;4116:115::-;1189:12:20;:10;:12::i;:::-;-1:-1:-1;;;;;1178:23:20;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:20;;1170:68;;;;-1:-1:-1;;;1170:68:20;;;;;;;:::i;:::-;4194:14:3::1;:30:::0;;-1:-1:-1;;4194:30:3::1;::::0;::::1;;::::0;;;::::1;::::0;;4116:115::o;5338:67::-;1189:12:20;:10;:12::i;:::-;-1:-1:-1;;;;;1178:23:20;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:20;;1170:68;;;;-1:-1:-1;;;1170:68:20;;;;;;;:::i;:::-;5390:8:3::1;:6;:8::i;966:85:20:-:0;1038:6;;;;;-1:-1:-1;;;;;1038:6:20;;966:85::o;1599:143:1:-;1681:7;1707:18;;;:12;:18;;;;;:28;;1729:5;1707:21;:28::i;:::-;1700:35;1599:143;-1:-1:-1;;;1599:143:1:o;4329:137:0:-;4407:4;4430:12;;;;;;;;;;;-1:-1:-1;;;;;4430:29:0;;;;;;;;;;;;;;;4329:137::o;9628:225:23:-;9738:10;-1:-1:-1;;;;;9752:14:23;9738:28;;9730:72;;;;-1:-1:-1;;;9730:72:23;;;;;;;:::i;:::-;9808:40;9826:9;9837:10;9808:17;:40::i;2511:102:7:-;2567:13;2599:7;2592:14;;;;;:::i;4840:173:3:-;1189:12:20;:10;:12::i;:::-;-1:-1:-1;;;;;1178:23:20;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:20;;1170:68;;;;-1:-1:-1;;;1170:68:20;;;;;;;:::i;:::-;4904:13:3::1;::::0;4939:38:::1;::::0;-1:-1:-1;;;4939:38:3;;-1:-1:-1;;;;;4904:13:3;;::::1;::::0;:22:::1;::::0;4927:10:::1;::::0;4904:13;;4939:23:::1;::::0;:38:::1;::::0;4971:4:::1;::::0;4939:38:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4904:74;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4896:110;;;;-1:-1:-1::0;;;4896:110:3::1;;;;;;;:::i;14776:220::-:0;1189:12:20;:10;:12::i;:::-;-1:-1:-1;;;;;1178:23:20;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:20;;1170:68;;;;-1:-1:-1;;;1170:68:20;;;;;;;:::i;:::-;14877:9:3::1;14872:118;14896:13;:20;14892:1;:24;14872:118;;;14944:17;:35;14962:13;14976:1;14962:16;;;;;;-1:-1:-1::0;;;14962:16:3::1;;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;14944:35:3::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;14944:35:3;14937:42;;-1:-1:-1;;14937:42:3::1;::::0;;14918:3;::::1;::::0;::::1;:::i;:::-;;;;14872:118;;6570:93:::0;6642:14;;;;6570:93;:::o;6772:95::-;6846:14;;6772:95;:::o;2361:49:0:-;2406:4;2361:49;:::o;4144:290:7:-;4258:12;:10;:12::i;:::-;-1:-1:-1;;;;;4246:24:7;:8;-1:-1:-1;;;;;4246:24:7;;;4238:62;;;;-1:-1:-1;;;4238:62:7;;;;;;;:::i;:::-;4356:8;4311:18;:32;4330:12;:10;:12::i;:::-;-1:-1:-1;;;;;4311:32:7;;;;;;;;;;;;;;;;;-1:-1:-1;4311:32:7;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;4311:53:7;;;;;;;;;;;4394:12;:10;:12::i;:::-;-1:-1:-1;;;;;4379:48:7;;4418:8;4379:48;;;;;;:::i;:::-;;;;;;;;4144:290;;:::o;8291:1706:3:-;8434:14;;8418:13;:11;:13::i;:::-;:30;8410:65;;;;-1:-1:-1;;;8410:65:3;;;;;;;:::i;:::-;8508:1;8493:12;:16;8485:53;;;;-1:-1:-1;;;8485:53:3;;;;;;;:::i;:::-;8598:14;;8581:12;8565:13;:11;:13::i;:::-;:28;;;;:::i;:::-;8564:48;;8556:83;;;;-1:-1:-1;;;8556:83:3;;;;;;;:::i;:::-;8657:18;:16;:18::i;:::-;8649:51;;;;-1:-1:-1;;;8649:51:3;;;;;;;:::i;:::-;8795:12;8773:19;:17;:19::i;:::-;:34;;;;:::i;:::-;8718:13;;:50;;-1:-1:-1;;;8718:50:3;;-1:-1:-1;;;;;8718:13:3;;;;:23;;:50;;8742:10;;8762:4;;8718:50;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:90;;8710:137;;;;-1:-1:-1;;;8710:137:3;;;;;;;:::i;:::-;8927:12;8905:19;:17;:19::i;:::-;:34;;;;:::i;:::-;8865:13;;:35;;-1:-1:-1;;;8865:35:3;;-1:-1:-1;;;;;8865:13:3;;;;:23;;:35;;8889:10;;8865:35;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:75;;8857:113;;;;-1:-1:-1;;;8857:113:3;;;;;;;:::i;:::-;8997:21;:19;:21::i;:::-;8994:722;;;9041:36;9066:10;9041:24;:36::i;:::-;9033:86;;;;-1:-1:-1;;;9033:86:3;;;;;;;:::i;:::-;9169:1;9153:12;:17;;9145:78;;;;-1:-1:-1;;;9145:78:3;;;;;;;:::i;:::-;9274:18;9319:12;9295:21;9305:10;9295:9;:21::i;:::-;:36;;;;:::i;:::-;9274:57;;9367:1;9353:10;:15;;9345:83;;;;-1:-1:-1;;;9345:83:3;;;;;;;:::i;:::-;8994:722;;;;9483:2;9467:12;:18;;9459:65;;;;-1:-1:-1;;;9459:65:3;;;;;;;:::i;:::-;9564:18;9609:12;9585:21;9595:10;9585:9;:21::i;:::-;:36;;;;:::i;:::-;9564:57;;9657:2;9643:10;:16;;9635:70;;;;-1:-1:-1;;;9635:70:3;;;;;;;:::i;:::-;8994:722;;9734:13;;-1:-1:-1;;;;;9734:13:3;:26;9761:10;9781:4;9811:12;9789:19;:17;:19::i;:::-;:34;;;;:::i;:::-;9734:91;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;9840:9;9835:147;9859:12;9855:1;:16;9835:147;;;9892:17;9912:13;:11;:13::i;:::-;9892:33;;9939:32;9949:10;9961:9;9939;:32::i;:::-;-1:-1:-1;9873:3:3;;;;:::i;:::-;;;;9835:147;;15698:282;15794:32;926:24;15815:10;15794:7;:32::i;:::-;:75;;;-1:-1:-1;15830:39:3;2406:4:0;15858:10:3;15830:7;:39::i;:::-;15786:136;;;;-1:-1:-1;;;15786:136:3;;;;;;;:::i;:::-;-1:-1:-1;;;;;15932:25:3;;;;;;:15;:25;;;;;:41;;15965:7;15932:32;:41::i;4236:123::-;1189:12:20;:10;:12::i;:::-;-1:-1:-1;;;;;1178:23:20;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:20;;1170:68;;;;-1:-1:-1;;;1170:68:20;;;;;;;:::i;:::-;4318:16:3::1;:34:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;4318:34:3;;::::1;::::0;;;::::1;::::0;;4236:123::o;5365:320:7:-;5534:41;5553:12;:10;:12::i;:::-;5567:7;5534:18;:41::i;:::-;5526:103;;;;-1:-1:-1;;;5526:103:7;;;;;;;:::i;:::-;5639:39;5653:4;5659:2;5663:7;5672:5;5639:13;:39::i;:::-;5365:320;;;;:::o;7268:100:3:-;7316:13;7348;7341:20;;;;;:::i;6875:108::-;6956:20;;6875:108;:::o;12725:778::-;12798:13;12831:16;12839:7;12831;:16::i;:::-;12823:78;;;;-1:-1:-1;;;12823:78:3;;;;;;;:::i;:::-;12920:23;12946:19;;;:10;:19;;;;;12920:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12975:18;12996:10;:8;:10::i;:::-;12975:31;;13085:4;13079:18;13101:1;13079:23;13075:70;;;-1:-1:-1;13125:9:3;-1:-1:-1;13118:16:3;;13075:70;13248:23;;:27;13244:253;;13322:4;13328:9;13305:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;13291:48;;;;;;13244:253;13460:4;13466:18;;;;;;;;;;;;;-1:-1:-1;;;13466:18:3;;;13443:42;;;;;;;;;:::i;1910:132:1:-;1982:7;2008:18;;;:12;:18;;;;;:27;;:25;:27::i;15985:159:3:-;-1:-1:-1;;;;;16094:25:3;;16071:4;16094:25;;;:15;:25;;;;;:43;;16129:7;16094:34;:43::i;6668:99::-;6743:17;;;;;;;;6668:99::o;6989:134::-;7049:7;7092:24;:22;:24::i;:::-;7075:14;;:41;;;;:::i;:::-;7068:48;;6989:134;:::o;2379:167:1:-;2464:31;2481:4;2487:7;2464:16;:31::i;15327:366:3:-;15420:32;926:24;15441:10;15420:7;:32::i;:::-;:75;;;-1:-1:-1;15456:39:3;2406:4:0;15484:10:3;15456:7;:39::i;:::-;15412:133;;;;-1:-1:-1;;;15412:133:3;;;;;;;:::i;:::-;-1:-1:-1;;;;;15563:22:3;;15555:83;;;;-1:-1:-1;;;15555:83:3;;;;;;;:::i;:::-;-1:-1:-1;;;;;15648:25:3;;;;;;:15;:25;;;;;:38;;15678:7;15648:29;:38::i;4500:162:7:-;-1:-1:-1;;;;;4620:25:7;;;4597:4;4620:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;4500:162::o;1839:189:20:-;1189:12;:10;:12::i;:::-;-1:-1:-1;;;;;1178:23:20;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:20;;1170:68;;;;-1:-1:-1;;;1170:68:20;;;;;;;:::i;:::-;-1:-1:-1;;;;;1927:22:20;::::1;1919:73;;;;-1:-1:-1::0;;;1919:73:20::1;;;;;;;:::i;:::-;2002:19;2012:8;2002:9;:19::i;4632:110:3:-:0;1189:12:20;:10;:12::i;:::-;-1:-1:-1;;;;;1178:23:20;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:20;;1170:68;;;;-1:-1:-1;;;1170:68:20;;;;;;;:::i;:::-;4709:12:3::1;:26:::0;4632:110::o;5098:234::-;1189:12:20;:10;:12::i;:::-;-1:-1:-1;;;;;1178:23:20;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:20;;1170:68;;;;-1:-1:-1;;;1170:68:20;;;;;;;:::i;:::-;5154:23:3::1;5199;:21;:23::i;:::-;5154:69;;5241:4;-1:-1:-1::0;;;;;5241:13:3::1;;5255:10;5267:4;-1:-1:-1::0;;;;;5267:14:3::1;;5290:4;5267:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5241:56;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5233:92;;;;-1:-1:-1::0;;;5233:92:3::1;;;;;;;:::i;4500:127::-:0;1189:12:20;:10;:12::i;:::-;-1:-1:-1;;;;;1178:23:20;:7;:5;:7::i;:::-;-1:-1:-1;;;;;1178:23:20;;1170:68;;;;-1:-1:-1;;;1170:68:20;;;;;;;:::i;:::-;4584:17:3::1;:36:::0;;;::::1;;;;-1:-1:-1::0;;4584:36:3;;::::1;::::0;;;::::1;::::0;;4500:127::o;7579:110:0:-;7657:25;7668:4;7674:7;7657:10;:25::i;6232:150:11:-;6302:4;6325:50;6330:3;-1:-1:-1;;;;;6350:23:11;;6325:4;:50::i;909:222:9:-;1011:4;-1:-1:-1;;;;;;1034:50:9;;-1:-1:-1;;;1034:50:9;;:90;;;1088:36;1112:11;1088:23;:36::i;7157:125:7:-;7222:4;7245:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7245:16:7;:30;;;7157:125::o;586:96:4:-;665:10;586:96;:::o;11008:171:7:-;11082:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;11082:29:7;-1:-1:-1;;;;;11082:29:7;;;;;;;;:24;;11135:23;11082:24;11135:14;:23::i;:::-;-1:-1:-1;;;;;11126:46:7;;;;;;;;;;;11008:171;;:::o;7880:129:11:-;7947:4;7970:32;7975:3;7995:5;7970:4;:32::i;7440:344:7:-;7533:4;7557:16;7565:7;7557;:16::i;:::-;7549:73;;;;-1:-1:-1;;;7549:73:7;;;;;;;:::i;:::-;7632:13;7648:23;7663:7;7648:14;:23::i;:::-;7632:39;;7700:5;-1:-1:-1;;;;;7689:16:7;:7;-1:-1:-1;;;;;7689:16:7;;:51;;;;7733:7;-1:-1:-1;;;;;7709:31:7;:20;7721:7;7709:11;:20::i;:::-;-1:-1:-1;;;;;7709:31:7;;7689:51;:87;;;;7744:32;7761:5;7768:7;7744:16;:32::i;:::-;7681:96;7440:344;-1:-1:-1;;;;7440:344:7:o;10337:560::-;10491:4;-1:-1:-1;;;;;10464:31:7;:23;10479:7;10464:14;:23::i;:::-;-1:-1:-1;;;;;10464:31:7;;10456:85;;;;-1:-1:-1;;;10456:85:7;;;;;;;:::i;:::-;-1:-1:-1;;;;;10559:16:7;;10551:65;;;;-1:-1:-1;;;10551:65:7;;;;;;;:::i;:::-;10627:39;10648:4;10654:2;10658:7;10627:20;:39::i;:::-;10728:29;10745:1;10749:7;10728:8;:29::i;:::-;-1:-1:-1;;;;;10768:15:7;;;;;;:9;:15;;;;;:20;;10787:1;;10768:15;:20;;10787:1;;10768:20;:::i;:::-;;;;-1:-1:-1;;;;;;;10798:13:7;;;;;;:9;:13;;;;;:18;;10815:1;;10798:13;:18;;10815:1;;10798:18;:::i;:::-;;;;-1:-1:-1;;10826:16:7;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;10826:21:7;-1:-1:-1;;;;;10826:21:7;;;;;;;;;10863:27;;10826:16;;10863:27;;;;;;;10337:560;;;:::o;5783:145:0:-;5866:18;5879:4;5866:12;:18::i;:::-;3925:30;3936:4;3942:12;:10;:12::i;:::-;3925:10;:30::i;:::-;5896:25:::1;5907:4;5913:7;5896:10;:25::i;6800:214::-:0;6906:12;:10;:12::i;:::-;-1:-1:-1;;;;;6895:23:0;:7;-1:-1:-1;;;;;6895:23:0;;6887:83;;;;-1:-1:-1;;;6887:83:0;;;;;;;:::i;:::-;6981:26;6993:4;6999:7;6981:11;:26::i;6550:156:11:-;6623:4;6646:53;6654:3;-1:-1:-1;;;;;6674:23:11;;6646:7;:53::i;2046:117:21:-;1613:8;:6;:8::i;:::-;1605:41;;;;-1:-1:-1;;;1605:41:21;;;;;;;:::i;:::-;2104:7:::1;:15:::0;;-1:-1:-1;;2104:15:21::1;::::0;;2134:22:::1;2143:12;:10;:12::i;:::-;2134:22;;;;;;:::i;:::-;;;;;;;;2046:117::o:0;14081:276:3:-;14171:7;:5;:7::i;:::-;-1:-1:-1;;;;;14157:21:3;:10;-1:-1:-1;;;;;14157:21:3;;14149:66;;;;-1:-1:-1;;;14149:66:3;;;;;;;:::i;:::-;14225:20;14237:7;14225:11;:20::i;:::-;14266:19;;;;:10;:19;;;;;14260:33;;;;;:::i;:::-;:38;;-1:-1:-1;14256:95:3;;14321:19;;;;:10;:19;;;;;14314:26;;;:::i;8114:108:7:-;8189:26;8199:2;8203:7;8189:26;;;;;;;;;;;;:9;:26::i;275:703:22:-;331:13;548:10;544:51;;-1:-1:-1;574:10:22;;;;;;;;;;;;-1:-1:-1;;;574:10:22;;;;;;544:51;619:5;604:12;658:75;665:9;;658:75;;690:8;;;;:::i;:::-;;-1:-1:-1;712:10:22;;-1:-1:-1;720:2:22;712:10;;:::i;:::-;;;658:75;;;742:19;774:6;764:17;;;;;;-1:-1:-1;;;764:17:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;764:17:22;;742:39;;791:150;798:10;;791:150;;824:11;834:1;824:11;;:::i;:::-;;-1:-1:-1;892:10:22;900:2;892:5;:10;:::i;:::-;879:24;;:2;:24;:::i;:::-;866:39;;849:6;856;849:14;;;;;;-1:-1:-1;;;849:14:22;;;;;;;;;;;;:56;-1:-1:-1;;;;;849:56:22;;;;;;;;-1:-1:-1;919:11:22;928:2;919:11;;:::i;:::-;;;791:150;;12140:186:3;12230:32;12243:7;12252:9;12230:12;:32::i;:::-;12295:20;;:24;;12318:1;12295:24;:::i;:::-;12272:20;:47;-1:-1:-1;;12140:186:3:o;11102:193::-;11147:17;11217:3;;11184:4;-1:-1:-1;;;;;11184:14:3;;11207:4;11184:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:36;;11176:64;;;;-1:-1:-1;;;11176:64:3;;;;;;;:::i;:::-;11257:31;11275:7;;11284:3;;11257:17;:31::i;9072:135:11:-;9143:7;9177:22;9181:3;9193:5;9177:3;:22::i;2034:169:20:-;2108:6;;;-1:-1:-1;;;;;2124:17:20;;;2108:6;2124:17;;;-1:-1:-1;;;;;;2124:17:20;;;;;;2156:40;;2108:6;;;;;;;;2156:40;;2089:16;;2156:40;2034:169;;:::o;1799:115:21:-;1348:8;:6;:8::i;:::-;1347:9;1339:38;;;;-1:-1:-1;;;1339:38:21;;;;;;;:::i;:::-;1858:7:::1;:14:::0;;-1:-1:-1;;1858:14:21::1;1868:4;1858:14;::::0;;1887:20:::1;1894:12;:10;:12::i;11366:769:3:-:0;11480:32;11515:29;:27;:29::i;:::-;11554:15;11572:28;;;:17;:28;;;;;;11480:64;;-1:-1:-1;11647:28:3;;11644:485;;11737:37;11750:24;11737:10;:37;:::i;:::-;11723:51;;11791:16;11799:7;11791;:16::i;:::-;:46;;;;;11812:25;11829:7;11812:16;:25::i;:::-;11811:26;11791:46;:69;;;;-1:-1:-1;11841:19:3;;;;:10;:19;;;;;;;;11791:69;11788:331;;;11953:62;11972:7;11980:34;:23;:7;11991:11;11980:10;:23::i;11953:62::-;12033:27;:7;12048:11;12033:14;:27::i;:::-;-1:-1:-1;12085:19:3;;;;:10;:19;;;;;12078:26;;-1:-1:-1;;12078:26:3;;;11788:331;11366:769;;;;;:::o;8177:135:11:-;8247:4;8270:35;8278:3;8298:5;8270:7;:35::i;6547:307:7:-;6698:28;6708:4;6714:2;6718:7;6698:9;:28::i;:::-;6744:48;6767:4;6773:2;6777:7;6786:5;6744:22;:48::i;:::-;6736:111;;;;-1:-1:-1;;;6736:111:7;;;;;;;:::i;7033:115:11:-;7096:7;7122:19;7130:3;7122:7;:19::i;8393:144::-;8470:4;8493:37;8503:3;8523:5;8493:9;:37::i;6162:147:0:-;6246:18;6259:4;6246:12;:18::i;:::-;3925:30;3936:4;3942:12;:10;:12::i;3925:30::-;6276:26:::1;6288:4;6294:7;6276:11;:26::i;8012:224::-:0;8086:22;8094:4;8100:7;8086;:22::i;:::-;8081:149;;8124:6;:12;;;;;;;;;;;-1:-1:-1;;;;;8124:29:0;;;;;;;;;:36;;-1:-1:-1;;8124:36:0;8156:4;8124:36;;;8206:12;:10;:12::i;:::-;-1:-1:-1;;;;;8179:40:0;8197:7;-1:-1:-1;;;;;8179:40:0;8191:4;8179:40;;;;;;;;;;8012:224;;:::o;1630:404:11:-;1693:4;1714:21;1724:3;1729:5;1714:9;:21::i;:::-;1709:319;;-1:-1:-1;1751:23:11;;;;;;;;:11;:23;;;;;;;;;;;;;1931:18;;1909:19;;;:12;;;:19;;;;;;:40;;;;1963:11;;1709:319;-1:-1:-1;2012:5:11;2005:12;;1431:300:7;1533:4;-1:-1:-1;;;;;;1568:40:7;;-1:-1:-1;;;1568:40:7;;:104;;-1:-1:-1;;;;;;;1624:48:7;;-1:-1:-1;;;1624:48:7;1568:104;:156;;;;1688:36;1712:11;1688:23;:36::i;5486:440:3:-;-1:-1:-1;;;;;5675:18:3;;;;:44;;;5697:22;:20;:22::i;:::-;5667:92;;;;-1:-1:-1;;;5667:92:3;;;;;;;:::i;:::-;5778:36;5801:4;5806:7;5778:22;:36::i;:::-;5777:37;5769:95;;;;-1:-1:-1;;;5769:95:3;;;;;;;:::i;:::-;5874:45;5901:4;5907:2;5911:7;5874:26;:45::i;4747:484:0:-;4827:22;4835:4;4841:7;4827;:22::i;:::-;4822:403;;5010:41;5038:7;-1:-1:-1;;;;;5010:41:0;5048:2;5010:19;:41::i;:::-;5122:38;5150:4;5157:2;5122:19;:38::i;:::-;4917:265;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;4917:265:0;;;;;;;;;;-1:-1:-1;;;4865:349:0;;;;;;;:::i;8242:225::-;8316:22;8324:4;8330:7;8316;:22::i;:::-;8312:149;;;8386:5;8354:12;;;;;;;;;;;-1:-1:-1;;;;;8354:29:0;;;;;;;;;:37;;-1:-1:-1;;8354:37:0;;;8437:12;:10;:12::i;:::-;-1:-1:-1;;;;;8410:40:0;8428:7;-1:-1:-1;;;;;8410:40:0;8422:4;8410:40;;;;;;;;;;8242:225;;:::o;2202:1388:11:-;2268:4;2405:19;;;:12;;;:19;;;;;;2439:15;;2435:1149;;2808:21;2832:14;2845:1;2832:10;:14;:::i;:::-;2880:18;;2808:38;;-1:-1:-1;2860:17:11;;2880:22;;2901:1;;2880:22;:::i;:::-;2860:42;;2934:13;2921:9;:26;2917:398;;2967:17;2987:3;:11;;2999:9;2987:22;;;;;;-1:-1:-1;;;2987:22:11;;;;;;;;;;;;;;;;;2967:42;;3138:9;3109:3;:11;;3121:13;3109:26;;;;;;-1:-1:-1;;;3109:26:11;;;;;;;;;;;;;;;;;;;;:38;;;;3221:23;;;:12;;;:23;;;;;:36;;;2917:398;3393:17;;:3;;:17;;;-1:-1:-1;;;3393:17:11;;;;;;;;;;;;;;;;;;;;;;;;;;3485:3;:12;;:19;3498:5;3485:19;;;;;;;;;;;3478:26;;;3526:4;3519:11;;;;;;;2435:1149;3568:5;3561:12;;;;;9665:348:7;9724:13;9740:23;9755:7;9740:14;:23::i;:::-;9724:39;;9774:48;9795:5;9810:1;9814:7;9774:20;:48::i;:::-;9860:29;9877:1;9881:7;9860:8;:29::i;:::-;-1:-1:-1;;;;;9900:16:7;;;;;;:9;:16;;;;;:21;;9920:1;;9900:16;:21;;9920:1;;9900:21;:::i;:::-;;;;-1:-1:-1;;9938:16:7;;;;:7;:16;;;;;;9931:23;;-1:-1:-1;;;;;;9931:23:7;;;9970:36;9946:7;;9938:16;-1:-1:-1;;;;;9970:36:7;;;;;9938:16;;9970:36;9665:348;;:::o;8443:311::-;8568:18;8574:2;8578:7;8568:5;:18::i;:::-;8617:54;8648:1;8652:2;8656:7;8665:5;8617:22;:54::i;:::-;8596:151;;;;-1:-1:-1;;;8596:151:7;;;;;;;:::i;13650:214:3:-;13749:16;13757:7;13749;:16::i;:::-;13741:75;;;;-1:-1:-1;;;13741:75:3;;;;;;;:::i;:::-;13826:19;;;;:10;:19;;;;;;;;:31;;;;;;;;:::i;7741:1055:23:-;7845:17;7877:4;-1:-1:-1;;;;;7877:20:23;;7898:14;7914:4;7931:8;6598:1;7920:43;;;;;;;;;:::i;:::-;;;;;;;;;;;;;7877:87;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;8195:15:23;8279:16;;;:6;:16;;;;;;8214:82;;8231:8;;8195:15;;8272:4;;8214:16;:82::i;:::-;8726:16;;;;:6;:16;;;;;;8195:101;;-1:-1:-1;8726:20:23;;8745:1;8726:20;:::i;:::-;8707:16;;;;:6;:16;;;;;:39;8759:32;8714:8;8783:7;8759:13;:32::i;4328:118:11:-;4395:7;4421:3;:11;;4433:5;4421:18;;;;;;-1:-1:-1;;;4421:18:11;;;;;;;;;;;;;;;;;4414:25;;4328:118;;;;:::o;11732:782:7:-;11882:4;11902:15;:2;-1:-1:-1;;;;;11902:13:7;;:15::i;:::-;11898:610;;;11953:2;-1:-1:-1;;;;;11937:36:7;;11974:12;:10;:12::i;:::-;11988:4;11994:7;12003:5;11937:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;11937:72:7;;;;;;;;-1:-1:-1;;11937:72:7;;;;;;;;;;;;:::i;:::-;;;11933:523;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12180:13:7;;12176:266;;12222:60;;-1:-1:-1;;;12222:60:7;;;;;;;:::i;12176:266::-;12394:6;12388:13;12379:6;12375:2;12371:15;12364:38;11933:523;-1:-1:-1;;;;;;12059:55:7;-1:-1:-1;;;12059:55:7;;-1:-1:-1;12052:62:7;;11898:610;-1:-1:-1;12493:4:7;11732:782;;;;;;:::o;3879:107:11:-;3961:18;;3879:107::o;3671:127::-;3744:4;3767:19;;;:12;;;;;:19;;;;;;:24;;;3671:127::o;802:212:1:-;887:4;-1:-1:-1;;;;;;910:57:1;;-1:-1:-1;;;910:57:1;;:97;;;971:36;995:11;971:23;:36::i;577:267:10:-;716:45;743:4;749:2;753:7;716:26;:45::i;:::-;781:8;:6;:8::i;:::-;780:9;772:65;;;;-1:-1:-1;;;772:65:10;;;;;;;:::i;1535:441:22:-;1610:13;1635:19;1667:10;1671:6;1667:1;:10;:::i;:::-;:14;;1680:1;1667:14;:::i;:::-;1657:25;;;;;;-1:-1:-1;;;1657:25:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1657:25:22;;1635:47;;-1:-1:-1;;;1692:6:22;1699:1;1692:9;;;;;;-1:-1:-1;;;1692:9:22;;;;;;;;;;;;:15;-1:-1:-1;;;;;1692:15:22;;;;;;;;;-1:-1:-1;;;1717:6:22;1724:1;1717:9;;;;;;-1:-1:-1;;;1717:9:22;;;;;;;;;;;;:15;-1:-1:-1;;;;;1717:15:22;;;;;;;;-1:-1:-1;1747:9:22;1759:10;1763:6;1759:1;:10;:::i;:::-;:14;;1772:1;1759:14;:::i;:::-;1747:26;;1742:132;1779:1;1775;:5;1742:132;;;-1:-1:-1;;;1826:5:22;1834:3;1826:11;1813:25;;;;;-1:-1:-1;;;1813:25:22;;;;;;;;;;;;1801:6;1808:1;1801:9;;;;;;-1:-1:-1;;;1801:9:22;;;;;;;;;;;;:37;-1:-1:-1;;;;;1801:37:22;;;;;;;;-1:-1:-1;1862:1:22;1852:11;;;;;1782:3;;;:::i;:::-;;;1742:132;;;-1:-1:-1;1891:10:22;;1883:55;;;;-1:-1:-1;;;1883:55:22;;;;;;;:::i;9076:372:7:-;-1:-1:-1;;;;;9155:16:7;;9147:61;;;;-1:-1:-1;;;9147:61:7;;;;;;;:::i;:::-;9227:16;9235:7;9227;:16::i;:::-;9226:17;9218:58;;;;-1:-1:-1;;;9218:58:7;;;;;;;:::i;:::-;9287:45;9316:1;9320:2;9324:7;9287:20;:45::i;:::-;-1:-1:-1;;;;;9343:13:7;;;;;;:9;:13;;;;;:18;;9360:1;;9343:13;:18;;9360:1;;9343:18;:::i;:::-;;;;-1:-1:-1;;9371:16:7;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;9371:21:7;-1:-1:-1;;;;;9371:21:7;;;;;;;;9408:33;;9371:16;;;9408:33;;9371:16;;9408:33;9076:372;;:::o;797:266:24:-;958:7;1016:8;1026:9;1037:10;1049:6;1005:51;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;1005:51:24;;;;;;;;;995:62;;1005:51;995:62;;;;;797:266;-1:-1:-1;;;;;797:266:24:o;1443:204::-;1561:7;1617:8;1627:13;1600:41;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1590:52;;;;;;1583:59;;1443:204;;;;:::o;718:377:2:-;1034:20;1080:8;;;718:377::o;4040:202:0:-;4125:4;-1:-1:-1;;;;;;4148:47:0;;-1:-1:-1;;;4148:47:0;;:87;;;4199:36;4223:11;4199:23;:36::i;2543:572:9:-;2682:45;2709:4;2715:2;2719:7;2682:26;:45::i;:::-;-1:-1:-1;;;;;2742:18:9;;2738:183;;2776:40;2808:7;2776:31;:40::i;:::-;2738:183;;;2845:2;-1:-1:-1;;;;;2837:10:9;:4;-1:-1:-1;;;;;2837:10:9;;2833:88;;2863:47;2896:4;2902:7;2863:32;:47::i;:::-;-1:-1:-1;;;;;2934:16:9;;2930:179;;2966:45;3003:7;2966:36;:45::i;:::-;2930:179;;;3038:4;-1:-1:-1;;;;;3032:10:9;:2;-1:-1:-1;;;;;3032:10:9;;3028:81;;3058:40;3086:2;3090:7;3058:27;:40::i;763:155:5:-;-1:-1:-1;;;;;;871:40:5;;-1:-1:-1;;;871:40:5;763:155;;;:::o;3821:161:9:-;3924:10;:17;;3897:24;;;;:15;:24;;;;;:44;;;3951:24;;;;;;;;;;;;3821:161::o;4599:970::-;4861:22;4911:1;4886:22;4903:4;4886:16;:22::i;:::-;:26;;;;:::i;:::-;4922:18;4943:26;;;:17;:26;;;;;;4861:51;;-1:-1:-1;5073:28:9;;;5069:323;;-1:-1:-1;;;;;5139:18:9;;5117:19;5139:18;;;:12;:18;;;;;;;;:34;;;;;;;;;5188:30;;;;;;:44;;;5304:30;;:17;:30;;;;;:43;;;5069:323;-1:-1:-1;5485:26:9;;;;:17;:26;;;;;;;;5478:33;;;-1:-1:-1;;;;;5528:18:9;;;;;:12;:18;;;;;:34;;;;;;;5521:41;4599:970::o;5857:1061::-;6131:10;:17;6106:22;;6131:21;;6151:1;;6131:21;:::i;:::-;6162:18;6183:24;;;:15;:24;;;;;;6551:10;:26;;6106:46;;-1:-1:-1;6183:24:9;;6106:46;;6551:26;;;;-1:-1:-1;;;6551:26:9;;;;;;;;;;;;;;;;;6529:48;;6613:11;6588:10;6599;6588:22;;;;;;-1:-1:-1;;;6588:22:9;;;;;;;;;;;;;;;;;;;;:36;;;;6692:28;;;:15;:28;;;;;;;:41;;;6861:24;;;;;6854:31;6895:10;:16;;;;;-1:-1:-1;;;6895:16:9;;;;;;;;;;;;;;;;;;;;;;;;;;5857:1061;;;;:::o;3409:217::-;3493:14;3510:20;3527:2;3510:16;:20::i;:::-;-1:-1:-1;;;;;3540:16:9;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;3584:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;3409:217:9:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:409:25;;114:18;106:6;103:30;100:2;;;136:18;;:::i;:::-;174:58;220:2;197:17;;-1:-1:-1;;193:31:25;226:4;189:42;174:58;:::i;:::-;165:67;;255:6;248:5;241:21;295:3;286:6;281:3;277:16;274:25;271:2;;;312:1;309;302:12;271:2;361:6;356:3;349:4;342:5;338:16;325:43;415:1;408:4;399:6;392:5;388:18;384:29;377:40;90:333;;;;;:::o;428:175::-;498:20;;-1:-1:-1;;;;;547:31:25;;537:42;;527:2;;593:1;590;583:12;608:198;;720:2;708:9;699:7;695:23;691:32;688:2;;;741:6;733;726:22;688:2;769:31;790:9;769:31;:::i;811:274::-;;;940:2;928:9;919:7;915:23;911:32;908:2;;;961:6;953;946:22;908:2;989:31;1010:9;989:31;:::i;:::-;979:41;;1039:40;1075:2;1064:9;1060:18;1039:40;:::i;:::-;1029:50;;898:187;;;;;:::o;1090:342::-;;;;1236:2;1224:9;1215:7;1211:23;1207:32;1204:2;;;1257:6;1249;1242:22;1204:2;1285:31;1306:9;1285:31;:::i;:::-;1275:41;;1335:40;1371:2;1360:9;1356:18;1335:40;:::i;:::-;1325:50;;1422:2;1411:9;1407:18;1394:32;1384:42;;1194:238;;;;;:::o;1437:702::-;;;;;1609:3;1597:9;1588:7;1584:23;1580:33;1577:2;;;1631:6;1623;1616:22;1577:2;1659:31;1680:9;1659:31;:::i;:::-;1649:41;;1709:40;1745:2;1734:9;1730:18;1709:40;:::i;:::-;1699:50;;1796:2;1785:9;1781:18;1768:32;1758:42;;1851:2;1840:9;1836:18;1823:32;1878:18;1870:6;1867:30;1864:2;;;1915:6;1907;1900:22;1864:2;1943:22;;1996:4;1988:13;;1984:27;-1:-1:-1;1974:2:25;;2030:6;2022;2015:22;1974:2;2058:75;2125:7;2120:2;2107:16;2102:2;2098;2094:11;2058:75;:::i;:::-;2048:85;;;1567:572;;;;;;;:::o;2144:329::-;;;2270:2;2258:9;2249:7;2245:23;2241:32;2238:2;;;2291:6;2283;2276:22;2238:2;2319:31;2340:9;2319:31;:::i;:::-;2309:41;;2400:2;2389:9;2385:18;2372:32;2413:30;2437:5;2413:30;:::i;:::-;2462:5;2452:15;;;2228:245;;;;;:::o;2478:266::-;;;2607:2;2595:9;2586:7;2582:23;2578:32;2575:2;;;2628:6;2620;2613:22;2575:2;2656:31;2677:9;2656:31;:::i;:::-;2646:41;2734:2;2719:18;;;;2706:32;;-1:-1:-1;;;2565:179:25:o;2749:1010::-;;2864:2;2907;2895:9;2886:7;2882:23;2878:32;2875:2;;;2928:6;2920;2913:22;2875:2;2973:9;2960:23;3002:18;3043:2;3035:6;3032:14;3029:2;;;3064:6;3056;3049:22;3029:2;3107:6;3096:9;3092:22;3082:32;;3152:7;3145:4;3141:2;3137:13;3133:27;3123:2;;3179:6;3171;3164:22;3123:2;3220;3207:16;3242:2;3238;3235:10;3232:2;;;3248:18;;:::i;:::-;3295:2;3291;3287:11;3277:21;;3318:27;3341:2;3337;3333:11;3318:27;:::i;:::-;3379:15;;;3410:12;;;;3442:11;;;3472;;;3468:20;;3465:33;-1:-1:-1;3462:2:25;;;3516:6;3508;3501:22;3462:2;3543:6;3534:15;;3558:171;3572:2;3569:1;3566:9;3558:171;;;3629:25;3650:3;3629:25;:::i;:::-;3617:38;;3590:1;3583:9;;;;;3675:12;;;;3707;;3558:171;;;-1:-1:-1;3748:5:25;2844:915;-1:-1:-1;;;;;;;;2844:915:25:o;3764:253::-;;3873:2;3861:9;3852:7;3848:23;3844:32;3841:2;;;3894:6;3886;3879:22;3841:2;3938:9;3925:23;3957:30;3981:5;3957:30;:::i;4022:257::-;;4142:2;4130:9;4121:7;4117:23;4113:32;4110:2;;;4163:6;4155;4148:22;4110:2;4200:9;4194:16;4219:30;4243:5;4219:30;:::i;4284:190::-;;4396:2;4384:9;4375:7;4371:23;4367:32;4364:2;;;4417:6;4409;4402:22;4364:2;-1:-1:-1;4445:23:25;;4354:120;-1:-1:-1;4354:120:25:o;4479:266::-;;;4608:2;4596:9;4587:7;4583:23;4579:32;4576:2;;;4629:6;4621;4614:22;4576:2;4670:9;4657:23;4647:33;;4699:40;4735:2;4724:9;4720:18;4699:40;:::i;4750:258::-;;;4879:2;4867:9;4858:7;4854:23;4850:32;4847:2;;;4900:6;4892;4885:22;4847:2;-1:-1:-1;;4928:23:25;;;4998:2;4983:18;;;4970:32;;-1:-1:-1;4837:171:25:o;5013:257::-;;5124:2;5112:9;5103:7;5099:23;5095:32;5092:2;;;5145:6;5137;5130:22;5092:2;5189:9;5176:23;5208:32;5234:5;5208:32;:::i;5275:261::-;;5397:2;5385:9;5376:7;5372:23;5368:32;5365:2;;;5418:6;5410;5403:22;5365:2;5455:9;5449:16;5474:32;5500:5;5474:32;:::i;5541:482::-;;5663:2;5651:9;5642:7;5638:23;5634:32;5631:2;;;5684:6;5676;5669:22;5631:2;5729:9;5716:23;5762:18;5754:6;5751:30;5748:2;;;5799:6;5791;5784:22;5748:2;5827:22;;5880:4;5872:13;;5868:27;-1:-1:-1;5858:2:25;;5914:6;5906;5899:22;5858:2;5942:75;6009:7;6004:2;5991:16;5986:2;5982;5978:11;5942:75;:::i;6223:194::-;;6346:2;6334:9;6325:7;6321:23;6317:32;6314:2;;;6367:6;6359;6352:22;6314:2;-1:-1:-1;6395:16:25;;6304:113;-1:-1:-1;6304:113:25:o;6422:259::-;;6503:5;6497:12;6530:6;6525:3;6518:19;6546:63;6602:6;6595:4;6590:3;6586:14;6579:4;6572:5;6568:16;6546:63;:::i;:::-;6663:2;6642:15;-1:-1:-1;;6638:29:25;6629:39;;;;6670:4;6625:50;;6473:208;-1:-1:-1;;6473:208:25:o;6686:247::-;6843:19;;;6887:2;6878:12;;6871:28;6924:2;6915:12;;6833:100::o;6938:470::-;;7155:6;7149:13;7171:53;7217:6;7212:3;7205:4;7197:6;7193:17;7171:53;:::i;:::-;7287:13;;7246:16;;;;7309:57;7287:13;7246:16;7343:4;7331:17;;7309:57;:::i;:::-;7382:20;;7125:283;-1:-1:-1;;;;7125:283:25:o;7413:786::-;;7824:25;7819:3;7812:38;7879:6;7873:13;7895:62;7950:6;7945:2;7940:3;7936:12;7929:4;7921:6;7917:17;7895:62;:::i;:::-;-1:-1:-1;;;8016:2:25;7976:16;;;8008:11;;;8001:40;8066:13;;8088:63;8066:13;8137:2;8129:11;;8122:4;8110:17;;8088:63;:::i;:::-;8171:17;8190:2;8167:26;;7802:397;-1:-1:-1;;;;7802:397:25:o;8204:203::-;-1:-1:-1;;;;;8368:32:25;;;;8350:51;;8338:2;8323:18;;8305:102::o;8412:304::-;-1:-1:-1;;;;;8642:15:25;;;8624:34;;8694:15;;8689:2;8674:18;;8667:43;8574:2;8559:18;;8541:175::o;8721:375::-;-1:-1:-1;;;;;8979:15:25;;;8961:34;;9031:15;;;;9026:2;9011:18;;9004:43;9078:2;9063:18;;9056:34;;;;8911:2;8896:18;;8878:218::o;9101:490::-;-1:-1:-1;;;;;9370:15:25;;;9352:34;;9422:15;;9417:2;9402:18;;9395:43;9469:2;9454:18;;9447:34;;;9517:3;9512:2;9497:18;;9490:31;;;9101:490;;9538:47;;9565:19;;9557:6;9538:47;:::i;:::-;9530:55;9304:287;-1:-1:-1;;;;;;9304:287:25:o;9596:274::-;-1:-1:-1;;;;;9788:32:25;;;;9770:51;;9852:2;9837:18;;9830:34;9758:2;9743:18;;9725:145::o;9875:387::-;;10107:1;10103;10098:3;10094:11;10090:19;10082:6;10078:32;10067:9;10060:51;10147:6;10142:2;10131:9;10127:18;10120:34;10190:2;10185;10174:9;10170:18;10163:30;10210:46;10252:2;10241:9;10237:18;10229:6;10210:46;:::i;:::-;10202:54;10050:212;-1:-1:-1;;;;;10050:212:25:o;10267:187::-;10432:14;;10425:22;10407:41;;10395:2;10380:18;;10362:92::o;10459:177::-;10605:25;;;10593:2;10578:18;;10560:76::o;10894:417::-;11125:25;;;11181:2;11166:18;;11159:34;;;;-1:-1:-1;;;;;11229:32:25;11224:2;11209:18;;11202:60;11293:2;11278:18;;11271:34;11112:3;11097:19;;11079:232::o;11316:221::-;;11465:2;11454:9;11447:21;11485:46;11527:2;11516:9;11512:18;11504:6;11485:46;:::i;11542:356::-;11744:2;11726:21;;;11763:18;;;11756:30;11822:34;11817:2;11802:18;;11795:62;11889:2;11874:18;;11716:182::o;11903:412::-;12105:2;12087:21;;;12144:2;12124:18;;;12117:30;12183:34;12178:2;12163:18;;12156:62;-1:-1:-1;;;12249:2:25;12234:18;;12227:46;12305:3;12290:19;;12077:238::o;12320:407::-;12522:2;12504:21;;;12561:2;12541:18;;;12534:30;12600:34;12595:2;12580:18;;12573:62;-1:-1:-1;;;12666:2:25;12651:18;;12644:41;12717:3;12702:19;;12494:233::o;12732:344::-;12934:2;12916:21;;;12973:2;12953:18;;;12946:30;-1:-1:-1;;;13007:2:25;12992:18;;12985:50;13067:2;13052:18;;12906:170::o;13081:351::-;13283:2;13265:21;;;13322:2;13302:18;;;13295:30;13361:29;13356:2;13341:18;;13334:57;13423:2;13408:18;;13255:177::o;13437:407::-;13639:2;13621:21;;;13678:2;13658:18;;;13651:30;13717:34;13712:2;13697:18;;13690:62;-1:-1:-1;;;13783:2:25;13768:18;;13761:41;13834:3;13819:19;;13611:233::o;13849:414::-;14051:2;14033:21;;;14090:2;14070:18;;;14063:30;14129:34;14124:2;14109:18;;14102:62;-1:-1:-1;;;14195:2:25;14180:18;;14173:48;14253:3;14238:19;;14023:240::o;14268:347::-;14470:2;14452:21;;;14509:2;14489:18;;;14482:30;14548:25;14543:2;14528:18;;14521:53;14606:2;14591:18;;14442:173::o;14620:402::-;14822:2;14804:21;;;14861:2;14841:18;;;14834:30;14900:34;14895:2;14880:18;;14873:62;-1:-1:-1;;;14966:2:25;14951:18;;14944:36;15012:3;14997:19;;14794:228::o;15027:356::-;15229:2;15211:21;;;15248:18;;;15241:30;15307:34;15302:2;15287:18;;15280:62;15374:2;15359:18;;15201:182::o;15388:352::-;15590:2;15572:21;;;15629:2;15609:18;;;15602:30;15668;15663:2;15648:18;;15641:58;15731:2;15716:18;;15562:178::o;15745:346::-;15947:2;15929:21;;;15986:2;15966:18;;;15959:30;-1:-1:-1;;;16020:2:25;16005:18;;15998:52;16082:2;16067:18;;15919:172::o;16096:400::-;16298:2;16280:21;;;16337:2;16317:18;;;16310:30;16376:34;16371:2;16356:18;;16349:62;-1:-1:-1;;;16442:2:25;16427:18;;16420:34;16486:3;16471:19;;16270:226::o;16501:349::-;16703:2;16685:21;;;16742:2;16722:18;;;16715:30;16781:27;16776:2;16761:18;;16754:55;16841:2;16826:18;;16675:175::o;16855:401::-;17057:2;17039:21;;;17096:2;17076:18;;;17069:30;17135:34;17130:2;17115:18;;17108:62;-1:-1:-1;;;17201:2:25;17186:18;;17179:35;17246:3;17231:19;;17029:227::o;17261:409::-;17463:2;17445:21;;;17502:2;17482:18;;;17475:30;17541:34;17536:2;17521:18;;17514:62;-1:-1:-1;;;17607:2:25;17592:18;;17585:43;17660:3;17645:19;;17435:235::o;17675:408::-;17877:2;17859:21;;;17916:2;17896:18;;;17889:30;17955:34;17950:2;17935:18;;17928:62;-1:-1:-1;;;18021:2:25;18006:18;;17999:42;18073:3;18058:19;;17849:234::o;18088:400::-;18290:2;18272:21;;;18329:2;18309:18;;;18302:30;18368:34;18363:2;18348:18;;18341:62;-1:-1:-1;;;18434:2:25;18419:18;;18412:34;18478:3;18463:19;;18262:226::o;18493:399::-;18695:2;18677:21;;;18734:2;18714:18;;;18707:30;18773:34;18768:2;18753:18;;18746:62;-1:-1:-1;;;18839:2:25;18824:18;;18817:33;18882:3;18867:19;;18667:225::o;18897:340::-;19099:2;19081:21;;;19138:2;19118:18;;;19111:30;-1:-1:-1;;;19172:2:25;19157:18;;19150:46;19228:2;19213:18;;19071:166::o;19242:339::-;19444:2;19426:21;;;19483:2;19463:18;;;19456:30;-1:-1:-1;;;19517:2:25;19502:18;;19495:45;19572:2;19557:18;;19416:165::o;19586:420::-;19788:2;19770:21;;;19827:2;19807:18;;;19800:30;19866:34;19861:2;19846:18;;19839:62;19937:26;19932:2;19917:18;;19910:54;19996:3;19981:19;;19760:246::o;20011:406::-;20213:2;20195:21;;;20252:2;20232:18;;;20225:30;20291:34;20286:2;20271:18;;20264:62;-1:-1:-1;;;20357:2:25;20342:18;;20335:40;20407:3;20392:19;;20185:232::o;20422:405::-;20624:2;20606:21;;;20663:2;20643:18;;;20636:30;20702:34;20697:2;20682:18;;20675:62;-1:-1:-1;;;20768:2:25;20753:18;;20746:39;20817:3;20802:19;;20596:231::o;20832:410::-;21034:2;21016:21;;;21073:2;21053:18;;;21046:30;21112:34;21107:2;21092:18;;21085:62;-1:-1:-1;;;21178:2:25;21163:18;;21156:44;21232:3;21217:19;;21006:236::o;21247:356::-;21449:2;21431:21;;;21468:18;;;21461:30;21527:34;21522:2;21507:18;;21500:62;21594:2;21579:18;;21421:182::o;21608:412::-;21810:2;21792:21;;;21849:2;21829:18;;;21822:30;21888:34;21883:2;21868:18;;21861:62;-1:-1:-1;;;21954:2:25;21939:18;;21932:46;22010:3;21995:19;;21782:238::o;22025:413::-;22227:2;22209:21;;;22266:2;22246:18;;;22239:30;22305:34;22300:2;22285:18;;22278:62;-1:-1:-1;;;22371:2:25;22356:18;;22349:47;22428:3;22413:19;;22199:239::o;22443:408::-;22645:2;22627:21;;;22684:2;22664:18;;;22657:30;22723:34;22718:2;22703:18;;22696:62;-1:-1:-1;;;22789:2:25;22774:18;;22767:42;22841:3;22826:19;;22617:234::o;22856:356::-;23058:2;23040:21;;;23077:18;;;23070:30;23136:34;23131:2;23116:18;;23109:62;23203:2;23188:18;;23030:182::o;23217:405::-;23419:2;23401:21;;;23458:2;23438:18;;;23431:30;23497:34;23492:2;23477:18;;23470:62;-1:-1:-1;;;23563:2:25;23548:18;;23541:39;23612:3;23597:19;;23391:231::o;23627:355::-;23829:2;23811:21;;;23868:2;23848:18;;;23841:30;23907:33;23902:2;23887:18;;23880:61;23973:2;23958:18;;23801:181::o;23987:355::-;24189:2;24171:21;;;24228:2;24208:18;;;24201:30;24267:33;24262:2;24247:18;;24240:61;24333:2;24318:18;;24161:181::o;24347:405::-;24549:2;24531:21;;;24588:2;24568:18;;;24561:30;24627:34;24622:2;24607:18;;24600:62;-1:-1:-1;;;24693:2:25;24678:18;;24671:39;24742:3;24727:19;;24521:231::o;24757:350::-;24959:2;24941:21;;;24998:2;24978:18;;;24971:30;25037:28;25032:2;25017:18;;25010:56;25098:2;25083:18;;24931:176::o;25112:397::-;25314:2;25296:21;;;25353:2;25333:18;;;25326:30;25392:34;25387:2;25372:18;;25365:62;-1:-1:-1;;;25458:2:25;25443:18;;25436:31;25499:3;25484:19;;25286:223::o;25514:346::-;25716:2;25698:21;;;25755:2;25735:18;;;25728:30;-1:-1:-1;;;25789:2:25;25774:18;;25767:52;25851:2;25836:18;;25688:172::o;25865:349::-;26067:2;26049:21;;;26106:2;26086:18;;;26079:30;26145:27;26140:2;26125:18;;26118:55;26205:2;26190:18;;26039:175::o;26219:348::-;26421:2;26403:21;;;26460:2;26440:18;;;26433:30;26499:26;26494:2;26479:18;;26472:54;26558:2;26543:18;;26393:174::o;26572:350::-;26774:2;26756:21;;;26813:2;26793:18;;;26786:30;26852:28;26847:2;26832:18;;26825:56;26913:2;26898:18;;26746:176::o;26927:353::-;27129:2;27111:21;;;27168:2;27148:18;;;27141:30;27207:31;27202:2;27187:18;;27180:59;27271:2;27256:18;;27101:179::o;27285:398::-;27487:2;27469:21;;;27526:2;27506:18;;;27499:30;27565:34;27560:2;27545:18;;27538:62;-1:-1:-1;;;27631:2:25;27616:18;;27609:32;27673:3;27658:19;;27459:224::o;27688:413::-;27890:2;27872:21;;;27929:2;27909:18;;;27902:30;27968:34;27963:2;27948:18;;27941:62;-1:-1:-1;;;28034:2:25;28019:18;;28012:47;28091:3;28076:19;;27862:239::o;28106:398::-;28308:2;28290:21;;;28347:2;28327:18;;;28320:30;28386:34;28381:2;28366:18;;28359:62;-1:-1:-1;;;28452:2:25;28437:18;;28430:32;28494:3;28479:19;;28280:224::o;28509:412::-;28711:2;28693:21;;;28750:2;28730:18;;;28723:30;28789:34;28784:2;28769:18;;28762:62;-1:-1:-1;;;28855:2:25;28840:18;;28833:46;28911:3;28896:19;;28683:238::o;28926:347::-;29128:2;29110:21;;;29167:2;29147:18;;;29140:30;29206:25;29201:2;29186:18;;29179:53;29264:2;29249:18;;29100:173::o;29278:403::-;29480:2;29462:21;;;29519:2;29499:18;;;29492:30;29558:34;29553:2;29538:18;;29531:62;-1:-1:-1;;;29624:2:25;29609:18;;29602:37;29671:3;29656:19;;29452:229::o;29686:408::-;29888:2;29870:21;;;29927:2;29907:18;;;29900:30;29966:34;29961:2;29946:18;;29939:62;-1:-1:-1;;;30032:2:25;30017:18;;30010:42;30084:3;30069:19;;29860:234::o;30099:409::-;30301:2;30283:21;;;30340:2;30320:18;;;30313:30;30379:34;30374:2;30359:18;;30352:62;-1:-1:-1;;;30445:2:25;30430:18;;30423:43;30498:3;30483:19;;30273:235::o;30513:419::-;30715:2;30697:21;;;30754:2;30734:18;;;30727:30;30793:34;30788:2;30773:18;;30766:62;30864:25;30859:2;30844:18;;30837:53;30922:3;30907:19;;30687:245::o;30937:344::-;31139:2;31121:21;;;31178:2;31158:18;;;31151:30;-1:-1:-1;;;31212:2:25;31197:18;;31190:50;31272:2;31257:18;;31111:170::o;31286:412::-;31488:2;31470:21;;;31527:2;31507:18;;;31500:30;31566:34;31561:2;31546:18;;31539:62;-1:-1:-1;;;31632:2:25;31617:18;;31610:46;31688:3;31673:19;;31460:238::o;31703:401::-;31905:2;31887:21;;;31944:2;31924:18;;;31917:30;31983:34;31978:2;31963:18;;31956:62;-1:-1:-1;;;32049:2:25;32034:18;;32027:35;32094:3;32079:19;;31877:227::o;32109:411::-;32311:2;32293:21;;;32350:2;32330:18;;;32323:30;32389:34;32384:2;32369:18;;32362:62;-1:-1:-1;;;32455:2:25;32440:18;;32433:45;32510:3;32495:19;;32283:237::o;32525:399::-;32727:2;32709:21;;;32766:2;32746:18;;;32739:30;32805:34;32800:2;32785:18;;32778:62;-1:-1:-1;;;32871:2:25;32856:18;;32849:33;32914:3;32899:19;;32699:225::o;33111:251::-;33181:2;33175:9;33211:17;;;33258:18;33243:34;;33279:22;;;33240:62;33237:2;;;33305:18;;:::i;:::-;33341:2;33334:22;33155:207;;-1:-1:-1;33155:207:25:o;33367:128::-;;33438:1;33434:6;33431:1;33428:13;33425:2;;;33444:18;;:::i;:::-;-1:-1:-1;33480:9:25;;33415:80::o;33500:120::-;;33566:1;33556:2;;33571:18;;:::i;:::-;-1:-1:-1;33605:9:25;;33546:74::o;33625:168::-;;33731:1;33727;33723:6;33719:14;33716:1;33713:21;33708:1;33701:9;33694:17;33690:45;33687:2;;;33738:18;;:::i;:::-;-1:-1:-1;33778:9:25;;33677:116::o;33798:125::-;;33866:1;33863;33860:8;33857:2;;;33871:18;;:::i;:::-;-1:-1:-1;33908:9:25;;33847:76::o;33928:258::-;34000:1;34010:113;34024:6;34021:1;34018:13;34010:113;;;34100:11;;;34094:18;34081:11;;;34074:39;34046:2;34039:10;34010:113;;;34141:6;34138:1;34135:13;34132:2;;;-1:-1:-1;;34176:1:25;34158:16;;34151:27;33981:205::o;34191:136::-;;34258:5;34248:2;;34267:18;;:::i;:::-;-1:-1:-1;;;34303:18:25;;34238:89::o;34332:380::-;34417:1;34407:12;;34464:1;34454:12;;;34475:2;;34529:4;34521:6;34517:17;34507:27;;34475:2;34582;34574:6;34571:14;34551:18;34548:38;34545:2;;;34628:10;34623:3;34619:20;34616:1;34609:31;34663:4;34660:1;34653:15;34691:4;34688:1;34681:15;34545:2;;34387:325;;;:::o;34717:135::-;;-1:-1:-1;;34777:17:25;;34774:2;;;34797:18;;:::i;:::-;-1:-1:-1;34844:1:25;34833:13;;34764:88::o;34857:112::-;;34915:1;34905:2;;34920:18;;:::i;:::-;-1:-1:-1;34954:9:25;;34895:74::o;34974:127::-;35035:10;35030:3;35026:20;35023:1;35016:31;35066:4;35063:1;35056:15;35090:4;35087:1;35080:15;35106:127;35167:10;35162:3;35158:20;35155:1;35148:31;35198:4;35195:1;35188:15;35222:4;35219:1;35212:15;35238:127;35299:10;35294:3;35290:20;35287:1;35280:31;35330:4;35327:1;35320:15;35354:4;35351:1;35344:15;35370:120;35458:5;35451:13;35444:21;35437:5;35434:32;35424:2;;35480:1;35477;35470:12;35495:133;-1:-1:-1;;;;;;35571:32:25;;35561:43;;35551:2;;35618:1;35615;35608:12
Swarm Source
ipfs://06737d756cbda62a7f232e1119fc6581ae9e4fa56bbf98a4d5068689c1b243cf
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.