More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 126 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw House S... | 11103050 | 1570 days ago | IN | 0 ETH | 0.00296714 | ||||
Withdraw House S... | 11103038 | 1570 days ago | IN | 0 ETH | 0.00299478 | ||||
Server End Game | 11071620 | 1575 days ago | IN | 0 ETH | 0.00073908 | ||||
Create Game | 11071545 | 1575 days ago | IN | 0 ETH | 0.00162315 | ||||
Server Cancel Ac... | 11071521 | 1575 days ago | IN | 0 ETH | 0.00111632 | ||||
User Cancel Acti... | 11071520 | 1575 days ago | IN | 0 ETH | 0.00091242 | ||||
Server End Game | 11071488 | 1575 days ago | IN | 0 ETH | 0.00067053 | ||||
Create Game | 11071442 | 1575 days ago | IN | 0 ETH | 0.0018035 | ||||
Withdraw House S... | 11071423 | 1575 days ago | IN | 0 ETH | 0.00131024 | ||||
Create Game | 11070973 | 1575 days ago | IN | 0 ETH | 0.00289069 | ||||
Create Game | 11070972 | 1575 days ago | IN | 0 ETH | 0.0006917 | ||||
Create Game | 11070960 | 1575 days ago | IN | 0 ETH | 0.00289069 | ||||
Create Game | 11070955 | 1575 days ago | IN | 0 ETH | 0.00211401 | ||||
Create Game | 11070939 | 1575 days ago | IN | 0 ETH | 0.0088347 | ||||
Create Game | 11069993 | 1575 days ago | IN | 0 ETH | 0.00080416 | ||||
Create Game | 11069834 | 1575 days ago | IN | 0 ETH | 0.00477991 | ||||
Create Game | 11069831 | 1575 days ago | IN | 0 ETH | 0.00462717 | ||||
User Cancel Acti... | 11069795 | 1575 days ago | IN | 0 ETH | 0.00084647 | ||||
User Cancel Acti... | 11069795 | 1575 days ago | IN | 0 ETH | 0.00126725 | ||||
Create Game | 11069785 | 1575 days ago | IN | 0 ETH | 0.00140994 | ||||
Create Game | 11069739 | 1575 days ago | IN | 0 ETH | 0.00199832 | ||||
Server Cancel Ac... | 11069518 | 1575 days ago | IN | 0 ETH | 0.00115868 | ||||
User Cancel Acti... | 11069513 | 1575 days ago | IN | 0 ETH | 0.00094704 | ||||
Create Game | 11069493 | 1575 days ago | IN | 0 ETH | 0.00165458 | ||||
Server Cancel Ac... | 11069466 | 1575 days ago | IN | 0 ETH | 0.00119555 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
GameChannel
Compiler Version
v0.5.16+commit.9c3226ce
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-10-13 */ pragma solidity ^0.5.0; /** * @title Conflict Resolution Interface * @dev interface to contract used for conflict resolution. Only needed if server or * user stops responding during game session. For documentation consult implementation * contract. * @author dicether */ interface ConflictResolutionInterface { function minHouseStake(uint activeGames) external view returns(uint); function maxBalance() external view returns(int); function conflictEndFine() external pure returns(int); function isValidBet(uint8 _gameType, uint _betNum, uint _betValue) external view returns(bool); function endGameConflict( uint8 _gameType, uint _betNum, uint _betValue, int _balance, uint _stake, bytes32 _serverSeed, bytes32 _userSeed ) external view returns(int); function serverForceGameEnd( uint8 gameType, uint _betNum, uint _betValue, int _balance, uint _stake, bytes32 _serverSeed, bytes32 _userSeed, uint _endInitiatedTime ) external view returns(int); function userForceGameEnd( uint8 _gameType, uint _betNum, uint _betValue, int _balance, uint _stake, uint _endInitiatedTime ) external view returns(int); } /** * @title Owned * @dev Basic contract for authorization control. * @author dicether */ contract Ownable { address public owner; address public pendingOwner; event LogOwnerShipTransferred(address indexed previousOwner, address indexed newOwner); event LogOwnerShipTransferInitiated(address indexed previousOwner, address indexed newOwner); /** * @dev Modifier, which throws if called by other account than owner. */ modifier onlyOwner { require(msg.sender == owner); _; } /** * @dev Modifier throws if called by any account other than the pendingOwner. */ modifier onlyPendingOwner() { require(msg.sender == pendingOwner); _; } /** * @dev Set contract creator as initial owner */ constructor() public { owner = msg.sender; pendingOwner = address(0); } /** * @dev Allows the current owner to set the pendingOwner address. * @param _newOwner The address to transfer ownership to. */ function transferOwnership(address _newOwner) public onlyOwner { pendingOwner = _newOwner; emit LogOwnerShipTransferInitiated(owner, _newOwner); } /** * @dev PendingOwner can accept ownership. */ function claimOwnership() public onlyPendingOwner { owner = pendingOwner; pendingOwner = address(0); emit LogOwnerShipTransferred(owner, pendingOwner); } } /** * @title Conflict Resolution Manager * @author dicether */ contract ConflictResolutionManager is Ownable { /// @dev Conflict resolution contract. ConflictResolutionInterface public conflictRes; /// @dev New Conflict resolution contract. address public newConflictRes = address(0); /// @dev Time update of new conflict resolution contract was initiated. uint public updateTime = 0; /// @dev Min time before new conflict res contract can be activated after initiating update. uint public constant MIN_TIMEOUT = 3 days; /// @dev Min time before new conflict res contract can be activated after initiating update. uint public constant MAX_TIMEOUT = 6 days; /// @dev Update of conflict resolution contract was initiated. event LogUpdatingConflictResolution(address newConflictResolutionAddress); /// @dev New conflict resolution contract is active. event LogUpdatedConflictResolution(address newConflictResolutionAddress); /** * @dev Constructor * @param _conflictResAddress conflict resolution contract address. */ constructor(address _conflictResAddress) public { conflictRes = ConflictResolutionInterface(_conflictResAddress); } /** * @dev Initiate conflict resolution contract update. * @param _newConflictResAddress New conflict resolution contract address. */ function updateConflictResolution(address _newConflictResAddress) public onlyOwner { newConflictRes = _newConflictResAddress; updateTime = block.timestamp; emit LogUpdatingConflictResolution(_newConflictResAddress); } /** * @dev Active new conflict resolution contract. */ function activateConflictResolution() public onlyOwner { require(newConflictRes != address(0)); require(updateTime != 0); require(updateTime + MIN_TIMEOUT <= block.timestamp && block.timestamp <= updateTime + MAX_TIMEOUT); conflictRes = ConflictResolutionInterface(newConflictRes); newConflictRes = address(0); updateTime = 0; emit LogUpdatedConflictResolution(newConflictRes); } } /** * @title Activatable * @dev Contract is initial deactivated and can be activated by owner. * @author Dicether */ contract Activatable is Ownable { bool public activated = false; /// @dev Event is fired if activated. event LogActive(); /// @dev Modifier, which only allows function execution if activated. modifier onlyActivated() { require(activated); _; } /// @dev Modifier, which only allows function execution if not activated. modifier onlyNotActivated() { require(!activated); _; } /// @dev activate contract, can be only called once by the contract owner. function activate() public onlyOwner onlyNotActivated { activated = true; emit LogActive(); } } /** * @title SafeMath * @dev Math operations with safety checks that throw on error. * From zeppelin-solidity */ library SafeMath { /** * @dev Multiplies two unsigned integers, throws on overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256 c) { // Gas optimization: this is cheaper than asserting 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522 if (a == 0) { return 0; } c = a * b; assert(c / a == b); return c; } /** * @dev Multiplies two signed integers, throws on overflow. */ function mul(int256 a, int256 b) internal pure returns (int256) { // Gas optimization: this is cheaper than asserting 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522 if (a == 0) { return 0; } int256 c = a * b; assert(c / a == b); return c; } /** * @dev Integer division of two unsigned integers, truncating the quotient. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { // assert(b > 0); // Solidity automatically throws when dividing by 0 // uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return a / b; } /** * @dev Integer division of two signed integers, truncating the quotient. */ function div(int256 a, int256 b) internal pure returns (int256) { // assert(b > 0); // Solidity automatically throws when dividing by 0 // Overflow only happens when the smallest negative int is multiplied by -1. int256 INT256_MIN = int256((uint256(1) << 255)); assert(a != INT256_MIN || b != - 1); return a / b; } /** * @dev Subtracts two unsigned integers, throws on overflow (i.e. if subtrahend is greater than minuend). */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { assert(b <= a); return a - b; } /** * @dev Subtracts two signed integers, throws on overflow. */ function sub(int256 a, int256 b) internal pure returns (int256) { int256 c = a - b; assert((b >= 0 && c <= a) || (b < 0 && c > a)); return c; } /** * @dev Adds two unsigned integers, throws on overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256 c) { c = a + b; assert(c >= a); return c; } /** * @dev Adds two signed integers, throws on overflow. */ function add(int256 a, int256 b) internal pure returns (int256) { int256 c = a + b; assert((b >= 0 && c >= a) || (b < 0 && c < a)); return c; } } /** * @title Pausable * @dev Provides pausing support. * @author dicether */ contract Pausable is Activatable { using SafeMath for uint; /// @dev Is contract paused. Initial it is paused. bool public paused = true; /// @dev Time pause was called uint public timePaused = block.timestamp; /// @dev Modifier, which only allows function execution if not paused. modifier onlyNotPaused() { require(!paused, "paused"); _; } /// @dev Modifier, which only allows function execution if paused. modifier onlyPaused() { require(paused); _; } /// @dev Modifier, which only allows function execution if paused longer than timeSpan. modifier onlyPausedSince(uint timeSpan) { require(paused && (timePaused.add(timeSpan) <= block.timestamp)); _; } /// @dev Event is fired if paused. event LogPause(); /// @dev Event is fired if pause is ended. event LogUnpause(); /** * @dev Pause contract. No new game sessions can be created. */ function pause() public onlyOwner onlyNotPaused { paused = true; timePaused = block.timestamp; emit LogPause(); } /** * @dev Unpause contract. Initial contract is paused and can only be unpaused after activating it. */ function unpause() public onlyOwner onlyPaused onlyActivated { paused = false; timePaused = 0; emit LogUnpause(); } } /** * @title Destroyable * @dev Provides destroy support * @author dicether */ contract Destroyable is Pausable { /// @dev After pausing the contract for 20 days owner can selfdestruct it. uint public constant TIMEOUT_DESTROY = 20 days; /** * @dev Destroy contract and transfer ether to owner. */ function destroy() public onlyOwner onlyPausedSince(TIMEOUT_DESTROY) { selfdestruct(address(uint160(owner))); } } /** * @title Math utils * @author dicether */ library MathUtil { /** * @dev Returns the absolute value of _val. * @param _val value * @return The absolute value of _val. */ function abs(int _val) internal pure returns(uint) { if (_val < 0) { return uint(-_val); } else { return uint(_val); } } /** * @dev Calculate maximum. */ function max(uint _val1, uint _val2) internal pure returns(uint) { return _val1 >= _val2 ? _val1 : _val2; } /** * @dev Calculate minimum. */ function min(uint _val1, uint _val2) internal pure returns(uint) { return _val1 <= _val2 ? _val1 : _val2; } } library SafeCast { /** * Cast unsigned a to signed a. */ function castToInt(uint a) internal pure returns(int) { assert(a < (1 << 255)); return int(a); } /** * Cast signed a to unsigned a. */ function castToUint(int a) internal pure returns(uint) { assert(a >= 0); return uint(a); } } contract ERC20 { function approve(address _spender, uint256 _value) public returns (bool success); function allowance(address owner, address spender) public returns (uint256); function balanceOf(address who) public returns (uint256); function transferFrom(address from, address to, uint256 value) public returns (bool); function transfer(address _to, uint _value) public; event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed _owner, address indexed _spender, uint256 _value); } /** * @title Game Channel Base * @dev Base contract for state channel implementation. * @author dicether */ contract GameChannelBase is Destroyable, ConflictResolutionManager { using SafeCast for int; using SafeCast for uint; using SafeMath for int; using SafeMath for uint; address public ERC20TokenAddress = 0x9BB6fd000109E24Eb38B0Deb806382fF9247E478; /// @dev Different game session states. enum GameStatus { ENDED, ///< @dev Game session is ended. ACTIVE, ///< @dev Game session is active. USER_INITIATED_END, ///< @dev User initiated non regular end. SERVER_INITIATED_END ///< @dev Server initiated non regular end. } /// @dev Reason game session ended. enum ReasonEnded { REGULAR_ENDED, ///< @dev Game session is regularly ended. SERVER_FORCED_END, ///< @dev User did not respond. Server forced end. USER_FORCED_END, ///< @dev Server did not respond. User forced end. CONFLICT_ENDED ///< @dev Server or user raised conflict ans pushed game state, opponent pushed same game state. } struct Game { /// @dev Game session status. GameStatus status; /// @dev User's stake. uint128 stake; /// @dev Last game round info if not regularly ended. /// If game session is ended normally this data is not used. uint8 gameType; uint32 roundId; uint betNum; uint betValue; int balance; bytes32 userSeed; bytes32 serverSeed; uint endInitiatedTime; } /// @dev Minimal time span between profit transfer. uint public constant MIN_TRANSFER_TIMESPAN = 1 days; /// @dev Maximal time span between profit transfer. uint public constant MAX_TRANSFER_TIMSPAN = 6 * 30 days; bytes32 public constant EIP712DOMAIN_TYPEHASH = keccak256( "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)" ); bytes32 public constant BET_TYPEHASH = keccak256( "Bet(uint32 roundId,uint8 gameType,uint256 number,uint256 value,int256 balance,bytes32 serverHash,bytes32 userHash,uint256 gameId)" ); bytes32 public DOMAIN_SEPERATOR; /// @dev Current active game sessions. uint public activeGames = 0; /// @dev Game session id counter. Points to next free game session slot. So gameIdCntr -1 is the // number of game sessions created. uint public gameIdCntr = 1; /// @dev Only this address can accept and end games. address public serverAddress; /// @dev Address to transfer profit to. address public houseAddress; /// @dev Current house stake. uint public houseStake = 0; /// @dev House profit since last profit transfer. int public houseProfit = 0; /// @dev Min value user needs to deposit for creating game session. uint128 public minStake; /// @dev Max value user can deposit for creating game session. uint128 public maxStake; /// @dev Timeout until next profit transfer is allowed. uint public profitTransferTimeSpan = 14 days; /// @dev Last time profit transferred to house. uint public lastProfitTransferTimestamp; /// @dev Maps gameId to game struct. mapping (uint => Game) public gameIdGame; /// @dev Maps user address to current user game id. mapping (address => uint) public userGameId; /// @dev Maps user address to pending returns. mapping (address => uint) public pendingReturns; /// @dev Modifier, which only allows to execute if house stake is high enough. modifier onlyValidHouseStake(uint _activeGames) { uint minHouseStake = conflictRes.minHouseStake(_activeGames); require(houseStake >= minHouseStake, "inv houseStake"); _; } /// @dev Modifier to check if value send fulfills user stake requirements. modifier onlyValidValue(uint _amount) { require(minStake <= _amount && _amount <= maxStake, "inv stake"); _; } /// @dev Modifier, which only allows server to call function. modifier onlyServer() { require(msg.sender == serverAddress); _; } /// @dev Modifier, which only allows to set valid transfer timeouts. modifier onlyValidTransferTimeSpan(uint transferTimeout) { require(transferTimeout >= MIN_TRANSFER_TIMESPAN && transferTimeout <= MAX_TRANSFER_TIMSPAN); _; } /// @dev This event is fired when user creates game session. event LogGameCreated(address indexed user, uint indexed gameId, uint128 stake, bytes32 indexed serverEndHash, bytes32 userEndHash); /// @dev This event is fired when user requests conflict end. event LogUserRequestedEnd(address indexed user, uint indexed gameId); /// @dev This event is fired when server requests conflict end. event LogServerRequestedEnd(address indexed user, uint indexed gameId); /// @dev This event is fired when game session is ended. event LogGameEnded(address indexed user, uint indexed gameId, uint32 roundId, int balance, ReasonEnded reason); /// @dev this event is fired when owner modifies user's stake limits. event LogStakeLimitsModified(uint minStake, uint maxStake); /** * @dev Contract constructor. * @param _serverAddress Server address. * @param _minStake Min value user needs to deposit to create game session. * @param _maxStake Max value user can deposit to create game session. * @param _conflictResAddress Conflict resolution contract address. * @param _houseAddress House address to move profit to. * @param _chainId Chain id for signature domain. */ constructor( address _serverAddress, uint128 _minStake, uint128 _maxStake, address _conflictResAddress, address _houseAddress, uint _chainId ) public ConflictResolutionManager(_conflictResAddress) { require(_minStake > 0 && _minStake <= _maxStake); serverAddress = _serverAddress; houseAddress = _houseAddress; lastProfitTransferTimestamp = block.timestamp; minStake = _minStake; maxStake = _maxStake; DOMAIN_SEPERATOR = keccak256(abi.encode( EIP712DOMAIN_TYPEHASH, keccak256("Dicether"), keccak256("2"), _chainId, address(this) )); } /** * @dev Set gameIdCntr. Can be only set before activating contract. */ function setGameIdCntr(uint _gameIdCntr) public onlyOwner onlyNotActivated { require(gameIdCntr > 0); gameIdCntr = _gameIdCntr; } /** * @notice Withdraw pending returns. */ function withdraw() public { uint toTransfer = pendingReturns[msg.sender]; require(toTransfer > 0); pendingReturns[msg.sender] = 0; msg.sender.transfer(toTransfer); } /** * @notice Transfer house profit to houseAddress. */ function transferProfitToHouse() public { require(lastProfitTransferTimestamp.add(profitTransferTimeSpan) <= block.timestamp); // update last transfer timestamp lastProfitTransferTimestamp = block.timestamp; if (houseProfit <= 0) { // no profit to transfer return; } uint toTransfer = houseProfit.castToUint(); houseProfit = 0; houseStake = houseStake.sub(toTransfer); ERC20(ERC20TokenAddress).transfer(houseAddress, toTransfer); } /** * @dev Set profit transfer time span. */ function setProfitTransferTimeSpan(uint _profitTransferTimeSpan) public onlyOwner onlyValidTransferTimeSpan(_profitTransferTimeSpan) { profitTransferTimeSpan = _profitTransferTimeSpan; } /** * @dev Increase house stake by msg.value * @param _amount _amount of house stake that added. */ function addHouseStake(uint _amount) public onlyOwner { ERC20(ERC20TokenAddress).transferFrom(msg.sender, address(this), _amount); houseStake = houseStake.add(_amount); } /** * @dev Withdraw house stake. */ function withdrawHouseStake(uint value) public onlyOwner { uint minHouseStake = conflictRes.minHouseStake(activeGames); require(value <= houseStake && houseStake.sub(value) >= minHouseStake); require(houseProfit <= 0 || houseProfit.castToUint() <= houseStake.sub(value)); houseStake = houseStake.sub(value); ERC20(ERC20TokenAddress).transfer(houseAddress, value); // owner.transfer(value); } /** * @dev Withdraw house stake and profit. */ function withdrawAll() public onlyOwner onlyPausedSince(3 days) { houseProfit = 0; uint toTransfer = houseStake; houseStake = 0; ERC20(ERC20TokenAddress).transfer(houseAddress, toTransfer); // owner.transfer(toTransfer); } /** * @dev Set new house address. * @param _houseAddress New house address. */ function setHouseAddress(address _houseAddress) public onlyOwner { houseAddress = _houseAddress; } /** * @dev Set stake min and max value. * @param _minStake Min stake. * @param _maxStake Max stake. */ function setStakeRequirements(uint128 _minStake, uint128 _maxStake) public onlyOwner { require(_minStake > 0 && _minStake <= _maxStake); minStake = _minStake; maxStake = _maxStake; emit LogStakeLimitsModified(minStake, maxStake); } /** * @dev Close game session. * @param _game Game session data. * @param _gameId Id of game session. * @param _userAddress User's address of game session. * @param _reason Reason for closing game session. * @param _balance Game session balance. */ function closeGame( Game storage _game, uint _gameId, uint32 _roundId, address _userAddress, ReasonEnded _reason, int _balance ) internal { _game.status = GameStatus.ENDED; activeGames = activeGames.sub(1); payOut(_userAddress, _game.stake, _balance); emit LogGameEnded(_userAddress, _gameId, _roundId, _balance, _reason); } /** * @dev End game by paying out user and server. * @param _userAddress User's address. * @param _stake User's stake. * @param _balance User's balance. */ function payOut(address _userAddress, uint128 _stake, int _balance) internal { int stakeInt = _stake; int houseStakeInt = houseStake.castToInt(); assert(_balance <= conflictRes.maxBalance()); assert((stakeInt.add(_balance)) >= 0); if (_balance > 0 && houseStakeInt < _balance) { // Should never happen! // House is bankrupt. // Payout left money. _balance = houseStakeInt; } houseProfit = houseProfit.sub(_balance); int newHouseStake = houseStakeInt.sub(_balance); houseStake = newHouseStake.castToUint(); uint valueUser = stakeInt.add(_balance).castToUint(); pendingReturns[_userAddress] += valueUser; if (pendingReturns[_userAddress] > 0) { safeSend(_userAddress); } } /** * @dev Send value of pendingReturns[_address] to _address. * @param _address Address to send value to. */ function safeSend(address _address) internal { uint valueToSend = pendingReturns[_address]; assert(valueToSend > 0); pendingReturns[_address] = 0; ERC20(ERC20TokenAddress).transfer(_address, valueToSend); // if (_address.send(valueToSend) == false) { // pendingReturns[_address] = valueToSend; // } } /** * @dev Verify signature of given data. Throws on verification failure. * @param _sig Signature of given data in the form of rsv. * @param _address Address of signature signer. */ function verifySig( uint32 _roundId, uint8 _gameType, uint _num, uint _value, int _balance, bytes32 _serverHash, bytes32 _userHash, uint _gameId, address _contractAddress, bytes memory _sig, address _address ) internal view { // check if this is the correct contract address contractAddress = address(this); require(_contractAddress == contractAddress, "inv contractAddress"); bytes32 roundHash = calcHash( _roundId, _gameType, _num, _value, _balance, _serverHash, _userHash, _gameId ); verify( roundHash, _sig, _address ); } /** * @dev Check if _sig is valid signature of _hash. Throws if invalid signature. * @param _hash Hash to check signature of. * @param _sig Signature of _hash. * @param _address Address of signer. */ function verify( bytes32 _hash, bytes memory _sig, address _address ) internal pure { (bytes32 r, bytes32 s, uint8 v) = signatureSplit(_sig); address addressRecover = ecrecover(_hash, v, r, s); require(addressRecover == _address, "inv sig"); } /** * @dev Calculate typed hash of given data (compare eth_signTypedData). * @return Hash of given data. */ function calcHash( uint32 _roundId, uint8 _gameType, uint _num, uint _value, int _balance, bytes32 _serverHash, bytes32 _userHash, uint _gameId ) private view returns(bytes32) { bytes32 betHash = keccak256(abi.encode( BET_TYPEHASH, _roundId, _gameType, _num, _value, _balance, _serverHash, _userHash, _gameId )); return keccak256(abi.encodePacked( "\x19\x01", DOMAIN_SEPERATOR, betHash )); } /** * @dev Split the given signature of the form rsv in r s v. v is incremented with 27 if * it is below 2. * @param _signature Signature to split. * @return r s v */ function signatureSplit(bytes memory _signature) private pure returns (bytes32 r, bytes32 s, uint8 v) { require(_signature.length == 65, "inv sig"); assembly { r := mload(add(_signature, 32)) s := mload(add(_signature, 64)) v := and(mload(add(_signature, 65)), 0xff) } if (v < 2) { v = v + 27; } } } /** * @title Game Channel Conflict * @dev Conflict handling implementation. * @author dicether */ contract GameChannelConflict is GameChannelBase { using SafeCast for int; using SafeCast for uint; using SafeMath for int; using SafeMath for uint; /** * @dev Contract constructor. * @param _serverAddress Server address. * @param _minStake Min value user needs to deposit to create game session. * @param _maxStake Max value user can deposit to create game session. * @param _conflictResAddress Conflict resolution contract address * @param _houseAddress House address to move profit to * @param _chainId Chain id for signature domain. */ constructor( address _serverAddress, uint128 _minStake, uint128 _maxStake, address _conflictResAddress, address _houseAddress, uint _chainId ) public GameChannelBase(_serverAddress, _minStake, _maxStake, _conflictResAddress, _houseAddress, _chainId) { // nothing to do } /** * @dev Used by server if user does not end game session. * @param _roundId Round id of bet. * @param _gameType Game type of bet. * @param _num Number of bet. * @param _value Value of bet. * @param _balance Balance before this bet. * @param _serverHash Hash of server seed for this bet. * @param _userHash Hash of user seed for this bet. * @param _gameId Game session id. * @param _contractAddress Address of this contract. * @param _userSig User signature of this bet. * @param _userAddress Address of user. * @param _serverSeed Server seed for this bet. * @param _userSeed User seed for this bet. */ function serverEndGameConflict( uint32 _roundId, uint8 _gameType, uint _num, uint _value, int _balance, bytes32 _serverHash, bytes32 _userHash, uint _gameId, address _contractAddress, bytes memory _userSig, address _userAddress, bytes32 _serverSeed, bytes32 _userSeed ) public onlyServer { verifySig( _roundId, _gameType, _num, _value, _balance, _serverHash, _userHash, _gameId, _contractAddress, _userSig, _userAddress ); serverEndGameConflictImpl( _roundId, _gameType, _num, _value, _balance, _serverHash, _userHash, _serverSeed, _userSeed, _gameId, _userAddress ); } /** * @notice Can be used by user if server does not answer to the end game session request. * @param _roundId Round id of bet. * @param _gameType Game type of bet. * @param _num Number of bet. * @param _value Value of bet. * @param _balance Balance before this bet. * @param _serverHash Hash of server seed for this bet. * @param _userHash Hash of user seed for this bet. * @param _gameId Game session id. * @param _contractAddress Address of this contract. * @param _serverSig Server signature of this bet. * @param _userSeed User seed for this bet. */ function userEndGameConflict( uint32 _roundId, uint8 _gameType, uint _num, uint _value, int _balance, bytes32 _serverHash, bytes32 _userHash, uint _gameId, address _contractAddress, bytes memory _serverSig, bytes32 _userSeed ) public { verifySig( _roundId, _gameType, _num, _value, _balance, _serverHash, _userHash, _gameId, _contractAddress, _serverSig, serverAddress ); userEndGameConflictImpl( _roundId, _gameType, _num, _value, _balance, _userHash, _userSeed, _gameId, msg.sender ); } /** * @notice Cancel active game without playing. Useful if server stops responding before * one game is played. * @param _gameId Game session id. */ function userCancelActiveGame(uint _gameId) public { address userAddress = msg.sender; uint gameId = userGameId[userAddress]; Game storage game = gameIdGame[gameId]; require(gameId == _gameId, "inv gameId"); if (game.status == GameStatus.ACTIVE) { game.endInitiatedTime = block.timestamp; game.status = GameStatus.USER_INITIATED_END; emit LogUserRequestedEnd(msg.sender, gameId); } else if (game.status == GameStatus.SERVER_INITIATED_END && game.roundId == 0) { cancelActiveGame(game, gameId, userAddress); } else { revert(); } } /** * @dev Cancel active game without playing. Useful if user starts game session and * does not play. * @param _userAddress Users' address. * @param _gameId Game session id. */ function serverCancelActiveGame(address _userAddress, uint _gameId) public onlyServer { uint gameId = userGameId[_userAddress]; Game storage game = gameIdGame[gameId]; require(gameId == _gameId, "inv gameId"); if (game.status == GameStatus.ACTIVE) { game.endInitiatedTime = block.timestamp; game.status = GameStatus.SERVER_INITIATED_END; emit LogServerRequestedEnd(msg.sender, gameId); } else if (game.status == GameStatus.USER_INITIATED_END && game.roundId == 0) { cancelActiveGame(game, gameId, _userAddress); } else { revert(); } } /** * @dev Force end of game if user does not respond. Only possible after a certain period of time * to give the user a chance to respond. * @param _userAddress User's address. */ function serverForceGameEnd(address _userAddress, uint _gameId) public onlyServer { uint gameId = userGameId[_userAddress]; Game storage game = gameIdGame[gameId]; require(gameId == _gameId, "inv gameId"); require(game.status == GameStatus.SERVER_INITIATED_END, "inv status"); // theoretically we have enough data to calculate winner // but as user did not respond assume he has lost. int newBalance = conflictRes.serverForceGameEnd( game.gameType, game.betNum, game.betValue, game.balance, game.stake, game.serverSeed, game.userSeed, game.endInitiatedTime ); closeGame(game, gameId, game.roundId, _userAddress, ReasonEnded.SERVER_FORCED_END, newBalance); } /** * @notice Force end of game if server does not respond. Only possible after a certain period of time * to give the server a chance to respond. */ function userForceGameEnd(uint _gameId) public { address userAddress = msg.sender; uint gameId = userGameId[userAddress]; Game storage game = gameIdGame[gameId]; require(gameId == _gameId, "inv gameId"); require(game.status == GameStatus.USER_INITIATED_END, "inv status"); int newBalance = conflictRes.userForceGameEnd( game.gameType, game.betNum, game.betValue, game.balance, game.stake, game.endInitiatedTime ); closeGame(game, gameId, game.roundId, userAddress, ReasonEnded.USER_FORCED_END, newBalance); } /** * @dev Conflict handling implementation. Stores game data and timestamp if game * is active. If server has already marked conflict for game session the conflict * resolution contract is used (compare conflictRes). * @param _roundId Round id of bet. * @param _gameType Game type of bet. * @param _num Number of bet. * @param _value Value of bet. * @param _balance Balance before this bet. * @param _userHash Hash of user's seed for this bet. * @param _userSeed User's seed for this bet. * @param _gameId game Game session id. * @param _userAddress User's address. */ function userEndGameConflictImpl( uint32 _roundId, uint8 _gameType, uint _num, uint _value, int _balance, bytes32 _userHash, bytes32 _userSeed, uint _gameId, address _userAddress ) private { uint gameId = userGameId[_userAddress]; Game storage game = gameIdGame[gameId]; int maxBalance = conflictRes.maxBalance(); int gameStake = game.stake; require(gameId == _gameId, "inv gameId"); require(_roundId > 0, "inv roundId"); require(keccak256(abi.encodePacked(_userSeed)) == _userHash, "inv userSeed"); require(-gameStake <= _balance && _balance <= maxBalance, "inv balance"); // game.stake save to cast as uint128 require(conflictRes.isValidBet(_gameType, _num, _value), "inv bet"); require(gameStake.add(_balance).sub(_value.castToInt()) >= 0, "value too high"); // game.stake save to cast as uint128 if (game.status == GameStatus.SERVER_INITIATED_END && game.roundId == _roundId) { game.userSeed = _userSeed; endGameConflict(game, gameId, _userAddress); } else if (game.status == GameStatus.ACTIVE || (game.status == GameStatus.SERVER_INITIATED_END && game.roundId < _roundId)) { game.status = GameStatus.USER_INITIATED_END; game.endInitiatedTime = block.timestamp; game.roundId = _roundId; game.gameType = _gameType; game.betNum = _num; game.betValue = _value; game.balance = _balance; game.userSeed = _userSeed; game.serverSeed = bytes32(0); emit LogUserRequestedEnd(msg.sender, gameId); } else { revert("inv state"); } } /** * @dev Conflict handling implementation. Stores game data and timestamp if game * is active. If user has already marked conflict for game session the conflict * resolution contract is used (compare conflictRes). * @param _roundId Round id of bet. * @param _gameType Game type of bet. * @param _num Number of bet. * @param _value Value of bet. * @param _balance Balance before this bet. * @param _serverHash Hash of server's seed for this bet. * @param _userHash Hash of user's seed for this bet. * @param _serverSeed Server's seed for this bet. * @param _userSeed User's seed for this bet. * @param _userAddress User's address. */ function serverEndGameConflictImpl( uint32 _roundId, uint8 _gameType, uint _num, uint _value, int _balance, bytes32 _serverHash, bytes32 _userHash, bytes32 _serverSeed, bytes32 _userSeed, uint _gameId, address _userAddress ) private { uint gameId = userGameId[_userAddress]; Game storage game = gameIdGame[gameId]; int maxBalance = conflictRes.maxBalance(); int gameStake = game.stake; require(gameId == _gameId, "inv gameId"); require(_roundId > 0, "inv roundId"); require(keccak256(abi.encodePacked(_serverSeed)) == _serverHash, "inv serverSeed"); require(keccak256(abi.encodePacked(_userSeed)) == _userHash, "inv userSeed"); require(-gameStake <= _balance && _balance <= maxBalance, "inv balance"); // game.stake save to cast as uint128 require(conflictRes.isValidBet(_gameType, _num, _value), "inv bet"); require(gameStake.add(_balance).sub(_value.castToInt()) >= 0, "too high value"); // game.stake save to cast as uin128 if (game.status == GameStatus.USER_INITIATED_END && game.roundId == _roundId) { game.serverSeed = _serverSeed; endGameConflict(game, gameId, _userAddress); } else if (game.status == GameStatus.ACTIVE || (game.status == GameStatus.USER_INITIATED_END && game.roundId < _roundId)) { game.status = GameStatus.SERVER_INITIATED_END; game.endInitiatedTime = block.timestamp; game.roundId = _roundId; game.gameType = _gameType; game.betNum = _num; game.betValue = _value; game.balance = _balance; game.serverSeed = _serverSeed; game.userSeed = _userSeed; emit LogServerRequestedEnd(_userAddress, gameId); } else { revert("inv state"); } } /** * @dev End conflicting game without placed bets. * @param _game Game session data. * @param _gameId Game session id. * @param _userAddress User's address. */ function cancelActiveGame(Game storage _game, uint _gameId, address _userAddress) private { // user need to pay a fee when conflict ended. // this ensures a malicious, rich user can not just generate game sessions and then wait // for us to end the game session and then confirm the session status, so // we would have to pay a high gas fee without profit. int newBalance = -conflictRes.conflictEndFine(); // do not allow balance below user stake int stake = _game.stake; if (newBalance < -stake) { newBalance = -stake; } closeGame(_game, _gameId, 0, _userAddress, ReasonEnded.CONFLICT_ENDED, newBalance); } /** * @dev End conflicting game. * @param _game Game session data. * @param _gameId Game session id. * @param _userAddress User's address. */ function endGameConflict(Game storage _game, uint _gameId, address _userAddress) private { int newBalance = conflictRes.endGameConflict( _game.gameType, _game.betNum, _game.betValue, _game.balance, _game.stake, _game.serverSeed, _game.userSeed ); closeGame(_game, _gameId, _game.roundId, _userAddress, ReasonEnded.CONFLICT_ENDED, newBalance); } } /** * @title ERC20 interface * @dev see https://github.com/ethereum/EIPs/issues/20 */ /** * @title Game Channel * @author dicether */ contract GameChannel is GameChannelConflict { address public ERC20TokenAddress = 0x9BB6fd000109E24Eb38B0Deb806382fF9247E478; /** * @dev contract constructor * @param _serverAddress Server address. * @param _minStake Min value user needs to deposit to create game session. * @param _maxStake Max value user can deposit to create game session. * @param _conflictResAddress Conflict resolution contract address. * @param _houseAddress House address to move profit to. * @param _chainId Chain id for signature domain. */ constructor( address _serverAddress, uint128 _minStake, uint128 _maxStake, address _conflictResAddress, address _houseAddress, uint _chainId ) public GameChannelConflict(_serverAddress, _minStake, _maxStake, _conflictResAddress, _houseAddress, _chainId) { // nothing to do } /** * @notice Create games session request. msg.value needs to be valid stake value. * @param _hashes Last entry of users' hash chain. [_userEndHash, _serverEndHash] * @param _previousGameId User's previous game id, initial 0. * @param _createBefore Game can be only created before this timestamp. * @param _serverSig Server signature. See verifyCreateSig * @param _amount Bet amount in ERC-20 */ function createGame( bytes32[] memory _hashes, uint _previousGameId, uint _createBefore, bytes memory _serverSig, uint _amount ) public onlyValidValue(_amount) onlyValidHouseStake(activeGames + 1) onlyNotPaused { bytes32 _userEndHash = _hashes[0]; bytes32 _serverEndHash = _hashes[1]; uint previousGameId = userGameId[msg.sender]; Game storage game = gameIdGame[previousGameId]; require(game.status == GameStatus.ENDED, "prev game not ended"); require(previousGameId == _previousGameId, "inv gamePrevGameId"); require(block.timestamp < _createBefore, "expired"); verifyCreateSig(msg.sender, _previousGameId, _createBefore, _serverEndHash, _serverSig); ERC20(ERC20TokenAddress).transferFrom(msg.sender, address(this), _amount); uint gameId = gameIdCntr++; userGameId[msg.sender] = gameId; Game storage newGame = gameIdGame[gameId]; newGame.stake = uint128(_amount); // It's safe to cast _amount as it is limited, see onlyValidValue newGame.status = GameStatus.ACTIVE; activeGames = activeGames.add(1); // It's safe to cast _amount as it is limited, see onlyValidValue emit LogGameCreated(msg.sender, gameId, uint128(_amount), _serverEndHash, _userEndHash); } /** * @dev Regular end game session. Used if user and house have both * accepted current game session state. * The game session with gameId _gameId is closed * and the user paid out. This functions is called by the server after * the user requested the termination of the current game session. * @param _roundId Round id of bet. * @param _balance Current balance. * @param _serverHash Hash of server's seed for this bet. * @param _userHash Hash of user's seed for this bet. * @param _gameId Game session id. * @param _contractAddress Address of this contract. * @param _userAddress Address of user. * @param _userSig User's signature of this bet. */ function serverEndGame( uint32 _roundId, int _balance, bytes32 _serverHash, bytes32 _userHash, uint _gameId, address _contractAddress, address _userAddress, bytes memory _userSig ) public onlyServer { verifySig( _roundId, 0, 0, 0, _balance, _serverHash, _userHash, _gameId, _contractAddress, _userSig, _userAddress ); regularEndGame(_userAddress, _roundId, _balance, _gameId, _contractAddress); } /** * @notice Regular end game session. Normally not needed as server ends game (@see serverEndGame). * Can be used by user if server does not end game session. * @param _roundId Round id of bet. * @param _balance Current balance. * @param _serverHash Hash of server's seed for this bet. * @param _userHash Hash of user's seed for this bet. * @param _gameId Game session id. * @param _contractAddress Address of this contract. * @param _serverSig Server's signature of this bet. */ function userEndGame( uint32 _roundId, int _balance, bytes32 _serverHash, bytes32 _userHash, uint _gameId, address _contractAddress, bytes memory _serverSig ) public { verifySig( _roundId, 0, 0, 0, _balance, _serverHash, _userHash, _gameId, _contractAddress, _serverSig, serverAddress ); regularEndGame(msg.sender, _roundId, _balance, _gameId, _contractAddress); } /** * @dev Verify server signature. * @param _userAddress User's address. * @param _previousGameId User's previous game id, initial 0. * @param _createBefore Game can be only created before this timestamp. * @param _serverEndHash Last entry of server's hash chain. * @param _serverSig Server signature. */ function verifyCreateSig( address _userAddress, uint _previousGameId, uint _createBefore, bytes32 _serverEndHash, bytes memory _serverSig ) private view { address contractAddress = address(this); bytes32 hash = keccak256(abi.encodePacked( contractAddress, _userAddress, _previousGameId, _createBefore, _serverEndHash )); verify(hash, _serverSig, serverAddress); } /** * @dev Regular end game session implementation. Used if user and house have both * accepted current game session state. The game session with gameId _gameId is closed * and the user paid out. * @param _userAddress Address of user. * @param _balance Current balance. * @param _gameId Game session id. * @param _contractAddress Address of this contract. */ function regularEndGame( address _userAddress, uint32 _roundId, int _balance, uint _gameId, address _contractAddress ) private { uint gameId = userGameId[_userAddress]; Game storage game = gameIdGame[gameId]; int maxBalance = conflictRes.maxBalance(); int gameStake = game.stake; require(_gameId == gameId, "inv gameId"); require(_roundId > 0, "inv roundId"); // save to cast as game.stake hash fixed range require(-gameStake <= _balance && _balance <= maxBalance, "inv balance"); require(game.status == GameStatus.ACTIVE, "inv status"); assert(_contractAddress == address(this)); closeGame(game, gameId, _roundId, _userAddress, ReasonEnded.REGULAR_ENDED, _balance); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_serverAddress","type":"address"},{"internalType":"uint128","name":"_minStake","type":"uint128"},{"internalType":"uint128","name":"_maxStake","type":"uint128"},{"internalType":"address","name":"_conflictResAddress","type":"address"},{"internalType":"address","name":"_houseAddress","type":"address"},{"internalType":"uint256","name":"_chainId","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[],"name":"LogActive","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"gameId","type":"uint256"},{"indexed":false,"internalType":"uint128","name":"stake","type":"uint128"},{"indexed":true,"internalType":"bytes32","name":"serverEndHash","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"userEndHash","type":"bytes32"}],"name":"LogGameCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"gameId","type":"uint256"},{"indexed":false,"internalType":"uint32","name":"roundId","type":"uint32"},{"indexed":false,"internalType":"int256","name":"balance","type":"int256"},{"indexed":false,"internalType":"enum GameChannelBase.ReasonEnded","name":"reason","type":"uint8"}],"name":"LogGameEnded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"LogOwnerShipTransferInitiated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"LogOwnerShipTransferred","type":"event"},{"anonymous":false,"inputs":[],"name":"LogPause","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"gameId","type":"uint256"}],"name":"LogServerRequestedEnd","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"minStake","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxStake","type":"uint256"}],"name":"LogStakeLimitsModified","type":"event"},{"anonymous":false,"inputs":[],"name":"LogUnpause","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newConflictResolutionAddress","type":"address"}],"name":"LogUpdatedConflictResolution","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newConflictResolutionAddress","type":"address"}],"name":"LogUpdatingConflictResolution","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"gameId","type":"uint256"}],"name":"LogUserRequestedEnd","type":"event"},{"constant":true,"inputs":[],"name":"BET_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"DOMAIN_SEPERATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"EIP712DOMAIN_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ERC20TokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_TIMEOUT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_TRANSFER_TIMSPAN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MIN_TIMEOUT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MIN_TRANSFER_TIMESPAN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"TIMEOUT_DESTROY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"activate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"activateConflictResolution","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"activated","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"activeGames","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"addHouseStake","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"claimOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"conflictRes","outputs":[{"internalType":"contract ConflictResolutionInterface","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32[]","name":"_hashes","type":"bytes32[]"},{"internalType":"uint256","name":"_previousGameId","type":"uint256"},{"internalType":"uint256","name":"_createBefore","type":"uint256"},{"internalType":"bytes","name":"_serverSig","type":"bytes"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"createGame","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"destroy","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"gameIdCntr","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"gameIdGame","outputs":[{"internalType":"enum GameChannelBase.GameStatus","name":"status","type":"uint8"},{"internalType":"uint128","name":"stake","type":"uint128"},{"internalType":"uint8","name":"gameType","type":"uint8"},{"internalType":"uint32","name":"roundId","type":"uint32"},{"internalType":"uint256","name":"betNum","type":"uint256"},{"internalType":"uint256","name":"betValue","type":"uint256"},{"internalType":"int256","name":"balance","type":"int256"},{"internalType":"bytes32","name":"userSeed","type":"bytes32"},{"internalType":"bytes32","name":"serverSeed","type":"bytes32"},{"internalType":"uint256","name":"endInitiatedTime","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"houseAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"houseProfit","outputs":[{"internalType":"int256","name":"","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"houseStake","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"lastProfitTransferTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"maxStake","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"minStake","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"newConflictRes","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"pendingReturns","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"profitTransferTimeSpan","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"serverAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_userAddress","type":"address"},{"internalType":"uint256","name":"_gameId","type":"uint256"}],"name":"serverCancelActiveGame","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint32","name":"_roundId","type":"uint32"},{"internalType":"int256","name":"_balance","type":"int256"},{"internalType":"bytes32","name":"_serverHash","type":"bytes32"},{"internalType":"bytes32","name":"_userHash","type":"bytes32"},{"internalType":"uint256","name":"_gameId","type":"uint256"},{"internalType":"address","name":"_contractAddress","type":"address"},{"internalType":"address","name":"_userAddress","type":"address"},{"internalType":"bytes","name":"_userSig","type":"bytes"}],"name":"serverEndGame","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint32","name":"_roundId","type":"uint32"},{"internalType":"uint8","name":"_gameType","type":"uint8"},{"internalType":"uint256","name":"_num","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"int256","name":"_balance","type":"int256"},{"internalType":"bytes32","name":"_serverHash","type":"bytes32"},{"internalType":"bytes32","name":"_userHash","type":"bytes32"},{"internalType":"uint256","name":"_gameId","type":"uint256"},{"internalType":"address","name":"_contractAddress","type":"address"},{"internalType":"bytes","name":"_userSig","type":"bytes"},{"internalType":"address","name":"_userAddress","type":"address"},{"internalType":"bytes32","name":"_serverSeed","type":"bytes32"},{"internalType":"bytes32","name":"_userSeed","type":"bytes32"}],"name":"serverEndGameConflict","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_userAddress","type":"address"},{"internalType":"uint256","name":"_gameId","type":"uint256"}],"name":"serverForceGameEnd","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_gameIdCntr","type":"uint256"}],"name":"setGameIdCntr","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_houseAddress","type":"address"}],"name":"setHouseAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_profitTransferTimeSpan","type":"uint256"}],"name":"setProfitTransferTimeSpan","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint128","name":"_minStake","type":"uint128"},{"internalType":"uint128","name":"_maxStake","type":"uint128"}],"name":"setStakeRequirements","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"timePaused","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"transferProfitToHouse","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_newConflictResAddress","type":"address"}],"name":"updateConflictResolution","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"updateTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_gameId","type":"uint256"}],"name":"userCancelActiveGame","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint32","name":"_roundId","type":"uint32"},{"internalType":"int256","name":"_balance","type":"int256"},{"internalType":"bytes32","name":"_serverHash","type":"bytes32"},{"internalType":"bytes32","name":"_userHash","type":"bytes32"},{"internalType":"uint256","name":"_gameId","type":"uint256"},{"internalType":"address","name":"_contractAddress","type":"address"},{"internalType":"bytes","name":"_serverSig","type":"bytes"}],"name":"userEndGame","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint32","name":"_roundId","type":"uint32"},{"internalType":"uint8","name":"_gameType","type":"uint8"},{"internalType":"uint256","name":"_num","type":"uint256"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"int256","name":"_balance","type":"int256"},{"internalType":"bytes32","name":"_serverHash","type":"bytes32"},{"internalType":"bytes32","name":"_userHash","type":"bytes32"},{"internalType":"uint256","name":"_gameId","type":"uint256"},{"internalType":"address","name":"_contractAddress","type":"address"},{"internalType":"bytes","name":"_serverSig","type":"bytes"},{"internalType":"bytes32","name":"_userSeed","type":"bytes32"}],"name":"userEndGameConflict","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_gameId","type":"uint256"}],"name":"userForceGameEnd","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userGameId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"withdrawAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"withdrawHouseStake","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526001805461ffff60a01b1916600160a81b17815542600255600480546001600160a01b031990811690915560006005819055600680548316739bb6fd000109e24eb38b0deb806382ff9247e4789081179091556008829055600993909355600c819055600d5562127500600f556014805490911690911790553480156200008a57600080fd5b506040516200396b3803806200396b833981810160405260c0811015620000b057600080fd5b508051602082015160408301516060840151608085015160a09095015160008054336001600160a01b0319918216179091556001805482169055600380549091166001600160a01b03841617905593949293919290918585858585858585858585856001600160801b038516158015906200013d5750836001600160801b0316856001600160801b031611155b6200014757600080fd5b600a80546001600160a01b038089166001600160a01b031992831617909255600b80549285169290911691909117905542601055600e80546001600160801b03868116600160801b028189166001600160801b0319909316929092171617905560405180605262003919823960408051918290036052018220672234b1b2ba3432b960c11b83528151928390036008018320601960f91b8452825193849003600101842060208086019390935284840191909152606084015260808301949094523060a0808401919091528151808403909101815260c0909201905280519201919091206007555050505050505050505050505050505050506136c980620002506000396000f3fe608060405234801561001057600080fd5b50600436106103785760003560e01c806388fedd04116101d3578063d1e9dcbf11610104578063e475222e116100a2578063ef3aaf541161007c578063ef3aaf5414610c10578063f2fde38b14610c36578063f87ffb7414610c5c578063fd306ca714610c6457610378565b8063e475222e14610b29578063e60a33aa14610b31578063ea1b28e014610c0857610378565b8063db420fe3116100de578063db420fe314610b09578063dc55509014610b11578063de38eb3a14610b19578063e30c397814610b2157610378565b8063d1e9dcbf14610aa7578063d6e5fe9814610ad3578063d7cee31e14610b0157610378565b8063a09f865911610171578063bd5c4e241161014b578063bd5c4e2414610a69578063c49f91d314610a71578063c861f3a014610a79578063cbffb1ae14610a8157610378565b8063a09f865914610a18578063a8182cd314610a20578063b064ca1814610a4c57610378565b8063947bc72d116101ad578063947bc72d146109ce5780639b29f133146109d65780639c0051db146109f35780639f34ce1414610a1057610378565b806388fedd04146108b95780638da5cb5b146108c15780639399dd7e146108c957610378565b80634d20d4bc116102ad5780637ead05f11161024b57806383e256dc1161022557806383e256dc146107205780638456cb59146107b6578063853828b6146107be578063878de0ae146107c657610378565b80637ead05f1146106de57806381efc01d146106fb57806383197ef01461071857610378565b8063563c23a011610287578063563c23a0146105925780635a48766c1461059a5780635ba2dd22146106ce5780635c975abb146106d657610378565b80634d20d4bc1461057a5780634e71e0c814610582578063543ad1df1461058a57610378565b8063287e9fbc1161031a5780633ccfd60b116102f45780633ccfd60b1461047e5780633f4ba83a14610486578063410453ae1461048e57806341b801841461057257610378565b8063287e9fbc146104355780632c94a23514610452578063375b3c0a1461045a57610378565b806319fc36ed1161035657806319fc36ed146103bd5780631aef99b7146103c55780631b08345a146103e957806326b387bb1461040f57610378565b80630df632101461037d5780630f15f4c014610397578063186601ca146103a1575b600080fd5b610385610c6c565b60408051918252519081900360200190f35b61039f610c72565b005b6103a9610cde565b604080519115158252519081900360200190f35b610385610cee565b6103cd610cf5565b604080516001600160a01b039092168252519081900360200190f35b610385600480360360208110156103ff57600080fd5b50356001600160a01b0316610d04565b6103856004803603602081101561042557600080fd5b50356001600160a01b0316610d16565b61039f6004803603602081101561044b57600080fd5b5035610d28565b610385610d6a565b610462610d70565b604080516001600160801b039092168252519081900360200190f35b61039f610d7f565b61039f610dd8565b61039f60048036036101008110156104a557600080fd5b63ffffffff823516916020810135916040820135916060810135916080820135916001600160a01b0360a082013581169260c08301359091169190810190610100810160e0820135600160201b8111156104fe57600080fd5b82018360208201111561051057600080fd5b803590602001918460018302840111600160201b8311171561053157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610e58945050505050565b610385610e9b565b610385610ea1565b61039f610ebc565b610385610f2d565b610385610f34565b61039f600480360360a08110156105b057600080fd5b810190602081018135600160201b8111156105ca57600080fd5b8201836020820111156105dc57600080fd5b803590602001918460208302840111600160201b831117156105fd57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295843595602086013595919450925060608101915060400135600160201b81111561065857600080fd5b82018360208201111561066a57600080fd5b803590602001918460018302840111600160201b8311171561068b57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505091359250610f3a915050565b6103cd611344565b6103a9611353565b61039f600480360360208110156106f457600080fd5b5035611363565b61039f6004803603602081101561071157600080fd5b5035611419565b61039f61159d565b61073d6004803603602081101561073657600080fd5b50356115fc565b604051808b600381111561074d57fe5b60ff90811682526001600160801b03909b166020820152989099166040808a019190915263ffffffff9097166060890152608088019590955260a087019390935260c086019190915260e085015261010084015261012083015251908190036101400192509050f35b61039f611663565b61039f611704565b61039f60048036036101608110156107dd57600080fd5b63ffffffff8235169160ff6020820135169160408201359160608101359160808201359160a08101359160c08201359160e0810135916001600160a01b036101008301351691908101906101408101610120820135600160201b81111561084357600080fd5b82018360208201111561085557600080fd5b803590602001918460018302840111600160201b8311171561087657600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955050913592506117bb915050565b610385611801565b6103cd611807565b61039f60048036036101a08110156108e057600080fd5b63ffffffff8235169160ff6020820135169160408201359160608101359160808201359160a08101359160c08201359160e0810135916001600160a01b036101008301351691908101906101408101610120820135600160201b81111561094657600080fd5b82018360208201111561095857600080fd5b803590602001918460018302840111600160201b8311171561097957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550506001600160a01b038335169350505060208101359060400135611816565b610385611862565b61039f600480360360208110156109ec57600080fd5b5035611869565b61039f60048036036020811015610a0957600080fd5b5035611964565b61039f6119a1565b6103cd611a60565b61039f60048036036040811015610a3657600080fd5b506001600160a01b038135169060200135611a6f565b61039f60048036036020811015610a6257600080fd5b5035611b84565b610385611d2a565b610385611d31565b610385611d4c565b61039f60048036036020811015610a9757600080fd5b50356001600160a01b0316611d52565b61039f60048036036040811015610abd57600080fd5b506001600160a01b038135169060200135611dc1565b61039f60048036036040811015610ae957600080fd5b506001600160801b0381358116916020013516611f98565b6103cd612063565b6103cd612072565b610385612081565b610385612087565b6103cd61208e565b61038561209d565b61039f600480360360e0811015610b4757600080fd5b63ffffffff823516916020810135916040820135916060810135916080820135916001600160a01b0360a0820135169181019060e0810160c0820135600160201b811115610b9457600080fd5b820183602082011115610ba657600080fd5b803590602001918460018302840111600160201b83111715610bc757600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506120a3945050505050565b6104626120e3565b61039f60048036036020811015610c2657600080fd5b50356001600160a01b03166120f9565b61039f60048036036020811015610c4c57600080fd5b50356001600160a01b0316612132565b61038561219a565b61039f6121a0565b60075481565b6000546001600160a01b03163314610c8957600080fd5b600154600160a01b900460ff1615610ca057600080fd5b6001805460ff60a01b1916600160a01b1790556040517fc9d6bebde85c4e3348468c6af2cb34f978d1a8c6eebc438f1361c1ad5edf5f0e90600090a1565b600154600160a01b900460ff1681565b6201518081565b6014546001600160a01b031681565b60126020526000908152604090205481565b60136020526000908152604090205481565b6000546001600160a01b03163314610d3f57600080fd5b600154600160a01b900460ff1615610d5657600080fd5b600060095411610d6557600080fd5b600955565b600f5481565b600e546001600160801b031681565b3360009081526013602052604090205480610d9957600080fd5b336000818152601360205260408082208290555183156108fc0291849190818181858888f19350505050158015610dd4573d6000803e3d6000fd5b5050565b6000546001600160a01b03163314610def57600080fd5b600154600160a81b900460ff16610e0557600080fd5b600154600160a01b900460ff16610e1b57600080fd5b6001805460ff60a81b19169055600060028190556040517f730c1faaa977b67dacf1e2451ef54556e04a07d577785ff79f6d31f73502efc99190a1565b600a546001600160a01b03163314610e6f57600080fd5b610e848860008060008b8b8b8b8b8a8c61226f565b610e9182898987876122e2565b5050505050505050565b60105481565b60405180608161361482396081019050604051809103902081565b6001546001600160a01b03163314610ed357600080fd5b60018054600080546001600160a01b038084166001600160a01b031992831617808455919093169093556040519092909116907f897d3c8bbea11029ba3b26eb993fe8edb14c2c4c0d2ecceccce41d1d83d3e359908390a3565b6203f48081565b60025481565b600e5481906001600160801b03168110801590610f695750600e54600160801b90046001600160801b03168111155b610fa6576040805162461bcd60e51b8152602060048201526009602482015268696e76207374616b6560b81b604482015290519081900360640190fd5b600854600354604080516373c4726b60e01b8152600190930160048401819052905190926000926001600160a01b0316916373c4726b91602480820192602092909190829003018186803b158015610ffd57600080fd5b505afa158015611011573d6000803e3d6000fd5b505050506040513d602081101561102757600080fd5b5051600c54909150811115611074576040805162461bcd60e51b815260206004820152600e60248201526d696e7620686f7573655374616b6560901b604482015290519081900360640190fd5b600154600160a81b900460ff16156110bc576040805162461bcd60e51b81526020600482015260066024820152651c185d5cd95960d21b604482015290519081900360640190fd5b6000886000815181106110cb57fe5b602002602001015190506000896001815181106110e457fe5b6020908102919091018101513360009081526012835260408082205480835260119094528120919350815460ff16600381111561111d57fe5b14611165576040805162461bcd60e51b81526020600482015260136024820152721c1c995d8819d85b59481b9bdd08195b991959606a1b604482015290519081900360640190fd5b8a82146111ae576040805162461bcd60e51b81526020600482015260126024820152711a5b9d8819d85b59541c995d91d85b59525960721b604482015290519081900360640190fd5b8942106111ec576040805162461bcd60e51b8152602060048201526007602482015266195e1c1a5c995960ca1b604482015290519081900360640190fd5b6111f9338c8c868d6124db565b601454604080516323b872dd60e01b8152336004820152306024820152604481018b905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b15801561125357600080fd5b505af1158015611267573d6000803e3d6000fd5b505050506040513d602081101561127d57600080fd5b505060098054600180820190925533600090815260126020908152604080832084905583835260119091529020805470ffffffffffffffffffffffffffffffff0019166101006001600160801b038d16021760ff191683178155600854919290916112e79161254e565b600855604080516001600160801b038c1681526020810188905281518792859233927fd25faca801440882fa5d7c7f70b072a2ad89621e277ee0b6f9923ccac48411b1929181900390910190a45050505050505050505050505050565b6003546001600160a01b031681565b600154600160a81b900460ff1681565b6000546001600160a01b0316331461137a57600080fd5b600654604080516323b872dd60e01b81523360048201523060248201526044810184905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b1580156113d457600080fd5b505af11580156113e8573d6000803e3d6000fd5b505050506040513d60208110156113fe57600080fd5b5050600c54611413908263ffffffff61254e16565b600c5550565b6000546001600160a01b0316331461143057600080fd5b600354600854604080516373c4726b60e01b81526004810192909252516000926001600160a01b0316916373c4726b916024808301926020929190829003018186803b15801561147f57600080fd5b505afa158015611493573d6000803e3d6000fd5b505050506040513d60208110156114a957600080fd5b5051600c5490915082118015906114d35750600c5481906114d0908463ffffffff61256116565b10155b6114dc57600080fd5b6000600d5413158061150a5750600c546114fc908363ffffffff61256116565b611507600d54612573565b11155b61151357600080fd5b600c54611526908363ffffffff61256116565b600c55600654600b546040805163a9059cbb60e01b81526001600160a01b039283166004820152602481018690529051919092169163a9059cbb91604480830192600092919082900301818387803b15801561158157600080fd5b505af1158015611595573d6000803e3d6000fd5b505050505050565b6000546001600160a01b031633146115b457600080fd5b600154621a5e0090600160a81b900460ff1680156115e5575060025442906115e2908363ffffffff61254e16565b11155b6115ee57600080fd5b6000546001600160a01b0316ff5b601160205260009081526040902080546001820154600283015460038401546004850154600586015460069096015460ff8087169761010088046001600160801b031697600160881b810490921696600160901b90920463ffffffff16959194919391928a565b6000546001600160a01b0316331461167a57600080fd5b600154600160a81b900460ff16156116c2576040805162461bcd60e51b81526020600482015260066024820152651c185d5cd95960d21b604482015290519081900360640190fd5b6001805460ff60a81b1916600160a81b179055426002556040517f4b314b34e912fda7f95e7d23e9c8c95f82f0aff1984e4ce592a0b005f905562490600090a1565b6000546001600160a01b0316331461171b57600080fd5b6001546203f48090600160a81b900460ff16801561174c57506002544290611749908363ffffffff61254e16565b11155b61175557600080fd5b6000600d819055600c805490829055600654600b546040805163a9059cbb60e01b81526001600160a01b0392831660048201526024810185905290519394919092169263a9059cbb92604480820193929182900301818387803b15801561158157600080fd5b6117e38b8b8b8b8b8b8b8b8b8b600a60009054906101000a90046001600160a01b031661226f565b6117f48b8b8b8b8b8a878b33612583565b5050505050505050505050565b600d5481565b6000546001600160a01b031681565b600a546001600160a01b0316331461182d57600080fd5b6118408d8d8d8d8d8d8d8d8d8d8d61226f565b6118538d8d8d8d8d8d8d89898f8d612a2b565b50505050505050505050505050565b62ed4e0081565b3360008181526012602090815260408083205480845260119092529091208382146118c8576040805162461bcd60e51b815260206004820152600a6024820152691a5b9d8819d85b59525960b21b604482015290519081900360640190fd5b6001815460ff1660038111156118da57fe5b141561192357426006820155805460ff19166002178155604051829033907f9b60ba122ac2e613ae737820a8eb2d8c28356ff6b03d569dacb7ce2bcdc86fed90600090a361195e565b6003815460ff16600381111561193557fe5b14801561194e57508054600160901b900463ffffffff16155b156103785761195e818385612f2d565b50505050565b6000546001600160a01b0316331461197b57600080fd5b80620151808110158015611992575062ed4e008111155b61199b57600080fd5b50600f55565b6000546001600160a01b031633146119b857600080fd5b6004546001600160a01b03166119cd57600080fd5b6005546119d957600080fd5b426203f48060055401111580156119f757506207e900600554014211155b611a0057600080fd5b60048054600380546001600160a01b03199081166001600160a01b038416179091551690556000600581905560408051918252517f28de3c2df3d09a8b061f86cd0c78b7d02f1f5caffcd086ff45ee12a4a51056c89181900360200190a1565b6004546001600160a01b031681565b600a546001600160a01b03163314611a8657600080fd5b6001600160a01b0382166000908152601260209081526040808320548084526011909252909120828214611aee576040805162461bcd60e51b815260206004820152600a6024820152691a5b9d8819d85b59525960b21b604482015290519081900360640190fd5b6001815460ff166003811115611b0057fe5b1415611b4957426006820155805460ff19166003178155604051829033907fdbbc392d5391708a9def7f560f8cbdef92e1bb37e5104831e78feda1488b7ab090600090a361195e565b6002815460ff166003811115611b5b57fe5b148015611b7457508054600160901b900463ffffffff16155b156103785761195e818386612f2d565b336000818152601260209081526040808320548084526011909252909120838214611be3576040805162461bcd60e51b815260206004820152600a6024820152691a5b9d8819d85b59525960b21b604482015290519081900360640190fd5b6002815460ff166003811115611bf557fe5b14611c34576040805162461bcd60e51b815260206004820152600a602482015269696e762073746174757360b01b604482015290519081900360640190fd5b600380548254600184015460028501549385015460068601546040805163062f5d8d60e11b8152600160881b860460ff1660048201526024810194909452604484019690965260648301919091526101009092046001600160801b0316608482015260a481019190915291516000926001600160a01b0390921691630c5ebb1a9160c4808301926020929190829003018186803b158015611cd457600080fd5b505afa158015611ce8573d6000803e3d6000fd5b505050506040513d6020811015611cfe57600080fd5b50518254909150611d239083908590600160901b900463ffffffff1687600286612fd3565b5050505050565b621a5e0081565b6040518060526135c282396052019050604051809103902081565b600c5481565b6000546001600160a01b03163314611d6957600080fd5b600480546001600160a01b0383166001600160a01b031990911681179091554260055560408051918252517f97044e884f04922f1959ef2de012f4734423df2d4da57fd4c5eaf40cd63b525f9181900360200190a150565b600a546001600160a01b03163314611dd857600080fd5b6001600160a01b0382166000908152601260209081526040808320548084526011909252909120828214611e40576040805162461bcd60e51b815260206004820152600a6024820152691a5b9d8819d85b59525960b21b604482015290519081900360640190fd5b6003815460ff166003811115611e5257fe5b14611e91576040805162461bcd60e51b815260206004820152600a602482015269696e762073746174757360b01b604482015290519081900360640190fd5b6003805482546001840154600285015493850154600586015460048088015460068901546040805163454a41cd60e11b8152600160881b890460ff16948101949094526024840196909652604483019890985260648201939093526101009094046001600160801b0316608485015260a484015260c483015260e482019390935291516000926001600160a01b0390921691638a94839a91610104808301926020929190829003018186803b158015611f4957600080fd5b505afa158015611f5d573d6000803e3d6000fd5b505050506040513d6020811015611f7357600080fd5b50518254909150611d239083908590600160901b900463ffffffff1688600186612fd3565b6000546001600160a01b03163314611faf57600080fd5b6000826001600160801b0316118015611fda5750806001600160801b0316826001600160801b031611155b611fe357600080fd5b600e80546fffffffffffffffffffffffffffffffff19166001600160801b03848116919091178116600160801b8483168102919091179283905560408051848416815291909304909116602082015281517f1ec948cac143dba0e555a87dd86ae387e2ecd4a8fee80f7dd324d5987cb3e7f8929181900390910190a15050565b600b546001600160a01b031681565b600a546001600160a01b031681565b60055481565b6207e90081565b6001546001600160a01b031681565b60085481565b6120cd8760008060008a8a8a8a8a8a600a60009054906101000a90046001600160a01b031661226f565b6120da33888886866122e2565b50505050505050565b600e54600160801b90046001600160801b031681565b6000546001600160a01b0316331461211057600080fd5b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461214957600080fd5b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917f83ada3430836f9d4bd6f7bc690ffbba5199cb19b37393dd64c229930213535969190a350565b60095481565b426121b8600f5460105461254e90919063ffffffff16565b11156121c357600080fd5b42601055600d546000126121d65761226d565b60006121e3600d54612573565b6000600d55600c549091506121fe908263ffffffff61256116565b600c55600654600b546040805163a9059cbb60e01b81526001600160a01b039283166004820152602481018590529051919092169163a9059cbb91604480830192600092919082900301818387803b15801561225957600080fd5b505af1158015611d23573d6000803e3d6000fd5b565b306001600160a01b03841681146122c3576040805162461bcd60e51b8152602060048201526013602482015272696e7620636f6e74726163744164647265737360681b604482015290519081900360640190fd5b60006122d58d8d8d8d8d8d8d8d61307c565b905061185381858561313a565b6001600160a01b038086166000908152601260209081526040808320548084526011835281842060035483516339d6a34560e11b8152935192969195949116926373ad468a9260048083019392829003018186803b15801561234357600080fd5b505afa158015612357573d6000803e3d6000fd5b505050506040513d602081101561236d57600080fd5b5051825490915061010090046001600160801b03168386146123c3576040805162461bcd60e51b815260206004820152600a6024820152691a5b9d8819d85b59525960b21b604482015290519081900360640190fd5b60008863ffffffff161161240c576040805162461bcd60e51b815260206004820152600b60248201526a1a5b9d881c9bdd5b99125960aa1b604482015290519081900360640190fd5b86816000031315801561241f5750818713155b61245e576040805162461bcd60e51b815260206004820152600b60248201526a696e762062616c616e636560a81b604482015290519081900360640190fd5b6001835460ff16600381111561247057fe5b146124af576040805162461bcd60e51b815260206004820152600a602482015269696e762073746174757360b01b604482015290519081900360640190fd5b6001600160a01b03851630146124c157fe5b6124d083858a8c60008c612fd3565b505050505050505050565b6040805130606081811b6020808501919091529089901b6bffffffffffffffffffffffff19166034840152604883018890526068830187905260888084018790528451808503909101815260a890930190935281519190920120600a546120da90829085906001600160a01b031661313a565b8181018281101561255b57fe5b92915050565b60008282111561256d57fe5b50900390565b60008082121561257f57fe5b5090565b6001600160a01b038082166000908152601260209081526040808320548084526011835281842060035483516339d6a34560e11b8152935192969195949116926373ad468a9260048083019392829003018186803b1580156125e457600080fd5b505afa1580156125f8573d6000803e3d6000fd5b505050506040513d602081101561260e57600080fd5b5051825490915061010090046001600160801b0316858414612664576040805162461bcd60e51b815260206004820152600a6024820152691a5b9d8819d85b59525960b21b604482015290519081900360640190fd5b60008d63ffffffff16116126ad576040805162461bcd60e51b815260206004820152600b60248201526a1a5b9d881c9bdd5b99125960aa1b604482015290519081900360640190fd5b6040805160208082018a90528251808303820181529183019092528051910120881461270f576040805162461bcd60e51b815260206004820152600c60248201526b1a5b9d881d5cd95c94d9595960a21b604482015290519081900360640190fd5b8881600003131580156127225750818913155b612761576040805162461bcd60e51b815260206004820152600b60248201526a696e762062616c616e636560a81b604482015290519081900360640190fd5b600354604080516309eecdd760e01b815260ff8f166004820152602481018e9052604481018d905290516001600160a01b03909216916309eecdd791606480820192602092909190829003018186803b1580156127bd57600080fd5b505afa1580156127d1573d6000803e3d6000fd5b505050506040513d60208110156127e757600080fd5b5051612824576040805162461bcd60e51b81526020600482015260076024820152661a5b9d8818995d60ca1b604482015290519081900360640190fd5b600061284e6128328c613209565b612842848d63ffffffff61321816565b9063ffffffff61324f16565b1215612892576040805162461bcd60e51b815260206004820152600e60248201526d0ecc2d8eaca40e8dede40d0d2ced60931b604482015290519081900360640190fd5b6003835460ff1660038111156128a457fe5b1480156128c15750825463ffffffff8e8116600160901b90920416145b156128dd57600483018790556128d883858761327e565b611853565b6001835460ff1660038111156128ef57fe5b148061292557506003835460ff16600381111561290857fe5b1480156129255750825463ffffffff808f16600160901b90920416105b156129f2578254600290849060ff191660018302179055504283600601819055508c8360000160126101000a81548163ffffffff021916908363ffffffff1602179055508b8360000160116101000a81548160ff021916908360ff1602179055508a83600101819055508983600201819055508883600301819055508683600401819055506000801b836005018190555083336001600160a01b03167f9b60ba122ac2e613ae737820a8eb2d8c28356ff6b03d569dacb7ce2bcdc86fed60405160405180910390a3611853565b6040805162461bcd60e51b8152602060048201526009602482015268696e7620737461746560b81b604482015290519081900360640190fd5b6001600160a01b038082166000908152601260209081526040808320548084526011835281842060035483516339d6a34560e11b8152935192969195949116926373ad468a9260048083019392829003018186803b158015612a8c57600080fd5b505afa158015612aa0573d6000803e3d6000fd5b505050506040513d6020811015612ab657600080fd5b5051825490915061010090046001600160801b0316858414612b0c576040805162461bcd60e51b815260206004820152600a6024820152691a5b9d8819d85b59525960b21b604482015290519081900360640190fd5b60008f63ffffffff1611612b55576040805162461bcd60e51b815260206004820152600b60248201526a1a5b9d881c9bdd5b99125960aa1b604482015290519081900360640190fd5b6040805160208082018b905282518083038201815291830190925280519101208a14612bb9576040805162461bcd60e51b815260206004820152600e60248201526d1a5b9d881cd95c9d995c94d9595960921b604482015290519081900360640190fd5b6040805160208082018a905282518083038201815291830190925280519101208914612c1b576040805162461bcd60e51b815260206004820152600c60248201526b1a5b9d881d5cd95c94d9595960a21b604482015290519081900360640190fd5b8a8160000313158015612c2e5750818b13155b612c6d576040805162461bcd60e51b815260206004820152600b60248201526a696e762062616c616e636560a81b604482015290519081900360640190fd5b600360009054906101000a90046001600160a01b03166001600160a01b03166309eecdd78f8f8f6040518463ffffffff1660e01b8152600401808460ff1660ff168152602001838152602001828152602001935050505060206040518083038186803b158015612cdc57600080fd5b505afa158015612cf0573d6000803e3d6000fd5b505050506040513d6020811015612d0657600080fd5b5051612d43576040805162461bcd60e51b81526020600482015260076024820152661a5b9d8818995d60ca1b604482015290519081900360640190fd5b6000612d61612d518e613209565b612842848f63ffffffff61321816565b1215612da5576040805162461bcd60e51b815260206004820152600e60248201526d746f6f20686967682076616c756560901b604482015290519081900360640190fd5b6002835460ff166003811115612db757fe5b148015612de357508e63ffffffff168360000160129054906101000a900463ffffffff1663ffffffff16145b15612dff5760058301889055612dfa83858761327e565b612f1c565b6001835460ff166003811115612e1157fe5b1480612e5657506002835460ff166003811115612e2a57fe5b148015612e5657508e63ffffffff168360000160129054906101000a900463ffffffff1663ffffffff16105b156129f2578254600390849060ff191660018302179055504283600601819055508e8360000160126101000a81548163ffffffff021916908363ffffffff1602179055508d8360000160116101000a81548160ff021916908360ff1602179055508c83600101819055508b83600201819055508a836003018190555087836005018190555086836004018190555083856001600160a01b03167fdbbc392d5391708a9def7f560f8cbdef92e1bb37e5104831e78feda1488b7ab060405160405180910390a35b505050505050505050505050505050565b60035460408051637e7630bd60e11b815290516000926001600160a01b03169163fcec617a916004808301926020929190829003018186803b158015612f7257600080fd5b505afa158015612f86573d6000803e3d6000fd5b505050506040513d6020811015612f9c57600080fd5b505184546000918203925061010090046001600160801b031690819003821215612fc7578060000391505b611d2385856000866003875b855460ff19168655600854612fe9906001612561565b600855855461300890849061010090046001600160801b03168361337d565b84836001600160a01b03167f59ba0efd7d5a5d7e109fb346b50365a8d68661fc7c2c311cd29750707e1b8de5868486604051808463ffffffff1663ffffffff16815260200183815260200182600381111561305f57fe5b60ff168152602001935050505060405180910390a3505050505050565b6000806040518080613614608191396040805191829003608101822060208084019190915263ffffffff9d909d168282015260ff9b909b166060820152608081019990995250505060a086019490945260c085019290925260e084015261010083015261012080830191909152825180830390910181526101408201835280519084012060075461190160f01b61016084015261016283015261018280830191909152825180830390910181526101a2909101909152805191012090565b6000806000613148856134d0565b925092509250600060018783868660405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156131ad573d6000803e3d6000fd5b505050602060405103519050846001600160a01b0316816001600160a01b0316146120da576040805162461bcd60e51b8152602060048201526007602482015266696e762073696760c81b604482015290519081900360640190fd5b6000600160ff1b821061257f57fe5b600082820181831280159061322d5750838112155b80613242575060008312801561324257508381125b61324857fe5b9392505050565b60008183038183128015906132645750838113155b806132425750600083128015613242575083811361324857fe5b600380548454600186015460028701549387015460058801546004808a015460408051631503b1e760e11b8152600160881b880460ff16938101939093526024830195909552604482019790975260648101929092526101009093046001600160801b0316608482015260a481019290925260c482019390935291516000926001600160a01b0390921691632a0763ce9160e4808301926020929190829003018186803b15801561332e57600080fd5b505afa158015613342573d6000803e3d6000fd5b505050506040513d602081101561335857600080fd5b5051845490915061195e9085908590600160901b900463ffffffff1685600386612fd3565b6000826001600160801b031690506000613398600c54613209565b9050600360009054906101000a90046001600160a01b03166001600160a01b03166373ad468a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156133e857600080fd5b505afa1580156133fc573d6000803e3d6000fd5b505050506040513d602081101561341257600080fd5b505183131561341d57fe5b600061342f838563ffffffff61321816565b121561343757fe5b60008313801561344657508281125b1561344f578092505b600d54613462908463ffffffff61324f16565b600d556000613477828563ffffffff61324f16565b905061348281612573565b600c55600061349f61349a858763ffffffff61321816565b612573565b6001600160a01b03881660009081526013602052604090208054820190819055909150156120da576120da8761353e565b60008060008351604114613515576040805162461bcd60e51b8152602060048201526007602482015266696e762073696760c81b604482015290519081900360640190fd5b50505060208101516040820151604183015160ff16600281101561353757601b015b9193909250565b6001600160a01b0381166000908152601360205260409020548061355e57fe5b6001600160a01b03808316600081815260136020526040808220829055600654815163a9059cbb60e01b8152600481019490945260248401869052905193169263a9059cbb92604480820193929182900301818387803b15801561158157600080fdfe454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e7472616374294265742875696e74333220726f756e6449642c75696e74382067616d65547970652c75696e74323536206e756d6265722c75696e743235362076616c75652c696e743235362062616c616e63652c6279746573333220736572766572486173682c627974657333322075736572486173682c75696e743235362067616d65496429a265627a7a723158203c6923dfa52cb5447c4679690d20ae4c36d324b5d79687182c0b56dd20d1aa4864736f6c63430005100032454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e7472616374290000000000000000000000008bea174f641d239d7f02b9e2d92b8fd1cdd75773000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000ad78ebc5ac620000000000000000000000000000069f52540949eb5417fc70e200140ca2a26307070000000000000000000000000986ded3c50bc1d7c59c8c40e4bcc61a2b87efeca0000000000000000000000000000000000000000000000000000000000000001
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106103785760003560e01c806388fedd04116101d3578063d1e9dcbf11610104578063e475222e116100a2578063ef3aaf541161007c578063ef3aaf5414610c10578063f2fde38b14610c36578063f87ffb7414610c5c578063fd306ca714610c6457610378565b8063e475222e14610b29578063e60a33aa14610b31578063ea1b28e014610c0857610378565b8063db420fe3116100de578063db420fe314610b09578063dc55509014610b11578063de38eb3a14610b19578063e30c397814610b2157610378565b8063d1e9dcbf14610aa7578063d6e5fe9814610ad3578063d7cee31e14610b0157610378565b8063a09f865911610171578063bd5c4e241161014b578063bd5c4e2414610a69578063c49f91d314610a71578063c861f3a014610a79578063cbffb1ae14610a8157610378565b8063a09f865914610a18578063a8182cd314610a20578063b064ca1814610a4c57610378565b8063947bc72d116101ad578063947bc72d146109ce5780639b29f133146109d65780639c0051db146109f35780639f34ce1414610a1057610378565b806388fedd04146108b95780638da5cb5b146108c15780639399dd7e146108c957610378565b80634d20d4bc116102ad5780637ead05f11161024b57806383e256dc1161022557806383e256dc146107205780638456cb59146107b6578063853828b6146107be578063878de0ae146107c657610378565b80637ead05f1146106de57806381efc01d146106fb57806383197ef01461071857610378565b8063563c23a011610287578063563c23a0146105925780635a48766c1461059a5780635ba2dd22146106ce5780635c975abb146106d657610378565b80634d20d4bc1461057a5780634e71e0c814610582578063543ad1df1461058a57610378565b8063287e9fbc1161031a5780633ccfd60b116102f45780633ccfd60b1461047e5780633f4ba83a14610486578063410453ae1461048e57806341b801841461057257610378565b8063287e9fbc146104355780632c94a23514610452578063375b3c0a1461045a57610378565b806319fc36ed1161035657806319fc36ed146103bd5780631aef99b7146103c55780631b08345a146103e957806326b387bb1461040f57610378565b80630df632101461037d5780630f15f4c014610397578063186601ca146103a1575b600080fd5b610385610c6c565b60408051918252519081900360200190f35b61039f610c72565b005b6103a9610cde565b604080519115158252519081900360200190f35b610385610cee565b6103cd610cf5565b604080516001600160a01b039092168252519081900360200190f35b610385600480360360208110156103ff57600080fd5b50356001600160a01b0316610d04565b6103856004803603602081101561042557600080fd5b50356001600160a01b0316610d16565b61039f6004803603602081101561044b57600080fd5b5035610d28565b610385610d6a565b610462610d70565b604080516001600160801b039092168252519081900360200190f35b61039f610d7f565b61039f610dd8565b61039f60048036036101008110156104a557600080fd5b63ffffffff823516916020810135916040820135916060810135916080820135916001600160a01b0360a082013581169260c08301359091169190810190610100810160e0820135600160201b8111156104fe57600080fd5b82018360208201111561051057600080fd5b803590602001918460018302840111600160201b8311171561053157600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610e58945050505050565b610385610e9b565b610385610ea1565b61039f610ebc565b610385610f2d565b610385610f34565b61039f600480360360a08110156105b057600080fd5b810190602081018135600160201b8111156105ca57600080fd5b8201836020820111156105dc57600080fd5b803590602001918460208302840111600160201b831117156105fd57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295843595602086013595919450925060608101915060400135600160201b81111561065857600080fd5b82018360208201111561066a57600080fd5b803590602001918460018302840111600160201b8311171561068b57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295505091359250610f3a915050565b6103cd611344565b6103a9611353565b61039f600480360360208110156106f457600080fd5b5035611363565b61039f6004803603602081101561071157600080fd5b5035611419565b61039f61159d565b61073d6004803603602081101561073657600080fd5b50356115fc565b604051808b600381111561074d57fe5b60ff90811682526001600160801b03909b166020820152989099166040808a019190915263ffffffff9097166060890152608088019590955260a087019390935260c086019190915260e085015261010084015261012083015251908190036101400192509050f35b61039f611663565b61039f611704565b61039f60048036036101608110156107dd57600080fd5b63ffffffff8235169160ff6020820135169160408201359160608101359160808201359160a08101359160c08201359160e0810135916001600160a01b036101008301351691908101906101408101610120820135600160201b81111561084357600080fd5b82018360208201111561085557600080fd5b803590602001918460018302840111600160201b8311171561087657600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955050913592506117bb915050565b610385611801565b6103cd611807565b61039f60048036036101a08110156108e057600080fd5b63ffffffff8235169160ff6020820135169160408201359160608101359160808201359160a08101359160c08201359160e0810135916001600160a01b036101008301351691908101906101408101610120820135600160201b81111561094657600080fd5b82018360208201111561095857600080fd5b803590602001918460018302840111600160201b8311171561097957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550506001600160a01b038335169350505060208101359060400135611816565b610385611862565b61039f600480360360208110156109ec57600080fd5b5035611869565b61039f60048036036020811015610a0957600080fd5b5035611964565b61039f6119a1565b6103cd611a60565b61039f60048036036040811015610a3657600080fd5b506001600160a01b038135169060200135611a6f565b61039f60048036036020811015610a6257600080fd5b5035611b84565b610385611d2a565b610385611d31565b610385611d4c565b61039f60048036036020811015610a9757600080fd5b50356001600160a01b0316611d52565b61039f60048036036040811015610abd57600080fd5b506001600160a01b038135169060200135611dc1565b61039f60048036036040811015610ae957600080fd5b506001600160801b0381358116916020013516611f98565b6103cd612063565b6103cd612072565b610385612081565b610385612087565b6103cd61208e565b61038561209d565b61039f600480360360e0811015610b4757600080fd5b63ffffffff823516916020810135916040820135916060810135916080820135916001600160a01b0360a0820135169181019060e0810160c0820135600160201b811115610b9457600080fd5b820183602082011115610ba657600080fd5b803590602001918460018302840111600160201b83111715610bc757600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506120a3945050505050565b6104626120e3565b61039f60048036036020811015610c2657600080fd5b50356001600160a01b03166120f9565b61039f60048036036020811015610c4c57600080fd5b50356001600160a01b0316612132565b61038561219a565b61039f6121a0565b60075481565b6000546001600160a01b03163314610c8957600080fd5b600154600160a01b900460ff1615610ca057600080fd5b6001805460ff60a01b1916600160a01b1790556040517fc9d6bebde85c4e3348468c6af2cb34f978d1a8c6eebc438f1361c1ad5edf5f0e90600090a1565b600154600160a01b900460ff1681565b6201518081565b6014546001600160a01b031681565b60126020526000908152604090205481565b60136020526000908152604090205481565b6000546001600160a01b03163314610d3f57600080fd5b600154600160a01b900460ff1615610d5657600080fd5b600060095411610d6557600080fd5b600955565b600f5481565b600e546001600160801b031681565b3360009081526013602052604090205480610d9957600080fd5b336000818152601360205260408082208290555183156108fc0291849190818181858888f19350505050158015610dd4573d6000803e3d6000fd5b5050565b6000546001600160a01b03163314610def57600080fd5b600154600160a81b900460ff16610e0557600080fd5b600154600160a01b900460ff16610e1b57600080fd5b6001805460ff60a81b19169055600060028190556040517f730c1faaa977b67dacf1e2451ef54556e04a07d577785ff79f6d31f73502efc99190a1565b600a546001600160a01b03163314610e6f57600080fd5b610e848860008060008b8b8b8b8b8a8c61226f565b610e9182898987876122e2565b5050505050505050565b60105481565b60405180608161361482396081019050604051809103902081565b6001546001600160a01b03163314610ed357600080fd5b60018054600080546001600160a01b038084166001600160a01b031992831617808455919093169093556040519092909116907f897d3c8bbea11029ba3b26eb993fe8edb14c2c4c0d2ecceccce41d1d83d3e359908390a3565b6203f48081565b60025481565b600e5481906001600160801b03168110801590610f695750600e54600160801b90046001600160801b03168111155b610fa6576040805162461bcd60e51b8152602060048201526009602482015268696e76207374616b6560b81b604482015290519081900360640190fd5b600854600354604080516373c4726b60e01b8152600190930160048401819052905190926000926001600160a01b0316916373c4726b91602480820192602092909190829003018186803b158015610ffd57600080fd5b505afa158015611011573d6000803e3d6000fd5b505050506040513d602081101561102757600080fd5b5051600c54909150811115611074576040805162461bcd60e51b815260206004820152600e60248201526d696e7620686f7573655374616b6560901b604482015290519081900360640190fd5b600154600160a81b900460ff16156110bc576040805162461bcd60e51b81526020600482015260066024820152651c185d5cd95960d21b604482015290519081900360640190fd5b6000886000815181106110cb57fe5b602002602001015190506000896001815181106110e457fe5b6020908102919091018101513360009081526012835260408082205480835260119094528120919350815460ff16600381111561111d57fe5b14611165576040805162461bcd60e51b81526020600482015260136024820152721c1c995d8819d85b59481b9bdd08195b991959606a1b604482015290519081900360640190fd5b8a82146111ae576040805162461bcd60e51b81526020600482015260126024820152711a5b9d8819d85b59541c995d91d85b59525960721b604482015290519081900360640190fd5b8942106111ec576040805162461bcd60e51b8152602060048201526007602482015266195e1c1a5c995960ca1b604482015290519081900360640190fd5b6111f9338c8c868d6124db565b601454604080516323b872dd60e01b8152336004820152306024820152604481018b905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b15801561125357600080fd5b505af1158015611267573d6000803e3d6000fd5b505050506040513d602081101561127d57600080fd5b505060098054600180820190925533600090815260126020908152604080832084905583835260119091529020805470ffffffffffffffffffffffffffffffff0019166101006001600160801b038d16021760ff191683178155600854919290916112e79161254e565b600855604080516001600160801b038c1681526020810188905281518792859233927fd25faca801440882fa5d7c7f70b072a2ad89621e277ee0b6f9923ccac48411b1929181900390910190a45050505050505050505050505050565b6003546001600160a01b031681565b600154600160a81b900460ff1681565b6000546001600160a01b0316331461137a57600080fd5b600654604080516323b872dd60e01b81523360048201523060248201526044810184905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b1580156113d457600080fd5b505af11580156113e8573d6000803e3d6000fd5b505050506040513d60208110156113fe57600080fd5b5050600c54611413908263ffffffff61254e16565b600c5550565b6000546001600160a01b0316331461143057600080fd5b600354600854604080516373c4726b60e01b81526004810192909252516000926001600160a01b0316916373c4726b916024808301926020929190829003018186803b15801561147f57600080fd5b505afa158015611493573d6000803e3d6000fd5b505050506040513d60208110156114a957600080fd5b5051600c5490915082118015906114d35750600c5481906114d0908463ffffffff61256116565b10155b6114dc57600080fd5b6000600d5413158061150a5750600c546114fc908363ffffffff61256116565b611507600d54612573565b11155b61151357600080fd5b600c54611526908363ffffffff61256116565b600c55600654600b546040805163a9059cbb60e01b81526001600160a01b039283166004820152602481018690529051919092169163a9059cbb91604480830192600092919082900301818387803b15801561158157600080fd5b505af1158015611595573d6000803e3d6000fd5b505050505050565b6000546001600160a01b031633146115b457600080fd5b600154621a5e0090600160a81b900460ff1680156115e5575060025442906115e2908363ffffffff61254e16565b11155b6115ee57600080fd5b6000546001600160a01b0316ff5b601160205260009081526040902080546001820154600283015460038401546004850154600586015460069096015460ff8087169761010088046001600160801b031697600160881b810490921696600160901b90920463ffffffff16959194919391928a565b6000546001600160a01b0316331461167a57600080fd5b600154600160a81b900460ff16156116c2576040805162461bcd60e51b81526020600482015260066024820152651c185d5cd95960d21b604482015290519081900360640190fd5b6001805460ff60a81b1916600160a81b179055426002556040517f4b314b34e912fda7f95e7d23e9c8c95f82f0aff1984e4ce592a0b005f905562490600090a1565b6000546001600160a01b0316331461171b57600080fd5b6001546203f48090600160a81b900460ff16801561174c57506002544290611749908363ffffffff61254e16565b11155b61175557600080fd5b6000600d819055600c805490829055600654600b546040805163a9059cbb60e01b81526001600160a01b0392831660048201526024810185905290519394919092169263a9059cbb92604480820193929182900301818387803b15801561158157600080fd5b6117e38b8b8b8b8b8b8b8b8b8b600a60009054906101000a90046001600160a01b031661226f565b6117f48b8b8b8b8b8a878b33612583565b5050505050505050505050565b600d5481565b6000546001600160a01b031681565b600a546001600160a01b0316331461182d57600080fd5b6118408d8d8d8d8d8d8d8d8d8d8d61226f565b6118538d8d8d8d8d8d8d89898f8d612a2b565b50505050505050505050505050565b62ed4e0081565b3360008181526012602090815260408083205480845260119092529091208382146118c8576040805162461bcd60e51b815260206004820152600a6024820152691a5b9d8819d85b59525960b21b604482015290519081900360640190fd5b6001815460ff1660038111156118da57fe5b141561192357426006820155805460ff19166002178155604051829033907f9b60ba122ac2e613ae737820a8eb2d8c28356ff6b03d569dacb7ce2bcdc86fed90600090a361195e565b6003815460ff16600381111561193557fe5b14801561194e57508054600160901b900463ffffffff16155b156103785761195e818385612f2d565b50505050565b6000546001600160a01b0316331461197b57600080fd5b80620151808110158015611992575062ed4e008111155b61199b57600080fd5b50600f55565b6000546001600160a01b031633146119b857600080fd5b6004546001600160a01b03166119cd57600080fd5b6005546119d957600080fd5b426203f48060055401111580156119f757506207e900600554014211155b611a0057600080fd5b60048054600380546001600160a01b03199081166001600160a01b038416179091551690556000600581905560408051918252517f28de3c2df3d09a8b061f86cd0c78b7d02f1f5caffcd086ff45ee12a4a51056c89181900360200190a1565b6004546001600160a01b031681565b600a546001600160a01b03163314611a8657600080fd5b6001600160a01b0382166000908152601260209081526040808320548084526011909252909120828214611aee576040805162461bcd60e51b815260206004820152600a6024820152691a5b9d8819d85b59525960b21b604482015290519081900360640190fd5b6001815460ff166003811115611b0057fe5b1415611b4957426006820155805460ff19166003178155604051829033907fdbbc392d5391708a9def7f560f8cbdef92e1bb37e5104831e78feda1488b7ab090600090a361195e565b6002815460ff166003811115611b5b57fe5b148015611b7457508054600160901b900463ffffffff16155b156103785761195e818386612f2d565b336000818152601260209081526040808320548084526011909252909120838214611be3576040805162461bcd60e51b815260206004820152600a6024820152691a5b9d8819d85b59525960b21b604482015290519081900360640190fd5b6002815460ff166003811115611bf557fe5b14611c34576040805162461bcd60e51b815260206004820152600a602482015269696e762073746174757360b01b604482015290519081900360640190fd5b600380548254600184015460028501549385015460068601546040805163062f5d8d60e11b8152600160881b860460ff1660048201526024810194909452604484019690965260648301919091526101009092046001600160801b0316608482015260a481019190915291516000926001600160a01b0390921691630c5ebb1a9160c4808301926020929190829003018186803b158015611cd457600080fd5b505afa158015611ce8573d6000803e3d6000fd5b505050506040513d6020811015611cfe57600080fd5b50518254909150611d239083908590600160901b900463ffffffff1687600286612fd3565b5050505050565b621a5e0081565b6040518060526135c282396052019050604051809103902081565b600c5481565b6000546001600160a01b03163314611d6957600080fd5b600480546001600160a01b0383166001600160a01b031990911681179091554260055560408051918252517f97044e884f04922f1959ef2de012f4734423df2d4da57fd4c5eaf40cd63b525f9181900360200190a150565b600a546001600160a01b03163314611dd857600080fd5b6001600160a01b0382166000908152601260209081526040808320548084526011909252909120828214611e40576040805162461bcd60e51b815260206004820152600a6024820152691a5b9d8819d85b59525960b21b604482015290519081900360640190fd5b6003815460ff166003811115611e5257fe5b14611e91576040805162461bcd60e51b815260206004820152600a602482015269696e762073746174757360b01b604482015290519081900360640190fd5b6003805482546001840154600285015493850154600586015460048088015460068901546040805163454a41cd60e11b8152600160881b890460ff16948101949094526024840196909652604483019890985260648201939093526101009094046001600160801b0316608485015260a484015260c483015260e482019390935291516000926001600160a01b0390921691638a94839a91610104808301926020929190829003018186803b158015611f4957600080fd5b505afa158015611f5d573d6000803e3d6000fd5b505050506040513d6020811015611f7357600080fd5b50518254909150611d239083908590600160901b900463ffffffff1688600186612fd3565b6000546001600160a01b03163314611faf57600080fd5b6000826001600160801b0316118015611fda5750806001600160801b0316826001600160801b031611155b611fe357600080fd5b600e80546fffffffffffffffffffffffffffffffff19166001600160801b03848116919091178116600160801b8483168102919091179283905560408051848416815291909304909116602082015281517f1ec948cac143dba0e555a87dd86ae387e2ecd4a8fee80f7dd324d5987cb3e7f8929181900390910190a15050565b600b546001600160a01b031681565b600a546001600160a01b031681565b60055481565b6207e90081565b6001546001600160a01b031681565b60085481565b6120cd8760008060008a8a8a8a8a8a600a60009054906101000a90046001600160a01b031661226f565b6120da33888886866122e2565b50505050505050565b600e54600160801b90046001600160801b031681565b6000546001600160a01b0316331461211057600080fd5b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461214957600080fd5b600180546001600160a01b0319166001600160a01b0383811691821790925560008054604051929316917f83ada3430836f9d4bd6f7bc690ffbba5199cb19b37393dd64c229930213535969190a350565b60095481565b426121b8600f5460105461254e90919063ffffffff16565b11156121c357600080fd5b42601055600d546000126121d65761226d565b60006121e3600d54612573565b6000600d55600c549091506121fe908263ffffffff61256116565b600c55600654600b546040805163a9059cbb60e01b81526001600160a01b039283166004820152602481018590529051919092169163a9059cbb91604480830192600092919082900301818387803b15801561225957600080fd5b505af1158015611d23573d6000803e3d6000fd5b565b306001600160a01b03841681146122c3576040805162461bcd60e51b8152602060048201526013602482015272696e7620636f6e74726163744164647265737360681b604482015290519081900360640190fd5b60006122d58d8d8d8d8d8d8d8d61307c565b905061185381858561313a565b6001600160a01b038086166000908152601260209081526040808320548084526011835281842060035483516339d6a34560e11b8152935192969195949116926373ad468a9260048083019392829003018186803b15801561234357600080fd5b505afa158015612357573d6000803e3d6000fd5b505050506040513d602081101561236d57600080fd5b5051825490915061010090046001600160801b03168386146123c3576040805162461bcd60e51b815260206004820152600a6024820152691a5b9d8819d85b59525960b21b604482015290519081900360640190fd5b60008863ffffffff161161240c576040805162461bcd60e51b815260206004820152600b60248201526a1a5b9d881c9bdd5b99125960aa1b604482015290519081900360640190fd5b86816000031315801561241f5750818713155b61245e576040805162461bcd60e51b815260206004820152600b60248201526a696e762062616c616e636560a81b604482015290519081900360640190fd5b6001835460ff16600381111561247057fe5b146124af576040805162461bcd60e51b815260206004820152600a602482015269696e762073746174757360b01b604482015290519081900360640190fd5b6001600160a01b03851630146124c157fe5b6124d083858a8c60008c612fd3565b505050505050505050565b6040805130606081811b6020808501919091529089901b6bffffffffffffffffffffffff19166034840152604883018890526068830187905260888084018790528451808503909101815260a890930190935281519190920120600a546120da90829085906001600160a01b031661313a565b8181018281101561255b57fe5b92915050565b60008282111561256d57fe5b50900390565b60008082121561257f57fe5b5090565b6001600160a01b038082166000908152601260209081526040808320548084526011835281842060035483516339d6a34560e11b8152935192969195949116926373ad468a9260048083019392829003018186803b1580156125e457600080fd5b505afa1580156125f8573d6000803e3d6000fd5b505050506040513d602081101561260e57600080fd5b5051825490915061010090046001600160801b0316858414612664576040805162461bcd60e51b815260206004820152600a6024820152691a5b9d8819d85b59525960b21b604482015290519081900360640190fd5b60008d63ffffffff16116126ad576040805162461bcd60e51b815260206004820152600b60248201526a1a5b9d881c9bdd5b99125960aa1b604482015290519081900360640190fd5b6040805160208082018a90528251808303820181529183019092528051910120881461270f576040805162461bcd60e51b815260206004820152600c60248201526b1a5b9d881d5cd95c94d9595960a21b604482015290519081900360640190fd5b8881600003131580156127225750818913155b612761576040805162461bcd60e51b815260206004820152600b60248201526a696e762062616c616e636560a81b604482015290519081900360640190fd5b600354604080516309eecdd760e01b815260ff8f166004820152602481018e9052604481018d905290516001600160a01b03909216916309eecdd791606480820192602092909190829003018186803b1580156127bd57600080fd5b505afa1580156127d1573d6000803e3d6000fd5b505050506040513d60208110156127e757600080fd5b5051612824576040805162461bcd60e51b81526020600482015260076024820152661a5b9d8818995d60ca1b604482015290519081900360640190fd5b600061284e6128328c613209565b612842848d63ffffffff61321816565b9063ffffffff61324f16565b1215612892576040805162461bcd60e51b815260206004820152600e60248201526d0ecc2d8eaca40e8dede40d0d2ced60931b604482015290519081900360640190fd5b6003835460ff1660038111156128a457fe5b1480156128c15750825463ffffffff8e8116600160901b90920416145b156128dd57600483018790556128d883858761327e565b611853565b6001835460ff1660038111156128ef57fe5b148061292557506003835460ff16600381111561290857fe5b1480156129255750825463ffffffff808f16600160901b90920416105b156129f2578254600290849060ff191660018302179055504283600601819055508c8360000160126101000a81548163ffffffff021916908363ffffffff1602179055508b8360000160116101000a81548160ff021916908360ff1602179055508a83600101819055508983600201819055508883600301819055508683600401819055506000801b836005018190555083336001600160a01b03167f9b60ba122ac2e613ae737820a8eb2d8c28356ff6b03d569dacb7ce2bcdc86fed60405160405180910390a3611853565b6040805162461bcd60e51b8152602060048201526009602482015268696e7620737461746560b81b604482015290519081900360640190fd5b6001600160a01b038082166000908152601260209081526040808320548084526011835281842060035483516339d6a34560e11b8152935192969195949116926373ad468a9260048083019392829003018186803b158015612a8c57600080fd5b505afa158015612aa0573d6000803e3d6000fd5b505050506040513d6020811015612ab657600080fd5b5051825490915061010090046001600160801b0316858414612b0c576040805162461bcd60e51b815260206004820152600a6024820152691a5b9d8819d85b59525960b21b604482015290519081900360640190fd5b60008f63ffffffff1611612b55576040805162461bcd60e51b815260206004820152600b60248201526a1a5b9d881c9bdd5b99125960aa1b604482015290519081900360640190fd5b6040805160208082018b905282518083038201815291830190925280519101208a14612bb9576040805162461bcd60e51b815260206004820152600e60248201526d1a5b9d881cd95c9d995c94d9595960921b604482015290519081900360640190fd5b6040805160208082018a905282518083038201815291830190925280519101208914612c1b576040805162461bcd60e51b815260206004820152600c60248201526b1a5b9d881d5cd95c94d9595960a21b604482015290519081900360640190fd5b8a8160000313158015612c2e5750818b13155b612c6d576040805162461bcd60e51b815260206004820152600b60248201526a696e762062616c616e636560a81b604482015290519081900360640190fd5b600360009054906101000a90046001600160a01b03166001600160a01b03166309eecdd78f8f8f6040518463ffffffff1660e01b8152600401808460ff1660ff168152602001838152602001828152602001935050505060206040518083038186803b158015612cdc57600080fd5b505afa158015612cf0573d6000803e3d6000fd5b505050506040513d6020811015612d0657600080fd5b5051612d43576040805162461bcd60e51b81526020600482015260076024820152661a5b9d8818995d60ca1b604482015290519081900360640190fd5b6000612d61612d518e613209565b612842848f63ffffffff61321816565b1215612da5576040805162461bcd60e51b815260206004820152600e60248201526d746f6f20686967682076616c756560901b604482015290519081900360640190fd5b6002835460ff166003811115612db757fe5b148015612de357508e63ffffffff168360000160129054906101000a900463ffffffff1663ffffffff16145b15612dff5760058301889055612dfa83858761327e565b612f1c565b6001835460ff166003811115612e1157fe5b1480612e5657506002835460ff166003811115612e2a57fe5b148015612e5657508e63ffffffff168360000160129054906101000a900463ffffffff1663ffffffff16105b156129f2578254600390849060ff191660018302179055504283600601819055508e8360000160126101000a81548163ffffffff021916908363ffffffff1602179055508d8360000160116101000a81548160ff021916908360ff1602179055508c83600101819055508b83600201819055508a836003018190555087836005018190555086836004018190555083856001600160a01b03167fdbbc392d5391708a9def7f560f8cbdef92e1bb37e5104831e78feda1488b7ab060405160405180910390a35b505050505050505050505050505050565b60035460408051637e7630bd60e11b815290516000926001600160a01b03169163fcec617a916004808301926020929190829003018186803b158015612f7257600080fd5b505afa158015612f86573d6000803e3d6000fd5b505050506040513d6020811015612f9c57600080fd5b505184546000918203925061010090046001600160801b031690819003821215612fc7578060000391505b611d2385856000866003875b855460ff19168655600854612fe9906001612561565b600855855461300890849061010090046001600160801b03168361337d565b84836001600160a01b03167f59ba0efd7d5a5d7e109fb346b50365a8d68661fc7c2c311cd29750707e1b8de5868486604051808463ffffffff1663ffffffff16815260200183815260200182600381111561305f57fe5b60ff168152602001935050505060405180910390a3505050505050565b6000806040518080613614608191396040805191829003608101822060208084019190915263ffffffff9d909d168282015260ff9b909b166060820152608081019990995250505060a086019490945260c085019290925260e084015261010083015261012080830191909152825180830390910181526101408201835280519084012060075461190160f01b61016084015261016283015261018280830191909152825180830390910181526101a2909101909152805191012090565b6000806000613148856134d0565b925092509250600060018783868660405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa1580156131ad573d6000803e3d6000fd5b505050602060405103519050846001600160a01b0316816001600160a01b0316146120da576040805162461bcd60e51b8152602060048201526007602482015266696e762073696760c81b604482015290519081900360640190fd5b6000600160ff1b821061257f57fe5b600082820181831280159061322d5750838112155b80613242575060008312801561324257508381125b61324857fe5b9392505050565b60008183038183128015906132645750838113155b806132425750600083128015613242575083811361324857fe5b600380548454600186015460028701549387015460058801546004808a015460408051631503b1e760e11b8152600160881b880460ff16938101939093526024830195909552604482019790975260648101929092526101009093046001600160801b0316608482015260a481019290925260c482019390935291516000926001600160a01b0390921691632a0763ce9160e4808301926020929190829003018186803b15801561332e57600080fd5b505afa158015613342573d6000803e3d6000fd5b505050506040513d602081101561335857600080fd5b5051845490915061195e9085908590600160901b900463ffffffff1685600386612fd3565b6000826001600160801b031690506000613398600c54613209565b9050600360009054906101000a90046001600160a01b03166001600160a01b03166373ad468a6040518163ffffffff1660e01b815260040160206040518083038186803b1580156133e857600080fd5b505afa1580156133fc573d6000803e3d6000fd5b505050506040513d602081101561341257600080fd5b505183131561341d57fe5b600061342f838563ffffffff61321816565b121561343757fe5b60008313801561344657508281125b1561344f578092505b600d54613462908463ffffffff61324f16565b600d556000613477828563ffffffff61324f16565b905061348281612573565b600c55600061349f61349a858763ffffffff61321816565b612573565b6001600160a01b03881660009081526013602052604090208054820190819055909150156120da576120da8761353e565b60008060008351604114613515576040805162461bcd60e51b8152602060048201526007602482015266696e762073696760c81b604482015290519081900360640190fd5b50505060208101516040820151604183015160ff16600281101561353757601b015b9193909250565b6001600160a01b0381166000908152601360205260409020548061355e57fe5b6001600160a01b03808316600081815260136020526040808220829055600654815163a9059cbb60e01b8152600481019490945260248401869052905193169263a9059cbb92604480820193929182900301818387803b15801561158157600080fdfe454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c75696e7432353620636861696e49642c6164647265737320766572696679696e67436f6e7472616374294265742875696e74333220726f756e6449642c75696e74382067616d65547970652c75696e74323536206e756d6265722c75696e743235362076616c75652c696e743235362062616c616e63652c6279746573333220736572766572486173682c627974657333322075736572486173682c75696e743235362067616d65496429a265627a7a723158203c6923dfa52cb5447c4679690d20ae4c36d324b5d79687182c0b56dd20d1aa4864736f6c63430005100032
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000008bea174f641d239d7f02b9e2d92b8fd1cdd75773000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000ad78ebc5ac620000000000000000000000000000069f52540949eb5417fc70e200140ca2a26307070000000000000000000000000986ded3c50bc1d7c59c8c40e4bcc61a2b87efeca0000000000000000000000000000000000000000000000000000000000000001
-----Decoded View---------------
Arg [0] : _serverAddress (address): 0x8beA174F641D239D7f02b9E2d92B8Fd1Cdd75773
Arg [1] : _minStake (uint128): 10000000000000000
Arg [2] : _maxStake (uint128): 200000000000000000000
Arg [3] : _conflictResAddress (address): 0x69F52540949EB5417Fc70e200140Ca2a26307070
Arg [4] : _houseAddress (address): 0x986dED3c50Bc1d7c59C8C40E4BCc61a2b87efecA
Arg [5] : _chainId (uint256): 1
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000008bea174f641d239d7f02b9e2d92b8fd1cdd75773
Arg [1] : 000000000000000000000000000000000000000000000000002386f26fc10000
Arg [2] : 00000000000000000000000000000000000000000000000ad78ebc5ac6200000
Arg [3] : 00000000000000000000000069f52540949eb5417fc70e200140ca2a26307070
Arg [4] : 000000000000000000000000986ded3c50bc1d7c59c8c40e4bcc61a2b87efeca
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000001
Deployed Bytecode Sourcemap
43311:7630:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43311:7630:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14995:31;;;:::i;:::-;;;;;;;;;;;;;;;;5867:116;;;:::i;:::-;;5358:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;14440:51;;;:::i;43368:77::-;;;:::i;:::-;;;;-1:-1:-1;;;;;43368:77:0;;;;;;;;;;;;;;16197:43;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16197:43:0;-1:-1:-1;;;;;16197:43:0;;:::i;16301:47::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16301:47:0;-1:-1:-1;;;;;16301:47:0;;:::i;19445:152::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;19445:152:0;;:::i;15895:44::-;;;:::i;15702:23::-;;;:::i;:::-;;;;-1:-1:-1;;;;;15702:23:0;;;;;;;;;;;;;;19665:209;;;:::i;10419:147::-;;;:::i;46893:717::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;46893:717:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;46893:717:0;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;46893:717:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;46893:717:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;46893:717:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;46893:717:0;;-1:-1:-1;46893:717:0;;-1:-1:-1;;;;;46893:717:0:i;16001:39::-;;;:::i;14789:197::-;;;:::i;2784:185::-;;;:::i;3507:41::-;;;:::i;9321:40::-;;;:::i;44723:1423::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;44723:1423:0;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;44723:1423:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;44723:1423:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;-1:-1;;;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;44723:1423:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;44723:1423:0;;;;;;;;;;;;-1:-1:-1;44723:1423:0;-1:-1:-1;44723:1423:0;;;;-1:-1:-1;44723:1423:0;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;44723:1423:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;44723:1423:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;44723:1423:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;44723:1423:0;;-1:-1:-1;;44723:1423:0;;;-1:-1:-1;44723:1423:0;;-1:-1:-1;;44723:1423:0:i;3143:46::-;;;:::i;9251:25::-;;;:::i;20941:213::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20941:213:0;;:::i;21215:454::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21215:454:0;;:::i;10913:125::-;;;:::i;16091:40::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16091:40:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16091:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16091:40:0;-1:-1:-1;16091:40:0;10144:145;;;:::i;21741:272::-;;;:::i;31756:909::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;31756:909:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31756:909:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;31756:909:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;31756:909:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;31756:909:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;31756:909:0;;-1:-1:-1;;31756:909:0;;;-1:-1:-1;31756:909:0;;-1:-1:-1;;31756:909:0:i;15594:26::-;;;:::i;1579:20::-;;;:::i;29979:1131::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;29979:1131:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29979:1131:0;;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;29979:1131:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;29979:1131:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;29979:1131:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;29979:1131:0;;-1:-1:-1;;;;;;;29979:1131:0;;;;-1:-1:-1;;;29979:1131:0;;;;;;;;;:::i;14557:55::-;;;:::i;32852:677::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32852:677:0;;:::i;20578:232::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20578:232:0;;:::i;4735:451::-;;;:::i;3246:42::-;;;:::i;33750:673::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;33750:673:0;;;;;;;;:::i;35668:669::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35668:669:0;;:::i;10781:46::-;;;:::i;14621:159::-;;;:::i;15504:26::-;;;:::i;4404:251::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;4404:251:0;-1:-1:-1;;;;;4404:251:0;;:::i;34637:853::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;34637:853:0;;;;;;;;:::i;22375:272::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;22375:272:0;;;;;;;;;;:::i;15433:27::-;;;:::i;15351:28::-;;;:::i;3374:26::-;;;:::i;3655:41::-;;;:::i;1606:27::-;;;:::i;15079:::-;;;:::i;48165:667::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;48165:667:0;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;48165:667:0;;;;;;;;;;;;;;;;-1:-1:-1;;;5:28;;2:2;;;46:1;43;36:12;2:2;48165:667:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;48165:667:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;-1:-1;;;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;48165:667:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;48165:667:0;;-1:-1:-1;48165:667:0;;-1:-1:-1;;;;;48165:667:0:i;15802:23::-;;;:::i;22123:112::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22123:112:0;-1:-1:-1;;;;;22123:112:0;;:::i;2541:169::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;2541:169:0;-1:-1:-1;;;;;2541:169:0;;:::i;15258:26::-;;;:::i;19955:553::-;;;:::i;14995:31::-;;;;:::o;5867:116::-;1981:5;;-1:-1:-1;;;;;1981:5:0;1967:10;:19;1959:28;;;;;;5749:9;;-1:-1:-1;;;5749:9:0;;;;5748:10;5740:19;;;;;;5944:4;5932:16;;-1:-1:-1;;;;5932:16:0;-1:-1:-1;;;5932:16:0;;;5964:11;;;;5932:16;;5964:11;5867:116::o;5358:29::-;;;-1:-1:-1;;;5358:29:0;;;;;:::o;14440:51::-;14485:6;14440:51;:::o;43368:77::-;;;-1:-1:-1;;;;;43368:77:0;;:::o;16197:43::-;;;;;;;;;;;;;:::o;16301:47::-;;;;;;;;;;;;;:::o;19445:152::-;1981:5;;-1:-1:-1;;;;;1981:5:0;1967:10;:19;1959:28;;;;;;5749:9;;-1:-1:-1;;;5749:9:0;;;;5748:10;5740:19;;;;;;19552:1;19539:10;;:14;19531:23;;;;;;19565:10;:24;19445:152::o;15895:44::-;;;;:::o;15702:23::-;;;-1:-1:-1;;;;;15702:23:0;;:::o;19665:209::-;19736:10;19703:15;19721:26;;;:14;:26;;;;;;19766:14;19758:23;;;;;;19809:10;19823:1;19794:26;;;:14;:26;;;;;;:30;;;19835:31;;;;;;19855:10;;19835:31;;19823:1;19835:31;19855:10;19809;19835:31;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19835:31:0;19665:209;:::o;10419:147::-;1981:5;;-1:-1:-1;;;;;1981:5:0;1967:10;:19;1959:28;;;;;;9649:6;;-1:-1:-1;;;9649:6:0;;;;9641:15;;;;;;5584:9;;-1:-1:-1;;;5584:9:0;;;;5576:18;;;;;;10491:6;:14;;-1:-1:-1;;;;10491:14:0;;;10500:5;10516:10;:14;;;10546:12;;;;10500:5;10546:12;10419:147::o;46893:717::-;16996:13;;-1:-1:-1;;;;;16996:13:0;16982:10;:27;16974:36;;;;;;47203:311;47231:8;47258:1;47278;47298;47318:8;47345:11;47375:9;47403:7;47429:16;47464:8;47491:12;47203:9;:311::i;:::-;47527:75;47542:12;47556:8;47566;47576:7;47585:16;47527:14;:75::i;:::-;46893:717;;;;;;;;:::o;16001:39::-;;;;:::o;14789:197::-;14828:158;;;;;;;;;;;;;;;;;;14789:197;:::o;2784:185::-;2177:12;;-1:-1:-1;;;;;2177:12:0;2163:10;:26;2155:35;;;;;;2853:12;;;;2845:20;;-1:-1:-1;;;;;2853:12:0;;;-1:-1:-1;;;;;;2845:20:0;;;;;;;2876:25;;;;;;;2917:44;;2853:12;;2941:5;;;;2917:44;;2853:12;;2917:44;2784:185::o;3507:41::-;3542:6;3507:41;:::o;9321:40::-;;;;:::o;44723:1423::-;16790:8;;44942:7;;-1:-1:-1;;;;;16790:8:0;:19;-1:-1:-1;16790:19:0;;;:42;;-1:-1:-1;16824:8:0;;-1:-1:-1;;;16824:8:0;;-1:-1:-1;;;;;16824:8:0;16813:19;;;16790:42;16782:64;;;;;-1:-1:-1;;;16782:64:0;;;;;;;;;;;;-1:-1:-1;;;16782:64:0;;;;;;;;;;;;;;;44980:11;;16521;;:39;;;-1:-1:-1;;;16521:39:0;;44994:1;44980:15;;;16521:39;;;;;;;;44980:15;;16500:18;;-1:-1:-1;;;;;16521:11:0;;:25;;:39;;;;;;;;;;;;;;;:11;:39;;;5:2:-1;;;;30:1;27;20:12;5:2;16521:39:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;16521:39:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;16521:39:0;16579:10;;16521:39;;-1:-1:-1;16579:27:0;-1:-1:-1;16579:27:0;16571:54;;;;;-1:-1:-1;;;16571:54:0;;;;;;;;;;;;-1:-1:-1;;;16571:54:0;;;;;;;;;;;;;;;9491:6;;-1:-1:-1;;;9491:6:0;;;;9490:7;9482:26;;;;;-1:-1:-1;;;9482:26:0;;;;;;;;;;;;-1:-1:-1;;;9482:26:0;;;;;;;;;;;;;;;45036:20;45059:7;45067:1;45059:10;;;;;;;;;;;;;;45036:33;;45080:22;45105:7;45113:1;45105:10;;;;;;;;;;;;;;;;;;;45159;45126:19;45148:22;;;:10;:22;;;;;;;45201:26;;;:10;:26;;;;;45105:10;;-1:-1:-1;45248:11:0;;;;:31;;;;;;;;;45240:63;;;;;-1:-1:-1;;;45240:63:0;;;;;;;;;;;;-1:-1:-1;;;45240:63:0;;;;;;;;;;;;;;;45340:15;45322:14;:33;45314:64;;;;;-1:-1:-1;;;45314:64:0;;;;;;;;;;;;-1:-1:-1;;;45314:64:0;;;;;;;;;;;;;;;45415:13;45397:15;:31;45389:51;;;;;-1:-1:-1;;;45389:51:0;;;;;;;;;;;;-1:-1:-1;;;45389:51:0;;;;;;;;;;;;;;;45453:87;45469:10;45481:15;45498:13;45513:14;45529:10;45453:15;:87::i;:::-;45559:17;;45553:73;;;-1:-1:-1;;;45553:73:0;;45591:10;45553:73;;;;45611:4;45553:73;;;;;;;;;;;;-1:-1:-1;;;;;45559:17:0;;;;45553:37;;:73;;;;;;;;;;;;;;;45559:17;;45553:73;;;5:2:-1;;;;30:1;27;20:12;5:2;45553:73:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45553:73:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;45653:10:0;:12;;;;;;;;;45687:10;-1:-1:-1;45676:22:0;;;:10;45553:73;45676:22;;;;;;;:31;;;45741:18;;;:10;:18;;;;;45772:32;;-1:-1:-1;;45772:32:0;;-1:-1:-1;;;;;45772:32:0;;;;-1:-1:-1;;45881:34:0;;;;;45942:11;;45653:12;;45741:18;;45942;;:15;:18::i;:::-;45928:11;:32;46055:83;;;-1:-1:-1;;;;;46055:83:0;;;;;;;;;;;;46108:14;;46082:6;;46070:10;;46055:83;;;;;;;;;;;9519:1;;;;;;16857;;44723:1423;;;;;;:::o;3143:46::-;;;-1:-1:-1;;;;;3143:46:0;;:::o;9251:25::-;;;-1:-1:-1;;;9251:25:0;;;;;:::o;20941:213::-;1981:5;;-1:-1:-1;;;;;1981:5:0;1967:10;:19;1959:28;;;;;;21032:17;;21026:73;;;-1:-1:-1;;;21026:73:0;;21064:10;21026:73;;;;21084:4;21026:73;;;;;;;;;;;;-1:-1:-1;;;;;21032:17:0;;;;21026:37;;:73;;;;;;;;;;;;;;;21032:17;;21026:73;;;5:2:-1;;;;30:1;27;20:12;5:2;21026:73:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21026:73:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;21123:10:0;;:23;;21138:7;21123:23;:14;:23;:::i;:::-;21110:10;:36;-1:-1:-1;20941:213:0:o;21215:454::-;1981:5;;-1:-1:-1;;;;;1981:5:0;1967:10;:19;1959:28;;;;;;21304:11;;21330;;21304:38;;;-1:-1:-1;;;21304:38:0;;;;;;;;;;21283:18;;-1:-1:-1;;;;;21304:11:0;;:25;;:38;;;;;;;;;;;;;;:11;:38;;;5:2:-1;;;;30:1;27;20:12;5:2;21304:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21304:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21304:38:0;21372:10;;21304:38;;-1:-1:-1;21363:19:0;;;;;:61;;-1:-1:-1;21386:10:0;;21411:13;;21386:21;;21401:5;21386:21;:14;:21;:::i;:::-;:38;;21363:61;21355:70;;;;;;21459:1;21444:11;;:16;;:69;;;-1:-1:-1;21492:10:0;;:21;;21507:5;21492:21;:14;:21;:::i;:::-;21464:24;:11;;:22;:24::i;:::-;:49;;21444:69;21436:78;;;;;;21540:10;;:21;;21555:5;21540:21;:14;:21;:::i;:::-;21527:10;:34;21578:17;;21606:12;;21572:54;;;-1:-1:-1;;;21572:54:0;;-1:-1:-1;;;;;21606:12:0;;;21572:54;;;;;;;;;;;;21578:17;;;;;21572:33;;:54;;;;;21578:17;;21572:54;;;;;;;21578:17;;21572:54;;;5:2:-1;;;;30:1;27;20:12;5:2;21572:54:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21572:54:0;;;;1998:1;21215:454;:::o;10913:125::-;1981:5;;-1:-1:-1;;;;;1981:5:0;1967:10;:19;1959:28;;;;;;9836:6;;10820:7;;-1:-1:-1;;;9836:6:0;;;;:55;;;;-1:-1:-1;9847:10:0;;9875:15;;9847:24;;9862:8;9847:24;:14;:24;:::i;:::-;:43;;9836:55;9828:64;;;;;;11022:5;;-1:-1:-1;;;;;11022:5:0;10993:37;16091:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16091:40:0;;-1:-1:-1;;;16091:40:0;;;;;;-1:-1:-1;;;16091:40:0;;;;;;;;;;;;;:::o;10144:145::-;1981:5;;-1:-1:-1;;;;;1981:5:0;1967:10;:19;1959:28;;;;;;9491:6;;-1:-1:-1;;;9491:6:0;;;;9490:7;9482:26;;;;;-1:-1:-1;;;9482:26:0;;;;;;;;;;;;-1:-1:-1;;;9482:26:0;;;;;;;;;;;;;;;10212:4;10203:13;;-1:-1:-1;;;;10203:13:0;-1:-1:-1;;;10203:13:0;;;10240:15;10227:10;:28;10271:10;;;;10203:13;;10271:10;10144:145::o;21741:272::-;1981:5;;-1:-1:-1;;;;;1981:5:0;1967:10;:19;1959:28;;;;;;9836:6;;21797;;-1:-1:-1;;;9836:6:0;;;;:55;;;;-1:-1:-1;9847:10:0;;9875:15;;9847:24;;9862:8;9847:24;:14;:24;:::i;:::-;:43;;9836:55;9828:64;;;;;;21830:1;21816:11;:15;;;21860:10;;;21881:14;;;;21912:17;;21940:12;;21906:59;;;-1:-1:-1;;;21906:59:0;;-1:-1:-1;;;;;21940:12:0;;;21906:59;;;;;;;;;;;;21860:10;;21912:17;;;;;21906:33;;:59;;;;;21830:1;21906:59;;;;;;21830:1;21912:17;21906:59;;;5:2:-1;;;;30:1;27;20:12;31756:909:0;32119:286;32143:8;32166:9;32190:4;32209:6;32230:8;32253:11;32279:9;32303:7;32325:16;32356:10;32381:13;;;;;;;;;-1:-1:-1;;;;;32381:13:0;32119:9;:286::i;:::-;32418:239;32456:8;32479:9;32503:4;32522:6;32543:8;32566:9;32590;32614:7;32636:10;32418:23;:239::i;:::-;31756:909;;;;;;;;;;;:::o;15594:26::-;;;;:::o;1579:20::-;;;-1:-1:-1;;;;;1579:20:0;;:::o;29979:1131::-;16996:13;;-1:-1:-1;;;;;16996:13:0;16982:10;:27;16974:36;;;;;;30423:327;30451:8;30478:9;30506:4;30529:6;30554:8;30581:11;30611:9;30639:7;30665:16;30700:8;30727:12;30423:9;:327::i;:::-;30763:339;30807:8;30834:9;30862:4;30885:6;30910:8;30937:11;30967:9;30995:11;31025:9;31053:7;31079:12;30763:25;:339::i;:::-;29979:1131;;;;;;;;;;;;;:::o;14557:55::-;14601:11;14557:55;:::o;32852:677::-;32936:10;32914:19;32971:23;;;:10;:23;;;;;;;;;33025:18;;;:10;:18;;;;;;33064:17;;;33056:40;;;;;-1:-1:-1;;;33056:40:0;;;;;;;;;;;;-1:-1:-1;;;33056:40:0;;;;;;;;;;;;;;;33128:17;33113:11;;;;:32;;;;;;;;;33109:413;;;33186:15;33162:21;;;:39;33216:43;;-1:-1:-1;;33216:43:0;33230:29;33216:43;;;33281:39;;33313:6;;33301:10;;33281:39;;-1:-1:-1;;33281:39:0;33109:413;;;33357:31;33342:11;;;;:46;;;;;;;;;:67;;;;-1:-1:-1;33392:12:0;;-1:-1:-1;;;33392:12:0;;;;:17;33342:67;33338:184;;;33426:43;33443:4;33449:6;33457:11;33426:16;:43::i;:::-;32852:677;;;;:::o;20578:232::-;1981:5;;-1:-1:-1;;;;;1981:5:0;1967:10;:19;1959:28;;;;;;20713:23;14485:6;17188:15;:40;;:100;;;;;14601:11;17249:15;:39;;17188:100;17180:109;;;;;;-1:-1:-1;20754:22:0;:48;20578:232::o;4735:451::-;1981:5;;-1:-1:-1;;;;;1981:5:0;1967:10;:19;1959:28;;;;;;4809:14;;-1:-1:-1;;;;;4809:14:0;4801:37;;;;;;4857:10;;4849:24;;;;;;4920:15;3542:6;4892:10;;:24;:43;;:90;;;;;3690:6;4958:10;;:24;4939:15;:43;;4892:90;4884:99;;;;;;5038:14;;;4996:11;:57;;-1:-1:-1;;;;;;4996:57:0;;;-1:-1:-1;;;;;5038:14:0;;4996:57;;;;5064:27;;;5038:14;5102:10;:14;;;5134:44;;;;;;;;;;;;;;;;4735:451::o;3246:42::-;;;-1:-1:-1;;;;;3246:42:0;;:::o;33750:673::-;16996:13;;-1:-1:-1;;;;;16996:13:0;16982:10;:27;16974:36;;;;;;-1:-1:-1;;;;;33861:24:0;;33847:11;33861:24;;;:10;:24;;;;;;;;;33916:18;;;:10;:18;;;;;;33955:17;;;33947:40;;;;;-1:-1:-1;;;33947:40:0;;;;;;;;;;;;-1:-1:-1;;;33947:40:0;;;;;;;;;;;;;;;34019:17;34004:11;;;;:32;;;;;;;;;34000:416;;;34077:15;34053:21;;;:39;34107:45;;-1:-1:-1;;34107:45:0;34121:31;34107:45;;;34174:41;;34208:6;;34196:10;;34174:41;;-1:-1:-1;;34174:41:0;34000:416;;;34252:29;34237:11;;;;:44;;;;;;;;;:65;;;;-1:-1:-1;34285:12:0;;-1:-1:-1;;;34285:12:0;;;;:17;34237:65;34233:183;;;34319:44;34336:4;34342:6;34350:12;34319:16;:44::i;35668:669::-;35748:10;35726:19;35783:23;;;:10;:23;;;;;;;;;35837:18;;;:10;:18;;;;;;35876:17;;;35868:40;;;;;-1:-1:-1;;;35868:40:0;;;;;;;;;;;;-1:-1:-1;;;35868:40:0;;;;;;;;;;;;;;;35942:29;35927:11;;;;:44;;;;;;;;;35919:67;;;;;-1:-1:-1;;;35919:67:0;;;;;;;;;;;;-1:-1:-1;;;35919:67:0;;;;;;;;;;;;;;;36016:11;;;36059:13;;36016:11;36087;;;36113:13;;;;36141:12;;;;36193:21;;;;36016:209;;;-1:-1:-1;;;36016:209:0;;-1:-1:-1;;;36059:13:0;;;;36016:209;;;;;;;;;;;;;;;;;;;;;;;;;:11;36168:10;;;-1:-1:-1;;;;;36168:10:0;36016:209;;;;;;;;;;;;;-1:-1:-1;;;;;;;36016:11:0;;;;:28;;:209;;;;;;;;;;;;;;:11;:209;;;5:2:-1;;;;30:1;27;20:12;5:2;36016:209:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36016:209:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;36016:209:0;36262:12;;36016:209;;-1:-1:-1;36238:91:0;;36262:12;;36254:6;;-1:-1:-1;;;36262:12:0;;;;36276:11;36289:27;36016:209;36238:9;:91::i;:::-;35668:669;;;;;:::o;10781:46::-;10820:7;10781:46;:::o;14621:159::-;14669:111;;;;;;;;;;;;;;;;;;14621:159;:::o;15504:26::-;;;;:::o;4404:251::-;1981:5;;-1:-1:-1;;;;;1981:5:0;1967:10;:19;1959:28;;;;;;4498:14;:39;;-1:-1:-1;;;;;4498:39:0;;-1:-1:-1;;;;;;4498:39:0;;;;;;;;4561:15;4548:10;:28;4594:53;;;;;;;;;;;;;;;;4404:251;:::o;34637:853::-;16996:13;;-1:-1:-1;;;;;16996:13:0;16982:10;:27;16974:36;;;;;;-1:-1:-1;;;;;34744:24:0;;34730:11;34744:24;;;:10;:24;;;;;;;;;34799:18;;;:10;:18;;;;;;34838:17;;;34830:40;;;;;-1:-1:-1;;;34830:40:0;;;;;;;;;;;;-1:-1:-1;;;34830:40:0;;;;;;;;;;;;;;;34904:31;34889:11;;;;:46;;;;;;;;;34881:69;;;;;-1:-1:-1;;;34881:69:0;;;;;;;;;;;;-1:-1:-1;;;34881:69:0;;;;;;;;;;;;;;;35106:11;;;35151:13;;35106:11;35179;;;35205:13;;;;35233:12;;;;35285:15;;;;35315:13;;;;;35343:21;;;;35106:269;;;-1:-1:-1;;;35106:269:0;;-1:-1:-1;;;35151:13:0;;;;35106:269;;;;;;;;;;;;;;;;;;;;;;;;;;;;:11;35260:10;;;-1:-1:-1;;;;;35260:10:0;35106:269;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;35106:11:0;;;;:30;;:269;;;;;;;;;;;;;;:11;:269;;;5:2:-1;;;;30:1;27;20:12;5:2;35106:269:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;35106:269:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;35106:269:0;35412:12;;35106:269;;-1:-1:-1;35388:94:0;;35412:12;;35404:6;;-1:-1:-1;;;35412:12:0;;;;35426;35440:29;35106:269;35388:9;:94::i;22375:272::-;1981:5;;-1:-1:-1;;;;;1981:5:0;1967:10;:19;1959:28;;;;;;22491:1;22479:9;-1:-1:-1;;;;;22479:13:0;;:39;;;;;22509:9;-1:-1:-1;;;;;22496:22:0;:9;-1:-1:-1;;;;;22496:22:0;;;22479:39;22471:48;;;;;;22530:8;:20;;-1:-1:-1;;22530:20:0;-1:-1:-1;;;;;22530:20:0;;;;;;;22561;;-1:-1:-1;;;22561:20:0;;;;;;;;;;;;;22597:42;;;22620:8;;;22597:42;;22630:8;;;;;;;22597:42;;;;;;;;;;;;;;;;;22375:272;;:::o;15433:27::-;;;-1:-1:-1;;;;;15433:27:0;;:::o;15351:28::-;;;-1:-1:-1;;;;;15351:28:0;;:::o;3374:26::-;;;;:::o;3655:41::-;3690:6;3655:41;:::o;1606:27::-;;;-1:-1:-1;;;;;1606:27:0;;:::o;15079:::-;;;;:::o;48165:667::-;48424:314;48452:8;48479:1;48499;48519;48539:8;48566:11;48596:9;48624:7;48650:16;48685:10;48714:13;;;;;;;;;-1:-1:-1;;;;;48714:13:0;48424:9;:314::i;:::-;48751:73;48766:10;48778:8;48788;48798:7;48807:16;48751:14;:73::i;:::-;48165:667;;;;;;;:::o;15802:23::-;;;-1:-1:-1;;;15802:23:0;;-1:-1:-1;;;;;15802:23:0;;:::o;22123:112::-;1981:5;;-1:-1:-1;;;;;1981:5:0;1967:10;:19;1959:28;;;;;;22199:12;:28;;-1:-1:-1;;;;;;22199:28:0;-1:-1:-1;;;;;22199:28:0;;;;;;;;;;22123:112::o;2541:169::-;1981:5;;-1:-1:-1;;;;;1981:5:0;1967:10;:19;1959:28;;;;;;2615:12;:24;;-1:-1:-1;;;;;;2615:24:0;-1:-1:-1;;;;;2615:24:0;;;;;;;;;-1:-1:-1;2685:5:0;;2655:47;;2615:24;;2685:5;;2655:47;;-1:-1:-1;2655:47:0;2541:169;:::o;15258:26::-;;;;:::o;19955:553::-;20073:15;20014:55;20046:22;;20014:27;;:31;;:55;;;;:::i;:::-;:74;;20006:83;;;;;;20175:15;20145:27;:45;20207:11;;20222:1;-1:-1:-1;20203:93:0;;20278:7;;20203:93;20308:15;20326:24;:11;;:22;:24::i;:::-;20377:1;20363:11;:15;20402:10;;20308:42;;-1:-1:-1;20402:26:0;;20308:42;20402:26;:14;:26;:::i;:::-;20389:10;:39;20447:17;;20475:12;;20441:59;;;-1:-1:-1;;;20441:59:0;;-1:-1:-1;;;;;20475:12:0;;;20441:59;;;;;;;;;;;;20447:17;;;;;20441:33;;:59;;;;;20447:17;;20441:59;;;;;;;20447:17;;20441:59;;;5:2:-1;;;;30:1;27;20:12;5:2;20441:59:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;19955:553:0;:::o;25206:911::-;25652:4;-1:-1:-1;;;;;25676:35:0;;;;25668:67;;;;;-1:-1:-1;;;25668:67:0;;;;;;;;;;;;-1:-1:-1;;;25668:67:0;;;;;;;;;;;;;;;25748:17;25768:233;25795:8;25822:9;25850:4;25873:6;25898:8;25925:11;25955:9;25983:7;25768:8;:233::i;:::-;25748:253;;26014:95;26039:9;26067:4;26090:8;26014:6;:95::i;50096:842::-;-1:-1:-1;;;;;50312:24:0;;;50298:11;50312:24;;;:10;:24;;;;;;;;;50367:18;;;:10;:18;;;;;50413:11;;:24;;-1:-1:-1;;;50413:24:0;;;;50312;;50367:18;;50298:11;50413;;;:22;;:24;;;;;50312;50413;;;;;:11;:24;;;5:2:-1;;;;30:1;27;20:12;5:2;50413:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;50413:24:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;50413:24:0;50464:10;;50413:24;;-1:-1:-1;50464:10:0;;;-1:-1:-1;;;;;50464:10:0;50495:17;;;50487:40;;;;;-1:-1:-1;;;50487:40:0;;;;;;;;;;;;-1:-1:-1;;;50487:40:0;;;;;;;;;;;;;;;50557:1;50546:8;:12;;;50538:36;;;;;-1:-1:-1;;;50538:36:0;;;;;;;;;;;;-1:-1:-1;;;50538:36:0;;;;;;;;;;;;;;;50663:8;50650:9;50649:10;;:22;;:48;;;;;50687:10;50675:8;:22;;50649:48;50641:72;;;;;-1:-1:-1;;;50641:72:0;;;;;;;;;;;;-1:-1:-1;;;50641:72:0;;;;;;;;;;;;;;;50747:17;50732:11;;;;:32;;;;;;;;;50724:55;;;;;-1:-1:-1;;;50724:55:0;;;;;;;;;;;;-1:-1:-1;;;50724:55:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;50799:33:0;;50827:4;50799:33;50792:41;;;;50846:84;50856:4;50862:6;50870:8;50880:12;50894:25;50921:8;50846:9;:84::i;:::-;50096:842;;;;;;;;;:::o;49193:483::-;49496:119;;;49455:4;49496:119;;;;;;;;;;;;;;;;-1:-1:-1;;49496:119:0;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;49496:119:0;;;;;;;49486:130;;;;;;;49654:13;;49629:39;;49486:130;;49642:10;;-1:-1:-1;;;;;49654:13:0;49629:6;:39::i;8631:141::-;8715:5;;;8738:6;;;;8731:14;;;;8631:141;;;;:::o;8160:123::-;8218:7;8250:1;8245;:6;;8238:14;;;;-1:-1:-1;8270:5:0;;;8160:123::o;12063:113::-;12112:4;12141:1;12136;:6;;12129:14;;;;-1:-1:-1;12166:1:0;12063:113::o;36998:1846::-;-1:-1:-1;;;;;37312:24:0;;;37298:11;37312:24;;;:10;:24;;;;;;;;;37367:18;;;:10;:18;;;;;37413:11;;:24;;-1:-1:-1;;;37413:24:0;;;;37312;;37367:18;;37298:11;37413;;;:22;;:24;;;;;37312;37413;;;;;:11;:24;;;5:2:-1;;;;30:1;27;20:12;5:2;37413:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37413:24:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37413:24:0;37464:10;;37413:24;;-1:-1:-1;37464:10:0;;;-1:-1:-1;;;;;37464:10:0;37495:17;;;37487:40;;;;;-1:-1:-1;;;37487:40:0;;;;;;;;;;;;-1:-1:-1;;;37487:40:0;;;;;;;;;;;;;;;37557:1;37546:8;:12;;;37538:36;;;;;-1:-1:-1;;;37538:36:0;;;;;;;;;;;;-1:-1:-1;;;37538:36:0;;;;;;;;;;;;;;;37603:27;;;;;;;;;;;;26:21:-1;;;22:32;;6:49;;37603:27:0;;;;;;37593:38;;;;;:51;;37585:76;;;;;-1:-1:-1;;;37585:76:0;;;;;;;;;;;;-1:-1:-1;;;37585:76:0;;;;;;;;;;;;;;;37694:8;37681:9;37680:10;;:22;;:48;;;;;37718:10;37706:8;:22;;37680:48;37672:72;;;;;-1:-1:-1;;;37672:72:0;;;;;;;;;;;;-1:-1:-1;;;37672:72:0;;;;;;;;;;;;;;;37801:11;;:47;;;-1:-1:-1;;;37801:47:0;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37801:11:0;;;;:22;;:47;;;;;;;;;;;;;;;:11;:47;;;5:2:-1;;;;30:1;27;20:12;5:2;37801:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;37801:47:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;37801:47:0;37793:67;;;;;-1:-1:-1;;;37793:67:0;;;;;;;;;;;;-1:-1:-1;;;37793:67:0;;;;;;;;;;;;;;;37930:1;37879:47;37907:18;:6;:16;:18::i;:::-;37879:23;:9;37893:8;37879:23;:13;:23;:::i;:::-;:27;:47;:27;:47;:::i;:::-;:52;;37871:79;;;;;-1:-1:-1;;;37871:79:0;;;;;;;;;;;;-1:-1:-1;;;37871:79:0;;;;;;;;;;;;;;;38020:31;38005:11;;;;:46;;;;;;;;;:74;;;;-1:-1:-1;38055:12:0;;:24;;;;-1:-1:-1;;;38055:12:0;;;;:24;38005:74;38001:836;;;38096:13;;;:25;;;38136:43;38096:4;38158:6;38166:12;38136:15;:43::i;:::-;38001:836;;;38216:17;38201:11;;;;:32;;;;;;;;;:128;;;-1:-1:-1;38270:31:0;38255:11;;;;:46;;;;;;;;;:73;;;;-1:-1:-1;38305:12:0;;:23;;;;-1:-1:-1;;;38305:12:0;;;;:23;38255:73;38197:640;;;38346:43;;38360:29;;38346:4;;-1:-1:-1;;38346:43:0;;38360:29;38346:43;;;;;38428:15;38404:4;:21;;:39;;;;38473:8;38458:4;:12;;;:23;;;;;;;;;;;;;;;;;;38512:9;38496:4;:13;;;:25;;;;;;;;;;;;;;;;;;38550:4;38536;:11;;:18;;;;38585:6;38569:4;:13;;:22;;;;38621:8;38606:4;:12;;:23;;;;38660:9;38644:4;:13;;:25;;;;38710:1;38702:10;;38684:4;:15;;:28;;;;38766:6;38754:10;-1:-1:-1;;;;;38734:39:0;;;;;;;;;;;38197:640;;;38806:19;;;-1:-1:-1;;;38806:19:0;;;;;;;;;;;;-1:-1:-1;;;38806:19:0;;;;;;;;;;;;;;39576:2007;-1:-1:-1;;;;;39952:24:0;;;39938:11;39952:24;;;:10;:24;;;;;;;;;40007:18;;;:10;:18;;;;;40053:11;;:24;;-1:-1:-1;;;40053:24:0;;;;39952;;40007:18;;39938:11;40053;;;:22;;:24;;;;;39952;40053;;;;;:11;:24;;;5:2:-1;;;;30:1;27;20:12;5:2;40053:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40053:24:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40053:24:0;40104:10;;40053:24;;-1:-1:-1;40104:10:0;;;-1:-1:-1;;;;;40104:10:0;40135:17;;;40127:40;;;;;-1:-1:-1;;;40127:40:0;;;;;;;;;;;;-1:-1:-1;;;40127:40:0;;;;;;;;;;;;;;;40197:1;40186:8;:12;;;40178:36;;;;;-1:-1:-1;;;40178:36:0;;;;;;;;;;;;-1:-1:-1;;;40178:36:0;;;;;;;;;;;;;;;40243:29;;;;;;;;;;;;26:21:-1;;;22:32;;6:49;;40243:29:0;;;;;;40233:40;;;;;:55;;40225:82;;;;;-1:-1:-1;;;40225:82:0;;;;;;;;;;;;-1:-1:-1;;;40225:82:0;;;;;;;;;;;;;;;40336:27;;;;;;;;;;;;26:21:-1;;;22:32;;6:49;;40336:27:0;;;;;;40326:38;;;;;:51;;40318:76;;;;;-1:-1:-1;;;40318:76:0;;;;;;;;;;;;-1:-1:-1;;;40318:76:0;;;;;;;;;;;;;;;40427:8;40414:9;40413:10;;:22;;:48;;;;;40451:10;40439:8;:22;;40413:48;40405:72;;;;;-1:-1:-1;;;40405:72:0;;;;;;;;;;;;-1:-1:-1;;;40405:72:0;;;;;;;;;;;;;;;40534:11;;;;;;;;;-1:-1:-1;;;;;40534:11:0;-1:-1:-1;;;;;40534:22:0;;40557:9;40568:4;40574:6;40534:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;40534:47:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;40534:47:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;40534:47:0;40526:67;;;;;-1:-1:-1;;;40526:67:0;;;;;;;;;;;;-1:-1:-1;;;40526:67:0;;;;;;;;;;;;;;;40663:1;40612:47;40640:18;:6;:16;:18::i;:::-;40612:23;:9;40626:8;40612:23;:13;:23;:::i;:47::-;:52;;40604:79;;;;;-1:-1:-1;;;40604:79:0;;;;;;;;;;;;-1:-1:-1;;;40604:79:0;;;;;;;;;;;;;;;40752:29;40737:11;;;;:44;;;;;;;;;:72;;;;;40801:8;40785:24;;:4;:12;;;;;;;;;;;;:24;;;40737:72;40733:843;;;40826:15;;;:29;;;40870:43;40826:4;40892:6;40900:12;40870:15;:43::i;:::-;40733:843;;;40950:17;40935:11;;;;:32;;;;;;;;;:126;;;-1:-1:-1;41004:29:0;40989:11;;;;:44;;;;;;;;;:71;;;;;41052:8;41037:23;;:4;:12;;;;;;;;;;;;:23;;;40989:71;40931:645;;;41078:45;;41092:31;;41078:4;;-1:-1:-1;;41078:45:0;;41092:31;41078:45;;;;;41162:15;41138:4;:21;;:39;;;;41207:8;41192:4;:12;;;:23;;;;;;;;;;;;;;;;;;41246:9;41230:4;:13;;;:25;;;;;;;;;;;;;;;;;;41284:4;41270;:11;;:18;;;;41319:6;41303:4;:13;;:22;;;;41355:8;41340:4;:12;;:23;;;;41396:11;41378:4;:15;;:29;;;;41438:9;41422:4;:13;;:25;;;;41505:6;41491:12;-1:-1:-1;;;;;41469:43:0;;;;;;;;;;;40931:645;39576:2007;;;;;;;;;;;;;;;:::o;41788:717::-;42208:11;;:29;;;-1:-1:-1;;;42208:29:0;;;;42190:14;;-1:-1:-1;;;;;42208:11:0;;:27;;:29;;;;;;;;;;;;;;:11;:29;;;5:2:-1;;;;30:1;27;20:12;5:2;42208:29:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42208:29:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42208:29:0;42312:11;;42207:30;;;;;-1:-1:-1;42312:11:0;;;-1:-1:-1;;;;;42312:11:0;;42351:6;;;42338:19;;42334:71;;;42388:5;42387:6;;42374:19;;42334:71;42415:82;42425:5;42432:7;42441:1;42444:12;42458:26;42486:10;22951:444;23173:31;;-1:-1:-1;;23173:31:0;;;23231:11;;:18;;23173:31;23231:15;:18::i;:::-;23217:11;:32;23283:11;;23262:43;;23269:12;;23283:11;;;-1:-1:-1;;;;;23283:11:0;23296:8;23262:6;:43::i;:::-;23350:7;23336:12;-1:-1:-1;;;;;23323:64:0;;23359:8;23369;23379:7;23323:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22951:444;;;;;;:::o;26830:699::-;27101:7;27126:15;14828:158;;;;;;;;;;;;;;;;;;;27154:230;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;27154:230:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;27154:230:0;;;;;27144:241;;;;;;27471:16;;-1:-1:-1;;;27415:105:0;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;27415:105:0;;;;;;;27405:116;;;;;;26830:699::o;26361:330::-;26512:9;26523;26534:7;26545:20;26560:4;26545:14;:20::i;:::-;26511:54;;;;;;26576:22;26601:25;26611:5;26618:1;26621;26624;26601:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26601:25:0;;;;;;;;26576:50;;26663:8;-1:-1:-1;;;;;26645:26:0;:14;-1:-1:-1;;;;;26645:26:0;;26637:46;;;;;-1:-1:-1;;;26637:46:0;;;;;;;;;;;;-1:-1:-1;;;26637:46:0;;;;;;;;;;;;;;11881:119;11930:3;-1:-1:-1;;;11953:1:0;:14;11946:22;;;8855:175;8911:6;8941:5;;;8965:6;;;;;;:16;;;8980:1;8975;:6;;8965:16;8964:38;;;;8991:1;8987;:5;:14;;;;;9000:1;8996;:5;8987:14;8957:46;;;;9021:1;8855:175;-1:-1:-1;;;8855:175:0:o;8371:::-;8427:6;8457:5;;;8481:6;;;;;;:16;;;8496:1;8491;:6;;8481:16;8480:38;;;;8507:1;8503;:5;:14;;;;;8516:1;8512;:5;8473:46;;;42690:469;42807:11;;;42849:14;;42807:11;42878:12;;;42905:14;;;;42934:13;;;;42988:16;;;;43019:14;;;;;42807:237;;;-1:-1:-1;;;42807:237:0;;-1:-1:-1;;;42849:14:0;;;;42807:237;;;;;;;;;;;;;;;;;;;;;;;;;;;;:11;42962;;;-1:-1:-1;;;;;42962:11:0;42807:237;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;42807:11:0;;;;:27;;:237;;;;;;;;;;;;;;:11;:237;;;5:2:-1;;;;30:1;27;20:12;5:2;42807:237:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42807:237:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;42807:237:0;43083:13;;42807:237;;-1:-1:-1;43057:94:0;;43083:13;;43074:7;;-1:-1:-1;;;43083:13:0;;;;43098:12;43112:26;42807:237;43057:9;:94::i;23600:867::-;23688:12;23703:6;-1:-1:-1;;;;;23688:21:0;;;23720:17;23740:22;:10;;:20;:22::i;:::-;23720:42;;23794:11;;;;;;;;;-1:-1:-1;;;;;23794:11:0;-1:-1:-1;;;;;23794:22:0;;:24;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23794:24:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23794:24:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23794:24:0;23782:36;;;23775:44;;;;23865:1;23838:22;:8;23851;23838:22;:12;:22;:::i;:::-;23837:29;;23830:37;;;;23895:1;23884:8;:12;:40;;;;;23916:8;23900:13;:24;23884:40;23880:204;;;24059:13;24048:24;;23880:204;24110:11;;:25;;24126:8;24110:25;:15;:25;:::i;:::-;24096:11;:39;24148:17;24168:27;:13;24186:8;24168:27;:17;:27;:::i;:::-;24148:47;;24219:26;:13;:24;:26::i;:::-;24206:10;:39;24258:14;24275:35;:22;:8;24288;24275:22;:12;:22;:::i;:::-;:33;:35::i;:::-;-1:-1:-1;;;;;24321:28:0;;;;;;:14;:28;;;;;:41;;;;;;;;24258:52;;-1:-1:-1;24377:32:0;24373:87;;24426:22;24435:12;24426:8;:22::i;27739:433::-;27837:9;27848;27859:7;27892:10;:17;27913:2;27892:23;27884:43;;;;;-1:-1:-1;;;27884:43:0;;;;;;;;;;;;-1:-1:-1;;;27884:43:0;;;;;;;;;;;;;;;-1:-1:-1;;;27991:2:0;27975:19;;27969:26;28036:2;28020:19;;28014:26;28085:2;28069:19;;28063:26;28091:4;28059:37;28125:1;28121:5;;28117:48;;;28151:2;28147:6;28117:48;27739:433;;;;;:::o;24608:378::-;-1:-1:-1;;;;;24683:24:0;;24664:16;24683:24;;;:14;:24;;;;;;24725:15;24718:23;;;;-1:-1:-1;;;;;24754:24:0;;;24781:1;24754:24;;;:14;:24;;;;;;:28;;;24801:17;;24795:56;;-1:-1:-1;;;24795:56:0;;;;;;;;;;;;;;;;;24801:17;;;24795:33;;:56;;;;;24781:1;24795:56;;;;;;24781:1;24801:17;24795:56;;;5:2:-1;;;;30:1;27;20:12
Swarm Source
bzzr://3c6923dfa52cb5447c4679690d20ae4c36d324b5d79687182c0b56dd20d1aa48
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.