Source Code
Overview
S Balance
0 S
More Info
ContractCreator
Latest 25 from a total of 55 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Add Whitelist Ad... | 16409944 | 41 hrs ago | IN | 0 S | 0.00005267 | ||||
Add Whitelist Ad... | 16409923 | 41 hrs ago | IN | 0 S | 0.00005269 | ||||
Set Approval For... | 16407155 | 41 hrs ago | IN | 0 S | 0.00005076 | ||||
Set Approval For... | 16140613 | 2 days ago | IN | 0 S | 0.00005076 | ||||
Add Minter | 15973344 | 3 days ago | IN | 0 S | 0.00005276 | ||||
Create Support C... | 15971789 | 3 days ago | IN | 0 S | 0.00048999 | ||||
Create Support C... | 15971762 | 3 days ago | IN | 0 S | 0.00048987 | ||||
Create Support C... | 15971734 | 3 days ago | IN | 0 S | 0.0004899 | ||||
Create Support C... | 15971705 | 3 days ago | IN | 0 S | 0.00051461 | ||||
Create Support C... | 15971677 | 3 days ago | IN | 0 S | 0.00048963 | ||||
Create Support C... | 15971649 | 3 days ago | IN | 0 S | 0.00048963 | ||||
Create Support C... | 15971622 | 3 days ago | IN | 0 S | 0.00048972 | ||||
Create Support C... | 15971589 | 3 days ago | IN | 0 S | 0.00048974 | ||||
Create Support C... | 15971559 | 3 days ago | IN | 0 S | 0.00048984 | ||||
Create Support C... | 15971527 | 3 days ago | IN | 0 S | 0.00036822 | ||||
Create Support C... | 15971497 | 3 days ago | IN | 0 S | 0.00048966 | ||||
Create Support C... | 15971468 | 3 days ago | IN | 0 S | 0.00048991 | ||||
Create Support C... | 15971436 | 3 days ago | IN | 0 S | 0.00036819 | ||||
Create Support C... | 15971405 | 3 days ago | IN | 0 S | 0.00044282 | ||||
Create Support C... | 15971378 | 3 days ago | IN | 0 S | 0.00046486 | ||||
Create Support C... | 15971348 | 3 days ago | IN | 0 S | 0.00048999 | ||||
Create Support C... | 15971318 | 3 days ago | IN | 0 S | 0.0004897 | ||||
Create Support C... | 15971288 | 3 days ago | IN | 0 S | 0.00048961 | ||||
Create Support C... | 15971259 | 3 days ago | IN | 0 S | 0.00043953 | ||||
Create Support C... | 15971233 | 3 days ago | IN | 0 S | 0.00043962 |
Latest 25 internal transactions (View All)
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
16408367 | 41 hrs ago | 0 S | ||||
16408367 | 41 hrs ago | 0 S | ||||
16408367 | 41 hrs ago | 0 S | ||||
16408045 | 41 hrs ago | 0 S | ||||
16408045 | 41 hrs ago | 0 S | ||||
16408045 | 41 hrs ago | 0 S | ||||
16408045 | 41 hrs ago | 0 S | ||||
16408045 | 41 hrs ago | 0 S | ||||
16408045 | 41 hrs ago | 0 S | ||||
16408045 | 41 hrs ago | 0 S | ||||
16408045 | 41 hrs ago | 0 S | ||||
16408045 | 41 hrs ago | 0 S | ||||
16408045 | 41 hrs ago | 0 S | ||||
16408045 | 41 hrs ago | 0 S | ||||
16408045 | 41 hrs ago | 0 S | ||||
16408045 | 41 hrs ago | 0 S | ||||
16408045 | 41 hrs ago | 0 S | ||||
16408045 | 41 hrs ago | 0 S | ||||
16408045 | 41 hrs ago | 0 S | ||||
16408045 | 41 hrs ago | 0 S | ||||
16408045 | 41 hrs ago | 0 S | ||||
16408045 | 41 hrs ago | 0 S | ||||
16408045 | 41 hrs ago | 0 S | ||||
16408045 | 41 hrs ago | 0 S | ||||
16408045 | 41 hrs ago | 0 S |
Loading...
Loading
Contract Name:
PepemonFactory
Compiler Version
v0.8.6+commit.11564f7e
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
import "./cardlib/ERC1155Tradable.sol"; pragma solidity ^0.8.0; pragma experimental ABIEncoderV2; /** * @title Pepemon Factory * PEPEMON - gotta farm em all */ contract PepemonFactory is ERC1155Tradable { string private _contractURI; constructor() ERC1155Tradable("PepemonBattleFactory", "PEPEBATTLE") { _setBaseMetadataURI("https://pepemon.finance/api/cards/"); _contractURI = "https://pepemon.finance/api/pepemon-erc1155"; } function setBaseMetadataURI(string memory newURI) public onlyWhitelistAdmin { _setBaseMetadataURI(newURI); } function setContractURI(string memory newURI) public onlyWhitelistAdmin { _contractURI = newURI; } function contractURI() public view returns (string memory) { return _contractURI; } /** * @dev Ends minting of token * @param _id Token ID for which minting will end */ function endMinting(uint256 _id) external onlyWhitelistAdmin { tokenMaxSupply[_id] = tokenSupply[_id]; } function burn( address _account, uint256 _id, uint256 _amount ) public onlyMinter { require(balanceOf(_account, _id) >= _amount, "Exceeded available amount"); _burn(_account, _id, _amount); } /** * Mint NFT and send those to the list of given addresses */ function airdrop(uint256 _id, address[] memory _addresses) public onlyMinter { require(tokenMaxSupply[_id] - tokenSupply[_id] >= _addresses.length, "Cant mint above max supply"); for (uint256 i = 0; i < _addresses.length; i++) { mint(_addresses[i], _id, 1, ""); } } function batchMint( uint256 start, uint256 end, address to ) external onlyMinter { for (uint256 i = start; i <= end; i++) { mintPepe(to, i, 1, hex""); } } function batchMintList( uint256[] calldata ids, address to ) external onlyMinter { uint256 length = ids.length; for (uint256 i = 0; i <= length; i++) { mintPepe(to, ids[i], 1, hex""); } } }
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
pragma solidity ^0.8.0; /// @title Base64 /// @notice Provides a function for encoding some bytes in base64 /// @author Brecht Devos <[email protected]> library Base64 { bytes internal constant TABLE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; /// @notice Encodes some bytes to the base64 representation function encode(bytes memory data) internal pure returns (string memory) { uint256 len = data.length; if (len == 0) return ''; // multiply by 4/3 rounded up uint256 encodedLen = 4 * ((len + 2) / 3); // Add some extra buffer at the end bytes memory result = new bytes(encodedLen + 32); bytes memory table = TABLE; assembly { let tablePtr := add(table, 1) let resultPtr := add(result, 32) for {let i := 0} lt(i, len) {} { i := add(i, 3) let input := and(mload(add(data, i)), 0xffffff) let out := mload(add(tablePtr, and(shr(18, input), 0x3F))) out := shl(8, out) out := add(out, and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF)) out := shl(8, out) out := add(out, and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF)) out := shl(8, out) out := add(out, and(mload(add(tablePtr, and(input, 0x3F))), 0xFF)) out := shl(224, out) mstore(resultPtr, out) resultPtr := add(resultPtr, 4) } switch mod(len, 3) case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) } case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) } mstore(result, encodedLen) } return string(result); } }
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Context.sol pragma solidity ^0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
import "./IERC1155Receiver.sol"; import "./IERC1155.sol"; import "./Address.sol"; pragma solidity ^0.8.0; /** * @dev Implementation of Multi-Token Standard contract */ contract ERC1155 is IERC1155 { using Address for address; /***********************************| | Variables and Events | |__________________________________*/ // onReceive function signatures bytes4 constant internal ERC1155_RECEIVED_VALUE = 0xf23a6e61; bytes4 constant internal ERC1155_BATCH_RECEIVED_VALUE = 0xbc197c81; // Objects balances mapping (address => mapping(uint256 => uint256)) internal balances; // Operator Functions mapping (address => mapping(address => bool)) internal operators; /***********************************| | Public Transfer Functions | |__________________________________*/ /** * @notice Transfers amount amount of an _id from the _from address to the _to address specified * @param _from Source address * @param _to Target address * @param _id ID of the token type * @param _amount Transfered amount * @param _data Additional data with no specified format, sent in call to `_to` */ function safeTransferFrom(address _from, address _to, uint256 _id, uint256 _amount, bytes memory _data) public override { require((msg.sender == _from) || isApprovedForAll(_from, msg.sender), "ERC1155#safeTransferFrom: INVALID_OPERATOR"); require(_to != address(0),"ERC1155#safeTransferFrom: INVALID_RECIPIENT"); // require(_amount >= balances[_from][_id]) is not necessary since checked with safemath operations _safeTransferFrom(_from, _to, _id, _amount); _callonERC1155Received(_from, _to, _id, _amount, _data); } /** * @notice Send multiple types of Tokens from the _from address to the _to address (with safety call) * @param _from Source addresses * @param _to Target addresses * @param _ids IDs of each token type * @param _amounts Transfer amounts per token type * @param _data Additional data with no specified format, sent in call to `_to` */ function safeBatchTransferFrom(address _from, address _to, uint256[] memory _ids, uint256[] memory _amounts, bytes memory _data) public override { // Requirements require((msg.sender == _from) || isApprovedForAll(_from, msg.sender), "ERC1155#safeBatchTransferFrom: INVALID_OPERATOR"); require(_to != address(0), "ERC1155#safeBatchTransferFrom: INVALID_RECIPIENT"); _safeBatchTransferFrom(_from, _to, _ids, _amounts); _callonERC1155BatchReceived(_from, _to, _ids, _amounts, _data); } /***********************************| | Internal Transfer Functions | |__________________________________*/ /** * @notice Transfers amount amount of an _id from the _from address to the _to address specified * @param _from Source address * @param _to Target address * @param _id ID of the token type * @param _amount Transfered amount */ function _safeTransferFrom(address _from, address _to, uint256 _id, uint256 _amount) internal { // Update balances balances[_from][_id] = balances[_from][_id]-_amount; // Subtract amount balances[_to][_id] = balances[_to][_id]+_amount; // Add amount // Emit event emit TransferSingle(msg.sender, _from, _to, _id, _amount); } /** * @notice Verifies if receiver is contract and if so, calls (_to).onERC1155Received(...) */ function _callonERC1155Received(address _from, address _to, uint256 _id, uint256 _amount, bytes memory _data) internal { // Check if recipient is contract if (_to.isContract()) { bytes4 retval = IERC1155Receiver(_to).onERC1155Received(msg.sender, _from, _id, _amount, _data); require(retval == ERC1155_RECEIVED_VALUE, "ERC1155#_callonERC1155Received: INVALID_ON_RECEIVE_MESSAGE"); } } /** * @notice Send multiple types of Tokens from the _from address to the _to address (with safety call) * @param _from Source addresses * @param _to Target addresses * @param _ids IDs of each token type * @param _amounts Transfer amounts per token type */ function _safeBatchTransferFrom(address _from, address _to, uint256[] memory _ids, uint256[] memory _amounts) internal { require(_ids.length == _amounts.length, "ERC1155#_safeBatchTransferFrom: INVALID_ARRAYS_LENGTH"); // Number of transfer to execute uint256 nTransfer = _ids.length; // Executing all transfers for (uint256 i = 0; i < nTransfer; i++) { // Update storage balance of previous bin balances[_from][_ids[i]] = balances[_from][_ids[i]]-_amounts[i]; balances[_to][_ids[i]] = balances[_to][_ids[i]]+_amounts[i]; } // Emit event emit TransferBatch(msg.sender, _from, _to, _ids, _amounts); } /** * @notice Verifies if receiver is contract and if so, calls (_to).onERC1155BatchReceived(...) */ function _callonERC1155BatchReceived(address _from, address _to, uint256[] memory _ids, uint256[] memory _amounts, bytes memory _data) internal { // Pass data if recipient is contract if (_to.isContract()) { bytes4 retval = IERC1155Receiver(_to).onERC1155BatchReceived(msg.sender, _from, _ids, _amounts, _data); require(retval == ERC1155_BATCH_RECEIVED_VALUE, "ERC1155#_callonERC1155BatchReceived: INVALID_ON_RECEIVE_MESSAGE"); } } /***********************************| | Operator Functions | |__________________________________*/ /** * @notice Enable or disable approval for a third party ("operator") to manage all of caller's tokens * @param _operator Address to add to the set of authorized operators * @param _approved True if the operator is approved, false to revoke approval */ function setApprovalForAll(address _operator, bool _approved) external override { // Update operator status operators[msg.sender][_operator] = _approved; emit ApprovalForAll(msg.sender, _operator, _approved); } /** * @notice Queries the approval status of an operator for a given owner * @param _owner The owner of the Tokens * @param _operator Address of authorized operator * @return isOperator True if the operator is approved, false if not */ function isApprovedForAll(address _owner, address _operator) public view virtual override returns (bool isOperator) { return operators[_owner][_operator]; } /***********************************| | Balance Functions | |__________________________________*/ /** * @notice Get the balance of an account's Tokens * @param _owner The address of the token holder * @param _id ID of the Token * @return The _owner's balance of the Token type requested */ function balanceOf(address _owner, uint256 _id) public view override returns (uint256) { return balances[_owner][_id]; } /** * @notice Get the balance of multiple account/token pairs * @param _owners The addresses of the token holders * @param _ids ID of the Tokens * @return The _owner's balance of the Token types requested (i.e. balance for each (owner, id) pair) */ function balanceOfBatch(address[] memory _owners, uint256[] memory _ids) public view override returns (uint256[] memory) { require(_owners.length == _ids.length, "ERC1155#balanceOfBatch: INVALID_ARRAY_LENGTH"); // Variables uint256[] memory batchBalances = new uint256[](_owners.length); // Iterate over each owner and token ID for (uint256 i = 0; i < _owners.length; i++) { batchBalances[i] = balances[_owners[i]][_ids[i]]; } return batchBalances; } /***********************************| | ERC165 Functions | |__________________________________*/ /** * INTERFACE_SIGNATURE_ERC165 = bytes4(keccak256("supportsInterface(bytes4)")); */ bytes4 constant private INTERFACE_SIGNATURE_ERC165 = 0x01ffc9a7; /** * INTERFACE_SIGNATURE_ERC1155 = * bytes4(keccak256("safeTransferFrom(address,address,uint256,uint256,bytes)")) ^ * bytes4(keccak256("safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)")) ^ * bytes4(keccak256("balanceOf(address,uint256)")) ^ * bytes4(keccak256("balanceOfBatch(address[],uint256[])")) ^ * bytes4(keccak256("setApprovalForAll(address,bool)")) ^ * bytes4(keccak256("isApprovedForAll(address,address)")); */ bytes4 constant private INTERFACE_SIGNATURE_ERC1155 = 0xd9b67a26; /** * @notice Query if a contract implements an interface * @param _interfaceID The interface identifier, as specified in ERC-165 * @return `true` if the contract implements `_interfaceID` and */ function supportsInterface(bytes4 _interfaceID) external pure override returns (bool) { if (_interfaceID == INTERFACE_SIGNATURE_ERC165 || _interfaceID == INTERFACE_SIGNATURE_ERC1155) { return true; } return false; } }
pragma solidity ^0.8.0; /** * @notice Contract that handles metadata related methods. * @dev Methods assume a deterministic generation of URI based on token IDs. * Methods also assume that URI uses hex representation of token IDs. */ contract ERC1155Metadata { /***********************************| | Utility Internal Functions | |__________________________________*/ /** * @notice Convert uint256 to string * @param _i Unsigned integer to convert to string */ function _uint2str(uint _i) internal pure returns (string memory _uintAsString) { if (_i == 0) { return "0"; } uint j = _i; uint len; while (j != 0) { len++; j /= 10; } bytes memory bstr = new bytes(len); uint k = len; while (_i != 0) { k = k-1; uint8 temp = (48 + uint8(_i - _i / 10 * 10)); bytes1 b1 = bytes1(temp); bstr[k] = b1; _i /= 10; } return string(bstr); } }
import "./ERC1155.sol"; pragma solidity ^0.8.0; /** * @dev Multi-Fungible Tokens with minting and burning methods. These methods assume * a parent contract to be executed as they are `internal` functions */ contract ERC1155MintBurn is ERC1155 { /****************************************| | Minting Functions | |_______________________________________*/ /** * @notice Mint _amount of tokens of a given id * @param _to The address to mint tokens to * @param _id Token id to mint * @param _amount The amount to be minted * @param _data Data to pass if receiver is contract */ function _mint(address _to, uint256 _id, uint256 _amount, bytes memory _data) internal { // Add _amount balances[_to][_id] = balances[_to][_id]+_amount; // Emit event emit TransferSingle(msg.sender, address(0x0), _to, _id, _amount); // Calling onReceive method if recipient is contract _callonERC1155Received(address(0x0), _to, _id, _amount, _data); } /** * @notice Mint tokens for each ids in _ids * @param _to The address to mint tokens to * @param _ids Array of ids to mint * @param _amounts Array of amount of tokens to mint per id * @param _data Data to pass if receiver is contract */ function _batchMint(address _to, uint256[] memory _ids, uint256[] memory _amounts, bytes memory _data) internal { require(_ids.length == _amounts.length, "ERC1155MintBurn#batchMint: INVALID_ARRAYS_LENGTH"); // Number of mints to execute uint256 nMint = _ids.length; // Executing all minting for (uint256 i = 0; i < nMint; i++) { // Update storage balance balances[_to][_ids[i]] = balances[_to][_ids[i]]+(_amounts[i]); } // Emit batch mint event emit TransferBatch(msg.sender, address(0x0), _to, _ids, _amounts); // Calling onReceive method if recipient is contract _callonERC1155BatchReceived(address(0x0), _to, _ids, _amounts, _data); } /****************************************| | Burning Functions | |_______________________________________*/ /** * @notice Burn _amount of tokens of a given token id * @param _from The address to burn tokens from * @param _id Token id to burn * @param _amount The amount to be burned */ function _burn(address _from, uint256 _id, uint256 _amount) internal { //Substract _amount balances[_from][_id] = balances[_from][_id]-(_amount); // Emit event emit TransferSingle(msg.sender, _from, address(0x0), _id, _amount); } /** * @notice Burn tokens of given token id for each (_ids[i], _amounts[i]) pair * @param _from The address to burn tokens from * @param _ids Array of token ids to burn * @param _amounts Array of the amount to be burned */ function _batchBurn(address _from, uint256[] memory _ids, uint256[] memory _amounts) internal { require(_ids.length == _amounts.length, "ERC1155MintBurn#batchBurn: INVALID_ARRAYS_LENGTH"); // Number of mints to execute uint256 nBurn = _ids.length; // Executing all minting for (uint256 i = 0; i < nBurn; i++) { // Update storage balance balances[_from][_ids[i]] = balances[_from][_ids[i]]-(_amounts[i]); } // Emit batch mint event emit TransferBatch(msg.sender, _from, address(0x0), _ids, _amounts); } }
import "./ERC1155.sol"; import "./ERC1155MintBurn.sol"; import "./ERC1155Metadata.sol"; import "./Ownable.sol"; import "./MinterRole.sol"; import "./WhitelistAdminRole.sol"; import "./PepemonStats.sol"; pragma solidity ^0.8.0; pragma experimental ABIEncoderV2; /** * @title ERC1155Tradable * ERC1155Tradable - ERC1155 contract that whitelists an operator address, * has create and mint functionality, and supports useful standards from OpenZeppelin, like _exists(), name(), symbol(), and totalSupply() */ contract ERC1155Tradable is ERC1155, ERC1155MintBurn, ERC1155Metadata, Ownable, MinterRole, WhitelistAdminRole, PepemonStats { uint256 private _currentTokenID = 0; mapping(uint256 => address) public creators; mapping(uint256 => uint256) public tokenSupply; mapping(uint256 => uint256) public tokenMaxSupply; // Contract name string public name; // Contract symbol string public symbol; string public baseMetadataURI; constructor( string memory _name, string memory _symbol ) { name = _name; symbol = _symbol; } function _setBaseMetadataURI(string memory x) internal{ baseMetadataURI = x; } function removeWhitelistAdmin(address account) public onlyOwner { _removeWhitelistAdmin(account); } function removeMinter(address account) public onlyOwner { _removeMinter(account); } function uri(uint256 _id) public view returns (string memory) { require(_exists(_id), "NONEXISTENT_TOKEN"); return _getUri(_id); } /** * @dev Creates a new token type and assigns _initialSupply to an address * @param _maxSupply max supply allowed * @param _initialSupply Optional amount to supply the first owner * @param _uri Optional URI for this token type * @param _data Optional data to pass if receiver is contract * @return tokenId The newly created token ID */ function create( uint256 _maxSupply, uint256 _initialSupply, string memory _uri, bytes memory _data ) internal returns (uint256 tokenId) { require(_initialSupply <= _maxSupply); _currentTokenID++; uint256 _id = _currentTokenID; creators[_id] = msg.sender; if (bytes(_uri).length > 0) { emit URI(_uri, _id); } if (_initialSupply != 0) _mint(msg.sender, _id, _initialSupply, _data); tokenSupply[_id] = _initialSupply; tokenMaxSupply[_id] = _maxSupply; return _id; } function createBattleCard(BattleCardStats calldata _stats, uint256 _maxSupply, uint256 _initialSupply, string calldata _uri, bytes calldata _data ) external onlyWhitelistAdmin returns(uint256 tokenId){ uint _id = create(_maxSupply, _initialSupply, _uri, _data); setBattleCardStats(_id, _stats); return _id; } function createSupportCard(SupportCardStats calldata _stats, uint256 _maxSupply, uint256 _initialSupply, string calldata _uri, bytes calldata _data ) external onlyWhitelistAdmin returns(uint256 tokenId){ uint _id = create(_maxSupply, _initialSupply, _uri, _data); setSupportCardStats(_id, _stats); return _id; } /** * @dev Mints some amount of tokens to an address * @param _to Address of the future owner of the token * @param _id Token ID to mint * @param _quantity Amount of tokens to mint * @param _data Data to pass if receiver is contract */ function mint( address _to, uint256 _id, uint256 _quantity, bytes memory _data ) public onlyMinter { mintPepe(_to, _id, _quantity, _data); } function mintPepe( address _to, uint256 _id, uint256 _quantity, bytes memory _data ) internal{ uint256 tokenId = _id; uint256 newSupply = tokenSupply[tokenId]+_quantity; require(newSupply <= tokenMaxSupply[tokenId], "Max supply reached"); _mint(_to, _id, _quantity, _data); tokenSupply[_id] = tokenSupply[_id]+_quantity; } /** * @dev Returns whether the specified token exists by checking to see if it has a creator * @param _id uint256 ID of the token to query the existence of * @return bool whether the token exists */ function _exists(uint256 _id) internal view returns (bool) { return creators[_id] != address(0); } /** * @dev returns the last minted token ID based on value of _currentTokenID */ function getLastTokenID() public view returns (uint256) { return _currentTokenID; } }
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC1155/IERC1155.sol import "./IERC165.sol"; pragma solidity ^0.8.0; /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155 is IERC165 { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes calldata data ) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) external; }
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC1155/IERC1155Receiver.sol import "./IERC165.sol"; pragma solidity ^0.8.0; /** * @dev _Available since v3.1._ */ interface IERC1155Receiver is IERC165 { /** @dev Handles the receipt of a single ERC1155 token type. This function is called at the end of a `safeTransferFrom` after the balance has been updated. To accept the transfer, this must return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` (i.e. 0xf23a6e61, or its own function selector). @param operator The address which initiated the transfer (i.e. msg.sender) @param from The address which previously owned the token @param id The ID of the token being transferred @param value The amount of tokens being transferred @param data Additional data with no specified format @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns (bytes4); /** @dev Handles the receipt of a multiple ERC1155 token types. This function is called at the end of a `safeBatchTransferFrom` after the balances have been updated. To accept the transfer(s), this must return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` (i.e. 0xbc197c81, or its own function selector). @param operator The address which initiated the batch transfer (i.e. msg.sender) @param from The address which previously owned the token @param ids An array containing ids of each token being transferred (order and length must match values array) @param values An array containing amounts of each token being transferred (order and length must match ids array) @param data Additional data with no specified format @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4); }
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/introspection/IERC165.sol pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
import "./Context.sol"; import "./Roles.sol"; pragma solidity ^0.8.0; contract MinterRole is Context { using Roles for Roles.Role; event MinterAdded(address indexed account); event MinterRemoved(address indexed account); Roles.Role private _minters; constructor () { _addMinter(_msgSender()); } modifier onlyMinter() { require(isMinter(_msgSender()), "MinterRole: caller does not have the Minter role"); _; } function isMinter(address account) public view returns (bool) { return _minters.has(account); } function addMinter(address account) public onlyMinter { require (account != address(this)); _addMinter(account); } function renounceMinter() public { _removeMinter(_msgSender()); } function _addMinter(address account) internal { _minters.add(account); emit MinterAdded(account); } function _removeMinter(address account) internal { _minters.remove(account); emit MinterRemoved(account); } }
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol import "./Context.sol"; pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
import "./WhitelistAdminRole.sol"; import "./Base64.sol"; pragma experimental ABIEncoderV2; contract PepemonStats is WhitelistAdminRole{ struct BattleCardStats { uint16 element; uint16 hp; uint16 speed; uint16 intelligence; uint16 defense; uint16 attack; uint16 specialAttack; uint16 specialDefense; uint16 level; string name; string description; string ipfsAddr; string rarity; } struct SupportCardStats { bytes32 currentRoundChanges; bytes32 nextRoundChanges; uint256 specialCode; uint16 modifierNumberOfNextTurns; bool isOffense; bool isNormal; bool isStackable; string name; string description; string ipfsAddr; string rarity; } struct elementWR{ uint16 weakness; uint16 resistance; } mapping(uint => BattleCardStats) public battleCardStats; mapping(uint => SupportCardStats) public supportCardStats; mapping (uint16 => string) public elementDecode; mapping (uint16 => elementWR) public weakResist; constructor(){ elementDecode[1]="Fire"; elementDecode[2]="Grass"; elementDecode[3]="Water"; elementDecode[4]="Lighting"; elementDecode[5]="Wind"; elementDecode[6]="Poison"; elementDecode[7]="Ghost"; elementDecode[8]="Fairy"; elementDecode[9]="Earth"; elementDecode[10]="Unknown"; weakResist[1] = elementWR(3,2); weakResist[2] = elementWR(1,3); weakResist[3] = elementWR(4,1); weakResist[4] = elementWR(9,5); weakResist[5] = elementWR(6,9); weakResist[6] = elementWR(8,2); weakResist[7] = elementWR(8,6); weakResist[8] = elementWR(7,8); weakResist[9] = elementWR(2,7); weakResist[10] = elementWR(0,0); } function setBattleCardStats(uint id, BattleCardStats calldata x) public onlyWhitelistAdmin{ battleCardStats[id] = x; } function setSupportCardStats(uint id, SupportCardStats calldata x) public onlyWhitelistAdmin{ supportCardStats[id] = x; } function setWeakResist(uint16 element, elementWR calldata x) public onlyWhitelistAdmin{ weakResist[element] = x; } function setElementDecode(uint16 element, string calldata x) public onlyWhitelistAdmin{ elementDecode[element] = x; } function batchGetBattleCardStats(uint minId, uint maxId) public view returns (BattleCardStats[] memory) { require(minId <= maxId); BattleCardStats[] memory results = new BattleCardStats[](maxId - minId + 1); for (uint256 i = minId; i <= maxId; i++) { results[i - minId] = battleCardStats[i]; } return results; } function batchGetSupportCardStats(uint minId, uint maxId) public view returns (SupportCardStats[] memory) { require(minId <= maxId); SupportCardStats[] memory results = new SupportCardStats[](maxId - minId + 1); for (uint256 i = minId; i <= maxId; i++) { results[i - minId] = supportCardStats[i]; } return results; } //Pos 0-7 = hp, spd, int, def, atk, sp atk, sp def //Pos 8-13 = same but for opponent function deconvert(bytes32 num) public pure returns(int16[14] memory){ int16[14] memory arr; for (uint i =0 ; i < 14; i++){ arr[i] = int16(uint16(bytes2(num << 240))); num = num >> 16; } return arr; } function uint2str(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 convert(int16[14] calldata arr) public pure returns (bytes32){ bytes32 num; for (uint i = 0 ; i < 14; i++ ){ num |= (bytes32(uint256(uint16(arr[i])))<<(16*i)); } return num; } //spaghetti code ahead :( function getSupportType(SupportCardStats memory s) internal pure returns(string memory){ string memory x ="Defense "; string memory y="(Special)"; if (s.isOffense){ x = "Offense "; } if (s.isNormal){ y = "(Normal)"; } return string(abi.encodePacked(x, y)); } function _URIForSupport(uint id) internal view returns (bytes memory){ SupportCardStats memory s = supportCardStats[id]; return abi.encodePacked( "{\"pool\": {\"name\": \"root\",\"points\": 1},\"external_url\": \"https://pepemon.world/\",\"image\": \"", s.ipfsAddr, "\",\"name\": \"", s.name, "\",\"description\": \"", s.description, "\",\"attributes\": [{\"trait_type\": \"Set\",\"value\": \"Pepemon Support\"},{\"trait_type\": \"Rarity\",\"value\": \"", s.rarity, "\"},{\"trait_type\": \"Type\",\"value\": \"", getSupportType(s), "\"}]}"); } function _URIForBattle(uint id) internal view returns (bytes memory){ BattleCardStats memory b = battleCardStats[id]; uint16 e = b.element; return abi.encodePacked("{\"pool\": {\"name\": \"root\",\"points\": 1},\"external_url\": \"https://pepemon.world/\",\"image\": \"", b.ipfsAddr, "\",\"name\": \"", b.name, "\",\"description\": \"", b.description, "\",\"attributes\":[{\"trait_type\":\"Set\",\"value\":\"Pepemon Battle\"},{\"trait_type\":\"Level\",\"value\":", uint2str(b.level), "},{\"trait_type\":\"Element\",\"value\":\"", elementDecode[e], "\"},{\"trait_type\":\"Weakness\",\"value\":\""); } function _URIForBattle3(uint id) internal view returns (bytes memory){ BattleCardStats memory b = battleCardStats[id]; uint16 e = b.element; return abi.encodePacked( elementDecode[weakResist[e].weakness], "\"},{\"trait_type\":\"Resistance\",\"value\":\"", elementDecode[weakResist[e].resistance], "\"},{\"trait_type\":\"HP\",\"value\":", uint2str(b.hp)); } function _URIForBattle2(uint id) internal view returns (bytes memory){ BattleCardStats memory b = battleCardStats[id]; return abi.encodePacked("},{\"trait_type\":\"Speed\",\"value\":" , uint2str(b.speed) , "},{\"trait_type\":\"Intelligence\",\"value\":" , uint2str(b.intelligence) , "},{\"trait_type\":\"Defense\",\"value\":" , uint2str(b.defense)); } function _URIForBattle4(uint id) internal view returns (bytes memory){ BattleCardStats memory b = battleCardStats[id]; return abi.encodePacked("},{\"trait_type\":\"Attack\",\"value\":", uint2str(b.attack), "},{\"trait_type\":\"Special Attack\",\"value\":", uint2str(b.specialAttack), "},{\"trait_type\":\"Special Defense\",\"value\":", uint2str(b.specialDefense), "}]}"); } function _getUri2(uint id) internal view returns(bytes memory){ if (battleCardStats[id].hp==0){ return _URIForSupport(id); }else{ return abi.encodePacked(_URIForBattle(id), _URIForBattle3(id), _URIForBattle2(id), _URIForBattle4(id)); } } function _getUri(uint id) internal view returns (string memory){ return string(abi.encodePacked("data:application/json;base64\r\n\r\n", Base64.encode(_getUri2(id)))); } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.6; /** * @title Roles * @dev Library for managing addresses assigned to a Role. */ library Roles { struct Role { mapping (address => bool) bearer; } /** * @dev Give an account access to this role. */ function add(Role storage role, address account) internal { require(!has(role, account), "Roles: account already has role"); role.bearer[account] = true; } /** * @dev Remove an account's access to this role. */ function remove(Role storage role, address account) internal { require(has(role, account), "Roles: account does not have role"); role.bearer[account] = false; } /** * @dev Check if an account has this role. * @return bool */ function has(Role storage role, address account) internal view returns (bool) { require(account != address(0), "Roles: account is the zero address"); return role.bearer[account]; } }
import "./Context.sol"; import "./Roles.sol"; pragma solidity ^0.8.0; /** * @title WhitelistAdminRole * @dev WhitelistAdmins are responsible for assigning and removing Whitelisted accounts. */ contract WhitelistAdminRole is Context { using Roles for Roles.Role; event WhitelistAdminAdded(address indexed account); event WhitelistAdminRemoved(address indexed account); Roles.Role private _whitelistAdmins; constructor () { _addWhitelistAdmin(_msgSender()); _addWhitelistAdmin(address(0x104E989923417D765215B48e03baa4aF222f3F6D)); } modifier onlyWhitelistAdmin() { require(isWhitelistAdmin(_msgSender()), "Not an admin"); _; } function isWhitelistAdmin(address account) public view returns (bool) { return _whitelistAdmins.has(account); } function addWhitelistAdmin(address account) public onlyWhitelistAdmin { require (account != address(this)); _addWhitelistAdmin(account); } function renounceWhitelistAdmin() public { _removeWhitelistAdmin(_msgSender()); } function _addWhitelistAdmin(address account) internal { _whitelistAdmins.add(account); emit WhitelistAdminAdded(account); } function _removeWhitelistAdmin(address account) internal { _whitelistAdmins.remove(account); emit WhitelistAdminRemoved(account); } }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "metadata": { "useLiteralContent": true }, "libraries": {} }
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"MinterAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"MinterRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"WhitelistAdminAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"WhitelistAdminRemoved","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addWhitelistAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_owners","type":"address[]"},{"internalType":"uint256[]","name":"_ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseMetadataURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"minId","type":"uint256"},{"internalType":"uint256","name":"maxId","type":"uint256"}],"name":"batchGetBattleCardStats","outputs":[{"components":[{"internalType":"uint16","name":"element","type":"uint16"},{"internalType":"uint16","name":"hp","type":"uint16"},{"internalType":"uint16","name":"speed","type":"uint16"},{"internalType":"uint16","name":"intelligence","type":"uint16"},{"internalType":"uint16","name":"defense","type":"uint16"},{"internalType":"uint16","name":"attack","type":"uint16"},{"internalType":"uint16","name":"specialAttack","type":"uint16"},{"internalType":"uint16","name":"specialDefense","type":"uint16"},{"internalType":"uint16","name":"level","type":"uint16"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"string","name":"ipfsAddr","type":"string"},{"internalType":"string","name":"rarity","type":"string"}],"internalType":"struct PepemonStats.BattleCardStats[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"minId","type":"uint256"},{"internalType":"uint256","name":"maxId","type":"uint256"}],"name":"batchGetSupportCardStats","outputs":[{"components":[{"internalType":"bytes32","name":"currentRoundChanges","type":"bytes32"},{"internalType":"bytes32","name":"nextRoundChanges","type":"bytes32"},{"internalType":"uint256","name":"specialCode","type":"uint256"},{"internalType":"uint16","name":"modifierNumberOfNextTurns","type":"uint16"},{"internalType":"bool","name":"isOffense","type":"bool"},{"internalType":"bool","name":"isNormal","type":"bool"},{"internalType":"bool","name":"isStackable","type":"bool"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"string","name":"ipfsAddr","type":"string"},{"internalType":"string","name":"rarity","type":"string"}],"internalType":"struct PepemonStats.SupportCardStats[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"batchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"address","name":"to","type":"address"}],"name":"batchMintList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"battleCardStats","outputs":[{"internalType":"uint16","name":"element","type":"uint16"},{"internalType":"uint16","name":"hp","type":"uint16"},{"internalType":"uint16","name":"speed","type":"uint16"},{"internalType":"uint16","name":"intelligence","type":"uint16"},{"internalType":"uint16","name":"defense","type":"uint16"},{"internalType":"uint16","name":"attack","type":"uint16"},{"internalType":"uint16","name":"specialAttack","type":"uint16"},{"internalType":"uint16","name":"specialDefense","type":"uint16"},{"internalType":"uint16","name":"level","type":"uint16"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"string","name":"ipfsAddr","type":"string"},{"internalType":"string","name":"rarity","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"int16[14]","name":"arr","type":"int16[14]"}],"name":"convert","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"components":[{"internalType":"uint16","name":"element","type":"uint16"},{"internalType":"uint16","name":"hp","type":"uint16"},{"internalType":"uint16","name":"speed","type":"uint16"},{"internalType":"uint16","name":"intelligence","type":"uint16"},{"internalType":"uint16","name":"defense","type":"uint16"},{"internalType":"uint16","name":"attack","type":"uint16"},{"internalType":"uint16","name":"specialAttack","type":"uint16"},{"internalType":"uint16","name":"specialDefense","type":"uint16"},{"internalType":"uint16","name":"level","type":"uint16"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"string","name":"ipfsAddr","type":"string"},{"internalType":"string","name":"rarity","type":"string"}],"internalType":"struct PepemonStats.BattleCardStats","name":"_stats","type":"tuple"},{"internalType":"uint256","name":"_maxSupply","type":"uint256"},{"internalType":"uint256","name":"_initialSupply","type":"uint256"},{"internalType":"string","name":"_uri","type":"string"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"createBattleCard","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"currentRoundChanges","type":"bytes32"},{"internalType":"bytes32","name":"nextRoundChanges","type":"bytes32"},{"internalType":"uint256","name":"specialCode","type":"uint256"},{"internalType":"uint16","name":"modifierNumberOfNextTurns","type":"uint16"},{"internalType":"bool","name":"isOffense","type":"bool"},{"internalType":"bool","name":"isNormal","type":"bool"},{"internalType":"bool","name":"isStackable","type":"bool"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"string","name":"ipfsAddr","type":"string"},{"internalType":"string","name":"rarity","type":"string"}],"internalType":"struct PepemonStats.SupportCardStats","name":"_stats","type":"tuple"},{"internalType":"uint256","name":"_maxSupply","type":"uint256"},{"internalType":"uint256","name":"_initialSupply","type":"uint256"},{"internalType":"string","name":"_uri","type":"string"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"createSupportCard","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"creators","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"num","type":"bytes32"}],"name":"deconvert","outputs":[{"internalType":"int16[14]","name":"","type":"int16[14]"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"elementDecode","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"endMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getLastTokenID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"isOperator","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isWhitelistAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint256","name":"_quantity","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeWhitelistAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceWhitelistAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256[]","name":"_ids","type":"uint256[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newURI","type":"string"}],"name":"setBaseMetadataURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"components":[{"internalType":"uint16","name":"element","type":"uint16"},{"internalType":"uint16","name":"hp","type":"uint16"},{"internalType":"uint16","name":"speed","type":"uint16"},{"internalType":"uint16","name":"intelligence","type":"uint16"},{"internalType":"uint16","name":"defense","type":"uint16"},{"internalType":"uint16","name":"attack","type":"uint16"},{"internalType":"uint16","name":"specialAttack","type":"uint16"},{"internalType":"uint16","name":"specialDefense","type":"uint16"},{"internalType":"uint16","name":"level","type":"uint16"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"string","name":"ipfsAddr","type":"string"},{"internalType":"string","name":"rarity","type":"string"}],"internalType":"struct PepemonStats.BattleCardStats","name":"x","type":"tuple"}],"name":"setBattleCardStats","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newURI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"element","type":"uint16"},{"internalType":"string","name":"x","type":"string"}],"name":"setElementDecode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"components":[{"internalType":"bytes32","name":"currentRoundChanges","type":"bytes32"},{"internalType":"bytes32","name":"nextRoundChanges","type":"bytes32"},{"internalType":"uint256","name":"specialCode","type":"uint256"},{"internalType":"uint16","name":"modifierNumberOfNextTurns","type":"uint16"},{"internalType":"bool","name":"isOffense","type":"bool"},{"internalType":"bool","name":"isNormal","type":"bool"},{"internalType":"bool","name":"isStackable","type":"bool"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"string","name":"ipfsAddr","type":"string"},{"internalType":"string","name":"rarity","type":"string"}],"internalType":"struct PepemonStats.SupportCardStats","name":"x","type":"tuple"}],"name":"setSupportCardStats","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"element","type":"uint16"},{"components":[{"internalType":"uint16","name":"weakness","type":"uint16"},{"internalType":"uint16","name":"resistance","type":"uint16"}],"internalType":"struct PepemonStats.elementWR","name":"x","type":"tuple"}],"name":"setWeakResist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"supportCardStats","outputs":[{"internalType":"bytes32","name":"currentRoundChanges","type":"bytes32"},{"internalType":"bytes32","name":"nextRoundChanges","type":"bytes32"},{"internalType":"uint256","name":"specialCode","type":"uint256"},{"internalType":"uint16","name":"modifierNumberOfNextTurns","type":"uint16"},{"internalType":"bool","name":"isOffense","type":"bool"},{"internalType":"bool","name":"isNormal","type":"bool"},{"internalType":"bool","name":"isStackable","type":"bool"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"string","name":"ipfsAddr","type":"string"},{"internalType":"string","name":"rarity","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"weakResist","outputs":[{"internalType":"uint16","name":"weakness","type":"uint16"},{"internalType":"uint16","name":"resistance","type":"uint16"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405260006009553480156200001657600080fd5b506040518060400160405280601481526020017f506570656d6f6e426174746c65466163746f72790000000000000000000000008152506040518060400160405280600a81526020016950455045424154544c4560b01b8152506200008a620000846200080360201b60201c565b62000807565b620000953362000859565b620000a033620008ab565b620000bf73104e989923417d765215b48e03baa4af222f3f6d620008ab565b6040805180820190915260048152634669726560e01b6020808301918252600160005260079052905162000115917fb39221ace053465ec3453ce2b36430bd138b997ecea25c1043da0c366812b8289162000a1f565b50604080518082019091526005815264477261737360d81b602080830191825260026000526007905290516200016d917fb7c774451310d1be4108bc180d1b52823cb0ee0274a6c0081bcaf94f115fb96d9162000a1f565b506040805180820190915260058152642bb0ba32b960d91b60208083019182526003600052600790529051620001c5917f3be6fd20d5acfde5b873b48692cd31f4d3c7e8ee8a813af4696af8859e5ca6c69162000a1f565b506040805180820190915260088152674c69676874696e6760c01b6020808301918252600460005260079052905162000220917fb805995a7ec585a251200611a61d179cfd7fb105e1ab17dc415a7336783786f79162000a1f565b5060408051808201909152600481526315da5b9960e21b6020808301918252600560005260079052905162000277917fbcdda56b5d08466ec462cbbe0adfa57cb0a15fcc8940ef68f702f21b787bc9359162000a1f565b50604080518082019091526006808252652837b4b9b7b760d11b602080840191825260009290925260079091529051620002d3917f55c5b153ab560fcde54a63b18c7f53d75501706907cef8767fbded79ab9997c79162000a1f565b5060408051808201909152600581526411da1bdcdd60da1b602080830191825260076000819052905290516200032b917fb7c49cceb9f85950584035457a41ebbd8cf93b9b612733ad25aa9731ac43aad69162000a1f565b50604080518082019091526005815264466169727960d81b6020808301918252600860005260079052905162000383917f4b1bf46c9f1bd48ff8274d40bad76a6615cb6c59a637d451a3994194b2db86be9162000a1f565b5060408051808201909152600581526408ac2e4e8d60db1b60208083019182526009600052600790529051620003db917ff1f3e9c34634a546b3672c043f73844d83d55591bbe61b8e7e3a72bca1a812bf9162000a1f565b50604080518082019091526007808252662ab735b737bbb760c91b6020808401918252600a60005291909152905162000436917f3ed157e83ab1bb1f6b7b3760b3368106283d4e15d1f1b08e20d06576445a99949162000a1f565b5060408051808201825260038082526002602080840182815260016000818152600880855296517fad67d757c34507f157cacfa2e3153e9f260a2244f30428821be7be64587ac55f8054945161ffff92831663ffffffff1996871617620100009184168202179091558951808b018b528481528087018981528885528a885290517f6add646517a5b0f6793cd5891b7937d28a5b2981a5d88ebc7cd776088fea9041805492519185169288169290921790841683021790558951808b018b526004808252818801958652988452898752517f625b35f5e76f098dd7c3a05b10e2e5e78a4a01228d60c3b143426cdf36d2645580549551918416958716959095179083168202179093558851808a018a52600980825260058288018181529985528a885291517f9321edea6e3be4df59a344b401fab4f888b556fda1f954244cff9204bad624b880549a519185169a88169a909a179084168602179098558951808b018b5260068082528188018a81529285528a885290517f91238f30f286c9a1c6e901c4eda3b214c381c846e3dbe48df95c21488e8e1fdb80549351918516938816939093179084168602179091558951808b018b528981528087018881528285528a885290517f13acf3fc7bed94759963f076d5d3443d88732026bffc8253bdf4a6e65f21ecc5805492519185169288169290921790841686021790558951808b018b5289815280870191825260078085528a885290517f24cd397636bedc6cf9b490d0edd57c769c19b367fb7d5c2344ae1ddc7d21c14480549351918516938816939093179084168602179091558951808b018b528181528087018a81528a85528a885290517fe4c2e8be66af8dd2d277000f4f830a10546f8b14e45cd850b875c98ba0f0d2cd805492519185169288169290921790841686021790558951808b018b5296875286860190815296825287855294517f82c9e868e45873bb5a4f47c09e14a12f6a6314e13aabd611e4374762bb4e8b3680549751918716978516979097179086168302179095558651808801909752848752868301858152600a90955294825294517f586689db7536874b78a6eac0f58556a56a106985743f7c16a699b27bb02f88bd805494519184169490961693909317929091169092021790915582516200078f91600d919085019062000a1f565b508051620007a590600e90602084019062000a1f565b505050620007cc60405180606001604052806022815260200162006ae260229139620008fd565b6040518060600160405280602b815260200162006ab7602b91398051620007fc9160109160209091019062000a1f565b5062000b02565b3390565b600280546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b620008748160036200091660201b620022a11790919060201c565b6040516001600160a01b038216907f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f690600090a250565b620008c68160046200091660201b620022a11790919060201c565b6040516001600160a01b038216907f22380c05984257a1cb900161c713dd71d39e74820f1aea43bd3f1bdd2096129990600090a250565b80516200091290600f90602084019062000a1f565b5050565b6200092282826200099a565b15620009755760405162461bcd60e51b815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c650060448201526064015b60405180910390fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b60006001600160a01b038216620009ff5760405162461bcd60e51b815260206004820152602260248201527f526f6c65733a206163636f756e7420697320746865207a65726f206164647265604482015261737360f01b60648201526084016200096c565b506001600160a01b03166000908152602091909152604090205460ff1690565b82805462000a2d9062000ac5565b90600052602060002090601f01602090048101928262000a51576000855562000a9c565b82601f1062000a6c57805160ff191683800117855562000a9c565b8280016001018555821562000a9c579182015b8281111562000a9c57825182559160200191906001019062000a7f565b5062000aaa92915062000aae565b5090565b5b8082111562000aaa576000815560010162000aaf565b600181811c9082168062000ada57607f821691505b6020821081141562000afc57634e487b7160e01b600052602260045260246000fd5b50919050565b615fa58062000b126000396000f3fe608060405234801561001057600080fd5b50600436106102b95760003560e01c8063731133e911610182578063a11bf921116100e9578063cd53d08e116100a2578063eaaaada31161007c578063eaaaada3146106ec578063f242432a146106ff578063f2fde38b14610712578063f5298aca1461072557600080fd5b8063cd53d08e146106a8578063e8a3d485146106d1578063e985e9c5146106d957600080fd5b8063a11bf92114610636578063a22cb46514610649578063aa271e1a1461065c578063bb5f747b1461066f578063bbe79cb514610682578063bdf7a8e61461069557600080fd5b80638da5cb5b1161013b5780638da5cb5b146105c8578063938e3d7b146105ed57806394dd28691461060057806395d89b4114610613578063983b2d561461061b578063986502751461062e57600080fd5b8063731133e91461053d5780637362d9c8146105505780637ad67d60146105635780637e518ec8146105765780637ed7f93b146105895780637faef6fd146105b557600080fd5b80633debfaca116102265780635b2bd79e116101df5780635b2bd79e146104ab578063600f4a7a146104b35780636897e974146104c65780636cc43e05146104d95780636d6055cd146104ec578063715018a61461053557600080fd5b80633debfaca146104205780633df39242146104335780633ef009ef146104465780634c5a628c146104595780634e1273f4146104615780634e84f9bb1461048157600080fd5b80631390053c116102785780631390053c1461037857806315da57841461039857806326586849146103b85780632693ebf2146103d85780632eb2c2d6146103f85780633092afd51461040d57600080fd5b80624221f0146102be578062fdd58e146102f157806301ffc9a71461032557806306fdde03146103485780630e0941371461035d5780630e89341c14610365575b600080fd5b6102de6102cc366004614824565b600c6020526000908152604090205481565b6040519081526020015b60405180910390f35b6102de6102ff366004614656565b6001600160a01b0391909116600090815260208181526040808320938352929052205490565b61033861033336600461483d565b610738565b60405190151581526020016102e8565b61035061077e565b6040516102e891906156fd565b6009546102de565b610350610373366004614824565b61080c565b61038b610386366004614824565b61087b565b6040516102e891906153a0565b6103ab6103a6366004614b2d565b6108dd565b6040516102e891906153d5565b6103cb6103c6366004614b2d565b610ceb565b6040516102e8919061550e565b6102de6103e6366004614824565b600b6020526000908152604090205481565b61040b610406366004614512565b6110bf565b005b61040b61041b3660046144c4565b6111ce565b6102de61042e366004614989565b611204565b6102de610441366004614776565b6112ba565b61040b610454366004614b4f565b611316565b61040b611378565b61047461046f366004614713565b611383565b6040516102e8919061561d565b61049461048f366004614824565b6114d5565b6040516102e89b9a9998979695949392919061565e565b61035061175e565b61040b6104c13660046147a1565b61176b565b61040b6104d43660046144c4565b6117e1565b61040b6104e7366004614a38565b611814565b61051a6104fa3660046149c7565b60086020526000908152604090205461ffff808216916201000090041682565b6040805161ffff9384168152929091166020830152016102e8565b61040b611858565b61040b61054b3660046146b3565b61188c565b61040b61055e3660046144c4565b6118bd565b61040b6105713660046149e4565b611901565b61040b61058436600461489a565b611944565b61059c610597366004614824565b611972565b6040516102e89d9c9b9a999897969594939291906157bb565b61040b6105c3366004614af1565b611c19565b6002546001600160a01b03165b6040516001600160a01b0390911681526020016102e8565b61040b6105fb36600461489a565b611c58565b61040b61060e366004614824565b611c94565b610350611cd6565b61040b6106293660046144c4565b611ce3565b61040b611d27565b61040b610644366004614ab5565b611d30565b61040b61065736600461461f565b611d6f565b61033861066a3660046144c4565b611ddb565b61033861067d3660046144c4565b611de8565b6102de6106903660046148e2565b611df5565b61040b6106a3366004614a79565b611e9f565b6105d56106b6366004614824565b600a602052600090815260409020546001600160a01b031681565b610350611f91565b6103386106e73660046144df565b612023565b6103506106fa3660046149c7565b612051565b61040b61070d3660046145bb565b61206a565b61040b6107203660046144c4565b612168565b61040b610733366004614680565b612200565b60006001600160e01b031982166301ffc9a760e01b148061076957506001600160e01b03198216636cdb3d1360e11b145b1561077657506001919050565b506000919050565b600d805461078b90615aaa565b80601f01602080910402602001604051908101604052809291908181526020018280546107b790615aaa565b80156108045780601f106107d957610100808354040283529160200191610804565b820191906000526020600020905b8154815290600101906020018083116107e757829003601f168201915b505050505081565b6000818152600a60205260409020546060906001600160a01b031661086c5760405162461bcd60e51b81526020600482015260116024820152702727a722ac24a9aa22a72a2faa27a5a2a760791b60448201526064015b60405180910390fd5b6108758261231d565b92915050565b6108836141b6565b61088b6141b6565b60005b600e8110156108d65761ffff84168282600e81106108ae576108ae615b3a565b600192830b90920b6020909202015260109390931c92806108ce81615adf565b91505061088e565b5092915050565b6060818311156108ec57600080fd5b60006108f88484615962565b610903906001615917565b6001600160401b0381111561091a5761091a615b50565b6040519080825280602002602001820160405280156109b357816020015b604080516101a0810182526000808252602080830182905292820181905260608083018290526080830182905260a0830182905260c0830182905260e0830182905261010083019190915261012082018190526101408201819052610160820181905261018082015282526000199092019101816109385790505b509050835b838111610ce35760008181526005602090815260409182902082516101a081018452815461ffff8082168352620100008204811694830194909452600160201b8104841694820194909452600160301b840483166060820152600160401b840483166080820152600160501b8404831660a0820152600160601b8404831660c0820152600160701b8404831660e0820152600160801b90930490911661010083015260018101805461012084019190610a7090615aaa565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9c90615aaa565b8015610ae95780601f10610abe57610100808354040283529160200191610ae9565b820191906000526020600020905b815481529060010190602001808311610acc57829003601f168201915b50505050508152602001600282018054610b0290615aaa565b80601f0160208091040260200160405190810160405280929190818152602001828054610b2e90615aaa565b8015610b7b5780601f10610b5057610100808354040283529160200191610b7b565b820191906000526020600020905b815481529060010190602001808311610b5e57829003601f168201915b50505050508152602001600382018054610b9490615aaa565b80601f0160208091040260200160405190810160405280929190818152602001828054610bc090615aaa565b8015610c0d5780601f10610be257610100808354040283529160200191610c0d565b820191906000526020600020905b815481529060010190602001808311610bf057829003601f168201915b50505050508152602001600482018054610c2690615aaa565b80601f0160208091040260200160405190810160405280929190818152602001828054610c5290615aaa565b8015610c9f5780601f10610c7457610100808354040283529160200191610c9f565b820191906000526020600020905b815481529060010190602001808311610c8257829003601f168201915b505050505081525050828683610cb59190615962565b81518110610cc557610cc5615b3a565b60200260200101819052508080610cdb90615adf565b9150506109b8565b509392505050565b606081831115610cfa57600080fd5b6000610d068484615962565b610d11906001615917565b6001600160401b03811115610d2857610d28615b50565b604051908082528060200260200182016040528015610db157816020015b60408051610160810182526000808252602080830182905292820181905260608083018290526080830182905260a0830182905260c083019190915260e08201819052610100820181905261012082018190526101408201528252600019909201910181610d465790505b509050835b838111610ce35760008181526006602090815260409182902082516101608101845281548152600182015492810192909252600281015492820192909252600382015461ffff8116606083015260ff620100008204811615156080840152630100000082048116151560a0840152600160201b90910416151560c082015260048201805491929160e084019190610e4c90615aaa565b80601f0160208091040260200160405190810160405280929190818152602001828054610e7890615aaa565b8015610ec55780601f10610e9a57610100808354040283529160200191610ec5565b820191906000526020600020905b815481529060010190602001808311610ea857829003601f168201915b50505050508152602001600582018054610ede90615aaa565b80601f0160208091040260200160405190810160405280929190818152602001828054610f0a90615aaa565b8015610f575780601f10610f2c57610100808354040283529160200191610f57565b820191906000526020600020905b815481529060010190602001808311610f3a57829003601f168201915b50505050508152602001600682018054610f7090615aaa565b80601f0160208091040260200160405190810160405280929190818152602001828054610f9c90615aaa565b8015610fe95780601f10610fbe57610100808354040283529160200191610fe9565b820191906000526020600020905b815481529060010190602001808311610fcc57829003601f168201915b5050505050815260200160078201805461100290615aaa565b80601f016020809104026020016040519081016040528092919081815260200182805461102e90615aaa565b801561107b5780601f106110505761010080835404028352916020019161107b565b820191906000526020600020905b81548152906001019060200180831161105e57829003601f168201915b5050505050815250508286836110919190615962565b815181106110a1576110a1615b3a565b602002602001018190525080806110b790615adf565b915050610db6565b336001600160a01b03861614806110db57506110db8533612023565b61113f5760405162461bcd60e51b815260206004820152602f60248201527f45524331313535237361666542617463685472616e7366657246726f6d3a204960448201526e272b20a624a22fa7a822a920aa27a960891b6064820152608401610863565b6001600160a01b0384166111ae5760405162461bcd60e51b815260206004820152603060248201527f45524331313535237361666542617463685472616e7366657246726f6d3a204960448201526f13959053125117d49150d2541251539560821b6064820152608401610863565b6111ba85858585612356565b6111c785858585856125ce565b5050505050565b6002546001600160a01b031633146111f85760405162461bcd60e51b815260040161086390615786565b611201816126f7565b50565b600061120f33611de8565b61122b5760405162461bcd60e51b815260040161086390615710565b60006112a2888888888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8c018190048102820181019092528a815292508a915089908190840183828082843760009201919091525061273992505050565b90506112ae818a611c19565b98975050505050505050565b60008060005b600e8110156108d6576112d4816010615943565b8482600e81106112e6576112e6615b3a565b6020020160208101906112f99190614877565b61ffff16901b91909117908061130e81615adf565b9150506112c0565b61131f33611ddb565b61133b5760405162461bcd60e51b815260040161086390615736565b825b8281116113725761136082826001604051806020016040528060008152506127f8565b8061136a81615adf565b91505061133d565b50505050565b611381336128ab565b565b606081518351146113eb5760405162461bcd60e51b815260206004820152602c60248201527f455243313135352362616c616e63654f6642617463683a20494e56414c49445f60448201526b082a4a482b2be988a9c8ea8960a31b6064820152608401610863565b600083516001600160401b0381111561140657611406615b50565b60405190808252806020026020018201604052801561142f578160200160208202803683370190505b50905060005b8451811015610ce35760008086838151811061145357611453615b3a565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020600085838151811061148f5761148f615b3a565b60200260200101518152602001908152602001600020548282815181106114b8576114b8615b3a565b6020908102919091010152806114cd81615adf565b915050611435565b6006602052600090815260409020805460018201546002830154600384015460048501805494959394929361ffff83169360ff62010000850481169463010000008104821694600160201b909104909116929161153190615aaa565b80601f016020809104026020016040519081016040528092919081815260200182805461155d90615aaa565b80156115aa5780601f1061157f576101008083540402835291602001916115aa565b820191906000526020600020905b81548152906001019060200180831161158d57829003601f168201915b5050505050908060050180546115bf90615aaa565b80601f01602080910402602001604051908101604052809291908181526020018280546115eb90615aaa565b80156116385780601f1061160d57610100808354040283529160200191611638565b820191906000526020600020905b81548152906001019060200180831161161b57829003601f168201915b50505050509080600601805461164d90615aaa565b80601f016020809104026020016040519081016040528092919081815260200182805461167990615aaa565b80156116c65780601f1061169b576101008083540402835291602001916116c6565b820191906000526020600020905b8154815290600101906020018083116116a957829003601f168201915b5050505050908060070180546116db90615aaa565b80601f016020809104026020016040519081016040528092919081815260200182805461170790615aaa565b80156117545780601f1061172957610100808354040283529160200191611754565b820191906000526020600020905b81548152906001019060200180831161173757829003601f168201915b505050505090508b565b600f805461078b90615aaa565b61177433611ddb565b6117905760405162461bcd60e51b815260040161086390615736565b8160005b8181116111c7576117cf838686848181106117b1576117b1615b3a565b905060200201356001604051806020016040528060008152506127f8565b806117d981615adf565b915050611794565b6002546001600160a01b0316331461180b5760405162461bcd60e51b815260040161086390615786565b611201816128ab565b61181d33611de8565b6118395760405162461bcd60e51b815260040161086390615710565b61ffff8216600090815260086020526040902081906113728282615eb6565b6002546001600160a01b031633146118825760405162461bcd60e51b815260040161086390615786565b61138160006128ed565b61189533611ddb565b6118b15760405162461bcd60e51b815260040161086390615736565b611372848484846127f8565b6118c633611de8565b6118e25760405162461bcd60e51b815260040161086390615710565b6001600160a01b0381163014156118f857600080fd5b6112018161293f565b61190a33611de8565b6119265760405162461bcd60e51b815260040161086390615710565b61ffff831660009081526007602052604090206113729083836141d5565b61194d33611de8565b6119695760405162461bcd60e51b815260040161086390615710565b61120181612981565b6005602052600090815260409020805460018201805461ffff80841694620100008504821694600160201b8104831694600160301b8204841694600160401b8304851694600160501b8404811694600160601b8504821694600160701b8104831694600160801b909104909216929091906119ec90615aaa565b80601f0160208091040260200160405190810160405280929190818152602001828054611a1890615aaa565b8015611a655780601f10611a3a57610100808354040283529160200191611a65565b820191906000526020600020905b815481529060010190602001808311611a4857829003601f168201915b505050505090806002018054611a7a90615aaa565b80601f0160208091040260200160405190810160405280929190818152602001828054611aa690615aaa565b8015611af35780601f10611ac857610100808354040283529160200191611af3565b820191906000526020600020905b815481529060010190602001808311611ad657829003601f168201915b505050505090806003018054611b0890615aaa565b80601f0160208091040260200160405190810160405280929190818152602001828054611b3490615aaa565b8015611b815780601f10611b5657610100808354040283529160200191611b81565b820191906000526020600020905b815481529060010190602001808311611b6457829003601f168201915b505050505090806004018054611b9690615aaa565b80601f0160208091040260200160405190810160405280929190818152602001828054611bc290615aaa565b8015611c0f5780601f10611be457610100808354040283529160200191611c0f565b820191906000526020600020905b815481529060010190602001808311611bf257829003601f168201915b505050505090508d565b611c2233611de8565b611c3e5760405162461bcd60e51b815260040161086390615710565b600082815260066020526040902081906113728282615d8e565b611c6133611de8565b611c7d5760405162461bcd60e51b815260040161086390615710565b8051611c90906010906020840190614259565b5050565b611c9d33611de8565b611cb95760405162461bcd60e51b815260040161086390615710565b6000908152600b6020908152604080832054600c90925290912055565b600e805461078b90615aaa565b611cec33611ddb565b611d085760405162461bcd60e51b815260040161086390615736565b6001600160a01b038116301415611d1e57600080fd5b61120181612994565b611381336126f7565b611d3933611de8565b611d555760405162461bcd60e51b815260040161086390615710565b600082815260056020526040902081906113728282615b80565b3360008181526001602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60006108756003836129d6565b60006108756004836129d6565b6000611e0033611de8565b611e1c5760405162461bcd60e51b815260040161086390615710565b6000611e93888888888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8c018190048102820181019092528a815292508a915089908190840183828082843760009201919091525061273992505050565b90506112ae818a611d30565b611ea833611ddb565b611ec45760405162461bcd60e51b815260040161086390615736565b80516000838152600b6020908152604080832054600c90925290912054611eeb9190615962565b1015611f395760405162461bcd60e51b815260206004820152601a60248201527f43616e74206d696e742061626f7665206d617820737570706c790000000000006044820152606401610863565b60005b8151811015611f8c57611f7a828281518110611f5a57611f5a615b3a565b60200260200101518460016040518060200160405280600081525061188c565b80611f8481615adf565b915050611f3c565b505050565b606060108054611fa090615aaa565b80601f0160208091040260200160405190810160405280929190818152602001828054611fcc90615aaa565b80156120195780601f10611fee57610100808354040283529160200191612019565b820191906000526020600020905b815481529060010190602001808311611ffc57829003601f168201915b5050505050905090565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b6007602052600090815260409020805461078b90615aaa565b336001600160a01b038616148061208657506120868533612023565b6120e55760405162461bcd60e51b815260206004820152602a60248201527f4552433131353523736166655472616e7366657246726f6d3a20494e56414c49604482015269222fa7a822a920aa27a960b11b6064820152608401610863565b6001600160a01b03841661214f5760405162461bcd60e51b815260206004820152602b60248201527f4552433131353523736166655472616e7366657246726f6d3a20494e56414c4960448201526a1117d49150d2541251539560aa1b6064820152608401610863565b61215b85858585612a59565b6111c78585858585612b35565b6002546001600160a01b031633146121925760405162461bcd60e51b815260040161086390615786565b6001600160a01b0381166121f75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610863565b611201816128ed565b61220933611ddb565b6122255760405162461bcd60e51b815260040161086390615736565b6001600160a01b0383166000908152602081815260408083208584529091529020548111156122965760405162461bcd60e51b815260206004820152601960248201527f457863656564656420617661696c61626c6520616d6f756e74000000000000006044820152606401610863565b611f8c838383612c56565b6122ab82826129d6565b156122f85760405162461bcd60e51b815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c65006044820152606401610863565b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b606061233061232b83612ce7565b612d4c565b60405160200161234091906152c4565b6040516020818303038152906040529050919050565b80518251146123c55760405162461bcd60e51b815260206004820152603560248201527f45524331313535235f7361666542617463685472616e7366657246726f6d3a206044820152740929cac82989288be82a4a482b2a6be988a9c8ea89605b1b6064820152608401610863565b815160005b8181101561256f578281815181106123e4576123e4615b3a565b6020026020010151600080886001600160a01b03166001600160a01b03168152602001908152602001600020600086848151811061242457612424615b3a565b60200260200101518152602001908152602001600020546124459190615962565b600080886001600160a01b03166001600160a01b03168152602001908152602001600020600086848151811061247d5761247d615b3a565b60200260200101518152602001908152602001600020819055508281815181106124a9576124a9615b3a565b6020026020010151600080876001600160a01b03166001600160a01b0316815260200190815260200160002060008684815181106124e9576124e9615b3a565b602002602001015181526020019081526020016000205461250a9190615917565b600080876001600160a01b03166001600160a01b03168152602001908152602001600020600086848151811061254257612542615b3a565b6020026020010151815260200190815260200160002081905550808061256790615adf565b9150506123ca565b50836001600160a01b0316856001600160a01b0316336001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb86866040516125bf929190615630565b60405180910390a45050505050565b6001600160a01b0384163b156111c75760405163bc197c8160e01b81526000906001600160a01b0386169063bc197c81906126159033908a90899089908990600401615309565b602060405180830381600087803b15801561262f57600080fd5b505af1158015612643573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612667919061485a565b90506001600160e01b0319811663bc197c8160e01b146126ef5760405162461bcd60e51b815260206004820152603f60248201527f45524331313535235f63616c6c6f6e455243313135354261746368526563656960448201527f7665643a20494e56414c49445f4f4e5f524543454956455f4d455353414745006064820152608401610863565b505050505050565b612702600382612eb1565b6040516001600160a01b038216907fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb6669290600090a250565b60008484111561274857600080fd5b6009805490600061275883615adf565b90915550506009546000818152600a6020526040902080546001600160a01b031916331790558351156127be57807f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b856040516127b591906156fd565b60405180910390a25b84156127d0576127d033828786612f33565b6000818152600b60209081526040808320889055600c90915290208690559050949350505050565b6000838152600b6020526040812054849190612815908590615917565b6000838152600c602052604090205490915081111561286b5760405162461bcd60e51b815260206004820152601260248201527113585e081cdd5c1c1b1e481c995858da195960721b6044820152606401610863565b61287786868686612f33565b6000858152600b6020526040902054612891908590615917565b6000958652600b6020526040909520949094555050505050565b6128b6600482612eb1565b6040516001600160a01b038216907f0a8eb35e5ca14b3d6f28e4abf2f128dbab231a58b56e89beb5d636115001e16590600090a250565b600280546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61294a6004826122a1565b6040516001600160a01b038216907f22380c05984257a1cb900161c713dd71d39e74820f1aea43bd3f1bdd2096129990600090a250565b8051611c9090600f906020840190614259565b61299f6003826122a1565b6040516001600160a01b038216907f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f690600090a250565b60006001600160a01b038216612a395760405162461bcd60e51b815260206004820152602260248201527f526f6c65733a206163636f756e7420697320746865207a65726f206164647265604482015261737360f01b6064820152608401610863565b506001600160a01b03166000908152602091909152604090205460ff1690565b6001600160a01b038416600090815260208181526040808320858452909152902054612a86908290615962565b6001600160a01b0380861660009081526020818152604080832087845282528083209490945591861681528082528281208582529091522054612aca908290615917565b6001600160a01b0384811660008181526020818152604080832088845282529182902094909455805186815293840185905290929187169133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a450505050565b6001600160a01b0384163b156111c75760405163f23a6e6160e01b81526000906001600160a01b0386169063f23a6e6190612b7c9033908a9089908990899060040161535b565b602060405180830381600087803b158015612b9657600080fd5b505af1158015612baa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bce919061485a565b90506001600160e01b0319811663f23a6e6160e01b146126ef5760405162461bcd60e51b815260206004820152603a60248201527f45524331313535235f63616c6c6f6e4552433131353552656365697665643a2060448201527f494e56414c49445f4f4e5f524543454956455f4d4553534147450000000000006064820152608401610863565b6001600160a01b038316600090815260208181526040808320858452909152902054612c83908290615962565b6001600160a01b0384166000818152602081815260408083208784528252808320949094558351868152908101859052909233917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4505050565b60008181526005602052604090205460609062010000900461ffff16612d105761087582612fcf565b612d19826132ea565b612d2283613649565b612d2b84613994565b612d3485613ccb565b6040516020016123409493929190614ce2565b919050565b805160609080612d6c575050604080516020810190915260008152919050565b60006003612d7b836002615917565b612d85919061592f565b612d90906004615943565b90506000612d9f826020615917565b6001600160401b03811115612db657612db6615b50565b6040519080825280601f01601f191660200182016040528015612de0576020820181803683370190505b5090506000604051806060016040528060408152602001615f30604091399050600181016020830160005b86811015612e6c576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b835260049092019101612e0b565b506003860660018114612e865760028114612e9757612ea3565b613d3d60f01b600119830152612ea3565b603d60f81b6000198301525b505050918152949350505050565b612ebb82826129d6565b612f115760405162461bcd60e51b815260206004820152602160248201527f526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c6044820152606560f81b6064820152608401610863565b6001600160a01b0316600090815260209190915260409020805460ff19169055565b6001600160a01b038416600090815260208181526040808320868452909152902054612f60908390615917565b6001600160a01b03851660008181526020818152604080832088845282528083209490945583518781529081018690529192909133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611372600085858585612b35565b600081815260066020908152604080832081516101608101835281548152600182015493810193909352600281015491830191909152600381015461ffff811660608481019190915260ff620100008304811615156080860152630100000083048116151560a0860152600160201b909204909116151560c0840152600482018054919493929160e08401919061306590615aaa565b80601f016020809104026020016040519081016040528092919081815260200182805461309190615aaa565b80156130de5780601f106130b3576101008083540402835291602001916130de565b820191906000526020600020905b8154815290600101906020018083116130c157829003601f168201915b505050505081526020016005820180546130f790615aaa565b80601f016020809104026020016040519081016040528092919081815260200182805461312390615aaa565b80156131705780601f1061314557610100808354040283529160200191613170565b820191906000526020600020905b81548152906001019060200180831161315357829003601f168201915b5050505050815260200160068201805461318990615aaa565b80601f01602080910402602001604051908101604052809291908181526020018280546131b590615aaa565b80156132025780601f106131d757610100808354040283529160200191613202565b820191906000526020600020905b8154815290600101906020018083116131e557829003601f168201915b5050505050815260200160078201805461321b90615aaa565b80601f016020809104026020016040519081016040528092919081815260200182805461324790615aaa565b80156132945780601f1061326957610100808354040283529160200191613294565b820191906000526020600020905b81548152906001019060200180831161327757829003601f168201915b50505050508152505090508061012001518160e001518261010001518361014001516132bf85614002565b6040516020016132d3959493929190614f76565b604051602081830303815290604052915050919050565b600081815260056020908152604080832081516101a081018352815461ffff8082168352620100008204811695830195909552600160201b8104851693820193909352600160301b83048416606082810191909152600160401b840485166080830152600160501b8404851660a0830152600160601b8404851660c0830152600160701b8404851660e0830152600160801b90930490931661010084015260018101805492949392610120840191906133a290615aaa565b80601f01602080910402602001604051908101604052809291908181526020018280546133ce90615aaa565b801561341b5780601f106133f05761010080835404028352916020019161341b565b820191906000526020600020905b8154815290600101906020018083116133fe57829003601f168201915b5050505050815260200160028201805461343490615aaa565b80601f016020809104026020016040519081016040528092919081815260200182805461346090615aaa565b80156134ad5780601f10613482576101008083540402835291602001916134ad565b820191906000526020600020905b81548152906001019060200180831161349057829003601f168201915b505050505081526020016003820180546134c690615aaa565b80601f01602080910402602001604051908101604052809291908181526020018280546134f290615aaa565b801561353f5780601f106135145761010080835404028352916020019161353f565b820191906000526020600020905b81548152906001019060200180831161352257829003601f168201915b5050505050815260200160048201805461355890615aaa565b80601f016020809104026020016040519081016040528092919081815260200182805461358490615aaa565b80156135d15780601f106135a6576101008083540402835291602001916135d1565b820191906000526020600020905b8154815290600101906020018083116135b457829003601f168201915b505050505081525050905060008160000151905081610160015182610120015183610140015161360985610100015161ffff166140b1565b61ffff8516600090815260076020908152604091829020915161363196959493929101614df9565b60405160208183030381529060405292505050919050565b600081815260056020908152604080832081516101a081018352815461ffff8082168352620100008204811695830195909552600160201b8104851693820193909352600160301b83048416606082810191909152600160401b840485166080830152600160501b8404851660a0830152600160601b8404851660c0830152600160701b8404851660e0830152600160801b909304909316610100840152600181018054929493926101208401919061370190615aaa565b80601f016020809104026020016040519081016040528092919081815260200182805461372d90615aaa565b801561377a5780601f1061374f5761010080835404028352916020019161377a565b820191906000526020600020905b81548152906001019060200180831161375d57829003601f168201915b5050505050815260200160028201805461379390615aaa565b80601f01602080910402602001604051908101604052809291908181526020018280546137bf90615aaa565b801561380c5780601f106137e15761010080835404028352916020019161380c565b820191906000526020600020905b8154815290600101906020018083116137ef57829003601f168201915b5050505050815260200160038201805461382590615aaa565b80601f016020809104026020016040519081016040528092919081815260200182805461385190615aaa565b801561389e5780601f106138735761010080835404028352916020019161389e565b820191906000526020600020905b81548152906001019060200180831161388157829003601f168201915b505050505081526020016004820180546138b790615aaa565b80601f01602080910402602001604051908101604052809291908181526020018280546138e390615aaa565b80156139305780601f1061390557610100808354040283529160200191613930565b820191906000526020600020905b81548152906001019060200180831161391357829003601f168201915b505050919092525050815161ffff8082166000908152600860209081526040808320548085168452600783528184206201000090910485168452922090860151959650929490935061398291166140b1565b60405160200161363193929190614d68565b600081815260056020908152604080832081516101a081018352815461ffff8082168352620100008204811695830195909552600160201b8104851693820193909352600160301b83048416606082810191909152600160401b840485166080830152600160501b8404851660a0830152600160601b8404851660c0830152600160701b8404851660e0830152600160801b9093049093166101008401526001810180549294939261012084019190613a4c90615aaa565b80601f0160208091040260200160405190810160405280929190818152602001828054613a7890615aaa565b8015613ac55780601f10613a9a57610100808354040283529160200191613ac5565b820191906000526020600020905b815481529060010190602001808311613aa857829003601f168201915b50505050508152602001600282018054613ade90615aaa565b80601f0160208091040260200160405190810160405280929190818152602001828054613b0a90615aaa565b8015613b575780601f10613b2c57610100808354040283529160200191613b57565b820191906000526020600020905b815481529060010190602001808311613b3a57829003601f168201915b50505050508152602001600382018054613b7090615aaa565b80601f0160208091040260200160405190810160405280929190818152602001828054613b9c90615aaa565b8015613be95780601f10613bbe57610100808354040283529160200191613be9565b820191906000526020600020905b815481529060010190602001808311613bcc57829003601f168201915b50505050508152602001600482018054613c0290615aaa565b80601f0160208091040260200160405190810160405280929190818152602001828054613c2e90615aaa565b8015613c7b5780601f10613c5057610100808354040283529160200191613c7b565b820191906000526020600020905b815481529060010190602001808311613c5e57829003601f168201915b5050505050815250509050613c97816040015161ffff166140b1565b613ca8826060015161ffff166140b1565b613cb9836080015161ffff166140b1565b6040516020016132d3939291906151e8565b600081815260056020908152604080832081516101a081018352815461ffff8082168352620100008204811695830195909552600160201b8104851693820193909352600160301b83048416606082810191909152600160401b840485166080830152600160501b8404851660a0830152600160601b8404851660c0830152600160701b8404851660e0830152600160801b9093049093166101008401526001810180549294939261012084019190613d8390615aaa565b80601f0160208091040260200160405190810160405280929190818152602001828054613daf90615aaa565b8015613dfc5780601f10613dd157610100808354040283529160200191613dfc565b820191906000526020600020905b815481529060010190602001808311613ddf57829003601f168201915b50505050508152602001600282018054613e1590615aaa565b80601f0160208091040260200160405190810160405280929190818152602001828054613e4190615aaa565b8015613e8e5780601f10613e6357610100808354040283529160200191613e8e565b820191906000526020600020905b815481529060010190602001808311613e7157829003601f168201915b50505050508152602001600382018054613ea790615aaa565b80601f0160208091040260200160405190810160405280929190818152602001828054613ed390615aaa565b8015613f205780601f10613ef557610100808354040283529160200191613f20565b820191906000526020600020905b815481529060010190602001808311613f0357829003601f168201915b50505050508152602001600482018054613f3990615aaa565b80601f0160208091040260200160405190810160405280929190818152602001828054613f6590615aaa565b8015613fb25780601f10613f8757610100808354040283529160200191613fb2565b820191906000526020600020905b815481529060010190602001808311613f9557829003601f168201915b5050505050815250509050613fce8160a0015161ffff166140b1565b613fdf8260c0015161ffff166140b1565b613ff08360e0015161ffff166140b1565b6040516020016132d3939291906150e9565b604080518082018252600881526702232b332b739b2960c51b60208083019190915282518084019093526009835268285370656369616c2960b81b90830152608083015160609290156140735760405180604001604052806008815260200167027b33332b739b2960c51b81525091505b8360a001511561409e5750604080518082019091526008815267284e6f726d616c2960c01b60208201525b8181604051602001613631929190614d39565b6060816140d55750506040805180820190915260018152600360fc1b602082015290565b8160005b81156140ff57806140e981615adf565b91506140f89050600a8361592f565b91506140d9565b6000816001600160401b0381111561411957614119615b50565b6040519080825280601f01601f191660200182016040528015614143576020820181803683370190505b5090505b84156141ae57614158600183615962565b9150614165600a86615afa565b614170906030615917565b60f81b81838151811061418557614185615b3a565b60200101906001600160f81b031916908160001a9053506141a7600a8661592f565b9450614147565b949350505050565b604051806101c00160405280600e906020820280368337509192915050565b8280546141e190615aaa565b90600052602060002090601f0160209004810192826142035760008555614249565b82601f1061421c5782800160ff19823516178555614249565b82800160010185558215614249579182015b8281111561424957823582559160200191906001019061422e565b506142559291506142cd565b5090565b82805461426590615aaa565b90600052602060002090601f0160209004810192826142875760008555614249565b82601f106142a057805160ff1916838001178555614249565b82800160010185558215614249579182015b828111156142495782518255916020019190600101906142b2565b5b8082111561425557600081556001016142ce565b60006001600160401b038311156142fb576142fb615b50565b61430e601f8401601f19166020016158c4565b905082815283838301111561432257600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b0381168114612d4757600080fd5b600082601f83011261436157600080fd5b81356020614376614371836158f4565b6158c4565b80838252828201915082860187848660051b890101111561439657600080fd5b60005b858110156143bc576143aa82614339565b84529284019290840190600101614399565b5090979650505050505050565b600082601f8301126143da57600080fd5b813560206143ea614371836158f4565b80838252828201915082860187848660051b890101111561440a57600080fd5b60005b858110156143bc5781358452928401929084019060010161440d565b60008083601f84011261443b57600080fd5b5081356001600160401b0381111561445257600080fd5b60208301915083602082850101111561446a57600080fd5b9250929050565b600082601f83011261448257600080fd5b614491838335602085016142e2565b9392505050565b60006101a082840312156144ab57600080fd5b50919050565b600061016082840312156144ab57600080fd5b6000602082840312156144d657600080fd5b61449182614339565b600080604083850312156144f257600080fd5b6144fb83614339565b915061450960208401614339565b90509250929050565b600080600080600060a0868803121561452a57600080fd5b61453386614339565b945061454160208701614339565b935060408601356001600160401b038082111561455d57600080fd5b61456989838a016143c9565b9450606088013591508082111561457f57600080fd5b61458b89838a016143c9565b935060808801359150808211156145a157600080fd5b506145ae88828901614471565b9150509295509295909350565b600080600080600060a086880312156145d357600080fd5b6145dc86614339565b94506145ea60208701614339565b9350604086013592506060860135915060808601356001600160401b0381111561461357600080fd5b6145ae88828901614471565b6000806040838503121561463257600080fd5b61463b83614339565b9150602083013561464b81615efb565b809150509250929050565b6000806040838503121561466957600080fd5b61467283614339565b946020939093013593505050565b60008060006060848603121561469557600080fd5b61469e84614339565b95602085013595506040909401359392505050565b600080600080608085870312156146c957600080fd5b6146d285614339565b9350602085013592506040850135915060608501356001600160401b038111156146fb57600080fd5b61470787828801614471565b91505092959194509250565b6000806040838503121561472657600080fd5b82356001600160401b038082111561473d57600080fd5b61474986838701614350565b9350602085013591508082111561475f57600080fd5b5061476c858286016143c9565b9150509250929050565b60006101c080838503121561478a57600080fd5b83818401111561479957600080fd5b509092915050565b6000806000604084860312156147b657600080fd5b83356001600160401b03808211156147cd57600080fd5b818601915086601f8301126147e157600080fd5b8135818111156147f057600080fd5b8760208260051b850101111561480557600080fd5b60209283019550935061481b9186019050614339565b90509250925092565b60006020828403121561483657600080fd5b5035919050565b60006020828403121561484f57600080fd5b813561449181615f09565b60006020828403121561486c57600080fd5b815161449181615f09565b60006020828403121561488957600080fd5b81358060010b811461449157600080fd5b6000602082840312156148ac57600080fd5b81356001600160401b038111156148c257600080fd5b8201601f810184136148d357600080fd5b6141ae848235602084016142e2565b600080600080600080600060a0888a0312156148fd57600080fd5b87356001600160401b038082111561491457600080fd5b6149208b838c01614498565b985060208a0135975060408a0135965060608a013591508082111561494457600080fd5b6149508b838c01614429565b909650945060808a013591508082111561496957600080fd5b506149768a828b01614429565b989b979a50959850939692959293505050565b600080600080600080600060a0888a0312156149a457600080fd5b87356001600160401b03808211156149bb57600080fd5b6149208b838c016144b1565b6000602082840312156149d957600080fd5b813561449181615f1f565b6000806000604084860312156149f957600080fd5b8335614a0481615f1f565b925060208401356001600160401b03811115614a1f57600080fd5b614a2b86828701614429565b9497909650939450505050565b6000808284036060811215614a4c57600080fd5b8335614a5781615f1f565b92506040601f1982011215614a6b57600080fd5b506020830190509250929050565b60008060408385031215614a8c57600080fd5b8235915060208301356001600160401b03811115614aa957600080fd5b61476c85828601614350565b60008060408385031215614ac857600080fd5b8235915060208301356001600160401b03811115614ae557600080fd5b61476c85828601614498565b60008060408385031215614b0457600080fd5b8235915060208301356001600160401b03811115614b2157600080fd5b61476c858286016144b1565b60008060408385031215614b4057600080fd5b50508035926020909101359150565b600080600060608486031215614b6457600080fd5b833592506020840135915061481b60408501614339565b600081518084526020808501945080840160005b83811015614bab57815187529582019590820190600101614b8f565b509495945050505050565b60008151808452614bce816020860160208601615a7e565b601f01601f19169290920160200192915050565b60008151614bf4818560208601615a7e565b9290920192915050565b60008154614c0b81615aaa565b60018281168015614c235760018114614c3457614c63565b60ff19841687528287019450614c63565b8560005260208060002060005b85811015614c5a5781548a820152908401908201614c41565b50505082870194505b5050505092915050565b7f7b22706f6f6c223a207b226e616d65223a2022726f6f74222c22706f696e747381527f223a20317d2c2265787465726e616c5f75726c223a202268747470733a2f2f7060208201527f6570656d6f6e2e776f726c642f222c22696d616765223a202200000000000000604082015260590190565b60008551614cf4818460208a01615a7e565b855190830190614d08818360208a01615a7e565b8551910190614d1b818360208901615a7e565b8451910190614d2e818360208801615a7e565b019695505050505050565b60008351614d4b818460208801615a7e565b835190830190614d5f818360208801615a7e565b01949350505050565b6000614d748286614bfe565b7f227d2c7b2274726169745f74797065223a22526573697374616e6365222c227681526630b63ab2911d1160c91b6020820152614db46027820186614bfe565b90507f227d2c7b2274726169745f74797065223a224850222c2276616c7565223a000081528351614dec81601e840160208801615a7e565b01601e0195945050505050565b6000614e0482614c6d565b8751614e14818360208c01615a7e565b6a1116113730b6b2911d101160a91b91019081528651614e3b81600b840160208b01615a7e565b711116113232b9b1b934b83a34b7b7111d101160711b600b92909101918201528551614e6e81601d840160208a01615a7e565b7f222c2261747472696275746573223a5b7b2274726169745f74797065223a2253601d92909101918201527f6574222c2276616c7565223a22506570656d6f6e20426174746c65227d2c7b22603d8201527f74726169745f74797065223a224c6576656c222c2276616c7565223a00000000605d8201528451614ef8816079840160208901615a7e565b7f7d2c7b2274726169745f74797065223a22456c656d656e74222c2276616c75656079929091019182015262111d1160e91b60998201526112ae614f3f609c830186614bfe565b7f227d2c7b2274726169745f74797065223a225765616b6e657373222c2276616c8152643ab2911d1160d91b602082015260250190565b6000614f8182614c6d565b8751614f91818360208c01615a7e565b6a1116113730b6b2911d101160a91b91019081528651614fb881600b840160208b01615a7e565b711116113232b9b1b934b83a34b7b7111d101160711b600b92909101918201528551614feb81601d840160208a01615a7e565b7f222c2261747472696275746573223a205b7b2274726169745f74797065223a20601d92909101918201527f22536574222c2276616c7565223a2022506570656d6f6e20537570706f727422603d8201527f7d2c7b2274726169745f74797065223a2022526172697479222c2276616c7565605d82015263111d101160e11b607d8201528451615082816081840160208901615a7e565b6150dc6150cc6150c66081848601017f227d2c7b2274726169745f74797065223a202254797065222c2276616c7565228152621d101160e91b602082015260230190565b87614be2565b63227d5d7d60e01b815260040190565b9998505050505050505050565b7f7d2c7b2274726169745f74797065223a2241747461636b222c2276616c7565228152601d60f91b60208201526000845161512b816021850160208901615a7e565b7f7d2c7b2274726169745f74797065223a225370656369616c2041747461636b226021918401918201526816113b30b63ab2911d60b91b6041820152845161517a81604a840160208901615a7e565b7f7d2c7b2274726169745f74797065223a225370656369616c20446566656e7365604a9290910191820152691116113b30b63ab2911d60b11b606a82015283516151cb816074840160208801615a7e565b627d5d7d60e81b6074929091019182015260770195945050505050565b7f7d2c7b2274726169745f74797065223a225370656564222c2276616c7565223a815260008451615220816020850160208901615a7e565b80830190507f7d2c7b2274726169745f74797065223a22496e74656c6c6967656e6365222c226020820152663b30b63ab2911d60c91b6040820152845161526e816047840160208901615a7e565b7f7d2c7b2274726169745f74797065223a22446566656e7365222c2276616c75656047929091019182015261111d60f11b606782015283516152b7816069840160208801615a7e565b0160690195945050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536340d0a0d0a8152600082516152fc816020850160208701615a7e565b9190910160200192915050565b6001600160a01b0386811682528516602082015260a06040820181905260009061533590830186614b7b565b82810360608401526153478186614b7b565b905082810360808401526112ae8185614bb6565b6001600160a01b03868116825285166020820152604081018490526060810183905260a06080820181905260009061539590830184614bb6565b979650505050505050565b6101c08101818360005b600e8110156153cc578151600190810b845260209384019390920191016153aa565b50505092915050565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b8381101561550057603f198984030185528151805161ffff9081168552888201518116898601528782015181168886015260608083015182169086015260808083015182169086015260a08083015182169086015260c08083015182169086015260e0808301518216908601526101008083015190911690850152610120808201516101a0828701819052919061549583880182614bb6565b9250505061014080830151868303828801526154b18382614bb6565b9250505061016080830151868303828801526154cd8382614bb6565b9250505061018080830151925085820381870152506154ec8183614bb6565b9689019694505050908601906001016153fc565b509098975050505050505050565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b8381101561550057603f19898403018552815161016081518552888201518986015287820151888601526060808301516155748288018261ffff169052565b505060808281015115159086015260a08083015115159086015260c08083015115159086015260e0808301518187018390526155b283880182614bb6565b9250505061010080830151868303828801526155ce8382614bb6565b9250505061012080830151868303828801526155ea8382614bb6565b9250505061014080830151925085820381870152506156098183614bb6565b968901969450505090860190600101615535565b6020815260006144916020830184614b7b565b6040815260006156436040830185614b7b565b82810360208401526156558185614b7b565b95945050505050565b60006101608d83528c60208401528b604084015261ffff8b166060840152891515608084015288151560a084015261569a60c084018915159052565b8060e08401526156ac81840188614bb6565b90508281036101008401526156c18187614bb6565b90508281036101208401526156d68186614bb6565b90508281036101408401526156eb8185614bb6565b9e9d5050505050505050505050505050565b6020815260006144916020830184614bb6565b6020808252600c908201526b2737ba1030b71030b236b4b760a11b604082015260600190565b60208082526030908201527f4d696e746572526f6c653a2063616c6c657220646f6573206e6f74206861766560408201526f20746865204d696e74657220726f6c6560801b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b61ffff8e16815261ffff8d16602082015261ffff8c16604082015261ffff8b16606082015261ffff8a16608082015261ffff891660a082015261ffff881660c082015261ffff871660e082015261ffff86166101008201526101a0610120820152600061582c6101a0830187614bb6565b82810361014084015261583f8187614bb6565b90508281036101608401526158548186614bb6565b90508281036101808401526158698185614bb6565b9150509e9d5050505050505050505050505050565b6000808335601e1984360301811261589557600080fd5b8301803591506001600160401b038211156158af57600080fd5b60200191503681900382131561446a57600080fd5b604051601f8201601f191681016001600160401b03811182821017156158ec576158ec615b50565b604052919050565b60006001600160401b0382111561590d5761590d615b50565b5060051b60200190565b6000821982111561592a5761592a615b0e565b500190565b60008261593e5761593e615b24565b500490565b600081600019048311821515161561595d5761595d615b0e565b500290565b60008282101561597457615974615b0e565b500390565b601f821115611f8c57600081815260208120601f850160051c810160208610156159a05750805b601f850160051c820191505b818110156126ef578281556001016159ac565b6001600160401b038311156159d6576159d6615b50565b6159ea836159e48354615aaa565b83615979565b6000601f841160018114615a1e5760008515615a065750838201355b600019600387901b1c1916600186901b1783556111c7565b600083815260209020601f19861690835b82811015615a4f5786850135825560209485019460019092019101615a2f565b5086821015615a6c5760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b60005b83811015615a99578181015183820152602001615a81565b838111156113725750506000910152565b600181811c90821680615abe57607f821691505b602082108114156144ab57634e487b7160e01b600052602260045260246000fd5b6000600019821415615af357615af3615b0e565b5060010190565b600082615b0957615b09615b24565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6000813561087581615efb565b6000813561087581615f1f565b615b9f615b8c83615b73565b825461ffff191661ffff91909116178255565b615bc8615bae60208401615b73565b825463ffff0000191660109190911b63ffff000016178255565b615bf5615bd760408401615b73565b825465ffff00000000191660209190911b65ffff0000000016178255565b615c26615c0460608401615b73565b825467ffff000000000000191660309190911b67ffff00000000000016178255565b615c5b615c3560808401615b73565b825469ffff0000000000000000191660409190911b69ffff000000000000000016178255565b615c8a615c6a60a08401615b73565b82805461ffff60501b191660509290921b61ffff60501b16919091179055565b615cb9615c9960c08401615b73565b82805461ffff60601b191660609290921b61ffff60601b16919091179055565b615ce8615cc860e08401615b73565b82805461ffff60701b191660709290921b61ffff60701b16919091179055565b615d18615cf86101008401615b73565b82805461ffff60801b191660809290921b61ffff60801b16919091179055565b615d2661012083018361587e565b615d348183600186016159bf565b5050615d4461014083018361587e565b615d528183600286016159bf565b5050615d6261016083018361587e565b615d708183600386016159bf565b5050615d8061018083018361587e565b6113728183600486016159bf565b81358155602082013560018201556040820135600282015560038101615db9615b8c60608501615b73565b615de4615dc860808501615b66565b82805462ff0000191691151560101b62ff000016919091179055565b615e11615df360a08501615b66565b82805463ff000000191691151560181b63ff00000016919091179055565b615e40615e2060c08501615b66565b82805464ff00000000191691151560201b64ff0000000016919091179055565b50615e4e60e083018361587e565b615e5c8183600486016159bf565b5050615e6c61010083018361587e565b615e7a8183600586016159bf565b5050615e8a61012083018361587e565b615e988183600686016159bf565b5050615ea861014083018361587e565b6113728183600786016159bf565b8135615ec181615f1f565b815461ffff191661ffff8216178255506020820135615edf81615f1f565b815463ffff00001916601082901b63ffff000016178255505050565b801515811461120157600080fd5b6001600160e01b03198116811461120157600080fd5b61ffff8116811461120157600080fdfe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220bbb4f48d337f7844d4b0be8e718fdb1a6e60f0d7bff390de194e8ca0efac5afb64736f6c6343000806003368747470733a2f2f706570656d6f6e2e66696e616e63652f6170692f706570656d6f6e2d6572633131353568747470733a2f2f706570656d6f6e2e66696e616e63652f6170692f63617264732f
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102b95760003560e01c8063731133e911610182578063a11bf921116100e9578063cd53d08e116100a2578063eaaaada31161007c578063eaaaada3146106ec578063f242432a146106ff578063f2fde38b14610712578063f5298aca1461072557600080fd5b8063cd53d08e146106a8578063e8a3d485146106d1578063e985e9c5146106d957600080fd5b8063a11bf92114610636578063a22cb46514610649578063aa271e1a1461065c578063bb5f747b1461066f578063bbe79cb514610682578063bdf7a8e61461069557600080fd5b80638da5cb5b1161013b5780638da5cb5b146105c8578063938e3d7b146105ed57806394dd28691461060057806395d89b4114610613578063983b2d561461061b578063986502751461062e57600080fd5b8063731133e91461053d5780637362d9c8146105505780637ad67d60146105635780637e518ec8146105765780637ed7f93b146105895780637faef6fd146105b557600080fd5b80633debfaca116102265780635b2bd79e116101df5780635b2bd79e146104ab578063600f4a7a146104b35780636897e974146104c65780636cc43e05146104d95780636d6055cd146104ec578063715018a61461053557600080fd5b80633debfaca146104205780633df39242146104335780633ef009ef146104465780634c5a628c146104595780634e1273f4146104615780634e84f9bb1461048157600080fd5b80631390053c116102785780631390053c1461037857806315da57841461039857806326586849146103b85780632693ebf2146103d85780632eb2c2d6146103f85780633092afd51461040d57600080fd5b80624221f0146102be578062fdd58e146102f157806301ffc9a71461032557806306fdde03146103485780630e0941371461035d5780630e89341c14610365575b600080fd5b6102de6102cc366004614824565b600c6020526000908152604090205481565b6040519081526020015b60405180910390f35b6102de6102ff366004614656565b6001600160a01b0391909116600090815260208181526040808320938352929052205490565b61033861033336600461483d565b610738565b60405190151581526020016102e8565b61035061077e565b6040516102e891906156fd565b6009546102de565b610350610373366004614824565b61080c565b61038b610386366004614824565b61087b565b6040516102e891906153a0565b6103ab6103a6366004614b2d565b6108dd565b6040516102e891906153d5565b6103cb6103c6366004614b2d565b610ceb565b6040516102e8919061550e565b6102de6103e6366004614824565b600b6020526000908152604090205481565b61040b610406366004614512565b6110bf565b005b61040b61041b3660046144c4565b6111ce565b6102de61042e366004614989565b611204565b6102de610441366004614776565b6112ba565b61040b610454366004614b4f565b611316565b61040b611378565b61047461046f366004614713565b611383565b6040516102e8919061561d565b61049461048f366004614824565b6114d5565b6040516102e89b9a9998979695949392919061565e565b61035061175e565b61040b6104c13660046147a1565b61176b565b61040b6104d43660046144c4565b6117e1565b61040b6104e7366004614a38565b611814565b61051a6104fa3660046149c7565b60086020526000908152604090205461ffff808216916201000090041682565b6040805161ffff9384168152929091166020830152016102e8565b61040b611858565b61040b61054b3660046146b3565b61188c565b61040b61055e3660046144c4565b6118bd565b61040b6105713660046149e4565b611901565b61040b61058436600461489a565b611944565b61059c610597366004614824565b611972565b6040516102e89d9c9b9a999897969594939291906157bb565b61040b6105c3366004614af1565b611c19565b6002546001600160a01b03165b6040516001600160a01b0390911681526020016102e8565b61040b6105fb36600461489a565b611c58565b61040b61060e366004614824565b611c94565b610350611cd6565b61040b6106293660046144c4565b611ce3565b61040b611d27565b61040b610644366004614ab5565b611d30565b61040b61065736600461461f565b611d6f565b61033861066a3660046144c4565b611ddb565b61033861067d3660046144c4565b611de8565b6102de6106903660046148e2565b611df5565b61040b6106a3366004614a79565b611e9f565b6105d56106b6366004614824565b600a602052600090815260409020546001600160a01b031681565b610350611f91565b6103386106e73660046144df565b612023565b6103506106fa3660046149c7565b612051565b61040b61070d3660046145bb565b61206a565b61040b6107203660046144c4565b612168565b61040b610733366004614680565b612200565b60006001600160e01b031982166301ffc9a760e01b148061076957506001600160e01b03198216636cdb3d1360e11b145b1561077657506001919050565b506000919050565b600d805461078b90615aaa565b80601f01602080910402602001604051908101604052809291908181526020018280546107b790615aaa565b80156108045780601f106107d957610100808354040283529160200191610804565b820191906000526020600020905b8154815290600101906020018083116107e757829003601f168201915b505050505081565b6000818152600a60205260409020546060906001600160a01b031661086c5760405162461bcd60e51b81526020600482015260116024820152702727a722ac24a9aa22a72a2faa27a5a2a760791b60448201526064015b60405180910390fd5b6108758261231d565b92915050565b6108836141b6565b61088b6141b6565b60005b600e8110156108d65761ffff84168282600e81106108ae576108ae615b3a565b600192830b90920b6020909202015260109390931c92806108ce81615adf565b91505061088e565b5092915050565b6060818311156108ec57600080fd5b60006108f88484615962565b610903906001615917565b6001600160401b0381111561091a5761091a615b50565b6040519080825280602002602001820160405280156109b357816020015b604080516101a0810182526000808252602080830182905292820181905260608083018290526080830182905260a0830182905260c0830182905260e0830182905261010083019190915261012082018190526101408201819052610160820181905261018082015282526000199092019101816109385790505b509050835b838111610ce35760008181526005602090815260409182902082516101a081018452815461ffff8082168352620100008204811694830194909452600160201b8104841694820194909452600160301b840483166060820152600160401b840483166080820152600160501b8404831660a0820152600160601b8404831660c0820152600160701b8404831660e0820152600160801b90930490911661010083015260018101805461012084019190610a7090615aaa565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9c90615aaa565b8015610ae95780601f10610abe57610100808354040283529160200191610ae9565b820191906000526020600020905b815481529060010190602001808311610acc57829003601f168201915b50505050508152602001600282018054610b0290615aaa565b80601f0160208091040260200160405190810160405280929190818152602001828054610b2e90615aaa565b8015610b7b5780601f10610b5057610100808354040283529160200191610b7b565b820191906000526020600020905b815481529060010190602001808311610b5e57829003601f168201915b50505050508152602001600382018054610b9490615aaa565b80601f0160208091040260200160405190810160405280929190818152602001828054610bc090615aaa565b8015610c0d5780601f10610be257610100808354040283529160200191610c0d565b820191906000526020600020905b815481529060010190602001808311610bf057829003601f168201915b50505050508152602001600482018054610c2690615aaa565b80601f0160208091040260200160405190810160405280929190818152602001828054610c5290615aaa565b8015610c9f5780601f10610c7457610100808354040283529160200191610c9f565b820191906000526020600020905b815481529060010190602001808311610c8257829003601f168201915b505050505081525050828683610cb59190615962565b81518110610cc557610cc5615b3a565b60200260200101819052508080610cdb90615adf565b9150506109b8565b509392505050565b606081831115610cfa57600080fd5b6000610d068484615962565b610d11906001615917565b6001600160401b03811115610d2857610d28615b50565b604051908082528060200260200182016040528015610db157816020015b60408051610160810182526000808252602080830182905292820181905260608083018290526080830182905260a0830182905260c083019190915260e08201819052610100820181905261012082018190526101408201528252600019909201910181610d465790505b509050835b838111610ce35760008181526006602090815260409182902082516101608101845281548152600182015492810192909252600281015492820192909252600382015461ffff8116606083015260ff620100008204811615156080840152630100000082048116151560a0840152600160201b90910416151560c082015260048201805491929160e084019190610e4c90615aaa565b80601f0160208091040260200160405190810160405280929190818152602001828054610e7890615aaa565b8015610ec55780601f10610e9a57610100808354040283529160200191610ec5565b820191906000526020600020905b815481529060010190602001808311610ea857829003601f168201915b50505050508152602001600582018054610ede90615aaa565b80601f0160208091040260200160405190810160405280929190818152602001828054610f0a90615aaa565b8015610f575780601f10610f2c57610100808354040283529160200191610f57565b820191906000526020600020905b815481529060010190602001808311610f3a57829003601f168201915b50505050508152602001600682018054610f7090615aaa565b80601f0160208091040260200160405190810160405280929190818152602001828054610f9c90615aaa565b8015610fe95780601f10610fbe57610100808354040283529160200191610fe9565b820191906000526020600020905b815481529060010190602001808311610fcc57829003601f168201915b5050505050815260200160078201805461100290615aaa565b80601f016020809104026020016040519081016040528092919081815260200182805461102e90615aaa565b801561107b5780601f106110505761010080835404028352916020019161107b565b820191906000526020600020905b81548152906001019060200180831161105e57829003601f168201915b5050505050815250508286836110919190615962565b815181106110a1576110a1615b3a565b602002602001018190525080806110b790615adf565b915050610db6565b336001600160a01b03861614806110db57506110db8533612023565b61113f5760405162461bcd60e51b815260206004820152602f60248201527f45524331313535237361666542617463685472616e7366657246726f6d3a204960448201526e272b20a624a22fa7a822a920aa27a960891b6064820152608401610863565b6001600160a01b0384166111ae5760405162461bcd60e51b815260206004820152603060248201527f45524331313535237361666542617463685472616e7366657246726f6d3a204960448201526f13959053125117d49150d2541251539560821b6064820152608401610863565b6111ba85858585612356565b6111c785858585856125ce565b5050505050565b6002546001600160a01b031633146111f85760405162461bcd60e51b815260040161086390615786565b611201816126f7565b50565b600061120f33611de8565b61122b5760405162461bcd60e51b815260040161086390615710565b60006112a2888888888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8c018190048102820181019092528a815292508a915089908190840183828082843760009201919091525061273992505050565b90506112ae818a611c19565b98975050505050505050565b60008060005b600e8110156108d6576112d4816010615943565b8482600e81106112e6576112e6615b3a565b6020020160208101906112f99190614877565b61ffff16901b91909117908061130e81615adf565b9150506112c0565b61131f33611ddb565b61133b5760405162461bcd60e51b815260040161086390615736565b825b8281116113725761136082826001604051806020016040528060008152506127f8565b8061136a81615adf565b91505061133d565b50505050565b611381336128ab565b565b606081518351146113eb5760405162461bcd60e51b815260206004820152602c60248201527f455243313135352362616c616e63654f6642617463683a20494e56414c49445f60448201526b082a4a482b2be988a9c8ea8960a31b6064820152608401610863565b600083516001600160401b0381111561140657611406615b50565b60405190808252806020026020018201604052801561142f578160200160208202803683370190505b50905060005b8451811015610ce35760008086838151811061145357611453615b3a565b60200260200101516001600160a01b03166001600160a01b03168152602001908152602001600020600085838151811061148f5761148f615b3a565b60200260200101518152602001908152602001600020548282815181106114b8576114b8615b3a565b6020908102919091010152806114cd81615adf565b915050611435565b6006602052600090815260409020805460018201546002830154600384015460048501805494959394929361ffff83169360ff62010000850481169463010000008104821694600160201b909104909116929161153190615aaa565b80601f016020809104026020016040519081016040528092919081815260200182805461155d90615aaa565b80156115aa5780601f1061157f576101008083540402835291602001916115aa565b820191906000526020600020905b81548152906001019060200180831161158d57829003601f168201915b5050505050908060050180546115bf90615aaa565b80601f01602080910402602001604051908101604052809291908181526020018280546115eb90615aaa565b80156116385780601f1061160d57610100808354040283529160200191611638565b820191906000526020600020905b81548152906001019060200180831161161b57829003601f168201915b50505050509080600601805461164d90615aaa565b80601f016020809104026020016040519081016040528092919081815260200182805461167990615aaa565b80156116c65780601f1061169b576101008083540402835291602001916116c6565b820191906000526020600020905b8154815290600101906020018083116116a957829003601f168201915b5050505050908060070180546116db90615aaa565b80601f016020809104026020016040519081016040528092919081815260200182805461170790615aaa565b80156117545780601f1061172957610100808354040283529160200191611754565b820191906000526020600020905b81548152906001019060200180831161173757829003601f168201915b505050505090508b565b600f805461078b90615aaa565b61177433611ddb565b6117905760405162461bcd60e51b815260040161086390615736565b8160005b8181116111c7576117cf838686848181106117b1576117b1615b3a565b905060200201356001604051806020016040528060008152506127f8565b806117d981615adf565b915050611794565b6002546001600160a01b0316331461180b5760405162461bcd60e51b815260040161086390615786565b611201816128ab565b61181d33611de8565b6118395760405162461bcd60e51b815260040161086390615710565b61ffff8216600090815260086020526040902081906113728282615eb6565b6002546001600160a01b031633146118825760405162461bcd60e51b815260040161086390615786565b61138160006128ed565b61189533611ddb565b6118b15760405162461bcd60e51b815260040161086390615736565b611372848484846127f8565b6118c633611de8565b6118e25760405162461bcd60e51b815260040161086390615710565b6001600160a01b0381163014156118f857600080fd5b6112018161293f565b61190a33611de8565b6119265760405162461bcd60e51b815260040161086390615710565b61ffff831660009081526007602052604090206113729083836141d5565b61194d33611de8565b6119695760405162461bcd60e51b815260040161086390615710565b61120181612981565b6005602052600090815260409020805460018201805461ffff80841694620100008504821694600160201b8104831694600160301b8204841694600160401b8304851694600160501b8404811694600160601b8504821694600160701b8104831694600160801b909104909216929091906119ec90615aaa565b80601f0160208091040260200160405190810160405280929190818152602001828054611a1890615aaa565b8015611a655780601f10611a3a57610100808354040283529160200191611a65565b820191906000526020600020905b815481529060010190602001808311611a4857829003601f168201915b505050505090806002018054611a7a90615aaa565b80601f0160208091040260200160405190810160405280929190818152602001828054611aa690615aaa565b8015611af35780601f10611ac857610100808354040283529160200191611af3565b820191906000526020600020905b815481529060010190602001808311611ad657829003601f168201915b505050505090806003018054611b0890615aaa565b80601f0160208091040260200160405190810160405280929190818152602001828054611b3490615aaa565b8015611b815780601f10611b5657610100808354040283529160200191611b81565b820191906000526020600020905b815481529060010190602001808311611b6457829003601f168201915b505050505090806004018054611b9690615aaa565b80601f0160208091040260200160405190810160405280929190818152602001828054611bc290615aaa565b8015611c0f5780601f10611be457610100808354040283529160200191611c0f565b820191906000526020600020905b815481529060010190602001808311611bf257829003601f168201915b505050505090508d565b611c2233611de8565b611c3e5760405162461bcd60e51b815260040161086390615710565b600082815260066020526040902081906113728282615d8e565b611c6133611de8565b611c7d5760405162461bcd60e51b815260040161086390615710565b8051611c90906010906020840190614259565b5050565b611c9d33611de8565b611cb95760405162461bcd60e51b815260040161086390615710565b6000908152600b6020908152604080832054600c90925290912055565b600e805461078b90615aaa565b611cec33611ddb565b611d085760405162461bcd60e51b815260040161086390615736565b6001600160a01b038116301415611d1e57600080fd5b61120181612994565b611381336126f7565b611d3933611de8565b611d555760405162461bcd60e51b815260040161086390615710565b600082815260056020526040902081906113728282615b80565b3360008181526001602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60006108756003836129d6565b60006108756004836129d6565b6000611e0033611de8565b611e1c5760405162461bcd60e51b815260040161086390615710565b6000611e93888888888080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525050604080516020601f8c018190048102820181019092528a815292508a915089908190840183828082843760009201919091525061273992505050565b90506112ae818a611d30565b611ea833611ddb565b611ec45760405162461bcd60e51b815260040161086390615736565b80516000838152600b6020908152604080832054600c90925290912054611eeb9190615962565b1015611f395760405162461bcd60e51b815260206004820152601a60248201527f43616e74206d696e742061626f7665206d617820737570706c790000000000006044820152606401610863565b60005b8151811015611f8c57611f7a828281518110611f5a57611f5a615b3a565b60200260200101518460016040518060200160405280600081525061188c565b80611f8481615adf565b915050611f3c565b505050565b606060108054611fa090615aaa565b80601f0160208091040260200160405190810160405280929190818152602001828054611fcc90615aaa565b80156120195780601f10611fee57610100808354040283529160200191612019565b820191906000526020600020905b815481529060010190602001808311611ffc57829003601f168201915b5050505050905090565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b6007602052600090815260409020805461078b90615aaa565b336001600160a01b038616148061208657506120868533612023565b6120e55760405162461bcd60e51b815260206004820152602a60248201527f4552433131353523736166655472616e7366657246726f6d3a20494e56414c49604482015269222fa7a822a920aa27a960b11b6064820152608401610863565b6001600160a01b03841661214f5760405162461bcd60e51b815260206004820152602b60248201527f4552433131353523736166655472616e7366657246726f6d3a20494e56414c4960448201526a1117d49150d2541251539560aa1b6064820152608401610863565b61215b85858585612a59565b6111c78585858585612b35565b6002546001600160a01b031633146121925760405162461bcd60e51b815260040161086390615786565b6001600160a01b0381166121f75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610863565b611201816128ed565b61220933611ddb565b6122255760405162461bcd60e51b815260040161086390615736565b6001600160a01b0383166000908152602081815260408083208584529091529020548111156122965760405162461bcd60e51b815260206004820152601960248201527f457863656564656420617661696c61626c6520616d6f756e74000000000000006044820152606401610863565b611f8c838383612c56565b6122ab82826129d6565b156122f85760405162461bcd60e51b815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c65006044820152606401610863565b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b606061233061232b83612ce7565b612d4c565b60405160200161234091906152c4565b6040516020818303038152906040529050919050565b80518251146123c55760405162461bcd60e51b815260206004820152603560248201527f45524331313535235f7361666542617463685472616e7366657246726f6d3a206044820152740929cac82989288be82a4a482b2a6be988a9c8ea89605b1b6064820152608401610863565b815160005b8181101561256f578281815181106123e4576123e4615b3a565b6020026020010151600080886001600160a01b03166001600160a01b03168152602001908152602001600020600086848151811061242457612424615b3a565b60200260200101518152602001908152602001600020546124459190615962565b600080886001600160a01b03166001600160a01b03168152602001908152602001600020600086848151811061247d5761247d615b3a565b60200260200101518152602001908152602001600020819055508281815181106124a9576124a9615b3a565b6020026020010151600080876001600160a01b03166001600160a01b0316815260200190815260200160002060008684815181106124e9576124e9615b3a565b602002602001015181526020019081526020016000205461250a9190615917565b600080876001600160a01b03166001600160a01b03168152602001908152602001600020600086848151811061254257612542615b3a565b6020026020010151815260200190815260200160002081905550808061256790615adf565b9150506123ca565b50836001600160a01b0316856001600160a01b0316336001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb86866040516125bf929190615630565b60405180910390a45050505050565b6001600160a01b0384163b156111c75760405163bc197c8160e01b81526000906001600160a01b0386169063bc197c81906126159033908a90899089908990600401615309565b602060405180830381600087803b15801561262f57600080fd5b505af1158015612643573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612667919061485a565b90506001600160e01b0319811663bc197c8160e01b146126ef5760405162461bcd60e51b815260206004820152603f60248201527f45524331313535235f63616c6c6f6e455243313135354261746368526563656960448201527f7665643a20494e56414c49445f4f4e5f524543454956455f4d455353414745006064820152608401610863565b505050505050565b612702600382612eb1565b6040516001600160a01b038216907fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb6669290600090a250565b60008484111561274857600080fd5b6009805490600061275883615adf565b90915550506009546000818152600a6020526040902080546001600160a01b031916331790558351156127be57807f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b856040516127b591906156fd565b60405180910390a25b84156127d0576127d033828786612f33565b6000818152600b60209081526040808320889055600c90915290208690559050949350505050565b6000838152600b6020526040812054849190612815908590615917565b6000838152600c602052604090205490915081111561286b5760405162461bcd60e51b815260206004820152601260248201527113585e081cdd5c1c1b1e481c995858da195960721b6044820152606401610863565b61287786868686612f33565b6000858152600b6020526040902054612891908590615917565b6000958652600b6020526040909520949094555050505050565b6128b6600482612eb1565b6040516001600160a01b038216907f0a8eb35e5ca14b3d6f28e4abf2f128dbab231a58b56e89beb5d636115001e16590600090a250565b600280546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b61294a6004826122a1565b6040516001600160a01b038216907f22380c05984257a1cb900161c713dd71d39e74820f1aea43bd3f1bdd2096129990600090a250565b8051611c9090600f906020840190614259565b61299f6003826122a1565b6040516001600160a01b038216907f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f690600090a250565b60006001600160a01b038216612a395760405162461bcd60e51b815260206004820152602260248201527f526f6c65733a206163636f756e7420697320746865207a65726f206164647265604482015261737360f01b6064820152608401610863565b506001600160a01b03166000908152602091909152604090205460ff1690565b6001600160a01b038416600090815260208181526040808320858452909152902054612a86908290615962565b6001600160a01b0380861660009081526020818152604080832087845282528083209490945591861681528082528281208582529091522054612aca908290615917565b6001600160a01b0384811660008181526020818152604080832088845282529182902094909455805186815293840185905290929187169133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a450505050565b6001600160a01b0384163b156111c75760405163f23a6e6160e01b81526000906001600160a01b0386169063f23a6e6190612b7c9033908a9089908990899060040161535b565b602060405180830381600087803b158015612b9657600080fd5b505af1158015612baa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bce919061485a565b90506001600160e01b0319811663f23a6e6160e01b146126ef5760405162461bcd60e51b815260206004820152603a60248201527f45524331313535235f63616c6c6f6e4552433131353552656365697665643a2060448201527f494e56414c49445f4f4e5f524543454956455f4d4553534147450000000000006064820152608401610863565b6001600160a01b038316600090815260208181526040808320858452909152902054612c83908290615962565b6001600160a01b0384166000818152602081815260408083208784528252808320949094558351868152908101859052909233917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4505050565b60008181526005602052604090205460609062010000900461ffff16612d105761087582612fcf565b612d19826132ea565b612d2283613649565b612d2b84613994565b612d3485613ccb565b6040516020016123409493929190614ce2565b919050565b805160609080612d6c575050604080516020810190915260008152919050565b60006003612d7b836002615917565b612d85919061592f565b612d90906004615943565b90506000612d9f826020615917565b6001600160401b03811115612db657612db6615b50565b6040519080825280601f01601f191660200182016040528015612de0576020820181803683370190505b5090506000604051806060016040528060408152602001615f30604091399050600181016020830160005b86811015612e6c576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b835260049092019101612e0b565b506003860660018114612e865760028114612e9757612ea3565b613d3d60f01b600119830152612ea3565b603d60f81b6000198301525b505050918152949350505050565b612ebb82826129d6565b612f115760405162461bcd60e51b815260206004820152602160248201527f526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c6044820152606560f81b6064820152608401610863565b6001600160a01b0316600090815260209190915260409020805460ff19169055565b6001600160a01b038416600090815260208181526040808320868452909152902054612f60908390615917565b6001600160a01b03851660008181526020818152604080832088845282528083209490945583518781529081018690529192909133917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611372600085858585612b35565b600081815260066020908152604080832081516101608101835281548152600182015493810193909352600281015491830191909152600381015461ffff811660608481019190915260ff620100008304811615156080860152630100000083048116151560a0860152600160201b909204909116151560c0840152600482018054919493929160e08401919061306590615aaa565b80601f016020809104026020016040519081016040528092919081815260200182805461309190615aaa565b80156130de5780601f106130b3576101008083540402835291602001916130de565b820191906000526020600020905b8154815290600101906020018083116130c157829003601f168201915b505050505081526020016005820180546130f790615aaa565b80601f016020809104026020016040519081016040528092919081815260200182805461312390615aaa565b80156131705780601f1061314557610100808354040283529160200191613170565b820191906000526020600020905b81548152906001019060200180831161315357829003601f168201915b5050505050815260200160068201805461318990615aaa565b80601f01602080910402602001604051908101604052809291908181526020018280546131b590615aaa565b80156132025780601f106131d757610100808354040283529160200191613202565b820191906000526020600020905b8154815290600101906020018083116131e557829003601f168201915b5050505050815260200160078201805461321b90615aaa565b80601f016020809104026020016040519081016040528092919081815260200182805461324790615aaa565b80156132945780601f1061326957610100808354040283529160200191613294565b820191906000526020600020905b81548152906001019060200180831161327757829003601f168201915b50505050508152505090508061012001518160e001518261010001518361014001516132bf85614002565b6040516020016132d3959493929190614f76565b604051602081830303815290604052915050919050565b600081815260056020908152604080832081516101a081018352815461ffff8082168352620100008204811695830195909552600160201b8104851693820193909352600160301b83048416606082810191909152600160401b840485166080830152600160501b8404851660a0830152600160601b8404851660c0830152600160701b8404851660e0830152600160801b90930490931661010084015260018101805492949392610120840191906133a290615aaa565b80601f01602080910402602001604051908101604052809291908181526020018280546133ce90615aaa565b801561341b5780601f106133f05761010080835404028352916020019161341b565b820191906000526020600020905b8154815290600101906020018083116133fe57829003601f168201915b5050505050815260200160028201805461343490615aaa565b80601f016020809104026020016040519081016040528092919081815260200182805461346090615aaa565b80156134ad5780601f10613482576101008083540402835291602001916134ad565b820191906000526020600020905b81548152906001019060200180831161349057829003601f168201915b505050505081526020016003820180546134c690615aaa565b80601f01602080910402602001604051908101604052809291908181526020018280546134f290615aaa565b801561353f5780601f106135145761010080835404028352916020019161353f565b820191906000526020600020905b81548152906001019060200180831161352257829003601f168201915b5050505050815260200160048201805461355890615aaa565b80601f016020809104026020016040519081016040528092919081815260200182805461358490615aaa565b80156135d15780601f106135a6576101008083540402835291602001916135d1565b820191906000526020600020905b8154815290600101906020018083116135b457829003601f168201915b505050505081525050905060008160000151905081610160015182610120015183610140015161360985610100015161ffff166140b1565b61ffff8516600090815260076020908152604091829020915161363196959493929101614df9565b60405160208183030381529060405292505050919050565b600081815260056020908152604080832081516101a081018352815461ffff8082168352620100008204811695830195909552600160201b8104851693820193909352600160301b83048416606082810191909152600160401b840485166080830152600160501b8404851660a0830152600160601b8404851660c0830152600160701b8404851660e0830152600160801b909304909316610100840152600181018054929493926101208401919061370190615aaa565b80601f016020809104026020016040519081016040528092919081815260200182805461372d90615aaa565b801561377a5780601f1061374f5761010080835404028352916020019161377a565b820191906000526020600020905b81548152906001019060200180831161375d57829003601f168201915b5050505050815260200160028201805461379390615aaa565b80601f01602080910402602001604051908101604052809291908181526020018280546137bf90615aaa565b801561380c5780601f106137e15761010080835404028352916020019161380c565b820191906000526020600020905b8154815290600101906020018083116137ef57829003601f168201915b5050505050815260200160038201805461382590615aaa565b80601f016020809104026020016040519081016040528092919081815260200182805461385190615aaa565b801561389e5780601f106138735761010080835404028352916020019161389e565b820191906000526020600020905b81548152906001019060200180831161388157829003601f168201915b505050505081526020016004820180546138b790615aaa565b80601f01602080910402602001604051908101604052809291908181526020018280546138e390615aaa565b80156139305780601f1061390557610100808354040283529160200191613930565b820191906000526020600020905b81548152906001019060200180831161391357829003601f168201915b505050919092525050815161ffff8082166000908152600860209081526040808320548085168452600783528184206201000090910485168452922090860151959650929490935061398291166140b1565b60405160200161363193929190614d68565b600081815260056020908152604080832081516101a081018352815461ffff8082168352620100008204811695830195909552600160201b8104851693820193909352600160301b83048416606082810191909152600160401b840485166080830152600160501b8404851660a0830152600160601b8404851660c0830152600160701b8404851660e0830152600160801b9093049093166101008401526001810180549294939261012084019190613a4c90615aaa565b80601f0160208091040260200160405190810160405280929190818152602001828054613a7890615aaa565b8015613ac55780601f10613a9a57610100808354040283529160200191613ac5565b820191906000526020600020905b815481529060010190602001808311613aa857829003601f168201915b50505050508152602001600282018054613ade90615aaa565b80601f0160208091040260200160405190810160405280929190818152602001828054613b0a90615aaa565b8015613b575780601f10613b2c57610100808354040283529160200191613b57565b820191906000526020600020905b815481529060010190602001808311613b3a57829003601f168201915b50505050508152602001600382018054613b7090615aaa565b80601f0160208091040260200160405190810160405280929190818152602001828054613b9c90615aaa565b8015613be95780601f10613bbe57610100808354040283529160200191613be9565b820191906000526020600020905b815481529060010190602001808311613bcc57829003601f168201915b50505050508152602001600482018054613c0290615aaa565b80601f0160208091040260200160405190810160405280929190818152602001828054613c2e90615aaa565b8015613c7b5780601f10613c5057610100808354040283529160200191613c7b565b820191906000526020600020905b815481529060010190602001808311613c5e57829003601f168201915b5050505050815250509050613c97816040015161ffff166140b1565b613ca8826060015161ffff166140b1565b613cb9836080015161ffff166140b1565b6040516020016132d3939291906151e8565b600081815260056020908152604080832081516101a081018352815461ffff8082168352620100008204811695830195909552600160201b8104851693820193909352600160301b83048416606082810191909152600160401b840485166080830152600160501b8404851660a0830152600160601b8404851660c0830152600160701b8404851660e0830152600160801b9093049093166101008401526001810180549294939261012084019190613d8390615aaa565b80601f0160208091040260200160405190810160405280929190818152602001828054613daf90615aaa565b8015613dfc5780601f10613dd157610100808354040283529160200191613dfc565b820191906000526020600020905b815481529060010190602001808311613ddf57829003601f168201915b50505050508152602001600282018054613e1590615aaa565b80601f0160208091040260200160405190810160405280929190818152602001828054613e4190615aaa565b8015613e8e5780601f10613e6357610100808354040283529160200191613e8e565b820191906000526020600020905b815481529060010190602001808311613e7157829003601f168201915b50505050508152602001600382018054613ea790615aaa565b80601f0160208091040260200160405190810160405280929190818152602001828054613ed390615aaa565b8015613f205780601f10613ef557610100808354040283529160200191613f20565b820191906000526020600020905b815481529060010190602001808311613f0357829003601f168201915b50505050508152602001600482018054613f3990615aaa565b80601f0160208091040260200160405190810160405280929190818152602001828054613f6590615aaa565b8015613fb25780601f10613f8757610100808354040283529160200191613fb2565b820191906000526020600020905b815481529060010190602001808311613f9557829003601f168201915b5050505050815250509050613fce8160a0015161ffff166140b1565b613fdf8260c0015161ffff166140b1565b613ff08360e0015161ffff166140b1565b6040516020016132d3939291906150e9565b604080518082018252600881526702232b332b739b2960c51b60208083019190915282518084019093526009835268285370656369616c2960b81b90830152608083015160609290156140735760405180604001604052806008815260200167027b33332b739b2960c51b81525091505b8360a001511561409e5750604080518082019091526008815267284e6f726d616c2960c01b60208201525b8181604051602001613631929190614d39565b6060816140d55750506040805180820190915260018152600360fc1b602082015290565b8160005b81156140ff57806140e981615adf565b91506140f89050600a8361592f565b91506140d9565b6000816001600160401b0381111561411957614119615b50565b6040519080825280601f01601f191660200182016040528015614143576020820181803683370190505b5090505b84156141ae57614158600183615962565b9150614165600a86615afa565b614170906030615917565b60f81b81838151811061418557614185615b3a565b60200101906001600160f81b031916908160001a9053506141a7600a8661592f565b9450614147565b949350505050565b604051806101c00160405280600e906020820280368337509192915050565b8280546141e190615aaa565b90600052602060002090601f0160209004810192826142035760008555614249565b82601f1061421c5782800160ff19823516178555614249565b82800160010185558215614249579182015b8281111561424957823582559160200191906001019061422e565b506142559291506142cd565b5090565b82805461426590615aaa565b90600052602060002090601f0160209004810192826142875760008555614249565b82601f106142a057805160ff1916838001178555614249565b82800160010185558215614249579182015b828111156142495782518255916020019190600101906142b2565b5b8082111561425557600081556001016142ce565b60006001600160401b038311156142fb576142fb615b50565b61430e601f8401601f19166020016158c4565b905082815283838301111561432257600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b0381168114612d4757600080fd5b600082601f83011261436157600080fd5b81356020614376614371836158f4565b6158c4565b80838252828201915082860187848660051b890101111561439657600080fd5b60005b858110156143bc576143aa82614339565b84529284019290840190600101614399565b5090979650505050505050565b600082601f8301126143da57600080fd5b813560206143ea614371836158f4565b80838252828201915082860187848660051b890101111561440a57600080fd5b60005b858110156143bc5781358452928401929084019060010161440d565b60008083601f84011261443b57600080fd5b5081356001600160401b0381111561445257600080fd5b60208301915083602082850101111561446a57600080fd5b9250929050565b600082601f83011261448257600080fd5b614491838335602085016142e2565b9392505050565b60006101a082840312156144ab57600080fd5b50919050565b600061016082840312156144ab57600080fd5b6000602082840312156144d657600080fd5b61449182614339565b600080604083850312156144f257600080fd5b6144fb83614339565b915061450960208401614339565b90509250929050565b600080600080600060a0868803121561452a57600080fd5b61453386614339565b945061454160208701614339565b935060408601356001600160401b038082111561455d57600080fd5b61456989838a016143c9565b9450606088013591508082111561457f57600080fd5b61458b89838a016143c9565b935060808801359150808211156145a157600080fd5b506145ae88828901614471565b9150509295509295909350565b600080600080600060a086880312156145d357600080fd5b6145dc86614339565b94506145ea60208701614339565b9350604086013592506060860135915060808601356001600160401b0381111561461357600080fd5b6145ae88828901614471565b6000806040838503121561463257600080fd5b61463b83614339565b9150602083013561464b81615efb565b809150509250929050565b6000806040838503121561466957600080fd5b61467283614339565b946020939093013593505050565b60008060006060848603121561469557600080fd5b61469e84614339565b95602085013595506040909401359392505050565b600080600080608085870312156146c957600080fd5b6146d285614339565b9350602085013592506040850135915060608501356001600160401b038111156146fb57600080fd5b61470787828801614471565b91505092959194509250565b6000806040838503121561472657600080fd5b82356001600160401b038082111561473d57600080fd5b61474986838701614350565b9350602085013591508082111561475f57600080fd5b5061476c858286016143c9565b9150509250929050565b60006101c080838503121561478a57600080fd5b83818401111561479957600080fd5b509092915050565b6000806000604084860312156147b657600080fd5b83356001600160401b03808211156147cd57600080fd5b818601915086601f8301126147e157600080fd5b8135818111156147f057600080fd5b8760208260051b850101111561480557600080fd5b60209283019550935061481b9186019050614339565b90509250925092565b60006020828403121561483657600080fd5b5035919050565b60006020828403121561484f57600080fd5b813561449181615f09565b60006020828403121561486c57600080fd5b815161449181615f09565b60006020828403121561488957600080fd5b81358060010b811461449157600080fd5b6000602082840312156148ac57600080fd5b81356001600160401b038111156148c257600080fd5b8201601f810184136148d357600080fd5b6141ae848235602084016142e2565b600080600080600080600060a0888a0312156148fd57600080fd5b87356001600160401b038082111561491457600080fd5b6149208b838c01614498565b985060208a0135975060408a0135965060608a013591508082111561494457600080fd5b6149508b838c01614429565b909650945060808a013591508082111561496957600080fd5b506149768a828b01614429565b989b979a50959850939692959293505050565b600080600080600080600060a0888a0312156149a457600080fd5b87356001600160401b03808211156149bb57600080fd5b6149208b838c016144b1565b6000602082840312156149d957600080fd5b813561449181615f1f565b6000806000604084860312156149f957600080fd5b8335614a0481615f1f565b925060208401356001600160401b03811115614a1f57600080fd5b614a2b86828701614429565b9497909650939450505050565b6000808284036060811215614a4c57600080fd5b8335614a5781615f1f565b92506040601f1982011215614a6b57600080fd5b506020830190509250929050565b60008060408385031215614a8c57600080fd5b8235915060208301356001600160401b03811115614aa957600080fd5b61476c85828601614350565b60008060408385031215614ac857600080fd5b8235915060208301356001600160401b03811115614ae557600080fd5b61476c85828601614498565b60008060408385031215614b0457600080fd5b8235915060208301356001600160401b03811115614b2157600080fd5b61476c858286016144b1565b60008060408385031215614b4057600080fd5b50508035926020909101359150565b600080600060608486031215614b6457600080fd5b833592506020840135915061481b60408501614339565b600081518084526020808501945080840160005b83811015614bab57815187529582019590820190600101614b8f565b509495945050505050565b60008151808452614bce816020860160208601615a7e565b601f01601f19169290920160200192915050565b60008151614bf4818560208601615a7e565b9290920192915050565b60008154614c0b81615aaa565b60018281168015614c235760018114614c3457614c63565b60ff19841687528287019450614c63565b8560005260208060002060005b85811015614c5a5781548a820152908401908201614c41565b50505082870194505b5050505092915050565b7f7b22706f6f6c223a207b226e616d65223a2022726f6f74222c22706f696e747381527f223a20317d2c2265787465726e616c5f75726c223a202268747470733a2f2f7060208201527f6570656d6f6e2e776f726c642f222c22696d616765223a202200000000000000604082015260590190565b60008551614cf4818460208a01615a7e565b855190830190614d08818360208a01615a7e565b8551910190614d1b818360208901615a7e565b8451910190614d2e818360208801615a7e565b019695505050505050565b60008351614d4b818460208801615a7e565b835190830190614d5f818360208801615a7e565b01949350505050565b6000614d748286614bfe565b7f227d2c7b2274726169745f74797065223a22526573697374616e6365222c227681526630b63ab2911d1160c91b6020820152614db46027820186614bfe565b90507f227d2c7b2274726169745f74797065223a224850222c2276616c7565223a000081528351614dec81601e840160208801615a7e565b01601e0195945050505050565b6000614e0482614c6d565b8751614e14818360208c01615a7e565b6a1116113730b6b2911d101160a91b91019081528651614e3b81600b840160208b01615a7e565b711116113232b9b1b934b83a34b7b7111d101160711b600b92909101918201528551614e6e81601d840160208a01615a7e565b7f222c2261747472696275746573223a5b7b2274726169745f74797065223a2253601d92909101918201527f6574222c2276616c7565223a22506570656d6f6e20426174746c65227d2c7b22603d8201527f74726169745f74797065223a224c6576656c222c2276616c7565223a00000000605d8201528451614ef8816079840160208901615a7e565b7f7d2c7b2274726169745f74797065223a22456c656d656e74222c2276616c75656079929091019182015262111d1160e91b60998201526112ae614f3f609c830186614bfe565b7f227d2c7b2274726169745f74797065223a225765616b6e657373222c2276616c8152643ab2911d1160d91b602082015260250190565b6000614f8182614c6d565b8751614f91818360208c01615a7e565b6a1116113730b6b2911d101160a91b91019081528651614fb881600b840160208b01615a7e565b711116113232b9b1b934b83a34b7b7111d101160711b600b92909101918201528551614feb81601d840160208a01615a7e565b7f222c2261747472696275746573223a205b7b2274726169745f74797065223a20601d92909101918201527f22536574222c2276616c7565223a2022506570656d6f6e20537570706f727422603d8201527f7d2c7b2274726169745f74797065223a2022526172697479222c2276616c7565605d82015263111d101160e11b607d8201528451615082816081840160208901615a7e565b6150dc6150cc6150c66081848601017f227d2c7b2274726169745f74797065223a202254797065222c2276616c7565228152621d101160e91b602082015260230190565b87614be2565b63227d5d7d60e01b815260040190565b9998505050505050505050565b7f7d2c7b2274726169745f74797065223a2241747461636b222c2276616c7565228152601d60f91b60208201526000845161512b816021850160208901615a7e565b7f7d2c7b2274726169745f74797065223a225370656369616c2041747461636b226021918401918201526816113b30b63ab2911d60b91b6041820152845161517a81604a840160208901615a7e565b7f7d2c7b2274726169745f74797065223a225370656369616c20446566656e7365604a9290910191820152691116113b30b63ab2911d60b11b606a82015283516151cb816074840160208801615a7e565b627d5d7d60e81b6074929091019182015260770195945050505050565b7f7d2c7b2274726169745f74797065223a225370656564222c2276616c7565223a815260008451615220816020850160208901615a7e565b80830190507f7d2c7b2274726169745f74797065223a22496e74656c6c6967656e6365222c226020820152663b30b63ab2911d60c91b6040820152845161526e816047840160208901615a7e565b7f7d2c7b2274726169745f74797065223a22446566656e7365222c2276616c75656047929091019182015261111d60f11b606782015283516152b7816069840160208801615a7e565b0160690195945050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536340d0a0d0a8152600082516152fc816020850160208701615a7e565b9190910160200192915050565b6001600160a01b0386811682528516602082015260a06040820181905260009061533590830186614b7b565b82810360608401526153478186614b7b565b905082810360808401526112ae8185614bb6565b6001600160a01b03868116825285166020820152604081018490526060810183905260a06080820181905260009061539590830184614bb6565b979650505050505050565b6101c08101818360005b600e8110156153cc578151600190810b845260209384019390920191016153aa565b50505092915050565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b8381101561550057603f198984030185528151805161ffff9081168552888201518116898601528782015181168886015260608083015182169086015260808083015182169086015260a08083015182169086015260c08083015182169086015260e0808301518216908601526101008083015190911690850152610120808201516101a0828701819052919061549583880182614bb6565b9250505061014080830151868303828801526154b18382614bb6565b9250505061016080830151868303828801526154cd8382614bb6565b9250505061018080830151925085820381870152506154ec8183614bb6565b9689019694505050908601906001016153fc565b509098975050505050505050565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b8381101561550057603f19898403018552815161016081518552888201518986015287820151888601526060808301516155748288018261ffff169052565b505060808281015115159086015260a08083015115159086015260c08083015115159086015260e0808301518187018390526155b283880182614bb6565b9250505061010080830151868303828801526155ce8382614bb6565b9250505061012080830151868303828801526155ea8382614bb6565b9250505061014080830151925085820381870152506156098183614bb6565b968901969450505090860190600101615535565b6020815260006144916020830184614b7b565b6040815260006156436040830185614b7b565b82810360208401526156558185614b7b565b95945050505050565b60006101608d83528c60208401528b604084015261ffff8b166060840152891515608084015288151560a084015261569a60c084018915159052565b8060e08401526156ac81840188614bb6565b90508281036101008401526156c18187614bb6565b90508281036101208401526156d68186614bb6565b90508281036101408401526156eb8185614bb6565b9e9d5050505050505050505050505050565b6020815260006144916020830184614bb6565b6020808252600c908201526b2737ba1030b71030b236b4b760a11b604082015260600190565b60208082526030908201527f4d696e746572526f6c653a2063616c6c657220646f6573206e6f74206861766560408201526f20746865204d696e74657220726f6c6560801b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b61ffff8e16815261ffff8d16602082015261ffff8c16604082015261ffff8b16606082015261ffff8a16608082015261ffff891660a082015261ffff881660c082015261ffff871660e082015261ffff86166101008201526101a0610120820152600061582c6101a0830187614bb6565b82810361014084015261583f8187614bb6565b90508281036101608401526158548186614bb6565b90508281036101808401526158698185614bb6565b9150509e9d5050505050505050505050505050565b6000808335601e1984360301811261589557600080fd5b8301803591506001600160401b038211156158af57600080fd5b60200191503681900382131561446a57600080fd5b604051601f8201601f191681016001600160401b03811182821017156158ec576158ec615b50565b604052919050565b60006001600160401b0382111561590d5761590d615b50565b5060051b60200190565b6000821982111561592a5761592a615b0e565b500190565b60008261593e5761593e615b24565b500490565b600081600019048311821515161561595d5761595d615b0e565b500290565b60008282101561597457615974615b0e565b500390565b601f821115611f8c57600081815260208120601f850160051c810160208610156159a05750805b601f850160051c820191505b818110156126ef578281556001016159ac565b6001600160401b038311156159d6576159d6615b50565b6159ea836159e48354615aaa565b83615979565b6000601f841160018114615a1e5760008515615a065750838201355b600019600387901b1c1916600186901b1783556111c7565b600083815260209020601f19861690835b82811015615a4f5786850135825560209485019460019092019101615a2f565b5086821015615a6c5760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b60005b83811015615a99578181015183820152602001615a81565b838111156113725750506000910152565b600181811c90821680615abe57607f821691505b602082108114156144ab57634e487b7160e01b600052602260045260246000fd5b6000600019821415615af357615af3615b0e565b5060010190565b600082615b0957615b09615b24565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6000813561087581615efb565b6000813561087581615f1f565b615b9f615b8c83615b73565b825461ffff191661ffff91909116178255565b615bc8615bae60208401615b73565b825463ffff0000191660109190911b63ffff000016178255565b615bf5615bd760408401615b73565b825465ffff00000000191660209190911b65ffff0000000016178255565b615c26615c0460608401615b73565b825467ffff000000000000191660309190911b67ffff00000000000016178255565b615c5b615c3560808401615b73565b825469ffff0000000000000000191660409190911b69ffff000000000000000016178255565b615c8a615c6a60a08401615b73565b82805461ffff60501b191660509290921b61ffff60501b16919091179055565b615cb9615c9960c08401615b73565b82805461ffff60601b191660609290921b61ffff60601b16919091179055565b615ce8615cc860e08401615b73565b82805461ffff60701b191660709290921b61ffff60701b16919091179055565b615d18615cf86101008401615b73565b82805461ffff60801b191660809290921b61ffff60801b16919091179055565b615d2661012083018361587e565b615d348183600186016159bf565b5050615d4461014083018361587e565b615d528183600286016159bf565b5050615d6261016083018361587e565b615d708183600386016159bf565b5050615d8061018083018361587e565b6113728183600486016159bf565b81358155602082013560018201556040820135600282015560038101615db9615b8c60608501615b73565b615de4615dc860808501615b66565b82805462ff0000191691151560101b62ff000016919091179055565b615e11615df360a08501615b66565b82805463ff000000191691151560181b63ff00000016919091179055565b615e40615e2060c08501615b66565b82805464ff00000000191691151560201b64ff0000000016919091179055565b50615e4e60e083018361587e565b615e5c8183600486016159bf565b5050615e6c61010083018361587e565b615e7a8183600586016159bf565b5050615e8a61012083018361587e565b615e988183600686016159bf565b5050615ea861014083018361587e565b6113728183600786016159bf565b8135615ec181615f1f565b815461ffff191661ffff8216178255506020820135615edf81615f1f565b815463ffff00001916601082901b63ffff000016178255505050565b801515811461120157600080fd5b6001600160e01b03198116811461120157600080fd5b61ffff8116811461120157600080fdfe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa2646970667358221220bbb4f48d337f7844d4b0be8e718fdb1a6e60f0d7bff390de194e8ca0efac5afb64736f6c63430008060033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ 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.