false
true
0

Contract Address Details

0x9c4c0db82c453d0117874D818E5436C9f1F8bE3f

Token
Sigma (SIGMA)
Creator
0xc6c36d–9b2719 at 0xe7f24c–98f977
Balance
0 PLS ( )
Tokens
Fetching tokens...
Transactions
1,259 Transactions
Transfers
0 Transfers
Gas Used
0
Last Balance Update
25932885
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
Sigma




Optimization enabled
false
Compiler version
v0.8.28+commit.7893614a




EVM Version
shanghai




Verified at
2024-11-29T22:29:06.985019Z

Contract source code

// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)

pragma solidity ^0.8.20;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)

pragma solidity ^0.8.20;


/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * The initial owner is set to the address provided by the deployer. This can
 * later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    /**
     * @dev The caller account is not authorized to perform an operation.
     */
    error OwnableUnauthorizedAccount(address account);

    /**
     * @dev The owner is not a valid owner account. (eg. `address(0)`)
     */
    error OwnableInvalidOwner(address owner);

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.
     */
    constructor(address initialOwner) {
        if (initialOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(initialOwner);
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.20;

/**
 * @dev Interface of the ERC-20 standard as defined in the ERC.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the value of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the value of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves a `value` amount of tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 value) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the
     * caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 value) external returns (bool);

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to` using the
     * allowance mechanism. `value` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 value) external returns (bool);
}

// File: SIGMA.sol


pragma solidity ^0.8.28;



error InvalidToken();
error InsufficientTokenBalance();
error Locked();
error MaxSupplyIsLocked();
error MintIsFinished();
error NotYet();
error NotYetKing();
error TermsNotReached();
error WeDontDoThat();

contract Sigma is Ownable(msg.sender) {
    mapping(address => uint) public balanceOf;
    mapping(address => mapping(address => uint)) public allowance;
    string public name = "Sigma";
    string public symbol = "SIGMA";
    uint public decimals = 18;
    uint public totalSupply = 5555 * 10 ** decimals;
    uint public maxSupply = 55555 * 10 ** decimals;
    bool public maxSupplyLocked = false;
    bool reLockOn = false;
    mapping(address => uint256) public prices;
    mapping(address => uint256) public bonus;
    mapping(address => mapping(address => uint256)) public bonusReceived;
    address[] priceTokens;
    address[] bonusTokens;
    bool mintOpen = false;

    event Transfer(address indexed from, address indexed to, uint value);
    event Approval(address indexed owner, address indexed spender, uint value);
    
    constructor() {
        balanceOf[msg.sender] = totalSupply;
        emit Transfer(address(0), msg.sender, totalSupply);
    }

    modifier reLock() {
        if (reLockOn) revert Locked();
        reLockOn = true;
        _;
        reLockOn = false;
    }
    
    function approve(address spender, uint value) public {
        allowance[msg.sender][spender] = value;
        emit Approval(msg.sender, spender, value);
    }
    
    function transfer(address to, uint value) public {
        require(balanceOf[msg.sender] >= value, "Insufficient balance");
        balanceOf[to] += value;
        balanceOf[msg.sender] -= value;
        emit Transfer(msg.sender, to, value);
    }
    
    function transferFrom(address from, address to, uint value) public {
        require(balanceOf[from] >= value, "Insufficient balance");
        require(allowance[from][msg.sender] >= value, "Insufficient allowance");
        balanceOf[to] += value;
        balanceOf[from] -= value;
        emit Transfer(from, to, value);
    }

    function setPrice(address token, uint256 amount) public onlyOwner {
        // token prices must be assigned an initial amount
        prices[token] = amount;
        bool found = false;
        // remove if amount is zero
        for (uint i = 0; i < priceTokens.length; i++) {
            if (priceTokens[i] == token) {
                if (amount == 0)
                    delete priceTokens[i];
                found = true;
            }
        }
        // add if amount is over zero and not in list of tokens
        if (!found)
            if (amount > 0)
                priceTokens.push(token);
    }

    function setReward(address token, uint256 amount) public onlyOwner {
        // bonus rewards must be whitelisted and assigned an amount
        bonus[token] = amount;
        bool found = false;
        // remove if amount is zero
        for (uint i = 0; i < bonusTokens.length; i++) {
            if (bonusTokens[i] == token) {
                if (amount == 0)
                    delete bonusTokens[i];
                found = true;
            }
        }
        // add if amount is over zero and not in list of tokens
        if (!found)
            if (amount > 0)
                bonusTokens.push(token);
    }

    function _hasRewards() internal view returns (bool) {
        // checks msg.sender if they are getting anything for minting
        for (uint i = 0; i < bonusTokens.length; i++)
            // user has room for bonus rewards
            if (bonusReceived[bonusTokens[i]][msg.sender] < bonus[bonusTokens[i]])
                // contract has bonus reward tokens to send
                if (IERC20(bonusTokens[i]).balanceOf(address(this)) >= bonus[bonusTokens[i]])
                    return true;
        return false;
    }

    function hasRewards() public view returns (address[] memory, uint256[] memory) {
        address[] memory addresses = new address[](bonusTokens.length);
        uint256[] memory amounts = new uint256[](bonusTokens.length);
        // checks msg.sender if they are getting anything for minting
        for (uint i = 0; i < bonusTokens.length; i++) {
            addresses[i] = bonusTokens[i];
            amounts[i] = 0;
            // user has room for bonus rewards
            if (bonusReceived[bonusTokens[i]][msg.sender] < bonus[bonusTokens[i]])
                // contract has bonus reward tokens to send
                if (IERC20(bonusTokens[i]).balanceOf(address(this)) >= bonus[bonusTokens[i]])
                    amounts[i] = bonus[bonusTokens[i]] - bonusReceived[bonusTokens[i]][msg.sender];
        }
        return (addresses, amounts);
    }
    
    function sigmaPool() public view returns (address[] memory, uint256[] memory) {
        // values will fluctuate until mint nears completion
        address[] memory addresses = new address[](bonusTokens.length);
        uint256[] memory amounts = new uint256[](bonusTokens.length);
        for (uint i = 0; i < bonusTokens.length; i++) {
            addresses[i] = bonusTokens[i];
            amounts[i] = IERC20(bonusTokens[i]).balanceOf(address(this));
        }
        return (addresses, amounts);
    }

    function sigma() public payable {
        // don't let contract owner steal the rewards
        if (msg.sender == owner())
            revert WeDontDoThat();
        // supply must be finalized
        if (!maxSupplyLocked)
            revert TermsNotReached();
        // total supply must not be less than max supply
        if (totalSupply < maxSupply)
            revert NotYetKing();
        // empties any remaining rewards into the caller's wallet
        for (uint i = 0; i < bonusTokens.length; i++)
            IERC20(bonusTokens[i]).transfer(msg.sender, IERC20(bonusTokens[i]).balanceOf(address(this)));
    }

    function claimRewards() internal {
        // loop all bonus reward tokens
        for (uint i = 0; i < bonusTokens.length; i++) {
            // check if person is owed any rewards
            if (bonusReceived[bonusTokens[i]][msg.sender] < bonus[bonusTokens[i]]) {
                // skip if the contract doesn't have enough to payout the minimum
                if (IERC20(bonusTokens[i]).balanceOf(address(this)) < bonus[bonusTokens[i]])
                    continue;
                // give amount of bonus based on what's left
                IERC20(bonusTokens[i]).transfer(msg.sender, bonus[bonusTokens[i]] - bonusReceived[bonusTokens[i]][msg.sender]);
                // mark the address as having received the bonus amount
                bonusReceived[bonusTokens[i]][msg.sender] = bonus[bonusTokens[i]];
            }
        }
    }

    function setMintOpen(bool value) public onlyOwner {
        // open the mint after prices are set
        mintOpen = value;
    }

    function purchaseWith(address token) public reLock {
        // only owner can call this until mint is opened
        if (!mintOpen && msg.sender != owner())
            revert NotYet();
        // token must be assigned a price
        if (prices[token] == 0)
            revert InvalidToken();
        // current supply must be less than max
        if (totalSupply >= maxSupply)
            revert MintIsFinished();
        // user must have enough tokens to spend
        if (IERC20(token).balanceOf(msg.sender) < prices[token])
            revert InsufficientTokenBalance();
        // collect the tokens
        IERC20(token).transferFrom(msg.sender, address(this), prices[token]);
        // give the user back a token
        uint256 amount = 1*10**18;
        balanceOf[msg.sender] += amount;
        emit Transfer(address(0), msg.sender, amount);
        // increase the total supply
        totalSupply += amount;
        // claim any reward balances
        if (_hasRewards())
            claimRewards();
    }

    function setMaxSupply(uint256 amount) public onlyOwner {
        // adjust the total amount of tokens to be minted
        if (maxSupplyLocked)
            revert MaxSupplyIsLocked();
        maxSupply = amount;
    }

    function lockMaxSupply() public onlyOwner {
        // disable changing max supply
        maxSupplyLocked = true;
    }

    function bitchMade(address token, uint256 amount, address receiver) public onlyOwner {
        // tokens sent to the contract can only be taken out if set as a reward for distribution
        if (token == address(this))
            revert InvalidToken();
        // withdraw erc20 tokens from the contract
        IERC20 _token = IERC20(token);
        if (_token.balanceOf(address(this)) < amount)
            revert InsufficientTokenBalance();
        _token.transfer(receiver, amount);
    }

    function rewardAllocations() public view returns (address[] memory, uint256[] memory) {
        // view a list of bonus rewards
        address[] memory addresses = new address[](bonusTokens.length);
        uint256[] memory amounts = new uint256[](bonusTokens.length);
        for (uint i = 0; i < bonusTokens.length; i++) {
            addresses[i] = bonusTokens[i];
            amounts[i] = bonus[addresses[i]];
        }
        return (addresses, amounts);
    }

    function pricesList() public view returns (address[] memory, uint256[] memory) {
        // view a list of prices
        address[] memory addresses = new address[](priceTokens.length);
        uint256[] memory amounts = new uint256[](priceTokens.length);
        for (uint i = 0; i < priceTokens.length; i++) {
            addresses[i] = priceTokens[i];
            amounts[i] = prices[addresses[i]];
        }
        return (addresses, amounts);
    }
}
        

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[]},{"type":"error","name":"InsufficientTokenBalance","inputs":[]},{"type":"error","name":"InvalidToken","inputs":[]},{"type":"error","name":"Locked","inputs":[]},{"type":"error","name":"MaxSupplyIsLocked","inputs":[]},{"type":"error","name":"MintIsFinished","inputs":[]},{"type":"error","name":"NotYet","inputs":[]},{"type":"error","name":"NotYetKing","inputs":[]},{"type":"error","name":"OwnableInvalidOwner","inputs":[{"type":"address","name":"owner","internalType":"address"}]},{"type":"error","name":"OwnableUnauthorizedAccount","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"error","name":"TermsNotReached","inputs":[]},{"type":"error","name":"WeDontDoThat","inputs":[]},{"type":"event","name":"Approval","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"address","name":"spender","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowance","inputs":[{"type":"address","name":"","internalType":"address"},{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"approve","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"value","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"bitchMade","inputs":[{"type":"address","name":"token","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"address","name":"receiver","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"bonus","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"bonusReceived","inputs":[{"type":"address","name":"","internalType":"address"},{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address[]","name":"","internalType":"address[]"},{"type":"uint256[]","name":"","internalType":"uint256[]"}],"name":"hasRewards","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"lockMaxSupply","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"maxSupply","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"maxSupplyLocked","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"prices","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address[]","name":"","internalType":"address[]"},{"type":"uint256[]","name":"","internalType":"uint256[]"}],"name":"pricesList","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"purchaseWith","inputs":[{"type":"address","name":"token","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"renounceOwnership","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address[]","name":"","internalType":"address[]"},{"type":"uint256[]","name":"","internalType":"uint256[]"}],"name":"rewardAllocations","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMaxSupply","inputs":[{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setMintOpen","inputs":[{"type":"bool","name":"value","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setPrice","inputs":[{"type":"address","name":"token","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setReward","inputs":[{"type":"address","name":"token","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"payable","outputs":[],"name":"sigma","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address[]","name":"","internalType":"address[]"},{"type":"uint256[]","name":"","internalType":"uint256[]"}],"name":"sigmaPool","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transfer","inputs":[{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"value","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferFrom","inputs":[{"type":"address","name":"from","internalType":"address"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"value","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]}]
              

Contract Creation Code

Verify & Publish
0x60806040526040518060400160405280600581526020017f5369676d61000000000000000000000000000000000000000000000000000000815250600390816100489190610558565b506040518060400160405280600581526020017f5349474d410000000000000000000000000000000000000000000000000000008152506004908161008d9190610558565b506012600555600554600a6100a29190610783565b6115b36100af91906107cd565b600655600554600a6100c19190610783565b61d9036100ce91906107cd565b6007555f60085f6101000a81548160ff0219169083151502179055505f600860016101000a81548160ff0219169083151502179055505f600e5f6101000a81548160ff021916908315150217905550348015610128575f5ffd5b50335f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361019a575f6040517f1e4fbdf7000000000000000000000000000000000000000000000000000000008152600401610191919061084d565b60405180910390fd5b6101a98161025a60201b60201c565b5060065460015f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055503373ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60065460405161024d9190610875565b60405180910390a361088e565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061039657607f821691505b6020821081036103a9576103a8610352565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830261040b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826103d0565b61041586836103d0565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f61045961045461044f8461042d565b610436565b61042d565b9050919050565b5f819050919050565b6104728361043f565b61048661047e82610460565b8484546103dc565b825550505050565b5f5f905090565b61049d61048e565b6104a8818484610469565b505050565b5b818110156104cb576104c05f82610495565b6001810190506104ae565b5050565b601f821115610510576104e1816103af565b6104ea846103c1565b810160208510156104f9578190505b61050d610505856103c1565b8301826104ad565b50505b505050565b5f82821c905092915050565b5f6105305f1984600802610515565b1980831691505092915050565b5f6105488383610521565b9150826002028217905092915050565b6105618261031b565b67ffffffffffffffff81111561057a57610579610325565b5b610584825461037f565b61058f8282856104cf565b5f60209050601f8311600181146105c0575f84156105ae578287015190505b6105b8858261053d565b86555061061f565b601f1984166105ce866103af565b5f5b828110156105f5578489015182556001820191506020850194506020810190506105d0565b86831015610612578489015161060e601f891682610521565b8355505b6001600288020188555050505b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f8160011c9050919050565b5f5f8291508390505b60018511156106a95780860481111561068557610684610627565b5b60018516156106945780820291505b80810290506106a285610654565b9450610669565b94509492505050565b5f826106c1576001905061077c565b816106ce575f905061077c565b81600181146106e457600281146106ee5761071d565b600191505061077c565b60ff841115610700576106ff610627565b5b8360020a91508482111561071757610716610627565b5b5061077c565b5060208310610133831016604e8410600b84101617156107525782820a90508381111561074d5761074c610627565b5b61077c565b61075f8484846001610660565b9250905081840481111561077657610775610627565b5b81810290505b9392505050565b5f61078d8261042d565b91506107988361042d565b92506107c57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846106b2565b905092915050565b5f6107d78261042d565b91506107e28361042d565b92508282026107f08161042d565b9150828204841483151761080757610806610627565b5b5092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6108378261080e565b9050919050565b6108478161082d565b82525050565b5f6020820190506108605f83018461083e565b92915050565b61086f8161042d565b82525050565b5f6020820190506108885f830184610866565b92915050565b6136ea8061089b5f395ff3fe6080604052600436106101c0575f3560e01c8063958a6b55116100f6578063d5abeb0111610094578063ecf04e1511610063578063ecf04e15146105f7578063f2fde38b14610622578063f8004d311461064a578063fca76c2614610672576101c0565b8063d5abeb011461052d578063d8cb4aa314610557578063dd62ed3e14610593578063eacccaf0146105cf576101c0565b8063a9059cbb116100d0578063a9059cbb14610494578063afdf31cd146104bc578063ccf573a2146104c6578063cfed246b146104f1576101c0565b8063958a6b551461041557806395d89b4114610440578063a8d0466c1461046a576101c0565b80632b3e033f116101635780636f8b44b01161013d5780636f8b44b01461037157806370a0823114610399578063715018a6146103d55780638da5cb5b146103eb576101c0565b80632b3e033f146102f7578063313ce5671461031f5780634926c15414610349576101c0565b8063095ea7b31161019f578063095ea7b3146102415780631275ab301461026957806318160ddd146102a557806323b872dd146102cf576101c0565b8062e4768b146101c457806306fdde03146101ec57806307dbc94c14610216575b5f5ffd5b3480156101cf575f5ffd5b506101ea60048036038101906101e59190612f29565b610688565b005b3480156101f7575f5ffd5b50610200610823565b60405161020d9190612ff1565b60405180910390f35b348015610221575f5ffd5b5061022a6108af565b60405161023892919061317f565b60405180910390f35b34801561024c575f5ffd5b5061026760048036038101906102629190612f29565b610a80565b005b348015610274575f5ffd5b5061028f600480360381019061028a91906131b4565b610b66565b60405161029c9190613201565b60405180910390f35b3480156102b0575f5ffd5b506102b9610b86565b6040516102c69190613201565b60405180910390f35b3480156102da575f5ffd5b506102f560048036038101906102f0919061321a565b610b8c565b005b348015610302575f5ffd5b5061031d6004803603810190610318919061326a565b610dd7565b005b34801561032a575f5ffd5b5061033361122b565b6040516103409190613201565b60405180910390f35b348015610354575f5ffd5b5061036f600480360381019061036a9190613295565b611231565b005b34801561037c575f5ffd5b50610397600480360381019061039291906132e5565b6113d5565b005b3480156103a4575f5ffd5b506103bf60048036038101906103ba919061326a565b61142d565b6040516103cc9190613201565b60405180910390f35b3480156103e0575f5ffd5b506103e9611442565b005b3480156103f6575f5ffd5b506103ff611455565b60405161040c919061331f565b60405180910390f35b348015610420575f5ffd5b5061042961147c565b60405161043792919061317f565b60405180910390f35b34801561044b575f5ffd5b5061045461164d565b6040516104619190612ff1565b60405180910390f35b348015610475575f5ffd5b5061047e6116d9565b60405161048b9190613352565b60405180910390f35b34801561049f575f5ffd5b506104ba60048036038101906104b59190612f29565b6116eb565b005b6104c461187a565b005b3480156104d1575f5ffd5b506104da611af4565b6040516104e892919061317f565b60405180910390f35b3480156104fc575f5ffd5b506105176004803603810190610512919061326a565b611d20565b6040516105249190613201565b60405180910390f35b348015610538575f5ffd5b50610541611d35565b60405161054e9190613201565b60405180910390f35b348015610562575f5ffd5b5061057d6004803603810190610578919061326a565b611d3b565b60405161058a9190613201565b60405180910390f35b34801561059e575f5ffd5b506105b960048036038101906105b491906131b4565b611d50565b6040516105c69190613201565b60405180910390f35b3480156105da575f5ffd5b506105f560048036038101906105f09190612f29565b611d70565b005b348015610602575f5ffd5b5061060b611f0b565b60405161061992919061317f565b60405180910390f35b34801561062d575f5ffd5b506106486004803603810190610643919061326a565b612441565b005b348015610655575f5ffd5b50610670600480360381019061066b9190613395565b6124c5565b005b34801561067d575f5ffd5b506106866124e9565b005b61069061250d565b8060095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505f5f90505f5f90505b600c805490508110156107ae578373ffffffffffffffffffffffffffffffffffffffff16600c8281548110610713576107126133c0565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036107a1575f830361079c57600c8181548110610771576107706133c0565b5b905f5260205f20015f6101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b600191505b80806001019150506106db565b508061081e575f82111561081d57600c83908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5b505050565b600380546108309061341a565b80601f016020809104026020016040519081016040528092919081815260200182805461085c9061341a565b80156108a75780601f1061087e576101008083540402835291602001916108a7565b820191905f5260205f20905b81548152906001019060200180831161088a57829003601f168201915b505050505081565b6060805f600d8054905067ffffffffffffffff8111156108d2576108d161344a565b5b6040519080825280602002602001820160405280156109005781602001602082028036833780820191505090505b5090505f600d8054905067ffffffffffffffff8111156109235761092261344a565b5b6040519080825280602002602001820160405280156109515781602001602082028036833780820191505090505b5090505f5f90505b600d80549050811015610a7357600d818154811061097a576109796133c0565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff168382815181106109b5576109b46133c0565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600a5f848381518110610a0557610a046133c0565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054828281518110610a5a57610a596133c0565b5b6020026020010181815250508080600101915050610959565b5081819350935050509091565b8060025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051610b5a9190613201565b60405180910390a35050565b600b602052815f5260405f20602052805f5260405f205f91509150505481565b60065481565b8060015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541015610c0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c03906134c1565b60405180910390fd5b8060025f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541015610cc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbe90613529565b60405180910390fd5b8060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610d139190613574565b925050819055508060015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610d6691906135a7565b925050819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610dca9190613201565b60405180910390a3505050565b600860019054906101000a900460ff1615610e1e576040517f0f2e5b6c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600860016101000a81548160ff021916908315150217905550600e5f9054906101000a900460ff16158015610e885750610e58611455565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b15610ebf576040517f0d3f777600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205403610f35576040517fc1ab6dc100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460065410610f72576040517f8dba53ad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60095f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20548173ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401610fe9919061331f565b602060405180830381865afa158015611004573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061102891906135ee565b1015611060576040517fe4455cae00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166323b872dd333060095f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546040518463ffffffff1660e01b81526004016110da93929190613619565b6020604051808303815f875af11580156110f6573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061111a9190613662565b505f670de0b6b3a764000090508060015f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546111739190613574565b925050819055503373ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516111d79190613201565b60405180910390a38060065f8282546111f09190613574565b925050819055506111ff612594565b1561120d5761120c61282b565b5b505f600860016101000a81548160ff02191690831515021790555050565b60055481565b61123961250d565b3073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361129e576040517fc1ab6dc100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f839050828173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016112dc919061331f565b602060405180830381865afa1580156112f7573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061131b91906135ee565b1015611353576040517fe4455cae00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83856040518363ffffffff1660e01b815260040161138e92919061368d565b6020604051808303815f875af11580156113aa573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113ce9190613662565b5050505050565b6113dd61250d565b60085f9054906101000a900460ff1615611423576040517f67fdf8b900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060078190555050565b6001602052805f5260405f205f915090505481565b61144a61250d565b6114535f612dd0565b565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060805f600c8054905067ffffffffffffffff81111561149f5761149e61344a565b5b6040519080825280602002602001820160405280156114cd5781602001602082028036833780820191505090505b5090505f600c8054905067ffffffffffffffff8111156114f0576114ef61344a565b5b60405190808252806020026020018201604052801561151e5781602001602082028036833780820191505090505b5090505f5f90505b600c8054905081101561164057600c8181548110611547576115466133c0565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16838281518110611582576115816133c0565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060095f8483815181106115d2576115d16133c0565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054828281518110611627576116266133c0565b5b6020026020010181815250508080600101915050611526565b5081819350935050509091565b6004805461165a9061341a565b80601f01602080910402602001604051908101604052809291908181526020018280546116869061341a565b80156116d15780601f106116a8576101008083540402835291602001916116d1565b820191905f5260205f20905b8154815290600101906020018083116116b457829003601f168201915b505050505081565b60085f9054906101000a900460ff1681565b8060015f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054101561176b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611762906134c1565b60405180910390fd5b8060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546117b79190613574565b925050819055508060015f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461180a91906135a7565b925050819055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161186e9190613201565b60405180910390a35050565b611882611455565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16036118e6576040517f3992ab8d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085f9054906101000a900460ff1661192b576040517f50fd243b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007546006541015611969576040517fdd05d21800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f90505b600d80549050811015611af157600d818154811061198f5761198e6133c0565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33600d84815481106119e7576119e66133c0565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611a47919061331f565b602060405180830381865afa158015611a62573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a8691906135ee565b6040518363ffffffff1660e01b8152600401611aa392919061368d565b6020604051808303815f875af1158015611abf573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ae39190613662565b50808060010191505061196e565b50565b6060805f600d8054905067ffffffffffffffff811115611b1757611b1661344a565b5b604051908082528060200260200182016040528015611b455781602001602082028036833780820191505090505b5090505f600d8054905067ffffffffffffffff811115611b6857611b6761344a565b5b604051908082528060200260200182016040528015611b965781602001602082028036833780820191505090505b5090505f5f90505b600d80549050811015611d1357600d8181548110611bbf57611bbe6133c0565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16838281518110611bfa57611bf96133c0565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600d8181548110611c4857611c476133c0565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611ca8919061331f565b602060405180830381865afa158015611cc3573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ce791906135ee565b828281518110611cfa57611cf96133c0565b5b6020026020010181815250508080600101915050611b9e565b5081819350935050509091565b6009602052805f5260405f205f915090505481565b60075481565b600a602052805f5260405f205f915090505481565b6002602052815f5260405f20602052805f5260405f205f91509150505481565b611d7861250d565b80600a5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505f5f90505f5f90505b600d80549050811015611e96578373ffffffffffffffffffffffffffffffffffffffff16600d8281548110611dfb57611dfa6133c0565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611e89575f8303611e8457600d8181548110611e5957611e586133c0565b5b905f5260205f20015f6101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b600191505b8080600101915050611dc3565b5080611f06575f821115611f0557600d83908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5b505050565b6060805f600d8054905067ffffffffffffffff811115611f2e57611f2d61344a565b5b604051908082528060200260200182016040528015611f5c5781602001602082028036833780820191505090505b5090505f600d8054905067ffffffffffffffff811115611f7f57611f7e61344a565b5b604051908082528060200260200182016040528015611fad5781602001602082028036833780820191505090505b5090505f5f90505b600d8054905081101561243457600d8181548110611fd657611fd56133c0565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16838281518110612011576120106133c0565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505f82828151811061205f5761205e6133c0565b5b602002602001018181525050600a5f600d8381548110612082576120816133c0565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054600b5f600d84815481106120fb576120fa6133c0565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054101561242757600a5f600d83815481106121b5576121b46133c0565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054600d828154811061222b5761222a6133c0565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161228b919061331f565b602060405180830381865afa1580156122a6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122ca91906135ee565b1061242657600b5f600d83815481106122e6576122e56133c0565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054600a5f600d848154811061239a576123996133c0565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461240691906135a7565b828281518110612419576124186133c0565b5b6020026020010181815250505b5b8080600101915050611fb5565b5081819350935050509091565b61244961250d565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036124b9575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016124b0919061331f565b60405180910390fd5b6124c281612dd0565b50565b6124cd61250d565b80600e5f6101000a81548160ff02191690831515021790555050565b6124f161250d565b600160085f6101000a81548160ff021916908315150217905550565b612515612e91565b73ffffffffffffffffffffffffffffffffffffffff16612533611455565b73ffffffffffffffffffffffffffffffffffffffff161461259257612556612e91565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401612589919061331f565b60405180910390fd5b565b5f5f5f90505b600d8054905081101561282357600a5f600d83815481106125be576125bd6133c0565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054600b5f600d8481548110612637576126366133c0565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054101561281657600a5f600d83815481106126f1576126f06133c0565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054600d8281548110612767576127666133c0565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016127c7919061331f565b602060405180830381865afa1580156127e2573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061280691906135ee565b10612815576001915050612828565b5b808060010191505061259a565b505f90505b90565b5f5f90505b600d80549050811015612dcd57600a5f600d8381548110612854576128536133c0565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054600b5f600d84815481106128cd576128cc6133c0565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541015612dbf57600a5f600d8381548110612987576129866133c0565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054600d82815481106129fd576129fc6133c0565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612a5d919061331f565b602060405180830381865afa158015612a78573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a9c91906135ee565b10612dc057600d8181548110612ab557612ab46133c0565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33600b5f600d8681548110612b1057612b0f6133c0565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054600a5f600d8781548110612bc457612bc36133c0565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054612c3091906135a7565b6040518363ffffffff1660e01b8152600401612c4d92919061368d565b6020604051808303815f875af1158015612c69573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c8d9190613662565b50600a5f600d8381548110612ca557612ca46133c0565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054600b5f600d8481548110612d1e57612d1d6133c0565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b5b8080600101915050612830565b50565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f33905090565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612ec582612e9c565b9050919050565b612ed581612ebb565b8114612edf575f5ffd5b50565b5f81359050612ef081612ecc565b92915050565b5f819050919050565b612f0881612ef6565b8114612f12575f5ffd5b50565b5f81359050612f2381612eff565b92915050565b5f5f60408385031215612f3f57612f3e612e98565b5b5f612f4c85828601612ee2565b9250506020612f5d85828601612f15565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015612f9e578082015181840152602081019050612f83565b5f8484015250505050565b5f601f19601f8301169050919050565b5f612fc382612f67565b612fcd8185612f71565b9350612fdd818560208601612f81565b612fe681612fa9565b840191505092915050565b5f6020820190508181035f8301526130098184612fb9565b905092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61304381612ebb565b82525050565b5f613054838361303a565b60208301905092915050565b5f602082019050919050565b5f61307682613011565b613080818561301b565b935061308b8361302b565b805f5b838110156130bb5781516130a28882613049565b97506130ad83613060565b92505060018101905061308e565b5085935050505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6130fa81612ef6565b82525050565b5f61310b83836130f1565b60208301905092915050565b5f602082019050919050565b5f61312d826130c8565b61313781856130d2565b9350613142836130e2565b805f5b838110156131725781516131598882613100565b975061316483613117565b925050600181019050613145565b5085935050505092915050565b5f6040820190508181035f830152613197818561306c565b905081810360208301526131ab8184613123565b90509392505050565b5f5f604083850312156131ca576131c9612e98565b5b5f6131d785828601612ee2565b92505060206131e885828601612ee2565b9150509250929050565b6131fb81612ef6565b82525050565b5f6020820190506132145f8301846131f2565b92915050565b5f5f5f6060848603121561323157613230612e98565b5b5f61323e86828701612ee2565b935050602061324f86828701612ee2565b925050604061326086828701612f15565b9150509250925092565b5f6020828403121561327f5761327e612e98565b5b5f61328c84828501612ee2565b91505092915050565b5f5f5f606084860312156132ac576132ab612e98565b5b5f6132b986828701612ee2565b93505060206132ca86828701612f15565b92505060406132db86828701612ee2565b9150509250925092565b5f602082840312156132fa576132f9612e98565b5b5f61330784828501612f15565b91505092915050565b61331981612ebb565b82525050565b5f6020820190506133325f830184613310565b92915050565b5f8115159050919050565b61334c81613338565b82525050565b5f6020820190506133655f830184613343565b92915050565b61337481613338565b811461337e575f5ffd5b50565b5f8135905061338f8161336b565b92915050565b5f602082840312156133aa576133a9612e98565b5b5f6133b784828501613381565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061343157607f821691505b602082108103613444576134436133ed565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f496e73756666696369656e742062616c616e63650000000000000000000000005f82015250565b5f6134ab601483612f71565b91506134b682613477565b602082019050919050565b5f6020820190508181035f8301526134d88161349f565b9050919050565b7f496e73756666696369656e7420616c6c6f77616e6365000000000000000000005f82015250565b5f613513601683612f71565b915061351e826134df565b602082019050919050565b5f6020820190508181035f83015261354081613507565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61357e82612ef6565b915061358983612ef6565b92508282019050808211156135a1576135a0613547565b5b92915050565b5f6135b182612ef6565b91506135bc83612ef6565b92508282039050818111156135d4576135d3613547565b5b92915050565b5f815190506135e881612eff565b92915050565b5f6020828403121561360357613602612e98565b5b5f613610848285016135da565b91505092915050565b5f60608201905061362c5f830186613310565b6136396020830185613310565b61364660408301846131f2565b949350505050565b5f8151905061365c8161336b565b92915050565b5f6020828403121561367757613676612e98565b5b5f6136848482850161364e565b91505092915050565b5f6040820190506136a05f830185613310565b6136ad60208301846131f2565b939250505056fea264697066735822122007ccdef04d19a825e0e866db634f13eb1834d2208ae62a0bcfc4149de244ce2064736f6c634300081c0033

Deployed ByteCode

0x6080604052600436106101c0575f3560e01c8063958a6b55116100f6578063d5abeb0111610094578063ecf04e1511610063578063ecf04e15146105f7578063f2fde38b14610622578063f8004d311461064a578063fca76c2614610672576101c0565b8063d5abeb011461052d578063d8cb4aa314610557578063dd62ed3e14610593578063eacccaf0146105cf576101c0565b8063a9059cbb116100d0578063a9059cbb14610494578063afdf31cd146104bc578063ccf573a2146104c6578063cfed246b146104f1576101c0565b8063958a6b551461041557806395d89b4114610440578063a8d0466c1461046a576101c0565b80632b3e033f116101635780636f8b44b01161013d5780636f8b44b01461037157806370a0823114610399578063715018a6146103d55780638da5cb5b146103eb576101c0565b80632b3e033f146102f7578063313ce5671461031f5780634926c15414610349576101c0565b8063095ea7b31161019f578063095ea7b3146102415780631275ab301461026957806318160ddd146102a557806323b872dd146102cf576101c0565b8062e4768b146101c457806306fdde03146101ec57806307dbc94c14610216575b5f5ffd5b3480156101cf575f5ffd5b506101ea60048036038101906101e59190612f29565b610688565b005b3480156101f7575f5ffd5b50610200610823565b60405161020d9190612ff1565b60405180910390f35b348015610221575f5ffd5b5061022a6108af565b60405161023892919061317f565b60405180910390f35b34801561024c575f5ffd5b5061026760048036038101906102629190612f29565b610a80565b005b348015610274575f5ffd5b5061028f600480360381019061028a91906131b4565b610b66565b60405161029c9190613201565b60405180910390f35b3480156102b0575f5ffd5b506102b9610b86565b6040516102c69190613201565b60405180910390f35b3480156102da575f5ffd5b506102f560048036038101906102f0919061321a565b610b8c565b005b348015610302575f5ffd5b5061031d6004803603810190610318919061326a565b610dd7565b005b34801561032a575f5ffd5b5061033361122b565b6040516103409190613201565b60405180910390f35b348015610354575f5ffd5b5061036f600480360381019061036a9190613295565b611231565b005b34801561037c575f5ffd5b50610397600480360381019061039291906132e5565b6113d5565b005b3480156103a4575f5ffd5b506103bf60048036038101906103ba919061326a565b61142d565b6040516103cc9190613201565b60405180910390f35b3480156103e0575f5ffd5b506103e9611442565b005b3480156103f6575f5ffd5b506103ff611455565b60405161040c919061331f565b60405180910390f35b348015610420575f5ffd5b5061042961147c565b60405161043792919061317f565b60405180910390f35b34801561044b575f5ffd5b5061045461164d565b6040516104619190612ff1565b60405180910390f35b348015610475575f5ffd5b5061047e6116d9565b60405161048b9190613352565b60405180910390f35b34801561049f575f5ffd5b506104ba60048036038101906104b59190612f29565b6116eb565b005b6104c461187a565b005b3480156104d1575f5ffd5b506104da611af4565b6040516104e892919061317f565b60405180910390f35b3480156104fc575f5ffd5b506105176004803603810190610512919061326a565b611d20565b6040516105249190613201565b60405180910390f35b348015610538575f5ffd5b50610541611d35565b60405161054e9190613201565b60405180910390f35b348015610562575f5ffd5b5061057d6004803603810190610578919061326a565b611d3b565b60405161058a9190613201565b60405180910390f35b34801561059e575f5ffd5b506105b960048036038101906105b491906131b4565b611d50565b6040516105c69190613201565b60405180910390f35b3480156105da575f5ffd5b506105f560048036038101906105f09190612f29565b611d70565b005b348015610602575f5ffd5b5061060b611f0b565b60405161061992919061317f565b60405180910390f35b34801561062d575f5ffd5b506106486004803603810190610643919061326a565b612441565b005b348015610655575f5ffd5b50610670600480360381019061066b9190613395565b6124c5565b005b34801561067d575f5ffd5b506106866124e9565b005b61069061250d565b8060095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505f5f90505f5f90505b600c805490508110156107ae578373ffffffffffffffffffffffffffffffffffffffff16600c8281548110610713576107126133c0565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036107a1575f830361079c57600c8181548110610771576107706133c0565b5b905f5260205f20015f6101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b600191505b80806001019150506106db565b508061081e575f82111561081d57600c83908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5b505050565b600380546108309061341a565b80601f016020809104026020016040519081016040528092919081815260200182805461085c9061341a565b80156108a75780601f1061087e576101008083540402835291602001916108a7565b820191905f5260205f20905b81548152906001019060200180831161088a57829003601f168201915b505050505081565b6060805f600d8054905067ffffffffffffffff8111156108d2576108d161344a565b5b6040519080825280602002602001820160405280156109005781602001602082028036833780820191505090505b5090505f600d8054905067ffffffffffffffff8111156109235761092261344a565b5b6040519080825280602002602001820160405280156109515781602001602082028036833780820191505090505b5090505f5f90505b600d80549050811015610a7357600d818154811061097a576109796133c0565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff168382815181106109b5576109b46133c0565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600a5f848381518110610a0557610a046133c0565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054828281518110610a5a57610a596133c0565b5b6020026020010181815250508080600101915050610959565b5081819350935050509091565b8060025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051610b5a9190613201565b60405180910390a35050565b600b602052815f5260405f20602052805f5260405f205f91509150505481565b60065481565b8060015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541015610c0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c03906134c1565b60405180910390fd5b8060025f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541015610cc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbe90613529565b60405180910390fd5b8060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610d139190613574565b925050819055508060015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610d6691906135a7565b925050819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610dca9190613201565b60405180910390a3505050565b600860019054906101000a900460ff1615610e1e576040517f0f2e5b6c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600860016101000a81548160ff021916908315150217905550600e5f9054906101000a900460ff16158015610e885750610e58611455565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b15610ebf576040517f0d3f777600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205403610f35576040517fc1ab6dc100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60075460065410610f72576040517f8dba53ad00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60095f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20548173ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b8152600401610fe9919061331f565b602060405180830381865afa158015611004573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061102891906135ee565b1015611060576040517fe4455cae00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166323b872dd333060095f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546040518463ffffffff1660e01b81526004016110da93929190613619565b6020604051808303815f875af11580156110f6573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061111a9190613662565b505f670de0b6b3a764000090508060015f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546111739190613574565b925050819055503373ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516111d79190613201565b60405180910390a38060065f8282546111f09190613574565b925050819055506111ff612594565b1561120d5761120c61282b565b5b505f600860016101000a81548160ff02191690831515021790555050565b60055481565b61123961250d565b3073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361129e576040517fc1ab6dc100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f839050828173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016112dc919061331f565b602060405180830381865afa1580156112f7573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061131b91906135ee565b1015611353576040517fe4455cae00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83856040518363ffffffff1660e01b815260040161138e92919061368d565b6020604051808303815f875af11580156113aa573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113ce9190613662565b5050505050565b6113dd61250d565b60085f9054906101000a900460ff1615611423576040517f67fdf8b900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060078190555050565b6001602052805f5260405f205f915090505481565b61144a61250d565b6114535f612dd0565b565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060805f600c8054905067ffffffffffffffff81111561149f5761149e61344a565b5b6040519080825280602002602001820160405280156114cd5781602001602082028036833780820191505090505b5090505f600c8054905067ffffffffffffffff8111156114f0576114ef61344a565b5b60405190808252806020026020018201604052801561151e5781602001602082028036833780820191505090505b5090505f5f90505b600c8054905081101561164057600c8181548110611547576115466133c0565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16838281518110611582576115816133c0565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060095f8483815181106115d2576115d16133c0565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054828281518110611627576116266133c0565b5b6020026020010181815250508080600101915050611526565b5081819350935050509091565b6004805461165a9061341a565b80601f01602080910402602001604051908101604052809291908181526020018280546116869061341a565b80156116d15780601f106116a8576101008083540402835291602001916116d1565b820191905f5260205f20905b8154815290600101906020018083116116b457829003601f168201915b505050505081565b60085f9054906101000a900460ff1681565b8060015f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054101561176b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611762906134c1565b60405180910390fd5b8060015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546117b79190613574565b925050819055508060015f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461180a91906135a7565b925050819055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161186e9190613201565b60405180910390a35050565b611882611455565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16036118e6576040517f3992ab8d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60085f9054906101000a900460ff1661192b576040517f50fd243b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007546006541015611969576040517fdd05d21800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5f90505b600d80549050811015611af157600d818154811061198f5761198e6133c0565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33600d84815481106119e7576119e66133c0565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611a47919061331f565b602060405180830381865afa158015611a62573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a8691906135ee565b6040518363ffffffff1660e01b8152600401611aa392919061368d565b6020604051808303815f875af1158015611abf573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ae39190613662565b50808060010191505061196e565b50565b6060805f600d8054905067ffffffffffffffff811115611b1757611b1661344a565b5b604051908082528060200260200182016040528015611b455781602001602082028036833780820191505090505b5090505f600d8054905067ffffffffffffffff811115611b6857611b6761344a565b5b604051908082528060200260200182016040528015611b965781602001602082028036833780820191505090505b5090505f5f90505b600d80549050811015611d1357600d8181548110611bbf57611bbe6133c0565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16838281518110611bfa57611bf96133c0565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600d8181548110611c4857611c476133c0565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611ca8919061331f565b602060405180830381865afa158015611cc3573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611ce791906135ee565b828281518110611cfa57611cf96133c0565b5b6020026020010181815250508080600101915050611b9e565b5081819350935050509091565b6009602052805f5260405f205f915090505481565b60075481565b600a602052805f5260405f205f915090505481565b6002602052815f5260405f20602052805f5260405f205f91509150505481565b611d7861250d565b80600a5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505f5f90505f5f90505b600d80549050811015611e96578373ffffffffffffffffffffffffffffffffffffffff16600d8281548110611dfb57611dfa6133c0565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611e89575f8303611e8457600d8181548110611e5957611e586133c0565b5b905f5260205f20015f6101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b600191505b8080600101915050611dc3565b5080611f06575f821115611f0557600d83908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5b505050565b6060805f600d8054905067ffffffffffffffff811115611f2e57611f2d61344a565b5b604051908082528060200260200182016040528015611f5c5781602001602082028036833780820191505090505b5090505f600d8054905067ffffffffffffffff811115611f7f57611f7e61344a565b5b604051908082528060200260200182016040528015611fad5781602001602082028036833780820191505090505b5090505f5f90505b600d8054905081101561243457600d8181548110611fd657611fd56133c0565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16838281518110612011576120106133c0565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250505f82828151811061205f5761205e6133c0565b5b602002602001018181525050600a5f600d8381548110612082576120816133c0565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054600b5f600d84815481106120fb576120fa6133c0565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054101561242757600a5f600d83815481106121b5576121b46133c0565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054600d828154811061222b5761222a6133c0565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161228b919061331f565b602060405180830381865afa1580156122a6573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122ca91906135ee565b1061242657600b5f600d83815481106122e6576122e56133c0565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054600a5f600d848154811061239a576123996133c0565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461240691906135a7565b828281518110612419576124186133c0565b5b6020026020010181815250505b5b8080600101915050611fb5565b5081819350935050509091565b61244961250d565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036124b9575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016124b0919061331f565b60405180910390fd5b6124c281612dd0565b50565b6124cd61250d565b80600e5f6101000a81548160ff02191690831515021790555050565b6124f161250d565b600160085f6101000a81548160ff021916908315150217905550565b612515612e91565b73ffffffffffffffffffffffffffffffffffffffff16612533611455565b73ffffffffffffffffffffffffffffffffffffffff161461259257612556612e91565b6040517f118cdaa7000000000000000000000000000000000000000000000000000000008152600401612589919061331f565b60405180910390fd5b565b5f5f5f90505b600d8054905081101561282357600a5f600d83815481106125be576125bd6133c0565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054600b5f600d8481548110612637576126366133c0565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054101561281657600a5f600d83815481106126f1576126f06133c0565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054600d8281548110612767576127666133c0565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016127c7919061331f565b602060405180830381865afa1580156127e2573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061280691906135ee565b10612815576001915050612828565b5b808060010191505061259a565b505f90505b90565b5f5f90505b600d80549050811015612dcd57600a5f600d8381548110612854576128536133c0565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054600b5f600d84815481106128cd576128cc6133c0565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541015612dbf57600a5f600d8381548110612987576129866133c0565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054600d82815481106129fd576129fc6133c0565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612a5d919061331f565b602060405180830381865afa158015612a78573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a9c91906135ee565b10612dc057600d8181548110612ab557612ab46133c0565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33600b5f600d8681548110612b1057612b0f6133c0565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054600a5f600d8781548110612bc457612bc36133c0565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054612c3091906135a7565b6040518363ffffffff1660e01b8152600401612c4d92919061368d565b6020604051808303815f875af1158015612c69573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c8d9190613662565b50600a5f600d8381548110612ca557612ca46133c0565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054600b5f600d8481548110612d1e57612d1d6133c0565b5b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b5b8080600101915050612830565b50565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f33905090565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612ec582612e9c565b9050919050565b612ed581612ebb565b8114612edf575f5ffd5b50565b5f81359050612ef081612ecc565b92915050565b5f819050919050565b612f0881612ef6565b8114612f12575f5ffd5b50565b5f81359050612f2381612eff565b92915050565b5f5f60408385031215612f3f57612f3e612e98565b5b5f612f4c85828601612ee2565b9250506020612f5d85828601612f15565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015612f9e578082015181840152602081019050612f83565b5f8484015250505050565b5f601f19601f8301169050919050565b5f612fc382612f67565b612fcd8185612f71565b9350612fdd818560208601612f81565b612fe681612fa9565b840191505092915050565b5f6020820190508181035f8301526130098184612fb9565b905092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61304381612ebb565b82525050565b5f613054838361303a565b60208301905092915050565b5f602082019050919050565b5f61307682613011565b613080818561301b565b935061308b8361302b565b805f5b838110156130bb5781516130a28882613049565b97506130ad83613060565b92505060018101905061308e565b5085935050505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6130fa81612ef6565b82525050565b5f61310b83836130f1565b60208301905092915050565b5f602082019050919050565b5f61312d826130c8565b61313781856130d2565b9350613142836130e2565b805f5b838110156131725781516131598882613100565b975061316483613117565b925050600181019050613145565b5085935050505092915050565b5f6040820190508181035f830152613197818561306c565b905081810360208301526131ab8184613123565b90509392505050565b5f5f604083850312156131ca576131c9612e98565b5b5f6131d785828601612ee2565b92505060206131e885828601612ee2565b9150509250929050565b6131fb81612ef6565b82525050565b5f6020820190506132145f8301846131f2565b92915050565b5f5f5f6060848603121561323157613230612e98565b5b5f61323e86828701612ee2565b935050602061324f86828701612ee2565b925050604061326086828701612f15565b9150509250925092565b5f6020828403121561327f5761327e612e98565b5b5f61328c84828501612ee2565b91505092915050565b5f5f5f606084860312156132ac576132ab612e98565b5b5f6132b986828701612ee2565b93505060206132ca86828701612f15565b92505060406132db86828701612ee2565b9150509250925092565b5f602082840312156132fa576132f9612e98565b5b5f61330784828501612f15565b91505092915050565b61331981612ebb565b82525050565b5f6020820190506133325f830184613310565b92915050565b5f8115159050919050565b61334c81613338565b82525050565b5f6020820190506133655f830184613343565b92915050565b61337481613338565b811461337e575f5ffd5b50565b5f8135905061338f8161336b565b92915050565b5f602082840312156133aa576133a9612e98565b5b5f6133b784828501613381565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061343157607f821691505b602082108103613444576134436133ed565b5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f496e73756666696369656e742062616c616e63650000000000000000000000005f82015250565b5f6134ab601483612f71565b91506134b682613477565b602082019050919050565b5f6020820190508181035f8301526134d88161349f565b9050919050565b7f496e73756666696369656e7420616c6c6f77616e6365000000000000000000005f82015250565b5f613513601683612f71565b915061351e826134df565b602082019050919050565b5f6020820190508181035f83015261354081613507565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61357e82612ef6565b915061358983612ef6565b92508282019050808211156135a1576135a0613547565b5b92915050565b5f6135b182612ef6565b91506135bc83612ef6565b92508282039050818111156135d4576135d3613547565b5b92915050565b5f815190506135e881612eff565b92915050565b5f6020828403121561360357613602612e98565b5b5f613610848285016135da565b91505092915050565b5f60608201905061362c5f830186613310565b6136396020830185613310565b61364660408301846131f2565b949350505050565b5f8151905061365c8161336b565b92915050565b5f6020828403121561367757613676612e98565b5b5f6136848482850161364e565b91505092915050565b5f6040820190506136a05f830185613310565b6136ad60208301846131f2565b939250505056fea264697066735822122007ccdef04d19a825e0e866db634f13eb1834d2208ae62a0bcfc4149de244ce2064736f6c634300081c0033