Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 14,163 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Claim Clover Wit... | 8749314 | 1761 days ago | IN | 0 ETH | 0.00034278 | ||||
Claim Clover Wit... | 8748278 | 1761 days ago | IN | 0 ETH | 0.00001184 | ||||
Claim Clover Wit... | 8748278 | 1761 days ago | IN | 0 ETH | 0.00007986 | ||||
Claim Clover Wit... | 8748270 | 1761 days ago | IN | 0 ETH | 0.00007988 | ||||
Claim Clover Wit... | 8748270 | 1761 days ago | IN | 0 ETH | 0.00007988 | ||||
Claim Clover Wit... | 8748270 | 1761 days ago | IN | 0 ETH | 0.00007986 | ||||
Claim Clover Wit... | 8748270 | 1761 days ago | IN | 0 ETH | 0.00007543 | ||||
Claim Clover Wit... | 8748267 | 1761 days ago | IN | 0 ETH | 0.00007988 | ||||
Claim Clover Wit... | 8748267 | 1761 days ago | IN | 0 ETH | 0.00007988 | ||||
Claim Clover Wit... | 8748267 | 1761 days ago | IN | 0 ETH | 0.00007986 | ||||
Claim Clover Wit... | 8748267 | 1761 days ago | IN | 0 ETH | 0.00007986 | ||||
Claim Clover Wit... | 8748267 | 1761 days ago | IN | 0 ETH | 0.00007988 | ||||
Claim Clover Wit... | 8748253 | 1761 days ago | IN | 0 ETH | 0.00007985 | ||||
Claim Clover Wit... | 8748253 | 1761 days ago | IN | 0 ETH | 0.00007988 | ||||
Claim Clover Wit... | 8748253 | 1761 days ago | IN | 0 ETH | 0.0000761 | ||||
Claim Clover Wit... | 8746750 | 1762 days ago | IN | 0 ETH | 0.00019047 | ||||
Claim Clover Wit... | 8746750 | 1762 days ago | IN | 0 ETH | 0.00019043 | ||||
Claim Clover Wit... | 8746750 | 1762 days ago | IN | 0 ETH | 0.0001904 | ||||
Claim Clover Wit... | 8746750 | 1762 days ago | IN | 0 ETH | 0.00019047 | ||||
Claim Clover Wit... | 8746750 | 1762 days ago | IN | 0 ETH | 0.00019048 | ||||
Claim Clover Wit... | 8746750 | 1762 days ago | IN | 0 ETH | 0.00019048 | ||||
Claim Clover Wit... | 8746750 | 1762 days ago | IN | 0 ETH | 0.00019043 | ||||
Claim Clover Wit... | 8746750 | 1762 days ago | IN | 0 ETH | 0.00019047 | ||||
Claim Clover Wit... | 8746750 | 1762 days ago | IN | 0 ETH | 0.00019047 | ||||
Claim Clover Wit... | 8746750 | 1762 days ago | IN | 0 ETH | 0.00019048 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
8726553 | 1765 days ago | 0.005 ETH | ||||
8726537 | 1765 days ago | 0.005 ETH | ||||
8721375 | 1766 days ago | 0.005 ETH | ||||
8720671 | 1766 days ago | 0.005 ETH | ||||
8720586 | 1766 days ago | 0.005 ETH | ||||
8718971 | 1766 days ago | 0.005 ETH | ||||
8714152 | 1767 days ago | 0.005 ETH | ||||
8714142 | 1767 days ago | 0.005 ETH | ||||
8709709 | 1767 days ago | 0.005 ETH | ||||
8709709 | 1767 days ago | 0.005 ETH | ||||
8709060 | 1768 days ago | 0.005 ETH | ||||
8708145 | 1768 days ago | 0.005 ETH | ||||
8708145 | 1768 days ago | 0.005 ETH | ||||
8708145 | 1768 days ago | 0.005 ETH | ||||
8708085 | 1768 days ago | 0.005 ETH | ||||
8707940 | 1768 days ago | 0.005 ETH | ||||
8706077 | 1768 days ago | 0.005 ETH | ||||
8706043 | 1768 days ago | 0.005 ETH | ||||
8703759 | 1768 days ago | 0.005 ETH | ||||
8701691 | 1769 days ago | 0.005 ETH | ||||
8701677 | 1769 days ago | 0.005 ETH | ||||
8701659 | 1769 days ago | 0.005 ETH | ||||
8700721 | 1769 days ago | 0.005 ETH | ||||
8700455 | 1769 days ago | 0.005 ETH | ||||
8700426 | 1769 days ago | 0.005 ETH |
Loading...
Loading
This contract contains unverified libraries: Reversi
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
CloversController
Compiler Version
v0.5.9+commit.e560f70d
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2019-10-04 */ // File: contracts/v5/Reversi.sol pragma solidity ^0.5.9; library Reversi { // event DebugBool(bool boolean); // event DebugBoard(bytes16 board); // event DebugUint(uint u); uint8 constant BLACK = 1; //0b01 //0x1 uint8 constant WHITE = 2; //0b10 //0x2 uint8 constant EMPTY = 3; //0b11 //0x3 struct Game { bool error; bool complete; bool symmetrical; bool RotSym; bool Y0Sym; bool X0Sym; bool XYSym; bool XnYSym; bytes16 board; bytes28 first32Moves; bytes28 lastMoves; uint8 currentPlayer; uint8 moveKey; uint8 blackScore; uint8 whiteScore; // string msg; } function isValid (bytes28[2] memory moves) public pure returns (bool) { Game memory game = playGame(moves); if (game.error) { return false; } else if (!game.complete) { return false; } else { return true; } } function getGame (bytes28[2] memory moves) public pure returns ( bool error, bool complete, bool symmetrical, bytes16 board, uint8 currentPlayer, uint8 moveKey // , string memory msg ) { Game memory game = playGame(moves); return ( game.error, game.complete, game.symmetrical, game.board, game.currentPlayer, game.moveKey // , game.msg ); } function showColors () public pure returns(uint8, uint8, uint8) { return (EMPTY, BLACK, WHITE); } function emptyBoard() public pure returns (bytes16) { // game.board = bytes16(10625432672847758622720); // completely empty board return bytes16(uint128(340282366920938456379662753540715053055)); // empty board except for center pieces } function playGame (bytes28[2] memory moves) internal pure returns (Game memory) { Game memory game; game.first32Moves = moves[0]; game.lastMoves = moves[1]; game.moveKey = 0; game.blackScore = 2; game.whiteScore = 2; game.error = false; game.complete = false; game.currentPlayer = BLACK; game.board = emptyBoard(); bool skip; uint8 move; uint8 col; uint8 row; uint8 i; bytes28 currentMoves; for (i = 0; i < 60 && !skip; i++) { currentMoves = game.moveKey < 32 ? game.first32Moves : game.lastMoves; move = readMove(currentMoves, game.moveKey % 32, 32); (col, row) = convertMove(move); skip = !validMove(move); if (i == 0 && (col != 2 || row != 3)) { skip = true; // this is to force the first move to always be C4 to avoid repeatable boards via mirroring translations game.error = true; } if (!skip && col < 8 && row < 8 && col >= 0 && row >= 0) { // game.msg = "make a move"; game = makeMove(game, col, row); game.moveKey = game.moveKey + 1; if (game.error) { if (!validMoveRemains(game)) { // player has no valid moves and must pass game.error = false; if (game.currentPlayer == BLACK) { game.currentPlayer = WHITE; } else { game.currentPlayer = BLACK; } game = makeMove(game, col, row); if (game.error) { game.error = true; skip = true; } } } } } if (!game.error) { game = isComplete(game); game = isSymmetrical(game); } return game; } function validMoveRemains (Game memory game) internal pure returns (bool) { bool validMovesRemain = false; bytes16 board = game.board; uint8 i; for (i = 0; i < 64 && !validMovesRemain; i++) { uint8[2] memory move = [((i - (i % 8)) / 8), (i % 8)]; uint8 tile = returnTile(game.board, move[0], move[1]); if (tile == EMPTY) { game.error = false; game.board = board; game = makeMove(game, move[0], move[1]); if (!game.error) { validMovesRemain = true; } } } return validMovesRemain; } function makeMove (Game memory game, uint8 col, uint8 row) internal pure returns (Game memory) { // square is already occupied if (returnTile(game.board, col, row) != EMPTY){ game.error = true; // game.msg = "Invalid Game (square is already occupied)"; return game; } int8[2][8] memory possibleDirections; uint8 possibleDirectionsLength; (possibleDirections, possibleDirectionsLength) = getPossibleDirections(game, col, row); // no valid directions if (possibleDirectionsLength == 0) { game.error = true; // game.msg = "Invalid Game (doesnt border other tiles)"; return game; } bytes28 newFlips; uint8 newFlipsLength; uint8 newFlipCol; uint8 newFlipRow; uint8 j; bool valid = false; for (uint8 i = 0; i < possibleDirectionsLength; i++) { delete newFlips; delete newFlipsLength; (newFlips, newFlipsLength) = traverseDirection(game, possibleDirections[i], col, row); for (j = 0; j < newFlipsLength; j++) { if (!valid) valid = true; (newFlipCol, newFlipRow) = convertMove(readMove(newFlips, j, newFlipsLength)); game.board = turnTile(game.board, game.currentPlayer, newFlipCol, newFlipRow); if (game.currentPlayer == WHITE) { game.whiteScore += 1; game.blackScore -= 1; } else { game.whiteScore -= 1; game.blackScore += 1; } } } //no valid flips in directions if (valid) { game.board = turnTile(game.board, game.currentPlayer, col, row); if (game.currentPlayer == WHITE) { game.whiteScore += 1; } else { game.blackScore += 1; } } else { game.error = true; // game.msg = "Invalid Game (doesnt flip any other tiles)"; return game; } // switch players if (game.currentPlayer == BLACK) { game.currentPlayer = WHITE; } else { game.currentPlayer = BLACK; } return game; } function getPossibleDirections (Game memory game, uint8 col, uint8 row) internal pure returns(int8[2][8] memory, uint8){ int8[2][8] memory possibleDirections; uint8 possibleDirectionsLength = 0; int8[2][8] memory dirs = [ [int8(-1), int8(0)], // W [int8(-1), int8(1)], // SW [int8(0), int8(1)], // S [int8(1), int8(1)], // SE [int8(1), int8(0)], // E [int8(1), int8(-1)], // NE [int8(0), int8(-1)], // N [int8(-1), int8(-1)] // NW ]; int8 focusedRowPos; int8 focusedColPos; int8[2] memory dir; uint8 testSquare; for (uint8 i = 0; i < 8; i++) { dir = dirs[i]; focusedColPos = int8(col) + dir[0]; focusedRowPos = int8(row) + dir[1]; // if tile is off the board it is not a valid move if (!(focusedRowPos > 7 || focusedRowPos < 0 || focusedColPos > 7 || focusedColPos < 0)) { testSquare = returnTile(game.board, uint8(focusedColPos), uint8(focusedRowPos)); // if the surrounding tile is current color or no color it can"t be part of a capture if (testSquare != game.currentPlayer) { if (testSquare != EMPTY) { possibleDirections[possibleDirectionsLength] = dir; possibleDirectionsLength++; } } } } return (possibleDirections, possibleDirectionsLength); } function traverseDirection (Game memory game, int8[2] memory dir, uint8 col, uint8 row) internal pure returns(bytes28, uint8) { bytes28 potentialFlips; uint8 potentialFlipsLength = 0; uint8 opponentColor; if (game.currentPlayer == BLACK) { opponentColor = WHITE; } else { opponentColor = BLACK; } // take one step at a time in this direction // ignoring the first step look for the same color as your tile bool skip = false; int8 testCol; int8 testRow; uint8 tile; for (uint8 j = 1; j < 9; j++) { if (!skip) { testCol = (int8(j) * dir[0]) + int8(col); testRow = (int8(j) * dir[1]) + int8(row); // ran off the board before hitting your own tile if (testCol > 7 || testCol < 0 || testRow > 7 || testRow < 0) { delete potentialFlips; potentialFlipsLength = 0; skip = true; } else{ tile = returnTile(game.board, uint8(testCol), uint8(testRow)); if (tile == opponentColor) { // if tile is opposite color it could be flipped, so add to potential flip array (potentialFlips, potentialFlipsLength) = addMove(potentialFlips, potentialFlipsLength, uint8(testCol), uint8(testRow)); } else if (tile == game.currentPlayer && j > 1) { // hit current players tile which means capture is complete skip = true; } else { // either hit current players own color before hitting an opponent"s // or hit an empty space delete potentialFlips; delete potentialFlipsLength; skip = true; } } } } return (potentialFlips, potentialFlipsLength); } function isComplete (Game memory game) internal pure returns (Game memory) { if (game.moveKey == 60) { // game.msg = "good game"; game.complete = true; return game; } else { uint8 i; bool validMovesRemains = false; bytes16 board = game.board; for (i = 0; i < 64 && !validMovesRemains; i++) { uint8[2] memory move = [((i - (i % 8)) / 8), (i % 8)]; uint8 tile = returnTile(game.board, move[0], move[1]); if (tile == EMPTY) { game.currentPlayer = BLACK; game.error = false; game.board = board; game = makeMove(game, move[0], move[1]); if (!game.error) { validMovesRemains = true; } game.currentPlayer = WHITE; game.error = false; game.board = board; game = makeMove(game, move[0], move[1]); if (!game.error) { validMovesRemains = true; } } } if (validMovesRemains) { game.error = true; // game.msg = "Invalid Game (moves still available)"; } else { // game.msg = "good game"; game.complete = true; game.error = false; } } return game; } function isSymmetrical (Game memory game) internal pure returns (Game memory) { bool RotSym = true; bool Y0Sym = true; bool X0Sym = true; bool XYSym = true; bool XnYSym = true; for (uint8 i = 0; i < 8 && (RotSym || Y0Sym || X0Sym || XYSym || XnYSym); i++) { for (uint8 j = 0; j < 8 && (RotSym || Y0Sym || X0Sym || XYSym || XnYSym); j++) { // rotational symmetry if (returnBytes(game.board, i, j) != returnBytes(game.board, (7 - i), (7 - j))) { RotSym = false; } // symmetry on y = 0 if (returnBytes(game.board, i, j) != returnBytes(game.board, i, (7 - j))) { Y0Sym = false; } // symmetry on x = 0 if (returnBytes(game.board, i, j) != returnBytes(game.board, (7 - i), j)) { X0Sym = false; } // symmetry on x = y if (returnBytes(game.board, i, j) != returnBytes(game.board, (7 - j), (7 - i))) { XYSym = false; } // symmetry on x = -y if (returnBytes(game.board, i, j) != returnBytes(game.board, j, i)) { XnYSym = false; } } } if (RotSym || Y0Sym || X0Sym || XYSym || XnYSym) { game.symmetrical = true; game.RotSym = RotSym; game.Y0Sym = Y0Sym; game.X0Sym = X0Sym; game.XYSym = XYSym; game.XnYSym = XnYSym; } return game; } // Utilities function returnSymmetricals (bool RotSym, bool Y0Sym, bool X0Sym, bool XYSym, bool XnYSym) public pure returns (uint256) { uint256 symmetries = (RotSym ? 1 : 0) << 1; symmetries = (symmetries & (Y0Sym ? 1 : 0)) << 1; symmetries = (symmetries & (X0Sym ? 1 : 0)) << 1; symmetries = (symmetries & (XYSym ? 1 : 0)) << 1; symmetries = symmetries & (XnYSym ? 1 : 0); return symmetries; } function returnBytes (bytes16 board, uint8 col, uint8 row) internal pure returns (bytes16) { uint128 push = posToPush(col, row); return (board >> push) & bytes16(uint128(3)); } function turnTile (bytes16 board, uint8 color, uint8 col, uint8 row) internal pure returns (bytes16){ if (col > 7) revert(); if (row > 7) revert(); uint128 push = posToPush(col, row); bytes16 mask = bytes16(uint128(3)) << push;// 0b00000011 (ones) board = ((board ^ mask) & board); return board | (bytes16(uint128(color)) << push); } function returnTile (bytes16 board, uint8 col, uint8 row) public pure returns (uint8){ uint128 push = posToPush(col, row); bytes16 tile = (board >> push ) & bytes16(uint128(3)); return uint8(uint128(tile)); // returns 2 } function posToPush (uint8 col, uint8 row) internal pure returns (uint128){ return uint128(((64) - ((8 * col) + row + 1)) * 2); } function readMove (bytes28 moveSequence, uint8 moveKey, uint8 movesLength) public pure returns(uint8) { bytes28 mask = bytes28(uint224(127)); uint8 push = (movesLength * 7) - (moveKey * 7) - 7; return uint8(uint224((moveSequence >> push) & mask)); } function addMove (bytes28 moveSequence, uint8 movesLength, uint8 col, uint8 row) internal pure returns (bytes28, uint8) { uint256 foo = col + (row * 8) + 64; bytes28 move = bytes28(uint224(foo)); moveSequence = moveSequence << 7; moveSequence = moveSequence | move; movesLength++; return (moveSequence, movesLength); } function validMove (uint8 move) internal pure returns(bool) { return move >= 64; } function convertMove (uint8 move) public pure returns(uint8, uint8) { move = move - 64; uint8 col = move % 8; uint8 row = (move - col) / 8; return (col, row); } } // File: contracts/v5/IClovers.sol pragma solidity ^0.5.9; contract IClovers { function ownerOf(uint256 _tokenId) public view returns (address _owner); function setCloverMoves(uint256 _tokenId, bytes28[2] memory moves) public; function getCloverMoves(uint256 _tokenId) public view returns (bytes28[2] memory); function getAllSymmetries() public view returns (uint256, uint256, uint256, uint256, uint256, uint256); function exists(uint256 _tokenId) public view returns (bool _exists); function getBlockMinted(uint256 _tokenId) public view returns (uint256); function setBlockMinted(uint256 _tokenId, uint256 value) public; function setKeep(uint256 _tokenId, bool value) public; function setSymmetries(uint256 _tokenId, uint256 _symmetries) public; function setReward(uint256 _tokenId, uint256 _amount) public; function mint (address _to, uint256 _tokenId) public; function getReward(uint256 _tokenId) public view returns (uint256); function getKeep(uint256 _tokenId) public view returns (bool); function transferFrom(address _from, address _to, uint256 _tokenId) public; function moveEth(address _to, uint256 _amount) public; function getSymmetries(uint256 _tokenId) public view returns (uint256); function deleteClover(uint256 _tokenId) public; function setAllSymmetries(uint256 _totalSymmetries, uint256 RotSym, uint256 Y0Sym, uint256 X0Sym, uint256 XYSym, uint256 XnYSym) public; } // File: contracts/v5/IClubToken.sol pragma solidity ^0.5.9; contract IClubToken { function balanceOf(address _owner) public view returns (uint256); function burn(address _burner, uint256 _value) public; function mint(address _to, uint256 _amount) public returns (bool); } // File: contracts/v5/IClubTokenController.sol pragma solidity ^0.5.9; contract IClubTokenController { function buy(address buyer) public payable returns(bool); } // File: contracts/v5/ISimpleCloversMarket.sol pragma solidity ^0.5.9; contract ISimpleCloversMarket { function sell(uint256 _tokenId, uint256 price) public; } // File: @openzeppelin/contracts/math/SafeMath.sol pragma solidity ^0.5.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, "SafeMath: division by zero"); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b != 0, "SafeMath: modulo by zero"); return a % b; } } // File: @openzeppelin/contracts/ownership/Ownable.sol pragma solidity ^0.5.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. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be aplied to your functions to restrict their use to * the owner. */ contract Ownable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () internal { _owner = msg.sender; emit OwnershipTransferred(address(0), _owner); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(isOwner(), "Ownable: caller is not the owner"); _; } /** * @dev Returns true if the caller is the current owner. */ function isOwner() public view returns (bool) { return msg.sender == _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 onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = 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 onlyOwner { _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). */ function _transferOwnership(address newOwner) internal { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File: @openzeppelin/contracts/cryptography/ECDSA.sol pragma solidity ^0.5.0; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * (.note) This call _does not revert_ if the signature is invalid, or * if the signer is otherwise unable to be retrieved. In those scenarios, * the zero address is returned. * * (.warning) `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise) * be too long), and then calling `toEthSignedMessageHash` on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { // Check the signature length if (signature.length != 65) { return (address(0)); } // Divide the signature in r, s and v variables bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. // solhint-disable-next-line no-inline-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return address(0); } if (v != 27 && v != 28) { return address(0); } // If the signature is valid (and not malleable), return the signer address return ecrecover(hash, v, r, s); } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * replicates the behavior of the * [`eth_sign`](https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign) * JSON-RPC method. * * See `recover`. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } } // File: contracts/v5/CloversController.sol pragma solidity ^0.5.9; /** * The CloversController is a replaceable endpoint for minting and unminting Clovers.sol and ClubToken.sol */ contract CloversController is Ownable { event cloverCommitted(bytes32 movesHash, address owner); event cloverClaimed(uint256 tokenId, bytes28[2] moves, address sender, address recepient, uint reward, uint256 symmetries, bool keep); event cloverChallenged(uint256 tokenId, bytes28[2] moves, address owner, address challenger); using SafeMath for uint256; using ECDSA for bytes32; bool public paused; address public oracle; IClovers public clovers; IClubToken public clubToken; IClubTokenController public clubTokenController; ISimpleCloversMarket public simpleCloversMarket; // Reversi public reversi; uint256 public gasLastUpdated_fastGasPrice_averageGasPrice_safeLowGasPrice; uint256 public gasBlockMargin = 240; // ~1 hour at 15 second blocks uint256 public basePrice; uint256 public priceMultiplier; uint256 public payMultiplier; mapping(bytes32=>address) public commits; modifier notPaused() { require(!paused, "Must not be paused"); _; } constructor( IClovers _clovers, IClubToken _clubToken, IClubTokenController _clubTokenController // Reversi _reversi ) public { clovers = _clovers; clubToken = _clubToken; clubTokenController = _clubTokenController; // reversi = _reversi; paused = true; } function getMovesHash(bytes28[2] memory moves) public pure returns (bytes32) { return keccak256(abi.encodePacked(moves)); } function getMovesHashWithRecepient(bytes32 movesHash, address recepient) public pure returns (bytes32) { return keccak256(abi.encodePacked(movesHash, recepient)); } /** * @dev Checks whether the game is valid. * @param moves The moves needed to play validate the game. * @return A boolean representing whether or not the game is valid. */ function isValid(bytes28[2] memory moves) public pure returns (bool) { Reversi.Game memory game = Reversi.playGame(moves); return isValidGame(game.error, game.complete); } /** * @dev Checks whether the game is valid. * @param error The pre-played game error * @param complete The pre-played game complete boolean * @return A boolean representing whether or not the game is valid. */ function isValidGame(bool error, bool complete) public pure returns (bool) { if (error || !complete) { return false; } else { return true; } } function getGame (bytes28[2] memory moves) public pure returns (bool error, bool complete, bool symmetrical, bytes16 board, uint8 currentPlayer, uint8 moveKey) { // return Reversi.getGame(moves); Reversi.Game memory game = Reversi.playGame(moves); return ( game.error, game.complete, game.symmetrical, game.board, game.currentPlayer, game.moveKey // game.msg ); } /** * @dev Calculates the reward of the board. * @param symmetries symmetries saved as a uint256 value like 00010101 where bits represent symmetry types. * @return A uint256 representing the reward that would be returned for claiming the board. */ function calculateReward(uint256 symmetries) public view returns (uint256) { uint256 Symmetricals; uint256 RotSym; uint256 Y0Sym; uint256 X0Sym; uint256 XYSym; uint256 XnYSym; (Symmetricals, RotSym, Y0Sym, X0Sym, XYSym, XnYSym) = clovers.getAllSymmetries(); uint256 base = 0; if (symmetries >> 4 & 1 == 1) base = base.add(payMultiplier.mul(Symmetricals + 1).div(RotSym + 1)); if (symmetries >> 3 & 1 == 1) base = base.add(payMultiplier.mul(Symmetricals + 1).div(Y0Sym + 1)); if (symmetries >> 2 & 1 == 1) base = base.add(payMultiplier.mul(Symmetricals + 1).div(X0Sym + 1)); if (symmetries >> 1 & 1 == 1) base = base.add(payMultiplier.mul(Symmetricals + 1).div(XYSym + 1)); if (symmetries & 1 == 1) base = base.add(payMultiplier.mul(Symmetricals + 1).div(XnYSym + 1)); return base; } function getPrice(uint256 symmetries) public view returns(uint256) { return basePrice.add(calculateReward(symmetries)); } // In order to prevent commit reveal griefing the first commit is a combined hash of the moves and the recepient. // In order to use the same commit mapping, we mark this hash simply as address(1) so it is no longer the equivalent of address(0) function claimCloverSecurelyPartOne(bytes32 movesHashWithRecepient) public { commits[movesHashWithRecepient] = address(1); commits[keccak256(abi.encodePacked(msg.sender))] = address(block.number); } // Once a commit has been made to guarantee the move hash is associated with the recepient we can make a commit on the hash of the moves themselves // If we were to make a claim on the moves in plaintext, the transaction could be front run on the claimCloverWithVerification or the claimCloverWithSignature function claimCloverSecurelyPartTwo(bytes32 movesHash) public { require(uint256(commits[keccak256(abi.encodePacked(msg.sender))]) < block.number, "Can't combine step1 with step2"); bytes32 commitHash = getMovesHashWithRecepient(movesHash, msg.sender); address commitOfMovesHashWithRecepient = commits[commitHash]; require( address(commitOfMovesHashWithRecepient) == address(1), "Invalid commitOfMovesHashWithRecepient, please do claimCloverSecurelyPartOne" ); delete(commits[commitHash]); commits[movesHash] = msg.sender; } function claimCloverWithVerification(bytes28[2] memory moves, bool keep) public payable returns (bool) { bytes32 movesHash = getMovesHash(moves); address committedRecepient = commits[movesHash]; require(committedRecepient == address(0) || committedRecepient == msg.sender, "Invalid committedRecepient"); Reversi.Game memory game = Reversi.playGame(moves); require(isValidGame(game.error, game.complete), "Invalid game"); uint256 tokenId = convertBytes16ToUint(game.board); require(!clovers.exists(tokenId), "Clover already exists"); uint256 symmetries = Reversi.returnSymmetricals(game.RotSym, game.Y0Sym, game.X0Sym, game.XYSym, game.XnYSym); require(_claimClover(tokenId, moves, symmetries, msg.sender, keep), "Claim must succeed"); delete(commits[movesHash]); return true; } /** * @dev Claim the Clover without a commit or reveal. Payable so you can buy tokens if needed. * @param tokenId The board that results from the moves. * @param moves The moves that make up the Clover reversi game. * @param symmetries symmetries saved as a uint256 value like 00010101 where bits represent symmetry * @param keep symmetries saved as a uint256 value like 00010101 where bits represent symmetry * @param signature symmetries saved as a uint256 value like 00010101 where bits represent symmetry * types. * @return A boolean representing whether or not the claim was successful. */ function claimCloverWithSignature(uint256 tokenId, bytes28[2] memory moves, uint256 symmetries, bool keep, bytes memory signature) public payable notPaused returns (bool) { address committedRecepient = commits[getMovesHash(moves)]; require(committedRecepient == address(0) || committedRecepient == msg.sender, "Invalid committedRecepient"); require(!clovers.exists(tokenId), "Clover already exists"); require(checkSignature(tokenId, moves, symmetries, keep, msg.sender, signature, oracle), "Invalid Signature"); require(_claimClover(tokenId, moves, symmetries, msg.sender, keep), "Claim must succeed"); return true; } function _claimClover(uint256 tokenId, bytes28[2] memory moves, uint256 symmetries, address recepient, bool keep) internal returns (bool) { clovers.setCloverMoves(tokenId, moves); clovers.setKeep(tokenId, keep); uint256 reward; if (symmetries > 0) { clovers.setSymmetries(tokenId, symmetries); reward = calculateReward(symmetries); clovers.setReward(tokenId, reward); } uint256 price = basePrice.add(reward); if (keep && price > 0) { // If the user decides to keep the Clover, they must // pay for it in club tokens according to the reward price. if (clubToken.balanceOf(msg.sender) < price) { clubTokenController.buy.value(msg.value)(msg.sender); } clubToken.burn(msg.sender, price); } if (keep) { // If the user decided to keep the Clover clovers.mint(recepient, tokenId); } else { // If the user decided not to keep the Clover, they will // receive the reward price in club tokens, and the clover will // go for sale by the contract. clovers.mint(address(clovers), tokenId); simpleCloversMarket.sell(tokenId, basePrice.add(reward.mul(priceMultiplier))); if (reward > 0) { require(clubToken.mint(recepient, reward), "mint must succeed"); } } emit cloverClaimed(tokenId, moves, msg.sender, recepient, reward, symmetries, keep); return true; } /** * @dev Convert a bytes16 board into a uint256. * @param _board The board being converted. * @return number the uint256 being converted. */ function convertBytes16ToUint(bytes16 _board) public pure returns(uint256 number) { for(uint i=0;i<_board.length;i++){ number = number + uint(uint8(_board[i]))*(2**(8*(_board.length-(i+1)))); } } /** * @dev Challenge a Clover for being invalid. * @param tokenId The board being challenged. * @return A boolean representing whether or not the challenge was successful. */ function challengeClover(uint256 tokenId) public returns (bool) { require(clovers.exists(tokenId), "Clover must exist to be challenged"); bool valid = true; bytes28[2] memory moves = clovers.getCloverMoves(tokenId); address payable _owner = address(uint160(owner())); if (msg.sender != _owner && msg.sender != oracle) { Reversi.Game memory game = Reversi.playGame(moves); if(convertBytes16ToUint(game.board) != tokenId) { valid = false; } if(valid && isValidGame(game.error, game.complete)) { uint256 symmetries = clovers.getSymmetries(tokenId); valid = (symmetries >> 4 & 1) > 0 == game.RotSym ? valid : false; valid = (symmetries >> 3 & 1) > 0 == game.Y0Sym ? valid : false; valid = (symmetries >> 2 & 1) > 0 == game.X0Sym ? valid : false; valid = (symmetries >> 1 & 1) > 0 == game.XYSym ? valid : false; valid = (symmetries & 1) > 0 == game.XnYSym ? valid : false; } else { valid = false; } require(!valid, "Must be invalid to challenge"); } removeSymmetries(tokenId); address committer = clovers.ownerOf(tokenId); emit cloverChallenged(tokenId, moves, committer, msg.sender); clovers.deleteClover(tokenId); return true; } function updateSalePrice(uint256 tokenId, uint256 _price) public onlyOwner { simpleCloversMarket.sell(tokenId, _price); } /** * @dev Moves clovers without explicit allow permission for use by simpleCloversMarket * in order to avoid double transaction (allow, transferFrom) * @param _from The current owner of the Clover * @param _to The future owner of the Clover * @param tokenId The Clover */ function transferFrom(address _from, address _to, uint256 tokenId) public { require(msg.sender == address(simpleCloversMarket), "transferFrom can only be done by simpleCloversMarket"); clovers.transferFrom(_from, _to, tokenId); } /** * @dev Updates pause boolean. * @param _paused The new puased boolean. */ function updatePaused(bool _paused) public onlyOwner { paused = _paused; } /** * @dev Updates oracle Address. * @param _oracle The new oracle Address. */ function updateOracle(address _oracle) public onlyOwner { oracle = _oracle; } /** * @dev Updates simpleCloversMarket Address. * @param _simpleCloversMarket The new simpleCloversMarket address. */ function updateSimpleCloversMarket(ISimpleCloversMarket _simpleCloversMarket) public onlyOwner { simpleCloversMarket = _simpleCloversMarket; } /** * @dev Updates clubTokenController Address. * @param _clubTokenController The new clubTokenController address. */ function updateClubTokenController(IClubTokenController _clubTokenController) public onlyOwner { clubTokenController = _clubTokenController; } /** * @dev Updates the pay multiplier, used to calculate token reward. * @param _payMultiplier The uint256 value of pay multiplier. */ function updatePayMultipier(uint256 _payMultiplier) public onlyOwner { payMultiplier = _payMultiplier; } /** * @dev Updates the price multiplier, used to calculate the clover price (multiplied by the original reward). * @param _priceMultiplier The uint256 value of the price multiplier. */ function updatePriceMultipier(uint256 _priceMultiplier) public onlyOwner { priceMultiplier = _priceMultiplier; } /** * @dev Updates the base price, used to calculate the clover cost. * @param _basePrice The uint256 value of the base price. */ function updateBasePrice(uint256 _basePrice) public onlyOwner { basePrice = _basePrice; } /** * @dev Adds new tallys of the totals numbers of clover symmetries. * @param tokenId The token which needs to be examined. */ function addSymmetries(uint256 tokenId) private { uint256 Symmetricals; uint256 RotSym; uint256 Y0Sym; uint256 X0Sym; uint256 XYSym; uint256 XnYSym; (Symmetricals, RotSym, Y0Sym, X0Sym, XYSym, XnYSym) = clovers.getAllSymmetries(); uint256 symmetries = clovers.getSymmetries(tokenId); Symmetricals = Symmetricals.add(symmetries > 0 ? 1 : 0); RotSym = RotSym.add(uint256(symmetries >> 4 & 1)); Y0Sym = Y0Sym.add(uint256(symmetries >> 3 & 1)); X0Sym = X0Sym.add(uint256(symmetries >> 2 & 1)); XYSym = XYSym.add(uint256(symmetries >> 1 & 1)); XnYSym = XnYSym.add(uint256(symmetries & 1)); clovers.setAllSymmetries(Symmetricals, RotSym, Y0Sym, X0Sym, XYSym, XnYSym); } /** * @dev Remove false tallys of the totals numbers of clover symmetries. * @param tokenId The token which needs to be examined. */ function removeSymmetries(uint256 tokenId) private { uint256 Symmetricals; uint256 RotSym; uint256 Y0Sym; uint256 X0Sym; uint256 XYSym; uint256 XnYSym; (Symmetricals, RotSym, Y0Sym, X0Sym, XYSym, XnYSym) = clovers.getAllSymmetries(); uint256 symmetries = clovers.getSymmetries(tokenId); Symmetricals = Symmetricals.sub(symmetries > 0 ? 1 : 0); RotSym = RotSym.sub(uint256(symmetries >> 4 & 1)); Y0Sym = Y0Sym.sub(uint256(symmetries >> 3 & 1)); X0Sym = X0Sym.sub(uint256(symmetries >> 2 & 1)); XYSym = XYSym.sub(uint256(symmetries >> 1 & 1)); XnYSym = XnYSym.sub(uint256(symmetries & 1)); clovers.setAllSymmetries(Symmetricals, RotSym, Y0Sym, X0Sym, XYSym, XnYSym); } function checkSignature( uint256 tokenId, bytes28[2] memory moves, uint256 symmetries, bool keep, address recepient, bytes memory signature, address signer ) public pure returns (bool) { bytes32 hash = toEthSignedMessageHash(getHash(tokenId, moves, symmetries, keep, recepient)); address result = recover(hash, signature); return (result != address(0) && result == signer); } function getHash(uint256 tokenId, bytes28[2] memory moves, uint256 symmetries, bool keep, address recepient) public pure returns (bytes32) { return keccak256(abi.encodePacked(tokenId, moves, symmetries, keep, recepient)); } function recover(bytes32 hash, bytes memory signature) public pure returns (address) { return hash.recover(signature); } function toEthSignedMessageHash(bytes32 hash) public pure returns (bytes32) { return hash.toEthSignedMessageHash(); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":false,"inputs":[{"name":"_paused","type":"bool"}],"name":"updatePaused","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"moves","type":"bytes28[2]"}],"name":"getGame","outputs":[{"name":"error","type":"bool"},{"name":"complete","type":"bool"},{"name":"symmetrical","type":"bool"},{"name":"board","type":"bytes16"},{"name":"currentPlayer","type":"uint8"},{"name":"moveKey","type":"uint8"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"clovers","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"hash","type":"bytes32"},{"name":"signature","type":"bytes"}],"name":"recover","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"moves","type":"bytes28[2]"},{"name":"keep","type":"bool"}],"name":"claimCloverWithVerification","outputs":[{"name":"","type":"bool"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_oracle","type":"address"}],"name":"updateOracle","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"moves","type":"bytes28[2]"}],"name":"getMovesHash","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"name":"error","type":"bool"},{"name":"complete","type":"bool"}],"name":"isValidGame","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"moves","type":"bytes28[2]"}],"name":"isValid","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"payMultiplier","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"commits","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"tokenId","type":"uint256"},{"name":"_price","type":"uint256"}],"name":"updateSalePrice","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"tokenId","type":"uint256"},{"name":"moves","type":"bytes28[2]"},{"name":"symmetries","type":"uint256"},{"name":"keep","type":"bool"},{"name":"recepient","type":"address"}],"name":"getHash","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"movesHashWithRecepient","type":"bytes32"}],"name":"claimCloverSecurelyPartOne","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"tokenId","type":"uint256"},{"name":"moves","type":"bytes28[2]"},{"name":"symmetries","type":"uint256"},{"name":"keep","type":"bool"},{"name":"recepient","type":"address"},{"name":"signature","type":"bytes"},{"name":"signer","type":"address"}],"name":"checkSignature","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"tokenId","type":"uint256"}],"name":"challengeClover","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"gasLastUpdated_fastGasPrice_averageGasPrice_safeLowGasPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"oracle","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_payMultiplier","type":"uint256"}],"name":"updatePayMultipier","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"hash","type":"bytes32"}],"name":"toEthSignedMessageHash","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"_clubTokenController","type":"address"}],"name":"updateClubTokenController","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"simpleCloversMarket","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"tokenId","type":"uint256"},{"name":"moves","type":"bytes28[2]"},{"name":"symmetries","type":"uint256"},{"name":"keep","type":"bool"},{"name":"signature","type":"bytes"}],"name":"claimCloverWithSignature","outputs":[{"name":"","type":"bool"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"gasBlockMargin","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_board","type":"bytes16"}],"name":"convertBytes16ToUint","outputs":[{"name":"number","type":"uint256"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"_priceMultiplier","type":"uint256"}],"name":"updatePriceMultipier","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"clubTokenController","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"movesHash","type":"bytes32"}],"name":"claimCloverSecurelyPartTwo","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"basePrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_simpleCloversMarket","type":"address"}],"name":"updateSimpleCloversMarket","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"symmetries","type":"uint256"}],"name":"calculateReward","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"priceMultiplier","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"clubToken","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"symmetries","type":"uint256"}],"name":"getPrice","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"movesHash","type":"bytes32"},{"name":"recepient","type":"address"}],"name":"getMovesHashWithRecepient","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_basePrice","type":"uint256"}],"name":"updateBasePrice","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_clovers","type":"address"},{"name":"_clubToken","type":"address"},{"name":"_clubTokenController","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"movesHash","type":"bytes32"},{"indexed":false,"name":"owner","type":"address"}],"name":"cloverCommitted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"tokenId","type":"uint256"},{"indexed":false,"name":"moves","type":"bytes28[2]"},{"indexed":false,"name":"sender","type":"address"},{"indexed":false,"name":"recepient","type":"address"},{"indexed":false,"name":"reward","type":"uint256"},{"indexed":false,"name":"symmetries","type":"uint256"},{"indexed":false,"name":"keep","type":"bool"}],"name":"cloverClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"tokenId","type":"uint256"},{"indexed":false,"name":"moves","type":"bytes28[2]"},{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"challenger","type":"address"}],"name":"cloverChallenged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]
Contract Creation Code
608060405260f060075534801561001557600080fd5b506040516200455b3803806200455b8339818101604052606081101561003a57600080fd5b5080516020820151604092830151600080546001600160a01b031916331780825594519394929391926001600160a01b0316917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3600280546001600160a01b039485166001600160a01b0319918216179091556003805493851693821693909317909255600480549190931691161790556000805460ff60a01b19167401000000000000000000000000000000000000000017905561445880620001036000396000f3fe6080604052600436106102d15760003560e01c80638a05aafa11610179578063a89b55da116100d6578063d50cb88b1161008a578063f1b4bce911610064578063f1b4bce914610c2d578063f2fde38b14610c66578063fd5baa8814610c99576102d1565b8063d50cb88b14610bd9578063d76bbd5214610bee578063e757223014610c03576102d1565b8063c7876ea4116100bb578063c7876ea414610b67578063d010ed7014610b7c578063d2d7231f14610baf576102d1565b8063a89b55da14610b28578063c434968414610b3d576102d1565b8063975e4b2a1161012d578063a069870611610112578063a069870614610aac578063a4a83ca614610ac1578063a7e901b014610afe576102d1565b8063975e4b2a146109af5780639a0d981e146109c4576102d1565b80638f32d59b1161015e5780638f32d59b1461093d578063918a15cf146109525780639564e1801461097c576102d1565b80638a05aafa146108fe5780638da5cb5b14610928576102d1565b80633afcba96116102325780636e1258e7116101e65780637b7db9fa116101c05780637b7db9fa146108aa5780637cce4656146108d45780637dc0d1d0146108e9576102d1565b80636e1258e71461075b5780636e88f21f14610785578063715018a614610895576102d1565b80634896672e116102175780634896672e146106a0578063580bdd8c146106d05780635c975abb14610746576102d1565b80633afcba96146106615780634788578114610676576102d1565b80631cb44dfc11610289578063225c35b21161026e578063225c35b21461059257806323b872dd146105c6578063271eff9414610609576102d1565b80631cb44dfc146104f55780631ce5145614610528576102d1565b80630d576bfa116102ba5780630d576bfa146103a957806319045a25146103da57806319faa73014610494576102d1565b806308cdc2a8146102d657806308d27c7f14610304575b600080fd5b3480156102e257600080fd5b50610302600480360360208110156102f957600080fd5b50351515610cc3565b005b34801561031057600080fd5b5061035c6004803603604081101561032757600080fd5b60408051808201825291830192918183019183906002908390839080828437600092019190915250919450610d669350505050565b6040805196151587529415156020870152921515858501526fffffffffffffffffffffffffffffffff19909116606085015260ff90811660808501521660a0830152519081900360c00190f35b3480156103b557600080fd5b506103be610db4565b604080516001600160a01b039092168252519081900360200190f35b3480156103e657600080fd5b506103be600480360360408110156103fd57600080fd5b8135919081019060408101602082013564010000000081111561041f57600080fd5b82018360208201111561043157600080fd5b8035906020019184600183028401116401000000008311171561045357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610dc3945050505050565b6104e1600480360360608110156104aa57600080fd5b6040805180820182529183019291818301918390600290839083908082843760009201919091525091945050503515159050610dde565b604080519115158252519081900360200190f35b34801561050157600080fd5b506103026004803603602081101561051857600080fd5b50356001600160a01b031661114a565b34801561053457600080fd5b506105806004803603604081101561054b57600080fd5b604080518082018252918301929181830191839060029083908390808284376000920191909152509194506111dd9350505050565b60408051918252519081900360200190f35b34801561059e57600080fd5b506104e1600480360360408110156105b557600080fd5b508035151590602001351515611233565b3480156105d257600080fd5b50610302600480360360608110156105e957600080fd5b506001600160a01b03813581169160208101359091169060400135611254565b34801561061557600080fd5b506104e16004803603604081101561062c57600080fd5b604080518082018252918301929181830191839060029083908390808284376000920191909152509194506113309350505050565b34801561066d57600080fd5b5061058061135e565b34801561068257600080fd5b506103be6004803603602081101561069957600080fd5b5035611364565b3480156106ac57600080fd5b50610302600480360360408110156106c357600080fd5b508035906020013561137f565b3480156106dc57600080fd5b50610580600480360360c08110156106f357600080fd5b6040805180820182528335939283019291606083019190602084019060029083908390808284376000920191909152509194505081359250506020810135151590604001356001600160a01b0316611461565b34801561075257600080fd5b506104e16114f6565b34801561076757600080fd5b506103026004803603602081101561077e57600080fd5b5035611517565b34801561079157600080fd5b506104e160048036036101008110156107a957600080fd5b604080518082018252833593928301929160608301919060208401906002908390839080828437600092019190915250919483359460208501351515946001600160a01b0360408201351694509192509060808101906060013564010000000081111561081557600080fd5b82018360208201111561082757600080fd5b8035906020019184600183028401116401000000008311171561084957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550505090356001600160a01b031691506115929050565b3480156108a157600080fd5b506103026115f1565b3480156108b657600080fd5b506104e1600480360360208110156108cd57600080fd5b50356116ac565b3480156108e057600080fd5b50610580611c00565b3480156108f557600080fd5b506103be611c06565b34801561090a57600080fd5b506103026004803603602081101561092157600080fd5b5035611c15565b34801561093457600080fd5b506103be611c73565b34801561094957600080fd5b506104e1611c82565b34801561095e57600080fd5b506105806004803603602081101561097557600080fd5b5035611c93565b34801561098857600080fd5b506103026004803603602081101561099f57600080fd5b50356001600160a01b0316611c9e565b3480156109bb57600080fd5b506103be611d31565b6104e1600480360360c08110156109da57600080fd5b604080518082018252833593928301929160608301919060208401906002908390839080828437600092019190915250919483359460208501351515949193509150606081019060400135640100000000811115610a3757600080fd5b820183602082011115610a4957600080fd5b80359060200191846001830284011164010000000083111715610a6b57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611d40945050505050565b348015610ab857600080fd5b50610580612005565b348015610acd57600080fd5b5061058060048036036020811015610ae457600080fd5b50356fffffffffffffffffffffffffffffffff191661200b565b348015610b0a57600080fd5b5061030260048036036020811015610b2157600080fd5b5035612049565b348015610b3457600080fd5b506103be6120a7565b348015610b4957600080fd5b5061030260048036036020811015610b6057600080fd5b50356120b6565b348015610b7357600080fd5b506105806121fa565b348015610b8857600080fd5b5061030260048036036020811015610b9f57600080fd5b50356001600160a01b0316612200565b348015610bbb57600080fd5b5061058060048036036020811015610bd257600080fd5b5035612293565b348015610be557600080fd5b5061058061246a565b348015610bfa57600080fd5b506103be612470565b348015610c0f57600080fd5b5061058060048036036020811015610c2657600080fd5b503561247f565b348015610c3957600080fd5b5061058060048036036040811015610c5057600080fd5b50803590602001356001600160a01b031661249c565b348015610c7257600080fd5b5061030260048036036020811015610c8957600080fd5b50356001600160a01b03166124ee565b348015610ca557600080fd5b5061030260048036036020811015610cbc57600080fd5b5035612553565b610ccb611c82565b610d1c576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6000805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b600080600080600080610d77614272565b610d80886125b1565b80516020820151604083015161010084015161016085015161018090950151939d929c50909a509850919650945092505050565b6002546001600160a01b031681565b6000610dd5838363ffffffff6127d916565b90505b92915050565b600080610dea846111dd565b6000818152600b60205260409020549091506001600160a01b0316801580610e1a57506001600160a01b03811633145b610e6b576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420636f6d6d6974746564526563657069656e74000000000000604482015290519081900360640190fd5b610e73614272565b610e7c866125b1565b9050610e9081600001518260200151611233565b610ee1576040805162461bcd60e51b815260206004820152600c60248201527f496e76616c69642067616d650000000000000000000000000000000000000000604482015290519081900360640190fd5b6000610ef182610100015161200b565b600254604080517f4f558e790000000000000000000000000000000000000000000000000000000081526004810184905290519293506001600160a01b0390911691634f558e7991602480820192602092909190829003018186803b158015610f5957600080fd5b505afa158015610f6d573d6000803e3d6000fd5b505050506040513d6020811015610f8357600080fd5b505115610fd7576040805162461bcd60e51b815260206004820152601560248201527f436c6f76657220616c7265616479206578697374730000000000000000000000604482015290519081900360640190fd5b6060820151608083015160a084015160c085015160e0860151604080517fa250cc3400000000000000000000000000000000000000000000000000000000815295151560048701529315156024860152911515604485015215156064840152151560848301525160009173f640b022ab52a003466daaefb5e87bbee7ac1bdf9163a250cc349160a480820192602092909190829003018186803b15801561107d57600080fd5b505af4158015611091573d6000803e3d6000fd5b505050506040513d60208110156110a757600080fd5b505190506110b8828983338b612903565b611109576040805162461bcd60e51b815260206004820152601260248201527f436c61696d206d75737420737563636565640000000000000000000000000000604482015290519081900360640190fd5b505050600091825250600b6020526040902080547fffffffffffffffffffffffff000000000000000000000000000000000000000016905550600192915050565b611152611c82565b6111a3576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6000816040516020018082600260200280838360005b8381101561120b5781810151838201526020016111f3565b505050509050019150506040516020818303038152906040528051906020012090505b919050565b6000828061123f575081155b1561124c57506000610dd8565b506001610dd8565b6005546001600160a01b0316331461129d5760405162461bcd60e51b81526004018080602001828103825260348152602001806143cf6034913960400191505060405180910390fd5b600254604080517f23b872dd0000000000000000000000000000000000000000000000000000000081526001600160a01b038681166004830152858116602483015260448201859052915191909216916323b872dd91606480830192600092919082900301818387803b15801561131357600080fd5b505af1158015611327573d6000803e3d6000fd5b50505050505050565b600061133a614272565b611343836125b1565b905061135781600001518260200151611233565b9392505050565b600a5481565b600b602052600090815260409020546001600160a01b031681565b611387611c82565b6113d8576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600554604080517fd79875eb000000000000000000000000000000000000000000000000000000008152600481018590526024810184905290516001600160a01b039092169163d79875eb9160448082019260009290919082900301818387803b15801561144557600080fd5b505af1158015611459573d6000803e3d6000fd5b505050505050565b600085858585856040516020018086815260200185600260200280838360005b83811015611499578181015183820152602001611481565b50505050905001848152602001831515151560f81b8152600101826001600160a01b03166001600160a01b031660601b81526014019550505050505060405160208183030381529060405280519060200120905095945050505050565b60005474010000000000000000000000000000000000000000900460ff1681565b6000908152600b60208181526040808420805460017fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915581513360601b81850152825160148183030181526034909101835280519084012085529290915290912080549091166001600160a01b034316179055565b6000806115aa6115a58a8a8a8a8a611461565b611c93565b905060006115b88286610dc3565b90506001600160a01b038116158015906115e35750836001600160a01b0316816001600160a01b0316145b9a9950505050505050505050565b6115f9611c82565b61164a576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b600254604080517f4f558e790000000000000000000000000000000000000000000000000000000081526004810184905290516000926001600160a01b031691634f558e79916024808301926020929190829003018186803b15801561171157600080fd5b505afa158015611725573d6000803e3d6000fd5b505050506040513d602081101561173b57600080fd5b50516117785760405162461bcd60e51b81526004018080602001828103825260228152602001806143ad6022913960400191505060405180910390fd5b60016117826142ee565b600254604080517f62f9acf90000000000000000000000000000000000000000000000000000000081526004810187905281516001600160a01b03909316926362f9acf992602480840193919291829003018186803b1580156117e457600080fd5b505afa1580156117f8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250604081101561181d57600080fd5b509050600061182a611c73565b9050336001600160a01b0382161480159061185057506001546001600160a01b03163314155b15611a3d5761185d614272565b611866836125b1565b90508561187782610100015161200b565b1461188157600093505b83801561189b575061189b81600001518260200151611233565b156119e357600254604080517fc53b4bf90000000000000000000000000000000000000000000000000000000081526004810189905290516000926001600160a01b03169163c53b4bf9916024808301926020929190829003018186803b15801561190557600080fd5b505afa158015611919573d6000803e3d6000fd5b505050506040513d602081101561192f57600080fd5b505160608301519091501515600482901c600116151514611951576000611953565b845b9450816080015115156000600383901c60011611151514611975576000611977565b845b94508160a0015115156000600283901c6001161115151461199957600061199b565b845b60c08301519095501515600182811c161515146119b95760006119bb565b845b94508160e001511515600082600116111515146119d95760006119db565b845b9450506119e8565b600093505b8315611a3b576040805162461bcd60e51b815260206004820152601c60248201527f4d75737420626520696e76616c696420746f206368616c6c656e676500000000604482015290519081900360640190fd5b505b611a4685613068565b600254604080517f6352211e0000000000000000000000000000000000000000000000000000000081526004810188905290516000926001600160a01b031691636352211e916024808301926020929190829003018186803b158015611aab57600080fd5b505afa158015611abf573d6000803e3d6000fd5b505050506040513d6020811015611ad557600080fd5b5051604080518881529192507f36b306723b6493a90002bbf27460db864a9ac8ce1af82ad1f0183f83c0cecc39918891869185913391906020820190859080838360005b83811015611b31578181015183820152602001611b19565b50505050905001836001600160a01b03166001600160a01b03168152602001826001600160a01b03166001600160a01b0316815260200194505050505060405180910390a1600254604080517f0e8310d60000000000000000000000000000000000000000000000000000000081526004810189905290516001600160a01b0390921691630e8310d69160248082019260009290919082900301818387803b158015611bdc57600080fd5b505af1158015611bf0573d6000803e3d6000fd5b5060019998505050505050505050565b60065481565b6001546001600160a01b031681565b611c1d611c82565b611c6e576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600a55565b6000546001600160a01b031690565b6000546001600160a01b0316331490565b6000610dd882613314565b611ca6611c82565b611cf7576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600480547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6005546001600160a01b031681565b6000805474010000000000000000000000000000000000000000900460ff1615611db1576040805162461bcd60e51b815260206004820152601260248201527f4d757374206e6f74206265207061757365640000000000000000000000000000604482015290519081900360640190fd5b6000600b6000611dc0886111dd565b81526020810191909152604001600020546001600160a01b03169050801580611df157506001600160a01b03811633145b611e42576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420636f6d6d6974746564526563657069656e74000000000000604482015290519081900360640190fd5b600254604080517f4f558e79000000000000000000000000000000000000000000000000000000008152600481018a905290516001600160a01b0390921691634f558e7991602480820192602092909190829003018186803b158015611ea757600080fd5b505afa158015611ebb573d6000803e3d6000fd5b505050506040513d6020811015611ed157600080fd5b505115611f25576040805162461bcd60e51b815260206004820152601560248201527f436c6f76657220616c7265616479206578697374730000000000000000000000604482015290519081900360640190fd5b611f49878787873388600160009054906101000a90046001600160a01b0316611592565b611f9a576040805162461bcd60e51b815260206004820152601160248201527f496e76616c6964205369676e6174757265000000000000000000000000000000604482015290519081900360640190fd5b611fa78787873388612903565b611ff8576040805162461bcd60e51b815260206004820152601260248201527f436c61696d206d75737420737563636565640000000000000000000000000000604482015290519081900360640190fd5b5060019695505050505050565b60075481565b6000805b60108110156120435780600101601060ff160360080260020a83826010811061203457fe5b1a02919091019060010161200f565b50919050565b612051611c82565b6120a2576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600955565b6004546001600160a01b031681565b604080513360601b60208083019190915282516014818403018152603490920183528151918101919091206000908152600b9091522054436001600160a01b039091161061214b576040805162461bcd60e51b815260206004820152601e60248201527f43616e277420636f6d62696e6520737465703120776974682073746570320000604482015290519081900360640190fd5b6000612157823361249c565b6000818152600b60205260409020549091506001600160a01b0316600181146121b15760405162461bcd60e51b815260040180806020018281038252604c815260200180614361604c913960600191505060405180910390fd5b506000908152600b602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000009081169091559282529020805490911633179055565b60085481565b612208611c82565b612259576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600580547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6000806000806000806000600260009054906101000a90046001600160a01b03166001600160a01b031663785d8d716040518163ffffffff1660e01b815260040160c06040518083038186803b1580156122ec57600080fd5b505afa158015612300573d6000803e3d6000fd5b505050506040513d60c081101561231657600080fd5b508051602082015160408301516060840151608085015160a090950151939a509198509650945090925090506000600160048a901c811614156123915761238e612381876001016123758a600101600a5461336590919063ffffffff16565b9063ffffffff6133be16565b829063ffffffff61342816565b90505b600389901c600116600114156123c6576123c3612381866001016123758a600101600a5461336590919063ffffffff16565b90505b600289901c600116600114156123fb576123f8612381856001016123758a600101600a5461336590919063ffffffff16565b90505b600189811c8116141561242d5761242a612381846001016123758a600101600a5461336590919063ffffffff16565b90505b886001166001141561245e5761245b612381836001016123758a600101600a5461336590919063ffffffff16565b90505b98975050505050505050565b60095481565b6003546001600160a01b031681565b6000610dd861248d83612293565b6008549063ffffffff61342816565b6040805160208082019490945260609290921b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016828201528051808303603401815260549092019052805191012090565b6124f6611c82565b612547576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b61255081613482565b50565b61255b611c82565b6125ac576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600855565b6125b9614272565b6125c1614272565b82517fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000009081166101208301526020808501519091166101408301526000610180830181905260026101a084018190526101c084015280835290820152600161016082015261262d61353a565b6fffffffffffffffffffffffffffffffff1916610100820152600080808080805b603c8260ff1610801561265f575085155b156127af57602087610180015160ff161061267f57866101400151612686565b8661012001515b90506126a681602089610180015160ff168161269e57fe5b06602061355e565b94506126b1856135bc565b90945092506126bf856135f7565b15955060ff82161580156126e557508360ff1660021415806126e557508260ff16600314155b156126f257600180885295505b85158015612703575060088460ff16105b8015612712575060088360ff16105b801561271c575060015b8015612726575060015b156127a457612736878585613604565b6101808101805160010160ff1690528051909750156127a45761275887613873565b6127a4576000875261016087015160ff166001141561277e576002610160880152612787565b60016101608801525b612792878585613604565b8051909750156127a457600180885295505b60019091019061264e565b86516127cc576127be87613971565b96506127c987613ae1565b96505b5094979650505050505050565b600081516041146127ec57506000610dd8565b60208201516040830151606084015160001a7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08211156128325760009350505050610dd8565b8060ff16601b1415801561284a57508060ff16601c14155b1561285b5760009350505050610dd8565b6040805160008152602080820180845289905260ff8416828401526060820186905260808201859052915160019260a08084019391927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081019281900390910190855afa1580156128d0573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00151979650505050505050565b600254604080517f0b628395000000000000000000000000000000000000000000000000000000008152600481018881526000936001600160a01b031692630b628395928a928a9290916024019083908083838b5b83811015612970578181015183820152602001612958565b5050505090500192505050600060405180830381600087803b15801561299557600080fd5b505af11580156129a9573d6000803e3d6000fd5b5050600254604080517f76e4a87f000000000000000000000000000000000000000000000000000000008152600481018b9052861515602482015290516001600160a01b0390921693506376e4a87f925060448082019260009290919082900301818387803b158015612a1b57600080fd5b505af1158015612a2f573d6000803e3d6000fd5b50505050600080851115612b5457600254604080517fdc3f7758000000000000000000000000000000000000000000000000000000008152600481018a90526024810188905290516001600160a01b039092169163dc3f77589160448082019260009290919082900301818387803b158015612aaa57600080fd5b505af1158015612abe573d6000803e3d6000fd5b50505050612acb85612293565b600254604080517fa47bd496000000000000000000000000000000000000000000000000000000008152600481018b90526024810184905290519293506001600160a01b039091169163a47bd4969160448082019260009290919082900301818387803b158015612b3b57600080fd5b505af1158015612b4f573d6000803e3d6000fd5b505050505b600854600090612b6a908363ffffffff61342816565b9050838015612b795750600081115b15612d2f57600354604080517f70a08231000000000000000000000000000000000000000000000000000000008152336004820152905183926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015612be157600080fd5b505afa158015612bf5573d6000803e3d6000fd5b505050506040513d6020811015612c0b57600080fd5b50511015612caa5760048054604080517ff088d5470000000000000000000000000000000000000000000000000000000081523393810193909352516001600160a01b039091169163f088d54791349160248082019260209290919082900301818588803b158015612c7c57600080fd5b505af1158015612c90573d6000803e3d6000fd5b50505050506040513d6020811015612ca757600080fd5b50505b600354604080517f9dc29fac0000000000000000000000000000000000000000000000000000000081523360048201526024810184905290516001600160a01b0390921691639dc29fac9160448082019260009290919082900301818387803b158015612d1657600080fd5b505af1158015612d2a573d6000803e3d6000fd5b505050505b8315612dc057600254604080517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b038881166004830152602482018c9052915191909216916340c10f1991604480830192600092919082900301818387803b158015612da357600080fd5b505af1158015612db7573d6000803e3d6000fd5b50505050612fbe565b600254604080517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b0390921660048301819052602483018b9052905190916340c10f1991604480830192600092919082900301818387803b158015612e2d57600080fd5b505af1158015612e41573d6000803e3d6000fd5b50506005546009546001600160a01b03909116925063d79875eb91508a90612e749061248d90879063ffffffff61336516565b6040518363ffffffff1660e01b81526004018083815260200182815260200192505050600060405180830381600087803b158015612eb157600080fd5b505af1158015612ec5573d6000803e3d6000fd5b505050506000821115612fbe57600354604080517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b03888116600483015260248201869052915191909216916340c10f199160448083019260209291908290030181600087803b158015612f4157600080fd5b505af1158015612f55573d6000803e3d6000fd5b505050506040513d6020811015612f6b57600080fd5b5051612fbe576040805162461bcd60e51b815260206004820152601160248201527f6d696e74206d7573742073756363656564000000000000000000000000000000604482015290519081900360640190fd5b7fbffd4880cee44a71d4266cf8dcf3179608df035c1883808a2370a9cfd180f6ed88883388868b8a6040518088815260200187600260200280838360005b83811015613014578181015183820152602001612ffc565b5050506001600160a01b03998a16939091019283525050949095166020850152604080850193909352606084019190915215156080830152519081900360a0019350915050a1506001979650505050505050565b600080600080600080600260009054906101000a90046001600160a01b03166001600160a01b031663785d8d716040518163ffffffff1660e01b815260040160c06040518083038186803b1580156130bf57600080fd5b505afa1580156130d3573d6000803e3d6000fd5b505050506040513d60c08110156130e957600080fd5b81019080805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190505050809650819750829850839950849a50859b505050505050506000600260009054906101000a90046001600160a01b03166001600160a01b031663c53b4bf9896040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561319f57600080fd5b505afa1580156131b3573d6000803e3d6000fd5b505050506040513d60208110156131c957600080fd5b505190506131ef816131dc5760006131df565b60015b889060ff1663ffffffff613d7216565b9650613208866001600484901c1663ffffffff613d7216565b9550613221856001600384901c1663ffffffff613d7216565b945061323a846001600284901c1663ffffffff613d7216565b935061325183600183811c1663ffffffff613d7216565b9250613266826001831663ffffffff613d7216565b600254604080517f8b1b2ba8000000000000000000000000000000000000000000000000000000008152600481018b9052602481018a905260448101899052606481018890526084810187905260a4810184905290519294506001600160a01b0390911691638b1b2ba89160c48082019260009290919082900301818387803b1580156132f257600080fd5b505af1158015613306573d6000803e3d6000fd5b505050505050505050505050565b604080517f19457468657265756d205369676e6564204d6573736167653a0a333200000000602080830191909152603c8083019490945282518083039094018452605c909101909152815191012090565b60008261337457506000610dd8565b8282028284828161338157fe5b0414610dd55760405162461bcd60e51b81526004018080602001828103825260218152602001806144036021913960400191505060405180910390fd5b6000808211613414576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b600082848161341f57fe5b04949350505050565b600082820183811015610dd5576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6001600160a01b0381166134c75760405162461bcd60e51b815260040180806020018281038252602681526020018061433b6026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b7ffffffffffffffe7ffdbfffffffffffff0000000000000000000000000000000090565b607f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000093909316600792830291909202037ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90160ff161c60201c1690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc081810160071692600860ff93859003909201929092160490565b604060ff82161015919050565b61360c614272565b600360ff166136218561010001518585613dcf565b60ff161461363457506001835282611357565b61363c61430c565b6000613649868686613e15565b909250905060ff8116613663575050600184525082611357565b60008080808080805b8760ff168160ff1610156137b75760009650600095506136a18d8a8360ff166008811061369557fe5b60200201518e8e613ff2565b9097509550600092505b8560ff168360ff1610156137af57816136c357600191505b6136d66136d188858961355e565b6135bc565b80955081965050506136f48d61010001518e6101600151878761411d565b6fffffffffffffffffffffffffffffffff19166101008e01526101608d015160ff1660021415613763576101c08d01805160010160ff9081169091526101a08e0180517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190911690526137a4565b6101c08d0180517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0160ff9081169091526101a08e01805160010190911690525b6001909201916136ab565b60010161366c565b508015613827576137d48c61010001518d61016001518d8d61411d565b6fffffffffffffffffffffffffffffffff19166101008d01526101608c015160ff1660021415613812576101c08c01805160010160ff169052613822565b6101a08c01805160010160ff1690525b61383c565b505060018a5250889550611357945050505050565b6101608c015160ff166001141561385a5760026101608d0152613863565b60016101608d01525b50999a9950505050505050505050565b6101008101516000908190815b60408160ff16108015613891575082155b156139685761389e6142ee565b60405180604001604052806008808560ff16816138b757fe5b06850360ff16816138c457fe5b0460ff1660ff16815260200160088460ff16816138dd57fe5b0660ff1690526101008701519091506000906139089083835b60200201518460016020020151613dcf565b905060ff81166003141561395e5760008088526fffffffffffffffffffffffffffffffff19851661010089015261395090889084905b60200201518460016020020151613604565b805190975061395e57600194505b5050600101613880565b50909392505050565b613979614272565b81610180015160ff16603c14156139985750600160208201528061122e565b61010082015160009081905b60408360ff161080156139b5575081155b15613abd576139c26142ee565b60405180604001604052806008808760ff16816139db57fe5b06870360ff16816139e857fe5b0460ff1660ff16815260200160088660ff1681613a0157fe5b0660ff169052610100870151909150600090613a1e9083836138f6565b905060ff811660031415613ab057600161016088015260008088526fffffffffffffffffffffffffffffffff198416610100890152613a60908890849061393e565b8051909750613a6e57600193505b600261016088015260008088526fffffffffffffffffffffffffffffffff198416610100890152613aa2908890849061393e565b8051909750613ab057600193505b50506001909201916139a4565b8115613acc5760018552613ad8565b60016020860152600085525b50929392505050565b613ae9614272565b60018080808060005b60088160ff16108015613b2157508580613b095750845b80613b115750835b80613b195750825b80613b215750815b15613d105760005b60088160ff16108015613b5857508680613b405750855b80613b485750845b80613b505750835b80613b585750825b15613d0757613b7389610100015183600703836007036141a3565b6fffffffffffffffffffffffffffffffff1916613b968a610100015184846141a3565b6fffffffffffffffffffffffffffffffff191614613bb357600096505b613bc689610100015183836007036141a3565b6fffffffffffffffffffffffffffffffff1916613be98a610100015184846141a3565b6fffffffffffffffffffffffffffffffff191614613c0657600095505b613c1989610100015183600703836141a3565b6fffffffffffffffffffffffffffffffff1916613c3c8a610100015184846141a3565b6fffffffffffffffffffffffffffffffff191614613c5957600094505b613c6f89610100015182600703846007036141a3565b6fffffffffffffffffffffffffffffffff1916613c928a610100015184846141a3565b6fffffffffffffffffffffffffffffffff191614613caf57600093505b613cbf89610100015182846141a3565b6fffffffffffffffffffffffffffffffff1916613ce28a610100015184846141a3565b6fffffffffffffffffffffffffffffffff191614613cff57600092505b600101613b29565b50600101613af2565b508480613d1a5750835b80613d225750825b80613d2a5750815b80613d325750805b15613d6757600160408801528415156060880152831515608088015282151560a088015281151560c088015280151560e08801525b509495945050505050565b600082821115613dc9576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600080613ddc84846141f6565b6fffffffffffffffffffffffffffffffff1986166fffffffffffffffffffffffffffffffff9091161c60801c6003169150509392505050565b613e1d61430c565b6000613e2761430c565b6000613e3161430c565b5060408051610140810182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010082018181526000610120840181905290835283518085018552828152600160208281018290528086019290925285518087018752838152808301829052858701528551808701875281815280830182905260608601528551808701875281815280830184905260808601528551808701875290815280820184905260a08501528451808601865282815280820184905260c0850152845180860190955282855284019190915260e08201929092529080613f196142ee565b6000805b60088160ff161015613fdf57858160ff1660088110613f3857fe5b6020020151925082600060200201518c01935082600160200201518b01945060078560000b1380613f6c575060008560000b125b80613f7a575060078460000b135b80613f88575060008460000b125b613fd757613f9c8d61010001518587613dcf565b91508c610160015160ff168260ff1614613fd75760ff8216600314613fd75782888860ff1660088110613fcb57fe5b60200201526001909601955b600101613f1d565b50959b949a509398505050505050505050565b600080600080600090506000600160ff1689610160015160ff16141561401a5750600261401e565b5060015b600080808060015b60098160ff1610156141095784614101578c5160208e01519082028d01945081028b0192506007600085900b1380614061575060008460000b125b8061406f575060078360000b135b8061407d575060008360000b125b1561409357600097506000965060019450614101565b6140a38e61010001518585613dcf565b91508560ff168260ff1614156140c9576140bf8888868661422b565b9098509650614101565b8d610160015160ff168260ff161480156140e6575060018160ff16115b156140f45760019450614101565b6000975060009650600194505b600101614026565b50959c949b50939950505050505050505050565b600060078360ff16111561413057600080fd5b60078260ff16111561414157600080fd5b600061414d84846141f6565b7003000000000000000000000000000000006fffffffffffffffffffffffffffffffff90911690811b87189096169570ff00000000000000000000000000000000608087901b16901b8617915050949350505050565b6000806141b084846141f6565b6fffffffffffffffffffffffffffffffff1986166fffffffffffffffffffffffffffffffff9091161c700300000000000000000000000000000000169150509392505050565b600891909102016040037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0160020260ff1690565b6008020160400160201b64ff000000001660079290921b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff800000000016919091179160019190910190565b604080516101e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081019190915290565b60405180604001604052806002906020820280388339509192915050565b6040518061020001604052806008905b6143246142ee565b81526020019060019003908161431c579050509056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373496e76616c696420636f6d6d69744f664d6f7665734861736857697468526563657069656e742c20706c6561736520646f20636c61696d436c6f7665725365637572656c79506172744f6e65436c6f766572206d75737420657869737420746f206265206368616c6c656e6765647472616e7366657246726f6d2063616e206f6e6c7920626520646f6e652062792073696d706c65436c6f766572734d61726b6574536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a265627a7a723058208a05769ec8c5039515ff4c31ce170a7d913c4a25c1d559c5a7b7f1da48ed8ba064736f6c63430005090032000000000000000000000000b55c5cac5014c662fdbf21a2c59cd45403c482fd0000000000000000000000001a94656a6245379bc0d9c64c402197528edb2bd10000000000000000000000001754a612ca578f72d678196bcc16710f01db7655
Deployed Bytecode
0x6080604052600436106102d15760003560e01c80638a05aafa11610179578063a89b55da116100d6578063d50cb88b1161008a578063f1b4bce911610064578063f1b4bce914610c2d578063f2fde38b14610c66578063fd5baa8814610c99576102d1565b8063d50cb88b14610bd9578063d76bbd5214610bee578063e757223014610c03576102d1565b8063c7876ea4116100bb578063c7876ea414610b67578063d010ed7014610b7c578063d2d7231f14610baf576102d1565b8063a89b55da14610b28578063c434968414610b3d576102d1565b8063975e4b2a1161012d578063a069870611610112578063a069870614610aac578063a4a83ca614610ac1578063a7e901b014610afe576102d1565b8063975e4b2a146109af5780639a0d981e146109c4576102d1565b80638f32d59b1161015e5780638f32d59b1461093d578063918a15cf146109525780639564e1801461097c576102d1565b80638a05aafa146108fe5780638da5cb5b14610928576102d1565b80633afcba96116102325780636e1258e7116101e65780637b7db9fa116101c05780637b7db9fa146108aa5780637cce4656146108d45780637dc0d1d0146108e9576102d1565b80636e1258e71461075b5780636e88f21f14610785578063715018a614610895576102d1565b80634896672e116102175780634896672e146106a0578063580bdd8c146106d05780635c975abb14610746576102d1565b80633afcba96146106615780634788578114610676576102d1565b80631cb44dfc11610289578063225c35b21161026e578063225c35b21461059257806323b872dd146105c6578063271eff9414610609576102d1565b80631cb44dfc146104f55780631ce5145614610528576102d1565b80630d576bfa116102ba5780630d576bfa146103a957806319045a25146103da57806319faa73014610494576102d1565b806308cdc2a8146102d657806308d27c7f14610304575b600080fd5b3480156102e257600080fd5b50610302600480360360208110156102f957600080fd5b50351515610cc3565b005b34801561031057600080fd5b5061035c6004803603604081101561032757600080fd5b60408051808201825291830192918183019183906002908390839080828437600092019190915250919450610d669350505050565b6040805196151587529415156020870152921515858501526fffffffffffffffffffffffffffffffff19909116606085015260ff90811660808501521660a0830152519081900360c00190f35b3480156103b557600080fd5b506103be610db4565b604080516001600160a01b039092168252519081900360200190f35b3480156103e657600080fd5b506103be600480360360408110156103fd57600080fd5b8135919081019060408101602082013564010000000081111561041f57600080fd5b82018360208201111561043157600080fd5b8035906020019184600183028401116401000000008311171561045357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610dc3945050505050565b6104e1600480360360608110156104aa57600080fd5b6040805180820182529183019291818301918390600290839083908082843760009201919091525091945050503515159050610dde565b604080519115158252519081900360200190f35b34801561050157600080fd5b506103026004803603602081101561051857600080fd5b50356001600160a01b031661114a565b34801561053457600080fd5b506105806004803603604081101561054b57600080fd5b604080518082018252918301929181830191839060029083908390808284376000920191909152509194506111dd9350505050565b60408051918252519081900360200190f35b34801561059e57600080fd5b506104e1600480360360408110156105b557600080fd5b508035151590602001351515611233565b3480156105d257600080fd5b50610302600480360360608110156105e957600080fd5b506001600160a01b03813581169160208101359091169060400135611254565b34801561061557600080fd5b506104e16004803603604081101561062c57600080fd5b604080518082018252918301929181830191839060029083908390808284376000920191909152509194506113309350505050565b34801561066d57600080fd5b5061058061135e565b34801561068257600080fd5b506103be6004803603602081101561069957600080fd5b5035611364565b3480156106ac57600080fd5b50610302600480360360408110156106c357600080fd5b508035906020013561137f565b3480156106dc57600080fd5b50610580600480360360c08110156106f357600080fd5b6040805180820182528335939283019291606083019190602084019060029083908390808284376000920191909152509194505081359250506020810135151590604001356001600160a01b0316611461565b34801561075257600080fd5b506104e16114f6565b34801561076757600080fd5b506103026004803603602081101561077e57600080fd5b5035611517565b34801561079157600080fd5b506104e160048036036101008110156107a957600080fd5b604080518082018252833593928301929160608301919060208401906002908390839080828437600092019190915250919483359460208501351515946001600160a01b0360408201351694509192509060808101906060013564010000000081111561081557600080fd5b82018360208201111561082757600080fd5b8035906020019184600183028401116401000000008311171561084957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550505090356001600160a01b031691506115929050565b3480156108a157600080fd5b506103026115f1565b3480156108b657600080fd5b506104e1600480360360208110156108cd57600080fd5b50356116ac565b3480156108e057600080fd5b50610580611c00565b3480156108f557600080fd5b506103be611c06565b34801561090a57600080fd5b506103026004803603602081101561092157600080fd5b5035611c15565b34801561093457600080fd5b506103be611c73565b34801561094957600080fd5b506104e1611c82565b34801561095e57600080fd5b506105806004803603602081101561097557600080fd5b5035611c93565b34801561098857600080fd5b506103026004803603602081101561099f57600080fd5b50356001600160a01b0316611c9e565b3480156109bb57600080fd5b506103be611d31565b6104e1600480360360c08110156109da57600080fd5b604080518082018252833593928301929160608301919060208401906002908390839080828437600092019190915250919483359460208501351515949193509150606081019060400135640100000000811115610a3757600080fd5b820183602082011115610a4957600080fd5b80359060200191846001830284011164010000000083111715610a6b57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611d40945050505050565b348015610ab857600080fd5b50610580612005565b348015610acd57600080fd5b5061058060048036036020811015610ae457600080fd5b50356fffffffffffffffffffffffffffffffff191661200b565b348015610b0a57600080fd5b5061030260048036036020811015610b2157600080fd5b5035612049565b348015610b3457600080fd5b506103be6120a7565b348015610b4957600080fd5b5061030260048036036020811015610b6057600080fd5b50356120b6565b348015610b7357600080fd5b506105806121fa565b348015610b8857600080fd5b5061030260048036036020811015610b9f57600080fd5b50356001600160a01b0316612200565b348015610bbb57600080fd5b5061058060048036036020811015610bd257600080fd5b5035612293565b348015610be557600080fd5b5061058061246a565b348015610bfa57600080fd5b506103be612470565b348015610c0f57600080fd5b5061058060048036036020811015610c2657600080fd5b503561247f565b348015610c3957600080fd5b5061058060048036036040811015610c5057600080fd5b50803590602001356001600160a01b031661249c565b348015610c7257600080fd5b5061030260048036036020811015610c8957600080fd5b50356001600160a01b03166124ee565b348015610ca557600080fd5b5061030260048036036020811015610cbc57600080fd5b5035612553565b610ccb611c82565b610d1c576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6000805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b600080600080600080610d77614272565b610d80886125b1565b80516020820151604083015161010084015161016085015161018090950151939d929c50909a509850919650945092505050565b6002546001600160a01b031681565b6000610dd5838363ffffffff6127d916565b90505b92915050565b600080610dea846111dd565b6000818152600b60205260409020549091506001600160a01b0316801580610e1a57506001600160a01b03811633145b610e6b576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420636f6d6d6974746564526563657069656e74000000000000604482015290519081900360640190fd5b610e73614272565b610e7c866125b1565b9050610e9081600001518260200151611233565b610ee1576040805162461bcd60e51b815260206004820152600c60248201527f496e76616c69642067616d650000000000000000000000000000000000000000604482015290519081900360640190fd5b6000610ef182610100015161200b565b600254604080517f4f558e790000000000000000000000000000000000000000000000000000000081526004810184905290519293506001600160a01b0390911691634f558e7991602480820192602092909190829003018186803b158015610f5957600080fd5b505afa158015610f6d573d6000803e3d6000fd5b505050506040513d6020811015610f8357600080fd5b505115610fd7576040805162461bcd60e51b815260206004820152601560248201527f436c6f76657220616c7265616479206578697374730000000000000000000000604482015290519081900360640190fd5b6060820151608083015160a084015160c085015160e0860151604080517fa250cc3400000000000000000000000000000000000000000000000000000000815295151560048701529315156024860152911515604485015215156064840152151560848301525160009173f640b022ab52a003466daaefb5e87bbee7ac1bdf9163a250cc349160a480820192602092909190829003018186803b15801561107d57600080fd5b505af4158015611091573d6000803e3d6000fd5b505050506040513d60208110156110a757600080fd5b505190506110b8828983338b612903565b611109576040805162461bcd60e51b815260206004820152601260248201527f436c61696d206d75737420737563636565640000000000000000000000000000604482015290519081900360640190fd5b505050600091825250600b6020526040902080547fffffffffffffffffffffffff000000000000000000000000000000000000000016905550600192915050565b611152611c82565b6111a3576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6000816040516020018082600260200280838360005b8381101561120b5781810151838201526020016111f3565b505050509050019150506040516020818303038152906040528051906020012090505b919050565b6000828061123f575081155b1561124c57506000610dd8565b506001610dd8565b6005546001600160a01b0316331461129d5760405162461bcd60e51b81526004018080602001828103825260348152602001806143cf6034913960400191505060405180910390fd5b600254604080517f23b872dd0000000000000000000000000000000000000000000000000000000081526001600160a01b038681166004830152858116602483015260448201859052915191909216916323b872dd91606480830192600092919082900301818387803b15801561131357600080fd5b505af1158015611327573d6000803e3d6000fd5b50505050505050565b600061133a614272565b611343836125b1565b905061135781600001518260200151611233565b9392505050565b600a5481565b600b602052600090815260409020546001600160a01b031681565b611387611c82565b6113d8576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600554604080517fd79875eb000000000000000000000000000000000000000000000000000000008152600481018590526024810184905290516001600160a01b039092169163d79875eb9160448082019260009290919082900301818387803b15801561144557600080fd5b505af1158015611459573d6000803e3d6000fd5b505050505050565b600085858585856040516020018086815260200185600260200280838360005b83811015611499578181015183820152602001611481565b50505050905001848152602001831515151560f81b8152600101826001600160a01b03166001600160a01b031660601b81526014019550505050505060405160208183030381529060405280519060200120905095945050505050565b60005474010000000000000000000000000000000000000000900460ff1681565b6000908152600b60208181526040808420805460017fffffffffffffffffffffffff00000000000000000000000000000000000000009182161790915581513360601b81850152825160148183030181526034909101835280519084012085529290915290912080549091166001600160a01b034316179055565b6000806115aa6115a58a8a8a8a8a611461565b611c93565b905060006115b88286610dc3565b90506001600160a01b038116158015906115e35750836001600160a01b0316816001600160a01b0316145b9a9950505050505050505050565b6115f9611c82565b61164a576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b600254604080517f4f558e790000000000000000000000000000000000000000000000000000000081526004810184905290516000926001600160a01b031691634f558e79916024808301926020929190829003018186803b15801561171157600080fd5b505afa158015611725573d6000803e3d6000fd5b505050506040513d602081101561173b57600080fd5b50516117785760405162461bcd60e51b81526004018080602001828103825260228152602001806143ad6022913960400191505060405180910390fd5b60016117826142ee565b600254604080517f62f9acf90000000000000000000000000000000000000000000000000000000081526004810187905281516001600160a01b03909316926362f9acf992602480840193919291829003018186803b1580156117e457600080fd5b505afa1580156117f8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250604081101561181d57600080fd5b509050600061182a611c73565b9050336001600160a01b0382161480159061185057506001546001600160a01b03163314155b15611a3d5761185d614272565b611866836125b1565b90508561187782610100015161200b565b1461188157600093505b83801561189b575061189b81600001518260200151611233565b156119e357600254604080517fc53b4bf90000000000000000000000000000000000000000000000000000000081526004810189905290516000926001600160a01b03169163c53b4bf9916024808301926020929190829003018186803b15801561190557600080fd5b505afa158015611919573d6000803e3d6000fd5b505050506040513d602081101561192f57600080fd5b505160608301519091501515600482901c600116151514611951576000611953565b845b9450816080015115156000600383901c60011611151514611975576000611977565b845b94508160a0015115156000600283901c6001161115151461199957600061199b565b845b60c08301519095501515600182811c161515146119b95760006119bb565b845b94508160e001511515600082600116111515146119d95760006119db565b845b9450506119e8565b600093505b8315611a3b576040805162461bcd60e51b815260206004820152601c60248201527f4d75737420626520696e76616c696420746f206368616c6c656e676500000000604482015290519081900360640190fd5b505b611a4685613068565b600254604080517f6352211e0000000000000000000000000000000000000000000000000000000081526004810188905290516000926001600160a01b031691636352211e916024808301926020929190829003018186803b158015611aab57600080fd5b505afa158015611abf573d6000803e3d6000fd5b505050506040513d6020811015611ad557600080fd5b5051604080518881529192507f36b306723b6493a90002bbf27460db864a9ac8ce1af82ad1f0183f83c0cecc39918891869185913391906020820190859080838360005b83811015611b31578181015183820152602001611b19565b50505050905001836001600160a01b03166001600160a01b03168152602001826001600160a01b03166001600160a01b0316815260200194505050505060405180910390a1600254604080517f0e8310d60000000000000000000000000000000000000000000000000000000081526004810189905290516001600160a01b0390921691630e8310d69160248082019260009290919082900301818387803b158015611bdc57600080fd5b505af1158015611bf0573d6000803e3d6000fd5b5060019998505050505050505050565b60065481565b6001546001600160a01b031681565b611c1d611c82565b611c6e576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600a55565b6000546001600160a01b031690565b6000546001600160a01b0316331490565b6000610dd882613314565b611ca6611c82565b611cf7576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600480547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6005546001600160a01b031681565b6000805474010000000000000000000000000000000000000000900460ff1615611db1576040805162461bcd60e51b815260206004820152601260248201527f4d757374206e6f74206265207061757365640000000000000000000000000000604482015290519081900360640190fd5b6000600b6000611dc0886111dd565b81526020810191909152604001600020546001600160a01b03169050801580611df157506001600160a01b03811633145b611e42576040805162461bcd60e51b815260206004820152601a60248201527f496e76616c696420636f6d6d6974746564526563657069656e74000000000000604482015290519081900360640190fd5b600254604080517f4f558e79000000000000000000000000000000000000000000000000000000008152600481018a905290516001600160a01b0390921691634f558e7991602480820192602092909190829003018186803b158015611ea757600080fd5b505afa158015611ebb573d6000803e3d6000fd5b505050506040513d6020811015611ed157600080fd5b505115611f25576040805162461bcd60e51b815260206004820152601560248201527f436c6f76657220616c7265616479206578697374730000000000000000000000604482015290519081900360640190fd5b611f49878787873388600160009054906101000a90046001600160a01b0316611592565b611f9a576040805162461bcd60e51b815260206004820152601160248201527f496e76616c6964205369676e6174757265000000000000000000000000000000604482015290519081900360640190fd5b611fa78787873388612903565b611ff8576040805162461bcd60e51b815260206004820152601260248201527f436c61696d206d75737420737563636565640000000000000000000000000000604482015290519081900360640190fd5b5060019695505050505050565b60075481565b6000805b60108110156120435780600101601060ff160360080260020a83826010811061203457fe5b1a02919091019060010161200f565b50919050565b612051611c82565b6120a2576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600955565b6004546001600160a01b031681565b604080513360601b60208083019190915282516014818403018152603490920183528151918101919091206000908152600b9091522054436001600160a01b039091161061214b576040805162461bcd60e51b815260206004820152601e60248201527f43616e277420636f6d62696e6520737465703120776974682073746570320000604482015290519081900360640190fd5b6000612157823361249c565b6000818152600b60205260409020549091506001600160a01b0316600181146121b15760405162461bcd60e51b815260040180806020018281038252604c815260200180614361604c913960600191505060405180910390fd5b506000908152600b602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000009081169091559282529020805490911633179055565b60085481565b612208611c82565b612259576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600580547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b6000806000806000806000600260009054906101000a90046001600160a01b03166001600160a01b031663785d8d716040518163ffffffff1660e01b815260040160c06040518083038186803b1580156122ec57600080fd5b505afa158015612300573d6000803e3d6000fd5b505050506040513d60c081101561231657600080fd5b508051602082015160408301516060840151608085015160a090950151939a509198509650945090925090506000600160048a901c811614156123915761238e612381876001016123758a600101600a5461336590919063ffffffff16565b9063ffffffff6133be16565b829063ffffffff61342816565b90505b600389901c600116600114156123c6576123c3612381866001016123758a600101600a5461336590919063ffffffff16565b90505b600289901c600116600114156123fb576123f8612381856001016123758a600101600a5461336590919063ffffffff16565b90505b600189811c8116141561242d5761242a612381846001016123758a600101600a5461336590919063ffffffff16565b90505b886001166001141561245e5761245b612381836001016123758a600101600a5461336590919063ffffffff16565b90505b98975050505050505050565b60095481565b6003546001600160a01b031681565b6000610dd861248d83612293565b6008549063ffffffff61342816565b6040805160208082019490945260609290921b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016828201528051808303603401815260549092019052805191012090565b6124f6611c82565b612547576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b61255081613482565b50565b61255b611c82565b6125ac576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600855565b6125b9614272565b6125c1614272565b82517fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000009081166101208301526020808501519091166101408301526000610180830181905260026101a084018190526101c084015280835290820152600161016082015261262d61353a565b6fffffffffffffffffffffffffffffffff1916610100820152600080808080805b603c8260ff1610801561265f575085155b156127af57602087610180015160ff161061267f57866101400151612686565b8661012001515b90506126a681602089610180015160ff168161269e57fe5b06602061355e565b94506126b1856135bc565b90945092506126bf856135f7565b15955060ff82161580156126e557508360ff1660021415806126e557508260ff16600314155b156126f257600180885295505b85158015612703575060088460ff16105b8015612712575060088360ff16105b801561271c575060015b8015612726575060015b156127a457612736878585613604565b6101808101805160010160ff1690528051909750156127a45761275887613873565b6127a4576000875261016087015160ff166001141561277e576002610160880152612787565b60016101608801525b612792878585613604565b8051909750156127a457600180885295505b60019091019061264e565b86516127cc576127be87613971565b96506127c987613ae1565b96505b5094979650505050505050565b600081516041146127ec57506000610dd8565b60208201516040830151606084015160001a7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08211156128325760009350505050610dd8565b8060ff16601b1415801561284a57508060ff16601c14155b1561285b5760009350505050610dd8565b6040805160008152602080820180845289905260ff8416828401526060820186905260808201859052915160019260a08084019391927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081019281900390910190855afa1580156128d0573d6000803e3d6000fd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00151979650505050505050565b600254604080517f0b628395000000000000000000000000000000000000000000000000000000008152600481018881526000936001600160a01b031692630b628395928a928a9290916024019083908083838b5b83811015612970578181015183820152602001612958565b5050505090500192505050600060405180830381600087803b15801561299557600080fd5b505af11580156129a9573d6000803e3d6000fd5b5050600254604080517f76e4a87f000000000000000000000000000000000000000000000000000000008152600481018b9052861515602482015290516001600160a01b0390921693506376e4a87f925060448082019260009290919082900301818387803b158015612a1b57600080fd5b505af1158015612a2f573d6000803e3d6000fd5b50505050600080851115612b5457600254604080517fdc3f7758000000000000000000000000000000000000000000000000000000008152600481018a90526024810188905290516001600160a01b039092169163dc3f77589160448082019260009290919082900301818387803b158015612aaa57600080fd5b505af1158015612abe573d6000803e3d6000fd5b50505050612acb85612293565b600254604080517fa47bd496000000000000000000000000000000000000000000000000000000008152600481018b90526024810184905290519293506001600160a01b039091169163a47bd4969160448082019260009290919082900301818387803b158015612b3b57600080fd5b505af1158015612b4f573d6000803e3d6000fd5b505050505b600854600090612b6a908363ffffffff61342816565b9050838015612b795750600081115b15612d2f57600354604080517f70a08231000000000000000000000000000000000000000000000000000000008152336004820152905183926001600160a01b0316916370a08231916024808301926020929190829003018186803b158015612be157600080fd5b505afa158015612bf5573d6000803e3d6000fd5b505050506040513d6020811015612c0b57600080fd5b50511015612caa5760048054604080517ff088d5470000000000000000000000000000000000000000000000000000000081523393810193909352516001600160a01b039091169163f088d54791349160248082019260209290919082900301818588803b158015612c7c57600080fd5b505af1158015612c90573d6000803e3d6000fd5b50505050506040513d6020811015612ca757600080fd5b50505b600354604080517f9dc29fac0000000000000000000000000000000000000000000000000000000081523360048201526024810184905290516001600160a01b0390921691639dc29fac9160448082019260009290919082900301818387803b158015612d1657600080fd5b505af1158015612d2a573d6000803e3d6000fd5b505050505b8315612dc057600254604080517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b038881166004830152602482018c9052915191909216916340c10f1991604480830192600092919082900301818387803b158015612da357600080fd5b505af1158015612db7573d6000803e3d6000fd5b50505050612fbe565b600254604080517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b0390921660048301819052602483018b9052905190916340c10f1991604480830192600092919082900301818387803b158015612e2d57600080fd5b505af1158015612e41573d6000803e3d6000fd5b50506005546009546001600160a01b03909116925063d79875eb91508a90612e749061248d90879063ffffffff61336516565b6040518363ffffffff1660e01b81526004018083815260200182815260200192505050600060405180830381600087803b158015612eb157600080fd5b505af1158015612ec5573d6000803e3d6000fd5b505050506000821115612fbe57600354604080517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b03888116600483015260248201869052915191909216916340c10f199160448083019260209291908290030181600087803b158015612f4157600080fd5b505af1158015612f55573d6000803e3d6000fd5b505050506040513d6020811015612f6b57600080fd5b5051612fbe576040805162461bcd60e51b815260206004820152601160248201527f6d696e74206d7573742073756363656564000000000000000000000000000000604482015290519081900360640190fd5b7fbffd4880cee44a71d4266cf8dcf3179608df035c1883808a2370a9cfd180f6ed88883388868b8a6040518088815260200187600260200280838360005b83811015613014578181015183820152602001612ffc565b5050506001600160a01b03998a16939091019283525050949095166020850152604080850193909352606084019190915215156080830152519081900360a0019350915050a1506001979650505050505050565b600080600080600080600260009054906101000a90046001600160a01b03166001600160a01b031663785d8d716040518163ffffffff1660e01b815260040160c06040518083038186803b1580156130bf57600080fd5b505afa1580156130d3573d6000803e3d6000fd5b505050506040513d60c08110156130e957600080fd5b81019080805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190505050809650819750829850839950849a50859b505050505050506000600260009054906101000a90046001600160a01b03166001600160a01b031663c53b4bf9896040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801561319f57600080fd5b505afa1580156131b3573d6000803e3d6000fd5b505050506040513d60208110156131c957600080fd5b505190506131ef816131dc5760006131df565b60015b889060ff1663ffffffff613d7216565b9650613208866001600484901c1663ffffffff613d7216565b9550613221856001600384901c1663ffffffff613d7216565b945061323a846001600284901c1663ffffffff613d7216565b935061325183600183811c1663ffffffff613d7216565b9250613266826001831663ffffffff613d7216565b600254604080517f8b1b2ba8000000000000000000000000000000000000000000000000000000008152600481018b9052602481018a905260448101899052606481018890526084810187905260a4810184905290519294506001600160a01b0390911691638b1b2ba89160c48082019260009290919082900301818387803b1580156132f257600080fd5b505af1158015613306573d6000803e3d6000fd5b505050505050505050505050565b604080517f19457468657265756d205369676e6564204d6573736167653a0a333200000000602080830191909152603c8083019490945282518083039094018452605c909101909152815191012090565b60008261337457506000610dd8565b8282028284828161338157fe5b0414610dd55760405162461bcd60e51b81526004018080602001828103825260218152602001806144036021913960400191505060405180910390fd5b6000808211613414576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b600082848161341f57fe5b04949350505050565b600082820183811015610dd5576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b6001600160a01b0381166134c75760405162461bcd60e51b815260040180806020018281038252602681526020018061433b6026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b7ffffffffffffffe7ffdbfffffffffffff0000000000000000000000000000000090565b607f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000000093909316600792830291909202037ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90160ff161c60201c1690565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc081810160071692600860ff93859003909201929092160490565b604060ff82161015919050565b61360c614272565b600360ff166136218561010001518585613dcf565b60ff161461363457506001835282611357565b61363c61430c565b6000613649868686613e15565b909250905060ff8116613663575050600184525082611357565b60008080808080805b8760ff168160ff1610156137b75760009650600095506136a18d8a8360ff166008811061369557fe5b60200201518e8e613ff2565b9097509550600092505b8560ff168360ff1610156137af57816136c357600191505b6136d66136d188858961355e565b6135bc565b80955081965050506136f48d61010001518e6101600151878761411d565b6fffffffffffffffffffffffffffffffff19166101008e01526101608d015160ff1660021415613763576101c08d01805160010160ff9081169091526101a08e0180517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190911690526137a4565b6101c08d0180517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0160ff9081169091526101a08e01805160010190911690525b6001909201916136ab565b60010161366c565b508015613827576137d48c61010001518d61016001518d8d61411d565b6fffffffffffffffffffffffffffffffff19166101008d01526101608c015160ff1660021415613812576101c08c01805160010160ff169052613822565b6101a08c01805160010160ff1690525b61383c565b505060018a5250889550611357945050505050565b6101608c015160ff166001141561385a5760026101608d0152613863565b60016101608d01525b50999a9950505050505050505050565b6101008101516000908190815b60408160ff16108015613891575082155b156139685761389e6142ee565b60405180604001604052806008808560ff16816138b757fe5b06850360ff16816138c457fe5b0460ff1660ff16815260200160088460ff16816138dd57fe5b0660ff1690526101008701519091506000906139089083835b60200201518460016020020151613dcf565b905060ff81166003141561395e5760008088526fffffffffffffffffffffffffffffffff19851661010089015261395090889084905b60200201518460016020020151613604565b805190975061395e57600194505b5050600101613880565b50909392505050565b613979614272565b81610180015160ff16603c14156139985750600160208201528061122e565b61010082015160009081905b60408360ff161080156139b5575081155b15613abd576139c26142ee565b60405180604001604052806008808760ff16816139db57fe5b06870360ff16816139e857fe5b0460ff1660ff16815260200160088660ff1681613a0157fe5b0660ff169052610100870151909150600090613a1e9083836138f6565b905060ff811660031415613ab057600161016088015260008088526fffffffffffffffffffffffffffffffff198416610100890152613a60908890849061393e565b8051909750613a6e57600193505b600261016088015260008088526fffffffffffffffffffffffffffffffff198416610100890152613aa2908890849061393e565b8051909750613ab057600193505b50506001909201916139a4565b8115613acc5760018552613ad8565b60016020860152600085525b50929392505050565b613ae9614272565b60018080808060005b60088160ff16108015613b2157508580613b095750845b80613b115750835b80613b195750825b80613b215750815b15613d105760005b60088160ff16108015613b5857508680613b405750855b80613b485750845b80613b505750835b80613b585750825b15613d0757613b7389610100015183600703836007036141a3565b6fffffffffffffffffffffffffffffffff1916613b968a610100015184846141a3565b6fffffffffffffffffffffffffffffffff191614613bb357600096505b613bc689610100015183836007036141a3565b6fffffffffffffffffffffffffffffffff1916613be98a610100015184846141a3565b6fffffffffffffffffffffffffffffffff191614613c0657600095505b613c1989610100015183600703836141a3565b6fffffffffffffffffffffffffffffffff1916613c3c8a610100015184846141a3565b6fffffffffffffffffffffffffffffffff191614613c5957600094505b613c6f89610100015182600703846007036141a3565b6fffffffffffffffffffffffffffffffff1916613c928a610100015184846141a3565b6fffffffffffffffffffffffffffffffff191614613caf57600093505b613cbf89610100015182846141a3565b6fffffffffffffffffffffffffffffffff1916613ce28a610100015184846141a3565b6fffffffffffffffffffffffffffffffff191614613cff57600092505b600101613b29565b50600101613af2565b508480613d1a5750835b80613d225750825b80613d2a5750815b80613d325750805b15613d6757600160408801528415156060880152831515608088015282151560a088015281151560c088015280151560e08801525b509495945050505050565b600082821115613dc9576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600080613ddc84846141f6565b6fffffffffffffffffffffffffffffffff1986166fffffffffffffffffffffffffffffffff9091161c60801c6003169150509392505050565b613e1d61430c565b6000613e2761430c565b6000613e3161430c565b5060408051610140810182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff61010082018181526000610120840181905290835283518085018552828152600160208281018290528086019290925285518087018752838152808301829052858701528551808701875281815280830182905260608601528551808701875281815280830184905260808601528551808701875290815280820184905260a08501528451808601865282815280820184905260c0850152845180860190955282855284019190915260e08201929092529080613f196142ee565b6000805b60088160ff161015613fdf57858160ff1660088110613f3857fe5b6020020151925082600060200201518c01935082600160200201518b01945060078560000b1380613f6c575060008560000b125b80613f7a575060078460000b135b80613f88575060008460000b125b613fd757613f9c8d61010001518587613dcf565b91508c610160015160ff168260ff1614613fd75760ff8216600314613fd75782888860ff1660088110613fcb57fe5b60200201526001909601955b600101613f1d565b50959b949a509398505050505050505050565b600080600080600090506000600160ff1689610160015160ff16141561401a5750600261401e565b5060015b600080808060015b60098160ff1610156141095784614101578c5160208e01519082028d01945081028b0192506007600085900b1380614061575060008460000b125b8061406f575060078360000b135b8061407d575060008360000b125b1561409357600097506000965060019450614101565b6140a38e61010001518585613dcf565b91508560ff168260ff1614156140c9576140bf8888868661422b565b9098509650614101565b8d610160015160ff168260ff161480156140e6575060018160ff16115b156140f45760019450614101565b6000975060009650600194505b600101614026565b50959c949b50939950505050505050505050565b600060078360ff16111561413057600080fd5b60078260ff16111561414157600080fd5b600061414d84846141f6565b7003000000000000000000000000000000006fffffffffffffffffffffffffffffffff90911690811b87189096169570ff00000000000000000000000000000000608087901b16901b8617915050949350505050565b6000806141b084846141f6565b6fffffffffffffffffffffffffffffffff1986166fffffffffffffffffffffffffffffffff9091161c700300000000000000000000000000000000169150509392505050565b600891909102016040037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0160020260ff1690565b6008020160400160201b64ff000000001660079290921b7fffffffffffffffffffffffffffffffffffffffffffffffffffffff800000000016919091179160019190910190565b604080516101e081018252600080825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081019190915290565b60405180604001604052806002906020820280388339509192915050565b6040518061020001604052806008905b6143246142ee565b81526020019060019003908161431c579050509056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373496e76616c696420636f6d6d69744f664d6f7665734861736857697468526563657069656e742c20706c6561736520646f20636c61696d436c6f7665725365637572656c79506172744f6e65436c6f766572206d75737420657869737420746f206265206368616c6c656e6765647472616e7366657246726f6d2063616e206f6e6c7920626520646f6e652062792073696d706c65436c6f766572734d61726b6574536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a265627a7a723058208a05769ec8c5039515ff4c31ce170a7d913c4a25c1d559c5a7b7f1da48ed8ba064736f6c63430005090032
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000b55c5cac5014c662fdbf21a2c59cd45403c482fd0000000000000000000000001a94656a6245379bc0d9c64c402197528edb2bd10000000000000000000000001754a612ca578f72d678196bcc16710f01db7655
-----Decoded View---------------
Arg [0] : _clovers (address): 0xB55C5cAc5014C662fDBF21A2C59Cd45403C482Fd
Arg [1] : _clubToken (address): 0x1A94656A6245379bC0d9c64C402197528EdB2bD1
Arg [2] : _clubTokenController (address): 0x1754a612cA578F72d678196bcC16710f01DB7655
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000b55c5cac5014c662fdbf21a2c59cd45403c482fd
Arg [1] : 0000000000000000000000001a94656a6245379bc0d9c64c402197528edb2bd1
Arg [2] : 0000000000000000000000001754a612ca578f72d678196bcc16710f01db7655
Deployed Bytecode Sourcemap
29020:17456:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41688:88;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41688:88:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41688:88:0;;;;:::i;:::-;;31635:495;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31635:495:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;31635:495:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;1:33:-1;99:1;81:16;;74:27;;;;-1:-1;31635:495:0;;-1:-1:-1;31635:495:0;;-1:-1:-1;;;;31635:495:0:i;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;31635:495:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29486:23;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29486:23:0;;;:::i;:::-;;;;-1:-1:-1;;;;;29486:23:0;;;;;;;;;;;;;;46202:134;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46202:134:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;46202:134:0;;;;;;;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;46202:134:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;46202:134:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;46202:134:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;46202:134:0;;-1:-1:-1;46202:134:0;;-1:-1:-1;;;;;46202:134:0:i;34944:885::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;34944:885:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;1:33:-1;99:1;81:16;;74:27;;;;-1:-1;34944:885:0;;-1:-1:-1;;;34944:885:0;;;;-1:-1:-1;34944:885:0;:::i;:::-;;;;;;;;;;;;;;;;;;41883:91;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41883:91:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;41883:91:0;-1:-1:-1;;;;;41883:91:0;;:::i;30454:137::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30454:137:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;30454:137:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;1:33:-1;99:1;81:16;;74:27;;;;-1:-1;30454:137:0;;-1:-1:-1;30454:137:0;;-1:-1:-1;;;;30454:137:0:i;:::-;;;;;;;;;;;;;;;;31427:200;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31427:200:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31427:200:0;;;;;;;;;;;:::i;41330:252::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;41330:252:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;41330:252:0;;;;;;;;;;;;;;;;;:::i;30984:194::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30984:194:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;30984:194:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;1:33:-1;99:1;81:16;;74:27;;;;-1:-1;30984:194:0;;-1:-1:-1;30984:194:0;;-1:-1:-1;;;;30984:194:0:i;29916:28::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29916:28:0;;;:::i;29953:40::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29953:40:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29953:40:0;;:::i;40879:135::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40879:135:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40879:135:0;;;;;;;:::i;45959:237::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45959:237:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;45959:237:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1:33:-1;99:1;81:16;;74:27;;;;-1:-1;45959:237:0;;-1:-1:-1;;45959:237:0;;;-1:-1:-1;;45959:237:0;;;;;;;;;;-1:-1:-1;;;;;45959:237:0;;:::i;29433:18::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29433:18:0;;;:::i;33773:221::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33773:221:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33773:221:0;;:::i;45476:475::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45476:475:0;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;45476:475:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1:33:-1;99:1;81:16;;74:27;;;;-1:-1;45476:475:0;;;;;;;;;;;;-1:-1:-1;;;;;45476:475:0;;;;;;-1:-1:-1;45476:475:0;;-1:-1:-1;45476:475:0;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;45476:475:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;45476:475:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;45476:475:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;45476:475:0;;-1:-1:-1;;;45476:475:0;;-1:-1:-1;;;;;45476:475:0;;-1:-1:-1;45476:475:0;;-1:-1:-1;45476:475:0:i;24267:140::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24267:140:0;;;:::i;39413:1458::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;39413:1458:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39413:1458:0;;:::i;29692:74::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29692:74:0;;;:::i;29458:21::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29458:21:0;;;:::i;42739:118::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42739:118:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42739:118:0;;:::i;23456:79::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23456:79:0;;;:::i;23822:92::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23822:92:0;;;:::i;46342:131::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;46342:131:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;46342:131:0;;:::i;42422:156::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42422:156:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42422:156:0;-1:-1:-1;;;;;42422:156:0;;:::i;29604:47::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29604:47:0;;;:::i;36486:676::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;36486:676:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1:33:-1;99:1;81:16;;74:27;;;;-1:-1;36486:676:0;;;;;;;;;;;;;;-1:-1:-1;36486:676:0;-1:-1:-1;36486:676:0;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;36486:676:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;36486:676:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;36486:676:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;36486:676:0;;-1:-1:-1;36486:676:0;;-1:-1:-1;;;;;36486:676:0:i;29773:35::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29773:35:0;;;:::i;38972:231::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38972:231:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38972:231:0;-1:-1:-1;;38972:231:0;;:::i;43068:126::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43068:126:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43068:126:0;;:::i;29550:47::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29550:47:0;;;:::i;34319:617::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34319:617:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;34319:617:0;;:::i;29848:24::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29848:24:0;;;:::i;42120:156::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42120:156:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42120:156:0;-1:-1:-1;;;;;42120:156:0;;:::i;32409:958::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32409:958:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32409:958:0;;:::i;29879:30::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29879:30:0;;;:::i;29516:27::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29516:27:0;;;:::i;33375:135::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33375:135:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;33375:135:0;;:::i;30599:178::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30599:178:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30599:178:0;;;;;;-1:-1:-1;;;;;30599:178:0;;:::i;24562:109::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24562:109:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24562:109:0;-1:-1:-1;;;;;24562:109:0;;:::i;43350:103::-;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43350:103:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;43350:103:0;;:::i;41688:88::-;23668:9;:7;:9::i;:::-;23660:54;;;;;-1:-1:-1;;;23660:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41752:6;:16;;;;;;;;;;;;;;;;;41688:88::o;31635:495::-;31699:10;31711:13;31726:16;31744:13;31759:19;31780:13;31849:24;;:::i;:::-;31876:23;31893:5;31876:16;:23::i;:::-;31932:10;;31957:13;;;;31985:16;;;;32016:10;;;;32041:18;;;;32074:12;;;;;31932:10;;31957:13;;-1:-1:-1;31985:16:0;;-1:-1:-1;32016:10:0;-1:-1:-1;32041:18:0;;-1:-1:-1;32074:12:0;-1:-1:-1;31635:495:0;-1:-1:-1;;;31635:495:0:o;29486:23::-;;;-1:-1:-1;;;;;29486:23:0;;:::o;46202:134::-;46278:7;46305:23;:4;46318:9;46305:23;:12;:23;:::i;:::-;46298:30;;46202:134;;;;;:::o;34944:885::-;35041:4;35058:17;35078:19;35091:5;35078:12;:19::i;:::-;35108:26;35137:18;;;:7;:18;;;;;;35058:39;;-1:-1:-1;;;;;;35137:18:0;35174:32;;;:68;;-1:-1:-1;;;;;;35210:32:0;;35232:10;35210:32;35174:68;35166:107;;;;;-1:-1:-1;;;35166:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;35286:24;;:::i;:::-;35313:23;35330:5;35313:16;:23::i;:::-;35286:50;;35355:38;35367:4;:10;;;35379:4;:13;;;35355:11;:38::i;:::-;35347:63;;;;;-1:-1:-1;;;35347:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;35421:15;35439:32;35460:4;:10;;;35439:20;:32::i;:::-;35491:7;;:23;;;;;;;;;;;;;;35421:50;;-1:-1:-1;;;;;;35491:7:0;;;;:14;;:23;;;;;;;;;;;;;;;:7;:23;;;5:2:-1;;;;30:1;27;20:12;5:2;35491:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35491:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35491:23:0;35490:24;35482:58;;;;;-1:-1:-1;;;35482:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;35601:11;;;;35614:10;;;;35626;;;;35638;;;;35650:11;;;;35574:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35553:18;;35574:7;;:26;;:88;;;;;;;;;;;;;;;:7;:88;;;5:2:-1;;;;30:1;27;20:12;5:2;35574:88:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35574:88:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35574:88:0;;-1:-1:-1;35681:58:0;35694:7;35703:5;35574:88;35722:10;35734:4;35681:12;:58::i;:::-;35673:89;;;;;-1:-1:-1;;;35673:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;35780:18:0;;;;-1:-1:-1;35780:7:0;:18;;;;;35773:26;;;;;;-1:-1:-1;35773:26:0;34944:885;;;;:::o;41883:91::-;23668:9;:7;:9::i;:::-;23660:54;;;;;-1:-1:-1;;;23660:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41950:6;:16;;;;-1:-1:-1;;;;;41950:16:0;;;;;;;;;;41883:91::o;30454:137::-;30522:7;30576:5;30559:23;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;30559:23:0;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;30559:23:0;;;30549:34;;;;;;30542:41;;30454:137;;;;:::o;31427:200::-;31496:4;31517:5;:18;;;;31527:8;31526:9;31517:18;31513:107;;;-1:-1:-1;31559:5:0;31552:12;;31513:107;-1:-1:-1;31604:4:0;31597:11;;41330:252;41445:19;;-1:-1:-1;;;;;41445:19:0;41423:10;:42;41415:107;;;;-1:-1:-1;;;41415:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41533:7;;:41;;;;;;-1:-1:-1;;;;;41533:41:0;;;;;;;;;;;;;;;;;;;;;;:7;;;;;:20;;:41;;;;;:7;;:41;;;;;;;:7;;:41;;;5:2:-1;;;;30:1;27;20:12;5:2;41533:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;41533:41:0;;;;41330:252;;;:::o;30984:194::-;31047:4;31064:24;;:::i;:::-;31091:23;31108:5;31091:16;:23::i;:::-;31064:50;;31132:38;31144:4;:10;;;31156:4;:13;;;31132:11;:38::i;:::-;31125:45;30984:194;-1:-1:-1;;;30984:194:0:o;29916:28::-;;;;:::o;29953:40::-;;;;;;;;;;;;-1:-1:-1;;;;;29953:40:0;;:::o;40879:135::-;23668:9;:7;:9::i;:::-;23660:54;;;;;-1:-1:-1;;;23660:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40965:19;;:41;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40965:19:0;;;;:24;;:41;;;;;:19;;:41;;;;;;;;:19;;:41;;;5:2:-1;;;;30:1;27;20:12;5:2;40965:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40965:41:0;;;;40879:135;;:::o;45959:237::-;46089:7;46143;46152:5;46159:10;46171:4;46177:9;46126:61;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;46126:61:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;46126:61:0;-1:-1:-1;;;;;46126:61:0;;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;46126:61:0;;;46116:72;;;;;;46109:79;;45959:237;;;;;;;:::o;29433:18::-;;;;;;;;;:::o;33773:221::-;33859:31;;;;:7;:31;;;;;;;;:44;;33901:1;33859:44;;;;;;;;33932:28;;33949:10;33932:28;;;;;;;;;26:21:-1;;;22:32;6:49;;33932:28:0;;;;;;33922:39;;;;;;33914:48;;;;;;;;;:72;;;;;-1:-1:-1;;;;;33973:12:0;33914:72;;;;33773:221::o;45476:475::-;45723:4;45740:12;45755:76;45778:52;45786:7;45795:5;45802:10;45814:4;45820:9;45778:7;:52::i;:::-;45755:22;:76::i;:::-;45740:91;;45842:14;45859:24;45867:4;45873:9;45859:7;:24::i;:::-;45842:41;-1:-1:-1;;;;;;45902:20:0;;;;;;:40;;;45936:6;-1:-1:-1;;;;;45926:16:0;:6;-1:-1:-1;;;;;45926:16:0;;45902:40;45894:49;45476:475;-1:-1:-1;;;;;;;;;;45476:475:0:o;24267:140::-;23668:9;:7;:9::i;:::-;23660:54;;;;;-1:-1:-1;;;23660:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24366:1;24350:6;;24329:40;;-1:-1:-1;;;;;24350:6:0;;;;24329:40;;24366:1;;24329:40;24397:1;24380:19;;;;;;24267:140::o;39413:1458::-;39496:7;;:23;;;;;;;;;;;;;;39471:4;;-1:-1:-1;;;;;39496:7:0;;:14;;:23;;;;;;;;;;;;;;:7;:23;;;5:2:-1;;;;30:1;27;20:12;5:2;39496:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39496:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39496:23:0;39488:70;;;;-1:-1:-1;;;39488:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39582:4;39597:23;;:::i;:::-;39623:7;;:31;;;;;;;;;;;;;;-1:-1:-1;;;;;39623:7:0;;;;:22;;:31;;;;;;;;;;;;;:7;:31;;;5:2:-1;;;;30:1;27;20:12;5:2;39623:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;39623:31:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;13:2;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;39623:31:0;-1:-1:-1;39665:22:0;39706:7;:5;:7::i;:::-;39665:50;-1:-1:-1;39730:10:0;-1:-1:-1;;;;;39730:20:0;;;;;;:44;;-1:-1:-1;39768:6:0;;-1:-1:-1;;;;;39768:6:0;39754:10;:20;;39730:44;39726:912;;;39791:24;;:::i;:::-;39818:23;39835:5;39818:16;:23::i;:::-;39791:50;;39895:7;39859:32;39880:4;:10;;;39859:20;:32::i;:::-;:43;39856:96;;39931:5;39923:13;;39856:96;39969:5;:47;;;;;39978:38;39990:4;:10;;;40002:4;:13;;;39978:11;:38::i;:::-;39966:599;;;40058:7;;:30;;;;;;;;;;;;;;40037:18;;-1:-1:-1;;;;;40058:7:0;;:21;;:30;;;;;;;;;;;;;;:7;:30;;;5:2:-1;;;;30:1;27;20:12;5:2;40058:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40058:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40058:30:0;40144:11;;;;40058:30;;-1:-1:-1;40115:40:0;;40130:1;40116:15;;;40134:1;40116:19;40115:25;;:40;:56;;40166:5;40115:56;;;40158:5;40115:56;40107:64;;40227:4;:10;;;40198:39;;40222:1;40213;40199:10;:15;;40217:1;40199:19;40198:25;:39;;;:55;;40248:5;40198:55;;;40240:5;40198:55;40190:63;;40309:4;:10;;;40280:39;;40304:1;40295;40281:10;:15;;40299:1;40281:19;40280:25;:39;;;:55;;40330:5;40280:55;;;40322:5;40280:55;40391:10;;;;40272:63;;-1:-1:-1;40362:39:0;;40377:1;40363:15;;;:19;40362:25;;:39;:55;;40412:5;40362:55;;;40404:5;40362:55;40354:63;;40468:4;:11;;;40444:35;;40463:1;40445:10;40458:1;40445:14;40444:20;:35;;;:51;;40490:5;40444:51;;;40482:5;40444:51;40436:59;;39966:599;;;;40544:5;40536:13;;39966:599;40588:5;40587:6;40579:47;;;;;-1:-1:-1;;;40579:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;39726:912;;40650:25;40667:7;40650:16;:25::i;:::-;40706:7;;:24;;;;;;;;;;;;;;40686:17;;-1:-1:-1;;;;;40706:7:0;;:15;;:24;;;;;;;;;;;;;;:7;:24;;;5:2:-1;;;;30:1;27;20:12;5:2;40706:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40706:24:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40706:24:0;40746:55;;;;;;40706:24;;-1:-1:-1;40746:55:0;;40763:7;;40772:5;;40706:24;;40790:10;;40746:55;40706:24;40746:55;;;40772:5;;40746:55;;40772:5;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;40746:55:0;;;;;;;-1:-1:-1;;;;;40746:55:0;-1:-1:-1;;;;;40746:55:0;;;;;;-1:-1:-1;;;;;40746:55:0;-1:-1:-1;;;;;40746:55:0;;;;;;;;;;;;;;;;;;40812:7;;:29;;;;;;;;;;;;;;-1:-1:-1;;;;;40812:7:0;;;;:20;;:29;;;;;:7;;:29;;;;;;;;:7;;:29;;;5:2:-1;;;;30:1;27;20:12;5:2;40812:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;40859:4:0;;39413:1458;-1:-1:-1;;;;;;;;;39413:1458:0:o;29692:74::-;;;;:::o;29458:21::-;;;-1:-1:-1;;;;;29458:21:0;;:::o;42739:118::-;23668:9;:7;:9::i;:::-;23660:54;;;;;-1:-1:-1;;;23660:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42819:13;:30;42739:118::o;23456:79::-;23494:7;23521:6;-1:-1:-1;;;;;23521:6:0;23456:79;:::o;23822:92::-;23862:4;23900:6;-1:-1:-1;;;;;23900:6:0;23886:10;:20;;23822:92::o;46342:131::-;46409:7;46436:29;:4;:27;:29::i;42422:156::-;23668:9;:7;:9::i;:::-;23660:54;;;;;-1:-1:-1;;;23660:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42528:19;:42;;;;-1:-1:-1;;;;;42528:42:0;;;;;;;;;;42422:156::o;29604:47::-;;;-1:-1:-1;;;;;29604:47:0;;:::o;36486:676::-;36651:4;30043:6;;;;;;;30042:7;30034:38;;;;;-1:-1:-1;;;30034:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;36668:26;36697:7;:28;36705:19;36718:5;36705:12;:19::i;:::-;36697:28;;;;;;;;;;;-1:-1:-1;36697:28:0;;-1:-1:-1;;;;;36697:28:0;;-1:-1:-1;36744:32:0;;;:68;;-1:-1:-1;;;;;;36780:32:0;;36802:10;36780:32;36744:68;36736:107;;;;;-1:-1:-1;;;36736:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;36863:7;;:23;;;;;;;;;;;;;;-1:-1:-1;;;;;36863:7:0;;;;:14;;:23;;;;;;;;;;;;;;;:7;:23;;;5:2:-1;;;;30:1;27;20:12;5:2;36863:23:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36863:23:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36863:23:0;36862:24;36854:58;;;;;-1:-1:-1;;;36854:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;36931:79;36946:7;36955:5;36962:10;36974:4;36980:10;36992:9;37003:6;;;;;;;;;-1:-1:-1;;;;;37003:6:0;36931:14;:79::i;:::-;36923:109;;;;;-1:-1:-1;;;36923:109:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;37051:58;37064:7;37073:5;37080:10;37092;37104:4;37051:12;:58::i;:::-;37043:89;;;;;-1:-1:-1;;;37043:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37150:4:0;;36486:676;-1:-1:-1;;;;;;36486:676:0:o;29773:35::-;;;;:::o;38972:231::-;39038:14;;39065:131;39080:13;39078:15;;39065:131;;;39177:1;39179;39177:3;39162:13;:19;;;39159:1;:23;39155:1;:28;39142:6;39149:1;39142:9;;;;;;;;39131:53;39122:62;;;;;39094:3;;39065:131;;;;38972:231;;;:::o;43068:126::-;23668:9;:7;:9::i;:::-;23660:54;;;;;-1:-1:-1;;;23660:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43152:15;:34;43068:126::o;29550:47::-;;;-1:-1:-1;;;;;29550:47:0;;:::o;34319:617::-;34426:28;;;34443:10;34426:28;;;;;;;;;;;;;26:21:-1;;;22:32;6:49;;34426:28:0;;;;;;34416:39;;;;;;;;;34408:48;;;;:7;:48;;;;;34460:12;-1:-1:-1;;;;;34408:48:0;;;34400:72;34392:115;;;;;-1:-1:-1;;;34392:115:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;34518:18;34539:48;34565:9;34576:10;34539:25;:48::i;:::-;34598:38;34639:19;;;:7;:19;;;;;;34518:69;;-1:-1:-1;;;;;;34639:19:0;;34691:53;;34669:179;;;;-1:-1:-1;;;34669:179:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34866:19:0;;;;:7;:19;;;;;;34859:27;;;;;;;;;34897:18;;;;;:31;;;;;34918:10;34897:31;;;34319:617::o;29848:24::-;;;;:::o;42120:156::-;23668:9;:7;:9::i;:::-;23660:54;;;;;-1:-1:-1;;;23660:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42226:19;:42;;;;-1:-1:-1;;;;;42226:42:0;;;;;;;;;;42120:156::o;32409:958::-;32475:7;32495:20;32526:14;32551:13;32575;32599;32623:14;32747:7;;;;;;;;;-1:-1:-1;;;;;32747:7:0;-1:-1:-1;;;;;32747:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32747:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32747:26:0;;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;32747:26:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32747:26:0;;-1:-1:-1;32747:26:0;-1:-1:-1;32747:26:0;-1:-1:-1;32747:26:0;;-1:-1:-1;32747:26:0;-1:-1:-1;32784:12:0;32833:1;32829;32815:15;;;:19;;:24;32811:98;;;32848:61;32857:51;32897:6;32906:1;32897:10;32857:35;32875:12;32890:1;32875:16;32857:13;;:17;;:35;;;;:::i;:::-;:39;:51;:39;:51;:::i;:::-;32848:4;;:61;:8;:61;:::i;:::-;32841:68;;32811:98;32938:1;32924:10;:15;;32942:1;32924:19;32947:1;32924:24;32920:97;;;32957:60;32966:50;33006:5;33014:1;33006:9;32966:35;32984:12;32999:1;32984:16;32966:13;;:17;;:35;;;;:::i;32957:60::-;32950:67;;32920:97;33046:1;33032:10;:15;;33050:1;33032:19;33055:1;33032:24;33028:97;;;33065:60;33074:50;33114:5;33122:1;33114:9;33074:35;33092:12;33107:1;33092:16;33074:13;;:17;;:35;;;;:::i;33065:60::-;33058:67;;33028:97;33154:1;33140:15;;;:19;;:24;33136:97;;;33173:60;33182:50;33222:5;33230:1;33222:9;33182:35;33200:12;33215:1;33200:16;33182:13;;:17;;:35;;;;:::i;33173:60::-;33166:67;;33136:97;33248:10;33261:1;33248:14;33266:1;33248:19;33244:93;;;33276:61;33285:51;33325:6;33334:1;33325:10;33285:35;33303:12;33318:1;33303:16;33285:13;;:17;;:35;;;;:::i;33276:61::-;33269:68;;33244:93;33355:4;32409:958;-1:-1:-1;;;;;;;;32409:958:0:o;29879:30::-;;;;:::o;29516:27::-;;;-1:-1:-1;;;;;29516:27:0;;:::o;33375:135::-;33433:7;33460:42;33474:27;33490:10;33474:15;:27::i;:::-;33460:9;;;:42;:13;:42;:::i;30599:178::-;30730:38;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;6:49;;30730:38:0;;;;;;30720:49;;;;;;30599:178::o;24562:109::-;23668:9;:7;:9::i;:::-;23660:54;;;;;-1:-1:-1;;;23660:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24635:28;24654:8;24635:18;:28::i;:::-;24562:109;:::o;43350:103::-;23668:9;:7;:9::i;:::-;23660:54;;;;;-1:-1:-1;;;23660:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43423:9;:22;43350:103::o;1985:2149::-;2052:11;;:::i;:::-;2077:16;;:::i;:::-;2126:8;;2106:28;;;;:17;;;:28;2126:8;2162;;;;2145:25;;;:14;;;:25;2132:1;2181:12;;;:16;;;2226:1;2208:15;;;:19;;;2238:15;;;:19;2270:18;;;2299:13;;;:21;2168:1;-1:-1:-1;2331:18:0;;:26;2383:12;:10;:12::i;:::-;-1:-1:-1;;2370:25:0;:10;;;:25;2408:9;;;;;;2540:1447;2556:2;2552:1;:6;;;:15;;;;;2563:4;2562:5;2552:15;2540:1447;;;2619:2;2604:4;:12;;;:17;;;:54;;2644:4;:14;;;2604:54;;;2624:4;:17;;;2604:54;2589:69;;2680:45;2689:12;2718:2;2703:4;:12;;;:17;;;;;;;;2722:2;2680:8;:45::i;:::-;2673:52;;2753:17;2765:4;2753:11;:17::i;:::-;2740:30;;-1:-1:-1;2740:30:0;-1:-1:-1;2793:15:0;2803:4;2793:9;:15::i;:::-;2792:16;;-1:-1:-1;2827:6:0;;;;:32;;;;;2838:3;:8;;2845:1;2838:8;;:20;;;;2850:3;:8;;2857:1;2850:8;;2838:20;2823:225;;;2887:4;3015:17;;;2887:4;-1:-1:-1;2823:225:0;3067:4;3066:5;:16;;;;;3081:1;3075:3;:7;;;3066:16;:27;;;;;3092:1;3086:3;:7;;;3066:27;:39;;;;-1:-1:-1;3097:8:0;3066:39;:51;;;;-1:-1:-1;3109:8:0;3066:51;3062:914;;;3191:24;3200:4;3206:3;3211;3191:8;:24::i;:::-;3249:12;;;;;3264:1;3249:16;3234:31;;;;3288:10;;3249:12;;-1:-1:-1;3284:677:0;;;3328:22;3345:4;3328:16;:22::i;:::-;3323:619;;3460:5;3447:18;;3496;;;;:27;;3447:18;3496:27;3492:209;;;267:1;3556:18;;;:26;3492:209;;;223:1;3647:18;;;:26;3492:209;3734:24;3743:4;3749:3;3754;3734:8;:24::i;:::-;3789:10;;3727:31;;-1:-1:-1;3785:134:0;;;3845:4;3832:17;;;3845:4;-1:-1:-1;3785:134:0;2569:3;;;;;2540:1447;;;4002:10;;3997:108;;4036:16;4047:4;4036:10;:16::i;:::-;4029:23;;4074:19;4088:4;4074:13;:19::i;:::-;4067:26;;3997:108;-1:-1:-1;4122:4:0;;1985:2149;-1:-1:-1;;;;;;;1985:2149:0:o;26328:1930::-;26406:7;26469:9;:16;26489:2;26469:22;26465:74;;-1:-1:-1;26524:1:0;26508:19;;26465:74;26900:4;26885:20;;26879:27;26946:4;26931:20;;26925:27;27000:4;26985:20;;26979:27;26608:9;26971:36;27930:66;27917:79;;27913:129;;;28028:1;28013:17;;;;;;;27913:129;28058:1;:7;;28063:2;28058:7;;:18;;;;;28069:1;:7;;28074:2;28069:7;;28058:18;28054:68;;;28108:1;28093:17;;;;;;;28054:68;28226:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28226:24:0;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;28226:24:0;;;;;;26328:1930;-1:-1:-1;;;;;;;26328:1930:0:o;37170:1624::-;37319:7;;:38;;;;;;;;;;;;37302:4;;-1:-1:-1;;;;;37319:7:0;;:22;;37342:7;;37351:5;;37319:38;;;;;37351:5;;37319:38;;37351:5;37302:4;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;37319:38:0;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37319:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;37368:7:0;;:30;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37368:7:0;;;;-1:-1:-1;37368:15:0;;-1:-1:-1;37368:30:0;;;;;:7;;:30;;;;;;;;:7;;:30;;;5:2:-1;;;;30:1;27;20:12;5:2;37368:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37368:30:0;;;;37411:14;37453:1;37440:10;:14;37436:189;;;37471:7;;:42;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37471:7:0;;;;:21;;:42;;;;;:7;;:42;;;;;;;;:7;;:42;;;5:2:-1;;;;30:1;27;20:12;5:2;37471:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37471:42:0;;;;37537:27;37553:10;37537:15;:27::i;:::-;37579:7;;:34;;;;;;;;;;;;;;;;;;;;37528:36;;-1:-1:-1;;;;;;37579:7:0;;;;:17;;:34;;;;;:7;;:34;;;;;;;;:7;;:34;;;5:2:-1;;;;30:1;27;20:12;5:2;37579:34:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37579:34:0;;;;37436:189;37651:9;;37635:13;;37651:21;;37665:6;37651:21;:13;:21;:::i;:::-;37635:37;;37687:4;:17;;;;;37703:1;37695:5;:9;37687:17;37683:368;;;37864:9;;:31;;;;;;37884:10;37864:31;;;;;;37898:5;;-1:-1:-1;;;;;37864:9:0;;:19;;:31;;;;;;;;;;;;;;:9;:31;;;5:2:-1;;;;30:1;27;20:12;5:2;37864:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37864:31:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37864:31:0;:39;37860:132;;;37924:19;;;:52;;;;;;37965:10;37924:52;;;;;;;;-1:-1:-1;;;;;37924:19:0;;;;:23;;37954:9;;37924:52;;;;;;;;;;;;;;;37954:9;37924:19;:52;;;5:2:-1;;;;30:1;27;20:12;5:2;37924:52:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37924:52:0;;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;37860:132:0;38006:9;;:33;;;;;;38021:10;38006:33;;;;;;;;;;;;-1:-1:-1;;;;;38006:9:0;;;;:14;;:33;;;;;:9;;:33;;;;;;;;:9;;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;38006:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38006:33:0;;;;37683:368;38067:4;38063:608;;;38143:7;;:32;;;;;;-1:-1:-1;;;;;38143:32:0;;;;;;;;;;;;;;;:7;;;;;:12;;:32;;;;;:7;;:32;;;;;;;:7;;:32;;;5:2:-1;;;;30:1;27;20:12;5:2;38143:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38143:32:0;;;;38063:608;;;38400:7;;:39;;;;;;-1:-1:-1;;;;;38400:7:0;;;:39;;;;;;;;;;;;;;:7;;:12;;:39;;;;;:7;;:39;;;;;;;:7;;:39;;;5:2:-1;;;;30:1;27;20:12;5:2;38400:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;38454:19:0;;38513:15;;-1:-1:-1;;;;;38454:19:0;;;;-1:-1:-1;38454:24:0;;-1:-1:-1;38479:7:0;;38488:42;;38502:27;;:6;;:27;:10;:27;:::i;38488:42::-;38454:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;38454:77:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38454:77:0;;;;38559:1;38550:6;:10;38546:114;;;38589:9;;:33;;;;;;-1:-1:-1;;;;;38589:33:0;;;;;;;;;;;;;;;:9;;;;;:14;;:33;;;;;;;;;;;;;;:9;;:33;;;5:2:-1;;;;30:1;27;20:12;5:2;38589:33:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;38589:33:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;38589:33:0;38581:63;;;;;-1:-1:-1;;;38581:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;38686:78;38700:7;38709:5;38716:10;38728:9;38739:6;38747:10;38759:4;38686:78;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;-1:-1;;;;;;;;38686:78:0;;;;;;;;;;-1:-1:-1;;38686:78:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38686:78:0;-1:-1:-1;;38686:78:0;-1:-1:-1;38782:4:0;;37170:1624;-1:-1:-1;;;;;;;37170:1624:0:o;44617:851::-;44679:20;44710:14;44735:13;44759;44783;44807:14;44931:7;;;;;;;;;-1:-1:-1;;;;;44931:7:0;-1:-1:-1;;;;;44931:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44931:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44931:26:0;;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;44931:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44832:125;;;;;;;;;;;;;;;;;;;;;;;;44968:18;44989:7;;;;;;;;;-1:-1:-1;;;;;44989:7:0;-1:-1:-1;;;;;44989:21:0;;45011:7;44989:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;44989:30:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;44989:30:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;44989:30:0;;-1:-1:-1;45045:40:0;45062:14;:22;;45083:1;45062:22;;;45079:1;45062:22;45045:12;;:40;;;:16;:40;:::i;:::-;45030:55;-1:-1:-1;45105:40:0;:6;45142:1;45138;45124:15;;;:19;45105:40;:10;:40;:::i;:::-;45096:49;-1:-1:-1;45164:39:0;:5;45200:1;45196;45182:15;;;:19;45164:39;:9;:39;:::i;:::-;45156:47;-1:-1:-1;45222:39:0;:5;45258:1;45254;45240:15;;;:19;45222:39;:9;:39;:::i;:::-;45214:47;-1:-1:-1;45280:39:0;:5;45312:1;45298:15;;;:19;45280:39;:9;:39;:::i;:::-;45272:47;-1:-1:-1;45339:35:0;:6;45371:1;45358:14;;45339:35;:10;:35;:::i;:::-;45385:7;;:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45330:44;;-1:-1:-1;;;;;;45385:7:0;;;;:24;;:75;;;;;:7;;:75;;;;;;;;:7;;:75;;;5:2:-1;;;;30:1;27;20:12;5:2;45385:75:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45385:75:0;;;;44617:851;;;;;;;;:::o;28534:269::-;28736:58;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;28736:58:0;;;;;;;28726:69;;;;;;28534:269::o;20669:471::-;20727:7;20972:6;20968:47;;-1:-1:-1;21002:1:0;20995:8;;20968:47;21039:5;;;21043:1;21039;:5;:1;21063:5;;;;;:10;21055:56;;;;-1:-1:-1;;;21055:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21608:333;21666:7;21765:1;21761;:5;21753:44;;;;;-1:-1:-1;;;21753:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;21808:9;21824:1;21820;:5;;;;;;;21608:333;-1:-1:-1;;;;21608:333:0:o;19778:181::-;19836:7;19868:5;;;19892:6;;;;19884:46;;;;;-1:-1:-1;;;19884:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;24777:229;-1:-1:-1;;;;;24851:22:0;;24843:73;;;;-1:-1:-1;;;24843:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24953:6;;;24932:38;;-1:-1:-1;;;;;24932:38:0;;;;24953:6;;;24932:38;;;24981:6;:17;;;;-1:-1:-1;;;;;24981:17:0;;;;;;;;;;24777:229::o;1717:260::-;1872:57;1717:260;:::o;15742:281::-;15886:3;15985:20;;;;;15951:1;15936:11;;;15916:15;;;;15915:33;:37;;15985:20;;;15870:21;15976:38;;;15742:281::o;16520:201::-;16606:9;;;;16638:8;;;16645:1;16638:8;16670:10;;;;;;;16669:16;;;;;;16520:201::o;16416:96::-;16502:2;16494:10;;;;;16416:96;;;:::o;4847:2389::-;4929:11;;:::i;:::-;311:1;4997:41;;:32;5008:4;:10;;;5020:3;5025;4997:10;:32::i;:::-;:41;;;4993:188;;-1:-1:-1;5067:4:0;5054:17;;:4;5158:11;;4993:188;5191:36;;:::i;:::-;5238:31;5329:37;5351:4;5357:3;5362;5329:21;:37::i;:::-;5280:86;;-1:-1:-1;5280:86:0;-1:-1:-1;5413:29:0;;;5409:176;;-1:-1:-1;;5472:4:0;5459:17;;-1:-1:-1;5459:4:0;5562:11;;5409:176;5597:16;;;;;;;5756:802;5778:24;5774:28;;:1;:28;;;5756:802;;;5824:15;;;5854:21;;;5919:56;5937:4;5943:18;5962:1;5943:21;;;;;;;;;;;;;5966:3;5971;5919:17;:56::i;:::-;5890:85;;-1:-1:-1;5890:85:0;-1:-1:-1;5999:1:0;;-1:-1:-1;5990:557:0;6006:14;6002:18;;:1;:18;;;5990:557;;;6051:5;6046:24;;6066:4;6058:12;;6046:24;6116:50;6128:37;6137:8;6147:1;6150:14;6128:8;:37::i;:::-;6116:11;:50::i;:::-;6089:77;;;;;;;;6198:64;6207:4;:10;;;6219:4;:18;;;6239:10;6251;6198:8;:64::i;:::-;-1:-1:-1;;6185:77:0;:10;;;:77;6285:18;;;;:27;;267:1;6285:27;6281:251;;;6337:15;;;:20;;6356:1;6337:20;;;;;;;;6380:15;;;:20;;;;;;;;;6281:251;;;6449:15;;;:20;;;;;;;;;;;6492:15;;;:20;;6468:1;6492:20;;;;;;6281:251;6022:3;;;;;5990:557;;;5804:3;;5756:802;;;;6614:5;6610:413;;;6649:50;6658:4;:10;;;6670:4;:18;;;6690:3;6695;6649:8;:50::i;:::-;-1:-1:-1;;6636:63:0;:10;;;:63;6718:18;;;;:27;;267:1;6718:27;6714:149;;;6766:15;;;:20;;6785:1;6766:20;;;;;6714:149;;;6827:15;;;:20;;6846:1;6827:20;;;;;6714:149;6610:413;;;-1:-1:-1;;6908:4:0;6895:17;;-1:-1:-1;6895:4:0;;-1:-1:-1;7000:11:0;;-1:-1:-1;;;;;7000:11:0;6610:413;7066:18;;;;:27;;223:1;7066:27;7062:145;;;267:1;7110:18;;;:26;7062:145;;;223:1;7169:18;;;:26;7062:145;-1:-1:-1;7224:4:0;;4847:2389;-1:-1:-1;;;;;;;;;;4847:2389:0:o;4142:697::-;4283:10;;;;4210:4;;;;;4322:476;4338:2;4334:1;:6;;;:27;;;;;4345:16;4344:17;4334:27;4322:476;;;4383:20;;:::i;:::-;:53;;;;;;;;4424:1;4418;4414;:5;;;;;;;;4409:1;:11;4408:17;;;;;;;;4383:53;;;;;;;;4433:1;4429;:5;;;;;;;;4383:53;;;;4475:10;;;;4383:53;;-1:-1:-1;4451:10:0;;4464:40;;4383:53;4451:10;4487:7;;;;;4496:4;4501:1;4496:7;;;;4464:10;:40::i;:::-;4451:53;-1:-1:-1;4523:13:0;;;311:1;4523:13;4519:268;;;4570:5;4557:18;;;-1:-1:-1;;4594:18:0;;:10;;;:18;4638:32;;4557:4;;4653;;:7;;;;;4662:4;4667:1;4662:7;;;;4638:8;:32::i;:::-;4694:10;;4631:39;;-1:-1:-1;4689:83:0;;4748:4;4729:23;;4689:83;-1:-1:-1;;4363:3:0;;4322:476;;;-1:-1:-1;4815:16:0;;4142:697;-1:-1:-1;;;4142:697:0:o;10976:1572::-;11038:11;;:::i;:::-;11066:4;:12;;;:18;;11082:2;11066:18;11062:1457;;;-1:-1:-1;11157:4:0;11141:13;;;:20;:4;11176:11;;11062:1457;11303:10;;;;11220:7;;;;11328:878;11344:2;11340:1;:6;;;:28;;;;;11351:17;11350:18;11340:28;11328:878;;;11394:20;;:::i;:::-;:53;;;;;;;;11435:1;11429;11425;:5;;;;;;;;11420:1;:11;11419:17;;;;;;;;11394:53;;;;;;;;11444:1;11440;:5;;;;;;;;11394:53;;;;11490:10;;;;11394:53;;-1:-1:-1;11466:10:0;;11479:40;;11394:53;11466:10;11502:7;;11479:40;11466:53;-1:-1:-1;11542:13:0;;;311:1;11542:13;11538:653;;;223:1;11580:18;;;:26;11642:5;11629:18;;;-1:-1:-1;;11670:18:0;;:10;;;:18;11718:32;;11580:4;;11733;;:7;;11718:32;11778:10;;11711:39;;-1:-1:-1;11773:92:0;;11837:4;11817:24;;11773:92;267:1;11887:18;;;:26;11949:5;11936:18;;;-1:-1:-1;;11977:18:0;;:10;;;:18;12025:32;;11887:4;;12040;;:7;;12025:32;12085:10;;12018:39;;-1:-1:-1;12080:92:0;;12144:4;12124:24;;12080:92;-1:-1:-1;;11370:3:0;;;;;11328:878;;;12224:17;12220:288;;;12275:4;12262:17;;12220:288;;;12451:4;12435:13;;;:20;;12474:18;;12220:288;-1:-1:-1;12536:4:0;;10976:1572;-1:-1:-1;;;10976:1572:0:o;12556:1681::-;12621:11;;:::i;:::-;12659:4;;;;;12645:11;12787:1143;12809:1;12805;:5;;;:54;;;;;12815:6;:15;;;;12825:5;12815:15;:24;;;;12834:5;12815:24;:33;;;;12843:5;12815:33;:43;;;;12852:6;12815:43;12787:1143;;;12886:7;12881:1038;12903:1;12899;:5;;;:54;;;;;12909:6;:15;;;;12919:5;12909:15;:24;;;;12928:5;12909:24;:33;;;;12937:5;12909:33;:43;;;;12946:6;12909:43;12881:1038;;;13058:41;13070:4;:10;;;13087:1;13083;:5;13096:1;13092;:5;13058:11;:41::i;:::-;13025:74;;;:29;13037:4;:10;;;13049:1;13052;13025:11;:29::i;:::-;-1:-1:-1;;13025:74:0;;13021:137;;13133:5;13124:14;;13021:137;13251:35;13263:4;:10;;;13275:1;13283;13279;:5;13251:11;:35::i;:::-;13218:68;;;:29;13230:4;:10;;;13242:1;13245;13218:11;:29::i;:::-;-1:-1:-1;;13218:68:0;;13214:130;;13319:5;13311:13;;13214:130;13437:35;13449:4;:10;;;13466:1;13462;:5;13470:1;13437:11;:35::i;:::-;13404:68;;;:29;13416:4;:10;;;13428:1;13431;13404:11;:29::i;:::-;-1:-1:-1;;13404:68:0;;13400:130;;13505:5;13497:13;;13400:130;13623:41;13635:4;:10;;;13652:1;13648;:5;13661:1;13657;:5;13623:11;:41::i;:::-;13590:74;;;:29;13602:4;:10;;;13614:1;13617;13590:11;:29::i;:::-;-1:-1:-1;;13590:74:0;;13586:136;;13697:5;13689:13;;13586:136;13816:29;13828:4;:10;;;13840:1;13843;13816:11;:29::i;:::-;13783:62;;;:29;13795:4;:10;;;13807:1;13810;13783:11;:29::i;:::-;-1:-1:-1;;13783:62:0;;13779:125;;13879:5;13870:14;;13779:125;12955:3;;12881:1038;;;-1:-1:-1;12861:3:0;;12787:1143;;;;13944:6;:15;;;;13954:5;13944:15;:24;;;;13963:5;13944:24;:33;;;;13972:5;13944:33;:43;;;;13981:6;13944:43;13940:268;;;14023:4;14004:16;;;:23;14042:20;;;:11;;;:20;14077:18;;;:10;;;:18;14110;;;:10;;;:18;14143;;;:10;;;:18;14176:20;;;:11;;;:20;13940:268;-1:-1:-1;14225:4:0;;12556:1681;-1:-1:-1;;;;;12556:1681:0:o;20234:184::-;20292:7;20325:1;20320;:6;;20312:49;;;;;-1:-1:-1;;;20312:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20384:5:0;;;20234:184::o;15331:253::-;15410:5;15427:12;15442:19;15452:3;15457;15442:9;:19::i;:::-;-1:-1:-1;;15488:13:0;;;;;;;15506:19;15549:13;15522:1;15549:13;;-1:-1:-1;;15331:253:0;;;;;:::o;7244:1605::-;7338:17;;:::i;:::-;7357:5;7376:36;;:::i;:::-;7423:30;7468:22;;:::i;:::-;-1:-1:-1;7468:350:0;;;;;;;;7514:2;7468:350;;;;;;-1:-1:-1;7468:350:0;;;;;;;;;;;;;;;;;;;7563:1;7468:350;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;7468:350:0;;;;;;;;;;;;;;;;;;-1:-1:-1;;;7468:350:0;;;;;-1:-1:-1;7887:18:0;;:::i;:::-;7916:16;;7945:833;7967:1;7963;:5;;;7945:833;;;7996:4;8001:1;7996:7;;;;;;;;;;;;;;-1:-1:-1;7996:7:0;8050:1;8046:6;;;;8034:18;;;-1:-1:-1;8095:3:0;8099:1;8095:6;;;;8088:3;8083:18;8067:34;;8204:1;8188:13;:17;;;:38;;;;8225:1;8209:13;:17;;;8188:38;:59;;;;8246:1;8230:13;:17;;;8188:59;:80;;;;8267:1;8251:13;:17;;;8188:80;8182:585;;8303:66;8314:4;:10;;;8332:13;8354;8303:10;:66::i;:::-;8290:79;;8511:4;:18;;;8497:32;;:10;:32;;;8493:259;;8558:19;;;311:1;8558:19;8554:179;;8653:3;8606:18;8625:24;8606:44;;;;;;;;;;;;:50;8683:26;;;;;8554:179;7970:3;;7945:833;;;-1:-1:-1;8796:18:0;;8816:24;;-1:-1:-1;7244:1605:0;;-1:-1:-1;;;;;;;;;7244:1605:0:o;8857:2111::-;8967:7;8976:5;8994:22;9027:26;9056:1;9027:30;;9068:19;223:1;9102:27;;:4;:18;;;:27;;;9098:135;;;-1:-1:-1;267:1:0;9098:135;;;-1:-1:-1;223:1:0;9098:135;9372:9;;;;9482:1;9467:1438;9489:1;9485;:5;;;9467:1438;;;9517:4;9512:1382;;9563:6;;;9622;;;9553:16;;;9552:30;;;-1:-1:-1;9612:16:0;;9611:30;;;-1:-1:-1;9741:1:0;9567;9731:11;;;;;:26;;;9756:1;9746:7;:11;;;9731:26;:41;;;;9771:1;9761:7;:11;;;9731:41;:56;;;;9786:1;9776:7;:11;;;9731:56;9727:1152;;;9812:21;;;9879:1;9856:24;;9910:4;9903:11;;9727:1152;;;9971:54;9982:4;:10;;;10000:7;10016;9971:10;:54::i;:::-;9964:61;;10062:13;10054:21;;:4;:21;;;10050:810;;;10251:77;10259:14;10275:20;10303:7;10319;10251;:77::i;:::-;10210:118;;-1:-1:-1;10210:118:0;-1:-1:-1;10050:810:0;;;10370:4;:18;;;10362:26;;:4;:26;;;:35;;;;;10396:1;10392;:5;;;10362:35;10358:502;;;10518:4;10511:11;;10358:502;;;10723:21;;;10771:27;;;10832:4;10825:11;;10358:502;9492:3;;9467:1438;;;-1:-1:-1;10923:14:0;;10939:20;;-1:-1:-1;8857:2111:0;;-1:-1:-1;;;;;;;;;;8857:2111:0:o;14927:396::-;15019:7;15048:1;15042:3;:7;;;15038:21;;;15051:8;;;15038:21;15080:1;15074:3;:7;;;15070:21;;;15083:8;;;15070:21;15102:12;15117:19;15127:3;15132;15117:9;:19::i;:::-;15162;:27;;;;;;;15232:12;;15231:22;;;;15283:23;15162:19;15283:23;;;;:31;;15274:41;;;-1:-1:-1;;14927:396:0;;;;;;:::o;14720:199::-;14802:7;14822:12;14837:19;14847:3;14852;14837:9;:19::i;:::-;-1:-1:-1;;14875:13:0;;;;;;;14892:19;14874:37;;-1:-1:-1;;14720:199:0;;;;;:::o;15592:142::-;15701:1;:7;;;;15700:15;15693:2;15692:28;;;15724:1;15691:34;15683:43;;;15592:142::o;16031:377::-;16189:1;16183:7;16176:15;16194:2;16176:20;16222:21;;;;16285:1;16269:17;;;;;;16312:19;;;;;16342:13;;;;;;16031:377::o;29020:17456::-;;;;;;;;;-1:-1:-1;29020:17456:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;-1:-1;29020:17456:0;;;-1:-1:-1;;29020:17456:0:o;:::-;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;:::o
Swarm Source
bzzr://8a05769ec8c5039515ff4c31ce170a7d913c4a25c1d559c5a7b7f1da48ed8ba0
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.