Token Arcane
Overview ERC-721
Total Supply:
250 ARC
Holders:
135 addresses
Contract:
Balance
1 ARC
[ Download CSV Export ]
[ Download CSV Export ]
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Arcane
Compiler Version
v0.8.4+commit.c7e474f2
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// ` : | | | |: || : ` : | |+|: | : : :| . ` . // ` : | :| || |: : ` | | :| : | : |: | . : // .' ': || |: | ' ` || | : | |: : | . ` . :. // `' || | ' | * ` : | | :| |*| : : :| // * * ` | : : | . ` ' :| | :| . : : * :.|| // .` | | | : .:| ` | || | : |: | | || // ' . + ` | : .: . '| | : :| : . |:| || // . . ` *| || : ` | | :| | : |:| | // . . . || |.: * | || : : :||| // . . . * . . ` |||. + + '| ||| . ||` // . * . +:`|! . |||| :.||` // + . ..!|* . | :`||+ |||` // . + : |||` .| :| | | |.| ||` . // * + ' + :|| |` :.+. || || | |:`|| ` // . .||` . ..|| | |: '` `| | |` + // . +++ || !|!: ` :| | // + . . | . `|||.: .|| . . ` // ' `|. . `:||| + ||' ` // __ + * `' `'|. `: //"' `---"""----....____,..^---`^``----.,.___ `. `. . ____,.,- // ___,--'""`---"' ^ ^ ^ ^ """'---,..___ __,..---""' //--"' ^ ``--..,__ D.Rice //SPDX-License-Identifier: Unlicense pragma solidity ^0.8.0; import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/security/ReentrancyGuard.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; interface ISkillbook { function createBook(uint256[5] memory _startSkills, uint256 _wizId) external; } contract Arcane is ERC721Enumerable, ReentrancyGuard, Ownable { using Strings for uint256; // @dev connected contracts // 0 - vault // 1 - skillbook // 2 - loot // 3 - home // 4 - adventure mapping(uint256 => address) public connected; mapping(uint256 => Wizard) public wizards; ISkillbook public SKILLBOOK; uint256 public MAX_SUPPLY = 5555; uint256 public PRICE = 50000000000000000; string public BASE_URI; string public BASE_EXTENSION = ".json"; uint256 private randCounter = 0; event WizardBorn( string name, string race, string archetype, string affinity, string identity1, string identity2 ); event WizardRenounced(uint256 wizardId, string name); string[11] public archetypes = [ "Wizard", "Mage", "Priest", "Warlock", "Mentah", "Sorcerer", "Druid", "Enchanter", "Astronomer", "Elementalist", "Shadowcaster" ]; string[6] public affinities = [ "Arcane", "Shadow", "Divine", "Elemental", "Voodoo", "Wild" ]; string[29] public identities = [ "Zen", "Uncivilized", "Adventurer", "Logistician", "Farsighted", "Mysterious", "Paranoiac", "Stoic", "Suspicious", "Honest", "Introvert", "Leader", "Quiet", "Inspired", "Curious", "Veteran", "Honest", "Fearless", "Calculated", "Applied", "Cunning", "Spiritual", "Tenacious", "Scarred", "Hermit", "Immoral", "Ruthless", "Primitive", "Brooding" ]; string[5] public races = ["Human", "Siam", "Undead", "Sylvan", "Yord"]; // Previous "Vision" "Knowledge" string[7] public skills = [ "Focus", "Strenght" "Intellect", "Spell", "Endurance" ]; struct Wizard { string name; uint8 mana; uint256 dna; uint256 birthday; } constructor() ERC721("Arcane", "ARC") {} modifier isConnected() { require(_isContractConnected(msg.sender), "No authority"); _; } // EXTERNAL // ------------------------------------------------------ function claimWizard(string memory _name) external payable nonReentrant { require(msg.value >= PRICE, "Not enough ETH to summon"); require(totalSupply() < MAX_SUPPLY, "All Wizards Have Been Summoned!"); uint256 newId = totalSupply(); _mintWizard(newId, _name); _safeMint(msg.sender, newId); } // @dev Forever gone in the corridors of Time... function renounceWizard(uint256 _wizId, address _caller) external nonReentrant isConnected { require(_exists(_wizId), "This Wizard doesn't exist"); require(ownerOf(_wizId) == _caller, "You're not the owner"); string memory name = wizards[_wizId].name; _burn(_wizId); emit WizardRenounced(_wizId, name); } function getWizardInfosIds(uint256 _wizId) external view returns (uint256[5] memory) { return _sliceDna(wizards[_wizId].dna); } function getWizardInfosString(uint256 _wizId) external view returns (string[6] memory) { string[6] memory infos; uint256[5] memory ids = _sliceDna(wizards[_wizId].dna); infos[0] = wizards[_wizId].name; infos[1] = races[ids[4]]; infos[2] = archetypes[ids[3]]; infos[3] = affinities[ids[2]]; infos[4] = identities[ids[1]]; infos[5] = identities[ids[0]]; return infos; } function getBirthday(uint256 _wizId) external view returns (uint256) { return wizards[_wizId].birthday; } function checkIfConnected(address _sender) external view returns (bool) { return _isContractConnected(_sender); } function tokenURI(uint256 _wizId) public view virtual override returns (string memory) { require(_exists(_wizId)); return string( abi.encodePacked(BASE_URI, _wizId.toString(), BASE_EXTENSION) ); } // INTERNAL // ------------------------------------------------------ function _mintWizard(uint256 _id, string memory _name) internal { wizards[_id].name = _name; wizards[_id].mana = 10; uint8 race = uint8(_randomize(_name, 5)); uint8 archetype = uint8(_randomize(_name, 6)); uint8 identity1 = uint8(_randomize(_name, 29)); uint8 identity2 = uint8(_randomize(_name, 29)); while (identity1 == identity2) { identity2 = uint8(_randomize(_name, 29)); } uint8 affinity = uint8(_randomize(_name, 5)); uint256 dna = _createDNA( race, archetype, affinity, identity1, identity2 ); if (_id == 0) { dna = 2021204; } wizards[_id].dna = dna; uint256[5] memory skillBook; for (uint8 i; i < 5; i++) { skillBook[i] = 1 + uint256(_randomize(_name, 3)); } wizards[_id].birthday = block.timestamp; SKILLBOOK.createBook(skillBook, _id); emit WizardBorn( _name, races[race], archetypes[archetype], affinities[affinity], identities[identity1], identities[identity2] ); } function _randomize(string memory _salt, uint256 _limit) internal returns (uint256) { randCounter++; if (randCounter >= 1000) { randCounter = 0; } return uint256( keccak256( abi.encodePacked( _salt, block.timestamp, block.number, randCounter ) ) ) % _limit; } function _isContractConnected(address _caller) internal view returns (bool) { for (uint8 i = 0; i < 10; i++) { if (connected[i] == _caller) { return true; } } return false; } function _createDNA( uint256 _race, uint256 _archetype, uint256 _affinity, uint256 _identity1, uint256 _identity2 ) internal pure returns (uint256) { uint256 dna = _race * 100000000; dna += _archetype * 1000000; dna += _affinity * 10000; dna += _identity1 * 100; dna += _identity2; return dna; } function _sliceDna(uint256 _dna) internal pure returns (uint256[5] memory) { uint256[5] memory digits; uint256 number = _dna; uint256 counter = 0; while (number > 0) { uint8 digit = uint8(number % 100); number = number / 100; digits[counter] = digit; counter++; } return digits; } function _getSlice( uint256 begin, uint256 end, string memory text ) internal pure returns (string memory) { bytes memory a = new bytes(end - begin + 1); for (uint256 i = 0; i <= end - begin; i++) { a[i] = bytes(text)[i + begin - 1]; } return string(a); } // ONLY OWNER // ------------------------------------------------------ function setConnected(uint256 _connectedId, address _address) external onlyOwner { connected[_connectedId] = _address; if (_connectedId == 1) { SKILLBOOK = ISkillbook(_address); } } function disconnectContract(uint256 _contractId) external onlyOwner { connected[_contractId] = address(0); } function withdraw() external onlyOwner { require(connected[0] != address(0), "Vault is set to 0x0"); require(payable(connected[0]).send(address(this).balance)); } function setPrice(uint256 _newPrice) external onlyOwner { PRICE = _newPrice; } function setSupply(uint256 _newSupply) external onlyOwner { MAX_SUPPLY = _newSupply; } function setBaseURI(string memory _newBaseURI) public onlyOwner { BASE_URI = _newBaseURI; } function setBaseExtension(string memory _newBaseExtension) public onlyOwner { BASE_EXTENSION = _newBaseExtension; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; import "../ERC721.sol"; import "./IERC721Enumerable.sol"; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; import "./IERC721.sol"; import "./IERC721Receiver.sol"; import "./extensions/IERC721Metadata.sol"; import "../../utils/Address.sol"; import "../../utils/Context.sol"; import "../../utils/Strings.sol"; import "../../utils/introspection/ERC165.sol"; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(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); _afterTokenTransfer(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 from incorrect owner"); 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); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @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. * - `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 tokenId ) internal virtual {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @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 * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } }, "libraries": {} }
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":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":"string","name":"name","type":"string"},{"indexed":false,"internalType":"string","name":"race","type":"string"},{"indexed":false,"internalType":"string","name":"archetype","type":"string"},{"indexed":false,"internalType":"string","name":"affinity","type":"string"},{"indexed":false,"internalType":"string","name":"identity1","type":"string"},{"indexed":false,"internalType":"string","name":"identity2","type":"string"}],"name":"WizardBorn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"wizardId","type":"uint256"},{"indexed":false,"internalType":"string","name":"name","type":"string"}],"name":"WizardRenounced","type":"event"},{"inputs":[],"name":"BASE_EXTENSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BASE_URI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SKILLBOOK","outputs":[{"internalType":"contract ISkillbook","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"affinities","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"uint256","name":"","type":"uint256"}],"name":"archetypes","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_sender","type":"address"}],"name":"checkIfConnected","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"}],"name":"claimWizard","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"connected","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_contractId","type":"uint256"}],"name":"disconnectContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_wizId","type":"uint256"}],"name":"getBirthday","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_wizId","type":"uint256"}],"name":"getWizardInfosIds","outputs":[{"internalType":"uint256[5]","name":"","type":"uint256[5]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_wizId","type":"uint256"}],"name":"getWizardInfosString","outputs":[{"internalType":"string[6]","name":"","type":"string[6]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"identities","outputs":[{"internalType":"string","name":"","type":"string"}],"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":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"races","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_wizId","type":"uint256"},{"internalType":"address","name":"_caller","type":"address"}],"name":"renounceWizard","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":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_connectedId","type":"uint256"},{"internalType":"address","name":"_address","type":"address"}],"name":"setConnected","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newSupply","type":"uint256"}],"name":"setSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"skills","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","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":"_wizId","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":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"wizards","outputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint8","name":"mana","type":"uint8"},{"internalType":"uint256","name":"dna","type":"uint256"},{"internalType":"uint256","name":"birthday","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040526115b3600f5566b1a2bc2ec500006010556040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250601290805190602001906200006292919062000f4d565b5060006013556040518061016001604052806040518060400160405280600681526020017f57697a617264000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f4d6167650000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f507269657374000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f5761726c6f636b0000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4d656e746168000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f536f72636572657200000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f447275696400000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f456e6368616e746572000000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f417374726f6e6f6d65720000000000000000000000000000000000000000000081525081526020016040518060400160405280600c81526020017f456c656d656e74616c697374000000000000000000000000000000000000000081525081526020016040518060400160405280600c81526020017f536861646f776361737465720000000000000000000000000000000000000000815250815250601490600b6200030d92919062000fde565b506040518060c001604052806040518060400160405280600681526020017f417263616e65000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f536861646f77000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f446976696e65000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f456c656d656e74616c000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f566f6f646f6f000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f57696c6400000000000000000000000000000000000000000000000000000000815250815250601f9060066200048b92919062001038565b50604051806103a001604052806040518060400160405280600381526020017f5a656e000000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f556e636976696c697a656400000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f416476656e74757265720000000000000000000000000000000000000000000081525081526020016040518060400160405280600b81526020017f4c6f67697374696369616e00000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f466172736967687465640000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f4d7973746572696f75730000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f506172616e6f696163000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f53746f696300000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f537573706963696f75730000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f486f6e657374000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f496e74726f76657274000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4c6561646572000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600581526020017f517569657400000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f496e73706972656400000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f437572696f75730000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f5665746572616e0000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f486f6e657374000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f466561726c65737300000000000000000000000000000000000000000000000081525081526020016040518060400160405280600a81526020017f43616c63756c617465640000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f4170706c6965640000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f43756e6e696e670000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f53706972697475616c000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f54656e6163696f7573000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f536361727265640000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f4865726d6974000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600781526020017f496d6d6f72616c0000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f527574686c65737300000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f5072696d6974697665000000000000000000000000000000000000000000000081525081526020016040518060400160405280600881526020017f42726f6f64696e67000000000000000000000000000000000000000000000000815250815250602590601d62000b5792919062001092565b506040518060a001604052806040518060400160405280600581526020017f48756d616e00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f5369616d0000000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f556e64656164000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600681526020017f53796c76616e000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600481526020017f596f726400000000000000000000000000000000000000000000000000000000815250815250604290600562000c9a929190620010ec565b5060405180608001604052806040518060400160405280600581526020017f466f63757300000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280601181526020017f537472656e676874496e74656c6c65637400000000000000000000000000000081525081526020016040518060400160405280600581526020017f5370656c6c00000000000000000000000000000000000000000000000000000081525081526020016040518060400160405280600981526020017f456e647572616e63650000000000000000000000000000000000000000000000815250815250604790600462000da292919062001146565b5034801562000db057600080fd5b506040518060400160405280600681526020017f417263616e6500000000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f4152430000000000000000000000000000000000000000000000000000000000815250816000908051906020019062000e3592919062000f4d565b50806001908051906020019062000e4e92919062000f4d565b5050506001600a8190555062000e7962000e6d62000e7f60201b60201c565b62000e8760201b60201c565b62001292565b600033905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b82805462000f5b906200122d565b90600052602060002090601f01602090048101928262000f7f576000855562000fcb565b82601f1062000f9a57805160ff191683800117855562000fcb565b8280016001018555821562000fcb579182015b8281111562000fca57825182559160200191906001019062000fad565b5b50905062000fda9190620011a0565b5090565b82600b810192821562001025579160200282015b82811115620010245782518290805190602001906200101392919062000f4d565b509160200191906001019062000ff2565b5b509050620010349190620011bf565b5090565b82600681019282156200107f579160200282015b828111156200107e5782518290805190602001906200106d92919062000f4d565b50916020019190600101906200104c565b5b5090506200108e9190620011bf565b5090565b82601d8101928215620010d9579160200282015b82811115620010d8578251829080519060200190620010c792919062000f4d565b5091602001919060010190620010a6565b5b509050620010e89190620011bf565b5090565b826005810192821562001133579160200282015b82811115620011325782518290805190602001906200112192919062000f4d565b509160200191906001019062001100565b5b509050620011429190620011bf565b5090565b82600781019282156200118d579160200282015b828111156200118c5782518290805190602001906200117b92919062000f4d565b50916020019190600101906200115a565b5b5090506200119c9190620011bf565b5090565b5b80821115620011bb576000816000905550600101620011a1565b5090565b5b80821115620011e35760008181620011d99190620011e7565b50600101620011c0565b5090565b508054620011f5906200122d565b6000825580601f106200120957506200122a565b601f016020900490600052602060002090810190620012299190620011a0565b5b50565b600060028204905060018216806200124657607f821691505b602082108114156200125d576200125c62001263565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6160dd80620012a26000396000f3fe6080604052600436106102675760003560e01c806370a0823111610144578063c8d2524c116100b6578063e5b0a9931161007a578063e5b0a993146109a4578063e985e9c5146109e1578063eaaf77e614610a1e578063eae1e5d414610a5b578063f2fde38b14610a84578063f8da13c614610aad57610267565b8063c8d2524c146108ab578063da3ef23f146108e8578063dbddb26a14610911578063df3fdf001461093c578063e29afe3e1461096757610267565b806391b7f5ed1161010857806391b7f5ed1461079f57806395d89b41146107c8578063a22cb465146107f3578063b88d4fde1461081c578063c09172c114610845578063c87b56dd1461086e57610267565b806370a08231146106b8578063715018a6146106f55780637bbc469e1461070c5780638d859f3e146107495780638da5cb5b1461077457610267565b806332cb6b0c116101dd57806349f5ede0116101a157806349f5ede0146105725780634f6ccce71461059b57806350d15fbe146105d857806355f804b3146106155780636352211e1461063e578063649171ee1461067b57610267565b806332cb6b0c146104a15780633b4c4b25146104cc5780633ccfd60b146104f55780633e144c541461050c57806342842e0e1461054957610267565b8063133ae3971161022f578063133ae3971461037a57806314e0af82146103b757806318160ddd146103f45780631e8a94841461041f57806323b872dd1461043b5780632f745c591461046457610267565b806301ffc9a71461026c57806306fdde03146102a9578063081812fc146102d4578063095ea7b3146103115780630fa866171461033a575b600080fd5b34801561027857600080fd5b50610293600480360381019061028e919061481b565b610ad8565b6040516102a091906150e7565b60405180910390f35b3480156102b557600080fd5b506102be610b52565b6040516102cb919061511d565b60405180910390f35b3480156102e057600080fd5b506102fb60048036038101906102f691906148ae565b610be4565b604051610308919061501a565b60405180910390f35b34801561031d57600080fd5b50610338600480360381019061033391906147df565b610c69565b005b34801561034657600080fd5b50610361600480360381019061035c91906148ae565b610d81565b60405161037194939291906151ca565b60405180910390f35b34801561038657600080fd5b506103a1600480360381019061039c91906148ae565b610e46565b6040516103ae91906150a3565b60405180910390f35b3480156103c357600080fd5b506103de60048036038101906103d99190614674565b610e74565b6040516103eb91906150e7565b60405180910390f35b34801561040057600080fd5b50610409610e86565b6040516104169190615516565b60405180910390f35b6104396004803603810190610434919061486d565b610e93565b005b34801561044757600080fd5b50610462600480360381019061045d91906146d9565b610f9d565b005b34801561047057600080fd5b5061048b600480360381019061048691906147df565b610ffd565b6040516104989190615516565b60405180910390f35b3480156104ad57600080fd5b506104b66110a2565b6040516104c39190615516565b60405180910390f35b3480156104d857600080fd5b506104f360048036038101906104ee91906148ae565b6110a8565b005b34801561050157600080fd5b5061050a61112e565b005b34801561051857600080fd5b50610533600480360381019061052e91906148ae565b6112c0565b604051610540919061511d565b60405180910390f35b34801561055557600080fd5b50610570600480360381019061056b91906146d9565b611363565b005b34801561057e57600080fd5b50610599600480360381019061059491906148d7565b611383565b005b3480156105a757600080fd5b506105c260048036038101906105bd91906148ae565b6115c9565b6040516105cf9190615516565b60405180910390f35b3480156105e457600080fd5b506105ff60048036038101906105fa91906148ae565b611660565b60405161060c919061511d565b60405180910390f35b34801561062157600080fd5b5061063c6004803603810190610637919061486d565b611703565b005b34801561064a57600080fd5b50610665600480360381019061066091906148ae565b611799565b604051610672919061501a565b60405180910390f35b34801561068757600080fd5b506106a2600480360381019061069d91906148ae565b61184b565b6040516106af919061501a565b60405180910390f35b3480156106c457600080fd5b506106df60048036038101906106da9190614674565b61187e565b6040516106ec9190615516565b60405180910390f35b34801561070157600080fd5b5061070a611936565b005b34801561071857600080fd5b50610733600480360381019061072e91906148ae565b6119be565b604051610740919061511d565b60405180910390f35b34801561075557600080fd5b5061075e611a61565b60405161076b9190615516565b60405180910390f35b34801561078057600080fd5b50610789611a67565b604051610796919061501a565b60405180910390f35b3480156107ab57600080fd5b506107c660048036038101906107c191906148ae565b611a91565b005b3480156107d457600080fd5b506107dd611b17565b6040516107ea919061511d565b60405180910390f35b3480156107ff57600080fd5b5061081a600480360381019061081591906147a3565b611ba9565b005b34801561082857600080fd5b50610843600480360381019061083e9190614728565b611bbf565b005b34801561085157600080fd5b5061086c600480360381019061086791906148d7565b611c21565b005b34801561087a57600080fd5b50610895600480360381019061089091906148ae565b611d3e565b6040516108a2919061511d565b60405180910390f35b3480156108b757600080fd5b506108d260048036038101906108cd91906148ae565b611d87565b6040516108df9190615516565b60405180910390f35b3480156108f457600080fd5b5061090f600480360381019061090a919061486d565b611da7565b005b34801561091d57600080fd5b50610926611e3d565b604051610933919061511d565b60405180910390f35b34801561094857600080fd5b50610951611ecb565b60405161095e919061511d565b60405180910390f35b34801561097357600080fd5b5061098e600480360381019061098991906148ae565b611f59565b60405161099b9190615081565b60405180910390f35b3480156109b057600080fd5b506109cb60048036038101906109c691906148ae565b6126cb565b6040516109d8919061511d565b60405180910390f35b3480156109ed57600080fd5b50610a086004803603810190610a03919061469d565b61276e565b604051610a1591906150e7565b60405180910390f35b348015610a2a57600080fd5b50610a456004803603810190610a4091906148ae565b612802565b604051610a52919061511d565b60405180910390f35b348015610a6757600080fd5b50610a826004803603810190610a7d91906148ae565b6128a5565b005b348015610a9057600080fd5b50610aab6004803603810190610aa69190614674565b612977565b005b348015610ab957600080fd5b50610ac2612a6f565b604051610acf9190615102565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b4b5750610b4a82612a95565b5b9050919050565b606060008054610b61906158a7565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8d906158a7565b8015610bda5780601f10610baf57610100808354040283529160200191610bda565b820191906000526020600020905b815481529060010190602001808311610bbd57829003601f168201915b5050505050905090565b6000610bef82612b77565b610c2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2590615416565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c7482611799565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ce5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cdc90615456565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d04612be3565b73ffffffffffffffffffffffffffffffffffffffff161480610d335750610d3281610d2d612be3565b61276e565b5b610d72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6990615396565b60405180910390fd5b610d7c8383612beb565b505050565b600d602052806000526040600020600091509050806000018054610da4906158a7565b80601f0160208091040260200160405190810160405280929190818152602001828054610dd0906158a7565b8015610e1d5780601f10610df257610100808354040283529160200191610e1d565b820191906000526020600020905b815481529060010190602001808311610e0057829003601f168201915b5050505050908060010160009054906101000a900460ff16908060020154908060030154905084565b610e4e61444f565b610e6d600d600084815260200190815260200160002060020154612ca4565b9050919050565b6000610e7f82612d4a565b9050919050565b6000600880549050905090565b6002600a541415610ed9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed0906154f6565b60405180910390fd5b6002600a81905550601054341015610f26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1d90615356565b60405180910390fd5b600f54610f31610e86565b10610f71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6890615376565b60405180910390fd5b6000610f7b610e86565b9050610f878183612df0565b610f9133826131b0565b506001600a8190555050565b610fae610fa8612be3565b826131ce565b610fed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe490615496565b60405180910390fd5b610ff88383836132ac565b505050565b60006110088361187e565b8210611049576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104090615236565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600f5481565b6110b0612be3565b73ffffffffffffffffffffffffffffffffffffffff166110ce611a67565b73ffffffffffffffffffffffffffffffffffffffff1614611124576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111b90615436565b60405180910390fd5b80600f8190555050565b611136612be3565b73ffffffffffffffffffffffffffffffffffffffff16611154611a67565b73ffffffffffffffffffffffffffffffffffffffff16146111aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a190615436565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600c600080815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561124d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124490615476565b60405180910390fd5b600c600080815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050506112be57600080fd5b565b601481600b81106112d057600080fd5b0160009150905080546112e2906158a7565b80601f016020809104026020016040519081016040528092919081815260200182805461130e906158a7565b801561135b5780601f106113305761010080835404028352916020019161135b565b820191906000526020600020905b81548152906001019060200180831161133e57829003601f168201915b505050505081565b61137e83838360405180602001604052806000815250611bbf565b505050565b6002600a5414156113c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c0906154f6565b60405180910390fd5b6002600a819055506113da33612d4a565b611419576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611410906152b6565b60405180910390fd5b61142282612b77565b611461576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145890615216565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661148183611799565b73ffffffffffffffffffffffffffffffffffffffff16146114d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ce906154d6565b60405180910390fd5b6000600d600084815260200190815260200160002060000180546114fa906158a7565b80601f0160208091040260200160405190810160405280929190818152602001828054611526906158a7565b80156115735780601f1061154857610100808354040283529160200191611573565b820191906000526020600020905b81548152906001019060200180831161155657829003601f168201915b5050505050905061158383613513565b7f48ba15eea85faaa3fa5c758883f854773b919349eabeba9638f20fd613fea4f583826040516115b4929190615531565b60405180910390a1506001600a819055505050565b60006115d3610e86565b8210611614576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160b906154b6565b60405180910390fd5b6008828154811061164e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6047816007811061167057600080fd5b016000915090508054611682906158a7565b80601f01602080910402602001604051908101604052809291908181526020018280546116ae906158a7565b80156116fb5780601f106116d0576101008083540402835291602001916116fb565b820191906000526020600020905b8154815290600101906020018083116116de57829003601f168201915b505050505081565b61170b612be3565b73ffffffffffffffffffffffffffffffffffffffff16611729611a67565b73ffffffffffffffffffffffffffffffffffffffff161461177f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177690615436565b60405180910390fd5b8060119080519060200190611795929190614471565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611842576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611839906153d6565b60405180910390fd5b80915050919050565b600c6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e6906153b6565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61193e612be3565b73ffffffffffffffffffffffffffffffffffffffff1661195c611a67565b73ffffffffffffffffffffffffffffffffffffffff16146119b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a990615436565b60405180910390fd5b6119bc6000613630565b565b604281600581106119ce57600080fd5b0160009150905080546119e0906158a7565b80601f0160208091040260200160405190810160405280929190818152602001828054611a0c906158a7565b8015611a595780601f10611a2e57610100808354040283529160200191611a59565b820191906000526020600020905b815481529060010190602001808311611a3c57829003601f168201915b505050505081565b60105481565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611a99612be3565b73ffffffffffffffffffffffffffffffffffffffff16611ab7611a67565b73ffffffffffffffffffffffffffffffffffffffff1614611b0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0490615436565b60405180910390fd5b8060108190555050565b606060018054611b26906158a7565b80601f0160208091040260200160405190810160405280929190818152602001828054611b52906158a7565b8015611b9f5780601f10611b7457610100808354040283529160200191611b9f565b820191906000526020600020905b815481529060010190602001808311611b8257829003601f168201915b5050505050905090565b611bbb611bb4612be3565b83836136f6565b5050565b611bd0611bca612be3565b836131ce565b611c0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0690615496565b60405180910390fd5b611c1b84848484613863565b50505050565b611c29612be3565b73ffffffffffffffffffffffffffffffffffffffff16611c47611a67565b73ffffffffffffffffffffffffffffffffffffffff1614611c9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9490615436565b60405180910390fd5b80600c600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001821415611d3a5780600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5050565b6060611d4982612b77565b611d5257600080fd5b6011611d5d836138bf565b6012604051602001611d7193929190614fe9565b6040516020818303038152906040529050919050565b6000600d6000838152602001908152602001600020600301549050919050565b611daf612be3565b73ffffffffffffffffffffffffffffffffffffffff16611dcd611a67565b73ffffffffffffffffffffffffffffffffffffffff1614611e23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1a90615436565b60405180910390fd5b8060129080519060200190611e39929190614471565b5050565b60118054611e4a906158a7565b80601f0160208091040260200160405190810160405280929190818152602001828054611e76906158a7565b8015611ec35780601f10611e9857610100808354040283529160200191611ec3565b820191906000526020600020905b815481529060010190602001808311611ea657829003601f168201915b505050505081565b60128054611ed8906158a7565b80601f0160208091040260200160405190810160405280929190818152602001828054611f04906158a7565b8015611f515780601f10611f2657610100808354040283529160200191611f51565b820191906000526020600020905b815481529060010190602001808311611f3457829003601f168201915b505050505081565b611f616144f7565b611f696144f7565b6000611f8a600d600086815260200190815260200160002060020154612ca4565b9050600d60008581526020019081526020016000206000018054611fad906158a7565b80601f0160208091040260200160405190810160405280929190818152602001828054611fd9906158a7565b80156120265780601f10611ffb57610100808354040283529160200191612026565b820191906000526020600020905b81548152906001019060200180831161200957829003601f168201915b505050505082600060068110612065577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506042816004600581106120a9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151600581106120e5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b0180546120f1906158a7565b80601f016020809104026020016040519081016040528092919081815260200182805461211d906158a7565b801561216a5780601f1061213f5761010080835404028352916020019161216a565b820191906000526020600020905b81548152906001019060200180831161214d57829003601f168201915b5050505050826001600681106121a9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506014816003600581106121ed577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151600b8110612229577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b018054612235906158a7565b80601f0160208091040260200160405190810160405280929190818152602001828054612261906158a7565b80156122ae5780601f10612283576101008083540402835291602001916122ae565b820191906000526020600020905b81548152906001019060200180831161229157829003601f168201915b5050505050826002600681106122ed577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250601f81600260058110612331577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201516006811061236d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b018054612379906158a7565b80601f01602080910402602001604051908101604052809291908181526020018280546123a5906158a7565b80156123f25780601f106123c7576101008083540402835291602001916123f2565b820191906000526020600020905b8154815290600101906020018083116123d557829003601f168201915b505050505082600360068110612431577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250602581600160058110612475577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151601d81106124b1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b0180546124bd906158a7565b80601f01602080910402602001604051908101604052809291908181526020018280546124e9906158a7565b80156125365780601f1061250b57610100808354040283529160200191612536565b820191906000526020600020905b81548152906001019060200180831161251957829003601f168201915b505050505082600460068110612575577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506025816000600581106125b9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151601d81106125f5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b018054612601906158a7565b80601f016020809104026020016040519081016040528092919081815260200182805461262d906158a7565b801561267a5780601f1061264f5761010080835404028352916020019161267a565b820191906000526020600020905b81548152906001019060200180831161265d57829003601f168201915b5050505050826005600681106126b9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052508192505050919050565b601f81600681106126db57600080fd5b0160009150905080546126ed906158a7565b80601f0160208091040260200160405190810160405280929190818152602001828054612719906158a7565b80156127665780601f1061273b57610100808354040283529160200191612766565b820191906000526020600020905b81548152906001019060200180831161274957829003601f168201915b505050505081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b602581601d811061281257600080fd5b016000915090508054612824906158a7565b80601f0160208091040260200160405190810160405280929190818152602001828054612850906158a7565b801561289d5780601f106128725761010080835404028352916020019161289d565b820191906000526020600020905b81548152906001019060200180831161288057829003601f168201915b505050505081565b6128ad612be3565b73ffffffffffffffffffffffffffffffffffffffff166128cb611a67565b73ffffffffffffffffffffffffffffffffffffffff1614612921576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291890615436565b60405180910390fd5b6000600c600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61297f612be3565b73ffffffffffffffffffffffffffffffffffffffff1661299d611a67565b73ffffffffffffffffffffffffffffffffffffffff16146129f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129ea90615436565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612a63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a5a90615276565b60405180910390fd5b612a6c81613630565b50565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612b6057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612b705750612b6f82613a6c565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612c5e83611799565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b612cac61444f565b612cb461444f565b600083905060005b6000821115612d3f576000606483612cd49190615987565b9050606483612ce39190615701565b92508060ff16848360058110612d22577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181815250508180612d369061590a565b92505050612cbc565b829350505050919050565b600080600090505b600a8160ff161015612de5578273ffffffffffffffffffffffffffffffffffffffff16600c60008360ff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612dd2576001915050612deb565b8080612ddd90615953565b915050612d52565b50600090505b919050565b80600d60008481526020019081526020016000206000019080519060200190612e1a929190614471565b50600a600d600084815260200190815260200160002060010160006101000a81548160ff021916908360ff1602179055506000612e58826005613ad6565b90506000612e67836006613ad6565b90506000612e7684601d613ad6565b90506000612e8585601d613ad6565b90505b8060ff168260ff161415612ea857612ea185601d613ad6565b9050612e88565b6000612eb5866005613ad6565b90506000612ed58660ff168660ff168460ff168760ff168760ff16613b49565b90506000881415612ee757621ed75490505b80600d60008a815260200190815260200160002060020181905550612f0a61444f565b60005b60058160ff161015612f8857612f24896003613ad6565b6001612f3091906156ab565b828260ff1660058110612f6c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181815250508080612f8090615953565b915050612f0d565b5042600d60008b815260200190815260200160002060030181905550600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c098dcd6828b6040518363ffffffff1660e01b81526004016130019291906150be565b600060405180830381600087803b15801561301b57600080fd5b505af115801561302f573d6000803e3d6000fd5b505050507f04d41c2ba68b8b16da20a8750c313ecdf18269153a7dcab90f8dc5a9e8aff9838860428960ff1660058110613092577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b0160148960ff16600b81106130d0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b01601f8760ff166006811061310e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b0160258a60ff16601d811061314c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b0160258a60ff16601d811061318a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b0160405161319d9695949392919061513f565b60405180910390a1505050505050505050565b6131ca828260405180602001604052806000815250613bca565b5050565b60006131d982612b77565b613218576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161320f90615336565b60405180910390fd5b600061322383611799565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061329257508373ffffffffffffffffffffffffffffffffffffffff1661327a84610be4565b73ffffffffffffffffffffffffffffffffffffffff16145b806132a357506132a2818561276e565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166132cc82611799565b73ffffffffffffffffffffffffffffffffffffffff1614613322576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161331990615296565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613392576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613389906152f6565b60405180910390fd5b61339d838383613c25565b6133a8600082612beb565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546133f8919061578c565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461344f91906156ab565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461350e838383613d39565b505050565b600061351e82611799565b905061352c81600084613c25565b613537600083612beb565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613587919061578c565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461362c81600084613d39565b5050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613765576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161375c90615316565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161385691906150e7565b60405180910390a3505050565b61386e8484846132ac565b61387a84848484613d3e565b6138b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138b090615256565b60405180910390fd5b50505050565b60606000821415613907576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613a67565b600082905060005b600082146139395780806139229061590a565b915050600a826139329190615701565b915061390f565b60008167ffffffffffffffff81111561397b577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156139ad5781602001600182028036833780820191505090505b5090505b60008514613a60576001826139c6919061578c565b9150600a856139d59190615987565b60306139e191906156ab565b60f81b818381518110613a1d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85613a599190615701565b94506139b1565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600060136000815480929190613aeb9061590a565b91905055506103e860135410613b045760006013819055505b81834243601354604051602001613b1e9493929190614f9f565b6040516020818303038152906040528051906020012060001c613b419190615987565b905092915050565b6000806305f5e10087613b5c9190615732565b9050620f424086613b6d9190615732565b81613b7891906156ab565b905061271085613b889190615732565b81613b9391906156ab565b9050606484613ba29190615732565b81613bad91906156ab565b90508281613bbb91906156ab565b90508091505095945050505050565b613bd48383613ed5565b613be16000848484613d3e565b613c20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c1790615256565b60405180910390fd5b505050565b613c308383836140af565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613c7357613c6e816140b4565b613cb2565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613cb157613cb083826140fd565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613cf557613cf08161426a565b613d34565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613d3357613d3282826143ad565b5b5b505050565b505050565b6000613d5f8473ffffffffffffffffffffffffffffffffffffffff1661442c565b15613ec8578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613d88612be3565b8786866040518563ffffffff1660e01b8152600401613daa9493929190615035565b602060405180830381600087803b158015613dc457600080fd5b505af1925050508015613df557506040513d601f19601f82011682018060405250810190613df29190614844565b60015b613e78573d8060008114613e25576040519150601f19603f3d011682016040523d82523d6000602084013e613e2a565b606091505b50600081511415613e70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e6790615256565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613ecd565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613f45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f3c906153f6565b60405180910390fd5b613f4e81612b77565b15613f8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f85906152d6565b60405180910390fd5b613f9a60008383613c25565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613fea91906156ab565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46140ab60008383613d39565b5050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161410a8461187e565b614114919061578c565b90506000600760008481526020019081526020016000205490508181146141f9576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061427e919061578c565b90506000600960008481526020019081526020016000205490506000600883815481106142d4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050806008838154811061431c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480614391577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006143b88361187e565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6040518060a00160405280600590602082028036833780820191505090505090565b82805461447d906158a7565b90600052602060002090601f01602090048101928261449f57600085556144e6565b82601f106144b857805160ff19168380011785556144e6565b828001600101855582156144e6579182015b828111156144e55782518255916020019190600101906144ca565b5b5090506144f3919061451e565b5090565b6040518060c001604052806006905b60608152602001906001900390816145065790505090565b5b8082111561453757600081600090555060010161451f565b5090565b600061454e61454984615586565b615561565b90508281526020810184848401111561456657600080fd5b614571848285615865565b509392505050565b600061458c614587846155b7565b615561565b9050828152602081018484840111156145a457600080fd5b6145af848285615865565b509392505050565b6000813590506145c68161604b565b92915050565b6000813590506145db81616062565b92915050565b6000813590506145f081616079565b92915050565b60008151905061460581616079565b92915050565b600082601f83011261461c57600080fd5b813561462c84826020860161453b565b91505092915050565b600082601f83011261464657600080fd5b8135614656848260208601614579565b91505092915050565b60008135905061466e81616090565b92915050565b60006020828403121561468657600080fd5b6000614694848285016145b7565b91505092915050565b600080604083850312156146b057600080fd5b60006146be858286016145b7565b92505060206146cf858286016145b7565b9150509250929050565b6000806000606084860312156146ee57600080fd5b60006146fc868287016145b7565b935050602061470d868287016145b7565b925050604061471e8682870161465f565b9150509250925092565b6000806000806080858703121561473e57600080fd5b600061474c878288016145b7565b945050602061475d878288016145b7565b935050604061476e8782880161465f565b925050606085013567ffffffffffffffff81111561478b57600080fd5b6147978782880161460b565b91505092959194509250565b600080604083850312156147b657600080fd5b60006147c4858286016145b7565b92505060206147d5858286016145cc565b9150509250929050565b600080604083850312156147f257600080fd5b6000614800858286016145b7565b92505060206148118582860161465f565b9150509250929050565b60006020828403121561482d57600080fd5b600061483b848285016145e1565b91505092915050565b60006020828403121561485657600080fd5b6000614864848285016145f6565b91505092915050565b60006020828403121561487f57600080fd5b600082013567ffffffffffffffff81111561489957600080fd5b6148a584828501614635565b91505092915050565b6000602082840312156148c057600080fd5b60006148ce8482850161465f565b91505092915050565b600080604083850312156148ea57600080fd5b60006148f88582860161465f565b9250506020614909858286016145b7565b9150509250929050565b600061491f8383614a71565b905092915050565b60006149338383614f5b565b60208301905092915050565b614948816157c0565b82525050565b600061495982615611565b6149638185615657565b935083602082028501614975856155e8565b8060005b858110156149b157848403895281516149928582614913565b945061499d8361563d565b925060208a01995050600181019050614979565b50829750879550505050505092915050565b6149cc8161561c565b6149d68184615662565b92506149e1826155f2565b8060005b83811015614a125781516149f98782614927565b9650614a048361564a565b9250506001810190506149e5565b505050505050565b614a23816157d2565b82525050565b6000614a3482615627565b614a3e818561566d565b9350614a4e818560208601615874565b614a5781615a74565b840191505092915050565b614a6b81615841565b82525050565b6000614a7c82615632565b614a86818561567e565b9350614a96818560208601615874565b614a9f81615a74565b840191505092915050565b6000614ab582615632565b614abf818561568f565b9350614acf818560208601615874565b614ad881615a74565b840191505092915050565b6000614aee82615632565b614af881856156a0565b9350614b08818560208601615874565b80840191505092915050565b60008154614b21816158a7565b614b2b818661568f565b94506001821660008114614b465760018114614b5857614b8b565b60ff1983168652602086019350614b8b565b614b61856155fc565b60005b83811015614b8357815481890152600182019150602081019050614b64565b808801955050505b50505092915050565b60008154614ba1816158a7565b614bab81866156a0565b94506001821660008114614bc65760018114614bd757614c0a565b60ff19831686528186019350614c0a565b614be0856155fc565b60005b83811015614c0257815481890152600182019150602081019050614be3565b838801955050505b50505092915050565b6000614c2060198361568f565b9150614c2b82615a85565b602082019050919050565b6000614c43602b8361568f565b9150614c4e82615aae565b604082019050919050565b6000614c6660328361568f565b9150614c7182615afd565b604082019050919050565b6000614c8960268361568f565b9150614c9482615b4c565b604082019050919050565b6000614cac60258361568f565b9150614cb782615b9b565b604082019050919050565b6000614ccf600c8361568f565b9150614cda82615bea565b602082019050919050565b6000614cf2601c8361568f565b9150614cfd82615c13565b602082019050919050565b6000614d1560248361568f565b9150614d2082615c3c565b604082019050919050565b6000614d3860198361568f565b9150614d4382615c8b565b602082019050919050565b6000614d5b602c8361568f565b9150614d6682615cb4565b604082019050919050565b6000614d7e60188361568f565b9150614d8982615d03565b602082019050919050565b6000614da1601f8361568f565b9150614dac82615d2c565b602082019050919050565b6000614dc460388361568f565b9150614dcf82615d55565b604082019050919050565b6000614de7602a8361568f565b9150614df282615da4565b604082019050919050565b6000614e0a60298361568f565b9150614e1582615df3565b604082019050919050565b6000614e2d60208361568f565b9150614e3882615e42565b602082019050919050565b6000614e50602c8361568f565b9150614e5b82615e6b565b604082019050919050565b6000614e7360208361568f565b9150614e7e82615eba565b602082019050919050565b6000614e9660218361568f565b9150614ea182615ee3565b604082019050919050565b6000614eb960138361568f565b9150614ec482615f32565b602082019050919050565b6000614edc60318361568f565b9150614ee782615f5b565b604082019050919050565b6000614eff602c8361568f565b9150614f0a82615faa565b604082019050919050565b6000614f2260148361568f565b9150614f2d82615ff9565b602082019050919050565b6000614f45601f8361568f565b9150614f5082616022565b602082019050919050565b614f648161582a565b82525050565b614f738161582a565b82525050565b614f8a614f858261582a565b61597d565b82525050565b614f9981615834565b82525050565b6000614fab8287614ae3565b9150614fb78286614f79565b602082019150614fc78285614f79565b602082019150614fd78284614f79565b60208201915081905095945050505050565b6000614ff58286614b94565b91506150018285614ae3565b915061500d8284614b94565b9150819050949350505050565b600060208201905061502f600083018461493f565b92915050565b600060808201905061504a600083018761493f565b615057602083018661493f565b6150646040830185614f6a565b81810360608301526150768184614a29565b905095945050505050565b6000602082019050818103600083015261509b818461494e565b905092915050565b600060a0820190506150b860008301846149c3565b92915050565b600060c0820190506150d360008301856149c3565b6150e060a0830184614f6a565b9392505050565b60006020820190506150fc6000830184614a1a565b92915050565b60006020820190506151176000830184614a62565b92915050565b600060208201905081810360008301526151378184614aaa565b905092915050565b600060c08201905081810360008301526151598189614aaa565b9050818103602083015261516d8188614b14565b905081810360408301526151818187614b14565b905081810360608301526151958186614b14565b905081810360808301526151a98185614b14565b905081810360a08301526151bd8184614b14565b9050979650505050505050565b600060808201905081810360008301526151e48187614aaa565b90506151f36020830186614f90565b6152006040830185614f6a565b61520d6060830184614f6a565b95945050505050565b6000602082019050818103600083015261522f81614c13565b9050919050565b6000602082019050818103600083015261524f81614c36565b9050919050565b6000602082019050818103600083015261526f81614c59565b9050919050565b6000602082019050818103600083015261528f81614c7c565b9050919050565b600060208201905081810360008301526152af81614c9f565b9050919050565b600060208201905081810360008301526152cf81614cc2565b9050919050565b600060208201905081810360008301526152ef81614ce5565b9050919050565b6000602082019050818103600083015261530f81614d08565b9050919050565b6000602082019050818103600083015261532f81614d2b565b9050919050565b6000602082019050818103600083015261534f81614d4e565b9050919050565b6000602082019050818103600083015261536f81614d71565b9050919050565b6000602082019050818103600083015261538f81614d94565b9050919050565b600060208201905081810360008301526153af81614db7565b9050919050565b600060208201905081810360008301526153cf81614dda565b9050919050565b600060208201905081810360008301526153ef81614dfd565b9050919050565b6000602082019050818103600083015261540f81614e20565b9050919050565b6000602082019050818103600083015261542f81614e43565b9050919050565b6000602082019050818103600083015261544f81614e66565b9050919050565b6000602082019050818103600083015261546f81614e89565b9050919050565b6000602082019050818103600083015261548f81614eac565b9050919050565b600060208201905081810360008301526154af81614ecf565b9050919050565b600060208201905081810360008301526154cf81614ef2565b9050919050565b600060208201905081810360008301526154ef81614f15565b9050919050565b6000602082019050818103600083015261550f81614f38565b9050919050565b600060208201905061552b6000830184614f6a565b92915050565b60006040820190506155466000830185614f6a565b81810360208301526155588184614aaa565b90509392505050565b600061556b61557c565b905061557782826158d9565b919050565b6000604051905090565b600067ffffffffffffffff8211156155a1576155a0615a45565b5b6155aa82615a74565b9050602081019050919050565b600067ffffffffffffffff8211156155d2576155d1615a45565b5b6155db82615a74565b9050602081019050919050565b6000819050919050565b6000819050919050565b60008190508160005260206000209050919050565b600060069050919050565b600060059050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600081905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006156b68261582a565b91506156c18361582a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156156f6576156f56159b8565b5b828201905092915050565b600061570c8261582a565b91506157178361582a565b925082615727576157266159e7565b5b828204905092915050565b600061573d8261582a565b91506157488361582a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615781576157806159b8565b5b828202905092915050565b60006157978261582a565b91506157a28361582a565b9250828210156157b5576157b46159b8565b5b828203905092915050565b60006157cb8261580a565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b600061584c82615853565b9050919050565b600061585e8261580a565b9050919050565b82818337600083830152505050565b60005b83811015615892578082015181840152602081019050615877565b838111156158a1576000848401525b50505050565b600060028204905060018216806158bf57607f821691505b602082108114156158d3576158d2615a16565b5b50919050565b6158e282615a74565b810181811067ffffffffffffffff8211171561590157615900615a45565b5b80604052505050565b60006159158261582a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615948576159476159b8565b5b600182019050919050565b600061595e82615834565b915060ff821415615972576159716159b8565b5b600182019050919050565b6000819050919050565b60006159928261582a565b915061599d8361582a565b9250826159ad576159ac6159e7565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f546869732057697a61726420646f65736e277420657869737400000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f20617574686f726974790000000000000000000000000000000000000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f7567682045544820746f2073756d6d6f6e0000000000000000600082015250565b7f416c6c2057697a617264732048617665204265656e2053756d6d6f6e65642100600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f5661756c742069732073657420746f2030783000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f596f75277265206e6f7420746865206f776e6572000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b616054816157c0565b811461605f57600080fd5b50565b61606b816157d2565b811461607657600080fd5b50565b616082816157de565b811461608d57600080fd5b50565b6160998161582a565b81146160a457600080fd5b5056fea26469706673582212200958b2c8d879380af0655a3815b8df1da9ba9b44708d86e2f0f5d789cf42c0e264736f6c63430008040033
Deployed Bytecode
0x6080604052600436106102675760003560e01c806370a0823111610144578063c8d2524c116100b6578063e5b0a9931161007a578063e5b0a993146109a4578063e985e9c5146109e1578063eaaf77e614610a1e578063eae1e5d414610a5b578063f2fde38b14610a84578063f8da13c614610aad57610267565b8063c8d2524c146108ab578063da3ef23f146108e8578063dbddb26a14610911578063df3fdf001461093c578063e29afe3e1461096757610267565b806391b7f5ed1161010857806391b7f5ed1461079f57806395d89b41146107c8578063a22cb465146107f3578063b88d4fde1461081c578063c09172c114610845578063c87b56dd1461086e57610267565b806370a08231146106b8578063715018a6146106f55780637bbc469e1461070c5780638d859f3e146107495780638da5cb5b1461077457610267565b806332cb6b0c116101dd57806349f5ede0116101a157806349f5ede0146105725780634f6ccce71461059b57806350d15fbe146105d857806355f804b3146106155780636352211e1461063e578063649171ee1461067b57610267565b806332cb6b0c146104a15780633b4c4b25146104cc5780633ccfd60b146104f55780633e144c541461050c57806342842e0e1461054957610267565b8063133ae3971161022f578063133ae3971461037a57806314e0af82146103b757806318160ddd146103f45780631e8a94841461041f57806323b872dd1461043b5780632f745c591461046457610267565b806301ffc9a71461026c57806306fdde03146102a9578063081812fc146102d4578063095ea7b3146103115780630fa866171461033a575b600080fd5b34801561027857600080fd5b50610293600480360381019061028e919061481b565b610ad8565b6040516102a091906150e7565b60405180910390f35b3480156102b557600080fd5b506102be610b52565b6040516102cb919061511d565b60405180910390f35b3480156102e057600080fd5b506102fb60048036038101906102f691906148ae565b610be4565b604051610308919061501a565b60405180910390f35b34801561031d57600080fd5b50610338600480360381019061033391906147df565b610c69565b005b34801561034657600080fd5b50610361600480360381019061035c91906148ae565b610d81565b60405161037194939291906151ca565b60405180910390f35b34801561038657600080fd5b506103a1600480360381019061039c91906148ae565b610e46565b6040516103ae91906150a3565b60405180910390f35b3480156103c357600080fd5b506103de60048036038101906103d99190614674565b610e74565b6040516103eb91906150e7565b60405180910390f35b34801561040057600080fd5b50610409610e86565b6040516104169190615516565b60405180910390f35b6104396004803603810190610434919061486d565b610e93565b005b34801561044757600080fd5b50610462600480360381019061045d91906146d9565b610f9d565b005b34801561047057600080fd5b5061048b600480360381019061048691906147df565b610ffd565b6040516104989190615516565b60405180910390f35b3480156104ad57600080fd5b506104b66110a2565b6040516104c39190615516565b60405180910390f35b3480156104d857600080fd5b506104f360048036038101906104ee91906148ae565b6110a8565b005b34801561050157600080fd5b5061050a61112e565b005b34801561051857600080fd5b50610533600480360381019061052e91906148ae565b6112c0565b604051610540919061511d565b60405180910390f35b34801561055557600080fd5b50610570600480360381019061056b91906146d9565b611363565b005b34801561057e57600080fd5b50610599600480360381019061059491906148d7565b611383565b005b3480156105a757600080fd5b506105c260048036038101906105bd91906148ae565b6115c9565b6040516105cf9190615516565b60405180910390f35b3480156105e457600080fd5b506105ff60048036038101906105fa91906148ae565b611660565b60405161060c919061511d565b60405180910390f35b34801561062157600080fd5b5061063c6004803603810190610637919061486d565b611703565b005b34801561064a57600080fd5b50610665600480360381019061066091906148ae565b611799565b604051610672919061501a565b60405180910390f35b34801561068757600080fd5b506106a2600480360381019061069d91906148ae565b61184b565b6040516106af919061501a565b60405180910390f35b3480156106c457600080fd5b506106df60048036038101906106da9190614674565b61187e565b6040516106ec9190615516565b60405180910390f35b34801561070157600080fd5b5061070a611936565b005b34801561071857600080fd5b50610733600480360381019061072e91906148ae565b6119be565b604051610740919061511d565b60405180910390f35b34801561075557600080fd5b5061075e611a61565b60405161076b9190615516565b60405180910390f35b34801561078057600080fd5b50610789611a67565b604051610796919061501a565b60405180910390f35b3480156107ab57600080fd5b506107c660048036038101906107c191906148ae565b611a91565b005b3480156107d457600080fd5b506107dd611b17565b6040516107ea919061511d565b60405180910390f35b3480156107ff57600080fd5b5061081a600480360381019061081591906147a3565b611ba9565b005b34801561082857600080fd5b50610843600480360381019061083e9190614728565b611bbf565b005b34801561085157600080fd5b5061086c600480360381019061086791906148d7565b611c21565b005b34801561087a57600080fd5b50610895600480360381019061089091906148ae565b611d3e565b6040516108a2919061511d565b60405180910390f35b3480156108b757600080fd5b506108d260048036038101906108cd91906148ae565b611d87565b6040516108df9190615516565b60405180910390f35b3480156108f457600080fd5b5061090f600480360381019061090a919061486d565b611da7565b005b34801561091d57600080fd5b50610926611e3d565b604051610933919061511d565b60405180910390f35b34801561094857600080fd5b50610951611ecb565b60405161095e919061511d565b60405180910390f35b34801561097357600080fd5b5061098e600480360381019061098991906148ae565b611f59565b60405161099b9190615081565b60405180910390f35b3480156109b057600080fd5b506109cb60048036038101906109c691906148ae565b6126cb565b6040516109d8919061511d565b60405180910390f35b3480156109ed57600080fd5b50610a086004803603810190610a03919061469d565b61276e565b604051610a1591906150e7565b60405180910390f35b348015610a2a57600080fd5b50610a456004803603810190610a4091906148ae565b612802565b604051610a52919061511d565b60405180910390f35b348015610a6757600080fd5b50610a826004803603810190610a7d91906148ae565b6128a5565b005b348015610a9057600080fd5b50610aab6004803603810190610aa69190614674565b612977565b005b348015610ab957600080fd5b50610ac2612a6f565b604051610acf9190615102565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b4b5750610b4a82612a95565b5b9050919050565b606060008054610b61906158a7565b80601f0160208091040260200160405190810160405280929190818152602001828054610b8d906158a7565b8015610bda5780601f10610baf57610100808354040283529160200191610bda565b820191906000526020600020905b815481529060010190602001808311610bbd57829003601f168201915b5050505050905090565b6000610bef82612b77565b610c2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2590615416565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c7482611799565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ce5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cdc90615456565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d04612be3565b73ffffffffffffffffffffffffffffffffffffffff161480610d335750610d3281610d2d612be3565b61276e565b5b610d72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6990615396565b60405180910390fd5b610d7c8383612beb565b505050565b600d602052806000526040600020600091509050806000018054610da4906158a7565b80601f0160208091040260200160405190810160405280929190818152602001828054610dd0906158a7565b8015610e1d5780601f10610df257610100808354040283529160200191610e1d565b820191906000526020600020905b815481529060010190602001808311610e0057829003601f168201915b5050505050908060010160009054906101000a900460ff16908060020154908060030154905084565b610e4e61444f565b610e6d600d600084815260200190815260200160002060020154612ca4565b9050919050565b6000610e7f82612d4a565b9050919050565b6000600880549050905090565b6002600a541415610ed9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed0906154f6565b60405180910390fd5b6002600a81905550601054341015610f26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1d90615356565b60405180910390fd5b600f54610f31610e86565b10610f71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6890615376565b60405180910390fd5b6000610f7b610e86565b9050610f878183612df0565b610f9133826131b0565b506001600a8190555050565b610fae610fa8612be3565b826131ce565b610fed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe490615496565b60405180910390fd5b610ff88383836132ac565b505050565b60006110088361187e565b8210611049576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104090615236565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600f5481565b6110b0612be3565b73ffffffffffffffffffffffffffffffffffffffff166110ce611a67565b73ffffffffffffffffffffffffffffffffffffffff1614611124576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111b90615436565b60405180910390fd5b80600f8190555050565b611136612be3565b73ffffffffffffffffffffffffffffffffffffffff16611154611a67565b73ffffffffffffffffffffffffffffffffffffffff16146111aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a190615436565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600c600080815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561124d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124490615476565b60405180910390fd5b600c600080815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050506112be57600080fd5b565b601481600b81106112d057600080fd5b0160009150905080546112e2906158a7565b80601f016020809104026020016040519081016040528092919081815260200182805461130e906158a7565b801561135b5780601f106113305761010080835404028352916020019161135b565b820191906000526020600020905b81548152906001019060200180831161133e57829003601f168201915b505050505081565b61137e83838360405180602001604052806000815250611bbf565b505050565b6002600a5414156113c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c0906154f6565b60405180910390fd5b6002600a819055506113da33612d4a565b611419576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611410906152b6565b60405180910390fd5b61142282612b77565b611461576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145890615216565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661148183611799565b73ffffffffffffffffffffffffffffffffffffffff16146114d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ce906154d6565b60405180910390fd5b6000600d600084815260200190815260200160002060000180546114fa906158a7565b80601f0160208091040260200160405190810160405280929190818152602001828054611526906158a7565b80156115735780601f1061154857610100808354040283529160200191611573565b820191906000526020600020905b81548152906001019060200180831161155657829003601f168201915b5050505050905061158383613513565b7f48ba15eea85faaa3fa5c758883f854773b919349eabeba9638f20fd613fea4f583826040516115b4929190615531565b60405180910390a1506001600a819055505050565b60006115d3610e86565b8210611614576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160b906154b6565b60405180910390fd5b6008828154811061164e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6047816007811061167057600080fd5b016000915090508054611682906158a7565b80601f01602080910402602001604051908101604052809291908181526020018280546116ae906158a7565b80156116fb5780601f106116d0576101008083540402835291602001916116fb565b820191906000526020600020905b8154815290600101906020018083116116de57829003601f168201915b505050505081565b61170b612be3565b73ffffffffffffffffffffffffffffffffffffffff16611729611a67565b73ffffffffffffffffffffffffffffffffffffffff161461177f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161177690615436565b60405180910390fd5b8060119080519060200190611795929190614471565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611842576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611839906153d6565b60405180910390fd5b80915050919050565b600c6020528060005260406000206000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e6906153b6565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61193e612be3565b73ffffffffffffffffffffffffffffffffffffffff1661195c611a67565b73ffffffffffffffffffffffffffffffffffffffff16146119b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a990615436565b60405180910390fd5b6119bc6000613630565b565b604281600581106119ce57600080fd5b0160009150905080546119e0906158a7565b80601f0160208091040260200160405190810160405280929190818152602001828054611a0c906158a7565b8015611a595780601f10611a2e57610100808354040283529160200191611a59565b820191906000526020600020905b815481529060010190602001808311611a3c57829003601f168201915b505050505081565b60105481565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611a99612be3565b73ffffffffffffffffffffffffffffffffffffffff16611ab7611a67565b73ffffffffffffffffffffffffffffffffffffffff1614611b0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0490615436565b60405180910390fd5b8060108190555050565b606060018054611b26906158a7565b80601f0160208091040260200160405190810160405280929190818152602001828054611b52906158a7565b8015611b9f5780601f10611b7457610100808354040283529160200191611b9f565b820191906000526020600020905b815481529060010190602001808311611b8257829003601f168201915b5050505050905090565b611bbb611bb4612be3565b83836136f6565b5050565b611bd0611bca612be3565b836131ce565b611c0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0690615496565b60405180910390fd5b611c1b84848484613863565b50505050565b611c29612be3565b73ffffffffffffffffffffffffffffffffffffffff16611c47611a67565b73ffffffffffffffffffffffffffffffffffffffff1614611c9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9490615436565b60405180910390fd5b80600c600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001821415611d3a5780600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5050565b6060611d4982612b77565b611d5257600080fd5b6011611d5d836138bf565b6012604051602001611d7193929190614fe9565b6040516020818303038152906040529050919050565b6000600d6000838152602001908152602001600020600301549050919050565b611daf612be3565b73ffffffffffffffffffffffffffffffffffffffff16611dcd611a67565b73ffffffffffffffffffffffffffffffffffffffff1614611e23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1a90615436565b60405180910390fd5b8060129080519060200190611e39929190614471565b5050565b60118054611e4a906158a7565b80601f0160208091040260200160405190810160405280929190818152602001828054611e76906158a7565b8015611ec35780601f10611e9857610100808354040283529160200191611ec3565b820191906000526020600020905b815481529060010190602001808311611ea657829003601f168201915b505050505081565b60128054611ed8906158a7565b80601f0160208091040260200160405190810160405280929190818152602001828054611f04906158a7565b8015611f515780601f10611f2657610100808354040283529160200191611f51565b820191906000526020600020905b815481529060010190602001808311611f3457829003601f168201915b505050505081565b611f616144f7565b611f696144f7565b6000611f8a600d600086815260200190815260200160002060020154612ca4565b9050600d60008581526020019081526020016000206000018054611fad906158a7565b80601f0160208091040260200160405190810160405280929190818152602001828054611fd9906158a7565b80156120265780601f10611ffb57610100808354040283529160200191612026565b820191906000526020600020905b81548152906001019060200180831161200957829003601f168201915b505050505082600060068110612065577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506042816004600581106120a9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151600581106120e5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b0180546120f1906158a7565b80601f016020809104026020016040519081016040528092919081815260200182805461211d906158a7565b801561216a5780601f1061213f5761010080835404028352916020019161216a565b820191906000526020600020905b81548152906001019060200180831161214d57829003601f168201915b5050505050826001600681106121a9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506014816003600581106121ed577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151600b8110612229577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b018054612235906158a7565b80601f0160208091040260200160405190810160405280929190818152602001828054612261906158a7565b80156122ae5780601f10612283576101008083540402835291602001916122ae565b820191906000526020600020905b81548152906001019060200180831161229157829003601f168201915b5050505050826002600681106122ed577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250601f81600260058110612331577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201516006811061236d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b018054612379906158a7565b80601f01602080910402602001604051908101604052809291908181526020018280546123a5906158a7565b80156123f25780601f106123c7576101008083540402835291602001916123f2565b820191906000526020600020905b8154815290600101906020018083116123d557829003601f168201915b505050505082600360068110612431577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250602581600160058110612475577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151601d81106124b1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b0180546124bd906158a7565b80601f01602080910402602001604051908101604052809291908181526020018280546124e9906158a7565b80156125365780601f1061250b57610100808354040283529160200191612536565b820191906000526020600020905b81548152906001019060200180831161251957829003601f168201915b505050505082600460068110612575577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506025816000600581106125b9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151601d81106125f5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b018054612601906158a7565b80601f016020809104026020016040519081016040528092919081815260200182805461262d906158a7565b801561267a5780601f1061264f5761010080835404028352916020019161267a565b820191906000526020600020905b81548152906001019060200180831161265d57829003601f168201915b5050505050826005600681106126b9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052508192505050919050565b601f81600681106126db57600080fd5b0160009150905080546126ed906158a7565b80601f0160208091040260200160405190810160405280929190818152602001828054612719906158a7565b80156127665780601f1061273b57610100808354040283529160200191612766565b820191906000526020600020905b81548152906001019060200180831161274957829003601f168201915b505050505081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b602581601d811061281257600080fd5b016000915090508054612824906158a7565b80601f0160208091040260200160405190810160405280929190818152602001828054612850906158a7565b801561289d5780601f106128725761010080835404028352916020019161289d565b820191906000526020600020905b81548152906001019060200180831161288057829003601f168201915b505050505081565b6128ad612be3565b73ffffffffffffffffffffffffffffffffffffffff166128cb611a67565b73ffffffffffffffffffffffffffffffffffffffff1614612921576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161291890615436565b60405180910390fd5b6000600c600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61297f612be3565b73ffffffffffffffffffffffffffffffffffffffff1661299d611a67565b73ffffffffffffffffffffffffffffffffffffffff16146129f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129ea90615436565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612a63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a5a90615276565b60405180910390fd5b612a6c81613630565b50565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612b6057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612b705750612b6f82613a6c565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612c5e83611799565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b612cac61444f565b612cb461444f565b600083905060005b6000821115612d3f576000606483612cd49190615987565b9050606483612ce39190615701565b92508060ff16848360058110612d22577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181815250508180612d369061590a565b92505050612cbc565b829350505050919050565b600080600090505b600a8160ff161015612de5578273ffffffffffffffffffffffffffffffffffffffff16600c60008360ff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612dd2576001915050612deb565b8080612ddd90615953565b915050612d52565b50600090505b919050565b80600d60008481526020019081526020016000206000019080519060200190612e1a929190614471565b50600a600d600084815260200190815260200160002060010160006101000a81548160ff021916908360ff1602179055506000612e58826005613ad6565b90506000612e67836006613ad6565b90506000612e7684601d613ad6565b90506000612e8585601d613ad6565b90505b8060ff168260ff161415612ea857612ea185601d613ad6565b9050612e88565b6000612eb5866005613ad6565b90506000612ed58660ff168660ff168460ff168760ff168760ff16613b49565b90506000881415612ee757621ed75490505b80600d60008a815260200190815260200160002060020181905550612f0a61444f565b60005b60058160ff161015612f8857612f24896003613ad6565b6001612f3091906156ab565b828260ff1660058110612f6c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181815250508080612f8090615953565b915050612f0d565b5042600d60008b815260200190815260200160002060030181905550600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c098dcd6828b6040518363ffffffff1660e01b81526004016130019291906150be565b600060405180830381600087803b15801561301b57600080fd5b505af115801561302f573d6000803e3d6000fd5b505050507f04d41c2ba68b8b16da20a8750c313ecdf18269153a7dcab90f8dc5a9e8aff9838860428960ff1660058110613092577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b0160148960ff16600b81106130d0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b01601f8760ff166006811061310e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b0160258a60ff16601d811061314c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b0160258a60ff16601d811061318a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b0160405161319d9695949392919061513f565b60405180910390a1505050505050505050565b6131ca828260405180602001604052806000815250613bca565b5050565b60006131d982612b77565b613218576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161320f90615336565b60405180910390fd5b600061322383611799565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061329257508373ffffffffffffffffffffffffffffffffffffffff1661327a84610be4565b73ffffffffffffffffffffffffffffffffffffffff16145b806132a357506132a2818561276e565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166132cc82611799565b73ffffffffffffffffffffffffffffffffffffffff1614613322576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161331990615296565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613392576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613389906152f6565b60405180910390fd5b61339d838383613c25565b6133a8600082612beb565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546133f8919061578c565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461344f91906156ab565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461350e838383613d39565b505050565b600061351e82611799565b905061352c81600084613c25565b613537600083612beb565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613587919061578c565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461362c81600084613d39565b5050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613765576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161375c90615316565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161385691906150e7565b60405180910390a3505050565b61386e8484846132ac565b61387a84848484613d3e565b6138b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138b090615256565b60405180910390fd5b50505050565b60606000821415613907576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613a67565b600082905060005b600082146139395780806139229061590a565b915050600a826139329190615701565b915061390f565b60008167ffffffffffffffff81111561397b577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156139ad5781602001600182028036833780820191505090505b5090505b60008514613a60576001826139c6919061578c565b9150600a856139d59190615987565b60306139e191906156ab565b60f81b818381518110613a1d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85613a599190615701565b94506139b1565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600060136000815480929190613aeb9061590a565b91905055506103e860135410613b045760006013819055505b81834243601354604051602001613b1e9493929190614f9f565b6040516020818303038152906040528051906020012060001c613b419190615987565b905092915050565b6000806305f5e10087613b5c9190615732565b9050620f424086613b6d9190615732565b81613b7891906156ab565b905061271085613b889190615732565b81613b9391906156ab565b9050606484613ba29190615732565b81613bad91906156ab565b90508281613bbb91906156ab565b90508091505095945050505050565b613bd48383613ed5565b613be16000848484613d3e565b613c20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c1790615256565b60405180910390fd5b505050565b613c308383836140af565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613c7357613c6e816140b4565b613cb2565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613cb157613cb083826140fd565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613cf557613cf08161426a565b613d34565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614613d3357613d3282826143ad565b5b5b505050565b505050565b6000613d5f8473ffffffffffffffffffffffffffffffffffffffff1661442c565b15613ec8578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613d88612be3565b8786866040518563ffffffff1660e01b8152600401613daa9493929190615035565b602060405180830381600087803b158015613dc457600080fd5b505af1925050508015613df557506040513d601f19601f82011682018060405250810190613df29190614844565b60015b613e78573d8060008114613e25576040519150601f19603f3d011682016040523d82523d6000602084013e613e2a565b606091505b50600081511415613e70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e6790615256565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613ecd565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613f45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f3c906153f6565b60405180910390fd5b613f4e81612b77565b15613f8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f85906152d6565b60405180910390fd5b613f9a60008383613c25565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254613fea91906156ab565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46140ab60008383613d39565b5050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161410a8461187e565b614114919061578c565b90506000600760008481526020019081526020016000205490508181146141f9576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061427e919061578c565b90506000600960008481526020019081526020016000205490506000600883815481106142d4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050806008838154811061431c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480614391577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006143b88361187e565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6040518060a00160405280600590602082028036833780820191505090505090565b82805461447d906158a7565b90600052602060002090601f01602090048101928261449f57600085556144e6565b82601f106144b857805160ff19168380011785556144e6565b828001600101855582156144e6579182015b828111156144e55782518255916020019190600101906144ca565b5b5090506144f3919061451e565b5090565b6040518060c001604052806006905b60608152602001906001900390816145065790505090565b5b8082111561453757600081600090555060010161451f565b5090565b600061454e61454984615586565b615561565b90508281526020810184848401111561456657600080fd5b614571848285615865565b509392505050565b600061458c614587846155b7565b615561565b9050828152602081018484840111156145a457600080fd5b6145af848285615865565b509392505050565b6000813590506145c68161604b565b92915050565b6000813590506145db81616062565b92915050565b6000813590506145f081616079565b92915050565b60008151905061460581616079565b92915050565b600082601f83011261461c57600080fd5b813561462c84826020860161453b565b91505092915050565b600082601f83011261464657600080fd5b8135614656848260208601614579565b91505092915050565b60008135905061466e81616090565b92915050565b60006020828403121561468657600080fd5b6000614694848285016145b7565b91505092915050565b600080604083850312156146b057600080fd5b60006146be858286016145b7565b92505060206146cf858286016145b7565b9150509250929050565b6000806000606084860312156146ee57600080fd5b60006146fc868287016145b7565b935050602061470d868287016145b7565b925050604061471e8682870161465f565b9150509250925092565b6000806000806080858703121561473e57600080fd5b600061474c878288016145b7565b945050602061475d878288016145b7565b935050604061476e8782880161465f565b925050606085013567ffffffffffffffff81111561478b57600080fd5b6147978782880161460b565b91505092959194509250565b600080604083850312156147b657600080fd5b60006147c4858286016145b7565b92505060206147d5858286016145cc565b9150509250929050565b600080604083850312156147f257600080fd5b6000614800858286016145b7565b92505060206148118582860161465f565b9150509250929050565b60006020828403121561482d57600080fd5b600061483b848285016145e1565b91505092915050565b60006020828403121561485657600080fd5b6000614864848285016145f6565b91505092915050565b60006020828403121561487f57600080fd5b600082013567ffffffffffffffff81111561489957600080fd5b6148a584828501614635565b91505092915050565b6000602082840312156148c057600080fd5b60006148ce8482850161465f565b91505092915050565b600080604083850312156148ea57600080fd5b60006148f88582860161465f565b9250506020614909858286016145b7565b9150509250929050565b600061491f8383614a71565b905092915050565b60006149338383614f5b565b60208301905092915050565b614948816157c0565b82525050565b600061495982615611565b6149638185615657565b935083602082028501614975856155e8565b8060005b858110156149b157848403895281516149928582614913565b945061499d8361563d565b925060208a01995050600181019050614979565b50829750879550505050505092915050565b6149cc8161561c565b6149d68184615662565b92506149e1826155f2565b8060005b83811015614a125781516149f98782614927565b9650614a048361564a565b9250506001810190506149e5565b505050505050565b614a23816157d2565b82525050565b6000614a3482615627565b614a3e818561566d565b9350614a4e818560208601615874565b614a5781615a74565b840191505092915050565b614a6b81615841565b82525050565b6000614a7c82615632565b614a86818561567e565b9350614a96818560208601615874565b614a9f81615a74565b840191505092915050565b6000614ab582615632565b614abf818561568f565b9350614acf818560208601615874565b614ad881615a74565b840191505092915050565b6000614aee82615632565b614af881856156a0565b9350614b08818560208601615874565b80840191505092915050565b60008154614b21816158a7565b614b2b818661568f565b94506001821660008114614b465760018114614b5857614b8b565b60ff1983168652602086019350614b8b565b614b61856155fc565b60005b83811015614b8357815481890152600182019150602081019050614b64565b808801955050505b50505092915050565b60008154614ba1816158a7565b614bab81866156a0565b94506001821660008114614bc65760018114614bd757614c0a565b60ff19831686528186019350614c0a565b614be0856155fc565b60005b83811015614c0257815481890152600182019150602081019050614be3565b838801955050505b50505092915050565b6000614c2060198361568f565b9150614c2b82615a85565b602082019050919050565b6000614c43602b8361568f565b9150614c4e82615aae565b604082019050919050565b6000614c6660328361568f565b9150614c7182615afd565b604082019050919050565b6000614c8960268361568f565b9150614c9482615b4c565b604082019050919050565b6000614cac60258361568f565b9150614cb782615b9b565b604082019050919050565b6000614ccf600c8361568f565b9150614cda82615bea565b602082019050919050565b6000614cf2601c8361568f565b9150614cfd82615c13565b602082019050919050565b6000614d1560248361568f565b9150614d2082615c3c565b604082019050919050565b6000614d3860198361568f565b9150614d4382615c8b565b602082019050919050565b6000614d5b602c8361568f565b9150614d6682615cb4565b604082019050919050565b6000614d7e60188361568f565b9150614d8982615d03565b602082019050919050565b6000614da1601f8361568f565b9150614dac82615d2c565b602082019050919050565b6000614dc460388361568f565b9150614dcf82615d55565b604082019050919050565b6000614de7602a8361568f565b9150614df282615da4565b604082019050919050565b6000614e0a60298361568f565b9150614e1582615df3565b604082019050919050565b6000614e2d60208361568f565b9150614e3882615e42565b602082019050919050565b6000614e50602c8361568f565b9150614e5b82615e6b565b604082019050919050565b6000614e7360208361568f565b9150614e7e82615eba565b602082019050919050565b6000614e9660218361568f565b9150614ea182615ee3565b604082019050919050565b6000614eb960138361568f565b9150614ec482615f32565b602082019050919050565b6000614edc60318361568f565b9150614ee782615f5b565b604082019050919050565b6000614eff602c8361568f565b9150614f0a82615faa565b604082019050919050565b6000614f2260148361568f565b9150614f2d82615ff9565b602082019050919050565b6000614f45601f8361568f565b9150614f5082616022565b602082019050919050565b614f648161582a565b82525050565b614f738161582a565b82525050565b614f8a614f858261582a565b61597d565b82525050565b614f9981615834565b82525050565b6000614fab8287614ae3565b9150614fb78286614f79565b602082019150614fc78285614f79565b602082019150614fd78284614f79565b60208201915081905095945050505050565b6000614ff58286614b94565b91506150018285614ae3565b915061500d8284614b94565b9150819050949350505050565b600060208201905061502f600083018461493f565b92915050565b600060808201905061504a600083018761493f565b615057602083018661493f565b6150646040830185614f6a565b81810360608301526150768184614a29565b905095945050505050565b6000602082019050818103600083015261509b818461494e565b905092915050565b600060a0820190506150b860008301846149c3565b92915050565b600060c0820190506150d360008301856149c3565b6150e060a0830184614f6a565b9392505050565b60006020820190506150fc6000830184614a1a565b92915050565b60006020820190506151176000830184614a62565b92915050565b600060208201905081810360008301526151378184614aaa565b905092915050565b600060c08201905081810360008301526151598189614aaa565b9050818103602083015261516d8188614b14565b905081810360408301526151818187614b14565b905081810360608301526151958186614b14565b905081810360808301526151a98185614b14565b905081810360a08301526151bd8184614b14565b9050979650505050505050565b600060808201905081810360008301526151e48187614aaa565b90506151f36020830186614f90565b6152006040830185614f6a565b61520d6060830184614f6a565b95945050505050565b6000602082019050818103600083015261522f81614c13565b9050919050565b6000602082019050818103600083015261524f81614c36565b9050919050565b6000602082019050818103600083015261526f81614c59565b9050919050565b6000602082019050818103600083015261528f81614c7c565b9050919050565b600060208201905081810360008301526152af81614c9f565b9050919050565b600060208201905081810360008301526152cf81614cc2565b9050919050565b600060208201905081810360008301526152ef81614ce5565b9050919050565b6000602082019050818103600083015261530f81614d08565b9050919050565b6000602082019050818103600083015261532f81614d2b565b9050919050565b6000602082019050818103600083015261534f81614d4e565b9050919050565b6000602082019050818103600083015261536f81614d71565b9050919050565b6000602082019050818103600083015261538f81614d94565b9050919050565b600060208201905081810360008301526153af81614db7565b9050919050565b600060208201905081810360008301526153cf81614dda565b9050919050565b600060208201905081810360008301526153ef81614dfd565b9050919050565b6000602082019050818103600083015261540f81614e20565b9050919050565b6000602082019050818103600083015261542f81614e43565b9050919050565b6000602082019050818103600083015261544f81614e66565b9050919050565b6000602082019050818103600083015261546f81614e89565b9050919050565b6000602082019050818103600083015261548f81614eac565b9050919050565b600060208201905081810360008301526154af81614ecf565b9050919050565b600060208201905081810360008301526154cf81614ef2565b9050919050565b600060208201905081810360008301526154ef81614f15565b9050919050565b6000602082019050818103600083015261550f81614f38565b9050919050565b600060208201905061552b6000830184614f6a565b92915050565b60006040820190506155466000830185614f6a565b81810360208301526155588184614aaa565b90509392505050565b600061556b61557c565b905061557782826158d9565b919050565b6000604051905090565b600067ffffffffffffffff8211156155a1576155a0615a45565b5b6155aa82615a74565b9050602081019050919050565b600067ffffffffffffffff8211156155d2576155d1615a45565b5b6155db82615a74565b9050602081019050919050565b6000819050919050565b6000819050919050565b60008190508160005260206000209050919050565b600060069050919050565b600060059050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600081905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006156b68261582a565b91506156c18361582a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156156f6576156f56159b8565b5b828201905092915050565b600061570c8261582a565b91506157178361582a565b925082615727576157266159e7565b5b828204905092915050565b600061573d8261582a565b91506157488361582a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615615781576157806159b8565b5b828202905092915050565b60006157978261582a565b91506157a28361582a565b9250828210156157b5576157b46159b8565b5b828203905092915050565b60006157cb8261580a565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b600061584c82615853565b9050919050565b600061585e8261580a565b9050919050565b82818337600083830152505050565b60005b83811015615892578082015181840152602081019050615877565b838111156158a1576000848401525b50505050565b600060028204905060018216806158bf57607f821691505b602082108114156158d3576158d2615a16565b5b50919050565b6158e282615a74565b810181811067ffffffffffffffff8211171561590157615900615a45565b5b80604052505050565b60006159158261582a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615948576159476159b8565b5b600182019050919050565b600061595e82615834565b915060ff821415615972576159716159b8565b5b600182019050919050565b6000819050919050565b60006159928261582a565b915061599d8361582a565b9250826159ad576159ac6159e7565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f546869732057697a61726420646f65736e277420657869737400000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f20617574686f726974790000000000000000000000000000000000000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f7567682045544820746f2073756d6d6f6e0000000000000000600082015250565b7f416c6c2057697a617264732048617665204265656e2053756d6d6f6e65642100600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f5661756c742069732073657420746f2030783000000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f596f75277265206e6f7420746865206f776e6572000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b616054816157c0565b811461605f57600080fd5b50565b61606b816157d2565b811461607657600080fd5b50565b616082816157de565b811461608d57600080fd5b50565b6160998161582a565b81146160a457600080fd5b5056fea26469706673582212200958b2c8d879380af0655a3815b8df1da9ba9b44708d86e2f0f5d789cf42c0e264736f6c63430008040033