false
false

Contract Address Details

0xd8380Fd23Fd17fB422Ae87A01D8C8c90C8F79F8d

Token
Ethernity Token (ETNY)
Creator
0xc9edc0–623114 at 0xeffe19–68b252
Implementation
0x0000000000000000000000000000000000000000
Balance
0 Berg
Tokens
Fetching tokens...
Transactions
355 Transactions
Transfers
0 Transfers
Gas Used
18,585,895
Last Balance Update
29767793
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
EthernityImplementationV2




Optimization enabled
true
Compiler version
v0.5.17+commit.d19bba13




Optimization runs
200
EVM Version
default




Verified at
2023-11-15T13:51:19.533472Z

Contract source code

// File: old-pox-smart-contract/Owned.sol

pragma solidity ^0.5.17;

// ----------------------------------------------------------------------------
// 'FIXED' 'Example Fixed Supply Token' token contract
//
// Symbol      : FIXED
// Name        : Example Fixed Supply Token
// Total supply: 1,000,000.000000000000000000
// Decimals    : 18
//
// Enjoy.
//
// (c) BokkyPooBah / Bok Consulting Pty Ltd 2017. The MIT Licence.
// ----------------------------------------------------------------------------

// ----------------------------------------------------------------------------
// Owned contract
// ----------------------------------------------------------------------------
contract Owned {
    address public owner;
    address public newOwner;

    event OwnershipTransferred(address indexed _from, address indexed _to);

    constructor() public {
        owner = msg.sender;
    }

    modifier onlyOwner {
        require(msg.sender == owner);
        _;
    }

    function transferOwnership(address _newOwner) public onlyOwner {
        newOwner = _newOwner;
    }
    function acceptOwnership() public {
        require(msg.sender == newOwner);
        emit OwnershipTransferred(owner, newOwner);
        owner = newOwner;
        newOwner = address(0);
    }
}

// File: old-pox-smart-contract/Delegated.sol

pragma solidity ^0.5.17;

/**
 * Copyright (C) 2018, 2019, 2020 Ethernity HODL UG
 *
 * This file is part of ETHERNITY PoX SC.
 *
 * ETHERNITY PoE SC is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */


contract Delegated is Owned {
    address public callerAddress;

    event ProxyTransferred(address indexed _from, address indexed _to);

    constructor() public {
        callerAddress = msg.sender;
    }

    modifier onlyDelegate {
        require(msg.sender == callerAddress);
        _;
    }

    function transferProxy(address _newProxy) public onlyOwner {
        callerAddress = _newProxy;
    }
}

// File: old-pox-smart-contract/StandardToken.sol

pragma solidity ^0.5.17;


// ----------------------------------------------------------------------------
// 'FIXED' 'Example Fixed Supply Token' token contract
//
// Symbol      : FIXED
// Name        : Example Fixed Supply Token
// Total supply: 1,000,000.000000000000000000
// Decimals    : 18
//
// Enjoy.
//
// (c) BokkyPooBah / Bok Consulting Pty Ltd 2017. The MIT Licence.
// ----------------------------------------------------------------------------


// ----------------------------------------------------------------------------
// Safe maths
// ----------------------------------------------------------------------------
library SafeMath {
    function add(uint a, uint b) internal pure returns (uint c) {
        c = a + b;
        require(c >= a);
    }
    function sub(uint a, uint b) internal pure returns (uint c) {
        require(b <= a);
        c = a - b;
    }
    function mul(uint a, uint b) internal pure returns (uint c) {
        c = a * b;
        require(a == 0 || c / a == b);
    }
    function div(uint a, uint b) internal pure returns (uint c) {
        require(b > 0);
        c = a / b;
    }
}


// ----------------------------------------------------------------------------
// ERC Token Standard #20 Interface
// https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20-token-standard.md
// ----------------------------------------------------------------------------
contract ERC20Interface {
    function totalSupply() public view returns (uint);
    function balanceOf(address tokenOwner) public view returns (uint balance);
    function allowance(address tokenOwner, address spender) public view returns (uint remaining);
    function transfer(address to, uint tokens) public returns (bool success);
    function approve(address spender, uint tokens) public returns (bool success);
    function transferFrom(address from, address to, uint tokens) public returns (bool success);

    event Transfer(address indexed from, address indexed to, uint tokens);
    event Approval(address indexed tokenOwner, address indexed spender, uint tokens);
}


// ----------------------------------------------------------------------------
// Contract function to receive approval and execute function in one call
//
// Borrowed from MiniMeToken
// ----------------------------------------------------------------------------
contract ApproveAndCallFallBack {
    function receiveApproval(address from, uint256 tokens, address token, bytes memory data) public;
}



// ----------------------------------------------------------------------------
// ERC20 Token, with the addition of symbol, name and decimals and an
// initial fixed supply
// ----------------------------------------------------------------------------
contract StandardToken is ERC20Interface, Delegated {
    using SafeMath for uint;

    string public symbol;
    string public  name;
    uint8 public decimals;
    uint public _totalSupply;

    mapping(address => uint) balances;
    mapping(address => mapping(address => uint)) allowed;


    // ------------------------------------------------------------------------
    // Constructor
    // ------------------------------------------------------------------------
    constructor() public {
        symbol = "FIXED";
        name = "Example Fixed Supply Token";
        decimals = 18;
        _totalSupply = 1000000 * 10**uint(decimals);
        balances[owner] = _totalSupply;
        emit Transfer(address(0), owner, _totalSupply);
    }


    // ------------------------------------------------------------------------
    // Total supply
    // ------------------------------------------------------------------------
    function totalSupply() public view returns (uint) {
        return _totalSupply  - balances[address(0)];
    }


    // ------------------------------------------------------------------------
    // Get the token balance for account `tokenOwner`
    // ------------------------------------------------------------------------
    function balanceOf(address tokenOwner) public view returns (uint balance) {
        return balances[tokenOwner];
    }


    // ------------------------------------------------------------------------
    // Transfer the balance from token owner's account to `to` account
    // - Owner's account must have sufficient balance to transfer
    // - 0 value transfers are allowed
    // ------------------------------------------------------------------------
    function transfer(address to, uint tokens) public returns (bool success) {
        balances[msg.sender] = balances[msg.sender].sub(tokens);
        balances[to] = balances[to].add(tokens);
        emit Transfer(msg.sender, to, tokens);
        return true;
    }


    // ------------------------------------------------------------------------
    // Token owner can approve for `spender` to transferFrom(...) `tokens`
    // from the token owner's account
    //
    // https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20-token-standard.md
    // recommends that there are no checks for the approval double-spend attack
    // as this should be implemented in user interfaces 
    // ------------------------------------------------------------------------
    function approve(address spender, uint tokens) public returns (bool success) {
        allowed[msg.sender][spender] = tokens;
        emit Approval(msg.sender, spender, tokens);
        return true;
    }


    // ------------------------------------------------------------------------
    // Transfer `tokens` from the `from` account to the `to` account
    // 
    // The calling account must already have sufficient tokens approve(...)-d
    // for spending from the `from` account and
    // - From account must have sufficient balance to transfer
    // - Spender must have sufficient allowance to transfer
    // - 0 value transfers are allowed
    // ------------------------------------------------------------------------
    function transferFrom(address from, address to, uint tokens) public returns (bool success) {
        balances[from] = balances[from].sub(tokens);
        allowed[from][msg.sender] = allowed[from][msg.sender].sub(tokens);
        balances[to] = balances[to].add(tokens);
        emit Transfer(from, to, tokens);
        return true;
    }


    // ------------------------------------------------------------------------
    // Returns the amount of tokens approved by the owner that can be
    // transferred to the spender's account
    // ------------------------------------------------------------------------
    function allowance(address tokenOwner, address spender) public view returns (uint remaining) {
        return allowed[tokenOwner][spender];
    }


    // ------------------------------------------------------------------------
    // Token owner can approve for `spender` to transferFrom(...) `tokens`
    // from the token owner's account. The `spender` contract function
    // `receiveApproval(...)` is then executed
    // ------------------------------------------------------------------------
    function approveAndCall(address spender, uint tokens, bytes memory data) public returns (bool success) {
        allowed[msg.sender][spender] = tokens;
        emit Approval(msg.sender, spender, tokens);
        ApproveAndCallFallBack(spender).receiveApproval(msg.sender, tokens, address(this), data);
        return true;
    }


    // ------------------------------------------------------------------------
    // Don't accept ETH
    // ------------------------------------------------------------------------
    function () external payable {
        revert();
    }


    // ------------------------------------------------------------------------
    // Owner can transfer out any accidentally sent ERC20 tokens
    // ------------------------------------------------------------------------
    function transferAnyERC20Token(address tokenAddress, uint tokens) public onlyOwner returns (bool success) {
        return ERC20Interface(tokenAddress).transfer(owner, tokens);
    }
}

// File: old-pox-smart-contract/Models.sol

pragma solidity ^0.5.17;

/**
 * Copyright (C) 2018, 2019, 2020 Ethernity HODL UG
 *
 * This file is part of ETHERNITY PoX SC.
 *
 * ETHERNITY PoE SC is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */

library Models {

    /*
    * used for storing multiple data
    */
    struct Metadata {
        string key;
        string value;
    }

    struct Order {
        uint8 instance;
        address dproc;
        address downer;
        address processor;
        address placedBy;
        uint dpRequest;
        uint doRequest;
        uint timeout;
        mapping(uint => Metadata) metadata;
        uint metadataSize;
        string result;
        uint price;
        OrderStatus status;
    }

    struct DPRequest {
        address dproc;
        uint8 cpuRequest;
        uint8 memoryRequest;
        uint8 storageRequest;
        uint8 bandwidthRequest;
        uint16 duration; //--timeout
        uint8 minPrice;
        uint32 createdAt;
        uint8 price;
        string Metadata1;
        string Metadata2;
        string Metadata3;
        string Metadata4;
        mapping(uint => Metadata) metadata;
        uint metadataSize;
        RequestStatus status;
    }

    struct DORequest {
        address downer;
        // CPU number
        uint8 cpuRequest;
        // Memory in GB
        uint8 memoryRequest;
        // Storage in GB
        uint8 storageRequest;
        uint8 bandwidthRequest;
        uint16 duration;
        uint8 instances;

        uint8 bookedInstances;
        uint32 createdAt;

        uint8 maxPrice;
        uint32 tokens;

        string Metadata1;
        string Metadata2;
        string Metadata3;
        string Metadata4;
        mapping(uint => Metadata) metadata;
        uint metadataSize;
        RequestStatus status;

    }

    enum OrderStatus{
        OPEN,
        PROCESSING,
        CLOSED,
        CANCELED
    }

    enum RequestStatus{
        AVAILABLE,
        BOOKED,
        CANCELED
    }
}

// File: old-pox-smart-contract/EthernityStorage.sol

pragma solidity ^0.5.17;

/**
 * Copyright (C) 2018, 2019, 2020 Ethernity HODL UG
 *
 * This file is part of ETHERNITY PoX SC.
 *
 * ETHERNITY PoE SC is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */



contract EthernityStorage is StandardToken {

    constructor() public{
        name = "Ethernity Token";
        symbol = "ETNY";
        decimals = 18;

        _totalSupply = 1000000000 * 10 ** uint(decimals);
        balances[owner] = _totalSupply;
        emit Transfer(address(0), owner, _totalSupply);
    }

    modifier onlyOwner() {
        require(
            msg.sender == owner,
            "Only owner can call this function."
        );
        _;
    }

    address public implementation;
    address public implementationPro;

    address[] internal versions;
    address[] internal versionsPro;
    mapping(address => bool) usersPro;

    uint128 internal baseLockDate = 1688169599; // Fri Jun 30 2023 23:59:59 GMT+0000
    uint128 constant internal twoYears = 63072000;
    uint128 constant internal oneYear = 31536000;
    uint128 constant internal sixMonths = 15780000;

    mapping(address => uint128) lockTime;

    mapping(address => uint256) attestation;
    mapping(address => uint256) aggregation;
    mapping(address => uint256) proposal;

    uint16 constant internal HOURS_IN_SECONDS = 3600;
    uint8 constant internal MAX_CPU = 255;
    uint8 constant internal MAX_MEMORY = 255;
    uint8 constant internal MAX_STORAGE = 255;
    uint8 constant internal MAX_BANDWIDTH = 255;
    uint8 constant internal MAX_INSTANCES = 10;

    Models.DORequest[] internal doRequestsList;
    Models.DPRequest[] internal dpRequestsList;
    Models.Order[] internal orders;

    mapping(address => uint256[]) usersDORequests;
    mapping(address => uint256[]) usersDPRequests;
    mapping(address => uint256[]) usersOrders;
}

// File: old-pox-smart-contract/Ethernity.sol


pragma solidity ^0.5.17;

/**
 * Copyright (C) 2018, 2019, 2020 Ethernity HODL UG
 *
 * This file is part of ETHERNITY PoX SC.
 *
 * ETHERNITY PoE SC is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */



interface ITokenLock {
    function getTotalLockedAmount(address wallet) external view returns (uint256);
}


interface IEtnyStaking {
    function getLockedBalanceAtStakeInWei(
        address wallet
    ) external returns (uint256);
}

