ETH Price: $3,195.85 (-4.26%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Execute192063092024-02-11 17:29:47356 days ago1707672587IN
0x6f1e586C...68E109365
0 ETH0.0032882825.58535254
Queue191993572024-02-10 18:02:59357 days ago1707588179IN
0x6f1e586C...68E109365
0 ETH0.004396832
Cast Vote191718562024-02-06 21:26:11360 days ago1707254771IN
0x6f1e586C...68E109365
0 ETH0.0039538926
Propose191634432024-02-05 17:06:59362 days ago1707152819IN
0x6f1e586C...68E109365
0 ETH0.0199651525
Queue187848782023-12-14 14:09:59415 days ago1702562999IN
0x6f1e586C...68E109365
0 ETH0.00480935
Cast Vote187629622023-12-11 12:28:11418 days ago1702297691IN
0x6f1e586C...68E109365
0 ETH0.0043191332
Cast Vote187614732023-12-11 7:27:59418 days ago1702279679IN
0x6f1e586C...68E109365
0 ETH0.003366125
Cast Vote187614542023-12-11 7:24:11418 days ago1702279451IN
0x6f1e586C...68E109365
0 ETH0.003366125
Cast Vote187614282023-12-11 7:18:59418 days ago1702279139IN
0x6f1e586C...68E109365
0 ETH0.0032314524
Cast Vote187614132023-12-11 7:15:59418 days ago1702278959IN
0x6f1e586C...68E109365
0 ETH0.0030968123
Cast Vote187614032023-12-11 7:13:59418 days ago1702278839IN
0x6f1e586C...68E109365
0 ETH0.0035007426
Cast Vote187575672023-12-10 18:22:35419 days ago1702232555IN
0x6f1e586C...68E109365
0 ETH0.0060829240
Propose187481912023-12-09 10:51:59420 days ago1702119119IN
0x6f1e586C...68E109365
0 ETH0.0265543828
Execute184960062023-11-04 3:29:11455 days ago1699068551IN
0x6f1e586C...68E109365
0 ETH0.0025481412.7285106
Queue184771622023-11-01 12:10:23458 days ago1698840623IN
0x6f1e586C...68E109365
0 ETH0.0065218824
Cast Vote184619922023-10-30 9:10:23460 days ago1698657023IN
0x6f1e586C...68E109365
0 ETH0.0027054119.67991284
Cast Vote184511212023-10-28 20:37:35461 days ago1698525455IN
0x6f1e586C...68E109365
0 ETH0.0018850114
Cast Vote184508092023-10-28 19:34:23462 days ago1698521663IN
0x6f1e586C...68E109365
0 ETH0.0025582319
Cast Vote184454372023-10-28 1:31:23462 days ago1698456683IN
0x6f1e586C...68E109365
0 ETH0.0014810811
Cast Vote184454002023-10-28 1:23:47462 days ago1698456227IN
0x6f1e586C...68E109365
0 ETH0.0016157212
Cast Vote184453932023-10-28 1:22:23462 days ago1698456143IN
0x6f1e586C...68E109365
0 ETH0.0017503713
Cast Vote184453872023-10-28 1:21:11462 days ago1698456071IN
0x6f1e586C...68E109365
0 ETH0.0017503713
Cast Vote184453822023-10-28 1:20:11462 days ago1698456011IN
0x6f1e586C...68E109365
0 ETH0.0016157212
Cast Vote184357122023-10-26 16:54:59464 days ago1698339299IN
0x6f1e586C...68E109365
0 ETH0.003307224
Cast Vote184340142023-10-26 11:11:47464 days ago1698318707IN
0x6f1e586C...68E109365
0 ETH0.0025796417
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
Governance

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
Yes with 9999 runs

Other Settings:
default evmVersion
File 1 of 5 : Governance.sol
// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.7.6;
pragma experimental ABIEncoderV2;

import "./interfaces/IBarn.sol";
import "./Bridge.sol";
import "@openzeppelin/contracts/math/SafeMath.sol";

contract Governance is Bridge {
    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;
        // The number of votes the voter had, which were cast
        uint256 votes;
        // support
        bool support;
    }

    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;
    IBarn barn;
    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 barnAddr) public {
        require(isInitialized == false, "Contract already initialized.");
        require(barnAddr != address(0), "barn must not be 0x0");

        barn = IBarn(barnAddr);
        isInitialized = true;
    }

    function activate() public {
        require(!isActive, "DAO already active");
        require(barn.bondStaked() >= 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(barn.bondStaked() >= ACTIVATION_THRESHOLD, "DAO not yet active");
            isActive = true;
        }

        require(
            barn.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 arity 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;

        for (uint256 i = 0; i < proposal.targets.length; i++) {
            require(
                !queuedTransactions[_getTxHash(proposal.targets[i], proposal.values[i], proposal.signatures[i], proposal.calldatas[i], eta)],
                "proposal action already queued at eta"
            );

            queueTransaction(proposal.targets[i], proposal.values[i], proposal.signatures[i], proposal.calldatas[i], eta);
        }

        emit ProposalQueued(proposalId, msg.sender, eta);
    }

    function execute(uint256 proposalId) public payable {
        require(_canBeExecuted(proposalId), "Cannot be executed");

        Proposal storage proposal = proposals[proposalId];
        proposal.executed = true;

        for (uint256 i = 0; i < proposal.targets.length; 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;

        for (uint256 i = 0; i < proposal.targets.length; 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 = barn.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 = barn.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 vBOND 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(
            barn.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;

        for (uint256 i = 0; i < proposal.targets.length; 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 = barn.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 = barn.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;
        }

        if (block.timestamp <= proposal.createTime + proposal.parameters.warmUpDuration) {
            return ProposalState.WarmUp;
        }

        if (block.timestamp <= proposal.createTime + proposal.parameters.warmUpDuration + proposal.parameters.activeDuration) {
            return ProposalState.Active;
        }

        if ((proposal.forVotes + proposal.againstVotes) < _getQuorum(proposal) ||
            (proposal.forVotes < _getMinForVotes(proposal))) {
            return ProposalState.Failed;
        }

        if (proposal.eta == 0) {
            return ProposalState.Accepted;
        }

        if (block.timestamp < proposal.eta) {
            return ProposalState.Queued;
        }

        if (_proposalAbrogated(proposalId)) {
            return ProposalState.Abrogated;
        }

        if (block.timestamp <= proposal.eta + 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 ||
            barn.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 _canBeExecuted(uint256 proposalId) internal view returns (bool) {
        return state(proposalId) == ProposalState.Grace;
    }

    function _getMinForVotes(Proposal storage proposal) internal view returns (uint256) {
        return (proposal.forVotes + proposal.againstVotes).mul(proposal.parameters.acceptanceThreshold).div(100);
    }

    function _getCreationThreshold() internal view returns (uint256) {
        return barn.bondStaked().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 barn.bondStakedAtTs(_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 >= barn.bondStakedAtTs(cp.createTime - 1).div(2);
    }
}

File 2 of 5 : IBarn.sol
// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.7.6;
pragma experimental ABIEncoderV2;

interface IBarn {
    struct Stake {
        uint256 timestamp;
        uint256 amount;
        uint256 expiryTimestamp;
        address delegatedTo;
    }

    // deposit allows a user to add more bond 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 BOND balance of a user (bonus not included)
    function balanceOf(address user) external view returns (uint256);

    // balanceAtTs returns the amount of BOND 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);

    // bondStaked returns the total raw amount of BOND staked at the current block
    function bondStaked() external view returns (uint256);

    // bondStakedAtTs returns the total raw amount of BOND users have deposited into the contract
    // it does not include any bonus
    function bondStakedAtTs(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);
}

File 3 of 5 : Bridge.sol
// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.7.6;

import "./Parameters.sol";

abstract contract Bridge 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));
    }
}

File 4 of 5 : SafeMath.sol
// 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;
    }
}

File 5 of 5 : Parameters.sol
// SPDX-License-Identifier: Apache-2.0
pragma solidity 0.7.6;

abstract contract Parameters {
    uint256 public warmUpDuration = 4 days;
    uint256 public activeDuration = 4 days;
    uint256 public queueDuration = 4 days;
    uint256 public gracePeriodDuration = 4 days;

    uint256 public acceptanceThreshold = 60;
    uint256 public minQuorum = 45;

    uint256 constant ACTIVATION_THRESHOLD = 26_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;
    }
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 9999
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"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":"uint256","name":"votes","type":"uint256"},{"internalType":"bool","name":"support","type":"bool"}],"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":"uint256","name":"votes","type":"uint256"},{"internalType":"bool","name":"support","type":"bool"}],"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":"barnAddr","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"}]

