false
false

Contract Address Details

0xdDEde980c52cEe5AeFcb8d5fD655f698fa2AEFeb

Contract Name
GovernorAlpha
Creator
0x5b024a–854d2f at 0x4d831e–5c70f5
Balance
0 SYS ( )
Tokens
Fetching tokens...
Transactions
57 Transactions
Transfers
0 Transfers
Gas Used
7,919,778
Last Balance Update
799588
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
GovernorAlpha




Optimization enabled
false
Compiler version
v0.8.10+commit.fc410830




EVM Version
default




Verified at
2023-08-07T19:15:20.366018Z

Constructor Arguments

0000000000000000000000008fcd23749f999c52f665d12c64319655e7fef0b8000000000000000000000000e18c200a70908c89ffa18c628fe1b83ac0065ea40000000000000000000000005b024afaaaed10ba2788fddcd7b72af60a854d2f

Arg [0] (address) : 0x8fcd23749f999c52f665d12c64319655e7fef0b8
Arg [1] (address) : 0xe18c200a70908c89ffa18c628fe1b83ac0065ea4
Arg [2] (address) : 0x5b024afaaaed10ba2788fddcd7b72af60a854d2f

              

Contract source code

// SPDX-License-Identifier: BSD-3-Clause
pragma solidity ^0.8.10;

