Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 6 from a total of 6 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Approval For... | 17943200 | 466 days ago | IN | 0 ETH | 0.0022394 | ||||
Mint Base | 17943182 | 466 days ago | IN | 0 ETH | 0.01373266 | ||||
Approve Admin | 17943165 | 466 days ago | IN | 0 ETH | 0.00470032 | ||||
Set Royalties | 17943139 | 466 days ago | IN | 0 ETH | 0.00383765 | ||||
Set Approve Tran... | 17943139 | 466 days ago | IN | 0 ETH | 0.00245856 | ||||
0x60806040 | 17943139 | 466 days ago | IN | 0 ETH | 0.28374522 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
ERC721CreatorMaxMint
Compiler Version
v0.8.16+commit.07a7930e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-08-18 */ /// @author: manifold.xyz /// @author: manifold.xyz /// @author: manifold.xyz // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) /** * @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); } /** * @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; } } // OpenZeppelin Contracts (last updated v4.8.0) (utils/structs/EnumerableSet.sol) // This file was procedurally generated from scripts/generate/templates/EnumerableSet.js. /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. * * [WARNING] * ==== * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure * unusable. * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info. * * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an * array of EnumerableSet. * ==== */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastValue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastValue; // Update the index for the moved value set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { bytes32[] memory store = _values(set._inner); bytes32[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values in the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } } // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) /** * @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; } } /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } /// @author: manifold.xyz /** * @dev Interface for admin control */ interface IAdminControl is IERC165 { event AdminApproved(address indexed account, address indexed sender); event AdminRevoked(address indexed account, address indexed sender); /** * @dev gets address of all admins */ function getAdmins() external view returns (address[] memory); /** * @dev add an admin. Can only be called by contract owner. */ function approveAdmin(address admin) external; /** * @dev remove an admin. Can only be called by contract owner. */ function revokeAdmin(address admin) external; /** * @dev checks whether or not given address is an admin * Returns True if they are */ function isAdmin(address admin) external view returns (bool); } abstract contract AdminControl is Ownable, IAdminControl, ERC165 { using EnumerableSet for EnumerableSet.AddressSet; // Track registered admins EnumerableSet.AddressSet private _admins; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IAdminControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Only allows approved admins to call the specified function */ modifier adminRequired() { require(owner() == msg.sender || _admins.contains(msg.sender), "AdminControl: Must be owner or admin"); _; } /** * @dev See {IAdminControl-getAdmins}. */ function getAdmins() external view override returns (address[] memory admins) { admins = new address[](_admins.length()); for (uint i = 0; i < _admins.length(); i++) { admins[i] = _admins.at(i); } return admins; } /** * @dev See {IAdminControl-approveAdmin}. */ function approveAdmin(address admin) external override onlyOwner { if (!_admins.contains(admin)) { emit AdminApproved(admin, msg.sender); _admins.add(admin); } } /** * @dev See {IAdminControl-revokeAdmin}. */ function revokeAdmin(address admin) external override onlyOwner { if (_admins.contains(admin)) { emit AdminRevoked(admin, msg.sender); _admins.remove(admin); } } /** * @dev See {IAdminControl-isAdmin}. */ function isAdmin(address admin) public override view returns (bool) { return (owner() == admin || _admins.contains(admin)); } } /// @author: manifold.xyz /// @author: manifold.xyz /** * Implement this if you want your extension to approve a transfer */ interface IERC721CreatorExtensionApproveTransfer is IERC165 { /** * @dev Set whether or not the creator will check the extension for approval of token transfer */ function setApproveTransfer(address creator, bool enabled) external; /** * @dev Called by creator contract to approve a transfer */ function approveTransfer(address operator, address from, address to, uint256 tokenId) external returns (bool); } /// @author: manifold.xyz /** * @dev Your extension is required to implement this interface if it wishes * to receive the onBurn callback whenever a token the extension created is * burned */ interface IERC721CreatorExtensionBurnable is IERC165 { /** * @dev callback handler for burn events */ function onBurn(address owner, uint256 tokenId) external; } /// @author: manifold.xyz /** * @dev Required interface of an ERC721Creator compliant extension contracts. */ interface IERC721CreatorMintPermissions is IERC165 { /** * @dev get approval to mint */ function approveMint(address extension, address to, uint256 tokenId) external; } /// @author: manifold.xyz /// @author: manifold.xyz /** * @dev Core creator interface */ interface ICreatorCore is IERC165 { event ExtensionRegistered(address indexed extension, address indexed sender); event ExtensionUnregistered(address indexed extension, address indexed sender); event ExtensionBlacklisted(address indexed extension, address indexed sender); event MintPermissionsUpdated(address indexed extension, address indexed permissions, address indexed sender); event RoyaltiesUpdated(uint256 indexed tokenId, address payable[] receivers, uint256[] basisPoints); event DefaultRoyaltiesUpdated(address payable[] receivers, uint256[] basisPoints); event ApproveTransferUpdated(address extension); event ExtensionRoyaltiesUpdated(address indexed extension, address payable[] receivers, uint256[] basisPoints); event ExtensionApproveTransferUpdated(address indexed extension, bool enabled); /** * @dev gets address of all extensions */ function getExtensions() external view returns (address[] memory); /** * @dev add an extension. Can only be called by contract owner or admin. * extension address must point to a contract implementing ICreatorExtension. * Returns True if newly added, False if already added. */ function registerExtension(address extension, string calldata baseURI) external; /** * @dev add an extension. Can only be called by contract owner or admin. * extension address must point to a contract implementing ICreatorExtension. * Returns True if newly added, False if already added. */ function registerExtension(address extension, string calldata baseURI, bool baseURIIdentical) external; /** * @dev add an extension. Can only be called by contract owner or admin. * Returns True if removed, False if already removed. */ function unregisterExtension(address extension) external; /** * @dev blacklist an extension. Can only be called by contract owner or admin. * This function will destroy all ability to reference the metadata of any tokens created * by the specified extension. It will also unregister the extension if needed. * Returns True if removed, False if already removed. */ function blacklistExtension(address extension) external; /** * @dev set the baseTokenURI of an extension. Can only be called by extension. */ function setBaseTokenURIExtension(string calldata uri) external; /** * @dev set the baseTokenURI of an extension. Can only be called by extension. * For tokens with no uri configured, tokenURI will return "uri+tokenId" */ function setBaseTokenURIExtension(string calldata uri, bool identical) external; /** * @dev set the common prefix of an extension. Can only be called by extension. * If configured, and a token has a uri set, tokenURI will return "prefixURI+tokenURI" * Useful if you want to use ipfs/arweave */ function setTokenURIPrefixExtension(string calldata prefix) external; /** * @dev set the tokenURI of a token extension. Can only be called by extension that minted token. */ function setTokenURIExtension(uint256 tokenId, string calldata uri) external; /** * @dev set the tokenURI of a token extension for multiple tokens. Can only be called by extension that minted token. */ function setTokenURIExtension(uint256[] memory tokenId, string[] calldata uri) external; /** * @dev set the baseTokenURI for tokens with no extension. Can only be called by owner/admin. * For tokens with no uri configured, tokenURI will return "uri+tokenId" */ function setBaseTokenURI(string calldata uri) external; /** * @dev set the common prefix for tokens with no extension. Can only be called by owner/admin. * If configured, and a token has a uri set, tokenURI will return "prefixURI+tokenURI" * Useful if you want to use ipfs/arweave */ function setTokenURIPrefix(string calldata prefix) external; /** * @dev set the tokenURI of a token with no extension. Can only be called by owner/admin. */ function setTokenURI(uint256 tokenId, string calldata uri) external; /** * @dev set the tokenURI of multiple tokens with no extension. Can only be called by owner/admin. */ function setTokenURI(uint256[] memory tokenIds, string[] calldata uris) external; /** * @dev set a permissions contract for an extension. Used to control minting. */ function setMintPermissions(address extension, address permissions) external; /** * @dev Configure so transfers of tokens created by the caller (must be extension) gets approval * from the extension before transferring */ function setApproveTransferExtension(bool enabled) external; /** * @dev get the extension of a given token */ function tokenExtension(uint256 tokenId) external view returns (address); /** * @dev Set default royalties */ function setRoyalties(address payable[] calldata receivers, uint256[] calldata basisPoints) external; /** * @dev Set royalties of a token */ function setRoyalties(uint256 tokenId, address payable[] calldata receivers, uint256[] calldata basisPoints) external; /** * @dev Set royalties of an extension */ function setRoyaltiesExtension(address extension, address payable[] calldata receivers, uint256[] calldata basisPoints) external; /** * @dev Get royalites of a token. Returns list of receivers and basisPoints */ function getRoyalties(uint256 tokenId) external view returns (address payable[] memory, uint256[] memory); // Royalty support for various other standards function getFeeRecipients(uint256 tokenId) external view returns (address payable[] memory); function getFeeBps(uint256 tokenId) external view returns (uint[] memory); function getFees(uint256 tokenId) external view returns (address payable[] memory, uint256[] memory); function royaltyInfo(uint256 tokenId, uint256 value) external view returns (address, uint256); /** * @dev Set the default approve transfer contract location. */ function setApproveTransfer(address extension) external; /** * @dev Get the default approve transfer contract location. */ function getApproveTransfer() external view returns (address); } /** * @dev Core ERC721 creator interface */ interface IERC721CreatorCore is ICreatorCore { /** * @dev mint a token with no extension. Can only be called by an admin. * Returns tokenId minted */ function mintBase(address to) external returns (uint256); /** * @dev mint a token with no extension. Can only be called by an admin. * Returns tokenId minted */ function mintBase(address to, string calldata uri) external returns (uint256); /** * @dev batch mint a token with no extension. Can only be called by an admin. * Returns tokenId minted */ function mintBaseBatch(address to, uint16 count) external returns (uint256[] memory); /** * @dev batch mint a token with no extension. Can only be called by an admin. * Returns tokenId minted */ function mintBaseBatch(address to, string[] calldata uris) external returns (uint256[] memory); /** * @dev mint a token. Can only be called by a registered extension. * Returns tokenId minted */ function mintExtension(address to) external returns (uint256); /** * @dev mint a token. Can only be called by a registered extension. * Returns tokenId minted */ function mintExtension(address to, string calldata uri) external returns (uint256); /** * @dev mint a token. Can only be called by a registered extension. * Returns tokenId minted */ function mintExtension(address to, uint80 data) external returns (uint256); /** * @dev batch mint a token. Can only be called by a registered extension. * Returns tokenIds minted */ function mintExtensionBatch(address to, uint16 count) external returns (uint256[] memory); /** * @dev batch mint a token. Can only be called by a registered extension. * Returns tokenId minted */ function mintExtensionBatch(address to, string[] calldata uris) external returns (uint256[] memory); /** * @dev batch mint a token. Can only be called by a registered extension. * Returns tokenId minted */ function mintExtensionBatch(address to, uint80[] calldata data) external returns (uint256[] memory); /** * @dev burn a token. Can only be called by token owner or approved address. * On burn, calls back to the registered extension's onBurn method */ function burn(uint256 tokenId) external; /** * @dev get token data */ function tokenData(uint256 tokenId) external view returns (uint80); } /// @author: manifold.xyz // OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol) /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol) // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol) /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10**64) { value /= 10**64; result += 64; } if (value >= 10**32) { value /= 10**32; result += 32; } if (value >= 10**16) { value /= 10**16; result += 16; } if (value >= 10**8) { value /= 10**8; result += 8; } if (value >= 10**4) { value /= 10**4; result += 4; } if (value >= 10**2) { value /= 10**2; result += 2; } if (value >= 10**1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0); } } } /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @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] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // OpenZeppelin Contracts (last updated v4.8.2) (utils/introspection/ERC165Checker.sol) /** * @dev Library used to query support of an interface declared via {IERC165}. * * Note that these functions return the actual result of the query: they do not * `revert` if an interface is not supported. It is up to the caller to decide * what to do in these cases. */ library ERC165Checker { // As per the EIP-165 spec, no interface should ever match 0xffffffff bytes4 private constant _INTERFACE_ID_INVALID = 0xffffffff; /** * @dev Returns true if `account` supports the {IERC165} interface. */ function supportsERC165(address account) internal view returns (bool) { // Any contract that implements ERC165 must explicitly indicate support of // InterfaceId_ERC165 and explicitly indicate non-support of InterfaceId_Invalid return supportsERC165InterfaceUnchecked(account, type(IERC165).interfaceId) && !supportsERC165InterfaceUnchecked(account, _INTERFACE_ID_INVALID); } /** * @dev Returns true if `account` supports the interface defined by * `interfaceId`. Support for {IERC165} itself is queried automatically. * * See {IERC165-supportsInterface}. */ function supportsInterface(address account, bytes4 interfaceId) internal view returns (bool) { // query support of both ERC165 as per the spec and support of _interfaceId return supportsERC165(account) && supportsERC165InterfaceUnchecked(account, interfaceId); } /** * @dev Returns a boolean array where each value corresponds to the * interfaces passed in and whether they're supported or not. This allows * you to batch check interfaces for a contract where your expectation * is that some interfaces may not be supported. * * See {IERC165-supportsInterface}. * * _Available since v3.4._ */ function getSupportedInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool[] memory) { // an array of booleans corresponding to interfaceIds and whether they're supported or not bool[] memory interfaceIdsSupported = new bool[](interfaceIds.length); // query support of ERC165 itself if (supportsERC165(account)) { // query support of each interface in interfaceIds for (uint256 i = 0; i < interfaceIds.length; i++) { interfaceIdsSupported[i] = supportsERC165InterfaceUnchecked(account, interfaceIds[i]); } } return interfaceIdsSupported; } /** * @dev Returns true if `account` supports all the interfaces defined in * `interfaceIds`. Support for {IERC165} itself is queried automatically. * * Batch-querying can lead to gas savings by skipping repeated checks for * {IERC165} support. * * See {IERC165-supportsInterface}. */ function supportsAllInterfaces(address account, bytes4[] memory interfaceIds) internal view returns (bool) { // query support of ERC165 itself if (!supportsERC165(account)) { return false; } // query support of each interface in interfaceIds for (uint256 i = 0; i < interfaceIds.length; i++) { if (!supportsERC165InterfaceUnchecked(account, interfaceIds[i])) { return false; } } // all interfaces supported return true; } /** * @notice Query if a contract implements an interface, does not check ERC165 support * @param account The address of the contract to query for support of an interface * @param interfaceId The interface identifier, as specified in ERC-165 * @return true if the contract at account indicates support of the interface with * identifier interfaceId, false otherwise * @dev Assumes that account contains a contract that supports ERC165, otherwise * the behavior of this method is undefined. This precondition can be checked * with {supportsERC165}. * * Some precompiled contracts will falsely indicate support for a given interface, so caution * should be exercised when using this function. * * Interface identification is specified in ERC-165. */ function supportsERC165InterfaceUnchecked(address account, bytes4 interfaceId) internal view returns (bool) { // prepare call bytes memory encodedParams = abi.encodeWithSelector(IERC165.supportsInterface.selector, interfaceId); // perform static call bool success; uint256 returnSize; uint256 returnValue; assembly { success := staticcall(30000, account, add(encodedParams, 0x20), mload(encodedParams), 0x00, 0x20) returnSize := returndatasize() returnValue := mload(0x00) } return success && returnSize >= 0x20 && returnValue > 0; } } // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @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 functionCallWithValue(target, data, 0, "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"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or 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 { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // 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 /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } /// @author: manifold.xyz /** * @dev Implement this if you want your extension to have overloadable URI's */ interface ICreatorExtensionTokenURI is IERC165 { /** * Get the uri for a given creator/tokenId */ function tokenURI(address creator, uint256 tokenId) external view returns (string memory); } /// @author: manifold.xyz /** * @dev Implement this if you want your extension to have overloadable royalties */ interface ICreatorExtensionRoyalties is IERC165 { /** * Get the royalties for a given creator/tokenId */ function getRoyalties(address creator, uint256 tokenId) external view returns (address payable[] memory, uint256[] memory); } /** * @dev Core creator implementation */ abstract contract CreatorCore is ReentrancyGuard, ICreatorCore, ERC165 { using Strings for uint256; using EnumerableSet for EnumerableSet.AddressSet; using AddressUpgradeable for address; uint256 internal _tokenCount = 0; // Base approve transfers address location address internal _approveTransferBase; // Track registered extensions data EnumerableSet.AddressSet internal _extensions; EnumerableSet.AddressSet internal _blacklistedExtensions; // The baseURI for a given extension mapping (address => string) private _extensionBaseURI; mapping (address => bool) private _extensionBaseURIIdentical; // The prefix for any tokens with a uri configured mapping (address => string) private _extensionURIPrefix; // Mapping for individual token URIs mapping (uint256 => string) internal _tokenURIs; // Royalty configurations struct RoyaltyConfig { address payable receiver; uint16 bps; } mapping (address => RoyaltyConfig[]) internal _extensionRoyalty; mapping (uint256 => RoyaltyConfig[]) internal _tokenRoyalty; bytes4 private constant _CREATOR_CORE_V1 = 0x28f10a21; /** * External interface identifiers for royalties */ /** * @dev CreatorCore * * bytes4(keccak256('getRoyalties(uint256)')) == 0xbb3bafd6 * * => 0xbb3bafd6 = 0xbb3bafd6 */ bytes4 private constant _INTERFACE_ID_ROYALTIES_CREATORCORE = 0xbb3bafd6; /** * @dev Rarible: RoyaltiesV1 * * bytes4(keccak256('getFeeRecipients(uint256)')) == 0xb9c4d9fb * bytes4(keccak256('getFeeBps(uint256)')) == 0x0ebd4c7f * * => 0xb9c4d9fb ^ 0x0ebd4c7f = 0xb7799584 */ bytes4 private constant _INTERFACE_ID_ROYALTIES_RARIBLE = 0xb7799584; /** * @dev Foundation * * bytes4(keccak256('getFees(uint256)')) == 0xd5a06d4c * * => 0xd5a06d4c = 0xd5a06d4c */ bytes4 private constant _INTERFACE_ID_ROYALTIES_FOUNDATION = 0xd5a06d4c; /** * @dev EIP-2981 * * bytes4(keccak256("royaltyInfo(uint256,uint256)")) == 0x2a55205a * * => 0x2a55205a = 0x2a55205a */ bytes4 private constant _INTERFACE_ID_ROYALTIES_EIP2981 = 0x2a55205a; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(ICreatorCore).interfaceId || interfaceId == _CREATOR_CORE_V1 || super.supportsInterface(interfaceId) || interfaceId == _INTERFACE_ID_ROYALTIES_CREATORCORE || interfaceId == _INTERFACE_ID_ROYALTIES_RARIBLE || interfaceId == _INTERFACE_ID_ROYALTIES_FOUNDATION || interfaceId == _INTERFACE_ID_ROYALTIES_EIP2981; } /** * @dev Only allows registered extensions to call the specified function */ function requireExtension() internal view { require(_extensions.contains(msg.sender), "Must be registered extension"); } /** * @dev Only allows non-blacklisted extensions */ function requireNonBlacklist(address extension) internal view { require(!_blacklistedExtensions.contains(extension), "Extension blacklisted"); } /** * @dev See {ICreatorCore-getExtensions}. */ function getExtensions() external view override returns (address[] memory extensions) { extensions = new address[](_extensions.length()); for (uint i; i < _extensions.length();) { extensions[i] = _extensions.at(i); unchecked { ++i; } } return extensions; } /** * @dev Register an extension */ function _registerExtension(address extension, string calldata baseURI, bool baseURIIdentical) internal virtual { require(extension != address(this) && extension.isContract(), "Invalid"); emit ExtensionRegistered(extension, msg.sender); _extensionBaseURI[extension] = baseURI; _extensionBaseURIIdentical[extension] = baseURIIdentical; _extensions.add(extension); _setApproveTransferExtension(extension, true); } /** * @dev See {ICreatorCore-setApproveTransferExtension}. */ function setApproveTransferExtension(bool enabled) external override { requireExtension(); _setApproveTransferExtension(msg.sender, enabled); } /** * @dev Set whether or not tokens minted by the extension defers transfer approvals to the extension */ function _setApproveTransferExtension(address extension, bool enabled) internal virtual; /** * @dev Unregister an extension */ function _unregisterExtension(address extension) internal { emit ExtensionUnregistered(extension, msg.sender); _extensions.remove(extension); } /** * @dev Blacklist an extension */ function _blacklistExtension(address extension) internal { require(extension != address(0) && extension != address(this), "Cannot blacklist yourself"); if (_extensions.contains(extension)) { emit ExtensionUnregistered(extension, msg.sender); _extensions.remove(extension); } if (!_blacklistedExtensions.contains(extension)) { emit ExtensionBlacklisted(extension, msg.sender); _blacklistedExtensions.add(extension); } } /** * @dev Set base token uri for an extension */ function _setBaseTokenURIExtension(string calldata uri, bool identical) internal { _extensionBaseURI[msg.sender] = uri; _extensionBaseURIIdentical[msg.sender] = identical; } /** * @dev Set token uri prefix for an extension */ function _setTokenURIPrefixExtension(string calldata prefix) internal { _extensionURIPrefix[msg.sender] = prefix; } /** * @dev Set token uri for a token of an extension */ function _setTokenURIExtension(uint256 tokenId, string calldata uri) internal { require(_tokenExtension(tokenId) == msg.sender, "Invalid token"); _tokenURIs[tokenId] = uri; } /** * @dev Set base token uri for tokens with no extension */ function _setBaseTokenURI(string calldata uri) internal { _extensionBaseURI[address(0)] = uri; } /** * @dev Set token uri prefix for tokens with no extension */ function _setTokenURIPrefix(string calldata prefix) internal { _extensionURIPrefix[address(0)] = prefix; } /** * @dev Set token uri for a token with no extension */ function _setTokenURI(uint256 tokenId, string calldata uri) internal { require(tokenId > 0 && tokenId <= _tokenCount && _tokenExtension(tokenId) == address(0), "Invalid token"); _tokenURIs[tokenId] = uri; } /** * @dev Retrieve a token's URI */ function _tokenURI(uint256 tokenId) internal view returns (string memory) { require(tokenId > 0 && tokenId <= _tokenCount, "Invalid token"); address extension = _tokenExtension(tokenId); require(!_blacklistedExtensions.contains(extension), "Extension blacklisted"); if (bytes(_tokenURIs[tokenId]).length != 0) { if (bytes(_extensionURIPrefix[extension]).length != 0) { return string(abi.encodePacked(_extensionURIPrefix[extension], _tokenURIs[tokenId])); } return _tokenURIs[tokenId]; } if (ERC165Checker.supportsInterface(extension, type(ICreatorExtensionTokenURI).interfaceId)) { return ICreatorExtensionTokenURI(extension).tokenURI(address(this), tokenId); } if (!_extensionBaseURIIdentical[extension]) { return string(abi.encodePacked(_extensionBaseURI[extension], tokenId.toString())); } else { return _extensionBaseURI[extension]; } } /** * Helper to get royalties for a token */ function _getRoyalties(uint256 tokenId) view internal returns (address payable[] memory receivers, uint256[] memory bps) { // Get token level royalties RoyaltyConfig[] memory royalties = _tokenRoyalty[tokenId]; if (royalties.length == 0) { // Get extension specific royalties address extension = _tokenExtension(tokenId); if (extension != address(0)) { if (ERC165Checker.supportsInterface(extension, type(ICreatorExtensionRoyalties).interfaceId)) { (receivers, bps) = ICreatorExtensionRoyalties(extension).getRoyalties(address(this), tokenId); // Extension override exists, just return that if (receivers.length > 0) return (receivers, bps); } royalties = _extensionRoyalty[extension]; } } if (royalties.length == 0) { // Get the default royalty royalties = _extensionRoyalty[address(0)]; } if (royalties.length > 0) { receivers = new address payable[](royalties.length); bps = new uint256[](royalties.length); for (uint i; i < royalties.length;) { receivers[i] = royalties[i].receiver; bps[i] = royalties[i].bps; unchecked { ++i; } } } } /** * Helper to get royalty receivers for a token */ function _getRoyaltyReceivers(uint256 tokenId) view internal returns (address payable[] memory recievers) { (recievers, ) = _getRoyalties(tokenId); } /** * Helper to get royalty basis points for a token */ function _getRoyaltyBPS(uint256 tokenId) view internal returns (uint256[] memory bps) { (, bps) = _getRoyalties(tokenId); } function _getRoyaltyInfo(uint256 tokenId, uint256 value) view internal returns (address receiver, uint256 amount){ (address payable[] memory receivers, uint256[] memory bps) = _getRoyalties(tokenId); require(receivers.length <= 1, "More than 1 royalty receiver"); if (receivers.length == 0) { return (address(this), 0); } return (receivers[0], bps[0]*value/10000); } /** * Set royalties for a token */ function _setRoyalties(uint256 tokenId, address payable[] calldata receivers, uint256[] calldata basisPoints) internal { _checkRoyalties(receivers, basisPoints); delete _tokenRoyalty[tokenId]; _setRoyalties(receivers, basisPoints, _tokenRoyalty[tokenId]); emit RoyaltiesUpdated(tokenId, receivers, basisPoints); } /** * Set royalties for all tokens of an extension */ function _setRoyaltiesExtension(address extension, address payable[] calldata receivers, uint256[] calldata basisPoints) internal { _checkRoyalties(receivers, basisPoints); delete _extensionRoyalty[extension]; _setRoyalties(receivers, basisPoints, _extensionRoyalty[extension]); if (extension == address(0)) { emit DefaultRoyaltiesUpdated(receivers, basisPoints); } else { emit ExtensionRoyaltiesUpdated(extension, receivers, basisPoints); } } /** * Helper function to check that royalties provided are valid */ function _checkRoyalties(address payable[] calldata receivers, uint256[] calldata basisPoints) private pure { require(receivers.length == basisPoints.length, "Invalid input"); uint256 totalBasisPoints; for (uint i; i < basisPoints.length;) { totalBasisPoints += basisPoints[i]; unchecked { ++i; } } require(totalBasisPoints < 10000, "Invalid total royalties"); } /** * Helper function to set royalties */ function _setRoyalties(address payable[] calldata receivers, uint256[] calldata basisPoints, RoyaltyConfig[] storage royalties) private { for (uint i; i < basisPoints.length;) { royalties.push( RoyaltyConfig( { receiver: receivers[i], bps: uint16(basisPoints[i]) } ) ); unchecked { ++i; } } } /** * @dev Set the base contract's approve transfer contract location */ function _setApproveTransferBase(address extension) internal { _approveTransferBase = extension; emit ApproveTransferUpdated(extension); } /** * @dev See {ICreatorCore-getApproveTransfer}. */ function getApproveTransfer() external view override returns (address) { return _approveTransferBase; } /** * @dev Get the extension for the given token */ function _tokenExtension(uint256 tokenId) internal virtual view returns(address); } /** * @dev Core ERC721 creator implementation */ abstract contract ERC721CreatorCore is CreatorCore, IERC721CreatorCore { uint256 constant public VERSION = 3; bytes4 private constant _ERC721_CREATOR_CORE_V1 = 0x9088c207; using EnumerableSet for EnumerableSet.AddressSet; // Track registered extensions data mapping (address => bool) internal _extensionApproveTransfers; mapping (address => address) internal _extensionPermissions; // For tracking extension indices uint16 private _extensionCounter; mapping (address => uint16) internal _extensionToIndex; mapping (uint16 => address) internal _indexToExtension; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(CreatorCore, IERC165) returns (bool) { return interfaceId == type(IERC721CreatorCore).interfaceId || interfaceId == _ERC721_CREATOR_CORE_V1 || super.supportsInterface(interfaceId); } /** * @dev See {CreatorCore-_setApproveTransferExtension} */ function _setApproveTransferExtension(address extension, bool enabled) internal override { if (ERC165Checker.supportsInterface(extension, type(IERC721CreatorExtensionApproveTransfer).interfaceId)) { _extensionApproveTransfers[extension] = enabled; emit ExtensionApproveTransferUpdated(extension, enabled); } } /** * @dev Set mint permissions for an extension */ function _setMintPermissions(address extension, address permissions) internal { require(_extensions.contains(extension), "CreatorCore: Invalid extension"); require(permissions == address(0) || ERC165Checker.supportsInterface(permissions, type(IERC721CreatorMintPermissions).interfaceId), "Invalid address"); if (_extensionPermissions[extension] != permissions) { _extensionPermissions[extension] = permissions; emit MintPermissionsUpdated(extension, permissions, msg.sender); } } /** * If mint permissions have been set for an extension (extensions can mint by default), * check if an extension can mint via the permission contract's approveMint function. */ function _checkMintPermissions(address to, uint256 tokenId) internal { if (_extensionPermissions[msg.sender] != address(0)) { IERC721CreatorMintPermissions(_extensionPermissions[msg.sender]).approveMint(msg.sender, to, tokenId); } } /** * Override for pre mint actions */ function _preMintBase(address, uint256) internal virtual {} /** * Override for pre mint actions for _mintExtension */ function _preMintExtension(address, uint256) internal virtual {} /** * Post-burning callback and metadata cleanup */ function _postBurn(address owner, uint256 tokenId, address extension) internal virtual { // Callback to originating extension if needed if (extension != address(0)) { if (ERC165Checker.supportsInterface(extension, type(IERC721CreatorExtensionBurnable).interfaceId)) { IERC721CreatorExtensionBurnable(extension).onBurn(owner, tokenId); } } // Clear metadata (if any) if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } } /** * Approve a transfer */ function _approveTransfer(address from, address to, uint256 tokenId) internal { // Do not need to approve mints if (from == address(0)) return; _approveTransfer(from, to, tokenId, _tokenExtension(tokenId)); } function _approveTransfer(address from, address to, uint256 tokenId, uint16 extensionIndex) internal { // Do not need to approve mints if (from == address(0)) return; _approveTransfer(from, to, tokenId, _indexToExtension[extensionIndex]); } function _approveTransfer(address from, address to, uint256 tokenId, address extension) internal { // Do not need to approve mints if (from == address(0)) return; if (extension != address(0) && _extensionApproveTransfers[extension]) { require(IERC721CreatorExtensionApproveTransfer(extension).approveTransfer(msg.sender, from, to, tokenId), "Extension approval failure"); } else if (_approveTransferBase != address(0)) { require(IERC721CreatorExtensionApproveTransfer(_approveTransferBase).approveTransfer(msg.sender, from, to, tokenId), "Extension approval failure"); } } /** * @dev Register an extension */ function _registerExtension(address extension, string calldata baseURI, bool baseURIIdentical) internal override { require(_extensionCounter < 0xFFFF, "Too many extensions"); if (_extensionToIndex[extension] == 0) { ++_extensionCounter; _extensionToIndex[extension] = _extensionCounter; _indexToExtension[_extensionCounter] = extension; } super._registerExtension(extension, baseURI, baseURIIdentical); } } // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol) /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721 * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must * understand this adds an external call which potentially creates a reentrancy vulnerability. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) /** * @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 `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.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); } // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) /** * @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 functionCallWithValue(target, data, 0, "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"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or 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 { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // 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 /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard */ abstract contract ERC721Core is ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string internal _name; // Token symbol string internal _symbol; struct TokenData { address owner; uint96 data; } // Mapping from token ID to token data mapping(uint256 => TokenData) internal _tokenData; // 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 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: address zero is not a valid owner"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _tokenData[tokenId].owner; require(owner != address(0), "ERC721: invalid token ID"); 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 {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721Core.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( msg.sender == owner || isApprovedForAll(owner, msg.sender), "ERC721: approve caller is not token owner or approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { _requireMinted(tokenId); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(msg.sender, 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(msg.sender, tokenId), "ERC721: caller is not token owner or 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(msg.sender, tokenId), "ERC721: caller is not token owner or 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 _tokenData[tokenId].owner != 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) { address owner = ERC721Core.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == 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, uint96 tokenData) internal virtual { _safeMint(to, tokenId, tokenData, ""); } /** * @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, uint96 tokenData, bytes memory data ) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId, tokenData); unchecked { // Will not overflow unless all 2**256 token ids are minted to the same owner. // Given that tokens are minted one by one, it is impossible in practice that // this ever happens. Might change if we allow batch minting. // The ERC fails to describe this case. _balances[to] += 1; } _tokenData[tokenId] = TokenData({ owner: to, data: tokenData }); emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId, tokenData); require( _checkOnERC721Received(address(0), to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @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 { TokenData memory tokenData = _tokenData[tokenId]; address owner = tokenData.owner; uint96 data = tokenData.data; _beforeTokenTransfer(owner, address(0), tokenId, data); // Clear approvals _approve(address(0), tokenId); unchecked { // Cannot overflow, as that would require more tokens to be burned/transferred // out than the owner initially received through minting and transferring in. _balances[owner] -= 1; } delete _tokenData[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId, data); } /** * @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 { TokenData memory tokenData = _tokenData[tokenId]; address owner = tokenData.owner; require(owner == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); uint96 data = tokenData.data; _beforeTokenTransfer(from, to, tokenId, data); // Clear approvals from the previous owner _approve(address(0), tokenId); unchecked { // `_balances[from]` cannot overflow for the same reason as described in `_burn`: // `from`'s balance is the number of token held, which is at least one before the current // transfer. // `_balances[to]` could overflow in the conditions described in `_mint`. That would require // all 2**256 token ids to be minted, which in practice is impossible. _balances[from] -= 1; _balances[to] += 1; } _tokenData[tokenId].owner = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId, data); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721Core.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits an {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 Reverts if the `tokenId` has not been minted yet. */ function _requireMinted(uint256 tokenId) internal view virtual { require(_exists(tokenId), "ERC721: invalid token ID"); } /** * @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(msg.sender, 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 { /// @solidity memory-safe-assembly assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`. * - When `from` is zero, the tokens will be minted for `to`. * - When `to` is zero, ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId, uint96 tokenData ) internal virtual {} /** * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`. * - When `from` is zero, the tokens were minted for `to`. * - When `to` is zero, ``from``'s tokens were burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId, uint96 tokenData ) internal virtual {} } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard */ abstract contract ERC721Base is ERC721Core { /** * @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 ERC721Creator implementation */ contract ERC721Creator is AdminControl, ERC721Base, ERC721CreatorCore { using EnumerableSet for EnumerableSet.AddressSet; constructor (string memory _name, string memory _symbol) ERC721Base(_name, _symbol) {} /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721Core, ERC721CreatorCore, AdminControl) returns (bool) { return ERC721CreatorCore.supportsInterface(interfaceId) || ERC721Core.supportsInterface(interfaceId) || AdminControl.supportsInterface(interfaceId); } function _beforeTokenTransfer(address from, address to, uint256 tokenId, uint96 data) internal virtual override { _approveTransfer(from, to, tokenId, uint16(data)); } /** * @dev See {ICreatorCore-registerExtension}. */ function registerExtension(address extension, string calldata baseURI) external override adminRequired { requireNonBlacklist(extension); _registerExtension(extension, baseURI, false); } /** * @dev See {ICreatorCore-registerExtension}. */ function registerExtension(address extension, string calldata baseURI, bool baseURIIdentical) external override adminRequired { requireNonBlacklist(extension); _registerExtension(extension, baseURI, baseURIIdentical); } /** * @dev See {ICreatorCore-unregisterExtension}. */ function unregisterExtension(address extension) external override adminRequired { _unregisterExtension(extension); } /** * @dev See {ICreatorCore-blacklistExtension}. */ function blacklistExtension(address extension) external override adminRequired { _blacklistExtension(extension); } /** * @dev See {ICreatorCore-setBaseTokenURIExtension}. */ function setBaseTokenURIExtension(string calldata uri) external override { requireExtension(); _setBaseTokenURIExtension(uri, false); } /** * @dev See {ICreatorCore-setBaseTokenURIExtension}. */ function setBaseTokenURIExtension(string calldata uri, bool identical) external override { requireExtension(); _setBaseTokenURIExtension(uri, identical); } /** * @dev See {ICreatorCore-setTokenURIPrefixExtension}. */ function setTokenURIPrefixExtension(string calldata prefix) external override { requireExtension(); _setTokenURIPrefixExtension(prefix); } /** * @dev See {ICreatorCore-setTokenURIExtension}. */ function setTokenURIExtension(uint256 tokenId, string calldata uri) external override { requireExtension(); _setTokenURIExtension(tokenId, uri); } /** * @dev See {ICreatorCore-setTokenURIExtension}. */ function setTokenURIExtension(uint256[] calldata tokenIds, string[] calldata uris) external override { requireExtension(); require(tokenIds.length == uris.length, "Invalid input"); for (uint i; i < tokenIds.length;) { _setTokenURIExtension(tokenIds[i], uris[i]); unchecked { ++i; } } } /** * @dev See {ICreatorCore-setBaseTokenURI}. */ function setBaseTokenURI(string calldata uri) external override adminRequired { _setBaseTokenURI(uri); } /** * @dev See {ICreatorCore-setTokenURIPrefix}. */ function setTokenURIPrefix(string calldata prefix) external override adminRequired { _setTokenURIPrefix(prefix); } /** * @dev See {ICreatorCore-setTokenURI}. */ function setTokenURI(uint256 tokenId, string calldata uri) external override adminRequired { _setTokenURI(tokenId, uri); } /** * @dev See {ICreatorCore-setTokenURI}. */ function setTokenURI(uint256[] calldata tokenIds, string[] calldata uris) external override adminRequired { require(tokenIds.length == uris.length, "Invalid input"); for (uint i; i < tokenIds.length;) { _setTokenURI(tokenIds[i], uris[i]); unchecked { ++i; } } } /** * @dev See {ICreatorCore-setMintPermissions}. */ function setMintPermissions(address extension, address permissions) external override adminRequired { _setMintPermissions(extension, permissions); } /** * @dev See {IERC721CreatorCore-mintBase}. */ function mintBase(address to) public virtual override nonReentrant adminRequired returns(uint256) { return _mintBase(to, "", 0); } /** * @dev See {IERC721CreatorCore-mintBase}. */ function mintBase(address to, string calldata uri) public virtual override nonReentrant adminRequired returns(uint256) { return _mintBase(to, uri, 0); } /** * @dev See {IERC721CreatorCore-mintBaseBatch}. */ function mintBaseBatch(address to, uint16 count) public virtual override nonReentrant adminRequired returns(uint256[] memory tokenIds) { tokenIds = new uint256[](count); uint256 firstTokenId = _tokenCount+1; _tokenCount += count; for (uint i; i < count;) { tokenIds[i] = _mintBase(to, "", firstTokenId+i); unchecked { ++i; } } } /** * @dev See {IERC721CreatorCore-mintBaseBatch}. */ function mintBaseBatch(address to, string[] calldata uris) public virtual override nonReentrant adminRequired returns(uint256[] memory tokenIds) { tokenIds = new uint256[](uris.length); uint256 firstTokenId = _tokenCount+1; _tokenCount += uris.length; for (uint i; i < uris.length;) { tokenIds[i] = _mintBase(to, uris[i], firstTokenId+i); unchecked { ++i; } } } /** * @dev Mint token with no extension */ function _mintBase(address to, string memory uri, uint256 tokenId) internal virtual returns(uint256) { if (tokenId == 0) { ++_tokenCount; tokenId = _tokenCount; } // Call pre mint _preMintBase(to, tokenId); _safeMint(to, tokenId, 0); if (bytes(uri).length > 0) { _tokenURIs[tokenId] = uri; } return tokenId; } /** * @dev See {IERC721CreatorCore-mintExtension}. */ function mintExtension(address to) public virtual override nonReentrant returns(uint256) { requireExtension(); return _mintExtension(to, "", 0, 0); } /** * @dev See {IERC721CreatorCore-mintExtension}. */ function mintExtension(address to, string calldata uri) public virtual override nonReentrant returns(uint256) { requireExtension(); return _mintExtension(to, uri, 0, 0); } /** * @dev See {IERC721CreatorCore-mintExtension}. */ function mintExtension(address to, uint80 data) public virtual override nonReentrant returns(uint256) { requireExtension(); return _mintExtension(to, "", data, 0); } /** * @dev See {IERC721CreatorCore-mintExtensionBatch}. */ function mintExtensionBatch(address to, uint16 count) public virtual override nonReentrant returns(uint256[] memory tokenIds) { requireExtension(); tokenIds = new uint256[](count); uint256 firstTokenId = _tokenCount+1; _tokenCount += count; for (uint i; i < count;) { tokenIds[i] = _mintExtension(to, "", 0, firstTokenId+i); unchecked { ++i; } } } /** * @dev See {IERC721CreatorCore-mintExtensionBatch}. */ function mintExtensionBatch(address to, string[] calldata uris) public virtual override nonReentrant returns(uint256[] memory tokenIds) { requireExtension(); tokenIds = new uint256[](uris.length); uint256 firstTokenId = _tokenCount+1; _tokenCount += uris.length; for (uint i; i < uris.length;) { tokenIds[i] = _mintExtension(to, uris[i], 0, firstTokenId+i); unchecked { ++i; } } } /** * @dev See {IERC721CreatorCore-mintExtensionBatch}. */ function mintExtensionBatch(address to, uint80[] calldata data) public virtual override nonReentrant returns(uint256[] memory tokenIds) { requireExtension(); tokenIds = new uint256[](data.length); uint256 firstTokenId = _tokenCount+1; _tokenCount += data.length; for (uint i; i < data.length;) { tokenIds[i] = _mintExtension(to, "", data[i], firstTokenId+i); unchecked { ++i; } } } /** * @dev Mint token via extension */ function _mintExtension(address to, string memory uri, uint80 data, uint256 tokenId) internal virtual returns(uint256) { if (tokenId == 0) { ++_tokenCount; tokenId = _tokenCount; } _checkMintPermissions(to, tokenId); // Call pre mint _preMintExtension(to, tokenId); _safeMint(to, tokenId, data << 16 | _extensionToIndex[msg.sender]); if (bytes(uri).length > 0) { _tokenURIs[tokenId] = uri; } return tokenId; } /** * @dev See {ICreatorCore-tokenExtension}. */ function tokenExtension(uint256 tokenId) public view virtual override returns (address extension) { require(_exists(tokenId), "Nonexistent token"); extension = _tokenExtension(tokenId); require(extension != address(0), "No extension for token"); require(!_blacklistedExtensions.contains(extension), "Extension blacklisted"); } /** * @dev See {IERC721CreatorCore-burn}. */ function burn(uint256 tokenId) public virtual override nonReentrant { require(_isApprovedOrOwner(msg.sender, tokenId), "Caller is not owner or approved"); address owner = ownerOf(tokenId); address extension = _tokenExtension(tokenId); _burn(tokenId); _postBurn(owner, tokenId, extension); } /** * @dev See {ICreatorCore-setRoyalties}. */ function setRoyalties(address payable[] calldata receivers, uint256[] calldata basisPoints) external override adminRequired { _setRoyaltiesExtension(address(0), receivers, basisPoints); } /** * @dev See {ICreatorCore-setRoyalties}. */ function setRoyalties(uint256 tokenId, address payable[] calldata receivers, uint256[] calldata basisPoints) external override adminRequired { require(_exists(tokenId), "Nonexistent token"); _setRoyalties(tokenId, receivers, basisPoints); } /** * @dev See {ICreatorCore-setRoyaltiesExtension}. */ function setRoyaltiesExtension(address extension, address payable[] calldata receivers, uint256[] calldata basisPoints) external override adminRequired { _setRoyaltiesExtension(extension, receivers, basisPoints); } /** * @dev See {ICreatorCore-getRoyalties}. */ function getRoyalties(uint256 tokenId) external view virtual override returns (address payable[] memory, uint256[] memory) { require(_exists(tokenId), "Nonexistent token"); return _getRoyalties(tokenId); } /** * @dev See {ICreatorCore-getFees}. */ function getFees(uint256 tokenId) external view virtual override returns (address payable[] memory, uint256[] memory) { require(_exists(tokenId), "Nonexistent token"); return _getRoyalties(tokenId); } /** * @dev See {ICreatorCore-getFeeRecipients}. */ function getFeeRecipients(uint256 tokenId) external view virtual override returns (address payable[] memory) { require(_exists(tokenId), "Nonexistent token"); return _getRoyaltyReceivers(tokenId); } /** * @dev See {ICreatorCore-getFeeBps}. */ function getFeeBps(uint256 tokenId) external view virtual override returns (uint[] memory) { require(_exists(tokenId), "Nonexistent token"); return _getRoyaltyBPS(tokenId); } /** * @dev See {ICreatorCore-royaltyInfo}. */ function royaltyInfo(uint256 tokenId, uint256 value) external view virtual override returns (address, uint256) { require(_exists(tokenId), "Nonexistent token"); return _getRoyaltyInfo(tokenId, value); } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "Nonexistent token"); return _tokenURI(tokenId); } /** * @dev See {ICreatorCore-setApproveTransfer}. */ function setApproveTransfer(address extension) external override adminRequired { _setApproveTransferBase(extension); } function _tokenExtension(uint256 tokenId) internal view override returns(address) { uint16 extensionIndex = uint16(_tokenData[tokenId].data); if (extensionIndex == 0) return address(0); return _indexToExtension[extensionIndex]; } /** * @dev See {IERC721CreatorCore-tokenData}. */ function tokenData(uint256 tokenId) external view returns (uint80) { return uint80(_tokenData[tokenId].data >> 16); } } /// @author: manifold.xyz /// @author: manifold.xyz /** * @dev Core ERC721 creator interface (with enumerable api's) */ interface IERC721CreatorCoreEnumerable is IERC721CreatorCore { /* * @dev gets the total number of tokens created by the extension (unburned) */ function totalSupplyExtension(address extension) external view returns (uint256); /* * @dev gets tokenId of an extension by index. * Iterate over this to get the full list of tokens of a given extension */ function tokenByIndexExtension(address extension, uint256 index) external view returns (uint256); /* * @dev get balance of owner for an extension */ function balanceOfExtension(address extension, address owner) external view returns (uint256 balance); /* * @dev Returns a token ID owned by `owner` at a given `index` of its token list for a given extension */ function tokenOfOwnerByIndexExtension(address extension, address owner, uint256 index) external view returns (uint256 tokenId); /* * @dev gets the total number of tokens created with no extension */ function totalSupplyBase() external view returns (uint256); /* * @dev gets tokenId of the root creator contract by index. * Iterate over this to get the full list of tokens with no extension. */ function tokenByIndexBase(uint256 index) external view returns (uint256); /* * @dev get balance of owner for tokens with no extension */ function balanceOfBase(address owner) external view returns (uint256 balance); /* * @dev Returns a token ID owned by `owner` at a given `index` of its token list for tokens with no extension */ function tokenOfOwnerByIndexBase(address owner, uint256 index) external view returns (uint256 tokenId); } /** * @dev Core ERC721 creator implementation (with enumerable api's) */ abstract contract ERC721CreatorCoreEnumerable is ERC721CreatorCore, IERC721CreatorCoreEnumerable { // For enumerating tokens for a given extension mapping (address => uint256) private _extensionBalances; mapping (address => mapping(uint256 => uint256)) private _extensionTokens; mapping (uint256 => uint256) private _extensionTokensIndex; // For enumerating an extension's tokens for an owner mapping (address => mapping(address => uint256)) private _extensionBalancesByOwner; mapping (address => mapping(address => mapping(uint256 => uint256))) private _extensionTokensByOwner; mapping (uint256 => uint256) private _extensionTokensIndexByOwner; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721CreatorCore, IERC165) returns (bool) { return interfaceId == type(IERC721CreatorCoreEnumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721CreatorCoreEnumerable-totalSupplyExtension}. */ function totalSupplyExtension(address extension) public view virtual override returns (uint256) { requireNonBlacklist(extension); return _extensionBalances[extension]; } /** * @dev See {IERC721CreatorCoreEnumerable-tokenByIndexExtension}. */ function tokenByIndexExtension(address extension, uint256 index) external view virtual override returns (uint256) { requireNonBlacklist(extension); require(index < totalSupplyExtension(extension), "ERC721Creator: Index out of bounds"); return _extensionTokens[extension][index]; } /** * @dev See {IERC721CreatorCoreEnumerable-balanceOfExtension}. */ function balanceOfExtension(address extension, address owner) public view virtual override returns (uint256) { requireNonBlacklist(extension); return _extensionBalancesByOwner[extension][owner]; } /* * @dev See {IERC721CreatorCoreEnumerable-tokenOfOwnerByIndexExtension}. */ function tokenOfOwnerByIndexExtension(address extension, address owner, uint256 index) external view virtual override returns (uint256) { requireNonBlacklist(extension); require(index < balanceOfExtension(extension, owner), "ERC721Creator: Index out of bounds"); return _extensionTokensByOwner[extension][owner][index]; } /** * @dev See {IERC721CreatorCoreEnumerable-totalSupplyBase}. */ function totalSupplyBase() public view virtual override returns (uint256) { return _extensionBalances[address(0)]; } /** * @dev See {IERC721CreatorCoreEnumerable-tokenByIndexBase}. */ function tokenByIndexBase(uint256 index) external view virtual override returns (uint256) { require(index < totalSupplyBase(), "ERC721Creator: Index out of bounds"); return _extensionTokens[address(0)][index]; } /** * @dev See {IERC721CreatorCoreEnumerable-balanceOfBase}. */ function balanceOfBase(address owner) public view virtual override returns (uint256) { return _extensionBalancesByOwner[address(0)][owner]; } /* * @dev See {IERC721CreatorCoreEnumerable-tokenOfOwnerByIndexBase}. */ function tokenOfOwnerByIndexBase(address owner, uint256 index) external view virtual override returns (uint256) { require(index < balanceOfBase(owner), "ERC721Creator: Index out of bounds"); return _extensionTokensByOwner[address(0)][owner][index]; } function _addTokenToOwnerEnumeration(address to, uint256 tokenId, address tokenExtension_) private { // Add to extension token tracking by owner uint256 lengthByOwner = balanceOfExtension(tokenExtension_, to); _extensionTokensByOwner[tokenExtension_][to][lengthByOwner] = tokenId; _extensionTokensIndexByOwner[tokenId] = lengthByOwner; _extensionBalancesByOwner[tokenExtension_][to] += 1; } function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId, address tokenExtension_) 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 lastTokenIndexByOwner = balanceOfExtension(tokenExtension_, from) - 1; uint256 tokenIndexByOwner = _extensionTokensIndexByOwner[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndexByOwner != lastTokenIndexByOwner) { uint256 lastTokenIdByOwner = _extensionTokensByOwner[tokenExtension_][from][lastTokenIndexByOwner]; _extensionTokensByOwner[tokenExtension_][from][tokenIndexByOwner] = lastTokenIdByOwner; // Move the last token to the slot of the to-delete token _extensionTokensIndexByOwner[lastTokenIdByOwner] = tokenIndexByOwner; // Update the moved token's index } _extensionBalancesByOwner[tokenExtension_][from] -= 1; // This also deletes the contents at the last position of the array delete _extensionTokensIndexByOwner[tokenId]; delete _extensionTokensByOwner[tokenExtension_][from][lastTokenIndexByOwner]; } function _beforeTokenTransfer(address from, address to, uint256 tokenId, uint96 data) internal virtual { if (from != address(0) && to != address(0) && from != to) { address tokenExtension_ = _indexToExtension[uint16(data)]; _removeTokenFromOwnerEnumeration(from, tokenId, tokenExtension_); _addTokenToOwnerEnumeration(to, tokenId, tokenExtension_); } } function _preMintBase(address to, uint256 tokenId) internal virtual override { // Add to extension token tracking uint256 length = totalSupplyBase(); _extensionTokens[address(0)][length] = tokenId; _extensionTokensIndex[tokenId] = length; ++_extensionBalances[address(0)]; _addTokenToOwnerEnumeration(to, tokenId, address(0)); } function _preMintExtension(address to, uint256 tokenId) internal virtual override { // Add to extension token tracking uint256 length = totalSupplyExtension(msg.sender); _extensionTokens[msg.sender][length] = tokenId; _extensionTokensIndex[tokenId] = length; ++_extensionBalances[msg.sender]; _addTokenToOwnerEnumeration(to, tokenId, msg.sender); } function _postBurn(address owner, uint256 tokenId, address extension) internal override(ERC721CreatorCore) virtual { /************************************************* * START: Remove from extension token tracking *************************************************/ uint256 lastTokenIndex = totalSupplyExtension(extension) - 1; uint256 tokenIndex = _extensionTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _extensionTokens[extension][lastTokenIndex]; _extensionTokens[extension][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _extensionTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } _extensionBalances[extension] -= 1; // This also deletes the contents at the last position of the array delete _extensionTokensIndex[tokenId]; delete _extensionTokens[extension][lastTokenIndex]; /************************************************* * END *************************************************/ /******************************************************** * START: Remove from extension token tracking by owner ********************************************************/ _removeTokenFromOwnerEnumeration(owner, tokenId, extension); /******************************************************** * END ********************************************************/ ERC721CreatorCore._postBurn(owner, tokenId, extension); } } // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.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); } /** * @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 ERC721Base, 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, ERC721Core) 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 < ERC721Core.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, uint96 tokenData ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId, tokenData); 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 = ERC721Core.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 = ERC721Core.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(); } } /** * @dev ERC721Creator implementation (with enumerable api's) */ contract ERC721CreatorEnumerable is ERC721Creator, ERC721CreatorCoreEnumerable, ERC721Enumerable { constructor (string memory _name, string memory _symbol) ERC721Creator(_name, _symbol) { } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721Creator, ERC721CreatorCoreEnumerable, ERC721Enumerable) returns (bool) { return interfaceId == type(IERC721CreatorCoreEnumerable).interfaceId || ERC721Creator.supportsInterface(interfaceId) || ERC721Enumerable.supportsInterface(interfaceId); } function _beforeTokenTransfer(address from, address to, uint256 tokenId, uint96 data) internal virtual override(ERC721Enumerable, ERC721Creator, ERC721CreatorCoreEnumerable) { _approveTransfer(from, to, tokenId, uint16(data)); ERC721Enumerable._beforeTokenTransfer(from, to, tokenId, data); } function _preMintBase(address to, uint256 tokenId) internal virtual override(ERC721CreatorCore, ERC721CreatorCoreEnumerable) { ERC721CreatorCoreEnumerable._preMintBase(to, tokenId); } function _preMintExtension(address to, uint256 tokenId) internal virtual override(ERC721CreatorCore, ERC721CreatorCoreEnumerable) { ERC721CreatorCoreEnumerable._preMintExtension(to, tokenId); } function _postBurn(address owner, uint256 tokenId, address extension) internal virtual override(ERC721CreatorCore, ERC721CreatorCoreEnumerable) { ERC721CreatorCoreEnumerable._postBurn(owner, tokenId, extension); } function tokenURI(uint256 tokenId) public view virtual override(ERC721Creator, IERC721Metadata) returns (string memory) { return ERC721Creator.tokenURI(tokenId); } } contract ERC721CreatorMaxMint is ERC721CreatorEnumerable { uint256 private constant maxSupply = 200; constructor(string memory _name, string memory _symbol) ERC721CreatorEnumerable(_name, _symbol) {} function _beforeTokenTransfer(address from, address to, uint256 tokenId, uint96 data) internal virtual override { if (from == address(0)) { require(msg.sender != owner(), "ERC721CreatorAuction: owner cannot mint"); require(totalSupply() < maxSupply, "ERC721CreatorAuction: Max supply reached"); } super._beforeTokenTransfer(from, to, tokenId, data); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"AdminApproved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"AdminRevoked","type":"event"},{"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":false,"internalType":"address","name":"extension","type":"address"}],"name":"ApproveTransferUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address payable[]","name":"receivers","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"basisPoints","type":"uint256[]"}],"name":"DefaultRoyaltiesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"extension","type":"address"},{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"ExtensionApproveTransferUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"extension","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"ExtensionBlacklisted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"extension","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"ExtensionRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"extension","type":"address"},{"indexed":false,"internalType":"address payable[]","name":"receivers","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"basisPoints","type":"uint256[]"}],"name":"ExtensionRoyaltiesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"extension","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"ExtensionUnregistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"extension","type":"address"},{"indexed":true,"internalType":"address","name":"permissions","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"MintPermissionsUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"address payable[]","name":"receivers","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"basisPoints","type":"uint256[]"}],"name":"RoyaltiesUpdated","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":"VERSION","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":"admin","type":"address"}],"name":"approveAdmin","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":"address","name":"owner","type":"address"}],"name":"balanceOfBase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"extension","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOfExtension","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"extension","type":"address"}],"name":"blacklistExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getAdmins","outputs":[{"internalType":"address[]","name":"admins","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getApproveTransfer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getExtensions","outputs":[{"internalType":"address[]","name":"extensions","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getFeeBps","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getFeeRecipients","outputs":[{"internalType":"address payable[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getFees","outputs":[{"internalType":"address payable[]","name":"","type":"address[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getRoyalties","outputs":[{"internalType":"address payable[]","name":"","type":"address[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"name":"isAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"mintBase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"string","name":"uri","type":"string"}],"name":"mintBase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"string[]","name":"uris","type":"string[]"}],"name":"mintBaseBatch","outputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint16","name":"count","type":"uint16"}],"name":"mintBaseBatch","outputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"mintExtension","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint80","name":"data","type":"uint80"}],"name":"mintExtension","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"string","name":"uri","type":"string"}],"name":"mintExtension","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"string[]","name":"uris","type":"string[]"}],"name":"mintExtensionBatch","outputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint80[]","name":"data","type":"uint80[]"}],"name":"mintExtensionBatch","outputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint16","name":"count","type":"uint16"}],"name":"mintExtensionBatch","outputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"extension","type":"address"},{"internalType":"string","name":"baseURI","type":"string"}],"name":"registerExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"extension","type":"address"},{"internalType":"string","name":"baseURI","type":"string"},{"internalType":"bool","name":"baseURIIdentical","type":"bool"}],"name":"registerExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"admin","type":"address"}],"name":"revokeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"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":"extension","type":"address"}],"name":"setApproveTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setApproveTransferExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseTokenURIExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"},{"internalType":"bool","name":"identical","type":"bool"}],"name":"setBaseTokenURIExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"extension","type":"address"},{"internalType":"address","name":"permissions","type":"address"}],"name":"setMintPermissions","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address payable[]","name":"receivers","type":"address[]"},{"internalType":"uint256[]","name":"basisPoints","type":"uint256[]"}],"name":"setRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable[]","name":"receivers","type":"address[]"},{"internalType":"uint256[]","name":"basisPoints","type":"uint256[]"}],"name":"setRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"extension","type":"address"},{"internalType":"address payable[]","name":"receivers","type":"address[]"},{"internalType":"uint256[]","name":"basisPoints","type":"uint256[]"}],"name":"setRoyaltiesExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"uri","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"string[]","name":"uris","type":"string[]"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"string[]","name":"uris","type":"string[]"}],"name":"setTokenURIExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"uri","type":"string"}],"name":"setTokenURIExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"prefix","type":"string"}],"name":"setTokenURIPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"prefix","type":"string"}],"name":"setTokenURIPrefixExtension","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":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndexBase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"extension","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndexExtension","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenData","outputs":[{"internalType":"uint80","name":"","type":"uint80"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenExtension","outputs":[{"internalType":"address","name":"extension","type":"address"}],"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":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndexBase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"extension","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndexExtension","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupplyBase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"extension","type":"address"}],"name":"totalSupplyExtension","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"extension","type":"address"}],"name":"unregisterExtension","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526000600a553480156200001657600080fd5b50604051620063263803806200632683398101604081905262000039916200018f565b8181818181816200004a336200007a565b6001805560046200005c838262000288565b5060056200006b828262000288565b50505050505050505062000354565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b634e487b7160e01b600052604160045260246000fd5b600082601f830112620000f257600080fd5b81516001600160401b03808211156200010f576200010f620000ca565b604051601f8301601f19908116603f011681019082821181831017156200013a576200013a620000ca565b816040528381526020925086838588010111156200015757600080fd5b600091505b838210156200017b57858201830151818301840152908201906200015c565b600093810190920192909252949350505050565b60008060408385031215620001a357600080fd5b82516001600160401b0380821115620001bb57600080fd5b620001c986838701620000e0565b93506020850151915080821115620001e057600080fd5b50620001ef85828601620000e0565b9150509250929050565b600181811c908216806200020e57607f821691505b6020821081036200022f57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200028357600081815260208120601f850160051c810160208610156200025e5750805b601f850160051c820191505b818110156200027f578281556001016200026a565b5050505b505050565b81516001600160401b03811115620002a457620002a4620000ca565b620002bc81620002b58454620001f9565b8462000235565b602080601f831160018114620002f45760008415620002db5750858301515b600019600386901b1c1916600185901b1785556200027f565b600085815260208120601f198616915b82811015620003255788860151825594840194600190910190840162000304565b5085821015620003445787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b615fc280620003646000396000f3fe608060405234801561001057600080fd5b506004361061041d5760003560e01c80636352211e1161022b578063b0fe87c911610130578063d5a06d4c116100b8578063e985e9c511610087578063e985e9c5146109a8578063f0cdc499146109bb578063f2fde38b146109ce578063fe2e1f58146109e1578063ffa1ad74146109f457600080fd5b8063d5a06d4c14610902578063dfa2be341461096f578063e00aab4b14610982578063e92a89f61461099557600080fd5b8063bb3bafd6116100ff578063bb3bafd614610902578063c87b56dd14610923578063ce8aee9d14610936578063d29c2cdc14610949578063d39737191461095c57600080fd5b8063b0fe87c91461086b578063b4b5b48f1461087e578063b88d4fde146108cf578063b9c4d9fb146108e257600080fd5b806382dcc0c8116101b357806399e0dd7c1161018257806399e0dd7c1461080c578063a22cb4651461081f578063aafb2d4414610832578063ac0c8cfa14610845578063ad2d0ddd1461085857600080fd5b806382dcc0c8146107d857806383b7db63146107eb5780638da5cb5b146107f357806395d89b411461080457600080fd5b806370a08231116101fa57806370a0823114610784578063715018a61461079757806372ff03d31461079f5780637884af44146107b25780637aa15f16146107c557600080fd5b80636352211e1461073857806366d1e9d01461074b5780636bede91f1461075e5780636d73e6691461077157600080fd5b80632928ca58116103315780633e6134b8116102b957806342966c681161028857806342966c68146106d95780634f6ccce7146106ec578063596798ad146106ff57806361e5bc6b1461071257806361ffad5b1461072557600080fd5b80633e6134b81461068d5780633f0f37f6146106a05780634278330e146106b357806342842e0e146106c657600080fd5b806330176e131161030057806330176e131461062c5780633071a0f91461063f57806331ae450b14610652578063332dd1ae1461066757806338e52e781461067a57600080fd5b80632928ca58146105c15780632a55205a146105d45780632d345670146106065780632f745c591461061957600080fd5b80630ebd4c7f116103b457806322f374d01161038357806322f374d014610547578063239be3171461055857806323b872dd1461056b57806324d7806c1461057e578063278cc7a01461059157600080fd5b80630ebd4c7f146104f9578063162094c41461051957806318160ddd1461052c57806320e4afe21461053457600080fd5b8063075ee464116103f0578063075ee46414610495578063081812fc146104a8578063095ea7b3146104d35780630c8066bc146104e657600080fd5b806301ffc9a71461042257806302e7afb71461044a57806305e6b09b1461045f57806306fdde0314610480575b600080fd5b610435610430366004614f3b565b6109fc565b60405190151581526020015b60405180910390f35b61045d610458366004614f6d565b610a36565b005b61047261046d366004614f6d565b610a95565b604051908152602001610441565b610488610abc565b6040516104419190614fda565b6104726104a3366004614fed565b610b4e565b6104bb6104b6366004615026565b610b85565b6040516001600160a01b039091168152602001610441565b61045d6104e136600461503f565b610bac565b6104726104f4366004614f6d565b610cc1565b61050c610507366004615026565b610cfb565b60405161044191906150a6565b61045d6105273660046150fa565b610d2b565b602354610472565b61045d610542366004615189565b610d80565b600b546001600160a01b03166104bb565b6104bb610566366004615026565b610e03565b61045d610579366004615202565b610eb1565b61043561058c366004614f6d565b610ee2565b60008052601b6020527f584f46c60af19681376031579adb04a2416e54ee5505351c2a8435e3766026ea54610472565b6104726105cf366004614f6d565b610f1b565b6105e76105e2366004615243565b610f54565b604080516001600160a01b039093168352602083019190915201610441565b61045d610614366004614f6d565b610f92565b61047261062736600461503f565b610fef565b61045d61063a366004615265565b611085565b61045d61064d3660046152a6565b6110d9565b61065a611139565b60405161044191906152e1565b61045d61067536600461532e565b6111e7565b61050c610688366004615399565b611245565b61045d61069b366004615265565b611378565b61045d6106ae3660046153ee565b61138c565b61050c6106c1366004615399565b6113eb565b61045d6106d4366004615202565b6114e4565b61045d6106e7366004615026565b6114ff565b6104726106fa366004615026565b611596565b61045d61070d366004614f6d565b611629565b61045d61072036600461532e565b61167c565b61047261073336600461503f565b6116fb565b6104bb610746366004615026565b611756565b61045d610759366004615265565b6117b6565b61047261076c36600461503f565b6117c8565b61045d61077f366004614f6d565b611839565b610472610792366004614f6d565b611891565b61045d611917565b6104726107ad366004614f6d565b61192b565b6104726107c03660046152a6565b61199a565b61050c6107d3366004615399565b611a39565b61045d6107e6366004615455565b611b9d565b61065a611bb0565b6000546001600160a01b03166104bb565b610488611c50565b61045d61081a366004615265565b611c5f565b61045d61082d3660046154ab565b611cb3565b61045d61084036600461532e565b611cbe565b61045d6108533660046154d9565b611d7f565b61050c6108663660046154f6565b611d91565b61045d61087936600461552b565b611ebb565b6108b461088c366004615026565b600090815260066020526040902054600160a01b900460101c69ffffffffffffffffffff1690565b60405169ffffffffffffffffffff9091168152602001610441565b61045d6108dd3660046155d7565b611f12565b6108f56108f0366004615026565b611f44565b60405161044191906156be565b610915610910366004615026565b611f74565b6040516104419291906156d1565b610488610931366004615026565b611fae565b61045d610944366004614f6d565b611fb9565b610472610957366004615026565b61200c565b61047261096a366004615719565b612088565b61047261097d366004615202565b6120c1565b61050c6109903660046154f6565b612127565b61045d6109a33660046150fa565b612206565b6104356109b6366004614fed565b612219565b61045d6109c9366004614fed565b612247565b61045d6109dc366004614f6d565b61229b565b6104726109ef3660046152a6565b612311565b610472600381565b60006001600160e01b03198216632e98234f60e01b1480610a215750610a2182612365565b80610a305750610a308261238e565b92915050565b33610a496000546001600160a01b031690565b6001600160a01b03161480610a645750610a646002336123b3565b610a895760405162461bcd60e51b8152600401610a809061574e565b60405180910390fd5b610a92816123d5565b50565b6000610aa0826124e5565b506001600160a01b03166000908152601b602052604090205490565b606060048054610acb90615792565b80601f0160208091040260200160405190810160405280929190818152602001828054610af790615792565b8015610b445780601f10610b1957610100808354040283529160200191610b44565b820191906000526020600020905b815481529060010190602001808311610b2757829003601f168201915b5050505050905090565b6000610b59836124e5565b506001600160a01b039182166000908152601e6020908152604080832093909416825291909152205490565b6000610b908261250d565b506000908152600860205260409020546001600160a01b031690565b6000610bb782611756565b9050806001600160a01b0316836001600160a01b031603610c245760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610a80565b336001600160a01b0382161480610c405750610c408133612219565b610cb25760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610a80565b610cbc838361255d565b505050565b6001600160a01b031660009081527f65ce8396b736f5da9d881cc6fbcb11ef9721292dc41ec8c40879fd9edea5744d602052604090205490565b6060610d06826125cb565b610d225760405162461bcd60e51b8152600401610a80906157c6565b610a30826125e8565b33610d3e6000546001600160a01b031690565b6001600160a01b03161480610d595750610d596002336123b3565b610d755760405162461bcd60e51b8152600401610a809061574e565b610cbc8383836125f3565b33610d936000546001600160a01b031690565b6001600160a01b03161480610dae5750610dae6002336123b3565b610dca5760405162461bcd60e51b8152600401610a809061574e565b610dd3856125cb565b610def5760405162461bcd60e51b8152600401610a80906157c6565b610dfc8585858585612677565b5050505050565b6000610e0e826125cb565b610e2a5760405162461bcd60e51b8152600401610a80906157c6565b610e33826126fe565b90506001600160a01b038116610e845760405162461bcd60e51b815260206004820152601660248201527527379032bc3a32b739b4b7b7103337b9103a37b5b2b760511b6044820152606401610a80565b610e8f600e826123b3565b15610eac5760405162461bcd60e51b8152600401610a80906157f1565b919050565b610ebb3382612754565b610ed75760405162461bcd60e51b8152600401610a8090615820565b610cbc8383836127b3565b6000816001600160a01b0316610f006000546001600160a01b031690565b6001600160a01b03161480610a305750610a306002836123b3565b6000610f25612952565b610f2d6129ab565b610f498260405180602001604052806000815250600080612a02565b9050610eac60018055565b600080610f60846125cb565b610f7c5760405162461bcd60e51b8152600401610a80906157c6565b610f868484612a95565b915091505b9250929050565b610f9a612b6c565b610fa56002826123b3565b15610a925760405133906001600160a01b038316907f7c0c3c84c67c85fcac635147348bfe374c24a1a93d0366d1cfe9d8853cbf89d590600090a3610feb600282612bc6565b5050565b6000610ffa83611891565b821061105c5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610a80565b506001600160a01b03919091166000908152602160209081526040808320938352929052205490565b336110986000546001600160a01b031690565b6001600160a01b031614806110b357506110b36002336123b3565b6110cf5760405162461bcd60e51b8152600401610a809061574e565b610feb8282612bdb565b336110ec6000546001600160a01b031690565b6001600160a01b0316148061110757506111076002336123b3565b6111235760405162461bcd60e51b8152600401610a809061574e565b61112c836124e5565b610cbc8383836000612c10565b60606111456002612d0d565b6001600160401b0381111561115c5761115c61556a565b604051908082528060200260200182016040528015611185578160200160208202803683370190505b50905060005b6111956002612d0d565b8110156111e3576111a7600282612d17565b8282815181106111b9576111b961586d565b6001600160a01b0390921660209283029190910190910152806111db81615899565b91505061118b565b5090565b336111fa6000546001600160a01b031690565b6001600160a01b0316148061121557506112156002336123b3565b6112315760405162461bcd60e51b8152600401610a809061574e565b61123f600085858585612d23565b50505050565b606061124f612952565b6112576129ab565b816001600160401b0381111561126f5761126f61556a565b604051908082528060200260200182016040528015611298578160200160208202803683370190505b5090506000600a5460016112ac91906158b2565b905083839050600a60008282546112c391906158b2565b90915550600090505b8381101561136657611341868686848181106112ea576112ea61586d565b90506020028101906112fc91906158c5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250925061133c9150869050876158b2565b612a02565b8382815181106113535761135361586d565b60209081029190910101526001016112cc565b505061137160018055565b9392505050565b6113806129ab565b610feb82826000612e10565b3361139f6000546001600160a01b031690565b6001600160a01b031614806113ba57506113ba6002336123b3565b6113d65760405162461bcd60e51b8152600401610a809061574e565b6113df846124e5565b61123f84848484612c10565b60606113f5612952565b6113fd6129ab565b816001600160401b038111156114155761141561556a565b60405190808252806020026020018201604052801561143e578160200160208202803683370190505b5090506000600a54600161145291906158b2565b905083839050600a600082825461146991906158b2565b90915550600090505b83811015611366576114bf86604051806020016040528060008152508787858181106114a0576114a061586d565b90506020020160208101906114b5919061590b565b61133c85876158b2565b8382815181106114d1576114d161586d565b6020908102919091010152600101611472565b610cbc83838360405180602001604052806000815250611f12565b611507612952565b6115113382612754565b61155d5760405162461bcd60e51b815260206004820152601f60248201527f43616c6c6572206973206e6f74206f776e6572206f7220617070726f766564006044820152606401610a80565b600061156882611756565b90506000611575836126fe565b905061158083612e4d565b61158b828483612f07565b5050610a9260018055565b60006115a160235490565b82106116045760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610a80565b602382815481106116175761161761586d565b90600052602060002001549050919050565b3361163c6000546001600160a01b031690565b6001600160a01b0316148061165757506116576002336123b3565b6116735760405162461bcd60e51b8152600401610a809061574e565b610a9281612f12565b6116846129ab565b8281146116a35760405162461bcd60e51b8152600401610a8090615926565b60005b83811015610dfc576116f38585838181106116c3576116c361586d565b905060200201358484848181106116dc576116dc61586d565b90506020028101906116ee91906158c5565b612f66565b6001016116a6565b6000611706836124e5565b61170f83610a95565b821061172d5760405162461bcd60e51b8152600401610a809061594d565b506001600160a01b03919091166000908152601c60209081526040808320938352929052205490565b6000818152600660205260408120546001600160a01b031680610a305760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610a80565b6117be6129ab565b610feb8282612f70565b60006117d383610cc1565b82106117f15760405162461bcd60e51b8152600401610a809061594d565b506001600160a01b039190911660009081527f8c60882dec3cf54096060609fdd16c336781b436ca34f3f27a220dfcfa1d485560209081526040808320938352929052205490565b611841612b6c565b61184c6002826123b3565b610a925760405133906001600160a01b038316907f7e1a1a08d52e4ba0e21554733d66165fd5151f99460116223d9e3a608eec5cb190600090a3610feb600282612f8a565b60006001600160a01b0382166118fb5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610a80565b506001600160a01b031660009081526007602052604090205490565b61191f612b6c565b6119296000612f9f565b565b6000611935612952565b336119486000546001600160a01b031690565b6001600160a01b0316148061196357506119636002336123b3565b61197f5760405162461bcd60e51b8152600401610a809061574e565b610f4982604051806020016040528060008152506000612fef565b60006119a4612952565b336119b76000546001600160a01b031690565b6001600160a01b031614806119d257506119d26002336123b3565b6119ee5760405162461bcd60e51b8152600401610a809061574e565b611a2e8484848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052509250612fef915050565b905061137160018055565b6060611a43612952565b33611a566000546001600160a01b031690565b6001600160a01b03161480611a715750611a716002336123b3565b611a8d5760405162461bcd60e51b8152600401610a809061574e565b816001600160401b03811115611aa557611aa561556a565b604051908082528060200260200182016040528015611ace578160200160208202803683370190505b5090506000600a546001611ae291906158b2565b905083839050600a6000828254611af991906158b2565b90915550600090505b8381101561136657611b7886868684818110611b2057611b2061586d565b9050602002810190611b3291906158c5565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611b7392508691508790506158b2565b612fef565b838281518110611b8a57611b8a61586d565b6020908102919091010152600101611b02565b611ba56129ab565b610cbc838383612e10565b6060611bbc600c612d0d565b6001600160401b03811115611bd357611bd361556a565b604051908082528060200260200182016040528015611bfc578160200160208202803683370190505b50905060005b611c0c600c612d0d565b8110156111e357611c1e600c82612d17565b828281518110611c3057611c3061586d565b6001600160a01b0390921660209283029190910190910152600101611c02565b606060058054610acb90615792565b33611c726000546001600160a01b031690565b6001600160a01b03161480611c8d5750611c8d6002336123b3565b611ca95760405162461bcd60e51b8152600401610a809061574e565b610feb8282613050565b610feb338383613085565b33611cd16000546001600160a01b031690565b6001600160a01b03161480611cec5750611cec6002336123b3565b611d085760405162461bcd60e51b8152600401610a809061574e565b828114611d275760405162461bcd60e51b8152600401610a8090615926565b60005b83811015610dfc57611d77858583818110611d4757611d4761586d565b90506020020135848484818110611d6057611d6061586d565b9050602002810190611d7291906158c5565b6125f3565b600101611d2a565b611d876129ab565b610a923382613153565b6060611d9b612952565b33611dae6000546001600160a01b031690565b6001600160a01b03161480611dc95750611dc96002336123b3565b611de55760405162461bcd60e51b8152600401610a809061574e565b8161ffff166001600160401b03811115611e0157611e0161556a565b604051908082528060200260200182016040528015611e2a578160200160208202803683370190505b5090506000600a546001611e3e91906158b2565b90508261ffff16600a6000828254611e5691906158b2565b90915550600090505b8361ffff16811015611eb057611e8b85604051806020016040528060008152508385611b7391906158b2565b838281518110611e9d57611e9d61586d565b6020908102919091010152600101611e5f565b5050610a3060018055565b33611ece6000546001600160a01b031690565b6001600160a01b03161480611ee95750611ee96002336123b3565b611f055760405162461bcd60e51b8152600401610a809061574e565b610dfc8585858585612d23565b611f1c3383612754565b611f385760405162461bcd60e51b8152600401610a8090615820565b61123f848484846131c8565b6060611f4f826125cb565b611f6b5760405162461bcd60e51b8152600401610a80906157c6565b610a30826131fb565b606080611f80836125cb565b611f9c5760405162461bcd60e51b8152600401610a80906157c6565b611fa583613202565b91509150915091565b6060610a30826135b0565b33611fcc6000546001600160a01b031690565b6001600160a01b03161480611fe75750611fe76002336123b3565b6120035760405162461bcd60e51b8152600401610a809061574e565b610a92816135e0565b6000808052601b6020527f584f46c60af19681376031579adb04a2416e54ee5505351c2a8435e3766026ea5482106120565760405162461bcd60e51b8152600401610a809061594d565b5060009081527fb9c6de81004e18dedadca3e5eabaab449ca91dff6f58efc9461da635fe77f849602052604090205490565b6000612092612952565b61209a6129ab565b6120b68360405180602001604052806000815250846000612a02565b9050610a3060018055565b60006120cc846124e5565b6120d68484610b4e565b82106120f45760405162461bcd60e51b8152600401610a809061594d565b506001600160a01b039283166000908152601f602090815260408083209490951682529283528381209181529152205490565b6060612131612952565b6121396129ab565b8161ffff166001600160401b038111156121555761215561556a565b60405190808252806020026020018201604052801561217e578160200160208202803683370190505b5090506000600a54600161219291906158b2565b90508261ffff16600a60008282546121aa91906158b2565b90915550600090505b8361ffff16811015611eb0576121e185604051806020016040528060008152506000848661133c91906158b2565b8382815181106121f3576121f361586d565b60209081029190910101526001016121b3565b61220e6129ab565b610cbc838383612f66565b6001600160a01b03918216600090815260096020908152604080832093909416825291909152205460ff1690565b3361225a6000546001600160a01b031690565b6001600160a01b0316148061227557506122756002336123b3565b6122915760405162461bcd60e51b8152600401610a809061574e565b610feb8282613621565b6122a3612b6c565b6001600160a01b0381166123085760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a80565b610a9281612f9f565b600061231b612952565b6123236129ab565b611a2e8484848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052509250829150612a029050565b600061237082613756565b8061237f575061237f82613796565b80610a305750610a30826137d1565b60006001600160e01b0319821663780e9d6360e01b1480610a305750610a3082613806565b6001600160a01b03811660009081526001830160205260408120541515611371565b6001600160a01b038116158015906123f657506001600160a01b0381163014155b6124425760405162461bcd60e51b815260206004820152601960248201527f43616e6e6f7420626c61636b6c69737420796f757273656c66000000000000006044820152606401610a80565b61244d600c826123b3565b156124955760405133906001600160a01b038316907fd19cf84cf0fec6bec9ddfa29c63adf83a55707c712f32c8285d6180a7890147990600090a3612493600c82612bc6565b505b6124a0600e826123b3565b610a925760405133906001600160a01b038316907f05ac7bc5a606cd92a63365f9fda244499b9add0526b22d99937b6bd88181059c90600090a3610feb600e82612f8a565b6124f0600e826123b3565b15610a925760405162461bcd60e51b8152600401610a80906157f1565b612516816125cb565b610a925760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610a80565b600081815260086020526040902080546001600160a01b0319166001600160a01b038416908117909155819061259282611756565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000908152600660205260409020546001600160a01b0316151590565b606061137182613202565b6000831180156126055750600a548311155b801561262257506000612617846126fe565b6001600160a01b0316145b61265e5760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b2103a37b5b2b760991b6044820152606401610a80565b600083815260136020526040902061123f8284836159d5565b6126838484848461382b565b600085815260156020526040812061269a91614e99565b6126b984848484601560008b81526020019081526020016000206138d6565b847fabb46fe0761d77584bde75697647804ffd8113abd4d8d06bc664150395eccdee858585856040516126ef9493929190615a94565b60405180910390a25050505050565b600081815260066020526040812054600160a01b90046001600160601b0381169061ffff1682036127325750600092915050565b61ffff166000908152601a60205260409020546001600160a01b031692915050565b60008061276083611756565b9050806001600160a01b0316846001600160a01b0316148061278757506127878185612219565b806127ab5750836001600160a01b03166127a084610b85565b6001600160a01b0316145b949350505050565b6000818152600660209081526040918290208251808401909352546001600160a01b03808216808552600160a01b9092046001600160601b03169284019290925290851681146128535760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610a80565b6001600160a01b0384166128b55760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610a80565b60208201516128c686868684613991565b6128d160008561255d565b6001600160a01b038087166000818152600760209081526040808320805460001901905593891680835284832080546001019055888352600690915283822080546001600160a01b031916821790559251879392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a45b505050505050565b6002600154036129a45760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610a80565b6002600155565b6129b6600c336123b3565b6119295760405162461bcd60e51b815260206004820152601c60248201527f4d757374206265207265676973746572656420657874656e73696f6e000000006044820152606401610a80565b600081600003612a2557600a60008154612a1b90615899565b90915550600a5491505b612a2f8583613a7e565b612a398583613b12565b33600090815260196020526040902054612a6c908690849061ffff16601087901b69ffffffffffffffff00001617613b1c565b835115612a8d576000828152601360205260409020612a8b8582615b12565b505b509392505050565b600080600080612aa486613202565b91509150600182511115612afa5760405162461bcd60e51b815260206004820152601c60248201527f4d6f7265207468616e203120726f79616c7479207265636569766572000000006044820152606401610a80565b8151600003612b1157306000935093505050610f8b565b81600081518110612b2457612b2461586d565b60200260200101516127108683600081518110612b4357612b4361586d565b6020026020010151612b559190615bd1565b612b5f9190615bf0565b9350935050509250929050565b6000546001600160a01b031633146119295760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a80565b6000611371836001600160a01b038416613b37565b6000805260106020527f6e0956cda88cad152e89927e53611735b61a5c762d1428573c6931b0a5efcb01610cbc8284836159d5565b60185461ffff90811610612c5c5760405162461bcd60e51b8152602060048201526013602482015272546f6f206d616e7920657874656e73696f6e7360681b6044820152606401610a80565b6001600160a01b03841660009081526019602052604081205461ffff169003612d015760188054600090612c939061ffff16615c12565b82546101009290920a61ffff818102199093169183160217909155601880546001600160a01b0387166000818152601960209081526040808320805495881661ffff199096169590951790945593549094168452601a90925290912080546001600160a01b03191690911790555b61123f84848484613c2a565b6000610a30825490565b60006113718383613d17565b612d2f8484848461382b565b6001600160a01b0385166000908152601460205260408120612d5091614e99565b612d8184848484601460008b6001600160a01b03166001600160a01b031681526020019081526020016000206138d6565b6001600160a01b038516612dd1577f2b6849d5976d799a5b0ca4dfd6b40a3d7afe9ea72c091fa01a958594f9a2659b84848484604051612dc49493929190615a94565b60405180910390a1610dfc565b846001600160a01b03167f535a93d2cb000582c0ebeaa9be4890ec6a287f98eb2df00c54c300612fd78d8f858585856040516126ef9493929190615a94565b336000908152601060205260409020612e2a8385836159d5565b50336000908152601160205260409020805460ff19169115159190911790555050565b60008181526006602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b03169282018390529092909190612e9d9083908684613991565b612ea860008561255d565b6001600160a01b038216600081815260076020908152604080832080546000190190558783526006909152808220829055518692907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a461123f565b610cbc838383613d41565b600b80546001600160a01b0319166001600160a01b0383169081179091556040519081527f959c0e47a2fe3cf01e237ba4892e2cc3194d77cbfb33e434e40873225d6b595f9060200160405180910390a150565b33612617846126fe565b336000908152601260205260409020610cbc8284836159d5565b6000611371836001600160a01b038416613e1f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60008160000361301257600a6000815461300890615899565b90915550600a5491505b61301c8483613e6e565b61302884836000613b1c565b8251156130495760008281526013602052604090206130478482615b12565b505b5092915050565b6000805260126020527f7e7fa33969761a458e04f477e039a608702b4f924981d6653935a8319a08ad7b610cbc8284836159d5565b816001600160a01b0316836001600160a01b0316036130e65760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a80565b6001600160a01b03838116600081815260096020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b613164826345ffcdad60e01b613e78565b15610feb576001600160a01b038216600081815260166020908152604091829020805460ff191685151590811790915591519182527f072a7592283e2c2d1d56d21517ff6013325e0f55483f4828373ff4d98b0a1a36910160405180910390a25050565b6131d38484846127b3565b6131df84848484613e94565b61123f5760405162461bcd60e51b8152600401610a8090615c33565b6060613049825b606080600060156000858152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b8282101561328457600084815260209081902060408051808201909152908401546001600160a01b0381168252600160a01b900461ffff168183015282526001909201910161323a565b50505050905080516000036133d157600061329e856126fe565b90506001600160a01b038116156133cf576132c081634e53ee3d60e11b613e78565b1561334b57604051634e53ee3d60e11b8152306004820152602481018690526001600160a01b03821690639ca7dc7a90604401600060405180830381865afa158015613310573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526133389190810190615d0e565b815191955093501561334b575050915091565b6001600160a01b038116600090815260146020908152604080832080548251818502810185019093528083529193909284015b828210156133c857600084815260209081902060408051808201909152908401546001600160a01b0381168252600160a01b900461ffff168183015282526001909201910161337e565b5050505091505b505b8051600003613474576000808052601460209081527f4f26c3876aa9f4b92579780beea1161a61f87ebf1ec6ee865b299e447ecba99c8054604080518285028101850190915281815293919290919084015b8282101561346d57600084815260209081902060408051808201909152908401546001600160a01b0381168252600160a01b900461ffff1681830152825260019092019101613423565b5050505090505b8051156135aa5780516001600160401b038111156134945761349461556a565b6040519080825280602002602001820160405280156134bd578160200160208202803683370190505b50925080516001600160401b038111156134d9576134d961556a565b604051908082528060200260200182016040528015613502578160200160208202803683370190505b50915060005b81518110156135a8578181815181106135235761352361586d565b6020026020010151600001518482815181106135415761354161586d565b60200260200101906001600160a01b031690816001600160a01b0316815250508181815181106135735761357361586d565b60200260200101516020015161ffff168382815181106135955761359561586d565b6020908102919091010152600101613508565b505b50915091565b60606135bb826125cb565b6135d75760405162461bcd60e51b8152600401610a80906157c6565b610a3082613f92565b60405133906001600160a01b038316907fd19cf84cf0fec6bec9ddfa29c63adf83a55707c712f32c8285d6180a7890147990600090a3610feb600c82612bc6565b61362c600c836123b3565b6136785760405162461bcd60e51b815260206004820152601e60248201527f43726561746f72436f72653a20496e76616c696420657874656e73696f6e00006044820152606401610a80565b6001600160a01b038116158061369a575061369a81631e05385b60e31b613e78565b6136d85760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401610a80565b6001600160a01b03828116600090815260176020526040902054811690821614610feb576001600160a01b0382811660008181526017602052604080822080546001600160a01b031916948616948517905551339392917f6a835c4fcf7e0d398db3762332fdaa1471814ad39f1e2d6d0b3fdabf8efee3e091a45050565b60006001600160e01b0319821663b5d2729f60e01b148061378757506001600160e01b03198216639088c20760e01b145b80610a305750610a308261424e565b60006001600160e01b031982166380ac58cd60e01b148061237f57506001600160e01b03198216635b5e139f60e01b1480610a305750610a30825b60006001600160e01b03198216632a9f3abf60e11b1480610a3057506301ffc9a760e01b6001600160e01b0319831614610a30565b60006001600160e01b03198216632e98234f60e01b1480610a305750610a3082612365565b82811461384a5760405162461bcd60e51b8152600401610a8090615926565b6000805b82811015613884578383828181106138685761386861586d565b905060200201358261387a91906158b2565b915060010161384e565b506127108110610dfc5760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420746f74616c20726f79616c746965730000000000000000006044820152606401610a80565b60005b8281101561294a578160405180604001604052808888858181106138ff576138ff61586d565b90506020020160208101906139149190614f6d565b6001600160a01b031681526020018686858181106139345761393461586d565b61ffff602091820293909301358316909352508354600181810186556000958652948390208451910180549490930151909116600160a01b026001600160b01b03199093166001600160a01b0390911617919091179055016138d9565b6001600160a01b038416613a72576000546001600160a01b03163303613a095760405162461bcd60e51b815260206004820152602760248201527f45524337323143726561746f7241756374696f6e3a206f776e65722063616e6e6044820152661bdd081b5a5b9d60ca1b6064820152608401610a80565b60c8613a1460235490565b10613a725760405162461bcd60e51b815260206004820152602860248201527f45524337323143726561746f7241756374696f6e3a204d617820737570706c79604482015267081c995858da195960c21b6064820152608401610a80565b61123f848484846142ff565b336000908152601760205260409020546001600160a01b031615610feb573360008181526017602052604090819020549051631e05385b60e31b815260048101929092526001600160a01b03848116602484015260448301849052169063f029c2d890606401600060405180830381600087803b158015613afe57600080fd5b505af115801561294a573d6000803e3d6000fd5b610feb8282614317565b610cbc83838360405180602001604052806000815250614374565b60008181526001830160205260408120548015613c20576000613b5b600183615dd2565b8554909150600090613b6f90600190615dd2565b9050818114613bd4576000866000018281548110613b8f57613b8f61586d565b9060005260206000200154905080876000018481548110613bb257613bb261586d565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080613be557613be5615de5565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610a30565b6000915050610a30565b6001600160a01b0384163014801590613c4c57506001600160a01b0384163b15155b613c825760405162461bcd60e51b8152602060048201526007602482015266125b9d985b1a5960ca1b6044820152606401610a80565b60405133906001600160a01b038616907fd8cb8ba4086944eabf43c5535b7712015e4d4c714b24bf812c040ea5b7a3e42a90600090a36001600160a01b0384166000908152601060205260409020613cdb8385836159d5565b506001600160a01b0384166000908152601160205260409020805460ff1916821515179055613d0b600c85612f8a565b5061123f846001613153565b6000826000018281548110613d2e57613d2e61586d565b9060005260206000200154905092915050565b60006001613d4e83610a95565b613d589190615dd2565b6000848152601d6020526040902054909150808214613dab576001600160a01b0383166000908152601c602090815260408083208584528252808320548484528184208190558352601d90915290208190555b6001600160a01b0383166000908152601b60205260408120805460019290613dd4908490615dd2565b90915550506000848152601d602090815260408083208390556001600160a01b0386168352601c8252808320858452909152812055613e148585856144c3565b610dfc8585856145b1565b6000818152600183016020526040812054613e6657508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610a30565b506000610a30565b610feb8282614670565b6000613e83836146f7565b80156113715750611371838361472a565b60006001600160a01b0384163b15613f8a57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290613ed8903390899088908890600401615dfb565b6020604051808303816000875af1925050508015613f13575060408051601f3d908101601f19168201909252613f1091810190615e38565b60015b613f70573d808015613f41576040519150601f19603f3d011682016040523d82523d6000602084013e613f46565b606091505b508051600003613f685760405162461bcd60e51b8152600401610a8090615c33565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506127ab565b5060016127ab565b6060600082118015613fa65750600a548211155b613fe25760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b2103a37b5b2b760991b6044820152606401610a80565b6000613fed836126fe565b9050613ffa600e826123b3565b156140175760405162461bcd60e51b8152600401610a80906157f1565b6000838152601360205260409020805461403090615792565b15905061414a576001600160a01b0381166000908152601260205260409020805461405a90615792565b1590506140ab576001600160a01b038116600090815260126020908152604080832086845260138352928190209051614094939201615ec8565b604051602081830303815290604052915050919050565b600083815260136020526040902080546140c490615792565b80601f01602080910402602001604051908101604052809291908181526020018280546140f090615792565b801561413d5780601f106141125761010080835404028352916020019161413d565b820191906000526020600020905b81548152906001019060200180831161412057829003601f168201915b5050505050915050919050565b61415b8163e9dc637560e01b613e78565b156141d35760405163e9dc637560e01b8152306004820152602481018490526001600160a01b0382169063e9dc637590604401600060405180830381865afa1580156141ab573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526113719190810190615edd565b6001600160a01b03811660009081526011602052604090205460ff16614225576001600160a01b0381166000908152601060205260409020614214846147b3565b604051602001614094929190615f4a565b6001600160a01b038116600090815260106020526040902080546140c490615792565b50919050565b60006001600160e01b031982166314d9799760e21b148061427f57506001600160e01b031982166328f10a2160e01b145b8061428e575061428e82613796565b806142a957506001600160e01b03198216635d9dd7eb60e11b145b806142c457506001600160e01b03198216632dde656160e21b145b806142df57506001600160e01b031982166335681b5360e21b145b80610a3057506001600160e01b0319821663152a902d60e11b1492915050565b61430b84848484614845565b61123f84848484614880565b600061432233610a95565b336000818152601c602090815260408083208584528252808320879055868352601d8252808320859055928252601b905290812080549293509161436590615899565b90915550610cbc838333614949565b6001600160a01b0384166143ca5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610a80565b6143d3836125cb565b156144205760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a80565b61442d6000858585613991565b6001600160a01b03808516600081815260076020908152604080832080546001019055805180820182528481526001600160601b038089168285019081528a865260069094528285209151935116600160a01b02929095169190911790935591518592907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46131df6000858584613e94565b600060016144d18386610b4e565b6144db9190615dd2565b6000848152602080526040902054909150808214614535576001600160a01b038381166000908152601f60209081526040808320938916835292815282822085835281528282205484835283832081905582528052208190555b6001600160a01b038084166000908152601e60209081526040808320938916835292905290812080546001929061456d908490615dd2565b9091555050506000928352602080805260408085208590556001600160a01b039384168552601f825280852095909316845293845281832090835290925290812055565b6001600160a01b03811615614639576145d1816311686e4b60e21b613e78565b15614639576040516311686e4b60e21b81526001600160a01b038481166004830152602482018490528216906345a1b92c90604401600060405180830381600087803b15801561462057600080fd5b505af1158015614634573d6000803e3d6000fd5b505050505b6000828152601360205260409020805461465290615792565b159050610cbc576000828152601360205260408120610cbc91614eb7565b7f584f46c60af19681376031579adb04a2416e54ee5505351c2a8435e3766026ea805460008181527fb9c6de81004e18dedadca3e5eabaab449ca91dff6f58efc9461da635fe77f84960209081526040808320869055858352601d82528220839055818052601b905282549192916146e790615899565b90915550610cbc83836000614949565b600061470a826301ffc9a760e01b61472a565b8015610a305750614723826001600160e01b031961472a565b1592915050565b604080516001600160e01b03198316602480830191909152825180830390910181526044909101909152602080820180516001600160e01b03166301ffc9a760e01b178152825160009392849283928392918391908a617530fa92503d9150600051905082801561479c575060208210155b80156147a85750600081115b979650505050505050565b606060006147c0836149c8565b60010190506000816001600160401b038111156147df576147df61556a565b6040519080825280601f01601f191660200182016040528015614809576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a850494508461481357509392505050565b6001600160a01b0384161561123f5761ffff81166000908152601a602052604090205461123f908590859085906001600160a01b0316614aa0565b61488c84848484614c93565b6001600160a01b0384166148e7576148e282602380546000838152602460205260408120829055600182018355919091527fd57b2b5166478fd4318d2acc6cc2c704584312bdd8781b32d5d06abda57f42300155565b61490a565b826001600160a01b0316846001600160a01b03161461490a5761490a8483614d09565b6001600160a01b0383166149265761492182614da6565b61123f565b836001600160a01b0316836001600160a01b03161461123f5761123f8383614e55565b60006149558285610b4e565b6001600160a01b038084166000818152601f60209081526040808320948a168084529482528083208684528252808320899055888352818052808320869055928252601e815282822093825292909252812080549293506001929091906149bd9084906158b2565b909155505050505050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310614a075772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310614a33576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310614a5157662386f26fc10000830492506010015b6305f5e1008310614a69576305f5e100830492506008015b6127108310614a7d57612710830492506004015b60648310614a8f576064830492506002015b600a8310610a305760010192915050565b6001600160a01b0384161561123f576001600160a01b03811615801590614adf57506001600160a01b03811660009081526016602052604090205460ff165b15614bb157604051632f3537c560e11b81523360048201526001600160a01b038581166024830152848116604483015260648201849052821690635e6a6f8a906084016020604051808303816000875af1158015614b41573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614b659190615f6f565b6149215760405162461bcd60e51b815260206004820152601a60248201527f457874656e73696f6e20617070726f76616c206661696c7572650000000000006044820152606401610a80565b600b546001600160a01b03161561123f57600b54604051632f3537c560e11b81523360048201526001600160a01b03868116602483015285811660448301526064820185905290911690635e6a6f8a906084016020604051808303816000875af1158015614c23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614c479190615f6f565b61123f5760405162461bcd60e51b815260206004820152601a60248201527f457874656e73696f6e20617070726f76616c206661696c7572650000000000006044820152606401610a80565b6001600160a01b03841615801590614cb357506001600160a01b03831615155b8015614cd15750826001600160a01b0316846001600160a01b031614155b1561123f5761ffff81166000908152601a60205260409020546001600160a01b0316614cfe8584836144c3565b610dfc848483614949565b60006001614d1684611891565b614d209190615dd2565b600083815260226020526040902054909150808214614d73576001600160a01b03841660009081526021602090815260408083208584528252808320548484528184208190558352602290915290208190555b5060009182526022602090815260408084208490556001600160a01b039094168352602181528383209183525290812055565b602354600090614db890600190615dd2565b60008381526024602052604081205460238054939450909284908110614de057614de061586d565b906000526020600020015490508060238381548110614e0157614e0161586d565b6000918252602080832090910192909255828152602490915260408082208490558582528120556023805480614e3957614e39615de5565b6001900381819060005260206000200160009055905550505050565b6000614e6083611891565b6001600160a01b039093166000908152602160209081526040808320868452825280832085905593825260229052919091209190915550565b5080546000825590600052602060002090810190610a929190614ef1565b508054614ec390615792565b6000825580601f10614ed3575050565b601f016020900490600052602060002090810190610a929190614f10565b5b808211156111e35780546001600160b01b0319168155600101614ef2565b5b808211156111e35760008155600101614f11565b6001600160e01b031981168114610a9257600080fd5b600060208284031215614f4d57600080fd5b813561137181614f25565b6001600160a01b0381168114610a9257600080fd5b600060208284031215614f7f57600080fd5b813561137181614f58565b60005b83811015614fa5578181015183820152602001614f8d565b50506000910152565b60008151808452614fc6816020860160208601614f8a565b601f01601f19169290920160200192915050565b6020815260006113716020830184614fae565b6000806040838503121561500057600080fd5b823561500b81614f58565b9150602083013561501b81614f58565b809150509250929050565b60006020828403121561503857600080fd5b5035919050565b6000806040838503121561505257600080fd5b823561505d81614f58565b946020939093013593505050565b600081518084526020808501945080840160005b8381101561509b5781518752958201959082019060010161507f565b509495945050505050565b602081526000611371602083018461506b565b60008083601f8401126150cb57600080fd5b5081356001600160401b038111156150e257600080fd5b602083019150836020828501011115610f8b57600080fd5b60008060006040848603121561510f57600080fd5b8335925060208401356001600160401b0381111561512c57600080fd5b615138868287016150b9565b9497909650939450505050565b60008083601f84011261515757600080fd5b5081356001600160401b0381111561516e57600080fd5b6020830191508360208260051b8501011115610f8b57600080fd5b6000806000806000606086880312156151a157600080fd5b8535945060208601356001600160401b03808211156151bf57600080fd5b6151cb89838a01615145565b909650945060408801359150808211156151e457600080fd5b506151f188828901615145565b969995985093965092949392505050565b60008060006060848603121561521757600080fd5b833561522281614f58565b9250602084013561523281614f58565b929592945050506040919091013590565b6000806040838503121561525657600080fd5b50508035926020909101359150565b6000806020838503121561527857600080fd5b82356001600160401b0381111561528e57600080fd5b61529a858286016150b9565b90969095509350505050565b6000806000604084860312156152bb57600080fd5b83356152c681614f58565b925060208401356001600160401b0381111561512c57600080fd5b6020808252825182820181905260009190848201906040850190845b818110156153225783516001600160a01b0316835292840192918401916001016152fd565b50909695505050505050565b6000806000806040858703121561534457600080fd5b84356001600160401b038082111561535b57600080fd5b61536788838901615145565b9096509450602087013591508082111561538057600080fd5b5061538d87828801615145565b95989497509550505050565b6000806000604084860312156153ae57600080fd5b83356153b981614f58565b925060208401356001600160401b038111156153d457600080fd5b61513886828701615145565b8015158114610a9257600080fd5b6000806000806060858703121561540457600080fd5b843561540f81614f58565b935060208501356001600160401b0381111561542a57600080fd5b615436878288016150b9565b909450925050604085013561544a816153e0565b939692955090935050565b60008060006040848603121561546a57600080fd5b83356001600160401b0381111561548057600080fd5b61548c868287016150b9565b90945092505060208401356154a0816153e0565b809150509250925092565b600080604083850312156154be57600080fd5b82356154c981614f58565b9150602083013561501b816153e0565b6000602082840312156154eb57600080fd5b8135611371816153e0565b6000806040838503121561550957600080fd5b823561551481614f58565b9150602083013561ffff8116811461501b57600080fd5b60008060008060006060868803121561554357600080fd5b853561554e81614f58565b945060208601356001600160401b03808211156151bf57600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156155a8576155a861556a565b604052919050565b60006001600160401b038211156155c9576155c961556a565b50601f01601f191660200190565b600080600080608085870312156155ed57600080fd5b84356155f881614f58565b9350602085013561560881614f58565b92506040850135915060608501356001600160401b0381111561562a57600080fd5b8501601f8101871361563b57600080fd5b803561564e615649826155b0565b615580565b81815288602083850101111561566357600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b600081518084526020808501945080840160005b8381101561509b5781516001600160a01b031687529582019590820190600101615699565b6020815260006113716020830184615685565b6040815260006156e46040830185615685565b82810360208401526156f6818561506b565b95945050505050565b803569ffffffffffffffffffff81168114610eac57600080fd5b6000806040838503121561572c57600080fd5b823561573781614f58565b9150615745602084016156ff565b90509250929050565b60208082526024908201527f41646d696e436f6e74726f6c3a204d757374206265206f776e6572206f7220616040820152633236b4b760e11b606082015260800190565b600181811c908216806157a657607f821691505b60208210810361424857634e487b7160e01b600052602260045260246000fd5b6020808252601190820152702737b732bc34b9ba32b73a103a37b5b2b760791b604082015260600190565b602080825260159082015274115e1d195b9cda5bdb88189b1858dadb1a5cdd1959605a1b604082015260600190565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016158ab576158ab615883565b5060010190565b80820180821115610a3057610a30615883565b6000808335601e198436030181126158dc57600080fd5b8301803591506001600160401b038211156158f657600080fd5b602001915036819003821315610f8b57600080fd5b60006020828403121561591d57600080fd5b611371826156ff565b6020808252600d908201526c125b9d985b1a59081a5b9c1d5d609a1b604082015260600190565b60208082526022908201527f45524337323143726561746f723a20496e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b601f821115610cbc57600081815260208120601f850160051c810160208610156159b65750805b601f850160051c820191505b8181101561294a578281556001016159c2565b6001600160401b038311156159ec576159ec61556a565b615a00836159fa8354615792565b8361598f565b6000601f841160018114615a345760008515615a1c5750838201355b600019600387901b1c1916600186901b178355610dfc565b600083815260209020601f19861690835b82811015615a655786850135825560209485019460019092019101615a45565b5086821015615a825760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b6040808252810184905260008560608301825b87811015615ad7578235615aba81614f58565b6001600160a01b0316825260209283019290910190600101615aa7565b5083810360208501528481526001600160fb1b03851115615af757600080fd5b8460051b915081866020830137016020019695505050505050565b81516001600160401b03811115615b2b57615b2b61556a565b615b3f81615b398454615792565b8461598f565b602080601f831160018114615b745760008415615b5c5750858301515b600019600386901b1c1916600185901b17855561294a565b600085815260208120601f198616915b82811015615ba357888601518255948401946001909101908401615b84565b5085821015615bc15787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000816000190483118215151615615beb57615beb615883565b500290565b600082615c0d57634e487b7160e01b600052601260045260246000fd5b500490565b600061ffff808316818103615c2957615c29615883565b6001019392505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60006001600160401b03821115615c9e57615c9e61556a565b5060051b60200190565b600082601f830112615cb957600080fd5b81516020615cc961564983615c85565b82815260059290921b84018101918181019086841115615ce857600080fd5b8286015b84811015615d035780518352918301918301615cec565b509695505050505050565b60008060408385031215615d2157600080fd5b82516001600160401b0380821115615d3857600080fd5b818501915085601f830112615d4c57600080fd5b81516020615d5c61564983615c85565b82815260059290921b84018101918181019089841115615d7b57600080fd5b948201945b83861015615da2578551615d9381614f58565b82529482019490820190615d80565b91880151919650909350505080821115615dbb57600080fd5b50615dc885828601615ca8565b9150509250929050565b81810381811115610a3057610a30615883565b634e487b7160e01b600052603160045260246000fd5b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090615e2e90830184614fae565b9695505050505050565b600060208284031215615e4a57600080fd5b815161137181614f25565b60008154615e6281615792565b60018281168015615e7a5760018114615e8f57615ebe565b60ff1984168752821515830287019450615ebe565b8560005260208060002060005b85811015615eb55781548a820152908401908201615e9c565b50505082870194505b5050505092915050565b60006127ab615ed78386615e55565b84615e55565b600060208284031215615eef57600080fd5b81516001600160401b03811115615f0557600080fd5b8201601f81018413615f1657600080fd5b8051615f24615649826155b0565b818152856020838501011115615f3957600080fd5b6156f6826020830160208601614f8a565b6000615f568285615e55565b8351615f66818360208801614f8a565b01949350505050565b600060208284031215615f8157600080fd5b8151611371816153e056fea2646970667358221220f5403fc3c5bf5f6ae673d9e61bf048d5468fd6c2fb78208a5d33ca9547e6bce364736f6c6343000810003300000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000b544553544242544d4d544d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034d4d4d0000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061041d5760003560e01c80636352211e1161022b578063b0fe87c911610130578063d5a06d4c116100b8578063e985e9c511610087578063e985e9c5146109a8578063f0cdc499146109bb578063f2fde38b146109ce578063fe2e1f58146109e1578063ffa1ad74146109f457600080fd5b8063d5a06d4c14610902578063dfa2be341461096f578063e00aab4b14610982578063e92a89f61461099557600080fd5b8063bb3bafd6116100ff578063bb3bafd614610902578063c87b56dd14610923578063ce8aee9d14610936578063d29c2cdc14610949578063d39737191461095c57600080fd5b8063b0fe87c91461086b578063b4b5b48f1461087e578063b88d4fde146108cf578063b9c4d9fb146108e257600080fd5b806382dcc0c8116101b357806399e0dd7c1161018257806399e0dd7c1461080c578063a22cb4651461081f578063aafb2d4414610832578063ac0c8cfa14610845578063ad2d0ddd1461085857600080fd5b806382dcc0c8146107d857806383b7db63146107eb5780638da5cb5b146107f357806395d89b411461080457600080fd5b806370a08231116101fa57806370a0823114610784578063715018a61461079757806372ff03d31461079f5780637884af44146107b25780637aa15f16146107c557600080fd5b80636352211e1461073857806366d1e9d01461074b5780636bede91f1461075e5780636d73e6691461077157600080fd5b80632928ca58116103315780633e6134b8116102b957806342966c681161028857806342966c68146106d95780634f6ccce7146106ec578063596798ad146106ff57806361e5bc6b1461071257806361ffad5b1461072557600080fd5b80633e6134b81461068d5780633f0f37f6146106a05780634278330e146106b357806342842e0e146106c657600080fd5b806330176e131161030057806330176e131461062c5780633071a0f91461063f57806331ae450b14610652578063332dd1ae1461066757806338e52e781461067a57600080fd5b80632928ca58146105c15780632a55205a146105d45780632d345670146106065780632f745c591461061957600080fd5b80630ebd4c7f116103b457806322f374d01161038357806322f374d014610547578063239be3171461055857806323b872dd1461056b57806324d7806c1461057e578063278cc7a01461059157600080fd5b80630ebd4c7f146104f9578063162094c41461051957806318160ddd1461052c57806320e4afe21461053457600080fd5b8063075ee464116103f0578063075ee46414610495578063081812fc146104a8578063095ea7b3146104d35780630c8066bc146104e657600080fd5b806301ffc9a71461042257806302e7afb71461044a57806305e6b09b1461045f57806306fdde0314610480575b600080fd5b610435610430366004614f3b565b6109fc565b60405190151581526020015b60405180910390f35b61045d610458366004614f6d565b610a36565b005b61047261046d366004614f6d565b610a95565b604051908152602001610441565b610488610abc565b6040516104419190614fda565b6104726104a3366004614fed565b610b4e565b6104bb6104b6366004615026565b610b85565b6040516001600160a01b039091168152602001610441565b61045d6104e136600461503f565b610bac565b6104726104f4366004614f6d565b610cc1565b61050c610507366004615026565b610cfb565b60405161044191906150a6565b61045d6105273660046150fa565b610d2b565b602354610472565b61045d610542366004615189565b610d80565b600b546001600160a01b03166104bb565b6104bb610566366004615026565b610e03565b61045d610579366004615202565b610eb1565b61043561058c366004614f6d565b610ee2565b60008052601b6020527f584f46c60af19681376031579adb04a2416e54ee5505351c2a8435e3766026ea54610472565b6104726105cf366004614f6d565b610f1b565b6105e76105e2366004615243565b610f54565b604080516001600160a01b039093168352602083019190915201610441565b61045d610614366004614f6d565b610f92565b61047261062736600461503f565b610fef565b61045d61063a366004615265565b611085565b61045d61064d3660046152a6565b6110d9565b61065a611139565b60405161044191906152e1565b61045d61067536600461532e565b6111e7565b61050c610688366004615399565b611245565b61045d61069b366004615265565b611378565b61045d6106ae3660046153ee565b61138c565b61050c6106c1366004615399565b6113eb565b61045d6106d4366004615202565b6114e4565b61045d6106e7366004615026565b6114ff565b6104726106fa366004615026565b611596565b61045d61070d366004614f6d565b611629565b61045d61072036600461532e565b61167c565b61047261073336600461503f565b6116fb565b6104bb610746366004615026565b611756565b61045d610759366004615265565b6117b6565b61047261076c36600461503f565b6117c8565b61045d61077f366004614f6d565b611839565b610472610792366004614f6d565b611891565b61045d611917565b6104726107ad366004614f6d565b61192b565b6104726107c03660046152a6565b61199a565b61050c6107d3366004615399565b611a39565b61045d6107e6366004615455565b611b9d565b61065a611bb0565b6000546001600160a01b03166104bb565b610488611c50565b61045d61081a366004615265565b611c5f565b61045d61082d3660046154ab565b611cb3565b61045d61084036600461532e565b611cbe565b61045d6108533660046154d9565b611d7f565b61050c6108663660046154f6565b611d91565b61045d61087936600461552b565b611ebb565b6108b461088c366004615026565b600090815260066020526040902054600160a01b900460101c69ffffffffffffffffffff1690565b60405169ffffffffffffffffffff9091168152602001610441565b61045d6108dd3660046155d7565b611f12565b6108f56108f0366004615026565b611f44565b60405161044191906156be565b610915610910366004615026565b611f74565b6040516104419291906156d1565b610488610931366004615026565b611fae565b61045d610944366004614f6d565b611fb9565b610472610957366004615026565b61200c565b61047261096a366004615719565b612088565b61047261097d366004615202565b6120c1565b61050c6109903660046154f6565b612127565b61045d6109a33660046150fa565b612206565b6104356109b6366004614fed565b612219565b61045d6109c9366004614fed565b612247565b61045d6109dc366004614f6d565b61229b565b6104726109ef3660046152a6565b612311565b610472600381565b60006001600160e01b03198216632e98234f60e01b1480610a215750610a2182612365565b80610a305750610a308261238e565b92915050565b33610a496000546001600160a01b031690565b6001600160a01b03161480610a645750610a646002336123b3565b610a895760405162461bcd60e51b8152600401610a809061574e565b60405180910390fd5b610a92816123d5565b50565b6000610aa0826124e5565b506001600160a01b03166000908152601b602052604090205490565b606060048054610acb90615792565b80601f0160208091040260200160405190810160405280929190818152602001828054610af790615792565b8015610b445780601f10610b1957610100808354040283529160200191610b44565b820191906000526020600020905b815481529060010190602001808311610b2757829003601f168201915b5050505050905090565b6000610b59836124e5565b506001600160a01b039182166000908152601e6020908152604080832093909416825291909152205490565b6000610b908261250d565b506000908152600860205260409020546001600160a01b031690565b6000610bb782611756565b9050806001600160a01b0316836001600160a01b031603610c245760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610a80565b336001600160a01b0382161480610c405750610c408133612219565b610cb25760405162461bcd60e51b815260206004820152603d60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c0000006064820152608401610a80565b610cbc838361255d565b505050565b6001600160a01b031660009081527f65ce8396b736f5da9d881cc6fbcb11ef9721292dc41ec8c40879fd9edea5744d602052604090205490565b6060610d06826125cb565b610d225760405162461bcd60e51b8152600401610a80906157c6565b610a30826125e8565b33610d3e6000546001600160a01b031690565b6001600160a01b03161480610d595750610d596002336123b3565b610d755760405162461bcd60e51b8152600401610a809061574e565b610cbc8383836125f3565b33610d936000546001600160a01b031690565b6001600160a01b03161480610dae5750610dae6002336123b3565b610dca5760405162461bcd60e51b8152600401610a809061574e565b610dd3856125cb565b610def5760405162461bcd60e51b8152600401610a80906157c6565b610dfc8585858585612677565b5050505050565b6000610e0e826125cb565b610e2a5760405162461bcd60e51b8152600401610a80906157c6565b610e33826126fe565b90506001600160a01b038116610e845760405162461bcd60e51b815260206004820152601660248201527527379032bc3a32b739b4b7b7103337b9103a37b5b2b760511b6044820152606401610a80565b610e8f600e826123b3565b15610eac5760405162461bcd60e51b8152600401610a80906157f1565b919050565b610ebb3382612754565b610ed75760405162461bcd60e51b8152600401610a8090615820565b610cbc8383836127b3565b6000816001600160a01b0316610f006000546001600160a01b031690565b6001600160a01b03161480610a305750610a306002836123b3565b6000610f25612952565b610f2d6129ab565b610f498260405180602001604052806000815250600080612a02565b9050610eac60018055565b600080610f60846125cb565b610f7c5760405162461bcd60e51b8152600401610a80906157c6565b610f868484612a95565b915091505b9250929050565b610f9a612b6c565b610fa56002826123b3565b15610a925760405133906001600160a01b038316907f7c0c3c84c67c85fcac635147348bfe374c24a1a93d0366d1cfe9d8853cbf89d590600090a3610feb600282612bc6565b5050565b6000610ffa83611891565b821061105c5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610a80565b506001600160a01b03919091166000908152602160209081526040808320938352929052205490565b336110986000546001600160a01b031690565b6001600160a01b031614806110b357506110b36002336123b3565b6110cf5760405162461bcd60e51b8152600401610a809061574e565b610feb8282612bdb565b336110ec6000546001600160a01b031690565b6001600160a01b0316148061110757506111076002336123b3565b6111235760405162461bcd60e51b8152600401610a809061574e565b61112c836124e5565b610cbc8383836000612c10565b60606111456002612d0d565b6001600160401b0381111561115c5761115c61556a565b604051908082528060200260200182016040528015611185578160200160208202803683370190505b50905060005b6111956002612d0d565b8110156111e3576111a7600282612d17565b8282815181106111b9576111b961586d565b6001600160a01b0390921660209283029190910190910152806111db81615899565b91505061118b565b5090565b336111fa6000546001600160a01b031690565b6001600160a01b0316148061121557506112156002336123b3565b6112315760405162461bcd60e51b8152600401610a809061574e565b61123f600085858585612d23565b50505050565b606061124f612952565b6112576129ab565b816001600160401b0381111561126f5761126f61556a565b604051908082528060200260200182016040528015611298578160200160208202803683370190505b5090506000600a5460016112ac91906158b2565b905083839050600a60008282546112c391906158b2565b90915550600090505b8381101561136657611341868686848181106112ea576112ea61586d565b90506020028101906112fc91906158c5565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250925061133c9150869050876158b2565b612a02565b8382815181106113535761135361586d565b60209081029190910101526001016112cc565b505061137160018055565b9392505050565b6113806129ab565b610feb82826000612e10565b3361139f6000546001600160a01b031690565b6001600160a01b031614806113ba57506113ba6002336123b3565b6113d65760405162461bcd60e51b8152600401610a809061574e565b6113df846124e5565b61123f84848484612c10565b60606113f5612952565b6113fd6129ab565b816001600160401b038111156114155761141561556a565b60405190808252806020026020018201604052801561143e578160200160208202803683370190505b5090506000600a54600161145291906158b2565b905083839050600a600082825461146991906158b2565b90915550600090505b83811015611366576114bf86604051806020016040528060008152508787858181106114a0576114a061586d565b90506020020160208101906114b5919061590b565b61133c85876158b2565b8382815181106114d1576114d161586d565b6020908102919091010152600101611472565b610cbc83838360405180602001604052806000815250611f12565b611507612952565b6115113382612754565b61155d5760405162461bcd60e51b815260206004820152601f60248201527f43616c6c6572206973206e6f74206f776e6572206f7220617070726f766564006044820152606401610a80565b600061156882611756565b90506000611575836126fe565b905061158083612e4d565b61158b828483612f07565b5050610a9260018055565b60006115a160235490565b82106116045760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610a80565b602382815481106116175761161761586d565b90600052602060002001549050919050565b3361163c6000546001600160a01b031690565b6001600160a01b0316148061165757506116576002336123b3565b6116735760405162461bcd60e51b8152600401610a809061574e565b610a9281612f12565b6116846129ab565b8281146116a35760405162461bcd60e51b8152600401610a8090615926565b60005b83811015610dfc576116f38585838181106116c3576116c361586d565b905060200201358484848181106116dc576116dc61586d565b90506020028101906116ee91906158c5565b612f66565b6001016116a6565b6000611706836124e5565b61170f83610a95565b821061172d5760405162461bcd60e51b8152600401610a809061594d565b506001600160a01b03919091166000908152601c60209081526040808320938352929052205490565b6000818152600660205260408120546001600160a01b031680610a305760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610a80565b6117be6129ab565b610feb8282612f70565b60006117d383610cc1565b82106117f15760405162461bcd60e51b8152600401610a809061594d565b506001600160a01b039190911660009081527f8c60882dec3cf54096060609fdd16c336781b436ca34f3f27a220dfcfa1d485560209081526040808320938352929052205490565b611841612b6c565b61184c6002826123b3565b610a925760405133906001600160a01b038316907f7e1a1a08d52e4ba0e21554733d66165fd5151f99460116223d9e3a608eec5cb190600090a3610feb600282612f8a565b60006001600160a01b0382166118fb5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b6064820152608401610a80565b506001600160a01b031660009081526007602052604090205490565b61191f612b6c565b6119296000612f9f565b565b6000611935612952565b336119486000546001600160a01b031690565b6001600160a01b0316148061196357506119636002336123b3565b61197f5760405162461bcd60e51b8152600401610a809061574e565b610f4982604051806020016040528060008152506000612fef565b60006119a4612952565b336119b76000546001600160a01b031690565b6001600160a01b031614806119d257506119d26002336123b3565b6119ee5760405162461bcd60e51b8152600401610a809061574e565b611a2e8484848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052509250612fef915050565b905061137160018055565b6060611a43612952565b33611a566000546001600160a01b031690565b6001600160a01b03161480611a715750611a716002336123b3565b611a8d5760405162461bcd60e51b8152600401610a809061574e565b816001600160401b03811115611aa557611aa561556a565b604051908082528060200260200182016040528015611ace578160200160208202803683370190505b5090506000600a546001611ae291906158b2565b905083839050600a6000828254611af991906158b2565b90915550600090505b8381101561136657611b7886868684818110611b2057611b2061586d565b9050602002810190611b3291906158c5565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611b7392508691508790506158b2565b612fef565b838281518110611b8a57611b8a61586d565b6020908102919091010152600101611b02565b611ba56129ab565b610cbc838383612e10565b6060611bbc600c612d0d565b6001600160401b03811115611bd357611bd361556a565b604051908082528060200260200182016040528015611bfc578160200160208202803683370190505b50905060005b611c0c600c612d0d565b8110156111e357611c1e600c82612d17565b828281518110611c3057611c3061586d565b6001600160a01b0390921660209283029190910190910152600101611c02565b606060058054610acb90615792565b33611c726000546001600160a01b031690565b6001600160a01b03161480611c8d5750611c8d6002336123b3565b611ca95760405162461bcd60e51b8152600401610a809061574e565b610feb8282613050565b610feb338383613085565b33611cd16000546001600160a01b031690565b6001600160a01b03161480611cec5750611cec6002336123b3565b611d085760405162461bcd60e51b8152600401610a809061574e565b828114611d275760405162461bcd60e51b8152600401610a8090615926565b60005b83811015610dfc57611d77858583818110611d4757611d4761586d565b90506020020135848484818110611d6057611d6061586d565b9050602002810190611d7291906158c5565b6125f3565b600101611d2a565b611d876129ab565b610a923382613153565b6060611d9b612952565b33611dae6000546001600160a01b031690565b6001600160a01b03161480611dc95750611dc96002336123b3565b611de55760405162461bcd60e51b8152600401610a809061574e565b8161ffff166001600160401b03811115611e0157611e0161556a565b604051908082528060200260200182016040528015611e2a578160200160208202803683370190505b5090506000600a546001611e3e91906158b2565b90508261ffff16600a6000828254611e5691906158b2565b90915550600090505b8361ffff16811015611eb057611e8b85604051806020016040528060008152508385611b7391906158b2565b838281518110611e9d57611e9d61586d565b6020908102919091010152600101611e5f565b5050610a3060018055565b33611ece6000546001600160a01b031690565b6001600160a01b03161480611ee95750611ee96002336123b3565b611f055760405162461bcd60e51b8152600401610a809061574e565b610dfc8585858585612d23565b611f1c3383612754565b611f385760405162461bcd60e51b8152600401610a8090615820565b61123f848484846131c8565b6060611f4f826125cb565b611f6b5760405162461bcd60e51b8152600401610a80906157c6565b610a30826131fb565b606080611f80836125cb565b611f9c5760405162461bcd60e51b8152600401610a80906157c6565b611fa583613202565b91509150915091565b6060610a30826135b0565b33611fcc6000546001600160a01b031690565b6001600160a01b03161480611fe75750611fe76002336123b3565b6120035760405162461bcd60e51b8152600401610a809061574e565b610a92816135e0565b6000808052601b6020527f584f46c60af19681376031579adb04a2416e54ee5505351c2a8435e3766026ea5482106120565760405162461bcd60e51b8152600401610a809061594d565b5060009081527fb9c6de81004e18dedadca3e5eabaab449ca91dff6f58efc9461da635fe77f849602052604090205490565b6000612092612952565b61209a6129ab565b6120b68360405180602001604052806000815250846000612a02565b9050610a3060018055565b60006120cc846124e5565b6120d68484610b4e565b82106120f45760405162461bcd60e51b8152600401610a809061594d565b506001600160a01b039283166000908152601f602090815260408083209490951682529283528381209181529152205490565b6060612131612952565b6121396129ab565b8161ffff166001600160401b038111156121555761215561556a565b60405190808252806020026020018201604052801561217e578160200160208202803683370190505b5090506000600a54600161219291906158b2565b90508261ffff16600a60008282546121aa91906158b2565b90915550600090505b8361ffff16811015611eb0576121e185604051806020016040528060008152506000848661133c91906158b2565b8382815181106121f3576121f361586d565b60209081029190910101526001016121b3565b61220e6129ab565b610cbc838383612f66565b6001600160a01b03918216600090815260096020908152604080832093909416825291909152205460ff1690565b3361225a6000546001600160a01b031690565b6001600160a01b0316148061227557506122756002336123b3565b6122915760405162461bcd60e51b8152600401610a809061574e565b610feb8282613621565b6122a3612b6c565b6001600160a01b0381166123085760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a80565b610a9281612f9f565b600061231b612952565b6123236129ab565b611a2e8484848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052509250829150612a029050565b600061237082613756565b8061237f575061237f82613796565b80610a305750610a30826137d1565b60006001600160e01b0319821663780e9d6360e01b1480610a305750610a3082613806565b6001600160a01b03811660009081526001830160205260408120541515611371565b6001600160a01b038116158015906123f657506001600160a01b0381163014155b6124425760405162461bcd60e51b815260206004820152601960248201527f43616e6e6f7420626c61636b6c69737420796f757273656c66000000000000006044820152606401610a80565b61244d600c826123b3565b156124955760405133906001600160a01b038316907fd19cf84cf0fec6bec9ddfa29c63adf83a55707c712f32c8285d6180a7890147990600090a3612493600c82612bc6565b505b6124a0600e826123b3565b610a925760405133906001600160a01b038316907f05ac7bc5a606cd92a63365f9fda244499b9add0526b22d99937b6bd88181059c90600090a3610feb600e82612f8a565b6124f0600e826123b3565b15610a925760405162461bcd60e51b8152600401610a80906157f1565b612516816125cb565b610a925760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b6044820152606401610a80565b600081815260086020526040902080546001600160a01b0319166001600160a01b038416908117909155819061259282611756565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000908152600660205260409020546001600160a01b0316151590565b606061137182613202565b6000831180156126055750600a548311155b801561262257506000612617846126fe565b6001600160a01b0316145b61265e5760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b2103a37b5b2b760991b6044820152606401610a80565b600083815260136020526040902061123f8284836159d5565b6126838484848461382b565b600085815260156020526040812061269a91614e99565b6126b984848484601560008b81526020019081526020016000206138d6565b847fabb46fe0761d77584bde75697647804ffd8113abd4d8d06bc664150395eccdee858585856040516126ef9493929190615a94565b60405180910390a25050505050565b600081815260066020526040812054600160a01b90046001600160601b0381169061ffff1682036127325750600092915050565b61ffff166000908152601a60205260409020546001600160a01b031692915050565b60008061276083611756565b9050806001600160a01b0316846001600160a01b0316148061278757506127878185612219565b806127ab5750836001600160a01b03166127a084610b85565b6001600160a01b0316145b949350505050565b6000818152600660209081526040918290208251808401909352546001600160a01b03808216808552600160a01b9092046001600160601b03169284019290925290851681146128535760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b6064820152608401610a80565b6001600160a01b0384166128b55760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610a80565b60208201516128c686868684613991565b6128d160008561255d565b6001600160a01b038087166000818152600760209081526040808320805460001901905593891680835284832080546001019055888352600690915283822080546001600160a01b031916821790559251879392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a45b505050505050565b6002600154036129a45760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610a80565b6002600155565b6129b6600c336123b3565b6119295760405162461bcd60e51b815260206004820152601c60248201527f4d757374206265207265676973746572656420657874656e73696f6e000000006044820152606401610a80565b600081600003612a2557600a60008154612a1b90615899565b90915550600a5491505b612a2f8583613a7e565b612a398583613b12565b33600090815260196020526040902054612a6c908690849061ffff16601087901b69ffffffffffffffff00001617613b1c565b835115612a8d576000828152601360205260409020612a8b8582615b12565b505b509392505050565b600080600080612aa486613202565b91509150600182511115612afa5760405162461bcd60e51b815260206004820152601c60248201527f4d6f7265207468616e203120726f79616c7479207265636569766572000000006044820152606401610a80565b8151600003612b1157306000935093505050610f8b565b81600081518110612b2457612b2461586d565b60200260200101516127108683600081518110612b4357612b4361586d565b6020026020010151612b559190615bd1565b612b5f9190615bf0565b9350935050509250929050565b6000546001600160a01b031633146119295760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a80565b6000611371836001600160a01b038416613b37565b6000805260106020527f6e0956cda88cad152e89927e53611735b61a5c762d1428573c6931b0a5efcb01610cbc8284836159d5565b60185461ffff90811610612c5c5760405162461bcd60e51b8152602060048201526013602482015272546f6f206d616e7920657874656e73696f6e7360681b6044820152606401610a80565b6001600160a01b03841660009081526019602052604081205461ffff169003612d015760188054600090612c939061ffff16615c12565b82546101009290920a61ffff818102199093169183160217909155601880546001600160a01b0387166000818152601960209081526040808320805495881661ffff199096169590951790945593549094168452601a90925290912080546001600160a01b03191690911790555b61123f84848484613c2a565b6000610a30825490565b60006113718383613d17565b612d2f8484848461382b565b6001600160a01b0385166000908152601460205260408120612d5091614e99565b612d8184848484601460008b6001600160a01b03166001600160a01b031681526020019081526020016000206138d6565b6001600160a01b038516612dd1577f2b6849d5976d799a5b0ca4dfd6b40a3d7afe9ea72c091fa01a958594f9a2659b84848484604051612dc49493929190615a94565b60405180910390a1610dfc565b846001600160a01b03167f535a93d2cb000582c0ebeaa9be4890ec6a287f98eb2df00c54c300612fd78d8f858585856040516126ef9493929190615a94565b336000908152601060205260409020612e2a8385836159d5565b50336000908152601160205260409020805460ff19169115159190911790555050565b60008181526006602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b03169282018390529092909190612e9d9083908684613991565b612ea860008561255d565b6001600160a01b038216600081815260076020908152604080832080546000190190558783526006909152808220829055518692907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a461123f565b610cbc838383613d41565b600b80546001600160a01b0319166001600160a01b0383169081179091556040519081527f959c0e47a2fe3cf01e237ba4892e2cc3194d77cbfb33e434e40873225d6b595f9060200160405180910390a150565b33612617846126fe565b336000908152601260205260409020610cbc8284836159d5565b6000611371836001600160a01b038416613e1f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60008160000361301257600a6000815461300890615899565b90915550600a5491505b61301c8483613e6e565b61302884836000613b1c565b8251156130495760008281526013602052604090206130478482615b12565b505b5092915050565b6000805260126020527f7e7fa33969761a458e04f477e039a608702b4f924981d6653935a8319a08ad7b610cbc8284836159d5565b816001600160a01b0316836001600160a01b0316036130e65760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a80565b6001600160a01b03838116600081815260096020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b613164826345ffcdad60e01b613e78565b15610feb576001600160a01b038216600081815260166020908152604091829020805460ff191685151590811790915591519182527f072a7592283e2c2d1d56d21517ff6013325e0f55483f4828373ff4d98b0a1a36910160405180910390a25050565b6131d38484846127b3565b6131df84848484613e94565b61123f5760405162461bcd60e51b8152600401610a8090615c33565b6060613049825b606080600060156000858152602001908152602001600020805480602002602001604051908101604052809291908181526020016000905b8282101561328457600084815260209081902060408051808201909152908401546001600160a01b0381168252600160a01b900461ffff168183015282526001909201910161323a565b50505050905080516000036133d157600061329e856126fe565b90506001600160a01b038116156133cf576132c081634e53ee3d60e11b613e78565b1561334b57604051634e53ee3d60e11b8152306004820152602481018690526001600160a01b03821690639ca7dc7a90604401600060405180830381865afa158015613310573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526133389190810190615d0e565b815191955093501561334b575050915091565b6001600160a01b038116600090815260146020908152604080832080548251818502810185019093528083529193909284015b828210156133c857600084815260209081902060408051808201909152908401546001600160a01b0381168252600160a01b900461ffff168183015282526001909201910161337e565b5050505091505b505b8051600003613474576000808052601460209081527f4f26c3876aa9f4b92579780beea1161a61f87ebf1ec6ee865b299e447ecba99c8054604080518285028101850190915281815293919290919084015b8282101561346d57600084815260209081902060408051808201909152908401546001600160a01b0381168252600160a01b900461ffff1681830152825260019092019101613423565b5050505090505b8051156135aa5780516001600160401b038111156134945761349461556a565b6040519080825280602002602001820160405280156134bd578160200160208202803683370190505b50925080516001600160401b038111156134d9576134d961556a565b604051908082528060200260200182016040528015613502578160200160208202803683370190505b50915060005b81518110156135a8578181815181106135235761352361586d565b6020026020010151600001518482815181106135415761354161586d565b60200260200101906001600160a01b031690816001600160a01b0316815250508181815181106135735761357361586d565b60200260200101516020015161ffff168382815181106135955761359561586d565b6020908102919091010152600101613508565b505b50915091565b60606135bb826125cb565b6135d75760405162461bcd60e51b8152600401610a80906157c6565b610a3082613f92565b60405133906001600160a01b038316907fd19cf84cf0fec6bec9ddfa29c63adf83a55707c712f32c8285d6180a7890147990600090a3610feb600c82612bc6565b61362c600c836123b3565b6136785760405162461bcd60e51b815260206004820152601e60248201527f43726561746f72436f72653a20496e76616c696420657874656e73696f6e00006044820152606401610a80565b6001600160a01b038116158061369a575061369a81631e05385b60e31b613e78565b6136d85760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401610a80565b6001600160a01b03828116600090815260176020526040902054811690821614610feb576001600160a01b0382811660008181526017602052604080822080546001600160a01b031916948616948517905551339392917f6a835c4fcf7e0d398db3762332fdaa1471814ad39f1e2d6d0b3fdabf8efee3e091a45050565b60006001600160e01b0319821663b5d2729f60e01b148061378757506001600160e01b03198216639088c20760e01b145b80610a305750610a308261424e565b60006001600160e01b031982166380ac58cd60e01b148061237f57506001600160e01b03198216635b5e139f60e01b1480610a305750610a30825b60006001600160e01b03198216632a9f3abf60e11b1480610a3057506301ffc9a760e01b6001600160e01b0319831614610a30565b60006001600160e01b03198216632e98234f60e01b1480610a305750610a3082612365565b82811461384a5760405162461bcd60e51b8152600401610a8090615926565b6000805b82811015613884578383828181106138685761386861586d565b905060200201358261387a91906158b2565b915060010161384e565b506127108110610dfc5760405162461bcd60e51b815260206004820152601760248201527f496e76616c696420746f74616c20726f79616c746965730000000000000000006044820152606401610a80565b60005b8281101561294a578160405180604001604052808888858181106138ff576138ff61586d565b90506020020160208101906139149190614f6d565b6001600160a01b031681526020018686858181106139345761393461586d565b61ffff602091820293909301358316909352508354600181810186556000958652948390208451910180549490930151909116600160a01b026001600160b01b03199093166001600160a01b0390911617919091179055016138d9565b6001600160a01b038416613a72576000546001600160a01b03163303613a095760405162461bcd60e51b815260206004820152602760248201527f45524337323143726561746f7241756374696f6e3a206f776e65722063616e6e6044820152661bdd081b5a5b9d60ca1b6064820152608401610a80565b60c8613a1460235490565b10613a725760405162461bcd60e51b815260206004820152602860248201527f45524337323143726561746f7241756374696f6e3a204d617820737570706c79604482015267081c995858da195960c21b6064820152608401610a80565b61123f848484846142ff565b336000908152601760205260409020546001600160a01b031615610feb573360008181526017602052604090819020549051631e05385b60e31b815260048101929092526001600160a01b03848116602484015260448301849052169063f029c2d890606401600060405180830381600087803b158015613afe57600080fd5b505af115801561294a573d6000803e3d6000fd5b610feb8282614317565b610cbc83838360405180602001604052806000815250614374565b60008181526001830160205260408120548015613c20576000613b5b600183615dd2565b8554909150600090613b6f90600190615dd2565b9050818114613bd4576000866000018281548110613b8f57613b8f61586d565b9060005260206000200154905080876000018481548110613bb257613bb261586d565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080613be557613be5615de5565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610a30565b6000915050610a30565b6001600160a01b0384163014801590613c4c57506001600160a01b0384163b15155b613c825760405162461bcd60e51b8152602060048201526007602482015266125b9d985b1a5960ca1b6044820152606401610a80565b60405133906001600160a01b038616907fd8cb8ba4086944eabf43c5535b7712015e4d4c714b24bf812c040ea5b7a3e42a90600090a36001600160a01b0384166000908152601060205260409020613cdb8385836159d5565b506001600160a01b0384166000908152601160205260409020805460ff1916821515179055613d0b600c85612f8a565b5061123f846001613153565b6000826000018281548110613d2e57613d2e61586d565b9060005260206000200154905092915050565b60006001613d4e83610a95565b613d589190615dd2565b6000848152601d6020526040902054909150808214613dab576001600160a01b0383166000908152601c602090815260408083208584528252808320548484528184208190558352601d90915290208190555b6001600160a01b0383166000908152601b60205260408120805460019290613dd4908490615dd2565b90915550506000848152601d602090815260408083208390556001600160a01b0386168352601c8252808320858452909152812055613e148585856144c3565b610dfc8585856145b1565b6000818152600183016020526040812054613e6657508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610a30565b506000610a30565b610feb8282614670565b6000613e83836146f7565b80156113715750611371838361472a565b60006001600160a01b0384163b15613f8a57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290613ed8903390899088908890600401615dfb565b6020604051808303816000875af1925050508015613f13575060408051601f3d908101601f19168201909252613f1091810190615e38565b60015b613f70573d808015613f41576040519150601f19603f3d011682016040523d82523d6000602084013e613f46565b606091505b508051600003613f685760405162461bcd60e51b8152600401610a8090615c33565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506127ab565b5060016127ab565b6060600082118015613fa65750600a548211155b613fe25760405162461bcd60e51b815260206004820152600d60248201526c24b73b30b634b2103a37b5b2b760991b6044820152606401610a80565b6000613fed836126fe565b9050613ffa600e826123b3565b156140175760405162461bcd60e51b8152600401610a80906157f1565b6000838152601360205260409020805461403090615792565b15905061414a576001600160a01b0381166000908152601260205260409020805461405a90615792565b1590506140ab576001600160a01b038116600090815260126020908152604080832086845260138352928190209051614094939201615ec8565b604051602081830303815290604052915050919050565b600083815260136020526040902080546140c490615792565b80601f01602080910402602001604051908101604052809291908181526020018280546140f090615792565b801561413d5780601f106141125761010080835404028352916020019161413d565b820191906000526020600020905b81548152906001019060200180831161412057829003601f168201915b5050505050915050919050565b61415b8163e9dc637560e01b613e78565b156141d35760405163e9dc637560e01b8152306004820152602481018490526001600160a01b0382169063e9dc637590604401600060405180830381865afa1580156141ab573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526113719190810190615edd565b6001600160a01b03811660009081526011602052604090205460ff16614225576001600160a01b0381166000908152601060205260409020614214846147b3565b604051602001614094929190615f4a565b6001600160a01b038116600090815260106020526040902080546140c490615792565b50919050565b60006001600160e01b031982166314d9799760e21b148061427f57506001600160e01b031982166328f10a2160e01b145b8061428e575061428e82613796565b806142a957506001600160e01b03198216635d9dd7eb60e11b145b806142c457506001600160e01b03198216632dde656160e21b145b806142df57506001600160e01b031982166335681b5360e21b145b80610a3057506001600160e01b0319821663152a902d60e11b1492915050565b61430b84848484614845565b61123f84848484614880565b600061432233610a95565b336000818152601c602090815260408083208584528252808320879055868352601d8252808320859055928252601b905290812080549293509161436590615899565b90915550610cbc838333614949565b6001600160a01b0384166143ca5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610a80565b6143d3836125cb565b156144205760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a80565b61442d6000858585613991565b6001600160a01b03808516600081815260076020908152604080832080546001019055805180820182528481526001600160601b038089168285019081528a865260069094528285209151935116600160a01b02929095169190911790935591518592907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46131df6000858584613e94565b600060016144d18386610b4e565b6144db9190615dd2565b6000848152602080526040902054909150808214614535576001600160a01b038381166000908152601f60209081526040808320938916835292815282822085835281528282205484835283832081905582528052208190555b6001600160a01b038084166000908152601e60209081526040808320938916835292905290812080546001929061456d908490615dd2565b9091555050506000928352602080805260408085208590556001600160a01b039384168552601f825280852095909316845293845281832090835290925290812055565b6001600160a01b03811615614639576145d1816311686e4b60e21b613e78565b15614639576040516311686e4b60e21b81526001600160a01b038481166004830152602482018490528216906345a1b92c90604401600060405180830381600087803b15801561462057600080fd5b505af1158015614634573d6000803e3d6000fd5b505050505b6000828152601360205260409020805461465290615792565b159050610cbc576000828152601360205260408120610cbc91614eb7565b7f584f46c60af19681376031579adb04a2416e54ee5505351c2a8435e3766026ea805460008181527fb9c6de81004e18dedadca3e5eabaab449ca91dff6f58efc9461da635fe77f84960209081526040808320869055858352601d82528220839055818052601b905282549192916146e790615899565b90915550610cbc83836000614949565b600061470a826301ffc9a760e01b61472a565b8015610a305750614723826001600160e01b031961472a565b1592915050565b604080516001600160e01b03198316602480830191909152825180830390910181526044909101909152602080820180516001600160e01b03166301ffc9a760e01b178152825160009392849283928392918391908a617530fa92503d9150600051905082801561479c575060208210155b80156147a85750600081115b979650505050505050565b606060006147c0836149c8565b60010190506000816001600160401b038111156147df576147df61556a565b6040519080825280601f01601f191660200182016040528015614809576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a850494508461481357509392505050565b6001600160a01b0384161561123f5761ffff81166000908152601a602052604090205461123f908590859085906001600160a01b0316614aa0565b61488c84848484614c93565b6001600160a01b0384166148e7576148e282602380546000838152602460205260408120829055600182018355919091527fd57b2b5166478fd4318d2acc6cc2c704584312bdd8781b32d5d06abda57f42300155565b61490a565b826001600160a01b0316846001600160a01b03161461490a5761490a8483614d09565b6001600160a01b0383166149265761492182614da6565b61123f565b836001600160a01b0316836001600160a01b03161461123f5761123f8383614e55565b60006149558285610b4e565b6001600160a01b038084166000818152601f60209081526040808320948a168084529482528083208684528252808320899055888352818052808320869055928252601e815282822093825292909252812080549293506001929091906149bd9084906158b2565b909155505050505050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310614a075772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310614a33576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310614a5157662386f26fc10000830492506010015b6305f5e1008310614a69576305f5e100830492506008015b6127108310614a7d57612710830492506004015b60648310614a8f576064830492506002015b600a8310610a305760010192915050565b6001600160a01b0384161561123f576001600160a01b03811615801590614adf57506001600160a01b03811660009081526016602052604090205460ff165b15614bb157604051632f3537c560e11b81523360048201526001600160a01b038581166024830152848116604483015260648201849052821690635e6a6f8a906084016020604051808303816000875af1158015614b41573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614b659190615f6f565b6149215760405162461bcd60e51b815260206004820152601a60248201527f457874656e73696f6e20617070726f76616c206661696c7572650000000000006044820152606401610a80565b600b546001600160a01b03161561123f57600b54604051632f3537c560e11b81523360048201526001600160a01b03868116602483015285811660448301526064820185905290911690635e6a6f8a906084016020604051808303816000875af1158015614c23573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614c479190615f6f565b61123f5760405162461bcd60e51b815260206004820152601a60248201527f457874656e73696f6e20617070726f76616c206661696c7572650000000000006044820152606401610a80565b6001600160a01b03841615801590614cb357506001600160a01b03831615155b8015614cd15750826001600160a01b0316846001600160a01b031614155b1561123f5761ffff81166000908152601a60205260409020546001600160a01b0316614cfe8584836144c3565b610dfc848483614949565b60006001614d1684611891565b614d209190615dd2565b600083815260226020526040902054909150808214614d73576001600160a01b03841660009081526021602090815260408083208584528252808320548484528184208190558352602290915290208190555b5060009182526022602090815260408084208490556001600160a01b039094168352602181528383209183525290812055565b602354600090614db890600190615dd2565b60008381526024602052604081205460238054939450909284908110614de057614de061586d565b906000526020600020015490508060238381548110614e0157614e0161586d565b6000918252602080832090910192909255828152602490915260408082208490558582528120556023805480614e3957614e39615de5565b6001900381819060005260206000200160009055905550505050565b6000614e6083611891565b6001600160a01b039093166000908152602160209081526040808320868452825280832085905593825260229052919091209190915550565b5080546000825590600052602060002090810190610a929190614ef1565b508054614ec390615792565b6000825580601f10614ed3575050565b601f016020900490600052602060002090810190610a929190614f10565b5b808211156111e35780546001600160b01b0319168155600101614ef2565b5b808211156111e35760008155600101614f11565b6001600160e01b031981168114610a9257600080fd5b600060208284031215614f4d57600080fd5b813561137181614f25565b6001600160a01b0381168114610a9257600080fd5b600060208284031215614f7f57600080fd5b813561137181614f58565b60005b83811015614fa5578181015183820152602001614f8d565b50506000910152565b60008151808452614fc6816020860160208601614f8a565b601f01601f19169290920160200192915050565b6020815260006113716020830184614fae565b6000806040838503121561500057600080fd5b823561500b81614f58565b9150602083013561501b81614f58565b809150509250929050565b60006020828403121561503857600080fd5b5035919050565b6000806040838503121561505257600080fd5b823561505d81614f58565b946020939093013593505050565b600081518084526020808501945080840160005b8381101561509b5781518752958201959082019060010161507f565b509495945050505050565b602081526000611371602083018461506b565b60008083601f8401126150cb57600080fd5b5081356001600160401b038111156150e257600080fd5b602083019150836020828501011115610f8b57600080fd5b60008060006040848603121561510f57600080fd5b8335925060208401356001600160401b0381111561512c57600080fd5b615138868287016150b9565b9497909650939450505050565b60008083601f84011261515757600080fd5b5081356001600160401b0381111561516e57600080fd5b6020830191508360208260051b8501011115610f8b57600080fd5b6000806000806000606086880312156151a157600080fd5b8535945060208601356001600160401b03808211156151bf57600080fd5b6151cb89838a01615145565b909650945060408801359150808211156151e457600080fd5b506151f188828901615145565b969995985093965092949392505050565b60008060006060848603121561521757600080fd5b833561522281614f58565b9250602084013561523281614f58565b929592945050506040919091013590565b6000806040838503121561525657600080fd5b50508035926020909101359150565b6000806020838503121561527857600080fd5b82356001600160401b0381111561528e57600080fd5b61529a858286016150b9565b90969095509350505050565b6000806000604084860312156152bb57600080fd5b83356152c681614f58565b925060208401356001600160401b0381111561512c57600080fd5b6020808252825182820181905260009190848201906040850190845b818110156153225783516001600160a01b0316835292840192918401916001016152fd565b50909695505050505050565b6000806000806040858703121561534457600080fd5b84356001600160401b038082111561535b57600080fd5b61536788838901615145565b9096509450602087013591508082111561538057600080fd5b5061538d87828801615145565b95989497509550505050565b6000806000604084860312156153ae57600080fd5b83356153b981614f58565b925060208401356001600160401b038111156153d457600080fd5b61513886828701615145565b8015158114610a9257600080fd5b6000806000806060858703121561540457600080fd5b843561540f81614f58565b935060208501356001600160401b0381111561542a57600080fd5b615436878288016150b9565b909450925050604085013561544a816153e0565b939692955090935050565b60008060006040848603121561546a57600080fd5b83356001600160401b0381111561548057600080fd5b61548c868287016150b9565b90945092505060208401356154a0816153e0565b809150509250925092565b600080604083850312156154be57600080fd5b82356154c981614f58565b9150602083013561501b816153e0565b6000602082840312156154eb57600080fd5b8135611371816153e0565b6000806040838503121561550957600080fd5b823561551481614f58565b9150602083013561ffff8116811461501b57600080fd5b60008060008060006060868803121561554357600080fd5b853561554e81614f58565b945060208601356001600160401b03808211156151bf57600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156155a8576155a861556a565b604052919050565b60006001600160401b038211156155c9576155c961556a565b50601f01601f191660200190565b600080600080608085870312156155ed57600080fd5b84356155f881614f58565b9350602085013561560881614f58565b92506040850135915060608501356001600160401b0381111561562a57600080fd5b8501601f8101871361563b57600080fd5b803561564e615649826155b0565b615580565b81815288602083850101111561566357600080fd5b8160208401602083013760006020838301015280935050505092959194509250565b600081518084526020808501945080840160005b8381101561509b5781516001600160a01b031687529582019590820190600101615699565b6020815260006113716020830184615685565b6040815260006156e46040830185615685565b82810360208401526156f6818561506b565b95945050505050565b803569ffffffffffffffffffff81168114610eac57600080fd5b6000806040838503121561572c57600080fd5b823561573781614f58565b9150615745602084016156ff565b90509250929050565b60208082526024908201527f41646d696e436f6e74726f6c3a204d757374206265206f776e6572206f7220616040820152633236b4b760e11b606082015260800190565b600181811c908216806157a657607f821691505b60208210810361424857634e487b7160e01b600052602260045260246000fd5b6020808252601190820152702737b732bc34b9ba32b73a103a37b5b2b760791b604082015260600190565b602080825260159082015274115e1d195b9cda5bdb88189b1858dadb1a5cdd1959605a1b604082015260600190565b6020808252602d908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526c1c881bdc88185c1c1c9bdd9959609a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016158ab576158ab615883565b5060010190565b80820180821115610a3057610a30615883565b6000808335601e198436030181126158dc57600080fd5b8301803591506001600160401b038211156158f657600080fd5b602001915036819003821315610f8b57600080fd5b60006020828403121561591d57600080fd5b611371826156ff565b6020808252600d908201526c125b9d985b1a59081a5b9c1d5d609a1b604082015260600190565b60208082526022908201527f45524337323143726561746f723a20496e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b601f821115610cbc57600081815260208120601f850160051c810160208610156159b65750805b601f850160051c820191505b8181101561294a578281556001016159c2565b6001600160401b038311156159ec576159ec61556a565b615a00836159fa8354615792565b8361598f565b6000601f841160018114615a345760008515615a1c5750838201355b600019600387901b1c1916600186901b178355610dfc565b600083815260209020601f19861690835b82811015615a655786850135825560209485019460019092019101615a45565b5086821015615a825760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b6040808252810184905260008560608301825b87811015615ad7578235615aba81614f58565b6001600160a01b0316825260209283019290910190600101615aa7565b5083810360208501528481526001600160fb1b03851115615af757600080fd5b8460051b915081866020830137016020019695505050505050565b81516001600160401b03811115615b2b57615b2b61556a565b615b3f81615b398454615792565b8461598f565b602080601f831160018114615b745760008415615b5c5750858301515b600019600386901b1c1916600185901b17855561294a565b600085815260208120601f198616915b82811015615ba357888601518255948401946001909101908401615b84565b5085821015615bc15787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000816000190483118215151615615beb57615beb615883565b500290565b600082615c0d57634e487b7160e01b600052601260045260246000fd5b500490565b600061ffff808316818103615c2957615c29615883565b6001019392505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60006001600160401b03821115615c9e57615c9e61556a565b5060051b60200190565b600082601f830112615cb957600080fd5b81516020615cc961564983615c85565b82815260059290921b84018101918181019086841115615ce857600080fd5b8286015b84811015615d035780518352918301918301615cec565b509695505050505050565b60008060408385031215615d2157600080fd5b82516001600160401b0380821115615d3857600080fd5b818501915085601f830112615d4c57600080fd5b81516020615d5c61564983615c85565b82815260059290921b84018101918181019089841115615d7b57600080fd5b948201945b83861015615da2578551615d9381614f58565b82529482019490820190615d80565b91880151919650909350505080821115615dbb57600080fd5b50615dc885828601615ca8565b9150509250929050565b81810381811115610a3057610a30615883565b634e487b7160e01b600052603160045260246000fd5b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090615e2e90830184614fae565b9695505050505050565b600060208284031215615e4a57600080fd5b815161137181614f25565b60008154615e6281615792565b60018281168015615e7a5760018114615e8f57615ebe565b60ff1984168752821515830287019450615ebe565b8560005260208060002060005b85811015615eb55781548a820152908401908201615e9c565b50505082870194505b5050505092915050565b60006127ab615ed78386615e55565b84615e55565b600060208284031215615eef57600080fd5b81516001600160401b03811115615f0557600080fd5b8201601f81018413615f1657600080fd5b8051615f24615649826155b0565b818152856020838501011115615f3957600080fd5b6156f6826020830160208601614f8a565b6000615f568285615e55565b8351615f66818360208801614f8a565b01949350505050565b600060208284031215615f8157600080fd5b8151611371816153e056fea2646970667358221220f5403fc3c5bf5f6ae673d9e61bf048d5468fd6c2fb78208a5d33ca9547e6bce364736f6c63430008100033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000b544553544242544d4d544d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034d4d4d0000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _name (string): TESTBBTMMTM
Arg [1] : _symbol (string): MMM
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 000000000000000000000000000000000000000000000000000000000000000b
Arg [3] : 544553544242544d4d544d000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [5] : 4d4d4d0000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
147831:633:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;146322:339;;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;146322:339:0;;;;;;;;115663:128;;;;;;:::i;:::-;;:::i;:::-;;130672:192;;;;;;:::i;:::-;;:::i;:::-;;;1126:25:1;;;1114:2;1099:18;130672:192:0;980:177:1;100503:100:0;;;:::i;:::-;;;;;;;:::i;131367:219::-;;;;;;:::i;:::-;;:::i;101320:171::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2660:32:1;;;2642:51;;2630:2;2615:18;101320:171:0;2496:203:1;100838:416:0;;;;;;:::i;:::-;;:::i;132678:155::-;;;;;;:::i;:::-;;:::i;126162:197::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;117692:136::-;;;;;;:::i;:::-;;:::i;140415:113::-;140503:10;:17;140415:113;;124634:263;;;;;;:::i;:::-;;:::i;77072:117::-;77161:20;;-1:-1:-1;;;;;77161:20:0;77072:117;;123512:367;;;;;;:::i;:::-;;:::i;102018:333::-;;;;;;:::i;:::-;;:::i;21129:139::-;;;;;;:::i;:::-;;:::i;132133:130::-;132198:7;132225:30;;:18;:30;;;;132133:130;;120499:172;;;;;;:::i;:::-;;:::i;126434:225::-;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;6723:32:1;;;6705:51;;6787:2;6772:18;;6765:34;;;;6678:18;126434:225:0;6531:274:1;20851:210:0;;;;;;:::i;:::-;;:::i;140079:260::-;;;;;;:::i;:::-;;:::i;117298:118::-;;;;;;:::i;:::-;;:::i;114849:208::-;;;;;;:::i;:::-;;:::i;20229:267::-;;;:::i;:::-;;;;;;;:::i;124361:201::-;;;;;;:::i;:::-;;:::i;121813:467::-;;;;;;:::i;:::-;;:::i;115875:158::-;;;;;;:::i;:::-;;:::i;115134:242::-;;;;;;:::i;:::-;;:::i;122364:468::-;;;;;;:::i;:::-;;:::i;102422:185::-;;;;;;:::i;:::-;;:::i;123949:340::-;;;;;;:::i;:::-;;:::i;140605:233::-;;;;;;:::i;:::-;;:::i;126998:132::-;;;;;;:::i;:::-;;:::i;116871:352::-;;;;;;:::i;:::-;;:::i;130961:312::-;;;;;;:::i;:::-;;:::i;100205:231::-;;;;;;:::i;:::-;;:::i;116381:161::-;;;;;;:::i;:::-;;:::i;132931:273::-;;;;;;:::i;:::-;;:::i;20569:210::-;;;;;;:::i;:::-;;:::i;99936:207::-;;;;;;:::i;:::-;;:::i;17717:103::-;;;:::i;118532:144::-;;;;;;:::i;:::-;;:::i;118750:166::-;;;;;;:::i;:::-;;:::i;119480:439::-;;;;;;:::i;:::-;;:::i;116117:178::-;;;;;;:::i;:::-;;:::i;67537:323::-;;;:::i;17069:87::-;17115:7;17142:6;-1:-1:-1;;;;;17142:6:0;17069:87;;100672:104;;;:::i;117493:128::-;;;;;;:::i;:::-;;:::i;101563:153::-;;;;;;:::i;:::-;;:::i;117899:319::-;;;;;;:::i;:::-;;:::i;68478:166::-;;;;;;:::i;:::-;;:::i;118995:406::-;;;;;;:::i;:::-;;:::i;124978:228::-;;;;;;:::i;:::-;;:::i;127474:131::-;;;;;;:::i;:::-;127533:6;127566:19;;;:10;:19;;;;;:24;-1:-1:-1;;;127566:24:0;;127594:2;127566:30;;;;127474:131;;;;14747:22:1;14735:35;;;14717:54;;14705:2;14690:18;127474:131:0;14573:204:1;102678:320:0;;;;;;:::i;:::-;;:::i;125872:221::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;125278:228::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;147647:177::-;;;;;;:::i;:::-;;:::i;115455:130::-;;;;;;:::i;:::-;;:::i;132355:234::-;;;;;;:::i;:::-;;:::i;121023:188::-;;;;;;:::i;:::-;;:::i;131689:353::-;;;;;;:::i;:::-;;:::i;121295:434::-;;;;;;:::i;:::-;;:::i;116622:169::-;;;;;;:::i;:::-;;:::i;101787:164::-;;;;;;:::i;:::-;;:::i;118296:162::-;;;;;;:::i;:::-;;:::i;17975:201::-;;;;;;:::i;:::-;;:::i;120750:194::-;;;;;;:::i;:::-;;:::i;77488:35::-;;77522:1;77488:35;;146322:339;146469:4;-1:-1:-1;;;;;;146493:61:0;;-1:-1:-1;;;146493:61:0;;:109;;;146558:44;146590:11;146558:31;:44::i;:::-;146493:160;;;;146606:47;146641:11;146606:34;:47::i;:::-;146486:167;146322:339;-1:-1:-1;;146322:339:0:o;115663:128::-;20053:10;20042:7;17115;17142:6;-1:-1:-1;;;;;17142:6:0;;17069:87;20042:7;-1:-1:-1;;;;;20042:21:0;;:53;;;-1:-1:-1;20067:28:0;:7;20084:10;20067:16;:28::i;:::-;20034:102;;;;-1:-1:-1;;;20034:102:0;;;;;;;:::i;:::-;;;;;;;;;115753:30:::1;115773:9;115753:19;:30::i;:::-;115663:128:::0;:::o;130672:192::-;130759:7;130779:30;130799:9;130779:19;:30::i;:::-;-1:-1:-1;;;;;;130827:29:0;;;;;:18;:29;;;;;;;130672:192::o;100503:100::-;100557:13;100590:5;100583:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;100503:100;:::o;131367:219::-;131467:7;131487:30;131507:9;131487:19;:30::i;:::-;-1:-1:-1;;;;;;131535:36:0;;;;;;;:25;:36;;;;;;;;:43;;;;;;;;;;;;;131367:219::o;101320:171::-;101396:7;101416:23;101431:7;101416:14;:23::i;:::-;-1:-1:-1;101459:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;101459:24:0;;101320:171::o;100838:416::-;100919:13;100935:27;100954:7;100935:18;:27::i;:::-;100919:43;;100987:5;-1:-1:-1;;;;;100981:11:0;:2;-1:-1:-1;;;;;100981:11:0;;100973:57;;;;-1:-1:-1;;;100973:57:0;;19160:2:1;100973:57:0;;;19142:21:1;19199:2;19179:18;;;19172:30;19238:34;19218:18;;;19211:62;-1:-1:-1;;;19289:18:1;;;19282:31;19330:19;;100973:57:0;18958:397:1;100973:57:0;101065:10;-1:-1:-1;;;;;101065:19:0;;;;:58;;;101088:35;101105:5;101112:10;101088:16;:35::i;:::-;101043:169;;;;-1:-1:-1;;;101043:169:0;;19562:2:1;101043:169:0;;;19544:21:1;19601:2;19581:18;;;19574:30;19640:34;19620:18;;;19613:62;19711:31;19691:18;;;19684:59;19760:19;;101043:169:0;19360:425:1;101043:169:0;101225:21;101234:2;101238:7;101225:8;:21::i;:::-;100908:346;100838:416;;:::o;132678:155::-;-1:-1:-1;;;;;132781:44:0;132754:7;132781:44;;;:37;;:44;:37;:44;;;;132678:155::o;126162:197::-;126238:13;126272:16;126280:7;126272;:16::i;:::-;126264:46;;;;-1:-1:-1;;;126264:46:0;;;;;;;:::i;:::-;126328:23;126343:7;126328:14;:23::i;117692:136::-;20053:10;20042:7;17115;17142:6;-1:-1:-1;;;;;17142:6:0;;17069:87;20042:7;-1:-1:-1;;;;;20042:21:0;;:53;;;-1:-1:-1;20067:28:0;:7;20084:10;20067:16;:28::i;:::-;20034:102;;;;-1:-1:-1;;;20034:102:0;;;;;;;:::i;:::-;117794:26:::1;117807:7;117816:3;;117794:12;:26::i;124634:263::-:0;20053:10;20042:7;17115;17142:6;-1:-1:-1;;;;;17142:6:0;;17069:87;20042:7;-1:-1:-1;;;;;20042:21:0;;:53;;;-1:-1:-1;20067:28:0;:7;20084:10;20067:16;:28::i;:::-;20034:102;;;;-1:-1:-1;;;20034:102:0;;;;;;;:::i;:::-;124794:16:::1;124802:7;124794;:16::i;:::-;124786:46;;;;-1:-1:-1::0;;;124786:46:0::1;;;;;;;:::i;:::-;124843;124857:7;124866:9;;124877:11;;124843:13;:46::i;:::-;124634:263:::0;;;;;:::o;123512:367::-;123591:17;123629:16;123637:7;123629;:16::i;:::-;123621:46;;;;-1:-1:-1;;;123621:46:0;;;;;;;:::i;:::-;123690:24;123706:7;123690:15;:24::i;:::-;123678:36;-1:-1:-1;;;;;;123733:23:0;;123725:58;;;;-1:-1:-1;;;123725:58:0;;20338:2:1;123725:58:0;;;20320:21:1;20377:2;20357:18;;;20350:30;-1:-1:-1;;;20396:18:1;;;20389:52;20458:18;;123725:58:0;20136:346:1;123725:58:0;123803:42;:22;123835:9;123803:31;:42::i;:::-;123802:43;123794:77;;;;-1:-1:-1;;;123794:77:0;;;;;;;:::i;:::-;123512:367;;;:::o;102018:333::-;102213:39;102232:10;102244:7;102213:18;:39::i;:::-;102205:97;;;;-1:-1:-1;;;102205:97:0;;;;;;;:::i;:::-;102315:28;102325:4;102331:2;102335:7;102315:9;:28::i;21129:139::-;21191:4;21227:5;-1:-1:-1;;;;;21216:16:0;:7;17115;17142:6;-1:-1:-1;;;;;17142:6:0;;17069:87;21216:7;-1:-1:-1;;;;;21216:16:0;;:43;;;-1:-1:-1;21236:23:0;:7;21253:5;21236:16;:23::i;120499:172::-;120579:7;34146:21;:19;:21::i;:::-;120599:18:::1;:16;:18::i;:::-;120635:28;120650:2;120635:28;;;;;;;;;;;::::0;120658:1:::1;120661::::0;120635:14:::1;:28::i;:::-;120628:35;;34190:20:::0;33584:1;34710:22;;34527:213;126434:225;126527:7;126536;126564:16;126572:7;126564;:16::i;:::-;126556:46;;;;-1:-1:-1;;;126556:46:0;;;;;;;:::i;:::-;126620:31;126636:7;126645:5;126620:15;:31::i;:::-;126613:38;;;;126434:225;;;;;;:::o;20851:210::-;16955:13;:11;:13::i;:::-;20930:23:::1;:7;20947:5:::0;20930:16:::1;:23::i;:::-;20926:128;;;20975:31;::::0;20995:10:::1;::::0;-1:-1:-1;;;;;20975:31:0;::::1;::::0;::::1;::::0;;;::::1;21021:21;:7;21036:5:::0;21021:14:::1;:21::i;:::-;;20851:210:::0;:::o;140079:260::-;140176:7;140212:27;140233:5;140212:20;:27::i;:::-;140204:5;:35;140196:91;;;;-1:-1:-1;;;140196:91:0;;21453:2:1;140196:91:0;;;21435:21:1;21492:2;21472:18;;;21465:30;21531:34;21511:18;;;21504:62;-1:-1:-1;;;21582:18:1;;;21575:41;21633:19;;140196:91:0;21251:407:1;140196:91:0;-1:-1:-1;;;;;;140305:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;140079:260::o;117298:118::-;20053:10;20042:7;17115;17142:6;-1:-1:-1;;;;;17142:6:0;;17069:87;20042:7;-1:-1:-1;;;;;20042:21:0;;:53;;;-1:-1:-1;20067:28:0;:7;20084:10;20067:16;:28::i;:::-;20034:102;;;;-1:-1:-1;;;20034:102:0;;;;;;;:::i;:::-;117387:21:::1;117404:3;;117387:16;:21::i;114849:208::-:0;20053:10;20042:7;17115;17142:6;-1:-1:-1;;;;;17142:6:0;;17069:87;20042:7;-1:-1:-1;;;;;20042:21:0;;:53;;;-1:-1:-1;20067:28:0;:7;20084:10;20067:16;:28::i;:::-;20034:102;;;;-1:-1:-1;;;20034:102:0;;;;;;;:::i;:::-;114963:30:::1;114983:9;114963:19;:30::i;:::-;115004:45;115023:9;115034:7;;115043:5;115004:18;:45::i;20229:267::-:0;20282:23;20341:16;:7;:14;:16::i;:::-;-1:-1:-1;;;;;20327:31:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20327:31:0;;20318:40;;20374:6;20369:96;20390:16;:7;:14;:16::i;:::-;20386:1;:20;20369:96;;;20440:13;:7;20451:1;20440:10;:13::i;:::-;20428:6;20435:1;20428:9;;;;;;;;:::i;:::-;-1:-1:-1;;;;;20428:25:0;;;:9;;;;;;;;;;;:25;20408:3;;;;:::i;:::-;;;;20369:96;;;;20229:267;:::o;124361:201::-;20053:10;20042:7;17115;17142:6;-1:-1:-1;;;;;17142:6:0;;17069:87;20042:7;-1:-1:-1;;;;;20042:21:0;;:53;;;-1:-1:-1;20067:28:0;:7;20084:10;20067:16;:28::i;:::-;20034:102;;;;-1:-1:-1;;;20034:102:0;;;;;;;:::i;:::-;124496:58:::1;124527:1;124531:9;;124542:11;;124496:22;:58::i;:::-;124361:201:::0;;;;:::o;121813:467::-;121922:25;34146:21;:19;:21::i;:::-;121960:18:::1;:16;:18::i;:::-;122014:4:::0;-1:-1:-1;;;;;122000:26:0;::::1;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;122000:26:0::1;;121989:37;;122037:20;122060:11;;122072:1;122060:13;;;;:::i;:::-;122037:36;;122099:4;;:11;;122084;;:26;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;122128:6:0::1;::::0;-1:-1:-1;122123:150:0::1;122136:15:::0;;::::1;122123:150;;;122183:46;122198:2;122202:4;;122207:1;122202:7;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;122183:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;-1:-1:-1;122183:46:0;-1:-1:-1;122214:14:0::1;::::0;-1:-1:-1;122227:1:0;;-1:-1:-1;122214:12:0;:14:::1;:::i;:::-;122183;:46::i;:::-;122169:8;122178:1;122169:11;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;:60;122256:3:::1;;122123:150;;;;121949:331;34190:20:::0;33584:1;34710:22;;34527:213;34190:20;121813:467;;;;;:::o;115875:158::-;115959:18;:16;:18::i;:::-;115988:37;116014:3;;116019:5;115988:25;:37::i;115134:242::-;20053:10;20042:7;17115;17142:6;-1:-1:-1;;;;;17142:6:0;;17069:87;20042:7;-1:-1:-1;;;;;20042:21:0;;:53;;;-1:-1:-1;20067:28:0;:7;20084:10;20067:16;:28::i;:::-;20034:102;;;;-1:-1:-1;;;20034:102:0;;;;;;;:::i;:::-;115271:30:::1;115291:9;115271:19;:30::i;:::-;115312:56;115331:9;115342:7;;115351:16;115312:18;:56::i;122364:468::-:0;122473:25;34146:21;:19;:21::i;:::-;122511:18:::1;:16;:18::i;:::-;122565:4:::0;-1:-1:-1;;;;;122551:26:0;::::1;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;122551:26:0::1;;122540:37;;122588:20;122611:11;;122623:1;122611:13;;;;:::i;:::-;122588:36;;122650:4;;:11;;122635;;:26;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;122679:6:0::1;::::0;-1:-1:-1;122674:151:0::1;122687:15:::0;;::::1;122674:151;;;122734:47;122749:2;122734:47;;;;;;;;;;;::::0;122757:4:::1;;122762:1;122757:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;122766:14;122779:1:::0;122766:12;:14:::1;:::i;122734:47::-;122720:8;122729:1;122720:11;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;:61;122808:3:::1;;122674:151;;102422:185:::0;102560:39;102577:4;102583:2;102587:7;102560:39;;;;;;;;;;;;:16;:39::i;123949:340::-;34146:21;:19;:21::i;:::-;124036:39:::1;124055:10;124067:7;124036:18;:39::i;:::-;124028:83;;;::::0;-1:-1:-1;;;124028:83:0;;23115:2:1;124028:83:0::1;::::0;::::1;23097:21:1::0;23154:2;23134:18;;;23127:30;23193:33;23173:18;;;23166:61;23244:18;;124028:83:0::1;22913:355:1::0;124028:83:0::1;124122:13;124138:16;124146:7;124138;:16::i;:::-;124122:32;;124165:17;124185:24;124201:7;124185:15;:24::i;:::-;124165:44;;124220:14;124226:7;124220:5;:14::i;:::-;124245:36;124255:5;124262:7;124271:9;124245;:36::i;:::-;124017:272;;34190:20:::0;33584:1;34710:22;;34527:213;140605:233;140680:7;140716:30;140503:10;:17;;140415:113;140716:30;140708:5;:38;140700:95;;;;-1:-1:-1;;;140700:95:0;;23475:2:1;140700:95:0;;;23457:21:1;23514:2;23494:18;;;23487:30;23553:34;23533:18;;;23526:62;-1:-1:-1;;;23604:18:1;;;23597:42;23656:19;;140700:95:0;23273:408:1;140700:95:0;140813:10;140824:5;140813:17;;;;;;;;:::i;:::-;;;;;;;;;140806:24;;140605:233;;;:::o;126998:132::-;20053:10;20042:7;17115;17142:6;-1:-1:-1;;;;;17142:6:0;;17069:87;20042:7;-1:-1:-1;;;;;20042:21:0;;:53;;;-1:-1:-1;20067:28:0;:7;20084:10;20067:16;:28::i;:::-;20034:102;;;;-1:-1:-1;;;20034:102:0;;;;;;;:::i;:::-;127088:34:::1;127112:9;127088:23;:34::i;116871:352::-:0;116983:18;:16;:18::i;:::-;117020:30;;;117012:56;;;;-1:-1:-1;;;117012:56:0;;;;;;;:::i;:::-;117084:6;117079:137;117092:19;;;117079:137;;;117129:43;117151:8;;117160:1;117151:11;;;;;;;:::i;:::-;;;;;;;117164:4;;117169:1;117164:7;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;117129:21;:43::i;:::-;117199:3;;117079:137;;130961:312;131066:7;131086:30;131106:9;131086:19;:30::i;:::-;131143:31;131164:9;131143:20;:31::i;:::-;131135:5;:39;131127:86;;;;-1:-1:-1;;;131127:86:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;131231:27:0;;;;;;;;:16;:27;;;;;;;;:34;;;;;;;;;130961:312::o;100205:231::-;100277:7;100313:19;;;:10;:19;;;;;:25;-1:-1:-1;;;;;100313:25:0;;100349:56;;;;-1:-1:-1;;;100349:56:0;;24633:2:1;100349:56:0;;;24615:21:1;24672:2;24652:18;;;24645:30;-1:-1:-1;;;24691:18:1;;;24684:54;24755:18;;100349:56:0;24431:348:1;116381:161:0;116470:18;:16;:18::i;:::-;116499:35;116527:6;;116499:27;:35::i;132931:273::-;133034:7;133070:20;133084:5;133070:13;:20::i;:::-;133062:5;:28;133054:75;;;;-1:-1:-1;;;133054:75:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;133147:42:0;;;;:35;:42;;;:35;;:42;;;:35;:42;;;:49;;;;;;;;;132931:273::o;20569:210::-;16955:13;:11;:13::i;:::-;20650:23:::1;:7;20667:5:::0;20650:16:::1;:23::i;:::-;20645:127;;20695:32;::::0;20716:10:::1;::::0;-1:-1:-1;;;;;20695:32:0;::::1;::::0;::::1;::::0;;;::::1;20742:18;:7;20754:5:::0;20742:11:::1;:18::i;99936:207::-:0;100008:7;-1:-1:-1;;;;;100036:19:0;;100028:73;;;;-1:-1:-1;;;100028:73:0;;24986:2:1;100028:73:0;;;24968:21:1;25025:2;25005:18;;;24998:30;25064:34;25044:18;;;25037:62;-1:-1:-1;;;25115:18:1;;;25108:39;25164:19;;100028:73:0;24784:405:1;100028:73:0;-1:-1:-1;;;;;;100119:16:0;;;;;:9;:16;;;;;;;99936:207::o;17717:103::-;16955:13;:11;:13::i;:::-;17782:30:::1;17809:1;17782:18;:30::i;:::-;17717:103::o:0;118532:144::-;118621:7;34146:21;:19;:21::i;:::-;20053:10:::1;20042:7;17115::::0;17142:6;-1:-1:-1;;;;;17142:6:0;;17069:87;20042:7:::1;-1:-1:-1::0;;;;;20042:21:0::1;;:53;;;-1:-1:-1::0;20067:28:0::1;:7;20084:10;20067:16;:28::i;:::-;20034:102;;;;-1:-1:-1::0;;;20034:102:0::1;;;;;;;:::i;:::-;118648:20:::2;118658:2;118648:20;;;;;;;;;;;::::0;118666:1:::2;118648:9;:20::i;118750:166::-:0;118860:7;34146:21;:19;:21::i;:::-;20053:10:::1;20042:7;17115::::0;17142:6;-1:-1:-1;;;;;17142:6:0;;17069:87;20042:7:::1;-1:-1:-1::0;;;;;20042:21:0::1;;:53;;;-1:-1:-1::0;20067:28:0::1;:7;20084:10;20067:16;:28::i;:::-;20034:102;;;;-1:-1:-1::0;;;20034:102:0::1;;;;;;;:::i;:::-;118887:21:::2;118897:2;118901:3;;118887:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;::::0;;;-1:-1:-1;118887:21:0;-1:-1:-1;118887:9:0::2;::::0;-1:-1:-1;;118887:21:0:i:2;:::-;118880:28;;34190:20:::0;33584:1;34710:22;;34527:213;119480:439;119598:25;34146:21;:19;:21::i;:::-;20053:10:::1;20042:7;17115::::0;17142:6;-1:-1:-1;;;;;17142:6:0;;17069:87;20042:7:::1;-1:-1:-1::0;;;;;20042:21:0::1;;:53;;;-1:-1:-1::0;20067:28:0::1;:7;20084:10;20067:16;:28::i;:::-;20034:102;;;;-1:-1:-1::0;;;20034:102:0::1;;;;;;;:::i;:::-;119661:4:::0;-1:-1:-1;;;;;119647:26:0;::::2;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;119647:26:0::2;;119636:37;;119684:20;119707:11;;119719:1;119707:13;;;;:::i;:::-;119684:36;;119746:4;;:11;;119731;;:26;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;119775:6:0::2;::::0;-1:-1:-1;119770:142:0::2;119783:15:::0;;::::2;119770:142;;;119830:38;119840:2;119844:4;;119849:1;119844:7;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;119830:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;::::0;;;;-1:-1:-1;119853:14:0::2;::::0;-1:-1:-1;119866:1:0;;-1:-1:-1;119853:12:0;;-1:-1:-1;119853:14:0::2;:::i;:::-;119830:9;:38::i;:::-;119816:8;119825:1;119816:11;;;;;;;;:::i;:::-;;::::0;;::::2;::::0;;;;;:52;119895:3:::2;;119770:142;;116117:178:::0;116217:18;:16;:18::i;:::-;116246:41;116272:3;;116277:9;116246:25;:41::i;67537:323::-;67594:27;67661:20;:11;:18;:20::i;:::-;-1:-1:-1;;;;;67647:35:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;67647:35:0;;67634:48;;67698:6;67693:132;67710:20;:11;:18;:20::i;:::-;67706:1;:24;67693:132;;;67764:17;:11;67779:1;67764:14;:17::i;:::-;67748:10;67759:1;67748:13;;;;;;;;:::i;:::-;-1:-1:-1;;;;;67748:33:0;;;:13;;;;;;;;;;;:33;67808:3;;67693:132;;100672:104;100728:13;100761:7;100754:14;;;;;:::i;117493:128::-;20053:10;20042:7;17115;17142:6;-1:-1:-1;;;;;17142:6:0;;17069:87;20042:7;-1:-1:-1;;;;;20042:21:0;;:53;;;-1:-1:-1;20067:28:0;:7;20084:10;20067:16;:28::i;:::-;20034:102;;;;-1:-1:-1;;;20034:102:0;;;;;;;:::i;:::-;117587:26:::1;117606:6;;117587:18;:26::i;101563:153::-:0;101658:50;101677:10;101689:8;101699;101658:18;:50::i;117899:319::-;20053:10;20042:7;17115;17142:6;-1:-1:-1;;;;;17142:6:0;;17069:87;20042:7;-1:-1:-1;;;;;20042:21:0;;:53;;;-1:-1:-1;20067:28:0;:7;20084:10;20067:16;:28::i;:::-;20034:102;;;;-1:-1:-1;;;20034:102:0;;;;;;;:::i;:::-;118024:30;;::::1;118016:56;;;;-1:-1:-1::0;;;118016:56:0::1;;;;;;;:::i;:::-;118088:6;118083:128;118096:19:::0;;::::1;118083:128;;;118133:34;118146:8;;118155:1;118146:11;;;;;;;:::i;:::-;;;;;;;118159:4;;118164:1;118159:7;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;118133:12;:34::i;:::-;118194:3;;118083:128;;68478:166:::0;68558:18;:16;:18::i;:::-;68587:49;68616:10;68628:7;68587:28;:49::i;118995:406::-;119103:25;34146:21;:19;:21::i;:::-;20053:10:::1;20042:7;17115::::0;17142:6;-1:-1:-1;;;;;17142:6:0;;17069:87;20042:7:::1;-1:-1:-1::0;;;;;20042:21:0::1;;:53;;;-1:-1:-1::0;20067:28:0::1;:7;20084:10;20067:16;:28::i;:::-;20034:102;;;;-1:-1:-1::0;;;20034:102:0::1;;;;;;;:::i;:::-;119166:5:::2;119152:20;;-1:-1:-1::0;;;;;119152:20:0::2;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;119152:20:0::2;;119141:31;;119183:20;119206:11;;119218:1;119206:13;;;;:::i;:::-;119183:36;;119245:5;119230:20;;:11;;:20;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;119268:6:0::2;::::0;-1:-1:-1;119263:131:0::2;119280:5;119276:9;;:1;:9;119263:131;;;119317:33;119327:2;119317:33;;;;;;;;;;;::::0;119348:1:::2;119335:12;:14;;;;:::i;119317:33::-;119303:8;119312:1;119303:11;;;;;;;;:::i;:::-;;::::0;;::::2;::::0;;;;;:47;119377:3:::2;;119263:131;;;;119130:271;34190:20:::0;33584:1;34710:22;;34527:213;124978:228;20053:10;20042:7;17115;17142:6;-1:-1:-1;;;;;17142:6:0;;17069:87;20042:7;-1:-1:-1;;;;;20042:21:0;;:53;;;-1:-1:-1;20067:28:0;:7;20084:10;20067:16;:28::i;:::-;20034:102;;;;-1:-1:-1;;;20034:102:0;;;;;;;:::i;:::-;125141:57:::1;125164:9;125175;;125186:11;;125141:22;:57::i;102678:320::-:0;102852:39;102871:10;102883:7;102852:18;:39::i;:::-;102844:97;;;;-1:-1:-1;;;102844:97:0;;;;;;;:::i;:::-;102952:38;102966:4;102972:2;102976:7;102985:4;102952:13;:38::i;125872:221::-;125955:24;126000:16;126008:7;126000;:16::i;:::-;125992:46;;;;-1:-1:-1;;;125992:46:0;;;;;;;:::i;:::-;126056:29;126077:7;126056:20;:29::i;125278:228::-;125357:24;125383:16;125420;125428:7;125420;:16::i;:::-;125412:46;;;;-1:-1:-1;;;125412:46:0;;;;;;;:::i;:::-;125476:22;125490:7;125476:13;:22::i;:::-;125469:29;;;;125278:228;;;:::o;147647:177::-;147752:13;147785:31;147808:7;147785:22;:31::i;115455:130::-;20053:10;20042:7;17115;17142:6;-1:-1:-1;;;;;17142:6:0;;17069:87;20042:7;-1:-1:-1;;;;;20042:21:0;;:53;;;-1:-1:-1;20067:28:0;:7;20084:10;20067:16;:28::i;:::-;20034:102;;;;-1:-1:-1;;;20034:102:0;;;;;;;:::i;:::-;115546:31:::1;115567:9;115546:20;:31::i;132355:234::-:0;132436:7;132225:30;;;:18;:30;;;;132464:5;:25;132456:72;;;;-1:-1:-1;;;132456:72:0;;;;;;;:::i;:::-;-1:-1:-1;132546:28:0;:35;;;:28;;:35;:28;:35;;;;132355:234::o;121023:188::-;121116:7;34146:21;:19;:21::i;:::-;121136:18:::1;:16;:18::i;:::-;121172:31;121187:2;121172:31;;;;;;;;;;;::::0;121195:4:::1;121201:1;121172:14;:31::i;:::-;121165:38;;34190:20:::0;33584:1;34710:22;;34527:213;131689:353;131816:7;131836:30;131856:9;131836:19;:30::i;:::-;131893:36;131912:9;131923:5;131893:18;:36::i;:::-;131885:5;:44;131877:91;;;;-1:-1:-1;;;131877:91:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;131986:34:0;;;;;;;:23;:34;;;;;;;;:41;;;;;;;;;;;;:48;;;;;;;;131689:353::o;121295:434::-;121394:25;34146:21;:19;:21::i;:::-;121432:18:::1;:16;:18::i;:::-;121486:5;121472:20;;-1:-1:-1::0;;;;;121472:20:0::1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;121472:20:0::1;;121461:31;;121503:20;121526:11;;121538:1;121526:13;;;;:::i;:::-;121503:36;;121565:5;121550:20;;:11;;:20;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;121588:6:0::1;::::0;-1:-1:-1;121583:139:0::1;121600:5;121596:9;;:1;:9;121583:139;;;121637:41;121652:2;121637:41;;;;;;;;;;;::::0;121660:1:::1;121676;121663:12;:14;;;;:::i;121637:41::-;121623:8;121632:1;121623:11;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;:55;121705:3:::1;;121583:139;;116622:169:::0;116719:18;:16;:18::i;:::-;116748:35;116770:7;116779:3;;116748:21;:35::i;101787:164::-;-1:-1:-1;;;;;101908:25:0;;;101884:4;101908:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;101787:164::o;118296:162::-;20053:10;20042:7;17115;17142:6;-1:-1:-1;;;;;17142:6:0;;17069:87;20042:7;-1:-1:-1;;;;;20042:21:0;;:53;;;-1:-1:-1;20067:28:0;:7;20084:10;20067:16;:28::i;:::-;20034:102;;;;-1:-1:-1;;;20034:102:0;;;;;;;:::i;:::-;118407:43:::1;118427:9;118438:11;118407:19;:43::i;17975:201::-:0;16955:13;:11;:13::i;:::-;-1:-1:-1;;;;;18064:22:0;::::1;18056:73;;;::::0;-1:-1:-1;;;18056:73:0;;25396:2:1;18056:73:0::1;::::0;::::1;25378:21:1::0;25435:2;25415:18;;;25408:30;25474:34;25454:18;;;25447:62;-1:-1:-1;;;25525:18:1;;;25518:36;25571:19;;18056:73:0::1;25194:402:1::0;18056:73:0::1;18140:28;18159:8;18140:18;:28::i;120750:194::-:0;120851:7;34146:21;:19;:21::i;:::-;120871:18:::1;:16;:18::i;:::-;120907:29;120922:2;120926:3;;120907:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;-1:-1:-1;120907:29:0;-1:-1:-1;120907:29:0;;-1:-1:-1;120907:14:0::1;::::0;-1:-1:-1;120907:29:0:i:1;114282:302::-:0;114412:4;114436:48;114472:11;114436:35;:48::i;:::-;:93;;;;114488:41;114517:11;114488:28;:41::i;:::-;114436:140;;;;114533:43;114564:11;114533:30;:43::i;139767:228::-;139873:4;-1:-1:-1;;;;;;139897:50:0;;-1:-1:-1;;;139897:50:0;;:90;;;139951:36;139975:11;139951:23;:36::i;10889:167::-;-1:-1:-1;;;;;11023:23:0;;10969:4;6241:19;;;:12;;;:19;;;;;;:24;;10993:55;6144:129;69155:511;-1:-1:-1;;;;;69230:23:0;;;;;;:53;;-1:-1:-1;;;;;;69257:26:0;;69278:4;69257:26;;69230:53;69222:91;;;;-1:-1:-1;;;69222:91:0;;25803:2:1;69222:91:0;;;25785:21:1;25842:2;25822:18;;;25815:30;25881:27;25861:18;;;25854:55;25926:18;;69222:91:0;25601:349:1;69222:91:0;69327:31;:11;69348:9;69327:20;:31::i;:::-;69323:154;;;69379:44;;69412:10;;-1:-1:-1;;;;;69379:44:0;;;;;;;;69437:29;:11;69456:9;69437:18;:29::i;:::-;;69323:154;69491:42;:22;69523:9;69491:31;:42::i;:::-;69486:173;;69554:43;;69586:10;;-1:-1:-1;;;;;69554:43:0;;;;;;;;69611:37;:22;69638:9;69611:26;:37::i;67303:158::-;67385:42;:22;67417:9;67385:31;:42::i;:::-;67384:43;67376:77;;;;-1:-1:-1;;;67376:77:0;;;;;;;:::i;110295:135::-;110377:16;110385:7;110377;:16::i;:::-;110369:53;;;;-1:-1:-1;;;110369:53:0;;24633:2:1;110369:53:0;;;24615:21:1;24672:2;24652:18;;;24645:30;-1:-1:-1;;;24691:18:1;;;24684:54;24755:18;;110369:53:0;24431:348:1;109570:178:0;109645:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;109645:29:0;-1:-1:-1;;;;;109645:29:0;;;;;;;;:24;;109699:27;109645:24;109699:18;:27::i;:::-;-1:-1:-1;;;;;109690:50:0;;;;;;;;;;;109570:178;;:::o;104505:136::-;104570:4;104594:19;;;:10;:19;;;;;:25;-1:-1:-1;;;;;104594:25:0;:39;;;104505:136::o;74053:137::-;74117:20;74160:22;74174:7;74160:13;:22::i;70910:229::-;71008:1;70998:7;:11;:37;;;;;71024:11;;71013:7;:22;;70998:37;:79;;;;-1:-1:-1;71075:1:0;71039:24;71055:7;71039:15;:24::i;:::-;-1:-1:-1;;;;;71039:38:0;;70998:79;70990:105;;;;-1:-1:-1;;;70990:105:0;;26157:2:1;70990:105:0;;;26139:21:1;26196:2;26176:18;;;26169:30;-1:-1:-1;;;26215:18:1;;;26208:43;26268:18;;70990:105:0;25955:337:1;70990:105:0;71106:19;;;;:10;:19;;;;;:25;71128:3;;71106:19;:25;:::i;74697:353::-;74826:39;74842:9;;74853:11;;74826:15;:39::i;:::-;74883:22;;;;:13;:22;;;;;74876:29;;;:::i;:::-;74916:61;74930:9;;74941:11;;74954:13;:22;74968:7;74954:22;;;;;;;;;;;74916:13;:61::i;:::-;75010:7;74993:49;75019:9;;75030:11;;74993:49;;;;;;;;;:::i;:::-;;;;;;;;74697:353;;;;;:::o;127138:261::-;127211:7;127262:19;;;:10;:19;;;;;:24;-1:-1:-1;;;127262:24:0;;-1:-1:-1;;;;;127262:24:0;;;127302:19;;;;127298:42;;-1:-1:-1;127338:1:0;;127138:261;-1:-1:-1;;127138:261:0:o;127298:42::-;127358:33;;;;;;:17;:33;;;;;;-1:-1:-1;;;;;127358:33:0;;127138:261;-1:-1:-1;;127138:261:0:o;104808:268::-;104901:4;104918:13;104934:27;104953:7;104934:18;:27::i;:::-;104918:43;;104991:5;-1:-1:-1;;;;;104980:16:0;:7;-1:-1:-1;;;;;104980:16:0;;:52;;;;105000:32;105017:5;105024:7;105000:16;:32::i;:::-;104980:87;;;;105060:7;-1:-1:-1;;;;;105036:31:0;:20;105048:7;105036:11;:20::i;:::-;-1:-1:-1;;;;;105036:31:0;;104980:87;104972:96;104808:268;-1:-1:-1;;;;104808:268:0:o;108227:1224::-;108351:26;108380:19;;;:10;:19;;;;;;;;;108351:48;;;;;;;;;-1:-1:-1;;;;;108351:48:0;;;;;;-1:-1:-1;;;108351:48:0;;;-1:-1:-1;;;;;108351:48:0;;;;;;;;;108460:13;;;;108452:63;;;;-1:-1:-1;;;108452:63:0;;29637:2:1;108452:63:0;;;29619:21:1;29676:2;29656:18;;;29649:30;29715:34;29695:18;;;29688:62;-1:-1:-1;;;29766:18:1;;;29759:35;29811:19;;108452:63:0;29435:401:1;108452:63:0;-1:-1:-1;;;;;108534:16:0;;108526:65;;;;-1:-1:-1;;;108526:65:0;;30043:2:1;108526:65:0;;;30025:21:1;30082:2;30062:18;;;30055:30;30121:34;30101:18;;;30094:62;-1:-1:-1;;;30172:18:1;;;30165:34;30216:19;;108526:65:0;29841:400:1;108526:65:0;108618:14;;;;108645:45;108666:4;108672:2;108676:7;108618:14;108645:20;:45::i;:::-;108755:29;108772:1;108776:7;108755:8;:29::i;:::-;-1:-1:-1;;;;;109236:15:0;;;;;;;:9;:15;;;;;;;;:20;;-1:-1:-1;;109236:20:0;;;109271:13;;;;;;;;;:18;;109255:1;109271:18;;;109311:19;;;:10;:19;;;;;;:30;;-1:-1:-1;;;;;;109311:30:0;;;;;109359:27;;109322:7;;109271:13;109236:15;109359:27;;;109399:44;108340:1111;;;108227:1224;;;:::o;34226:293::-;33628:1;34360:7;;:19;34352:63;;;;-1:-1:-1;;;34352:63:0;;30448:2:1;34352:63:0;;;30430:21:1;30487:2;30467:18;;;30460:30;30526:33;30506:18;;;30499:61;30577:18;;34352:63:0;30246:355:1;34352:63:0;33628:1;34493:7;:18;34226:293::o;67091:134::-;67152:32;:11;67173:10;67152:20;:32::i;:::-;67144:73;;;;-1:-1:-1;;;67144:73:0;;30808:2:1;67144:73:0;;;30790:21:1;30847:2;30827:18;;;30820:30;30886;30866:18;;;30859:58;30934:18;;67144:73:0;30606:352:1;122896:542:0;123006:7;123030;123041:1;123030:12;123026:94;;123061:11;;123059:13;;;;;:::i;:::-;;;;-1:-1:-1;123097:11:0;;;-1:-1:-1;123026:94:0;123132:34;123154:2;123158:7;123132:21;:34::i;:::-;123203:30;123221:2;123225:7;123203:17;:30::i;:::-;123300:10;123282:29;;;;:17;:29;;;;;;123246:66;;123256:2;;123260:7;;123282:29;;123277:2;123269:10;;;123246:66;;;:9;:66::i;:::-;123329:17;;:21;123325:79;;123367:19;;;;:10;:19;;;;;:25;123389:3;123367:19;:25;:::i;:::-;;123325:79;-1:-1:-1;123423:7:0;122896:542;-1:-1:-1;;;122896:542:0:o;74198:439::-;74278:16;74296:14;74323:34;74359:20;74383:22;74397:7;74383:13;:22::i;:::-;74322:83;;;;74444:1;74424:9;:16;:21;;74416:62;;;;-1:-1:-1;;;74416:62:0;;32522:2:1;74416:62:0;;;32504:21:1;32561:2;32541:18;;;32534:30;32600;32580:18;;;32573:58;32648:18;;74416:62:0;32320:352:1;74416:62:0;74503:9;:16;74523:1;74503:21;74499:79;;74557:4;74564:1;74541:25;;;;;;;;74499:79;74596:9;74606:1;74596:12;;;;;;;;:::i;:::-;;;;;;;74623:5;74617;74610:3;74614:1;74610:6;;;;;;;;:::i;:::-;;;;;;;:12;;;;:::i;:::-;:18;;;;:::i;:::-;74588:41;;;;;;74198:439;;;;;:::o;17234:132::-;17115:7;17142:6;-1:-1:-1;;;;;17142:6:0;15858:10;17298:23;17290:68;;;;-1:-1:-1;;;17290:68:0;;33406:2:1;17290:68:0;;;33388:21:1;;;33425:18;;;33418:30;33484:34;33464:18;;;33457:62;33536:18;;17290:68:0;33204:356:1;10645:158:0;10718:4;10742:53;10750:3;-1:-1:-1;;;;;10770:23:0;;10742:7;:53::i;70508:110::-;70575:29;;;:17;:29;;;:35;70607:3;;70575:29;:35;:::i;82126:484::-;82258:17;;82278:6;82258:17;;;:26;82250:58;;;;-1:-1:-1;;;82250:58:0;;33767:2:1;82250:58:0;;;33749:21:1;33806:2;33786:18;;;33779:30;-1:-1:-1;;;33825:18:1;;;33818:49;33884:18;;82250:58:0;33565:343:1;82250:58:0;-1:-1:-1;;;;;82323:28:0;;;;;;:17;:28;;;;;;;;:33;;82319:211;;82375:17;82373:19;;82375:17;;82373:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;82438:17;;;-1:-1:-1;;;;;82407:28:0;;-1:-1:-1;82407:28:0;;;:17;:28;;;;;;;;:48;;82438:17;;;-1:-1:-1;;82407:48:0;;;;;;;;;;82488:17;;;;;82470:36;;:17;:36;;;;;;:48;;-1:-1:-1;;;;;;82470:48:0;;;;;;82319:211;82540:62;82565:9;82576:7;;82585:16;82540:24;:62::i;11142:117::-;11205:7;11232:19;11240:3;6442:18;;6359:109;11613:158;11687:7;11738:22;11742:3;11754:5;11738:3;:22::i;75129:528::-;75270:39;75286:9;;75297:11;;75270:15;:39::i;:::-;-1:-1:-1;;;;;75327:28:0;;;;;;:17;:28;;;;;75320:35;;;:::i;:::-;75366:67;75380:9;;75391:11;;75404:17;:28;75422:9;-1:-1:-1;;;;;75404:28:0;-1:-1:-1;;;;;75404:28:0;;;;;;;;;;;;75366:13;:67::i;:::-;-1:-1:-1;;;;;75448:23:0;;75444:206;;75493:47;75517:9;;75528:11;;75493:47;;;;;;;;;:::i;:::-;;;;;;;;75444:206;;;75604:9;-1:-1:-1;;;;;75578:60:0;;75615:9;;75626:11;;75578:60;;;;;;;;;:::i;69741:196::-;69851:10;69833:29;;;;:17;:29;;;;;:35;69865:3;;69833:29;:35;:::i;:::-;-1:-1:-1;69906:10:0;69879:38;;;;:26;:38;;;;;:50;;-1:-1:-1;;69879:50:0;;;;;;;;;;-1:-1:-1;;69741:196:0:o;107146:744::-;107206:26;107235:19;;;:10;:19;;;;;;;;107206:48;;;;;;;;;-1:-1:-1;;;;;107206:48:0;;;;;-1:-1:-1;;;107206:48:0;;;-1:-1:-1;;;;;107206:48:0;;;;;;;;;;;;107348:54;;107206:48;;107235:19;107206:48;107348:20;:54::i;:::-;107443:29;107460:1;107464:7;107443:8;:29::i;:::-;-1:-1:-1;;;;;107693:16:0;;;;;;:9;:16;;;;;;;;:21;;-1:-1:-1;;107693:21:0;;;107743:19;;;:10;:19;;;;;;107736:26;;;107780:36;107754:7;;107693:16;107780:36;;107693:16;;107780:36;107829:53;124361:201;147412:227;147567:64;147605:5;147612:7;147621:9;147567:37;:64::i;76833:161::-;76905:20;:32;;-1:-1:-1;;;;;;76905:32:0;-1:-1:-1;;;;;76905:32:0;;;;;;;;76953:33;;2642:51:1;;;76953:33:0;;2630:2:1;2615:18;76953:33:0;;;;;;;76833:161;:::o;70224:197::-;70349:10;70321:24;70337:7;70321:15;:24::i;70014:129::-;70115:10;70095:31;;;;:19;:31;;;;;:40;70129:6;;70095:31;:40;:::i;10317:152::-;10387:4;10411:50;10416:3;-1:-1:-1;;;;;10436:23:0;;10411:4;:50::i;18336:191::-;18410:16;18429:6;;-1:-1:-1;;;;;18446:17:0;;;-1:-1:-1;;;;;;18446:17:0;;;;;;18479:40;;18429:6;;;;;;;18479:40;;18410:16;18479:40;18399:128;18336:191;:::o;119987:433::-;120079:7;120103;120114:1;120103:12;120099:94;;120134:11;;120132:13;;;;;:::i;:::-;;;;-1:-1:-1;120170:11:0;;;-1:-1:-1;120099:94:0;120231:25;120244:2;120248:7;120231:12;:25::i;:::-;120269;120279:2;120283:7;120292:1;120269:9;:25::i;:::-;120311:17;;:21;120307:79;;120349:19;;;;:10;:19;;;;;:25;120371:3;120349:19;:25;:::i;:::-;;120307:79;-1:-1:-1;120405:7:0;119987:433;-1:-1:-1;;119987:433:0:o;70707:120::-;70779:31;;;:19;:31;;;:40;70813:6;;70779:31;:40;:::i;109891:315::-;110046:8;-1:-1:-1;;;;;110037:17:0;:5;-1:-1:-1;;;;;110037:17:0;;110029:55;;;;-1:-1:-1;;;110029:55:0;;34317:2:1;110029:55:0;;;34299:21:1;34356:2;34336:18;;;34329:30;34395:27;34375:18;;;34368:55;34440:18;;110029:55:0;34115:349:1;110029:55:0;-1:-1:-1;;;;;110095:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;110095:46:0;;;;;;;;;;110157:41;;540::1;;;110157::0;;513:18:1;110157:41:0;;;;;;;109891:315;;;:::o;78463:358::-;78567:100;78599:9;-1:-1:-1;;;78567:31:0;:100::i;:::-;78563:251;;;-1:-1:-1;;;;;78684:37:0;;;;;;:26;:37;;;;;;;;;:47;;-1:-1:-1;;78684:47:0;;;;;;;;;;78751:51;;540:41:1;;;78751:51:0;;513:18:1;78751:51:0;;;;;;;78463:358;;:::o;103879:313::-;104035:28;104045:4;104051:2;104055:7;104035:9;:28::i;:::-;104082:47;104105:4;104111:2;104115:7;104124:4;104082:22;:47::i;:::-;104074:110;;;;-1:-1:-1;;;104074:110:0;;;;;;;:::i;73809:163::-;73879:34;73942:22;73956:7;72309:1422;72372:34;72408:20;72481:32;72516:13;:22;72530:7;72516:22;;;;;;;;;;;72481:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;72481:57:0;;;;-1:-1:-1;;;72481:57:0;;;;;;;;;;;;;;;;;;;;;;;;;72553:9;:16;72573:1;72553:21;72549:653;;72640:17;72660:24;72676:7;72660:15;:24::i;:::-;72640:44;-1:-1:-1;;;;;;72703:23:0;;;72699:492;;72751:88;72783:9;-1:-1:-1;;;72751:31:0;:88::i;:::-;72747:370;;;72883:74;;-1:-1:-1;;;72883:74:0;;72942:4;72883:74;;;6705:51:1;6772:18;;;6765:34;;;-1:-1:-1;;;;;72883:50:0;;;;;6678:18:1;;72883:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;72883:74:0;;;;;;;;;;;;:::i;:::-;73052:16;;72864:93;;-1:-1:-1;72864:93:0;-1:-1:-1;73052:20:0;73048:49;;73074:23;;72309:1422;;;:::o;73048:49::-;-1:-1:-1;;;;;73147:28:0;;;;;;:17;:28;;;;;;;;73135:40;;;;;;;;;;;;;;;;;;;73147:28;;73135:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;73135:40:0;;;;-1:-1:-1;;;73135:40:0;;;;;;;;;;;;;;;;;;;;;;;;;72699:492;72576:626;72549:653;73216:9;:16;73236:1;73216:21;73212:135;;73306:29;;;;:17;:29;;;;;73294:41;;73306:29;73294:41;;;;;;;;;;;;;;;;73306:29;;73294:41;;73306:29;73294:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;73294:41:0;;;;-1:-1:-1;;;73294:41:0;;;;;;;;;;;;;;;;;;;;;;;;;73212:135;73371:16;;:20;73367:357;;73442:9;:16;-1:-1:-1;;;;;73420:39:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;73420:39:0;;73408:51;;73494:9;:16;-1:-1:-1;;;;;73480:31:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;73480:31:0;;73474:37;;73531:6;73526:187;73543:9;:16;73539:1;:20;73526:187;;;73596:9;73606:1;73596:12;;;;;;;;:::i;:::-;;;;;;;:21;;;73581:9;73591:1;73581:12;;;;;;;;:::i;:::-;;;;;;:36;-1:-1:-1;;;;;73581:36:0;;;-1:-1:-1;;;;;73581:36:0;;;;;73645:9;73655:1;73645:12;;;;;;;;:::i;:::-;;;;;;;:16;;;73636:25;;:3;73640:1;73636:6;;;;;;;;:::i;:::-;;;;;;;;;;:25;73692:3;;73526:187;;;;73367:357;72430:1301;72309:1422;;;:::o;126731:189::-;126804:13;126838:16;126846:7;126838;:16::i;:::-;126830:46;;;;-1:-1:-1;;;126830:46:0;;;;;;;:::i;:::-;126894:18;126904:7;126894:9;:18::i;68927:166::-;69001:44;;69034:10;;-1:-1:-1;;;;;69001:44:0;;;;;;;;69056:29;:11;69075:9;69056:18;:29::i;78898:546::-;78995:31;:11;79016:9;78995:20;:31::i;:::-;78987:74;;;;-1:-1:-1;;;78987:74:0;;37188:2:1;78987:74:0;;;37170:21:1;37227:2;37207:18;;;37200:30;37266:32;37246:18;;;37239:60;37316:18;;78987:74:0;36986:354:1;78987:74:0;-1:-1:-1;;;;;79080:25:0;;;;:122;;;79109:93;79141:11;-1:-1:-1;;;79109:31:0;:93::i;:::-;79072:150;;;;-1:-1:-1;;;79072:150:0;;37547:2:1;79072:150:0;;;37529:21:1;37586:2;37566:18;;;37559:30;-1:-1:-1;;;37605:18:1;;;37598:45;37660:18;;79072:150:0;37345:339:1;79072:150:0;-1:-1:-1;;;;;79237:32:0;;;;;;;:21;:32;;;;;;;;:47;;;;79233:204;;-1:-1:-1;;;;;79301:32:0;;;;;;;:21;:32;;;;;;:46;;-1:-1:-1;;;;;;79301:46:0;;;;;;;;;79367:58;79414:10;;79301:46;:32;79367:58;;;78898:546;;:::o;78105:272::-;78212:4;-1:-1:-1;;;;;;78236:51:0;;-1:-1:-1;;;78236:51:0;;:93;;-1:-1:-1;;;;;;;78291:38:0;;-1:-1:-1;;;78291:38:0;78236:93;:133;;;;78333:36;78357:11;78333:23;:36::i;99567:305::-;99669:4;-1:-1:-1;;;;;;99706:40:0;;-1:-1:-1;;;99706:40:0;;:105;;-1:-1:-1;;;;;;;99763:48:0;;-1:-1:-1;;;99763:48:0;99706:158;;;;99828:36;99852:11;19667:233;19769:4;-1:-1:-1;;;;;;19793:46:0;;-1:-1:-1;;;19793:46:0;;:99;;-1:-1:-1;;;;;;;;;;1783:40:0;;;19856:36;1674:157;130330:246;130443:4;-1:-1:-1;;;;;;130467:61:0;;-1:-1:-1;;;130467:61:0;;:101;;;130532:36;130556:11;130532:23;:36::i;75750:438::-;75877:38;;;75869:64;;;;-1:-1:-1;;;75869:64:0;;;;;;;:::i;:::-;75944:24;75984:6;75979:131;75992:22;;;75979:131;;;76052:11;;76064:1;76052:14;;;;;;;:::i;:::-;;;;;;;76032:34;;;;;:::i;:::-;;-1:-1:-1;76093:3:0;;75979:131;;;;76147:5;76128:16;:24;76120:60;;;;-1:-1:-1;;;76120:60:0;;37891:2:1;76120:60:0;;;37873:21:1;37930:2;37910:18;;;37903:30;37969:25;37949:18;;;37942:53;38012:18;;76120:60:0;37689:347:1;76255:480:0;76407:6;76402:326;76415:22;;;76402:326;;;76455:9;76488:181;;;;;;;;76561:9;;76571:1;76561:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;76488:181:0;;;;;76612:11;;76624:1;76612:14;;;;;;;:::i;:::-;76488:181;76612:14;;;;;;;;;76488:181;;;;;-1:-1:-1;76455:229:0;;;;;;;;-1:-1:-1;76455:229:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;76455:229:0;-1:-1:-1;;;;;;76455:229:0;;;-1:-1:-1;;;;;76455:229:0;;;;;;;;;;76711:3;76402:326;;148050:411;-1:-1:-1;;;;;148177:18:0;;148173:217;;17115:7;17142:6;-1:-1:-1;;;;;17142:6:0;148220:10;:21;148212:73;;;;-1:-1:-1;;;148212:73:0;;38503:2:1;148212:73:0;;;38485:21:1;38542:2;38522:18;;;38515:30;38581:34;38561:18;;;38554:62;-1:-1:-1;;;38632:18:1;;;38625:37;38679:19;;148212:73:0;38301:403:1;148212:73:0;147932:3;148308:13;140503:10;:17;;140415:113;148308:13;:25;148300:78;;;;-1:-1:-1;;;148300:78:0;;38911:2:1;148300:78:0;;;38893:21:1;38950:2;38930:18;;;38923:30;38989:34;38969:18;;;38962:62;-1:-1:-1;;;39040:18:1;;;39033:38;39088:19;;148300:78:0;38709:404:1;148300:78:0;148402:51;148429:4;148435:2;148439:7;148448:4;148402:26;:51::i;79654:268::-;79760:10;79783:1;79738:33;;;:21;:33;;;;;;-1:-1:-1;;;;;79738:33:0;:47;79734:181;;79854:10;79832:33;;;;:21;:33;;;;;;;;79802:101;;-1:-1:-1;;;79802:101:0;;;;;39358:34:1;;;;-1:-1:-1;;;;;39428:15:1;;;39408:18;;;39401:43;39460:18;;;39453:34;;;79832:33:0;;79802:76;;39293:18:1;;79802:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;147197:207;147338:58;147384:2;147388:7;147338:45;:58::i;105418:139::-;105512:37;105522:2;105526:7;105535:9;105512:37;;;;;;;;;;;;:9;:37::i;4638:1420::-;4704:4;4843:19;;;:12;;;:19;;;;;;4879:15;;4875:1176;;5254:21;5278:14;5291:1;5278:10;:14;:::i;:::-;5327:18;;5254:38;;-1:-1:-1;5307:17:0;;5327:22;;5348:1;;5327:22;:::i;:::-;5307:42;;5383:13;5370:9;:26;5366:405;;5417:17;5437:3;:11;;5449:9;5437:22;;;;;;;;:::i;:::-;;;;;;;;;5417:42;;5591:9;5562:3;:11;;5574:13;5562:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:38;;;;5676:23;;;:12;;;:23;;;;;:36;;;5366:405;5852:17;;:3;;:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;5947:3;:12;;:19;5960:5;5947:19;;;;;;;;;;;5940:26;;;5990:4;5983:11;;;;;;;4875:1176;6034:5;6027:12;;;;;67921:470;-1:-1:-1;;;;;68052:26:0;;68073:4;68052:26;;;;:52;;-1:-1:-1;;;;;;68082:20:0;;56351:19;:23;;68082:22;68044:72;;;;-1:-1:-1;;;68044:72:0;;39965:2:1;68044:72:0;;;39947:21:1;40004:1;39984:18;;;39977:29;-1:-1:-1;;;40022:18:1;;;40015:37;40069:18;;68044:72:0;39763:330:1;68044:72:0;68132:42;;68163:10;;-1:-1:-1;;;;;68132:42:0;;;;;;;;-1:-1:-1;;;;;68185:28:0;;;;;;:17;:28;;;;;:38;68216:7;;68185:28;:38;:::i;:::-;-1:-1:-1;;;;;;68234:37:0;;;;;;:26;:37;;;;;:56;;-1:-1:-1;;68234:56:0;;;;;;;68301:26;:11;68234:37;68301:15;:26::i;:::-;;68338:45;68367:9;68378:4;68338:28;:45::i;6822:120::-;6889:7;6916:3;:11;;6928:5;6916:18;;;;;;;;:::i;:::-;;;;;;;;;6909:25;;6822:120;;;;:::o;136208:1765::-;136514:22;136573:1;136539:31;136560:9;136539:20;:31::i;:::-;:35;;;;:::i;:::-;136585:18;136606:30;;;:21;:30;;;;;;136514:60;;-1:-1:-1;136743:28:0;;;136739:350;;-1:-1:-1;;;;;136810:27:0;;136788:19;136810:27;;;:16;:27;;;;;;;;:43;;;;;;;;;136870:39;;;;;;:53;;;136996:34;;:21;:34;;;;;:47;;;136739:350;-1:-1:-1;;;;;137099:29:0;;;;;;:18;:29;;;;;:34;;137132:1;;137099:29;:34;;137132:1;;137099:34;:::i;:::-;;;;-1:-1:-1;;137230:30:0;;;;:21;:30;;;;;;;;137223:37;;;-1:-1:-1;;;;;137278:27:0;;;;:16;:27;;;;;:43;;;;;;;;137271:50;137675:59;137708:5;137252:7;137295:9;137675:32;:59::i;:::-;137911:54;137939:5;137946:7;137955:9;137911:27;:54::i;4048:414::-;4111:4;6241:19;;;:12;;;:19;;;;;;4128:327;;-1:-1:-1;4171:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;4354:18;;4332:19;;;:12;;;:19;;;;;;:40;;;;4387:11;;4128:327;-1:-1:-1;4438:5:0;4431:12;;146992:197;147128:53;147169:2;147173:7;147128:40;:53::i;51073:285::-;51160:4;51269:23;51284:7;51269:14;:23::i;:::-;:81;;;;;51296:54;51329:7;51338:11;51296:32;:54::i;110994:851::-;111148:4;-1:-1:-1;;;;;111169:13:0;;56351:19;:23;111165:673;;111205:69;;-1:-1:-1;;;111205:69:0;;-1:-1:-1;;;;;111205:36:0;;;;;:69;;111242:10;;111254:4;;111260:7;;111269:4;;111205:69;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;111205:69:0;;;;;;;;-1:-1:-1;;111205:69:0;;;;;;;;;;;;:::i;:::-;;;111201:582;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;111444:6;:13;111461:1;111444:18;111440:328;;111487:60;;-1:-1:-1;;;111487:60:0;;;;;;;:::i;111440:328::-;111718:6;111712:13;111703:6;111699:2;111695:15;111688:38;111201:582;-1:-1:-1;;;;;;111325:51:0;-1:-1:-1;;;111325:51:0;;-1:-1:-1;111318:58:0;;111165:673;-1:-1:-1;111822:4:0;111815:11;;71201:1038;71260:13;71304:1;71294:7;:11;:37;;;;;71320:11;;71309:7;:22;;71294:37;71286:63;;;;-1:-1:-1;;;71286:63:0;;26157:2:1;71286:63:0;;;26139:21:1;26196:2;26176:18;;;26169:30;-1:-1:-1;;;26215:18:1;;;26208:43;26268:18;;71286:63:0;25955:337:1;71286:63:0;71362:17;71382:24;71398:7;71382:15;:24::i;:::-;71362:44;-1:-1:-1;71426:42:0;:22;71362:44;71426:31;:42::i;:::-;71425:43;71417:77;;;;-1:-1:-1;;;71417:77:0;;;;;;;:::i;:::-;71517:19;;;;:10;:19;;;;;71511:33;;;;;:::i;:::-;:38;;-1:-1:-1;71507:285:0;;-1:-1:-1;;;;;71576:30:0;;;;;;:19;:30;;;;;71570:44;;;;;:::i;:::-;:49;;-1:-1:-1;71566:174:0;;-1:-1:-1;;;;;71671:30:0;;;;;;:19;:30;;;;;;;;71703:19;;;:10;:19;;;;;;71654:69;;;;71671:30;71654:69;;:::i;:::-;;;;;;;;;;;;;71640:84;;;71201:1038;;;:::o;71566:174::-;71761:19;;;;:10;:19;;;;;71754:26;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71201:1038;;;:::o;71507:285::-;71808:87;71840:9;-1:-1:-1;;;71808:31:0;:87::i;:::-;71804:196;;;71919:69;;-1:-1:-1;;;71919:69:0;;71973:4;71919:69;;;6705:51:1;6772:18;;;6765:34;;;-1:-1:-1;;;;;71919:45:0;;;;;6678:18:1;;71919:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;71919:69:0;;;;;;;;;;;;:::i;71804:196::-;-1:-1:-1;;;;;72017:37:0;;;;;;:26;:37;;;;;;;;72012:220;;-1:-1:-1;;;;;72102:28:0;;;;;;:17;:28;;;;;72132:18;:7;:16;:18::i;:::-;72085:66;;;;;;;;;:::i;72012:220::-;-1:-1:-1;;;;;72192:28:0;;;;;;:17;:28;;;;;72185:35;;;;;:::i;72012:220::-;71275:964;71201:1038;;;:::o;66500:487::-;66602:4;-1:-1:-1;;;;;;66626:45:0;;-1:-1:-1;;;66626:45:0;;:80;;-1:-1:-1;;;;;;;66675:31:0;;-1:-1:-1;;;66675:31:0;66626:80;:120;;;;66710:36;66734:11;66710:23;:36::i;:::-;66626:187;;;-1:-1:-1;;;;;;;66763:50:0;;-1:-1:-1;;;66763:50:0;66626:187;:237;;;-1:-1:-1;;;;;;;66817:46:0;;-1:-1:-1;;;66817:46:0;66626:237;:303;;;-1:-1:-1;;;;;;;66880:49:0;;-1:-1:-1;;;66880:49:0;66626:303;:353;;;-1:-1:-1;;;;;;;66933:46:0;;-1:-1:-1;;;66933:46:0;66619:360;66500:487;-1:-1:-1;;66500:487:0:o;146669:315::-;146854:49;146871:4;146877:2;146881:7;146897:4;146854:16;:49::i;:::-;146914:62;146952:4;146958:2;146962:7;146971:4;146914:37;:62::i;135787:409::-;135924:14;135941:32;135962:10;135941:20;:32::i;:::-;136001:10;135984:28;;;;:16;:28;;;;;;;;:36;;;;;;;;:46;;;136041:30;;;:21;:30;;;;;:39;;;136093:30;;;:18;:30;;;;;136091:32;;135924:49;;-1:-1:-1;136093:30:0;136091:32;;;:::i;:::-;;;;-1:-1:-1;136136:52:0;136164:2;136168:7;136177:10;136136:27;:52::i;105784:1133::-;-1:-1:-1;;;;;105948:16:0;;105940:61;;;;-1:-1:-1;;;105940:61:0;;43104:2:1;105940:61:0;;;43086:21:1;;;43123:18;;;43116:30;43182:34;43162:18;;;43155:62;43234:18;;105940:61:0;42902:356:1;105940:61:0;106021:16;106029:7;106021;:16::i;:::-;106020:17;106012:58;;;;-1:-1:-1;;;106012:58:0;;43465:2:1;106012:58:0;;;43447:21:1;43504:2;43484:18;;;43477:30;43543;43523:18;;;43516:58;43591:18;;106012:58:0;43263:352:1;106012:58:0;106083:56;106112:1;106116:2;106120:7;106129:9;106083:20;:56::i;:::-;-1:-1:-1;;;;;106488:13:0;;;;;;;:9;:13;;;;;;;;:18;;106505:1;106488:18;;;106552:76;;;;;;;;;;-1:-1:-1;;;;;106552:76:0;;;;;;;;;106530:19;;;:10;:19;;;;;;:98;;;;;-1:-1:-1;;;106530:98:0;;;;;;;;;;;;106644:33;;106541:7;;106488:13;106644:33;;106488:13;;106644:33;106778:53;106809:1;106813:2;106817:7;106826:4;106778:22;:53::i;133668:1288::-;133957:29;134033:1;133989:41;134008:15;134025:4;133989:18;:41::i;:::-;:45;;;;:::i;:::-;134045:25;134073:37;;;:28;:37;;;;;;133957:77;;-1:-1:-1;134217:42:0;;;134213:451;;-1:-1:-1;;;;;134305:40:0;;;134276:26;134305:40;;;:23;:40;;;;;;;;:46;;;;;;;;;;;:69;;;;;;;;;134391:65;;;;;;:86;;;134550:48;;;;;:68;;;134213:451;-1:-1:-1;;;;;134674:42:0;;;;;;;:25;:42;;;;;;;;:48;;;;;;;;;;;:53;;134726:1;;134674:42;:53;;134726:1;;134674:53;:::i;:::-;;;;-1:-1:-1;;;134824:37:0;;;;:28;:37;;;;;;;134817:44;;;-1:-1:-1;;;;;134879:40:0;;;;;:23;:40;;;;;:46;;;;;;;;;;;;:69;;;;;;;;;134872:76;133668:1288::o;80275:556::-;-1:-1:-1;;;;;80433:23:0;;;80429:251;;80476:93;80508:9;-1:-1:-1;;;80476:31:0;:93::i;:::-;80472:197;;;80589:65;;-1:-1:-1;;;80589:65:0;;-1:-1:-1;;;;;6723:32:1;;;80589:65:0;;;6705:51:1;6772:18;;;6765:34;;;80589:49:0;;;;;6678:18:1;;80589:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;80472:197;80736:19;;;;:10;:19;;;;;80730:33;;;;;:::i;:::-;:38;;-1:-1:-1;80726:97:0;;80792:19;;;;:10;:19;;;;;80785:26;;;:::i;135390:389::-;132225:30;;;135522:14;135567:36;;;:28;132225:30;135567:36;;;:28;:36;;;:46;;;135624:30;;;:21;:30;;;;:39;;;135676:30;;;132225:18;135676:30;;135674:32;;132225:30;;;135674:32;;;:::i;:::-;;;;-1:-1:-1;135719:52:0;135747:2;135751:7;135768:1;135719:27;:52::i;50414:433::-;50478:4;50689:68;50722:7;-1:-1:-1;;;50689:32:0;:68::i;:::-;:150;;;;-1:-1:-1;50775:64:0;50808:7;-1:-1:-1;;;;;;50775:32:0;:64::i;:::-;50774:65;50669:170;50414:433;-1:-1:-1;;50414:433:0:o;54226:662::-;54399:71;;;-1:-1:-1;;;;;;43782:33:1;;54399:71:0;;;;43764:52:1;;;;54399:71:0;;;;;;;;;;43737:18:1;;;;54399:71:0;;;;;;;;;-1:-1:-1;;;;;54399:71:0;-1:-1:-1;;;54399:71:0;;;54685:20;;54328:4;;54399:71;54328:4;;;;;;54399:71;54328:4;;54685:20;54650:7;54643:5;54632:86;54621:97;;54746:16;54732:30;;54797:4;54791:11;54776:26;;54832:7;:29;;;;;54857:4;54843:10;:18;;54832:29;:48;;;;;54879:1;54865:11;:15;54832:48;54825:55;54226:662;-1:-1:-1;;;;;;;54226:662:0:o;47882:716::-;47938:13;47989:14;48006:17;48017:5;48006:10;:17::i;:::-;48026:1;48006:21;47989:38;;48042:20;48076:6;-1:-1:-1;;;;;48065:18:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48065:18:0;-1:-1:-1;48042:41:0;-1:-1:-1;48207:28:0;;;48223:2;48207:28;48264:288;-1:-1:-1;;48296:5:0;-1:-1:-1;;;48433:2:0;48422:14;;48417:30;48296:5;48404:44;48494:2;48485:11;;;-1:-1:-1;48515:21:0;48264:288;48515:21;-1:-1:-1;48573:6:0;47882:716;-1:-1:-1;;;47882:716:0:o;81134:274::-;-1:-1:-1;;;;;81291:18:0;;81287:31;81311:7;81287:31;81366:33;;;;;;;:17;:33;;;;;;81330:70;;81347:4;;81353:2;;81357:7;;-1:-1:-1;;;;;81366:33:0;81330:16;:70::i;141451:627::-;141622:56;141649:4;141655:2;141659:7;141668:9;141622:26;:56::i;:::-;-1:-1:-1;;;;;141695:18:0;;141691:187;;141730:40;141762:7;142909:10;:17;;142882:24;;;;:15;:24;;;;;:44;;;142937:24;;;;;;;;;;;;142805:164;141730:40;141691:187;;;141800:2;-1:-1:-1;;;;;141792:10:0;:4;-1:-1:-1;;;;;141792:10:0;;141788:90;;141819:47;141852:4;141858:7;141819:32;:47::i;:::-;-1:-1:-1;;;;;141892:16:0;;141888:183;;141925:45;141962:7;141925:36;:45::i;:::-;141888:183;;;141998:4;-1:-1:-1;;;;;141992:10:0;:2;-1:-1:-1;;;;;141992:10:0;;141988:83;;142019:40;142047:2;142051:7;142019:27;:40::i;133212:448::-;133375:21;133399:39;133418:15;133435:2;133399:18;:39::i;:::-;-1:-1:-1;;;;;133449:40:0;;;;;;;:23;:40;;;;;;;;:44;;;;;;;;;;;;:59;;;;;;;;:69;;;133529:37;;;;;;;;;:53;;;133593:42;;;:25;:42;;;;;:46;;;;;;;;;:51;;133375:63;;-1:-1:-1;133643:1:0;;133593:46;;133449:40;133593:51;;133643:1;;133593:51;:::i;:::-;;;;-1:-1:-1;;;;;;133212:448:0:o;44904:922::-;44957:7;;-1:-1:-1;;;45035:15:0;;45031:102;;-1:-1:-1;;;45071:15:0;;;-1:-1:-1;45115:2:0;45105:12;45031:102;45160:6;45151:5;:15;45147:102;;45196:6;45187:15;;;-1:-1:-1;45231:2:0;45221:12;45147:102;45276:6;45267:5;:15;45263:102;;45312:6;45303:15;;;-1:-1:-1;45347:2:0;45337:12;45263:102;45392:5;45383;:14;45379:99;;45427:5;45418:14;;;-1:-1:-1;45461:1:0;45451:11;45379:99;45505:5;45496;:14;45492:99;;45540:5;45531:14;;;-1:-1:-1;45574:1:0;45564:11;45492:99;45618:5;45609;:14;45605:99;;45653:5;45644:14;;;-1:-1:-1;45687:1:0;45677:11;45605:99;45731:5;45722;:14;45718:66;;45767:1;45757:11;45812:6;44904:922;-1:-1:-1;;44904:922:0:o;81416:649::-;-1:-1:-1;;;;;81569:18:0;;81565:31;81589:7;81565:31;-1:-1:-1;;;;;81612:23:0;;;;;;:64;;-1:-1:-1;;;;;;81639:37:0;;;;;;:26;:37;;;;;;;;81612:64;81608:450;;;81701:96;;-1:-1:-1;;;81701:96:0;;81767:10;81701:96;;;44096:34:1;-1:-1:-1;;;;;44166:15:1;;;44146:18;;;44139:43;44218:15;;;44198:18;;;44191:43;44250:18;;;44243:34;;;81701:65:0;;;;;44030:19:1;;81701:96:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;81693:135;;;;-1:-1:-1;;;81693:135:0;;44740:2:1;81693:135:0;;;44722:21:1;44779:2;44759:18;;;44752:30;44818:28;44798:18;;;44791:56;44864:18;;81693:135:0;44538:350:1;81608:450:0;81850:20;;-1:-1:-1;;;;;81850:20:0;:34;81846:212;;81947:20;;81908:107;;-1:-1:-1;;;81908:107:0;;81985:10;81908:107;;;44096:34:1;-1:-1:-1;;;;;44166:15:1;;;44146:18;;;44139:43;44218:15;;;44198:18;;;44191:43;44250:18;;;44243:34;;;81947:20:0;;;;81908:76;;44030:19:1;;81908:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;81900:146;;;;-1:-1:-1;;;81900:146:0;;44740:2:1;81900:146:0;;;44722:21:1;44779:2;44759:18;;;44752:30;44818:28;44798:18;;;44791:56;44864:18;;81900:146:0;44538:350:1;134968:414:0;-1:-1:-1;;;;;135086:18:0;;;;;;:38;;-1:-1:-1;;;;;;135108:16:0;;;;135086:38;:52;;;;;135136:2;-1:-1:-1;;;;;135128:10:0;:4;-1:-1:-1;;;;;135128:10:0;;;135086:52;135082:293;;;135181:31;;;135155:23;135181:31;;;:17;:31;;;;;;-1:-1:-1;;;;;135181:31:0;135227:64;135260:4;135266:7;135181:31;135227:32;:64::i;:::-;135306:57;135334:2;135338:7;135347:15;135306:27;:57::i;143596:992::-;143862:22;143916:1;143887:26;143908:4;143887:20;:26::i;:::-;:30;;;;:::i;:::-;143928:18;143949:26;;;:17;:26;;;;;;143862:55;;-1:-1:-1;144082:28:0;;;144078:328;;-1:-1:-1;;;;;144149:18:0;;144127:19;144149:18;;;:12;:18;;;;;;;;:34;;;;;;;;;144200:30;;;;;;:44;;;144317:30;;:17;:30;;;;;:43;;;144078:328;-1:-1:-1;144502:26:0;;;;:17;:26;;;;;;;;144495:33;;;-1:-1:-1;;;;;144546:18:0;;;;;:12;:18;;;;;:34;;;;;;;144539:41;143596:992::o;144883:1079::-;145161:10;:17;145136:22;;145161:21;;145181:1;;145161:21;:::i;:::-;145193:18;145214:24;;;:15;:24;;;;;;145587:10;:26;;145136:46;;-1:-1:-1;145214:24:0;;145136:46;;145587:26;;;;;;:::i;:::-;;;;;;;;;145565:48;;145651:11;145626:10;145637;145626:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;145731:28;;;:15;:28;;;;;;;:41;;;145903:24;;;;;145896:31;145938:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;144954:1008;;;144883:1079;:::o;142379:225::-;142464:14;142481:24;142502:2;142481:20;:24::i;:::-;-1:-1:-1;;;;;142516:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;142561:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;142379:225:0:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:131::-;-1:-1:-1;;;;;667:31:1;;657:42;;647:70;;713:1;710;703:12;728:247;787:6;840:2;828:9;819:7;815:23;811:32;808:52;;;856:1;853;846:12;808:52;895:9;882:23;914:31;939:5;914:31;:::i;1162:250::-;1247:1;1257:113;1271:6;1268:1;1265:13;1257:113;;;1347:11;;;1341:18;1328:11;;;1321:39;1293:2;1286:10;1257:113;;;-1:-1:-1;;1404:1:1;1386:16;;1379:27;1162:250::o;1417:271::-;1459:3;1497:5;1491:12;1524:6;1519:3;1512:19;1540:76;1609:6;1602:4;1597:3;1593:14;1586:4;1579:5;1575:16;1540:76;:::i;:::-;1670:2;1649:15;-1:-1:-1;;1645:29:1;1636:39;;;;1677:4;1632:50;;1417:271;-1:-1:-1;;1417:271:1:o;1693:220::-;1842:2;1831:9;1824:21;1805:4;1862:45;1903:2;1892:9;1888:18;1880:6;1862:45;:::i;1918:388::-;1986:6;1994;2047:2;2035:9;2026:7;2022:23;2018:32;2015:52;;;2063:1;2060;2053:12;2015:52;2102:9;2089:23;2121:31;2146:5;2121:31;:::i;:::-;2171:5;-1:-1:-1;2228:2:1;2213:18;;2200:32;2241:33;2200:32;2241:33;:::i;:::-;2293:7;2283:17;;;1918:388;;;;;:::o;2311:180::-;2370:6;2423:2;2411:9;2402:7;2398:23;2394:32;2391:52;;;2439:1;2436;2429:12;2391:52;-1:-1:-1;2462:23:1;;2311:180;-1:-1:-1;2311:180:1:o;2704:315::-;2772:6;2780;2833:2;2821:9;2812:7;2808:23;2804:32;2801:52;;;2849:1;2846;2839:12;2801:52;2888:9;2875:23;2907:31;2932:5;2907:31;:::i;:::-;2957:5;3009:2;2994:18;;;;2981:32;;-1:-1:-1;;;2704:315:1:o;3024:435::-;3077:3;3115:5;3109:12;3142:6;3137:3;3130:19;3168:4;3197:2;3192:3;3188:12;3181:19;;3234:2;3227:5;3223:14;3255:1;3265:169;3279:6;3276:1;3273:13;3265:169;;;3340:13;;3328:26;;3374:12;;;;3409:15;;;;3301:1;3294:9;3265:169;;;-1:-1:-1;3450:3:1;;3024:435;-1:-1:-1;;;;;3024:435:1:o;3464:261::-;3643:2;3632:9;3625:21;3606:4;3663:56;3715:2;3704:9;3700:18;3692:6;3663:56;:::i;3730:348::-;3782:8;3792:6;3846:3;3839:4;3831:6;3827:17;3823:27;3813:55;;3864:1;3861;3854:12;3813:55;-1:-1:-1;3887:20:1;;-1:-1:-1;;;;;3919:30:1;;3916:50;;;3962:1;3959;3952:12;3916:50;3999:4;3991:6;3987:17;3975:29;;4051:3;4044:4;4035:6;4027;4023:19;4019:30;4016:39;4013:59;;;4068:1;4065;4058:12;4083:479;4163:6;4171;4179;4232:2;4220:9;4211:7;4207:23;4203:32;4200:52;;;4248:1;4245;4238:12;4200:52;4284:9;4271:23;4261:33;;4345:2;4334:9;4330:18;4317:32;-1:-1:-1;;;;;4364:6:1;4361:30;4358:50;;;4404:1;4401;4394:12;4358:50;4443:59;4494:7;4485:6;4474:9;4470:22;4443:59;:::i;:::-;4083:479;;4521:8;;-1:-1:-1;4417:85:1;;-1:-1:-1;;;;4083:479:1:o;4567:375::-;4638:8;4648:6;4702:3;4695:4;4687:6;4683:17;4679:27;4669:55;;4720:1;4717;4710:12;4669:55;-1:-1:-1;4743:20:1;;-1:-1:-1;;;;;4775:30:1;;4772:50;;;4818:1;4815;4808:12;4772:50;4855:4;4847:6;4843:17;4831:29;;4915:3;4908:4;4898:6;4895:1;4891:14;4883:6;4879:27;4875:38;4872:47;4869:67;;;4932:1;4929;4922:12;4947:865;5086:6;5094;5102;5110;5118;5171:2;5159:9;5150:7;5146:23;5142:32;5139:52;;;5187:1;5184;5177:12;5139:52;5223:9;5210:23;5200:33;;5284:2;5273:9;5269:18;5256:32;-1:-1:-1;;;;;5348:2:1;5340:6;5337:14;5334:34;;;5364:1;5361;5354:12;5334:34;5403:78;5473:7;5464:6;5453:9;5449:22;5403:78;:::i;:::-;5500:8;;-1:-1:-1;5377:104:1;-1:-1:-1;5588:2:1;5573:18;;5560:32;;-1:-1:-1;5604:16:1;;;5601:36;;;5633:1;5630;5623:12;5601:36;;5672:80;5744:7;5733:8;5722:9;5718:24;5672:80;:::i;:::-;4947:865;;;;-1:-1:-1;4947:865:1;;-1:-1:-1;5771:8:1;;5646:106;4947:865;-1:-1:-1;;;4947:865:1:o;5817:456::-;5894:6;5902;5910;5963:2;5951:9;5942:7;5938:23;5934:32;5931:52;;;5979:1;5976;5969:12;5931:52;6018:9;6005:23;6037:31;6062:5;6037:31;:::i;:::-;6087:5;-1:-1:-1;6144:2:1;6129:18;;6116:32;6157:33;6116:32;6157:33;:::i;:::-;5817:456;;6209:7;;-1:-1:-1;;;6263:2:1;6248:18;;;;6235:32;;5817:456::o;6278:248::-;6346:6;6354;6407:2;6395:9;6386:7;6382:23;6378:32;6375:52;;;6423:1;6420;6413:12;6375:52;-1:-1:-1;;6446:23:1;;;6516:2;6501:18;;;6488:32;;-1:-1:-1;6278:248:1:o;6810:411::-;6881:6;6889;6942:2;6930:9;6921:7;6917:23;6913:32;6910:52;;;6958:1;6955;6948:12;6910:52;6998:9;6985:23;-1:-1:-1;;;;;7023:6:1;7020:30;7017:50;;;7063:1;7060;7053:12;7017:50;7102:59;7153:7;7144:6;7133:9;7129:22;7102:59;:::i;:::-;7180:8;;7076:85;;-1:-1:-1;6810:411:1;-1:-1:-1;;;;6810:411:1:o;7226:546::-;7306:6;7314;7322;7375:2;7363:9;7354:7;7350:23;7346:32;7343:52;;;7391:1;7388;7381:12;7343:52;7430:9;7417:23;7449:31;7474:5;7449:31;:::i;:::-;7499:5;-1:-1:-1;7555:2:1;7540:18;;7527:32;-1:-1:-1;;;;;7571:30:1;;7568:50;;;7614:1;7611;7604:12;7777:658;7948:2;8000:21;;;8070:13;;7973:18;;;8092:22;;;7919:4;;7948:2;8171:15;;;;8145:2;8130:18;;;7919:4;8214:195;8228:6;8225:1;8222:13;8214:195;;;8293:13;;-1:-1:-1;;;;;8289:39:1;8277:52;;8384:15;;;;8349:12;;;;8325:1;8243:9;8214:195;;;-1:-1:-1;8426:3:1;;7777:658;-1:-1:-1;;;;;;7777:658:1:o;8440:797::-;8570:6;8578;8586;8594;8647:2;8635:9;8626:7;8622:23;8618:32;8615:52;;;8663:1;8660;8653:12;8615:52;8703:9;8690:23;-1:-1:-1;;;;;8773:2:1;8765:6;8762:14;8759:34;;;8789:1;8786;8779:12;8759:34;8828:78;8898:7;8889:6;8878:9;8874:22;8828:78;:::i;:::-;8925:8;;-1:-1:-1;8802:104:1;-1:-1:-1;9013:2:1;8998:18;;8985:32;;-1:-1:-1;9029:16:1;;;9026:36;;;9058:1;9055;9048:12;9026:36;;9097:80;9169:7;9158:8;9147:9;9143:24;9097:80;:::i;:::-;8440:797;;;;-1:-1:-1;9196:8:1;-1:-1:-1;;;;8440:797:1:o;9242:592::-;9349:6;9357;9365;9418:2;9406:9;9397:7;9393:23;9389:32;9386:52;;;9434:1;9431;9424:12;9386:52;9473:9;9460:23;9492:31;9517:5;9492:31;:::i;:::-;9542:5;-1:-1:-1;9598:2:1;9583:18;;9570:32;-1:-1:-1;;;;;9614:30:1;;9611:50;;;9657:1;9654;9647:12;9611:50;9696:78;9766:7;9757:6;9746:9;9742:22;9696:78;:::i;9839:118::-;9925:5;9918:13;9911:21;9904:5;9901:32;9891:60;;9947:1;9944;9937:12;9962:681;10048:6;10056;10064;10072;10125:2;10113:9;10104:7;10100:23;10096:32;10093:52;;;10141:1;10138;10131:12;10093:52;10180:9;10167:23;10199:31;10224:5;10199:31;:::i;:::-;10249:5;-1:-1:-1;10305:2:1;10290:18;;10277:32;-1:-1:-1;;;;;10321:30:1;;10318:50;;;10364:1;10361;10354:12;10318:50;10403:59;10454:7;10445:6;10434:9;10430:22;10403:59;:::i;:::-;10481:8;;-1:-1:-1;10377:85:1;-1:-1:-1;;10568:2:1;10553:18;;10540:32;10581:30;10540:32;10581:30;:::i;:::-;9962:681;;;;-1:-1:-1;9962:681:1;;-1:-1:-1;;9962:681:1:o;12038:540::-;12115:6;12123;12131;12184:2;12172:9;12163:7;12159:23;12155:32;12152:52;;;12200:1;12197;12190:12;12152:52;12240:9;12227:23;-1:-1:-1;;;;;12265:6:1;12262:30;12259:50;;;12305:1;12302;12295:12;12259:50;12344:59;12395:7;12386:6;12375:9;12371:22;12344:59;:::i;:::-;12422:8;;-1:-1:-1;12318:85:1;-1:-1:-1;;12507:2:1;12492:18;;12479:32;12520:28;12479:32;12520:28;:::i;:::-;12567:5;12557:15;;;12038:540;;;;;:::o;12583:382::-;12648:6;12656;12709:2;12697:9;12688:7;12684:23;12680:32;12677:52;;;12725:1;12722;12715:12;12677:52;12764:9;12751:23;12783:31;12808:5;12783:31;:::i;:::-;12833:5;-1:-1:-1;12890:2:1;12875:18;;12862:32;12903:30;12862:32;12903:30;:::i;12970:241::-;13026:6;13079:2;13067:9;13058:7;13054:23;13050:32;13047:52;;;13095:1;13092;13085:12;13047:52;13134:9;13121:23;13153:28;13175:5;13153:28;:::i;13216:415::-;13283:6;13291;13344:2;13332:9;13323:7;13319:23;13315:32;13312:52;;;13360:1;13357;13350:12;13312:52;13399:9;13386:23;13418:31;13443:5;13418:31;:::i;:::-;13468:5;-1:-1:-1;13525:2:1;13510:18;;13497:32;13573:6;13560:20;;13548:33;;13538:61;;13595:1;13592;13585:12;13636:932;13775:6;13783;13791;13799;13807;13860:2;13848:9;13839:7;13835:23;13831:32;13828:52;;;13876:1;13873;13866:12;13828:52;13915:9;13902:23;13934:31;13959:5;13934:31;:::i;:::-;13984:5;-1:-1:-1;14040:2:1;14025:18;;14012:32;-1:-1:-1;;;;;14093:14:1;;;14090:34;;;14120:1;14117;14110:12;14782:127;14843:10;14838:3;14834:20;14831:1;14824:31;14874:4;14871:1;14864:15;14898:4;14895:1;14888:15;14914:275;14985:2;14979:9;15050:2;15031:13;;-1:-1:-1;;15027:27:1;15015:40;;-1:-1:-1;;;;;15070:34:1;;15106:22;;;15067:62;15064:88;;;15132:18;;:::i;:::-;15168:2;15161:22;14914:275;;-1:-1:-1;14914:275:1:o;15194:186::-;15242:4;-1:-1:-1;;;;;15267:6:1;15264:30;15261:56;;;15297:18;;:::i;:::-;-1:-1:-1;15363:2:1;15342:15;-1:-1:-1;;15338:29:1;15369:4;15334:40;;15194:186::o;15385:1016::-;15480:6;15488;15496;15504;15557:3;15545:9;15536:7;15532:23;15528:33;15525:53;;;15574:1;15571;15564:12;15525:53;15613:9;15600:23;15632:31;15657:5;15632:31;:::i;:::-;15682:5;-1:-1:-1;15739:2:1;15724:18;;15711:32;15752:33;15711:32;15752:33;:::i;:::-;15804:7;-1:-1:-1;15858:2:1;15843:18;;15830:32;;-1:-1:-1;15913:2:1;15898:18;;15885:32;-1:-1:-1;;;;;15929:30:1;;15926:50;;;15972:1;15969;15962:12;15926:50;15995:22;;16048:4;16040:13;;16036:27;-1:-1:-1;16026:55:1;;16077:1;16074;16067:12;16026:55;16113:2;16100:16;16138:48;16154:31;16182:2;16154:31;:::i;:::-;16138:48;:::i;:::-;16209:2;16202:5;16195:17;16249:7;16244:2;16239;16235;16231:11;16227:20;16224:33;16221:53;;;16270:1;16267;16260:12;16221:53;16325:2;16320;16316;16312:11;16307:2;16300:5;16296:14;16283:45;16369:1;16364:2;16359;16352:5;16348:14;16344:23;16337:34;16390:5;16380:15;;;;;15385:1016;;;;;;;:::o;16406:469::-;16467:3;16505:5;16499:12;16532:6;16527:3;16520:19;16558:4;16587:2;16582:3;16578:12;16571:19;;16624:2;16617:5;16613:14;16645:1;16655:195;16669:6;16666:1;16663:13;16655:195;;;16734:13;;-1:-1:-1;;;;;16730:39:1;16718:52;;16790:12;;;;16825:15;;;;16766:1;16684:9;16655:195;;16880:285;17075:2;17064:9;17057:21;17038:4;17095:64;17155:2;17144:9;17140:18;17132:6;17095:64;:::i;17170:489::-;17443:2;17432:9;17425:21;17406:4;17469:64;17529:2;17518:9;17514:18;17506:6;17469:64;:::i;:::-;17581:9;17573:6;17569:22;17564:2;17553:9;17549:18;17542:50;17609:44;17646:6;17638;17609:44;:::i;:::-;17601:52;17170:489;-1:-1:-1;;;;;17170:489:1:o;17664:175::-;17731:20;;17791:22;17780:34;;17770:45;;17760:73;;17829:1;17826;17819:12;17844:319;17911:6;17919;17972:2;17960:9;17951:7;17947:23;17943:32;17940:52;;;17988:1;17985;17978:12;17940:52;18027:9;18014:23;18046:31;18071:5;18046:31;:::i;:::-;18096:5;-1:-1:-1;18120:37:1;18153:2;18138:18;;18120:37;:::i;:::-;18110:47;;17844:319;;;;;:::o;18168:400::-;18370:2;18352:21;;;18409:2;18389:18;;;18382:30;18448:34;18443:2;18428:18;;18421:62;-1:-1:-1;;;18514:2:1;18499:18;;18492:34;18558:3;18543:19;;18168:400::o;18573:380::-;18652:1;18648:12;;;;18695;;;18716:61;;18770:4;18762:6;18758:17;18748:27;;18716:61;18823:2;18815:6;18812:14;18792:18;18789:38;18786:161;;18869:10;18864:3;18860:20;18857:1;18850:31;18904:4;18901:1;18894:15;18932:4;18929:1;18922:15;19790:341;19992:2;19974:21;;;20031:2;20011:18;;;20004:30;-1:-1:-1;;;20065:2:1;20050:18;;20043:47;20122:2;20107:18;;19790:341::o;20487:345::-;20689:2;20671:21;;;20728:2;20708:18;;;20701:30;-1:-1:-1;;;20762:2:1;20747:18;;20740:51;20823:2;20808:18;;20487:345::o;20837:409::-;21039:2;21021:21;;;21078:2;21058:18;;;21051:30;21117:34;21112:2;21097:18;;21090:62;-1:-1:-1;;;21183:2:1;21168:18;;21161:43;21236:3;21221:19;;20837:409::o;21663:127::-;21724:10;21719:3;21715:20;21712:1;21705:31;21755:4;21752:1;21745:15;21779:4;21776:1;21769:15;21795:127;21856:10;21851:3;21847:20;21844:1;21837:31;21887:4;21884:1;21877:15;21911:4;21908:1;21901:15;21927:135;21966:3;21987:17;;;21984:43;;22007:18;;:::i;:::-;-1:-1:-1;22054:1:1;22043:13;;21927:135::o;22067:125::-;22132:9;;;22153:10;;;22150:36;;;22166:18;;:::i;22197:522::-;22275:4;22281:6;22341:11;22328:25;22435:2;22431:7;22420:8;22404:14;22400:29;22396:43;22376:18;22372:68;22362:96;;22454:1;22451;22444:12;22362:96;22481:33;;22533:20;;;-1:-1:-1;;;;;;22565:30:1;;22562:50;;;22608:1;22605;22598:12;22562:50;22641:4;22629:17;;-1:-1:-1;22672:14:1;22668:27;;;22658:38;;22655:58;;;22709:1;22706;22699:12;22724:184;22782:6;22835:2;22823:9;22814:7;22810:23;22806:32;22803:52;;;22851:1;22848;22841:12;22803:52;22874:28;22892:9;22874:28;:::i;23686:337::-;23888:2;23870:21;;;23927:2;23907:18;;;23900:30;-1:-1:-1;;;23961:2:1;23946:18;;23939:43;24014:2;23999:18;;23686:337::o;24028:398::-;24230:2;24212:21;;;24269:2;24249:18;;;24242:30;24308:34;24303:2;24288:18;;24281:62;-1:-1:-1;;;24374:2:1;24359:18;;24352:32;24416:3;24401:19;;24028:398::o;26423:545::-;26525:2;26520:3;26517:11;26514:448;;;26561:1;26586:5;26582:2;26575:17;26631:4;26627:2;26617:19;26701:2;26689:10;26685:19;26682:1;26678:27;26672:4;26668:38;26737:4;26725:10;26722:20;26719:47;;;-1:-1:-1;26760:4:1;26719:47;26815:2;26810:3;26806:12;26803:1;26799:20;26793:4;26789:31;26779:41;;26870:82;26888:2;26881:5;26878:13;26870:82;;;26933:17;;;26914:1;26903:13;26870:82;;27144:1206;-1:-1:-1;;;;;27263:3:1;27260:27;27257:53;;;27290:18;;:::i;:::-;27319:94;27409:3;27369:38;27401:4;27395:11;27369:38;:::i;:::-;27363:4;27319:94;:::i;:::-;27439:1;27464:2;27459:3;27456:11;27481:1;27476:616;;;;28136:1;28153:3;28150:93;;;-1:-1:-1;28209:19:1;;;28196:33;28150:93;-1:-1:-1;;27101:1:1;27097:11;;;27093:24;27089:29;27079:40;27125:1;27121:11;;;27076:57;28256:78;;27449:895;;27476:616;26370:1;26363:14;;;26407:4;26394:18;;-1:-1:-1;;27512:17:1;;;27613:9;27635:229;27649:7;27646:1;27643:14;27635:229;;;27738:19;;;27725:33;27710:49;;27845:4;27830:20;;;;27798:1;27786:14;;;;27665:12;27635:229;;;27639:3;27892;27883:7;27880:16;27877:159;;;28016:1;28012:6;28006:3;28000;27997:1;27993:11;27989:21;27985:34;27981:39;27968:9;27963:3;27959:19;27946:33;27942:79;27934:6;27927:95;27877:159;;;28079:1;28073:3;28070:1;28066:11;28062:19;28056:4;28049:33;27449:895;;27144:1206;;;:::o;28355:1075::-;28659:2;28671:21;;;28644:18;;28727:22;;;28611:4;28806:6;28780:2;28765:18;;28611:4;28840:304;28854:6;28851:1;28848:13;28840:304;;;28929:6;28916:20;28949:31;28974:5;28949:31;:::i;:::-;-1:-1:-1;;;;;29005:31:1;28993:44;;29060:4;29119:15;;;;29084:12;;;;29033:1;28869:9;28840:304;;;-1:-1:-1;29182:19:1;;;29175:4;29160:20;;29153:49;29211:19;;;-1:-1:-1;;;;;29242:31:1;;29239:51;;;29286:1;29283;29276:12;29239:51;29320:6;29317:1;29313:14;29299:28;;29373:6;29365;29358:4;29353:3;29349:14;29336:44;29401:16;29419:4;29397:27;;28355:1075;-1:-1:-1;;;;;;28355:1075:1:o;30963:1352::-;31089:3;31083:10;-1:-1:-1;;;;;31108:6:1;31105:30;31102:56;;;31138:18;;:::i;:::-;31167:97;31257:6;31217:38;31249:4;31243:11;31217:38;:::i;:::-;31211:4;31167:97;:::i;:::-;31319:4;;31383:2;31372:14;;31400:1;31395:663;;;;32102:1;32119:6;32116:89;;;-1:-1:-1;32171:19:1;;;32165:26;32116:89;-1:-1:-1;;27101:1:1;27097:11;;;27093:24;27089:29;27079:40;27125:1;27121:11;;;27076:57;32218:81;;31365:944;;31395:663;26370:1;26363:14;;;26407:4;26394:18;;-1:-1:-1;;31431:20:1;;;31549:236;31563:7;31560:1;31557:14;31549:236;;;31652:19;;;31646:26;31631:42;;31744:27;;;;31712:1;31700:14;;;;31579:19;;31549:236;;;31553:3;31813:6;31804:7;31801:19;31798:201;;;31874:19;;;31868:26;-1:-1:-1;;31957:1:1;31953:14;;;31969:3;31949:24;31945:37;31941:42;31926:58;31911:74;;31798:201;-1:-1:-1;;;;;32045:1:1;32029:14;;;32025:22;32012:36;;-1:-1:-1;30963:1352:1:o;32677:168::-;32717:7;32783:1;32779;32775:6;32771:14;32768:1;32765:21;32760:1;32753:9;32746:17;32742:45;32739:71;;;32790:18;;:::i;:::-;-1:-1:-1;32830:9:1;;32677:168::o;32982:217::-;33022:1;33048;33038:132;;33092:10;33087:3;33083:20;33080:1;33073:31;33127:4;33124:1;33117:15;33155:4;33152:1;33145:15;33038:132;-1:-1:-1;33184:9:1;;32982:217::o;33913:197::-;33951:3;33979:6;34020:2;34013:5;34009:14;34047:2;34038:7;34035:15;34032:41;;34053:18;;:::i;:::-;34102:1;34089:15;;33913:197;-1:-1:-1;;;33913:197:1:o;34469:414::-;34671:2;34653:21;;;34710:2;34690:18;;;34683:30;34749:34;34744:2;34729:18;;34722:62;-1:-1:-1;;;34815:2:1;34800:18;;34793:48;34873:3;34858:19;;34469:414::o;34888:191::-;34956:4;-1:-1:-1;;;;;34981:6:1;34978:30;34975:56;;;35011:18;;:::i;:::-;-1:-1:-1;35056:1:1;35052:14;35068:4;35048:25;;34888:191::o;35084:667::-;35149:5;35202:3;35195:4;35187:6;35183:17;35179:27;35169:55;;35220:1;35217;35210:12;35169:55;35249:6;35243:13;35275:4;35299:68;35315:51;35363:2;35315:51;:::i;35299:68::-;35401:15;;;35487:1;35483:10;;;;35471:23;;35467:32;;;35432:12;;;;35511:15;;;35508:35;;;35539:1;35536;35529:12;35508:35;35575:2;35567:6;35563:15;35587:135;35603:6;35598:3;35595:15;35587:135;;;35669:10;;35657:23;;35700:12;;;;35620;;35587:135;;;-1:-1:-1;35740:5:1;35084:667;-1:-1:-1;;;;;;35084:667:1:o;35756:1225::-;35893:6;35901;35954:2;35942:9;35933:7;35929:23;35925:32;35922:52;;;35970:1;35967;35960:12;35922:52;36003:9;35997:16;-1:-1:-1;;;;;36073:2:1;36065:6;36062:14;36059:34;;;36089:1;36086;36079:12;36059:34;36127:6;36116:9;36112:22;36102:32;;36172:7;36165:4;36161:2;36157:13;36153:27;36143:55;;36194:1;36191;36184:12;36143:55;36223:2;36217:9;36245:4;36269:68;36285:51;36333:2;36285:51;:::i;36269:68::-;36371:15;;;36453:1;36449:10;;;;36441:19;;36437:28;;;36402:12;;;;36477:19;;;36474:39;;;36509:1;36506;36499:12;36474:39;36533:11;;;;36553:210;36569:6;36564:3;36561:15;36553:210;;;36642:3;36636:10;36659:31;36684:5;36659:31;:::i;:::-;36703:18;;36586:12;;;;36741;;;;36553:210;;;36818:18;;;36812:25;36782:5;;-1:-1:-1;36812:25:1;;-1:-1:-1;;;36849:16:1;;;36846:36;;;36878:1;36875;36868:12;36846:36;;36901:74;36967:7;36956:8;36945:9;36941:24;36901:74;:::i;:::-;36891:84;;;35756:1225;;;;;:::o;39498:128::-;39565:9;;;39586:11;;;39583:37;;;39600:18;;:::i;39631:127::-;39692:10;39687:3;39683:20;39680:1;39673:31;39723:4;39720:1;39713:15;39747:4;39744:1;39737:15;40098:489;-1:-1:-1;;;;;40367:15:1;;;40349:34;;40419:15;;40414:2;40399:18;;40392:43;40466:2;40451:18;;40444:34;;;40514:3;40509:2;40494:18;;40487:31;;;40292:4;;40535:46;;40561:19;;40553:6;40535:46;:::i;:::-;40527:54;40098:489;-1:-1:-1;;;;;;40098:489:1:o;40592:249::-;40661:6;40714:2;40702:9;40693:7;40689:23;40685:32;40682:52;;;40730:1;40727;40720:12;40682:52;40762:9;40756:16;40781:30;40805:5;40781:30;:::i;40846:722::-;40896:3;40937:5;40931:12;40966:36;40992:9;40966:36;:::i;:::-;41021:1;41038:18;;;41065:133;;;;41212:1;41207:355;;;;41031:531;;41065:133;-1:-1:-1;;41098:24:1;;41086:37;;41171:14;;41164:22;41152:35;;41143:45;;;-1:-1:-1;41065:133:1;;41207:355;41238:5;41235:1;41228:16;41267:4;41312:2;41309:1;41299:16;41337:1;41351:165;41365:6;41362:1;41359:13;41351:165;;;41443:14;;41430:11;;;41423:35;41486:16;;;;41380:10;;41351:165;;;41355:3;;;41545:6;41540:3;41536:16;41529:23;;41031:531;;;;;40846:722;;;;:::o;41573:277::-;41746:3;41771:73;41805:38;41839:3;41831:6;41805:38;:::i;:::-;41797:6;41771:73;:::i;41855:648::-;41935:6;41988:2;41976:9;41967:7;41963:23;41959:32;41956:52;;;42004:1;42001;41994:12;41956:52;42037:9;42031:16;-1:-1:-1;;;;;42062:6:1;42059:30;42056:50;;;42102:1;42099;42092:12;42056:50;42125:22;;42178:4;42170:13;;42166:27;-1:-1:-1;42156:55:1;;42207:1;42204;42197:12;42156:55;42236:2;42230:9;42261:48;42277:31;42305:2;42277:31;:::i;42261:48::-;42332:2;42325:5;42318:17;42372:7;42367:2;42362;42358;42354:11;42350:20;42347:33;42344:53;;;42393:1;42390;42383:12;42344:53;42406:67;42470:2;42465;42458:5;42454:14;42449:2;42445;42441:11;42406:67;:::i;42508:389::-;42684:3;42712:38;42746:3;42738:6;42712:38;:::i;:::-;42779:6;42773:13;42795:65;42853:6;42849:2;42842:4;42834:6;42830:17;42795:65;:::i;:::-;42876:15;;42508:389;-1:-1:-1;;;;42508:389:1:o;44288:245::-;44355:6;44408:2;44396:9;44387:7;44383:23;44379:32;44376:52;;;44424:1;44421;44414:12;44376:52;44456:9;44450:16;44475:28;44497:5;44475:28;:::i
Swarm Source
ipfs://f5403fc3c5bf5f6ae673d9e61bf048d5468fd6c2fb78208a5d33ca9547e6bce3
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.