Address Details
contract

0xc0AfaD3500635e35679EDd8a18f30Be3b9f22125

Contract Name
AuctionSPU
Creator
0x1cc0fa–12a071 at 0x7257f0–17b962
Balance
2.996999999999999998 CELO ( )
Locked CELO Balance
0.00 CELO
Voting CELO Balance
0.00 CELO
Pending Unlocked Gold
0.00 CELO
Tokens
Fetching tokens...
Transactions
13 Transactions
Transfers
14 Transfers
Gas Used
809,673
Last Balance Update
15012199
This contract has been verified via Sourcify. View contract in Sourcify repository
Contract name:
AuctionSPU




Optimization enabled
false
Compiler version
v0.8.17+commit.8df45f5f




EVM Version
london




Verified at
2023-02-08T19:00:28.531621Z

Contracts/AuctionSPU.sol

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

/*
    Creatd by : Gustavo Henrique
    Email : gustavo@useinsignia.com
    This auction is created to perform a NFT sell, correspondig to a government property. This code
    is a small part of an entire project. Any questions could be redirect to my email 
*/

// TODO
/*
 1 - Criar NFT teste (+30min)
 2 - Inserir documentação (IPFS) Leilão (+45min)
 3 - Criar mintador de leilão (+2hr)
 4 - Criar mintador de NFT (+1hr)
 5 - Criar contrato de documentação (+1Dia)
 6 - Criar mintador de documentação (+2hr)
*/

/*
    ERC-721 interface to acess usable functions as safeTransferFrom
*/

interface IERC721 {
    function safeTransferFrom(address from, address to, uint tokenId) external;

    function transferFrom(address, address, uint) external;
}

/*
    Auction contract 
*/