contract GovernorAlpha {
    /// @notice The name of this contract
    string public constant name = "Pegasys Governor Alpha";

    /// @notice The number of votes in support of a proposal required in order for a quorum to be reached and for a vote to succeed
    function quorumVotes() public pure returns (uint) {
        return 400e18;
    } // 4,000,000 = 4% of PSYS

    /// @notice The number of votes required in order for a voter to become a proposer
    function proposalThreshold() public pure returns (uint) {
        return 1000e18;
    } // 1,000,000 = 1% of PSYS

    /// @notice The maximum number of actions that can be included in a proposal
    function proposalMaxOperations() public pure returns (uint) {
        return 10;
    } // 10 actions

    /// @notice The delay before voting on a proposal may take place, once proposed
    function votingDelay() public pure returns (uint) {
        return 1;
    } // 1 block

    /// @notice The duration of voting on a proposal, in blocks
    function votingPeriod() public pure virtual returns (uint) {
        return 96; // back to 1728;
    } // ~3 days in blocks (assuming 150s blocks)

    /// @notice The address of the Pegasys Protocol Timelock
    TimelockInterface public timelock;

    /// @notice The address of the Pegasys governance token
    PsysInterface public psys;

    /// @notice The address of the Governor Guardian
    address public guardian;

    /// @notice The total number of proposals
    uint public proposalCount;

    struct Proposal {
        /// @notice Unique id for looking up a proposal
        uint id;
        /// @notice Creator of the proposal
        address proposer;
        /// @notice The timestamp that the proposal will be available for execution, set once the vote succeeds
        uint eta;
        /// @notice the ordered list of target addresses for calls to be made
        address[] targets;
        /// @notice The ordered list of values (i.e. msg.value) to be passed to the calls to be made
        uint[] values;
        /// @notice The ordered list of function signatures to be called
        string[] signatures;
        /// @notice The ordered list of calldata to be passed to each call
        bytes[] calldatas;
        /// @notice The block at which voting begins: holders must delegate their votes prior to this block
        uint startBlock;
        /// @notice The block at which voting ends: votes must be cast prior to this block
        uint endBlock;
        /// @notice Current number of votes in favor of this proposal
        uint forVotes;
        /// @notice Current number of votes in opposition to this proposal
        uint againstVotes;
        /// @notice Flag marking whether the proposal has been canceled
        bool canceled;
        /// @notice Flag marking whether the proposal has been executed
        bool executed;
        /// @notice Receipts of ballots for the entire set of voters
        mapping(address => Receipt) receipts;
    }

    /// @notice Ballot receipt record for a voter
    struct Receipt {
        /// @notice Whether or not a vote has been cast
        bool hasVoted;
        /// @notice Whether or not the voter supports the proposal
        bool support;
        /// @notice The number of votes the voter had, which were cast
        uint96 votes;
    }

    /// @notice Possible states that a proposal may be in
    enum ProposalState {
        Pending,
        Active,
        Canceled,
        Defeated,
        Succeeded,
        Queued,
        Expired,
        Executed
    }

    /// @notice The official record of all proposals ever proposed
    mapping(uint => Proposal) public proposals;

    /// @notice The latest proposal for each proposer
    mapping(address => uint) public latestProposalIds;

    /// @notice The EIP-712 typehash for the contract's domain
    bytes32 public constant DOMAIN_TYPEHASH =
        keccak256(
            "EIP712Domain(string name,uint256 chainId,address verifyingContract)"
        );

    /// @notice The EIP-712 typehash for the ballot struct used by the contract
    bytes32 public constant BALLOT_TYPEHASH =
        keccak256("Ballot(uint256 proposalId,bool support)");

    /// @notice An event emitted when a new proposal is created
    event ProposalCreated(
        uint id,
        address proposer,
        address[] targets,
        uint[] values,
        string[] signatures,
        bytes[] calldatas,
        uint startBlock,
        uint endBlock,
        string description
    );

    /// @notice An event emitted when a vote has been cast on a proposal
    event VoteCast(address voter, uint proposalId, bool support, uint votes);

    /// @notice An event emitted when a proposal has been canceled
    event ProposalCanceled(uint id);

    /// @notice An event emitted when a proposal has been queued in the Timelock
    event ProposalQueued(uint id, uint eta);

    /// @notice An event emitted when a proposal has been executed in the Timelock
    event ProposalExecuted(uint id);

    constructor(
        address timelock_,
        address psys_,
        address guardian_
    ) {
        timelock = TimelockInterface(timelock_);
        psys = PsysInterface(psys_);
        guardian = guardian_;
    }

    function propose(
        address[] memory targets,
        uint[] memory values,
        string[] memory signatures,
        bytes[] memory calldatas,
        string memory description
    ) public returns (uint) {
        require(
            psys.getPriorVotes(msg.sender, sub256(block.number, 1)) >
                proposalThreshold(),
            "GovernorAlpha::propose: proposer votes below proposal threshold"
        );
        require(
            targets.length == values.length &&
                targets.length == signatures.length &&
                targets.length == calldatas.length,
            "GovernorAlpha::propose: proposal function information arity mismatch"
        );
        require(
            targets.length != 0,
            "GovernorAlpha::propose: must provide actions"
        );
        require(
            targets.length <= proposalMaxOperations(),
            "GovernorAlpha::propose: too many actions"
        );

        uint latestProposalId = latestProposalIds[msg.sender];
        if (latestProposalId != 0) {
            ProposalState proposersLatestProposalState = state(
                latestProposalId
            );
            require(
                proposersLatestProposalState != ProposalState.Active,
                "GovernorAlpha::propose: one live proposal per proposer, found an already active proposal"
            );
            require(
                proposersLatestProposalState != ProposalState.Pending,
                "GovernorAlpha::propose: one live proposal per proposer, found an already pending proposal"
            );
        }

        uint startBlock = add256(block.number, votingDelay());
        uint endBlock = add256(startBlock, votingPeriod());

        proposalCount++;
        uint proposalId = proposalCount;
        Proposal storage newProposal = proposals[proposalId];
        // This should never happen but add a check in case.
        require(
            newProposal.id == 0,
            "GovernorAlpha::propose: ProposalID collsion"
        );
        newProposal.id = proposalId;
        newProposal.proposer = msg.sender;
        newProposal.eta = 0;
        newProposal.targets = targets;
        newProposal.values = values;
        newProposal.signatures = signatures;
        newProposal.calldatas = calldatas;
        newProposal.startBlock = startBlock;
        newProposal.endBlock = endBlock;
        newProposal.forVotes = 0;
        newProposal.againstVotes = 0;
        newProposal.canceled = false;
        newProposal.executed = false;

        latestProposalIds[newProposal.proposer] = newProposal.id;

        emit ProposalCreated(
            newProposal.id,
            msg.sender,
            targets,
            values,
            signatures,
            calldatas,
            startBlock,
            endBlock,
            description
        );
        return newProposal.id;
    }

    function queue(uint proposalId) public {
        require(
            state(proposalId) == ProposalState.Succeeded,
            "GovernorAlpha::queue: proposal can only be queued if it is succeeded"
        );
        Proposal storage proposal = proposals[proposalId];
        uint eta = add256(block.timestamp, timelock.delay());
        for (uint i = 0; i < proposal.targets.length; i++) {
            _queueOrRevert(
                proposal.targets[i],
                proposal.values[i],
                proposal.signatures[i],
                proposal.calldatas[i],
                eta
            );
        }
        proposal.eta = eta;
        emit ProposalQueued(proposalId, eta);
    }

    function _queueOrRevert(
        address target,
        uint value,
        string memory signature,
        bytes memory data,
        uint eta
    ) internal {
        require(
            !timelock.queuedTransactions(
                keccak256(abi.encode(target, value, signature, data, eta))
            ),
            "GovernorAlpha::_queueOrRevert: proposal action already queued at eta"
        );
        timelock.queueTransaction(target, value, signature, data, eta);
    }

    function execute(uint proposalId) public payable {
        require(
            state(proposalId) == ProposalState.Queued,
            "GovernorAlpha::execute: proposal can only be executed if it is queued"
        );
        Proposal storage proposal = proposals[proposalId];
        proposal.executed = true;
        for (uint i = 0; i < proposal.targets.length; i++) {
            timelock.executeTransaction{value: proposal.values[i]}(
                proposal.targets[i],
                proposal.values[i],
                proposal.signatures[i],
                proposal.calldatas[i],
                proposal.eta
            );
        }
        emit ProposalExecuted(proposalId);
    }

    function cancel(uint proposalId) public {
        ProposalState state = state(proposalId);
        require(
            state != ProposalState.Executed,
            "GovernorAlpha::cancel: cannot cancel executed proposal"
        );

        Proposal storage proposal = proposals[proposalId];
        require(
            msg.sender == guardian ||
                psys.getPriorVotes(proposal.proposer, sub256(block.number, 1)) <
                proposalThreshold(),
            "GovernorAlpha::cancel: proposer above threshold"
        );

        proposal.canceled = true;
        for (uint i = 0; i < proposal.targets.length; i++) {
            timelock.cancelTransaction(
                proposal.targets[i],
                proposal.values[i],
                proposal.signatures[i],
                proposal.calldatas[i],
                proposal.eta
            );
        }

        emit ProposalCanceled(proposalId);
    }

    function getActions(uint proposalId)
        public
        view
        returns (
            address[] memory targets,
            uint[] memory values,
            string[] memory signatures,
            bytes[] memory calldatas
        )
    {
        Proposal storage p = proposals[proposalId];
        return (p.targets, p.values, p.signatures, p.calldatas);
    }

    function getReceipt(uint proposalId, address voter)
        public
        view
        returns (Receipt memory)
    {
        return proposals[proposalId].receipts[voter];
    }

    function state(uint proposalId) public view returns (ProposalState) {
        require(
            proposalCount >= proposalId && proposalId > 0,
            "GovernorAlpha::state: invalid proposal id"
        );
        Proposal storage proposal = proposals[proposalId];
        if (proposal.canceled) {
            return ProposalState.Canceled;
        } else if (block.number <= proposal.startBlock) {
            return ProposalState.Pending;
        } else if (block.number <= proposal.endBlock) {
            return ProposalState.Active;
        } else if (
            proposal.forVotes <= proposal.againstVotes ||
            proposal.forVotes < quorumVotes()
        ) {
            return ProposalState.Defeated;
        } else if (proposal.eta == 0) {
            return ProposalState.Succeeded;
        } else if (proposal.executed) {
            return ProposalState.Executed;
        } else if (
            block.timestamp >= add256(proposal.eta, timelock.GRACE_PERIOD())
        ) {
            return ProposalState.Expired;
        } else {
            return ProposalState.Queued;
        }
    }

    function castVote(uint proposalId, bool support) public {
        return _castVote(msg.sender, proposalId, support);
    }

    function castVoteBySig(
        uint proposalId,
        bool support,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public {
        bytes32 domainSeparator = keccak256(
            abi.encode(
                DOMAIN_TYPEHASH,
                keccak256(bytes(name)),
                getChainId(),
                address(this)
            )
        );
        bytes32 structHash = keccak256(
            abi.encode(BALLOT_TYPEHASH, proposalId, support)
        );
        bytes32 digest = keccak256(
            abi.encodePacked("\x19\x01", domainSeparator, structHash)
        );
        address signatory = ecrecover(digest, v, r, s);
        require(
            signatory != address(0),
            "GovernorAlpha::castVoteBySig: invalid signature"
        );
        return _castVote(signatory, proposalId, support);
    }

    function _castVote(
        address voter,
        uint proposalId,
        bool support
    ) internal {
        require(
            state(proposalId) == ProposalState.Active,
            "GovernorAlpha::_castVote: voting is closed"
        );
        Proposal storage proposal = proposals[proposalId];
        Receipt storage receipt = proposal.receipts[voter];
        require(
            receipt.hasVoted == false,
            "GovernorAlpha::_castVote: voter already voted"
        );
        uint96 votes = psys.getPriorVotes(voter, proposal.startBlock);

        if (support) {
            proposal.forVotes = add256(proposal.forVotes, votes);
        } else {
            proposal.againstVotes = add256(proposal.againstVotes, votes);
        }

        receipt.hasVoted = true;
        receipt.support = support;
        receipt.votes = votes;

        emit VoteCast(voter, proposalId, support, votes);
    }

    function __acceptAdmin() public {
        require(
            msg.sender == guardian,
            "GovernorAlpha::__acceptAdmin: sender must be gov guardian"
        );
        timelock.acceptAdmin();
    }

    function __abdicate() public {
        require(
            msg.sender == guardian,
            "GovernorAlpha::__abdicate: sender must be gov guardian"
        );
        guardian = address(0);
    }

    function __queueSetTimelockPendingAdmin(address newPendingAdmin, uint eta)
        public
    {
        require(
            msg.sender == guardian,
            "GovernorAlpha::__queueSetTimelockPendingAdmin: sender must be gov guardian"
        );
        timelock.queueTransaction(
            address(timelock),
            0,
            "setPendingAdmin(address)",
            abi.encode(newPendingAdmin),
            eta
        );
    }

    function __executeSetTimelockPendingAdmin(address newPendingAdmin, uint eta)
        public
    {
        require(
            msg.sender == guardian,
            "GovernorAlpha::__executeSetTimelockPendingAdmin: sender must be gov guardian"
        );
        timelock.executeTransaction(
            address(timelock),
            0,
            "setPendingAdmin(address)",
            abi.encode(newPendingAdmin),
            eta
        );
    }

    function add256(uint256 a, uint256 b) internal pure returns (uint) {
        uint c = a + b;
        require(c >= a, "addition overflow");
        return c;
    }

    function sub256(uint256 a, uint256 b) internal pure returns (uint) {
        require(b <= a, "subtraction underflow");
        return a - b;
    }

    function getChainId() internal view returns (uint) {
        uint chainId;
        assembly {
            chainId := chainid()
        }
        return chainId;
    }
}

interface TimelockInterface {
    function delay() external view returns (uint);

    function GRACE_PERIOD() external view returns (uint);

    function acceptAdmin() external;

    function queuedTransactions(bytes32 hash) external view returns (bool);

    function queueTransaction(
        address target,
        uint value,
        string calldata signature,
        bytes calldata data,
        uint eta
    ) external returns (bytes32);

    function cancelTransaction(
        address target,
        uint value,
        string calldata signature,
        bytes calldata data,
        uint eta
    ) external;

    function executeTransaction(
        address target,
        uint value,
        string calldata signature,
        bytes calldata data,
        uint eta
    ) external payable returns (bytes memory);
}

interface PsysInterface {
    function getPriorVotes(address account, uint blockNumber)
        external
        view
        returns (uint96);
}
        

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"timelock_","internalType":"address"},{"type":"address","name":"psys_","internalType":"address"},{"type":"address","name":"guardian_","internalType":"address"}]},{"type":"event","name":"ProposalCanceled","inputs":[{"type":"uint256","name":"id","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"ProposalCreated","inputs":[{"type":"uint256","name":"id","internalType":"uint256","indexed":false},{"type":"address","name":"proposer","internalType":"address","indexed":false},{"type":"address[]","name":"targets","internalType":"address[]","indexed":false},{"type":"uint256[]","name":"values","internalType":"uint256[]","indexed":false},{"type":"string[]","name":"signatures","internalType":"string[]","indexed":false},{"type":"bytes[]","name":"calldatas","internalType":"bytes[]","indexed":false},{"type":"uint256","name":"startBlock","internalType":"uint256","indexed":false},{"type":"uint256","name":"endBlock","internalType":"uint256","indexed":false},{"type":"string","name":"description","internalType":"string","indexed":false}],"anonymous":false},{"type":"event","name":"ProposalExecuted","inputs":[{"type":"uint256","name":"id","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"ProposalQueued","inputs":[{"type":"uint256","name":"id","internalType":"uint256","indexed":false},{"type":"uint256","name":"eta","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"VoteCast","inputs":[{"type":"address","name":"voter","internalType":"address","indexed":false},{"type":"uint256","name":"proposalId","internalType":"uint256","indexed":false},{"type":"bool","name":"support","internalType":"bool","indexed":false},{"type":"uint256","name":"votes","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"BALLOT_TYPEHASH","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bytes32","name":"","internalType":"bytes32"}],"name":"DOMAIN_TYPEHASH","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"__abdicate","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"__acceptAdmin","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"__executeSetTimelockPendingAdmin","inputs":[{"type":"address","name":"newPendingAdmin","internalType":"address"},{"type":"uint256","name":"eta","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"__queueSetTimelockPendingAdmin","inputs":[{"type":"address","name":"newPendingAdmin","internalType":"address"},{"type":"uint256","name":"eta","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"cancel","inputs":[{"type":"uint256","name":"proposalId","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"castVote","inputs":[{"type":"uint256","name":"proposalId","internalType":"uint256"},{"type":"bool","name":"support","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"castVoteBySig","inputs":[{"type":"uint256","name":"proposalId","internalType":"uint256"},{"type":"bool","name":"support","internalType":"bool"},{"type":"uint8","name":"v","internalType":"uint8"},{"type":"bytes32","name":"r","internalType":"bytes32"},{"type":"bytes32","name":"s","internalType":"bytes32"}]},{"type":"function","stateMutability":"payable","outputs":[],"name":"execute","inputs":[{"type":"uint256","name":"proposalId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address[]","name":"targets","internalType":"address[]"},{"type":"uint256[]","name":"values","internalType":"uint256[]"},{"type":"string[]","name":"signatures","internalType":"string[]"},{"type":"bytes[]","name":"calldatas","internalType":"bytes[]"}],"name":"getActions","inputs":[{"type":"uint256","name":"proposalId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"tuple","name":"","internalType":"struct GovernorAlpha.Receipt","components":[{"type":"bool","name":"hasVoted","internalType":"bool"},{"type":"bool","name":"support","internalType":"bool"},{"type":"uint96","name":"votes","internalType":"uint96"}]}],"name":"getReceipt","inputs":[{"type":"uint256","name":"proposalId","internalType":"uint256"},{"type":"address","name":"voter","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"guardian","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"latestProposalIds","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"proposalCount","inputs":[]},{"type":"function","stateMutability":"pure","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"proposalMaxOperations","inputs":[]},{"type":"function","stateMutability":"pure","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"proposalThreshold","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"id","internalType":"uint256"},{"type":"address","name":"proposer","internalType":"address"},{"type":"uint256","name":"eta","internalType":"uint256"},{"type":"uint256","name":"startBlock","internalType":"uint256"},{"type":"uint256","name":"endBlock","internalType":"uint256"},{"type":"uint256","name":"forVotes","internalType":"uint256"},{"type":"uint256","name":"againstVotes","internalType":"uint256"},{"type":"bool","name":"canceled","internalType":"bool"},{"type":"bool","name":"executed","internalType":"bool"}],"name":"proposals","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"propose","inputs":[{"type":"address[]","name":"targets","internalType":"address[]"},{"type":"uint256[]","name":"values","internalType":"uint256[]"},{"type":"string[]","name":"signatures","internalType":"string[]"},{"type":"bytes[]","name":"calldatas","internalType":"bytes[]"},{"type":"string","name":"description","internalType":"string"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract PsysInterface"}],"name":"psys","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"queue","inputs":[{"type":"uint256","name":"proposalId","internalType":"uint256"}]},{"type":"function","stateMutability":"pure","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"quorumVotes","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"enum GovernorAlpha.ProposalState"}],"name":"state","inputs":[{"type":"uint256","name":"proposalId","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract TimelockInterface"}],"name":"timelock","inputs":[]},{"type":"function","stateMutability":"pure","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"votingDelay","inputs":[]},{"type":"function","stateMutability":"pure","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"votingPeriod","inputs":[]}]
              

Contract Creation Code

0x60806040523480156200001157600080fd5b506040516200564c3803806200564c83398181016040528101906200003791906200016c565b826000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050620001c8565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620001348262000107565b9050919050565b620001468162000127565b81146200015257600080fd5b50565b60008151905062000166816200013b565b92915050565b60008060006060848603121562000188576200018762000102565b5b6000620001988682870162000155565b9350506020620001ab8682870162000155565b9250506040620001be8682870162000155565b9150509250925092565b61547480620001d86000396000f3fe60806040526004361061019c5760003560e01c8063452a9320116100ec578063d33219b41161008a578063ddf0b00911610064578063ddf0b009146105b1578063deaaa7cc146105da578063e23a9a5214610605578063fe0d94c1146106425761019c565b8063d33219b41461051e578063da35c66414610549578063da95691a146105745761019c565b80637bdbe4d0116100c65780637bdbe4d01461048857806391500671146104b3578063b58131b0146104dc578063b9a61961146105075761019c565b8063452a93201461041d5780634634c61f14610448578063760fbc13146104715761019c565b806321f43e42116101595780633932abb1116101335780633932abb114610361578063393aac271461038c5780633e4f49e6146103b757806340e58ee5146103f45761019c565b806321f43e42146102cd57806324bc1a64146102f6578063328dd982146103215761019c565b8063013cf08b146101a157806302a251a3146101e657806306fdde031461021157806315373e3d1461023c57806317977c611461026557806320606b70146102a2575b600080fd5b3480156101ad57600080fd5b506101c860048036038101906101c39190612cdd565b61065e565b6040516101dd99989796959493929190612d75565b60405180910390f35b3480156101f257600080fd5b506101fb6106e6565b6040516102089190612e02565b60405180910390f35b34801561021d57600080fd5b506102266106ef565b6040516102339190612eb6565b60405180910390f35b34801561024857600080fd5b50610263600480360381019061025e9190612f04565b610728565b005b34801561027157600080fd5b5061028c60048036038101906102879190612f70565b610737565b6040516102999190612e02565b60405180910390f35b3480156102ae57600080fd5b506102b761074f565b6040516102c49190612fb6565b60405180910390f35b3480156102d957600080fd5b506102f460048036038101906102ef9190612fd1565b610773565b005b34801561030257600080fd5b5061030b6108ef565b6040516103189190612e02565b60405180910390f35b34801561032d57600080fd5b5061034860048036038101906103439190612cdd565b610900565b60405161035894939291906133b0565b60405180910390f35b34801561036d57600080fd5b50610376610bbd565b6040516103839190612e02565b60405180910390f35b34801561039857600080fd5b506103a1610bc6565b6040516103ae9190613470565b60405180910390f35b3480156103c357600080fd5b506103de60048036038101906103d99190612cdd565b610bec565b6040516103eb9190613502565b60405180910390f35b34801561040057600080fd5b5061041b60048036038101906104169190612cdd565b610dc0565b005b34801561042957600080fd5b50610432611179565b60405161043f919061351d565b60405180910390f35b34801561045457600080fd5b5061046f600480360381019061046a919061359d565b61119f565b005b34801561047d57600080fd5b50610486611388565b005b34801561049457600080fd5b5061049d61145c565b6040516104aa9190612e02565b60405180910390f35b3480156104bf57600080fd5b506104da60048036038101906104d59190612fd1565b611465565b005b3480156104e857600080fd5b506104f16115dc565b6040516104fe9190612e02565b60405180910390f35b34801561051357600080fd5b5061051c6115ed565b005b34801561052a57600080fd5b506105336116ff565b6040516105409190613639565b60405180910390f35b34801561055557600080fd5b5061055e611723565b60405161056b9190612e02565b60405180910390f35b34801561058057600080fd5b5061059b60048036038101906105969190613b77565b611729565b6040516105a89190612e02565b60405180910390f35b3480156105bd57600080fd5b506105d860048036038101906105d39190612cdd565b611ccf565b005b3480156105e657600080fd5b506105ef61201b565b6040516105fc9190612fb6565b60405180910390f35b34801561061157600080fd5b5061062c60048036038101906106279190613c7e565b61203f565b6040516106399190613d36565b60405180910390f35b61065c60048036038101906106579190612cdd565b612121565b005b60046020528060005260406000206000915090508060000154908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600201549080600701549080600801549080600901549080600a01549080600b0160009054906101000a900460ff169080600b0160019054906101000a900460ff16905089565b60006060905090565b6040518060400160405280601681526020017f5065676173797320476f7665726e6f7220416c7068610000000000000000000081525081565b610733338383612392565b5050565b60056020528060005260406000206000915090505481565b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610803576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107fa90613de9565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630825f38f60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600085604051602001610873919061351d565b604051602081830303815290604052856040518563ffffffff1660e01b81526004016108a29493929190613eda565b6000604051808303816000875af11580156108c1573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906108ea9190613fa9565b505050565b60006815af1d78b58c400000905090565b606080606080600060046000878152602001908152602001600020905080600301816004018260050183600601838054806020026020016040519081016040528092919081815260200182805480156109ae57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610964575b5050505050935082805480602002602001604051908101604052809291908181526020018280548015610a0057602002820191906000526020600020905b8154815260200190600101908083116109ec575b5050505050925081805480602002602001604051908101604052809291908181526020016000905b82821015610ad4578382906000526020600020018054610a4790614021565b80601f0160208091040260200160405190810160405280929190818152602001828054610a7390614021565b8015610ac05780601f10610a9557610100808354040283529160200191610ac0565b820191906000526020600020905b815481529060010190602001808311610aa357829003601f168201915b505050505081526020019060010190610a28565b50505050915080805480602002602001604051908101604052809291908181526020016000905b82821015610ba7578382906000526020600020018054610b1a90614021565b80601f0160208091040260200160405190810160405280929190818152602001828054610b4690614021565b8015610b935780601f10610b6857610100808354040283529160200191610b93565b820191906000526020600020905b815481529060010190602001808311610b7657829003601f168201915b505050505081526020019060010190610afb565b5050505090509450945094509450509193509193565b60006001905090565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008160035410158015610c005750600082115b610c3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c36906140c5565b60405180910390fd5b600060046000848152602001908152602001600020905080600b0160009054906101000a900460ff1615610c77576002915050610dbb565b80600701544311610c8c576000915050610dbb565b80600801544311610ca1576001915050610dbb565b80600a01548160090154111580610cc25750610cbb6108ef565b8160090154105b15610cd1576003915050610dbb565b600081600201541415610ce8576004915050610dbb565b80600b0160019054906101000a900460ff1615610d09576007915050610dbb565b610da5816002015460008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c1a287e26040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d7c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da091906140fa565b612660565b4210610db5576006915050610dbb565b60059150505b919050565b6000610dcb82610bec565b9050600780811115610de057610ddf61348b565b5b816007811115610df357610df261348b565b5b1415610e34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2b90614199565b60405180910390fd5b6000600460008481526020019081526020016000209050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610f865750610eaa6115dc565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663782d6fe18360010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610f184360016126be565b6040518363ffffffff1660e01b8152600401610f359291906141b9565b602060405180830381865afa158015610f52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f76919061420e565b6bffffffffffffffffffffffff16105b610fc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fbc906142ad565b60405180910390fd5b600181600b0160006101000a81548160ff02191690831515021790555060005b816003018054905081101561113c5760008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663591fcdfe836003018381548110611046576110456142cd565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846004018481548110611087576110866142cd565b5b90600052602060002001548560050185815481106110a8576110a76142cd565b5b906000526020600020018660060186815481106110c8576110c76142cd565b5b9060005260206000200187600201546040518663ffffffff1660e01b81526004016110f7959493929190614426565b600060405180830381600087803b15801561111157600080fd5b505af1158015611125573d6000803e3d6000fd5b505050508080611134906144b6565b915050610fe5565b507f789cf55be980739dad1d0699b93b58e806b51c9d96619bfa8fe0a28abaa7b30c8360405161116c9190612e02565b60405180910390a1505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8666040518060400160405280601681526020017f5065676173797320476f7665726e6f7220416c7068610000000000000000000081525080519060200120611207612717565b3060405160200161121b94939291906144ff565b60405160208183030381529060405280519060200120905060007f8e25870c07e0b0b3884c78da52790939a455c275406c44ae8b434b692fb916ee878760405160200161126a93929190614544565b604051602081830303815290604052805190602001209050600082826040516020016112979291906145f3565b6040516020818303038152906040528051906020012090506000600182888888604051600081526020016040526040516112d49493929190614639565b6020604051602081039080840390855afa1580156112f6573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611372576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611369906146f0565b60405180910390fd5b61137d818a8a612392565b505050505050505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611418576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140f90614782565b60405180910390fd5b6000600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000600a905090565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ec9061483a565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633a66f90160008054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600085604051602001611565919061351d565b604051602081830303815290604052856040518563ffffffff1660e01b81526004016115949493929190613eda565b6020604051808303816000875af11580156115b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d7919061486f565b505050565b6000683635c9adc5dea00000905090565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461167d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116749061490e565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630e18b6816040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156116e557600080fd5b505af11580156116f9573d6000803e3d6000fd5b50505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60035481565b60006117336115dc565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663782d6fe13361177d4360016126be565b6040518363ffffffff1660e01b815260040161179a9291906141b9565b602060405180830381865afa1580156117b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117db919061420e565b6bffffffffffffffffffffffff1611611829576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611820906149a0565b60405180910390fd5b8451865114801561183b575083518651145b8015611848575082518651145b611887576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187e90614a58565b60405180910390fd5b6000865114156118cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c390614aea565b60405180910390fd5b6118d461145c565b86511115611917576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190e90614b7c565b60405180910390fd5b6000600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008114611a4257600061196e82610bec565b9050600160078111156119845761198361348b565b5b8160078111156119975761199661348b565b5b14156119d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119cf90614c34565b60405180910390fd5b600060078111156119ec576119eb61348b565b5b8160078111156119ff576119fe61348b565b5b1415611a40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3790614cec565b60405180910390fd5b505b6000611a5543611a50610bbd565b612660565b90506000611a6a82611a656106e6565b612660565b905060036000815480929190611a7f906144b6565b91905055506000600354905060006004600083815260200190815260200160002090506000816000015414611ae9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae090614d7e565b60405180910390fd5b818160000181905550338160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600081600201819055508a816003019080519060200190611b579291906128d8565b5089816004019080519060200190611b70929190612962565b5088816005019080519060200190611b899291906129af565b5087816006019080519060200190611ba2929190612a0f565b5083816007018190555082816008018190555060008160090181905550600081600a0181905550600081600b0160006101000a81548160ff021916908315150217905550600081600b0160016101000a81548160ff0219169083151502179055508060000154600560008360010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f7d84a6263ae0d98d3329bd7b46bb4e8d6f98cd35a7adb45c274c8b7fd5ebd5e08160000154338d8d8d8d8a8a8f604051611cb299989796959493929190614d9e565b60405180910390a180600001549550505050505095945050505050565b60046007811115611ce357611ce261348b565b5b611cec82610bec565b6007811115611cfe57611cfd61348b565b5b14611d3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3590614ee6565b60405180910390fd5b60006004600083815260200190815260200160002090506000611def4260008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636a42b8f86040518163ffffffff1660e01b8152600401602060405180830381865afa158015611dc6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dea91906140fa565b612660565b905060005b8260030180549050811015611fd357611fc0836003018281548110611e1c57611e1b6142cd565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846004018381548110611e5d57611e5c6142cd565b5b9060005260206000200154856005018481548110611e7e57611e7d6142cd565b5b906000526020600020018054611e9390614021565b80601f0160208091040260200160405190810160405280929190818152602001828054611ebf90614021565b8015611f0c5780601f10611ee157610100808354040283529160200191611f0c565b820191906000526020600020905b815481529060010190602001808311611eef57829003601f168201915b5050505050866006018581548110611f2757611f266142cd565b5b906000526020600020018054611f3c90614021565b80601f0160208091040260200160405190810160405280929190818152602001828054611f6890614021565b8015611fb55780601f10611f8a57610100808354040283529160200191611fb5565b820191906000526020600020905b815481529060010190602001808311611f9857829003601f168201915b505050505086612724565b8080611fcb906144b6565b915050611df4565b508082600201819055507f9a2e42fd6722813d69113e7d0079d3d940171428df7373df9c7f7617cfda2892838260405161200e929190614f06565b60405180910390a1505050565b7f8e25870c07e0b0b3884c78da52790939a455c275406c44ae8b434b692fb916ee81565b612047612a6f565b60046000848152602001908152602001600020600c0160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060600160405290816000820160009054906101000a900460ff161515151581526020016000820160019054906101000a900460ff161515151581526020016000820160029054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff1681525050905092915050565b600560078111156121355761213461348b565b5b61213e82610bec565b60078111156121505761214f61348b565b5b14612190576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218790614fc7565b60405180910390fd5b6000600460008381526020019081526020016000209050600181600b0160016101000a81548160ff02191690831515021790555060005b81600301805490508110156123565760008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630825f38f836004018381548110612228576122276142cd565b5b9060005260206000200154846003018481548110612249576122486142cd565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685600401858154811061228a576122896142cd565b5b90600052602060002001548660050186815481106122ab576122aa6142cd565b5b906000526020600020018760060187815481106122cb576122ca6142cd565b5b9060005260206000200188600201546040518763ffffffff1660e01b81526004016122fa959493929190614426565b60006040518083038185885af1158015612318573d6000803e3d6000fd5b50505050506040513d6000823e3d601f19601f820116820180604052508101906123429190613fa9565b50808061234e906144b6565b9150506121c7565b507f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f826040516123869190612e02565b60405180910390a15050565b600160078111156123a6576123a561348b565b5b6123af83610bec565b60078111156123c1576123c061348b565b5b14612401576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f890615059565b60405180910390fd5b6000600460008481526020019081526020016000209050600081600c0160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600015158160000160009054906101000a900460ff161515146124b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ac906150eb565b60405180910390fd5b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663782d6fe18785600701546040518363ffffffff1660e01b81526004016125189291906141b9565b602060405180830381865afa158015612535573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612559919061420e565b9050831561258a5761257d8360090154826bffffffffffffffffffffffff16612660565b83600901819055506125af565b6125a683600a0154826bffffffffffffffffffffffff16612660565b83600a01819055505b60018260000160006101000a81548160ff021916908315150217905550838260000160016101000a81548160ff021916908315150217905550808260000160026101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055507f877856338e13f63d0c36822ff0ef736b80934cd90574a3a5bc9262c39d217c4686868684604051612650949392919061513c565b60405180910390a1505050505050565b600080828461266f9190615181565b9050838110156126b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ab90615223565b60405180910390fd5b8091505092915050565b600082821115612703576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126fa9061528f565b60405180910390fd5b818361270f91906152af565b905092915050565b6000804690508091505090565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f2b0653786868686866040516020016127799594939291906152e3565b604051602081830303815290604052805190602001206040518263ffffffff1660e01b81526004016127ab9190612fb6565b602060405180830381865afa1580156127c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127ec9190615359565b1561282c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128239061541e565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633a66f90186868686866040518663ffffffff1660e01b815260040161288d9594939291906152e3565b6020604051808303816000875af11580156128ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128d0919061486f565b505050505050565b828054828255906000526020600020908101928215612951579160200282015b828111156129505782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550916020019190600101906128f8565b5b50905061295e9190612aa2565b5090565b82805482825590600052602060002090810192821561299e579160200282015b8281111561299d578251825591602001919060010190612982565b5b5090506129ab9190612aa2565b5090565b8280548282559060005260206000209081019282156129fe579160200282015b828111156129fd5782518290805190602001906129ed929190612abf565b50916020019190600101906129cf565b5b509050612a0b9190612b45565b5090565b828054828255906000526020600020908101928215612a5e579160200282015b82811115612a5d578251829080519060200190612a4d929190612b69565b5091602001919060010190612a2f565b5b509050612a6b9190612bef565b5090565b604051806060016040528060001515815260200160001515815260200160006bffffffffffffffffffffffff1681525090565b5b80821115612abb576000816000905550600101612aa3565b5090565b828054612acb90614021565b90600052602060002090601f016020900481019282612aed5760008555612b34565b82601f10612b0657805160ff1916838001178555612b34565b82800160010185558215612b34579182015b82811115612b33578251825591602001919060010190612b18565b5b509050612b419190612aa2565b5090565b5b80821115612b655760008181612b5c9190612c13565b50600101612b46565b5090565b828054612b7590614021565b90600052602060002090601f016020900481019282612b975760008555612bde565b82601f10612bb057805160ff1916838001178555612bde565b82800160010185558215612bde579182015b82811115612bdd578251825591602001919060010190612bc2565b5b509050612beb9190612aa2565b5090565b5b80821115612c0f5760008181612c069190612c53565b50600101612bf0565b5090565b508054612c1f90614021565b6000825580601f10612c315750612c50565b601f016020900490600052602060002090810190612c4f9190612aa2565b5b50565b508054612c5f90614021565b6000825580601f10612c715750612c90565b601f016020900490600052602060002090810190612c8f9190612aa2565b5b50565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b612cba81612ca7565b8114612cc557600080fd5b50565b600081359050612cd781612cb1565b92915050565b600060208284031215612cf357612cf2612c9d565b5b6000612d0184828501612cc8565b91505092915050565b612d1381612ca7565b82525050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612d4482612d19565b9050919050565b612d5481612d39565b82525050565b60008115159050919050565b612d6f81612d5a565b82525050565b600061012082019050612d8b600083018c612d0a565b612d98602083018b612d4b565b612da5604083018a612d0a565b612db26060830189612d0a565b612dbf6080830188612d0a565b612dcc60a0830187612d0a565b612dd960c0830186612d0a565b612de660e0830185612d66565b612df4610100830184612d66565b9a9950505050505050505050565b6000602082019050612e176000830184612d0a565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612e57578082015181840152602081019050612e3c565b83811115612e66576000848401525b50505050565b6000601f19601f8301169050919050565b6000612e8882612e1d565b612e928185612e28565b9350612ea2818560208601612e39565b612eab81612e6c565b840191505092915050565b60006020820190508181036000830152612ed08184612e7d565b905092915050565b612ee181612d5a565b8114612eec57600080fd5b50565b600081359050612efe81612ed8565b92915050565b60008060408385031215612f1b57612f1a612c9d565b5b6000612f2985828601612cc8565b9250506020612f3a85828601612eef565b9150509250929050565b612f4d81612d39565b8114612f5857600080fd5b50565b600081359050612f6a81612f44565b92915050565b600060208284031215612f8657612f85612c9d565b5b6000612f9484828501612f5b565b91505092915050565b6000819050919050565b612fb081612f9d565b82525050565b6000602082019050612fcb6000830184612fa7565b92915050565b60008060408385031215612fe857612fe7612c9d565b5b6000612ff685828601612f5b565b925050602061300785828601612cc8565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61304681612d39565b82525050565b6000613058838361303d565b60208301905092915050565b6000602082019050919050565b600061307c82613011565b613086818561301c565b93506130918361302d565b8060005b838110156130c25781516130a9888261304c565b97506130b483613064565b925050600181019050613095565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61310481612ca7565b82525050565b600061311683836130fb565b60208301905092915050565b6000602082019050919050565b600061313a826130cf565b61314481856130da565b935061314f836130eb565b8060005b83811015613180578151613167888261310a565b975061317283613122565b925050600181019050613153565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600082825260208201905092915050565b60006131d582612e1d565b6131df81856131b9565b93506131ef818560208601612e39565b6131f881612e6c565b840191505092915050565b600061320f83836131ca565b905092915050565b6000602082019050919050565b600061322f8261318d565b6132398185613198565b93508360208202850161324b856131a9565b8060005b8581101561328757848403895281516132688582613203565b945061327383613217565b925060208a0199505060018101905061324f565b50829750879550505050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b60006132ec826132c5565b6132f681856132d0565b9350613306818560208601612e39565b61330f81612e6c565b840191505092915050565b600061332683836132e1565b905092915050565b6000602082019050919050565b600061334682613299565b61335081856132a4565b935083602082028501613362856132b5565b8060005b8581101561339e578484038952815161337f858261331a565b945061338a8361332e565b925060208a01995050600181019050613366565b50829750879550505050505092915050565b600060808201905081810360008301526133ca8187613071565b905081810360208301526133de818661312f565b905081810360408301526133f28185613224565b90508181036060830152613406818461333b565b905095945050505050565b6000819050919050565b600061343661343161342c84612d19565b613411565b612d19565b9050919050565b60006134488261341b565b9050919050565b600061345a8261343d565b9050919050565b61346a8161344f565b82525050565b60006020820190506134856000830184613461565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600881106134cb576134ca61348b565b5b50565b60008190506134dc826134ba565b919050565b60006134ec826134ce565b9050919050565b6134fc816134e1565b82525050565b600060208201905061351760008301846134f3565b92915050565b60006020820190506135326000830184612d4b565b92915050565b600060ff82169050919050565b61354e81613538565b811461355957600080fd5b50565b60008135905061356b81613545565b92915050565b61357a81612f9d565b811461358557600080fd5b50565b60008135905061359781613571565b92915050565b600080600080600060a086880312156135b9576135b8612c9d565b5b60006135c788828901612cc8565b95505060206135d888828901612eef565b94505060406135e98882890161355c565b93505060606135fa88828901613588565b925050608061360b88828901613588565b9150509295509295909350565b60006136238261343d565b9050919050565b61363381613618565b82525050565b600060208201905061364e600083018461362a565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61369182612e6c565b810181811067ffffffffffffffff821117156136b0576136af613659565b5b80604052505050565b60006136c3612c93565b90506136cf8282613688565b919050565b600067ffffffffffffffff8211156136ef576136ee613659565b5b602082029050602081019050919050565b600080fd5b6000613718613713846136d4565b6136b9565b9050808382526020820190506020840283018581111561373b5761373a613700565b5b835b8181101561376457806137508882612f5b565b84526020840193505060208101905061373d565b5050509392505050565b600082601f83011261378357613782613654565b5b8135613793848260208601613705565b91505092915050565b600067ffffffffffffffff8211156137b7576137b6613659565b5b602082029050602081019050919050565b60006137db6137d68461379c565b6136b9565b905080838252602082019050602084028301858111156137fe576137fd613700565b5b835b8181101561382757806138138882612cc8565b845260208401935050602081019050613800565b5050509392505050565b600082601f83011261384657613845613654565b5b81356138568482602086016137c8565b91505092915050565b600067ffffffffffffffff82111561387a57613879613659565b5b602082029050602081019050919050565b600080fd5b600067ffffffffffffffff8211156138ab576138aa613659565b5b6138b482612e6c565b9050602081019050919050565b82818337600083830152505050565b60006138e36138de84613890565b6136b9565b9050828152602081018484840111156138ff576138fe61388b565b5b61390a8482856138c1565b509392505050565b600082601f83011261392757613926613654565b5b81356139378482602086016138d0565b91505092915050565b600061395361394e8461385f565b6136b9565b9050808382526020820190506020840283018581111561397657613975613700565b5b835b818110156139bd57803567ffffffffffffffff81111561399b5761399a613654565b5b8086016139a88982613912565b85526020850194505050602081019050613978565b5050509392505050565b600082601f8301126139dc576139db613654565b5b81356139ec848260208601613940565b91505092915050565b600067ffffffffffffffff821115613a1057613a0f613659565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613a3c57613a3b613659565b5b613a4582612e6c565b9050602081019050919050565b6000613a65613a6084613a21565b6136b9565b905082815260208101848484011115613a8157613a8061388b565b5b613a8c8482856138c1565b509392505050565b600082601f830112613aa957613aa8613654565b5b8135613ab9848260208601613a52565b91505092915050565b6000613ad5613ad0846139f5565b6136b9565b90508083825260208201905060208402830185811115613af857613af7613700565b5b835b81811015613b3f57803567ffffffffffffffff811115613b1d57613b1c613654565b5b808601613b2a8982613a94565b85526020850194505050602081019050613afa565b5050509392505050565b600082601f830112613b5e57613b5d613654565b5b8135613b6e848260208601613ac2565b91505092915050565b600080600080600060a08688031215613b9357613b92612c9d565b5b600086013567ffffffffffffffff811115613bb157613bb0612ca2565b5b613bbd8882890161376e565b955050602086013567ffffffffffffffff811115613bde57613bdd612ca2565b5b613bea88828901613831565b945050604086013567ffffffffffffffff811115613c0b57613c0a612ca2565b5b613c17888289016139c7565b935050606086013567ffffffffffffffff811115613c3857613c37612ca2565b5b613c4488828901613b49565b925050608086013567ffffffffffffffff811115613c6557613c64612ca2565b5b613c7188828901613912565b9150509295509295909350565b60008060408385031215613c9557613c94612c9d565b5b6000613ca385828601612cc8565b9250506020613cb485828601612f5b565b9150509250929050565b613cc781612d5a565b82525050565b60006bffffffffffffffffffffffff82169050919050565b613cee81613ccd565b82525050565b606082016000820151613d0a6000850182613cbe565b506020820151613d1d6020850182613cbe565b506040820151613d306040850182613ce5565b50505050565b6000606082019050613d4b6000830184613cf4565b92915050565b7f476f7665726e6f72416c7068613a3a5f5f6578656375746553657454696d656c60008201527f6f636b50656e64696e6741646d696e3a2073656e646572206d7573742062652060208201527f676f7620677561726469616e0000000000000000000000000000000000000000604082015250565b6000613dd3604c83612e28565b9150613dde82613d51565b606082019050919050565b60006020820190508181036000830152613e0281613dc6565b9050919050565b6000819050919050565b6000613e2e613e29613e2484613e09565b613411565b612ca7565b9050919050565b613e3e81613e13565b82525050565b7f73657450656e64696e6741646d696e2861646472657373290000000000000000600082015250565b6000613e7a601883612e28565b9150613e8582613e44565b602082019050919050565b600082825260208201905092915050565b6000613eac826132c5565b613eb68185613e90565b9350613ec6818560208601612e39565b613ecf81612e6c565b840191505092915050565b600060a082019050613eef6000830187612d4b565b613efc6020830186613e35565b8181036040830152613f0d81613e6d565b90508181036060830152613f218185613ea1565b9050613f306080830184612d0a565b95945050505050565b6000613f4c613f4784613a21565b6136b9565b905082815260208101848484011115613f6857613f6761388b565b5b613f73848285612e39565b509392505050565b600082601f830112613f9057613f8f613654565b5b8151613fa0848260208601613f39565b91505092915050565b600060208284031215613fbf57613fbe612c9d565b5b600082015167ffffffffffffffff811115613fdd57613fdc612ca2565b5b613fe984828501613f7b565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061403957607f821691505b6020821081141561404d5761404c613ff2565b5b50919050565b7f476f7665726e6f72416c7068613a3a73746174653a20696e76616c696420707260008201527f6f706f73616c2069640000000000000000000000000000000000000000000000602082015250565b60006140af602983612e28565b91506140ba82614053565b604082019050919050565b600060208201905081810360008301526140de816140a2565b9050919050565b6000815190506140f481612cb1565b92915050565b6000602082840312156141105761410f612c9d565b5b600061411e848285016140e5565b91505092915050565b7f476f7665726e6f72416c7068613a3a63616e63656c3a2063616e6e6f7420636160008201527f6e63656c2065786563757465642070726f706f73616c00000000000000000000602082015250565b6000614183603683612e28565b915061418e82614127565b604082019050919050565b600060208201905081810360008301526141b281614176565b9050919050565b60006040820190506141ce6000830185612d4b565b6141db6020830184612d0a565b9392505050565b6141eb81613ccd565b81146141f657600080fd5b50565b600081519050614208816141e2565b92915050565b60006020828403121561422457614223612c9d565b5b6000614232848285016141f9565b91505092915050565b7f476f7665726e6f72416c7068613a3a63616e63656c3a2070726f706f7365722060008201527f61626f7665207468726573686f6c640000000000000000000000000000000000602082015250565b6000614297602f83612e28565b91506142a28261423b565b604082019050919050565b600060208201905081810360008301526142c68161428a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008190508160005260206000209050919050565b6000815461431e81614021565b6143288186612e28565b94506001821660008114614343576001811461435557614388565b60ff1983168652602086019350614388565b61435e856142fc565b60005b8381101561438057815481890152600182019150602081019050614361565b808801955050505b50505092915050565b60008190508160005260206000209050919050565b600081546143b381614021565b6143bd8186613e90565b945060018216600081146143d857600181146143ea5761441d565b60ff198316865260208601935061441d565b6143f385614391565b60005b83811015614415578154818901526001820191506020810190506143f6565b808801955050505b50505092915050565b600060a08201905061443b6000830188612d4b565b6144486020830187612d0a565b818103604083015261445a8186614311565b9050818103606083015261446e81856143a6565b905061447d6080830184612d0a565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006144c182612ca7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156144f4576144f3614487565b5b600182019050919050565b60006080820190506145146000830187612fa7565b6145216020830186612fa7565b61452e6040830185612d0a565b61453b6060830184612d4b565b95945050505050565b60006060820190506145596000830186612fa7565b6145666020830185612d0a565b6145736040830184612d66565b949350505050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b60006145bc60028361457b565b91506145c782614586565b600282019050919050565b6000819050919050565b6145ed6145e882612f9d565b6145d2565b82525050565b60006145fe826145af565b915061460a82856145dc565b60208201915061461a82846145dc565b6020820191508190509392505050565b61463381613538565b82525050565b600060808201905061464e6000830187612fa7565b61465b602083018661462a565b6146686040830185612fa7565b6146756060830184612fa7565b95945050505050565b7f476f7665726e6f72416c7068613a3a63617374566f746542795369673a20696e60008201527f76616c6964207369676e61747572650000000000000000000000000000000000602082015250565b60006146da602f83612e28565b91506146e58261467e565b604082019050919050565b60006020820190508181036000830152614709816146cd565b9050919050565b7f476f7665726e6f72416c7068613a3a5f5f61626469636174653a2073656e646560008201527f72206d75737420626520676f7620677561726469616e00000000000000000000602082015250565b600061476c603683612e28565b915061477782614710565b604082019050919050565b6000602082019050818103600083015261479b8161475f565b9050919050565b7f476f7665726e6f72416c7068613a3a5f5f717565756553657454696d656c6f6360008201527f6b50656e64696e6741646d696e3a2073656e646572206d75737420626520676f60208201527f7620677561726469616e00000000000000000000000000000000000000000000604082015250565b6000614824604a83612e28565b915061482f826147a2565b606082019050919050565b6000602082019050818103600083015261485381614817565b9050919050565b60008151905061486981613571565b92915050565b60006020828403121561488557614884612c9d565b5b60006148938482850161485a565b91505092915050565b7f476f7665726e6f72416c7068613a3a5f5f61636365707441646d696e3a20736560008201527f6e646572206d75737420626520676f7620677561726469616e00000000000000602082015250565b60006148f8603983612e28565b91506149038261489c565b604082019050919050565b60006020820190508181036000830152614927816148eb565b9050919050565b7f476f7665726e6f72416c7068613a3a70726f706f73653a2070726f706f73657260008201527f20766f7465732062656c6f772070726f706f73616c207468726573686f6c6400602082015250565b600061498a603f83612e28565b91506149958261492e565b604082019050919050565b600060208201905081810360008301526149b98161497d565b9050919050565b7f476f7665726e6f72416c7068613a3a70726f706f73653a2070726f706f73616c60008201527f2066756e6374696f6e20696e666f726d6174696f6e206172697479206d69736d60208201527f6174636800000000000000000000000000000000000000000000000000000000604082015250565b6000614a42604483612e28565b9150614a4d826149c0565b606082019050919050565b60006020820190508181036000830152614a7181614a35565b9050919050565b7f476f7665726e6f72416c7068613a3a70726f706f73653a206d7573742070726f60008201527f7669646520616374696f6e730000000000000000000000000000000000000000602082015250565b6000614ad4602c83612e28565b9150614adf82614a78565b604082019050919050565b60006020820190508181036000830152614b0381614ac7565b9050919050565b7f476f7665726e6f72416c7068613a3a70726f706f73653a20746f6f206d616e7960008201527f20616374696f6e73000000000000000000000000000000000000000000000000602082015250565b6000614b66602883612e28565b9150614b7182614b0a565b604082019050919050565b60006020820190508181036000830152614b9581614b59565b9050919050565b7f476f7665726e6f72416c7068613a3a70726f706f73653a206f6e65206c69766560008201527f2070726f706f73616c207065722070726f706f7365722c20666f756e6420616e60208201527f20616c7265616479206163746976652070726f706f73616c0000000000000000604082015250565b6000614c1e605883612e28565b9150614c2982614b9c565b606082019050919050565b60006020820190508181036000830152614c4d81614c11565b9050919050565b7f476f7665726e6f72416c7068613a3a70726f706f73653a206f6e65206c69766560008201527f2070726f706f73616c207065722070726f706f7365722c20666f756e6420616e60208201527f20616c72656164792070656e64696e672070726f706f73616c00000000000000604082015250565b6000614cd6605983612e28565b9150614ce182614c54565b606082019050919050565b60006020820190508181036000830152614d0581614cc9565b9050919050565b7f476f7665726e6f72416c7068613a3a70726f706f73653a2050726f706f73616c60008201527f494420636f6c6c73696f6e000000000000000000000000000000000000000000602082015250565b6000614d68602b83612e28565b9150614d7382614d0c565b604082019050919050565b60006020820190508181036000830152614d9781614d5b565b9050919050565b600061012082019050614db4600083018c612d0a565b614dc1602083018b612d4b565b8181036040830152614dd3818a613071565b90508181036060830152614de7818961312f565b90508181036080830152614dfb8188613224565b905081810360a0830152614e0f818761333b565b9050614e1e60c0830186612d0a565b614e2b60e0830185612d0a565b818103610100830152614e3e8184612e7d565b90509a9950505050505050505050565b7f476f7665726e6f72416c7068613a3a71756575653a2070726f706f73616c206360008201527f616e206f6e6c792062652071756575656420696620697420697320737563636560208201527f6564656400000000000000000000000000000000000000000000000000000000604082015250565b6000614ed0604483612e28565b9150614edb82614e4e565b606082019050919050565b60006020820190508181036000830152614eff81614ec3565b9050919050565b6000604082019050614f1b6000830185612d0a565b614f286020830184612d0a565b9392505050565b7f476f7665726e6f72416c7068613a3a657865637574653a2070726f706f73616c60008201527f2063616e206f6e6c79206265206578656375746564206966206974206973207160208201527f7565756564000000000000000000000000000000000000000000000000000000604082015250565b6000614fb1604583612e28565b9150614fbc82614f2f565b606082019050919050565b60006020820190508181036000830152614fe081614fa4565b9050919050565b7f476f7665726e6f72416c7068613a3a5f63617374566f74653a20766f74696e6760008201527f20697320636c6f73656400000000000000000000000000000000000000000000602082015250565b6000615043602a83612e28565b915061504e82614fe7565b604082019050919050565b6000602082019050818103600083015261507281615036565b9050919050565b7f476f7665726e6f72416c7068613a3a5f63617374566f74653a20766f7465722060008201527f616c726561647920766f74656400000000000000000000000000000000000000602082015250565b60006150d5602d83612e28565b91506150e082615079565b604082019050919050565b60006020820190508181036000830152615104816150c8565b9050919050565b600061512661512161511c84613ccd565b613411565b612ca7565b9050919050565b6151368161510b565b82525050565b60006080820190506151516000830187612d4b565b61515e6020830186612d0a565b61516b6040830185612d66565b615178606083018461512d565b95945050505050565b600061518c82612ca7565b915061519783612ca7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156151cc576151cb614487565b5b828201905092915050565b7f6164646974696f6e206f766572666c6f77000000000000000000000000000000600082015250565b600061520d601183612e28565b9150615218826151d7565b602082019050919050565b6000602082019050818103600083015261523c81615200565b9050919050565b7f7375627472616374696f6e20756e646572666c6f770000000000000000000000600082015250565b6000615279601583612e28565b915061528482615243565b602082019050919050565b600060208201905081810360008301526152a88161526c565b9050919050565b60006152ba82612ca7565b91506152c583612ca7565b9250828210156152d8576152d7614487565b5b828203905092915050565b600060a0820190506152f86000830188612d4b565b6153056020830187612d0a565b81810360408301526153178186612e7d565b9050818103606083015261532b8185613ea1565b905061533a6080830184612d0a565b9695505050505050565b60008151905061535381612ed8565b92915050565b60006020828403121561536f5761536e612c9d565b5b600061537d84828501615344565b91505092915050565b7f476f7665726e6f72416c7068613a3a5f71756575654f725265766572743a207060008201527f726f706f73616c20616374696f6e20616c72656164792071756575656420617460208201527f2065746100000000000000000000000000000000000000000000000000000000604082015250565b6000615408604483612e28565b915061541382615386565b606082019050919050565b60006020820190508181036000830152615437816153fb565b905091905056fea26469706673582212208291ad29f2e09009a4b1ef27d2b81c88f60253129454579e1c642e005e1daf6c64736f6c634300080a00330000000000000000000000008fcd23749f999c52f665d12c64319655e7fef0b8000000000000000000000000e18c200a70908c89ffa18c628fe1b83ac0065ea40000000000000000000000005b024afaaaed10ba2788fddcd7b72af60a854d2f

Deployed ByteCode

0x60806040526004361061019c5760003560e01c8063452a9320116100ec578063d33219b41161008a578063ddf0b00911610064578063ddf0b009146105b1578063deaaa7cc146105da578063e23a9a5214610605578063fe0d94c1146106425761019c565b8063d33219b41461051e578063da35c66414610549578063da95691a146105745761019c565b80637bdbe4d0116100c65780637bdbe4d01461048857806391500671146104b3578063b58131b0146104dc578063b9a61961146105075761019c565b8063452a93201461041d5780634634c61f14610448578063760fbc13146104715761019c565b806321f43e42116101595780633932abb1116101335780633932abb114610361578063393aac271461038c5780633e4f49e6146103b757806340e58ee5146103f45761019c565b806321f43e42146102cd57806324bc1a64146102f6578063328dd982146103215761019c565b8063013cf08b146101a157806302a251a3146101e657806306fdde031461021157806315373e3d1461023c57806317977c611461026557806320606b70146102a2575b600080fd5b3480156101ad57600080fd5b506101c860048036038101906101c39190612cdd565b61065e565b6040516101dd99989796959493929190612d75565b60405180910390f35b3480156101f257600080fd5b506101fb6106e6565b6040516102089190612e02565b60405180910390f35b34801561021d57600080fd5b506102266106ef565b6040516102339190612eb6565b60405180910390f35b34801561024857600080fd5b50610263600480360381019061025e9190612f04565b610728565b005b34801561027157600080fd5b5061028c60048036038101906102879190612f70565b610737565b6040516102999190612e02565b60405180910390f35b3480156102ae57600080fd5b506102b761074f565b6040516102c49190612fb6565b60405180910390f35b3480156102d957600080fd5b506102f460048036038101906102ef9190612fd1565b610773565b005b34801561030257600080fd5b5061030b6108ef565b6040516103189190612e02565b60405180910390f35b34801561032d57600080fd5b5061034860048036038101906103439190612cdd565b610900565b60405161035894939291906133b0565b60405180910390f35b34801561036d57600080fd5b50610376610bbd565b6040516103839190612e02565b60405180910390f35b34801561039857600080fd5b506103a1610bc6565b6040516103ae9190613470565b60405180910390f35b3480156103c357600080fd5b506103de60048036038101906103d99190612cdd565b610bec565b6040516103eb9190613502565b60405180910390f35b34801561040057600080fd5b5061041b60048036038101906104169190612cdd565b610dc0565b005b34801561042957600080fd5b50610432611179565b60405161043f919061351d565b60405180910390f35b34801561045457600080fd5b5061046f600480360381019061046a919061359d565b61119f565b005b34801561047d57600080fd5b50610486611388565b005b34801561049457600080fd5b5061049d61145c565b6040516104aa9190612e02565b60405180910390f35b3480156104bf57600080fd5b506104da60048036038101906104d59190612fd1565b611465565b005b3480156104e857600080fd5b506104f16115dc565b6040516104fe9190612e02565b60405180910390f35b34801561051357600080fd5b5061051c6115ed565b005b34801561052a57600080fd5b506105336116ff565b6040516105409190613639565b60405180910390f35b34801561055557600080fd5b5061055e611723565b60405161056b9190612e02565b60405180910390f35b34801561058057600080fd5b5061059b60048036038101906105969190613b77565b611729565b6040516105a89190612e02565b60405180910390f35b3480156105bd57600080fd5b506105d860048036038101906105d39190612cdd565b611ccf565b005b3480156105e657600080fd5b506105ef61201b565b6040516105fc9190612fb6565b60405180910390f35b34801561061157600080fd5b5061062c60048036038101906106279190613c7e565b61203f565b6040516106399190613d36565b60405180910390f35b61065c60048036038101906106579190612cdd565b612121565b005b60046020528060005260406000206000915090508060000154908060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169080600201549080600701549080600801549080600901549080600a01549080600b0160009054906101000a900460ff169080600b0160019054906101000a900460ff16905089565b60006060905090565b6040518060400160405280601681526020017f5065676173797320476f7665726e6f7220416c7068610000000000000000000081525081565b610733338383612392565b5050565b60056020528060005260406000206000915090505481565b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610803576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107fa90613de9565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630825f38f60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600085604051602001610873919061351d565b604051602081830303815290604052856040518563ffffffff1660e01b81526004016108a29493929190613eda565b6000604051808303816000875af11580156108c1573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906108ea9190613fa9565b505050565b60006815af1d78b58c400000905090565b606080606080600060046000878152602001908152602001600020905080600301816004018260050183600601838054806020026020016040519081016040528092919081815260200182805480156109ae57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311610964575b5050505050935082805480602002602001604051908101604052809291908181526020018280548015610a0057602002820191906000526020600020905b8154815260200190600101908083116109ec575b5050505050925081805480602002602001604051908101604052809291908181526020016000905b82821015610ad4578382906000526020600020018054610a4790614021565b80601f0160208091040260200160405190810160405280929190818152602001828054610a7390614021565b8015610ac05780601f10610a9557610100808354040283529160200191610ac0565b820191906000526020600020905b815481529060010190602001808311610aa357829003601f168201915b505050505081526020019060010190610a28565b50505050915080805480602002602001604051908101604052809291908181526020016000905b82821015610ba7578382906000526020600020018054610b1a90614021565b80601f0160208091040260200160405190810160405280929190818152602001828054610b4690614021565b8015610b935780601f10610b6857610100808354040283529160200191610b93565b820191906000526020600020905b815481529060010190602001808311610b7657829003601f168201915b505050505081526020019060010190610afb565b5050505090509450945094509450509193509193565b60006001905090565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008160035410158015610c005750600082115b610c3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c36906140c5565b60405180910390fd5b600060046000848152602001908152602001600020905080600b0160009054906101000a900460ff1615610c77576002915050610dbb565b80600701544311610c8c576000915050610dbb565b80600801544311610ca1576001915050610dbb565b80600a01548160090154111580610cc25750610cbb6108ef565b8160090154105b15610cd1576003915050610dbb565b600081600201541415610ce8576004915050610dbb565b80600b0160019054906101000a900460ff1615610d09576007915050610dbb565b610da5816002015460008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c1a287e26040518163ffffffff1660e01b8152600401602060405180830381865afa158015610d7c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da091906140fa565b612660565b4210610db5576006915050610dbb565b60059150505b919050565b6000610dcb82610bec565b9050600780811115610de057610ddf61348b565b5b816007811115610df357610df261348b565b5b1415610e34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2b90614199565b60405180910390fd5b6000600460008481526020019081526020016000209050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610f865750610eaa6115dc565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663782d6fe18360010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610f184360016126be565b6040518363ffffffff1660e01b8152600401610f359291906141b9565b602060405180830381865afa158015610f52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f76919061420e565b6bffffffffffffffffffffffff16105b610fc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fbc906142ad565b60405180910390fd5b600181600b0160006101000a81548160ff02191690831515021790555060005b816003018054905081101561113c5760008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663591fcdfe836003018381548110611046576110456142cd565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846004018481548110611087576110866142cd565b5b90600052602060002001548560050185815481106110a8576110a76142cd565b5b906000526020600020018660060186815481106110c8576110c76142cd565b5b9060005260206000200187600201546040518663ffffffff1660e01b81526004016110f7959493929190614426565b600060405180830381600087803b15801561111157600080fd5b505af1158015611125573d6000803e3d6000fd5b505050508080611134906144b6565b915050610fe5565b507f789cf55be980739dad1d0699b93b58e806b51c9d96619bfa8fe0a28abaa7b30c8360405161116c9190612e02565b60405180910390a1505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8666040518060400160405280601681526020017f5065676173797320476f7665726e6f7220416c7068610000000000000000000081525080519060200120611207612717565b3060405160200161121b94939291906144ff565b60405160208183030381529060405280519060200120905060007f8e25870c07e0b0b3884c78da52790939a455c275406c44ae8b434b692fb916ee878760405160200161126a93929190614544565b604051602081830303815290604052805190602001209050600082826040516020016112979291906145f3565b6040516020818303038152906040528051906020012090506000600182888888604051600081526020016040526040516112d49493929190614639565b6020604051602081039080840390855afa1580156112f6573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611372576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611369906146f0565b60405180910390fd5b61137d818a8a612392565b505050505050505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611418576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140f90614782565b60405180910390fd5b6000600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000600a905090565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ec9061483a565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633a66f90160008054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600085604051602001611565919061351d565b604051602081830303815290604052856040518563ffffffff1660e01b81526004016115949493929190613eda565b6020604051808303816000875af11580156115b3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d7919061486f565b505050565b6000683635c9adc5dea00000905090565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461167d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116749061490e565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630e18b6816040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156116e557600080fd5b505af11580156116f9573d6000803e3d6000fd5b50505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60035481565b60006117336115dc565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663782d6fe13361177d4360016126be565b6040518363ffffffff1660e01b815260040161179a9291906141b9565b602060405180830381865afa1580156117b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117db919061420e565b6bffffffffffffffffffffffff1611611829576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611820906149a0565b60405180910390fd5b8451865114801561183b575083518651145b8015611848575082518651145b611887576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187e90614a58565b60405180910390fd5b6000865114156118cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c390614aea565b60405180910390fd5b6118d461145c565b86511115611917576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190e90614b7c565b60405180910390fd5b6000600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905060008114611a4257600061196e82610bec565b9050600160078111156119845761198361348b565b5b8160078111156119975761199661348b565b5b14156119d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119cf90614c34565b60405180910390fd5b600060078111156119ec576119eb61348b565b5b8160078111156119ff576119fe61348b565b5b1415611a40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3790614cec565b60405180910390fd5b505b6000611a5543611a50610bbd565b612660565b90506000611a6a82611a656106e6565b612660565b905060036000815480929190611a7f906144b6565b91905055506000600354905060006004600083815260200190815260200160002090506000816000015414611ae9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae090614d7e565b60405180910390fd5b818160000181905550338160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600081600201819055508a816003019080519060200190611b579291906128d8565b5089816004019080519060200190611b70929190612962565b5088816005019080519060200190611b899291906129af565b5087816006019080519060200190611ba2929190612a0f565b5083816007018190555082816008018190555060008160090181905550600081600a0181905550600081600b0160006101000a81548160ff021916908315150217905550600081600b0160016101000a81548160ff0219169083151502179055508060000154600560008360010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f7d84a6263ae0d98d3329bd7b46bb4e8d6f98cd35a7adb45c274c8b7fd5ebd5e08160000154338d8d8d8d8a8a8f604051611cb299989796959493929190614d9e565b60405180910390a180600001549550505050505095945050505050565b60046007811115611ce357611ce261348b565b5b611cec82610bec565b6007811115611cfe57611cfd61348b565b5b14611d3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3590614ee6565b60405180910390fd5b60006004600083815260200190815260200160002090506000611def4260008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636a42b8f86040518163ffffffff1660e01b8152600401602060405180830381865afa158015611dc6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611dea91906140fa565b612660565b905060005b8260030180549050811015611fd357611fc0836003018281548110611e1c57611e1b6142cd565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846004018381548110611e5d57611e5c6142cd565b5b9060005260206000200154856005018481548110611e7e57611e7d6142cd565b5b906000526020600020018054611e9390614021565b80601f0160208091040260200160405190810160405280929190818152602001828054611ebf90614021565b8015611f0c5780601f10611ee157610100808354040283529160200191611f0c565b820191906000526020600020905b815481529060010190602001808311611eef57829003601f168201915b5050505050866006018581548110611f2757611f266142cd565b5b906000526020600020018054611f3c90614021565b80601f0160208091040260200160405190810160405280929190818152602001828054611f6890614021565b8015611fb55780601f10611f8a57610100808354040283529160200191611fb5565b820191906000526020600020905b815481529060010190602001808311611f9857829003601f168201915b505050505086612724565b8080611fcb906144b6565b915050611df4565b508082600201819055507f9a2e42fd6722813d69113e7d0079d3d940171428df7373df9c7f7617cfda2892838260405161200e929190614f06565b60405180910390a1505050565b7f8e25870c07e0b0b3884c78da52790939a455c275406c44ae8b434b692fb916ee81565b612047612a6f565b60046000848152602001908152602001600020600c0160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060600160405290816000820160009054906101000a900460ff161515151581526020016000820160019054906101000a900460ff161515151581526020016000820160029054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff1681525050905092915050565b600560078111156121355761213461348b565b5b61213e82610bec565b60078111156121505761214f61348b565b5b14612190576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161218790614fc7565b60405180910390fd5b6000600460008381526020019081526020016000209050600181600b0160016101000a81548160ff02191690831515021790555060005b81600301805490508110156123565760008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630825f38f836004018381548110612228576122276142cd565b5b9060005260206000200154846003018481548110612249576122486142cd565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685600401858154811061228a576122896142cd565b5b90600052602060002001548660050186815481106122ab576122aa6142cd565b5b906000526020600020018760060187815481106122cb576122ca6142cd565b5b9060005260206000200188600201546040518763ffffffff1660e01b81526004016122fa959493929190614426565b60006040518083038185885af1158015612318573d6000803e3d6000fd5b50505050506040513d6000823e3d601f19601f820116820180604052508101906123429190613fa9565b50808061234e906144b6565b9150506121c7565b507f712ae1383f79ac853f8d882153778e0260ef8f03b504e2866e0593e04d2b291f826040516123869190612e02565b60405180910390a15050565b600160078111156123a6576123a561348b565b5b6123af83610bec565b60078111156123c1576123c061348b565b5b14612401576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f890615059565b60405180910390fd5b6000600460008481526020019081526020016000209050600081600c0160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600015158160000160009054906101000a900460ff161515146124b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ac906150eb565b60405180910390fd5b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663782d6fe18785600701546040518363ffffffff1660e01b81526004016125189291906141b9565b602060405180830381865afa158015612535573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612559919061420e565b9050831561258a5761257d8360090154826bffffffffffffffffffffffff16612660565b83600901819055506125af565b6125a683600a0154826bffffffffffffffffffffffff16612660565b83600a01819055505b60018260000160006101000a81548160ff021916908315150217905550838260000160016101000a81548160ff021916908315150217905550808260000160026101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055507f877856338e13f63d0c36822ff0ef736b80934cd90574a3a5bc9262c39d217c4686868684604051612650949392919061513c565b60405180910390a1505050505050565b600080828461266f9190615181565b9050838110156126b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ab90615223565b60405180910390fd5b8091505092915050565b600082821115612703576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126fa9061528f565b60405180910390fd5b818361270f91906152af565b905092915050565b6000804690508091505090565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f2b0653786868686866040516020016127799594939291906152e3565b604051602081830303815290604052805190602001206040518263ffffffff1660e01b81526004016127ab9190612fb6565b602060405180830381865afa1580156127c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127ec9190615359565b1561282c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128239061541e565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16633a66f90186868686866040518663ffffffff1660e01b815260040161288d9594939291906152e3565b6020604051808303816000875af11580156128ac573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128d0919061486f565b505050505050565b828054828255906000526020600020908101928215612951579160200282015b828111156129505782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550916020019190600101906128f8565b5b50905061295e9190612aa2565b5090565b82805482825590600052602060002090810192821561299e579160200282015b8281111561299d578251825591602001919060010190612982565b5b5090506129ab9190612aa2565b5090565b8280548282559060005260206000209081019282156129fe579160200282015b828111156129fd5782518290805190602001906129ed929190612abf565b50916020019190600101906129cf565b5b509050612a0b9190612b45565b5090565b828054828255906000526020600020908101928215612a5e579160200282015b82811115612a5d578251829080519060200190612a4d929190612b69565b5091602001919060010190612a2f565b5b509050612a6b9190612bef565b5090565b604051806060016040528060001515815260200160001515815260200160006bffffffffffffffffffffffff1681525090565b5b80821115612abb576000816000905550600101612aa3565b5090565b828054612acb90614021565b90600052602060002090601f016020900481019282612aed5760008555612b34565b82601f10612b0657805160ff1916838001178555612b34565b82800160010185558215612b34579182015b82811115612b33578251825591602001919060010190612b18565b5b509050612b419190612aa2565b5090565b5b80821115612b655760008181612b5c9190612c13565b50600101612b46565b5090565b828054612b7590614021565b90600052602060002090601f016020900481019282612b975760008555612bde565b82601f10612bb057805160ff1916838001178555612bde565b82800160010185558215612bde579182015b82811115612bdd578251825591602001919060010190612bc2565b5b509050612beb9190612aa2565b5090565b5b80821115612c0f5760008181612c069190612c53565b50600101612bf0565b5090565b508054612c1f90614021565b6000825580601f10612c315750612c50565b601f016020900490600052602060002090810190612c4f9190612aa2565b5b50565b508054612c5f90614021565b6000825580601f10612c715750612c90565b601f016020900490600052602060002090810190612c8f9190612aa2565b5b50565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b612cba81612ca7565b8114612cc557600080fd5b50565b600081359050612cd781612cb1565b92915050565b600060208284031215612cf357612cf2612c9d565b5b6000612d0184828501612cc8565b91505092915050565b612d1381612ca7565b82525050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612d4482612d19565b9050919050565b612d5481612d39565b82525050565b60008115159050919050565b612d6f81612d5a565b82525050565b600061012082019050612d8b600083018c612d0a565b612d98602083018b612d4b565b612da5604083018a612d0a565b612db26060830189612d0a565b612dbf6080830188612d0a565b612dcc60a0830187612d0a565b612dd960c0830186612d0a565b612de660e0830185612d66565b612df4610100830184612d66565b9a9950505050505050505050565b6000602082019050612e176000830184612d0a565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612e57578082015181840152602081019050612e3c565b83811115612e66576000848401525b50505050565b6000601f19601f8301169050919050565b6000612e8882612e1d565b612e928185612e28565b9350612ea2818560208601612e39565b612eab81612e6c565b840191505092915050565b60006020820190508181036000830152612ed08184612e7d565b905092915050565b612ee181612d5a565b8114612eec57600080fd5b50565b600081359050612efe81612ed8565b92915050565b60008060408385031215612f1b57612f1a612c9d565b5b6000612f2985828601612cc8565b9250506020612f3a85828601612eef565b9150509250929050565b612f4d81612d39565b8114612f5857600080fd5b50565b600081359050612f6a81612f44565b92915050565b600060208284031215612f8657612f85612c9d565b5b6000612f9484828501612f5b565b91505092915050565b6000819050919050565b612fb081612f9d565b82525050565b6000602082019050612fcb6000830184612fa7565b92915050565b60008060408385031215612fe857612fe7612c9d565b5b6000612ff685828601612f5b565b925050602061300785828601612cc8565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61304681612d39565b82525050565b6000613058838361303d565b60208301905092915050565b6000602082019050919050565b600061307c82613011565b613086818561301c565b93506130918361302d565b8060005b838110156130c25781516130a9888261304c565b97506130b483613064565b925050600181019050613095565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61310481612ca7565b82525050565b600061311683836130fb565b60208301905092915050565b6000602082019050919050565b600061313a826130cf565b61314481856130da565b935061314f836130eb565b8060005b83811015613180578151613167888261310a565b975061317283613122565b925050600181019050613153565b5085935050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600082825260208201905092915050565b60006131d582612e1d565b6131df81856131b9565b93506131ef818560208601612e39565b6131f881612e6c565b840191505092915050565b600061320f83836131ca565b905092915050565b6000602082019050919050565b600061322f8261318d565b6132398185613198565b93508360208202850161324b856131a9565b8060005b8581101561328757848403895281516132688582613203565b945061327383613217565b925060208a0199505060018101905061324f565b50829750879550505050505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b600081519050919050565b600082825260208201905092915050565b60006132ec826132c5565b6132f681856132d0565b9350613306818560208601612e39565b61330f81612e6c565b840191505092915050565b600061332683836132e1565b905092915050565b6000602082019050919050565b600061334682613299565b61335081856132a4565b935083602082028501613362856132b5565b8060005b8581101561339e578484038952815161337f858261331a565b945061338a8361332e565b925060208a01995050600181019050613366565b50829750879550505050505092915050565b600060808201905081810360008301526133ca8187613071565b905081810360208301526133de818661312f565b905081810360408301526133f28185613224565b90508181036060830152613406818461333b565b905095945050505050565b6000819050919050565b600061343661343161342c84612d19565b613411565b612d19565b9050919050565b60006134488261341b565b9050919050565b600061345a8261343d565b9050919050565b61346a8161344f565b82525050565b60006020820190506134856000830184613461565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600881106134cb576134ca61348b565b5b50565b60008190506134dc826134ba565b919050565b60006134ec826134ce565b9050919050565b6134fc816134e1565b82525050565b600060208201905061351760008301846134f3565b92915050565b60006020820190506135326000830184612d4b565b92915050565b600060ff82169050919050565b61354e81613538565b811461355957600080fd5b50565b60008135905061356b81613545565b92915050565b61357a81612f9d565b811461358557600080fd5b50565b60008135905061359781613571565b92915050565b600080600080600060a086880312156135b9576135b8612c9d565b5b60006135c788828901612cc8565b95505060206135d888828901612eef565b94505060406135e98882890161355c565b93505060606135fa88828901613588565b925050608061360b88828901613588565b9150509295509295909350565b60006136238261343d565b9050919050565b61363381613618565b82525050565b600060208201905061364e600083018461362a565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61369182612e6c565b810181811067ffffffffffffffff821117156136b0576136af613659565b5b80604052505050565b60006136c3612c93565b90506136cf8282613688565b919050565b600067ffffffffffffffff8211156136ef576136ee613659565b5b602082029050602081019050919050565b600080fd5b6000613718613713846136d4565b6136b9565b9050808382526020820190506020840283018581111561373b5761373a613700565b5b835b8181101561376457806137508882612f5b565b84526020840193505060208101905061373d565b5050509392505050565b600082601f83011261378357613782613654565b5b8135613793848260208601613705565b91505092915050565b600067ffffffffffffffff8211156137b7576137b6613659565b5b602082029050602081019050919050565b60006137db6137d68461379c565b6136b9565b905080838252602082019050602084028301858111156137fe576137fd613700565b5b835b8181101561382757806138138882612cc8565b845260208401935050602081019050613800565b5050509392505050565b600082601f83011261384657613845613654565b5b81356138568482602086016137c8565b91505092915050565b600067ffffffffffffffff82111561387a57613879613659565b5b602082029050602081019050919050565b600080fd5b600067ffffffffffffffff8211156138ab576138aa613659565b5b6138b482612e6c565b9050602081019050919050565b82818337600083830152505050565b60006138e36138de84613890565b6136b9565b9050828152602081018484840111156138ff576138fe61388b565b5b61390a8482856138c1565b509392505050565b600082601f83011261392757613926613654565b5b81356139378482602086016138d0565b91505092915050565b600061395361394e8461385f565b6136b9565b9050808382526020820190506020840283018581111561397657613975613700565b5b835b818110156139bd57803567ffffffffffffffff81111561399b5761399a613654565b5b8086016139a88982613912565b85526020850194505050602081019050613978565b5050509392505050565b600082601f8301126139dc576139db613654565b5b81356139ec848260208601613940565b91505092915050565b600067ffffffffffffffff821115613a1057613a0f613659565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613a3c57613a3b613659565b5b613a4582612e6c565b9050602081019050919050565b6000613a65613a6084613a21565b6136b9565b905082815260208101848484011115613a8157613a8061388b565b5b613a8c8482856138c1565b509392505050565b600082601f830112613aa957613aa8613654565b5b8135613ab9848260208601613a52565b91505092915050565b6000613ad5613ad0846139f5565b6136b9565b90508083825260208201905060208402830185811115613af857613af7613700565b5b835b81811015613b3f57803567ffffffffffffffff811115613b1d57613b1c613654565b5b808601613b2a8982613a94565b85526020850194505050602081019050613afa565b5050509392505050565b600082601f830112613b5e57613b5d613654565b5b8135613b6e848260208601613ac2565b91505092915050565b600080600080600060a08688031215613b9357613b92612c9d565b5b600086013567ffffffffffffffff811115613bb157613bb0612ca2565b5b613bbd8882890161376e565b955050602086013567ffffffffffffffff811115613bde57613bdd612ca2565b5b613bea88828901613831565b945050604086013567ffffffffffffffff811115613c0b57613c0a612ca2565b5b613c17888289016139c7565b935050606086013567ffffffffffffffff811115613c3857613c37612ca2565b5b613c4488828901613b49565b925050608086013567ffffffffffffffff811115613c6557613c64612ca2565b5b613c7188828901613912565b9150509295509295909350565b60008060408385031215613c9557613c94612c9d565b5b6000613ca385828601612cc8565b9250506020613cb485828601612f5b565b9150509250929050565b613cc781612d5a565b82525050565b60006bffffffffffffffffffffffff82169050919050565b613cee81613ccd565b82525050565b606082016000820151613d0a6000850182613cbe565b506020820151613d1d6020850182613cbe565b506040820151613d306040850182613ce5565b50505050565b6000606082019050613d4b6000830184613cf4565b92915050565b7f476f7665726e6f72416c7068613a3a5f5f6578656375746553657454696d656c60008201527f6f636b50656e64696e6741646d696e3a2073656e646572206d7573742062652060208201527f676f7620677561726469616e0000000000000000000000000000000000000000604082015250565b6000613dd3604c83612e28565b9150613dde82613d51565b606082019050919050565b60006020820190508181036000830152613e0281613dc6565b9050919050565b6000819050919050565b6000613e2e613e29613e2484613e09565b613411565b612ca7565b9050919050565b613e3e81613e13565b82525050565b7f73657450656e64696e6741646d696e2861646472657373290000000000000000600082015250565b6000613e7a601883612e28565b9150613e8582613e44565b602082019050919050565b600082825260208201905092915050565b6000613eac826132c5565b613eb68185613e90565b9350613ec6818560208601612e39565b613ecf81612e6c565b840191505092915050565b600060a082019050613eef6000830187612d4b565b613efc6020830186613e35565b8181036040830152613f0d81613e6d565b90508181036060830152613f218185613ea1565b9050613f306080830184612d0a565b95945050505050565b6000613f4c613f4784613a21565b6136b9565b905082815260208101848484011115613f6857613f6761388b565b5b613f73848285612e39565b509392505050565b600082601f830112613f9057613f8f613654565b5b8151613fa0848260208601613f39565b91505092915050565b600060208284031215613fbf57613fbe612c9d565b5b600082015167ffffffffffffffff811115613fdd57613fdc612ca2565b5b613fe984828501613f7b565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061403957607f821691505b6020821081141561404d5761404c613ff2565b5b50919050565b7f476f7665726e6f72416c7068613a3a73746174653a20696e76616c696420707260008201527f6f706f73616c2069640000000000000000000000000000000000000000000000602082015250565b60006140af602983612e28565b91506140ba82614053565b604082019050919050565b600060208201905081810360008301526140de816140a2565b9050919050565b6000815190506140f481612cb1565b92915050565b6000602082840312156141105761410f612c9d565b5b600061411e848285016140e5565b91505092915050565b7f476f7665726e6f72416c7068613a3a63616e63656c3a2063616e6e6f7420636160008201527f6e63656c2065786563757465642070726f706f73616c00000000000000000000602082015250565b6000614183603683612e28565b915061418e82614127565b604082019050919050565b600060208201905081810360008301526141b281614176565b9050919050565b60006040820190506141ce6000830185612d4b565b6141db6020830184612d0a565b9392505050565b6141eb81613ccd565b81146141f657600080fd5b50565b600081519050614208816141e2565b92915050565b60006020828403121561422457614223612c9d565b5b6000614232848285016141f9565b91505092915050565b7f476f7665726e6f72416c7068613a3a63616e63656c3a2070726f706f7365722060008201527f61626f7665207468726573686f6c640000000000000000000000000000000000602082015250565b6000614297602f83612e28565b91506142a28261423b565b604082019050919050565b600060208201905081810360008301526142c68161428a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008190508160005260206000209050919050565b6000815461431e81614021565b6143288186612e28565b94506001821660008114614343576001811461435557614388565b60ff1983168652602086019350614388565b61435e856142fc565b60005b8381101561438057815481890152600182019150602081019050614361565b808801955050505b50505092915050565b60008190508160005260206000209050919050565b600081546143b381614021565b6143bd8186613e90565b945060018216600081146143d857600181146143ea5761441d565b60ff198316865260208601935061441d565b6143f385614391565b60005b83811015614415578154818901526001820191506020810190506143f6565b808801955050505b50505092915050565b600060a08201905061443b6000830188612d4b565b6144486020830187612d0a565b818103604083015261445a8186614311565b9050818103606083015261446e81856143a6565b905061447d6080830184612d0a565b9695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006144c182612ca7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156144f4576144f3614487565b5b600182019050919050565b60006080820190506145146000830187612fa7565b6145216020830186612fa7565b61452e6040830185612d0a565b61453b6060830184612d4b565b95945050505050565b60006060820190506145596000830186612fa7565b6145666020830185612d0a565b6145736040830184612d66565b949350505050565b600081905092915050565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b60006145bc60028361457b565b91506145c782614586565b600282019050919050565b6000819050919050565b6145ed6145e882612f9d565b6145d2565b82525050565b60006145fe826145af565b915061460a82856145dc565b60208201915061461a82846145dc565b6020820191508190509392505050565b61463381613538565b82525050565b600060808201905061464e6000830187612fa7565b61465b602083018661462a565b6146686040830185612fa7565b6146756060830184612fa7565b95945050505050565b7f476f7665726e6f72416c7068613a3a63617374566f746542795369673a20696e60008201527f76616c6964207369676e61747572650000000000000000000000000000000000602082015250565b60006146da602f83612e28565b91506146e58261467e565b604082019050919050565b60006020820190508181036000830152614709816146cd565b9050919050565b7f476f7665726e6f72416c7068613a3a5f5f61626469636174653a2073656e646560008201527f72206d75737420626520676f7620677561726469616e00000000000000000000602082015250565b600061476c603683612e28565b915061477782614710565b604082019050919050565b6000602082019050818103600083015261479b8161475f565b9050919050565b7f476f7665726e6f72416c7068613a3a5f5f717565756553657454696d656c6f6360008201527f6b50656e64696e6741646d696e3a2073656e646572206d75737420626520676f60208201527f7620677561726469616e00000000000000000000000000000000000000000000604082015250565b6000614824604a83612e28565b915061482f826147a2565b606082019050919050565b6000602082019050818103600083015261485381614817565b9050919050565b60008151905061486981613571565b92915050565b60006020828403121561488557614884612c9d565b5b60006148938482850161485a565b91505092915050565b7f476f7665726e6f72416c7068613a3a5f5f61636365707441646d696e3a20736560008201527f6e646572206d75737420626520676f7620677561726469616e00000000000000602082015250565b60006148f8603983612e28565b91506149038261489c565b604082019050919050565b60006020820190508181036000830152614927816148eb565b9050919050565b7f476f7665726e6f72416c7068613a3a70726f706f73653a2070726f706f73657260008201527f20766f7465732062656c6f772070726f706f73616c207468726573686f6c6400602082015250565b600061498a603f83612e28565b91506149958261492e565b604082019050919050565b600060208201905081810360008301526149b98161497d565b9050919050565b7f476f7665726e6f72416c7068613a3a70726f706f73653a2070726f706f73616c60008201527f2066756e6374696f6e20696e666f726d6174696f6e206172697479206d69736d60208201527f6174636800000000000000000000000000000000000000000000000000000000604082015250565b6000614a42604483612e28565b9150614a4d826149c0565b606082019050919050565b60006020820190508181036000830152614a7181614a35565b9050919050565b7f476f7665726e6f72416c7068613a3a70726f706f73653a206d7573742070726f60008201527f7669646520616374696f6e730000000000000000000000000000000000000000602082015250565b6000614ad4602c83612e28565b9150614adf82614a78565b604082019050919050565b60006020820190508181036000830152614b0381614ac7565b9050919050565b7f476f7665726e6f72416c7068613a3a70726f706f73653a20746f6f206d616e7960008201527f20616374696f6e73000000000000000000000000000000000000000000000000602082015250565b6000614b66602883612e28565b9150614b7182614b0a565b604082019050919050565b60006020820190508181036000830152614b9581614b59565b9050919050565b7f476f7665726e6f72416c7068613a3a70726f706f73653a206f6e65206c69766560008201527f2070726f706f73616c207065722070726f706f7365722c20666f756e6420616e60208201527f20616c7265616479206163746976652070726f706f73616c0000000000000000604082015250565b6000614c1e605883612e28565b9150614c2982614b9c565b606082019050919050565b60006020820190508181036000830152614c4d81614c11565b9050919050565b7f476f7665726e6f72416c7068613a3a70726f706f73653a206f6e65206c69766560008201527f2070726f706f73616c207065722070726f706f7365722c20666f756e6420616e60208201527f20616c72656164792070656e64696e672070726f706f73616c00000000000000604082015250565b6000614cd6605983612e28565b9150614ce182614c54565b606082019050919050565b60006020820190508181036000830152614d0581614cc9565b9050919050565b7f476f7665726e6f72416c7068613a3a70726f706f73653a2050726f706f73616c60008201527f494420636f6c6c73696f6e000000000000000000000000000000000000000000602082015250565b6000614d68602b83612e28565b9150614d7382614d0c565b604082019050919050565b60006020820190508181036000830152614d9781614d5b565b9050919050565b600061012082019050614db4600083018c612d0a565b614dc1602083018b612d4b565b8181036040830152614dd3818a613071565b90508181036060830152614de7818961312f565b90508181036080830152614dfb8188613224565b905081810360a0830152614e0f818761333b565b9050614e1e60c0830186612d0a565b614e2b60e0830185612d0a565b818103610100830152614e3e8184612e7d565b90509a9950505050505050505050565b7f476f7665726e6f72416c7068613a3a71756575653a2070726f706f73616c206360008201527f616e206f6e6c792062652071756575656420696620697420697320737563636560208201527f6564656400000000000000000000000000000000000000000000000000000000604082015250565b6000614ed0604483612e28565b9150614edb82614e4e565b606082019050919050565b60006020820190508181036000830152614eff81614ec3565b9050919050565b6000604082019050614f1b6000830185612d0a565b614f286020830184612d0a565b9392505050565b7f476f7665726e6f72416c7068613a3a657865637574653a2070726f706f73616c60008201527f2063616e206f6e6c79206265206578656375746564206966206974206973207160208201527f7565756564000000000000000000000000000000000000000000000000000000604082015250565b6000614fb1604583612e28565b9150614fbc82614f2f565b606082019050919050565b60006020820190508181036000830152614fe081614fa4565b9050919050565b7f476f7665726e6f72416c7068613a3a5f63617374566f74653a20766f74696e6760008201527f20697320636c6f73656400000000000000000000000000000000000000000000602082015250565b6000615043602a83612e28565b915061504e82614fe7565b604082019050919050565b6000602082019050818103600083015261507281615036565b9050919050565b7f476f7665726e6f72416c7068613a3a5f63617374566f74653a20766f7465722060008201527f616c726561647920766f74656400000000000000000000000000000000000000602082015250565b60006150d5602d83612e28565b91506150e082615079565b604082019050919050565b60006020820190508181036000830152615104816150c8565b9050919050565b600061512661512161511c84613ccd565b613411565b612ca7565b9050919050565b6151368161510b565b82525050565b60006080820190506151516000830187612d4b565b61515e6020830186612d0a565b61516b6040830185612d66565b615178606083018461512d565b95945050505050565b600061518c82612ca7565b915061519783612ca7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156151cc576151cb614487565b5b828201905092915050565b7f6164646974696f6e206f766572666c6f77000000000000000000000000000000600082015250565b600061520d601183612e28565b9150615218826151d7565b602082019050919050565b6000602082019050818103600083015261523c81615200565b9050919050565b7f7375627472616374696f6e20756e646572666c6f770000000000000000000000600082015250565b6000615279601583612e28565b915061528482615243565b602082019050919050565b600060208201905081810360008301526152a88161526c565b9050919050565b60006152ba82612ca7565b91506152c583612ca7565b9250828210156152d8576152d7614487565b5b828203905092915050565b600060a0820190506152f86000830188612d4b565b6153056020830187612d0a565b81810360408301526153178186612e7d565b9050818103606083015261532b8185613ea1565b905061533a6080830184612d0a565b9695505050505050565b60008151905061535381612ed8565b92915050565b60006020828403121561536f5761536e612c9d565b5b600061537d84828501615344565b91505092915050565b7f476f7665726e6f72416c7068613a3a5f71756575654f725265766572743a207060008201527f726f706f73616c20616374696f6e20616c72656164792071756575656420617460208201527f2065746100000000000000000000000000000000000000000000000000000000604082015250565b6000615408604483612e28565b915061541382615386565b606082019050919050565b60006020820190508181036000830152615437816153fb565b905091905056fea26469706673582212208291ad29f2e09009a4b1ef27d2b81c88f60253129454579e1c642e005e1daf6c64736f6c634300080a0033