Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Sponsored
Latest 25 from a total of 33 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Execute | 17061685 | 160 days 20 hrs ago | IN | 0 ETH | 0.00322581 | ||||
Queue | 17053462 | 162 days 24 mins ago | IN | 0 ETH | 0.00457962 | ||||
Cast Vote | 17038423 | 164 days 4 hrs ago | IN | 0 ETH | 0.00372774 | ||||
Propose | 17023520 | 166 days 8 hrs ago | IN | 0 ETH | 0.01302925 | ||||
Execute | 16828660 | 193 days 19 hrs ago | IN | 0 ETH | 0.00751844 | ||||
Queue | 16821623 | 194 days 19 hrs ago | IN | 0 ETH | 0.01120765 | ||||
Cast Vote | 16812881 | 196 days 51 mins ago | IN | 0 ETH | 0.00231974 | ||||
Cast Vote | 16812365 | 196 days 2 hrs ago | IN | 0 ETH | 0.0023802 | ||||
Propose | 16791526 | 199 days 1 hr ago | IN | 0 ETH | 0.0428 | ||||
Execute | 16125763 | 292 days 3 hrs ago | IN | 0 ETH | 0.00367172 | ||||
Queue | 16117531 | 293 days 7 hrs ago | IN | 0 ETH | 0.00472659 | ||||
Cast Vote | 16114780 | 293 days 16 hrs ago | IN | 0 ETH | 0.00152838 | ||||
Cast Vote | 16113835 | 293 days 19 hrs ago | IN | 0 ETH | 0.00134798 | ||||
Cast Vote | 16112546 | 294 days 18 mins ago | IN | 0 ETH | 0.00069847 | ||||
Cast Vote | 16108908 | 294 days 12 hrs ago | IN | 0 ETH | 0.00123565 | ||||
Cast Vote | 16108899 | 294 days 12 hrs ago | IN | 0 ETH | 0.00123565 | ||||
Cast Vote | 16108892 | 294 days 12 hrs ago | IN | 0 ETH | 0.00146031 | ||||
Cast Vote | 16107820 | 294 days 16 hrs ago | IN | 0 ETH | 0.00134798 | ||||
Cast Vote | 16106668 | 294 days 20 hrs ago | IN | 0 ETH | 0.00134798 | ||||
Cast Vote | 16106488 | 294 days 20 hrs ago | IN | 0 ETH | 0.00134798 | ||||
Cast Vote | 16106165 | 294 days 21 hrs ago | IN | 0 ETH | 0.00123565 | ||||
Cast Vote | 16105116 | 295 days 1 hr ago | IN | 0 ETH | 0.00134798 | ||||
Cast Vote | 16104654 | 295 days 2 hrs ago | IN | 0 ETH | 0.00122535 | ||||
Cast Vote | 16104633 | 295 days 2 hrs ago | IN | 0 ETH | 0.00146031 | ||||
Cast Vote | 16104136 | 295 days 4 hrs ago | IN | 0 ETH | 0.00132398 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
Governance
Compiler Version
v0.7.6+commit.7338295f
Optimization Enabled:
Yes with 9999 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: Apache-2.0 pragma solidity 0.7.6; pragma experimental ABIEncoderV2; import "./interfaces/IComitium.sol"; import "./Queue.sol"; import "@openzeppelin/contracts/math/SafeMath.sol"; contract Governance is Queue { using SafeMath for uint256; enum ProposalState { WarmUp, Active, Canceled, Failed, Accepted, Queued, Grace, Expired, Executed, Abrogated } struct Receipt { // Whether or not a vote has been cast bool hasVoted; // support bool support; // The number of votes the voter had, which were cast uint256 votes; } struct AbrogationProposal { address creator; uint256 createTime; string description; uint256 forVotes; uint256 againstVotes; mapping(address => Receipt) receipts; } struct ProposalParameters { uint256 warmUpDuration; uint256 activeDuration; uint256 queueDuration; uint256 gracePeriodDuration; uint256 acceptanceThreshold; uint256 minQuorum; } struct Proposal { // proposal identifiers // unique id uint256 id; // Creator of the proposal address proposer; // proposal description string description; string title; // proposal technical details // ordered list of target addresses to be made address[] targets; // The ordered list of values (i.e. msg.value) to be passed to the calls to be made uint256[] values; // The ordered list of function signatures to be called string[] signatures; // The ordered list of calldata to be passed to each call bytes[] calldatas; // proposal creation time - 1 uint256 createTime; // votes status // The timestamp that the proposal will be available for execution, set once the vote succeeds uint256 eta; // Current number of votes in favor of this proposal uint256 forVotes; // Current number of votes in opposition to this proposal uint256 againstVotes; bool canceled; bool executed; // Receipts of ballots for the entire set of voters mapping(address => Receipt) receipts; ProposalParameters parameters; } uint256 public lastProposalId; mapping(uint256 => Proposal) public proposals; mapping(uint256 => AbrogationProposal) public abrogationProposals; mapping(address => uint256) public latestProposalIds; IComitium comitium; bool isInitialized; bool public isActive; event ProposalCreated(uint256 indexed proposalId); event Vote(uint256 indexed proposalId, address indexed user, bool support, uint256 power); event VoteCanceled(uint256 indexed proposalId, address indexed user); event ProposalQueued(uint256 indexed proposalId, address caller, uint256 eta); event ProposalExecuted(uint256 indexed proposalId, address caller); event ProposalCanceled(uint256 indexed proposalId, address caller); event AbrogationProposalStarted(uint256 indexed proposalId, address caller); event AbrogationProposalExecuted(uint256 indexed proposalId, address caller); event AbrogationProposalVote(uint256 indexed proposalId, address indexed user, bool support, uint256 power); event AbrogationProposalVoteCancelled(uint256 indexed proposalId, address indexed user); receive() external payable {} // executed only once function initialize(address _comitium) public { require(isInitialized == false, "Contract already initialized."); require(_comitium != address(0), "comitium must not be 0x0"); comitium = IComitium(_comitium); isInitialized = true; } function activate() public { require(!isActive, "DAO already active"); require(comitium.fdtStaked() >= ACTIVATION_THRESHOLD, "Threshold not met yet"); isActive = true; } function propose( address[] memory targets, uint256[] memory values, string[] memory signatures, bytes[] memory calldatas, string memory description, string memory title ) public returns (uint256) { if (!isActive) { require(comitium.fdtStaked() >= ACTIVATION_THRESHOLD, "DAO not yet active"); isActive = true; } require( comitium.votingPowerAtTs(msg.sender, block.timestamp - 1) >= _getCreationThreshold(), "Creation threshold not met" ); require( targets.length == values.length && targets.length == signatures.length && targets.length == calldatas.length, "Proposal function information parity mismatch" ); require(targets.length != 0, "Must provide actions"); require(targets.length <= PROPOSAL_MAX_ACTIONS, "Too many actions on a vote"); require(bytes(title).length > 0, "title can't be empty"); require(bytes(description).length > 0, "description can't be empty"); // check if user has another running vote uint256 previousProposalId = latestProposalIds[msg.sender]; if (previousProposalId != 0) { require(_isLiveState(previousProposalId) == false, "One live proposal per proposer"); } uint256 newProposalId = lastProposalId + 1; Proposal storage newProposal = proposals[newProposalId]; newProposal.id = newProposalId; newProposal.proposer = msg.sender; newProposal.description = description; newProposal.title = title; newProposal.targets = targets; newProposal.values = values; newProposal.signatures = signatures; newProposal.calldatas = calldatas; newProposal.createTime = block.timestamp - 1; newProposal.parameters.warmUpDuration = warmUpDuration; newProposal.parameters.activeDuration = activeDuration; newProposal.parameters.queueDuration = queueDuration; newProposal.parameters.gracePeriodDuration = gracePeriodDuration; newProposal.parameters.acceptanceThreshold = acceptanceThreshold; newProposal.parameters.minQuorum = minQuorum; lastProposalId = newProposalId; latestProposalIds[msg.sender] = newProposalId; emit ProposalCreated(newProposalId); return newProposalId; } function queue(uint256 proposalId) public { require(state(proposalId) == ProposalState.Accepted, "Proposal can only be queued if it is succeeded"); Proposal storage proposal = proposals[proposalId]; uint256 eta = proposal.createTime + proposal.parameters.warmUpDuration + proposal.parameters.activeDuration + proposal.parameters.queueDuration; proposal.eta = eta; uint256 proposalTargetsLength = proposal.targets.length; for (uint256 i = 0; i < proposalTargetsLength; i++) { address target = proposal.targets[i]; uint256 value = proposal.values[i]; string memory signature = proposal.signatures[i]; bytes memory data = proposal.calldatas[i]; require( !queuedTransactions[_getTxHash(target, value, signature, data, eta)], "proposal action already queued at eta" ); queueTransaction(target, value, signature, data, eta); } emit ProposalQueued(proposalId, msg.sender, eta); } function execute(uint256 proposalId) public payable { require(state(proposalId) == ProposalState.Grace, "Cannot be executed"); Proposal storage proposal = proposals[proposalId]; proposal.executed = true; uint256 proposalTargetsLength = proposal.targets.length; for (uint256 i = 0; i < proposalTargetsLength; i++) { executeTransaction(proposal.targets[i], proposal.values[i], proposal.signatures[i], proposal.calldatas[i], proposal.eta); } emit ProposalExecuted(proposalId, msg.sender); } function cancelProposal(uint256 proposalId) public { require(_isCancellableState(proposalId), "Proposal in state that does not allow cancellation"); require(_canCancelProposal(proposalId), "Cancellation requirements not met"); Proposal storage proposal = proposals[proposalId]; proposal.canceled = true; uint256 proposalTargetsLength = proposal.targets.length; for (uint256 i = 0; i < proposalTargetsLength; i++) { cancelTransaction(proposal.targets[i], proposal.values[i], proposal.signatures[i], proposal.calldatas[i], proposal.eta); } emit ProposalCanceled(proposalId, msg.sender); } function castVote(uint256 proposalId, bool support) public { require(state(proposalId) == ProposalState.Active, "Voting is closed"); Proposal storage proposal = proposals[proposalId]; Receipt storage receipt = proposal.receipts[msg.sender]; // exit if user already voted require(receipt.hasVoted == false || receipt.hasVoted && receipt.support != support, "Already voted this option"); uint256 votes = comitium.votingPowerAtTs(msg.sender, _getSnapshotTimestamp(proposal)); require(votes > 0, "no voting power"); // means it changed its vote if (receipt.hasVoted) { if (receipt.support) { proposal.forVotes = proposal.forVotes.sub(receipt.votes); } else { proposal.againstVotes = proposal.againstVotes.sub(receipt.votes); } } if (support) { proposal.forVotes = proposal.forVotes.add(votes); } else { proposal.againstVotes = proposal.againstVotes.add(votes); } receipt.hasVoted = true; receipt.votes = votes; receipt.support = support; emit Vote(proposalId, msg.sender, support, votes); } function cancelVote(uint256 proposalId) public { require(state(proposalId) == ProposalState.Active, "Voting is closed"); Proposal storage proposal = proposals[proposalId]; Receipt storage receipt = proposal.receipts[msg.sender]; uint256 votes = comitium.votingPowerAtTs(msg.sender, _getSnapshotTimestamp(proposal)); require(receipt.hasVoted, "Cannot cancel if not voted yet"); if (receipt.support) { proposal.forVotes = proposal.forVotes.sub(votes); } else { proposal.againstVotes = proposal.againstVotes.sub(votes); } receipt.hasVoted = false; receipt.votes = 0; receipt.support = false; emit VoteCanceled(proposalId, msg.sender); } // ====================================================================================================== // Abrogation proposal methods // ====================================================================================================== // the Abrogation Proposal is a mechanism for the DAO participants to veto the execution of a proposal that was already // accepted and it is currently queued. For the Abrogation Proposal to pass, 50% + 1 of the vFDT holders // must vote FOR the Abrogation Proposal function startAbrogationProposal(uint256 proposalId, string memory description) public { require(state(proposalId) == ProposalState.Queued, "Proposal must be in queue"); require( comitium.votingPowerAtTs(msg.sender, block.timestamp - 1) >= _getCreationThreshold(), "Creation threshold not met" ); AbrogationProposal storage ap = abrogationProposals[proposalId]; require(ap.createTime == 0, "Abrogation proposal already exists"); require(bytes(description).length > 0, "description can't be empty"); ap.createTime = block.timestamp; ap.creator = msg.sender; ap.description = description; emit AbrogationProposalStarted(proposalId, msg.sender); } // abrogateProposal cancels a proposal if there's an Abrogation Proposal that passed function abrogateProposal(uint256 proposalId) public { require(state(proposalId) == ProposalState.Abrogated, "Cannot be abrogated"); Proposal storage proposal = proposals[proposalId]; require(proposal.canceled == false, "Cannot be abrogated"); proposal.canceled = true; uint256 proposalTargetsLength = proposal.targets.length; for (uint256 i = 0; i < proposalTargetsLength; i++) { cancelTransaction(proposal.targets[i], proposal.values[i], proposal.signatures[i], proposal.calldatas[i], proposal.eta); } emit AbrogationProposalExecuted(proposalId, msg.sender); } function abrogationProposal_castVote(uint256 proposalId, bool support) public { require(0 < proposalId && proposalId <= lastProposalId, "invalid proposal id"); AbrogationProposal storage abrogationProposal = abrogationProposals[proposalId]; require( state(proposalId) == ProposalState.Queued && abrogationProposal.createTime != 0, "Abrogation Proposal not active" ); Receipt storage receipt = abrogationProposal.receipts[msg.sender]; require( receipt.hasVoted == false || receipt.hasVoted && receipt.support != support, "Already voted this option" ); uint256 votes = comitium.votingPowerAtTs(msg.sender, abrogationProposal.createTime - 1); require(votes > 0, "no voting power"); // means it changed its vote if (receipt.hasVoted) { if (receipt.support) { abrogationProposal.forVotes = abrogationProposal.forVotes.sub(receipt.votes); } else { abrogationProposal.againstVotes = abrogationProposal.againstVotes.sub(receipt.votes); } } if (support) { abrogationProposal.forVotes = abrogationProposal.forVotes.add(votes); } else { abrogationProposal.againstVotes = abrogationProposal.againstVotes.add(votes); } receipt.hasVoted = true; receipt.votes = votes; receipt.support = support; emit AbrogationProposalVote(proposalId, msg.sender, support, votes); } function abrogationProposal_cancelVote(uint256 proposalId) public { require(0 < proposalId && proposalId <= lastProposalId, "invalid proposal id"); AbrogationProposal storage abrogationProposal = abrogationProposals[proposalId]; Receipt storage receipt = abrogationProposal.receipts[msg.sender]; require( state(proposalId) == ProposalState.Queued && abrogationProposal.createTime != 0, "Abrogation Proposal not active" ); uint256 votes = comitium.votingPowerAtTs(msg.sender, abrogationProposal.createTime - 1); require(receipt.hasVoted, "Cannot cancel if not voted yet"); if (receipt.support) { abrogationProposal.forVotes = abrogationProposal.forVotes.sub(votes); } else { abrogationProposal.againstVotes = abrogationProposal.againstVotes.sub(votes); } receipt.hasVoted = false; receipt.votes = 0; receipt.support = false; emit AbrogationProposalVoteCancelled(proposalId, msg.sender); } // ====================================================================================================== // views // ====================================================================================================== function state(uint256 proposalId) public view returns (ProposalState) { require(0 < proposalId && proposalId <= lastProposalId, "invalid proposal id"); Proposal storage proposal = proposals[proposalId]; if (proposal.canceled) { return ProposalState.Canceled; } if (proposal.executed) { return ProposalState.Executed; } uint256 createTimeCache = proposal.createTime; uint256 warmUpDurationCache = proposal.parameters.warmUpDuration; if (block.timestamp <= createTimeCache + warmUpDurationCache) { return ProposalState.WarmUp; } if (block.timestamp <= createTimeCache + warmUpDurationCache + proposal.parameters.activeDuration) { return ProposalState.Active; } uint256 forVotesCache = proposal.forVotes; uint256 minForVotesCache = (forVotesCache + proposal.againstVotes).mul(proposal.parameters.acceptanceThreshold).div(100); if ((forVotesCache + proposal.againstVotes) < _getQuorum(proposal) || (forVotesCache < minForVotesCache)) { return ProposalState.Failed; } uint256 etaCache = proposal.eta; if (etaCache == 0) { return ProposalState.Accepted; } if (block.timestamp < etaCache) { return ProposalState.Queued; } if (_proposalAbrogated(proposalId)) { return ProposalState.Abrogated; } if (block.timestamp <= etaCache + proposal.parameters.gracePeriodDuration) { return ProposalState.Grace; } return ProposalState.Expired; } function getReceipt(uint256 proposalId, address voter) public view returns (Receipt memory) { return proposals[proposalId].receipts[voter]; } function getProposalParameters(uint256 proposalId) public view returns (ProposalParameters memory) { return proposals[proposalId].parameters; } function getAbrogationProposalReceipt(uint256 proposalId, address voter) public view returns (Receipt memory) { return abrogationProposals[proposalId].receipts[voter]; } function getActions(uint256 proposalId) public view returns ( address[] memory targets, uint256[] memory values, string[] memory signatures, bytes[] memory calldatas ) { Proposal storage p = proposals[proposalId]; return (p.targets, p.values, p.signatures, p.calldatas); } function getProposalQuorum(uint256 proposalId) public view returns (uint256) { require(0 < proposalId && proposalId <= lastProposalId, "invalid proposal id"); return _getQuorum(proposals[proposalId]); } // ====================================================================================================== // internal methods // ====================================================================================================== function _canCancelProposal(uint256 proposalId) internal view returns (bool){ Proposal storage proposal = proposals[proposalId]; if (msg.sender == proposal.proposer || comitium.votingPower(proposal.proposer) < _getCreationThreshold() ) { return true; } return false; } function _isCancellableState(uint256 proposalId) internal view returns (bool) { ProposalState s = state(proposalId); return s == ProposalState.WarmUp || s == ProposalState.Active; } function _isLiveState(uint256 proposalId) internal view returns (bool) { ProposalState s = state(proposalId); return s == ProposalState.WarmUp || s == ProposalState.Active || s == ProposalState.Accepted || s == ProposalState.Queued || s == ProposalState.Grace; } function _getCreationThreshold() internal view returns (uint256) { return comitium.fdtStaked().div(100); } // Returns the timestamp of the snapshot for a given proposal // If the current block's timestamp is equal to `proposal.createTime + warmUpDuration` then the state function // will return WarmUp as state which will prevent any vote to be cast which will gracefully avoid any flashloan attack function _getSnapshotTimestamp(Proposal storage proposal) internal view returns (uint256) { return proposal.createTime + proposal.parameters.warmUpDuration; } function _getQuorum(Proposal storage proposal) internal view returns (uint256) { return comitium.fdtStakedAtTs(_getSnapshotTimestamp(proposal)).mul(proposal.parameters.minQuorum).div(100); } function _proposalAbrogated(uint256 proposalId) internal view returns (bool) { Proposal storage p = proposals[proposalId]; AbrogationProposal storage cp = abrogationProposals[proposalId]; if (cp.createTime == 0 || block.timestamp < p.eta) { return false; } return cp.forVotes >= comitium.fdtStakedAtTs(cp.createTime - 1).div(2); } }
// SPDX-License-Identifier: Apache-2.0 pragma solidity 0.7.6; pragma experimental ABIEncoderV2; interface IComitium { struct Stake { uint256 timestamp; uint256 amount; uint256 expiryTimestamp; address delegatedTo; } // deposit allows a user to add more FDT to his staked balance function deposit(uint256 amount) external; // withdraw allows a user to withdraw funds if the balance is not locked function withdraw(uint256 amount) external; // lock a user's currently staked balance until timestamp & add the bonus to his voting power function lock(uint256 timestamp) external; // delegate allows a user to delegate his voting power to another user function delegate(address to) external; // stopDelegate allows a user to take back the delegated voting power function stopDelegate() external; // balanceOf returns the current FDT balance of a user (bonus not included) function balanceOf(address user) external view returns (uint256); // balanceAtTs returns the amount of FDT that the user currently staked (bonus NOT included) function balanceAtTs(address user, uint256 timestamp) external view returns (uint256); // stakeAtTs returns the Stake object of the user that was valid at `timestamp` function stakeAtTs(address user, uint256 timestamp) external view returns (Stake memory); // votingPower returns the voting power (bonus included) + delegated voting power for a user at the current block function votingPower(address user) external view returns (uint256); // votingPowerAtTs returns the voting power (bonus included) + delegated voting power for a user at a point in time function votingPowerAtTs(address user, uint256 timestamp) external view returns (uint256); // fdtStaked returns the total raw amount of FDT staked at the current block function fdtStaked() external view returns (uint256); // fdtStakedAtTs returns the total raw amount of FDT users have deposited into the contract // it does not include any bonus function fdtStakedAtTs(uint256 timestamp) external view returns (uint256); // delegatedPower returns the total voting power that a user received from other users function delegatedPower(address user) external view returns (uint256); // delegatedPowerAtTs returns the total voting power that a user received from other users at a point in time function delegatedPowerAtTs(address user, uint256 timestamp) external view returns (uint256); // multiplierAtTs calculates the multiplier at a given timestamp based on the user's stake a the given timestamp // it includes the decay mechanism function multiplierAtTs(address user, uint256 timestamp) external view returns (uint256); // userLockedUntil returns the timestamp until the user's balance is locked function userLockedUntil(address user) external view returns (uint256); // userDidDelegate returns the address to which a user delegated their voting power; address(0) if not delegated function userDelegatedTo(address user) external view returns (address); }
// SPDX-License-Identifier: Apache-2.0 pragma solidity 0.7.6; import "./Parameters.sol"; abstract contract Queue is Parameters { mapping(bytes32 => bool) public queuedTransactions; function queueTransaction(address target, uint256 value, string memory signature, bytes memory data, uint256 eta) internal returns (bytes32) { bytes32 txHash = _getTxHash(target, value, signature, data, eta); queuedTransactions[txHash] = true; return txHash; } function cancelTransaction(address target, uint256 value, string memory signature, bytes memory data, uint256 eta) internal { bytes32 txHash = _getTxHash(target, value, signature, data, eta); queuedTransactions[txHash] = false; } function executeTransaction(address target, uint256 value, string memory signature, bytes memory data, uint256 eta) internal returns (bytes memory) { bytes32 txHash = _getTxHash(target, value, signature, data, eta); require(block.timestamp >= eta, "executeTransaction: Transaction hasn't surpassed time lock."); require(block.timestamp <= eta + gracePeriodDuration, "executeTransaction: Transaction is stale."); queuedTransactions[txHash] = false; bytes memory callData; if (bytes(signature).length == 0) { callData = data; } else { callData = abi.encodePacked(bytes4(keccak256(bytes(signature))), data); } // solium-disable-next-line security/no-call-value (bool success, bytes memory returnData) = target.call{value : value}(callData); require(success, string(returnData)); return returnData; } function _getTxHash(address target, uint256 value, string memory signature, bytes memory data, uint256 eta) internal returns (bytes32) { return keccak256(abi.encode(target, value, signature, data, eta)); } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b > a) return (false, 0); return (true, a - b); } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a / b); } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a % b); } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) return 0; uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: division by zero"); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: modulo by zero"); return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); return a - b; } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a % b; } }
// SPDX-License-Identifier: Apache-2.0 pragma solidity 0.7.6; abstract contract Parameters { uint256 public warmUpDuration = 2 days; uint256 public activeDuration = 2 days; uint256 public queueDuration = 1 days; uint256 public gracePeriodDuration = 4 days; uint256 public acceptanceThreshold = 60; uint256 public minQuorum = 40; uint256 constant ACTIVATION_THRESHOLD = 20_000_000 * 10**18; uint256 constant PROPOSAL_MAX_ACTIONS = 10; modifier onlyDAO() { require(msg.sender == address(this), "Only DAO can call"); _; } function setWarmUpDuration(uint256 period) public onlyDAO { warmUpDuration = period; } function setActiveDuration(uint256 period) public onlyDAO { require(period >= 4 hours, "period must be > 0"); activeDuration = period; } function setQueueDuration(uint256 period) public onlyDAO { queueDuration = period; } function setGracePeriodDuration(uint256 period) public onlyDAO { require(period >= 4 hours, "period must be > 0"); gracePeriodDuration = period; } function setAcceptanceThreshold(uint256 threshold) public onlyDAO { require(threshold <= 100, "Maximum is 100."); require(threshold > 50, "Minimum is 50."); acceptanceThreshold = threshold; } function setMinQuorum(uint256 quorum) public onlyDAO { require(quorum > 5, "quorum must be greater than 5"); require(quorum <= 100, "Maximum is 100."); minQuorum = quorum; } }
{ "optimizer": { "enabled": true, "runs": 9999 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"address","name":"caller","type":"address"}],"name":"AbrogationProposalExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"address","name":"caller","type":"address"}],"name":"AbrogationProposalStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"bool","name":"support","type":"bool"},{"indexed":false,"internalType":"uint256","name":"power","type":"uint256"}],"name":"AbrogationProposalVote","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":true,"internalType":"address","name":"user","type":"address"}],"name":"AbrogationProposalVoteCancelled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"address","name":"caller","type":"address"}],"name":"ProposalCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"ProposalCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"address","name":"caller","type":"address"}],"name":"ProposalExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":false,"internalType":"address","name":"caller","type":"address"},{"indexed":false,"internalType":"uint256","name":"eta","type":"uint256"}],"name":"ProposalQueued","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"bool","name":"support","type":"bool"},{"indexed":false,"internalType":"uint256","name":"power","type":"uint256"}],"name":"Vote","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"proposalId","type":"uint256"},{"indexed":true,"internalType":"address","name":"user","type":"address"}],"name":"VoteCanceled","type":"event"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"abrogateProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"abrogationProposal_cancelVote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"bool","name":"support","type":"bool"}],"name":"abrogationProposal_castVote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"abrogationProposals","outputs":[{"internalType":"address","name":"creator","type":"address"},{"internalType":"uint256","name":"createTime","type":"uint256"},{"internalType":"string","name":"description","type":"string"},{"internalType":"uint256","name":"forVotes","type":"uint256"},{"internalType":"uint256","name":"againstVotes","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptanceThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"activate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"activeDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"cancelProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"cancelVote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"bool","name":"support","type":"bool"}],"name":"castVote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"execute","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"address","name":"voter","type":"address"}],"name":"getAbrogationProposalReceipt","outputs":[{"components":[{"internalType":"bool","name":"hasVoted","type":"bool"},{"internalType":"bool","name":"support","type":"bool"},{"internalType":"uint256","name":"votes","type":"uint256"}],"internalType":"struct Governance.Receipt","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"getActions","outputs":[{"internalType":"address[]","name":"targets","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"string[]","name":"signatures","type":"string[]"},{"internalType":"bytes[]","name":"calldatas","type":"bytes[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"getProposalParameters","outputs":[{"components":[{"internalType":"uint256","name":"warmUpDuration","type":"uint256"},{"internalType":"uint256","name":"activeDuration","type":"uint256"},{"internalType":"uint256","name":"queueDuration","type":"uint256"},{"internalType":"uint256","name":"gracePeriodDuration","type":"uint256"},{"internalType":"uint256","name":"acceptanceThreshold","type":"uint256"},{"internalType":"uint256","name":"minQuorum","type":"uint256"}],"internalType":"struct Governance.ProposalParameters","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"getProposalQuorum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"address","name":"voter","type":"address"}],"name":"getReceipt","outputs":[{"components":[{"internalType":"bool","name":"hasVoted","type":"bool"},{"internalType":"bool","name":"support","type":"bool"},{"internalType":"uint256","name":"votes","type":"uint256"}],"internalType":"struct Governance.Receipt","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gracePeriodDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_comitium","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastProposalId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"latestProposalIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minQuorum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"proposals","outputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"proposer","type":"address"},{"internalType":"string","name":"description","type":"string"},{"internalType":"string","name":"title","type":"string"},{"internalType":"uint256","name":"createTime","type":"uint256"},{"internalType":"uint256","name":"eta","type":"uint256"},{"internalType":"uint256","name":"forVotes","type":"uint256"},{"internalType":"uint256","name":"againstVotes","type":"uint256"},{"internalType":"bool","name":"canceled","type":"bool"},{"internalType":"bool","name":"executed","type":"bool"},{"components":[{"internalType":"uint256","name":"warmUpDuration","type":"uint256"},{"internalType":"uint256","name":"activeDuration","type":"uint256"},{"internalType":"uint256","name":"queueDuration","type":"uint256"},{"internalType":"uint256","name":"gracePeriodDuration","type":"uint256"},{"internalType":"uint256","name":"acceptanceThreshold","type":"uint256"},{"internalType":"uint256","name":"minQuorum","type":"uint256"}],"internalType":"struct Governance.ProposalParameters","name":"parameters","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"targets","type":"address[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"string[]","name":"signatures","type":"string[]"},{"internalType":"bytes[]","name":"calldatas","type":"bytes[]"},{"internalType":"string","name":"description","type":"string"},{"internalType":"string","name":"title","type":"string"}],"name":"propose","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"queue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"queueDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"queuedTransactions","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"threshold","type":"uint256"}],"name":"setAcceptanceThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"period","type":"uint256"}],"name":"setActiveDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"period","type":"uint256"}],"name":"setGracePeriodDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quorum","type":"uint256"}],"name":"setMinQuorum","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"period","type":"uint256"}],"name":"setQueueDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"period","type":"uint256"}],"name":"setWarmUpDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"},{"internalType":"string","name":"description","type":"string"}],"name":"startAbrogationProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalId","type":"uint256"}],"name":"state","outputs":[{"internalType":"enum Governance.ProposalState","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"warmUpDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040526202a3006000556202a3006001556201518060025562054600600355603c600455602860055534801561003657600080fd5b5061486e806100466000396000f3fe6080604052600436106102535760003560e01c80635f2e9f6011610138578063c4d66de8116100b0578063e0a8f6f51161007f578063e4e2d26111610064578063e4e2d261146106a0578063f2b06537146106c0578063fe0d94c1146106e05761025a565b8063e0a8f6f514610653578063e23a9a52146106735761025a565b8063c4d66de8146105d3578063d0cd595e146105f3578063d1291f1914610613578063ddf0b009146106335761025a565b80639e70a23411610107578063b5a127e5116100ec578063b5a127e514610589578063bacbe2da1461059e578063c099f575146105be5761025a565b80639e70a23414610554578063b0edbb9b146105745761025a565b80635f2e9f60146104d957806374cb3041146104ee5780638b787e3014610503578063984690db146105345761025a565b8063328dd982116101cb5780633e4f49e61161019a578063490145c81161017f578063490145c81461047957806353e5056a14610499578063563909de146104b95761025a565b80633e4f49e61461041f578063458921551461044c5761025a565b8063328dd9821461039a578063342d067a146103ca57806339e778ee146103ea5780633d05f0091461040a5761025a565b80631e9d1e641161022257806324b437871161020757806324b437871461034557806324cd62d3146103655780632e8e34e1146103855761025a565b80631e9d1e641461030357806322f3e2d4146103235761025a565b8063013cf08b1461025f5780630f15f4c01461029f57806315373e3d146102b657806317977c61146102d65761025a565b3661025a57005b600080fd5b34801561026b57600080fd5b5061027f61027a366004613ce6565b6106f3565b6040516102969b9a999897969594939291906146dc565b60405180910390f35b3480156102ab57600080fd5b506102b46108b9565b005b3480156102c257600080fd5b506102b46102d1366004613d41565b610a0b565b3480156102e257600080fd5b506102f66102f1366004613bde565b610c62565b60405161029691906146d3565b34801561030f57600080fd5b506102b461031e366004613ce6565b610c74565b34801561032f57600080fd5b50610338610e77565b6040516102969190613ff7565b34801561035157600080fd5b506102b4610360366004613ce6565b610e99565b34801561037157600080fd5b506102b4610380366004613ce6565b611104565b34801561039157600080fd5b506102f66111b4565b3480156103a657600080fd5b506103ba6103b5366004613ce6565b6111ba565b6040516102969493929190613f3f565b3480156103d657600080fd5b506102b46103e5366004613ce6565b611456565b3480156103f657600080fd5b506102b4610405366004613d74565b611506565b34801561041657600080fd5b506102f66116d0565b34801561042b57600080fd5b5061043f61043a366004613ce6565b6116d6565b6040516102969190614012565b34801561045857600080fd5b5061046c610467366004613ce6565b611855565b60405161029691906146a0565b34801561048557600080fd5b506102f6610494366004613bf8565b6118b9565b3480156104a557600080fd5b506102b46104b4366004613ce6565b611d06565b3480156104c557600080fd5b506102b46104d4366004613ce6565b611d5f565b3480156104e557600080fd5b506102f6611e63565b3480156104fa57600080fd5b506102f6611e69565b34801561050f57600080fd5b5061052361051e366004613ce6565b611e6f565b604051610296959493929190613ef6565b34801561054057600080fd5b506102b461054f366004613ce6565b611f3e565b34801561056057600080fd5b506102b461056f366004613d41565b611f97565b34801561058057600080fd5b506102f6612238565b34801561059557600080fd5b506102f661223e565b3480156105aa57600080fd5b506102b46105b9366004613ce6565b612244565b3480156105ca57600080fd5b506102f66123f5565b3480156105df57600080fd5b506102b46105ee366004613bde565b6123fb565b3480156105ff57600080fd5b506102f661060e366004613ce6565b6124ea565b34801561061f57600080fd5b506102b461062e366004613ce6565b612537565b34801561063f57600080fd5b506102b461064e366004613ce6565b61263b565b34801561065f57600080fd5b506102b461066e366004613ce6565b6128f5565b34801561067f57600080fd5b5061069361068e366004613d16565b6129b7565b60405161029691906146ae565b3480156106ac57600080fd5b506106936106bb366004613d16565b612a25565b3480156106cc57600080fd5b506103386106db366004613ce6565b612a93565b6102b46106ee366004613ce6565b612aa8565b60086020908152600091825260409182902080546001808301546002808501805488516101009582161595909502600019011691909104601f8101879004870284018701909752868352929573ffffffffffffffffffffffffffffffffffffffff909116949192918301828280156107ac5780601f10610781576101008083540402835291602001916107ac565b820191906000526020600020905b81548152906001019060200180831161078f57829003601f168201915b5050505060038301805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815294959493509083018282801561083c5780601f106108115761010080835404028352916020019161083c565b820191906000526020600020905b81548152906001019060200180831161081f57829003601f168201915b50505060088401546009850154600a860154600b870154600c8801546040805160c081018252600e8b01548152600f8b0154602082015260108b01549181019190915260118a0154606082015260128a0154608082015260139099015460a08a0152969793969295509093509160ff80831692610100900416908b565b600b547501000000000000000000000000000000000000000000900460ff16156108fe5760405162461bcd60e51b81526004016108f590614185565b60405180910390fd5b600b54604080517ff909e96700000000000000000000000000000000000000000000000000000000815290516a108b2a2c280290940000009273ffffffffffffffffffffffffffffffffffffffff169163f909e967916004808301926020929190829003018186803b15801561097357600080fd5b505afa158015610987573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ab9190613cfe565b10156109c95760405162461bcd60e51b81526004016108f590614261565b600b80547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff167501000000000000000000000000000000000000000000179055565b6001610a16836116d6565b6009811115610a2157fe5b14610a3e5760405162461bcd60e51b81526004016108f590614632565b6000828152600860209081526040808320338452600d8101909252909120805460ff161580610a875750805460ff168015610a875750805460ff61010090910416151583151514155b610aa35760405162461bcd60e51b81526004016108f5906145fb565b600b5460009073ffffffffffffffffffffffffffffffffffffffff1663cbf8eda933610ace86612d01565b6040518363ffffffff1660e01b8152600401610aeb929190613ed0565b60206040518083038186803b158015610b0357600080fd5b505afa158015610b17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b3b9190613cfe565b905060008111610b5d5760405162461bcd60e51b81526004016108f590614094565b815460ff1615610bac578154610100900460ff1615610b93576001820154600a840154610b8991612d10565b600a840155610bac565b6001820154600b840154610ba691612d10565b600b8401555b8315610bcb57600a830154610bc19082612d6d565b600a840155610be0565b600b830154610bda9082612d6d565b600b8401555b8154600180840183905560ff19909116177fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010085151502178255604051339086907f88d35328232823f54954b6627e9f732371656f6daa40cb1b01b27dc7875a7b4790610c539088908690614002565b60405180910390a35050505050565b600a6020526000908152604090205481565b806000108015610c8657506007548111155b610ca25760405162461bcd60e51b81526004016108f5906141bc565b60008181526009602090815260408083203384526005808201909352922090610cca846116d6565b6009811115610cd557fe5b148015610ce55750600182015415155b610d015760405162461bcd60e51b81526004016108f590614389565b600b5460018301546040517fcbf8eda900000000000000000000000000000000000000000000000000000000815260009273ffffffffffffffffffffffffffffffffffffffff169163cbf8eda991610d6491339160001990910190600401613ed0565b60206040518083038186803b158015610d7c57600080fd5b505afa158015610d90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db49190613cfe565b825490915060ff16610dd85760405162461bcd60e51b81526004016108f5906144f9565b8154610100900460ff1615610e00576003830154610df69082612d10565b6003840155610e15565b6004830154610e0f9082612d10565b60048401555b81546000600184018190557fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009091168355604051339186917f5e8ee24f838173ed2ae7989835696f6e11945ac8fbc5259aef01cc4d7f0d49209190a350505050565b600b547501000000000000000000000000000000000000000000900460ff1681565b6009610ea4826116d6565b6009811115610eaf57fe5b14610ecc5760405162461bcd60e51b81526004016108f5906143c0565b6000818152600860205260409020600c81015460ff1615610eff5760405162461bcd60e51b81526004016108f5906143c0565b600c8101805460ff19166001179055600481015460005b818110156110c6576110be836004018281548110610f3057fe5b60009182526020909120015460058501805473ffffffffffffffffffffffffffffffffffffffff9092169184908110610f6557fe5b9060005260206000200154856006018481548110610f7f57fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529283018282801561100d5780601f10610fe25761010080835404028352916020019161100d565b820191906000526020600020905b815481529060010190602001808311610ff057829003601f168201915b505050505086600701858154811061102157fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156110af5780601f10611084576101008083540402835291602001916110af565b820191906000526020600020905b81548152906001019060200180831161109257829003601f168201915b50505050508760090154612dce565b600101610f16565b50827f6d7acd63bebeaf524f1761a88687951f776fc7c182205f820424c7fb572c7235336040516110f79190613eaf565b60405180910390a2505050565b333014611158576040805162461bcd60e51b815260206004820152601160248201527f4f6e6c792044414f2063616e2063616c6c000000000000000000000000000000604482015290519081900360640190fd5b6138408110156111af576040805162461bcd60e51b815260206004820152601260248201527f706572696f64206d757374206265203e20300000000000000000000000000000604482015290519081900360640190fd5b600155565b60025481565b6060806060806000600860008781526020019081526020016000209050806004018160050182600601836007018380548060200260200160405190810160405280929190818152602001828054801561124957602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff16815260019091019060200180831161121e575b505050505093508280548060200260200160405190810160405280929190818152602001828054801561129b57602002820191906000526020600020905b815481526020019060010190808311611287575b5050505050925081805480602002602001604051908101604052809291908181526020016000905b8282101561136e5760008481526020908190208301805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529283018282801561135a5780601f1061132f5761010080835404028352916020019161135a565b820191906000526020600020905b81548152906001019060200180831161133d57829003601f168201915b5050505050815260200190600101906112c3565b50505050915080805480602002602001604051908101604052809291908181526020016000905b828210156114405760008481526020908190208301805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529283018282801561142c5780601f106114015761010080835404028352916020019161142c565b820191906000526020600020905b81548152906001019060200180831161140f57829003601f168201915b505050505081526020019060010190611395565b5050505090509450945094509450509193509193565b3330146114aa576040805162461bcd60e51b815260206004820152601160248201527f4f6e6c792044414f2063616e2063616c6c000000000000000000000000000000604482015290519081900360640190fd5b613840811015611501576040805162461bcd60e51b815260206004820152601260248201527f706572696f64206d757374206265203e20300000000000000000000000000000604482015290519081900360640190fd5b600355565b6005611511836116d6565b600981111561151c57fe5b146115395760405162461bcd60e51b81526004016108f5906141f3565b611541612dfb565b600b546040517fcbf8eda900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063cbf8eda99061159d903390600019420190600401613ed0565b60206040518083038186803b1580156115b557600080fd5b505afa1580156115c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115ed9190613cfe565b101561160b5760405162461bcd60e51b81526004016108f59061422a565b600082815260096020526040902060018101541561163b5760405162461bcd60e51b81526004016108f59061442e565b600082511161165c5760405162461bcd60e51b81526004016108f59061405d565b42600182015580547fffffffffffffffffffffffff00000000000000000000000000000000000000001633178155815161169f90600283019060208501906136c1565b50827f27eba018e1c52b84f732fe4d806fd9750c60752f1d37e7f70bcb4cbec65b1c6a336040516110f79190613eaf565b60015481565b60008160001080156116ea57506007548211155b6117065760405162461bcd60e51b81526004016108f5906141bc565b6000828152600860205260409020600c81015460ff161561172b576002915050611850565b600c810154610100900460ff1615611747576008915050611850565b6008810154600e82015480820142116117665760009350505050611850565b600f8301548282010142116117815760019350505050611850565b600a8301546012840154600b8501546000916117ac916064916117a691860190612ea7565b90612f00565b90506117b785612f67565b85600b0154830110806117c957508082105b156117dc57600395505050505050611850565b6009850154806117f55760049650505050505050611850565b8042101561180c5760059650505050505050611850565b61181588613013565b156118295760099650505050505050611850565b6011860154810142116118455760069650505050505050611850565b600796505050505050505b919050565b61185d61374d565b50600090815260086020908152604091829020825160c081018452600e8201548152600f82015492810192909252601081015492820192909252601182015460608201526012820154608082015260139091015460a082015290565b600b546000907501000000000000000000000000000000000000000000900460ff166119eb57600b54604080517ff909e96700000000000000000000000000000000000000000000000000000000815290516a108b2a2c280290940000009273ffffffffffffffffffffffffffffffffffffffff169163f909e967916004808301926020929190829003018186803b15801561195457600080fd5b505afa158015611968573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061198c9190613cfe565b10156119aa5760405162461bcd60e51b81526004016108f590614026565b600b80547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000001790555b6119f3612dfb565b600b546040517fcbf8eda900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063cbf8eda990611a4f903390600019420190600401613ed0565b60206040518083038186803b158015611a6757600080fd5b505afa158015611a7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a9f9190613cfe565b1015611abd5760405162461bcd60e51b81526004016108f59061422a565b85518751148015611acf575084518751145b8015611adc575083518751145b611af85760405162461bcd60e51b81526004016108f5906142f5565b8651611b165760405162461bcd60e51b81526004016108f59061458d565b600a87511115611b385760405162461bcd60e51b81526004016108f5906145c4565b6000825111611b595760405162461bcd60e51b81526004016108f590614352565b6000835111611b7a5760405162461bcd60e51b81526004016108f59061405d565b336000908152600a60205260409020548015611bb657611b99816130dd565b15611bb65760405162461bcd60e51b81526004016108f5906143f7565b6007546001908101600081815260086020908152604090912082815592830180547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790558651919291611c14916002840191908901906136c1565b508451611c2a90600383019060208801906136c1565b508951611c4090600483019060208d0190613783565b508851611c5690600583019060208c01906137fd565b508751611c6c90600683019060208b0190613837565b508651611c8290600783019060208a0190613890565b506000194201600882015560008054600e830155600154600f83015560025460108301556003546011830155600454601283015560055460138301556007839055338152600a60205260408082208490555183917fc2c021f5d73c63c481d336fbbafec58f694fc45095f00b02d2deb8cca59afe0791a25098975050505050505050565b333014611d5a576040805162461bcd60e51b815260206004820152601160248201527f4f6e6c792044414f2063616e2063616c6c000000000000000000000000000000604482015290519081900360640190fd5b600255565b333014611db3576040805162461bcd60e51b815260206004820152601160248201527f4f6e6c792044414f2063616e2063616c6c000000000000000000000000000000604482015290519081900360640190fd5b60058111611e08576040805162461bcd60e51b815260206004820152601d60248201527f71756f72756d206d7573742062652067726561746572207468616e2035000000604482015290519081900360640190fd5b6064811115611e5e576040805162461bcd60e51b815260206004820152600f60248201527f4d6178696d756d206973203130302e0000000000000000000000000000000000604482015290519081900360640190fd5b600555565b60005481565b60075481565b60096020908152600091825260409182902080546001808301546002808501805488516101009582161595909502600019011691909104601f810187900487028401870190975286835273ffffffffffffffffffffffffffffffffffffffff909316959094919291830182828015611f285780601f10611efd57610100808354040283529160200191611f28565b820191906000526020600020905b815481529060010190602001808311611f0b57829003601f168201915b5050505050908060030154908060040154905085565b333014611f92576040805162461bcd60e51b815260206004820152601160248201527f4f6e6c792044414f2063616e2063616c6c000000000000000000000000000000604482015290519081900360640190fd5b600055565b816000108015611fa957506007548211155b611fc55760405162461bcd60e51b81526004016108f5906141bc565b60008281526009602052604090206005611fde846116d6565b6009811115611fe957fe5b148015611ff95750600181015415155b6120155760405162461bcd60e51b81526004016108f590614389565b3360009081526005820160205260409020805460ff1615806120515750805460ff1680156120515750805460ff61010090910416151583151514155b61206d5760405162461bcd60e51b81526004016108f5906145fb565b600b5460018301546040517fcbf8eda900000000000000000000000000000000000000000000000000000000815260009273ffffffffffffffffffffffffffffffffffffffff169163cbf8eda9916120d091339160001990910190600401613ed0565b60206040518083038186803b1580156120e857600080fd5b505afa1580156120fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121209190613cfe565b9050600081116121425760405162461bcd60e51b81526004016108f590614094565b815460ff1615612191578154610100900460ff1615612178576001820154600384015461216e91612d10565b6003840155612191565b6001820154600484015461218b91612d10565b60048401555b83156121b05760038301546121a69082612d6d565b60038401556121c5565b60048301546121bf9082612d6d565b60048401555b8154600180840183905560ff19909116177fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010085151502178255604051339086907f80f2ad7e3e83d197670402663f224adb2f649967b9629c67dcfafa40c94d30f990610c539088908690614002565b60045481565b60055481565b600161224f826116d6565b600981111561225a57fe5b146122775760405162461bcd60e51b81526004016108f590614632565b600081815260086020908152604080832033808552600d8201909352908320600b5491939092909173ffffffffffffffffffffffffffffffffffffffff169063cbf8eda9906122c586612d01565b6040518363ffffffff1660e01b81526004016122e2929190613ed0565b60206040518083038186803b1580156122fa57600080fd5b505afa15801561230e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123329190613cfe565b825490915060ff166123565760405162461bcd60e51b81526004016108f5906144f9565b8154610100900460ff161561237e57600a8301546123749082612d10565b600a840155612393565b600b83015461238d9082612d10565b600b8401555b81546000600184018190557fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009091168355604051339186917f12beef84830227673717dd5522ee1228a8004e88dc2678d8740f582264efb2b69190a350505050565b60035481565b600b5474010000000000000000000000000000000000000000900460ff16156124365760405162461bcd60e51b81526004016108f5906144c2565b73ffffffffffffffffffffffffffffffffffffffff81166124695760405162461bcd60e51b81526004016108f59061448b565b600b80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff73ffffffffffffffffffffffffffffffffffffffff9093167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116179190911674010000000000000000000000000000000000000000179055565b60008160001080156124fe57506007548211155b61251a5760405162461bcd60e51b81526004016108f5906141bc565b600082815260086020526040902061253190612f67565b92915050565b33301461258b576040805162461bcd60e51b815260206004820152601160248201527f4f6e6c792044414f2063616e2063616c6c000000000000000000000000000000604482015290519081900360640190fd5b60648111156125e1576040805162461bcd60e51b815260206004820152600f60248201527f4d6178696d756d206973203130302e0000000000000000000000000000000000604482015290519081900360640190fd5b60328111612636576040805162461bcd60e51b815260206004820152600e60248201527f4d696e696d756d2069732035302e000000000000000000000000000000000000604482015290519081900360640190fd5b600455565b6004612646826116d6565b600981111561265157fe5b1461266e5760405162461bcd60e51b81526004016108f5906140cb565b600081815260086020819052604082206010810154600f820154600e8301549383015490930190920190910160098201819055600482015491929091905b818110156128b45760008460040182815481106126c557fe5b600091825260208220015460058701805473ffffffffffffffffffffffffffffffffffffffff909216935090849081106126fb57fe5b90600052602060002001549050600086600601848154811061271957fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156127a75780601f1061277c576101008083540402835291602001916127a7565b820191906000526020600020905b81548152906001019060200180831161278a57829003601f168201915b5050505050905060008760070185815481106127bf57fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529283018282801561284d5780601f106128225761010080835404028352916020019161284d565b820191906000526020600020905b81548152906001019060200180831161283057829003601f168201915b5050505050905060066000612865868686868d613159565b815260208101919091526040016000205460ff16156128965760405162461bcd60e51b81526004016108f590614298565b6128a3848484848b613284565b5050600190930192506126ac915050565b50837ff7230a453b4c21e4f2d0ef1ad055635b08cb2c884eaf24a5ddc7147c79fd8c2233846040516128e7929190613ed0565b60405180910390a250505050565b6128fe816132b9565b61291a5760405162461bcd60e51b81526004016108f590614530565b612923816132e3565b61293f5760405162461bcd60e51b81526004016108f590614128565b6000818152600860205260408120600c8101805460ff19166001179055600481015490915b818110156129865761297e836004018281548110610f3057fe5b600101612964565b50827f253042c67143aeb6d431bb762d75e5905f18fa7850b7b9edb31fedb7c362d7e8336040516110f79190613eaf565b6129bf6138e9565b50600091825260086020908152604080842073ffffffffffffffffffffffffffffffffffffffff939093168452600d9092018152918190208151606081018352815460ff8082161515835261010090910416151593810193909352600101549082015290565b612a2d6138e9565b50600091825260096020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845260059092018152918190208151606081018352815460ff8082161515835261010090910416151593810193909352600101549082015290565b60066020526000908152604090205460ff1681565b6006612ab3826116d6565b6009811115612abe57fe5b14612adb5760405162461bcd60e51b81526004016108f590614669565b6000818152600860205260408120600c810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16610100179055600481015490915b81811015612cd057612cc7836004018281548110612b3957fe5b60009182526020909120015460058501805473ffffffffffffffffffffffffffffffffffffffff9092169184908110612b6e57fe5b9060005260206000200154856006018481548110612b8857fe5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815292830182828015612c165780601f10612beb57610100808354040283529160200191612c16565b820191906000526020600020905b815481529060010190602001808311612bf957829003601f168201915b5050505050866007018581548110612c2a57fe5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815292830182828015612cb85780601f10612c8d57610100808354040283529160200191612cb8565b820191906000526020600020905b815481529060010190602001808311612c9b57829003601f168201915b505050505087600901546133e2565b50600101612b1f565b50827f9c85b616f29fca57a17eafe71cf9ff82ffef41766e2cf01ea7f8f7878dd3ec24336040516110f79190613eaf565b600e8101546008909101540190565b600082821115612d67576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600082820183811015612dc7576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6000612ddd8686868686613159565b6000908152600660205260409020805460ff19169055505050505050565b6000612ea26064600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f909e9676040518163ffffffff1660e01b815260040160206040518083038186803b158015612e6a57600080fd5b505afa158015612e7e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117a69190613cfe565b905090565b600082612eb657506000612531565b82820282848281612ec357fe5b0414612dc75760405162461bcd60e51b81526004018080602001828103825260218152602001806148186021913960400191505060405180910390fd5b6000808211612f56576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b818381612f5f57fe5b049392505050565b6013810154600b54600091612531916064916117a69173ffffffffffffffffffffffffffffffffffffffff16637654fff5612fa188612d01565b6040518263ffffffff1660e01b8152600401612fbd91906146d3565b60206040518083038186803b158015612fd557600080fd5b505afa158015612fe9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061300d9190613cfe565b90612ea7565b6000818152600860209081526040808320600990925282206001810154158061303f5750816009015442105b1561304f57600092505050611850565b600b5460018201546040517f7654fff50000000000000000000000000000000000000000000000000000000081526130ce9260029273ffffffffffffffffffffffffffffffffffffffff90911691637654fff5916130b691600019909101906004016146d3565b60206040518083038186803b158015612e6a57600080fd5b60039091015410159392505050565b6000806130e9836116d6565b905060008160098111156130f957fe5b14806131105750600181600981111561310e57fe5b145b806131265750600481600981111561312457fe5b145b8061313c5750600581600981111561313a57fe5b145b80612dc7575060065b81600981111561315157fe5b149392505050565b60008585858585604051602001808673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018060200180602001848152602001838103835286818151815260200191508051906020019080838360005b838110156131cc5781810151838201526020016131b4565b50505050905090810190601f1680156131f95780820380516001836020036101000a031916815260200191505b50838103825285518152855160209182019187019080838360005b8381101561322c578181015183820152602001613214565b50505050905090810190601f1680156132595780820380516001836020036101000a031916815260200191505b5097505050505050505060405160208183030381529060405280519060200120905095945050505050565b6000806132948787878787613159565b6000818152600660205260409020805460ff1916600117905591505095945050505050565b6000806132c5836116d6565b905060008160098111156132d557fe5b1480612dc757506001613145565b6000818152600860205260408120600181015473ffffffffffffffffffffffffffffffffffffffff163314806133ca575061331c612dfb565b600b5460018301546040517fc07473f600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9283169263c07473f69261337892911690600401613eaf565b60206040518083038186803b15801561339057600080fd5b505afa1580156133a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133c89190613cfe565b105b156133d9576001915050611850565b50600092915050565b606060006133f38787878787613159565b9050824210156134345760405162461bcd60e51b815260040180806020018281038252603b8152602001806147b4603b913960400191505060405180910390fd5b60035483014211156134775760405162461bcd60e51b81526004018080602001828103825260298152602001806147ef6029913960400191505060405180910390fd5b6000818152600660205260409020805460ff19169055845160609061349d575083613553565b85805190602001208560405160200180837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260040182805190602001908083835b6020831061351b57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016134de565b6001836020036101000a0380198251168184511680821785525050505050509050019250505060405160208183030381529060405290505b6000808973ffffffffffffffffffffffffffffffffffffffff1689846040518082805190602001908083835b602083106135bc57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161357f565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461361e576040519150601f19603f3d011682016040523d82523d6000602084013e613623565b606091505b50915091508181906136b35760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613678578181015183820152602001613660565b50505050905090810190601f1680156136a55780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b509998505050505050505050565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826136f7576000855561373d565b82601f1061371057805160ff191683800117855561373d565b8280016001018555821561373d579182015b8281111561373d578251825591602001919060010190613722565b50613749929150613909565b5090565b6040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b82805482825590600052602060002090810192821561373d579160200282015b8281111561373d57825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9091161782556020909201916001909101906137a3565b82805482825590600052602060002090810192821561373d579160200282018281111561373d578251825591602001919060010190613722565b828054828255906000526020600020908101928215613884579160200282015b8281111561388457825180516138749184916020909101906136c1565b5091602001919060010190613857565b5061374992915061391e565b8280548282559060005260206000209081019282156138dd579160200282015b828111156138dd57825180516138cd9184916020909101906136c1565b50916020019190600101906138b0565b5061374992915061393b565b604080516060810182526000808252602082018190529181019190915290565b5b80821115613749576000815560010161390a565b808211156137495760006139328282613958565b5060010161391e565b8082111561374957600061394f8282613958565b5060010161393b565b50805460018160011615610100020316600290046000825580601f1061397e575061399c565b601f01602090049060005260206000209081019061399c9190613909565b50565b600067ffffffffffffffff8311156139b357fe5b6139e460207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f86011601614771565b90508281528383830111156139f857600080fd5b828260208301376000602084830101529392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461185057600080fd5b600082601f830112613a43578081fd5b81356020613a58613a5383614795565b614771565b8281528181019085830183850287018401881015613a74578586fd5b855b85811015613a9957613a8782613a0f565b84529284019290840190600101613a76565b5090979650505050505050565b600082601f830112613ab6578081fd5b81356020613ac6613a5383614795565b82815281810190858301855b85811015613a99578135880189603f820112613aec578788fd5b613afd8a878301356040840161399f565b8552509284019290840190600101613ad2565b600082601f830112613b20578081fd5b81356020613b30613a5383614795565b82815281810190858301855b85811015613a9957613b53898684358b0101613bbf565b84529284019290840190600101613b3c565b600082601f830112613b75578081fd5b81356020613b85613a5383614795565b8281528181019085830183850287018401881015613ba1578586fd5b855b85811015613a9957813584529284019290840190600101613ba3565b600082601f830112613bcf578081fd5b612dc78383356020850161399f565b600060208284031215613bef578081fd5b612dc782613a0f565b60008060008060008060c08789031215613c10578182fd5b863567ffffffffffffffff80821115613c27578384fd5b613c338a838b01613a33565b97506020890135915080821115613c48578384fd5b613c548a838b01613b65565b96506040890135915080821115613c69578384fd5b613c758a838b01613b10565b95506060890135915080821115613c8a578384fd5b613c968a838b01613aa6565b94506080890135915080821115613cab578384fd5b613cb78a838b01613bbf565b935060a0890135915080821115613ccc578283fd5b50613cd989828a01613bbf565b9150509295509295509295565b600060208284031215613cf7578081fd5b5035919050565b600060208284031215613d0f578081fd5b5051919050565b60008060408385031215613d28578182fd5b82359150613d3860208401613a0f565b90509250929050565b60008060408385031215613d53578182fd5b8235915060208301358015158114613d69578182fd5b809150509250929050565b60008060408385031215613d86578182fd5b82359150602083013567ffffffffffffffff811115613da3578182fd5b613daf85828601613bbf565b9150509250929050565b6000815180845260208085018081965082840281019150828601855b85811015613dff578284038952613ded848351613e0c565b98850198935090840190600101613dd5565b5091979650505050505050565b60008151808452815b81811015613e3157602081850181015186830182015201613e15565b81811115613e425782602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b805182526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a08301525050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b600073ffffffffffffffffffffffffffffffffffffffff8716825285602083015260a06040830152613f2b60a0830186613e0c565b606083019490945250608001529392505050565b6080808252855190820181905260009060209060a0840190828901845b82811015613f8e57815173ffffffffffffffffffffffffffffffffffffffff1684529284019290840190600101613f5c565b50505083810382850152865180825287830191830190845b81811015613fc257835183529284019291840191600101613fa6565b50508481036040860152613fd68188613db9565b925050508281036060840152613fec8185613db9565b979650505050505050565b901515815260200190565b9115158252602082015260400190565b60208101600a831061402057fe5b91905290565b60208082526012908201527f44414f206e6f7420796574206163746976650000000000000000000000000000604082015260600190565b6020808252601a908201527f6465736372697074696f6e2063616e277420626520656d707479000000000000604082015260600190565b6020808252600f908201527f6e6f20766f74696e6720706f7765720000000000000000000000000000000000604082015260600190565b6020808252602e908201527f50726f706f73616c2063616e206f6e6c7920626520717565756564206966206960408201527f7420697320737563636565646564000000000000000000000000000000000000606082015260800190565b60208082526021908201527f43616e63656c6c6174696f6e20726571756972656d656e7473206e6f74206d6560408201527f7400000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526012908201527f44414f20616c7265616479206163746976650000000000000000000000000000604082015260600190565b60208082526013908201527f696e76616c69642070726f706f73616c20696400000000000000000000000000604082015260600190565b60208082526019908201527f50726f706f73616c206d75737420626520696e20717565756500000000000000604082015260600190565b6020808252601a908201527f4372656174696f6e207468726573686f6c64206e6f74206d6574000000000000604082015260600190565b60208082526015908201527f5468726573686f6c64206e6f74206d6574207965740000000000000000000000604082015260600190565b60208082526025908201527f70726f706f73616c20616374696f6e20616c726561647920717565756564206160408201527f7420657461000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252602d908201527f50726f706f73616c2066756e6374696f6e20696e666f726d6174696f6e20706160408201527f72697479206d69736d6174636800000000000000000000000000000000000000606082015260800190565b60208082526014908201527f7469746c652063616e277420626520656d707479000000000000000000000000604082015260600190565b6020808252601e908201527f4162726f676174696f6e2050726f706f73616c206e6f74206163746976650000604082015260600190565b60208082526013908201527f43616e6e6f74206265206162726f676174656400000000000000000000000000604082015260600190565b6020808252601e908201527f4f6e65206c6976652070726f706f73616c207065722070726f706f7365720000604082015260600190565b60208082526022908201527f4162726f676174696f6e2070726f706f73616c20616c7265616479206578697360408201527f7473000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526018908201527f636f6d697469756d206d757374206e6f74206265203078300000000000000000604082015260600190565b6020808252601d908201527f436f6e747261637420616c726561647920696e697469616c697a65642e000000604082015260600190565b6020808252601e908201527f43616e6e6f742063616e63656c206966206e6f7420766f746564207965740000604082015260600190565b60208082526032908201527f50726f706f73616c20696e207374617465207468617420646f6573206e6f742060408201527f616c6c6f772063616e63656c6c6174696f6e0000000000000000000000000000606082015260800190565b60208082526014908201527f4d7573742070726f7669646520616374696f6e73000000000000000000000000604082015260600190565b6020808252601a908201527f546f6f206d616e7920616374696f6e73206f6e206120766f7465000000000000604082015260600190565b60208082526019908201527f416c726561647920766f7465642074686973206f7074696f6e00000000000000604082015260600190565b60208082526010908201527f566f74696e6720697320636c6f73656400000000000000000000000000000000604082015260600190565b60208082526012908201527f43616e6e6f742062652065786563757465640000000000000000000000000000604082015260600190565b60c081016125318284613e75565b8151151581526020808301511515908201526040918201519181019190915260600190565b90815260200190565b60006102008d835273ffffffffffffffffffffffffffffffffffffffff8d1660208401528060408401526147128184018d613e0c565b90508281036060840152614726818c613e0c565b9150508860808301528760a08301528660c08301528560e0830152841515610100830152831515610120830152614761610140830184613e75565b9c9b505050505050505050505050565b60405181810167ffffffffffffffff8111828210171561478d57fe5b604052919050565b600067ffffffffffffffff8211156147a957fe5b506020908102019056fe657865637574655472616e73616374696f6e3a205472616e73616374696f6e206861736e2774207375727061737365642074696d65206c6f636b2e657865637574655472616e73616374696f6e3a205472616e73616374696f6e206973207374616c652e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a26469706673582212200ff2a734dd2b297fd5b5c92d54662920dbdba7f781b6d6e2f6fa1c8c4d19c91964736f6c63430007060033
Deployed Bytecode
0x6080604052600436106102535760003560e01c80635f2e9f6011610138578063c4d66de8116100b0578063e0a8f6f51161007f578063e4e2d26111610064578063e4e2d261146106a0578063f2b06537146106c0578063fe0d94c1146106e05761025a565b8063e0a8f6f514610653578063e23a9a52146106735761025a565b8063c4d66de8146105d3578063d0cd595e146105f3578063d1291f1914610613578063ddf0b009146106335761025a565b80639e70a23411610107578063b5a127e5116100ec578063b5a127e514610589578063bacbe2da1461059e578063c099f575146105be5761025a565b80639e70a23414610554578063b0edbb9b146105745761025a565b80635f2e9f60146104d957806374cb3041146104ee5780638b787e3014610503578063984690db146105345761025a565b8063328dd982116101cb5780633e4f49e61161019a578063490145c81161017f578063490145c81461047957806353e5056a14610499578063563909de146104b95761025a565b80633e4f49e61461041f578063458921551461044c5761025a565b8063328dd9821461039a578063342d067a146103ca57806339e778ee146103ea5780633d05f0091461040a5761025a565b80631e9d1e641161022257806324b437871161020757806324b437871461034557806324cd62d3146103655780632e8e34e1146103855761025a565b80631e9d1e641461030357806322f3e2d4146103235761025a565b8063013cf08b1461025f5780630f15f4c01461029f57806315373e3d146102b657806317977c61146102d65761025a565b3661025a57005b600080fd5b34801561026b57600080fd5b5061027f61027a366004613ce6565b6106f3565b6040516102969b9a999897969594939291906146dc565b60405180910390f35b3480156102ab57600080fd5b506102b46108b9565b005b3480156102c257600080fd5b506102b46102d1366004613d41565b610a0b565b3480156102e257600080fd5b506102f66102f1366004613bde565b610c62565b60405161029691906146d3565b34801561030f57600080fd5b506102b461031e366004613ce6565b610c74565b34801561032f57600080fd5b50610338610e77565b6040516102969190613ff7565b34801561035157600080fd5b506102b4610360366004613ce6565b610e99565b34801561037157600080fd5b506102b4610380366004613ce6565b611104565b34801561039157600080fd5b506102f66111b4565b3480156103a657600080fd5b506103ba6103b5366004613ce6565b6111ba565b6040516102969493929190613f3f565b3480156103d657600080fd5b506102b46103e5366004613ce6565b611456565b3480156103f657600080fd5b506102b4610405366004613d74565b611506565b34801561041657600080fd5b506102f66116d0565b34801561042b57600080fd5b5061043f61043a366004613ce6565b6116d6565b6040516102969190614012565b34801561045857600080fd5b5061046c610467366004613ce6565b611855565b60405161029691906146a0565b34801561048557600080fd5b506102f6610494366004613bf8565b6118b9565b3480156104a557600080fd5b506102b46104b4366004613ce6565b611d06565b3480156104c557600080fd5b506102b46104d4366004613ce6565b611d5f565b3480156104e557600080fd5b506102f6611e63565b3480156104fa57600080fd5b506102f6611e69565b34801561050f57600080fd5b5061052361051e366004613ce6565b611e6f565b604051610296959493929190613ef6565b34801561054057600080fd5b506102b461054f366004613ce6565b611f3e565b34801561056057600080fd5b506102b461056f366004613d41565b611f97565b34801561058057600080fd5b506102f6612238565b34801561059557600080fd5b506102f661223e565b3480156105aa57600080fd5b506102b46105b9366004613ce6565b612244565b3480156105ca57600080fd5b506102f66123f5565b3480156105df57600080fd5b506102b46105ee366004613bde565b6123fb565b3480156105ff57600080fd5b506102f661060e366004613ce6565b6124ea565b34801561061f57600080fd5b506102b461062e366004613ce6565b612537565b34801561063f57600080fd5b506102b461064e366004613ce6565b61263b565b34801561065f57600080fd5b506102b461066e366004613ce6565b6128f5565b34801561067f57600080fd5b5061069361068e366004613d16565b6129b7565b60405161029691906146ae565b3480156106ac57600080fd5b506106936106bb366004613d16565b612a25565b3480156106cc57600080fd5b506103386106db366004613ce6565b612a93565b6102b46106ee366004613ce6565b612aa8565b60086020908152600091825260409182902080546001808301546002808501805488516101009582161595909502600019011691909104601f8101879004870284018701909752868352929573ffffffffffffffffffffffffffffffffffffffff909116949192918301828280156107ac5780601f10610781576101008083540402835291602001916107ac565b820191906000526020600020905b81548152906001019060200180831161078f57829003601f168201915b5050505060038301805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815294959493509083018282801561083c5780601f106108115761010080835404028352916020019161083c565b820191906000526020600020905b81548152906001019060200180831161081f57829003601f168201915b50505060088401546009850154600a860154600b870154600c8801546040805160c081018252600e8b01548152600f8b0154602082015260108b01549181019190915260118a0154606082015260128a0154608082015260139099015460a08a0152969793969295509093509160ff80831692610100900416908b565b600b547501000000000000000000000000000000000000000000900460ff16156108fe5760405162461bcd60e51b81526004016108f590614185565b60405180910390fd5b600b54604080517ff909e96700000000000000000000000000000000000000000000000000000000815290516a108b2a2c280290940000009273ffffffffffffffffffffffffffffffffffffffff169163f909e967916004808301926020929190829003018186803b15801561097357600080fd5b505afa158015610987573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ab9190613cfe565b10156109c95760405162461bcd60e51b81526004016108f590614261565b600b80547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff167501000000000000000000000000000000000000000000179055565b6001610a16836116d6565b6009811115610a2157fe5b14610a3e5760405162461bcd60e51b81526004016108f590614632565b6000828152600860209081526040808320338452600d8101909252909120805460ff161580610a875750805460ff168015610a875750805460ff61010090910416151583151514155b610aa35760405162461bcd60e51b81526004016108f5906145fb565b600b5460009073ffffffffffffffffffffffffffffffffffffffff1663cbf8eda933610ace86612d01565b6040518363ffffffff1660e01b8152600401610aeb929190613ed0565b60206040518083038186803b158015610b0357600080fd5b505afa158015610b17573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b3b9190613cfe565b905060008111610b5d5760405162461bcd60e51b81526004016108f590614094565b815460ff1615610bac578154610100900460ff1615610b93576001820154600a840154610b8991612d10565b600a840155610bac565b6001820154600b840154610ba691612d10565b600b8401555b8315610bcb57600a830154610bc19082612d6d565b600a840155610be0565b600b830154610bda9082612d6d565b600b8401555b8154600180840183905560ff19909116177fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010085151502178255604051339086907f88d35328232823f54954b6627e9f732371656f6daa40cb1b01b27dc7875a7b4790610c539088908690614002565b60405180910390a35050505050565b600a6020526000908152604090205481565b806000108015610c8657506007548111155b610ca25760405162461bcd60e51b81526004016108f5906141bc565b60008181526009602090815260408083203384526005808201909352922090610cca846116d6565b6009811115610cd557fe5b148015610ce55750600182015415155b610d015760405162461bcd60e51b81526004016108f590614389565b600b5460018301546040517fcbf8eda900000000000000000000000000000000000000000000000000000000815260009273ffffffffffffffffffffffffffffffffffffffff169163cbf8eda991610d6491339160001990910190600401613ed0565b60206040518083038186803b158015610d7c57600080fd5b505afa158015610d90573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db49190613cfe565b825490915060ff16610dd85760405162461bcd60e51b81526004016108f5906144f9565b8154610100900460ff1615610e00576003830154610df69082612d10565b6003840155610e15565b6004830154610e0f9082612d10565b60048401555b81546000600184018190557fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009091168355604051339186917f5e8ee24f838173ed2ae7989835696f6e11945ac8fbc5259aef01cc4d7f0d49209190a350505050565b600b547501000000000000000000000000000000000000000000900460ff1681565b6009610ea4826116d6565b6009811115610eaf57fe5b14610ecc5760405162461bcd60e51b81526004016108f5906143c0565b6000818152600860205260409020600c81015460ff1615610eff5760405162461bcd60e51b81526004016108f5906143c0565b600c8101805460ff19166001179055600481015460005b818110156110c6576110be836004018281548110610f3057fe5b60009182526020909120015460058501805473ffffffffffffffffffffffffffffffffffffffff9092169184908110610f6557fe5b9060005260206000200154856006018481548110610f7f57fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529283018282801561100d5780601f10610fe25761010080835404028352916020019161100d565b820191906000526020600020905b815481529060010190602001808311610ff057829003601f168201915b505050505086600701858154811061102157fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156110af5780601f10611084576101008083540402835291602001916110af565b820191906000526020600020905b81548152906001019060200180831161109257829003601f168201915b50505050508760090154612dce565b600101610f16565b50827f6d7acd63bebeaf524f1761a88687951f776fc7c182205f820424c7fb572c7235336040516110f79190613eaf565b60405180910390a2505050565b333014611158576040805162461bcd60e51b815260206004820152601160248201527f4f6e6c792044414f2063616e2063616c6c000000000000000000000000000000604482015290519081900360640190fd5b6138408110156111af576040805162461bcd60e51b815260206004820152601260248201527f706572696f64206d757374206265203e20300000000000000000000000000000604482015290519081900360640190fd5b600155565b60025481565b6060806060806000600860008781526020019081526020016000209050806004018160050182600601836007018380548060200260200160405190810160405280929190818152602001828054801561124957602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff16815260019091019060200180831161121e575b505050505093508280548060200260200160405190810160405280929190818152602001828054801561129b57602002820191906000526020600020905b815481526020019060010190808311611287575b5050505050925081805480602002602001604051908101604052809291908181526020016000905b8282101561136e5760008481526020908190208301805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529283018282801561135a5780601f1061132f5761010080835404028352916020019161135a565b820191906000526020600020905b81548152906001019060200180831161133d57829003601f168201915b5050505050815260200190600101906112c3565b50505050915080805480602002602001604051908101604052809291908181526020016000905b828210156114405760008481526020908190208301805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529283018282801561142c5780601f106114015761010080835404028352916020019161142c565b820191906000526020600020905b81548152906001019060200180831161140f57829003601f168201915b505050505081526020019060010190611395565b5050505090509450945094509450509193509193565b3330146114aa576040805162461bcd60e51b815260206004820152601160248201527f4f6e6c792044414f2063616e2063616c6c000000000000000000000000000000604482015290519081900360640190fd5b613840811015611501576040805162461bcd60e51b815260206004820152601260248201527f706572696f64206d757374206265203e20300000000000000000000000000000604482015290519081900360640190fd5b600355565b6005611511836116d6565b600981111561151c57fe5b146115395760405162461bcd60e51b81526004016108f5906141f3565b611541612dfb565b600b546040517fcbf8eda900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063cbf8eda99061159d903390600019420190600401613ed0565b60206040518083038186803b1580156115b557600080fd5b505afa1580156115c9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115ed9190613cfe565b101561160b5760405162461bcd60e51b81526004016108f59061422a565b600082815260096020526040902060018101541561163b5760405162461bcd60e51b81526004016108f59061442e565b600082511161165c5760405162461bcd60e51b81526004016108f59061405d565b42600182015580547fffffffffffffffffffffffff00000000000000000000000000000000000000001633178155815161169f90600283019060208501906136c1565b50827f27eba018e1c52b84f732fe4d806fd9750c60752f1d37e7f70bcb4cbec65b1c6a336040516110f79190613eaf565b60015481565b60008160001080156116ea57506007548211155b6117065760405162461bcd60e51b81526004016108f5906141bc565b6000828152600860205260409020600c81015460ff161561172b576002915050611850565b600c810154610100900460ff1615611747576008915050611850565b6008810154600e82015480820142116117665760009350505050611850565b600f8301548282010142116117815760019350505050611850565b600a8301546012840154600b8501546000916117ac916064916117a691860190612ea7565b90612f00565b90506117b785612f67565b85600b0154830110806117c957508082105b156117dc57600395505050505050611850565b6009850154806117f55760049650505050505050611850565b8042101561180c5760059650505050505050611850565b61181588613013565b156118295760099650505050505050611850565b6011860154810142116118455760069650505050505050611850565b600796505050505050505b919050565b61185d61374d565b50600090815260086020908152604091829020825160c081018452600e8201548152600f82015492810192909252601081015492820192909252601182015460608201526012820154608082015260139091015460a082015290565b600b546000907501000000000000000000000000000000000000000000900460ff166119eb57600b54604080517ff909e96700000000000000000000000000000000000000000000000000000000815290516a108b2a2c280290940000009273ffffffffffffffffffffffffffffffffffffffff169163f909e967916004808301926020929190829003018186803b15801561195457600080fd5b505afa158015611968573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061198c9190613cfe565b10156119aa5760405162461bcd60e51b81526004016108f590614026565b600b80547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000001790555b6119f3612dfb565b600b546040517fcbf8eda900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063cbf8eda990611a4f903390600019420190600401613ed0565b60206040518083038186803b158015611a6757600080fd5b505afa158015611a7b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a9f9190613cfe565b1015611abd5760405162461bcd60e51b81526004016108f59061422a565b85518751148015611acf575084518751145b8015611adc575083518751145b611af85760405162461bcd60e51b81526004016108f5906142f5565b8651611b165760405162461bcd60e51b81526004016108f59061458d565b600a87511115611b385760405162461bcd60e51b81526004016108f5906145c4565b6000825111611b595760405162461bcd60e51b81526004016108f590614352565b6000835111611b7a5760405162461bcd60e51b81526004016108f59061405d565b336000908152600a60205260409020548015611bb657611b99816130dd565b15611bb65760405162461bcd60e51b81526004016108f5906143f7565b6007546001908101600081815260086020908152604090912082815592830180547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790558651919291611c14916002840191908901906136c1565b508451611c2a90600383019060208801906136c1565b508951611c4090600483019060208d0190613783565b508851611c5690600583019060208c01906137fd565b508751611c6c90600683019060208b0190613837565b508651611c8290600783019060208a0190613890565b506000194201600882015560008054600e830155600154600f83015560025460108301556003546011830155600454601283015560055460138301556007839055338152600a60205260408082208490555183917fc2c021f5d73c63c481d336fbbafec58f694fc45095f00b02d2deb8cca59afe0791a25098975050505050505050565b333014611d5a576040805162461bcd60e51b815260206004820152601160248201527f4f6e6c792044414f2063616e2063616c6c000000000000000000000000000000604482015290519081900360640190fd5b600255565b333014611db3576040805162461bcd60e51b815260206004820152601160248201527f4f6e6c792044414f2063616e2063616c6c000000000000000000000000000000604482015290519081900360640190fd5b60058111611e08576040805162461bcd60e51b815260206004820152601d60248201527f71756f72756d206d7573742062652067726561746572207468616e2035000000604482015290519081900360640190fd5b6064811115611e5e576040805162461bcd60e51b815260206004820152600f60248201527f4d6178696d756d206973203130302e0000000000000000000000000000000000604482015290519081900360640190fd5b600555565b60005481565b60075481565b60096020908152600091825260409182902080546001808301546002808501805488516101009582161595909502600019011691909104601f810187900487028401870190975286835273ffffffffffffffffffffffffffffffffffffffff909316959094919291830182828015611f285780601f10611efd57610100808354040283529160200191611f28565b820191906000526020600020905b815481529060010190602001808311611f0b57829003601f168201915b5050505050908060030154908060040154905085565b333014611f92576040805162461bcd60e51b815260206004820152601160248201527f4f6e6c792044414f2063616e2063616c6c000000000000000000000000000000604482015290519081900360640190fd5b600055565b816000108015611fa957506007548211155b611fc55760405162461bcd60e51b81526004016108f5906141bc565b60008281526009602052604090206005611fde846116d6565b6009811115611fe957fe5b148015611ff95750600181015415155b6120155760405162461bcd60e51b81526004016108f590614389565b3360009081526005820160205260409020805460ff1615806120515750805460ff1680156120515750805460ff61010090910416151583151514155b61206d5760405162461bcd60e51b81526004016108f5906145fb565b600b5460018301546040517fcbf8eda900000000000000000000000000000000000000000000000000000000815260009273ffffffffffffffffffffffffffffffffffffffff169163cbf8eda9916120d091339160001990910190600401613ed0565b60206040518083038186803b1580156120e857600080fd5b505afa1580156120fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121209190613cfe565b9050600081116121425760405162461bcd60e51b81526004016108f590614094565b815460ff1615612191578154610100900460ff1615612178576001820154600384015461216e91612d10565b6003840155612191565b6001820154600484015461218b91612d10565b60048401555b83156121b05760038301546121a69082612d6d565b60038401556121c5565b60048301546121bf9082612d6d565b60048401555b8154600180840183905560ff19909116177fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010085151502178255604051339086907f80f2ad7e3e83d197670402663f224adb2f649967b9629c67dcfafa40c94d30f990610c539088908690614002565b60045481565b60055481565b600161224f826116d6565b600981111561225a57fe5b146122775760405162461bcd60e51b81526004016108f590614632565b600081815260086020908152604080832033808552600d8201909352908320600b5491939092909173ffffffffffffffffffffffffffffffffffffffff169063cbf8eda9906122c586612d01565b6040518363ffffffff1660e01b81526004016122e2929190613ed0565b60206040518083038186803b1580156122fa57600080fd5b505afa15801561230e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123329190613cfe565b825490915060ff166123565760405162461bcd60e51b81526004016108f5906144f9565b8154610100900460ff161561237e57600a8301546123749082612d10565b600a840155612393565b600b83015461238d9082612d10565b600b8401555b81546000600184018190557fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009091168355604051339186917f12beef84830227673717dd5522ee1228a8004e88dc2678d8740f582264efb2b69190a350505050565b60035481565b600b5474010000000000000000000000000000000000000000900460ff16156124365760405162461bcd60e51b81526004016108f5906144c2565b73ffffffffffffffffffffffffffffffffffffffff81166124695760405162461bcd60e51b81526004016108f59061448b565b600b80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff73ffffffffffffffffffffffffffffffffffffffff9093167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116179190911674010000000000000000000000000000000000000000179055565b60008160001080156124fe57506007548211155b61251a5760405162461bcd60e51b81526004016108f5906141bc565b600082815260086020526040902061253190612f67565b92915050565b33301461258b576040805162461bcd60e51b815260206004820152601160248201527f4f6e6c792044414f2063616e2063616c6c000000000000000000000000000000604482015290519081900360640190fd5b60648111156125e1576040805162461bcd60e51b815260206004820152600f60248201527f4d6178696d756d206973203130302e0000000000000000000000000000000000604482015290519081900360640190fd5b60328111612636576040805162461bcd60e51b815260206004820152600e60248201527f4d696e696d756d2069732035302e000000000000000000000000000000000000604482015290519081900360640190fd5b600455565b6004612646826116d6565b600981111561265157fe5b1461266e5760405162461bcd60e51b81526004016108f5906140cb565b600081815260086020819052604082206010810154600f820154600e8301549383015490930190920190910160098201819055600482015491929091905b818110156128b45760008460040182815481106126c557fe5b600091825260208220015460058701805473ffffffffffffffffffffffffffffffffffffffff909216935090849081106126fb57fe5b90600052602060002001549050600086600601848154811061271957fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156127a75780601f1061277c576101008083540402835291602001916127a7565b820191906000526020600020905b81548152906001019060200180831161278a57829003601f168201915b5050505050905060008760070185815481106127bf57fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529283018282801561284d5780601f106128225761010080835404028352916020019161284d565b820191906000526020600020905b81548152906001019060200180831161283057829003601f168201915b5050505050905060066000612865868686868d613159565b815260208101919091526040016000205460ff16156128965760405162461bcd60e51b81526004016108f590614298565b6128a3848484848b613284565b5050600190930192506126ac915050565b50837ff7230a453b4c21e4f2d0ef1ad055635b08cb2c884eaf24a5ddc7147c79fd8c2233846040516128e7929190613ed0565b60405180910390a250505050565b6128fe816132b9565b61291a5760405162461bcd60e51b81526004016108f590614530565b612923816132e3565b61293f5760405162461bcd60e51b81526004016108f590614128565b6000818152600860205260408120600c8101805460ff19166001179055600481015490915b818110156129865761297e836004018281548110610f3057fe5b600101612964565b50827f253042c67143aeb6d431bb762d75e5905f18fa7850b7b9edb31fedb7c362d7e8336040516110f79190613eaf565b6129bf6138e9565b50600091825260086020908152604080842073ffffffffffffffffffffffffffffffffffffffff939093168452600d9092018152918190208151606081018352815460ff8082161515835261010090910416151593810193909352600101549082015290565b612a2d6138e9565b50600091825260096020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845260059092018152918190208151606081018352815460ff8082161515835261010090910416151593810193909352600101549082015290565b60066020526000908152604090205460ff1681565b6006612ab3826116d6565b6009811115612abe57fe5b14612adb5760405162461bcd60e51b81526004016108f590614669565b6000818152600860205260408120600c810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16610100179055600481015490915b81811015612cd057612cc7836004018281548110612b3957fe5b60009182526020909120015460058501805473ffffffffffffffffffffffffffffffffffffffff9092169184908110612b6e57fe5b9060005260206000200154856006018481548110612b8857fe5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815292830182828015612c165780601f10612beb57610100808354040283529160200191612c16565b820191906000526020600020905b815481529060010190602001808311612bf957829003601f168201915b5050505050866007018581548110612c2a57fe5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815292830182828015612cb85780601f10612c8d57610100808354040283529160200191612cb8565b820191906000526020600020905b815481529060010190602001808311612c9b57829003601f168201915b505050505087600901546133e2565b50600101612b1f565b50827f9c85b616f29fca57a17eafe71cf9ff82ffef41766e2cf01ea7f8f7878dd3ec24336040516110f79190613eaf565b600e8101546008909101540190565b600082821115612d67576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600082820183811015612dc7576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6000612ddd8686868686613159565b6000908152600660205260409020805460ff19169055505050505050565b6000612ea26064600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f909e9676040518163ffffffff1660e01b815260040160206040518083038186803b158015612e6a57600080fd5b505afa158015612e7e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117a69190613cfe565b905090565b600082612eb657506000612531565b82820282848281612ec357fe5b0414612dc75760405162461bcd60e51b81526004018080602001828103825260218152602001806148186021913960400191505060405180910390fd5b6000808211612f56576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b818381612f5f57fe5b049392505050565b6013810154600b54600091612531916064916117a69173ffffffffffffffffffffffffffffffffffffffff16637654fff5612fa188612d01565b6040518263ffffffff1660e01b8152600401612fbd91906146d3565b60206040518083038186803b158015612fd557600080fd5b505afa158015612fe9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061300d9190613cfe565b90612ea7565b6000818152600860209081526040808320600990925282206001810154158061303f5750816009015442105b1561304f57600092505050611850565b600b5460018201546040517f7654fff50000000000000000000000000000000000000000000000000000000081526130ce9260029273ffffffffffffffffffffffffffffffffffffffff90911691637654fff5916130b691600019909101906004016146d3565b60206040518083038186803b158015612e6a57600080fd5b60039091015410159392505050565b6000806130e9836116d6565b905060008160098111156130f957fe5b14806131105750600181600981111561310e57fe5b145b806131265750600481600981111561312457fe5b145b8061313c5750600581600981111561313a57fe5b145b80612dc7575060065b81600981111561315157fe5b149392505050565b60008585858585604051602001808673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018060200180602001848152602001838103835286818151815260200191508051906020019080838360005b838110156131cc5781810151838201526020016131b4565b50505050905090810190601f1680156131f95780820380516001836020036101000a031916815260200191505b50838103825285518152855160209182019187019080838360005b8381101561322c578181015183820152602001613214565b50505050905090810190601f1680156132595780820380516001836020036101000a031916815260200191505b5097505050505050505060405160208183030381529060405280519060200120905095945050505050565b6000806132948787878787613159565b6000818152600660205260409020805460ff1916600117905591505095945050505050565b6000806132c5836116d6565b905060008160098111156132d557fe5b1480612dc757506001613145565b6000818152600860205260408120600181015473ffffffffffffffffffffffffffffffffffffffff163314806133ca575061331c612dfb565b600b5460018301546040517fc07473f600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9283169263c07473f69261337892911690600401613eaf565b60206040518083038186803b15801561339057600080fd5b505afa1580156133a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133c89190613cfe565b105b156133d9576001915050611850565b50600092915050565b606060006133f38787878787613159565b9050824210156134345760405162461bcd60e51b815260040180806020018281038252603b8152602001806147b4603b913960400191505060405180910390fd5b60035483014211156134775760405162461bcd60e51b81526004018080602001828103825260298152602001806147ef6029913960400191505060405180910390fd5b6000818152600660205260409020805460ff19169055845160609061349d575083613553565b85805190602001208560405160200180837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260040182805190602001908083835b6020831061351b57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016134de565b6001836020036101000a0380198251168184511680821785525050505050509050019250505060405160208183030381529060405290505b6000808973ffffffffffffffffffffffffffffffffffffffff1689846040518082805190602001908083835b602083106135bc57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0909201916020918201910161357f565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461361e576040519150601f19603f3d011682016040523d82523d6000602084013e613623565b606091505b50915091508181906136b35760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613678578181015183820152602001613660565b50505050905090810190601f1680156136a55780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b509998505050505050505050565b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826136f7576000855561373d565b82601f1061371057805160ff191683800117855561373d565b8280016001018555821561373d579182015b8281111561373d578251825591602001919060010190613722565b50613749929150613909565b5090565b6040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b82805482825590600052602060002090810192821561373d579160200282015b8281111561373d57825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9091161782556020909201916001909101906137a3565b82805482825590600052602060002090810192821561373d579160200282018281111561373d578251825591602001919060010190613722565b828054828255906000526020600020908101928215613884579160200282015b8281111561388457825180516138749184916020909101906136c1565b5091602001919060010190613857565b5061374992915061391e565b8280548282559060005260206000209081019282156138dd579160200282015b828111156138dd57825180516138cd9184916020909101906136c1565b50916020019190600101906138b0565b5061374992915061393b565b604080516060810182526000808252602082018190529181019190915290565b5b80821115613749576000815560010161390a565b808211156137495760006139328282613958565b5060010161391e565b8082111561374957600061394f8282613958565b5060010161393b565b50805460018160011615610100020316600290046000825580601f1061397e575061399c565b601f01602090049060005260206000209081019061399c9190613909565b50565b600067ffffffffffffffff8311156139b357fe5b6139e460207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f86011601614771565b90508281528383830111156139f857600080fd5b828260208301376000602084830101529392505050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461185057600080fd5b600082601f830112613a43578081fd5b81356020613a58613a5383614795565b614771565b8281528181019085830183850287018401881015613a74578586fd5b855b85811015613a9957613a8782613a0f565b84529284019290840190600101613a76565b5090979650505050505050565b600082601f830112613ab6578081fd5b81356020613ac6613a5383614795565b82815281810190858301855b85811015613a99578135880189603f820112613aec578788fd5b613afd8a878301356040840161399f565b8552509284019290840190600101613ad2565b600082601f830112613b20578081fd5b81356020613b30613a5383614795565b82815281810190858301855b85811015613a9957613b53898684358b0101613bbf565b84529284019290840190600101613b3c565b600082601f830112613b75578081fd5b81356020613b85613a5383614795565b8281528181019085830183850287018401881015613ba1578586fd5b855b85811015613a9957813584529284019290840190600101613ba3565b600082601f830112613bcf578081fd5b612dc78383356020850161399f565b600060208284031215613bef578081fd5b612dc782613a0f565b60008060008060008060c08789031215613c10578182fd5b863567ffffffffffffffff80821115613c27578384fd5b613c338a838b01613a33565b97506020890135915080821115613c48578384fd5b613c548a838b01613b65565b96506040890135915080821115613c69578384fd5b613c758a838b01613b10565b95506060890135915080821115613c8a578384fd5b613c968a838b01613aa6565b94506080890135915080821115613cab578384fd5b613cb78a838b01613bbf565b935060a0890135915080821115613ccc578283fd5b50613cd989828a01613bbf565b9150509295509295509295565b600060208284031215613cf7578081fd5b5035919050565b600060208284031215613d0f578081fd5b5051919050565b60008060408385031215613d28578182fd5b82359150613d3860208401613a0f565b90509250929050565b60008060408385031215613d53578182fd5b8235915060208301358015158114613d69578182fd5b809150509250929050565b60008060408385031215613d86578182fd5b82359150602083013567ffffffffffffffff811115613da3578182fd5b613daf85828601613bbf565b9150509250929050565b6000815180845260208085018081965082840281019150828601855b85811015613dff578284038952613ded848351613e0c565b98850198935090840190600101613dd5565b5091979650505050505050565b60008151808452815b81811015613e3157602081850181015186830182015201613e15565b81811115613e425782602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b805182526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a08301525050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b600073ffffffffffffffffffffffffffffffffffffffff8716825285602083015260a06040830152613f2b60a0830186613e0c565b606083019490945250608001529392505050565b6080808252855190820181905260009060209060a0840190828901845b82811015613f8e57815173ffffffffffffffffffffffffffffffffffffffff1684529284019290840190600101613f5c565b50505083810382850152865180825287830191830190845b81811015613fc257835183529284019291840191600101613fa6565b50508481036040860152613fd68188613db9565b925050508281036060840152613fec8185613db9565b979650505050505050565b901515815260200190565b9115158252602082015260400190565b60208101600a831061402057fe5b91905290565b60208082526012908201527f44414f206e6f7420796574206163746976650000000000000000000000000000604082015260600190565b6020808252601a908201527f6465736372697074696f6e2063616e277420626520656d707479000000000000604082015260600190565b6020808252600f908201527f6e6f20766f74696e6720706f7765720000000000000000000000000000000000604082015260600190565b6020808252602e908201527f50726f706f73616c2063616e206f6e6c7920626520717565756564206966206960408201527f7420697320737563636565646564000000000000000000000000000000000000606082015260800190565b60208082526021908201527f43616e63656c6c6174696f6e20726571756972656d656e7473206e6f74206d6560408201527f7400000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526012908201527f44414f20616c7265616479206163746976650000000000000000000000000000604082015260600190565b60208082526013908201527f696e76616c69642070726f706f73616c20696400000000000000000000000000604082015260600190565b60208082526019908201527f50726f706f73616c206d75737420626520696e20717565756500000000000000604082015260600190565b6020808252601a908201527f4372656174696f6e207468726573686f6c64206e6f74206d6574000000000000604082015260600190565b60208082526015908201527f5468726573686f6c64206e6f74206d6574207965740000000000000000000000604082015260600190565b60208082526025908201527f70726f706f73616c20616374696f6e20616c726561647920717565756564206160408201527f7420657461000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252602d908201527f50726f706f73616c2066756e6374696f6e20696e666f726d6174696f6e20706160408201527f72697479206d69736d6174636800000000000000000000000000000000000000606082015260800190565b60208082526014908201527f7469746c652063616e277420626520656d707479000000000000000000000000604082015260600190565b6020808252601e908201527f4162726f676174696f6e2050726f706f73616c206e6f74206163746976650000604082015260600190565b60208082526013908201527f43616e6e6f74206265206162726f676174656400000000000000000000000000604082015260600190565b6020808252601e908201527f4f6e65206c6976652070726f706f73616c207065722070726f706f7365720000604082015260600190565b60208082526022908201527f4162726f676174696f6e2070726f706f73616c20616c7265616479206578697360408201527f7473000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526018908201527f636f6d697469756d206d757374206e6f74206265203078300000000000000000604082015260600190565b6020808252601d908201527f436f6e747261637420616c726561647920696e697469616c697a65642e000000604082015260600190565b6020808252601e908201527f43616e6e6f742063616e63656c206966206e6f7420766f746564207965740000604082015260600190565b60208082526032908201527f50726f706f73616c20696e207374617465207468617420646f6573206e6f742060408201527f616c6c6f772063616e63656c6c6174696f6e0000000000000000000000000000606082015260800190565b60208082526014908201527f4d7573742070726f7669646520616374696f6e73000000000000000000000000604082015260600190565b6020808252601a908201527f546f6f206d616e7920616374696f6e73206f6e206120766f7465000000000000604082015260600190565b60208082526019908201527f416c726561647920766f7465642074686973206f7074696f6e00000000000000604082015260600190565b60208082526010908201527f566f74696e6720697320636c6f73656400000000000000000000000000000000604082015260600190565b60208082526012908201527f43616e6e6f742062652065786563757465640000000000000000000000000000604082015260600190565b60c081016125318284613e75565b8151151581526020808301511515908201526040918201519181019190915260600190565b90815260200190565b60006102008d835273ffffffffffffffffffffffffffffffffffffffff8d1660208401528060408401526147128184018d613e0c565b90508281036060840152614726818c613e0c565b9150508860808301528760a08301528660c08301528560e0830152841515610100830152831515610120830152614761610140830184613e75565b9c9b505050505050505050505050565b60405181810167ffffffffffffffff8111828210171561478d57fe5b604052919050565b600067ffffffffffffffff8211156147a957fe5b506020908102019056fe657865637574655472616e73616374696f6e3a205472616e73616374696f6e206861736e2774207375727061737365642074696d65206c6f636b2e657865637574655472616e73616374696f6e3a205472616e73616374696f6e206973207374616c652e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a26469706673582212200ff2a734dd2b297fd5b5c92d54662920dbdba7f781b6d6e2f6fa1c8c4d19c91964736f6c63430007060033
Loading...
Loading
Loading...
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.
[ 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.