ERC-721
Overview
Max Total Supply
292 DCN
Holders
206
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 DCNLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Decentralists
Compiler Version
v0.8.10+commit.fc410830
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT /** THE DECENTRALISTS ·.::::iiiiiiiiiiiiiiiiiii::::.· .:::iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii::.· .::iiiiiiiii:::::..··· ··..:::::iiiiiiiiii::· .::iiiiiii:::.· .:::iiiiiii::. .:iiiiiii:: .:iiiiiii:. ·:iiiiii::· ::iiiiii:· :iiiiii:· ·.::::::::::::::.. :iiiiii:· :iiiii:: .:::iiiii:::::::::::iiiii:::. .:iiiii:· :iiiii:· ·::iii:::· .:::iii::· :iiiii:· ·iiiii:· ::iii:· .::ii:: ·:iiiii: :iiiii: ·:ii::· ·:iii:· .iiiii: :iiiii· ·:ii:. ·:ii: ·:iiii: :iiii: ·:ii: ·.:::::::i:::::::.· ·:ii: :iiiii :iiii: ·iii: .::iiiiiiiiiiiiiiiiii:::· .ii: .iiii: ·iiiii ·iii .:ii:::::::iiiiiiiiiiiiiii::. ·:i:· :iiii: :iiii: ·:i:· .:iii: .:iiiiiiiiiiiiiiiii:. iii iiiii :iiii: :ii :iiiii:· ::iiiiiiiiiiiiiiiiiii: ·ii: :iiii: iiiii· ·ii: ::iiiiii::::::iiiiiiiiiiiiiiiiiiiiii. :ii. ·iiiii iiiii :ii :iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii:· .ii: :iiii iiiii :ii .iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii. ii: :iiii iiiii :ii .iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii:. ii: :iiii iiiii :ii :iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii:· .ii: :iiii iiiii· ·ii: ::iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii:. :ii. ·iiiii :iiii: :ii .:iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii: ·ii: :iiii: :iiii: ·:i:· ·::iiiiiiiiiiiiiiiiiiiiiiiiiiii:· ii: iiiii ·iiiii iii· ·::iiiiiiiiiiiiiiiiiiiiiii::. .ii:· :iiii: :iiii: iii: ·:::iiiiiiiiiiiiiiiii:::· :ii: .iiii: :iiii: :ii:· .::::::::::::::.. .:ii: :iiii: :iiiii· :iii: .:ii: ·:iiii: :iiiii: :iii:· .:iii:· .iiiii: ·iiiii:· .:iii:.· ::iii:: ·:iiiii: :iiiii:· .:iiii::.· ·:::iiii:. :iiiii:· :iiiii:: ·:::iiiiiii:::::::iiiiiii:::· .:iiiii:· :iiiiii:· ..:::::::::::..· :iiiiii:· ·:iiiiii::· ::iiiiii:· .:iiiiiii:: .:iiiiiii:. .::iiiiiii:::.· .:::iiiiiii::. .::iiiiiiiii:::::..··· ··..:::::iiiiiiiiii::· .:::iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii::.· ·.::::iiiiiiiiiiiiiiiiiii::::.· A Decentralist is represented by a set of eight traits: 0 - Base [0] Human Male Black [8] Vampire Male [10] Metahuman Male [12] Ape Male [1] Human Female Black [9] Vampire Female [11] Metahuman Female [2] Human Male Dark [3] Human Female Dark [4] Human Male Pale [5] Human Female Pale [6] Human Male White [7] Human Female White 1 - Necklace [0] None [2] Golden [1] Diamond [3] Silver 2 - Facial Male [0] None [10] Long Gray [20] Sideburns Blonde [1] Chivo Black [11] Long Red [21] Sideburns Brown [2] Chivo Blonde [12] Long White [22] Sideburns Gray [3] Chivo Brown [13] Regular Black [23] Sideburns Red [4] Chivo Gray [14] Regular Blonde [24] Sideburns White [5] Chivo Red [15] Regular Brown [6] Chivo White [16] Regular Gray [7] Long Black [17] Regular Red [8] Long Blonde [18] Regular White [9] Long Brown [19] Sideburns Black 2 - Facial Female [0] None 3 - Earring [0] None [2] Diamond [4] Silver [1] Cross [3] Golden 4 - Head Male [0] None [10] CapFront Red [20] Punky Brown [30] Short White [1] Afro [11] Hat Black [21] Punky Gray [31] Trapper [2] CapUp Green [12] Long Black [22] Punky Purple [32] Wool Blue [3] CapUp Red [13] Long Blonde [23] Punky Red [33] Wool Green [4] Kangaroo Black [14] Long Brown [24] Punky White [34] Wool Red [5] CapBack Blue [15] Long Gray [25] Short Black [6] CapBack Orange [16] Long Red [26] Short Blonde [7] Conspiracist [17] Long White [27] Short Brown [8] Cop [18] Punky Black [28] Short Gray [9] CapFront Purple [19] Punky Blonde [29] Short Red 4 - Head Female [0] None [10] CapFront Red [20] Punky Brown [30] Short White [40] Trapper [1] Afro [11] Hat Black [21] Punky Gray [31] Straight Black [41] Wool Blue [2] CapUp Green [12] Long Black [22] Punky Purple [32] Straight Blonde [42] Wool Green [3] CapUp Red [13] Long Blonde [23] Punky Red [33] Straight Brown [43] Wool Red [4] Kangaroo Black [14] Long Brown [24] Punky White [34] Straight Gray [5] CapBack Blue [15] Long Gray [25] Short Black [35] Straight Orange [6] CapBack Orange [16] Long Red [26] Short Blonde [36] Straight Platinum [7] Conspiracist [17] Long White [27] Short Brown [37] Straight Purple [8] Cop [18] Punky Black [28] Short Gray [38] Straight Red [9] CapFront Purple [19] Punky Blonde [29] Short Red [39] Straight White 5 - Glasses [0] None [2] Nerd [4] Pilot [6] VR [1] Beetle [3] Patch [5] Surf 6 - Lipstick Male [0] None 6 - Lipstick Female [0] None [2] Orange [4] Purple [1] Green [3] Pink [5] Red 7 - Smoking [0] None [2] Cigarette [1] Cigar [3] E-Cigarette */ pragma solidity 0.8.10; import {ERC721Enumerable} from '../openzeppelin/ERC721Enumerable.sol'; import {ERC721} from '../openzeppelin/ERC721.sol'; import {IERC20} from '../openzeppelin/IERC20.sol'; import {IERC2981} from '../openzeppelin/IERC2981.sol'; import {IERC165} from '../openzeppelin/IERC165.sol'; import {SafeERC20} from '../openzeppelin/SafeERC20.sol'; import {IDescriptor} from './IDescriptor.sol'; contract Decentralists is IERC2981, ERC721Enumerable { using SafeERC20 for IERC20; // Minting price of each breed uint256 public constant MINT_PRICE_HUMAN = 0 ether; uint256 public constant MINT_PRICE_VAMPIRE = 0.15 ether; uint256 public constant MINT_PRICE_METAHUMAN = 0.05 ether; uint256 public constant MINT_PRICE_APE = 0.25 ether; // Minting price of each breed during presale uint256 private constant MINT_PRICE_PRESALE_VAMPIRE = 0.12 ether; uint256 private constant MINT_PRICE_PRESALE_METAHUMAN = 0.04 ether; uint256 private constant MINT_PRICE_PRESALE_APE = 0.2 ether; // Maximum total supply during presale uint24 private constant MAXIMUM_PRESALE_SUPPLY_VAMPIRE = 31; uint24 private constant MAXIMUM_PRESALE_SUPPLY_METAHUMAN = 21; uint24 private constant MAXIMUM_PRESALE_SUPPLY_APE = 53; // Maximum total supply of the collection uint24 public constant MAXIMUM_TOTAL_SUPPLY = 1000000; uint24 public constant MAXIMUM_TOTAL_SUPPLY_OF_MALE_HUMAN = 495000; uint24 public constant MAXIMUM_TOTAL_SUPPLY_OF_FEMALE_HUMAN = 495000; uint24 public constant MAXIMUM_TOTAL_SUPPLY_OF_MALE_VAMPIRE = 1500; uint24 public constant MAXIMUM_TOTAL_SUPPLY_OF_FEMALE_VAMPIRE = 1500; uint24 public constant MAXIMUM_TOTAL_SUPPLY_OF_MALE_METAHUMAN = 3000; uint24 public constant MAXIMUM_TOTAL_SUPPLY_OF_FEMALE_METAHUMAN = 3000; uint24 public constant MAXIMUM_TOTAL_SUPPLY_OF_APE = 1000; // Trait sizes uint256 private constant TRAIT_BASE_SIZE = 13; uint256 private constant TRAIT_NECKLACE_SIZE = 4; uint256 private constant TRAIT_FACIAL_MALE_SIZE = 25; uint256 private constant TRAIT_FACIAL_FEMALE_SIZE = 1; uint256 private constant TRAIT_EARRING_SIZE = 5; uint256 private constant TRAIT_HEAD_MALE_SIZE = 35; uint256 private constant TRAIT_HEAD_FEMALE_SIZE = 44; uint256 private constant TRAIT_GLASSES_SIZE = 7; uint256 private constant TRAIT_LIPSTICK_MALE_SIZE = 1; uint256 private constant TRAIT_LIPSTICK_FEMALE_SIZE = 6; uint256 private constant TRAIT_SMOKING_SIZE = 4; // Base trait separator for each breed uint256 private constant TRAIT_BASE_HUMAN_SEPARATOR = 8; uint256 private constant TRAIT_BASE_VAMPIRE_SEPARATOR = 10; uint256 private constant TRAIT_BASE_METAHUMAN_SEPARATOR = 12; uint256 private constant TRAIT_BASE_APE_SEPARATOR = 13; // Governance address public governance; address public emergencyAdmin; // Descriptor IDescriptor public descriptor; bool public isDescriptorLocked; // Royalties uint256 public royaltyBps; address public royaltyReceiver; struct Data { // Presale ends after 1 week uint40 presaleStartTime; // Emergency stop of the claiming process bool isStopped; // Decremental counters, from maximum total supply to zero uint24 count; uint24 femaleHumans; uint24 maleHumans; uint24 femaleVampires; uint24 maleVampires; uint24 femaleMetahumans; uint24 maleMetahumans; uint24 apes; } Data private data; // Combination of traits struct Combination { uint8 base; uint8 necklace; uint8 facial; uint8 earring; uint8 head; uint8 glasses; uint8 lipstick; uint8 smoking; } // Combinations: keccak256(combination) => tokenId mapping(bytes32 => uint256) private _combinationToId; // Combinations: tokenId => Combination mapping(uint256 => Combination) private _idToCombination; // Mapping of human minters mapping(address => bool) private _hasMintedHuman; /** * @dev Constructor * @param governance_ address of the governance * @param emergencyAdmin_ address of the emergency admin * @param descriptor_ address of the token descriptor * @param royaltyBps_ value of bps for royalties (e.g. 150 corresponds to 1.50%) * @param royaltyReceiver_ address of the royalties receiver * @param initialMintingRecipients_ array of recipients for the initial minting * @param initialMintingCombinations_ array of combinations for the initial minting */ constructor( address governance_, address emergencyAdmin_, address descriptor_, uint256 royaltyBps_, address royaltyReceiver_, address[] memory initialMintingRecipients_, uint256[8][] memory initialMintingCombinations_ ) ERC721('Decentralists', 'DCN') { governance = governance_; emergencyAdmin = emergencyAdmin_; descriptor = IDescriptor(descriptor_); royaltyBps = royaltyBps_; royaltyReceiver = royaltyReceiver_; // Decremental counters data.count = MAXIMUM_TOTAL_SUPPLY; data.femaleHumans = MAXIMUM_TOTAL_SUPPLY_OF_FEMALE_HUMAN; data.maleHumans = MAXIMUM_TOTAL_SUPPLY_OF_MALE_HUMAN; data.femaleVampires = MAXIMUM_TOTAL_SUPPLY_OF_FEMALE_VAMPIRE; data.maleVampires = MAXIMUM_TOTAL_SUPPLY_OF_MALE_VAMPIRE; data.femaleMetahumans = MAXIMUM_TOTAL_SUPPLY_OF_FEMALE_METAHUMAN; data.maleMetahumans = MAXIMUM_TOTAL_SUPPLY_OF_MALE_METAHUMAN; data.apes = MAXIMUM_TOTAL_SUPPLY_OF_APE; // Initial minting unchecked { uint256 size = initialMintingRecipients_.length; for (uint256 i = 0; i < size; i++) { _claim(initialMintingCombinations_[i], initialMintingRecipients_[i]); } } } /** * @notice Mint a token with given traits (array of 8 values) * @param traits set of traits of the token */ function claim(uint256[8] calldata traits) external payable { require(!data.isStopped, 'CLAIM_STOPPED'); require(!isPresale() && data.presaleStartTime != 0, 'SALE_NOT_ACTIVE'); require(_validateCombination(traits), 'INVALID_COMBINATION'); require(_checkValue(traits[0], false), 'INCORRECT_VALUE'); _claim(traits, msg.sender); } /** * @notice Mint a token with given traits (array of 8 values) during presale * @param traits set of traits of the token */ function presaleClaim(uint256[8] calldata traits) external payable { require(!data.isStopped, 'CLAIM_STOPPED'); require(isPresale() && data.presaleStartTime != 0, 'PRESALE_NOT_ACTIVE'); require(_validateCombination(traits), 'INVALID_COMBINATION'); require(!_humanBase(traits[0]), 'HUMANS_NOT_AVAILABLE'); require(_checkValue(traits[0], true), 'INCORRECT_VALUE'); // Check breed counter during presale if (_vampireBase(traits[0])) { require( totalFemaleVampiresSupply() + totalMaleVampiresSupply() < MAXIMUM_PRESALE_SUPPLY_VAMPIRE, 'NO_CLAIMS_AVAILABLE' ); } else if (_metahumanBase(traits[0])) { require( totalFemaleMetahumansSupply() + totalMaleMetahumansSupply() < MAXIMUM_PRESALE_SUPPLY_METAHUMAN, 'NO_CLAIMS_AVAILABLE' ); } else { require(totalApesSupply() < MAXIMUM_PRESALE_SUPPLY_APE, 'NO_CLAIMS_AVAILABLE'); } _claim(traits, msg.sender); } /** * @notice Returns whether the combination given is available or not * @param traits set of traits of the combination * @return true if the combination is available, false otherwise */ function isCombinationAvailable(uint256[8] calldata traits) external view returns (bool) { require(_validateCombination(traits), 'INVALID_COMBINATION'); bytes32 hashedCombination = keccak256( abi.encodePacked( traits[0], // base traits[1], // necklace traits[2], // facial traits[3], // earring traits[4], // head traits[5], // glasses traits[6], // lipstick traits[7] // smoking ) ); return _combinationToId[hashedCombination] == 0; } /** * @notice Returns whether the combination given is valid or not * @param traits set of traits of the combination to validate * @return true if the combination is valid, false otherwise */ function isCombinationValid(uint256[8] calldata traits) external pure returns (bool) { return _validateCombination(traits); } /** * @notice Returns whether the presale is active or not (1 week duration) * @return true if the presale is active, false otherwise */ function isPresale() public view returns (bool) { return block.timestamp <= data.presaleStartTime + 1 weeks; } /** * @notice Returns whether the claiming process is stopped or not * @return true if the claiming process is stop, false otherwise */ function isEmergencyStopped() external view returns (bool) { return data.isStopped; } /** * @notice Returns the token id of a given set of traits * @param traits set of traits of the token * @return token id */ function getTokenId(uint256[8] calldata traits) external view returns (uint256) { bytes32 hashedCombination = keccak256( abi.encodePacked( traits[0], // base traits[1], // necklace traits[2], // facial traits[3], // earring traits[4], // head traits[5], // glasses traits[6], // lipstick traits[7] // smoking ) ); require(_combinationToId[hashedCombination] != 0, 'NOT_EXISTS'); return _combinationToId[hashedCombination]; } /** * @notice Returns the set of traits given a token id * @param tokenId the id of the token * @return traits array */ function getTraits(uint256 tokenId) external view returns (uint256[8] memory) { require(_exists(tokenId), 'NOT_EXISTS'); return _getTraits(tokenId); } /** * @notice Returns the set of traits given a token id * @param tokenId the id of the token * @return traits array */ function _getTraits(uint256 tokenId) internal view returns (uint256[8] memory traits) { Combination memory c = _idToCombination[tokenId]; traits[0] = c.base; traits[1] = c.necklace; traits[2] = c.facial; traits[3] = c.earring; traits[4] = c.head; traits[5] = c.glasses; traits[6] = c.lipstick; traits[7] = c.smoking; } /** * @notice Returns the Uniform Resource Identifier (URI) for `tokenId` token * @param tokenId token id * @return uri of the given `tokenId` */ function tokenURI(uint256 tokenId) public view override(ERC721) returns (string memory) { require(_exists(tokenId), 'NOT_EXISTS'); return descriptor.tokenURI(_getTraits(tokenId)); } /** * @notice Returns whether the given address of the user has already minted a human or not * @param user address of the user * @return true if `user` has minted a human, false otherwise */ function hasMintedHuman(address user) external view returns (bool) { return _hasMintedHuman[user]; } /** * @notice Returns the total amount of female human tokens * @return total supply of female humans */ function totalFemaleHumansSupply() public view returns (uint256) { return MAXIMUM_TOTAL_SUPPLY_OF_FEMALE_HUMAN - data.femaleHumans; } /** * @notice Returns the total amount of male human tokens * @return total supply of male humans */ function totalMaleHumansSupply() public view returns (uint256) { return MAXIMUM_TOTAL_SUPPLY_OF_MALE_HUMAN - data.maleHumans; } /** * @notice Returns the total amount of female vampire tokens * @return total supply of female vampires */ function totalFemaleVampiresSupply() public view returns (uint256) { return MAXIMUM_TOTAL_SUPPLY_OF_FEMALE_VAMPIRE - data.femaleVampires; } /** * @notice Returns the total amount of male vampire tokens * @return total supply of male vampires */ function totalMaleVampiresSupply() public view returns (uint256) { return MAXIMUM_TOTAL_SUPPLY_OF_MALE_VAMPIRE - data.maleVampires; } /** * @notice Returns the total amount of female metahuman tokens * @return total supply of female metahumans */ function totalFemaleMetahumansSupply() public view returns (uint256) { return MAXIMUM_TOTAL_SUPPLY_OF_FEMALE_METAHUMAN - data.femaleMetahumans; } /** * @notice Returns the total amount of male metahuman tokens * @return total supply of male metahumans */ function totalMaleMetahumansSupply() public view returns (uint256) { return MAXIMUM_TOTAL_SUPPLY_OF_MALE_METAHUMAN - data.maleMetahumans; } /** * @notice Returns the total amount of ape tokens * @return total supply of apes */ function totalApesSupply() public view returns (uint256) { return MAXIMUM_TOTAL_SUPPLY_OF_APE - data.apes; } /** * @notice Returns the starting time of the presale (0 if it did not start yet) * @return starting time of the presale */ function presaleStartTime() external view returns (uint256) { return uint256(data.presaleStartTime); } /** * @notice Returns how much royalty is owed and to whom, based on the sale price * @param tokenId token id of the NFT asset queried for royalty information * @param salePrice sale price of the NFT asset specified by `tokenId` * @return receiver address of the royalty payment * @return amount of the royalty payment for `salePrice` */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view override(IERC2981) returns (address, uint256) { require(_exists(tokenId), 'NOT_EXISTS'); return (royaltyReceiver, (salePrice * royaltyBps) / 10000); } /** * @dev Checks if the contract supports the given interface * @param interfaceId The identifier of the interface * @return True if the interface is supported, false otherwise */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721Enumerable, IERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } /** * @notice Activate the presale * @dev Only callable by governance */ function startPresale() external onlyGovernance { require(data.presaleStartTime == 0, 'PRESALE_ALREADY_STARTED'); data.presaleStartTime = uint40(block.timestamp); emit PresaleStart(); } /** * @notice Pull ETH funds from the contract to the given recipient * @dev Only callable by governance * @param recipient address to transfer the funds to * @param amount amount of funds to transfer */ function pullFunds(address recipient, uint256 amount) external onlyGovernance { (bool success, ) = recipient.call{value: amount}(''); require(success, 'UNABLE_TO_PULL'); emit FundsWithdrawal(recipient, amount); } /** * @notice Pull ERC20 token funds from the contract to the given recipient * @dev Only callable by governance * @param asset address of the ERC20 token to transfer * @param recipient address to transfer the funds to * @param amount amount of funds to transfer */ function pullTokens( address asset, address recipient, uint256 amount ) external onlyGovernance { IERC20(asset).safeTransfer(recipient, amount); } /** * @notice Update the governance address * @dev Only callable by governance * @param newGovernance address of the new governance */ function setGovernance(address newGovernance) external onlyGovernance { address oldGovernance = governance; governance = newGovernance; emit GovernanceUpdate(oldGovernance, newGovernance); } /** * @notice Update the descriptor address * @dev Only callable by governance when descriptor is not locked * @param newDescriptor address of the new descriptor */ function setDescriptor(address newDescriptor) external onlyGovernance whenDescriptorNotLocked { address oldDescriptor = address(descriptor); descriptor = IDescriptor(newDescriptor); emit DescriptorUpdate(oldDescriptor, newDescriptor); } /** * @notice Lock the ability to update the descriptor address * @dev Only callable by governance when descriptor is not locked */ function lockDescriptor() external onlyGovernance whenDescriptorNotLocked { isDescriptorLocked = true; emit DescriptorLock(address(descriptor)); } /** * @notice Update the royalty basis points (e.g. a value of 150 corresponds to 1.50%) * @dev Only callable by governance * @param newRoyaltyBps value of the new royalty bps */ function setRoyaltyBps(uint256 newRoyaltyBps) external onlyGovernance { uint256 oldRoyaltyBps = royaltyBps; royaltyBps = newRoyaltyBps; emit RoyaltyBpsUpdate(oldRoyaltyBps, newRoyaltyBps); } /** * @notice Update the royalty receiver * @dev Only callable by governance * @param newRoyaltyReceiver address of the new royalty receiver */ function setRoyaltyReceiver(address newRoyaltyReceiver) external onlyGovernance { address oldRoyaltyReceiver = royaltyReceiver; royaltyReceiver = newRoyaltyReceiver; emit RoyaltyReceiverUpdate(oldRoyaltyReceiver, newRoyaltyReceiver); } /** * @notice Stops the claiming process of the contract in case of emergency * @dev Only callable by emergency admin * @param isStopped true to stop the claiming process, false otherwise */ function emergencyStop(bool isStopped) external { require(msg.sender == emergencyAdmin, 'ONLY_BY_EMERGENCY_ADMIN'); data.isStopped = isStopped; emit EmergencyStop(isStopped); } /** * @notice Update the emergency admin address * @dev Only callable by emergency admin * @param newEmergencyAdmin address of the new emergency admin */ function setEmergencyAdmin(address newEmergencyAdmin) external { require(msg.sender == emergencyAdmin, 'ONLY_BY_EMERGENCY_ADMIN'); address oldEmergencyAdmin = emergencyAdmin; emergencyAdmin = newEmergencyAdmin; emit EmergencyAdminUpdate(oldEmergencyAdmin, newEmergencyAdmin); } /** * @notice Mint a token to the receiver * @param traits set of traits of the token * @param receiver receiver address */ function _claim(uint256[8] memory traits, address receiver) internal { require(msg.sender == tx.origin, 'ONLY_EOA'); require(data.count > 0, 'NO_CLAIMS_AVAILABLE'); uint256 base = traits[0]; bytes32 hashedCombination = keccak256( abi.encodePacked( base, // base traits[1], // necklace traits[2], // facial traits[3], // earring traits[4], // head traits[5], // glasses traits[6], // lipstick traits[7] // smoking ) ); require(_combinationToId[hashedCombination] == 0, 'ALREADY_EXISTS'); if (_humanBase(base)) { require(!_hasMintedHuman[msg.sender], 'INVALID_HUMAN_MINTER'); _hasMintedHuman[msg.sender] = true; } // TokenId (0 is reserved) uint256 tokenId = MAXIMUM_TOTAL_SUPPLY - data.count + 1; // Update breed counter if (_humanBase(base)) { if (_isMale(base)) { data.maleHumans--; } else { data.femaleHumans--; } } else if (_vampireBase(base)) { if (_isMale(base)) { data.maleVampires--; } else { data.femaleVampires--; } } else if (_metahumanBase(base)) { if (_isMale(base)) { data.maleMetahumans--; } else { data.femaleMetahumans--; } } else { data.apes--; } data.count--; // Traits _combinationToId[hashedCombination] = tokenId; _idToCombination[tokenId] = Combination({ base: uint8(base), necklace: uint8(traits[1]), facial: uint8(traits[2]), earring: uint8(traits[3]), head: uint8(traits[4]), glasses: uint8(traits[5]), lipstick: uint8(traits[6]), smoking: uint8(traits[7]) }); _mint(receiver, tokenId); emit DecentralistMint(tokenId, receiver, traits); } /** * @notice Check the transaction value is correct given a base and whether the presale is active * @param base value of the base trait * @param inPresale true if presale is active, false otherwise * @return true if the transaction value is correct, false otherwise */ function _checkValue(uint256 base, bool inPresale) internal view returns (bool) { if (_humanBase(base)) { return msg.value == MINT_PRICE_HUMAN; } else if (_vampireBase(base)) { return inPresale ? msg.value == MINT_PRICE_PRESALE_VAMPIRE : msg.value == MINT_PRICE_VAMPIRE; } else if (_metahumanBase(base)) { return inPresale ? msg.value == MINT_PRICE_PRESALE_METAHUMAN : msg.value == MINT_PRICE_METAHUMAN; } else if (_apeBase(base)) { return inPresale ? msg.value == MINT_PRICE_PRESALE_APE : msg.value == MINT_PRICE_APE; } else { return false; } } /** * @notice Check whether a set of traits is a valid combination or not * @dev Even numbers of base trait corresponds to male * @param traits set of traits of the token * @return true if it is a valid combination, false otherwise */ function _validateCombination(uint256[8] calldata traits) internal pure returns (bool) { bool isMale = _isMale(traits[0]); if ( isMale && traits[0] < TRAIT_BASE_SIZE && traits[1] < TRAIT_NECKLACE_SIZE && traits[2] < TRAIT_FACIAL_MALE_SIZE && traits[3] < TRAIT_EARRING_SIZE && traits[4] < TRAIT_HEAD_MALE_SIZE && traits[5] < TRAIT_GLASSES_SIZE && traits[6] < TRAIT_LIPSTICK_MALE_SIZE && traits[7] < TRAIT_SMOKING_SIZE ) { return true; } else if ( !isMale && traits[0] < TRAIT_BASE_SIZE && traits[1] < TRAIT_NECKLACE_SIZE && traits[2] < TRAIT_FACIAL_FEMALE_SIZE && traits[3] < TRAIT_EARRING_SIZE && traits[4] < TRAIT_HEAD_FEMALE_SIZE && traits[5] < TRAIT_GLASSES_SIZE && traits[6] < TRAIT_LIPSTICK_FEMALE_SIZE && traits[7] < TRAIT_SMOKING_SIZE ) { return true; } else { return false; } } /** * @notice Returns true if the base trait corresponds to human breed * @param base value of the base trait * @return True if the base corresponds to human breed, false otherwise */ function _humanBase(uint256 base) internal pure returns (bool) { return base < TRAIT_BASE_HUMAN_SEPARATOR; } /** * @notice Returns true if the base trait corresponds to vampire breed * @param base value of the base trait * @return True if the base corresponds to vampire breed, false otherwise */ function _vampireBase(uint256 base) internal pure returns (bool) { return base >= TRAIT_BASE_HUMAN_SEPARATOR && base < TRAIT_BASE_VAMPIRE_SEPARATOR; } /** * @notice Returns true if the base trait corresponds to metahuman breed * @param base value of the base trait * @return True if the base corresponds to metahuman breed, false otherwise */ function _metahumanBase(uint256 base) internal pure returns (bool) { return base >= TRAIT_BASE_VAMPIRE_SEPARATOR && base < TRAIT_BASE_METAHUMAN_SEPARATOR; } /** * @notice Returns true if the base trait corresponds to ape breed * @param base value of the base trait * @return True if the base corresponds to ape breed, false otherwise */ function _apeBase(uint256 base) internal pure returns (bool) { return base >= TRAIT_BASE_METAHUMAN_SEPARATOR && base < TRAIT_BASE_APE_SEPARATOR; } /** * @notice Returns true if the base trait corresponds to male sex * @param base value of the base trait * @return True if the base corresponds to male sex, false otherwise */ function _isMale(uint256 base) internal pure returns (bool) { return base % 2 == 0; } /** * @dev Hook that is called before any transfer of tokens * @param from origin address of the transfer * @param to recipient address of the transfer * @param tokenId id of the token to transfer */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal override(ERC721Enumerable) { super._beforeTokenTransfer(from, to, tokenId); } /** * @dev Functions marked by this modifier can only be called when descriptor is not locked **/ modifier whenDescriptorNotLocked() { require(!isDescriptorLocked, 'DESCRIPTOR_LOCKED'); _; } /** * @dev Functions marked by this modifier can only be called by governance **/ modifier onlyGovernance() { require(msg.sender == governance, 'ONLY_BY_GOVERNANCE'); _; } /** * @dev Emitted when a new token is minted * @param tokenId token id * @param recipient address of the recipient of the token * @param traits set of traits of the token */ event DecentralistMint(uint256 indexed tokenId, address indexed recipient, uint256[8] traits); /** * @dev Emitted when the presale starts */ event PresaleStart(); /** * @dev Emitted when funds are withdraw * @param recipient address of the recipient of the funds * @param amount amount of the funds withdraw */ event FundsWithdrawal(address indexed recipient, uint256 amount); /** * @dev Emitted when the governance address is updated * @param oldGovernance address of the old governance * @param newGovernance address of the new governance */ event GovernanceUpdate(address indexed oldGovernance, address indexed newGovernance); /** * @dev Emitted when the emergency admin stops the claiming process * @param isStopped true if it is stopped, false otherwise */ event EmergencyStop(bool isStopped); /** * @dev Emitted when the emergency admin address is updated * @param oldEmergencyAdmin address of the old emergency admin * @param newEmergencyAdmin address of the new emergency admin */ event EmergencyAdminUpdate(address indexed oldEmergencyAdmin, address indexed newEmergencyAdmin); /** * @dev Emitted when the descriptor address is updated * @param oldDescriptor address of the old descriptor * @param newDescriptor address of the new descriptor */ event DescriptorUpdate(address indexed oldDescriptor, address indexed newDescriptor); /** * @dev Emitted when the descriptor is locked * @param descriptor address of the descriptor */ event DescriptorLock(address indexed descriptor); /** * @dev Emitted when the royalty bps value is updated * @param oldRoyaltyBps old value of the royalty bps * @param newRoyaltyBps new value of the royalty bps */ event RoyaltyBpsUpdate(uint256 oldRoyaltyBps, uint256 newRoyaltyBps); /** * @dev Emitted when the royalty receiver is updated * @param oldRoyaltyReceiver address of the old royalty receiver * @param newRoyaltyReceiver address of the new royalty receiver */ event RoyaltyReceiverUpdate( address indexed oldRoyaltyReceiver, address indexed newRoyaltyReceiver ); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Address.sol) pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [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 (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; import "./IERC20.sol"; import "./Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.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 (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; import "./IERC721.sol"; import "./IERC721Receiver.sol"; import "./IERC721Metadata.sol"; import "./Address.sol"; import "./Context.sol"; import "./Strings.sol"; import "./ERC165.sol"; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _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 v4.4.1 (interfaces/IERC2981.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. * * _Available since v4.5._ */ interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be payed in that same unit of exchange. */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.10; interface IDescriptor { function tokenURI(uint256[8] calldata) external view returns (string memory); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (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 "./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 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 pragma solidity 0.8.10; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.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; } }
{ "optimizer": { "enabled": true, "runs": 2000 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"governance_","type":"address"},{"internalType":"address","name":"emergencyAdmin_","type":"address"},{"internalType":"address","name":"descriptor_","type":"address"},{"internalType":"uint256","name":"royaltyBps_","type":"uint256"},{"internalType":"address","name":"royaltyReceiver_","type":"address"},{"internalType":"address[]","name":"initialMintingRecipients_","type":"address[]"},{"internalType":"uint256[8][]","name":"initialMintingCombinations_","type":"uint256[8][]"}],"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":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256[8]","name":"traits","type":"uint256[8]"}],"name":"DecentralistMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"descriptor","type":"address"}],"name":"DescriptorLock","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldDescriptor","type":"address"},{"indexed":true,"internalType":"address","name":"newDescriptor","type":"address"}],"name":"DescriptorUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldEmergencyAdmin","type":"address"},{"indexed":true,"internalType":"address","name":"newEmergencyAdmin","type":"address"}],"name":"EmergencyAdminUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"isStopped","type":"bool"}],"name":"EmergencyStop","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"FundsWithdrawal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldGovernance","type":"address"},{"indexed":true,"internalType":"address","name":"newGovernance","type":"address"}],"name":"GovernanceUpdate","type":"event"},{"anonymous":false,"inputs":[],"name":"PresaleStart","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldRoyaltyBps","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newRoyaltyBps","type":"uint256"}],"name":"RoyaltyBpsUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldRoyaltyReceiver","type":"address"},{"indexed":true,"internalType":"address","name":"newRoyaltyReceiver","type":"address"}],"name":"RoyaltyReceiverUpdate","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"},{"inputs":[],"name":"MAXIMUM_TOTAL_SUPPLY","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAXIMUM_TOTAL_SUPPLY_OF_APE","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAXIMUM_TOTAL_SUPPLY_OF_FEMALE_HUMAN","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAXIMUM_TOTAL_SUPPLY_OF_FEMALE_METAHUMAN","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAXIMUM_TOTAL_SUPPLY_OF_FEMALE_VAMPIRE","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAXIMUM_TOTAL_SUPPLY_OF_MALE_HUMAN","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAXIMUM_TOTAL_SUPPLY_OF_MALE_METAHUMAN","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAXIMUM_TOTAL_SUPPLY_OF_MALE_VAMPIRE","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_PRICE_APE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_PRICE_HUMAN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_PRICE_METAHUMAN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_PRICE_VAMPIRE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[8]","name":"traits","type":"uint256[8]"}],"name":"claim","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"descriptor","outputs":[{"internalType":"contract IDescriptor","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencyAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"isStopped","type":"bool"}],"name":"emergencyStop","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[8]","name":"traits","type":"uint256[8]"}],"name":"getTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTraits","outputs":[{"internalType":"uint256[8]","name":"","type":"uint256[8]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"hasMintedHuman","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[8]","name":"traits","type":"uint256[8]"}],"name":"isCombinationAvailable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[8]","name":"traits","type":"uint256[8]"}],"name":"isCombinationValid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"isDescriptorLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isEmergencyStopped","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPresale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockDescriptor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"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[8]","name":"traits","type":"uint256[8]"}],"name":"presaleClaim","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"presaleStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"pullFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"asset","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"pullTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"royaltyBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":"address","name":"newDescriptor","type":"address"}],"name":"setDescriptor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newEmergencyAdmin","type":"address"}],"name":"setEmergencyAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newGovernance","type":"address"}],"name":"setGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newRoyaltyBps","type":"uint256"}],"name":"setRoyaltyBps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRoyaltyReceiver","type":"address"}],"name":"setRoyaltyReceiver","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalApesSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFemaleHumansSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFemaleMetahumansSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFemaleVampiresSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMaleHumansSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMaleMetahumansSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMaleVampiresSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604051620052d0380380620052d0833981016040819052620000349162000ec8565b604080518082018252600d81526c446563656e7472616c6973747360981b6020808301918252835180850190945260038452622221a760e91b908401528151919291620000849160009162000ca8565b5080516200009a90600190602084019062000ca8565b5050600a80546001600160a01b03199081166001600160a01b038b811691909117909255600b805482168a8416179055600c80548216898416179055600d879055600e805490911691861691909117905550600f8054600160301b600160f01b0319167c03e8000bb8000bb80005dc0005dc078d98078d980f4240000000000000179055815160005b818110156200017f576200017683828151811062000145576200014562000fed565b602002602001015185838151811062000162576200016262000fed565b60200260200101516200018e60201b60201c565b60010162000123565b5050505050505050506200116b565b333214620001ce5760405162461bcd60e51b81526020600482015260086024820152674f4e4c595f454f4160c01b60448201526064015b60405180910390fd5b600f546601000000000000900462ffffff166200022e5760405162461bcd60e51b815260206004820152601360248201527f4e4f5f434c41494d535f415641494c41424c45000000000000000000000000006044820152606401620001c5565b60008281602002015190506000818460016020020151856002602002015186600360200201518760046020020151886005602002015189600660200201518a60076020020151604051602001620002bd989796959493929190978852602088019690965260408701949094526060860192909252608085015260a084015260c083015260e08201526101000190565b60408051601f1981840301815291815281516020928301206000818152601090935291205490915015620003255760405162461bcd60e51b815260206004820152600e60248201526d414c52454144595f45584953545360901b6044820152606401620001c5565b620003308260081190565b15620003b3573360009081526012602052604090205460ff1615620003985760405162461bcd60e51b815260206004820152601460248201527f494e56414c49445f48554d414e5f4d494e5445520000000000000000000000006044820152606401620001c5565b336000908152601260205260409020805460ff191660011790555b600f54600090620003d7906601000000000000900462ffffff16620f424062001019565b620003e490600162001040565b62ffffff169050620003f68360081190565b156200047b576200040783620007d2565b156200045757600f80546c01000000000000000000000000900462ffffff1690600c62000434836200106a565b91906101000a81548162ffffff021916908362ffffff1602179055505062000572565b600f80546901000000000000000000900462ffffff1690600962000434836200106a565b6200048683620007e8565b15620004d8576200049783620007d2565b15620004bb57600f8054600160901b900462ffffff1690601262000434836200106a565b600f8054600160781b900462ffffff16908062000434836200106a565b620004e38362000802565b156200053657620004f483620007d2565b156200051857600f8054600160c01b900462ffffff1690601862000434836200106a565b600f8054600160a81b900462ffffff1690601562000434836200106a565b600f8054600160d81b900462ffffff1690601b62000554836200106a565b91906101000a81548162ffffff021916908362ffffff160217905550505b600f80546601000000000000900462ffffff1690600662000593836200106a565b825462ffffff91821661010093840a90810292021916179091556000848152601060209081526040918290208590558151928301825260ff87811684528982015116908301529091508101866002602002015160ff1681526020018660036008811062000604576200060462000fed565b602002015160ff1681526020018660046008811062000627576200062762000fed565b602002015160ff168152602001866005600881106200064a576200064a62000fed565b602002015160ff168152602001866006600881106200066d576200066d62000fed565b602002015160ff1681526020018660076008811062000690576200069062000fed565b6020908102919091015160ff9081169092526000848152601182526040908190208451815493860151928601516060870151608088015160a089015160c08a015160e0909a015189166701000000000000000260ff60381b199a8a166601000000000000029a909a1661ffff60301b19918a16650100000000000260ff60281b19938b16640100000000029390931661ffff60201b19948b1663010000000263ff00000019968c1662010000029690961663ffff000019998c166101000261ffff19909b1697909b169690961798909817969096169790971791909117161793909317161791909117905562000787848262000818565b836001600160a01b0316817f885092d8762b8ab8b1c1704d518d67f575dd67b734ba8817d34c885e7e3964c887604051620007c391906200108c565b60405180910390a35050505050565b6000620007e1600283620010c0565b1592915050565b600060088210158015620007fc5750600a82105b92915050565b6000600a8210158015620007fc575050600c1190565b6001600160a01b038216620008705760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401620001c5565b6000818152600260205260409020546001600160a01b031615620008d75760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401620001c5565b620008e5600083836200096e565b6001600160a01b038216600090815260036020526040812080546001929062000910908490620010e3565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b620009868383836200098b60201b620022bd1760201c565b505050565b620009a38383836200098660201b62000f991760201c565b6001600160a01b03831662000a0157620009fb81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b62000a27565b816001600160a01b0316836001600160a01b03161462000a275762000a27838262000a67565b6001600160a01b03821662000a4157620009868162000b14565b826001600160a01b0316826001600160a01b031614620009865762000986828262000bce565b6000600162000a818462000c1f60201b620019d51760201c565b62000a8d9190620010fe565b60008381526007602052604090205490915080821462000ae1576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009062000b2890600190620010fe565b6000838152600960205260408120546008805493945090928490811062000b535762000b5362000fed565b90600052602060002001549050806008838154811062000b775762000b7762000fed565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548062000bb25762000bb262001118565b6001900381819060005260206000200160009055905550505050565b600062000be68362000c1f60201b620019d51760201c565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b60006001600160a01b03821662000c8c5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401620001c5565b506001600160a01b031660009081526003602052604090205490565b82805462000cb6906200112e565b90600052602060002090601f01602090048101928262000cda576000855562000d25565b82601f1062000cf557805160ff191683800117855562000d25565b8280016001018555821562000d25579182015b8281111562000d2557825182559160200191906001019062000d08565b5062000d3392915062000d37565b5090565b5b8082111562000d33576000815560010162000d38565b80516001600160a01b038116811462000d6657600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b60405161010081016001600160401b038111828210171562000da75762000da762000d6b565b60405290565b604051601f8201601f191681016001600160401b038111828210171562000dd85762000dd862000d6b565b604052919050565b60006001600160401b0382111562000dfc5762000dfc62000d6b565b5060051b60200190565b6000601f838184011262000e1957600080fd5b8251602062000e3262000e2c8362000de0565b62000dad565b82815260089290921b8501810191818101908784111562000e5257600080fd5b8287015b8481101562000ebc57888682011262000e6f5760008081fd5b62000e7962000d81565b8061010083018b81111562000e8e5760008081fd5b835b8181101562000ea9578051845292870192870162000e90565b5050845250918301916101000162000e56565b50979650505050505050565b600080600080600080600060e0888a03121562000ee457600080fd5b62000eef8862000d4e565b9650602062000f00818a0162000d4e565b965062000f1060408a0162000d4e565b95506060890151945062000f2760808a0162000d4e565b60a08a01519094506001600160401b038082111562000f4557600080fd5b818b0191508b601f83011262000f5a57600080fd5b815162000f6b62000e2c8262000de0565b81815260059190911b8301840190848101908e83111562000f8b57600080fd5b938501935b8285101562000fb45762000fa48562000d4e565b8252938501939085019062000f90565b60c08e0151909750945050508083111562000fce57600080fd5b505062000fde8a828b0162000e06565b91505092959891949750929550565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600062ffffff8381169083168181101562001038576200103862001003565b039392505050565b600062ffffff80831681851680830382111562001061576200106162001003565b01949350505050565b600062ffffff82168062001082576200108262001003565b6000190192915050565b6101008101818360005b6008811015620010b757815183526020928301929091019060010162001096565b50505092915050565b600082620010de57634e487b7160e01b600052601260045260246000fd5b500690565b60008219821115620010f957620010f962001003565b500190565b60008282101562001113576200111362001003565b500390565b634e487b7160e01b600052603160045260246000fd5b600181811c908216806200114357607f821691505b602082108114156200116557634e487b7160e01b600052602260045260246000fd5b50919050565b614155806200117b6000396000f3fe6080604052600436106103ad5760003560e01c806395364a84116101e7578063c87b56dd1161010d578063dd6f34c3116100a0578063f4b2e3771161006f578063f4b2e37714610a76578063fa4496fa14610a8b578063fc19be1814610aa0578063fddd483714610ac057600080fd5b8063dd6f34c3146109d8578063e1dc0761146109eb578063e985e9c514610a18578063ee6106e314610a6157600080fd5b8063cf8d81bf116100dc578063cf8d81bf146105cf578063d793d8dc1461098e578063dbc5fd71146109ae578063dbd31b9b146109c357600080fd5b8063c87b56dd14610919578063c8c5353e14610939578063c8dc4f711461069f578063c9c05c251461097257600080fd5b8063a8c5b9e211610185578063b88d4fde11610154578063b88d4fde146108a2578063c1b8e4e1146108c2578063c63adb2b146108e3578063c6cdbcbb146108f957600080fd5b8063a8c5b9e2146106b5578063ab033ea91461084b578063ac85dca71461086b578063b0aa593d1461088b57600080fd5b8063a22cb465116101c1578063a22cb465146107de578063a3ebfdbe146107fe578063a51ee4071461081a578063a82524b21461082f57600080fd5b806395364a841461079457806395d89b41146107a95780639fbc8713146107be57600080fd5b806335d2b2ae116102d75780635557ba591161026a5780636352211e116102395780636352211e1461071457806370905dce1461073457806370a08231146107545780638dc251e31461077457600080fd5b80635557ba59146106b55780635573a623146106cc5780635aa6e675146106df578063602ddd8b146106ff57600080fd5b806348ab665b116102a657806348ab665b1461064e5780634a171a14146106695780634f6ccce71461067f578063520be0e81461069f57600080fd5b806335d2b2ae146105cf57806335da3394146105f957806341b5d0de1461061957806342842e0e1461062e57600080fd5b806312389cbe1161034f5780632a55205a1161031e5780632a55205a1461053b5780632e0d9f6b1461057a5780632f745c591461058f578063303e74df146105af57600080fd5b806312389cbe146104b857806318160ddd146104e65780631f72d831146104fb57806323b872dd1461051b57600080fd5b806306fdde031161038b57806306fdde031461041e578063081812fc14610440578063095ea7b3146104785780630ac62e021461049857600080fd5b806301b9a397146103b257806301ffc9a7146103d457806304c98b2b14610409575b600080fd5b3480156103be57600080fd5b506103d26103cd366004613b23565b610ae1565b005b3480156103e057600080fd5b506103f46103ef366004613b54565b610bee565b60405190151581526020015b60405180910390f35b34801561041557600080fd5b506103d2610c32565b34801561042a57600080fd5b50610433610d34565b6040516104009190613bc9565b34801561044c57600080fd5b5061046061045b366004613bdc565b610dc6565b6040516001600160a01b039091168152602001610400565b34801561048457600080fd5b506103d2610493366004613bf5565b610e6c565b3480156104a457600080fd5b506103d26104b3366004613c2d565b610f9e565b3480156104c457600080fd5b506104d86104d3366004613c4a565b611054565b604051908152602001610400565b3480156104f257600080fd5b506008546104d8565b34801561050757600080fd5b506103d2610516366004613bdc565b61112f565b34801561052757600080fd5b506103d2610536366004613c75565b6111c3565b34801561054757600080fd5b5061055b610556366004613cb1565b61124a565b604080516001600160a01b039093168352602083019190915201610400565b34801561058657600080fd5b506104d86112d2565b34801561059b57600080fd5b506104d86105aa366004613bf5565b611306565b3480156105bb57600080fd5b50600c54610460906001600160a01b031681565b3480156105db57600080fd5b506105e56105dc81565b60405162ffffff9091168152602001610400565b34801561060557600080fd5b506103d2610614366004613b23565b6113ae565b34801561062557600080fd5b506103d2611467565b34801561063a57600080fd5b506103d2610649366004613c75565b611577565b34801561065a57600080fd5b506104d866b1a2bc2ec5000081565b34801561067557600080fd5b506105e56103e881565b34801561068b57600080fd5b506104d861069a366004613bdc565b611592565b3480156106ab57600080fd5b506105e5610bb881565b3480156106c157600080fd5b506105e562078d9881565b6103d26106da366004613c4a565b611636565b3480156106eb57600080fd5b50600a54610460906001600160a01b031681565b34801561070b57600080fd5b506104d8611922565b34801561072057600080fd5b5061046061072f366004613bdc565b61194a565b34801561074057600080fd5b50600b54610460906001600160a01b031681565b34801561076057600080fd5b506104d861076f366004613b23565b6119d5565b34801561078057600080fd5b506103d261078f366004613b23565b611a6f565b3480156107a057600080fd5b506103f4611b1d565b3480156107b557600080fd5b50610433611b46565b3480156107ca57600080fd5b50600e54610460906001600160a01b031681565b3480156107ea57600080fd5b506103d26107f9366004613cd3565b611b55565b34801561080a57600080fd5b506104d8670214e8348c4f000081565b34801561082657600080fd5b506104d8611b64565b34801561083b57600080fd5b50600f5464ffffffffff166104d8565b34801561085757600080fd5b506103d2610866366004613b23565b611b97565b34801561087757600080fd5b506103d2610886366004613c75565b611c45565b34801561089757600080fd5b506105e5620f424081565b3480156108ae57600080fd5b506103d26108bd366004613d79565b611ca8565b3480156108ce57600080fd5b50600c546103f490600160a01b900460ff1681565b3480156108ef57600080fd5b506104d8600d5481565b34801561090557600080fd5b506103d2610914366004613bf5565b611d36565b34801561092557600080fd5b50610433610934366004613bdc565b611e70565b34801561094557600080fd5b506103f4610954366004613b23565b6001600160a01b031660009081526012602052604090205460ff1690565b34801561097e57600080fd5b506104d86703782dace9d9000081565b34801561099a57600080fd5b506103f46109a9366004613c4a565b611f3f565b3480156109ba57600080fd5b506104d8611f4a565b3480156109cf57600080fd5b506104d8611f7a565b6103d26109e6366004613c4a565b611fa7565b3480156109f757600080fd5b50610a0b610a06366004613bdc565b612119565b6040516104009190613e24565b348015610a2457600080fd5b506103f4610a33366004613e56565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610a6d57600080fd5b506104d861217b565b348015610a8257600080fd5b506104d86121b1565b348015610a9757600080fd5b506104d8600081565b348015610aac57600080fd5b506103f4610abb366004613c4a565b6121d6565b348015610acc57600080fd5b50600f5465010000000000900460ff166103f4565b600a546001600160a01b03163314610b355760405162461bcd60e51b81526020600482015260126024820152714f4e4c595f42595f474f5645524e414e434560701b60448201526064015b60405180910390fd5b600c54600160a01b900460ff1615610b8f5760405162461bcd60e51b815260206004820152601160248201527f44455343524950544f525f4c4f434b45440000000000000000000000000000006044820152606401610b2c565b600c80546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f0b4633e1a5ef35d9f85b37127e7ab104f9f20c4e73f8ecb3662e56b6d01ff91590600090a35050565b60006001600160e01b031982167f2a55205a000000000000000000000000000000000000000000000000000000001480610c2c5750610c2c82612375565b92915050565b600a546001600160a01b03163314610c815760405162461bcd60e51b81526020600482015260126024820152714f4e4c595f42595f474f5645524e414e434560701b6044820152606401610b2c565b600f5464ffffffffff1615610cd85760405162461bcd60e51b815260206004820152601760248201527f50524553414c455f414c52454144595f535441525445440000000000000000006044820152606401610b2c565b600f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000164264ffffffffff161790556040517fefb7e4f585efb36e860cd765163862d1b8a52d76fa7e574edd08d982b51cd61190600090a1565b606060008054610d4390613e89565b80601f0160208091040260200160405190810160405280929190818152602001828054610d6f90613e89565b8015610dbc5780601f10610d9157610100808354040283529160200191610dbc565b820191906000526020600020905b815481529060010190602001808311610d9f57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610e505760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610b2c565b506000908152600460205260409020546001600160a01b031690565b6000610e778261194a565b9050806001600160a01b0316836001600160a01b03161415610f015760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610b2c565b336001600160a01b0382161480610f1d5750610f1d8133610a33565b610f8f5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610b2c565b610f9983836123b3565b505050565b600b546001600160a01b03163314610ff85760405162461bcd60e51b815260206004820152601760248201527f4f4e4c595f42595f454d455247454e43595f41444d494e0000000000000000006044820152606401610b2c565b600f8054821515650100000000000265ff0000000000199091161790556040517fcbe1b789cda412d9e1c647ed03d0c71e2f71484be36f9ca2b2a346b29edf1b709061104990831515815260200190565b60405180910390a150565b604080518235602082810191909152830135818301529082013560608281019190915282013560808281019190915282013560a08281019190915282013560c08281019190915282013560e08281019190915282013561010082015260009081906101200160408051601f1981840301815291815281516020928301206000818152601090935291205490915061111a5760405162461bcd60e51b815260206004820152600a6024820152694e4f545f45584953545360b01b6044820152606401610b2c565b60009081526010602052604090205492915050565b600a546001600160a01b0316331461117e5760405162461bcd60e51b81526020600482015260126024820152714f4e4c595f42595f474f5645524e414e434560701b6044820152606401610b2c565b600d80549082905560408051828152602081018490527fb7b16e3cfa4362e0f875e9a926d91f5e5573f73e1f6772c8d9b56fa14301f818910160405180910390a15050565b6111cd338261242e565b61123f5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610b2c565b610f99838383612536565b60008281526002602052604081205481906001600160a01b031661129d5760405162461bcd60e51b815260206004820152600a6024820152694e4f545f45584953545360b01b6044820152606401610b2c565b600e54600d546001600160a01b0390911690612710906112bd9086613eea565b6112c79190613f1f565b915091509250929050565b600f546000906112fc906f01000000000000000000000000000000900462ffffff166105dc613f33565b62ffffff16905090565b6000611311836119d5565b82106113855760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e64730000000000000000000000000000000000000000006064820152608401610b2c565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600b546001600160a01b031633146114085760405162461bcd60e51b815260206004820152601760248201527f4f4e4c595f42595f454d455247454e43595f41444d494e0000000000000000006044820152606401610b2c565b600b80546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8a23c111263e77d29475540620a027de6c49a7927c3f36de78795cf71e65931590600090a35050565b600a546001600160a01b031633146114b65760405162461bcd60e51b81526020600482015260126024820152714f4e4c595f42595f474f5645524e414e434560701b6044820152606401610b2c565b600c54600160a01b900460ff16156115105760405162461bcd60e51b815260206004820152601160248201527f44455343524950544f525f4c4f434b45440000000000000000000000000000006044820152606401610b2c565b600c80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff8116600160a01b179091556040516001600160a01b03909116907fdf95f996a76c155818ca91fc8acf07233468b4d64d8a58d031aba0ae77425b9790600090a2565b610f9983838360405180602001604052806000815250611ca8565b600061159d60085490565b82106116115760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e647300000000000000000000000000000000000000006064820152608401610b2c565b6008828154811061162457611624613ebe565b90600052602060002001549050919050565b600f5465010000000000900460ff16156116925760405162461bcd60e51b815260206004820152600d60248201527f434c41494d5f53544f50504544000000000000000000000000000000000000006044820152606401610b2c565b61169a611b1d565b80156116ae5750600f5464ffffffffff1615155b6116fa5760405162461bcd60e51b815260206004820152601260248201527f50524553414c455f4e4f545f41435449564500000000000000000000000000006044820152606401610b2c565b6117038161271b565b61174f5760405162461bcd60e51b815260206004820152601360248201527f494e56414c49445f434f4d42494e4154494f4e000000000000000000000000006044820152606401610b2c565b8035600811156117a15760405162461bcd60e51b815260206004820152601460248201527f48554d414e535f4e4f545f415641494c41424c450000000000000000000000006044820152606401610b2c565b6117ad81356001612852565b6117f95760405162461bcd60e51b815260206004820152600f60248201527f494e434f52524543545f56414c554500000000000000000000000000000000006044820152606401610b2c565b611803813561290f565b1561187657601f611812611f7a565b61181a6112d2565b6118249190613f57565b106118715760405162461bcd60e51b815260206004820152601360248201527f4e4f5f434c41494d535f415641494c41424c45000000000000000000000000006044820152606401610b2c565b6118ee565b6118808135612924565b1561189757601561188f611b64565b61181a611f4a565b60356118a161217b565b106118ee5760405162461bcd60e51b815260206004820152601360248201527f4e4f5f434c41494d535f415641494c41424c45000000000000000000000000006044820152606401610b2c565b6040805161010081810190925261191f91839060089083908390808284376000920191909152503391506129399050565b50565b600f546000906112fc906c01000000000000000000000000900462ffffff1662078d98613f33565b6000818152600260205260408120546001600160a01b031680610c2c5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610b2c565b60006001600160a01b038216611a535760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610b2c565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b03163314611abe5760405162461bcd60e51b81526020600482015260126024820152714f4e4c595f42595f474f5645524e414e434560701b6044820152606401610b2c565b600e80546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907fc8f5d38942aec138f6ab6e1ccff96d5114329d3b33fa8d3fac47724c90590ec190600090a35050565b600f54600090611b379064ffffffffff1662093a80613f6f565b64ffffffffff16421115905090565b606060018054610d4390613e89565b611b60338383613057565b5050565b600f546000906112fc907801000000000000000000000000000000000000000000000000900462ffffff16610bb8613f33565b600a546001600160a01b03163314611be65760405162461bcd60e51b81526020600482015260126024820152714f4e4c595f42595f474f5645524e414e434560701b6044820152606401610b2c565b600a80546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907fdccb90b244d54b3bb9e633ea2b02f93367526ac8a78357788764295d8949ee6490600090a35050565b600a546001600160a01b03163314611c945760405162461bcd60e51b81526020600482015260126024820152714f4e4c595f42595f474f5645524e414e434560701b6044820152606401610b2c565b610f996001600160a01b0384168383613126565b611cb2338361242e565b611d245760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610b2c565b611d30848484846131a6565b50505050565b600a546001600160a01b03163314611d855760405162461bcd60e51b81526020600482015260126024820152714f4e4c595f42595f474f5645524e414e434560701b6044820152606401610b2c565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611dd2576040519150601f19603f3d011682016040523d82523d6000602084013e611dd7565b606091505b5050905080611e285760405162461bcd60e51b815260206004820152600e60248201527f554e41424c455f544f5f50554c4c0000000000000000000000000000000000006044820152606401610b2c565b826001600160a01b03167f99a7b857d177a9f5962228b830aa679ade0f8465fbb4fef3a472a060c6d8f8e883604051611e6391815260200190565b60405180910390a2505050565b6000818152600260205260409020546060906001600160a01b0316611ec45760405162461bcd60e51b815260206004820152600a6024820152694e4f545f45584953545360b01b6044820152606401610b2c565b600c546001600160a01b03166334f4d1a9611ede8461322f565b6040518263ffffffff1660e01b8152600401611efa9190613e24565b600060405180830381865afa158015611f17573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610c2c9190810190613f98565b6000610c2c8261271b565b600f546000906112fc907501000000000000000000000000000000000000000000900462ffffff16610bb8613f33565b600f546000906112fc907201000000000000000000000000000000000000900462ffffff166105dc613f33565b600f5465010000000000900460ff16156120035760405162461bcd60e51b815260206004820152600d60248201527f434c41494d5f53544f50504544000000000000000000000000000000000000006044820152606401610b2c565b61200b611b1d565b1580156120205750600f5464ffffffffff1615155b61206c5760405162461bcd60e51b815260206004820152600f60248201527f53414c455f4e4f545f41435449564500000000000000000000000000000000006044820152606401610b2c565b6120758161271b565b6120c15760405162461bcd60e51b815260206004820152601360248201527f494e56414c49445f434f4d42494e4154494f4e000000000000000000000000006044820152606401610b2c565b6120cd81356000612852565b6118ee5760405162461bcd60e51b815260206004820152600f60248201527f494e434f52524543545f56414c554500000000000000000000000000000000006044820152606401610b2c565b612121613ae8565b6000828152600260205260409020546001600160a01b03166121725760405162461bcd60e51b815260206004820152600a6024820152694e4f545f45584953545360b01b6044820152606401610b2c565b610c2c8261322f565b600f546000906112fc907b01000000000000000000000000000000000000000000000000000000900462ffffff166103e8613f33565b600f546000906112fc906901000000000000000000900462ffffff1662078d98613f33565b60006121e18261271b565b61222d5760405162461bcd60e51b815260206004820152601360248201527f494e56414c49445f434f4d42494e4154494f4e000000000000000000000000006044820152606401610b2c565b604080518335602082810191909152840135818301529083013560608281019190915283013560808281019190915283013560a08281019190915283013560c08281019190915283013560e0828101919091528301356101008201526000906101200160408051601f19818403018152918152815160209283012060009081526010909252902054159392505050565b6001600160a01b0383166123185761231381600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b61233b565b816001600160a01b0316836001600160a01b03161461233b5761233b8382613329565b6001600160a01b03821661235257610f99816133c6565b826001600160a01b0316826001600160a01b031614610f9957610f998282613475565b60006001600160e01b031982167f780e9d63000000000000000000000000000000000000000000000000000000001480610c2c5750610c2c826134b9565b6000818152600460205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03841690811790915581906123f58261194a565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166124b85760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610b2c565b60006124c38361194a565b9050806001600160a01b0316846001600160a01b031614806124fe5750836001600160a01b03166124f384610dc6565b6001600160a01b0316145b8061252e57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166125498261194a565b6001600160a01b0316146125c55760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152608401610b2c565b6001600160a01b0382166126405760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610b2c565b61264b838383613554565b6126566000826123b3565b6001600160a01b038316600090815260036020526040812080546001929061267f90849061400f565b90915550506001600160a01b03821660009081526003602052604081208054600192906126ad908490613f57565b9091555050600081815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600080612728833561355f565b90508080156127385750600d8335105b8015612748575060046020840135105b8015612758575060196040840135105b8015612768575060056060840135105b8015612778575060236080840135105b80156127885750600760a0840135105b80156127985750600160c0840135105b80156127a85750600460e0840135105b156127b65750600192915050565b801580156127c55750600d8335105b80156127d5575060046020840135105b80156127e5575060016040840135105b80156127f5575060056060840135105b80156128055750602c6080840135105b80156128155750600760a0840135105b80156128255750600660c0840135105b80156128355750600460e0840135105b156128435750600192915050565b50600092915050565b50919050565b600061285e8360081190565b1561286b57503415610c2c565b6128748361290f565b156128a1578161288e57670214e8348c4f0000341461289a565b6701aa535d3d0c000034145b9050610c2c565b6128aa83612924565b156128d357816128c35766b1a2bc2ec50000341461289a565b5034668e1bc9bf04000014610c2c565b6128dc83613573565b1561290757816128f6576703782dace9d90000341461289a565b50346702c68af0bb14000014610c2c565b506000610c2c565b600060088210158015610c2c575050600a1190565b6000600a8210158015610c2c575050600c1190565b3332146129885760405162461bcd60e51b815260206004820152600860248201527f4f4e4c595f454f410000000000000000000000000000000000000000000000006044820152606401610b2c565b600f546601000000000000900462ffffff166129e65760405162461bcd60e51b815260206004820152601360248201527f4e4f5f434c41494d535f415641494c41424c45000000000000000000000000006044820152606401610b2c565b60008281602002015190506000818460016020020151856002602002015186600360200201518760046020020151886005602002015189600660200201518a60076020020151604051602001612a74989796959493929190978852602088019690965260408701949094526060860192909252608085015260a084015260c083015260e08201526101000190565b60408051601f1981840301815291815281516020928301206000818152601090935291205490915015612ae95760405162461bcd60e51b815260206004820152600e60248201527f414c52454144595f4558495354530000000000000000000000000000000000006044820152606401610b2c565b612af38260081190565b15612b73573360009081526012602052604090205460ff1615612b585760405162461bcd60e51b815260206004820152601460248201527f494e56414c49445f48554d414e5f4d494e5445520000000000000000000000006044820152606401610b2c565b336000908152601260205260409020805460ff191660011790555b600f54600090612b95906601000000000000900462ffffff16620f4240613f33565b612ba0906001614026565b62ffffff169050612bb18360081190565b15612c2d57612bbf8361355f565b15612c0b57600f80546c01000000000000000000000000900462ffffff1690600c612be983614044565b91906101000a81548162ffffff021916908362ffffff16021790555050612d68565b600f80546901000000000000000000900462ffffff16906009612be983614044565b612c368361290f565b15612c9b57612c448361355f565b15612c7457600f80547201000000000000000000000000000000000000900462ffffff16906012612be983614044565b600f80546f01000000000000000000000000000000900462ffffff169080612be983614044565b612ca483612924565b15612d1657612cb28361355f565b15612ce857600f80547801000000000000000000000000000000000000000000000000900462ffffff16906018612be983614044565b600f80547501000000000000000000000000000000000000000000900462ffffff16906015612be983614044565b600f80547b01000000000000000000000000000000000000000000000000000000900462ffffff1690601b612d4a83614044565b91906101000a81548162ffffff021916908362ffffff160217905550505b600f80546601000000000000900462ffffff16906006612d8783614044565b825462ffffff91821661010093840a90810292021916179091556000848152601060209081526040918290208590558151928301825260ff87811684528982015116908301529091508101866002602002015160ff16815260200186600360088110612df557612df5613ebe565b602002015160ff16815260200186600460088110612e1557612e15613ebe565b602002015160ff16815260200186600560088110612e3557612e35613ebe565b602002015160ff16815260200186600660088110612e5557612e55613ebe565b602002015160ff16815260200186600760088110612e7557612e75613ebe565b6020908102919091015160ff9081169092526000848152601182526040908190208451815493860151928601516060870151608088015160a089015160c08a015160e0909a01518916670100000000000000027fffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffff9a8a166601000000000000029a909a167fffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffff918a16650100000000000265ff000000000019938b1664010000000002939093167fffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffff948b166301000000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff968c166201000002969096167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffff998c16610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909b1697909b169690961798909817969096169790971791909117161793909317161791909117905561300e8482613588565b836001600160a01b0316817f885092d8762b8ab8b1c1704d518d67f575dd67b734ba8817d34c885e7e3964c8876040516130489190613e24565b60405180910390a35050505050565b816001600160a01b0316836001600160a01b031614156130b95760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610b2c565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052610f999084906136e3565b6131b1848484612536565b6131bd848484846137c8565b611d305760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610b2c565b613237613ae8565b60008281526011602090815260409182902082516101008082018552915460ff80821680845293820481169483019485526201000082048116958301959095526301000000810485166060830152640100000000810485166080830152650100000000008104851660a083015266010000000000008104851660c08301526701000000000000009004841660e08201529084529051909116826001602002015260408181015160ff9081169184019190915260608083015182169084015260808083015182169084015260a08083015182169084015260c08083015182169084015260e0918201511690820152919050565b60006001613336846119d5565b613340919061400f565b600083815260076020526040902054909150808214613393576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906133d89060019061400f565b6000838152600960205260408120546008805493945090928490811061340057613400613ebe565b90600052602060002001549050806008838154811061342157613421613ebe565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061345957613459614063565b6001900381819060005260206000200160009055905550505050565b6000613480836119d5565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b60006001600160e01b031982167f80ac58cd00000000000000000000000000000000000000000000000000000000148061351c57506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80610c2c57507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b0319831614610c2c565b610f998383836122bd565b600061356c600283614079565b1592915050565b6000600c8210158015610c2c575050600d1190565b6001600160a01b0382166135de5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610b2c565b6000818152600260205260409020546001600160a01b0316156136435760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610b2c565b61364f60008383613554565b6001600160a01b0382166000908152600360205260408120805460019290613678908490613f57565b9091555050600081815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000613738826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661394e9092919063ffffffff16565b805190915015610f995780806020019051810190613756919061408d565b610f995760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610b2c565b60006001600160a01b0384163b15613943576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a02906138259033908990889088906004016140aa565b6020604051808303816000875af1925050508015613860575060408051601f3d908101601f1916820190925261385d918101906140e6565b60015b613910573d80801561388e576040519150601f19603f3d011682016040523d82523d6000602084013e613893565b606091505b5080516139085760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610b2c565b805181602001fd5b6001600160e01b0319167f150b7a020000000000000000000000000000000000000000000000000000000014905061252e565b506001949350505050565b606061395d8484600085613967565b90505b9392505050565b6060824710156139df5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610b2c565b6001600160a01b0385163b613a365760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610b2c565b600080866001600160a01b03168587604051613a529190614103565b60006040518083038185875af1925050503d8060008114613a8f576040519150601f19603f3d011682016040523d82523d6000602084013e613a94565b606091505b5091509150613aa4828286613aaf565b979650505050505050565b60608315613abe575081613960565b825115613ace5782518084602001fd5b8160405162461bcd60e51b8152600401610b2c9190613bc9565b6040518061010001604052806008906020820280368337509192915050565b80356001600160a01b0381168114613b1e57600080fd5b919050565b600060208284031215613b3557600080fd5b61396082613b07565b6001600160e01b03198116811461191f57600080fd5b600060208284031215613b6657600080fd5b813561396081613b3e565b60005b83811015613b8c578181015183820152602001613b74565b83811115611d305750506000910152565b60008151808452613bb5816020860160208601613b71565b601f01601f19169290920160200192915050565b6020815260006139606020830184613b9d565b600060208284031215613bee57600080fd5b5035919050565b60008060408385031215613c0857600080fd5b613c1183613b07565b946020939093013593505050565b801515811461191f57600080fd5b600060208284031215613c3f57600080fd5b813561396081613c1f565b6000610100808385031215613c5e57600080fd5b838184011115613c6d57600080fd5b509092915050565b600080600060608486031215613c8a57600080fd5b613c9384613b07565b9250613ca160208501613b07565b9150604084013590509250925092565b60008060408385031215613cc457600080fd5b50508035926020909101359150565b60008060408385031215613ce657600080fd5b613cef83613b07565b91506020830135613cff81613c1f565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613d4957613d49613d0a565b604052919050565b600067ffffffffffffffff821115613d6b57613d6b613d0a565b50601f01601f191660200190565b60008060008060808587031215613d8f57600080fd5b613d9885613b07565b9350613da660208601613b07565b925060408501359150606085013567ffffffffffffffff811115613dc957600080fd5b8501601f81018713613dda57600080fd5b8035613ded613de882613d51565b613d20565b818152886020838501011115613e0257600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b6101008101818360005b6008811015613e4d578151835260209283019290910190600101613e2e565b50505092915050565b60008060408385031215613e6957600080fd5b613e7283613b07565b9150613e8060208401613b07565b90509250929050565b600181811c90821680613e9d57607f821691505b6020821081141561284c57634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615613f0457613f04613ed4565b500290565b634e487b7160e01b600052601260045260246000fd5b600082613f2e57613f2e613f09565b500490565b600062ffffff83811690831681811015613f4f57613f4f613ed4565b039392505050565b60008219821115613f6a57613f6a613ed4565b500190565b600064ffffffffff808316818516808303821115613f8f57613f8f613ed4565b01949350505050565b600060208284031215613faa57600080fd5b815167ffffffffffffffff811115613fc157600080fd5b8201601f81018413613fd257600080fd5b8051613fe0613de882613d51565b818152856020838501011115613ff557600080fd5b614006826020830160208601613b71565b95945050505050565b60008282101561402157614021613ed4565b500390565b600062ffffff808316818516808303821115613f8f57613f8f613ed4565b600062ffffff82168061405957614059613ed4565b6000190192915050565b634e487b7160e01b600052603160045260246000fd5b60008261408857614088613f09565b500690565b60006020828403121561409f57600080fd5b815161396081613c1f565b60006001600160a01b038087168352808616602084015250836040830152608060608301526140dc6080830184613b9d565b9695505050505050565b6000602082840312156140f857600080fd5b815161396081613b3e565b60008251614115818460208701613b71565b919091019291505056fea26469706673582212202b731cdfee9ce9e9bacffec2c13aafc647231678bbf2ccecbdc7480fe212835d64736f6c634300080a00330000000000000000000000005f4019a1ee01d566d3168a0d21076e7cda5391d90000000000000000000000005f4019a1ee01d566d3168a0d21076e7cda5391d9000000000000000000000000397d9761b4b2dac9a061d89647ae6e50a97916e800000000000000000000000000000000000000000000000000000000000000c8000000000000000000000000749f584ff934d1abee7c16003d6dff8fd64cf04100000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000380000000000000000000000000000000000000000000000000000000000000001400000000000000000000000031aec3f4a6f465e6e662f10fa4487a1e8294a66900000000000000000000000031aec3f4a6f465e6e662f10fa4487a1e8294a66900000000000000000000000031aec3f4a6f465e6e662f10fa4487a1e8294a66900000000000000000000000031aec3f4a6f465e6e662f10fa4487a1e8294a66900000000000000000000000031aec3f4a6f465e6e662f10fa4487a1e8294a669000000000000000000000000c5d93a52252694266e2c681288954f0c1f2e4f89000000000000000000000000c5d93a52252694266e2c681288954f0c1f2e4f89000000000000000000000000c5d93a52252694266e2c681288954f0c1f2e4f89000000000000000000000000c5d93a52252694266e2c681288954f0c1f2e4f89000000000000000000000000c5d93a52252694266e2c681288954f0c1f2e4f890000000000000000000000003701e0e1434e129cb424b44f66ef8f32de4330050000000000000000000000003701e0e1434e129cb424b44f66ef8f32de4330050000000000000000000000003701e0e1434e129cb424b44f66ef8f32de4330050000000000000000000000003701e0e1434e129cb424b44f66ef8f32de4330050000000000000000000000003701e0e1434e129cb424b44f66ef8f32de43300500000000000000000000000095b9bbc3a8c0de0695d727c3b79b44f3721232c90000000000000000000000009717fa37a1296d241dbb17646beaaa719bec1d35000000000000000000000000943b71dd451daa8097bc2ad6d4afb7517cb4cf3f0000000000000000000000007fd931f9cee222289e7669270d55e9c9868070170000000000000000000000005f4019a1ee01d566d3168a0d21076e7cda5391d900000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000f00000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000007000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000090000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000001700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b0000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000027000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b0000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000029000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003
Deployed Bytecode
0x6080604052600436106103ad5760003560e01c806395364a84116101e7578063c87b56dd1161010d578063dd6f34c3116100a0578063f4b2e3771161006f578063f4b2e37714610a76578063fa4496fa14610a8b578063fc19be1814610aa0578063fddd483714610ac057600080fd5b8063dd6f34c3146109d8578063e1dc0761146109eb578063e985e9c514610a18578063ee6106e314610a6157600080fd5b8063cf8d81bf116100dc578063cf8d81bf146105cf578063d793d8dc1461098e578063dbc5fd71146109ae578063dbd31b9b146109c357600080fd5b8063c87b56dd14610919578063c8c5353e14610939578063c8dc4f711461069f578063c9c05c251461097257600080fd5b8063a8c5b9e211610185578063b88d4fde11610154578063b88d4fde146108a2578063c1b8e4e1146108c2578063c63adb2b146108e3578063c6cdbcbb146108f957600080fd5b8063a8c5b9e2146106b5578063ab033ea91461084b578063ac85dca71461086b578063b0aa593d1461088b57600080fd5b8063a22cb465116101c1578063a22cb465146107de578063a3ebfdbe146107fe578063a51ee4071461081a578063a82524b21461082f57600080fd5b806395364a841461079457806395d89b41146107a95780639fbc8713146107be57600080fd5b806335d2b2ae116102d75780635557ba591161026a5780636352211e116102395780636352211e1461071457806370905dce1461073457806370a08231146107545780638dc251e31461077457600080fd5b80635557ba59146106b55780635573a623146106cc5780635aa6e675146106df578063602ddd8b146106ff57600080fd5b806348ab665b116102a657806348ab665b1461064e5780634a171a14146106695780634f6ccce71461067f578063520be0e81461069f57600080fd5b806335d2b2ae146105cf57806335da3394146105f957806341b5d0de1461061957806342842e0e1461062e57600080fd5b806312389cbe1161034f5780632a55205a1161031e5780632a55205a1461053b5780632e0d9f6b1461057a5780632f745c591461058f578063303e74df146105af57600080fd5b806312389cbe146104b857806318160ddd146104e65780631f72d831146104fb57806323b872dd1461051b57600080fd5b806306fdde031161038b57806306fdde031461041e578063081812fc14610440578063095ea7b3146104785780630ac62e021461049857600080fd5b806301b9a397146103b257806301ffc9a7146103d457806304c98b2b14610409575b600080fd5b3480156103be57600080fd5b506103d26103cd366004613b23565b610ae1565b005b3480156103e057600080fd5b506103f46103ef366004613b54565b610bee565b60405190151581526020015b60405180910390f35b34801561041557600080fd5b506103d2610c32565b34801561042a57600080fd5b50610433610d34565b6040516104009190613bc9565b34801561044c57600080fd5b5061046061045b366004613bdc565b610dc6565b6040516001600160a01b039091168152602001610400565b34801561048457600080fd5b506103d2610493366004613bf5565b610e6c565b3480156104a457600080fd5b506103d26104b3366004613c2d565b610f9e565b3480156104c457600080fd5b506104d86104d3366004613c4a565b611054565b604051908152602001610400565b3480156104f257600080fd5b506008546104d8565b34801561050757600080fd5b506103d2610516366004613bdc565b61112f565b34801561052757600080fd5b506103d2610536366004613c75565b6111c3565b34801561054757600080fd5b5061055b610556366004613cb1565b61124a565b604080516001600160a01b039093168352602083019190915201610400565b34801561058657600080fd5b506104d86112d2565b34801561059b57600080fd5b506104d86105aa366004613bf5565b611306565b3480156105bb57600080fd5b50600c54610460906001600160a01b031681565b3480156105db57600080fd5b506105e56105dc81565b60405162ffffff9091168152602001610400565b34801561060557600080fd5b506103d2610614366004613b23565b6113ae565b34801561062557600080fd5b506103d2611467565b34801561063a57600080fd5b506103d2610649366004613c75565b611577565b34801561065a57600080fd5b506104d866b1a2bc2ec5000081565b34801561067557600080fd5b506105e56103e881565b34801561068b57600080fd5b506104d861069a366004613bdc565b611592565b3480156106ab57600080fd5b506105e5610bb881565b3480156106c157600080fd5b506105e562078d9881565b6103d26106da366004613c4a565b611636565b3480156106eb57600080fd5b50600a54610460906001600160a01b031681565b34801561070b57600080fd5b506104d8611922565b34801561072057600080fd5b5061046061072f366004613bdc565b61194a565b34801561074057600080fd5b50600b54610460906001600160a01b031681565b34801561076057600080fd5b506104d861076f366004613b23565b6119d5565b34801561078057600080fd5b506103d261078f366004613b23565b611a6f565b3480156107a057600080fd5b506103f4611b1d565b3480156107b557600080fd5b50610433611b46565b3480156107ca57600080fd5b50600e54610460906001600160a01b031681565b3480156107ea57600080fd5b506103d26107f9366004613cd3565b611b55565b34801561080a57600080fd5b506104d8670214e8348c4f000081565b34801561082657600080fd5b506104d8611b64565b34801561083b57600080fd5b50600f5464ffffffffff166104d8565b34801561085757600080fd5b506103d2610866366004613b23565b611b97565b34801561087757600080fd5b506103d2610886366004613c75565b611c45565b34801561089757600080fd5b506105e5620f424081565b3480156108ae57600080fd5b506103d26108bd366004613d79565b611ca8565b3480156108ce57600080fd5b50600c546103f490600160a01b900460ff1681565b3480156108ef57600080fd5b506104d8600d5481565b34801561090557600080fd5b506103d2610914366004613bf5565b611d36565b34801561092557600080fd5b50610433610934366004613bdc565b611e70565b34801561094557600080fd5b506103f4610954366004613b23565b6001600160a01b031660009081526012602052604090205460ff1690565b34801561097e57600080fd5b506104d86703782dace9d9000081565b34801561099a57600080fd5b506103f46109a9366004613c4a565b611f3f565b3480156109ba57600080fd5b506104d8611f4a565b3480156109cf57600080fd5b506104d8611f7a565b6103d26109e6366004613c4a565b611fa7565b3480156109f757600080fd5b50610a0b610a06366004613bdc565b612119565b6040516104009190613e24565b348015610a2457600080fd5b506103f4610a33366004613e56565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610a6d57600080fd5b506104d861217b565b348015610a8257600080fd5b506104d86121b1565b348015610a9757600080fd5b506104d8600081565b348015610aac57600080fd5b506103f4610abb366004613c4a565b6121d6565b348015610acc57600080fd5b50600f5465010000000000900460ff166103f4565b600a546001600160a01b03163314610b355760405162461bcd60e51b81526020600482015260126024820152714f4e4c595f42595f474f5645524e414e434560701b60448201526064015b60405180910390fd5b600c54600160a01b900460ff1615610b8f5760405162461bcd60e51b815260206004820152601160248201527f44455343524950544f525f4c4f434b45440000000000000000000000000000006044820152606401610b2c565b600c80546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f0b4633e1a5ef35d9f85b37127e7ab104f9f20c4e73f8ecb3662e56b6d01ff91590600090a35050565b60006001600160e01b031982167f2a55205a000000000000000000000000000000000000000000000000000000001480610c2c5750610c2c82612375565b92915050565b600a546001600160a01b03163314610c815760405162461bcd60e51b81526020600482015260126024820152714f4e4c595f42595f474f5645524e414e434560701b6044820152606401610b2c565b600f5464ffffffffff1615610cd85760405162461bcd60e51b815260206004820152601760248201527f50524553414c455f414c52454144595f535441525445440000000000000000006044820152606401610b2c565b600f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000164264ffffffffff161790556040517fefb7e4f585efb36e860cd765163862d1b8a52d76fa7e574edd08d982b51cd61190600090a1565b606060008054610d4390613e89565b80601f0160208091040260200160405190810160405280929190818152602001828054610d6f90613e89565b8015610dbc5780601f10610d9157610100808354040283529160200191610dbc565b820191906000526020600020905b815481529060010190602001808311610d9f57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610e505760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610b2c565b506000908152600460205260409020546001600160a01b031690565b6000610e778261194a565b9050806001600160a01b0316836001600160a01b03161415610f015760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610b2c565b336001600160a01b0382161480610f1d5750610f1d8133610a33565b610f8f5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610b2c565b610f9983836123b3565b505050565b600b546001600160a01b03163314610ff85760405162461bcd60e51b815260206004820152601760248201527f4f4e4c595f42595f454d455247454e43595f41444d494e0000000000000000006044820152606401610b2c565b600f8054821515650100000000000265ff0000000000199091161790556040517fcbe1b789cda412d9e1c647ed03d0c71e2f71484be36f9ca2b2a346b29edf1b709061104990831515815260200190565b60405180910390a150565b604080518235602082810191909152830135818301529082013560608281019190915282013560808281019190915282013560a08281019190915282013560c08281019190915282013560e08281019190915282013561010082015260009081906101200160408051601f1981840301815291815281516020928301206000818152601090935291205490915061111a5760405162461bcd60e51b815260206004820152600a6024820152694e4f545f45584953545360b01b6044820152606401610b2c565b60009081526010602052604090205492915050565b600a546001600160a01b0316331461117e5760405162461bcd60e51b81526020600482015260126024820152714f4e4c595f42595f474f5645524e414e434560701b6044820152606401610b2c565b600d80549082905560408051828152602081018490527fb7b16e3cfa4362e0f875e9a926d91f5e5573f73e1f6772c8d9b56fa14301f818910160405180910390a15050565b6111cd338261242e565b61123f5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610b2c565b610f99838383612536565b60008281526002602052604081205481906001600160a01b031661129d5760405162461bcd60e51b815260206004820152600a6024820152694e4f545f45584953545360b01b6044820152606401610b2c565b600e54600d546001600160a01b0390911690612710906112bd9086613eea565b6112c79190613f1f565b915091509250929050565b600f546000906112fc906f01000000000000000000000000000000900462ffffff166105dc613f33565b62ffffff16905090565b6000611311836119d5565b82106113855760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e64730000000000000000000000000000000000000000006064820152608401610b2c565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600b546001600160a01b031633146114085760405162461bcd60e51b815260206004820152601760248201527f4f4e4c595f42595f454d455247454e43595f41444d494e0000000000000000006044820152606401610b2c565b600b80546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8a23c111263e77d29475540620a027de6c49a7927c3f36de78795cf71e65931590600090a35050565b600a546001600160a01b031633146114b65760405162461bcd60e51b81526020600482015260126024820152714f4e4c595f42595f474f5645524e414e434560701b6044820152606401610b2c565b600c54600160a01b900460ff16156115105760405162461bcd60e51b815260206004820152601160248201527f44455343524950544f525f4c4f434b45440000000000000000000000000000006044820152606401610b2c565b600c80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff8116600160a01b179091556040516001600160a01b03909116907fdf95f996a76c155818ca91fc8acf07233468b4d64d8a58d031aba0ae77425b9790600090a2565b610f9983838360405180602001604052806000815250611ca8565b600061159d60085490565b82106116115760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e647300000000000000000000000000000000000000006064820152608401610b2c565b6008828154811061162457611624613ebe565b90600052602060002001549050919050565b600f5465010000000000900460ff16156116925760405162461bcd60e51b815260206004820152600d60248201527f434c41494d5f53544f50504544000000000000000000000000000000000000006044820152606401610b2c565b61169a611b1d565b80156116ae5750600f5464ffffffffff1615155b6116fa5760405162461bcd60e51b815260206004820152601260248201527f50524553414c455f4e4f545f41435449564500000000000000000000000000006044820152606401610b2c565b6117038161271b565b61174f5760405162461bcd60e51b815260206004820152601360248201527f494e56414c49445f434f4d42494e4154494f4e000000000000000000000000006044820152606401610b2c565b8035600811156117a15760405162461bcd60e51b815260206004820152601460248201527f48554d414e535f4e4f545f415641494c41424c450000000000000000000000006044820152606401610b2c565b6117ad81356001612852565b6117f95760405162461bcd60e51b815260206004820152600f60248201527f494e434f52524543545f56414c554500000000000000000000000000000000006044820152606401610b2c565b611803813561290f565b1561187657601f611812611f7a565b61181a6112d2565b6118249190613f57565b106118715760405162461bcd60e51b815260206004820152601360248201527f4e4f5f434c41494d535f415641494c41424c45000000000000000000000000006044820152606401610b2c565b6118ee565b6118808135612924565b1561189757601561188f611b64565b61181a611f4a565b60356118a161217b565b106118ee5760405162461bcd60e51b815260206004820152601360248201527f4e4f5f434c41494d535f415641494c41424c45000000000000000000000000006044820152606401610b2c565b6040805161010081810190925261191f91839060089083908390808284376000920191909152503391506129399050565b50565b600f546000906112fc906c01000000000000000000000000900462ffffff1662078d98613f33565b6000818152600260205260408120546001600160a01b031680610c2c5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610b2c565b60006001600160a01b038216611a535760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610b2c565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b03163314611abe5760405162461bcd60e51b81526020600482015260126024820152714f4e4c595f42595f474f5645524e414e434560701b6044820152606401610b2c565b600e80546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907fc8f5d38942aec138f6ab6e1ccff96d5114329d3b33fa8d3fac47724c90590ec190600090a35050565b600f54600090611b379064ffffffffff1662093a80613f6f565b64ffffffffff16421115905090565b606060018054610d4390613e89565b611b60338383613057565b5050565b600f546000906112fc907801000000000000000000000000000000000000000000000000900462ffffff16610bb8613f33565b600a546001600160a01b03163314611be65760405162461bcd60e51b81526020600482015260126024820152714f4e4c595f42595f474f5645524e414e434560701b6044820152606401610b2c565b600a80546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907fdccb90b244d54b3bb9e633ea2b02f93367526ac8a78357788764295d8949ee6490600090a35050565b600a546001600160a01b03163314611c945760405162461bcd60e51b81526020600482015260126024820152714f4e4c595f42595f474f5645524e414e434560701b6044820152606401610b2c565b610f996001600160a01b0384168383613126565b611cb2338361242e565b611d245760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610b2c565b611d30848484846131a6565b50505050565b600a546001600160a01b03163314611d855760405162461bcd60e51b81526020600482015260126024820152714f4e4c595f42595f474f5645524e414e434560701b6044820152606401610b2c565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611dd2576040519150601f19603f3d011682016040523d82523d6000602084013e611dd7565b606091505b5050905080611e285760405162461bcd60e51b815260206004820152600e60248201527f554e41424c455f544f5f50554c4c0000000000000000000000000000000000006044820152606401610b2c565b826001600160a01b03167f99a7b857d177a9f5962228b830aa679ade0f8465fbb4fef3a472a060c6d8f8e883604051611e6391815260200190565b60405180910390a2505050565b6000818152600260205260409020546060906001600160a01b0316611ec45760405162461bcd60e51b815260206004820152600a6024820152694e4f545f45584953545360b01b6044820152606401610b2c565b600c546001600160a01b03166334f4d1a9611ede8461322f565b6040518263ffffffff1660e01b8152600401611efa9190613e24565b600060405180830381865afa158015611f17573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610c2c9190810190613f98565b6000610c2c8261271b565b600f546000906112fc907501000000000000000000000000000000000000000000900462ffffff16610bb8613f33565b600f546000906112fc907201000000000000000000000000000000000000900462ffffff166105dc613f33565b600f5465010000000000900460ff16156120035760405162461bcd60e51b815260206004820152600d60248201527f434c41494d5f53544f50504544000000000000000000000000000000000000006044820152606401610b2c565b61200b611b1d565b1580156120205750600f5464ffffffffff1615155b61206c5760405162461bcd60e51b815260206004820152600f60248201527f53414c455f4e4f545f41435449564500000000000000000000000000000000006044820152606401610b2c565b6120758161271b565b6120c15760405162461bcd60e51b815260206004820152601360248201527f494e56414c49445f434f4d42494e4154494f4e000000000000000000000000006044820152606401610b2c565b6120cd81356000612852565b6118ee5760405162461bcd60e51b815260206004820152600f60248201527f494e434f52524543545f56414c554500000000000000000000000000000000006044820152606401610b2c565b612121613ae8565b6000828152600260205260409020546001600160a01b03166121725760405162461bcd60e51b815260206004820152600a6024820152694e4f545f45584953545360b01b6044820152606401610b2c565b610c2c8261322f565b600f546000906112fc907b01000000000000000000000000000000000000000000000000000000900462ffffff166103e8613f33565b600f546000906112fc906901000000000000000000900462ffffff1662078d98613f33565b60006121e18261271b565b61222d5760405162461bcd60e51b815260206004820152601360248201527f494e56414c49445f434f4d42494e4154494f4e000000000000000000000000006044820152606401610b2c565b604080518335602082810191909152840135818301529083013560608281019190915283013560808281019190915283013560a08281019190915283013560c08281019190915283013560e0828101919091528301356101008201526000906101200160408051601f19818403018152918152815160209283012060009081526010909252902054159392505050565b6001600160a01b0383166123185761231381600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b61233b565b816001600160a01b0316836001600160a01b03161461233b5761233b8382613329565b6001600160a01b03821661235257610f99816133c6565b826001600160a01b0316826001600160a01b031614610f9957610f998282613475565b60006001600160e01b031982167f780e9d63000000000000000000000000000000000000000000000000000000001480610c2c5750610c2c826134b9565b6000818152600460205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03841690811790915581906123f58261194a565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166124b85760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610b2c565b60006124c38361194a565b9050806001600160a01b0316846001600160a01b031614806124fe5750836001600160a01b03166124f384610dc6565b6001600160a01b0316145b8061252e57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166125498261194a565b6001600160a01b0316146125c55760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e65720000000000000000000000000000000000000000000000000000006064820152608401610b2c565b6001600160a01b0382166126405760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610b2c565b61264b838383613554565b6126566000826123b3565b6001600160a01b038316600090815260036020526040812080546001929061267f90849061400f565b90915550506001600160a01b03821660009081526003602052604081208054600192906126ad908490613f57565b9091555050600081815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600080612728833561355f565b90508080156127385750600d8335105b8015612748575060046020840135105b8015612758575060196040840135105b8015612768575060056060840135105b8015612778575060236080840135105b80156127885750600760a0840135105b80156127985750600160c0840135105b80156127a85750600460e0840135105b156127b65750600192915050565b801580156127c55750600d8335105b80156127d5575060046020840135105b80156127e5575060016040840135105b80156127f5575060056060840135105b80156128055750602c6080840135105b80156128155750600760a0840135105b80156128255750600660c0840135105b80156128355750600460e0840135105b156128435750600192915050565b50600092915050565b50919050565b600061285e8360081190565b1561286b57503415610c2c565b6128748361290f565b156128a1578161288e57670214e8348c4f0000341461289a565b6701aa535d3d0c000034145b9050610c2c565b6128aa83612924565b156128d357816128c35766b1a2bc2ec50000341461289a565b5034668e1bc9bf04000014610c2c565b6128dc83613573565b1561290757816128f6576703782dace9d90000341461289a565b50346702c68af0bb14000014610c2c565b506000610c2c565b600060088210158015610c2c575050600a1190565b6000600a8210158015610c2c575050600c1190565b3332146129885760405162461bcd60e51b815260206004820152600860248201527f4f4e4c595f454f410000000000000000000000000000000000000000000000006044820152606401610b2c565b600f546601000000000000900462ffffff166129e65760405162461bcd60e51b815260206004820152601360248201527f4e4f5f434c41494d535f415641494c41424c45000000000000000000000000006044820152606401610b2c565b60008281602002015190506000818460016020020151856002602002015186600360200201518760046020020151886005602002015189600660200201518a60076020020151604051602001612a74989796959493929190978852602088019690965260408701949094526060860192909252608085015260a084015260c083015260e08201526101000190565b60408051601f1981840301815291815281516020928301206000818152601090935291205490915015612ae95760405162461bcd60e51b815260206004820152600e60248201527f414c52454144595f4558495354530000000000000000000000000000000000006044820152606401610b2c565b612af38260081190565b15612b73573360009081526012602052604090205460ff1615612b585760405162461bcd60e51b815260206004820152601460248201527f494e56414c49445f48554d414e5f4d494e5445520000000000000000000000006044820152606401610b2c565b336000908152601260205260409020805460ff191660011790555b600f54600090612b95906601000000000000900462ffffff16620f4240613f33565b612ba0906001614026565b62ffffff169050612bb18360081190565b15612c2d57612bbf8361355f565b15612c0b57600f80546c01000000000000000000000000900462ffffff1690600c612be983614044565b91906101000a81548162ffffff021916908362ffffff16021790555050612d68565b600f80546901000000000000000000900462ffffff16906009612be983614044565b612c368361290f565b15612c9b57612c448361355f565b15612c7457600f80547201000000000000000000000000000000000000900462ffffff16906012612be983614044565b600f80546f01000000000000000000000000000000900462ffffff169080612be983614044565b612ca483612924565b15612d1657612cb28361355f565b15612ce857600f80547801000000000000000000000000000000000000000000000000900462ffffff16906018612be983614044565b600f80547501000000000000000000000000000000000000000000900462ffffff16906015612be983614044565b600f80547b01000000000000000000000000000000000000000000000000000000900462ffffff1690601b612d4a83614044565b91906101000a81548162ffffff021916908362ffffff160217905550505b600f80546601000000000000900462ffffff16906006612d8783614044565b825462ffffff91821661010093840a90810292021916179091556000848152601060209081526040918290208590558151928301825260ff87811684528982015116908301529091508101866002602002015160ff16815260200186600360088110612df557612df5613ebe565b602002015160ff16815260200186600460088110612e1557612e15613ebe565b602002015160ff16815260200186600560088110612e3557612e35613ebe565b602002015160ff16815260200186600660088110612e5557612e55613ebe565b602002015160ff16815260200186600760088110612e7557612e75613ebe565b6020908102919091015160ff9081169092526000848152601182526040908190208451815493860151928601516060870151608088015160a089015160c08a015160e0909a01518916670100000000000000027fffffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffff9a8a166601000000000000029a909a167fffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffffffff918a16650100000000000265ff000000000019938b1664010000000002939093167fffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffffffff948b166301000000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffffff968c166201000002969096167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000ffff998c16610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909b1697909b169690961798909817969096169790971791909117161793909317161791909117905561300e8482613588565b836001600160a01b0316817f885092d8762b8ab8b1c1704d518d67f575dd67b734ba8817d34c885e7e3964c8876040516130489190613e24565b60405180910390a35050505050565b816001600160a01b0316836001600160a01b031614156130b95760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610b2c565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052610f999084906136e3565b6131b1848484612536565b6131bd848484846137c8565b611d305760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610b2c565b613237613ae8565b60008281526011602090815260409182902082516101008082018552915460ff80821680845293820481169483019485526201000082048116958301959095526301000000810485166060830152640100000000810485166080830152650100000000008104851660a083015266010000000000008104851660c08301526701000000000000009004841660e08201529084529051909116826001602002015260408181015160ff9081169184019190915260608083015182169084015260808083015182169084015260a08083015182169084015260c08083015182169084015260e0918201511690820152919050565b60006001613336846119d5565b613340919061400f565b600083815260076020526040902054909150808214613393576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906133d89060019061400f565b6000838152600960205260408120546008805493945090928490811061340057613400613ebe565b90600052602060002001549050806008838154811061342157613421613ebe565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061345957613459614063565b6001900381819060005260206000200160009055905550505050565b6000613480836119d5565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b60006001600160e01b031982167f80ac58cd00000000000000000000000000000000000000000000000000000000148061351c57506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80610c2c57507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b0319831614610c2c565b610f998383836122bd565b600061356c600283614079565b1592915050565b6000600c8210158015610c2c575050600d1190565b6001600160a01b0382166135de5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610b2c565b6000818152600260205260409020546001600160a01b0316156136435760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610b2c565b61364f60008383613554565b6001600160a01b0382166000908152600360205260408120805460019290613678908490613f57565b9091555050600081815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000613738826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661394e9092919063ffffffff16565b805190915015610f995780806020019051810190613756919061408d565b610f995760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610b2c565b60006001600160a01b0384163b15613943576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a02906138259033908990889088906004016140aa565b6020604051808303816000875af1925050508015613860575060408051601f3d908101601f1916820190925261385d918101906140e6565b60015b613910573d80801561388e576040519150601f19603f3d011682016040523d82523d6000602084013e613893565b606091505b5080516139085760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610b2c565b805181602001fd5b6001600160e01b0319167f150b7a020000000000000000000000000000000000000000000000000000000014905061252e565b506001949350505050565b606061395d8484600085613967565b90505b9392505050565b6060824710156139df5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610b2c565b6001600160a01b0385163b613a365760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610b2c565b600080866001600160a01b03168587604051613a529190614103565b60006040518083038185875af1925050503d8060008114613a8f576040519150601f19603f3d011682016040523d82523d6000602084013e613a94565b606091505b5091509150613aa4828286613aaf565b979650505050505050565b60608315613abe575081613960565b825115613ace5782518084602001fd5b8160405162461bcd60e51b8152600401610b2c9190613bc9565b6040518061010001604052806008906020820280368337509192915050565b80356001600160a01b0381168114613b1e57600080fd5b919050565b600060208284031215613b3557600080fd5b61396082613b07565b6001600160e01b03198116811461191f57600080fd5b600060208284031215613b6657600080fd5b813561396081613b3e565b60005b83811015613b8c578181015183820152602001613b74565b83811115611d305750506000910152565b60008151808452613bb5816020860160208601613b71565b601f01601f19169290920160200192915050565b6020815260006139606020830184613b9d565b600060208284031215613bee57600080fd5b5035919050565b60008060408385031215613c0857600080fd5b613c1183613b07565b946020939093013593505050565b801515811461191f57600080fd5b600060208284031215613c3f57600080fd5b813561396081613c1f565b6000610100808385031215613c5e57600080fd5b838184011115613c6d57600080fd5b509092915050565b600080600060608486031215613c8a57600080fd5b613c9384613b07565b9250613ca160208501613b07565b9150604084013590509250925092565b60008060408385031215613cc457600080fd5b50508035926020909101359150565b60008060408385031215613ce657600080fd5b613cef83613b07565b91506020830135613cff81613c1f565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613d4957613d49613d0a565b604052919050565b600067ffffffffffffffff821115613d6b57613d6b613d0a565b50601f01601f191660200190565b60008060008060808587031215613d8f57600080fd5b613d9885613b07565b9350613da660208601613b07565b925060408501359150606085013567ffffffffffffffff811115613dc957600080fd5b8501601f81018713613dda57600080fd5b8035613ded613de882613d51565b613d20565b818152886020838501011115613e0257600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b6101008101818360005b6008811015613e4d578151835260209283019290910190600101613e2e565b50505092915050565b60008060408385031215613e6957600080fd5b613e7283613b07565b9150613e8060208401613b07565b90509250929050565b600181811c90821680613e9d57607f821691505b6020821081141561284c57634e487b7160e01b600052602260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615613f0457613f04613ed4565b500290565b634e487b7160e01b600052601260045260246000fd5b600082613f2e57613f2e613f09565b500490565b600062ffffff83811690831681811015613f4f57613f4f613ed4565b039392505050565b60008219821115613f6a57613f6a613ed4565b500190565b600064ffffffffff808316818516808303821115613f8f57613f8f613ed4565b01949350505050565b600060208284031215613faa57600080fd5b815167ffffffffffffffff811115613fc157600080fd5b8201601f81018413613fd257600080fd5b8051613fe0613de882613d51565b818152856020838501011115613ff557600080fd5b614006826020830160208601613b71565b95945050505050565b60008282101561402157614021613ed4565b500390565b600062ffffff808316818516808303821115613f8f57613f8f613ed4565b600062ffffff82168061405957614059613ed4565b6000190192915050565b634e487b7160e01b600052603160045260246000fd5b60008261408857614088613f09565b500690565b60006020828403121561409f57600080fd5b815161396081613c1f565b60006001600160a01b038087168352808616602084015250836040830152608060608301526140dc6080830184613b9d565b9695505050505050565b6000602082840312156140f857600080fd5b815161396081613b3e565b60008251614115818460208701613b71565b919091019291505056fea26469706673582212202b731cdfee9ce9e9bacffec2c13aafc647231678bbf2ccecbdc7480fe212835d64736f6c634300080a0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000005f4019a1ee01d566d3168a0d21076e7cda5391d90000000000000000000000005f4019a1ee01d566d3168a0d21076e7cda5391d9000000000000000000000000397d9761b4b2dac9a061d89647ae6e50a97916e800000000000000000000000000000000000000000000000000000000000000c8000000000000000000000000749f584ff934d1abee7c16003d6dff8fd64cf04100000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000380000000000000000000000000000000000000000000000000000000000000001400000000000000000000000031aec3f4a6f465e6e662f10fa4487a1e8294a66900000000000000000000000031aec3f4a6f465e6e662f10fa4487a1e8294a66900000000000000000000000031aec3f4a6f465e6e662f10fa4487a1e8294a66900000000000000000000000031aec3f4a6f465e6e662f10fa4487a1e8294a66900000000000000000000000031aec3f4a6f465e6e662f10fa4487a1e8294a669000000000000000000000000c5d93a52252694266e2c681288954f0c1f2e4f89000000000000000000000000c5d93a52252694266e2c681288954f0c1f2e4f89000000000000000000000000c5d93a52252694266e2c681288954f0c1f2e4f89000000000000000000000000c5d93a52252694266e2c681288954f0c1f2e4f89000000000000000000000000c5d93a52252694266e2c681288954f0c1f2e4f890000000000000000000000003701e0e1434e129cb424b44f66ef8f32de4330050000000000000000000000003701e0e1434e129cb424b44f66ef8f32de4330050000000000000000000000003701e0e1434e129cb424b44f66ef8f32de4330050000000000000000000000003701e0e1434e129cb424b44f66ef8f32de4330050000000000000000000000003701e0e1434e129cb424b44f66ef8f32de43300500000000000000000000000095b9bbc3a8c0de0695d727c3b79b44f3721232c90000000000000000000000009717fa37a1296d241dbb17646beaaa719bec1d35000000000000000000000000943b71dd451daa8097bc2ad6d4afb7517cb4cf3f0000000000000000000000007fd931f9cee222289e7669270d55e9c9868070170000000000000000000000005f4019a1ee01d566d3168a0d21076e7cda5391d900000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000f00000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b0000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000007000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000f000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002200000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000090000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000d000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000001700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000090000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b0000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000027000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b0000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000029000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003
-----Decoded View---------------
Arg [0] : governance_ (address): 0x5f4019a1Ee01D566d3168a0D21076E7CDa5391d9
Arg [1] : emergencyAdmin_ (address): 0x5f4019a1Ee01D566d3168a0D21076E7CDa5391d9
Arg [2] : descriptor_ (address): 0x397d9761b4B2DaC9A061d89647AE6e50A97916E8
Arg [3] : royaltyBps_ (uint256): 200
Arg [4] : royaltyReceiver_ (address): 0x749F584Ff934d1Abee7C16003d6DfF8fD64Cf041
Arg [5] : initialMintingRecipients_ (address[]): 0x31AeC3F4a6f465E6e662f10fA4487a1e8294A669,0x31AeC3F4a6f465E6e662f10fA4487a1e8294A669,0x31AeC3F4a6f465E6e662f10fA4487a1e8294A669,0x31AeC3F4a6f465E6e662f10fA4487a1e8294A669,0x31AeC3F4a6f465E6e662f10fA4487a1e8294A669,0xc5D93a52252694266E2C681288954f0C1f2E4f89,0xc5D93a52252694266E2C681288954f0C1f2E4f89,0xc5D93a52252694266E2C681288954f0C1f2E4f89,0xc5D93a52252694266E2C681288954f0C1f2E4f89,0xc5D93a52252694266E2C681288954f0C1f2E4f89,0x3701E0e1434E129cb424b44f66Ef8f32de433005,0x3701E0e1434E129cb424b44f66Ef8f32de433005,0x3701E0e1434E129cb424b44f66Ef8f32de433005,0x3701E0e1434E129cb424b44f66Ef8f32de433005,0x3701E0e1434E129cb424b44f66Ef8f32de433005,0x95b9bbC3A8c0dE0695d727c3B79b44f3721232c9,0x9717FA37a1296D241Dbb17646Beaaa719beC1D35,0x943B71Dd451dAA8097bC2aD6d4afb7517cB4Cf3f,0x7FD931F9cEe222289E7669270D55E9C986807017,0x5f4019a1Ee01D566d3168a0D21076E7CDa5391d9
Arg [6] : initialMintingCombinations_ (uint256[8][]): System.Collections.Generic.List`1[System.Numerics.BigInteger],System.Collections.Generic.List`1[System.Numerics.BigInteger],System.Collections.Generic.List`1[System.Numerics.BigInteger],System.Collections.Generic.List`1[System.Numerics.BigInteger],System.Collections.Generic.List`1[System.Numerics.BigInteger],System.Collections.Generic.List`1[System.Numerics.BigInteger],System.Collections.Generic.List`1[System.Numerics.BigInteger],System.Collections.Generic.List`1[System.Numerics.BigInteger],System.Collections.Generic.List`1[System.Numerics.BigInteger],System.Collections.Generic.List`1[System.Numerics.BigInteger],System.Collections.Generic.List`1[System.Numerics.BigInteger],System.Collections.Generic.List`1[System.Numerics.BigInteger],System.Collections.Generic.List`1[System.Numerics.BigInteger],System.Collections.Generic.List`1[System.Numerics.BigInteger],System.Collections.Generic.List`1[System.Numerics.BigInteger],System.Collections.Generic.List`1[System.Numerics.BigInteger],System.Collections.Generic.List`1[System.Numerics.BigInteger],System.Collections.Generic.List`1[System.Numerics.BigInteger],System.Collections.Generic.List`1[System.Numerics.BigInteger],System.Collections.Generic.List`1[System.Numerics.BigInteger]
-----Encoded View---------------
189 Constructor Arguments found :
Arg [0] : 0000000000000000000000005f4019a1ee01d566d3168a0d21076e7cda5391d9
Arg [1] : 0000000000000000000000005f4019a1ee01d566d3168a0d21076e7cda5391d9
Arg [2] : 000000000000000000000000397d9761b4b2dac9a061d89647ae6e50a97916e8
Arg [3] : 00000000000000000000000000000000000000000000000000000000000000c8
Arg [4] : 000000000000000000000000749f584ff934d1abee7c16003d6dff8fd64cf041
Arg [5] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000380
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000014
Arg [8] : 00000000000000000000000031aec3f4a6f465e6e662f10fa4487a1e8294a669
Arg [9] : 00000000000000000000000031aec3f4a6f465e6e662f10fa4487a1e8294a669
Arg [10] : 00000000000000000000000031aec3f4a6f465e6e662f10fa4487a1e8294a669
Arg [11] : 00000000000000000000000031aec3f4a6f465e6e662f10fa4487a1e8294a669
Arg [12] : 00000000000000000000000031aec3f4a6f465e6e662f10fa4487a1e8294a669
Arg [13] : 000000000000000000000000c5d93a52252694266e2c681288954f0c1f2e4f89
Arg [14] : 000000000000000000000000c5d93a52252694266e2c681288954f0c1f2e4f89
Arg [15] : 000000000000000000000000c5d93a52252694266e2c681288954f0c1f2e4f89
Arg [16] : 000000000000000000000000c5d93a52252694266e2c681288954f0c1f2e4f89
Arg [17] : 000000000000000000000000c5d93a52252694266e2c681288954f0c1f2e4f89
Arg [18] : 0000000000000000000000003701e0e1434e129cb424b44f66ef8f32de433005
Arg [19] : 0000000000000000000000003701e0e1434e129cb424b44f66ef8f32de433005
Arg [20] : 0000000000000000000000003701e0e1434e129cb424b44f66ef8f32de433005
Arg [21] : 0000000000000000000000003701e0e1434e129cb424b44f66ef8f32de433005
Arg [22] : 0000000000000000000000003701e0e1434e129cb424b44f66ef8f32de433005
Arg [23] : 00000000000000000000000095b9bbc3a8c0de0695d727c3b79b44f3721232c9
Arg [24] : 0000000000000000000000009717fa37a1296d241dbb17646beaaa719bec1d35
Arg [25] : 000000000000000000000000943b71dd451daa8097bc2ad6d4afb7517cb4cf3f
Arg [26] : 0000000000000000000000007fd931f9cee222289e7669270d55e9c986807017
Arg [27] : 0000000000000000000000005f4019a1ee01d566d3168a0d21076e7cda5391d9
Arg [28] : 0000000000000000000000000000000000000000000000000000000000000014
Arg [29] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [30] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [31] : 0000000000000000000000000000000000000000000000000000000000000010
Arg [32] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [33] : 000000000000000000000000000000000000000000000000000000000000000f
Arg [34] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [35] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [36] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [37] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [38] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [39] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [40] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [41] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [42] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [43] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [44] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [45] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [46] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [47] : 0000000000000000000000000000000000000000000000000000000000000012
Arg [48] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [49] : 000000000000000000000000000000000000000000000000000000000000000d
Arg [50] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [51] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [52] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [53] : 000000000000000000000000000000000000000000000000000000000000000b
Arg [54] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [55] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [56] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [57] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [58] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [59] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [60] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [61] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [62] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [63] : 000000000000000000000000000000000000000000000000000000000000000f
Arg [64] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [65] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [66] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [67] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [68] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [69] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [70] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [71] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [72] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [73] : 0000000000000000000000000000000000000000000000000000000000000022
Arg [74] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [75] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [76] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [77] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [78] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [79] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [80] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [81] : 0000000000000000000000000000000000000000000000000000000000000016
Arg [82] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [83] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [84] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [85] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [86] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [87] : 000000000000000000000000000000000000000000000000000000000000000e
Arg [88] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [89] : 000000000000000000000000000000000000000000000000000000000000000d
Arg [90] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [91] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [92] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [93] : 000000000000000000000000000000000000000000000000000000000000000b
Arg [94] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [95] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [96] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [97] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [98] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [99] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [100] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [101] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [102] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [103] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [104] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [105] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [106] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [107] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [108] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [109] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [110] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [111] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [112] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [113] : 0000000000000000000000000000000000000000000000000000000000000017
Arg [114] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [115] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [116] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [117] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [118] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [119] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [120] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [121] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [122] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [123] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [124] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [125] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [126] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [127] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [128] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [129] : 0000000000000000000000000000000000000000000000000000000000000018
Arg [130] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [131] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [132] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [133] : 000000000000000000000000000000000000000000000000000000000000000b
Arg [134] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [135] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [136] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [137] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [138] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [139] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [140] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [141] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [142] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [143] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [144] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [145] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [146] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [147] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [148] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [149] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [150] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [151] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [152] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [153] : 0000000000000000000000000000000000000000000000000000000000000010
Arg [154] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [155] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [156] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [157] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [158] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [159] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [160] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [161] : 000000000000000000000000000000000000000000000000000000000000001f
Arg [162] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [163] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [164] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [165] : 000000000000000000000000000000000000000000000000000000000000000b
Arg [166] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [167] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [168] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [169] : 0000000000000000000000000000000000000000000000000000000000000027
Arg [170] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [171] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [172] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [173] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [174] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [175] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [176] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [177] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [178] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [179] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [180] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [181] : 000000000000000000000000000000000000000000000000000000000000000b
Arg [182] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [183] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [184] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [185] : 0000000000000000000000000000000000000000000000000000000000000029
Arg [186] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [187] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [188] : 0000000000000000000000000000000000000000000000000000000000000003
Deployed Bytecode Sourcemap
8006:26453:14:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23320:251;;;;;;;;;;-1:-1:-1;23320:251:14;;;;;:::i;:::-;;:::i;:::-;;21346:239;;;;;;;;;;-1:-1:-1;21346:239:14;;;;;:::i;:::-;;:::i;:::-;;;1003:14:16;;996:22;978:41;;966:2;951:18;21346:239:14;;;;;;;;21673:199;;;;;;;;;;;;;:::i;2408:98:3:-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;3919:217::-;;;;;;;;;;-1:-1:-1;3919:217:3;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2189:55:16;;;2171:74;;2159:2;2144:18;3919:217:3;2025:226:16;3457:401:3;;;;;;;;;;-1:-1:-1;3457:401:3;;;;;:::i;:::-;;:::i;24898:191:14:-;;;;;;;;;;-1:-1:-1;24898:191:14;;;;;:::i;:::-;;:::i;16507:518::-;;;;;;;;;;-1:-1:-1;16507:518:14;;;;;:::i;:::-;;:::i;:::-;;;3308:25:16;;;3296:2;3281:18;16507:518:14;3162:177:16;1614:111:4;;;;;;;;;;-1:-1:-1;1701:10:4;:17;1614:111;;24072:205:14;;;;;;;;;;-1:-1:-1;24072:205:14;;;;;:::i;:::-;;:::i;4646:330:3:-;;;;;;;;;;-1:-1:-1;4646:330:3;;;;;:::i;:::-;;:::i;20898:249:14:-;;;;;;;;;;-1:-1:-1;20898:249:14;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;4122:55:16;;;4104:74;;4209:2;4194:18;;4187:34;;;;4077:18;20898:249:14;3930:297:16;19120:145:14;;;;;;;;;;;;;:::i;1290:253:4:-;;;;;;;;;;-1:-1:-1;1290:253:4;;;;;:::i;:::-;;:::i;10420:29:14:-;;;;;;;;;;-1:-1:-1;10420:29:14;;;;-1:-1:-1;;;;;10420:29:14;;;9149:68;;;;;;;;;;;;9213:4;9149:68;;;;;4657:8:16;4645:21;;;4627:40;;4615:2;4600:18;9149:68:14;4483:190:16;25261:297:14;;;;;;;;;;-1:-1:-1;25261:297:14;;;;;:::i;:::-;;:::i;23718:157::-;;;;;;;;;;;;;:::i;5042:179:3:-;;;;;;;;;;-1:-1:-1;5042:179:3;;;;;:::i;:::-;;:::i;8240:57:14:-;;;;;;;;;;;;8287:10;8240:57;;9367;;;;;;;;;;;;9420:4;9367:57;;1797:230:4;;;;;;;;;;-1:-1:-1;1797:230:4;;;;;:::i;:::-;;:::i;9293:70:14:-;;;;;;;;;;;;9359:4;9293:70;;9007:68;;;;;;;;;;;;9069:6;9007:68;;13812:966;;;;;;:::i;:::-;;:::i;10341:25::-;;;;;;;;;;-1:-1:-1;10341:25:14;;;;-1:-1:-1;;;;;10341:25:14;;;18863:133;;;;;;;;;;;;;:::i;2111:235:3:-;;;;;;;;;;-1:-1:-1;2111:235:3;;;;;:::i;:::-;;:::i;10370:29:14:-;;;;;;;;;;-1:-1:-1;10370:29:14;;;;-1:-1:-1;;;;;10370:29:14;;;1849:205:3;;;;;;;;;;-1:-1:-1;1849:205:3;;;;;:::i;:::-;;:::i;24439:250:14:-;;;;;;;;;;-1:-1:-1;24439:250:14;;;;;:::i;:::-;;:::i;16006:116::-;;;;;;;;;;;;;:::i;2570:102:3:-;;;;;;;;;;;;;:::i;10532:30:14:-;;;;;;;;;;-1:-1:-1;10532:30:14;;;;-1:-1:-1;;;;;10532:30:14;;;4203:153:3;;;;;;;;;;-1:-1:-1;4203:153:3;;;;;:::i;:::-;;:::i;8181:55:14:-;;;;;;;;;;;;8226:10;8181:55;;19927:145;;;;;;;;;;;;;:::i;20428:108::-;;;;;;;;;;-1:-1:-1;20509:4:14;:21;;;20428:108;;22932:205;;;;;;;;;;-1:-1:-1;22932:205:14;;;;;:::i;:::-;;:::i;22613:166::-;;;;;;;;;;-1:-1:-1;22613:166:14;;;;;:::i;:::-;;:::i;8880:53::-;;;;;;;;;;;;8926:7;8880:53;;5287:320:3;;;;;;;;;;-1:-1:-1;5287:320:3;;;;;:::i;:::-;;:::i;10453:30:14:-;;;;;;;;;;-1:-1:-1;10453:30:14;;;;-1:-1:-1;;;10453:30:14;;;;;;10503:25;;;;;;;;;;;;;;;;22097:226;;;;;;;;;;-1:-1:-1;22097:226:14;;;;;:::i;:::-;;:::i;17981:191::-;;;;;;;;;;-1:-1:-1;17981:191:14;;;;;:::i;:::-;;:::i;18382:106::-;;;;;;;;;;-1:-1:-1;18382:106:14;;;;;:::i;:::-;-1:-1:-1;;;;;18462:21:14;18443:4;18462:21;;;:15;:21;;;;;;;;;18382:106;8301:51;;;;;;;;;;;;8342:10;8301:51;;15723:131;;;;;;;;;;-1:-1:-1;15723:131:14;;;;;:::i;:::-;;:::i;19652:151::-;;;;;;;;;;;;;:::i;19385:139::-;;;;;;;;;;;;;:::i;13321:350::-;;;;;;:::i;:::-;;:::i;17163:160::-;;;;;;;;;;-1:-1:-1;17163:160:14;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;4422:162:3:-;;;;;;;;;;-1:-1:-1;4422:162:3;;;;;:::i;:::-;-1:-1:-1;;;;;4542:25:3;;;4519:4;4542:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;4422:162;20174:114:14;;;;;;;;;;;;;:::i;18608:139::-;;;;;;;;;;;;;:::i;8127:50::-;;;;;;;;;;;;8170:7;8127:50;;14984:529;;;;;;;;;;-1:-1:-1;14984:529:14;;;;;:::i;:::-;;:::i;16273:91::-;;;;;;;;;;-1:-1:-1;16345:4:14;:14;;;;;;16273:91;;23320:251;32054:10;;-1:-1:-1;;;;;32054:10:14;32040;:24;32032:55;;;;-1:-1:-1;;;32032:55:14;;7636:2:16;32032:55:14;;;7618:21:16;7675:2;7655:18;;;7648:30;-1:-1:-1;;;7694:18:16;;;7687:48;7752:18;;32032:55:14;;;;;;;;;31854:18:::1;::::0;-1:-1:-1;;;31854:18:14;::::1;;;31853:19;31845:49;;;::::0;-1:-1:-1;;;31845:49:14;;7983:2:16;31845:49:14::1;::::0;::::1;7965:21:16::0;8022:2;8002:18;;;7995:30;8061:19;8041:18;;;8034:47;8098:18;;31845:49:14::1;7781:341:16::0;31845:49:14::1;23452:10:::2;::::0;;-1:-1:-1;;;;;23469:39:14;;::::2;-1:-1:-1::0;;23469:39:14;::::2;::::0;::::2;::::0;;;23520:46:::2;::::0;23452:10;::::2;::::0;23469:39;23452:10;;23520:46:::2;::::0;23420:21:::2;::::0;23520:46:::2;23414:157;23320:251:::0;:::o;21346:239::-;21478:4;-1:-1:-1;;;;;;21499:41:14;;21514:26;21499:41;;:81;;;21544:36;21568:11;21544:23;:36::i;:::-;21492:88;21346:239;-1:-1:-1;;21346:239:14:o;21673:199::-;32054:10;;-1:-1:-1;;;;;32054:10:14;32040;:24;32032:55;;;;-1:-1:-1;;;32032:55:14;;7636:2:16;32032:55:14;;;7618:21:16;7675:2;7655:18;;;7648:30;-1:-1:-1;;;7694:18:16;;;7687:48;7752:18;;32032:55:14;7434:342:16;32032:55:14;21735:4:::1;:21:::0;::::1;;:26:::0;21727:62:::1;;;::::0;-1:-1:-1;;;21727:62:14;;8329:2:16;21727:62:14::1;::::0;::::1;8311:21:16::0;8368:2;8348:18;;;8341:30;8407:25;8387:18;;;8380:53;8450:18;;21727:62:14::1;8127:347:16::0;21727:62:14::1;21795:4;:47:::0;;;::::1;21826:15;21795:47;;;::::0;;21853:14:::1;::::0;::::1;::::0;-1:-1:-1;;21853:14:14::1;21673:199::o:0;2408:98:3:-;2462:13;2494:5;2487:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2408:98;:::o;3919:217::-;3995:7;7167:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7167:16:3;4014:73;;;;-1:-1:-1;;;4014:73:3;;9123:2:16;4014:73:3;;;9105:21:16;9162:2;9142:18;;;9135:30;9201:34;9181:18;;;9174:62;9272:14;9252:18;;;9245:42;9304:19;;4014:73:3;8921:408:16;4014:73:3;-1:-1:-1;4105:24:3;;;;:15;:24;;;;;;-1:-1:-1;;;;;4105:24:3;;3919:217::o;3457:401::-;3537:13;3553:23;3568:7;3553:14;:23::i;:::-;3537:39;;3600:5;-1:-1:-1;;;;;3594:11:3;:2;-1:-1:-1;;;;;3594:11:3;;;3586:57;;;;-1:-1:-1;;;3586:57:3;;9536:2:16;3586:57:3;;;9518:21:16;9575:2;9555:18;;;9548:30;9614:34;9594:18;;;9587:62;9685:3;9665:18;;;9658:31;9706:19;;3586:57:3;9334:397:16;3586:57:3;719:10:1;-1:-1:-1;;;;;3675:21:3;;;;:62;;-1:-1:-1;3700:37:3;3717:5;719:10:1;4422:162:3;:::i;3700:37::-;3654:165;;;;-1:-1:-1;;;3654:165:3;;9938:2:16;3654:165:3;;;9920:21:16;9977:2;9957:18;;;9950:30;10016:34;9996:18;;;9989:62;10087:26;10067:18;;;10060:54;10131:19;;3654:165:3;9736:420:16;3654:165:3;3830:21;3839:2;3843:7;3830:8;:21::i;:::-;3527:331;3457:401;;:::o;24898:191:14:-;24974:14;;-1:-1:-1;;;;;24974:14:14;24960:10;:28;24952:64;;;;-1:-1:-1;;;24952:64:14;;10363:2:16;24952:64:14;;;10345:21:16;10402:2;10382:18;;;10375:30;10441:25;10421:18;;;10414:53;10484:18;;24952:64:14;10161:347:16;24952:64:14;25022:4;:26;;;;;;;-1:-1:-1;;25022:26:14;;;;;;25060:24;;;;;;25039:9;1003:14:16;996:22;978:41;;966:2;951:18;;838:187;25060:24:14;;;;;;;;24898:191;:::o;16507:518::-;16722:9;16638:259;;16664:9;;;16638:259;;;11027:19:16;;;;16691:9:14;;;11062:12:16;;;11055:28;16722:9:14;;;;16751;11099:12:16;;;11092:28;;;;16751:9:14;;;16781;11136:12:16;;;11129:28;;;;16781:9:14;;;16808;11173:13:16;;;11166:29;;;;16808:9:14;;;16838;11211:13:16;;;11204:29;;;;16838:9:14;;;16869;11249:13:16;;;11242:29;;;;16869:9:14;;;11287:13:16;;;11280:29;16578:7:14;;;;11325:13:16;;16638:259:14;;;-1:-1:-1;;16638:259:14;;;;;;;;;16621:282;;16638:259;16621:282;;;;16917:35;;;;:16;:35;;;;;;16621:282;;-1:-1:-1;16909:63:14;;;;-1:-1:-1;;;16909:63:14;;11551:2:16;16909:63:14;;;11533:21:16;11590:2;11570:18;;;11563:30;-1:-1:-1;;;11609:18:16;;;11602:40;11659:18;;16909:63:14;11349:334:16;16909:63:14;16985:35;;;;:16;:35;;;;;;;16507:518;-1:-1:-1;;16507:518:14:o;24072:205::-;32054:10;;-1:-1:-1;;;;;32054:10:14;32040;:24;32032:55;;;;-1:-1:-1;;;32032:55:14;;7636:2:16;32032:55:14;;;7618:21:16;7675:2;7655:18;;;7648:30;-1:-1:-1;;;7694:18:16;;;7687:48;7752:18;;32032:55:14;7434:342:16;32032:55:14;24172:10:::1;::::0;;24188:26;;;;24226:46:::1;::::0;;11862:25:16;;;11918:2;11903:18;;11896:34;;;24226:46:14::1;::::0;11835:18:16;24226:46:14::1;;;;;;;24142:135;24072:205:::0;:::o;4646:330:3:-;4835:41;719:10:1;4868:7:3;4835:18;:41::i;:::-;4827:103;;;;-1:-1:-1;;;4827:103:3;;12143:2:16;4827:103:3;;;12125:21:16;12182:2;12162:18;;;12155:30;12221:34;12201:18;;;12194:62;12292:19;12272:18;;;12265:47;12329:19;;4827:103:3;11941:413:16;4827:103:3;4941:28;4951:4;4957:2;4961:7;4941:9;:28::i;20898:249:14:-;21013:7;7167:16:3;;;:7;:16;;;;;;21013:7:14;;-1:-1:-1;;;;;7167:16:3;21039:39:14;;;;-1:-1:-1;;;21039:39:14;;11551:2:16;21039:39:14;;;11533:21:16;11590:2;11570:18;;;11563:30;-1:-1:-1;;;11609:18:16;;;11602:40;11659:18;;21039:39:14;11349:334:16;21039:39:14;21092:15;;21122:10;;-1:-1:-1;;;;;21092:15:14;;;;21136:5;;21110:22;;:9;:22;:::i;:::-;21109:32;;;;:::i;:::-;21084:58;;;;20898:249;;;;;:::o;19120:145::-;19241:4;:19;19178:7;;19200:60;;19241:19;;;;;9213:4;19200:60;:::i;:::-;19193:67;;;;19120:145;:::o;1290:253:4:-;1387:7;1422:23;1439:5;1422:16;:23::i;:::-;1414:5;:31;1406:87;;;;-1:-1:-1;;;1406:87:4;;13521:2:16;1406:87:4;;;13503:21:16;13560:2;13540:18;;;13533:30;13599:34;13579:18;;;13572:62;13670:13;13650:18;;;13643:41;13701:19;;1406:87:4;13319:407:16;1406:87:4;-1:-1:-1;;;;;;1510:19:4;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;1290:253::o;25261:297:14:-;25352:14;;-1:-1:-1;;;;;25352:14:14;25338:10;:28;25330:64;;;;-1:-1:-1;;;25330:64:14;;10363:2:16;25330:64:14;;;10345:21:16;10402:2;10382:18;;;10375:30;10441:25;10421:18;;;10414:53;10484:18;;25330:64:14;10161:347:16;25330:64:14;25429:14;;;-1:-1:-1;;;;;25449:34:14;;;-1:-1:-1;;25449:34:14;;;;;;;25495:58;;25429:14;;;25449:34;25429:14;;25495:58;;25401:25;;25495:58;25324:234;25261:297;:::o;23718:157::-;32054:10;;-1:-1:-1;;;;;32054:10:14;32040;:24;32032:55;;;;-1:-1:-1;;;32032:55:14;;7636:2:16;32032:55:14;;;7618:21:16;7675:2;7655:18;;;7648:30;-1:-1:-1;;;7694:18:16;;;7687:48;7752:18;;32032:55:14;7434:342:16;32032:55:14;31854:18:::1;::::0;-1:-1:-1;;;31854:18:14;::::1;;;31853:19;31845:49;;;::::0;-1:-1:-1;;;31845:49:14;;7983:2:16;31845:49:14::1;::::0;::::1;7965:21:16::0;8022:2;8002:18;;;7995:30;8061:19;8041:18;;;8034:47;8098:18;;31845:49:14::1;7781:341:16::0;31845:49:14::1;23798:18:::2;:25:::0;;;;::::2;-1:-1:-1::0;;;23798:25:14::2;::::0;;;23835:35:::2;::::0;-1:-1:-1;;;;;23858:10:14;;;;23835:35:::2;::::0;23798:25;;23835:35:::2;23718:157::o:0;5042:179:3:-;5175:39;5192:4;5198:2;5202:7;5175:39;;;;;;;;;;;;:16;:39::i;1797:230:4:-;1872:7;1907:30;1701:10;:17;;1614:111;1907:30;1899:5;:38;1891:95;;;;-1:-1:-1;;;1891:95:4;;13933:2:16;1891:95:4;;;13915:21:16;13972:2;13952:18;;;13945:30;14011:34;13991:18;;;13984:62;14082:14;14062:18;;;14055:42;14114:19;;1891:95:4;13731:408:16;1891:95:4;2003:10;2014:5;2003:17;;;;;;;;:::i;:::-;;;;;;;;;1996:24;;1797:230;;;:::o;13812:966:14:-;13894:4;:14;;;;;;13893:15;13885:41;;;;-1:-1:-1;;;13885:41:14;;14346:2:16;13885:41:14;;;14328:21:16;14385:2;14365:18;;;14358:30;14424:15;14404:18;;;14397:43;14457:18;;13885:41:14;14144:337:16;13885:41:14;13940:11;:9;:11::i;:::-;:41;;;;-1:-1:-1;13955:4:14;:21;;;:26;;13940:41;13932:72;;;;-1:-1:-1;;;13932:72:14;;14688:2:16;13932:72:14;;;14670:21:16;14727:2;14707:18;;;14700:30;14766:20;14746:18;;;14739:48;14804:18;;13932:72:14;14486:342:16;13932:72:14;14018:28;14039:6;14018:20;:28::i;:::-;14010:60;;;;-1:-1:-1;;;14010:60:14;;15035:2:16;14010:60:14;;;15017:21:16;15074:2;15054:18;;;15047:30;15113:21;15093:18;;;15086:49;15152:18;;14010:60:14;14833:343:16;14010:60:14;14096:9;;10135:1;-1:-1:-1;14084:22:14;14076:55;;;;-1:-1:-1;;;14076:55:14;;15383:2:16;14076:55:14;;;15365:21:16;15422:2;15402:18;;;15395:30;15461:22;15441:18;;;15434:50;15501:18;;14076:55:14;15181:344:16;14076:55:14;14145:28;14157:9;;14168:4;14145:11;:28::i;:::-;14137:56;;;;-1:-1:-1;;;14137:56:14;;15732:2:16;14137:56:14;;;15714:21:16;15771:2;15751:18;;;15744:30;15810:17;15790:18;;;15783:45;15845:18;;14137:56:14;15530:339:16;14137:56:14;14246:23;14259:9;;14246:12;:23::i;:::-;14242:499;;;8705:2;14326:25;:23;:25::i;:::-;14296:27;:25;:27::i;:::-;:55;;;;:::i;:::-;:88;14279:144;;;;-1:-1:-1;;;14279:144:14;;16209:2:16;14279:144:14;;;16191:21:16;16248:2;16228:18;;;16221:30;16287:21;16267:18;;;16260:49;16326:18;;14279:144:14;16007:343:16;14279:144:14;14242:499;;;14440:25;14455:9;;14440:14;:25::i;:::-;14436:305;;;8770:2;14524:27;:25;:27::i;:::-;14492:29;:27;:29::i;14436:305::-;8829:2;14664:17;:15;:17::i;:::-;:46;14656:78;;;;-1:-1:-1;;;14656:78:14;;16209:2:16;14656:78:14;;;16191:21:16;16248:2;16228:18;;;16221:30;16287:21;16267:18;;;16260:49;16326:18;;14656:78:14;16007:343:16;14656:78:14;14747:26;;;;;;;;;;;;14754:6;;14747:26;;;;14754:6;;14747:26;14754:6;14747:26;;;;;;;;;-1:-1:-1;14762:10:14;;-1:-1:-1;14747:6:14;;-1:-1:-1;14747:26:14:i;:::-;13812:966;:::o;18863:133::-;18976:4;:15;18917:7;;18939:52;;18976:15;;;;;8997:6;18939:52;:::i;2111:235:3:-;2183:7;2218:16;;;:7;:16;;;;;;-1:-1:-1;;;;;2218:16:3;2252:19;2244:73;;;;-1:-1:-1;;;2244:73:3;;16557:2:16;2244:73:3;;;16539:21:16;16596:2;16576:18;;;16569:30;16635:34;16615:18;;;16608:62;16706:11;16686:18;;;16679:39;16735:19;;2244:73:3;16355:405:16;1849:205:3;1921:7;-1:-1:-1;;;;;1948:19:3;;1940:74;;;;-1:-1:-1;;;1940:74:3;;16967:2:16;1940:74:3;;;16949:21:16;17006:2;16986:18;;;16979:30;17045:34;17025:18;;;17018:62;17116:12;17096:18;;;17089:40;17146:19;;1940:74:3;16765:406:16;1940:74:3;-1:-1:-1;;;;;;2031:16:3;;;;;:9;:16;;;;;;;1849:205::o;24439:250:14:-;32054:10;;-1:-1:-1;;;;;32054:10:14;32040;:24;32032:55;;;;-1:-1:-1;;;32032:55:14;;7636:2:16;32032:55:14;;;7618:21:16;7675:2;7655:18;;;7648:30;-1:-1:-1;;;7694:18:16;;;7687:48;7752:18;;32032:55:14;7434:342:16;32032:55:14;24554:15:::1;::::0;;-1:-1:-1;;;;;24575:36:14;;::::1;-1:-1:-1::0;;24575:36:14;::::1;::::0;::::1;::::0;;;24623:61:::1;::::0;24554:15;::::1;::::0;24575:36;24554:15;;24623:61:::1;::::0;24525:26:::1;::::0;24623:61:::1;24519:170;24439:250:::0;:::o;16006:116::-;16086:4;:21;16048:4;;16086:31;;:21;;16110:7;16086:31;:::i;:::-;16067:50;;:15;:50;;16060:57;;16006:116;:::o;2570:102:3:-;2626:13;2658:7;2651:14;;;;;:::i;4203:153::-;4297:52;719:10:1;4330:8:3;4340;4297:18;:52::i;:::-;4203:153;;:::o;19927:145:14:-;20048:4;:19;19985:7;;20007:60;;20048:19;;;;;9285:4;20007:60;:::i;22932:205::-;32054:10;;-1:-1:-1;;;;;32054:10:14;32040;:24;32032:55;;;;-1:-1:-1;;;32032:55:14;;7636:2:16;32032:55:14;;;7618:21:16;7675:2;7655:18;;;7648:30;-1:-1:-1;;;7694:18:16;;;7687:48;7752:18;;32032:55:14;7434:342:16;32032:55:14;23032:10:::1;::::0;;-1:-1:-1;;;;;23048:26:14;;::::1;-1:-1:-1::0;;23048:26:14;::::1;::::0;::::1;::::0;;;23086:46:::1;::::0;23032:10;::::1;::::0;23048:26;23032:10;;23086:46:::1;::::0;23008:21:::1;::::0;23086:46:::1;23002:135;22932:205:::0;:::o;22613:166::-;32054:10;;-1:-1:-1;;;;;32054:10:14;32040;:24;32032:55;;;;-1:-1:-1;;;32032:55:14;;7636:2:16;32032:55:14;;;7618:21:16;7675:2;7655:18;;;7648:30;-1:-1:-1;;;7694:18:16;;;7687:48;7752:18;;32032:55:14;7434:342:16;32032:55:14;22729:45:::1;-1:-1:-1::0;;;;;22729:26:14;::::1;22756:9:::0;22767:6;22729:26:::1;:45::i;5287:320:3:-:0;5456:41;719:10:1;5489:7:3;5456:18;:41::i;:::-;5448:103;;;;-1:-1:-1;;;5448:103:3;;12143:2:16;5448:103:3;;;12125:21:16;12182:2;12162:18;;;12155:30;12221:34;12201:18;;;12194:62;12292:19;12272:18;;;12265:47;12329:19;;5448:103:3;11941:413:16;5448:103:3;5561:39;5575:4;5581:2;5585:7;5594:5;5561:13;:39::i;:::-;5287:320;;;;:::o;22097:226:14:-;32054:10;;-1:-1:-1;;;;;32054:10:14;32040;:24;32032:55;;;;-1:-1:-1;;;32032:55:14;;7636:2:16;32032:55:14;;;7618:21:16;7675:2;7655:18;;;7648:30;-1:-1:-1;;;7694:18:16;;;7687:48;7752:18;;32032:55:14;7434:342:16;32032:55:14;22182:12:::1;22200:9;-1:-1:-1::0;;;;;22200:14:14::1;22222:6;22200:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22181:52;;;22247:7;22239:34;;;::::0;-1:-1:-1;;;22239:34:14;;17823:2:16;22239:34:14::1;::::0;::::1;17805:21:16::0;17862:2;17842:18;;;17835:30;17901:16;17881:18;;;17874:44;17935:18;;22239:34:14::1;17621:338:16::0;22239:34:14::1;22300:9;-1:-1:-1::0;;;;;22284:34:14::1;;22311:6;22284:34;;;;3308:25:16::0;;3296:2;3281:18;;3162:177;22284:34:14::1;;;;;;;;22175:148;22097:226:::0;;:::o;17981:191::-;7144:4:3;7167:16;;;:7;:16;;;;;;18054:13:14;;-1:-1:-1;;;;;7167:16:3;18075:39:14;;;;-1:-1:-1;;;18075:39:14;;11551:2:16;18075:39:14;;;11533:21:16;11590:2;11570:18;;;11563:30;-1:-1:-1;;;11609:18:16;;;11602:40;11659:18;;18075:39:14;11349:334:16;18075:39:14;18127:10;;-1:-1:-1;;;;;18127:10:14;:19;18147;18158:7;18147:10;:19::i;:::-;18127:40;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;18127:40:14;;;;;;;;;;;;:::i;15723:131::-;15802:4;15821:28;15842:6;15821:20;:28::i;19652:151::-;19777:4;:21;19712:7;;19734:64;;19777:21;;;;;9359:4;19734:64;:::i;19385:139::-;19502:4;:17;19441:7;;19463:56;;19502:17;;;;;9141:4;19463:56;:::i;13321:350::-;13396:4;:14;;;;;;13395:15;13387:41;;;;-1:-1:-1;;;13387:41:14;;14346:2:16;13387:41:14;;;14328:21:16;14385:2;14365:18;;;14358:30;14424:15;14404:18;;;14397:43;14457:18;;13387:41:14;14144:337:16;13387:41:14;13443:11;:9;:11::i;:::-;13442:12;:42;;;;-1:-1:-1;13458:4:14;:21;;;:26;;13442:42;13434:70;;;;-1:-1:-1;;;13434:70:14;;18806:2:16;13434:70:14;;;18788:21:16;18845:2;18825:18;;;18818:30;18884:17;18864:18;;;18857:45;18919:18;;13434:70:14;18604:339:16;13434:70:14;13518:28;13539:6;13518:20;:28::i;:::-;13510:60;;;;-1:-1:-1;;;13510:60:14;;15035:2:16;13510:60:14;;;15017:21:16;15074:2;15054:18;;;15047:30;15113:21;15093:18;;;15086:49;15152:18;;13510:60:14;14833:343:16;13510:60:14;13584:29;13596:9;;13603:1;13584:11;:29::i;:::-;13576:57;;;;-1:-1:-1;;;13576:57:14;;15732:2:16;13576:57:14;;;15714:21:16;15771:2;15751:18;;;15744:30;15810:17;15790:18;;;15783:45;15845:18;;13576:57:14;15530:339:16;17163:160:14;17222:17;;:::i;:::-;7144:4:3;7167:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7167:16:3;17247:39:14;;;;-1:-1:-1;;;17247:39:14;;11551:2:16;17247:39:14;;;11533:21:16;11590:2;11570:18;;;11563:30;-1:-1:-1;;;11609:18:16;;;11602:40;11659:18;;17247:39:14;11349:334:16;17247:39:14;17299:19;17310:7;17299:10;:19::i;20174:114::-;20274:4;:9;20222:7;;20244:39;;20274:9;;;;;9420:4;20244:39;:::i;18608:139::-;18725:4;:17;18664:7;;18686:56;;18725:17;;;;;9069:6;18686:56;:::i;14984:529::-;15067:4;15087:28;15108:6;15087:20;:28::i;:::-;15079:60;;;;-1:-1:-1;;;15079:60:14;;15035:2:16;15079:60:14;;;15017:21:16;15074:2;15054:18;;;15047:30;15113:21;15093:18;;;15086:49;15152:18;;15079:60:14;14833:343:16;15079:60:14;15274:9;15190:259;;15216:9;;;15190:259;;;11027:19:16;;;;15243:9:14;;;11062:12:16;;;11055:28;15274:9:14;;;;15303;11099:12:16;;;11092:28;;;;15303:9:14;;;15333;11136:12:16;;;11129:28;;;;15333:9:14;;;15360;11173:13:16;;;11166:29;;;;15360:9:14;;;15390;11211:13:16;;;11204:29;;;;15390:9:14;;;15421;11249:13:16;;;11242:29;;;;15421:9:14;;;11287:13:16;;;11280:29;15145:25:14;;11325:13:16;;15190:259:14;;;-1:-1:-1;;15190:259:14;;;;;;;;;15173:282;;15190:259;15173:282;;;;15468:35;;;;:16;:35;;;;;;:40;;14984:529;-1:-1:-1;;;14984:529:14:o;2623:572:4:-;-1:-1:-1;;;;;2822:18:4;;2818:183;;2856:40;2888:7;4004:10;:17;;3977:24;;;;:15;:24;;;;;:44;;;4031:24;;;;;;;;;;;;3901:161;2856:40;2818:183;;;2925:2;-1:-1:-1;;;;;2917:10:4;:4;-1:-1:-1;;;;;2917:10:4;;2913:88;;2943:47;2976:4;2982:7;2943:32;:47::i;:::-;-1:-1:-1;;;;;3014:16:4;;3010:179;;3046:45;3083:7;3046:36;:45::i;3010:179::-;3118:4;-1:-1:-1;;;;;3112:10:4;:2;-1:-1:-1;;;;;3112:10:4;;3108:81;;3138:40;3166:2;3170:7;3138:27;:40::i;989:222::-;1091:4;-1:-1:-1;;;;;;1114:50:4;;1129:35;1114:50;;:90;;;1168:36;1192:11;1168:23;:36::i;11088:171:3:-;11162:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;11162:29:3;-1:-1:-1;;;;;11162:29:3;;;;;;;;:24;;11215:23;11162:24;11215:14;:23::i;:::-;-1:-1:-1;;;;;11206:46:3;;;;;;;;;;;11088:171;;:::o;7362:344::-;7455:4;7167:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7167:16:3;7471:73;;;;-1:-1:-1;;;7471:73:3;;19150:2:16;7471:73:3;;;19132:21:16;19189:2;19169:18;;;19162:30;19228:34;19208:18;;;19201:62;19299:14;19279:18;;;19272:42;19331:19;;7471:73:3;18948:408:16;7471:73:3;7554:13;7570:23;7585:7;7570:14;:23::i;:::-;7554:39;;7622:5;-1:-1:-1;;;;;7611:16:3;:7;-1:-1:-1;;;;;7611:16:3;;:51;;;;7655:7;-1:-1:-1;;;;;7631:31:3;:20;7643:7;7631:11;:20::i;:::-;-1:-1:-1;;;;;7631:31:3;;7611:51;:87;;;-1:-1:-1;;;;;;4542:25:3;;;4519:4;4542:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;7666:32;7603:96;7362:344;-1:-1:-1;;;;7362:344:3:o;10372:605::-;10526:4;-1:-1:-1;;;;;10499:31:3;:23;10514:7;10499:14;:23::i;:::-;-1:-1:-1;;;;;10499:31:3;;10491:81;;;;-1:-1:-1;;;10491:81:3;;19563:2:16;10491:81:3;;;19545:21:16;19602:2;19582:18;;;19575:30;19641:34;19621:18;;;19614:62;19712:7;19692:18;;;19685:35;19737:19;;10491:81:3;19361:401:16;10491:81:3;-1:-1:-1;;;;;10590:16:3;;10582:65;;;;-1:-1:-1;;;10582:65:3;;19969:2:16;10582:65:3;;;19951:21:16;20008:2;19988:18;;;19981:30;20047:34;20027:18;;;20020:62;20118:6;20098:18;;;20091:34;20142:19;;10582:65:3;19767:400:16;10582:65:3;10658:39;10679:4;10685:2;10689:7;10658:20;:39::i;:::-;10759:29;10776:1;10780:7;10759:8;:29::i;:::-;-1:-1:-1;;;;;10799:15:3;;;;;;:9;:15;;;;;:20;;10818:1;;10799:15;:20;;10818:1;;10799:20;:::i;:::-;;;;-1:-1:-1;;;;;;;10829:13:3;;;;;;:9;:13;;;;;:18;;10846:1;;10829:13;:18;;10846:1;;10829:18;:::i;:::-;;;;-1:-1:-1;;10857:16:3;;;;:7;:16;;;;;;:21;;-1:-1:-1;;10857:21:3;-1:-1:-1;;;;;10857:21:3;;;;;;;;;10894:27;;10857:16;;10894:27;;;;;;;3527:331;3457:401;;:::o;28664:941:14:-;28745:4;;28771:18;28779:9;;28771:7;:18::i;:::-;28757:32;;28806:6;:43;;;;-1:-1:-1;9489:2:14;28822:9;;:27;28806:43;:84;;;;-1:-1:-1;9542:1:14;28859:9;;;;:31;28806:84;:128;;;;-1:-1:-1;9597:2:14;28900:9;;;;:34;28806:128;:168;;;;-1:-1:-1;9706:1:14;28944:9;;;;:30;28806:168;:210;;;;-1:-1:-1;9759:2:14;28984:9;;;;:32;28806:210;:250;;;;-1:-1:-1;9867:1:14;29026:9;;;;:30;28806:250;:296;;;;-1:-1:-1;9924:1:14;29066:9;;;;:36;28806:296;:336;;;;-1:-1:-1;10034:1:14;29112:9;;;;:30;28806:336;28795:806;;;-1:-1:-1;29164:4:14;;28664:941;-1:-1:-1;;28664:941:14:o;28795:806::-;29193:6;29192:7;:44;;;;-1:-1:-1;9489:2:14;29209:9;;:27;29192:44;:85;;;;-1:-1:-1;9542:1:14;29246:9;;;;:31;29192:85;:131;;;;-1:-1:-1;9655:1:14;29287:9;;;;:36;29192:131;:171;;;;-1:-1:-1;9706:1:14;29333:9;;;;:30;29192:171;:215;;;;-1:-1:-1;9815:2:14;29373:9;;;;:34;29192:215;:255;;;;-1:-1:-1;9867:1:14;29417:9;;;;:30;29192:255;:303;;;;-1:-1:-1;9983:1:14;29457:9;;;;:38;29192:303;:343;;;;-1:-1:-1;10034:1:14;29505:9;;;;:30;29192:343;29181:420;;;-1:-1:-1;29557:4:14;;28664:941;-1:-1:-1;;28664:941:14:o;29181:420::-;-1:-1:-1;29589:5:14;;28664:941;-1:-1:-1;;28664:941:14:o;29181:420::-;28751:854;28664:941;;;:::o;27799:609::-;27873:4;27889:16;27900:4;10135:1;-1:-1:-1;29883:33:14;29807:114;27889:16;27885:519;;;-1:-1:-1;27922:9:14;:29;27915:36;;27885:519;27968:18;27981:4;27968:12;:18::i;:::-;27964:440;;;28003:9;:85;;8226:10;28057:9;:31;28003:85;;;8459:10;28015:9;:39;28003:85;27996:92;;;;27964:440;28105:20;28120:4;28105:14;:20::i;:::-;28101:303;;;28150:9;:89;;8287:10;28206:9;:33;28150:89;;;-1:-1:-1;28162:9:14;8529:10;28162:41;28135:104;;28101:303;28256:14;28265:4;28256:8;:14::i;:::-;28252:152;;;28287:9;:77;;8342:10;28337:9;:27;28287:77;;;-1:-1:-1;28299:9:14;8593;28299:35;28280:84;;28252:152;-1:-1:-1;28392:5:14;28385:12;;30127:156;30186:4;10135:1;30205:4;:34;;:73;;;;-1:-1:-1;;10196:2:14;-1:-1:-1;30243:35:14;30127:156::o;30493:162::-;30554:4;10196:2;30573:4;:36;;:77;;;;-1:-1:-1;;10260:2:14;-1:-1:-1;30613:37:14;30493:162::o;25700:1807::-;25783:10;25797:9;25783:23;25775:44;;;;-1:-1:-1;;;25775:44:14;;20504:2:16;25775:44:14;;;20486:21:16;20543:1;20523:18;;;20516:29;20581:10;20561:18;;;20554:38;20609:18;;25775:44:14;20302:331:16;25775:44:14;25833:4;:10;;;;;;25825:46;;;;-1:-1:-1;;;25825:46:14;;16209:2:16;25825:46:14;;;16191:21:16;16248:2;16228:18;;;16221:30;16287:21;16267:18;;;16260:49;16326:18;;25825:46:14;16007:343:16;25825:46:14;25878:12;25893:6;25878:12;25893:9;;;;;-1:-1:-1;25908:25:14;25893:9;26001:6;26008:1;26001:9;;;;26032:6;26039:1;26032:9;;;;26061:6;26068:1;26061:9;;;;26091:6;26098:1;26091:9;;;;26118:6;26125:1;26118:9;;;;26148:6;26155:1;26148:9;;;;26179:6;26186:1;26179:9;;;;25953:254;;;;;;;;;;;;;;11027:19:16;;;11071:2;11062:12;;11055:28;;;;11108:2;11099:12;;11092:28;;;;11145:2;11136:12;;11129:28;;;;11182:3;11173:13;;11166:29;11220:3;11211:13;;11204:29;11258:3;11249:13;;11242:29;11296:3;11287:13;;11280:29;11334:3;11325:13;;10702:642;25953:254:14;;;;-1:-1:-1;;25953:254:14;;;;;;;;;25936:277;;25953:254;25936:277;;;;26227:35;;;;:16;:35;;;;;;25936:277;;-1:-1:-1;26227:40:14;26219:67;;;;-1:-1:-1;;;26219:67:14;;20840:2:16;26219:67:14;;;20822:21:16;20879:2;20859:18;;;20852:30;20918:16;20898:18;;;20891:44;20952:18;;26219:67:14;20638:338:16;26219:67:14;26296:16;26307:4;10135:1;-1:-1:-1;29883:33:14;29807:114;26296:16;26292:140;;;26347:10;26331:27;;;;:15;:27;;;;;;;;26330:28;26322:61;;;;-1:-1:-1;;;26322:61:14;;21183:2:16;26322:61:14;;;21165:21:16;21222:2;21202:18;;;21195:30;21261:22;21241:18;;;21234:50;21301:18;;26322:61:14;20981:344:16;26322:61:14;26407:10;26391:27;;;;:15;:27;;;;;:34;;-1:-1:-1;;26391:34:14;26421:4;26391:34;;;26292:140;26510:4;:10;26469:15;;26487:33;;26510:10;;;;;8926:7;26487:33;:::i;:::-;:37;;26523:1;26487:37;:::i;:::-;26469:55;;;;26563:16;26574:4;10135:1;-1:-1:-1;29883:33:14;29807:114;26563:16;26559:467;;;26593:13;26601:4;26593:7;:13::i;:::-;26589:99;;;26618:4;:17;;;;;;;;:15;:17;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;26559:467;;26589:99;26660:4;:19;;;;;;;;:17;:19;;;:::i;26559:467::-;26704:18;26717:4;26704:12;:18::i;:::-;26700:326;;;26736:13;26744:4;26736:7;:13::i;:::-;26732:103;;;26761:4;:19;;;;;;;;:17;:19;;;:::i;26732:103::-;26805:4;:21;;;;;;;;:4;:21;;;:::i;26700:326::-;26851:20;26866:4;26851:14;:20::i;:::-;26847:179;;;26885:13;26893:4;26885:7;:13::i;:::-;26881:107;;;26910:4;:21;;;;;;;;:19;:21;;;:::i;26881:107::-;26956:4;:23;;;;;;;;:21;:23;;;:::i;26847:179::-;27008:4;:11;;;;;;;;:9;:11;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;26847:179;27031:4;:12;;;;;;;;:10;:12;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27064:35:14;;;:16;:35;;;;;;;;;:45;;;27143:273;;;;;;;;;;;;;27204:9;;;;27143:273;;;;;;;-1:-1:-1;27143:273:14;;27204:9;27243:1;27236:9;;;;27143:273;;;;;;27269:6;27276:1;27269:9;;;;;;;:::i;:::-;;;;;27143:273;;;;;;27299:6;27306:1;27299:9;;;;;;;:::i;:::-;;;;;27143:273;;;;;;27332:6;27339:1;27332:9;;;;;;;:::i;:::-;;;;;27143:273;;;;;;27366:6;27373:1;27366:9;;;;;;;:::i;:::-;;;;;27143:273;;;;;;27399:6;27406:1;27399:9;;;;;;;:::i;:::-;;;;;;;;;;27143:273;;;;;;;27115:25;;;;:16;:25;;;;;;;:301;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;27115:301:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27423:24;27429:8;27132:7;27423:5;:24::i;:::-;27485:8;-1:-1:-1;;;;;27459:43:14;27476:7;27459:43;27495:6;27459:43;;;;;;:::i;:::-;;;;;;;;25769:1738;;;25700:1807;;:::o;11394:307:3:-;11544:8;-1:-1:-1;;;;;11535:17:3;:5;-1:-1:-1;;;;;11535:17:3;;;11527:55;;;;-1:-1:-1;;;11527:55:3;;22011:2:16;11527:55:3;;;21993:21:16;22050:2;22030:18;;;22023:30;22089:27;22069:18;;;22062:55;22134:18;;11527:55:3;21809:349:16;11527:55:3;-1:-1:-1;;;;;11592:25:3;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;11592:46:3;;;;;;;;;;11653:41;;978::16;;;11653::3;;951:18:16;11653:41:3;;;;;;;11394:307;;;:::o;687:205:12:-;826:58;;;-1:-1:-1;;;;;4122:55:16;;826:58:12;;;4104:74:16;4194:18;;;;4187:34;;;826:58:12;;;;;;;;;;4077:18:16;;;;826:58:12;;;;;;;;;;849:23;826:58;;;799:86;;819:5;;799:19;:86::i;6469:307:3:-;6620:28;6630:4;6636:2;6640:7;6620:9;:28::i;:::-;6666:48;6689:4;6695:2;6699:7;6708:5;6666:22;:48::i;:::-;6658:111;;;;-1:-1:-1;;;6658:111:3;;22365:2:16;6658:111:3;;;22347:21:16;22404:2;22384:18;;;22377:30;22443:34;22423:18;;;22416:62;22514:20;22494:18;;;22487:48;22552:19;;6658:111:3;22163:414:16;17461:356:14;17521:24;;:::i;:::-;17553:20;17576:25;;;:16;:25;;;;;;;;;17553:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17607:18;;;17643:10;;17553:48;;17631:22;17607:6;17638:1;17631:9;;;:22;17671:8;;;;;17659:20;;;;:9;;;:20;;;;17697:9;;;;;17685:21;;:9;;;:21;17724:6;;;;;17712:18;;:9;;;:18;17748:9;;;;;17736:21;;:9;;;:21;17775:10;;;;;17763:22;;:9;;;:22;17803:9;;;;;17791:21;:9;;;:21;17659:6;17461:356;-1:-1:-1;17461:356:14:o;4679:970:4:-;4941:22;4991:1;4966:22;4983:4;4966:16;:22::i;:::-;:26;;;;:::i;:::-;5002:18;5023:26;;;:17;:26;;;;;;4941:51;;-1:-1:-1;5153:28:4;;;5149:323;;-1:-1:-1;;;;;5219:18:4;;5197:19;5219:18;;;:12;:18;;;;;;;;:34;;;;;;;;;5268:30;;;;;;:44;;;5384:30;;:17;:30;;;;;:43;;;5149:323;-1:-1:-1;5565:26:4;;;;:17;:26;;;;;;;;5558:33;;;-1:-1:-1;;;;;5608:18:4;;;;;:12;:18;;;;;:34;;;;;;;5601:41;4679:970::o;5937:1061::-;6211:10;:17;6186:22;;6211:21;;6231:1;;6211:21;:::i;:::-;6242:18;6263:24;;;:15;:24;;;;;;6631:10;:26;;6186:46;;-1:-1:-1;6263:24:4;;6186:46;;6631:26;;;;;;:::i;:::-;;;;;;;;;6609:48;;6693:11;6668:10;6679;6668:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;6772:28;;;:15;:28;;;;;;;:41;;;6941:24;;;;;6934:31;6975:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;6008:990;;;5937:1061;:::o;3489:217::-;3573:14;3590:20;3607:2;3590:16;:20::i;:::-;-1:-1:-1;;;;;3620:16:4;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;3664:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;3489:217:4:o;1490:300:3:-;1592:4;-1:-1:-1;;;;;;1627:40:3;;1642:25;1627:40;;:104;;-1:-1:-1;;;;;;;1683:48:3;;1698:33;1683:48;1627:104;:156;;;-1:-1:-1;952:25:2;-1:-1:-1;;;;;;937:40:2;;;1747:36:3;829:155:2;31513:181:14;31644:45;31671:4;31677:2;31681:7;31644:26;:45::i;31201:91::-;31255:4;31274:8;31281:1;31274:4;:8;:::i;:::-;:13;;31201:91;-1:-1:-1;;31201:91:14:o;30853:152::-;30908:4;10260:2;30927:4;:38;;:73;;;;-1:-1:-1;;10318:2:14;-1:-1:-1;30969:31:14;30853:152::o;8998:427:3:-;-1:-1:-1;;;;;9077:16:3;;9069:61;;;;-1:-1:-1;;;9069:61:3;;23090:2:16;9069:61:3;;;23072:21:16;;;23109:18;;;23102:30;23168:34;23148:18;;;23141:62;23220:18;;9069:61:3;22888:356:16;9069:61:3;7144:4;7167:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7167:16:3;:30;9140:58;;;;-1:-1:-1;;;9140:58:3;;23451:2:16;9140:58:3;;;23433:21:16;23490:2;23470:18;;;23463:30;23529;23509:18;;;23502:58;23577:18;;9140:58:3;23249:352:16;9140:58:3;9209:45;9238:1;9242:2;9246:7;9209:20;:45::i;:::-;-1:-1:-1;;;;;9265:13:3;;;;;;:9;:13;;;;;:18;;9282:1;;9265:13;:18;;9282:1;;9265:18;:::i;:::-;;;;-1:-1:-1;;9293:16:3;;;;:7;:16;;;;;;:21;;-1:-1:-1;;9293:21:3;-1:-1:-1;;;;;9293:21:3;;;;;;;;9330:33;;9293:16;;;9330:33;;9293:16;;9330:33;4203:153;;:::o;1275:706:12:-;1694:23;1720:69;1748:4;1720:69;;;;;;;;;;;;;;;;;1728:5;-1:-1:-1;;;;;1720:27:12;;;:69;;;;;:::i;:::-;1803:17;;1694:95;;-1:-1:-1;1803:21:12;1799:176;;1898:10;1887:30;;;;;;;;;;;;:::i;:::-;1879:85;;;;-1:-1:-1;;;1879:85:12;;24058:2:16;1879:85:12;;;24040:21:16;24097:2;24077:18;;;24070:30;24136:34;24116:18;;;24109:62;24207:12;24187:18;;;24180:40;24237:19;;1879:85:12;23856:406:16;12254:778:3;12404:4;-1:-1:-1;;;;;12424:13:3;;1450:19:0;:23;12420:606:3;;12459:72;;;;;-1:-1:-1;;;;;12459:36:3;;;;;:72;;719:10:1;;12510:4:3;;12516:7;;12525:5;;12459:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12459:72:3;;;;;;;;-1:-1:-1;;12459:72:3;;;;;;;;;;;;:::i;:::-;;;12455:519;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12698:13:3;;12694:266;;12740:60;;-1:-1:-1;;;12740:60:3;;22365:2:16;12740:60:3;;;22347:21:16;22404:2;22384:18;;;22377:30;22443:34;22423:18;;;22416:62;22514:20;22494:18;;;22487:48;22552:19;;12740:60:3;22163:414:16;12694:266:3;12912:6;12906:13;12897:6;12893:2;12889:15;12882:38;12455:519;-1:-1:-1;;;;;;12581:51:3;12591:41;12581:51;;-1:-1:-1;12574:58:3;;12420:606;-1:-1:-1;13011:4:3;12254:778;;;;;;:::o;3846:223:0:-;3979:12;4010:52;4032:6;4040:4;4046:1;4049:12;4010:21;:52::i;:::-;4003:59;;3846:223;;;;;;:::o;4933:499::-;5098:12;5155:5;5130:21;:30;;5122:81;;;;-1:-1:-1;;;5122:81:0;;25240:2:16;5122:81:0;;;25222:21:16;25279:2;25259:18;;;25252:30;25318:34;25298:18;;;25291:62;25389:8;25369:18;;;25362:36;25415:19;;5122:81:0;25038:402:16;5122:81:0;-1:-1:-1;;;;;1450:19:0;;;5213:60;;;;-1:-1:-1;;;5213:60:0;;25647:2:16;5213:60:0;;;25629:21:16;25686:2;25666:18;;;25659:30;25725:31;25705:18;;;25698:59;25774:18;;5213:60:0;25445:353:16;5213:60:0;5285:12;5299:23;5326:6;-1:-1:-1;;;;;5326:11:0;5345:5;5352:4;5326:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5284:73;;;;5374:51;5391:7;5400:10;5412:12;5374:16;:51::i;:::-;5367:58;4933:499;-1:-1:-1;;;;;;;4933:499:0:o;7546:692::-;7692:12;7720:7;7716:516;;;-1:-1:-1;7750:10:0;7743:17;;7716:516;7861:17;;:21;7857:365;;8055:10;8049:17;8115:15;8102:10;8098:2;8094:19;8087:44;7857:365;8194:12;8187:20;;-1:-1:-1;;;8187:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:196:16:-;82:20;;-1:-1:-1;;;;;131:54:16;;121:65;;111:93;;200:1;197;190:12;111:93;14:196;;;:::o;215:186::-;274:6;327:2;315:9;306:7;302:23;298:32;295:52;;;343:1;340;333:12;295:52;366:29;385:9;366:29;:::i;406:177::-;-1:-1:-1;;;;;;484:5:16;480:78;473:5;470:89;460:117;;573:1;570;563:12;588:245;646:6;699:2;687:9;678:7;674:23;670:32;667:52;;;715:1;712;705:12;667:52;754:9;741:23;773:30;797:5;773:30;:::i;1030:258::-;1102:1;1112:113;1126:6;1123:1;1120:13;1112:113;;;1202:11;;;1196:18;1183:11;;;1176:39;1148:2;1141:10;1112:113;;;1243:6;1240:1;1237:13;1234:48;;;-1:-1:-1;;1278:1:16;1260:16;;1253:27;1030:258::o;1293:317::-;1335:3;1373:5;1367:12;1400:6;1395:3;1388:19;1416:63;1472:6;1465:4;1460:3;1456:14;1449:4;1442:5;1438:16;1416:63;:::i;:::-;1524:2;1512:15;-1:-1:-1;;1508:88:16;1499:98;;;;1599:4;1495:109;;1293:317;-1:-1:-1;;1293:317:16:o;1615:220::-;1764:2;1753:9;1746:21;1727:4;1784:45;1825:2;1814:9;1810:18;1802:6;1784:45;:::i;1840:180::-;1899:6;1952:2;1940:9;1931:7;1927:23;1923:32;1920:52;;;1968:1;1965;1958:12;1920:52;-1:-1:-1;1991:23:16;;1840:180;-1:-1:-1;1840:180:16:o;2256:254::-;2324:6;2332;2385:2;2373:9;2364:7;2360:23;2356:32;2353:52;;;2401:1;2398;2391:12;2353:52;2424:29;2443:9;2424:29;:::i;:::-;2414:39;2500:2;2485:18;;;;2472:32;;-1:-1:-1;;;2256:254:16:o;2515:118::-;2601:5;2594:13;2587:21;2580:5;2577:32;2567:60;;2623:1;2620;2613:12;2638:241;2694:6;2747:2;2735:9;2726:7;2722:23;2718:32;2715:52;;;2763:1;2760;2753:12;2715:52;2802:9;2789:23;2821:28;2843:5;2821:28;:::i;2884:273::-;2968:6;2999:3;3043:2;3031:9;3022:7;3018:23;3014:32;3011:52;;;3059:1;3056;3049:12;3011:52;3098:7;3093:2;3082:9;3078:18;3075:31;3072:51;;;3119:1;3116;3109:12;3072:51;-1:-1:-1;3142:9:16;;2884:273;-1:-1:-1;;2884:273:16:o;3344:328::-;3421:6;3429;3437;3490:2;3478:9;3469:7;3465:23;3461:32;3458:52;;;3506:1;3503;3496:12;3458:52;3529:29;3548:9;3529:29;:::i;:::-;3519:39;;3577:38;3611:2;3600:9;3596:18;3577:38;:::i;:::-;3567:48;;3662:2;3651:9;3647:18;3634:32;3624:42;;3344:328;;;;;:::o;3677:248::-;3745:6;3753;3806:2;3794:9;3785:7;3781:23;3777:32;3774:52;;;3822:1;3819;3812:12;3774:52;-1:-1:-1;;3845:23:16;;;3915:2;3900:18;;;3887:32;;-1:-1:-1;3677:248:16:o;4678:315::-;4743:6;4751;4804:2;4792:9;4783:7;4779:23;4775:32;4772:52;;;4820:1;4817;4810:12;4772:52;4843:29;4862:9;4843:29;:::i;:::-;4833:39;;4922:2;4911:9;4907:18;4894:32;4935:28;4957:5;4935:28;:::i;:::-;4982:5;4972:15;;;4678:315;;;;;:::o;4998:184::-;-1:-1:-1;;;5047:1:16;5040:88;5147:4;5144:1;5137:15;5171:4;5168:1;5161:15;5187:334;5258:2;5252:9;5314:2;5304:13;;-1:-1:-1;;5300:86:16;5288:99;;5417:18;5402:34;;5438:22;;;5399:62;5396:88;;;5464:18;;:::i;:::-;5500:2;5493:22;5187:334;;-1:-1:-1;5187:334:16:o;5526:245::-;5574:4;5607:18;5599:6;5596:30;5593:56;;;5629:18;;:::i;:::-;-1:-1:-1;5686:2:16;5674:15;-1:-1:-1;;5670:88:16;5760:4;5666:99;;5526:245::o;5776:888::-;5871:6;5879;5887;5895;5948:3;5936:9;5927:7;5923:23;5919:33;5916:53;;;5965:1;5962;5955:12;5916:53;5988:29;6007:9;5988:29;:::i;:::-;5978:39;;6036:38;6070:2;6059:9;6055:18;6036:38;:::i;:::-;6026:48;;6121:2;6110:9;6106:18;6093:32;6083:42;;6176:2;6165:9;6161:18;6148:32;6203:18;6195:6;6192:30;6189:50;;;6235:1;6232;6225:12;6189:50;6258:22;;6311:4;6303:13;;6299:27;-1:-1:-1;6289:55:16;;6340:1;6337;6330:12;6289:55;6376:2;6363:16;6401:48;6417:31;6445:2;6417:31;:::i;:::-;6401:48;:::i;:::-;6472:2;6465:5;6458:17;6512:7;6507:2;6502;6498;6494:11;6490:20;6487:33;6484:53;;;6533:1;6530;6523:12;6484:53;6588:2;6583;6579;6575:11;6570:2;6563:5;6559:14;6546:45;6632:1;6627:2;6622;6615:5;6611:14;6607:23;6600:34;6653:5;6643:15;;;;;5776:888;;;;;;;:::o;6669:495::-;6849:3;6834:19;;6838:9;6930:6;6807:4;6964:194;6978:4;6975:1;6972:11;6964:194;;;7037:13;;7025:26;;7074:4;7098:12;;;;7133:15;;;;6998:1;6991:9;6964:194;;;6968:3;;;6669:495;;;;:::o;7169:260::-;7237:6;7245;7298:2;7286:9;7277:7;7273:23;7269:32;7266:52;;;7314:1;7311;7304:12;7266:52;7337:29;7356:9;7337:29;:::i;:::-;7327:39;;7385:38;7419:2;7408:9;7404:18;7385:38;:::i;:::-;7375:48;;7169:260;;;;;:::o;8479:437::-;8558:1;8554:12;;;;8601;;;8622:61;;8676:4;8668:6;8664:17;8654:27;;8622:61;8729:2;8721:6;8718:14;8698:18;8695:38;8692:218;;;-1:-1:-1;;;8763:1:16;8756:88;8867:4;8864:1;8857:15;8895:4;8892:1;8885:15;10513:184;-1:-1:-1;;;10562:1:16;10555:88;10662:4;10659:1;10652:15;10686:4;10683:1;10676:15;12359:184;-1:-1:-1;;;12408:1:16;12401:88;12508:4;12505:1;12498:15;12532:4;12529:1;12522:15;12548:228;12588:7;12714:1;-1:-1:-1;;12642:74:16;12639:1;12636:81;12631:1;12624:9;12617:17;12613:105;12610:131;;;12721:18;;:::i;:::-;-1:-1:-1;12761:9:16;;12548:228::o;12781:184::-;-1:-1:-1;;;12830:1:16;12823:88;12930:4;12927:1;12920:15;12954:4;12951:1;12944:15;12970:120;13010:1;13036;13026:35;;13041:18;;:::i;:::-;-1:-1:-1;13075:9:16;;12970:120::o;13095:219::-;13134:4;13163:8;13221:10;;;;13191;;13243:12;;;13240:38;;;13258:18;;:::i;:::-;13295:13;;13095:219;-1:-1:-1;;;13095:219:16:o;15874:128::-;15914:3;15945:1;15941:6;15938:1;15935:13;15932:39;;;15951:18;;:::i;:::-;-1:-1:-1;15987:9:16;;15874:128::o;17176:230::-;17215:3;17243:12;17282:2;17279:1;17275:10;17312:2;17309:1;17305:10;17343:3;17339:2;17335:12;17330:3;17327:21;17324:47;;;17351:18;;:::i;:::-;17387:13;;17176:230;-1:-1:-1;;;;17176:230:16:o;17964:635::-;18044:6;18097:2;18085:9;18076:7;18072:23;18068:32;18065:52;;;18113:1;18110;18103:12;18065:52;18146:9;18140:16;18179:18;18171:6;18168:30;18165:50;;;18211:1;18208;18201:12;18165:50;18234:22;;18287:4;18279:13;;18275:27;-1:-1:-1;18265:55:16;;18316:1;18313;18306:12;18265:55;18345:2;18339:9;18370:48;18386:31;18414:2;18386:31;:::i;18370:48::-;18441:2;18434:5;18427:17;18481:7;18476:2;18471;18467;18463:11;18459:20;18456:33;18453:53;;;18502:1;18499;18492:12;18453:53;18515:54;18566:2;18561;18554:5;18550:14;18545:2;18541;18537:11;18515:54;:::i;:::-;18588:5;17964:635;-1:-1:-1;;;;;17964:635:16:o;20172:125::-;20212:4;20240:1;20237;20234:8;20231:34;;;20245:18;;:::i;:::-;-1:-1:-1;20282:9:16;;20172:125::o;21330:226::-;21369:3;21397:8;21432:2;21429:1;21425:10;21462:2;21459:1;21455:10;21493:3;21489:2;21485:12;21480:3;21477:21;21474:47;;;21501:18;;:::i;21561:243::-;21599:3;21643:8;21636:5;21632:20;21671:7;21661:41;;21682:18;;:::i;:::-;-1:-1:-1;;21718:80:16;;21561:243;-1:-1:-1;;21561:243:16:o;22582:184::-;-1:-1:-1;;;22631:1:16;22624:88;22731:4;22728:1;22721:15;22755:4;22752:1;22745:15;22771:112;22803:1;22829;22819:35;;22834:18;;:::i;:::-;-1:-1:-1;22868:9:16;;22771:112::o;23606:245::-;23673:6;23726:2;23714:9;23705:7;23701:23;23697:32;23694:52;;;23742:1;23739;23732:12;23694:52;23774:9;23768:16;23793:28;23815:5;23793:28;:::i;24267:512::-;24461:4;-1:-1:-1;;;;;24571:2:16;24563:6;24559:15;24548:9;24541:34;24623:2;24615:6;24611:15;24606:2;24595:9;24591:18;24584:43;;24663:6;24658:2;24647:9;24643:18;24636:34;24706:3;24701:2;24690:9;24686:18;24679:31;24727:46;24768:3;24757:9;24753:19;24745:6;24727:46;:::i;:::-;24719:54;24267:512;-1:-1:-1;;;;;;24267:512:16:o;24784:249::-;24853:6;24906:2;24894:9;24885:7;24881:23;24877:32;24874:52;;;24922:1;24919;24912:12;24874:52;24954:9;24948:16;24973:30;24997:5;24973:30;:::i;25803:274::-;25932:3;25970:6;25964:13;25986:53;26032:6;26027:3;26020:4;26012:6;26008:17;25986:53;:::i;:::-;26055:16;;;;;25803:274;-1:-1:-1;;25803:274:16:o
Swarm Source
ipfs://2b731cdfee9ce9e9bacffec2c13aafc647231678bbf2ccecbdc7480fe212835d
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.