Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 1,106 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Purchase | 16929041 | 623 days ago | IN | 0.042 ETH | 0.00994556 | ||||
Purchase | 16929040 | 623 days ago | IN | 0.042 ETH | 0.0095094 | ||||
Purchase | 16929038 | 623 days ago | IN | 0.042 ETH | 0.0095094 | ||||
Purchase | 16929026 | 623 days ago | IN | 0.042 ETH | 0.00883846 | ||||
Purchase | 16928918 | 623 days ago | IN | 0.084 ETH | 0.01401263 | ||||
Purchase | 16928905 | 623 days ago | IN | 0.042 ETH | 0.00903715 | ||||
Purchase | 16928872 | 623 days ago | IN | 0.042 ETH | 0.0089095 | ||||
Purchase | 16928805 | 623 days ago | IN | 0.084 ETH | 0.01708977 | ||||
Purchase | 16928791 | 623 days ago | IN | 0.042 ETH | 0.00882561 | ||||
Purchase | 16928722 | 623 days ago | IN | 0.042 ETH | 0.01052895 | ||||
Purchase | 16928645 | 623 days ago | IN | 0.042 ETH | 0.01305346 | ||||
Purchase | 16928503 | 623 days ago | IN | 0.042 ETH | 0.00841278 | ||||
Purchase | 16928441 | 623 days ago | IN | 0.42 ETH | 0.05827418 | ||||
Set Project Max ... | 16928404 | 623 days ago | IN | 0 ETH | 0.00156132 | ||||
Purchase | 16927520 | 624 days ago | IN | 0 ETH | 0.00816773 | ||||
Purchase | 16927352 | 624 days ago | IN | 0 ETH | 0.00951323 | ||||
Purchase | 16926865 | 624 days ago | IN | 0 ETH | 0.00818726 | ||||
Purchase | 16925468 | 624 days ago | IN | 0 ETH | 0.00856383 | ||||
Purchase | 16924576 | 624 days ago | IN | 0 ETH | 0.00833698 | ||||
Purchase | 16923443 | 624 days ago | IN | 0 ETH | 0.00667297 | ||||
Purchase | 16921941 | 624 days ago | IN | 0 ETH | 0.00661118 | ||||
Purchase | 16921801 | 624 days ago | IN | 0 ETH | 0.00838694 | ||||
Purchase | 16921603 | 624 days ago | IN | 0 ETH | 0.00931638 | ||||
Purchase | 16921490 | 624 days ago | IN | 0 ETH | 0.00767387 | ||||
Purchase | 16900946 | 627 days ago | IN | 0.042 ETH | 0.00590083 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
16929041 | 623 days ago | 0.0378 ETH | ||||
16929041 | 623 days ago | 0.0042 ETH | ||||
16929040 | 623 days ago | 0.0378 ETH | ||||
16929040 | 623 days ago | 0.0042 ETH | ||||
16929038 | 623 days ago | 0.0378 ETH | ||||
16929038 | 623 days ago | 0.0042 ETH | ||||
16929026 | 623 days ago | 0.0378 ETH | ||||
16929026 | 623 days ago | 0.0042 ETH | ||||
16928918 | 623 days ago | 0.0378 ETH | ||||
16928918 | 623 days ago | 0.0042 ETH | ||||
16928918 | 623 days ago | 0.0378 ETH | ||||
16928918 | 623 days ago | 0.0042 ETH | ||||
16928905 | 623 days ago | 0.0378 ETH | ||||
16928905 | 623 days ago | 0.0042 ETH | ||||
16928872 | 623 days ago | 0.0378 ETH | ||||
16928872 | 623 days ago | 0.0042 ETH | ||||
16928805 | 623 days ago | 0.0378 ETH | ||||
16928805 | 623 days ago | 0.0042 ETH | ||||
16928805 | 623 days ago | 0.0378 ETH | ||||
16928805 | 623 days ago | 0.0042 ETH | ||||
16928791 | 623 days ago | 0.0378 ETH | ||||
16928791 | 623 days ago | 0.0042 ETH | ||||
16928722 | 623 days ago | 0.0378 ETH | ||||
16928722 | 623 days ago | 0.0042 ETH | ||||
16928645 | 623 days ago | 0.0378 ETH |
Loading...
Loading
Contract Name:
GenArt721Minter_DoodleLabs_Custom_Sale
Compiler Version
v0.5.0+commit.1d4f565a
Contract Source Code (Solidity Multiple files format)
pragma solidity ^0.5.0; import './GenArt721Minter_DoodleLabs_MultiMinter.sol'; import './Strings.sol'; import './MerkleProof.sol'; interface IGenArt721Minter_DoodleLabs_Config { function getPurchaseManyLimit(uint256 projectId) external view returns (uint256 limit); function getState(uint256 projectId) external view returns (uint256 _state); function setStateFamilyCollectors(uint256 projectId) external; function setStateRedemption(uint256 projectId) external; function setStatePublic(uint256 projectId) external; } interface IGenArt721Minter_DoodleLabs_WhiteList { function getMerkleRoot(uint256 projectId) external view returns (bytes32 merkleRoot); function getWhitelisted(uint256 projectId, address user) external view returns (uint256 amount); function addWhitelist( uint256 projectId, address[] calldata users, uint256[] calldata amounts ) external; function increaseAmount( uint256 projectId, address to, uint256 quantity ) external; } contract GenArt721Minter_DoodleLabs_Custom_Sale is GenArt721Minter_DoodleLabs_MultiMinter { using SafeMath for uint256; event Redeem(uint256 projectId); // Must match what is on the GenArtMinterV2_State contract enum SaleState { FAMILY_COLLECTORS, REDEMPTION, PUBLIC } IGenArt721Minter_DoodleLabs_WhiteList public activeWhitelist; IGenArt721Minter_DoodleLabs_Config public minterState; modifier onlyWhitelisted() { require(genArtCoreContract.isWhitelisted(msg.sender), 'can only be set by admin'); _; } modifier notRedemptionState(uint256 projectId) { require( uint256(minterState.getState(projectId)) != uint256(SaleState.REDEMPTION), 'can not purchase in redemption phase' ); _; } modifier onlyRedemptionState(uint256 projectId) { require( uint256(minterState.getState(projectId)) == uint256(SaleState.REDEMPTION), 'not in redemption phase' ); _; } constructor(address _genArtCore, address _minterStateAddress) public GenArt721Minter_DoodleLabs_MultiMinter(_genArtCore) { minterState = IGenArt721Minter_DoodleLabs_Config(_minterStateAddress); } function getMerkleRoot(uint256 projectId) public view returns (bytes32 merkleRoot) { require(address(activeWhitelist) != address(0), 'Active whitelist not set'); return activeWhitelist.getMerkleRoot(projectId); } function getWhitelisted(uint256 projectId, address user) external view returns (uint256 amount) { require(address(activeWhitelist) != address(0), 'Active whitelist not set'); return activeWhitelist.getWhitelisted(projectId, user); } function setActiveWhitelist(address whitelist) public onlyWhitelisted { activeWhitelist = IGenArt721Minter_DoodleLabs_WhiteList(whitelist); } function purchase(uint256 projectId, uint256 quantity) public payable notRedemptionState(projectId) returns (uint256[] memory _tokenIds) { return purchaseTo(msg.sender, projectId, quantity); } function purchaseTo( address to, uint256 projectId, uint256 quantity ) public payable notRedemptionState(projectId) returns (uint256[] memory _tokenIds) { require( quantity <= minterState.getPurchaseManyLimit(projectId), 'Max purchase many limit reached' ); if ( uint256(minterState.getState(projectId)) == uint256(SaleState.FAMILY_COLLECTORS) && msg.value > 0 ) { require(false, 'ETH not accepted at this time'); } return _purchaseManyTo(to, projectId, quantity); } function redeem( uint256 projectId, uint256 quantity, uint256 allottedAmount, bytes32[] memory proof ) public payable onlyRedemptionState(projectId) returns (uint256[] memory _tokenIds) { return redeemTo(msg.sender, projectId, quantity, allottedAmount, proof); } function redeemTo( address to, uint256 projectId, uint256 quantity, uint256 allottedAmount, bytes32[] memory proof ) public payable onlyRedemptionState(projectId) returns (uint256[] memory _tokenIds) { require(address(activeWhitelist) != address(0), 'Active whitelist not set'); require( activeWhitelist.getWhitelisted(projectId, to).add(quantity) <= allottedAmount, 'Address has already claimed' ); string memory key = _addressToString(to); key = _appendStrings(key, Strings.toString(allottedAmount), Strings.toString(projectId)); bytes32 leaf = keccak256(abi.encodePacked(key)); require(MerkleProof.verify(proof, getMerkleRoot(projectId), leaf), 'Invalid proof'); uint256[] memory createdTokens = _purchaseManyTo(to, projectId, quantity); activeWhitelist.increaseAmount(projectId, to, quantity); emit Redeem(projectId); return createdTokens; } function _appendStrings( string memory a, string memory b, string memory c ) internal pure returns (string memory) { return string(abi.encodePacked(a, '::', b, '::', c)); } function _addressToString(address addr) private pure returns (string memory) { // From: https://www.reddit.com/r/ethdev/comments/qga46a/i_created_a_function_to_convert_address_to_string/ // Cast address to byte array bytes memory addressBytes = abi.encodePacked(addr); // Byte array for the new string bytes memory stringBytes = new bytes(42); // Assign first two bytes to '0x' stringBytes[0] = '0'; stringBytes[1] = 'x'; // Iterate over every byte in the array // Each byte contains two hex digits that gets individually converted // into their ASCII representation and added to the string for (uint256 i = 0; i < 20; i++) { // Convert hex to decimal values uint8 leftValue = uint8(addressBytes[i]) / 16; uint8 rightValue = uint8(addressBytes[i]) - 16 * leftValue; // Convert decimals to ASCII values bytes1 leftChar = leftValue < 10 ? bytes1(leftValue + 48) : bytes1(leftValue + 87); bytes1 rightChar = rightValue < 10 ? bytes1(rightValue + 48) : bytes1(rightValue + 87); // Add ASCII values to the string byte array stringBytes[2 * i + 3] = rightChar; stringBytes[2 * i + 2] = leftChar; // console.log(string(stringBytes)); } // Cast byte array to string and return return string(stringBytes); } }
// File: openzeppelin-solidity/contracts/utils/Address.sol pragma solidity ^0.5.0; /** * @dev Collection of functions related to the address type, */ library Address { /** * @dev Returns true if `account` is a contract. * * This test is non-exhaustive, and there may be false-negatives: during the * execution of a contract's constructor, its address will be reported as * not containing a contract. * * > It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. */ function isContract(address account) internal view returns (bool) { // This method relies in extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } }
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v2.4.0/contracts/GSN/Context.sol pragma solidity ^0.5.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN 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. */ contract Context { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. constructor() internal {} // solhint-disable-previous-line no-empty-blocks function _msgSender() internal view returns (address payable) { return msg.sender; } function _msgData() internal view returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } }
// File: openzeppelin-solidity/contracts/drafts/Counters.sol pragma solidity ^0.5.0; import './SafeMath.sol'; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` * Since it is not possible to overflow a 256 bit integer with increments of one, `increment` can skip the SafeMath * overflow check, thereby saving gas. This does assume however correct usage, in that the underlying `_value` is never * directly accessed. */ library Counters { using SafeMath for uint256; struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { counter._value += 1; } function decrement(Counter storage counter) internal { counter._value = counter._value.sub(1); } }
// File: contracts/CustomERC721Metadata.sol pragma solidity ^0.5.0; import './ERC165.sol'; import './ERC721.sol'; import './ERC721Enumerable.sol'; /** * ERC721 base contract without the concept of tokenUri as this is managed by the parent */ contract CustomERC721Metadata is ERC165, ERC721, ERC721Enumerable { // Token name string private _name; // Token symbol string private _symbol; bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f; /** * @dev Constructor function */ constructor(string memory name, string memory symbol) public { _name = name; _symbol = symbol; // register the supported interfaces to conform to ERC721 via ERC165 _registerInterface(_INTERFACE_ID_ERC721_METADATA); } /** * @dev Gets the token name * @return string representing the token name */ function name() external view returns (string memory) { return _name; } /** * @dev Gets the token symbol * @return string representing the token symbol */ function symbol() external view returns (string memory) { return _symbol; } }
// File: openzeppelin-solidity/contracts/introspection/ERC165.sol pragma solidity ^0.5.0; import './IERC165.sol'; /** * @dev Implementation of the `IERC165` interface. * * Contracts may inherit from this and call `_registerInterface` to declare * their support of an interface. */ contract ERC165 is IERC165 { /* * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7 */ bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7; /** * @dev Mapping of interface ids to whether or not it's supported. */ mapping(bytes4 => bool) private _supportedInterfaces; constructor() internal { // Derived contracts need only register support for their own interfaces, // we register support for ERC165 itself here _registerInterface(_INTERFACE_ID_ERC165); } /** * @dev See `IERC165.supportsInterface`. * * Time complexity O(1), guaranteed to always use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool) { return _supportedInterfaces[interfaceId]; } /** * @dev Registers the contract as an implementer of the interface defined by * `interfaceId`. Support of the actual ERC165 interface is automatic and * registering its interface id is not required. * * See `IERC165.supportsInterface`. * * Requirements: * * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`). */ function _registerInterface(bytes4 interfaceId) internal { require(interfaceId != 0xffffffff, 'ERC165: invalid interface id'); _supportedInterfaces[interfaceId] = true; } }
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v2.4.0/contracts/token/ERC20/ERC20.sol pragma solidity ^0.5.0; import './Context.sol'; import './IERC20.sol'; import './SafeMath.sol'; /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20Mintable}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, IERC20 { using SafeMath for uint256; mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}; * * Requirements: * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for `sender`'s tokens of at least * `amount`. */ function transferFrom( address sender, address recipient, uint256 amount ) public returns (bool) { _transfer(sender, recipient, amount); _approve( sender, _msgSender(), _allowances[sender][_msgSender()].sub( amount, 'ERC20: transfer amount exceeds allowance' ) ); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) { _approve( _msgSender(), spender, _allowances[_msgSender()][spender].sub( subtractedValue, 'ERC20: decreased allowance below zero' ) ); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer( address sender, address recipient, uint256 amount ) internal { require(sender != address(0), 'ERC20: transfer from the zero address'); require(recipient != address(0), 'ERC20: transfer to the zero address'); _balances[sender] = _balances[sender].sub(amount, 'ERC20: transfer amount exceeds balance'); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements * * - `to` cannot be the zero address. */ function _mint(address account, uint256 amount) internal { require(account != address(0), 'ERC20: mint to the zero address'); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal { require(account != address(0), 'ERC20: burn from the zero address'); _balances[account] = _balances[account].sub(amount, 'ERC20: burn amount exceeds balance'); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens. * * This is internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal { require(owner != address(0), 'ERC20: approve from the zero address'); require(spender != address(0), 'ERC20: approve to the zero address'); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Destroys `amount` tokens from `account`.`amount` is then deducted * from the caller's allowance. * * See {_burn} and {_approve}. */ function _burnFrom(address account, uint256 amount) internal { _burn(account, amount); _approve( account, _msgSender(), _allowances[account][_msgSender()].sub(amount, 'ERC20: burn amount exceeds allowance') ); } }
// File: openzeppelin-solidity/contracts/token/ERC721/ERC721.sol pragma solidity ^0.5.0; import './ERC165.sol'; import './IERC721.sol'; import './SafeMath.sol'; import './Address.sol'; import './Counters.sol'; import './IERC721Receiver.sol'; /** * @title ERC721 Non-Fungible Token Standard basic implementation * @dev see https://eips.ethereum.org/EIPS/eip-721 */ contract ERC721 is ERC165, IERC721 { using SafeMath for uint256; using Address for address; using Counters for Counters.Counter; // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` // which can be also obtained as `IERC721Receiver(0).onERC721Received.selector` bytes4 private constant _ERC721_RECEIVED = 0x150b7a02; // Mapping from token ID to owner mapping(uint256 => address) private _tokenOwner; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to number of owned token mapping(address => Counters.Counter) private _ownedTokensCount; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd; constructor() public { // register the supported interfaces to conform to ERC721 via ERC165 _registerInterface(_INTERFACE_ID_ERC721); } function balanceOf(address owner) public view returns (uint256) { require(owner != address(0), 'ERC721: balance query for the zero address'); return _ownedTokensCount[owner].current(); } function ownerOf(uint256 tokenId) public view returns (address) { address owner = _tokenOwner[tokenId]; require(owner != address(0), 'ERC721: owner query for nonexistent token'); return owner; } function approve(address to, uint256 tokenId) public { address owner = ownerOf(tokenId); require(to != owner, 'ERC721: approval to current owner'); require( msg.sender == owner || isApprovedForAll(owner, msg.sender), 'ERC721: approve caller is not owner nor approved for all' ); _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } function getApproved(uint256 tokenId) public view returns (address) { require(_exists(tokenId), 'ERC721: approved query for nonexistent token'); return _tokenApprovals[tokenId]; } function setApprovalForAll(address to, bool approved) public { require(to != msg.sender, 'ERC721: approve to caller'); _operatorApprovals[msg.sender][to] = approved; emit ApprovalForAll(msg.sender, to, approved); } function isApprovedForAll(address owner, address operator) public view returns (bool) { return _operatorApprovals[owner][operator]; } function transferFrom( address from, address to, uint256 tokenId ) public { //solhint-disable-next-line max-line-length require( _isApprovedOrOwner(msg.sender, tokenId), 'ERC721: transfer caller is not owner nor approved' ); _transferFrom(from, to, tokenId); } function safeTransferFrom( address from, address to, uint256 tokenId ) public { safeTransferFrom(from, to, tokenId, ''); } function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public { transferFrom(from, to, tokenId); require( _checkOnERC721Received(from, to, tokenId, _data), 'ERC721: transfer to non ERC721Receiver implementer' ); } function _exists(uint256 tokenId) internal view returns (bool) { address owner = _tokenOwner[tokenId]; return owner != address(0); } function _isApprovedOrOwner(address spender, uint256 tokenId) internal view returns (bool) { require(_exists(tokenId), 'ERC721: operator query for nonexistent token'); address owner = ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } function _mint(address to, uint256 tokenId) internal { require(to != address(0), 'ERC721: mint to the zero address'); require(!_exists(tokenId), 'ERC721: token already minted'); _tokenOwner[tokenId] = to; _ownedTokensCount[to].increment(); emit Transfer(address(0), to, tokenId); } function _burn(address owner, uint256 tokenId) internal { require(ownerOf(tokenId) == owner, 'ERC721: burn of token that is not own'); _clearApproval(tokenId); _ownedTokensCount[owner].decrement(); _tokenOwner[tokenId] = address(0); emit Transfer(owner, address(0), tokenId); } function _burn(uint256 tokenId) internal { _burn(ownerOf(tokenId), tokenId); } function _transferFrom( address from, address to, uint256 tokenId ) internal { require(ownerOf(tokenId) == from, 'ERC721: transfer of token that is not own'); require(to != address(0), 'ERC721: transfer to the zero address'); _clearApproval(tokenId); _ownedTokensCount[from].decrement(); _ownedTokensCount[to].increment(); _tokenOwner[tokenId] = to; emit Transfer(from, to, tokenId); } function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) internal returns (bool) { if (!to.isContract()) { return true; } bytes4 retval = IERC721Receiver(to).onERC721Received(msg.sender, from, tokenId, _data); return (retval == _ERC721_RECEIVED); } function _clearApproval(uint256 tokenId) private { if (_tokenApprovals[tokenId] != address(0)) { _tokenApprovals[tokenId] = address(0); } } }
// File: openzeppelin-solidity/contracts/token/ERC721/ERC721Enumerable.sol pragma solidity ^0.5.0; import './ERC165.sol'; import './ERC721.sol'; import './IERC721Enumerable.sol'; /** * @title ERC-721 Non-Fungible Token with optional enumeration extension logic * @dev See https://eips.ethereum.org/EIPS/eip-721 */ contract ERC721Enumerable is ERC165, ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => 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; /* * bytes4(keccak256('totalSupply()')) == 0x18160ddd * bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) == 0x2f745c59 * bytes4(keccak256('tokenByIndex(uint256)')) == 0x4f6ccce7 * * => 0x18160ddd ^ 0x2f745c59 ^ 0x4f6ccce7 == 0x780e9d63 */ bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63; /** * @dev Constructor function. */ constructor() public { // register the supported interface to conform to ERC721Enumerable via ERC165 _registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE); } /** * @dev Gets the token ID at a given index of the tokens list of the requested owner. * @param owner address owning the tokens list to be accessed * @param index uint256 representing the index to be accessed of the requested tokens list * @return uint256 token ID at the given index of the tokens list owned by the requested address */ function tokenOfOwnerByIndex(address owner, uint256 index) public view returns (uint256) { require(index < balanceOf(owner), 'ERC721Enumerable: owner index out of bounds'); return _ownedTokens[owner][index]; } /** * @dev Gets the total amount of tokens stored by the contract. * @return uint256 representing the total amount of tokens */ function totalSupply() public view returns (uint256) { return _allTokens.length; } /** * @dev Gets the token ID at a given index of all the tokens in this contract * Reverts if the index is greater or equal to the total number of tokens. * @param index uint256 representing the index to be accessed of the tokens list * @return uint256 token ID at the given index of the tokens list */ function tokenByIndex(uint256 index) public view returns (uint256) { require(index < totalSupply(), 'ERC721Enumerable: global index out of bounds'); return _allTokens[index]; } /** * @dev Internal function to transfer ownership of a given token ID to another address. * As opposed to transferFrom, this imposes no restrictions on msg.sender. * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 ID of the token to be transferred */ function _transferFrom( address from, address to, uint256 tokenId ) internal { super._transferFrom(from, to, tokenId); _removeTokenFromOwnerEnumeration(from, tokenId); _addTokenToOwnerEnumeration(to, tokenId); } /** * @dev Internal function to mint a new token. * Reverts if the given token ID already exists. * @param to address the beneficiary that will own the minted token * @param tokenId uint256 ID of the token to be minted */ function _mint(address to, uint256 tokenId) internal { super._mint(to, tokenId); _addTokenToOwnerEnumeration(to, tokenId); _addTokenToAllTokensEnumeration(tokenId); } /** * @dev Internal function to burn a specific token. * Reverts if the token does not exist. * Deprecated, use _burn(uint256) instead. * @param owner owner of the token to burn * @param tokenId uint256 ID of the token being burned */ function _burn(address owner, uint256 tokenId) internal { super._burn(owner, tokenId); _removeTokenFromOwnerEnumeration(owner, tokenId); // Since tokenId will be deleted, we can clear its slot in _ownedTokensIndex to trigger a gas refund _ownedTokensIndex[tokenId] = 0; _removeTokenFromAllTokensEnumeration(tokenId); } /** * @dev Gets the list of token IDs of the requested owner. * @param owner address owning the tokens * @return uint256[] List of token IDs owned by the requested address */ function _tokensOfOwner(address owner) internal view returns (uint256[] storage) { return _ownedTokens[owner]; } /** * @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 { _ownedTokensIndex[tokenId] = _ownedTokens[to].length; _ownedTokens[to].push(tokenId); } /** * @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 = _ownedTokens[from].length.sub(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 _ownedTokens[from].length--; // Note that _ownedTokensIndex[tokenId] hasn't been cleared: it still points to the old slot (now occupied by // lastTokenId, or just over the end of the array if the token was the last one). } /** * @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.sub(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 _allTokens.length--; _allTokensIndex[tokenId] = 0; } }
pragma solidity ^0.5.0; import './GenArtMinterV2_DoodleLabs.sol'; import './SafeMath.sol'; contract GenArt721Minter_DoodleLabs_MultiMinter is GenArt721Minter_DoodleLabs { using SafeMath for uint256; event PurchaseMany(uint256 projectId, uint256 amount); event Purchase(uint256 _projectId); constructor(address _genArtCore) internal GenArt721Minter_DoodleLabs(_genArtCore) {} function _purchaseManyTo( address to, uint256 projectId, uint256 amount ) internal returns (uint256[] memory _tokenIds) { uint256[] memory tokenIds = new uint256[](amount); bool isDeferredRefund = false; // Refund ETH if user accidentially overpays // This is not needed for ERC20 tokens if (msg.value > 0) { uint256 pricePerTokenInWei = genArtCoreContract.projectIdToPricePerTokenInWei( projectId ); require(msg.value >= pricePerTokenInWei.mul(amount), 'not enough funds transferred'); uint256 refund = msg.value.sub(pricePerTokenInWei.mul(amount)); isDeferredRefund = true; if (refund > 0) { // address payable _to = payable(to); address payable _to = address(uint160(to)); _to.transfer(refund); } } for (uint256 i = 0; i < amount; i++) { tokenIds[i] = purchaseTo(to, projectId, isDeferredRefund); emit Purchase(projectId); } return tokenIds; } function _purchase(uint256 _projectId) internal returns (uint256 _tokenId) { emit Purchase(_projectId); return purchaseTo(msg.sender, _projectId, false); } }
/** *Submitted for verification at Etherscan.io on 2021-10-21 */ pragma solidity ^0.5.0; import './SafeMath.sol'; import './Strings.sol'; import './ERC20.sol'; import './IGenArt721CoreV2.sol'; interface BonusContract { function triggerBonus(address _to) external returns (bool); function bonusIsActive() external view returns (bool); } contract GenArt721Minter_DoodleLabs { using SafeMath for uint256; IGenArt721CoreV2 public genArtCoreContract; uint256 constant ONE_MILLION = 1_000_000; address payable public ownerAddress; uint256 public ownerPercentage; mapping(uint256 => bool) public projectIdToBonus; mapping(uint256 => address) public projectIdToBonusContractAddress; mapping(uint256 => bool) public contractFilterProject; mapping(address => mapping(uint256 => uint256)) public projectMintCounter; mapping(uint256 => uint256) public projectMintLimit; mapping(uint256 => bool) public projectMaxHasBeenInvoked; mapping(uint256 => uint256) public projectMaxInvocations; constructor(address _genArt721Address) public { genArtCoreContract = IGenArt721CoreV2(_genArt721Address); } function getYourBalanceOfProjectERC20(uint256 _projectId) public view returns (uint256) { uint256 balance = ERC20(genArtCoreContract.projectIdToCurrencyAddress(_projectId)) .balanceOf(msg.sender); return balance; } function checkYourAllowanceOfProjectERC20(uint256 _projectId) public view returns (uint256) { uint256 remaining = ERC20(genArtCoreContract.projectIdToCurrencyAddress(_projectId)) .allowance(msg.sender, address(this)); return remaining; } function setProjectMintLimit(uint256 _projectId, uint8 _limit) public { require(genArtCoreContract.isWhitelisted(msg.sender), 'can only be set by admin'); projectMintLimit[_projectId] = _limit; } function setProjectMaxInvocations(uint256 _projectId) public { require(genArtCoreContract.isWhitelisted(msg.sender), 'can only be set by admin'); uint256 maxInvocations; uint256 invocations; (, , invocations, maxInvocations, , , , , ) = genArtCoreContract.projectTokenInfo( _projectId ); projectMaxInvocations[_projectId] = maxInvocations; if (invocations < maxInvocations) { projectMaxHasBeenInvoked[_projectId] = false; } } function setOwnerAddress(address payable _ownerAddress) public { require(genArtCoreContract.isWhitelisted(msg.sender), 'can only be set by admin'); ownerAddress = _ownerAddress; } function setOwnerPercentage(uint256 _ownerPercentage) public { require(genArtCoreContract.isWhitelisted(msg.sender), 'can only be set by admin'); ownerPercentage = _ownerPercentage; } function toggleContractFilter(uint256 _projectId) public { require(genArtCoreContract.isWhitelisted(msg.sender), 'can only be set by admin'); contractFilterProject[_projectId] = !contractFilterProject[_projectId]; } function artistToggleBonus(uint256 _projectId) public { require( msg.sender == genArtCoreContract.projectIdToArtistAddress(_projectId), 'can only be set by artist' ); projectIdToBonus[_projectId] = !projectIdToBonus[_projectId]; } function artistSetBonusContractAddress(uint256 _projectId, address _bonusContractAddress) public { require( msg.sender == genArtCoreContract.projectIdToArtistAddress(_projectId), 'can only be set by artist' ); projectIdToBonusContractAddress[_projectId] = _bonusContractAddress; } function purchase(uint256 _projectId) internal returns (uint256 _tokenId) { return purchaseTo(msg.sender, _projectId, false); } // Remove `public`` and `payable`` to prevent public use // of the `purchaseTo`` function. function purchaseTo( address _to, uint256 _projectId, bool _isDeferredRefund ) internal returns (uint256 _tokenId) { require(!projectMaxHasBeenInvoked[_projectId], 'Maximum number of invocations reached'); if ( keccak256(abi.encodePacked(genArtCoreContract.projectIdToCurrencySymbol(_projectId))) != keccak256(abi.encodePacked('ETH')) ) { require( msg.value == 0, 'this project accepts a different currency and cannot accept ETH' ); require( ERC20(genArtCoreContract.projectIdToCurrencyAddress(_projectId)).allowance( msg.sender, address(this) ) >= genArtCoreContract.projectIdToPricePerTokenInWei(_projectId), 'Insufficient Funds Approved for TX' ); require( ERC20(genArtCoreContract.projectIdToCurrencyAddress(_projectId)).balanceOf( msg.sender ) >= genArtCoreContract.projectIdToPricePerTokenInWei(_projectId), 'Insufficient balance.' ); _splitFundsERC20(_projectId); } else { require( msg.value >= genArtCoreContract.projectIdToPricePerTokenInWei(_projectId), 'Must send minimum value to mint!' ); _splitFundsETH(_projectId, _isDeferredRefund); } // if contract filter is active prevent calls from another contract if (contractFilterProject[_projectId]) require(msg.sender == tx.origin, 'No Contract Buys'); // limit mints per address by project if (projectMintLimit[_projectId] > 0) { require( projectMintCounter[msg.sender][_projectId] < projectMintLimit[_projectId], 'Reached minting limit' ); projectMintCounter[msg.sender][_projectId]++; } uint256 tokenId = genArtCoreContract.mint(_to, _projectId, msg.sender); // What if this overflows, since default value of uint256 is 0? // That is intended, so that by default the minter allows infinite // transactions, allowing the `genArtCoreContract` to stop minting // `uint256 tokenInvocation = tokenId % ONE_MILLION;` if (tokenId % ONE_MILLION == projectMaxInvocations[_projectId] - 1) { projectMaxHasBeenInvoked[_projectId] = true; } if (projectIdToBonus[_projectId]) { require( BonusContract(projectIdToBonusContractAddress[_projectId]).bonusIsActive(), 'bonus must be active' ); BonusContract(projectIdToBonusContractAddress[_projectId]).triggerBonus(msg.sender); } return tokenId; } function _splitFundsETH(uint256 _projectId, bool _isDeferredRefund) internal { if (msg.value > 0) { uint256 pricePerTokenInWei = genArtCoreContract.projectIdToPricePerTokenInWei( _projectId ); uint256 refund = msg.value.sub( genArtCoreContract.projectIdToPricePerTokenInWei(_projectId) ); if (!_isDeferredRefund && refund > 0) { msg.sender.transfer(refund); } uint256 renderProviderAmount = pricePerTokenInWei.div(100).mul( genArtCoreContract.renderProviderPercentage() ); if (renderProviderAmount > 0) { genArtCoreContract.renderProviderAddress().transfer(renderProviderAmount); } uint256 remainingFunds = pricePerTokenInWei.sub(renderProviderAmount); uint256 ownerFunds = remainingFunds.div(100).mul(ownerPercentage); if (ownerFunds > 0) { ownerAddress.transfer(ownerFunds); } uint256 projectFunds = pricePerTokenInWei.sub(renderProviderAmount).sub(ownerFunds); uint256 additionalPayeeAmount; if (genArtCoreContract.projectIdToAdditionalPayeePercentage(_projectId) > 0) { additionalPayeeAmount = projectFunds.div(100).mul( genArtCoreContract.projectIdToAdditionalPayeePercentage(_projectId) ); if (additionalPayeeAmount > 0) { genArtCoreContract.projectIdToAdditionalPayee(_projectId).transfer( additionalPayeeAmount ); } } uint256 creatorFunds = projectFunds.sub(additionalPayeeAmount); if (creatorFunds > 0) { genArtCoreContract.projectIdToArtistAddress(_projectId).transfer(creatorFunds); } } } function _splitFundsERC20(uint256 _projectId) internal { uint256 pricePerTokenInWei = genArtCoreContract.projectIdToPricePerTokenInWei(_projectId); uint256 renderProviderAmount = pricePerTokenInWei.div(100).mul( genArtCoreContract.renderProviderPercentage() ); if (renderProviderAmount > 0) { ERC20(genArtCoreContract.projectIdToCurrencyAddress(_projectId)).transferFrom( msg.sender, genArtCoreContract.renderProviderAddress(), renderProviderAmount ); } uint256 remainingFunds = pricePerTokenInWei.sub(renderProviderAmount); uint256 ownerFunds = remainingFunds.div(100).mul(ownerPercentage); if (ownerFunds > 0) { ERC20(genArtCoreContract.projectIdToCurrencyAddress(_projectId)).transferFrom( msg.sender, ownerAddress, ownerFunds ); } uint256 projectFunds = pricePerTokenInWei.sub(renderProviderAmount).sub(ownerFunds); uint256 additionalPayeeAmount; if (genArtCoreContract.projectIdToAdditionalPayeePercentage(_projectId) > 0) { additionalPayeeAmount = projectFunds.div(100).mul( genArtCoreContract.projectIdToAdditionalPayeePercentage(_projectId) ); if (additionalPayeeAmount > 0) { ERC20(genArtCoreContract.projectIdToCurrencyAddress(_projectId)).transferFrom( msg.sender, genArtCoreContract.projectIdToAdditionalPayee(_projectId), additionalPayeeAmount ); } } uint256 creatorFunds = projectFunds.sub(additionalPayeeAmount); if (creatorFunds > 0) { ERC20(genArtCoreContract.projectIdToCurrencyAddress(_projectId)).transferFrom( msg.sender, genArtCoreContract.projectIdToArtistAddress(_projectId), creatorFunds ); } } }
// File: openzeppelin-solidity/contracts/introspection/IERC165.sol pragma solidity ^0.5.0; /** * @dev Interface of the ERC165 standard, as defined in the * [EIP](https://eips.ethereum.org/EIPS/eip-165). * * 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 * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * 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); }
// File: @openzeppelin/contracts/token/ERC20/IERC20.sol pragma solidity ^0.5.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. Does not include * the optional functions; to access them see {ERC20Detailed}. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// File: openzeppelin-solidity/contracts/token/ERC721/IERC721.sol pragma solidity ^0.5.0; import './IERC165.sol'; /** * @dev Required interface of an ERC721 compliant contract. */ contract IERC721 is IERC165 { event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of NFTs in `owner`'s account. */ function balanceOf(address owner) public view returns (uint256 balance); /** * @dev Returns the owner of the NFT specified by `tokenId`. */ function ownerOf(uint256 tokenId) public view returns (address owner); /** * @dev Transfers a specific NFT (`tokenId`) from one account (`from`) to * another (`to`). * * * * Requirements: * - `from`, `to` cannot be zero. * - `tokenId` must be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this * NFT by either `approve` or `setApproveForAll`. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public; /** * @dev Transfers a specific NFT (`tokenId`) from one account (`from`) to * another (`to`). * * Requirements: * - If the caller is not `from`, it must be approved to move this NFT by * either `approve` or `setApproveForAll`. */ function transferFrom( address from, address to, uint256 tokenId ) public; function approve(address to, uint256 tokenId) public; function getApproved(uint256 tokenId) public view returns (address operator); function setApprovalForAll(address operator, bool _approved) public; function isApprovedForAll(address owner, address operator) public view returns (bool); function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory data ) public; }
// File: openzeppelin-solidity/contracts/token/ERC721/IERC721Enumerable.sol pragma solidity ^0.5.0; import './IERC721.sol'; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ contract IERC721Enumerable is IERC721 { function totalSupply() public view returns (uint256); function tokenOfOwnerByIndex(address owner, uint256 index) public view returns (uint256 tokenId); function tokenByIndex(uint256 index) public view returns (uint256); }
// File: openzeppelin-solidity/contracts/token/ERC721/IERC721Receiver.sol pragma solidity ^0.5.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ contract IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes memory data ) public returns (bytes4); }
pragma solidity ^0.5.0; interface IGenArt721CoreV2 { function isWhitelisted(address sender) external view returns (bool); function admin() external view returns (address); function projectIdToCurrencySymbol(uint256 _projectId) external view returns (string memory); function projectIdToCurrencyAddress(uint256 _projectId) external view returns (address); function projectIdToArtistAddress(uint256 _projectId) external view returns (address payable); function projectIdToPricePerTokenInWei(uint256 _projectId) external view returns (uint256); function projectIdToAdditionalPayee(uint256 _projectId) external view returns (address payable); function projectIdToAdditionalPayeePercentage(uint256 _projectId) external view returns (uint256); function projectTokenInfo(uint256 _projectId) external view returns ( address, uint256, uint256, uint256, bool, address, uint256, string memory, address ); function renderProviderAddress() external view returns (address payable); function renderProviderPercentage() external view returns (uint256); function mint( address _to, uint256 _projectId, address _by ) external returns (uint256 tokenId); function ownerOf(uint256 tokenId) external view returns (address); function tokenIdToProjectId(uint256 tokenId) external view returns (uint256); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.5.0; /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = _efficientHash(computedHash, proofElement); } else { // Hash(current element of the proof + current computed hash) computedHash = _efficientHash(proofElement, computedHash); } } return computedHash; } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } }
pragma solidity ^0.5.0; contract Randomizer { function returnValue() public view returns (bytes32) { uint256 time = block.timestamp; uint256 extra = (time % 200) + 1; return keccak256(abi.encodePacked(block.number, blockhash(block.number - 2), time, extra)); } }
// https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v2.4.0/contracts/math/SafeMath.sol pragma solidity ^0.5.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, 'SafeMath: addition overflow'); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, 'SafeMath: subtraction overflow'); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. * * _Available since v2.4.0._ */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, 'SafeMath: multiplication overflow'); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, 'SafeMath: division by zero'); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, 'SafeMath: modulo by zero'); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. * * _Available since v2.4.0._ */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } }
// File: contracts/Strings.sol pragma solidity ^0.5.0; //https://github.com/oraclize/ethereum-api/blob/master/oraclizeAPI_0.5.sol library Strings { /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } function strConcat(string memory _a, string memory _b) internal pure returns (string memory _concatenatedString) { return strConcat(_a, _b, '', '', ''); } function strConcat( string memory _a, string memory _b, string memory _c ) internal pure returns (string memory _concatenatedString) { return strConcat(_a, _b, _c, '', ''); } function strConcat( string memory _a, string memory _b, string memory _c, string memory _d ) internal pure returns (string memory _concatenatedString) { return strConcat(_a, _b, _c, _d, ''); } function strConcat( string memory _a, string memory _b, string memory _c, string memory _d, string memory _e ) internal pure returns (string memory _concatenatedString) { bytes memory _ba = bytes(_a); bytes memory _bb = bytes(_b); bytes memory _bc = bytes(_c); bytes memory _bd = bytes(_d); bytes memory _be = bytes(_e); string memory abcde = new string( _ba.length + _bb.length + _bc.length + _bd.length + _be.length ); bytes memory babcde = bytes(abcde); uint256 k = 0; uint256 i = 0; for (i = 0; i < _ba.length; i++) { babcde[k++] = _ba[i]; } for (i = 0; i < _bb.length; i++) { babcde[k++] = _bb[i]; } for (i = 0; i < _bc.length; i++) { babcde[k++] = _bc[i]; } for (i = 0; i < _bd.length; i++) { babcde[k++] = _bd[i]; } for (i = 0; i < _be.length; i++) { babcde[k++] = _be[i]; } return string(babcde); } function uint2str(uint256 _i) internal pure returns (string memory _uintAsString) { if (_i == 0) { return '0'; } uint256 j = _i; uint256 len; while (j != 0) { len++; j /= 10; } bytes memory bstr = new bytes(len); uint256 k = len - 1; while (_i != 0) { bstr[k--] = bytes1(uint8(48 + (_i % 10))); _i /= 10; } return string(bstr); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":true,"inputs":[{"name":"projectId","type":"uint256"}],"name":"getMerkleRoot","outputs":[{"name":"merkleRoot","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"whitelist","type":"address"}],"name":"setActiveWhitelist","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"projectId","type":"uint256"},{"name":"quantity","type":"uint256"},{"name":"allottedAmount","type":"uint256"},{"name":"proof","type":"bytes32[]"}],"name":"redeem","outputs":[{"name":"_tokenIds","type":"uint256[]"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"projectId","type":"uint256"},{"name":"quantity","type":"uint256"},{"name":"allottedAmount","type":"uint256"},{"name":"proof","type":"bytes32[]"}],"name":"redeemTo","outputs":[{"name":"_tokenIds","type":"uint256[]"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_projectId","type":"uint256"},{"name":"_limit","type":"uint8"}],"name":"setProjectMintLimit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"projectId","type":"uint256"},{"name":"user","type":"address"}],"name":"getWhitelisted","outputs":[{"name":"amount","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_ownerAddress","type":"address"}],"name":"setOwnerAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_ownerPercentage","type":"uint256"}],"name":"setOwnerPercentage","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"uint256"}],"name":"projectMintCounter","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_projectId","type":"uint256"},{"name":"_bonusContractAddress","type":"address"}],"name":"artistSetBonusContractAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"ownerPercentage","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"projectMaxHasBeenInvoked","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"projectMaxInvocations","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_projectId","type":"uint256"}],"name":"toggleContractFilter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"projectMintLimit","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"projectId","type":"uint256"},{"name":"quantity","type":"uint256"}],"name":"purchase","outputs":[{"name":"_tokenIds","type":"uint256[]"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"projectIdToBonus","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"projectIdToBonusContractAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"genArtCoreContract","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ownerAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"activeWhitelist","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_projectId","type":"uint256"}],"name":"artistToggleBonus","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"projectId","type":"uint256"},{"name":"quantity","type":"uint256"}],"name":"purchaseTo","outputs":[{"name":"_tokenIds","type":"uint256[]"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"_projectId","type":"uint256"}],"name":"getYourBalanceOfProjectERC20","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"minterState","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_projectId","type":"uint256"}],"name":"checkYourAllowanceOfProjectERC20","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_projectId","type":"uint256"}],"name":"setProjectMaxInvocations","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"contractFilterProject","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_genArtCore","type":"address"},{"name":"_minterStateAddress","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"projectId","type":"uint256"}],"name":"Redeem","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"projectId","type":"uint256"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"PurchaseMany","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_projectId","type":"uint256"}],"name":"Purchase","type":"event"}]
Contract Creation Code
608060405234801561001057600080fd5b50604051604080620041298339810180604052604081101561003157600080fd5b50805160209091015160008054600160a060020a03938416600160a060020a031991821617909155600b80549390921692169190911790556140b080620000796000396000f3fe6080604052600436106101505763ffffffff60e060020a6000350416630aab8ba581146101555780631399c04f146101915780631606c0c6146101c65780631748f818146102cc578063231c22811461039057806328025280146103c3578063331a6bf5146103fc578063393b011c1461042f5780633a4657b4146104595780633c34b9f01461049257806341da7555146104cb578063462add46146104e057806356690aaf1461051e578063569f6f921461054857806362f7a7ed1461057257806370876c981461059c57806373709417146105bf5780637e6906de146105e95780637f38902b1461062f5780638f84aa091461064457806392a3b3f91461065957806395e3b0de1461066e578063a4d256bc14610698578063a9809600146106ca578063acaac517146106f4578063f463210314610709578063f7bd4b8814610733578063f9f96b9e1461075d575b600080fd5b34801561016157600080fd5b5061017f6004803603602081101561017857600080fd5b5035610787565b60408051918252519081900360200190f35b34801561019d57600080fd5b506101c4600480360360208110156101b457600080fd5b5035600160a060020a0316610885565b005b61027c600480360360808110156101dc57600080fd5b8135916020810135916040820135919081019060808101606082013564010000000081111561020a57600080fd5b82018360208201111561021c57600080fd5b8035906020019184602083028401116401000000008311171561023e57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610972945050505050565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156102b85781810151838201526020016102a0565b505050509050019250505060405180910390f35b61027c600480360360a08110156102e257600080fd5b600160a060020a038235169160208101359160408201359160608101359181019060a08101608082013564010000000081111561031e57600080fd5b82018360208201111561033057600080fd5b8035906020019184602083028401116401000000008311171561035257600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610a5e945050505050565b34801561039c57600080fd5b506101c4600480360360408110156103b357600080fd5b508035906020013560ff16610e79565b3480156103cf57600080fd5b5061017f600480360360408110156103e657600080fd5b5080359060200135600160a060020a0316610f4f565b34801561040857600080fd5b506101c46004803603602081101561041f57600080fd5b5035600160a060020a0316611056565b34801561043b57600080fd5b506101c46004803603602081101561045257600080fd5b5035611143565b34801561046557600080fd5b5061017f6004803603604081101561047c57600080fd5b50600160a060020a038135169060200135611206565b34801561049e57600080fd5b506101c4600480360360408110156104b557600080fd5b5080359060200135600160a060020a0316611223565b3480156104d757600080fd5b5061017f611338565b3480156104ec57600080fd5b5061050a6004803603602081101561050357600080fd5b503561133e565b604080519115158252519081900360200190f35b34801561052a57600080fd5b5061017f6004803603602081101561054157600080fd5b5035611353565b34801561055457600080fd5b506101c46004803603602081101561056b57600080fd5b5035611365565b34801561057e57600080fd5b5061017f6004803603602081101561059557600080fd5b5035611443565b61027c600480360360408110156105b257600080fd5b5080359060200135611455565b3480156105cb57600080fd5b5061050a600480360360208110156105e257600080fd5b5035611563565b3480156105f557600080fd5b506106136004803603602081101561060c57600080fd5b5035611578565b60408051600160a060020a039092168252519081900360200190f35b34801561063b57600080fd5b50610613611593565b34801561065057600080fd5b506106136115a2565b34801561066557600080fd5b506106136115b1565b34801561067a57600080fd5b506101c46004803603602081101561069157600080fd5b50356115c0565b61027c600480360360608110156106ae57600080fd5b50600160a060020a0381351690602081013590604001356116ba565b3480156106d657600080fd5b5061017f600480360360208110156106ed57600080fd5b503561198e565b34801561070057600080fd5b50610613611a9d565b34801561071557600080fd5b5061017f6004803603602081101561072c57600080fd5b5035611aac565b34801561073f57600080fd5b506101c46004803603602081101561075657600080fd5b5035611b8e565b34801561076957600080fd5b5061050a6004803603602081101561078057600080fd5b5035611dae565b600a54600090600160a060020a031615156107ec576040805160e560020a62461bcd02815260206004820152601860248201527f4163746976652077686974656c697374206e6f74207365740000000000000000604482015290519081900360640190fd5b600a54604080517f0aab8ba5000000000000000000000000000000000000000000000000000000008152600481018590529051600160a060020a0390921691630aab8ba591602480820192602092909190829003018186803b15801561085157600080fd5b505afa158015610865573d6000803e3d6000fd5b505050506040513d602081101561087b57600080fd5b505190505b919050565b6000546040805160e060020a633af32abf0281523360048201529051600160a060020a0390921691633af32abf91602480820192602092909190829003018186803b1580156108d357600080fd5b505afa1580156108e7573d6000803e3d6000fd5b505050506040513d60208110156108fd57600080fd5b50511515610943576040805160e560020a62461bcd0281526020600482015260186024820152600080516020614065833981519152604482015290519081900360640190fd5b600a805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b6060846001600b546040805160e360020a63089935e5028152600481018590529051600160a060020a03909216916344c9af2891602480820192602092909190829003018186803b1580156109c657600080fd5b505afa1580156109da573d6000803e3d6000fd5b505050506040513d60208110156109f057600080fd5b505114610a47576040805160e560020a62461bcd02815260206004820152601760248201527f6e6f7420696e20726564656d7074696f6e207068617365000000000000000000604482015290519081900360640190fd5b610a543387878787610a5e565b9695505050505050565b6060846001600b546040805160e360020a63089935e5028152600481018590529051600160a060020a03909216916344c9af2891602480820192602092909190829003018186803b158015610ab257600080fd5b505afa158015610ac6573d6000803e3d6000fd5b505050506040513d6020811015610adc57600080fd5b505114610b33576040805160e560020a62461bcd02815260206004820152601760248201527f6e6f7420696e20726564656d7074696f6e207068617365000000000000000000604482015290519081900360640190fd5b600a54600160a060020a03161515610b95576040805160e560020a62461bcd02815260206004820152601860248201527f4163746976652077686974656c697374206e6f74207365740000000000000000604482015290519081900360640190fd5b600a54604080517f2802528000000000000000000000000000000000000000000000000000000000815260048101899052600160a060020a038a8116602483015291518793610c41938a93911691632802528091604480820192602092909190829003018186803b158015610c0957600080fd5b505afa158015610c1d573d6000803e3d6000fd5b505050506040513d6020811015610c3357600080fd5b50519063ffffffff611dc316565b1115610c97576040805160e560020a62461bcd02815260206004820152601b60248201527f416464726573732068617320616c726561647920636c61696d65640000000000604482015290519081900360640190fd5b6060610ca288611e27565b9050610cbf81610cb18761203d565b610cba8a61203d565b612114565b90506000816040516020018082805190602001908083835b60208310610cf65780518252601f199092019160209182019101610cd7565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052805190602001209050610d4685610d408a610787565b8361226c565b1515610d9c576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c69642070726f6f6600000000000000000000000000000000000000604482015290519081900360640190fd5b6060610da98a8a8a612282565b600a54604080517f6bf97eb1000000000000000000000000000000000000000000000000000000008152600481018d9052600160a060020a038e81166024830152604482018d90529151939450911691636bf97eb19160648082019260009290919082900301818387803b158015610e2057600080fd5b505af1158015610e34573d6000803e3d6000fd5b5050604080518c815290517f702d5967f45f6513a38ffc42d6ba9bf230bd40e8f53b16363c7eb4fd2deb9a449350908190036020019150a19998505050505050505050565b6000546040805160e060020a633af32abf0281523360048201529051600160a060020a0390921691633af32abf91602480820192602092909190829003018186803b158015610ec757600080fd5b505afa158015610edb573d6000803e3d6000fd5b505050506040513d6020811015610ef157600080fd5b50511515610f37576040805160e560020a62461bcd0281526020600482015260186024820152600080516020614065833981519152604482015290519081900360640190fd5b60009182526007602052604090912060ff9091169055565b600a54600090600160a060020a03161515610fb4576040805160e560020a62461bcd02815260206004820152601860248201527f4163746976652077686974656c697374206e6f74207365740000000000000000604482015290519081900360640190fd5b600a54604080517f2802528000000000000000000000000000000000000000000000000000000000815260048101869052600160a060020a038581166024830152915191909216916328025280916044808301926020929190829003018186803b15801561102157600080fd5b505afa158015611035573d6000803e3d6000fd5b505050506040513d602081101561104b57600080fd5b505190505b92915050565b6000546040805160e060020a633af32abf0281523360048201529051600160a060020a0390921691633af32abf91602480820192602092909190829003018186803b1580156110a457600080fd5b505afa1580156110b8573d6000803e3d6000fd5b505050506040513d60208110156110ce57600080fd5b50511515611114576040805160e560020a62461bcd0281526020600482015260186024820152600080516020614065833981519152604482015290519081900360640190fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b6000546040805160e060020a633af32abf0281523360048201529051600160a060020a0390921691633af32abf91602480820192602092909190829003018186803b15801561119157600080fd5b505afa1580156111a5573d6000803e3d6000fd5b505050506040513d60208110156111bb57600080fd5b50511515611201576040805160e560020a62461bcd0281526020600482015260186024820152600080516020614065833981519152604482015290519081900360640190fd5b600255565b600660209081526000928352604080842090915290825290205481565b6000546040805160e060020a63a47d29cb028152600481018590529051600160a060020a039092169163a47d29cb91602480820192602092909190829003018186803b15801561127257600080fd5b505afa158015611286573d6000803e3d6000fd5b505050506040513d602081101561129c57600080fd5b5051600160a060020a031633146112fd576040805160e560020a62461bcd02815260206004820152601960248201527f63616e206f6e6c79206265207365742062792061727469737400000000000000604482015290519081900360640190fd5b600091825260046020526040909120805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03909216919091179055565b60025481565b60086020526000908152604090205460ff1681565b60096020526000908152604090205481565b6000546040805160e060020a633af32abf0281523360048201529051600160a060020a0390921691633af32abf91602480820192602092909190829003018186803b1580156113b357600080fd5b505afa1580156113c7573d6000803e3d6000fd5b505050506040513d60208110156113dd57600080fd5b50511515611423576040805160e560020a62461bcd0281526020600482015260186024820152600080516020614065833981519152604482015290519081900360640190fd5b6000908152600560205260409020805460ff19811660ff90911615179055565b60076020526000908152604090205481565b6060826001600b546040805160e360020a63089935e5028152600481018590529051600160a060020a03909216916344c9af2891602480820192602092909190829003018186803b1580156114a957600080fd5b505afa1580156114bd573d6000803e3d6000fd5b505050506040513d60208110156114d357600080fd5b50511415611550576040805160e560020a62461bcd028152602060048201526024808201527f63616e206e6f7420707572636861736520696e20726564656d7074696f6e207060448201527f6861736500000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b61155b3385856116ba565b949350505050565b60036020526000908152604090205460ff1681565b600460205260009081526040902054600160a060020a031681565b600054600160a060020a031681565b600154600160a060020a031681565b600a54600160a060020a031681565b6000546040805160e060020a63a47d29cb028152600481018490529051600160a060020a039092169163a47d29cb91602480820192602092909190829003018186803b15801561160f57600080fd5b505afa158015611623573d6000803e3d6000fd5b505050506040513d602081101561163957600080fd5b5051600160a060020a0316331461169a576040805160e560020a62461bcd02815260206004820152601960248201527f63616e206f6e6c79206265207365742062792061727469737400000000000000604482015290519081900360640190fd5b6000908152600360205260409020805460ff19811660ff90911615179055565b6060826001600b546040805160e360020a63089935e5028152600481018590529051600160a060020a03909216916344c9af2891602480820192602092909190829003018186803b15801561170e57600080fd5b505afa158015611722573d6000803e3d6000fd5b505050506040513d602081101561173857600080fd5b505114156117b5576040805160e560020a62461bcd028152602060048201526024808201527f63616e206e6f7420707572636861736520696e20726564656d7074696f6e207060448201527f6861736500000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600b54604080517f7413d37b000000000000000000000000000000000000000000000000000000008152600481018790529051600160a060020a0390921691637413d37b91602480820192602092909190829003018186803b15801561181a57600080fd5b505afa15801561182e573d6000803e3d6000fd5b505050506040513d602081101561184457600080fd5b505183111561189d576040805160e560020a62461bcd02815260206004820152601f60248201527f4d6178207075726368617365206d616e79206c696d6974207265616368656400604482015290519081900360640190fd5b600b546040805160e360020a63089935e5028152600481018790529051600092600160a060020a0316916344c9af28916024808301926020929190829003018186803b1580156118ec57600080fd5b505afa158015611900573d6000803e3d6000fd5b505050506040513d602081101561191657600080fd5b50511480156119255750600034115b1561197a576040805160e560020a62461bcd02815260206004820152601d60248201527f455448206e6f7420616363657074656420617420746869732074696d65000000604482015290519081900360640190fd5b611985858585612282565b95945050505050565b600080546040805160e060020a63498dd0c10281526004810185905290518392600160a060020a03169163498dd0c1916024808301926020929190829003018186803b1580156119dd57600080fd5b505afa1580156119f1573d6000803e3d6000fd5b505050506040513d6020811015611a0757600080fd5b5051604080517f70a082310000000000000000000000000000000000000000000000000000000081523360048201529051600160a060020a03909216916370a0823191602480820192602092909190829003018186803b158015611a6a57600080fd5b505afa158015611a7e573d6000803e3d6000fd5b505050506040513d6020811015611a9457600080fd5b50519392505050565b600b54600160a060020a031681565b600080546040805160e060020a63498dd0c10281526004810185905290518392600160a060020a03169163498dd0c1916024808301926020929190829003018186803b158015611afb57600080fd5b505afa158015611b0f573d6000803e3d6000fd5b505050506040513d6020811015611b2557600080fd5b5051604080517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523360048201523060248201529051600160a060020a039092169163dd62ed3e91604480820192602092909190829003018186803b158015611a6a57600080fd5b6000546040805160e060020a633af32abf0281523360048201529051600160a060020a0390921691633af32abf91602480820192602092909190829003018186803b158015611bdc57600080fd5b505afa158015611bf0573d6000803e3d6000fd5b505050506040513d6020811015611c0657600080fd5b50511515611c4c576040805160e560020a62461bcd0281526020600482015260186024820152600080516020614065833981519152604482015290519081900360640190fd5b60008054604080517f8c2c36220000000000000000000000000000000000000000000000000000000081526004810185905290518392600160a060020a031691638c2c36229160248083019286929190829003018186803b158015611cb057600080fd5b505afa158015611cc4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610120811015611cee57600080fd5b8151602083015160408401516060850151608086015160a087015160c088015160e08901805197999698959794969395929491939283019291640100000000811115611d3957600080fd5b82016020810184811115611d4c57600080fd5b8151640100000000811182820187101715611d6657600080fd5b50505060008d815260096020526040902087905550949950949750505050858510159350611da992505050576000838152600860205260409020805460ff191690555b505050565b60056020526000908152604090205460ff1681565b600082820183811015611e20576040805160e560020a62461bcd02815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b604080516c01000000000000000000000000600160a060020a03841602602082015281518082036014018152602a603483018181526094909301909352606092909183916020820181803883390190505090507f3000000000000000000000000000000000000000000000000000000000000000816000815181101515611eaa57fe5b906020010190600160f860020a031916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181101515611ef257fe5b906020010190600160f860020a031916908160001a90535060005b601481101561203557600060108483815181101515611f2857fe5b90602001015160f860020a900460f860020a0260f860020a900460ff16811515611f4e57fe5b0490506000816010028584815181101515611f6557fe5b016020015160f860020a908190048102040390506000600a60ff841610611f95578260570160f860020a02611fa0565b8260300160f860020a025b90506000600a8360ff1610611fbe578260570160f860020a02611fc9565b8260300160f860020a025b9050808686600202600301815181101515611fe057fe5b906020010190600160f860020a031916908160001a90535081868660020260020181518110151561200d57fe5b906020010190600160f860020a031916908160001a9053505060019093019250611f0d915050565b509392505050565b6060811515612080575060408051808201909152600181527f30000000000000000000000000000000000000000000000000000000000000006020820152610880565b8160005b811561209857600101600a82049150612084565b6060816040519080825280601f01601f1916602001820160405280156120c5576020820181803883390190505b5090505b841561155b5760001990910190600a850660300160f860020a0281838151811015156120f157fe5b906020010190600160f860020a031916908160001a905350600a850494506120c9565b60608383836040516020018084805190602001908083835b6020831061214b5780518252601f19909201916020918201910161212c565b51815160209384036101000a60001901801990921691161790527f3a3a000000000000000000000000000000000000000000000000000000000000919093019081528551600290910192860191508083835b602083106121bc5780518252601f19909201916020918201910161219d565b51815160209384036101000a60001901801990921691161790527f3a3a000000000000000000000000000000000000000000000000000000000000919093019081528451600290910192850191508083835b6020831061222d5780518252601f19909201916020918201910161220e565b6001836020036101000a038019825116818451168082178552505050505050905001935050505060405160208183030381529060405290509392505050565b600082612279858461248c565b14949350505050565b606080826040519080825280602002602001820160405280156122af578160200160208202803883390190505b50905060003481101561241057600080546040805160e260020a633dc303c1028152600481018990529051600160a060020a039092169163f70c0f0491602480820192602092909190829003018186803b15801561230c57600080fd5b505afa158015612320573d6000803e3d6000fd5b505050506040513d602081101561233657600080fd5b5051905061234a818663ffffffff6124e416565b3410156123a1576040805160e560020a62461bcd02815260206004820152601c60248201527f6e6f7420656e6f7567682066756e6473207472616e7366657272656400000000604482015290519081900360640190fd5b60006123c36123b6838863ffffffff6124e416565b349063ffffffff61258016565b905060019250600081111561240d576040518890600160a060020a0382169083156108fc029084906000818181858888f1935050505015801561240a573d6000803e3d6000fd5b50505b50505b60005b84811015612481576124268787846125c2565b838281518110151561243457fe5b90602001906020020181815250507fe2aeb2ae0272c38a449d3cebb58f6894790a45bfb16f73a8e1761acb1e312053866040518082815260200191505060405180910390a1600101612413565b509095945050505050565b600081815b845181101561203557600085828151811015156124aa57fe5b6020908102909101015190508083116124ce576124c783826130da565b92506124db565b6124d881846130da565b92505b50600101612491565b60008215156124f557506000611050565b82820282848281151561250457fe5b0414611e20576040805160e560020a62461bcd02815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60448201527f7700000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6000611e2083836040805190810160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506130e9565b60008281526008602052604081205460ff161561264f576040805160e560020a62461bcd02815260206004820152602560248201527f4d6178696d756d206e756d626572206f6620696e766f636174696f6e7320726560448201527f6163686564000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b604080517f4554480000000000000000000000000000000000000000000000000000000000602080830191909152825180830360030181526023830180855281519190920120600080547f20927ec9000000000000000000000000000000000000000000000000000000009093526027840188905293519093600160a060020a03909216926320927ec9926047808301939192829003018186803b1580156126f657600080fd5b505afa15801561270a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561273357600080fd5b81019080805164010000000081111561274b57600080fd5b8201602081018481111561275e57600080fd5b815164010000000081118282018710171561277857600080fd5b50509291905050506040516020018082805190602001908083835b602083106127b25780518252601f199092019160209182019101612793565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120141515612c5c573415612870576040805160e560020a62461bcd02815260206004820152603f60248201527f746869732070726f6a6563742061636365707473206120646966666572656e7460448201527f2063757272656e637920616e642063616e6e6f74206163636570742045544800606482015290519081900360840190fd5b6000546040805160e260020a633dc303c1028152600481018690529051600160a060020a039092169163f70c0f0491602480820192602092909190829003018186803b1580156128bf57600080fd5b505afa1580156128d3573d6000803e3d6000fd5b505050506040513d60208110156128e957600080fd5b50516000546040805160e060020a63498dd0c1028152600481018790529051600160a060020a039092169163498dd0c191602480820192602092909190829003018186803b15801561293a57600080fd5b505afa15801561294e573d6000803e3d6000fd5b505050506040513d602081101561296457600080fd5b5051604080517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523360048201523060248201529051600160a060020a039092169163dd62ed3e91604480820192602092909190829003018186803b1580156129cd57600080fd5b505afa1580156129e1573d6000803e3d6000fd5b505050506040513d60208110156129f757600080fd5b50511015612a75576040805160e560020a62461bcd02815260206004820152602260248201527f496e73756666696369656e742046756e647320417070726f76656420666f722060448201527f5458000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6000546040805160e260020a633dc303c1028152600481018690529051600160a060020a039092169163f70c0f0491602480820192602092909190829003018186803b158015612ac457600080fd5b505afa158015612ad8573d6000803e3d6000fd5b505050506040513d6020811015612aee57600080fd5b50516000546040805160e060020a63498dd0c1028152600481018790529051600160a060020a039092169163498dd0c191602480820192602092909190829003018186803b158015612b3f57600080fd5b505afa158015612b53573d6000803e3d6000fd5b505050506040513d6020811015612b6957600080fd5b5051604080517f70a082310000000000000000000000000000000000000000000000000000000081523360048201529051600160a060020a03909216916370a0823191602480820192602092909190829003018186803b158015612bcc57600080fd5b505afa158015612be0573d6000803e3d6000fd5b505050506040513d6020811015612bf657600080fd5b50511015612c4e576040805160e560020a62461bcd02815260206004820152601560248201527f496e73756666696369656e742062616c616e63652e0000000000000000000000604482015290519081900360640190fd5b612c5783613183565b612d38565b6000546040805160e260020a633dc303c1028152600481018690529051600160a060020a039092169163f70c0f0491602480820192602092909190829003018186803b158015612cab57600080fd5b505afa158015612cbf573d6000803e3d6000fd5b505050506040513d6020811015612cd557600080fd5b5051341015612d2e576040805160e560020a62461bcd02815260206004820181905260248201527f4d7573742073656e64206d696e696d756d2076616c756520746f206d696e7421604482015290519081900360640190fd5b612d3883836139ec565b60008381526005602052604090205460ff1615612da657333214612da6576040805160e560020a62461bcd02815260206004820152601060248201527f4e6f20436f6e7472616374204275797300000000000000000000000000000000604482015290519081900360640190fd5b6000838152600760205260408120541115612e5857600083815260076020908152604080832054338452600683528184208785529092529091205410612e36576040805160e560020a62461bcd02815260206004820152601560248201527f52656163686564206d696e74696e67206c696d69740000000000000000000000604482015290519081900360640190fd5b3360009081526006602090815260408083208684529091529020805460010190555b60008054604080517f0d4d1513000000000000000000000000000000000000000000000000000000008152600160a060020a0388811660048301526024820188905233604483015291519190921691630d4d151391606480830192602092919082900301818787803b158015612ecd57600080fd5b505af1158015612ee1573d6000803e3d6000fd5b505050506040513d6020811015612ef757600080fd5b505160008581526009602052604090205490915060001901620f424082061415612f35576000848152600860205260409020805460ff191660011790555b60008481526003602052604090205460ff161561155b576000848152600460208181526040928390205483517f17999ff40000000000000000000000000000000000000000000000000000000081529351600160a060020a03909116936317999ff493818101939291829003018186803b158015612fb257600080fd5b505afa158015612fc6573d6000803e3d6000fd5b505050506040513d6020811015612fdc57600080fd5b50511515613034576040805160e560020a62461bcd02815260206004820152601460248201527f626f6e7573206d75737420626520616374697665000000000000000000000000604482015290519081900360640190fd5b60008481526004602081815260408084205481517ff473237d00000000000000000000000000000000000000000000000000000000815233948101949094529051600160a060020a039091169363f473237d936024808201949392918390030190829087803b1580156130a657600080fd5b505af11580156130ba573d6000803e3d6000fd5b505050506040513d60208110156130d057600080fd5b5050949350505050565b60009182526020526040902090565b6000818484111561317b5760405160e560020a62461bcd0281526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613140578181015183820152602001613128565b50505050905090810190601f16801561316d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600080546040805160e260020a633dc303c1028152600481018590529051600160a060020a039092169163f70c0f0491602480820192602092909190829003018186803b1580156131d357600080fd5b505afa1580156131e7573d6000803e3d6000fd5b505050506040513d60208110156131fd57600080fd5b505160008054604080517f2e9eb74f000000000000000000000000000000000000000000000000000000008152905193945091926132af92600160a060020a0390921691632e9eb74f916004808301926020929190829003018186803b15801561326657600080fd5b505afa15801561327a573d6000803e3d6000fd5b505050506040513d602081101561329057600080fd5b50516132a384606463ffffffff613fba16565b9063ffffffff6124e416565b9050600081111561344c576000546040805160e060020a63498dd0c1028152600481018690529051600160a060020a039092169163498dd0c191602480820192602092909190829003018186803b15801561330957600080fd5b505afa15801561331d573d6000803e3d6000fd5b505050506040513d602081101561333357600080fd5b5051600054604080517fcfbf4d970000000000000000000000000000000000000000000000000000000081529051600160a060020a03938416936323b872dd93339391169163cfbf4d9791600480820192602092909190829003018186803b15801561339e57600080fd5b505afa1580156133b2573d6000803e3d6000fd5b505050506040513d60208110156133c857600080fd5b50516040805160e060020a63ffffffff8616028152600160a060020a039384166004820152929091166024830152604482018590525160648083019260209291908290030181600087803b15801561341f57600080fd5b505af1158015613433573d6000803e3d6000fd5b505050506040513d602081101561344957600080fd5b50505b600061345e838363ffffffff61258016565b9050600061347c6002546132a3606485613fba90919063ffffffff16565b905060008111156135a4576000546040805160e060020a63498dd0c1028152600481018890529051600160a060020a039092169163498dd0c191602480820192602092909190829003018186803b1580156134d657600080fd5b505afa1580156134ea573d6000803e3d6000fd5b505050506040513d602081101561350057600080fd5b5051600154604080517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152600160a060020a03928316602482015260448101859052905191909216916323b872dd9160648083019260209291908290030181600087803b15801561357757600080fd5b505af115801561358b573d6000803e3d6000fd5b505050506040513d60208110156135a157600080fd5b50505b60006135c6826135ba878763ffffffff61258016565b9063ffffffff61258016565b600080546040805160e060020a63cc74234b028152600481018b9052905193945091928392600160a060020a039092169163cc74234b916024808301926020929190829003018186803b15801561361c57600080fd5b505afa158015613630573d6000803e3d6000fd5b505050506040513d602081101561364657600080fd5b50511115613842576000546040805160e060020a63cc74234b028152600481018a9052905161369e92600160a060020a03169163cc74234b916024808301926020929190829003018186803b15801561326657600080fd5b90506000811115613842576000546040805160e060020a63498dd0c1028152600481018a90529051600160a060020a039092169163498dd0c191602480820192602092909190829003018186803b1580156136f857600080fd5b505afa15801561370c573d6000803e3d6000fd5b505050506040513d602081101561372257600080fd5b5051600054604080517fd7b044b6000000000000000000000000000000000000000000000000000000008152600481018b90529051600160a060020a03938416936323b872dd93339391169163d7b044b691602480820192602092909190829003018186803b15801561379457600080fd5b505afa1580156137a8573d6000803e3d6000fd5b505050506040513d60208110156137be57600080fd5b50516040805160e060020a63ffffffff8616028152600160a060020a039384166004820152929091166024830152604482018590525160648083019260209291908290030181600087803b15801561381557600080fd5b505af1158015613829573d6000803e3d6000fd5b505050506040513d602081101561383f57600080fd5b50505b6000613854838363ffffffff61258016565b905060008111156139e2576000546040805160e060020a63498dd0c1028152600481018b90529051600160a060020a039092169163498dd0c191602480820192602092909190829003018186803b1580156138ae57600080fd5b505afa1580156138c2573d6000803e3d6000fd5b505050506040513d60208110156138d857600080fd5b50516000546040805160e060020a63a47d29cb028152600481018c90529051600160a060020a03938416936323b872dd93339391169163a47d29cb91602480820192602092909190829003018186803b15801561393457600080fd5b505afa158015613948573d6000803e3d6000fd5b505050506040513d602081101561395e57600080fd5b50516040805160e060020a63ffffffff8616028152600160a060020a039384166004820152929091166024830152604482018590525160648083019260209291908290030181600087803b1580156139b557600080fd5b505af11580156139c9573d6000803e3d6000fd5b505050506040513d60208110156139df57600080fd5b50505b5050505050505050565b6000341115613fb657600080546040805160e260020a633dc303c1028152600481018690529051600160a060020a039092169163f70c0f0491602480820192602092909190829003018186803b158015613a4557600080fd5b505afa158015613a59573d6000803e3d6000fd5b505050506040513d6020811015613a6f57600080fd5b5051600080546040805160e260020a633dc303c10281526004810188905290519394509192613b0292600160a060020a039092169163f70c0f04916024808301926020929190829003018186803b158015613ac957600080fd5b505afa158015613add573d6000803e3d6000fd5b505050506040513d6020811015613af357600080fd5b5051349063ffffffff61258016565b905082158015613b125750600081115b15613b4657604051339082156108fc029083906000818181858888f19350505050158015613b44573d6000803e3d6000fd5b505b60008054604080517f2e9eb74f0000000000000000000000000000000000000000000000000000000081529051613be392600160a060020a031691632e9eb74f916004808301926020929190829003018186803b158015613ba657600080fd5b505afa158015613bba573d6000803e3d6000fd5b505050506040513d6020811015613bd057600080fd5b50516132a385606463ffffffff613fba16565b90506000811115613ca3576000809054906101000a9004600160a060020a0316600160a060020a031663cfbf4d976040518163ffffffff1660e060020a02815260040160206040518083038186803b158015613c3e57600080fd5b505afa158015613c52573d6000803e3d6000fd5b505050506040513d6020811015613c6857600080fd5b5051604051600160a060020a039091169082156108fc029083906000818181858888f19350505050158015613ca1573d6000803e3d6000fd5b505b6000613cb5848363ffffffff61258016565b90506000613cd36002546132a3606485613fba90919063ffffffff16565b90506000811115613d1a57600154604051600160a060020a039091169082156108fc029083906000818181858888f19350505050158015613d18573d6000803e3d6000fd5b505b6000613d30826135ba888763ffffffff61258016565b600080546040805160e060020a63cc74234b028152600481018d9052905193945091928392600160a060020a039092169163cc74234b916024808301926020929190829003018186803b158015613d8657600080fd5b505afa158015613d9a573d6000803e3d6000fd5b505050506040513d6020811015613db057600080fd5b50511115613edd576000546040805160e060020a63cc74234b028152600481018c90529051613e0892600160a060020a03169163cc74234b916024808301926020929190829003018186803b15801561326657600080fd5b90506000811115613edd57600054604080517fd7b044b6000000000000000000000000000000000000000000000000000000008152600481018c90529051600160a060020a039092169163d7b044b691602480820192602092909190829003018186803b158015613e7857600080fd5b505afa158015613e8c573d6000803e3d6000fd5b505050506040513d6020811015613ea257600080fd5b5051604051600160a060020a039091169082156108fc029083906000818181858888f19350505050158015613edb573d6000803e3d6000fd5b505b6000613eef838363ffffffff61258016565b905060008111156139df576000546040805160e060020a63a47d29cb028152600481018d90529051600160a060020a039092169163a47d29cb91602480820192602092909190829003018186803b158015613f4957600080fd5b505afa158015613f5d573d6000803e3d6000fd5b505050506040513d6020811015613f7357600080fd5b5051604051600160a060020a039091169082156108fc029083906000818181858888f19350505050158015613fac573d6000803e3d6000fd5b5050505050505050505b5050565b6000611e2083836040805190810160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525060008181841161404c5760405160e560020a62461bcd02815260040180806020018281038252838181518152602001915080519060200190808383600083811015613140578181015183820152602001613128565b506000838581151561405a57fe5b049594505050505056fe63616e206f6e6c79206265207365742062792061646d696e0000000000000000a165627a7a72305820120f13757f5b94fb335dcec02f41b30a06789404d87422fb2cc33eadb2e3da91002900000000000000000000000028f2d3805652fb5d359486dffb7d08320d4032400000000000000000000000005292970db5d37ca4d269ae1c12953b266aa97381
Deployed Bytecode
0x6080604052600436106101505763ffffffff60e060020a6000350416630aab8ba581146101555780631399c04f146101915780631606c0c6146101c65780631748f818146102cc578063231c22811461039057806328025280146103c3578063331a6bf5146103fc578063393b011c1461042f5780633a4657b4146104595780633c34b9f01461049257806341da7555146104cb578063462add46146104e057806356690aaf1461051e578063569f6f921461054857806362f7a7ed1461057257806370876c981461059c57806373709417146105bf5780637e6906de146105e95780637f38902b1461062f5780638f84aa091461064457806392a3b3f91461065957806395e3b0de1461066e578063a4d256bc14610698578063a9809600146106ca578063acaac517146106f4578063f463210314610709578063f7bd4b8814610733578063f9f96b9e1461075d575b600080fd5b34801561016157600080fd5b5061017f6004803603602081101561017857600080fd5b5035610787565b60408051918252519081900360200190f35b34801561019d57600080fd5b506101c4600480360360208110156101b457600080fd5b5035600160a060020a0316610885565b005b61027c600480360360808110156101dc57600080fd5b8135916020810135916040820135919081019060808101606082013564010000000081111561020a57600080fd5b82018360208201111561021c57600080fd5b8035906020019184602083028401116401000000008311171561023e57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610972945050505050565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156102b85781810151838201526020016102a0565b505050509050019250505060405180910390f35b61027c600480360360a08110156102e257600080fd5b600160a060020a038235169160208101359160408201359160608101359181019060a08101608082013564010000000081111561031e57600080fd5b82018360208201111561033057600080fd5b8035906020019184602083028401116401000000008311171561035257600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610a5e945050505050565b34801561039c57600080fd5b506101c4600480360360408110156103b357600080fd5b508035906020013560ff16610e79565b3480156103cf57600080fd5b5061017f600480360360408110156103e657600080fd5b5080359060200135600160a060020a0316610f4f565b34801561040857600080fd5b506101c46004803603602081101561041f57600080fd5b5035600160a060020a0316611056565b34801561043b57600080fd5b506101c46004803603602081101561045257600080fd5b5035611143565b34801561046557600080fd5b5061017f6004803603604081101561047c57600080fd5b50600160a060020a038135169060200135611206565b34801561049e57600080fd5b506101c4600480360360408110156104b557600080fd5b5080359060200135600160a060020a0316611223565b3480156104d757600080fd5b5061017f611338565b3480156104ec57600080fd5b5061050a6004803603602081101561050357600080fd5b503561133e565b604080519115158252519081900360200190f35b34801561052a57600080fd5b5061017f6004803603602081101561054157600080fd5b5035611353565b34801561055457600080fd5b506101c46004803603602081101561056b57600080fd5b5035611365565b34801561057e57600080fd5b5061017f6004803603602081101561059557600080fd5b5035611443565b61027c600480360360408110156105b257600080fd5b5080359060200135611455565b3480156105cb57600080fd5b5061050a600480360360208110156105e257600080fd5b5035611563565b3480156105f557600080fd5b506106136004803603602081101561060c57600080fd5b5035611578565b60408051600160a060020a039092168252519081900360200190f35b34801561063b57600080fd5b50610613611593565b34801561065057600080fd5b506106136115a2565b34801561066557600080fd5b506106136115b1565b34801561067a57600080fd5b506101c46004803603602081101561069157600080fd5b50356115c0565b61027c600480360360608110156106ae57600080fd5b50600160a060020a0381351690602081013590604001356116ba565b3480156106d657600080fd5b5061017f600480360360208110156106ed57600080fd5b503561198e565b34801561070057600080fd5b50610613611a9d565b34801561071557600080fd5b5061017f6004803603602081101561072c57600080fd5b5035611aac565b34801561073f57600080fd5b506101c46004803603602081101561075657600080fd5b5035611b8e565b34801561076957600080fd5b5061050a6004803603602081101561078057600080fd5b5035611dae565b600a54600090600160a060020a031615156107ec576040805160e560020a62461bcd02815260206004820152601860248201527f4163746976652077686974656c697374206e6f74207365740000000000000000604482015290519081900360640190fd5b600a54604080517f0aab8ba5000000000000000000000000000000000000000000000000000000008152600481018590529051600160a060020a0390921691630aab8ba591602480820192602092909190829003018186803b15801561085157600080fd5b505afa158015610865573d6000803e3d6000fd5b505050506040513d602081101561087b57600080fd5b505190505b919050565b6000546040805160e060020a633af32abf0281523360048201529051600160a060020a0390921691633af32abf91602480820192602092909190829003018186803b1580156108d357600080fd5b505afa1580156108e7573d6000803e3d6000fd5b505050506040513d60208110156108fd57600080fd5b50511515610943576040805160e560020a62461bcd0281526020600482015260186024820152600080516020614065833981519152604482015290519081900360640190fd5b600a805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b6060846001600b546040805160e360020a63089935e5028152600481018590529051600160a060020a03909216916344c9af2891602480820192602092909190829003018186803b1580156109c657600080fd5b505afa1580156109da573d6000803e3d6000fd5b505050506040513d60208110156109f057600080fd5b505114610a47576040805160e560020a62461bcd02815260206004820152601760248201527f6e6f7420696e20726564656d7074696f6e207068617365000000000000000000604482015290519081900360640190fd5b610a543387878787610a5e565b9695505050505050565b6060846001600b546040805160e360020a63089935e5028152600481018590529051600160a060020a03909216916344c9af2891602480820192602092909190829003018186803b158015610ab257600080fd5b505afa158015610ac6573d6000803e3d6000fd5b505050506040513d6020811015610adc57600080fd5b505114610b33576040805160e560020a62461bcd02815260206004820152601760248201527f6e6f7420696e20726564656d7074696f6e207068617365000000000000000000604482015290519081900360640190fd5b600a54600160a060020a03161515610b95576040805160e560020a62461bcd02815260206004820152601860248201527f4163746976652077686974656c697374206e6f74207365740000000000000000604482015290519081900360640190fd5b600a54604080517f2802528000000000000000000000000000000000000000000000000000000000815260048101899052600160a060020a038a8116602483015291518793610c41938a93911691632802528091604480820192602092909190829003018186803b158015610c0957600080fd5b505afa158015610c1d573d6000803e3d6000fd5b505050506040513d6020811015610c3357600080fd5b50519063ffffffff611dc316565b1115610c97576040805160e560020a62461bcd02815260206004820152601b60248201527f416464726573732068617320616c726561647920636c61696d65640000000000604482015290519081900360640190fd5b6060610ca288611e27565b9050610cbf81610cb18761203d565b610cba8a61203d565b612114565b90506000816040516020018082805190602001908083835b60208310610cf65780518252601f199092019160209182019101610cd7565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052805190602001209050610d4685610d408a610787565b8361226c565b1515610d9c576040805160e560020a62461bcd02815260206004820152600d60248201527f496e76616c69642070726f6f6600000000000000000000000000000000000000604482015290519081900360640190fd5b6060610da98a8a8a612282565b600a54604080517f6bf97eb1000000000000000000000000000000000000000000000000000000008152600481018d9052600160a060020a038e81166024830152604482018d90529151939450911691636bf97eb19160648082019260009290919082900301818387803b158015610e2057600080fd5b505af1158015610e34573d6000803e3d6000fd5b5050604080518c815290517f702d5967f45f6513a38ffc42d6ba9bf230bd40e8f53b16363c7eb4fd2deb9a449350908190036020019150a19998505050505050505050565b6000546040805160e060020a633af32abf0281523360048201529051600160a060020a0390921691633af32abf91602480820192602092909190829003018186803b158015610ec757600080fd5b505afa158015610edb573d6000803e3d6000fd5b505050506040513d6020811015610ef157600080fd5b50511515610f37576040805160e560020a62461bcd0281526020600482015260186024820152600080516020614065833981519152604482015290519081900360640190fd5b60009182526007602052604090912060ff9091169055565b600a54600090600160a060020a03161515610fb4576040805160e560020a62461bcd02815260206004820152601860248201527f4163746976652077686974656c697374206e6f74207365740000000000000000604482015290519081900360640190fd5b600a54604080517f2802528000000000000000000000000000000000000000000000000000000000815260048101869052600160a060020a038581166024830152915191909216916328025280916044808301926020929190829003018186803b15801561102157600080fd5b505afa158015611035573d6000803e3d6000fd5b505050506040513d602081101561104b57600080fd5b505190505b92915050565b6000546040805160e060020a633af32abf0281523360048201529051600160a060020a0390921691633af32abf91602480820192602092909190829003018186803b1580156110a457600080fd5b505afa1580156110b8573d6000803e3d6000fd5b505050506040513d60208110156110ce57600080fd5b50511515611114576040805160e560020a62461bcd0281526020600482015260186024820152600080516020614065833981519152604482015290519081900360640190fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b6000546040805160e060020a633af32abf0281523360048201529051600160a060020a0390921691633af32abf91602480820192602092909190829003018186803b15801561119157600080fd5b505afa1580156111a5573d6000803e3d6000fd5b505050506040513d60208110156111bb57600080fd5b50511515611201576040805160e560020a62461bcd0281526020600482015260186024820152600080516020614065833981519152604482015290519081900360640190fd5b600255565b600660209081526000928352604080842090915290825290205481565b6000546040805160e060020a63a47d29cb028152600481018590529051600160a060020a039092169163a47d29cb91602480820192602092909190829003018186803b15801561127257600080fd5b505afa158015611286573d6000803e3d6000fd5b505050506040513d602081101561129c57600080fd5b5051600160a060020a031633146112fd576040805160e560020a62461bcd02815260206004820152601960248201527f63616e206f6e6c79206265207365742062792061727469737400000000000000604482015290519081900360640190fd5b600091825260046020526040909120805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03909216919091179055565b60025481565b60086020526000908152604090205460ff1681565b60096020526000908152604090205481565b6000546040805160e060020a633af32abf0281523360048201529051600160a060020a0390921691633af32abf91602480820192602092909190829003018186803b1580156113b357600080fd5b505afa1580156113c7573d6000803e3d6000fd5b505050506040513d60208110156113dd57600080fd5b50511515611423576040805160e560020a62461bcd0281526020600482015260186024820152600080516020614065833981519152604482015290519081900360640190fd5b6000908152600560205260409020805460ff19811660ff90911615179055565b60076020526000908152604090205481565b6060826001600b546040805160e360020a63089935e5028152600481018590529051600160a060020a03909216916344c9af2891602480820192602092909190829003018186803b1580156114a957600080fd5b505afa1580156114bd573d6000803e3d6000fd5b505050506040513d60208110156114d357600080fd5b50511415611550576040805160e560020a62461bcd028152602060048201526024808201527f63616e206e6f7420707572636861736520696e20726564656d7074696f6e207060448201527f6861736500000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b61155b3385856116ba565b949350505050565b60036020526000908152604090205460ff1681565b600460205260009081526040902054600160a060020a031681565b600054600160a060020a031681565b600154600160a060020a031681565b600a54600160a060020a031681565b6000546040805160e060020a63a47d29cb028152600481018490529051600160a060020a039092169163a47d29cb91602480820192602092909190829003018186803b15801561160f57600080fd5b505afa158015611623573d6000803e3d6000fd5b505050506040513d602081101561163957600080fd5b5051600160a060020a0316331461169a576040805160e560020a62461bcd02815260206004820152601960248201527f63616e206f6e6c79206265207365742062792061727469737400000000000000604482015290519081900360640190fd5b6000908152600360205260409020805460ff19811660ff90911615179055565b6060826001600b546040805160e360020a63089935e5028152600481018590529051600160a060020a03909216916344c9af2891602480820192602092909190829003018186803b15801561170e57600080fd5b505afa158015611722573d6000803e3d6000fd5b505050506040513d602081101561173857600080fd5b505114156117b5576040805160e560020a62461bcd028152602060048201526024808201527f63616e206e6f7420707572636861736520696e20726564656d7074696f6e207060448201527f6861736500000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600b54604080517f7413d37b000000000000000000000000000000000000000000000000000000008152600481018790529051600160a060020a0390921691637413d37b91602480820192602092909190829003018186803b15801561181a57600080fd5b505afa15801561182e573d6000803e3d6000fd5b505050506040513d602081101561184457600080fd5b505183111561189d576040805160e560020a62461bcd02815260206004820152601f60248201527f4d6178207075726368617365206d616e79206c696d6974207265616368656400604482015290519081900360640190fd5b600b546040805160e360020a63089935e5028152600481018790529051600092600160a060020a0316916344c9af28916024808301926020929190829003018186803b1580156118ec57600080fd5b505afa158015611900573d6000803e3d6000fd5b505050506040513d602081101561191657600080fd5b50511480156119255750600034115b1561197a576040805160e560020a62461bcd02815260206004820152601d60248201527f455448206e6f7420616363657074656420617420746869732074696d65000000604482015290519081900360640190fd5b611985858585612282565b95945050505050565b600080546040805160e060020a63498dd0c10281526004810185905290518392600160a060020a03169163498dd0c1916024808301926020929190829003018186803b1580156119dd57600080fd5b505afa1580156119f1573d6000803e3d6000fd5b505050506040513d6020811015611a0757600080fd5b5051604080517f70a082310000000000000000000000000000000000000000000000000000000081523360048201529051600160a060020a03909216916370a0823191602480820192602092909190829003018186803b158015611a6a57600080fd5b505afa158015611a7e573d6000803e3d6000fd5b505050506040513d6020811015611a9457600080fd5b50519392505050565b600b54600160a060020a031681565b600080546040805160e060020a63498dd0c10281526004810185905290518392600160a060020a03169163498dd0c1916024808301926020929190829003018186803b158015611afb57600080fd5b505afa158015611b0f573d6000803e3d6000fd5b505050506040513d6020811015611b2557600080fd5b5051604080517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523360048201523060248201529051600160a060020a039092169163dd62ed3e91604480820192602092909190829003018186803b158015611a6a57600080fd5b6000546040805160e060020a633af32abf0281523360048201529051600160a060020a0390921691633af32abf91602480820192602092909190829003018186803b158015611bdc57600080fd5b505afa158015611bf0573d6000803e3d6000fd5b505050506040513d6020811015611c0657600080fd5b50511515611c4c576040805160e560020a62461bcd0281526020600482015260186024820152600080516020614065833981519152604482015290519081900360640190fd5b60008054604080517f8c2c36220000000000000000000000000000000000000000000000000000000081526004810185905290518392600160a060020a031691638c2c36229160248083019286929190829003018186803b158015611cb057600080fd5b505afa158015611cc4573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610120811015611cee57600080fd5b8151602083015160408401516060850151608086015160a087015160c088015160e08901805197999698959794969395929491939283019291640100000000811115611d3957600080fd5b82016020810184811115611d4c57600080fd5b8151640100000000811182820187101715611d6657600080fd5b50505060008d815260096020526040902087905550949950949750505050858510159350611da992505050576000838152600860205260409020805460ff191690555b505050565b60056020526000908152604090205460ff1681565b600082820183811015611e20576040805160e560020a62461bcd02815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b604080516c01000000000000000000000000600160a060020a03841602602082015281518082036014018152602a603483018181526094909301909352606092909183916020820181803883390190505090507f3000000000000000000000000000000000000000000000000000000000000000816000815181101515611eaa57fe5b906020010190600160f860020a031916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181101515611ef257fe5b906020010190600160f860020a031916908160001a90535060005b601481101561203557600060108483815181101515611f2857fe5b90602001015160f860020a900460f860020a0260f860020a900460ff16811515611f4e57fe5b0490506000816010028584815181101515611f6557fe5b016020015160f860020a908190048102040390506000600a60ff841610611f95578260570160f860020a02611fa0565b8260300160f860020a025b90506000600a8360ff1610611fbe578260570160f860020a02611fc9565b8260300160f860020a025b9050808686600202600301815181101515611fe057fe5b906020010190600160f860020a031916908160001a90535081868660020260020181518110151561200d57fe5b906020010190600160f860020a031916908160001a9053505060019093019250611f0d915050565b509392505050565b6060811515612080575060408051808201909152600181527f30000000000000000000000000000000000000000000000000000000000000006020820152610880565b8160005b811561209857600101600a82049150612084565b6060816040519080825280601f01601f1916602001820160405280156120c5576020820181803883390190505b5090505b841561155b5760001990910190600a850660300160f860020a0281838151811015156120f157fe5b906020010190600160f860020a031916908160001a905350600a850494506120c9565b60608383836040516020018084805190602001908083835b6020831061214b5780518252601f19909201916020918201910161212c565b51815160209384036101000a60001901801990921691161790527f3a3a000000000000000000000000000000000000000000000000000000000000919093019081528551600290910192860191508083835b602083106121bc5780518252601f19909201916020918201910161219d565b51815160209384036101000a60001901801990921691161790527f3a3a000000000000000000000000000000000000000000000000000000000000919093019081528451600290910192850191508083835b6020831061222d5780518252601f19909201916020918201910161220e565b6001836020036101000a038019825116818451168082178552505050505050905001935050505060405160208183030381529060405290509392505050565b600082612279858461248c565b14949350505050565b606080826040519080825280602002602001820160405280156122af578160200160208202803883390190505b50905060003481101561241057600080546040805160e260020a633dc303c1028152600481018990529051600160a060020a039092169163f70c0f0491602480820192602092909190829003018186803b15801561230c57600080fd5b505afa158015612320573d6000803e3d6000fd5b505050506040513d602081101561233657600080fd5b5051905061234a818663ffffffff6124e416565b3410156123a1576040805160e560020a62461bcd02815260206004820152601c60248201527f6e6f7420656e6f7567682066756e6473207472616e7366657272656400000000604482015290519081900360640190fd5b60006123c36123b6838863ffffffff6124e416565b349063ffffffff61258016565b905060019250600081111561240d576040518890600160a060020a0382169083156108fc029084906000818181858888f1935050505015801561240a573d6000803e3d6000fd5b50505b50505b60005b84811015612481576124268787846125c2565b838281518110151561243457fe5b90602001906020020181815250507fe2aeb2ae0272c38a449d3cebb58f6894790a45bfb16f73a8e1761acb1e312053866040518082815260200191505060405180910390a1600101612413565b509095945050505050565b600081815b845181101561203557600085828151811015156124aa57fe5b6020908102909101015190508083116124ce576124c783826130da565b92506124db565b6124d881846130da565b92505b50600101612491565b60008215156124f557506000611050565b82820282848281151561250457fe5b0414611e20576040805160e560020a62461bcd02815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60448201527f7700000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6000611e2083836040805190810160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506130e9565b60008281526008602052604081205460ff161561264f576040805160e560020a62461bcd02815260206004820152602560248201527f4d6178696d756d206e756d626572206f6620696e766f636174696f6e7320726560448201527f6163686564000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b604080517f4554480000000000000000000000000000000000000000000000000000000000602080830191909152825180830360030181526023830180855281519190920120600080547f20927ec9000000000000000000000000000000000000000000000000000000009093526027840188905293519093600160a060020a03909216926320927ec9926047808301939192829003018186803b1580156126f657600080fd5b505afa15801561270a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052602081101561273357600080fd5b81019080805164010000000081111561274b57600080fd5b8201602081018481111561275e57600080fd5b815164010000000081118282018710171561277857600080fd5b50509291905050506040516020018082805190602001908083835b602083106127b25780518252601f199092019160209182019101612793565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120141515612c5c573415612870576040805160e560020a62461bcd02815260206004820152603f60248201527f746869732070726f6a6563742061636365707473206120646966666572656e7460448201527f2063757272656e637920616e642063616e6e6f74206163636570742045544800606482015290519081900360840190fd5b6000546040805160e260020a633dc303c1028152600481018690529051600160a060020a039092169163f70c0f0491602480820192602092909190829003018186803b1580156128bf57600080fd5b505afa1580156128d3573d6000803e3d6000fd5b505050506040513d60208110156128e957600080fd5b50516000546040805160e060020a63498dd0c1028152600481018790529051600160a060020a039092169163498dd0c191602480820192602092909190829003018186803b15801561293a57600080fd5b505afa15801561294e573d6000803e3d6000fd5b505050506040513d602081101561296457600080fd5b5051604080517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523360048201523060248201529051600160a060020a039092169163dd62ed3e91604480820192602092909190829003018186803b1580156129cd57600080fd5b505afa1580156129e1573d6000803e3d6000fd5b505050506040513d60208110156129f757600080fd5b50511015612a75576040805160e560020a62461bcd02815260206004820152602260248201527f496e73756666696369656e742046756e647320417070726f76656420666f722060448201527f5458000000000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b6000546040805160e260020a633dc303c1028152600481018690529051600160a060020a039092169163f70c0f0491602480820192602092909190829003018186803b158015612ac457600080fd5b505afa158015612ad8573d6000803e3d6000fd5b505050506040513d6020811015612aee57600080fd5b50516000546040805160e060020a63498dd0c1028152600481018790529051600160a060020a039092169163498dd0c191602480820192602092909190829003018186803b158015612b3f57600080fd5b505afa158015612b53573d6000803e3d6000fd5b505050506040513d6020811015612b6957600080fd5b5051604080517f70a082310000000000000000000000000000000000000000000000000000000081523360048201529051600160a060020a03909216916370a0823191602480820192602092909190829003018186803b158015612bcc57600080fd5b505afa158015612be0573d6000803e3d6000fd5b505050506040513d6020811015612bf657600080fd5b50511015612c4e576040805160e560020a62461bcd02815260206004820152601560248201527f496e73756666696369656e742062616c616e63652e0000000000000000000000604482015290519081900360640190fd5b612c5783613183565b612d38565b6000546040805160e260020a633dc303c1028152600481018690529051600160a060020a039092169163f70c0f0491602480820192602092909190829003018186803b158015612cab57600080fd5b505afa158015612cbf573d6000803e3d6000fd5b505050506040513d6020811015612cd557600080fd5b5051341015612d2e576040805160e560020a62461bcd02815260206004820181905260248201527f4d7573742073656e64206d696e696d756d2076616c756520746f206d696e7421604482015290519081900360640190fd5b612d3883836139ec565b60008381526005602052604090205460ff1615612da657333214612da6576040805160e560020a62461bcd02815260206004820152601060248201527f4e6f20436f6e7472616374204275797300000000000000000000000000000000604482015290519081900360640190fd5b6000838152600760205260408120541115612e5857600083815260076020908152604080832054338452600683528184208785529092529091205410612e36576040805160e560020a62461bcd02815260206004820152601560248201527f52656163686564206d696e74696e67206c696d69740000000000000000000000604482015290519081900360640190fd5b3360009081526006602090815260408083208684529091529020805460010190555b60008054604080517f0d4d1513000000000000000000000000000000000000000000000000000000008152600160a060020a0388811660048301526024820188905233604483015291519190921691630d4d151391606480830192602092919082900301818787803b158015612ecd57600080fd5b505af1158015612ee1573d6000803e3d6000fd5b505050506040513d6020811015612ef757600080fd5b505160008581526009602052604090205490915060001901620f424082061415612f35576000848152600860205260409020805460ff191660011790555b60008481526003602052604090205460ff161561155b576000848152600460208181526040928390205483517f17999ff40000000000000000000000000000000000000000000000000000000081529351600160a060020a03909116936317999ff493818101939291829003018186803b158015612fb257600080fd5b505afa158015612fc6573d6000803e3d6000fd5b505050506040513d6020811015612fdc57600080fd5b50511515613034576040805160e560020a62461bcd02815260206004820152601460248201527f626f6e7573206d75737420626520616374697665000000000000000000000000604482015290519081900360640190fd5b60008481526004602081815260408084205481517ff473237d00000000000000000000000000000000000000000000000000000000815233948101949094529051600160a060020a039091169363f473237d936024808201949392918390030190829087803b1580156130a657600080fd5b505af11580156130ba573d6000803e3d6000fd5b505050506040513d60208110156130d057600080fd5b5050949350505050565b60009182526020526040902090565b6000818484111561317b5760405160e560020a62461bcd0281526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613140578181015183820152602001613128565b50505050905090810190601f16801561316d5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600080546040805160e260020a633dc303c1028152600481018590529051600160a060020a039092169163f70c0f0491602480820192602092909190829003018186803b1580156131d357600080fd5b505afa1580156131e7573d6000803e3d6000fd5b505050506040513d60208110156131fd57600080fd5b505160008054604080517f2e9eb74f000000000000000000000000000000000000000000000000000000008152905193945091926132af92600160a060020a0390921691632e9eb74f916004808301926020929190829003018186803b15801561326657600080fd5b505afa15801561327a573d6000803e3d6000fd5b505050506040513d602081101561329057600080fd5b50516132a384606463ffffffff613fba16565b9063ffffffff6124e416565b9050600081111561344c576000546040805160e060020a63498dd0c1028152600481018690529051600160a060020a039092169163498dd0c191602480820192602092909190829003018186803b15801561330957600080fd5b505afa15801561331d573d6000803e3d6000fd5b505050506040513d602081101561333357600080fd5b5051600054604080517fcfbf4d970000000000000000000000000000000000000000000000000000000081529051600160a060020a03938416936323b872dd93339391169163cfbf4d9791600480820192602092909190829003018186803b15801561339e57600080fd5b505afa1580156133b2573d6000803e3d6000fd5b505050506040513d60208110156133c857600080fd5b50516040805160e060020a63ffffffff8616028152600160a060020a039384166004820152929091166024830152604482018590525160648083019260209291908290030181600087803b15801561341f57600080fd5b505af1158015613433573d6000803e3d6000fd5b505050506040513d602081101561344957600080fd5b50505b600061345e838363ffffffff61258016565b9050600061347c6002546132a3606485613fba90919063ffffffff16565b905060008111156135a4576000546040805160e060020a63498dd0c1028152600481018890529051600160a060020a039092169163498dd0c191602480820192602092909190829003018186803b1580156134d657600080fd5b505afa1580156134ea573d6000803e3d6000fd5b505050506040513d602081101561350057600080fd5b5051600154604080517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152600160a060020a03928316602482015260448101859052905191909216916323b872dd9160648083019260209291908290030181600087803b15801561357757600080fd5b505af115801561358b573d6000803e3d6000fd5b505050506040513d60208110156135a157600080fd5b50505b60006135c6826135ba878763ffffffff61258016565b9063ffffffff61258016565b600080546040805160e060020a63cc74234b028152600481018b9052905193945091928392600160a060020a039092169163cc74234b916024808301926020929190829003018186803b15801561361c57600080fd5b505afa158015613630573d6000803e3d6000fd5b505050506040513d602081101561364657600080fd5b50511115613842576000546040805160e060020a63cc74234b028152600481018a9052905161369e92600160a060020a03169163cc74234b916024808301926020929190829003018186803b15801561326657600080fd5b90506000811115613842576000546040805160e060020a63498dd0c1028152600481018a90529051600160a060020a039092169163498dd0c191602480820192602092909190829003018186803b1580156136f857600080fd5b505afa15801561370c573d6000803e3d6000fd5b505050506040513d602081101561372257600080fd5b5051600054604080517fd7b044b6000000000000000000000000000000000000000000000000000000008152600481018b90529051600160a060020a03938416936323b872dd93339391169163d7b044b691602480820192602092909190829003018186803b15801561379457600080fd5b505afa1580156137a8573d6000803e3d6000fd5b505050506040513d60208110156137be57600080fd5b50516040805160e060020a63ffffffff8616028152600160a060020a039384166004820152929091166024830152604482018590525160648083019260209291908290030181600087803b15801561381557600080fd5b505af1158015613829573d6000803e3d6000fd5b505050506040513d602081101561383f57600080fd5b50505b6000613854838363ffffffff61258016565b905060008111156139e2576000546040805160e060020a63498dd0c1028152600481018b90529051600160a060020a039092169163498dd0c191602480820192602092909190829003018186803b1580156138ae57600080fd5b505afa1580156138c2573d6000803e3d6000fd5b505050506040513d60208110156138d857600080fd5b50516000546040805160e060020a63a47d29cb028152600481018c90529051600160a060020a03938416936323b872dd93339391169163a47d29cb91602480820192602092909190829003018186803b15801561393457600080fd5b505afa158015613948573d6000803e3d6000fd5b505050506040513d602081101561395e57600080fd5b50516040805160e060020a63ffffffff8616028152600160a060020a039384166004820152929091166024830152604482018590525160648083019260209291908290030181600087803b1580156139b557600080fd5b505af11580156139c9573d6000803e3d6000fd5b505050506040513d60208110156139df57600080fd5b50505b5050505050505050565b6000341115613fb657600080546040805160e260020a633dc303c1028152600481018690529051600160a060020a039092169163f70c0f0491602480820192602092909190829003018186803b158015613a4557600080fd5b505afa158015613a59573d6000803e3d6000fd5b505050506040513d6020811015613a6f57600080fd5b5051600080546040805160e260020a633dc303c10281526004810188905290519394509192613b0292600160a060020a039092169163f70c0f04916024808301926020929190829003018186803b158015613ac957600080fd5b505afa158015613add573d6000803e3d6000fd5b505050506040513d6020811015613af357600080fd5b5051349063ffffffff61258016565b905082158015613b125750600081115b15613b4657604051339082156108fc029083906000818181858888f19350505050158015613b44573d6000803e3d6000fd5b505b60008054604080517f2e9eb74f0000000000000000000000000000000000000000000000000000000081529051613be392600160a060020a031691632e9eb74f916004808301926020929190829003018186803b158015613ba657600080fd5b505afa158015613bba573d6000803e3d6000fd5b505050506040513d6020811015613bd057600080fd5b50516132a385606463ffffffff613fba16565b90506000811115613ca3576000809054906101000a9004600160a060020a0316600160a060020a031663cfbf4d976040518163ffffffff1660e060020a02815260040160206040518083038186803b158015613c3e57600080fd5b505afa158015613c52573d6000803e3d6000fd5b505050506040513d6020811015613c6857600080fd5b5051604051600160a060020a039091169082156108fc029083906000818181858888f19350505050158015613ca1573d6000803e3d6000fd5b505b6000613cb5848363ffffffff61258016565b90506000613cd36002546132a3606485613fba90919063ffffffff16565b90506000811115613d1a57600154604051600160a060020a039091169082156108fc029083906000818181858888f19350505050158015613d18573d6000803e3d6000fd5b505b6000613d30826135ba888763ffffffff61258016565b600080546040805160e060020a63cc74234b028152600481018d9052905193945091928392600160a060020a039092169163cc74234b916024808301926020929190829003018186803b158015613d8657600080fd5b505afa158015613d9a573d6000803e3d6000fd5b505050506040513d6020811015613db057600080fd5b50511115613edd576000546040805160e060020a63cc74234b028152600481018c90529051613e0892600160a060020a03169163cc74234b916024808301926020929190829003018186803b15801561326657600080fd5b90506000811115613edd57600054604080517fd7b044b6000000000000000000000000000000000000000000000000000000008152600481018c90529051600160a060020a039092169163d7b044b691602480820192602092909190829003018186803b158015613e7857600080fd5b505afa158015613e8c573d6000803e3d6000fd5b505050506040513d6020811015613ea257600080fd5b5051604051600160a060020a039091169082156108fc029083906000818181858888f19350505050158015613edb573d6000803e3d6000fd5b505b6000613eef838363ffffffff61258016565b905060008111156139df576000546040805160e060020a63a47d29cb028152600481018d90529051600160a060020a039092169163a47d29cb91602480820192602092909190829003018186803b158015613f4957600080fd5b505afa158015613f5d573d6000803e3d6000fd5b505050506040513d6020811015613f7357600080fd5b5051604051600160a060020a039091169082156108fc029083906000818181858888f19350505050158015613fac573d6000803e3d6000fd5b5050505050505050505b5050565b6000611e2083836040805190810160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525060008181841161404c5760405160e560020a62461bcd02815260040180806020018281038252838181518152602001915080519060200190808383600083811015613140578181015183820152602001613128565b506000838581151561405a57fe5b049594505050505056fe63616e206f6e6c79206265207365742062792061646d696e0000000000000000a165627a7a72305820120f13757f5b94fb335dcec02f41b30a06789404d87422fb2cc33eadb2e3da910029
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000028f2d3805652fb5d359486dffb7d08320d4032400000000000000000000000005292970db5d37ca4d269ae1c12953b266aa97381
-----Decoded View---------------
Arg [0] : _genArtCore (address): 0x28f2D3805652FB5d359486dFfb7D08320D403240
Arg [1] : _minterStateAddress (address): 0x5292970Db5D37CA4D269AE1C12953b266aa97381
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000028f2d3805652fb5d359486dffb7d08320d403240
Arg [1] : 0000000000000000000000005292970db5d37ca4d269ae1c12953b266aa97381
Deployed Bytecode Sourcemap
1048:5825:8:-;;;;;;;;;-1:-1:-1;;;1048:5825:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2331:232;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2331:232:8;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2331:232:8;;;;;;;;;;;;;;;;;;;2855:153;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2855:153:8;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2855:153:8;-1:-1:-1;;;;;2855:153:8;;;;;3872:310;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;3872:310:8;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;3872:310:8;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;3872:310:8;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;3872:310:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;3872:310:8;;-1:-1:-1;3872:310:8;;-1:-1:-1;;;;;3872:310:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;3872:310:8;;;;;;;;;;;;;;;;;4188:1010;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;4188:1010:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;4188:1010:8;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;4188:1010:8;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;4188:1010:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;4188:1010:8;;-1:-1:-1;4188:1010:8;;-1:-1:-1;;;;;4188:1010:8;1698:215:10;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1698:215:10;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1698:215:10;;;;;;;;;;2569:280:8;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2569:280:8;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2569:280:8;;;;;;-1:-1:-1;;;;;2569:280:8;;;2442:199:10;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2442:199:10;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2442:199:10;-1:-1:-1;;;;;2442:199:10;;;2647:203;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2647:203:10;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2647:203:10;;;785:73;;8:9:-1;5:2;;;30:1;27;20:12;5:2;785:73:10;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;785:73:10;;;;;;;;;3385:344;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3385:344:10;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3385:344:10;;;;;;-1:-1:-1;;;;;3385:344:10;;;563:30;;8:9:-1;5:2;;;30:1;27;20:12;5:2;563:30:10;;;;921:56;;8:9:-1;5:2;;;30:1;27;20:12;5:2;921:56:10;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;921:56:10;;;;;;;;;;;;;;;;;;;;;983;;8:9:-1;5:2;;;30:1;27;20:12;5:2;983:56:10;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;983:56:10;;;2856:235;;8:9:-1;5:2;;;30:1;27;20:12;5:2;2856:235:10;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2856:235:10;;;864:51;;8:9:-1;5:2;;;30:1;27;20:12;5:2;864:51:10;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;864:51:10;;;3014:240:8;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3014:240:8;;;;;;;;600:48:10;;8:9:-1;5:2;;;30:1;27;20:12;5:2;600:48:10;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;600:48:10;;;654:66;;8:9:-1;5:2;;;30:1;27;20:12;5:2;654:66:10;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;654:66:10;;;;;;;-1:-1:-1;;;;;654:66:10;;;;;;;;;;;;;;426:42;;8:9:-1;5:2;;;30:1;27;20:12;5:2;426:42:10;;;;522:35;;8:9:-1;5:2;;;30:1;27;20:12;5:2;522:35:10;;;;1368:60:8;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1368:60:8;;;;3097:282:10;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3097:282:10;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3097:282:10;;;3260:606:8;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;3260:606:8;;;;;;;;;;;;;;1171:246:10;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1171:246:10;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1171:246:10;;;1434:53:8;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1434:53:8;;;;1423:269:10;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1423:269:10;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1423:269:10;;;1919:517;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1919:517:10;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1919:517:10;;;726:53;;8:9:-1;5:2;;;30:1;27;20:12;5:2;726:53:10;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;726:53:10;;;2331:232:8;2440:15;;2394:18;;-1:-1:-1;;;;;2440:15:8;2432:38;;2424:75;;;;;-1:-1:-1;;;;;2424:75:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;2516:15;;:40;;;;;;;;;;;;;;-1:-1:-1;;;;;2516:15:8;;;;:29;;:40;;;;;;;;;;;;;;;:15;:40;;;5:2:-1;;;;30:1;27;20:12;5:2;2516:40:8;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2516:40:8;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2516:40:8;;-1:-1:-1;2331:232:8;;;;:::o;2855:153::-;1539:18;;:44;;;-1:-1:-1;;;;;1539:44:8;;1572:10;1539:44;;;;;;-1:-1:-1;;;;;1539:18:8;;;;:32;;:44;;;;;;;;;;;;;;;:18;:44;;;5:2:-1;;;;30:1;27;20:12;5:2;1539:44:8;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1539:44:8;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1539:44:8;1531:81;;;;;;;-1:-1:-1;;;;;1531:81:8;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1531:81:8;;;;;;;;;;;;;;;2935:15;:66;;-1:-1:-1;;2935:66:8;-1:-1:-1;;;;;2935:66:8;;;;;;;;;;2855:153::o;3872:310::-;4066:26;4046:9;2004:20;1960:11;;:31;;;-1:-1:-1;;;;;1960:31:8;;;;;;;;;;-1:-1:-1;;;;;1960:11:8;;;;:20;;:31;;;;;;;;;;;;;;;:11;:31;;;5:2:-1;;;;30:1;27;20:12;5:2;1960:31:8;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1960:31:8;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1960:31:8;1952:73;1931:143;;;;;-1:-1:-1;;;;;1931:143:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;4111:64;4120:10;4132:9;4143:8;4153:14;4169:5;4111:8;:64::i;:::-;4104:71;3872:310;-1:-1:-1;;;;;;3872:310:8:o;4188:1010::-;4404:26;4384:9;2004:20;1960:11;;:31;;;-1:-1:-1;;;;;1960:31:8;;;;;;;;;;-1:-1:-1;;;;;1960:11:8;;;;:20;;:31;;;;;;;;;;;;;;;:11;:31;;;5:2:-1;;;;30:1;27;20:12;5:2;1960:31:8;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1960:31:8;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1960:31:8;1952:73;1931:143;;;;;-1:-1:-1;;;;;1931:143:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;4458:15;;-1:-1:-1;;;;;4458:15:8;4450:38;;4442:75;;;;;-1:-1:-1;;;;;4442:75:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;4548:15;;:45;;;;;;;;;;;;-1:-1:-1;;;;;4548:45:8;;;;;;;;;4611:14;;4548:59;;4598:8;;4548:15;;;:30;;:45;;;;;;;;;;;;;;;:15;:45;;;5:2:-1;;;;30:1;27;20:12;5:2;4548:45:8;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;4548:45:8;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;4548:45:8;;:59;:49;:59;:::i;:::-;:77;;4527:151;;;;;-1:-1:-1;;;;;4527:151:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;4689:17;4709:20;4726:2;4709:16;:20::i;:::-;4689:40;;4745:82;4760:3;4765:32;4782:14;4765:16;:32::i;:::-;4799:27;4816:9;4799:16;:27::i;:::-;4745:14;:82::i;:::-;4739:88;;4838:12;4880:3;4863:21;;;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;4863:21:8;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;4863:21:8;;;4853:32;;;;;;4838:47;;4903:57;4922:5;4929:24;4943:9;4929:13;:24::i;:::-;4955:4;4903:18;:57::i;:::-;4895:83;;;;;;;-1:-1:-1;;;;;4895:83:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;4989:30;5022:40;5038:2;5042:9;5053:8;5022:15;:40::i;:::-;5073:15;;:55;;;;;;;;;;;;-1:-1:-1;;;;;5073:55:8;;;;;;;;;;;;;;;4989:73;;-1:-1:-1;5073:15:8;;;:30;;:55;;;;;:15;;:55;;;;;;;;:15;;:55;;;5:2:-1;;;;30:1;27;20:12;5:2;5073:55:8;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;5144:17:8;;;;;;;;;;-1:-1:-1;5144:17:8;;;;;;;-1:-1:-1;5144:17:8;5178:13;4188:1010;-1:-1:-1;;;;;;;;;4188:1010:8:o;1698:215:10:-;1786:18;;:44;;;-1:-1:-1;;;;;1786:44:10;;1819:10;1786:44;;;;;;-1:-1:-1;;;;;1786:18:10;;;;:32;;:44;;;;;;;;;;;;;;;:18;:44;;;5:2:-1;;;;30:1;27;20:12;5:2;1786:44:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1786:44:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1786:44:10;1778:81;;;;;;;-1:-1:-1;;;;;1778:81:10;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1778:81:10;;;;;;;;;;;;;;;1869:28;;;;:16;:28;;;;;;:37;;;;;;1698:215::o;2569:280:8:-;2719:15;;2673:14;;-1:-1:-1;;;;;2719:15:8;2711:38;;2703:75;;;;;-1:-1:-1;;;;;2703:75:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;2795:15;;:47;;;;;;;;;;;;-1:-1:-1;;;;;2795:47:8;;;;;;;;;:15;;;;;:30;;:47;;;;;;;;;;;;;;:15;:47;;;5:2:-1;;;;30:1;27;20:12;5:2;2795:47:8;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2795:47:8;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2795:47:8;;-1:-1:-1;2569:280:8;;;;;:::o;2442:199:10:-;2523:18;;:44;;;-1:-1:-1;;;;;2523:44:10;;2556:10;2523:44;;;;;;-1:-1:-1;;;;;2523:18:10;;;;:32;;:44;;;;;;;;;;;;;;;:18;:44;;;5:2:-1;;;;30:1;27;20:12;5:2;2523:44:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2523:44:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2523:44:10;2515:81;;;;;;;-1:-1:-1;;;;;2515:81:10;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2515:81:10;;;;;;;;;;;;;;;2606:12;:28;;-1:-1:-1;;2606:28:10;-1:-1:-1;;;;;2606:28:10;;;;;;;;;;2442:199::o;2647:203::-;2726:18;;:44;;;-1:-1:-1;;;;;2726:44:10;;2759:10;2726:44;;;;;;-1:-1:-1;;;;;2726:18:10;;;;:32;;:44;;;;;;;;;;;;;;;:18;:44;;;5:2:-1;;;;30:1;27;20:12;5:2;2726:44:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2726:44:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2726:44:10;2718:81;;;;;;;-1:-1:-1;;;;;2718:81:10;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2718:81:10;;;;;;;;;;;;;;;2809:15;:34;2647:203::o;785:73::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;3385:344::-;3539:18;;:55;;;-1:-1:-1;;;;;3539:55:10;;;;;;;;;;-1:-1:-1;;;;;3539:18:10;;;;:43;;:55;;;;;;;;;;;;;;;:18;:55;;;5:2:-1;;;;30:1;27;20:12;5:2;3539:55:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3539:55:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3539:55:10;-1:-1:-1;;;;;3525:69:10;:10;:69;3504:141;;;;;-1:-1:-1;;;;;3504:141:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;3655:43;;;;:31;:43;;;;;;:67;;-1:-1:-1;;3655:67:10;-1:-1:-1;;;;;3655:67:10;;;;;;;;;3385:344::o;563:30::-;;;;:::o;921:56::-;;;;;;;;;;;;;;;:::o;983:::-;;;;;;;;;;;;;:::o;2856:235::-;2931:18;;:44;;;-1:-1:-1;;;;;2931:44:10;;2964:10;2931:44;;;;;;-1:-1:-1;;;;;2931:18:10;;;;:32;;:44;;;;;;;;;;;;;;;:18;:44;;;5:2:-1;;;;30:1;27;20:12;5:2;2931:44:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2931:44:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2931:44:10;2923:81;;;;;;;-1:-1:-1;;;;;2923:81:10;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;2923:81:10;;;;;;;;;;;;;;;3051:33;;;;:21;:33;;;;;;;-1:-1:-1;;3014:70:10;;3051:33;;;;3050:34;3014:70;;;2856:235::o;864:51::-;;;;;;;;;;;;;:::o;3014:240:8:-;3155:26;3127:9;1766:20;1722:11;;:31;;;-1:-1:-1;;;;;1722:31:8;;;;;;;;;;-1:-1:-1;;;;;1722:11:8;;;;:20;;:31;;;;;;;;;;;;;;;:11;:31;;;5:2:-1;;;;30:1;27;20:12;5:2;1722:31:8;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1722:31:8;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1722:31:8;1714:73;;1693:156;;;;;-1:-1:-1;;;;;1693:156:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3204:43;3215:10;3227:9;3238:8;3204:10;:43::i;:::-;3197:50;3014:240;-1:-1:-1;;;;3014:240:8:o;600:48:10:-;;;;;;;;;;;;;;;:::o;654:66::-;;;;;;;;;;;;-1:-1:-1;;;;;654:66:10;;:::o;426:42::-;;;-1:-1:-1;;;;;426:42:10;;:::o;522:35::-;;;-1:-1:-1;;;;;522:35:10;;:::o;1368:60:8:-;;;-1:-1:-1;;;;;1368:60:8;;:::o;3097:282:10:-;3196:18;;:55;;;-1:-1:-1;;;;;3196:55:10;;;;;;;;;;-1:-1:-1;;;;;3196:18:10;;;;:43;;:55;;;;;;;;;;;;;;;:18;:55;;;5:2:-1;;;;30:1;27;20:12;5:2;3196:55:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3196:55:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3196:55:10;-1:-1:-1;;;;;3182:69:10;:10;:69;3161:141;;;;;-1:-1:-1;;;;;3161:141:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;3344:28;;;;:16;:28;;;;;;;-1:-1:-1;;3312:60:10;;3344:28;;;;3343:29;3312:60;;;3097:282::o;3260:606:8:-;3413:26;3393:9;1766:20;1722:11;;:31;;;-1:-1:-1;;;;;1722:31:8;;;;;;;;;;-1:-1:-1;;;;;1722:11:8;;;;:20;;:31;;;;;;;;;;;;;;;:11;:31;;;5:2:-1;;;;30:1;27;20:12;5:2;1722:31:8;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1722:31:8;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1722:31:8;1714:73;;1693:156;;;;;-1:-1:-1;;;;;1693:156:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3484:11;;:43;;;;;;;;;;;;;;-1:-1:-1;;;;;3484:11:8;;;;:32;;:43;;;;;;;;;;;;;;;:11;:43;;;5:2:-1;;;;30:1;27;20:12;5:2;3484:43:8;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3484:43:8;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3484:43:8;3472:55;;;3451:133;;;;;-1:-1:-1;;;;;3451:133:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;3619:11;;:31;;;-1:-1:-1;;;;;3619:31:8;;;;;;;;;;3663:27;;-1:-1:-1;;;;;3619:11:8;;:20;;:31;;;;;;;;;;;;;;:11;:31;;;5:2:-1;;;;30:1;27;20:12;5:2;3619:31:8;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3619:31:8;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3619:31:8;3611:80;:109;;;;;3719:1;3707:9;:13;3611:109;3594:209;;;3745:47;;;-1:-1:-1;;;;;3745:47:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;3819:40;3835:2;3839:9;3850:8;3819:15;:40::i;:::-;3812:47;3260:606;-1:-1:-1;;;;;3260:606:8:o;1171:246:10:-;1250:7;1293:18;;:57;;;-1:-1:-1;;;;;1293:57:10;;;;;;;;;;1250:7;;-1:-1:-1;;;;;1293:18:10;;:45;;:57;;;;;;;;;;;;;;:18;:57;;;5:2:-1;;;;30:1;27;20:12;5:2;1293:57:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1293:57:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1293:57:10;1287:99;;;;;;1375:10;1287:99;;;;;;-1:-1:-1;;;;;1287:87:10;;;;;;:99;;;;;1293:57;;1287:99;;;;;;;;:87;:99;;;5:2:-1;;;;30:1;27;20:12;5:2;1287:99:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1287:99:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1287:99:10;;1171:246;-1:-1:-1;;;1171:246:10:o;1434:53:8:-;;;-1:-1:-1;;;;;1434:53:8;;:::o;1423:269:10:-;1506:7;1551:18;;:57;;;-1:-1:-1;;;;;1551:57:10;;;;;;;;;;1506:7;;-1:-1:-1;;;;;1551:18:10;;:45;;:57;;;;;;;;;;;;;;:18;:57;;;5:2:-1;;;;30:1;27;20:12;5:2;1551:57:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1551:57:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1551:57:10;1545:114;;;;;;1633:10;1545:114;;;;1653:4;1545:114;;;;;;-1:-1:-1;;;;;1545:87:10;;;;;;:114;;;;;1551:57;;1545:114;;;;;;;;:87;:114;;;5:2:-1;;;;30:1;27;20:12;1919:517:10;1998:18;;:44;;;-1:-1:-1;;;;;1998:44:10;;2031:10;1998:44;;;;;;-1:-1:-1;;;;;1998:18:10;;;;:32;;:44;;;;;;;;;;;;;;;:18;:44;;;5:2:-1;;;;30:1;27;20:12;5:2;1998:44:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1998:44:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;1998:44:10;1990:81;;;;;;;-1:-1:-1;;;;;1990:81:10;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;1990:81:10;;;;;;;;;;;;;;;2081:22;2188:18;;:69;;;;;;;;;;;;;;2081:22;;-1:-1:-1;;;;;2188:18:10;;:35;;:69;;;;;2081:22;;2188:69;;;;;;;:18;:69;;;5:2:-1;;;;30:1;27;20:12;5:2;2188:69:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;2188:69:10;;;;;;39:16:-1;36:1;17:17;2:54;101:4;2188:69:10;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:3;5:12;;2:2;;;30:1;27;20:12;2:2;2188:69:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19:11:-1;11:20;;8:2;;;44:1;41;34:12;8:2;62:21;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;213:10;;261:11;244:29;;285:43;;;282:58;-1:-1;233:115;230:2;;;361:1;358;351:12;230:2;-1:-1;;;2267:33:10;;;;:21;2188:69;2267:33;2188:69;2267:33;;:50;;;-1:-1:-1;2142:115:10;;-1:-1:-1;2142:115:10;;-1:-1:-1;;;;2331:28:10;;;2327:103;;-1:-1:-1;2327:103:10;;-1:-1:-1;;;2327:103:10;2414:5;2375:36;;;:24;:36;;;;;:44;;-1:-1:-1;;2375:44:10;;;2327:103;1919:517;;;:::o;726:53::-;;;;;;;;;;;;;;;:::o;932:176:19:-;990:7;1021:5;;;1044:6;;;;1036:46;;;;;-1:-1:-1;;;;;1036:46:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;1100:1;932:176;-1:-1:-1;;;932:176:19:o;5422:1449:8:-;5691:22;;;;-1:-1:-1;;;;;5691:22:8;;;;;;;;;26:21:-1;;;5691:22:8;22:32:-1;6:49;;5802:2:8;5691:22;;;5792:13;;;;;;;;;;5484;;5691:22;;5484:13;;5792;;;21:6:-1;;104:10;5792:13:8;87:34:-1;135:17;;-1:-1;5792:13:8;5765:40;;5858:20;:11;5870:1;5858:14;;;;;;;;;;;;;;:20;-1:-1:-1;;;;;5858:20:8;;;;;;;;;5888;:11;5900:1;5888:14;;;;;;;;;;;;;;:20;-1:-1:-1;;;;;5888:20:8;;;;;;;;-1:-1:-1;6117:9:8;6112:668;6136:2;6132:1;:6;6112:668;;;6204:15;6247:2;6228:12;6241:1;6228:15;;;;;;;;;;;;;;;-1:-1:-1;;;6228:15:8;;-1:-1:-1;;;6228:15:8;-1:-1:-1;;;6222:22:8;;:27;;;;;;;;;;6204:45;;6263:16;6312:9;6307:2;:14;6288:12;6301:1;6288:15;;;;;;;;;;;;;;-1:-1:-1;;;6288:15:8;;;;;;6282:22;:39;;-1:-1:-1;6384:15:8;6414:2;6402:14;;;;:64;;6451:9;6463:2;6451:14;-1:-1:-1;;;6444:22:8;6402:64;;;6426:9;6438:2;6426:14;-1:-1:-1;;;6419:22:8;6402:64;6384:82;;6480:16;6512:2;6499:10;:15;;;:67;;6550:10;6563:2;6550:15;-1:-1:-1;;;6543:23:8;6499:67;;;6524:10;6537:2;6524:15;-1:-1:-1;;;6517:23:8;6499:67;6480:86;;6663:9;6638:11;6654:1;6650;:5;6658:1;6650:9;6638:22;;;;;;;;;;;;;;:34;-1:-1:-1;;;;;6638:34:8;;;;;;;;;6711:8;6686:11;6702:1;6698;:5;6706:1;6698:9;6686:22;;;;;;;;;;;;;;:33;-1:-1:-1;;;;;6686:33:8;;;;;;;;-1:-1:-1;;6140:3:8;;;;;-1:-1:-1;6112:668:8;;-1:-1:-1;;6112:668:8;;-1:-1:-1;6852:11:8;5422:1449;-1:-1:-1;;;5422:1449:8:o;250:703:20:-;306:13;523:10;;519:51;;;-1:-1:-1;549:10:20;;;;;;;;;;;;;;;;;;;519:51;594:5;579:12;633:75;640:9;;633:75;;665:8;;695:2;687:10;;;;633:75;;;717:19;749:6;739:17;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;739:17:20;87:34:-1;135:17;;-1:-1;739:17:20;;717:39;;766:150;773:10;;766:150;;-1:-1:-1;;799:11:20;;;;875:2;867:5;:10;854:2;:24;-1:-1:-1;;;841:39:20;824:6;831;824:14;;;;;;;;;;;;;;:56;-1:-1:-1;;;;;824:56:20;;;;;;;;-1:-1:-1;903:2:20;894:11;;;;766:150;;5204:212:8;5332:13;5388:1;5397;5406;5371:37;;;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;5371:37:8;;;;;;;;;;;;;;;;;;-1:-1:-1;5371:37:8;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;365:33;;5371:37:8;;;;;;;;;;;;;;;;;;-1:-1:-1;5371:37:8;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;5371:37:8;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;5371:37:8;;;5357:52;;5204:212;;;;;:::o;1154:184:17:-;1275:4;1327;1298:25;1311:5;1318:4;1298:12;:25::i;:::-;:33;;1154:184;-1:-1:-1;;;;1154:184:17:o;400:1126:9:-;520:26;558:25;600:6;586:21;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;586:21:9;-1:-1:-1;558:49:9;-1:-1:-1;617:21:9;761:9;:13;-1:-1:-1;757:570:9;;;790:26;819:18;;:89;;;-1:-1:-1;;;;;819:89:9;;;;;;;;;;-1:-1:-1;;;;;819:18:9;;;;:48;;:89;;;;;;;;;;;;;;;:18;:89;;;5:2:-1;;;;30:1;27;20:12;5:2;819:89:9;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;819:89:9;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;819:89:9;;-1:-1:-1;943:30:9;819:89;966:6;943:30;:22;:30;:::i;:::-;930:9;:43;;922:84;;;;;-1:-1:-1;;;;;922:84:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;1020:14;1037:45;1051:30;:18;1074:6;1051:30;:22;:30;:::i;:::-;1037:9;;:45;:13;:45;:::i;:::-;1020:62;;1115:4;1096:23;;1147:1;1138:6;:10;1134:183;;;1282:20;;1260:2;;-1:-1:-1;;;;;1282:12:9;;;:20;;;;;1295:6;;1222:19;1282:20;1222:19;1282:20;1295:6;1282:12;:20;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;1282:20:9;1134:183;;757:570;;;1342:9;1337:157;1361:6;1357:1;:10;1337:157;;;1402:43;1413:2;1417:9;1428:16;1402:10;:43::i;:::-;1388:8;1397:1;1388:11;;;;;;;;;;;;;;;;;:57;;;;;1464:19;1473:9;1464:19;;;;;;;;;;;;;;;;;;1369:3;;1337:157;;;-1:-1:-1;1511:8:9;;400:1126;-1:-1:-1;;;;;400:1126:9:o;1689:662:17:-;1772:7;1814:4;1772:7;1828:488;1852:5;:12;1848:1;:16;1828:488;;;1885:20;1908:5;1914:1;1908:8;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1934:28:17;;;1930:376;;2075:42;2090:12;2104;2075:14;:42::i;:::-;2060:57;;1930:376;;;2249:42;2264:12;2278;2249:14;:42::i;:::-;2234:57;;1930:376;-1:-1:-1;1866:3:17;;1828:488;;2287:459:19;2345:7;2586:6;;2582:45;;;-1:-1:-1;2615:1:19;2608:8;;2582:45;2649:5;;;2653:1;2649;:5;2672;;;;;;;;:10;2664:56;;;;;-1:-1:-1;;;;;2664:56:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1372:134;1430:7;1456:43;1460:1;1463;1456:43;;;;;;;;;;;;;;;;;;:3;:43::i;3979:2851:10:-;4104:16;4141:36;;;:24;:36;;;;;;;;4140:37;4132:87;;;;;-1:-1:-1;;;;;4132:87:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4357:23;;;;;;;;;;;;;;26:21:-1;;;4357:23:10;22:32:-1;6:49;;4357:23:10;;;;;;4347:34;;;;;;;4273:18;;;:56;;;;;;;;;;;;4347:34;;-1:-1:-1;;;;;4273:18:10;;;;:44;;:56;;;;;:18;;:56;;;;;:18;:56;;;5:2:-1;;;;30:1;27;20:12;5:2;4273:56:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;4273:56:10;;;;;;39:16:-1;36:1;17:17;2:54;101:4;4273:56:10;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;4273:56:10;;;;;;19:11:-1;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;213:10;;261:11;244:29;;285:43;;;282:58;-1:-1;233:115;230:2;;;361:1;358;351:12;230:2;0:372;;4273:56:10;;;;;;4256:74;;;;;;;;;;;;;;;36:153:-1;66:2;58:11;;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;4256:74:10;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;4256:74:10;;;4246:85;;;;;;:135;;4229:1232;;;4431:9;:14;4406:136;;;;;-1:-1:-1;;;;;4406:136:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4744:18;;:60;;;-1:-1:-1;;;;;4744:60:10;;;;;;;;;;-1:-1:-1;;;;;4744:18:10;;;;:48;;:60;;;;;;;;;;;;;;;:18;:60;;;5:2:-1;;;;30:1;27;20:12;5:2;4744:60:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;4744:60:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;4744:60:10;4587:18;;:57;;;-1:-1:-1;;;;;4587:57:10;;;;;;;;;;-1:-1:-1;;;;;4587:18:10;;;;:45;;:57;;;;;4744:60;;4587:57;;;;;;;;:18;:57;;;5:2:-1;;;;30:1;27;20:12;5:2;4587:57:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;4587:57:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;4587:57:10;4581:159;;;;;;4677:10;4581:159;;;;4717:4;4581:159;;;;;;-1:-1:-1;;;;;4581:74:10;;;;;;:159;;;;;4587:57;;4581:159;;;;;;;;:74;:159;;;5:2:-1;;;;30:1;27;20:12;5:2;4581:159:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;4581:159:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;4581:159:10;:223;;4556:316;;;;;-1:-1:-1;;;;;4556:316:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5039:18;;:60;;;-1:-1:-1;;;;;5039:60:10;;;;;;;;;;-1:-1:-1;;;;;5039:18:10;;;;:48;;:60;;;;;;;;;;;;;;;:18;:60;;;5:2:-1;;;;30:1;27;20:12;5:2;5039:60:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;5039:60:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5039:60:10;4917:18;;:57;;;-1:-1:-1;;;;;4917:57:10;;;;;;;;;;-1:-1:-1;;;;;4917:18:10;;;;:45;;:57;;;;;5039:60;;4917:57;;;;;;;;:18;:57;;;5:2:-1;;;;30:1;27;20:12;5:2;4917:57:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;4917:57:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;4917:57:10;4911:124;;;;;;5007:10;4911:124;;;;;;-1:-1:-1;;;;;4911:74:10;;;;;;:124;;;;;4917:57;;4911:124;;;;;;;;:74;:124;;;5:2:-1;;;;30:1;27;20:12;5:2;4911:124:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;4911:124:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;4911:124:10;:188;;4886:268;;;;;-1:-1:-1;;;;;4886:268:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;5168:28;5185:10;5168:16;:28::i;:::-;4229:1232;;;5265:18;;:60;;;-1:-1:-1;;;;;5265:60:10;;;;;;;;;;-1:-1:-1;;;;;5265:18:10;;;;:48;;:60;;;;;;;;;;;;;;;:18;:60;;;5:2:-1;;;;30:1;27;20:12;5:2;5265:60:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;5265:60:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5265:60:10;5252:9;:73;;5227:164;;;;;-1:-1:-1;;;;;5227:164:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5405:45;5420:10;5432:17;5405:14;:45::i;:::-;5551:33;;;;:21;:33;;;;;;;;5547:91;;;5594:10;5608:9;5594:23;5586:52;;;;;-1:-1:-1;;;;;5586:52:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;5730:1;5699:28;;;:16;:28;;;;;;:32;5695:274;;;5817:28;;;;:16;:28;;;;;;;;;5791:10;5772:30;;:18;:30;;;;;:42;;;;;;;;;;:73;5747:153;;;;;-1:-1:-1;;;;;5747:153:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;5933:10;5914:30;;;;:18;:30;;;;;;;;:42;;;;;;;;:44;;;;;;5695:274;5979:15;5997:18;;:52;;;;;;-1:-1:-1;;;;;5997:52:10;;;;;;;;;;;;;6038:10;5997:52;;;;;;:18;;;;;:23;;:52;;;;;;;;;;;;;;5979:15;5997:18;:52;;;5:2:-1;;;;30:1;27;20:12;5:2;5997:52:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;5997:52:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;5997:52:10;6373:33;;;;:21;5997:52;6373:33;;;;;5997:52;;-1:-1:-1;;;6373:37:10;506:9;5997:52;6348:21;:62;6344:136;;;6426:36;;;;:24;:36;;;;;:43;;-1:-1:-1;;6426:43:10;6465:4;6426:43;;;6344:136;6494:28;;;;:16;:28;;;;;;;;6490:309;;;6577:43;;;;:31;:43;;;;;;;;;;6563:74;;;;;;;-1:-1:-1;;;;;6577:43:10;;;;6563:72;;:74;;;;6577:43;6563:74;;;;;;6577:43;6563:74;;;5:2:-1;;;;30:1;27;20:12;5:2;6563:74:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;6563:74:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;6563:74:10;6538:153;;;;;;;-1:-1:-1;;;;;6538:153:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;6719:43;;;;:31;:43;;;;;;;;;6705:83;;;;;6777:10;6705:83;;;;;;;;;-1:-1:-1;;;;;6719:43:10;;;;6705:71;;:83;;;;;6719:43;6705:83;;;;;;;;;6719:43;6705:83;;;5:2:-1;;;;30:1;27;20:12;5:2;6705:83:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;6705:83:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;6816:7:10;3979:2851;-1:-1:-1;;;;3979:2851:10:o;2357:218:17:-;2425:13;2473:15;;;2508:4;2501:15;2554:4;2538:21;;;2459:110::o;1830:217:19:-;1946:7;1981:12;1973:6;;;;1965:29;;;;-1:-1:-1;;;;;1965:29:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;1965:29:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;2016:5:19;;;1830:217::o;8776:2037:10:-;8841:26;8870:18;;:60;;;-1:-1:-1;;;;;8870:60:10;;;;;;;;;;-1:-1:-1;;;;;8870:18:10;;;;:48;;:60;;;;;;;;;;;;;;;:18;:60;;;5:2:-1;;;;30:1;27;20:12;5:2;8870:60:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;8870:60:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;8870:60:10;8940:28;9016:18;;:45;;;;;;;;8870:60;;-1:-1:-1;8940:28:10;;8971:100;;-1:-1:-1;;;;;9016:18:10;;;;:43;;:45;;;;;8870:60;;9016:45;;;;;;;:18;:45;;;5:2:-1;;;;30:1;27;20:12;5:2;9016:45:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9016:45:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9016:45:10;8971:27;:18;8994:3;8971:27;:22;:27;:::i;:::-;:31;:100;:31;:100;:::i;:::-;8940:131;;9108:1;9085:20;:24;9081:272;;;9131:18;;:57;;;-1:-1:-1;;;;;9131:57:10;;;;;;;;;;-1:-1:-1;;;;;9131:18:10;;;;:45;;:57;;;;;;;;;;;;;;;:18;:57;;;5:2:-1;;;;30:1;27;20:12;5:2;9131:57:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9131:57:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9131:57:10;9248:18;;:42;;;;;;;;-1:-1:-1;;;;;9125:77:10;;;;;;9220:10;;9248:18;;;:40;;:42;;;;;9131:57;;9248:42;;;;;;;;:18;:42;;;5:2:-1;;;;30:1;27;20:12;5:2;9248:42:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9248:42:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9248:42:10;9125:217;;;-1:-1:-1;;;9125:217:10;;;;;;-1:-1:-1;;;;;9125:217:10;;;;;;;;;;;;;;;;;;;;;;;;;;;9248:42;;9125:217;;;;;;;-1:-1:-1;9125:217:10;;;;5:2:-1;;;;30:1;27;20:12;5:2;9125:217:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9125:217:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;9081:272:10;9362:22;9387:44;:18;9410:20;9387:44;:22;:44;:::i;:::-;9362:69;;9442:18;9463:44;9491:15;;9463:23;9482:3;9463:14;:18;;:23;;;;:::i;:44::-;9442:65;;9534:1;9521:10;:14;9517:222;;;9557:18;;:57;;;-1:-1:-1;;;;;9557:57:10;;;;;;;;;;-1:-1:-1;;;;;9557:18:10;;;;:45;;:57;;;;;;;;;;;;;;;:18;:57;;;5:2:-1;;;;30:1;27;20:12;5:2;9557:57:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9557:57:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9557:57:10;9674:12;;9551:177;;;;;;9646:10;9551:177;;;;-1:-1:-1;;;;;9674:12:10;;;9551:177;;;;;;;;;;;;:77;;;;;;;:177;;;;;9557:57;;9551:177;;;;;;;9674:12;9551:77;:177;;;5:2:-1;;;;30:1;27;20:12;5:2;9551:177:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9551:177:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;9517:222:10;9749:20;9772:60;9821:10;9772:44;:18;9795:20;9772:44;:22;:44;:::i;:::-;:48;:60;:48;:60;:::i;:::-;9842:29;9885:18;;:67;;;-1:-1:-1;;;;;9885:67:10;;;;;;;;;;9749:83;;-1:-1:-1;9842:29:10;;;;-1:-1:-1;;;;;9885:18:10;;;;:55;;:67;;;;;;;;;;;;;;:18;:67;;;5:2:-1;;;;30:1;27;20:12;5:2;9885:67:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;9885:67:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9885:67:10;:71;9881:576;;;10039:18;;:67;;;-1:-1:-1;;;;;10039:67:10;;;;;;;;;;9996:124;;-1:-1:-1;;;;;10039:18:10;;:55;;:67;;;;;;;;;;;;;;:18;:67;;;5:2:-1;;;;30:1;27;20:12;9996:124:10;9972:148;;10162:1;10138:21;:25;10134:313;;;10189:18;;:57;;;-1:-1:-1;;;;;10189:57:10;;;;;;;;;;-1:-1:-1;;;;;10189:18:10;;;;:45;;:57;;;;;;;;;;;;;;;:18;:57;;;5:2:-1;;;;30:1;27;20:12;5:2;10189:57:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;10189:57:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;10189:57:10;10314:18;;:57;;;;;;;;;;;;;;-1:-1:-1;;;;;10183:77:10;;;;;;10282:10;;10314:18;;;:45;;:57;;;;;10189;;10314;;;;;;;;:18;:57;;;5:2:-1;;;;30:1;27;20:12;5:2;10314:57:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;10314:57:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;10314:57:10;10183:249;;;-1:-1:-1;;;10183:249:10;;;;;;-1:-1:-1;;;;;10183:249:10;;;;;;;;;;;;;;;;;;;;;;;;;;;10314:57;;10183:249;;;;;;;-1:-1:-1;10183:249:10;;;;5:2:-1;;;;30:1;27;20:12;5:2;10183:249:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;10183:249:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;10134:313:10;10466:20;10489:39;:12;10506:21;10489:39;:16;:39;:::i;:::-;10466:62;;10557:1;10542:12;:16;10538:269;;;10580:18;;:57;;;-1:-1:-1;;;;;10580:57:10;;;;;;;;;;-1:-1:-1;;;;;10580:18:10;;;;:45;;:57;;;;;;;;;;;;;;;:18;:57;;;5:2:-1;;;;30:1;27;20:12;5:2;10580:57:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;10580:57:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;10580:57:10;10697:18;;:55;;;-1:-1:-1;;;;;10697:55:10;;;;;;;;;;-1:-1:-1;;;;;10574:77:10;;;;;;10669:10;;10697:18;;;:43;;:55;;;;;10580:57;;10697:55;;;;;;;;:18;:55;;;5:2:-1;;;;30:1;27;20:12;5:2;10697:55:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;10697:55:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;10697:55:10;10574:222;;;-1:-1:-1;;;10574:222:10;;;;;;-1:-1:-1;;;;;10574:222:10;;;;;;;;;;;;;;;;;;;;;;;;;;;10697:55;;10574:222;;;;;;;-1:-1:-1;10574:222:10;;;;5:2:-1;;;;30:1;27;20:12;5:2;10574:222:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;10574:222:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;10538:269:10;8776:2037;;;;;;;;:::o;6836:1934::-;6939:1;6927:9;:13;6923:1841;;;6956:26;6985:18;;:90;;;-1:-1:-1;;;;;6985:90:10;;;;;;;;;;-1:-1:-1;;;;;6985:18:10;;;;:48;;:90;;;;;;;;;;;;;;;:18;:90;;;5:2:-1;;;;30:1;27;20:12;5:2;6985:90:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;6985:90:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;6985:90:10;7089:14;7137:18;;:60;;;-1:-1:-1;;;;;7137:60:10;;;;;;;;;;6985:90;;-1:-1:-1;7089:14:10;;7106:105;;-1:-1:-1;;;;;7137:18:10;;;;:48;;:60;;;;;6985:90;;7137:60;;;;;;;:18;:60;;;5:2:-1;;;;30:1;27;20:12;5:2;7137:60:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;7137:60:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;7137:60:10;7106:9;;:105;:13;:105;:::i;:::-;7089:122;;7230:17;7229:18;:32;;;;;7260:1;7251:6;:10;7229:32;7225:98;;;7281:27;;:10;;:27;;;;;7301:6;;7281:27;;;;7301:6;7281:10;:27;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;7281:27:10;7225:98;7336:28;7416:18;;:45;;;;;;;;7367:108;;-1:-1:-1;;;;;7416:18:10;;:43;;:45;;;;;;;;;;;;;;:18;:45;;;5:2:-1;;;;30:1;27;20:12;5:2;7416:45:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;7416:45:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;7416:45:10;7367:27;:18;7390:3;7367:27;:22;:27;:::i;:108::-;7336:139;;7516:1;7493:20;:24;7489:136;;;7537:18;;;;;;;;;-1:-1:-1;;;;;7537:18:10;-1:-1:-1;;;;;7537:40:10;;:42;;;;;-1:-1:-1;;;7537:42:10;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7537:42:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;7537:42:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;7537:42:10;:73;;-1:-1:-1;;;;;7537:51:10;;;;:73;;;;;7589:20;;7537:73;;;;7589:20;7537:51;:73;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;7537:73:10;7489:136;7639:22;7664:44;:18;7687:20;7664:44;:22;:44;:::i;:::-;7639:69;;7723:18;7744:44;7772:15;;7744:23;7763:3;7744:14;:18;;:23;;;;:::i;:44::-;7723:65;;7819:1;7806:10;:14;7802:86;;;7840:12;;:33;;-1:-1:-1;;;;;7840:12:10;;;;:33;;;;;7862:10;;7840:12;:33;:12;:33;7862:10;7840:12;:33;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;7840:33:10;7802:86;7902:20;7925:60;7974:10;7925:44;:18;7948:20;7925:44;:22;:44;:::i;:60::-;7999:29;8046:18;;:67;;;-1:-1:-1;;;;;8046:67:10;;;;;;;;;;7902:83;;-1:-1:-1;7999:29:10;;;;-1:-1:-1;;;;;8046:18:10;;;;:55;;:67;;;;;;;;;;;;;;:18;:67;;;5:2:-1;;;;30:1;27;20:12;5:2;8046:67:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;8046:67:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;8046:67:10;:71;8042:490;;;8208:18;;:67;;;-1:-1:-1;;;;;8208:67:10;;;;;;;;;;8161:132;;-1:-1:-1;;;;;8208:18:10;;:55;;:67;;;;;;;;;;;;;;:18;:67;;;5:2:-1;;;;30:1;27;20:12;8161:132:10;8137:156;;8339:1;8315:21;:25;8311:207;;;8364:18;;:57;;;;;;;;;;;;;;-1:-1:-1;;;;;8364:18:10;;;;:45;;:57;;;;;;;;;;;;;;;:18;:57;;;5:2:-1;;;;30:1;27;20:12;5:2;8364:57:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;8364:57:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;8364:57:10;:135;;-1:-1:-1;;;;;8364:66:10;;;;:135;;;;;8456:21;;8364:135;;;;8456:21;8364:66;:135;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;8364:135:10;8311:207;8545:20;8568:39;:12;8585:21;8568:39;:16;:39;:::i;:::-;8545:62;;8640:1;8625:12;:16;8621:133;;;8661:18;;:55;;;-1:-1:-1;;;;;8661:55:10;;;;;;;;;;-1:-1:-1;;;;;8661:18:10;;;;:43;;:55;;;;;;;;;;;;;;;:18;:55;;;5:2:-1;;;;30:1;27;20:12;5:2;8661:55:10;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;8661:55:10;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;8661:55:10;:78;;-1:-1:-1;;;;;8661:64:10;;;;:78;;;;;8726:12;;8661:78;;;;8726:12;8661:64;:78;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;8661:78:10;6923:1841;;;;;;;;;6836:1934;;:::o;3201:130:19:-;3259:7;3285:39;3289:1;3292;3285:39;;;;;;;;;;;;;;;;;;3962:7;4062:12;4055:5;;;4047:28;;;;-1:-1:-1;;;;;4047:28:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;4047:28:19;;4085:9;4101:1;4097;:5;;;;;;;;;3846:368;-1:-1:-1;;;;;3846:368:19:o
Swarm Source
bzzr://120f13757f5b94fb335dcec02f41b30a06789404d87422fb2cc33eadb2e3da91
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ 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.