contract EthernityImplementationV2 is EthernityStorage {
    event _addDPRequestEV(address indexed _from, uint _rowNumber);
    event _addDORequestEV(address indexed _from, uint _rowNumber);
    event _placeOrderEV(address indexed _from, uint _orderNumber);
    event _orderApprovedEV(address indexed _downer, address _dproc, uint _orderNumber);
    event _orderPlacedEV(uint _orderNumber, uint _doRequestId, uint _dpRequestId);
    event _orderClosedEV(uint _orderNumber);
    event _orderValidatedEV(uint _orderNumber);
    event _orderInvalidatedEV(uint _orderNumber);

    event Burn(address sender, uint256 value, string burnId);
    event Mint(address receiver, uint256 value, string mintId);

    function _addDPRequest(
        uint8 _cpuRequest,
        uint8 _memRequest,
        uint8 _storageRequest,
        uint8 _bandwidthRequest,
        uint16 _duration,
        uint8 _minPrice,
        string memory _metadata1,
        string memory _metadata2,
        string memory _metadata3,
        string memory _metadata4
    ) public onlyDelegate returns (uint _rowNumber)
    {
        //validate cpu
        require(
            _cpuRequest > 0 && _cpuRequest <= MAX_CPU,
            "cpu invalid");
        //validate memory
        require(
            _memRequest > 0 && _memRequest <= MAX_MEMORY,
            "mem invalid");
        //validate _bandwidthRequest
        require(
            _bandwidthRequest > 0 && _bandwidthRequest <= MAX_BANDWIDTH,
            "bw invalid");
        //validate memory
        require(
            _storageRequest > 0 && _storageRequest <= MAX_STORAGE,
            "strg invalid");


        usersDPRequests[msg.sender].push(dpRequestsList.length);
        _rowNumber = dpRequestsList.push(Models.DPRequest({
            dproc: msg.sender,
            cpuRequest: _cpuRequest,
            memoryRequest: _memRequest,
            storageRequest: _storageRequest,
            bandwidthRequest: _bandwidthRequest,
            duration: _duration,
            minPrice: _minPrice + (_minPrice * 15/100),
            createdAt: uint32(now),
            price: 0,
            metadataSize: 0,
            status: Models.RequestStatus.AVAILABLE,
            Metadata1: _metadata1,
            Metadata2: _metadata2,
            Metadata3: _metadata3,
            Metadata4: _metadata4
        })) - 1;

        emit _addDPRequestEV(msg.sender, _rowNumber);
        return _rowNumber;
    }

    function _getDPRequestsCount() public view onlyDelegate returns (uint256 _length) {

        return dpRequestsList.length;
    }

    function _getDPRequest(uint256 _requestListItem) public view onlyDelegate returns (
        address dproc,
        uint8 cpuRequest,
        uint8 memoryRequest,
        uint8 storageRequest,
        uint8 bandwidthRequest,
        uint16 duration,
        uint8 minPrice,
        uint status)
    {

        require(
            _requestListItem >= 0 && _requestListItem < dpRequestsList.length,
            "idx invalid"
        );
        status = uint(dpRequestsList[_requestListItem].status);

        return (
            dpRequestsList[_requestListItem].dproc,
            dpRequestsList[_requestListItem].cpuRequest,
            dpRequestsList[_requestListItem].memoryRequest,
            dpRequestsList[_requestListItem].storageRequest,
            dpRequestsList[_requestListItem].bandwidthRequest,
            dpRequestsList[_requestListItem].duration,
            dpRequestsList[_requestListItem].minPrice,
            status
        );
    }

    function _getDPRequestWithCreationDate(uint256 _requestListItem) public view onlyDelegate returns (
        address dproc,
        uint8 cpuRequest,
        uint8 memoryRequest,
        uint8 storageRequest,
        uint8 bandwidthRequest,
        uint16 duration,
        uint8 minPrice,
        uint status,
        uint32 createdAt)
    {

        require(
            _requestListItem >= 0 && _requestListItem < dpRequestsList.length,
            "idx invalid"
        );
        status = uint(dpRequestsList[_requestListItem].status);
        createdAt = dpRequestsList[_requestListItem].createdAt;
        minPrice = dpRequestsList[_requestListItem].minPrice;

        return (
            dpRequestsList[_requestListItem].dproc,
            dpRequestsList[_requestListItem].cpuRequest,
            dpRequestsList[_requestListItem].memoryRequest,
            dpRequestsList[_requestListItem].storageRequest,
            dpRequestsList[_requestListItem].bandwidthRequest,
            dpRequestsList[_requestListItem].duration,
            minPrice,
            status,
            createdAt
        );
    }

    function _getDPRequestMetadata(uint256 _requestListItem) public view onlyDelegate returns (
        address dproc,
        string memory metadata1,
        string memory metadata2,
        string memory metadata3,
        string memory metadata4)
    {
        require(
            _requestListItem >= 0 && _requestListItem < dpRequestsList.length,
            "idx invalid");

        return (
            dpRequestsList[_requestListItem].dproc,
            dpRequestsList[_requestListItem].Metadata1,
            dpRequestsList[_requestListItem].Metadata2,
            dpRequestsList[_requestListItem].Metadata3,
            dpRequestsList[_requestListItem].Metadata4
        );
    }


    function _cancelDPRequest(uint256 _requestListItem) public onlyDelegate {
        require(
            _requestListItem >= 0 && _requestListItem < dpRequestsList.length,
            "idx invalid");
        require(
            msg.sender == dpRequestsList[_requestListItem].dproc,
            "allowed only for delegated proc");

        Models.DPRequest storage request = dpRequestsList[_requestListItem];
        require(
            request.status == Models.RequestStatus.AVAILABLE,
            "status must be available");

        request.status = Models.RequestStatus.CANCELED;
    }

    function _getMyDPRequests() public view onlyDelegate returns (uint256[] memory req){

        return usersDPRequests[msg.sender];
    }

    /**
    ** metadata storage part
    */
    function _addMetadataToDPRequest(uint256 _requestListItem, string memory _key, string memory _value) public onlyDelegate returns (uint _rowNumber){

        require(
            _requestListItem >= 0 && _requestListItem < dpRequestsList.length,
            "idx invalid");

        require(
            msg.sender == dpRequestsList[_requestListItem].dproc,
            "allowed only for delegated procs");

        Models.DPRequest storage request = dpRequestsList[_requestListItem];
        request.metadata[request.metadataSize].key = _key;
        request.metadata[request.metadataSize].value = _value;
        request.metadataSize++;

        return request.metadataSize - 1;
    }

    function _getMetadataCountForDPRequest(uint256 _requestListItem) public view onlyDelegate returns (uint256 _length){
        require(
            _requestListItem >= 0 && _requestListItem < dpRequestsList.length,
            "idx invalid");

        return dpRequestsList[_requestListItem].metadataSize;
    }

    function _getMetadataValueForDPRequest(uint256 _requestListItem, uint256 _metadataItem) onlyDelegate
    public view returns (
        string memory key,
        string memory value
    ){
        require(
            _requestListItem >= 0 && _requestListItem < dpRequestsList.length,
            "idx invalid");
        require(
            _metadataItem >= 0 && _metadataItem < dpRequestsList[_requestListItem].metadataSize,
            "mtd idx invalid");

        return (
            dpRequestsList[_requestListItem].metadata[_metadataItem].key,
            dpRequestsList[_requestListItem].metadata[_metadataItem].value
        );
    }

    /**
    * region data owner requests
    */

    function _addDORequest(
        uint8 _cpuRequest,
        uint8 _memRequest,
        uint8 _storageRequest,
        uint8 _bandwidthRequest,
        uint16 _duration,
        uint8 _instances,
        uint8 _maxPrice,
        string memory _metadata1,
        string memory _metadata2,
        string memory _metadata3,
        string memory _metadata4
    ) public onlyDelegate returns (uint _rowNumber)
    {

        require(
            balances[msg.sender] >= _maxPrice * _instances * _duration * 10 ** uint(18),
            "Insufficient balance");

        require(
            _instances > 0 && _instances <= MAX_INSTANCES,
            "instance invalid");

        require(
            _cpuRequest > 0 && _cpuRequest <= MAX_CPU,
            "cpu invalid");

        require(
            _memRequest > 0 && _memRequest <= MAX_MEMORY,
            "mem invalid");

        require(
            _bandwidthRequest > 0 && _bandwidthRequest <= MAX_BANDWIDTH,
            "bw invalid");

        require(
            _storageRequest > 0 && _storageRequest <= MAX_STORAGE,
            "strg invalid");

        _transfer(msg.sender, address(this), _maxPrice * _duration * 10 ** uint(18));
        usersDORequests[msg.sender].push(doRequestsList.length);
        _rowNumber = doRequestsList.push(Models.DORequest({
            downer: msg.sender,
            cpuRequest: _cpuRequest,
            memoryRequest: _memRequest,
            storageRequest: _storageRequest,
            bandwidthRequest: _bandwidthRequest,
            duration: _duration,
            instances: _instances,
            bookedInstances: 0,
            createdAt: uint32(now),
            maxPrice: _maxPrice,
            tokens: _maxPrice * _instances * _duration,
            metadataSize: 0,
            status: Models.RequestStatus.AVAILABLE,
            Metadata1: _metadata1,
            Metadata2: _metadata2,
            Metadata3: _metadata3,
            Metadata4: _metadata4
        })) - 1;
        emit _addDORequestEV(msg.sender, _rowNumber);
        return _rowNumber;
    }

    function _getDORequestsCount() public view onlyDelegate returns (uint256 _length) {

        return doRequestsList.length;
    }


    function _getDORequest(uint256 _requestListItem) public view onlyDelegate returns (
        address downer,
        uint8 cpuRequest,
        uint8 memoryRequest,
        uint8 storageRequest,
        uint8 bandwidthRequest,
        uint16 duration,
        uint8 maxPrice,
        uint status)
    {

        require(
            _requestListItem >= 0 && _requestListItem < doRequestsList.length,
            "idx invalid");

        status = uint(doRequestsList[_requestListItem].status);
        return (
            doRequestsList[_requestListItem].downer,
            doRequestsList[_requestListItem].cpuRequest,
            doRequestsList[_requestListItem].memoryRequest,
            doRequestsList[_requestListItem].storageRequest,
            doRequestsList[_requestListItem].bandwidthRequest,
            doRequestsList[_requestListItem].duration,
            doRequestsList[_requestListItem].maxPrice,
            status
        );
    }

    function _getDORequestMetadata(uint256 _requestListItem) public view onlyDelegate returns (
        address downer,
        string memory metadata1,
        string memory metadata2,
        string memory metadata3,
        string memory metadata4)
    {
        require(
            _requestListItem >= 0 && _requestListItem < doRequestsList.length,
            "idx invalid");


        return (
            doRequestsList[_requestListItem].downer,
            doRequestsList[_requestListItem].Metadata1,
            doRequestsList[_requestListItem].Metadata2,
            doRequestsList[_requestListItem].Metadata3,
            doRequestsList[_requestListItem].Metadata4
        );
    }

    function _cancelDORequest(uint256 _requestListItem) public onlyDelegate {
        require(
            _requestListItem >= 0 && _requestListItem < doRequestsList.length,
            "idx invalid");
        require(
            msg.sender == doRequestsList[_requestListItem].downer,
            "allowed only for downer");

        Models.DORequest storage request = doRequestsList[_requestListItem];
        require(
            request.status == Models.RequestStatus.AVAILABLE && request.bookedInstances == 0,
            "status must be available");

        _transfer(address(this), request.downer, request.maxPrice * request.duration * 10 ** uint(18));
        request.status = Models.RequestStatus.CANCELED;
    }

    function _getMyDORequests() public view onlyDelegate returns (uint256[] memory req){

        return usersDORequests[msg.sender];
    }

    function _addMetadataToRequest(uint256 _requestListItem, string memory _key, string memory _value) public onlyDelegate returns (uint _rowNumber){

        require(
            _requestListItem >= 0 && _requestListItem < doRequestsList.length,
            "idx invalid");

        require(
            msg.sender == doRequestsList[_requestListItem].downer,
            "allowed only for downer");

        Models.DORequest storage request = doRequestsList[_requestListItem];
        request.metadata[request.metadataSize].key = _key;
        request.metadata[request.metadataSize].value = _value;
        request.metadataSize++;

        return request.metadataSize - 1;
    }

    function _getMetadataCountForRequest(uint256 _requestListItem) public view onlyDelegate returns (uint256 _length){
        require(
            _requestListItem >= 0 && _requestListItem < doRequestsList.length,
            "idx invalid");

        return doRequestsList[_requestListItem].metadataSize;
    }

    function _getMetadataValueForRequest(uint256 _requestListItem, uint256 _metadataItem) onlyDelegate
    public view returns (
        string memory key,
        string memory value
    ){
        require(
            _requestListItem >= 0 && _requestListItem < doRequestsList.length,
            "idx invalid");
        require(
            _metadataItem >= 0 && _metadataItem < doRequestsList[_requestListItem].metadataSize,
            "mtd index invalid");

        return (
            doRequestsList[_requestListItem].metadata[_metadataItem].key,
            doRequestsList[_requestListItem].metadata[_metadataItem].value
        );
    }

    /**
    * order region
    */

    function _placeOrder(uint256 _doRequestItem, uint256 _dpRequestItem) public onlyDelegate returns (uint _orderNumber){
        require(
            _doRequestItem >= 0 && _doRequestItem < doRequestsList.length,
            "idx invalid");

        require(
            _dpRequestItem >= 0 && _dpRequestItem < dpRequestsList.length,
            "dpr index invalid");

        Models.DORequest storage doRequest = doRequestsList[_doRequestItem];
        require(
            doRequest.status == Models.RequestStatus.AVAILABLE,
            "status must be available");

        bytes memory metadata4 = bytes(doRequest.Metadata4);
        address nodeAddress;

        Models.DPRequest storage dpRequest = dpRequestsList[_dpRequestItem];
        bytes memory dpMetadata2 = bytes(dpRequest.Metadata2);

        require(
            doRequest.maxPrice >= dpRequest.minPrice,
            "price does not match");

        require(
            dpMetadata2.length > 0,
            "metadata2 required");

        if (metadata4.length != 0) {
            nodeAddress = parseAddr(doRequest.Metadata4);
        }

        require(
            metadata4.length == 0 || nodeAddress == msg.sender,
            "node address invalid");

        require(
            dpRequest.status == Models.RequestStatus.AVAILABLE,
            "status must be available");

        require(
            dpRequest.dproc == msg.sender || doRequest.downer == msg.sender,
            "invalid downer or dproc");

        address placedBy;
        if (dpRequest.dproc == msg.sender)
            placedBy = dpRequest.dproc;
        else
            placedBy = doRequest.downer;

        doRequest.bookedInstances = doRequest.bookedInstances + 1;
        if (doRequest.bookedInstances == doRequest.instances)
            doRequest.status = Models.RequestStatus.BOOKED;

        dpRequest.status = Models.RequestStatus.BOOKED;

        usersOrders[dpRequest.dproc].push(orders.length);
        usersOrders[doRequest.downer].push(orders.length);

        Models.OrderStatus status = Models.OrderStatus.OPEN;
        if (metadata4.length != 0) {
            status = Models.OrderStatus.PROCESSING;
        }

        _orderNumber = orders.push(Models.Order({
            instance: doRequest.bookedInstances,
            dproc: dpRequest.dproc,
            downer: doRequest.downer,
            placedBy: placedBy,
            processor: address(0),
            dpRequest: _dpRequestItem,
            doRequest: _doRequestItem,
            timeout: uint32(now),
            metadataSize: 0,
            status: status,
            price: doRequest.maxPrice,
            result: ''
        })) - 1;

        emit _placeOrderEV(msg.sender, _orderNumber);
        emit _orderPlacedEV(_orderNumber, _doRequestItem, _dpRequestItem);
        if (metadata4.length != 0) {
            emit _orderApprovedEV(doRequest.downer, dpRequest.dproc, orders.length - 1);
        }

        return _orderNumber;

    }

    function _getOrdersCount() public view onlyDelegate returns (uint256 _length) {

        return orders.length;
    }

    function _getMyDOOrders() public view onlyDelegate returns (uint256[] memory req){

        return usersOrders[msg.sender];
    }


    function _getOrder(uint256 _orderItem) public onlyDelegate view returns (
        address downer,
        address dproc,
        uint doRequest,
        uint dpRequest,
        uint status)
    {
        require(
            _orderItem >= 0 && _orderItem < doRequestsList.length,
            "idx invalid");

        return (
            orders[_orderItem].downer,
            orders[_orderItem].dproc,
            orders[_orderItem].doRequest,
            orders[_orderItem].dpRequest,
            uint(orders[_orderItem].status)
        );
    }

    /**
    * orders can be processed only after being approved
    * by other part(do/dp)
    */
    function _approveOrder(uint256 _orderItem) public onlyDelegate returns (bool success){
        require(
            _orderItem >= 0 && _orderItem < orders.length,
            "idx invalid");

        Models.Order storage order = orders[_orderItem];

        require(
            msg.sender == order.downer || msg.sender == order.dproc,
            "downer or dproc invalid");

        require(
            msg.sender != order.placedBy,
            "invalid approver");

        require(
            order.status == Models.OrderStatus.OPEN,
            "order must be open"
        );

        order.status = Models.OrderStatus.PROCESSING;
        emit _orderApprovedEV(order.downer, order.dproc, _orderItem);
        return true;
    }

    /**
    * add processor address by data processor
    */
    function _addProcessorToOrder(uint256 _orderItem, address processor) public onlyDelegate returns (bool success){
        require(
            _orderItem >= 0 && _orderItem < orders.length,
            "idx invalid");

        Models.Order storage order = orders[_orderItem];

        require(
            msg.sender == order.dproc,
            "allowd only to dproc");

        require(
            order.status == Models.OrderStatus.PROCESSING,
            "order must be processing"
        );

        order.processor = processor;
        return true;
    }

    /**
    * add result to order
    */
    function _addResultToOrder(uint256 _orderItem, string memory _result) public onlyDelegate returns (bool success){
        require(
            _orderItem >= 0 && _orderItem < orders.length,
            "idx invalid");

        Models.Order storage order = orders[_orderItem];

        /*require(
            msg.sender == order.processor,
            "only processor can add a result");
         */

        require(
            order.status == Models.OrderStatus.PROCESSING,
            "order must be processing"
        );


        order.result = _result;
        order.status = Models.OrderStatus.CLOSED;

        emit _orderClosedEV(_orderItem);
        return true;
    }

    function validate (uint256 _orderItem) external returns (bool success){
        require(
            msg.sender == 0xAE7488b3aACb8415bE66d78C05D279BA5A86820E, "Only ValidatorRegistry can validate a result"
        );

        Models.Order storage order = orders[_orderItem];

        require(
            order.status == Models.OrderStatus.CLOSED,
            "order must be closed"
        );

        Models.DORequest storage doRequest = doRequestsList[order.doRequest];
        
        uint256 totalAmount = order.price * doRequest.duration * 10 ** uint(18);
        //replace these with actual addresses
        address payable ecAddress = 0x8082eDA439226540c1fFEa3759CD267d044DCA2B;
        address payable devAddress = 0x0457e4d1f0085a84Dd5F470F36575f69f815813c;

        //second parameter is the percentage reward(int value)
        uint256 ecReward = _computePercentage(totalAmount, 5);
        uint256 devReward = _computePercentage(totalAmount, 10);

        _transfer(address(this), order.dproc, totalAmount - ecReward - devReward);
        _transfer(address(this), ecAddress, ecReward);
        _transfer(address(this), devAddress, devReward);

        emit _orderValidatedEV(_orderItem);
        return true;
    }


    function _computePercentage(uint256 value, uint256 percentage) internal pure returns (uint256) {
        uint256 result = (value * 100 / 115) * percentage/100;
        return result;
    }


    function invalidate (uint256 _orderItem) external returns (bool success){
        require(
            msg.sender == 0xAE7488b3aACb8415bE66d78C05D279BA5A86820E, "Only ValidatorRegistry can validate a result"
        );

        Models.Order storage order = orders[_orderItem];

        require(
            order.status == Models.OrderStatus.CLOSED,
            "order must be closed"
        );

        Models.DORequest storage doRequest = doRequestsList[order.doRequest];
        
        uint256 totalAmount = order.price * doRequest.duration * 10 ** uint(18);

        _transfer(address(this), doRequest.downer, totalAmount);

        emit _orderInvalidatedEV(_orderItem);
        return true;
    }

    /**
    * get result from order
    */
    function _getResultFromOrder(uint256 _orderItem) public view onlyDelegate returns (string memory _Result){
        require(
            _orderItem >= 0 && _orderItem < orders.length,
            "idx invalid");

        Models.Order storage order = orders[_orderItem];

        /* require(
            msg.sender == order.downer,
            "only owner can read the results");
        */

        require(
            order.status == Models.OrderStatus.CLOSED,
            "order must be closed"
        );

        return order.result;
    }

    /**
    * get how many validators were requested
    */

    function _getRequiredValidators(uint256 _orderItem) public view onlyDelegate returns (uint256 _Result){
        require(
            _orderItem >= 0 && _orderItem < orders.length,
            "idx invalid");

        return doRequestsList[orders[_orderItem].doRequest].instances;
    }

    function _canExecuteTransfer(address from, address to, uint tokens) internal returns (bool){
        // token lock smart contract
        ITokenLock tokenLock = ITokenLock(0xf786503B6DBF79827ef0C257cfbC122bf1d827B6);
        // etnyStaking smart contract
        IEtnyStaking etnyStaking = IEtnyStaking(0x7C885DF91020b52c3B297b9F9c076F165c378934);

        uint totalLocked = 0;
        uint lockedTokens = tokenLock.getTotalLockedAmount(from);
        uint stakedTokens = etnyStaking.getLockedBalanceAtStakeInWei(from);
 
        if (stakedTokens > lockedTokens) {
            uint difference = stakedTokens - lockedTokens;
            totalLocked = lockedTokens + difference;
        }
        else totalLocked = lockedTokens;

        if (balances[from] < totalLocked) return false;
        if (balances[from] - totalLocked < tokens) return false;

        return true;
    }


    //function faucet() public returns (bool success){
    //    if (balances[msg.sender] < 100 * 10 ** uint(18)) _transfer(owner, msg.sender, 1000 * 10 ** uint(18));
    //    return true;
    //}

    function _transfer(address from, address to, uint tokens) internal {
        if (!_canExecuteTransfer(from, to, tokens)) revert();
        if (from == address(0)) {
            require(_totalSupply + tokens <= 1000000000 * 10 ** uint(18), "max supply reached");
            _totalSupply += tokens;
        }
        else {
            require(balances[from] >= tokens, "Insufficient balance");
            balances[from] = balances[from].sub(tokens);
        }

        if (to == address(0)) {
            _totalSupply -= tokens;
        }
        else {
            balances[to] = balances[to].add(tokens);
        }

        emit Transfer(from, to, tokens);

    }

    function transfer(address to, uint tokens) public returns (bool success){
        _transfer(msg.sender, to, tokens);
        return true;
    }

    function burn(uint256 value, string memory burnId) public {
        _burn(msg.sender, value);
        emit Burn(msg.sender, value, burnId);
    }

    function _burn(address account, uint256 value) internal {
        require(account != address(0), "Invalid sender account");
        _transfer(account, address(0), value);
    }

    function mint(address receiver, uint256 value, string memory mintId) public onlyOwner {
        _mint(receiver, value);
        emit Mint(receiver, value, mintId);
    }

    function _mint(address account, uint256 value) internal {
        require(account != address(0), "Invalid receiver account");
        _transfer(address(0), account, value);
    }

    function transferFrom(address from, address to, uint tokens) public returns (bool success){
        require (balances[from] >= tokens, "Insufficient balance");
        if (!_canExecuteTransfer(from, to, tokens)) revert();
        allowed[from][msg.sender] = allowed[from][msg.sender].sub(tokens);
        balances[from] = balances[from].sub(tokens);
        balances[to] = balances[to].add(tokens);
        emit Transfer(from, to, tokens);
        return true;
    }

    function approve(address spender, uint tokens) public returns (bool success){
        allowed[msg.sender][spender] = tokens;
        emit Approval(msg.sender, spender, tokens);
        return true;
    }

    function approveAndCall(address spender, uint tokens, bytes memory data) public returns (bool success){
        allowed[msg.sender][spender] = tokens;
        emit Approval(msg.sender, spender, tokens);
        ApproveAndCallFallBack(spender).receiveApproval(msg.sender, tokens, address(this), data);
        return true;
    }

    function parseAddr(string memory _a) internal pure returns (address _parsedAddress) {
        bytes memory tmp = bytes(_a);
        uint160 iaddr = 0;
        uint160 b1;
        uint160 b2;
        for (uint i = 2; i < 2 + 2 * 20; i += 2) {
            iaddr *= 256;
            b1 = uint160(uint8(tmp[i]));
            b2 = uint160(uint8(tmp[i + 1]));
            if ((b1 >= 97) && (b1 <= 102)) {
                b1 -= 87;
            } else if ((b1 >= 65) && (b1 <= 70)) {
                b1 -= 55;
            } else if ((b1 >= 48) && (b1 <= 57)) {
                b1 -= 48;
            }
            if ((b2 >= 97) && (b2 <= 102)) {
                b2 -= 87;
            } else if ((b2 >= 65) && (b2 <= 70)) {
                b2 -= 55;
            } else if ((b2 >= 48) && (b2 <= 57)) {
                b2 -= 48;
            }
            iaddr += (b1 * 16 + b2);
        }
        return address(iaddr);
    }
}
        