608060405262054600600055620546006001556205460060025562054600600355603c600455602d60055534801561003657600080fd5b50614988806100466000396000f3fe6080604052600436106102535760003560e01c80635f2e9f6011610138578063c4d66de8116100b0578063e0a8f6f51161007f578063e4e2d26111610064578063e4e2d261146106a0578063f2b06537146106c0578063fe0d94c1146106e05761025a565b8063e0a8f6f514610653578063e23a9a52146106735761025a565b8063c4d66de8146105d3578063d0cd595e146105f3578063d1291f1914610613578063ddf0b009146106335761025a565b80639e70a23411610107578063b5a127e5116100ec578063b5a127e514610589578063bacbe2da1461059e578063c099f575146105be5761025a565b80639e70a23414610554578063b0edbb9b146105745761025a565b80635f2e9f60146104d957806374cb3041146104ee5780638b787e3014610503578063984690db146105345761025a565b8063328dd982116101cb5780633e4f49e61161019a578063490145c81161017f578063490145c81461047957806353e5056a14610499578063563909de146104b95761025a565b80633e4f49e61461041f578063458921551461044c5761025a565b8063328dd9821461039a578063342d067a146103ca57806339e778ee146103ea5780633d05f0091461040a5761025a565b80631e9d1e641161022257806324b437871161020757806324b437871461034557806324cd62d3146103655780632e8e34e1146103855761025a565b80631e9d1e641461030357806322f3e2d4146103235761025a565b8063013cf08b1461025f5780630f15f4c01461029f57806315373e3d146102b657806317977c61146102d65761025a565b3661025a57005b600080fd5b34801561026b57600080fd5b5061027f61027a366004613e00565b6106f3565b6040516102969b9a999897969594939291906147f6565b60405180910390f35b3480156102ab57600080fd5b506102b46108b9565b005b3480156102c257600080fd5b506102b46102d1366004613e5b565b610a0b565b3480156102e257600080fd5b506102f66102f1366004613cf8565b610c42565b60405161029691906147ed565b34801561030f57600080fd5b506102b461031e366004613e00565b610c54565b34801561032f57600080fd5b50610338610e43565b6040516102969190614111565b34801561035157600080fd5b506102b4610360366004613e00565b610e65565b34801561037157600080fd5b506102b4610380366004613e00565b6110ce565b34801561039157600080fd5b506102f661117e565b3480156103a657600080fd5b506103ba6103b5366004613e00565b611184565b6040516102969493929190614059565b3480156103d657600080fd5b506102b46103e5366004613e00565b611420565b3480156103f657600080fd5b506102b4610405366004613e8e565b6114d0565b34801561041657600080fd5b506102f66116a7565b34801561042b57600080fd5b5061043f61043a366004613e00565b6116ad565b604051610296919061412c565b34801561045857600080fd5b5061046c610467366004613e00565b6117fb565b60405161029691906147ba565b34801561048557600080fd5b506102f6610494366004613d12565b61185f565b3480156104a557600080fd5b506102b46104b4366004613e00565b611cac565b3480156104c557600080fd5b506102b46104d4366004613e00565b611d05565b3480156104e557600080fd5b506102f6611e09565b3480156104fa57600080fd5b506102f6611e0f565b34801561050f57600080fd5b5061052361051e366004613e00565b611e15565b604051610296959493929190614010565b34801561054057600080fd5b506102b461054f366004613e00565b611ee4565b34801561056057600080fd5b506102b461056f366004613e5b565b611f3d565b34801561058057600080fd5b506102f66121be565b34801561059557600080fd5b506102f66121c4565b3480156105aa57600080fd5b506102b46105b9366004613e00565b6121ca565b3480156105ca57600080fd5b506102f6612367565b3480156105df57600080fd5b506102b46105ee366004613cf8565b61236d565b3480156105ff57600080fd5b506102f661060e366004613e00565b61245c565b34801561061f57600080fd5b506102b461062e366004613e00565b6124a9565b34801561063f57600080fd5b506102b461064e366004613e00565b6125ad565b34801561065f57600080fd5b506102b461066e366004613e00565b6129cb565b34801561067f57600080fd5b5061069361068e366004613e30565b612a8b565b60405161029691906147c8565b3480156106ac57600080fd5b506106936106bb366004613e30565b612afc565b3480156106cc57600080fd5b506103386106db366004613e00565b612b6d565b6102b46106ee366004613e00565b612b82565b60086020908152600091825260409182902080546001808301546002808501805488516101009582161595909502600019011691909104601f8101879004870284018701909752868352929573ffffffffffffffffffffffffffffffffffffffff909116949192918301828280156107ac5780601f10610781576101008083540402835291602001916107ac565b820191906000526020600020905b81548152906001019060200180831161078f57829003601f168201915b5050505060038301805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815294959493509083018282801561083c5780601f106108115761010080835404028352916020019161083c565b820191906000526020600020905b81548152906001019060200180831161081f57829003601f168201915b50505060088401546009850154600a860154600b870154600c8801546040805160c081018252600e8b01548152600f8b0154602082015260108b01549181019190915260118a0154606082015260128a0154608082015260139099015460a08a0152969793969295509093509160ff80831692610100900416908b565b600b547501000000000000000000000000000000000000000000900460ff16156108fe5760405162461bcd60e51b81526004016108f59061429f565b60405180910390fd5b600b54604080517fc2077e8100000000000000000000000000000000000000000000000000000000815290516a1581b6d300d0225a0000009273ffffffffffffffffffffffffffffffffffffffff169163c2077e81916004808301926020929190829003018186803b15801561097357600080fd5b505afa158015610987573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ab9190613e18565b10156109c95760405162461bcd60e51b81526004016108f59061437b565b600b80547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff167501000000000000000000000000000000000000000000179055565b6001610a16836116ad565b6009811115610a2157fe5b14610a3e5760405162461bcd60e51b81526004016108f590614715565b6000828152600860209081526040808320338452600d8101909252909120805460ff161580610a845750805460ff168015610a845750600281015460ff16151583151514155b610aa05760405162461bcd60e51b81526004016108f590614681565b600b5460009073ffffffffffffffffffffffffffffffffffffffff1663cbf8eda933610acb86612dcb565b6040518363ffffffff1660e01b8152600401610ae8929190613fea565b60206040518083038186803b158015610b0057600080fd5b505afa158015610b14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b389190613e18565b905060008111610b5a5760405162461bcd60e51b81526004016108f5906141ae565b815460ff1615610ba757600282015460ff1615610b8e576001820154600a840154610b8491612dda565b600a840155610ba7565b6001820154600b840154610ba191612dda565b600b8401555b8315610bc657600a830154610bbc9082612e37565b600a840155610bdb565b600b830154610bd59082612e37565b600b8401555b8154600160ff19918216811784558301829055600283018054909116851515179055604051339086907f88d35328232823f54954b6627e9f732371656f6daa40cb1b01b27dc7875a7b4790610c33908890869061411c565b60405180910390a35050505050565b600a6020526000908152604090205481565b806000108015610c6657506007548111155b610c825760405162461bcd60e51b81526004016108f5906142d6565b60008181526009602090815260408083203384526005808201909352922090610caa846116ad565b6009811115610cb557fe5b148015610cc55750600182015415155b610ce15760405162461bcd60e51b81526004016108f590614446565b600b5460018301546040517fcbf8eda900000000000000000000000000000000000000000000000000000000815260009273ffffffffffffffffffffffffffffffffffffffff169163cbf8eda991610d4491339160001990910190600401613fea565b60206040518083038186803b158015610d5c57600080fd5b505afa158015610d70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d949190613e18565b825490915060ff16610db85760405162461bcd60e51b81526004016108f59061457f565b600282015460ff1615610dde576003830154610dd49082612dda565b6003840155610df3565b6004830154610ded9082612dda565b60048401555b815460ff199081168355600060018401819055600284018054909216909155604051339186917f5e8ee24f838173ed2ae7989835696f6e11945ac8fbc5259aef01cc4d7f0d49209190a350505050565b600b547501000000000000000000000000000000000000000000900460ff1681565b6009610e70826116ad565b6009811115610e7b57fe5b14610e985760405162461bcd60e51b81526004016108f59061447d565b6000818152600860205260409020600c81015460ff1615610ecb5760405162461bcd60e51b81526004016108f59061447d565b600c8101805460ff1916600117905560005b600482015481101561109157611089826004018281548110610efb57fe5b60009182526020909120015460058401805473ffffffffffffffffffffffffffffffffffffffff9092169184908110610f3057fe5b9060005260206000200154846006018481548110610f4a57fe5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815292830182828015610fd85780601f10610fad57610100808354040283529160200191610fd8565b820191906000526020600020905b815481529060010190602001808311610fbb57829003601f168201915b5050505050856007018581548110610fec57fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529283018282801561107a5780601f1061104f5761010080835404028352916020019161107a565b820191906000526020600020905b81548152906001019060200180831161105d57829003601f168201915b50505050508660090154612e98565b600101610edd565b50817f6d7acd63bebeaf524f1761a88687951f776fc7c182205f820424c7fb572c7235336040516110c29190613fc9565b60405180910390a25050565b333014611122576040805162461bcd60e51b815260206004820152601160248201527f4f6e6c792044414f2063616e2063616c6c000000000000000000000000000000604482015290519081900360640190fd5b613840811015611179576040805162461bcd60e51b815260206004820152601260248201527f706572696f64206d757374206265203e20300000000000000000000000000000604482015290519081900360640190fd5b600155565b60025481565b6060806060806000600860008781526020019081526020016000209050806004018160050182600601836007018380548060200260200160405190810160405280929190818152602001828054801561121357602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116111e8575b505050505093508280548060200260200160405190810160405280929190818152602001828054801561126557602002820191906000526020600020905b815481526020019060010190808311611251575b5050505050925081805480602002602001604051908101604052809291908181526020016000905b828210156113385760008481526020908190208301805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156113245780601f106112f957610100808354040283529160200191611324565b820191906000526020600020905b81548152906001019060200180831161130757829003601f168201915b50505050508152602001906001019061128d565b50505050915080805480602002602001604051908101604052809291908181526020016000905b8282101561140a5760008481526020908190208301805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156113f65780601f106113cb576101008083540402835291602001916113f6565b820191906000526020600020905b8154815290600101906020018083116113d957829003601f168201915b50505050508152602001906001019061135f565b5050505090509450945094509450509193509193565b333014611474576040805162461bcd60e51b815260206004820152601160248201527f4f6e6c792044414f2063616e2063616c6c000000000000000000000000000000604482015290519081900360640190fd5b6138408110156114cb576040805162461bcd60e51b815260206004820152601260248201527f706572696f64206d757374206265203e20300000000000000000000000000000604482015290519081900360640190fd5b600355565b60056114db836116ad565b60098111156114e657fe5b146115035760405162461bcd60e51b81526004016108f59061430d565b61150b612ec5565b600b546040517fcbf8eda900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063cbf8eda990611567903390600019420190600401613fea565b60206040518083038186803b15801561157f57600080fd5b505afa158015611593573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115b79190613e18565b10156115d55760405162461bcd60e51b81526004016108f590614344565b60008281526009602052604090206001810154156116055760405162461bcd60e51b81526004016108f5906144eb565b60008251116116265760405162461bcd60e51b81526004016108f590614177565b42600182015580547fffffffffffffffffffffffff00000000000000000000000000000000000000001633178155815161166990600283019060208501906137db565b50827f27eba018e1c52b84f732fe4d806fd9750c60752f1d37e7f70bcb4cbec65b1c6a3360405161169a9190613fc9565b60405180910390a2505050565b60015481565b60008160001080156116c157506007548211155b6116dd5760405162461bcd60e51b81526004016108f5906142d6565b6000828152600860205260409020600c81015460ff16156117025760029150506117f6565b600c810154610100900460ff161561171e5760089150506117f6565b600e81015460088201540142116117395760009150506117f6565b600f810154600e82015460088301540101421161175a5760019150506117f6565b61176381612f77565b81600b015482600a0154011080611785575061177e81613023565b81600a0154105b156117945760039150506117f6565b60098101546117a75760049150506117f6565b80600901544210156117bd5760059150506117f6565b6117c68361304e565b156117d55760099150506117f6565b601181015460098201540142116117f05760069150506117f6565b60079150505b919050565b611803613867565b50600090815260086020908152604091829020825160c081018452600e8201548152600f82015492810192909252601081015492820192909252601182015460608201526012820154608082015260139091015460a082015290565b600b546000907501000000000000000000000000000000000000000000900460ff1661199157600b54604080517fc2077e8100000000000000000000000000000000000000000000000000000000815290516a1581b6d300d0225a0000009273ffffffffffffffffffffffffffffffffffffffff169163c2077e81916004808301926020929190829003018186803b1580156118fa57600080fd5b505afa15801561190e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119329190613e18565b10156119505760405162461bcd60e51b81526004016108f590614140565b600b80547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000001790555b611999612ec5565b600b546040517fcbf8eda900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063cbf8eda9906119f5903390600019420190600401613fea565b60206040518083038186803b158015611a0d57600080fd5b505afa158015611a21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a459190613e18565b1015611a635760405162461bcd60e51b81526004016108f590614344565b85518751148015611a75575084518751145b8015611a82575083518751145b611a9e5760405162461bcd60e51b81526004016108f5906146b8565b8651611abc5760405162461bcd60e51b81526004016108f590614613565b600a87511115611ade5760405162461bcd60e51b81526004016108f59061464a565b6000825111611aff5760405162461bcd60e51b81526004016108f59061440f565b6000835111611b205760405162461bcd60e51b81526004016108f590614177565b336000908152600a60205260409020548015611b5c57611b3f81613118565b15611b5c5760405162461bcd60e51b81526004016108f5906144b4565b6007546001908101600081815260086020908152604090912082815592830180547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790558651919291611bba916002840191908901906137db565b508451611bd090600383019060208801906137db565b508951611be690600483019060208d019061389d565b508851611bfc90600583019060208c0190613917565b508751611c1290600683019060208b0190613951565b508651611c2890600783019060208a01906139aa565b506000194201600882015560008054600e830155600154600f83015560025460108301556003546011830155600454601283015560055460138301556007839055338152600a60205260408082208490555183917fc2c021f5d73c63c481d336fbbafec58f694fc45095f00b02d2deb8cca59afe0791a25098975050505050505050565b333014611d00576040805162461bcd60e51b815260206004820152601160248201527f4f6e6c792044414f2063616e2063616c6c000000000000000000000000000000604482015290519081900360640190fd5b600255565b333014611d59576040805162461bcd60e51b815260206004820152601160248201527f4f6e6c792044414f2063616e2063616c6c000000000000000000000000000000604482015290519081900360640190fd5b60058111611dae576040805162461bcd60e51b815260206004820152601d60248201527f71756f72756d206d7573742062652067726561746572207468616e2035000000604482015290519081900360640190fd5b6064811115611e04576040805162461bcd60e51b815260206004820152600f60248201527f4d6178696d756d206973203130302e0000000000000000000000000000000000604482015290519081900360640190fd5b600555565b60005481565b60075481565b60096020908152600091825260409182902080546001808301546002808501805488516101009582161595909502600019011691909104601f810187900487028401870190975286835273ffffffffffffffffffffffffffffffffffffffff909316959094919291830182828015611ece5780601f10611ea357610100808354040283529160200191611ece565b820191906000526020600020905b815481529060010190602001808311611eb157829003601f168201915b5050505050908060030154908060040154905085565b333014611f38576040805162461bcd60e51b815260206004820152601160248201527f4f6e6c792044414f2063616e2063616c6c000000000000000000000000000000604482015290519081900360640190fd5b600055565b816000108015611f4f57506007548211155b611f6b5760405162461bcd60e51b81526004016108f5906142d6565b60008281526009602052604090206005611f84846116ad565b6009811115611f8f57fe5b148015611f9f5750600181015415155b611fbb5760405162461bcd60e51b81526004016108f590614446565b3360009081526005820160205260409020805460ff161580611ff45750805460ff168015611ff45750600281015460ff16151583151514155b6120105760405162461bcd60e51b81526004016108f590614681565b600b5460018301546040517fcbf8eda900000000000000000000000000000000000000000000000000000000815260009273ffffffffffffffffffffffffffffffffffffffff169163cbf8eda99161207391339160001990910190600401613fea565b60206040518083038186803b15801561208b57600080fd5b505afa15801561209f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120c39190613e18565b9050600081116120e55760405162461bcd60e51b81526004016108f5906141ae565b815460ff161561213257600282015460ff1615612119576001820154600384015461210f91612dda565b6003840155612132565b6001820154600484015461212c91612dda565b60048401555b83156121515760038301546121479082612e37565b6003840155612166565b60048301546121609082612e37565b60048401555b8154600160ff19918216811784558301829055600283018054909116851515179055604051339086907f80f2ad7e3e83d197670402663f224adb2f649967b9629c67dcfafa40c94d30f990610c33908890869061411c565b60045481565b60055481565b60016121d5826116ad565b60098111156121e057fe5b146121fd5760405162461bcd60e51b81526004016108f590614715565b600081815260086020908152604080832033808552600d8201909352908320600b5491939092909173ffffffffffffffffffffffffffffffffffffffff169063cbf8eda99061224b86612dcb565b6040518363ffffffff1660e01b8152600401612268929190613fea565b60206040518083038186803b15801561228057600080fd5b505afa158015612294573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122b89190613e18565b825490915060ff166122dc5760405162461bcd60e51b81526004016108f59061457f565b600282015460ff161561230257600a8301546122f89082612dda565b600a840155612317565b600b8301546123119082612dda565b600b8401555b815460ff199081168355600060018401819055600284018054909216909155604051339186917f12beef84830227673717dd5522ee1228a8004e88dc2678d8740f582264efb2b69190a350505050565b60035481565b600b5474010000000000000000000000000000000000000000900460ff16156123a85760405162461bcd60e51b81526004016108f590614548565b73ffffffffffffffffffffffffffffffffffffffff81166123db5760405162461bcd60e51b81526004016108f590614783565b600b80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff73ffffffffffffffffffffffffffffffffffffffff9093167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116179190911674010000000000000000000000000000000000000000179055565b600081600010801561247057506007548211155b61248c5760405162461bcd60e51b81526004016108f5906142d6565b60008281526008602052604090206124a390612f77565b92915050565b3330146124fd576040805162461bcd60e51b815260206004820152601160248201527f4f6e6c792044414f2063616e2063616c6c000000000000000000000000000000604482015290519081900360640190fd5b6064811115612553576040805162461bcd60e51b815260206004820152600f60248201527f4d6178696d756d206973203130302e0000000000000000000000000000000000604482015290519081900360640190fd5b603281116125a8576040805162461bcd60e51b815260206004820152600e60248201527f4d696e696d756d2069732035302e000000000000000000000000000000000000604482015290519081900360640190fd5b600455565b60046125b8826116ad565b60098111156125c357fe5b146125e05760405162461bcd60e51b81526004016108f5906141e5565b600081815260086020819052604082206010810154600f820154600e830154938301549093019092019091016009820181905590915b600483015481101561299857600660006127c285600401848154811061263857fe5b60009182526020909120015460058701805473ffffffffffffffffffffffffffffffffffffffff909216918690811061266d57fe5b906000526020600020015487600601868154811061268757fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156127155780601f106126ea57610100808354040283529160200191612715565b820191906000526020600020905b8154815290600101906020018083116126f857829003601f168201915b505050505088600701878154811061272957fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156127b75780601f1061278c576101008083540402835291602001916127b7565b820191906000526020600020905b81548152906001019060200180831161279a57829003601f168201915b505050505088613194565b815260208101919091526040016000205460ff16156127f35760405162461bcd60e51b81526004016108f5906143b2565b61298f83600401828154811061280557fe5b60009182526020909120015460058501805473ffffffffffffffffffffffffffffffffffffffff909216918490811061283a57fe5b906000526020600020015485600601848154811061285457fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156128e25780601f106128b7576101008083540402835291602001916128e2565b820191906000526020600020905b8154815290600101906020018083116128c557829003601f168201915b50505050508660070185815481106128f657fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156129845780601f1061295957610100808354040283529160200191612984565b820191906000526020600020905b81548152906001019060200180831161296757829003601f168201915b5050505050866132bf565b50600101612616565b50827ff7230a453b4c21e4f2d0ef1ad055635b08cb2c884eaf24a5ddc7147c79fd8c22338360405161169a929190613fea565b6129d4816132f4565b6129f05760405162461bcd60e51b81526004016108f5906145b6565b6129f98161331e565b612a155760405162461bcd60e51b81526004016108f590614242565b6000818152600860205260408120600c8101805460ff19166001179055905b6004820154811015612a5a57612a52826004018281548110610efb57fe5b600101612a34565b50817f253042c67143aeb6d431bb762d75e5905f18fa7850b7b9edb31fedb7c362d7e8336040516110c29190613fc9565b612a93613a03565b50600091825260086020908152604080842073ffffffffffffffffffffffffffffffffffffffff939093168452600d9092018152918190208151606081018352815460ff9081161515825260018301549482019490945260029091015490921615159082015290565b612b04613a03565b50600091825260096020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845260059092018152918190208151606081018352815460ff9081161515825260018301549482019490945260029091015490921615159082015290565b60066020526000908152604090205460ff1681565b612b8b8161341d565b612ba75760405162461bcd60e51b81526004016108f59061474c565b6000818152600860205260408120600c810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16610100179055905b6004820154811015612d9a57612d91826004018281548110612c0357fe5b60009182526020909120015460058401805473ffffffffffffffffffffffffffffffffffffffff9092169184908110612c3857fe5b9060005260206000200154846006018481548110612c5257fe5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815292830182828015612ce05780601f10612cb557610100808354040283529160200191612ce0565b820191906000526020600020905b815481529060010190602001808311612cc357829003601f168201915b5050505050856007018581548110612cf457fe5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815292830182828015612d825780601f10612d5757610100808354040283529160200191612d82565b820191906000526020600020905b815481529060010190602001808311612d6557829003601f168201915b5050505050866009015461343c565b50600101612be5565b50817f9c85b616f29fca57a17eafe71cf9ff82ffef41766e2cf01ea7f8f7878dd3ec24336040516110c29190613fc9565b600e8101546008909101540190565b600082821115612e31576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600082820183811015612e91576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6000612ea78686868686613194565b6000908152600660205260409020805460ff19169055505050505050565b6000612f726064600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c2077e816040518163ffffffff1660e01b815260040160206040518083038186803b158015612f3457600080fd5b505afa158015612f48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f6c9190613e18565b9061371b565b905090565b6013810154600b546000916124a391606491612f6c9173ffffffffffffffffffffffffffffffffffffffff1663f77f962f612fb188612dcb565b6040518263ffffffff1660e01b8152600401612fcd91906147ed565b60206040518083038186803b158015612fe557600080fd5b505afa158015612ff9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061301d9190613e18565b90613782565b60006124a36064612f6c84600e016004015485600b015486600a01540161378290919063ffffffff16565b6000818152600860209081526040808320600990925282206001810154158061307a5750816009015442105b1561308a576000925050506117f6565b600b5460018201546040517ff77f962f0000000000000000000000000000000000000000000000000000000081526131099260029273ffffffffffffffffffffffffffffffffffffffff9091169163f77f962f916130f191600019909101906004016147ed565b60206040518083038186803b158015612f3457600080fd5b60039091015410159392505050565b600080613124836116ad565b9050600081600981111561313457fe5b148061314b5750600181600981111561314957fe5b145b806131615750600481600981111561315f57fe5b145b806131775750600581600981111561317557fe5b145b80612e91575060065b81600981111561318c57fe5b149392505050565b60008585858585604051602001808673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018060200180602001848152602001838103835286818151815260200191508051906020019080838360005b838110156132075781810151838201526020016131ef565b50505050905090810190601f1680156132345780820380516001836020036101000a031916815260200191505b50838103825285518152855160209182019187019080838360005b8381101561326757818101518382015260200161324f565b50505050905090810190601f1680156132945780820380516001836020036101000a031916815260200191505b5097505050505050505060405160208183030381529060405280519060200120905095945050505050565b6000806132cf8787878787613194565b6000818152600660205260409020805460ff1916600117905591505095945050505050565b600080613300836116ad565b9050600081600981111561331057fe5b1480612e9157506001613180565b6000818152600860205260408120600181015473ffffffffffffffffffffffffffffffffffffffff163314806134055750613357612ec5565b600b5460018301546040517fc07473f600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9283169263c07473f6926133b392911690600401613fc9565b60206040518083038186803b1580156133cb57600080fd5b505afa1580156133df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134039190613e18565b105b156134145760019150506117f6565b50600092915050565b6000600661342a836116ad565b600981111561343557fe5b1492915050565b6060600061344d8787878787613194565b90508242101561348e5760405162461bcd60e51b815260040180806020018281038252603b8152602001806148ce603b913960400191505060405180910390fd5b60035483014211156134d15760405162461bcd60e51b81526004018080602001828103825260298152602001806149096029913960400191505060405180910390fd5b6000818152600660205260409020805460ff1916905584516060906134f75750836135ad565b85805190602001208560405160200180837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260040182805190602001908083835b6020831061357557805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613538565b6001836020036101000a0380198251168184511680821785525050505050509050019250505060405160208183030381529060405290505b6000808973ffffffffffffffffffffffffffffffffffffffff1689846040518082805190602001908083835b6020831061361657805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016135d9565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613678576040519150601f19603f3d011682016040523d82523d6000602084013e61367d565b606091505b509150915081819061370d5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156136d25781810151838201526020016136ba565b50505050905090810190601f1680156136ff5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b509998505050505050505050565b6000808211613771576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b81838161377a57fe5b049392505050565b600082613791575060006124a3565b8282028284828161379e57fe5b0414612e915760405162461bcd60e51b81526004018080602001828103825260218152602001806149326021913960400191505060405180910390fd5b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826138115760008555613857565b82601f1061382a57805160ff1916838001178555613857565b82800160010185558215613857579182015b8281111561385757825182559160200191906001019061383c565b50613863929150613a23565b5090565b6040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b828054828255906000526020600020908101928215613857579160200282015b8281111561385757825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9091161782556020909201916001909101906138bd565b828054828255906000526020600020908101928215613857579160200282018281111561385757825182559160200191906001019061383c565b82805482825590600052602060002090810192821561399e579160200282015b8281111561399e578251805161398e9184916020909101906137db565b5091602001919060010190613971565b50613863929150613a38565b8280548282559060005260206000209081019282156139f7579160200282015b828111156139f757825180516139e79184916020909101906137db565b50916020019190600101906139ca565b50613863929150613a55565b604080516060810182526000808252602082018190529181019190915290565b5b808211156138635760008155600101613a24565b80821115613863576000613a4c8282613a72565b50600101613a38565b80821115613863576000613a698282613a72565b50600101613a55565b50805460018160011615610100020316600290046000825580601f10613a985750613ab6565b601f016020900490600052602060002090810190613ab69190613a23565b50565b600067ffffffffffffffff831115613acd57fe5b613afe60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8601160161488b565b9050828152838383011115613b1257600080fd5b828260208301376000602084830101529392505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146117f657600080fd5b600082601f830112613b5d578081fd5b81356020613b72613b6d836148af565b61488b565b8281528181019085830183850287018401881015613b8e578586fd5b855b85811015613bb357613ba182613b29565b84529284019290840190600101613b90565b5090979650505050505050565b600082601f830112613bd0578081fd5b81356020613be0613b6d836148af565b82815281810190858301855b85811015613bb3578135880189603f820112613c06578788fd5b613c178a8783013560408401613ab9565b8552509284019290840190600101613bec565b600082601f830112613c3a578081fd5b81356020613c4a613b6d836148af565b82815281810190858301855b85811015613bb357613c6d898684358b0101613cd9565b84529284019290840190600101613c56565b600082601f830112613c8f578081fd5b81356020613c9f613b6d836148af565b8281528181019085830183850287018401881015613cbb578586fd5b855b85811015613bb357813584529284019290840190600101613cbd565b600082601f830112613ce9578081fd5b612e9183833560208501613ab9565b600060208284031215613d09578081fd5b612e9182613b29565b60008060008060008060c08789031215613d2a578182fd5b863567ffffffffffffffff80821115613d41578384fd5b613d4d8a838b01613b4d565b97506020890135915080821115613d62578384fd5b613d6e8a838b01613c7f565b96506040890135915080821115613d83578384fd5b613d8f8a838b01613c2a565b95506060890135915080821115613da4578384fd5b613db08a838b01613bc0565b94506080890135915080821115613dc5578384fd5b613dd18a838b01613cd9565b935060a0890135915080821115613de6578283fd5b50613df389828a01613cd9565b9150509295509295509295565b600060208284031215613e11578081fd5b5035919050565b600060208284031215613e29578081fd5b5051919050565b60008060408385031215613e42578182fd5b82359150613e5260208401613b29565b90509250929050565b60008060408385031215613e6d578182fd5b8235915060208301358015158114613e83578182fd5b809150509250929050565b60008060408385031215613ea0578182fd5b82359150602083013567ffffffffffffffff811115613ebd578182fd5b613ec985828601613cd9565b9150509250929050565b6000815180845260208085018081965082840281019150828601855b85811015613f19578284038952613f07848351613f26565b98850198935090840190600101613eef565b5091979650505050505050565b60008151808452815b81811015613f4b57602081850181015186830182015201613f2f565b81811115613f5c5782602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b805182526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a08301525050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b600073ffffffffffffffffffffffffffffffffffffffff8716825285602083015260a0604083015261404560a0830186613f26565b606083019490945250608001529392505050565b6080808252855190820181905260009060209060a0840190828901845b828110156140a857815173ffffffffffffffffffffffffffffffffffffffff1684529284019290840190600101614076565b50505083810382850152865180825287830191830190845b818110156140dc578351835292840192918401916001016140c0565b505084810360408601526140f08188613ed3565b9250505082810360608401526141068185613ed3565b979650505050505050565b901515815260200190565b9115158252602082015260400190565b60208101600a831061413a57fe5b91905290565b60208082526012908201527f44414f206e6f7420796574206163746976650000000000000000000000000000604082015260600190565b6020808252601a908201527f6465736372697074696f6e2063616e277420626520656d707479000000000000604082015260600190565b6020808252600f908201527f6e6f20766f74696e6720706f7765720000000000000000000000000000000000604082015260600190565b6020808252602e908201527f50726f706f73616c2063616e206f6e6c7920626520717565756564206966206960408201527f7420697320737563636565646564000000000000000000000000000000000000606082015260800190565b60208082526021908201527f43616e63656c6c6174696f6e20726571756972656d656e7473206e6f74206d6560408201527f7400000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526012908201527f44414f20616c7265616479206163746976650000000000000000000000000000604082015260600190565b60208082526013908201527f696e76616c69642070726f706f73616c20696400000000000000000000000000604082015260600190565b60208082526019908201527f50726f706f73616c206d75737420626520696e20717565756500000000000000604082015260600190565b6020808252601a908201527f4372656174696f6e207468726573686f6c64206e6f74206d6574000000000000604082015260600190565b60208082526015908201527f5468726573686f6c64206e6f74206d6574207965740000000000000000000000604082015260600190565b60208082526025908201527f70726f706f73616c20616374696f6e20616c726561647920717565756564206160408201527f7420657461000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526014908201527f7469746c652063616e277420626520656d707479000000000000000000000000604082015260600190565b6020808252601e908201527f4162726f676174696f6e2050726f706f73616c206e6f74206163746976650000604082015260600190565b60208082526013908201527f43616e6e6f74206265206162726f676174656400000000000000000000000000604082015260600190565b6020808252601e908201527f4f6e65206c6976652070726f706f73616c207065722070726f706f7365720000604082015260600190565b60208082526022908201527f4162726f676174696f6e2070726f706f73616c20616c7265616479206578697360408201527f7473000000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601d908201527f436f6e747261637420616c726561647920696e697469616c697a65642e000000604082015260600190565b6020808252601e908201527f43616e6e6f742063616e63656c206966206e6f7420766f746564207965740000604082015260600190565b60208082526032908201527f50726f706f73616c20696e207374617465207468617420646f6573206e6f742060408201527f616c6c6f772063616e63656c6c6174696f6e0000000000000000000000000000606082015260800190565b60208082526014908201527f4d7573742070726f7669646520616374696f6e73000000000000000000000000604082015260600190565b6020808252601a908201527f546f6f206d616e7920616374696f6e73206f6e206120766f7465000000000000604082015260600190565b60208082526019908201527f416c726561647920766f7465642074686973206f7074696f6e00000000000000604082015260600190565b6020808252602c908201527f50726f706f73616c2066756e6374696f6e20696e666f726d6174696f6e20617260408201527f697479206d69736d617463680000000000000000000000000000000000000000606082015260800190565b60208082526010908201527f566f74696e6720697320636c6f73656400000000000000000000000000000000604082015260600190565b60208082526012908201527f43616e6e6f742062652065786563757465640000000000000000000000000000604082015260600190565b60208082526014908201527f6261726e206d757374206e6f7420626520307830000000000000000000000000604082015260600190565b60c081016124a38284613f8f565b8151151581526020808301519082015260409182015115159181019190915260600190565b90815260200190565b60006102008d835273ffffffffffffffffffffffffffffffffffffffff8d16602084015280604084015261482c8184018d613f26565b90508281036060840152614840818c613f26565b9150508860808301528760a08301528660c08301528560e083015284151561010083015283151561012083015261487b610140830184613f8f565b9c9b505050505050505050505050565b60405181810167ffffffffffffffff811182821017156148a757fe5b604052919050565b600067ffffffffffffffff8211156148c357fe5b506020908102019056fe657865637574655472616e73616374696f6e3a205472616e73616374696f6e206861736e2774207375727061737365642074696d65206c6f636b2e657865637574655472616e73616374696f6e3a205472616e73616374696f6e206973207374616c652e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a2646970667358221220a139dd841d8fa7f839a7a53553bb3000cbdc03d19c5a6fc0a37c8da193948dff64736f6c63430007060033