contract AuctionSPU {


    /*
        Events for external reading
    */
    event StartAuction();
    event Bid(address indexed sender, uint amount);
    event Withdraw(address indexed bidder, uint amount);
    event EndAuction(address winner, uint amount);
    event PauseAuction(address pauser);
    event UnpauseAuction(address pauser);

    /*
        ERC-721 Variables
    */
    IERC721 public nft;
    uint public nftId;

    /*
        Auction parameters
    */

    address payable public seller;
    address payable public feeAddress;
    uint public endAt;
    bool public started;
    bool public ended;
    bool public paused;
    uint public numberOfBids;
    uint private transactionFee;
    uint public constant FEE_BASE = 10000;
    uint public totalFee;

    /*
        Bids parameters
    */
    address public highestBidder;
    uint public highestBid;

    struct Bidders {
        uint totalValue;
        uint realValue;
        uint portion;
        uint clientScore;
    }

    struct FeeReceivers {
        address recipient;
        uint fee;
    }

    mapping(address => Bidders) public receivedBids;
    mapping(address => FeeReceivers) public feeReceivers;

    /*
        Constructor
        _nft -> Address of the nft
        _nftID -> If the nft is part of a collection, default value 0
        _startingBid -> The start value of the auction
        _period -> Duration of the auction , timestampvalue
        seller -> Address of the seller, by default SPU
    */
    constructor(
        address _nft,
        address _feeAddres,
        uint _nftId,
        uint _startingBid,
        uint _period,
        uint _transactionFee
        
    ) {
        nft = IERC721(_nft);
        nftId = _nftId;

        seller = payable(msg.sender);
        feeAddress = payable(_feeAddres);
        highestBid = _startingBid;
        endAt = _period; //timestamp
        transactionFee = _transactionFee; // 10 -> 0.1%
    }

    modifier onlyOwner() {
        require(msg.sender == seller, "Sender is not owner");
        _;
    }

    modifier auctionPaused() {
        require(!paused, "Auction Paused");
        _;
    }

    modifier auctionStarted() {
        require(started, "Not Started Yet");
        _;
    }

    // Function to receive Ether. msg.data must be empty
    receive() external payable {}

    // Fallback function is called when msg.data is not empty
    fallback() external payable {}

    function getBalance() public view returns (uint) {
        return address(this).balance;
    }

    /*
        Start the auction
    */

    function startAuction() external onlyOwner {
        require(!started, "Already Started");

        nft.transferFrom(msg.sender, address(this), nftId);
        started = true;

        emit StartAuction();
    }

    /*
        End the auction
    */
    function endAuction() external onlyOwner auctionStarted {
        require(block.timestamp >= endAt, "Not Ended");
        require(!ended, "Already Ended");

        ended = true;        

        emit EndAuction(highestBidder, highestBid);
    }

    /*
        Pause the auction
    */

    function pauseAuction() external onlyOwner {
        require(!paused, "Already Paused");

        paused = true;

        emit PauseAuction(msg.sender);
    }

    /*
        Unpause the auction
    */

    function unpauseAuction() external onlyOwner {
        require(paused, "Already Running");

        paused = false;

        emit UnpauseAuction(msg.sender);
    }

    /*
        Method to receive bids
    */

    function newBid(
        uint _totalValue,
        uint _realValue,
        uint _portion,
        uint _clientScore
    ) external payable auctionStarted auctionPaused {
        require(block.timestamp < endAt, "Already ended");
        require(msg.value > highestBid, "Lower Bid");
        require(msg.sender != seller, "Seller not allowed");
        
        uint fee = (_totalValue / FEE_BASE) * transactionFee;
        totalFee += fee;   

        cashback(highestBidder, receivedBids[highestBidder].totalValue); 

        if (receivedBids[msg.sender].totalValue != 0) {  
           
            receivedBids[msg.sender].totalValue = _totalValue - fee;
            receivedBids[msg.sender].realValue = _realValue;
            receivedBids[msg.sender].portion = _portion;
            receivedBids[msg.sender].clientScore = _clientScore;

        } else {           

            Bidders memory b;
            b.totalValue += _totalValue - fee;            
            b.realValue += _realValue;
            b.portion = _portion;
            b.clientScore = _clientScore;
            receivedBids[msg.sender] = b;
        }

        highestBidder = msg.sender;
        highestBid = msg.value;
        numberOfBids += 1;

        emit Bid(msg.sender, msg.value);
    }

    function withdraw() external {
        require(!(msg.sender == highestBidder), "Your Bid is the higher");
        require(receivedBids[msg.sender].totalValue != 0, "No bids founded");

        cashback(msg.sender, receivedBids[msg.sender].totalValue);

        receivedBids[msg.sender].totalValue = 0;
        receivedBids[msg.sender].realValue = 0;
        receivedBids[msg.sender].portion = 0;
        receivedBids[msg.sender].clientScore = 0;

        emit Withdraw(msg.sender, receivedBids[msg.sender].totalValue);
    }

    function cashback(address _receiver, uint _amount) internal{
        (bool callSuccess, ) = payable(_receiver).call{value: _amount}("");
        require(callSuccess, "Return funds failed");
    }

    function addNewFeeReceiver(address _newRecipient, uint8 _fee) external onlyOwner{
        require( (transactionFee + _fee) <= 100 , "100% of the fee already alocated");
        FeeReceivers memory fR;
        fR.recipient = _newRecipient;
        fR.fee = _fee;
        transactionFee += _fee;
        feeReceivers[msg.sender] = fR;
    }

    function closeAuction () external onlyOwner{
        if (highestBidder != address(0)) {
            nft.safeTransferFrom(address(this), highestBidder, nftId);
            
            (bool callSuccessFee, ) = payable(feeAddress).call{value: totalFee}("");
            require(callSuccessFee, "Return fee funds failed");
            
            (bool callSuccess, ) = payable(seller).call{value: highestBid}("");
            require(callSuccess, "Return funds failed");
            
        } else {
            nft.safeTransferFrom(address(this), seller, nftId);
            
            (bool callSuccessFee, ) = payable(feeAddress).call{value: totalFee}("");
            require(callSuccessFee, "Return fee funds failed");
            
            (bool callSuccess, ) = payable(seller).call{value: highestBid}("");
            require(callSuccess, "Return funds failed");
        }
    } 
}
        

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_nft","internalType":"address"},{"type":"address","name":"_feeAddres","internalType":"address"},{"type":"uint256","name":"_nftId","internalType":"uint256"},{"type":"uint256","name":"_startingBid","internalType":"uint256"},{"type":"uint256","name":"_period","internalType":"uint256"},{"type":"uint256","name":"_transactionFee","internalType":"uint256"}]},{"type":"event","name":"Bid","inputs":[{"type":"address","name":"sender","internalType":"address","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"EndAuction","inputs":[{"type":"address","name":"winner","internalType":"address","indexed":false},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"PauseAuction","inputs":[{"type":"address","name":"pauser","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"StartAuction","inputs":[],"anonymous":false},{"type":"event","name":"UnpauseAuction","inputs":[{"type":"address","name":"pauser","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"Withdraw","inputs":[{"type":"address","name":"bidder","internalType":"address","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"fallback","stateMutability":"payable"},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"FEE_BASE","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"addNewFeeReceiver","inputs":[{"type":"address","name":"_newRecipient","internalType":"address"},{"type":"uint8","name":"_fee","internalType":"uint8"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"closeAuction","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"endAt","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"endAuction","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"ended","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address payable"}],"name":"feeAddress","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"recipient","internalType":"address"},{"type":"uint256","name":"fee","internalType":"uint256"}],"name":"feeReceivers","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getBalance","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"highestBid","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"highestBidder","inputs":[]},{"type":"function","stateMutability":"payable","outputs":[],"name":"newBid","inputs":[{"type":"uint256","name":"_totalValue","internalType":"uint256"},{"type":"uint256","name":"_realValue","internalType":"uint256"},{"type":"uint256","name":"_portion","internalType":"uint256"},{"type":"uint256","name":"_clientScore","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IERC721"}],"name":"nft","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"nftId","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"numberOfBids","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"pauseAuction","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"paused","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"totalValue","internalType":"uint256"},{"type":"uint256","name":"realValue","internalType":"uint256"},{"type":"uint256","name":"portion","internalType":"uint256"},{"type":"uint256","name":"clientScore","internalType":"uint256"}],"name":"receivedBids","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address payable"}],"name":"seller","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"startAuction","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"started","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalFee","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"unpauseAuction","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdraw","inputs":[]},{"type":"receive","stateMutability":"payable"}]
              

Contract Creation Code

0x60806040523480156200001157600080fd5b5060405162002c6438038062002c648339818101604052810190620000379190620001c6565b856000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508360018190555033600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600a81905550816004819055508060078190555050505050505062000262565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620001538262000126565b9050919050565b620001658162000146565b81146200017157600080fd5b50565b60008151905062000185816200015a565b92915050565b6000819050919050565b620001a0816200018b565b8114620001ac57600080fd5b50565b600081519050620001c08162000195565b92915050565b60008060008060008060c08789031215620001e657620001e562000121565b5b6000620001f689828a0162000174565b96505060206200020989828a0162000174565b95505060406200021c89828a01620001af565b94505060606200022f89828a01620001af565b93505060806200024289828a01620001af565b92505060a06200025589828a01620001af565b9150509295509295509295565b6129f280620002726000396000f3fe60806040526004361061014f5760003560e01c80635c975abb116100b6578063c6bc51821161006f578063c6bc518214610427578063ceb1641914610452578063d57bde7914610469578063ecefc70514610494578063fd231f8f146104bf578063fe67a54b146104e857610156565b80635c975abb146103385780636b64c769146103635780637cc3ae8c1461037a57806391f90157146103a557806395ecc5cc146103d0578063b9ae73641461041057610156565b80631f2698ab116101085780631f2698ab1461026d5780632aeee49314610298578063378252f2146102b45780633ccfd60b146102cb57806341275358146102e257806347ccca021461030d57610156565b806302097ab11461015857806308551a531461019657806312065fe0146101c157806312fa6feb146101ec57806317d531fc146102175780631df4ccfc1461024257610156565b3661015657005b005b34801561016457600080fd5b5061017f600480360381019061017a9190611dec565b6104ff565b60405161018d929190611e41565b60405180910390f35b3480156101a257600080fd5b506101ab610543565b6040516101b89190611e8b565b60405180910390f35b3480156101cd57600080fd5b506101d6610569565b6040516101e39190611ea6565b60405180910390f35b3480156101f857600080fd5b50610201610571565b60405161020e9190611edc565b60405180910390f35b34801561022357600080fd5b5061022c610584565b6040516102399190611ea6565b60405180910390f35b34801561024e57600080fd5b5061025761058a565b6040516102649190611ea6565b60405180910390f35b34801561027957600080fd5b50610282610590565b60405161028f9190611edc565b60405180910390f35b6102b260048036038101906102ad9190611f23565b6105a3565b005b3480156102c057600080fd5b506102c9610b15565b005b3480156102d757600080fd5b506102e06110ad565b005b3480156102ee57600080fd5b506102f76113c0565b6040516103049190611e8b565b60405180910390f35b34801561031957600080fd5b506103226113e6565b60405161032f9190611fe9565b60405180910390f35b34801561034457600080fd5b5061034d61140a565b60405161035a9190611edc565b60405180910390f35b34801561036f57600080fd5b5061037861141d565b005b34801561038657600080fd5b5061038f6115d7565b60405161039c9190611ea6565b60405180910390f35b3480156103b157600080fd5b506103ba6115dd565b6040516103c79190612004565b60405180910390f35b3480156103dc57600080fd5b506103f760048036038101906103f29190611dec565b611603565b604051610407949392919061201f565b60405180910390f35b34801561041c57600080fd5b50610425611633565b005b34801561043357600080fd5b5061043c611767565b6040516104499190611ea6565b60405180910390f35b34801561045e57600080fd5b5061046761176d565b005b34801561047557600080fd5b5061047e6118a0565b60405161048b9190611ea6565b60405180910390f35b3480156104a057600080fd5b506104a96118a6565b6040516104b69190611ea6565b60405180910390f35b3480156104cb57600080fd5b506104e660048036038101906104e1919061209d565b6118ac565b005b3480156104f457600080fd5b506104fd611a92565b005b600c6020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154905082565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600047905090565b600560019054906101000a900460ff1681565b60065481565b60085481565b600560009054906101000a900460ff1681565b600560009054906101000a900460ff166105f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105e99061213a565b60405180910390fd5b600560029054906101000a900460ff1615610642576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610639906121a6565b60405180910390fd5b6004544210610686576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067d90612212565b60405180910390fd5b600a5434116106ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106c19061227e565b60405180910390fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff160361075a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610751906122ea565b60405180910390fd5b60006007546127108661076d9190612368565b6107779190612399565b9050806008600082825461078b91906123db565b92505081905550610822600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154611c80565b6000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015414610998578085610878919061240f565b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018190555083600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555082600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002018190555081600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030181905550610a5e565b6109a0611d31565b81866109ac919061240f565b816000018181516109bd91906123db565b9150818152505084816020018181516109d691906123db565b91508181525050838160400181815250508281606001818152505080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030155905050505b33600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555034600a81905550600160066000828254610ab991906123db565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fe684a55f31b79eca403df938249029212a5925ec6be8012e099b45bc1019e5d234604051610b069190611ea6565b60405180910390a25050505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ba5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9c9061248f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e555760008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e30600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166001546040518463ffffffff1660e01b8152600401610c7c939291906124af565b600060405180830381600087803b158015610c9657600080fd5b505af1158015610caa573d6000803e3d6000fd5b505050506000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600854604051610cf890612517565b60006040518083038185875af1925050503d8060008114610d35576040519150601f19603f3d011682016040523d82523d6000602084013e610d3a565b606091505b5050905080610d7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7590612578565b60405180910390fd5b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600a54604051610dc890612517565b60006040518083038185875af1925050503d8060008114610e05576040519150601f19603f3d011682016040523d82523d6000602084013e610e0a565b606091505b5050905080610e4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e45906125e4565b60405180910390fd5b50506110ab565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e30600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166001546040518463ffffffff1660e01b8152600401610ed693929190612625565b600060405180830381600087803b158015610ef057600080fd5b505af1158015610f04573d6000803e3d6000fd5b505050506000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600854604051610f5290612517565b60006040518083038185875af1925050503d8060008114610f8f576040519150601f19603f3d011682016040523d82523d6000602084013e610f94565b606091505b5050905080610fd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fcf90612578565b60405180910390fd5b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600a5460405161102290612517565b60006040518083038185875af1925050503d806000811461105f576040519150601f19603f3d011682016040523d82523d6000602084013e611064565b606091505b50509050806110a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109f906125e4565b60405180910390fd5b50505b565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff160361113d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611134906126a8565b60405180910390fd5b6000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154036111c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b990612714565b60405180910390fd5b61120e33600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154611c80565b6000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055506000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055506000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055506000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301819055503373ffffffffffffffffffffffffffffffffffffffff167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546040516113b69190611ea6565b60405180910390a2565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560029054906101000a900460ff1681565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a49061248f565b60405180910390fd5b600560009054906101000a900460ff16156114fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f490612780565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33306001546040518463ffffffff1660e01b815260040161155c939291906124af565b600060405180830381600087803b15801561157657600080fd5b505af115801561158a573d6000803e3d6000fd5b505050506001600560006101000a81548160ff0219169083151502179055507fd295ebf0a48a9a43d600a6ecb8626baa711d5750dec13a08145013aa30cb92ea60405160405180910390a1565b60045481565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b6020528060005260406000206000915090508060000154908060010154908060020154908060030154905084565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146116c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ba9061248f565b60405180910390fd5b600560029054906101000a900460ff1615611713576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170a906127ec565b60405180910390fd5b6001600560026101000a81548160ff0219169083151502179055507fdee06086e53b718fd5176fdaa88a207819a06a56b42087ac2cab84d32a3356543360405161175d9190612004565b60405180910390a1565b60015481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f49061248f565b60405180910390fd5b600560029054906101000a900460ff1661184c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184390612858565b60405180910390fd5b6000600560026101000a81548160ff0219169083151502179055507fc1a02e947cf77134ed09ac0692636f0553306db51ffe4a1d9e7b51b4dcd9c762336040516118969190612004565b60405180910390a1565b600a5481565b61271081565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461193c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119339061248f565b60405180910390fd5b60648160ff1660075461194f91906123db565b1115611990576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611987906128c4565b60405180910390fd5b611998611d59565b82816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508160ff168160200181815250508160ff16600760008282546119f291906123db565b9250508190555080600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010155905050505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b199061248f565b60405180910390fd5b600560009054906101000a900460ff16611b71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b689061213a565b60405180910390fd5b600454421015611bb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bad90612930565b60405180910390fd5b600560019054906101000a900460ff1615611c06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bfd9061299c565b60405180910390fd5b6001600560016101000a81548160ff0219169083151502179055507fca09734d1fc32150404dc9252b4d991c6bee44319031b7159c03d5ae2c062704600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600a54604051611c76929190611e41565b60405180910390a1565b60008273ffffffffffffffffffffffffffffffffffffffff1682604051611ca690612517565b60006040518083038185875af1925050503d8060008114611ce3576040519150601f19603f3d011682016040523d82523d6000602084013e611ce8565b606091505b5050905080611d2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d23906125e4565b60405180910390fd5b505050565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081525090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611db982611d8e565b9050919050565b611dc981611dae565b8114611dd457600080fd5b50565b600081359050611de681611dc0565b92915050565b600060208284031215611e0257611e01611d89565b5b6000611e1084828501611dd7565b91505092915050565b611e2281611dae565b82525050565b6000819050919050565b611e3b81611e28565b82525050565b6000604082019050611e566000830185611e19565b611e636020830184611e32565b9392505050565b6000611e7582611d8e565b9050919050565b611e8581611e6a565b82525050565b6000602082019050611ea06000830184611e7c565b92915050565b6000602082019050611ebb6000830184611e32565b92915050565b60008115159050919050565b611ed681611ec1565b82525050565b6000602082019050611ef16000830184611ecd565b92915050565b611f0081611e28565b8114611f0b57600080fd5b50565b600081359050611f1d81611ef7565b92915050565b60008060008060808587031215611f3d57611f3c611d89565b5b6000611f4b87828801611f0e565b9450506020611f5c87828801611f0e565b9350506040611f6d87828801611f0e565b9250506060611f7e87828801611f0e565b91505092959194509250565b6000819050919050565b6000611faf611faa611fa584611d8e565b611f8a565b611d8e565b9050919050565b6000611fc182611f94565b9050919050565b6000611fd382611fb6565b9050919050565b611fe381611fc8565b82525050565b6000602082019050611ffe6000830184611fda565b92915050565b60006020820190506120196000830184611e19565b92915050565b60006080820190506120346000830187611e32565b6120416020830186611e32565b61204e6040830185611e32565b61205b6060830184611e32565b95945050505050565b600060ff82169050919050565b61207a81612064565b811461208557600080fd5b50565b60008135905061209781612071565b92915050565b600080604083850312156120b4576120b3611d89565b5b60006120c285828601611dd7565b92505060206120d385828601612088565b9150509250929050565b600082825260208201905092915050565b7f4e6f742053746172746564205965740000000000000000000000000000000000600082015250565b6000612124600f836120dd565b915061212f826120ee565b602082019050919050565b6000602082019050818103600083015261215381612117565b9050919050565b7f41756374696f6e20506175736564000000000000000000000000000000000000600082015250565b6000612190600e836120dd565b915061219b8261215a565b602082019050919050565b600060208201905081810360008301526121bf81612183565b9050919050565b7f416c726561647920656e64656400000000000000000000000000000000000000600082015250565b60006121fc600d836120dd565b9150612207826121c6565b602082019050919050565b6000602082019050818103600083015261222b816121ef565b9050919050565b7f4c6f776572204269640000000000000000000000000000000000000000000000600082015250565b60006122686009836120dd565b915061227382612232565b602082019050919050565b600060208201905081810360008301526122978161225b565b9050919050565b7f53656c6c6572206e6f7420616c6c6f7765640000000000000000000000000000600082015250565b60006122d46012836120dd565b91506122df8261229e565b602082019050919050565b60006020820190508181036000830152612303816122c7565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061237382611e28565b915061237e83611e28565b92508261238e5761238d61230a565b5b828204905092915050565b60006123a482611e28565b91506123af83611e28565b92508282026123bd81611e28565b915082820484148315176123d4576123d3612339565b5b5092915050565b60006123e682611e28565b91506123f183611e28565b925082820190508082111561240957612408612339565b5b92915050565b600061241a82611e28565b915061242583611e28565b925082820390508181111561243d5761243c612339565b5b92915050565b7f53656e646572206973206e6f74206f776e657200000000000000000000000000600082015250565b60006124796013836120dd565b915061248482612443565b602082019050919050565b600060208201905081810360008301526124a88161246c565b9050919050565b60006060820190506124c46000830186611e19565b6124d16020830185611e19565b6124de6040830184611e32565b949350505050565b600081905092915050565b50565b60006125016000836124e6565b915061250c826124f1565b600082019050919050565b6000612522826124f4565b9150819050919050565b7f52657475726e206665652066756e6473206661696c6564000000000000000000600082015250565b60006125626017836120dd565b915061256d8261252c565b602082019050919050565b6000602082019050818103600083015261259181612555565b9050919050565b7f52657475726e2066756e6473206661696c656400000000000000000000000000600082015250565b60006125ce6013836120dd565b91506125d982612598565b602082019050919050565b600060208201905081810360008301526125fd816125c1565b9050919050565b600061260f82611fb6565b9050919050565b61261f81612604565b82525050565b600060608201905061263a6000830186611e19565b6126476020830185612616565b6126546040830184611e32565b949350505050565b7f596f757220426964206973207468652068696768657200000000000000000000600082015250565b60006126926016836120dd565b915061269d8261265c565b602082019050919050565b600060208201905081810360008301526126c181612685565b9050919050565b7f4e6f206269647320666f756e6465640000000000000000000000000000000000600082015250565b60006126fe600f836120dd565b9150612709826126c8565b602082019050919050565b6000602082019050818103600083015261272d816126f1565b9050919050565b7f416c726561647920537461727465640000000000000000000000000000000000600082015250565b600061276a600f836120dd565b915061277582612734565b602082019050919050565b600060208201905081810360008301526127998161275d565b9050919050565b7f416c726561647920506175736564000000000000000000000000000000000000600082015250565b60006127d6600e836120dd565b91506127e1826127a0565b602082019050919050565b60006020820190508181036000830152612805816127c9565b9050919050565b7f416c72656164792052756e6e696e670000000000000000000000000000000000600082015250565b6000612842600f836120dd565b915061284d8261280c565b602082019050919050565b6000602082019050818103600083015261287181612835565b9050919050565b7f31303025206f66207468652066656520616c726561647920616c6f6361746564600082015250565b60006128ae6020836120dd565b91506128b982612878565b602082019050919050565b600060208201905081810360008301526128dd816128a1565b9050919050565b7f4e6f7420456e6465640000000000000000000000000000000000000000000000600082015250565b600061291a6009836120dd565b9150612925826128e4565b602082019050919050565b600060208201905081810360008301526129498161290d565b9050919050565b7f416c726561647920456e64656400000000000000000000000000000000000000600082015250565b6000612986600d836120dd565b915061299182612950565b602082019050919050565b600060208201905081810360008301526129b581612979565b905091905056fea2646970667358221220914c9eb460b408780f479e2abe890b242580cf0ef393e2ad3fab248f352ef77564736f6c63430008110033000000000000000000000000d0ee011a4dc554064d47b8b9cb389896e77f549f000000000000000000000000bb39acdd2c9e6129308ef9495cf708c39ab1bd55000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b1a2bc2ec50000000000000000000000000000000000000000000000000000000000006390aa70000000000000000000000000000000000000000000000000000000000000000a

Deployed ByteCode

0x60806040526004361061014f5760003560e01c80635c975abb116100b6578063c6bc51821161006f578063c6bc518214610427578063ceb1641914610452578063d57bde7914610469578063ecefc70514610494578063fd231f8f146104bf578063fe67a54b146104e857610156565b80635c975abb146103385780636b64c769146103635780637cc3ae8c1461037a57806391f90157146103a557806395ecc5cc146103d0578063b9ae73641461041057610156565b80631f2698ab116101085780631f2698ab1461026d5780632aeee49314610298578063378252f2146102b45780633ccfd60b146102cb57806341275358146102e257806347ccca021461030d57610156565b806302097ab11461015857806308551a531461019657806312065fe0146101c157806312fa6feb146101ec57806317d531fc146102175780631df4ccfc1461024257610156565b3661015657005b005b34801561016457600080fd5b5061017f600480360381019061017a9190611dec565b6104ff565b60405161018d929190611e41565b60405180910390f35b3480156101a257600080fd5b506101ab610543565b6040516101b89190611e8b565b60405180910390f35b3480156101cd57600080fd5b506101d6610569565b6040516101e39190611ea6565b60405180910390f35b3480156101f857600080fd5b50610201610571565b60405161020e9190611edc565b60405180910390f35b34801561022357600080fd5b5061022c610584565b6040516102399190611ea6565b60405180910390f35b34801561024e57600080fd5b5061025761058a565b6040516102649190611ea6565b60405180910390f35b34801561027957600080fd5b50610282610590565b60405161028f9190611edc565b60405180910390f35b6102b260048036038101906102ad9190611f23565b6105a3565b005b3480156102c057600080fd5b506102c9610b15565b005b3480156102d757600080fd5b506102e06110ad565b005b3480156102ee57600080fd5b506102f76113c0565b6040516103049190611e8b565b60405180910390f35b34801561031957600080fd5b506103226113e6565b60405161032f9190611fe9565b60405180910390f35b34801561034457600080fd5b5061034d61140a565b60405161035a9190611edc565b60405180910390f35b34801561036f57600080fd5b5061037861141d565b005b34801561038657600080fd5b5061038f6115d7565b60405161039c9190611ea6565b60405180910390f35b3480156103b157600080fd5b506103ba6115dd565b6040516103c79190612004565b60405180910390f35b3480156103dc57600080fd5b506103f760048036038101906103f29190611dec565b611603565b604051610407949392919061201f565b60405180910390f35b34801561041c57600080fd5b50610425611633565b005b34801561043357600080fd5b5061043c611767565b6040516104499190611ea6565b60405180910390f35b34801561045e57600080fd5b5061046761176d565b005b34801561047557600080fd5b5061047e6118a0565b60405161048b9190611ea6565b60405180910390f35b3480156104a057600080fd5b506104a96118a6565b6040516104b69190611ea6565b60405180910390f35b3480156104cb57600080fd5b506104e660048036038101906104e1919061209d565b6118ac565b005b3480156104f457600080fd5b506104fd611a92565b005b600c6020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154905082565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600047905090565b600560019054906101000a900460ff1681565b60065481565b60085481565b600560009054906101000a900460ff1681565b600560009054906101000a900460ff166105f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105e99061213a565b60405180910390fd5b600560029054906101000a900460ff1615610642576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610639906121a6565b60405180910390fd5b6004544210610686576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067d90612212565b60405180910390fd5b600a5434116106ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106c19061227e565b60405180910390fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff160361075a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610751906122ea565b60405180910390fd5b60006007546127108661076d9190612368565b6107779190612399565b9050806008600082825461078b91906123db565b92505081905550610822600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154611c80565b6000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015414610998578085610878919061240f565b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018190555083600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555082600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002018190555081600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030181905550610a5e565b6109a0611d31565b81866109ac919061240f565b816000018181516109bd91906123db565b9150818152505084816020018181516109d691906123db565b91508181525050838160400181815250508281606001818152505080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000155602082015181600101556040820151816002015560608201518160030155905050505b33600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555034600a81905550600160066000828254610ab991906123db565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167fe684a55f31b79eca403df938249029212a5925ec6be8012e099b45bc1019e5d234604051610b069190611ea6565b60405180910390a25050505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ba5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9c9061248f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e555760008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e30600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166001546040518463ffffffff1660e01b8152600401610c7c939291906124af565b600060405180830381600087803b158015610c9657600080fd5b505af1158015610caa573d6000803e3d6000fd5b505050506000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600854604051610cf890612517565b60006040518083038185875af1925050503d8060008114610d35576040519150601f19603f3d011682016040523d82523d6000602084013e610d3a565b606091505b5050905080610d7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7590612578565b60405180910390fd5b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600a54604051610dc890612517565b60006040518083038185875af1925050503d8060008114610e05576040519150601f19603f3d011682016040523d82523d6000602084013e610e0a565b606091505b5050905080610e4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e45906125e4565b60405180910390fd5b50506110ab565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166342842e0e30600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166001546040518463ffffffff1660e01b8152600401610ed693929190612625565b600060405180830381600087803b158015610ef057600080fd5b505af1158015610f04573d6000803e3d6000fd5b505050506000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600854604051610f5290612517565b60006040518083038185875af1925050503d8060008114610f8f576040519150601f19603f3d011682016040523d82523d6000602084013e610f94565b606091505b5050905080610fd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fcf90612578565b60405180910390fd5b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600a5460405161102290612517565b60006040518083038185875af1925050503d806000811461105f576040519150601f19603f3d011682016040523d82523d6000602084013e611064565b606091505b50509050806110a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109f906125e4565b60405180910390fd5b50505b565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff160361113d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611134906126a8565b60405180910390fd5b6000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154036111c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b990612714565b60405180910390fd5b61120e33600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154611c80565b6000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055506000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055506000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201819055506000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301819055503373ffffffffffffffffffffffffffffffffffffffff167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001546040516113b69190611ea6565b60405180910390a2565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560029054906101000a900460ff1681565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a49061248f565b60405180910390fd5b600560009054906101000a900460ff16156114fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f490612780565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd33306001546040518463ffffffff1660e01b815260040161155c939291906124af565b600060405180830381600087803b15801561157657600080fd5b505af115801561158a573d6000803e3d6000fd5b505050506001600560006101000a81548160ff0219169083151502179055507fd295ebf0a48a9a43d600a6ecb8626baa711d5750dec13a08145013aa30cb92ea60405160405180910390a1565b60045481565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b6020528060005260406000206000915090508060000154908060010154908060020154908060030154905084565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146116c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ba9061248f565b60405180910390fd5b600560029054906101000a900460ff1615611713576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170a906127ec565b60405180910390fd5b6001600560026101000a81548160ff0219169083151502179055507fdee06086e53b718fd5176fdaa88a207819a06a56b42087ac2cab84d32a3356543360405161175d9190612004565b60405180910390a1565b60015481565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f49061248f565b60405180910390fd5b600560029054906101000a900460ff1661184c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184390612858565b60405180910390fd5b6000600560026101000a81548160ff0219169083151502179055507fc1a02e947cf77134ed09ac0692636f0553306db51ffe4a1d9e7b51b4dcd9c762336040516118969190612004565b60405180910390a1565b600a5481565b61271081565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461193c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119339061248f565b60405180910390fd5b60648160ff1660075461194f91906123db565b1115611990576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611987906128c4565b60405180910390fd5b611998611d59565b82816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508160ff168160200181815250508160ff16600760008282546119f291906123db565b9250508190555080600c60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010155905050505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611b22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b199061248f565b60405180910390fd5b600560009054906101000a900460ff16611b71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b689061213a565b60405180910390fd5b600454421015611bb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bad90612930565b60405180910390fd5b600560019054906101000a900460ff1615611c06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bfd9061299c565b60405180910390fd5b6001600560016101000a81548160ff0219169083151502179055507fca09734d1fc32150404dc9252b4d991c6bee44319031b7159c03d5ae2c062704600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600a54604051611c76929190611e41565b60405180910390a1565b60008273ffffffffffffffffffffffffffffffffffffffff1682604051611ca690612517565b60006040518083038185875af1925050503d8060008114611ce3576040519150601f19603f3d011682016040523d82523d6000602084013e611ce8565b606091505b5050905080611d2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d23906125e4565b60405180910390fd5b505050565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081525090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000611db982611d8e565b9050919050565b611dc981611dae565b8114611dd457600080fd5b50565b600081359050611de681611dc0565b92915050565b600060208284031215611e0257611e01611d89565b5b6000611e1084828501611dd7565b91505092915050565b611e2281611dae565b82525050565b6000819050919050565b611e3b81611e28565b82525050565b6000604082019050611e566000830185611e19565b611e636020830184611e32565b9392505050565b6000611e7582611d8e565b9050919050565b611e8581611e6a565b82525050565b6000602082019050611ea06000830184611e7c565b92915050565b6000602082019050611ebb6000830184611e32565b92915050565b60008115159050919050565b611ed681611ec1565b82525050565b6000602082019050611ef16000830184611ecd565b92915050565b611f0081611e28565b8114611f0b57600080fd5b50565b600081359050611f1d81611ef7565b92915050565b60008060008060808587031215611f3d57611f3c611d89565b5b6000611f4b87828801611f0e565b9450506020611f5c87828801611f0e565b9350506040611f6d87828801611f0e565b9250506060611f7e87828801611f0e565b91505092959194509250565b6000819050919050565b6000611faf611faa611fa584611d8e565b611f8a565b611d8e565b9050919050565b6000611fc182611f94565b9050919050565b6000611fd382611fb6565b9050919050565b611fe381611fc8565b82525050565b6000602082019050611ffe6000830184611fda565b92915050565b60006020820190506120196000830184611e19565b92915050565b60006080820190506120346000830187611e32565b6120416020830186611e32565b61204e6040830185611e32565b61205b6060830184611e32565b95945050505050565b600060ff82169050919050565b61207a81612064565b811461208557600080fd5b50565b60008135905061209781612071565b92915050565b600080604083850312156120b4576120b3611d89565b5b60006120c285828601611dd7565b92505060206120d385828601612088565b9150509250929050565b600082825260208201905092915050565b7f4e6f742053746172746564205965740000000000000000000000000000000000600082015250565b6000612124600f836120dd565b915061212f826120ee565b602082019050919050565b6000602082019050818103600083015261215381612117565b9050919050565b7f41756374696f6e20506175736564000000000000000000000000000000000000600082015250565b6000612190600e836120dd565b915061219b8261215a565b602082019050919050565b600060208201905081810360008301526121bf81612183565b9050919050565b7f416c726561647920656e64656400000000000000000000000000000000000000600082015250565b60006121fc600d836120dd565b9150612207826121c6565b602082019050919050565b6000602082019050818103600083015261222b816121ef565b9050919050565b7f4c6f776572204269640000000000000000000000000000000000000000000000600082015250565b60006122686009836120dd565b915061227382612232565b602082019050919050565b600060208201905081810360008301526122978161225b565b9050919050565b7f53656c6c6572206e6f7420616c6c6f7765640000000000000000000000000000600082015250565b60006122d46012836120dd565b91506122df8261229e565b602082019050919050565b60006020820190508181036000830152612303816122c7565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061237382611e28565b915061237e83611e28565b92508261238e5761238d61230a565b5b828204905092915050565b60006123a482611e28565b91506123af83611e28565b92508282026123bd81611e28565b915082820484148315176123d4576123d3612339565b5b5092915050565b60006123e682611e28565b91506123f183611e28565b925082820190508082111561240957612408612339565b5b92915050565b600061241a82611e28565b915061242583611e28565b925082820390508181111561243d5761243c612339565b5b92915050565b7f53656e646572206973206e6f74206f776e657200000000000000000000000000600082015250565b60006124796013836120dd565b915061248482612443565b602082019050919050565b600060208201905081810360008301526124a88161246c565b9050919050565b60006060820190506124c46000830186611e19565b6124d16020830185611e19565b6124de6040830184611e32565b949350505050565b600081905092915050565b50565b60006125016000836124e6565b915061250c826124f1565b600082019050919050565b6000612522826124f4565b9150819050919050565b7f52657475726e206665652066756e6473206661696c6564000000000000000000600082015250565b60006125626017836120dd565b915061256d8261252c565b602082019050919050565b6000602082019050818103600083015261259181612555565b9050919050565b7f52657475726e2066756e6473206661696c656400000000000000000000000000600082015250565b60006125ce6013836120dd565b91506125d982612598565b602082019050919050565b600060208201905081810360008301526125fd816125c1565b9050919050565b600061260f82611fb6565b9050919050565b61261f81612604565b82525050565b600060608201905061263a6000830186611e19565b6126476020830185612616565b6126546040830184611e32565b949350505050565b7f596f757220426964206973207468652068696768657200000000000000000000600082015250565b60006126926016836120dd565b915061269d8261265c565b602082019050919050565b600060208201905081810360008301526126c181612685565b9050919050565b7f4e6f206269647320666f756e6465640000000000000000000000000000000000600082015250565b60006126fe600f836120dd565b9150612709826126c8565b602082019050919050565b6000602082019050818103600083015261272d816126f1565b9050919050565b7f416c726561647920537461727465640000000000000000000000000000000000600082015250565b600061276a600f836120dd565b915061277582612734565b602082019050919050565b600060208201905081810360008301526127998161275d565b9050919050565b7f416c726561647920506175736564000000000000000000000000000000000000600082015250565b60006127d6600e836120dd565b91506127e1826127a0565b602082019050919050565b60006020820190508181036000830152612805816127c9565b9050919050565b7f416c72656164792052756e6e696e670000000000000000000000000000000000600082015250565b6000612842600f836120dd565b915061284d8261280c565b602082019050919050565b6000602082019050818103600083015261287181612835565b9050919050565b7f31303025206f66207468652066656520616c726561647920616c6f6361746564600082015250565b60006128ae6020836120dd565b91506128b982612878565b602082019050919050565b600060208201905081810360008301526128dd816128a1565b9050919050565b7f4e6f7420456e6465640000000000000000000000000000000000000000000000600082015250565b600061291a6009836120dd565b9150612925826128e4565b602082019050919050565b600060208201905081810360008301526129498161290d565b9050919050565b7f416c726561647920456e64656400000000000000000000000000000000000000600082015250565b6000612986600d836120dd565b915061299182612950565b602082019050919050565b600060208201905081810360008301526129b581612979565b905091905056fea2646970667358221220914c9eb460b408780f479e2abe890b242580cf0ef393e2ad3fab248f352ef77564736f6c63430008110033