Contract ABI

[{"type":"event","name":"Approval","inputs":[{"type":"address","name":"tokenOwner","internalType":"address","indexed":true},{"type":"address","name":"spender","internalType":"address","indexed":true},{"type":"uint256","name":"tokens","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Burn","inputs":[{"type":"address","name":"sender","internalType":"address","indexed":false},{"type":"uint256","name":"value","internalType":"uint256","indexed":false},{"type":"string","name":"burnId","internalType":"string","indexed":false}],"anonymous":false},{"type":"event","name":"Mint","inputs":[{"type":"address","name":"receiver","internalType":"address","indexed":false},{"type":"uint256","name":"value","internalType":"uint256","indexed":false},{"type":"string","name":"mintId","internalType":"string","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"_from","internalType":"address","indexed":true},{"type":"address","name":"_to","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"ProxyTransferred","inputs":[{"type":"address","name":"_from","internalType":"address","indexed":true},{"type":"address","name":"_to","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":"tokens","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"_addDORequestEV","inputs":[{"type":"address","name":"_from","internalType":"address","indexed":true},{"type":"uint256","name":"_rowNumber","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"_addDPRequestEV","inputs":[{"type":"address","name":"_from","internalType":"address","indexed":true},{"type":"uint256","name":"_rowNumber","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"_orderApprovedEV","inputs":[{"type":"address","name":"_downer","internalType":"address","indexed":true},{"type":"address","name":"_dproc","internalType":"address","indexed":false},{"type":"uint256","name":"_orderNumber","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"_orderClosedEV","inputs":[{"type":"uint256","name":"_orderNumber","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"_orderInvalidatedEV","inputs":[{"type":"uint256","name":"_orderNumber","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"_orderPlacedEV","inputs":[{"type":"uint256","name":"_orderNumber","internalType":"uint256","indexed":false},{"type":"uint256","name":"_doRequestId","internalType":"uint256","indexed":false},{"type":"uint256","name":"_dpRequestId","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"_orderValidatedEV","inputs":[{"type":"uint256","name":"_orderNumber","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"_placeOrderEV","inputs":[{"type":"address","name":"_from","internalType":"address","indexed":true},{"type":"uint256","name":"_orderNumber","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"fallback","stateMutability":"payable","payable":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"uint256","name":"_rowNumber","internalType":"uint256"}],"name":"_addDORequest","inputs":[{"type":"uint8","name":"_cpuRequest","internalType":"uint8"},{"type":"uint8","name":"_memRequest","internalType":"uint8"},{"type":"uint8","name":"_storageRequest","internalType":"uint8"},{"type":"uint8","name":"_bandwidthRequest","internalType":"uint8"},{"type":"uint16","name":"_duration","internalType":"uint16"},{"type":"uint8","name":"_instances","internalType":"uint8"},{"type":"uint8","name":"_maxPrice","internalType":"uint8"},{"type":"string","name":"_metadata1","internalType":"string"},{"type":"string","name":"_metadata2","internalType":"string"},{"type":"string","name":"_metadata3","internalType":"string"},{"type":"string","name":"_metadata4","internalType":"string"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"uint256","name":"_rowNumber","internalType":"uint256"}],"name":"_addDPRequest","inputs":[{"type":"uint8","name":"_cpuRequest","internalType":"uint8"},{"type":"uint8","name":"_memRequest","internalType":"uint8"},{"type":"uint8","name":"_storageRequest","internalType":"uint8"},{"type":"uint8","name":"_bandwidthRequest","internalType":"uint8"},{"type":"uint16","name":"_duration","internalType":"uint16"},{"type":"uint8","name":"_minPrice","internalType":"uint8"},{"type":"string","name":"_metadata1","internalType":"string"},{"type":"string","name":"_metadata2","internalType":"string"},{"type":"string","name":"_metadata3","internalType":"string"},{"type":"string","name":"_metadata4","internalType":"string"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"uint256","name":"_rowNumber","internalType":"uint256"}],"name":"_addMetadataToDPRequest","inputs":[{"type":"uint256","name":"_requestListItem","internalType":"uint256"},{"type":"string","name":"_key","internalType":"string"},{"type":"string","name":"_value","internalType":"string"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"uint256","name":"_rowNumber","internalType":"uint256"}],"name":"_addMetadataToRequest","inputs":[{"type":"uint256","name":"_requestListItem","internalType":"uint256"},{"type":"string","name":"_key","internalType":"string"},{"type":"string","name":"_value","internalType":"string"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"bool","name":"success","internalType":"bool"}],"name":"_addProcessorToOrder","inputs":[{"type":"uint256","name":"_orderItem","internalType":"uint256"},{"type":"address","name":"processor","internalType":"address"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"bool","name":"success","internalType":"bool"}],"name":"_addResultToOrder","inputs":[{"type":"uint256","name":"_orderItem","internalType":"uint256"},{"type":"string","name":"_result","internalType":"string"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"bool","name":"success","internalType":"bool"}],"name":"_approveOrder","inputs":[{"type":"uint256","name":"_orderItem","internalType":"uint256"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"_cancelDORequest","inputs":[{"type":"uint256","name":"_requestListItem","internalType":"uint256"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"_cancelDPRequest","inputs":[{"type":"uint256","name":"_requestListItem","internalType":"uint256"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":"downer","internalType":"address"},{"type":"uint8","name":"cpuRequest","internalType":"uint8"},{"type":"uint8","name":"memoryRequest","internalType":"uint8"},{"type":"uint8","name":"storageRequest","internalType":"uint8"},{"type":"uint8","name":"bandwidthRequest","internalType":"uint8"},{"type":"uint16","name":"duration","internalType":"uint16"},{"type":"uint8","name":"maxPrice","internalType":"uint8"},{"type":"uint256","name":"status","internalType":"uint256"}],"name":"_getDORequest","inputs":[{"type":"uint256","name":"_requestListItem","internalType":"uint256"}],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":"downer","internalType":"address"},{"type":"string","name":"metadata1","internalType":"string"},{"type":"string","name":"metadata2","internalType":"string"},{"type":"string","name":"metadata3","internalType":"string"},{"type":"string","name":"metadata4","internalType":"string"}],"name":"_getDORequestMetadata","inputs":[{"type":"uint256","name":"_requestListItem","internalType":"uint256"}],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":"_length","internalType":"uint256"}],"name":"_getDORequestsCount","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":"dproc","internalType":"address"},{"type":"uint8","name":"cpuRequest","internalType":"uint8"},{"type":"uint8","name":"memoryRequest","internalType":"uint8"},{"type":"uint8","name":"storageRequest","internalType":"uint8"},{"type":"uint8","name":"bandwidthRequest","internalType":"uint8"},{"type":"uint16","name":"duration","internalType":"uint16"},{"type":"uint8","name":"minPrice","internalType":"uint8"},{"type":"uint256","name":"status","internalType":"uint256"}],"name":"_getDPRequest","inputs":[{"type":"uint256","name":"_requestListItem","internalType":"uint256"}],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":"dproc","internalType":"address"},{"type":"string","name":"metadata1","internalType":"string"},{"type":"string","name":"metadata2","internalType":"string"},{"type":"string","name":"metadata3","internalType":"string"},{"type":"string","name":"metadata4","internalType":"string"}],"name":"_getDPRequestMetadata","inputs":[{"type":"uint256","name":"_requestListItem","internalType":"uint256"}],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":"dproc","internalType":"address"},{"type":"uint8","name":"cpuRequest","internalType":"uint8"},{"type":"uint8","name":"memoryRequest","internalType":"uint8"},{"type":"uint8","name":"storageRequest","internalType":"uint8"},{"type":"uint8","name":"bandwidthRequest","internalType":"uint8"},{"type":"uint16","name":"duration","internalType":"uint16"},{"type":"uint8","name":"minPrice","internalType":"uint8"},{"type":"uint256","name":"status","internalType":"uint256"},{"type":"uint32","name":"createdAt","internalType":"uint32"}],"name":"_getDPRequestWithCreationDate","inputs":[{"type":"uint256","name":"_requestListItem","internalType":"uint256"}],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":"_length","internalType":"uint256"}],"name":"_getDPRequestsCount","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":"_length","internalType":"uint256"}],"name":"_getMetadataCountForDPRequest","inputs":[{"type":"uint256","name":"_requestListItem","internalType":"uint256"}],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":"_length","internalType":"uint256"}],"name":"_getMetadataCountForRequest","inputs":[{"type":"uint256","name":"_requestListItem","internalType":"uint256"}],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"string","name":"key","internalType":"string"},{"type":"string","name":"value","internalType":"string"}],"name":"_getMetadataValueForDPRequest","inputs":[{"type":"uint256","name":"_requestListItem","internalType":"uint256"},{"type":"uint256","name":"_metadataItem","internalType":"uint256"}],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"string","name":"key","internalType":"string"},{"type":"string","name":"value","internalType":"string"}],"name":"_getMetadataValueForRequest","inputs":[{"type":"uint256","name":"_requestListItem","internalType":"uint256"},{"type":"uint256","name":"_metadataItem","internalType":"uint256"}],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256[]","name":"req","internalType":"uint256[]"}],"name":"_getMyDOOrders","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256[]","name":"req","internalType":"uint256[]"}],"name":"_getMyDORequests","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256[]","name":"req","internalType":"uint256[]"}],"name":"_getMyDPRequests","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":"downer","internalType":"address"},{"type":"address","name":"dproc","internalType":"address"},{"type":"uint256","name":"doRequest","internalType":"uint256"},{"type":"uint256","name":"dpRequest","internalType":"uint256"},{"type":"uint256","name":"status","internalType":"uint256"}],"name":"_getOrder","inputs":[{"type":"uint256","name":"_orderItem","internalType":"uint256"}],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":"_length","internalType":"uint256"}],"name":"_getOrdersCount","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":"_Result","internalType":"uint256"}],"name":"_getRequiredValidators","inputs":[{"type":"uint256","name":"_orderItem","internalType":"uint256"}],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"string","name":"_Result","internalType":"string"}],"name":"_getResultFromOrder","inputs":[{"type":"uint256","name":"_orderItem","internalType":"uint256"}],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"uint256","name":"_orderNumber","internalType":"uint256"}],"name":"_placeOrder","inputs":[{"type":"uint256","name":"_doRequestItem","internalType":"uint256"},{"type":"uint256","name":"_dpRequestItem","internalType":"uint256"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_totalSupply","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"acceptOwnership","inputs":[],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":"remaining","internalType":"uint256"}],"name":"allowance","inputs":[{"type":"address","name":"tokenOwner","internalType":"address"},{"type":"address","name":"spender","internalType":"address"}],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"bool","name":"success","internalType":"bool"}],"name":"approve","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"tokens","internalType":"uint256"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"bool","name":"success","internalType":"bool"}],"name":"approveAndCall","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"tokens","internalType":"uint256"},{"type":"bytes","name":"data","internalType":"bytes"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":"balance","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"tokenOwner","internalType":"address"}],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"burn","inputs":[{"type":"uint256","name":"value","internalType":"uint256"},{"type":"string","name":"burnId","internalType":"string"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":"","internalType":"address"}],"name":"callerAddress","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":"","internalType":"address"}],"name":"implementation","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":"","internalType":"address"}],"name":"implementationPro","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"bool","name":"success","internalType":"bool"}],"name":"invalidate","inputs":[{"type":"uint256","name":"_orderItem","internalType":"uint256"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"mint","inputs":[{"type":"address","name":"receiver","internalType":"address"},{"type":"uint256","name":"value","internalType":"uint256"},{"type":"string","name":"mintId","internalType":"string"}],"constant":false},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":"","internalType":"address"}],"name":"newOwner","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[],"constant":true},{"type":"function","stateMutability":"view","payable":false,"outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[],"constant":true},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"bool","name":"success","internalType":"bool"}],"name":"transfer","inputs":[{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"tokens","internalType":"uint256"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"bool","name":"success","internalType":"bool"}],"name":"transferAnyERC20Token","inputs":[{"type":"address","name":"tokenAddress","internalType":"address"},{"type":"uint256","name":"tokens","internalType":"uint256"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"bool","name":"success","internalType":"bool"}],"name":"transferFrom","inputs":[{"type":"address","name":"from","internalType":"address"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"tokens","internalType":"uint256"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"_newOwner","internalType":"address"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[],"name":"transferProxy","inputs":[{"type":"address","name":"_newProxy","internalType":"address"}],"constant":false},{"type":"function","stateMutability":"nonpayable","payable":false,"outputs":[{"type":"bool","name":"success","internalType":"bool"}],"name":"validate","inputs":[{"type":"uint256","name":"_orderItem","internalType":"uint256"}],"constant":false}]
              

Contract Creation Code