Deployed Bytecode

0x6080604052600436106102535760003560e01c80635f2e9f6011610138578063c4d66de8116100b0578063e0a8f6f51161007f578063e4e2d26111610064578063e4e2d261146106a0578063f2b06537146106c0578063fe0d94c1146106e05761025a565b8063e0a8f6f514610653578063e23a9a52146106735761025a565b8063c4d66de8146105d3578063d0cd595e146105f3578063d1291f1914610613578063ddf0b009146106335761025a565b80639e70a23411610107578063b5a127e5116100ec578063b5a127e514610589578063bacbe2da1461059e578063c099f575146105be5761025a565b80639e70a23414610554578063b0edbb9b146105745761025a565b80635f2e9f60146104d957806374cb3041146104ee5780638b787e3014610503578063984690db146105345761025a565b8063328dd982116101cb5780633e4f49e61161019a578063490145c81161017f578063490145c81461047957806353e5056a14610499578063563909de146104b95761025a565b80633e4f49e61461041f578063458921551461044c5761025a565b8063328dd9821461039a578063342d067a146103ca57806339e778ee146103ea5780633d05f0091461040a5761025a565b80631e9d1e641161022257806324b437871161020757806324b437871461034557806324cd62d3146103655780632e8e34e1146103855761025a565b80631e9d1e641461030357806322f3e2d4146103235761025a565b8063013cf08b1461025f5780630f15f4c01461029f57806315373e3d146102b657806317977c61146102d65761025a565b3661025a57005b600080fd5b34801561026b57600080fd5b5061027f61027a366004613e00565b6106f3565b6040516102969b9a999897969594939291906147f6565b60405180910390f35b3480156102ab57600080fd5b506102b46108b9565b005b3480156102c257600080fd5b506102b46102d1366004613e5b565b610a0b565b3480156102e257600080fd5b506102f66102f1366004613cf8565b610c42565b60405161029691906147ed565b34801561030f57600080fd5b506102b461031e366004613e00565b610c54565b34801561032f57600080fd5b50610338610e43565b6040516102969190614111565b34801561035157600080fd5b506102b4610360366004613e00565b610e65565b34801561037157600080fd5b506102b4610380366004613e00565b6110ce565b34801561039157600080fd5b506102f661117e565b3480156103a657600080fd5b506103ba6103b5366004613e00565b611184565b6040516102969493929190614059565b3480156103d657600080fd5b506102b46103e5366004613e00565b611420565b3480156103f657600080fd5b506102b4610405366004613e8e565b6114d0565b34801561041657600080fd5b506102f66116a7565b34801561042b57600080fd5b5061043f61043a366004613e00565b6116ad565b604051610296919061412c565b34801561045857600080fd5b5061046c610467366004613e00565b6117fb565b60405161029691906147ba565b34801561048557600080fd5b506102f6610494366004613d12565b61185f565b3480156104a557600080fd5b506102b46104b4366004613e00565b611cac565b3480156104c557600080fd5b506102b46104d4366004613e00565b611d05565b3480156104e557600080fd5b506102f6611e09565b3480156104fa57600080fd5b506102f6611e0f565b34801561050f57600080fd5b5061052361051e366004613e00565b611e15565b604051610296959493929190614010565b34801561054057600080fd5b506102b461054f366004613e00565b611ee4565b34801561056057600080fd5b506102b461056f366004613e5b565b611f3d565b34801561058057600080fd5b506102f66121be565b34801561059557600080fd5b506102f66121c4565b3480156105aa57600080fd5b506102b46105b9366004613e00565b6121ca565b3480156105ca57600080fd5b506102f6612367565b3480156105df57600080fd5b506102b46105ee366004613cf8565b61236d565b3480156105ff57600080fd5b506102f661060e366004613e00565b61245c565b34801561061f57600080fd5b506102b461062e366004613e00565b6124a9565b34801561063f57600080fd5b506102b461064e366004613e00565b6125ad565b34801561065f57600080fd5b506102b461066e366004613e00565b6129cb565b34801561067f57600080fd5b5061069361068e366004613e30565b612a8b565b60405161029691906147c8565b3480156106ac57600080fd5b506106936106bb366004613e30565b612afc565b3480156106cc57600080fd5b506103386106db366004613e00565b612b6d565b6102b46106ee366004613e00565b612b82565b60086020908152600091825260409182902080546001808301546002808501805488516101009582161595909502600019011691909104601f8101879004870284018701909752868352929573ffffffffffffffffffffffffffffffffffffffff909116949192918301828280156107ac5780601f10610781576101008083540402835291602001916107ac565b820191906000526020600020905b81548152906001019060200180831161078f57829003601f168201915b5050505060038301805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815294959493509083018282801561083c5780601f106108115761010080835404028352916020019161083c565b820191906000526020600020905b81548152906001019060200180831161081f57829003601f168201915b50505060088401546009850154600a860154600b870154600c8801546040805160c081018252600e8b01548152600f8b0154602082015260108b01549181019190915260118a0154606082015260128a0154608082015260139099015460a08a0152969793969295509093509160ff80831692610100900416908b565b600b547501000000000000000000000000000000000000000000900460ff16156108fe5760405162461bcd60e51b81526004016108f59061429f565b60405180910390fd5b600b54604080517fc2077e8100000000000000000000000000000000000000000000000000000000815290516a1581b6d300d0225a0000009273ffffffffffffffffffffffffffffffffffffffff169163c2077e81916004808301926020929190829003018186803b15801561097357600080fd5b505afa158015610987573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ab9190613e18565b10156109c95760405162461bcd60e51b81526004016108f59061437b565b600b80547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff167501000000000000000000000000000000000000000000179055565b6001610a16836116ad565b6009811115610a2157fe5b14610a3e5760405162461bcd60e51b81526004016108f590614715565b6000828152600860209081526040808320338452600d8101909252909120805460ff161580610a845750805460ff168015610a845750600281015460ff16151583151514155b610aa05760405162461bcd60e51b81526004016108f590614681565b600b5460009073ffffffffffffffffffffffffffffffffffffffff1663cbf8eda933610acb86612dcb565b6040518363ffffffff1660e01b8152600401610ae8929190613fea565b60206040518083038186803b158015610b0057600080fd5b505afa158015610b14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b389190613e18565b905060008111610b5a5760405162461bcd60e51b81526004016108f5906141ae565b815460ff1615610ba757600282015460ff1615610b8e576001820154600a840154610b8491612dda565b600a840155610ba7565b6001820154600b840154610ba191612dda565b600b8401555b8315610bc657600a830154610bbc9082612e37565b600a840155610bdb565b600b830154610bd59082612e37565b600b8401555b8154600160ff19918216811784558301829055600283018054909116851515179055604051339086907f88d35328232823f54954b6627e9f732371656f6daa40cb1b01b27dc7875a7b4790610c33908890869061411c565b60405180910390a35050505050565b600a6020526000908152604090205481565b806000108015610c6657506007548111155b610c825760405162461bcd60e51b81526004016108f5906142d6565b60008181526009602090815260408083203384526005808201909352922090610caa846116ad565b6009811115610cb557fe5b148015610cc55750600182015415155b610ce15760405162461bcd60e51b81526004016108f590614446565b600b5460018301546040517fcbf8eda900000000000000000000000000000000000000000000000000000000815260009273ffffffffffffffffffffffffffffffffffffffff169163cbf8eda991610d4491339160001990910190600401613fea565b60206040518083038186803b158015610d5c57600080fd5b505afa158015610d70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d949190613e18565b825490915060ff16610db85760405162461bcd60e51b81526004016108f59061457f565b600282015460ff1615610dde576003830154610dd49082612dda565b6003840155610df3565b6004830154610ded9082612dda565b60048401555b815460ff199081168355600060018401819055600284018054909216909155604051339186917f5e8ee24f838173ed2ae7989835696f6e11945ac8fbc5259aef01cc4d7f0d49209190a350505050565b600b547501000000000000000000000000000000000000000000900460ff1681565b6009610e70826116ad565b6009811115610e7b57fe5b14610e985760405162461bcd60e51b81526004016108f59061447d565b6000818152600860205260409020600c81015460ff1615610ecb5760405162461bcd60e51b81526004016108f59061447d565b600c8101805460ff1916600117905560005b600482015481101561109157611089826004018281548110610efb57fe5b60009182526020909120015460058401805473ffffffffffffffffffffffffffffffffffffffff9092169184908110610f3057fe5b9060005260206000200154846006018481548110610f4a57fe5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815292830182828015610fd85780601f10610fad57610100808354040283529160200191610fd8565b820191906000526020600020905b815481529060010190602001808311610fbb57829003601f168201915b5050505050856007018581548110610fec57fe5b600091825260209182902001805460408051601f600260001961010060018716150201909416939093049283018590048502810185019091528181529283018282801561107a5780601f1061104f5761010080835404028352916020019161107a565b820191906000526020600020905b81548152906001019060200180831161105d57829003601f168201915b50505050508660090154612e98565b600101610edd565b50817f6d7acd63bebeaf524f1761a88687951f776fc7c182205f820424c7fb572c7235336040516110c29190613fc9565b60405180910390a25050565b333014611122576040805162461bcd60e51b815260206004820152601160248201527f4f6e6c792044414f2063616e2063616c6c000000000000000000000000000000604482015290519081900360640190fd5b613840811015611179576040805162461bcd60e51b815260206004820152601260248201527f706572696f64206d757374206265203e20300000000000000000000000000000604482015290519081900360640190fd5b600155565b60025481565b6060806060806000600860008781526020019081526020016000209050806004018160050182600601836007018380548060200260200160405190810160405280929190818152602001828054801561121357602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116111e8575b505050505093508280548060200260200160405190810160405280929190818152602001828054801561126557602002820191906000526020600020905b815481526020019060010190808311611251575b5050505050925081805480602002602001604051908101604052809291908181526020016000905b828210156113385760008481526020908190208301805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156113245780601f106112f957610100808354040283529160200191611324565b820191906000526020600020905b81548152906001019060200180831161130757829003601f168201915b50505050508152602001906001019061128d565b50505050915080805480602002602001604051908101604052809291908181526020016000905b8282101561140a5760008481526020908190208301805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156113f65780601f106113cb576101008083540402835291602001916113f6565b820191906000526020600020905b8154815290600101906020018083116113d957829003601f168201915b50505050508152602001906001019061135f565b5050505090509450945094509450509193509193565b333014611474576040805162461bcd60e51b815260206004820152601160248201527f4f6e6c792044414f2063616e2063616c6c000000000000000000000000000000604482015290519081900360640190fd5b6138408110156114cb576040805162461bcd60e51b815260206004820152601260248201527f706572696f64206d757374206265203e20300000000000000000000000000000604482015290519081900360640190fd5b600355565b60056114db836116ad565b60098111156114e657fe5b146115035760405162461bcd60e51b81526004016108f59061430d565b61150b612ec5565b600b546040517fcbf8eda900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063cbf8eda990611567903390600019420190600401613fea565b60206040518083038186803b15801561157f57600080fd5b505afa158015611593573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115b79190613e18565b10156115d55760405162461bcd60e51b81526004016108f590614344565b60008281526009602052604090206001810154156116055760405162461bcd60e51b81526004016108f5906144eb565b60008251116116265760405162461bcd60e51b81526004016108f590614177565b42600182015580547fffffffffffffffffffffffff00000000000000000000000000000000000000001633178155815161166990600283019060208501906137db565b50827f27eba018e1c52b84f732fe4d806fd9750c60752f1d37e7f70bcb4cbec65b1c6a3360405161169a9190613fc9565b60405180910390a2505050565b60015481565b60008160001080156116c157506007548211155b6116dd5760405162461bcd60e51b81526004016108f5906142d6565b6000828152600860205260409020600c81015460ff16156117025760029150506117f6565b600c810154610100900460ff161561171e5760089150506117f6565b600e81015460088201540142116117395760009150506117f6565b600f810154600e82015460088301540101421161175a5760019150506117f6565b61176381612f77565b81600b015482600a0154011080611785575061177e81613023565b81600a0154105b156117945760039150506117f6565b60098101546117a75760049150506117f6565b80600901544210156117bd5760059150506117f6565b6117c68361304e565b156117d55760099150506117f6565b601181015460098201540142116117f05760069150506117f6565b60079150505b919050565b611803613867565b50600090815260086020908152604091829020825160c081018452600e8201548152600f82015492810192909252601081015492820192909252601182015460608201526012820154608082015260139091015460a082015290565b600b546000907501000000000000000000000000000000000000000000900460ff1661199157600b54604080517fc2077e8100000000000000000000000000000000000000000000000000000000815290516a1581b6d300d0225a0000009273ffffffffffffffffffffffffffffffffffffffff169163c2077e81916004808301926020929190829003018186803b1580156118fa57600080fd5b505afa15801561190e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119329190613e18565b10156119505760405162461bcd60e51b81526004016108f590614140565b600b80547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000001790555b611999612ec5565b600b546040517fcbf8eda900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063cbf8eda9906119f5903390600019420190600401613fea565b60206040518083038186803b158015611a0d57600080fd5b505afa158015611a21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a459190613e18565b1015611a635760405162461bcd60e51b81526004016108f590614344565b85518751148015611a75575084518751145b8015611a82575083518751145b611a9e5760405162461bcd60e51b81526004016108f5906146b8565b8651611abc5760405162461bcd60e51b81526004016108f590614613565b600a87511115611ade5760405162461bcd60e51b81526004016108f59061464a565b6000825111611aff5760405162461bcd60e51b81526004016108f59061440f565b6000835111611b205760405162461bcd60e51b81526004016108f590614177565b336000908152600a60205260409020548015611b5c57611b3f81613118565b15611b5c5760405162461bcd60e51b81526004016108f5906144b4565b6007546001908101600081815260086020908152604090912082815592830180547fffffffffffffffffffffffff000000000000000000000000000000000000000016331790558651919291611bba916002840191908901906137db565b508451611bd090600383019060208801906137db565b508951611be690600483019060208d019061389d565b508851611bfc90600583019060208c0190613917565b508751611c1290600683019060208b0190613951565b508651611c2890600783019060208a01906139aa565b506000194201600882015560008054600e830155600154600f83015560025460108301556003546011830155600454601283015560055460138301556007839055338152600a60205260408082208490555183917fc2c021f5d73c63c481d336fbbafec58f694fc45095f00b02d2deb8cca59afe0791a25098975050505050505050565b333014611d00576040805162461bcd60e51b815260206004820152601160248201527f4f6e6c792044414f2063616e2063616c6c000000000000000000000000000000604482015290519081900360640190fd5b600255565b333014611d59576040805162461bcd60e51b815260206004820152601160248201527f4f6e6c792044414f2063616e2063616c6c000000000000000000000000000000604482015290519081900360640190fd5b60058111611dae576040805162461bcd60e51b815260206004820152601d60248201527f71756f72756d206d7573742062652067726561746572207468616e2035000000604482015290519081900360640190fd5b6064811115611e04576040805162461bcd60e51b815260206004820152600f60248201527f4d6178696d756d206973203130302e0000000000000000000000000000000000604482015290519081900360640190fd5b600555565b60005481565b60075481565b60096020908152600091825260409182902080546001808301546002808501805488516101009582161595909502600019011691909104601f810187900487028401870190975286835273ffffffffffffffffffffffffffffffffffffffff909316959094919291830182828015611ece5780601f10611ea357610100808354040283529160200191611ece565b820191906000526020600020905b815481529060010190602001808311611eb157829003601f168201915b5050505050908060030154908060040154905085565b333014611f38576040805162461bcd60e51b815260206004820152601160248201527f4f6e6c792044414f2063616e2063616c6c000000000000000000000000000000604482015290519081900360640190fd5b600055565b816000108015611f4f57506007548211155b611f6b5760405162461bcd60e51b81526004016108f5906142d6565b60008281526009602052604090206005611f84846116ad565b6009811115611f8f57fe5b148015611f9f5750600181015415155b611fbb5760405162461bcd60e51b81526004016108f590614446565b3360009081526005820160205260409020805460ff161580611ff45750805460ff168015611ff45750600281015460ff16151583151514155b6120105760405162461bcd60e51b81526004016108f590614681565b600b5460018301546040517fcbf8eda900000000000000000000000000000000000000000000000000000000815260009273ffffffffffffffffffffffffffffffffffffffff169163cbf8eda99161207391339160001990910190600401613fea565b60206040518083038186803b15801561208b57600080fd5b505afa15801561209f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120c39190613e18565b9050600081116120e55760405162461bcd60e51b81526004016108f5906141ae565b815460ff161561213257600282015460ff1615612119576001820154600384015461210f91612dda565b6003840155612132565b6001820154600484015461212c91612dda565b60048401555b83156121515760038301546121479082612e37565b6003840155612166565b60048301546121609082612e37565b60048401555b8154600160ff19918216811784558301829055600283018054909116851515179055604051339086907f80f2ad7e3e83d197670402663f224adb2f649967b9629c67dcfafa40c94d30f990610c33908890869061411c565b60045481565b60055481565b60016121d5826116ad565b60098111156121e057fe5b146121fd5760405162461bcd60e51b81526004016108f590614715565b600081815260086020908152604080832033808552600d8201909352908320600b5491939092909173ffffffffffffffffffffffffffffffffffffffff169063cbf8eda99061224b86612dcb565b6040518363ffffffff1660e01b8152600401612268929190613fea565b60206040518083038186803b15801561228057600080fd5b505afa158015612294573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122b89190613e18565b825490915060ff166122dc5760405162461bcd60e51b81526004016108f59061457f565b600282015460ff161561230257600a8301546122f89082612dda565b600a840155612317565b600b8301546123119082612dda565b600b8401555b815460ff199081168355600060018401819055600284018054909216909155604051339186917f12beef84830227673717dd5522ee1228a8004e88dc2678d8740f582264efb2b69190a350505050565b60035481565b600b5474010000000000000000000000000000000000000000900460ff16156123a85760405162461bcd60e51b81526004016108f590614548565b73ffffffffffffffffffffffffffffffffffffffff81166123db5760405162461bcd60e51b81526004016108f590614783565b600b80547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff73ffffffffffffffffffffffffffffffffffffffff9093167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116179190911674010000000000000000000000000000000000000000179055565b600081600010801561247057506007548211155b61248c5760405162461bcd60e51b81526004016108f5906142d6565b60008281526008602052604090206124a390612f77565b92915050565b3330146124fd576040805162461bcd60e51b815260206004820152601160248201527f4f6e6c792044414f2063616e2063616c6c000000000000000000000000000000604482015290519081900360640190fd5b6064811115612553576040805162461bcd60e51b815260206004820152600f60248201527f4d6178696d756d206973203130302e0000000000000000000000000000000000604482015290519081900360640190fd5b603281116125a8576040805162461bcd60e51b815260206004820152600e60248201527f4d696e696d756d2069732035302e000000000000000000000000000000000000604482015290519081900360640190fd5b600455565b60046125b8826116ad565b60098111156125c357fe5b146125e05760405162461bcd60e51b81526004016108f5906141e5565b600081815260086020819052604082206010810154600f820154600e830154938301549093019092019091016009820181905590915b600483015481101561299857600660006127c285600401848154811061263857fe5b60009182526020909120015460058701805473ffffffffffffffffffffffffffffffffffffffff909216918690811061266d57fe5b906000526020600020015487600601868154811061268757fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156127155780601f106126ea57610100808354040283529160200191612715565b820191906000526020600020905b8154815290600101906020018083116126f857829003601f168201915b505050505088600701878154811061272957fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156127b75780601f1061278c576101008083540402835291602001916127b7565b820191906000526020600020905b81548152906001019060200180831161279a57829003601f168201915b505050505088613194565b815260208101919091526040016000205460ff16156127f35760405162461bcd60e51b81526004016108f5906143b2565b61298f83600401828154811061280557fe5b60009182526020909120015460058501805473ffffffffffffffffffffffffffffffffffffffff909216918490811061283a57fe5b906000526020600020015485600601848154811061285457fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156128e25780601f106128b7576101008083540402835291602001916128e2565b820191906000526020600020905b8154815290600101906020018083116128c557829003601f168201915b50505050508660070185815481106128f657fe5b600091825260209182902001805460408051601f60026000196101006001871615020190941693909304928301859004850281018501909152818152928301828280156129845780601f1061295957610100808354040283529160200191612984565b820191906000526020600020905b81548152906001019060200180831161296757829003601f168201915b5050505050866132bf565b50600101612616565b50827ff7230a453b4c21e4f2d0ef1ad055635b08cb2c884eaf24a5ddc7147c79fd8c22338360405161169a929190613fea565b6129d4816132f4565b6129f05760405162461bcd60e51b81526004016108f5906145b6565b6129f98161331e565b612a155760405162461bcd60e51b81526004016108f590614242565b6000818152600860205260408120600c8101805460ff19166001179055905b6004820154811015612a5a57612a52826004018281548110610efb57fe5b600101612a34565b50817f253042c67143aeb6d431bb762d75e5905f18fa7850b7b9edb31fedb7c362d7e8336040516110c29190613fc9565b612a93613a03565b50600091825260086020908152604080842073ffffffffffffffffffffffffffffffffffffffff939093168452600d9092018152918190208151606081018352815460ff9081161515825260018301549482019490945260029091015490921615159082015290565b612b04613a03565b50600091825260096020908152604080842073ffffffffffffffffffffffffffffffffffffffff93909316845260059092018152918190208151606081018352815460ff9081161515825260018301549482019490945260029091015490921615159082015290565b60066020526000908152604090205460ff1681565b612b8b8161341d565b612ba75760405162461bcd60e51b81526004016108f59061474c565b6000818152600860205260408120600c810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16610100179055905b6004820154811015612d9a57612d91826004018281548110612c0357fe5b60009182526020909120015460058401805473ffffffffffffffffffffffffffffffffffffffff9092169184908110612c3857fe5b9060005260206000200154846006018481548110612c5257fe5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815292830182828015612ce05780601f10612cb557610100808354040283529160200191612ce0565b820191906000526020600020905b815481529060010190602001808311612cc357829003601f168201915b5050505050856007018581548110612cf457fe5b600091825260209182902001805460408051601f6002600019610100600187161502019094169390930492830185900485028101850190915281815292830182828015612d825780601f10612d5757610100808354040283529160200191612d82565b820191906000526020600020905b815481529060010190602001808311612d6557829003601f168201915b5050505050866009015461343c565b50600101612be5565b50817f9c85b616f29fca57a17eafe71cf9ff82ffef41766e2cf01ea7f8f7878dd3ec24336040516110c29190613fc9565b600e8101546008909101540190565b600082821115612e31576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b600082820183811015612e91576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6000612ea78686868686613194565b6000908152600660205260409020805460ff19169055505050505050565b6000612f726064600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c2077e816040518163ffffffff1660e01b815260040160206040518083038186803b158015612f3457600080fd5b505afa158015612f48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f6c9190613e18565b9061371b565b905090565b6013810154600b546000916124a391606491612f6c9173ffffffffffffffffffffffffffffffffffffffff1663f77f962f612fb188612dcb565b6040518263ffffffff1660e01b8152600401612fcd91906147ed565b60206040518083038186803b158015612fe557600080fd5b505afa158015612ff9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061301d9190613e18565b90613782565b60006124a36064612f6c84600e016004015485600b015486600a01540161378290919063ffffffff16565b6000818152600860209081526040808320600990925282206001810154158061307a5750816009015442105b1561308a576000925050506117f6565b600b5460018201546040517ff77f962f0000000000000000000000000000000000000000000000000000000081526131099260029273ffffffffffffffffffffffffffffffffffffffff9091169163f77f962f916130f191600019909101906004016147ed565b60206040518083038186803b158015612f3457600080fd5b60039091015410159392505050565b600080613124836116ad565b9050600081600981111561313457fe5b148061314b5750600181600981111561314957fe5b145b806131615750600481600981111561315f57fe5b145b806131775750600581600981111561317557fe5b145b80612e91575060065b81600981111561318c57fe5b149392505050565b60008585858585604051602001808673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018060200180602001848152602001838103835286818151815260200191508051906020019080838360005b838110156132075781810151838201526020016131ef565b50505050905090810190601f1680156132345780820380516001836020036101000a031916815260200191505b50838103825285518152855160209182019187019080838360005b8381101561326757818101518382015260200161324f565b50505050905090810190601f1680156132945780820380516001836020036101000a031916815260200191505b5097505050505050505060405160208183030381529060405280519060200120905095945050505050565b6000806132cf8787878787613194565b6000818152600660205260409020805460ff1916600117905591505095945050505050565b600080613300836116ad565b9050600081600981111561331057fe5b1480612e9157506001613180565b6000818152600860205260408120600181015473ffffffffffffffffffffffffffffffffffffffff163314806134055750613357612ec5565b600b5460018301546040517fc07473f600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9283169263c07473f6926133b392911690600401613fc9565b60206040518083038186803b1580156133cb57600080fd5b505afa1580156133df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134039190613e18565b105b156134145760019150506117f6565b50600092915050565b6000600661342a836116ad565b600981111561343557fe5b1492915050565b6060600061344d8787878787613194565b90508242101561348e5760405162461bcd60e51b815260040180806020018281038252603b8152602001806148ce603b913960400191505060405180910390fd5b60035483014211156134d15760405162461bcd60e51b81526004018080602001828103825260298152602001806149096029913960400191505060405180910390fd5b6000818152600660205260409020805460ff1916905584516060906134f75750836135ad565b85805190602001208560405160200180837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260040182805190602001908083835b6020831061357557805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101613538565b6001836020036101000a0380198251168184511680821785525050505050509050019250505060405160208183030381529060405290505b6000808973ffffffffffffffffffffffffffffffffffffffff1689846040518082805190602001908083835b6020831061361657805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe090920191602091820191016135d9565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613678576040519150601f19603f3d011682016040523d82523d6000602084013e61367d565b606091505b509150915081819061370d5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156136d25781810151838201526020016136ba565b50505050905090810190601f1680156136ff5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b509998505050505050505050565b6000808211613771576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b81838161377a57fe5b049392505050565b600082613791575060006124a3565b8282028284828161379e57fe5b0414612e915760405162461bcd60e51b81526004018080602001828103825260218152602001806149326021913960400191505060405180910390fd5b828054600181600116156101000203166002900490600052602060002090601f0160209004810192826138115760008555613857565b82601f1061382a57805160ff1916838001178555613857565b82800160010185558215613857579182015b8281111561385757825182559160200191906001019061383c565b50613863929150613a23565b5090565b6040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b828054828255906000526020600020908101928215613857579160200282015b8281111561385757825182547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9091161782556020909201916001909101906138bd565b828054828255906000526020600020908101928215613857579160200282018281111561385757825182559160200191906001019061383c565b82805482825590600052602060002090810192821561399e579160200282015b8281111561399e578251805161398e9184916020909101906137db565b5091602001919060010190613971565b50613863929150613a38565b8280548282559060005260206000209081019282156139f7579160200282015b828111156139f757825180516139e79184916020909101906137db565b50916020019190600101906139ca565b50613863929150613a55565b604080516060810182526000808252602082018190529181019190915290565b5b808211156138635760008155600101613a24565b80821115613863576000613a4c8282613a72565b50600101613a38565b80821115613863576000613a698282613a72565b50600101613a55565b50805460018160011615610100020316600290046000825580601f10613a985750613ab6565b601f016020900490600052602060002090810190613ab69190613a23565b50565b600067ffffffffffffffff831115613acd57fe5b613afe60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8601160161488b565b9050828152838383011115613b1257600080fd5b828260208301376000602084830101529392505050565b803573ffffffffffffffffffffffffffffffffffffffff811681146117f657600080fd5b600082601f830112613b5d578081fd5b81356020613b72613b6d836148af565b61488b565b8281528181019085830183850287018401881015613b8e578586fd5b855b85811015613bb357613ba182613b29565b84529284019290840190600101613b90565b5090979650505050505050565b600082601f830112613bd0578081fd5b81356020613be0613b6d836148af565b82815281810190858301855b85811015613bb3578135880189603f820112613c06578788fd5b613c178a8783013560408401613ab9565b8552509284019290840190600101613bec565b600082601f830112613c3a578081fd5b81356020613c4a613b6d836148af565b82815281810190858301855b85811015613bb357613c6d898684358b0101613cd9565b84529284019290840190600101613c56565b600082601f830112613c8f578081fd5b81356020613c9f613b6d836148af565b8281528181019085830183850287018401881015613cbb578586fd5b855b85811015613bb357813584529284019290840190600101613cbd565b600082601f830112613ce9578081fd5b612e9183833560208501613ab9565b600060208284031215613d09578081fd5b612e9182613b29565b60008060008060008060c08789031215613d2a578182fd5b863567ffffffffffffffff80821115613d41578384fd5b613d4d8a838b01613b4d565b97506020890135915080821115613d62578384fd5b613d6e8a838b01613c7f565b96506040890135915080821115613d83578384fd5b613d8f8a838b01613c2a565b95506060890135915080821115613da4578384fd5b613db08a838b01613bc0565b94506080890135915080821115613dc5578384fd5b613dd18a838b01613cd9565b935060a0890135915080821115613de6578283fd5b50613df389828a01613cd9565b9150509295509295509295565b600060208284031215613e11578081fd5b5035919050565b600060208284031215613e29578081fd5b5051919050565b60008060408385031215613e42578182fd5b82359150613e5260208401613b29565b90509250929050565b60008060408385031215613e6d578182fd5b8235915060208301358015158114613e83578182fd5b809150509250929050565b60008060408385031215613ea0578182fd5b82359150602083013567ffffffffffffffff811115613ebd578182fd5b613ec985828601613cd9565b9150509250929050565b6000815180845260208085018081965082840281019150828601855b85811015613f19578284038952613f07848351613f26565b98850198935090840190600101613eef565b5091979650505050505050565b60008151808452815b81811015613f4b57602081850181015186830182015201613f2f565b81811115613f5c5782602083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b805182526020810151602083015260408101516040830152606081015160608301526080810151608083015260a081015160a08301525050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b600073ffffffffffffffffffffffffffffffffffffffff8716825285602083015260a0604083015261404560a0830186613f26565b606083019490945250608001529392505050565b6080808252855190820181905260009060209060a0840190828901845b828110156140a857815173ffffffffffffffffffffffffffffffffffffffff1684529284019290840190600101614076565b50505083810382850152865180825287830191830190845b818110156140dc578351835292840192918401916001016140c0565b505084810360408601526140f08188613ed3565b9250505082810360608401526141068185613ed3565b979650505050505050565b901515815260200190565b9115158252602082015260400190565b60208101600a831061413a57fe5b91905290565b60208082526012908201527f44414f206e6f7420796574206163746976650000000000000000000000000000604082015260600190565b6020808252601a908201527f6465736372697074696f6e2063616e277420626520656d707479000000000000604082015260600190565b6020808252600f908201527f6e6f20766f74696e6720706f7765720000000000000000000000000000000000604082015260600190565b6020808252602e908201527f50726f706f73616c2063616e206f6e6c7920626520717565756564206966206960408201527f7420697320737563636565646564000000000000000000000000000000000000606082015260800190565b60208082526021908201527f43616e63656c6c6174696f6e20726571756972656d656e7473206e6f74206d6560408201527f7400000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526012908201527f44414f20616c7265616479206163746976650000000000000000000000000000604082015260600190565b60208082526013908201527f696e76616c69642070726f706f73616c20696400000000000000000000000000604082015260600190565b60208082526019908201527f50726f706f73616c206d75737420626520696e20717565756500000000000000604082015260600190565b6020808252601a908201527f4372656174696f6e207468726573686f6c64206e6f74206d6574000000000000604082015260600190565b60208082526015908201527f5468726573686f6c64206e6f74206d6574207965740000000000000000000000604082015260600190565b60208082526025908201527f70726f706f73616c20616374696f6e20616c726561647920717565756564206160408201527f7420657461000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526014908201527f7469746c652063616e277420626520656d707479000000000000000000000000604082015260600190565b6020808252601e908201527f4162726f676174696f6e2050726f706f73616c206e6f74206163746976650000604082015260600190565b60208082526013908201527f43616e6e6f74206265206162726f676174656400000000000000000000000000604082015260600190565b6020808252601e908201527f4f6e65206c6976652070726f706f73616c207065722070726f706f7365720000604082015260600190565b60208082526022908201527f4162726f676174696f6e2070726f706f73616c20616c7265616479206578697360408201527f7473000000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601d908201527f436f6e747261637420616c726561647920696e697469616c697a65642e000000604082015260600190565b6020808252601e908201527f43616e6e6f742063616e63656c206966206e6f7420766f746564207965740000604082015260600190565b60208082526032908201527f50726f706f73616c20696e207374617465207468617420646f6573206e6f742060408201527f616c6c6f772063616e63656c6c6174696f6e0000000000000000000000000000606082015260800190565b60208082526014908201527f4d7573742070726f7669646520616374696f6e73000000000000000000000000604082015260600190565b6020808252601a908201527f546f6f206d616e7920616374696f6e73206f6e206120766f7465000000000000604082015260600190565b60208082526019908201527f416c726561647920766f7465642074686973206f7074696f6e00000000000000604082015260600190565b6020808252602c908201527f50726f706f73616c2066756e6374696f6e20696e666f726d6174696f6e20617260408201527f697479206d69736d617463680000000000000000000000000000000000000000606082015260800190565b60208082526010908201527f566f74696e6720697320636c6f73656400000000000000000000000000000000604082015260600190565b60208082526012908201527f43616e6e6f742062652065786563757465640000000000000000000000000000604082015260600190565b60208082526014908201527f6261726e206d757374206e6f7420626520307830000000000000000000000000604082015260600190565b60c081016124a38284613f8f565b8151151581526020808301519082015260409182015115159181019190915260600190565b90815260200190565b60006102008d835273ffffffffffffffffffffffffffffffffffffffff8d16602084015280604084015261482c8184018d613f26565b90508281036060840152614840818c613f26565b9150508860808301528760a08301528660c08301528560e083015284151561010083015283151561012083015261487b610140830184613f8f565b9c9b505050505050505050505050565b60405181810167ffffffffffffffff811182821017156148a757fe5b604052919050565b600067ffffffffffffffff8211156148c357fe5b506020908102019056fe657865637574655472616e73616374696f6e3a205472616e73616374696f6e206861736e2774207375727061737365642074696d65206c6f636b2e657865637574655472616e73616374696f6e3a205472616e73616374696f6e206973207374616c652e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a2646970667358221220a139dd841d8fa7f839a7a53553bb3000cbdc03d19c5a6fc0a37c8da193948dff64736f6c63430007060033

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.