Verify & Publish
0x600e80546001600160801b03191663649f6c7f179055600080546001600160a01b03199081163390811790925560028054909116909117905560c06040526005608081905264119256115160da1b60a0908152620000619160039190620001e5565b5060408051808201909152601a8082527f4578616d706c6520466978656420537570706c7920546f6b656e0000000000006020909201918252620000a891600491620001e5565b5060058054601260ff19909116179081905560ff16600a0a620f4240026006819055600080546001600160a01b039081168252600760209081526040808420859055835481519586529051921693600080516020620061a5833981519152929081900390910190a360408051808201909152600f8082526e22ba3432b93734ba3c902a37b5b2b760891b60209092019182526200014891600491620001e5565b506040805180820190915260048082526345544e5960e01b60209092019182526200017691600391620001e5565b5060058054601260ff19909116179081905560ff16600a0a633b9aca00026006819055600080546001600160a01b039081168252600760209081526040808420859055835481519586529051921693600080516020620061a5833981519152929081900390910190a36200028a565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200022857805160ff191683800117855562000258565b8280016001018555821562000258579182015b82811115620002585782518255916020019190600101906200023b565b50620002669291506200026a565b5090565b6200028791905b8082111562000266576000815560010162000271565b90565b615f0b806200029a6000396000f3fe6080604052600436106102fd5760003560e01c80637aed121411610190578063cae9ca51116100dc578063dd62ed3e11610095578063efa09d851161006f578063efa09d85146117e5578063f2fde38b1461180f578063f4de530514611842578063faa8aab114611872576102fd565b8063dd62ed3e1461176b578063e2eef9c3146117a6578063e780ada1146117d0576102fd565b8063cae9ca511461153d578063ce4d01a314611603578063d3fc98641461162d578063d4ee1d90146116f3578063d9edc13914611708578063dc39d06d14611732576102fd565b80639845599911610149578063a9059cbb11610123578063a9059cbb146112d5578063b251425b1461130e578063b3bb3da31461139f578063b5d11dfa14611400576102fd565b806398455999146110a95780639ecbec4114611296578063a8203abb146112c0576102fd565b80637aed121414610da75780638da5cb5b14610dbc57806392b9377414610dd1578063931323661461104f57806395d89b41146110645780639818e66c14611079576102fd565b80633eaaf86b1161024f5780635c60da1b1161020857806370a08231116101e257806370a0823114610c9257806374ed9ae414610cc55780637641e6f314610cda57806379ba509714610d92576102fd565b80635c60da1b14610c0d5780635d87b6e614610c3e578063676a96d814610c68576102fd565b80633eaaf86b146109be578063438787d0146109d357806344cc3c7f14610a085780634509b7e014610b455780634c1782e514610b7e5780634f74787b14610be3576102fd565b80631ea1afdb116102bc578063246439e611610296578063246439e6146106de578063313ce567146106f35780633701f5821461071e5780633ea5b5ed14610994576102fd565b80631ea1afdb146105635780632118c02c1461058d57806323b872dd1461069b576102fd565b80628a81a614610302578062d74970146103a157806306fdde0314610422578063095ea7b31461043757806314e9f3841461048457806318160ddd1461053c575b600080fd5b34801561030e57600080fd5b5061032c6004803603602081101561032557600080fd5b5035611887565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561036657818101518382015260200161034e565b50505050905090810190601f1680156103935780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103ad57600080fd5b506103cb600480360360208110156103c457600080fd5b50356119f9565b604080516001600160a01b03909916895260ff97881660208a0152958716888701529386166060880152918516608087015261ffff1660a086015290921660c084015260e083019190915251908190036101000190f35b34801561042e57600080fd5b5061032c611bdf565b34801561044357600080fd5b506104706004803603604081101561045a57600080fd5b506001600160a01b038135169060200135611c6d565b604080519115158252519081900360200190f35b34801561049057600080fd5b50610470600480360360408110156104a757600080fd5b81359190810190604081016020820135600160201b8111156104c857600080fd5b8201836020820111156104da57600080fd5b803590602001918460018302840111600160201b831117156104fb57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611cd4945050505050565b34801561054857600080fd5b50610551611e18565b60408051918252519081900360200190f35b34801561056f57600080fd5b506104706004803603602081101561058657600080fd5b5035611e4b565b34801561059957600080fd5b506105bd600480360360408110156105b057600080fd5b5080359060200135611fb8565b604051808060200180602001838103835285818151815260200191508051906020019080838360005b838110156105fe5781810151838201526020016105e6565b50505050905090810190601f16801561062b5780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b8381101561065e578181015183820152602001610646565b50505050905090810190601f16801561068b5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390f35b3480156106a757600080fd5b50610470600480360360608110156106be57600080fd5b506001600160a01b03813581169160208101359091169060400135612215565b3480156106ea57600080fd5b50610551612399565b3480156106ff57600080fd5b506107086123ba565b6040805160ff9092168252519081900360200190f35b34801561072a57600080fd5b50610551600480360361014081101561074257600080fd5b60ff823581169260208101358216926040820135831692606083013581169261ffff6080820135169260a08201359092169181019060e0810160c0820135600160201b81111561079157600080fd5b8201836020820111156107a357600080fd5b803590602001918460018302840111600160201b831117156107c457600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b81111561081657600080fd5b82018360208201111561082857600080fd5b803590602001918460018302840111600160201b8311171561084957600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b81111561089b57600080fd5b8201836020820111156108ad57600080fd5b803590602001918460018302840111600160201b831117156108ce57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b81111561092057600080fd5b82018360208201111561093257600080fd5b803590602001918460018302840111600160201b8311171561095357600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506123c3945050505050565b3480156109a057600080fd5b50610551600480360360208110156109b757600080fd5b5035612892565b3480156109ca57600080fd5b5061055161293c565b3480156109df57600080fd5b50610a06600480360360208110156109f657600080fd5b50356001600160a01b0316612942565b005b348015610a1457600080fd5b5061055160048036036060811015610a2b57600080fd5b81359190810190604081016020820135600160201b811115610a4c57600080fd5b820183602082011115610a5e57600080fd5b803590602001918460018302840111600160201b83111715610a7f57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b811115610ad157600080fd5b820183602082011115610ae357600080fd5b803590602001918460018302840111600160201b83111715610b0457600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506129ad945050505050565b348015610b5157600080fd5b5061047060048036036040811015610b6857600080fd5b50803590602001356001600160a01b0316612b07565b348015610b8a57600080fd5b50610b93612c6a565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610bcf578181015183820152602001610bb7565b505050509050019250505060405180910390f35b348015610bef57600080fd5b506103cb60048036036020811015610c0657600080fd5b5035612ce3565b348015610c1957600080fd5b50610c22612ec6565b604080516001600160a01b039092168252519081900360200190f35b348015610c4a57600080fd5b5061055160048036036020811015610c6157600080fd5b5035612ed5565b348015610c7457600080fd5b50610a0660048036036020811015610c8b57600080fd5b5035612f59565b348015610c9e57600080fd5b5061055160048036036020811015610cb557600080fd5b50356001600160a01b03166130c9565b348015610cd157600080fd5b50610c226130e4565b348015610ce657600080fd5b50610a0660048036036040811015610cfd57600080fd5b81359190810190604081016020820135600160201b811115610d1e57600080fd5b820183602082011115610d3057600080fd5b803590602001918460018302840111600160201b83111715610d5157600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506130f3945050505050565b348015610d9e57600080fd5b50610a066131bc565b348015610db357600080fd5b50610551613237565b348015610dc857600080fd5b50610c22613258565b348015610ddd57600080fd5b506105516004803603610160811015610df557600080fd5b60ff823581169260208101358216926040820135831692606083013581169261ffff6080820135169260a082013583169260c0830135169190810190610100810160e0820135600160201b811115610e4c57600080fd5b820183602082011115610e5e57600080fd5b803590602001918460018302840111600160201b83111715610e7f57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b811115610ed157600080fd5b820183602082011115610ee357600080fd5b803590602001918460018302840111600160201b83111715610f0457600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b811115610f5657600080fd5b820183602082011115610f6857600080fd5b803590602001918460018302840111600160201b83111715610f8957600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b811115610fdb57600080fd5b820183602082011115610fed57600080fd5b803590602001918460018302840111600160201b8311171561100e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550613267945050505050565b34801561105b57600080fd5b50610b93613878565b34801561107057600080fd5b5061032c6138ef565b34801561108557600080fd5b506105516004803603604081101561109c57600080fd5b508035906020013561394a565b3480156110b557600080fd5b506110d3600480360360208110156110cc57600080fd5b50356141c9565b60405180866001600160a01b03166001600160a01b0316815260200180602001806020018060200180602001858103855289818151815260200191508051906020019080838360005b8381101561113457818101518382015260200161111c565b50505050905090810190601f1680156111615780820380516001836020036101000a031916815260200191505b5085810384528851815288516020918201918a019080838360005b8381101561119457818101518382015260200161117c565b50505050905090810190601f1680156111c15780820380516001836020036101000a031916815260200191505b50858103835287518152875160209182019189019080838360005b838110156111f45781810151838201526020016111dc565b50505050905090810190601f1680156112215780820380516001836020036101000a031916815260200191505b50858103825286518152865160209182019188019080838360005b8381101561125457818101518382015260200161123c565b50505050905090810190601f1680156112815780820380516001836020036101000a031916815260200191505b50995050505050505050505060405180910390f35b3480156112a257600080fd5b50610a06600480360360208110156112b957600080fd5b503561452c565b3480156112cc57600080fd5b50610b936146e1565b3480156112e157600080fd5b50610470600480360360408110156112f857600080fd5b506001600160a01b038135169060200135614758565b34801561131a57600080fd5b506113386004803603602081101561133157600080fd5b503561476e565b604080516001600160a01b03909a168a5260ff98891660208b0152968816898801529487166060890152928616608088015261ffff90911660a087015290931660c085015260e084019290925263ffffffff90911661010083015251908190036101200190f35b3480156113ab57600080fd5b506113c9600480360360208110156113c257600080fd5b503561499f565b604080516001600160a01b039687168152949095166020850152838501929092526060830152608082015290519081900360a00190f35b34801561140c57600080fd5b506105516004803603606081101561142357600080fd5b81359190810190604081016020820135600160201b81111561144457600080fd5b82018360208201111561145657600080fd5b803590602001918460018302840111600160201b8311171561147757600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b8111156114c957600080fd5b8201836020820111156114db57600080fd5b803590602001918460018302840111600160201b831117156114fc57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550614ae8945050505050565b34801561154957600080fd5b506104706004803603606081101561156057600080fd5b6001600160a01b0382351691602081013591810190606081016040820135600160201b81111561158f57600080fd5b8201836020820111156115a157600080fd5b803590602001918460018302840111600160201b831117156115c257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550614c48945050505050565b34801561160f57600080fd5b506104706004803603602081101561162657600080fd5b5035614d90565b34801561163957600080fd5b50610a066004803603606081101561165057600080fd5b6001600160a01b0382351691602081013591810190606081016040820135600160201b81111561167f57600080fd5b82018360208201111561169157600080fd5b803590602001918460018302840111600160201b831117156116b257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550614f69945050505050565b3480156116ff57600080fd5b50610c2261507c565b34801561171457600080fd5b506110d36004803603602081101561172b57600080fd5b503561508b565b34801561173e57600080fd5b506104706004803603604081101561175557600080fd5b506001600160a01b0381351690602001356151ff565b34801561177757600080fd5b506105516004803603604081101561178e57600080fd5b506001600160a01b03813581169160200135166152d3565b3480156117b257600080fd5b50610551600480360360208110156117c957600080fd5b50356152fe565b3480156117dc57600080fd5b50610551615382565b3480156117f157600080fd5b506104706004803603602081101561180857600080fd5b50356153a3565b34801561181b57600080fd5b50610a066004803603602081101561183257600080fd5b50356001600160a01b03166155bc565b34801561184e57600080fd5b506105bd6004803603604081101561186557600080fd5b5080359060200135615627565b34801561187e57600080fd5b50610c226157bb565b6002546060906001600160a01b031633146118a157600080fd5b60155482106118e5576040805162461bcd60e51b815260206004820152600b60248201526a1a591e081a5b9d985b1a5960aa1b604482015290519081900360640190fd5b6000601583815481106118f457fe5b60009182526020909120600c9091020190506002600b82015460ff16600381111561191b57fe5b14611964576040805162461bcd60e51b81526020600482015260146024820152731bdc99195c881b5d5cdd0818994818db1bdcd95960621b604482015290519081900360640190fd5b60098101805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156119ec5780601f106119c1576101008083540402835291602001916119ec565b820191906000526020600020905b8154815290600101906020018083116119cf57829003601f168201915b5050505050915050919050565b60025460009081908190819081908190819081906001600160a01b03163314611a2157600080fd5b6014548910611a65576040805162461bcd60e51b815260206004820152600b60248201526a1a591e081a5b9d985b1a5960aa1b604482015290519081900360640190fd5b60148981548110611a7257fe5b600091825260209091206007600890920201015460ff166002811115611a9457fe5b905060148981548110611aa357fe5b6000918252602090912060089091020154601480546001600160a01b03909216918b908110611ace57fe5b906000526020600020906008020160000160149054906101000a900460ff1660148b81548110611afa57fe5b906000526020600020906008020160000160159054906101000a900460ff1660148c81548110611b2657fe5b906000526020600020906008020160000160169054906101000a900460ff1660148d81548110611b5257fe5b906000526020600020906008020160000160179054906101000a900460ff1660148e81548110611b7e57fe5b906000526020600020906008020160000160189054906101000a900461ffff1660148f81548110611bab57fe5b6000918252602090912060089091020154959f949e50929c50909a5098509650600160d01b90910460ff1694509092509050565b6004805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015611c655780601f10611c3a57610100808354040283529160200191611c65565b820191906000526020600020905b815481529060010190602001808311611c4857829003601f168201915b505050505081565b3360008181526008602090815260408083206001600160a01b038716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a35060015b92915050565b6002546000906001600160a01b03163314611cee57600080fd5b6015548310611d32576040805162461bcd60e51b815260206004820152600b60248201526a1a591e081a5b9d985b1a5960aa1b604482015290519081900360640190fd5b600060158481548110611d4157fe5b60009182526020909120600c9091020190506001600b82015460ff166003811115611d6857fe5b14611db5576040805162461bcd60e51b81526020600482015260186024820152776f72646572206d7573742062652070726f63657373696e6760401b604482015290519081900360640190fd5b8251611dca9060098301906020860190615df0565b50600b8101805460ff191660021790556040805185815290517f82c71af4e0a9a239768fac6f9df215013913a0cc66faa82cbc9acd3299b7fc32916020908290030190a15060019392505050565b6000805260076020527f6d5257204ebe7d88fd91ae87941cb2dd9d8062b64ae5a2bd2d28ec40b9fbf6df54600654035b90565b600073ae7488b3aacb8415be66d78c05d279ba5a86820e3314611e9f5760405162461bcd60e51b815260040180806020018281038252602c815260200180615eab602c913960400191505060405180910390fd5b600060158381548110611eae57fe5b60009182526020909120600c9091020190506002600b82015460ff166003811115611ed557fe5b14611f1e576040805162461bcd60e51b81526020600482015260146024820152731bdc99195c881b5d5cdd0818994818db1bdcd95960621b604482015290519081900360640190fd5b60006013826005015481548110611f3157fe5b600091825260209091206009909102018054600a84015491925061ffff600160c01b82041691909102670de0b6b3a76400000290611f7a9030906001600160a01b0316836157ca565b6040805186815290517f1d58276cd8287e9f5f935672f809d99bf1dc6efa93ef34c6fffb66b45dcda5b69181900360200190a1506001949350505050565b60025460609081906001600160a01b03163314611fd457600080fd5b6014548410612018576040805162461bcd60e51b815260206004820152600b60248201526a1a591e081a5b9d985b1a5960aa1b604482015290519081900360640190fd5b6014848154811061202557fe5b906000526020600020906008020160060154831061207c576040805162461bcd60e51b815260206004820152600f60248201526e1b5d19081a591e081a5b9d985b1a59608a1b604482015290519081900360640190fd5b6014848154811061208957fe5b90600052602060002090600802016005016000848152602001908152602001600020600001601485815481106120bb57fe5b90600052602060002090600802016005016000858152602001908152602001600020600101818054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156121755780601f1061214a57610100808354040283529160200191612175565b820191906000526020600020905b81548152906001019060200180831161215857829003601f168201915b5050845460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152959750869450925084019050828280156122035780601f106121d857610100808354040283529160200191612203565b820191906000526020600020905b8154815290600101906020018083116121e657829003601f168201915b50505050509050915091509250929050565b6001600160a01b038316600090815260076020526040812054821115612279576040805162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b604482015290519081900360640190fd5b6122848484846159aa565b61228d57600080fd5b6001600160a01b03841660009081526008602090815260408083203384529091529020546122c1908363ffffffff615b5516565b6001600160a01b038516600081815260086020908152604080832033845282528083209490945591815260079091522054612302908363ffffffff615b5516565b6001600160a01b038086166000908152600760205260408082209390935590851681522054612337908363ffffffff615b6a16565b6001600160a01b0380851660008181526007602090815260409182902094909455805186815290519193928816927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a35060015b9392505050565b6002546000906001600160a01b031633146123b357600080fd5b5060155490565b60055460ff1681565b6002546000906001600160a01b031633146123dd57600080fd5b60008b60ff161180156123f3575060ff8b811611155b612432576040805162461bcd60e51b815260206004820152600b60248201526a18dc1d481a5b9d985b1a5960aa1b604482015290519081900360640190fd5b60008a60ff16118015612448575060ff8a811611155b612487576040805162461bcd60e51b815260206004820152600b60248201526a1b595b481a5b9d985b1a5960aa1b604482015290519081900360640190fd5b60008860ff1611801561249d575060ff88811611155b6124db576040805162461bcd60e51b815260206004820152600a602482015269189dc81a5b9d985b1a5960b21b604482015290519081900360640190fd5b60008960ff161180156124f1575060ff89811611155b612531576040805162461bcd60e51b815260206004820152600c60248201526b1cdd1c99c81a5b9d985b1a5960a21b604482015290519081900360640190fd5b60176000336001600160a01b03166001600160a01b03168152602001908152602001600020601480549050908060018154018082558091505090600182039060005260206000200160009091929091909150555060016014604051806101e00160405280336001600160a01b031681526020018e60ff1681526020018d60ff1681526020018c60ff1681526020018b60ff1681526020018a61ffff16815260200160648a600f0260ff16816125e257fe5b048a0160ff1681526020014263ffffffff168152602001600060ff168152602001888152602001878152602001868152602001858152602001600081526020016000600281111561262f57fe5b8152509080600181540180825580915050906001820390600052602060002090600802016000909192909190915060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160000160146101000a81548160ff021916908360ff16021790555060408201518160000160156101000a81548160ff021916908360ff16021790555060608201518160000160166101000a81548160ff021916908360ff16021790555060808201518160000160176101000a81548160ff021916908360ff16021790555060a08201518160000160186101000a81548161ffff021916908361ffff16021790555060c082015181600001601a6101000a81548160ff021916908360ff16021790555060e082015181600001601b6101000a81548163ffffffff021916908363ffffffff16021790555061010082015181600001601f6101000a81548160ff021916908360ff1602179055506101208201518160010190805190602001906127b8929190615df0565b5061014082015180516127d5916002840191602090910190615df0565b5061016082015180516127f2916003840191602090910190615df0565b50610180820151805161280f916004840191602090910190615df0565b506101a082015160068201556101c082015160078201805460ff1916600183600281111561283957fe5b02179055505050039050336001600160a01b03167f4c8c70b2a4a4432c71bae55aa7d26fd87cad0deea0ba1aff77d2fb64c9136d8e826040518082815260200191505060405180910390a29a9950505050505050505050565b6002546000906001600160a01b031633146128ac57600080fd5b60155482106128f0576040805162461bcd60e51b815260206004820152600b60248201526a1a591e081a5b9d985b1a5960aa1b604482015290519081900360640190fd5b6013601583815481106128ff57fe5b90600052602060002090600c0201600501548154811061291b57fe5b6000918252602090912060099091020154600160d01b900460ff1692915050565b60065481565b6000546001600160a01b0316331461298b5760405162461bcd60e51b8152600401808060200182810382526022815260200180615e896022913960400191505060405180910390fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6002546000906001600160a01b031633146129c757600080fd5b6013548410612a0b576040805162461bcd60e51b815260206004820152600b60248201526a1a591e081a5b9d985b1a5960aa1b604482015290519081900360640190fd5b60138481548110612a1857fe5b60009182526020909120600990910201546001600160a01b03163314612a7f576040805162461bcd60e51b815260206004820152601760248201527630b63637bbb2b21037b7363c903337b9103237bbb732b960491b604482015290519081900360640190fd5b600060138581548110612a8e57fe5b60009182526020808320600760099093020191820154835260068201815260409092208651919350612ac592909190870190615df0565b506007810154600090815260068201602090815260409091208451612af292600190920191860190615df0565b50600701805460018101909155949350505050565b6002546000906001600160a01b03163314612b2157600080fd5b6015548310612b65576040805162461bcd60e51b815260206004820152600b60248201526a1a591e081a5b9d985b1a5960aa1b604482015290519081900360640190fd5b600060158481548110612b7457fe5b60009182526020909120600c90910201805490915061010090046001600160a01b03163314612be1576040805162461bcd60e51b8152602060048201526014602482015273616c6c6f7764206f6e6c7920746f206470726f6360601b604482015290519081900360640190fd5b6001600b82015460ff166003811115612bf657fe5b14612c43576040805162461bcd60e51b81526020600482015260186024820152776f72646572206d7573742062652070726f63657373696e6760401b604482015290519081900360640190fd5b60020180546001600160a01b0384166001600160a01b031990911617905550600192915050565b6002546060906001600160a01b03163314612c8457600080fd5b3360009081526017602090815260409182902080548351818402810184019094528084529091830182828015612cd957602002820191906000526020600020905b815481526020019060010190808311612cc5575b5050505050905090565b60025460009081908190819081908190819081906001600160a01b03163314612d0b57600080fd5b6013548910612d4f576040805162461bcd60e51b815260206004820152600b60248201526a1a591e081a5b9d985b1a5960aa1b604482015290519081900360640190fd5b60138981548110612d5c57fe5b600091825260209091206008600990920201015460ff166002811115612d7e57fe5b905060138981548110612d8d57fe5b6000918252602090912060099091020154601380546001600160a01b03909216918b908110612db857fe5b906000526020600020906009020160000160149054906101000a900460ff1660138b81548110612de457fe5b906000526020600020906009020160000160159054906101000a900460ff1660138c81548110612e1057fe5b906000526020600020906009020160000160169054906101000a900460ff1660138d81548110612e3c57fe5b906000526020600020906009020160000160179054906101000a900460ff1660138e81548110612e6857fe5b906000526020600020906009020160000160189054906101000a900461ffff1660138f81548110612e9557fe5b6000918252602090912060099091020160010154959f949e50929c50909a509850965060ff90911694509092509050565b6009546001600160a01b031681565b6002546000906001600160a01b03163314612eef57600080fd5b6013548210612f33576040805162461bcd60e51b815260206004820152600b60248201526a1a591e081a5b9d985b1a5960aa1b604482015290519081900360640190fd5b60138281548110612f4057fe5b9060005260206000209060090201600701549050919050565b6002546001600160a01b03163314612f7057600080fd5b6014548110612fb4576040805162461bcd60e51b815260206004820152600b60248201526a1a591e081a5b9d985b1a5960aa1b604482015290519081900360640190fd5b60148181548110612fc157fe5b60009182526020909120600890910201546001600160a01b0316331461302e576040805162461bcd60e51b815260206004820152601f60248201527f616c6c6f776564206f6e6c7920666f722064656c6567617465642070726f6300604482015290519081900360640190fd5b60006014828154811061303d57fe5b6000918252602082206008909102019150600782015460ff16600281111561306157fe5b146130ae576040805162461bcd60e51b8152602060048201526018602482015277737461747573206d75737420626520617661696c61626c6560401b604482015290519081900360640190fd5b6007810180546002919060ff19166001835b02179055505050565b6001600160a01b031660009081526007602052604090205490565b600a546001600160a01b031681565b6130fd3383615b7a565b7f47e772fda56eb54ab211642ce5421882c49fc2b7033455982af14588ae4207ff33838360405180846001600160a01b03166001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561317c578181015183820152602001613164565b50505050905090810190601f1680156131a95780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a15050565b6001546001600160a01b031633146131d357600080fd5b600154600080546040516001600160a01b0393841693909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a360018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b6002546000906001600160a01b0316331461325157600080fd5b5060135490565b6000546001600160a01b031681565b6002546000906001600160a01b0316331461328157600080fd5b3360009081526007602052604090205461ffff60ff888a02168a0216670de0b6b3a76400000211156132f1576040805162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b604482015290519081900360640190fd5b60008760ff161180156133085750600a60ff881611155b61334c576040805162461bcd60e51b815260206004820152601060248201526f1a5b9cdd185b98d9481a5b9d985b1a5960821b604482015290519081900360640190fd5b60008c60ff16118015613362575060ff8c811611155b6133a1576040805162461bcd60e51b815260206004820152600b60248201526a18dc1d481a5b9d985b1a5960aa1b604482015290519081900360640190fd5b60008b60ff161180156133b7575060ff8b811611155b6133f6576040805162461bcd60e51b815260206004820152600b60248201526a1b595b481a5b9d985b1a5960aa1b604482015290519081900360640190fd5b60008960ff1611801561340c575060ff89811611155b61344a576040805162461bcd60e51b815260206004820152600a602482015269189dc81a5b9d985b1a5960b21b604482015290519081900360640190fd5b60008a60ff16118015613460575060ff8a811611155b6134a0576040805162461bcd60e51b815260206004820152600c60248201526b1cdd1c99c81a5b9d985b1a5960a21b604482015290519081900360640190fd5b6134be333061ffff60ff8a168c0216670de0b6b3a7640000026157ca565b60166000336001600160a01b03166001600160a01b03168152602001908152602001600020601380549050908060018154018082558091505090600182039060005260206000200160009091929091909150555060016013604051806102200160405280336001600160a01b031681526020018f60ff1681526020018e60ff1681526020018d60ff1681526020018c60ff1681526020018b61ffff1681526020018a60ff168152602001600060ff1681526020014263ffffffff1681526020018960ff1681526020018b8b8b0260ff160261ffff1663ffffffff16815260200188815260200187815260200186815260200185815260200160008152602001600060028111156135ca57fe5b8152509080600181540180825580915050906001820390600052602060002090600902016000909192909190915060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160000160146101000a81548160ff021916908360ff16021790555060408201518160000160156101000a81548160ff021916908360ff16021790555060608201518160000160166101000a81548160ff021916908360ff16021790555060808201518160000160176101000a81548160ff021916908360ff16021790555060a08201518160000160186101000a81548161ffff021916908361ffff16021790555060c082015181600001601a6101000a81548160ff021916908360ff16021790555060e082015181600001601b6101000a81548160ff021916908360ff16021790555061010082015181600001601c6101000a81548163ffffffff021916908363ffffffff1602179055506101208201518160010160006101000a81548160ff021916908360ff1602179055506101408201518160010160016101000a81548163ffffffff021916908363ffffffff16021790555061016082015181600201908051906020019061379d929190615df0565b5061018082015180516137ba916003840191602090910190615df0565b506101a082015180516137d7916004840191602090910190615df0565b506101c082015180516137f4916005840191602090910190615df0565b506101e0820151600782015561020082015160088201805460ff1916600183600281111561381e57fe5b02179055505050039050336001600160a01b03167feccaef2766efce444edd10aa43fdedc15db863e63aaac53a1325b0e878e6bc7c826040518082815260200191505060405180910390a29b9a5050505050505050505050565b6002546060906001600160a01b0316331461389257600080fd5b3360009081526016602090815260409182902080548351818402810184019094528084529091830182828015612cd95760200282019190600052602060002090815481526020019060010190808311612cc5575050505050905090565b6003805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015611c655780601f10611c3a57610100808354040283529160200191611c65565b6002546000906001600160a01b0316331461396457600080fd5b60135483106139a8576040805162461bcd60e51b815260206004820152600b60248201526a1a591e081a5b9d985b1a5960aa1b604482015290519081900360640190fd5b60145482106139f2576040805162461bcd60e51b8152602060048201526011602482015270191c1c881a5b99195e081a5b9d985b1a59607a1b604482015290519081900360640190fd5b600060138481548110613a0157fe5b6000918252602082206009909102019150600882015460ff166002811115613a2557fe5b14613a72576040805162461bcd60e51b8152602060048201526018602482015277737461747573206d75737420626520617661696c61626c6560401b604482015290519081900360640190fd5b600581018054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015613b005780601f10613ad557610100808354040283529160200191613b00565b820191906000526020600020905b815481529060010190602001808311613ae357829003601f168201915b5050505050905060008060148681548110613b1757fe5b60009182526020918290206002600890920201818101805460408051601f60001961010060018616150201909316959095049182018690048602850186019052808452919450606093909190830182828015613bb45780601f10613b8957610100808354040283529160200191613bb4565b820191906000526020600020905b815481529060010190602001808311613b9757829003601f168201915b5050855460018a015494955060ff600160d01b9091048116941693909310159250613c20915050576040805162461bcd60e51b81526020600482015260146024820152730e0e4d2c6ca40c8decae640dcdee840dac2e8c6d60631b604482015290519081900360640190fd5b6000815111613c6b576040805162461bcd60e51b81526020600482015260126024820152711b595d1859185d184c881c995c5d5a5c995960721b604482015290519081900360640190fd5b835115613d0e57600585018054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152613d0b9390929091830182828015613d015780601f10613cd657610100808354040283529160200191613d01565b820191906000526020600020905b815481529060010190602001808311613ce457829003601f168201915b5050505050615bde565b92505b83511580613d2457506001600160a01b03831633145b613d6c576040805162461bcd60e51b81526020600482015260146024820152731b9bd919481859191c995cdcc81a5b9d985b1a5960621b604482015290519081900360640190fd5b6000600783015460ff166002811115613d8157fe5b14613dce576040805162461bcd60e51b8152602060048201526018602482015277737461747573206d75737420626520617661696c61626c6560401b604482015290519081900360640190fd5b81546001600160a01b0316331480613def575084546001600160a01b031633145b613e40576040805162461bcd60e51b815260206004820152601760248201527f696e76616c696420646f776e6572206f72206470726f63000000000000000000604482015290519081900360640190fd5b81546000906001600160a01b0316331415613e66575081546001600160a01b0316613e73565b5084546001600160a01b03165b855460ff60d81b198116600160d81b9182900460ff9081166001018116830291909117808955600160d01b81048216929004161415613ebc5760088601805460ff191660011790555b60078301805460ff1916600190811790915583546001600160a01b0390811660009081526018602090815260408083206015805482548089018455928652848620909201919091558b5490941683528220925483549485018455928252812090920155855115613f2a575060015b6040805161018081018252885460ff600160d81b82048116835287546001600160a01b0390811660208086019190915292811684860152600060608501819052908716608085015260a084018e905260c084018f905263ffffffff421660e0850152610100840181905284519283019094529281526101208201526001898101549092166101408201526015906101608101846003811115613fc857fe5b90528154600180820180855560009485526020948590208451600c9094020180548587015160ff1990911660ff90951694909417610100600160a81b0319166101006001600160a01b039586168102919091178255604086015193820180546001600160a01b031990811695871695909517905560608601516002830180548616918716919091179055608086015160038301805490951695169490941790925560a0840151600483015560c0840151600583015560e084015160068301559183015160088201556101208301518051929491926140ac9260098501920190615df0565b50610140820151600a820155610160820151600b8201805460ff191660018360038111156140d657fe5b02179055505050039750336001600160a01b03167fdc3a6d828aee9328544a5092f889da39f808a288f223812d4ab33b59c60867c6896040518082815260200191505060405180910390a260408051898152602081018c90528082018b905290517f52ec990a555aaad1a6395f34d1532ac11fa3c72139719d9469c880315c01806d9181900360600190a18551156141bc5786548454601554604080516001600160a01b0393841681526000199092016020830152805192909316927f9b30afe0f76574363e78b150c33c302dafe8c2a0dbe597cda7938b0ba721a2a592918290030190a25b5050505050505092915050565b6002546000906060908190819081906001600160a01b031633146141ec57600080fd5b6014548610614230576040805162461bcd60e51b815260206004820152600b60248201526a1a591e081a5b9d985b1a5960aa1b604482015290519081900360640190fd5b6014868154811061423d57fe5b6000918252602090912060089091020154601480546001600160a01b03909216918890811061426857fe5b90600052602060002090600802016001016014888154811061428657fe5b9060005260206000209060080201600201601489815481106142a457fe5b906000526020600020906008020160030160148a815481106142c257fe5b9060005260206000209060080201600401838054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156143685780601f1061433d57610100808354040283529160200191614368565b820191906000526020600020905b81548152906001019060200180831161434b57829003601f168201915b5050865460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152959950889450925084019050828280156143f65780601f106143cb576101008083540402835291602001916143f6565b820191906000526020600020905b8154815290600101906020018083116143d957829003601f168201915b5050855460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152959850879450925084019050828280156144845780601f1061445957610100808354040283529160200191614484565b820191906000526020600020905b81548152906001019060200180831161446757829003601f168201915b5050845460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152959750869450925084019050828280156145125780601f106144e757610100808354040283529160200191614512565b820191906000526020600020905b8154815290600101906020018083116144f557829003601f168201915b505050505090509450945094509450945091939590929450565b6002546001600160a01b0316331461454357600080fd5b6013548110614587576040805162461bcd60e51b815260206004820152600b60248201526a1a591e081a5b9d985b1a5960aa1b604482015290519081900360640190fd5b6013818154811061459457fe5b60009182526020909120600990910201546001600160a01b031633146145fb576040805162461bcd60e51b815260206004820152601760248201527630b63637bbb2b21037b7363c903337b9103237bbb732b960491b604482015290519081900360640190fd5b60006013828154811061460a57fe5b6000918252602082206009909102019150600882015460ff16600281111561462e57fe5b14801561464457508054600160d81b900460ff16155b614690576040805162461bcd60e51b8152602060048201526018602482015277737461747573206d75737420626520617661696c61626c6560401b604482015290519081900360640190fd5b805460018201546146cb9130916001600160a01b0382169160ff90911661ffff600160c01b90920482160216670de0b6b3a7640000026157ca565b6008810180546002919060ff19166001836130c0565b6002546060906001600160a01b031633146146fb57600080fd5b3360009081526018602090815260409182902080548351818402810184019094528084529091830182828015612cd95760200282019190600052602060002090815481526020019060010190808311612cc5575050505050905090565b60006147653384846157ca565b50600192915050565b6000806000806000806000806000600260009054906101000a90046001600160a01b03166001600160a01b0316336001600160a01b0316146147af57600080fd5b6014548a106147f3576040805162461bcd60e51b815260206004820152600b60248201526a1a591e081a5b9d985b1a5960aa1b604482015290519081900360640190fd5b60148a8154811061480057fe5b600091825260209091206007600890920201015460ff16600281111561482257fe5b915060148a8154811061483157fe5b9060005260206000209060080201600001601b9054906101000a900463ffffffff16905060148a8154811061486257fe5b9060005260206000209060080201600001601a9054906101000a900460ff16925060148a8154811061489057fe5b6000918252602090912060089091020154601480546001600160a01b03909216918c9081106148bb57fe5b906000526020600020906008020160000160149054906101000a900460ff1660148c815481106148e757fe5b906000526020600020906008020160000160159054906101000a900460ff1660148d8154811061491357fe5b906000526020600020906008020160000160169054906101000a900460ff1660148e8154811061493f57fe5b906000526020600020906008020160000160179054906101000a900460ff1660148f8154811061496b57fe5b6000918252602090912060089091020154949f939e50919c509a509850600160c01b90910461ffff16965092945090925090565b60025460009081908190819081906001600160a01b031633146149c157600080fd5b6013548610614a05576040805162461bcd60e51b815260206004820152600b60248201526a1a591e081a5b9d985b1a5960aa1b604482015290519081900360640190fd5b60158681548110614a1257fe5b90600052602060002090600c020160010160009054906101000a90046001600160a01b031660158781548110614a4457fe5b90600052602060002090600c020160000160019054906101000a90046001600160a01b031660158881548110614a7657fe5b90600052602060002090600c02016005015460158981548110614a9557fe5b90600052602060002090600c02016004015460158a81548110614ab457fe5b60009182526020909120600b600c90920201015460ff166003811115614ad657fe5b939a9299509097509550909350915050565b6002546000906001600160a01b03163314614b0257600080fd5b6014548410614b46576040805162461bcd60e51b815260206004820152600b60248201526a1a591e081a5b9d985b1a5960aa1b604482015290519081900360640190fd5b60148481548110614b5357fe5b60009182526020909120600890910201546001600160a01b03163314614bc0576040805162461bcd60e51b815260206004820181905260248201527f616c6c6f776564206f6e6c7920666f722064656c6567617465642070726f6373604482015290519081900360640190fd5b600060148581548110614bcf57fe5b60009182526020808320600660089093020191820154835260058201815260409092208651919350614c0692909190870190615df0565b506006810154600090815260058201602090815260409091208451614c3392600190920191860190615df0565b50600601805460018101909155949350505050565b3360008181526008602090815260408083206001600160a01b038816808552908352818420879055815187815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a3604051638f4ffcb160e01b815233600482018181526024830186905230604484018190526080606485019081528651608486015286516001600160a01b038a1695638f4ffcb195948a94938a939192909160a490910190602085019080838360005b83811015614d1f578181015183820152602001614d07565b50505050905090810190601f168015614d4c5780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015614d6e57600080fd5b505af1158015614d82573d6000803e3d6000fd5b506001979650505050505050565b600073ae7488b3aacb8415be66d78c05d279ba5a86820e3314614de45760405162461bcd60e51b815260040180806020018281038252602c815260200180615eab602c913960400191505060405180910390fd5b600060158381548110614df357fe5b60009182526020909120600c9091020190506002600b82015460ff166003811115614e1a57fe5b14614e63576040805162461bcd60e51b81526020600482015260146024820152731bdc99195c881b5d5cdd0818994818db1bdcd95960621b604482015290519081900360640190fd5b60006013826005015481548110614e7657fe5b6000918252602082206009909102018054600a85015491935061ffff600160c01b9091041602670de0b6b3a76400000290738082eda439226540c1ffea3759cd267d044dca2b90730457e4d1f0085a84dd5f470f36575f69f815813c90614ede846005615d79565b90506000614eed85600a615d79565b8754909150614f1190309061010090046001600160a01b03168488038490036157ca565b614f1c3085846157ca565b614f273084836157ca565b604080518a815290517fb1c39ae9e5276f66f3a413fd02db269d80bbc55f61afd375917e7bbae368230f9181900360200190a150600198975050505050505050565b6000546001600160a01b03163314614fb25760405162461bcd60e51b8152600401808060200182810382526022815260200180615e896022913960400191505060405180910390fd5b614fbc8383615d89565b7f85a66b9141978db9980f7e0ce3b468cebf4f7999f32b23091c5c03e798b1ba7a83838360405180846001600160a01b03166001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561503b578181015183820152602001615023565b50505050905090810190601f1680156150685780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a1505050565b6001546001600160a01b031681565b6002546000906060908190819081906001600160a01b031633146150ae57600080fd5b60135486106150f2576040805162461bcd60e51b815260206004820152600b60248201526a1a591e081a5b9d985b1a5960aa1b604482015290519081900360640190fd5b601386815481106150ff57fe5b6000918252602090912060099091020154601380546001600160a01b03909216918890811061512a57fe5b90600052602060002090600902016002016013888154811061514857fe5b90600052602060002090600902016003016013898154811061516657fe5b906000526020600020906009020160040160138a8154811061518457fe5b9060005260206000209060090201600501838054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156143685780601f1061433d57610100808354040283529160200191614368565b600080546001600160a01b031633146152495760405162461bcd60e51b8152600401808060200182810382526022815260200180615e896022913960400191505060405180910390fd5b600080546040805163a9059cbb60e01b81526001600160a01b0392831660048201526024810186905290519186169263a9059cbb926044808401936020939083900390910190829087803b1580156152a057600080fd5b505af11580156152b4573d6000803e3d6000fd5b505050506040513d60208110156152ca57600080fd5b50519392505050565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205490565b6002546000906001600160a01b0316331461531857600080fd5b601454821061535c576040805162461bcd60e51b815260206004820152600b60248201526a1a591e081a5b9d985b1a5960aa1b604482015290519081900360640190fd5b6014828154811061536957fe5b9060005260206000209060080201600601549050919050565b6002546000906001600160a01b0316331461539c57600080fd5b5060145490565b6002546000906001600160a01b031633146153bd57600080fd5b6015548210615401576040805162461bcd60e51b815260206004820152600b60248201526a1a591e081a5b9d985b1a5960aa1b604482015290519081900360640190fd5b60006015838154811061541057fe5b60009182526020909120600c9091020160018101549091506001600160a01b031633148061544c5750805461010090046001600160a01b031633145b61549d576040805162461bcd60e51b815260206004820152601760248201527f646f776e6572206f72206470726f6320696e76616c6964000000000000000000604482015290519081900360640190fd5b60038101546001600160a01b03163314156154f2576040805162461bcd60e51b815260206004820152601060248201526f34b73b30b634b21030b8383937bb32b960811b604482015290519081900360640190fd5b6000600b82015460ff16600381111561550757fe5b1461554e576040805162461bcd60e51b815260206004820152601260248201527137b93232b91036bab9ba1031329037b832b760711b604482015290519081900360640190fd5b600b81018054600160ff1990911681179091558101548154604080516101009092046001600160a01b0390811683526020830187905281519316927f9b30afe0f76574363e78b150c33c302dafe8c2a0dbe597cda7938b0ba721a2a59281900390910190a250600192915050565b6000546001600160a01b031633146156055760405162461bcd60e51b8152600401808060200182810382526022815260200180615e896022913960400191505060405180910390fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b60025460609081906001600160a01b0316331461564357600080fd5b6013548410615687576040805162461bcd60e51b815260206004820152600b60248201526a1a591e081a5b9d985b1a5960aa1b604482015290519081900360640190fd5b6013848154811061569457fe5b90600052602060002090600902016007015483106156ed576040805162461bcd60e51b81526020600482015260116024820152701b5d19081a5b99195e081a5b9d985b1a59607a1b604482015290519081900360640190fd5b601384815481106156fa57fe5b906000526020600020906009020160060160008481526020019081526020016000206000016013858154811061572c57fe5b90600052602060002090600902016006016000858152602001908152602001600020600101818054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156121755780601f1061214a57610100808354040283529160200191612175565b6002546001600160a01b031681565b6157d58383836159aa565b6157de57600080fd5b6001600160a01b038316615854576006546b033b2e3c9fd0803ce80000009082011115615847576040805162461bcd60e51b81526020600482015260126024820152711b585e081cdd5c1c1b1e481c995858da195960721b604482015290519081900360640190fd5b60068054820190556158fb565b6001600160a01b0383166000908152600760205260409020548111156158b8576040805162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b604482015290519081900360640190fd5b6001600160a01b0383166000908152600760205260409020546158e1908263ffffffff615b5516565b6001600160a01b0384166000908152600760205260409020555b6001600160a01b0382166159175760068054829003905561595a565b6001600160a01b038216600090815260076020526040902054615940908263ffffffff615b6a16565b6001600160a01b0383166000908152600760205260409020555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b6040805163ba2a3cf560e01b81526001600160a01b0385166004820152905160009173f786503b6dbf79827ef0c257cfbc122bf1d827b691737c885df91020b52c3b297b9f9c076f165c3789349184918291859163ba2a3cf591602480820192602092909190829003018186803b158015615a2457600080fd5b505afa158015615a38573d6000803e3d6000fd5b505050506040513d6020811015615a4e57600080fd5b5051604080516322c6e7b560e11b81526001600160a01b038b8116600483015291519293506000929186169163458dcf6a9160248082019260209290919082900301818787803b158015615aa157600080fd5b505af1158015615ab5573d6000803e3d6000fd5b505050506040513d6020811015615acb57600080fd5b5051905081811115615ae35781810382019250615ae7565b8192505b6001600160a01b038916600090815260076020526040902054831115615b1557600095505050505050612392565b6001600160a01b038916600090815260076020526040902054839003871115615b4657600095505050505050612392565b50600198975050505050505050565b600082821115615b6457600080fd5b50900390565b81810182811015611cce57600080fd5b6001600160a01b038216615bce576040805162461bcd60e51b8152602060048201526016602482015275125b9d985b1a59081cd95b99195c881858d8dbdd5b9d60521b604482015290519081900360640190fd5b615bda826000836157ca565b5050565b60008181808060025b602a811015615d6e5761010084029350848181518110615c0357fe5b0160200151855160f89190911c9350859060018301908110615c2157fe5b016020015160f81c915060616001600160a01b03841610801590615c4f57506066836001600160a01b031611155b15615c5f57605783039250615cc3565b6041836001600160a01b031610158015615c8357506046836001600160a01b031611155b15615c9357603783039250615cc3565b6030836001600160a01b031610158015615cb757506039836001600160a01b031611155b15615cc3576030830392505b6061826001600160a01b031610158015615ce757506066826001600160a01b031611155b15615cf757605782039150615d5b565b6041826001600160a01b031610158015615d1b57506046826001600160a01b031611155b15615d2b57603782039150615d5b565b6030826001600160a01b031610158015615d4f57506039826001600160a01b031611155b15615d5b576030820391505b6010830282019390930192600201615be7565b509195945050505050565b6064607392810292909204020490565b6001600160a01b038216615de4576040805162461bcd60e51b815260206004820152601860248201527f496e76616c6964207265636569766572206163636f756e740000000000000000604482015290519081900360640190fd5b615bda600083836157ca565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10615e3157805160ff1916838001178555615e5e565b82800160010185558215615e5e579182015b82811115615e5e578251825591602001919060010190615e43565b50615e6a929150615e6e565b5090565b611e4891905b80821115615e6a5760008155600101615e7456fe4f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f6e2e4f6e6c792056616c696461746f7252656769737472792063616e2076616c6964617465206120726573756c74a265627a7a723158200c16b0804b85c8335146361e23e9ed5291003d79551e9f580ef90325e1adaff764736f6c63430005110032ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef

Deployed ByteCode

0x6080604052600436106102fd5760003560e01c80637aed121411610190578063cae9ca51116100dc578063dd62ed3e11610095578063efa09d851161006f578063efa09d85146117e5578063f2fde38b1461180f578063f4de530514611842578063faa8aab114611872576102fd565b8063dd62ed3e1461176b578063e2eef9c3146117a6578063e780ada1146117d0576102fd565b8063cae9ca511461153d578063ce4d01a314611603578063d3fc98641461162d578063d4ee1d90146116f3578063d9edc13914611708578063dc39d06d14611732576102fd565b80639845599911610149578063a9059cbb11610123578063a9059cbb146112d5578063b251425b1461130e578063b3bb3da31461139f578063b5d11dfa14611400576102fd565b806398455999146110a95780639ecbec4114611296578063a8203abb146112c0576102fd565b80637aed121414610da75780638da5cb5b14610dbc57806392b9377414610dd1578063931323661461104f57806395d89b41146110645780639818e66c14611079576102fd565b80633eaaf86b1161024f5780635c60da1b1161020857806370a08231116101e257806370a0823114610c9257806374ed9ae414610cc55780637641e6f314610cda57806379ba509714610d92576102fd565b80635c60da1b14610c0d5780635d87b6e614610c3e578063676a96d814610c68576102fd565b80633eaaf86b146109be578063438787d0146109d357806344cc3c7f14610a085780634509b7e014610b455780634c1782e514610b7e5780634f74787b14610be3576102fd565b80631ea1afdb116102bc578063246439e611610296578063246439e6146106de578063313ce567146106f35780633701f5821461071e5780633ea5b5ed14610994576102fd565b80631ea1afdb146105635780632118c02c1461058d57806323b872dd1461069b576102fd565b80628a81a614610302578062d74970146103a157806306fdde0314610422578063095ea7b31461043757806314e9f3841461048457806318160ddd1461053c575b600080fd5b34801561030e57600080fd5b5061032c6004803603602081101561032557600080fd5b5035611887565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561036657818101518382015260200161034e565b50505050905090810190601f1680156103935780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156103ad57600080fd5b506103cb600480360360208110156103c457600080fd5b50356119f9565b604080516001600160a01b03909916895260ff97881660208a0152958716888701529386166060880152918516608087015261ffff1660a086015290921660c084015260e083019190915251908190036101000190f35b34801561042e57600080fd5b5061032c611bdf565b34801561044357600080fd5b506104706004803603604081101561045a57600080fd5b506001600160a01b038135169060200135611c6d565b604080519115158252519081900360200190f35b34801561049057600080fd5b50610470600480360360408110156104a757600080fd5b81359190810190604081016020820135600160201b8111156104c857600080fd5b8201836020820111156104da57600080fd5b803590602001918460018302840111600160201b831117156104fb57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611cd4945050505050565b34801561054857600080fd5b50610551611e18565b60408051918252519081900360200190f35b34801561056f57600080fd5b506104706004803603602081101561058657600080fd5b5035611e4b565b34801561059957600080fd5b506105bd600480360360408110156105b057600080fd5b5080359060200135611fb8565b604051808060200180602001838103835285818151815260200191508051906020019080838360005b838110156105fe5781810151838201526020016105e6565b50505050905090810190601f16801561062b5780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b8381101561065e578181015183820152602001610646565b50505050905090810190601f16801561068b5780820380516001836020036101000a031916815260200191505b5094505050505060405180910390f35b3480156106a757600080fd5b50610470600480360360608110156106be57600080fd5b506001600160a01b03813581169160208101359091169060400135612215565b3480156106ea57600080fd5b50610551612399565b3480156106ff57600080fd5b506107086123ba565b6040805160ff9092168252519081900360200190f35b34801561072a57600080fd5b50610551600480360361014081101561074257600080fd5b60ff823581169260208101358216926040820135831692606083013581169261ffff6080820135169260a08201359092169181019060e0810160c0820135600160201b81111561079157600080fd5b8201836020820111156107a357600080fd5b803590602001918460018302840111600160201b831117156107c457600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b81111561081657600080fd5b82018360208201111561082857600080fd5b803590602001918460018302840111600160201b8311171561084957600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b81111561089b57600080fd5b8201836020820111156108ad57600080fd5b803590602001918460018302840111600160201b831117156108ce57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b81111561092057600080fd5b82018360208201111561093257600080fd5b803590602001918460018302840111600160201b8311171561095357600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506123c3945050505050565b3480156109a057600080fd5b50610551600480360360208110156109b757600080fd5b5035612892565b3480156109ca57600080fd5b5061055161293c565b3480156109df57600080fd5b50610a06600480360360208110156109f657600080fd5b50356001600160a01b0316612942565b005b348015610a1457600080fd5b5061055160048036036060811015610a2b57600080fd5b81359190810190604081016020820135600160201b811115610a4c57600080fd5b820183602082011115610a5e57600080fd5b803590602001918460018302840111600160201b83111715610a7f57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b811115610ad157600080fd5b820183602082011115610ae357600080fd5b803590602001918460018302840111600160201b83111715610b0457600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506129ad945050505050565b348015610b5157600080fd5b5061047060048036036040811015610b6857600080fd5b50803590602001356001600160a01b0316612b07565b348015610b8a57600080fd5b50610b93612c6a565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610bcf578181015183820152602001610bb7565b505050509050019250505060405180910390f35b348015610bef57600080fd5b506103cb60048036036020811015610c0657600080fd5b5035612ce3565b348015610c1957600080fd5b50610c22612ec6565b604080516001600160a01b039092168252519081900360200190f35b348015610c4a57600080fd5b5061055160048036036020811015610c6157600080fd5b5035612ed5565b348015610c7457600080fd5b50610a0660048036036020811015610c8b57600080fd5b5035612f59565b348015610c9e57600080fd5b5061055160048036036020811015610cb557600080fd5b50356001600160a01b03166130c9565b348015610cd157600080fd5b50610c226130e4565b348015610ce657600080fd5b50610a0660048036036040811015610cfd57600080fd5b81359190810190604081016020820135600160201b811115610d1e57600080fd5b820183602082011115610d3057600080fd5b803590602001918460018302840111600160201b83111715610d5157600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506130f3945050505050565b348015610d9e57600080fd5b50610a066131bc565b348015610db357600080fd5b50610551613237565b348015610dc857600080fd5b50610c22613258565b348015610ddd57600080fd5b506105516004803603610160811015610df557600080fd5b60ff823581169260208101358216926040820135831692606083013581169261ffff6080820135169260a082013583169260c0830135169190810190610100810160e0820135600160201b811115610e4c57600080fd5b820183602082011115610e5e57600080fd5b803590602001918460018302840111600160201b83111715610e7f57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b811115610ed157600080fd5b820183602082011115610ee357600080fd5b803590602001918460018302840111600160201b83111715610f0457600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b811115610f5657600080fd5b820183602082011115610f6857600080fd5b803590602001918460018302840111600160201b83111715610f8957600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b811115610fdb57600080fd5b820183602082011115610fed57600080fd5b803590602001918460018302840111600160201b8311171561100e57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550613267945050505050565b34801561105b57600080fd5b50610b93613878565b34801561107057600080fd5b5061032c6138ef565b34801561108557600080fd5b506105516004803603604081101561109c57600080fd5b508035906020013561394a565b3480156110b557600080fd5b506110d3600480360360208110156110cc57600080fd5b50356141c9565b60405180866001600160a01b03166001600160a01b0316815260200180602001806020018060200180602001858103855289818151815260200191508051906020019080838360005b8381101561113457818101518382015260200161111c565b50505050905090810190601f1680156111615780820380516001836020036101000a031916815260200191505b5085810384528851815288516020918201918a019080838360005b8381101561119457818101518382015260200161117c565b50505050905090810190601f1680156111c15780820380516001836020036101000a031916815260200191505b50858103835287518152875160209182019189019080838360005b838110156111f45781810151838201526020016111dc565b50505050905090810190601f1680156112215780820380516001836020036101000a031916815260200191505b50858103825286518152865160209182019188019080838360005b8381101561125457818101518382015260200161123c565b50505050905090810190601f1680156112815780820380516001836020036101000a031916815260200191505b50995050505050505050505060405180910390f35b3480156112a257600080fd5b50610a06600480360360208110156112b957600080fd5b503561452c565b3480156112cc57600080fd5b50610b936146e1565b3480156112e157600080fd5b50610470600480360360408110156112f857600080fd5b506001600160a01b038135169060200135614758565b34801561131a57600080fd5b506113386004803603602081101561133157600080fd5b503561476e565b604080516001600160a01b03909a168a5260ff98891660208b0152968816898801529487166060890152928616608088015261ffff90911660a087015290931660c085015260e084019290925263ffffffff90911661010083015251908190036101200190f35b3480156113ab57600080fd5b506113c9600480360360208110156113c257600080fd5b503561499f565b604080516001600160a01b039687168152949095166020850152838501929092526060830152608082015290519081900360a00190f35b34801561140c57600080fd5b506105516004803603606081101561142357600080fd5b81359190810190604081016020820135600160201b81111561144457600080fd5b82018360208201111561145657600080fd5b803590602001918460018302840111600160201b8311171561147757600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b8111156114c957600080fd5b8201836020820111156114db57600080fd5b803590602001918460018302840111600160201b831117156114fc57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550614ae8945050505050565b34801561154957600080fd5b506104706004803603606081101561156057600080fd5b6001600160a01b0382351691602081013591810190606081016040820135600160201b81111561158f57600080fd5b8201836020820111156115a157600080fd5b803590602001918460018302840111600160201b831117156115c257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550614c48945050505050565b34801561160f57600080fd5b506104706004803603602081101561162657600080fd5b5035614d90565b34801561163957600080fd5b50610a066004803603606081101561165057600080fd5b6001600160a01b0382351691602081013591810190606081016040820135600160201b81111561167f57600080fd5b82018360208201111561169157600080fd5b803590602001918460018302840111600160201b831117156116b257600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550614f69945050505050565b3480156116ff57600080fd5b50610c2261507c565b34801561171457600080fd5b506110d36004803603602081101561172b57600080fd5b503561508b565b34801561173e57600080fd5b506104706004803603604081101561175557600080fd5b506001600160a01b0381351690602001356151ff565b34801561177757600080fd5b506105516004803603604081101561178e57600080fd5b506001600160a01b03813581169160200135166152d3565b3480156117b257600080fd5b50610551600480360360208110156117c957600080fd5b50356152fe565b3480156117dc57600080fd5b50610551615382565b3480156117f157600080fd5b506104706004803603602081101561180857600080fd5b50356153a3565b34801561181b57600080fd5b50610a066004803603602081101561183257600080fd5b50356001600160a01b03166155bc565b34801561184e57600080fd5b506105bd6004803603604081101561186557600080fd5b5080359060200135615627565b34801561187e57600080fd5b50610c226157bb565b6002546060906001600160a01b031633146118a157600080fd5b60155482106118e5576040805162461bcd60e51b815260206004820152600b60248201526a1a591e081a5b9d985b1a5960aa1b604482015290519081900360640190fd5b6000601583815481106118f457fe5b60009182526020909120600c9091020190506002600b82015460ff16600381111561191b57fe5b14611964576040805162461bcd60e51b81526020600482015260146024820152731bdc99195c881b5d5cdd0818994818db1bdcd95960621b604482015290519081900360640190fd5b60098101805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156119ec5780601f106119c1576101008083540402835291602001916119ec565b820191906000526020600020905b8154815290600101906020018083116119cf57829003601f168201915b5050505050915050919050565b60025460009081908190819081908190819081906001600160a01b03163314611a2157600080fd5b6014548910611a65576040805162461bcd60e51b815260206004820152600b60248201526a1a591e081a5b9d985b1a5960aa1b604482015290519081900360640190fd5b60148981548110611a7257fe5b600091825260209091206007600890920201015460ff166002811115611a9457fe5b905060148981548110611aa357fe5b6000918252602090912060089091020154601480546001600160a01b03909216918b908110611ace57fe5b906000526020600020906008020160000160149054906101000a900460ff1660148b81548110611afa57fe5b906000526020600020906008020160000160159054906101000a900460ff1660148c81548110611b2657fe5b906000526020600020906008020160000160169054906101000a900460ff1660148d81548110611b5257fe5b906000526020600020906008020160000160179054906101000a900460ff1660148e81548110611b7e57fe5b906000526020600020906008020160000160189054906101000a900461ffff1660148f81548110611bab57fe5b6000918252602090912060089091020154959f949e50929c50909a5098509650600160d01b90910460ff1694509092509050565b6004805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015611c655780601f10611c3a57610100808354040283529160200191611c65565b820191906000526020600020905b815481529060010190602001808311611c4857829003601f168201915b505050505081565b3360008181526008602090815260408083206001600160a01b038716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a35060015b92915050565b6002546000906001600160a01b03163314611cee57600080fd5b6015548310611d32576040805162461bcd60e51b815260206004820152600b60248201526a1a591e081a5b9d985b1a5960aa1b604482015290519081900360640190fd5b600060158481548110611d4157fe5b60009182526020909120600c9091020190506001600b82015460ff166003811115611d6857fe5b14611db5576040805162461bcd60e51b81526020600482015260186024820152776f72646572206d7573742062652070726f63657373696e6760401b604482015290519081900360640190fd5b8251611dca9060098301906020860190615df0565b50600b8101805460ff191660021790556040805185815290517f82c71af4e0a9a239768fac6f9df215013913a0cc66faa82cbc9acd3299b7fc32916020908290030190a15060019392505050565b6000805260076020527f6d5257204ebe7d88fd91ae87941cb2dd9d8062b64ae5a2bd2d28ec40b9fbf6df54600654035b90565b600073ae7488b3aacb8415be66d78c05d279ba5a86820e3314611e9f5760405162461bcd60e51b815260040180806020018281038252602c815260200180615eab602c913960400191505060405180910390fd5b600060158381548110611eae57fe5b60009182526020909120600c9091020190506002600b82015460ff166003811115611ed557fe5b14611f1e576040805162461bcd60e51b81526020600482015260146024820152731bdc99195c881b5d5cdd0818994818db1bdcd95960621b604482015290519081900360640190fd5b60006013826005015481548110611f3157fe5b600091825260209091206009909102018054600a84015491925061ffff600160c01b82041691909102670de0b6b3a76400000290611f7a9030906001600160a01b0316836157ca565b6040805186815290517f1d58276cd8287e9f5f935672f809d99bf1dc6efa93ef34c6fffb66b45dcda5b69181900360200190a1506001949350505050565b60025460609081906001600160a01b03163314611fd457600080fd5b6014548410612018576040805162461bcd60e51b815260206004820152600b60248201526a1a591e081a5b9d985b1a5960aa1b604482015290519081900360640190fd5b6014848154811061202557fe5b906000526020600020906008020160060154831061207c576040805162461bcd60e51b815260206004820152600f60248201526e1b5d19081a591e081a5b9d985b1a59608a1b604482015290519081900360640190fd5b6014848154811061208957fe5b90600052602060002090600802016005016000848152602001908152602001600020600001601485815481106120bb57fe5b90600052602060002090600802016005016000858152602001908152602001600020600101818054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156121755780601f1061214a57610100808354040283529160200191612175565b820191906000526020600020905b81548152906001019060200180831161215857829003601f168201915b5050845460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152959750869450925084019050828280156122035780601f106121d857610100808354040283529160200191612203565b820191906000526020600020905b8154815290600101906020018083116121e657829003601f168201915b50505050509050915091509250929050565b6001600160a01b038316600090815260076020526040812054821115612279576040805162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b604482015290519081900360640190fd5b6122848484846159aa565b61228d57600080fd5b6001600160a01b03841660009081526008602090815260408083203384529091529020546122c1908363ffffffff615b5516565b6001600160a01b038516600081815260086020908152604080832033845282528083209490945591815260079091522054612302908363ffffffff615b5516565b6001600160a01b038086166000908152600760205260408082209390935590851681522054612337908363ffffffff615b6a16565b6001600160a01b0380851660008181526007602090815260409182902094909455805186815290519193928816927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a35060015b9392505050565b6002546000906001600160a01b031633146123b357600080fd5b5060155490565b60055460ff1681565b6002546000906001600160a01b031633146123dd57600080fd5b60008b60ff161180156123f3575060ff8b811611155b612432576040805162461bcd60e51b815260206004820152600b60248201526a18dc1d481a5b9d985b1a5960aa1b604482015290519081900360640190fd5b60008a60ff16118015612448575060ff8a811611155b612487576040805162461bcd60e51b815260206004820152600b60248201526a1b595b481a5b9d985b1a5960aa1b604482015290519081900360640190fd5b60008860ff1611801561249d575060ff88811611155b6124db576040805162461bcd60e51b815260206004820152600a602482015269189dc81a5b9d985b1a5960b21b604482015290519081900360640190fd5b60008960ff161180156124f1575060ff89811611155b612531576040805162461bcd60e51b815260206004820152600c60248201526b1cdd1c99c81a5b9d985b1a5960a21b604482015290519081900360640190fd5b60176000336001600160a01b03166001600160a01b03168152602001908152602001600020601480549050908060018154018082558091505090600182039060005260206000200160009091929091909150555060016014604051806101e00160405280336001600160a01b031681526020018e60ff1681526020018d60ff1681526020018c60ff1681526020018b60ff1681526020018a61ffff16815260200160648a600f0260ff16816125e257fe5b048a0160ff1681526020014263ffffffff168152602001600060ff168152602001888152602001878152602001868152602001858152602001600081526020016000600281111561262f57fe5b8152509080600181540180825580915050906001820390600052602060002090600802016000909192909190915060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160000160146101000a81548160ff021916908360ff16021790555060408201518160000160156101000a81548160ff021916908360ff16021790555060608201518160000160166101000a81548160ff021916908360ff16021790555060808201518160000160176101000a81548160ff021916908360ff16021790555060a08201518160000160186101000a81548161ffff021916908361ffff16021790555060c082015181600001601a6101000a81548160ff021916908360ff16021790555060e082015181600001601b6101000a81548163ffffffff021916908363ffffffff16021790555061010082015181600001601f6101000a81548160ff021916908360ff1602179055506101208201518160010190805190602001906127b8929190615df0565b5061014082015180516127d5916002840191602090910190615df0565b5061016082015180516127f2916003840191602090910190615df0565b50610180820151805161280f916004840191602090910190615df0565b506101a082015160068201556101c082015160078201805460ff1916600183600281111561283957fe5b02179055505050039050336001600160a01b03167f4c8c70b2a4a4432c71bae55aa7d26fd87cad0deea0ba1aff77d2fb64c9136d8e826040518082815260200191505060405180910390a29a9950505050505050505050565b6002546000906001600160a01b031633146128ac57600080fd5b60155482106128f0576040805162461bcd60e51b815260206004820152600b60248201526a1a591e081a5b9d985b1a5960aa1b604482015290519081900360640190fd5b6013601583815481106128ff57fe5b90600052602060002090600c0201600501548154811061291b57fe5b6000918252602090912060099091020154600160d01b900460ff1692915050565b60065481565b6000546001600160a01b0316331461298b5760405162461bcd60e51b8152600401808060200182810382526022815260200180615e896022913960400191505060405180910390fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b6002546000906001600160a01b031633146129c757600080fd5b6013548410612a0b576040805162461bcd60e51b815260206004820152600b60248201526a1a591e081a5b9d985b1a5960aa1b604482015290519081900360640190fd5b60138481548110612a1857fe5b60009182526020909120600990910201546001600160a01b03163314612a7f576040805162461bcd60e51b815260206004820152601760248201527630b63637bbb2b21037b7363c903337b9103237bbb732b960491b604482015290519081900360640190fd5b600060138581548110612a8e57fe5b60009182526020808320600760099093020191820154835260068201815260409092208651919350612ac592909190870190615df0565b506007810154600090815260068201602090815260409091208451612af292600190920191860190615df0565b50600701805460018101909155949350505050565b6002546000906001600160a01b03163314612b2157600080fd5b6015548310612b65576040805162461bcd60e51b815260206004820152600b60248201526a1a591e081a5b9d985b1a5960aa1b604482015290519081900360640190fd5b600060158481548110612b7457fe5b60009182526020909120600c90910201805490915061010090046001600160a01b03163314612be1576040805162461bcd60e51b8152602060048201526014602482015273616c6c6f7764206f6e6c7920746f206470726f6360601b604482015290519081900360640190fd5b6001600b82015460ff166003811115612bf657fe5b14612c43576040805162461bcd60e51b81526020600482015260186024820152776f72646572206d7573742062652070726f63657373696e6760401b604482015290519081900360640190fd5b60020180546001600160a01b0384166001600160a01b031990911617905550600192915050565b6002546060906001600160a01b03163314612c8457600080fd5b3360009081526017602090815260409182902080548351818402810184019094528084529091830182828015612cd957602002820191906000526020600020905b815481526020019060010190808311612cc5575b5050505050905090565b60025460009081908190819081908190819081906001600160a01b03163314612d0b57600080fd5b6013548910612d4f576040805162461bcd60e51b815260206004820152600b60248201526a1a591e081a5b9d985b1a5960aa1b604482015290519081900360640190fd5b60138981548110612d5c57fe5b600091825260209091206008600990920201015460ff166002811115612d7e57fe5b905060138981548110612d8d57fe5b6000918252602090912060099091020154601380546001600160a01b03909216918b908110612db857fe5b906000526020600020906009020160000160149054906101000a900460ff1660138b81548110612de457fe5b906000526020600020906009020160000160159054906101000a900460ff1660138c81548110612e1057fe5b906000526020600020906009020160000160169054906101000a900460ff1660138d81548110612e3c57fe5b906000526020600020906009020160000160179054906101000a900460ff1660138e81548110612e6857fe5b906000526020600020906009020160000160189054906101000a900461ffff1660138f81548110612e9557fe5b6000918252602090912060099091020160010154959f949e50929c50909a509850965060ff90911694509092509050565b6009546001600160a01b031681565b6002546000906001600160a01b03163314612eef57600080fd5b6013548210612f33576040805162461bcd60e51b815260206004820152600b60248201526a1a591e081a5b9d985b1a5960aa1b604482015290519081900360640190fd5b60138281548110612f4057fe5b9060005260206000209060090201600701549050919050565b6002546001600160a01b03163314612f7057600080fd5b6014548110612fb4576040805162461bcd60e51b815260206004820152600b60248201526a1a591e081a5b9d985b1a5960aa1b604482015290519081900360640190fd5b60148181548110612fc157fe5b60009182526020909120600890910201546001600160a01b0316331461302e576040805162461bcd60e51b815260206004820152601f60248201527f616c6c6f776564206f6e6c7920666f722064656c6567617465642070726f6300604482015290519081900360640190fd5b60006014828154811061303d57fe5b6000918252602082206008909102019150600782015460ff16600281111561306157fe5b146130ae576040805162461bcd60e51b8152602060048201526018602482015277737461747573206d75737420626520617661696c61626c6560401b604482015290519081900360640190fd5b6007810180546002919060ff19166001835b02179055505050565b6001600160a01b031660009081526007602052604090205490565b600a546001600160a01b031681565b6130fd3383615b7a565b7f47e772fda56eb54ab211642ce5421882c49fc2b7033455982af14588ae4207ff33838360405180846001600160a01b03166001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561317c578181015183820152602001613164565b50505050905090810190601f1680156131a95780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a15050565b6001546001600160a01b031633146131d357600080fd5b600154600080546040516001600160a01b0393841693909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a360018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b6002546000906001600160a01b0316331461325157600080fd5b5060135490565b6000546001600160a01b031681565b6002546000906001600160a01b0316331461328157600080fd5b3360009081526007602052604090205461ffff60ff888a02168a0216670de0b6b3a76400000211156132f1576040805162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b604482015290519081900360640190fd5b60008760ff161180156133085750600a60ff881611155b61334c576040805162461bcd60e51b815260206004820152601060248201526f1a5b9cdd185b98d9481a5b9d985b1a5960821b604482015290519081900360640190fd5b60008c60ff16118015613362575060ff8c811611155b6133a1576040805162461bcd60e51b815260206004820152600b60248201526a18dc1d481a5b9d985b1a5960aa1b604482015290519081900360640190fd5b60008b60ff161180156133b7575060ff8b811611155b6133f6576040805162461bcd60e51b815260206004820152600b60248201526a1b595b481a5b9d985b1a5960aa1b604482015290519081900360640190fd5b60008960ff1611801561340c575060ff89811611155b61344a576040805162461bcd60e51b815260206004820152600a602482015269189dc81a5b9d985b1a5960b21b604482015290519081900360640190fd5b60008a60ff16118015613460575060ff8a811611155b6134a0576040805162461bcd60e51b815260206004820152600c60248201526b1cdd1c99c81a5b9d985b1a5960a21b604482015290519081900360640190fd5b6134be333061ffff60ff8a168c0216670de0b6b3a7640000026157ca565b60166000336001600160a01b03166001600160a01b03168152602001908152602001600020601380549050908060018154018082558091505090600182039060005260206000200160009091929091909150555060016013604051806102200160405280336001600160a01b031681526020018f60ff1681526020018e60ff1681526020018d60ff1681526020018c60ff1681526020018b61ffff1681526020018a60ff168152602001600060ff1681526020014263ffffffff1681526020018960ff1681526020018b8b8b0260ff160261ffff1663ffffffff16815260200188815260200187815260200186815260200185815260200160008152602001600060028111156135ca57fe5b8152509080600181540180825580915050906001820390600052602060002090600902016000909192909190915060008201518160000160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555060208201518160000160146101000a81548160ff021916908360ff16021790555060408201518160000160156101000a81548160ff021916908360ff16021790555060608201518160000160166101000a81548160ff021916908360ff16021790555060808201518160000160176101000a81548160ff021916908360ff16021790555060a08201518160000160186101000a81548161ffff021916908361ffff16021790555060c082015181600001601a6101000a81548160ff021916908360ff16021790555060e082015181600001601b6101000a81548160ff021916908360ff16021790555061010082015181600001601c6101000a81548163ffffffff021916908363ffffffff1602179055506101208201518160010160006101000a81548160ff021916908360ff1602179055506101408201518160010160016101000a81548163ffffffff021916908363ffffffff16021790555061016082015181600201908051906020019061379d929190615df0565b5061018082015180516137ba916003840191602090910190615df0565b506101a082015180516137d7916004840191602090910190615df0565b506101c082015180516137f4916005840191602090910190615df0565b506101e0820151600782015561020082015160088201805460ff1916600183600281111561381e57fe5b02179055505050039050336001600160a01b03167feccaef2766efce444edd10aa43fdedc15db863e63aaac53a1325b0e878e6bc7c826040518082815260200191505060405180910390a29b9a5050505050505050505050565b6002546060906001600160a01b0316331461389257600080fd5b3360009081526016602090815260409182902080548351818402810184019094528084529091830182828015612cd95760200282019190600052602060002090815481526020019060010190808311612cc5575050505050905090565b6003805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015611c655780601f10611c3a57610100808354040283529160200191611c65565b6002546000906001600160a01b0316331461396457600080fd5b60135483106139a8576040805162461bcd60e51b815260206004820152600b60248201526a1a591e081a5b9d985b1a5960aa1b604482015290519081900360640190fd5b60145482106139f2576040805162461bcd60e51b8152602060048201526011602482015270191c1c881a5b99195e081a5b9d985b1a59607a1b604482015290519081900360640190fd5b600060138481548110613a0157fe5b6000918252602082206009909102019150600882015460ff166002811115613a2557fe5b14613a72576040805162461bcd60e51b8152602060048201526018602482015277737461747573206d75737420626520617661696c61626c6560401b604482015290519081900360640190fd5b600581018054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015613b005780601f10613ad557610100808354040283529160200191613b00565b820191906000526020600020905b815481529060010190602001808311613ae357829003601f168201915b5050505050905060008060148681548110613b1757fe5b60009182526020918290206002600890920201818101805460408051601f60001961010060018616150201909316959095049182018690048602850186019052808452919450606093909190830182828015613bb45780601f10613b8957610100808354040283529160200191613bb4565b820191906000526020600020905b815481529060010190602001808311613b9757829003601f168201915b5050855460018a015494955060ff600160d01b9091048116941693909310159250613c20915050576040805162461bcd60e51b81526020600482015260146024820152730e0e4d2c6ca40c8decae640dcdee840dac2e8c6d60631b604482015290519081900360640190fd5b6000815111613c6b576040805162461bcd60e51b81526020600482015260126024820152711b595d1859185d184c881c995c5d5a5c995960721b604482015290519081900360640190fd5b835115613d0e57600585018054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152613d0b9390929091830182828015613d015780601f10613cd657610100808354040283529160200191613d01565b820191906000526020600020905b815481529060010190602001808311613ce457829003601f168201915b5050505050615bde565b92505b83511580613d2457506001600160a01b03831633145b613d6c576040805162461bcd60e51b81526020600482015260146024820152731b9bd919481859191c995cdcc81a5b9d985b1a5960621b604482015290519081900360640190fd5b6000600783015460ff166002811115613d8157fe5b14613dce576040805162461bcd60e51b8152602060048201526018602482015277737461747573206d75737420626520617661696c61626c6560401b604482015290519081900360640190fd5b81546001600160a01b0316331480613def575084546001600160a01b031633145b613e40576040805162461bcd60e51b815260206004820152601760248201527f696e76616c696420646f776e6572206f72206470726f63000000000000000000604482015290519081900360640190fd5b81546000906001600160a01b0316331415613e66575081546001600160a01b0316613e73565b5084546001600160a01b03165b855460ff60d81b198116600160d81b9182900460ff9081166001018116830291909117808955600160d01b81048216929004161415613ebc5760088601805460ff191660011790555b60078301805460ff1916600190811790915583546001600160a01b0390811660009081526018602090815260408083206015805482548089018455928652848620909201919091558b5490941683528220925483549485018455928252812090920155855115613f2a575060015b6040805161018081018252885460ff600160d81b82048116835287546001600160a01b0390811660208086019190915292811684860152600060608501819052908716608085015260a084018e905260c084018f905263ffffffff421660e0850152610100840181905284519283019094529281526101208201526001898101549092166101408201526015906101608101846003811115613fc857fe5b90528154600180820180855560009485526020948590208451600c9094020180548587015160ff1990911660ff90951694909417610100600160a81b0319166101006001600160a01b039586168102919091178255604086015193820180546001600160a01b031990811695871695909517905560608601516002830180548616918716919091179055608086015160038301805490951695169490941790925560a0840151600483015560c0840151600583015560e084015160068301559183015160088201556101208301518051929491926140ac9260098501920190615df0565b50610140820151600a820155610160820151600b8201805460ff191660018360038111156140d657fe5b02179055505050039750336001600160a01b03167fdc3a6d828aee9328544a5092f889da39f808a288f223812d4ab33b59c60867c6896040518082815260200191505060405180910390a260408051898152602081018c90528082018b905290517f52ec990a555aaad1a6395f34d1532ac11fa3c72139719d9469c880315c01806d9181900360600190a18551156141bc5786548454601554604080516001600160a01b0393841681526000199092016020830152805192909316927f9b30afe0f76574363e78b150c33c302dafe8c2a0dbe597cda7938b0ba721a2a592918290030190a25b5050505050505092915050565b6002546000906060908190819081906001600160a01b031633146141ec57600080fd5b6014548610614230576040805162461bcd60e51b815260206004820152600b60248201526a1a591e081a5b9d985b1a5960aa1b604482015290519081900360640190fd5b6014868154811061423d57fe5b6000918252602090912060089091020154601480546001600160a01b03909216918890811061426857fe5b90600052602060002090600802016001016014888154811061428657fe5b9060005260206000209060080201600201601489815481106142a457fe5b906000526020600020906008020160030160148a815481106142c257fe5b9060005260206000209060080201600401838054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156143685780601f1061433d57610100808354040283529160200191614368565b820191906000526020600020905b81548152906001019060200180831161434b57829003601f168201915b5050865460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152959950889450925084019050828280156143f65780601f106143cb576101008083540402835291602001916143f6565b820191906000526020600020905b8154815290600101906020018083116143d957829003601f168201915b5050855460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152959850879450925084019050828280156144845780601f1061445957610100808354040283529160200191614484565b820191906000526020600020905b81548152906001019060200180831161446757829003601f168201915b5050845460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152959750869450925084019050828280156145125780601f106144e757610100808354040283529160200191614512565b820191906000526020600020905b8154815290600101906020018083116144f557829003601f168201915b505050505090509450945094509450945091939590929450565b6002546001600160a01b0316331461454357600080fd5b6013548110614587576040805162461bcd60e51b815260206004820152600b60248201526a1a591e081a5b9d985b1a5960aa1b604482015290519081900360640190fd5b6013818154811061459457fe5b60009182526020909120600990910201546001600160a01b031633146145fb576040805162461bcd60e51b815260206004820152601760248201527630b63637bbb2b21037b7363c903337b9103237bbb732b960491b604482015290519081900360640190fd5b60006013828154811061460a57fe5b6000918252602082206009909102019150600882015460ff16600281111561462e57fe5b14801561464457508054600160d81b900460ff16155b614690576040805162461bcd60e51b8152602060048201526018602482015277737461747573206d75737420626520617661696c61626c6560401b604482015290519081900360640190fd5b805460018201546146cb9130916001600160a01b0382169160ff90911661ffff600160c01b90920482160216670de0b6b3a7640000026157ca565b6008810180546002919060ff19166001836130c0565b6002546060906001600160a01b031633146146fb57600080fd5b3360009081526018602090815260409182902080548351818402810184019094528084529091830182828015612cd95760200282019190600052602060002090815481526020019060010190808311612cc5575050505050905090565b60006147653384846157ca565b50600192915050565b6000806000806000806000806000600260009054906101000a90046001600160a01b03166001600160a01b0316336001600160a01b0316146147af57600080fd5b6014548a106147f3576040805162461bcd60e51b815260206004820152600b60248201526a1a591e081a5b9d985b1a5960aa1b604482015290519081900360640190fd5b60148a8154811061480057fe5b600091825260209091206007600890920201015460ff16600281111561482257fe5b915060148a8154811061483157fe5b9060005260206000209060080201600001601b9054906101000a900463ffffffff16905060148a8154811061486257fe5b9060005260206000209060080201600001601a9054906101000a900460ff16925060148a8154811061489057fe5b6000918252602090912060089091020154601480546001600160a01b03909216918c9081106148bb57fe5b906000526020600020906008020160000160149054906101000a900460ff1660148c815481106148e757fe5b906000526020600020906008020160000160159054906101000a900460ff1660148d8154811061491357fe5b906000526020600020906008020160000160169054906101000a900460ff1660148e8154811061493f57fe5b906000526020600020906008020160000160179054906101000a900460ff1660148f8154811061496b57fe5b6000918252602090912060089091020154949f939e50919c509a509850600160c01b90910461ffff16965092945090925090565b60025460009081908190819081906001600160a01b031633146149c157600080fd5b6013548610614a05576040805162461bcd60e51b815260206004820152600b60248201526a1a591e081a5b9d985b1a5960aa1b604482015290519081900360640190fd5b60158681548110614a1257fe5b90600052602060002090600c020160010160009054906101000a90046001600160a01b031660158781548110614a4457fe5b90600052602060002090600c020160000160019054906101000a90046001600160a01b031660158881548110614a7657fe5b90600052602060002090600c02016005015460158981548110614a9557fe5b90600052602060002090600c02016004015460158a81548110614ab457fe5b60009182526020909120600b600c90920201015460ff166003811115614ad657fe5b939a9299509097509550909350915050565b6002546000906001600160a01b03163314614b0257600080fd5b6014548410614b46576040805162461bcd60e51b815260206004820152600b60248201526a1a591e081a5b9d985b1a5960aa1b604482015290519081900360640190fd5b60148481548110614b5357fe5b60009182526020909120600890910201546001600160a01b03163314614bc0576040805162461bcd60e51b815260206004820181905260248201527f616c6c6f776564206f6e6c7920666f722064656c6567617465642070726f6373604482015290519081900360640190fd5b600060148581548110614bcf57fe5b60009182526020808320600660089093020191820154835260058201815260409092208651919350614c0692909190870190615df0565b506006810154600090815260058201602090815260409091208451614c3392600190920191860190615df0565b50600601805460018101909155949350505050565b3360008181526008602090815260408083206001600160a01b038816808552908352818420879055815187815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a3604051638f4ffcb160e01b815233600482018181526024830186905230604484018190526080606485019081528651608486015286516001600160a01b038a1695638f4ffcb195948a94938a939192909160a490910190602085019080838360005b83811015614d1f578181015183820152602001614d07565b50505050905090810190601f168015614d4c5780820380516001836020036101000a031916815260200191505b5095505050505050600060405180830381600087803b158015614d6e57600080fd5b505af1158015614d82573d6000803e3d6000fd5b506001979650505050505050565b600073ae7488b3aacb8415be66d78c05d279ba5a86820e3314614de45760405162461bcd60e51b815260040180806020018281038252602c815260200180615eab602c913960400191505060405180910390fd5b600060158381548110614df357fe5b60009182526020909120600c9091020190506002600b82015460ff166003811115614e1a57fe5b14614e63576040805162461bcd60e51b81526020600482015260146024820152731bdc99195c881b5d5cdd0818994818db1bdcd95960621b604482015290519081900360640190fd5b60006013826005015481548110614e7657fe5b6000918252602082206009909102018054600a85015491935061ffff600160c01b9091041602670de0b6b3a76400000290738082eda439226540c1ffea3759cd267d044dca2b90730457e4d1f0085a84dd5f470f36575f69f815813c90614ede846005615d79565b90506000614eed85600a615d79565b8754909150614f1190309061010090046001600160a01b03168488038490036157ca565b614f1c3085846157ca565b614f273084836157ca565b604080518a815290517fb1c39ae9e5276f66f3a413fd02db269d80bbc55f61afd375917e7bbae368230f9181900360200190a150600198975050505050505050565b6000546001600160a01b03163314614fb25760405162461bcd60e51b8152600401808060200182810382526022815260200180615e896022913960400191505060405180910390fd5b614fbc8383615d89565b7f85a66b9141978db9980f7e0ce3b468cebf4f7999f32b23091c5c03e798b1ba7a83838360405180846001600160a01b03166001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561503b578181015183820152602001615023565b50505050905090810190601f1680156150685780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a1505050565b6001546001600160a01b031681565b6002546000906060908190819081906001600160a01b031633146150ae57600080fd5b60135486106150f2576040805162461bcd60e51b815260206004820152600b60248201526a1a591e081a5b9d985b1a5960aa1b604482015290519081900360640190fd5b601386815481106150ff57fe5b6000918252602090912060099091020154601380546001600160a01b03909216918890811061512a57fe5b90600052602060002090600902016002016013888154811061514857fe5b90600052602060002090600902016003016013898154811061516657fe5b906000526020600020906009020160040160138a8154811061518457fe5b9060005260206000209060090201600501838054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156143685780601f1061433d57610100808354040283529160200191614368565b600080546001600160a01b031633146152495760405162461bcd60e51b8152600401808060200182810382526022815260200180615e896022913960400191505060405180910390fd5b600080546040805163a9059cbb60e01b81526001600160a01b0392831660048201526024810186905290519186169263a9059cbb926044808401936020939083900390910190829087803b1580156152a057600080fd5b505af11580156152b4573d6000803e3d6000fd5b505050506040513d60208110156152ca57600080fd5b50519392505050565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205490565b6002546000906001600160a01b0316331461531857600080fd5b601454821061535c576040805162461bcd60e51b815260206004820152600b60248201526a1a591e081a5b9d985b1a5960aa1b604482015290519081900360640190fd5b6014828154811061536957fe5b9060005260206000209060080201600601549050919050565b6002546000906001600160a01b0316331461539c57600080fd5b5060145490565b6002546000906001600160a01b031633146153bd57600080fd5b6015548210615401576040805162461bcd60e51b815260206004820152600b60248201526a1a591e081a5b9d985b1a5960aa1b604482015290519081900360640190fd5b60006015838154811061541057fe5b60009182526020909120600c9091020160018101549091506001600160a01b031633148061544c5750805461010090046001600160a01b031633145b61549d576040805162461bcd60e51b815260206004820152601760248201527f646f776e6572206f72206470726f6320696e76616c6964000000000000000000604482015290519081900360640190fd5b60038101546001600160a01b03163314156154f2576040805162461bcd60e51b815260206004820152601060248201526f34b73b30b634b21030b8383937bb32b960811b604482015290519081900360640190fd5b6000600b82015460ff16600381111561550757fe5b1461554e576040805162461bcd60e51b815260206004820152601260248201527137b93232b91036bab9ba1031329037b832b760711b604482015290519081900360640190fd5b600b81018054600160ff1990911681179091558101548154604080516101009092046001600160a01b0390811683526020830187905281519316927f9b30afe0f76574363e78b150c33c302dafe8c2a0dbe597cda7938b0ba721a2a59281900390910190a250600192915050565b6000546001600160a01b031633146156055760405162461bcd60e51b8152600401808060200182810382526022815260200180615e896022913960400191505060405180910390fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b60025460609081906001600160a01b0316331461564357600080fd5b6013548410615687576040805162461bcd60e51b815260206004820152600b60248201526a1a591e081a5b9d985b1a5960aa1b604482015290519081900360640190fd5b6013848154811061569457fe5b90600052602060002090600902016007015483106156ed576040805162461bcd60e51b81526020600482015260116024820152701b5d19081a5b99195e081a5b9d985b1a59607a1b604482015290519081900360640190fd5b601384815481106156fa57fe5b906000526020600020906009020160060160008481526020019081526020016000206000016013858154811061572c57fe5b90600052602060002090600902016006016000858152602001908152602001600020600101818054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156121755780601f1061214a57610100808354040283529160200191612175565b6002546001600160a01b031681565b6157d58383836159aa565b6157de57600080fd5b6001600160a01b038316615854576006546b033b2e3c9fd0803ce80000009082011115615847576040805162461bcd60e51b81526020600482015260126024820152711b585e081cdd5c1c1b1e481c995858da195960721b604482015290519081900360640190fd5b60068054820190556158fb565b6001600160a01b0383166000908152600760205260409020548111156158b8576040805162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b604482015290519081900360640190fd5b6001600160a01b0383166000908152600760205260409020546158e1908263ffffffff615b5516565b6001600160a01b0384166000908152600760205260409020555b6001600160a01b0382166159175760068054829003905561595a565b6001600160a01b038216600090815260076020526040902054615940908263ffffffff615b6a16565b6001600160a01b0383166000908152600760205260409020555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b6040805163ba2a3cf560e01b81526001600160a01b0385166004820152905160009173f786503b6dbf79827ef0c257cfbc122bf1d827b691737c885df91020b52c3b297b9f9c076f165c3789349184918291859163ba2a3cf591602480820192602092909190829003018186803b158015615a2457600080fd5b505afa158015615a38573d6000803e3d6000fd5b505050506040513d6020811015615a4e57600080fd5b5051604080516322c6e7b560e11b81526001600160a01b038b8116600483015291519293506000929186169163458dcf6a9160248082019260209290919082900301818787803b158015615aa157600080fd5b505af1158015615ab5573d6000803e3d6000fd5b505050506040513d6020811015615acb57600080fd5b5051905081811115615ae35781810382019250615ae7565b8192505b6001600160a01b038916600090815260076020526040902054831115615b1557600095505050505050612392565b6001600160a01b038916600090815260076020526040902054839003871115615b4657600095505050505050612392565b50600198975050505050505050565b600082821115615b6457600080fd5b50900390565b81810182811015611cce57600080fd5b6001600160a01b038216615bce576040805162461bcd60e51b8152602060048201526016602482015275125b9d985b1a59081cd95b99195c881858d8dbdd5b9d60521b604482015290519081900360640190fd5b615bda826000836157ca565b5050565b60008181808060025b602a811015615d6e5761010084029350848181518110615c0357fe5b0160200151855160f89190911c9350859060018301908110615c2157fe5b016020015160f81c915060616001600160a01b03841610801590615c4f57506066836001600160a01b031611155b15615c5f57605783039250615cc3565b6041836001600160a01b031610158015615c8357506046836001600160a01b031611155b15615c9357603783039250615cc3565b6030836001600160a01b031610158015615cb757506039836001600160a01b031611155b15615cc3576030830392505b6061826001600160a01b031610158015615ce757506066826001600160a01b031611155b15615cf757605782039150615d5b565b6041826001600160a01b031610158015615d1b57506046826001600160a01b031611155b15615d2b57603782039150615d5b565b6030826001600160a01b031610158015615d4f57506039826001600160a01b031611155b15615d5b576030820391505b6010830282019390930192600201615be7565b509195945050505050565b6064607392810292909204020490565b6001600160a01b038216615de4576040805162461bcd60e51b815260206004820152601860248201527f496e76616c6964207265636569766572206163636f756e740000000000000000604482015290519081900360640190fd5b615bda600083836157ca565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10615e3157805160ff1916838001178555615e5e565b82800160010185558215615e5e579182015b82811115615e5e578251825591602001919060010190615e43565b50615e6a929150615e6e565b5090565b611e4891905b80821115615e6a5760008155600101615e7456fe4f6e6c79206f776e65722063616e2063616c6c20746869732066756e6374696f6e2e4f6e6c792056616c696461746f7252656769737472792063616e2076616c6964617465206120726573756c74a265627a7a723158200c16b0804b85c8335146361e23e9ed5291003d79551e9f580ef90325e1adaff764736f6c63430005110032