ETH Price: $2,507.62 (+0.23%)

Token

Shuffle.Monster V3 (SHUF)
 

Overview

Max Total Supply

910,434.488733993984526734 SHUF

Holders

4,031 (0.00%)

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
jamieanson.eth
Balance
0.098 SHUF

Value
$0.00
0x67f3D16A91991cF169920F1E79F78E66708Da328
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

The Shuffle Monster token is an experimental ERC20 token that shuffles 1% of each token transfer, and burns another 1%.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
ShuffleToken

Compiler Version
v0.5.10+commit.5a6ea5b1

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2019-08-11
*/

pragma solidity ^0.5.10;

// File: contracts/commons/Ownable.sol


contract Ownable {
    address public owner;

    event TransferOwnership(address _from, address _to);

    constructor() public {
        owner = msg.sender;
        emit TransferOwnership(address(0), msg.sender);
    }

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

    function setOwner(address _owner) external onlyOwner {
        emit TransferOwnership(owner, _owner);
        owner = _owner;
    }
}

// File: contracts/commons/StorageUnit.sol

pragma solidity ^0.5.10;


contract StorageUnit {
    address private owner;
    mapping(bytes32 => bytes32) private store;

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

    function write(bytes32 _key, bytes32 _value) external {
        /* solium-disable-next-line */
        require(msg.sender == owner);
        store[_key] = _value;
    }

    function read(bytes32 _key) external view returns (bytes32) {
        return store[_key];
    }
}

// File: contracts/utils/IsContract.sol

pragma solidity ^0.5.10;


library IsContract {
    function isContract(address _addr) internal view returns (bool) {
        bytes32 codehash;
        /* solium-disable-next-line */
        assembly { codehash := extcodehash(_addr) }
        return codehash != bytes32(0) && codehash != bytes32(0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470);
    }
}

// File: contracts/utils/DistributedStorage.sol

pragma solidity ^0.5.10;




library DistributedStorage {
    function contractSlot(bytes32 _struct) private view returns (address) {
        return address(
            uint256(
                keccak256(
                    abi.encodePacked(
                        byte(0xff),
                        address(this),
                        _struct,
                        keccak256(type(StorageUnit).creationCode)
                    )
                )
            )
        );
    }

    function deploy(bytes32 _struct) private {
        bytes memory slotcode = type(StorageUnit).creationCode;
        /* solium-disable-next-line */
        assembly{ pop(create2(0, add(slotcode, 0x20), mload(slotcode), _struct)) }
    }

    function write(
        bytes32 _struct,
        bytes32 _key,
        bytes32 _value
    ) internal {
        StorageUnit store = StorageUnit(contractSlot(_struct));
        if (!IsContract.isContract(address(store))) {
            deploy(_struct);
        }

        /* solium-disable-next-line */
        (bool success, ) = address(store).call(
            abi.encodeWithSelector(
                store.write.selector,
                _key,
                _value
            )
        );

        require(success, "error writing storage");
    }

    function read(
        bytes32 _struct,
        bytes32 _key
    ) internal view returns (bytes32) {
        StorageUnit store = StorageUnit(contractSlot(_struct));
        if (!IsContract.isContract(address(store))) {
            return bytes32(0);
        }

        /* solium-disable-next-line */
        (bool success, bytes memory data) = address(store).staticcall(
            abi.encodeWithSelector(
                store.read.selector,
                _key
            )
        );

        require(success, "error reading storage");
        return abi.decode(data, (bytes32));
    }
}

// File: contracts/utils/SafeMath.sol

pragma solidity ^0.5.10;


library SafeMath {
    function add(uint256 x, uint256 y) internal pure returns (uint256) {
        uint256 z = x + y;
        require(z >= x, "Add overflow");
        return z;
    }

    function sub(uint256 x, uint256 y) internal pure returns (uint256) {
        require(x >= y, "Sub underflow");
        return x - y;
    }

    function mult(uint256 x, uint256 y) internal pure returns (uint256) {
        if (x == 0) {
            return 0;
        }

        uint256 z = x * y;
        require(z / x == y, "Mult overflow");
        return z;
    }

    function div(uint256 x, uint256 y) internal pure returns (uint256) {
        require(y != 0, "Div by zero");
        return x / y;
    }

    function divRound(uint256 x, uint256 y) internal pure returns (uint256) {
        require(y != 0, "Div by zero");
        uint256 r = x / y;
        if (x % y != 0) {
            r = r + 1;
        }

        return r;
    }
}

// File: contracts/utils/Math.sol

pragma solidity ^0.5.10;


library Math {
    function orderOfMagnitude(uint256 input) internal pure returns (uint256){
        uint256 counter = uint(-1);
        uint256 temp = input;

        do {
            temp /= 10;
            counter++;
        } while (temp != 0);

        return counter;
    }

    function min(uint256 _a, uint256 _b) internal pure returns (uint256) {
        if (_a < _b) {
            return _a;
        } else {
            return _b;
        }
    }

    function max(uint256 _a, uint256 _b) internal pure returns (uint256) {
        if (_a > _b) {
            return _a;
        } else {
            return _b;
        }
    }
}

// File: contracts/utils/GasPump.sol

pragma solidity ^0.5.10;


contract GasPump {
    bytes32 private stub;

    modifier requestGas(uint256 _factor) {
        if (tx.gasprice == 0 || gasleft() > block.gaslimit) {
            uint256 startgas = gasleft();
            _;
            uint256 delta = startgas - gasleft();
            uint256 target = (delta * _factor) / 100;
            startgas = gasleft();
            while (startgas - gasleft() < target) {
                // Burn gas
                stub = keccak256(abi.encodePacked(stub));
            }
        } else {
            _;
        }
    }
}

// File: contracts/interfaces/IERC20.sol

pragma solidity ^0.5.10;


interface IERC20 {
    event Transfer(address indexed _from, address indexed _to, uint256 _value);
    event Approval(address indexed _owner, address indexed _spender, uint256 _value);
    function transfer(address _to, uint _value) external returns (bool success);
    function transferFrom(address _from, address _to, uint256 _value) external returns (bool success);
    function allowance(address _owner, address _spender) external view returns (uint256 remaining);
    function approve(address _spender, uint256 _value) external returns (bool success);
    function balanceOf(address _owner) external view returns (uint256 balance);
}

// File: contracts/commons/AddressMinHeap.sol

pragma solidity ^0.5.10;

/*
    @author Agustin Aguilar <[email protected]>
*/


library AddressMinHeap {
    using AddressMinHeap for AddressMinHeap.Heap;

    struct Heap {
        uint256[] entries;
        mapping(address => uint256) index;
    }

    function initialize(Heap storage _heap) internal {
        require(_heap.entries.length == 0, "already initialized");
        _heap.entries.push(0);
    }

    function encode(address _addr, uint256 _value) internal pure returns (uint256 _entry) {
        /* solium-disable-next-line */
        assembly {
            _entry := not(or(and(0xffffffffffffffffffffffffffffffffffffffff, _addr), shl(160, _value)))
        }
    }

    function decode(uint256 _entry) internal pure returns (address _addr, uint256 _value) {
        /* solium-disable-next-line */
        assembly {
            let entry := not(_entry)
            _addr := and(entry, 0xffffffffffffffffffffffffffffffffffffffff)
            _value := shr(160, entry)
        }
    }

    function decodeAddress(uint256 _entry) internal pure returns (address _addr) {
        /* solium-disable-next-line */
        assembly {
            _addr := and(not(_entry), 0xffffffffffffffffffffffffffffffffffffffff)
        }
    }

    function top(Heap storage _heap) internal view returns(address, uint256) {
        if (_heap.entries.length < 2) {
            return (address(0), 0);
        }

        return decode(_heap.entries[1]);
    }

    function has(Heap storage _heap, address _addr) internal view returns (bool) {
        return _heap.index[_addr] != 0;
    }

    function size(Heap storage _heap) internal view returns (uint256) {
        return _heap.entries.length - 1;
    }

    function entry(Heap storage _heap, uint256 _i) internal view returns (address, uint256) {
        return decode(_heap.entries[_i + 1]);
    }

    // RemoveMax pops off the root element of the heap (the highest value here) and rebalances the heap
    function popTop(Heap storage _heap) internal returns(address _addr, uint256 _value) {
        // Ensure the heap exists
        uint256 heapLength = _heap.entries.length;
        require(heapLength > 1, "The heap does not exists");

        // take the root value of the heap
        (_addr, _value) = decode(_heap.entries[1]);
        _heap.index[_addr] = 0;

        if (heapLength == 2) {
            _heap.entries.length = 1;
        } else {
            // Takes the last element of the array and put it at the root
            uint256 val = _heap.entries[heapLength - 1];
            _heap.entries[1] = val;

            // Delete the last element from the array
            _heap.entries.length = heapLength - 1;

            // Start at the top
            uint256 ind = 1;

            // Bubble down
            ind = _heap.bubbleDown(ind, val);

            // Update index
            _heap.index[decodeAddress(val)] = ind;
        }
    }

    // Inserts adds in a value to our heap.
    function insert(Heap storage _heap, address _addr, uint256 _value) internal {
        require(_heap.index[_addr] == 0, "The entry already exists");

        // Add the value to the end of our array
        uint256 encoded = encode(_addr, _value);
        _heap.entries.push(encoded);

        // Start at the end of the array
        uint256 currentIndex = _heap.entries.length - 1;

        // Bubble Up
        currentIndex = _heap.bubbleUp(currentIndex, encoded);

        // Update index
        _heap.index[_addr] = currentIndex;
    }

    function update(Heap storage _heap, address _addr, uint256 _value) internal {
        uint256 ind = _heap.index[_addr];
        require(ind != 0, "The entry does not exists");

        uint256 can = encode(_addr, _value);
        uint256 val = _heap.entries[ind];
        uint256 newInd;

        if (can < val) {
            // Bubble down
            newInd = _heap.bubbleDown(ind, can);
        } else if (can > val) {
            // Bubble up
            newInd = _heap.bubbleUp(ind, can);
        } else {
            // no changes needed
            return;
        }

        // Update entry
        _heap.entries[newInd] = can;

        // Update index
        if (newInd != ind) {
            _heap.index[_addr] = newInd;
        }
    }

    function bubbleUp(Heap storage _heap, uint256 _ind, uint256 _val) internal returns (uint256 ind) {
        // Bubble up
        ind = _ind;
        if (ind != 1) {
            uint256 parent = _heap.entries[ind / 2];
            while (parent < _val) {
                // If the parent value is lower than our current value, we swap them
                (_heap.entries[ind / 2], _heap.entries[ind]) = (_val, parent);

                // Update moved Index
                _heap.index[decodeAddress(parent)] = ind;

                // change our current Index to go up to the parent
                ind = ind / 2;
                if (ind == 1) {
                    break;
                }

                // Update parent
                parent = _heap.entries[ind / 2];
            }
        }
    }

    function bubbleDown(Heap storage _heap, uint256 _ind, uint256 _val) internal returns (uint256 ind) {
        // Bubble down
        ind = _ind;

        uint256 lenght = _heap.entries.length;
        uint256 target = lenght - 1;

        while (ind * 2 < lenght) {
            // get the current index of the children
            uint256 j = ind * 2;

            // left child value
            uint256 leftChild = _heap.entries[j];

            // Store the value of the child
            uint256 childValue;

            if (target > j) {
                // The parent has two childs 👨‍👧‍👦

                // Load right child value
                uint256 rightChild = _heap.entries[j + 1];

                // Compare the left and right child.
                // if the rightChild is greater, then point j to it's index
                // and save the value
                if (leftChild < rightChild) {
                    childValue = rightChild;
                    j = j + 1;
                } else {
                    // The left child is greater
                    childValue = leftChild;
                }
            } else {
                // The parent has a single child 👨‍👦
                childValue = leftChild;
            }

            // Check if the child has a lower value
            if (_val > childValue) {
                break;
            }

            // else swap the value
            (_heap.entries[ind], _heap.entries[j]) = (childValue, _val);

            // Update moved Index
            _heap.index[decodeAddress(childValue)] = ind;

            // and let's keep going down the heap
            ind = j;
        }
    }
}

// File: contracts/Heap.sol

pragma solidity ^0.5.10;



contract Heap is Ownable {
    using AddressMinHeap for AddressMinHeap.Heap;

    // heap
    AddressMinHeap.Heap private heap;

    // Heap events
    event JoinHeap(address indexed _address, uint256 _balance, uint256 _prevSize);
    event LeaveHeap(address indexed _address, uint256 _balance, uint256 _prevSize);

    uint256 public constant TOP_SIZE = 512;

    constructor() public {
        heap.initialize();
    }

    function topSize() external pure returns (uint256) {
        return TOP_SIZE;
    }

    function addressAt(uint256 _i) external view returns (address addr) {
        (addr, ) = heap.entry(_i);
    }

    function indexOf(address _addr) external view returns (uint256) {
        return heap.index[_addr];
    }

    function entry(uint256 _i) external view returns (address, uint256) {
        return heap.entry(_i);
    }

    function top() external view returns (address, uint256) {
        return heap.top();
    }

    function size() external view returns (uint256) {
        return heap.size();
    }

    function update(address _addr, uint256 _new) external onlyOwner {
        uint256 _size = heap.size();

        // If the heap is empty
        // join the _addr
        if (_size == 0) {
            emit JoinHeap(_addr, _new, 0);
            heap.insert(_addr, _new);
            return;
        }

        // Load top value of the heap
        (, uint256 lastBal) = heap.top();

        // If our target address already is in the heap
        if (heap.has(_addr)) {
            // Update the target address value
            heap.update(_addr, _new);
            // If the new value is 0
            // always pop the heap
            // we updated the heap, so our address should be on top
            if (_new == 0) {
                heap.popTop();
                emit LeaveHeap(_addr, 0, _size);
            }
        } else {
            // IF heap is full or new balance is higher than pop heap
            if (_new != 0 && (_size < TOP_SIZE || lastBal < _new)) {
                // If heap is full pop heap
                if (_size >= TOP_SIZE) {
                    (address _poped, uint256 _balance) = heap.popTop();
                    emit LeaveHeap(_poped, _balance, _size);
                }

                // Insert new value
                heap.insert(_addr, _new);
                emit JoinHeap(_addr, _new, _size);
            }
        }
    }
}

// File: contracts/ShuffleToken.sol

pragma solidity ^0.5.10;








contract ShuffleToken is Ownable, GasPump, IERC20 {
    using DistributedStorage for bytes32;
    using SafeMath for uint256;

    // Shuffle events
    event Winner(address indexed _addr, uint256 _value);

    // Managment events
    event SetName(string _prev, string _new);
    event SetExtraGas(uint256 _prev, uint256 _new);
    event SetHeap(address _prev, address _new);
    event WhitelistFrom(address _addr, bool _whitelisted);
    event WhitelistTo(address _addr, bool _whitelisted);

    uint256 public totalSupply;

    bytes32 private constant BALANCE_KEY = keccak256("balance");

    // game
    uint256 public constant FEE = 100;

    // metadata
    string public name = "Shuffle.Monster V3";
    string public constant symbol = "SHUF";
    uint8 public constant decimals = 18;

    // fee whitelist
    mapping(address => bool) public whitelistFrom;
    mapping(address => bool) public whitelistTo;

    // heap
    Heap public heap;

    // internal
    uint256 public extraGas;
    bool inited;

    function init(
        address _to,
        uint256 _amount
    ) external {
        // Only init once
        assert(!inited);
        inited = true;

        // Sanity checks
        assert(totalSupply == 0);
        assert(address(heap) == address(0));

        // Create Heap
        heap = new Heap();
        emit SetHeap(address(0), address(heap));

        // Init contract variables and mint
        // entire token balance
        extraGas = 15;
        emit SetExtraGas(0, extraGas);
        emit Transfer(address(0), _to, _amount);
        _setBalance(_to, _amount);
        totalSupply = _amount;
    }

    ///
    // Storage access functions
    ///

    // Getters

    function _toKey(address a) internal pure returns (bytes32) {
        return bytes32(uint256(a));
    }

    function _balanceOf(address _addr) internal view returns (uint256) {
        return uint256(_toKey(_addr).read(BALANCE_KEY));
    }

    function _allowance(address _addr, address _spender) internal view returns (uint256) {
        return uint256(_toKey(_addr).read(keccak256(abi.encodePacked("allowance", _spender))));
    }

    function _nonce(address _addr, uint256 _cat) internal view returns (uint256) {
        return uint256(_toKey(_addr).read(keccak256(abi.encodePacked("nonce", _cat))));
    }

    // Setters

    function _setAllowance(address _addr, address _spender, uint256 _value) internal {
        _toKey(_addr).write(keccak256(abi.encodePacked("allowance", _spender)), bytes32(_value));
    }

    function _setNonce(address _addr, uint256 _cat, uint256 _value) internal {
        _toKey(_addr).write(keccak256(abi.encodePacked("nonce", _cat)), bytes32(_value));
    }

    function _setBalance(address _addr, uint256 _balance) internal {
        _toKey(_addr).write(BALANCE_KEY, bytes32(_balance));
        heap.update(_addr, _balance);
    }

    ///
    // Internal methods
    ///

    function _isWhitelisted(address _from, address _to) internal view returns (bool) {
        return whitelistFrom[_from]||whitelistTo[_to];
    }

    function _random(address _s1, uint256 _s2, uint256 _s3, uint256 _max) internal pure returns (uint256) {
        uint256 rand = uint256(keccak256(abi.encodePacked(_s1, _s2, _s3)));
        return rand % (_max + 1);
    }

    function _pickWinner(address _from, uint256 _value) internal returns (address winner) {
        // Get order of magnitude of the tx
        uint256 magnitude = Math.orderOfMagnitude(_value);
        // Pull nonce for a given order of magnitude
        uint256 nonce = _nonce(_from, magnitude);
        _setNonce(_from, magnitude, nonce + 1);
        // pick entry from heap
        winner = heap.addressAt(_random(_from, nonce, magnitude, heap.size() - 1));
    }

    function _transferFrom(address _operator, address _from, address _to, uint256 _value, bool _payFee) internal {
        // If transfer amount is zero
        // emit event and stop execution
        if (_value == 0) {
            emit Transfer(_from, _to, 0);
            return;
        }

        // Load sender balance
        uint256 balanceFrom = _balanceOf(_from);
        require(balanceFrom >= _value, "balance not enough");

        // Check if operator is sender
        if (_from != _operator) {
            // If not, validate allowance
            uint256 allowanceFrom = _allowance(_from, _operator);
            // If allowance is not 2 ** 256 - 1, consume allowance
            if (allowanceFrom != uint(-1)) {
                // Check allowance and save new one
                require(allowanceFrom >= _value, "allowance not enough");
                _setAllowance(_from, _operator, allowanceFrom.sub(_value));
            }
        }

        // Calculate receiver balance
        // initial receive is full value
        uint256 receive = _value;
        uint256 burn = 0;
        uint256 shuf = 0;

        // Change sender balance
        _setBalance(_from, balanceFrom.sub(_value));

        // If the transaction is not whitelisted
        // or if sender requested to pay the fee
        // calculate fees
        if (_payFee || !_isWhitelisted(_from, _to)) {
            // Fee is the same for BURN and SHUF
            // If we are sending value one
            // give priority to BURN
            burn = _value.divRound(FEE);
            shuf = _value == 1 ? 0 : burn;

            // Subtract fees from receiver amount
            receive = receive.sub(burn.add(shuf));

            // Burn tokens
            totalSupply = totalSupply.sub(burn);
            emit Transfer(_from, address(0), burn);

            // Shuffle tokens
            // Pick winner pseudo-randomly
            address winner = _pickWinner(_from, _value);
            // Transfer balance to winner
            _setBalance(winner, _balanceOf(winner).add(shuf));
            emit Winner(winner, shuf);
            emit Transfer(_from, winner, shuf);
        }

        // Sanity checks
        // no tokens where created
        assert(burn.add(shuf).add(receive) == _value);

        // Add tokens to receiver
        _setBalance(_to, _balanceOf(_to).add(receive));
        emit Transfer(_from, _to, receive);
    }

    ///
    // Managment
    ///

    function setWhitelistedTo(address _addr, bool _whitelisted) external onlyOwner {
        emit WhitelistTo(_addr, _whitelisted);
        whitelistTo[_addr] = _whitelisted;
    }

    function setWhitelistedFrom(address _addr, bool _whitelisted) external onlyOwner {
        emit WhitelistFrom(_addr, _whitelisted);
        whitelistFrom[_addr] = _whitelisted;
    }

    function setName(string calldata _name) external onlyOwner {
        emit SetName(name, _name);
        name = _name;
    }

    function setExtraGas(uint256 _gas) external onlyOwner {
        emit SetExtraGas(extraGas, _gas);
        extraGas = _gas;
    }

    function setHeap(Heap _heap) external onlyOwner {
        emit SetHeap(address(heap), address(_heap));
        heap = _heap;
    }

    /////
    // Heap methods
    /////

    function topSize() external view returns (uint256) {
        return heap.topSize();
    }

    function heapSize() external view returns (uint256) {
        return heap.size();
    }

    function heapEntry(uint256 _i) external view returns (address, uint256) {
        return heap.entry(_i);
    }

    function heapTop() external view returns (address, uint256) {
        return heap.top();
    }

    function heapIndex(address _addr) external view returns (uint256) {
        return heap.indexOf(_addr);
    }

    function getNonce(address _addr, uint256 _cat) external view returns (uint256) {
        return _nonce(_addr, _cat);
    }

    /////
    // ERC20
    /////

    function balanceOf(address _addr) external view returns (uint256) {
        return _balanceOf(_addr);
    }

    function allowance(address _addr, address _spender) external view returns (uint256) {
        return _allowance(_addr, _spender);
    }

    function approve(address _spender, uint256 _value) external returns (bool) {
        emit Approval(msg.sender, _spender, _value);
        _setAllowance(msg.sender, _spender, _value);
        return true;
    }

    function transfer(address _to, uint256 _value) external requestGas(extraGas) returns (bool) {
        _transferFrom(msg.sender, msg.sender, _to, _value, false);
        return true;
    }

    function transferWithFee(address _to, uint256 _value) external requestGas(extraGas) returns (bool) {
        _transferFrom(msg.sender, msg.sender, _to, _value, true);
        return true;
    }

    function transferFrom(address _from, address _to, uint256 _value) external requestGas(extraGas) returns (bool) {
        _transferFrom(msg.sender, _from, _to, _value, false);
        return true;
    }

    function transferFromWithFee(address _from, address _to, uint256 _value) external requestGas(extraGas) returns (bool) {
        _transferFrom(msg.sender, _from, _to, _value, true);
        return true;
    }
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferWithFee","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_i","type":"uint256"}],"name":"heapEntry","outputs":[{"name":"","type":"address"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_owner","type":"address"}],"name":"setOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"whitelistTo","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"extraGas","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"}],"name":"init","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"whitelistFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"heapTop","outputs":[{"name":"","type":"address"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_addr","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"topSize","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_addr","type":"address"},{"name":"_cat","type":"uint256"}],"name":"getNonce","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFromWithFee","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_gas","type":"uint256"}],"name":"setExtraGas","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"heap","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_addr","type":"address"},{"name":"_whitelisted","type":"bool"}],"name":"setWhitelistedTo","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_addr","type":"address"}],"name":"heapIndex","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_heap","type":"address"}],"name":"setHeap","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_name","type":"string"}],"name":"setName","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"FEE","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_addr","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"heapSize","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_addr","type":"address"},{"name":"_whitelisted","type":"bool"}],"name":"setWhitelistedFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_addr","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"Winner","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_prev","type":"string"},{"indexed":false,"name":"_new","type":"string"}],"name":"SetName","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_prev","type":"uint256"},{"indexed":false,"name":"_new","type":"uint256"}],"name":"SetExtraGas","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_prev","type":"address"},{"indexed":false,"name":"_new","type":"address"}],"name":"SetHeap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_addr","type":"address"},{"indexed":false,"name":"_whitelisted","type":"bool"}],"name":"WhitelistFrom","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_addr","type":"address"},{"indexed":false,"name":"_whitelisted","type":"bool"}],"name":"WhitelistTo","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_spender","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"_from","type":"address"},{"indexed":false,"name":"_to","type":"address"}],"name":"TransferOwnership","type":"event"}]

60c0604052601260808190527f53687566666c652e4d6f6e73746572205633000000000000000000000000000060a090815262000040916003919062000096565b50600080546001600160a01b03191633908117825560408051928352602083019190915280517f5c486528ec3e3f0ea91181cff8116f02bfa350e03b8b6f12e00765adbb5af85c9281900390910190a16200013b565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620000d957805160ff191683800117855562000109565b8280016001018555821562000109579182015b8281111562000109578251825591602001919060010190620000ec565b50620001179291506200011b565b5090565b6200013891905b8082111562000117576000815560010162000122565b90565b612e3c806200014b6000396000f3fe60806040523480156200001157600080fd5b5060043610620002085760003560e01c806389535803116200011d578063a9059cbb11620000b1578063c57981b5116200007b578063c57981b51462000696578063dd62ed3e14620006a0578063fa7e8dc714620006d1578063ff12bbf414620006db5762000208565b8063a9059cbb146200059f578063b00cf04914620005ce578063bbac119314620005f7578063c47f002714620006205762000208565b80638da5cb5b11620000f35780638da5cb5b146200053457806395d89b41146200055a578063a12ab7701462000564578063a486309d146200056e5762000208565b80638953580314620004ac57806389f3546814620004db5780638cec999314620005145762000208565b806323b872dd11620001a157806343684b21116200016b57806343684b2114620004465780634849f5c8146200046f57806370a0823114620004795780637c32cdd114620004a25762000208565b806323b872dd14620003b4578063313ce56714620003ed5780633767e339146200040d578063399ae72414620004175762000208565b8063095ea7b311620001e3578063095ea7b3146200031557806313af4035146200034457806316b627d1146200036f57806318160ddd14620003985762000208565b806306fdde03146200020d57806308acece2146200028f57806308eaae4d14620002d2575b600080fd5b620002176200070c565b6040805160208082528351818301528351919283929083019185019080838360005b838110156200025357818101518382015260200162000239565b50505050905090810190601f168015620002815780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b620002be60048036036040811015620002a757600080fd5b506001600160a01b0381351690602001356200079e565b604080519115158252519081900360200190f35b620002f260048036036020811015620002ea57600080fd5b50356200083f565b604080516001600160a01b03909316835260208301919091528051918290030190f35b620002be600480360360408110156200032d57600080fd5b506001600160a01b038135169060200135620008cb565b6200036d600480360360208110156200035c57600080fd5b50356001600160a01b031662000926565b005b620002be600480360360208110156200038757600080fd5b50356001600160a01b0316620009dd565b620003a2620009f2565b60408051918252519081900360200190f35b620002be60048036036060811015620003cc57600080fd5b506001600160a01b03813581169160208101359091169060400135620009f8565b620003f762000a9a565b6040805160ff9092168252519081900360200190f35b620003a262000a9f565b6200036d600480360360408110156200042f57600080fd5b506001600160a01b03813516906020013562000aa5565b620002be600480360360208110156200045e57600080fd5b50356001600160a01b031662000bec565b620002f262000c01565b620003a2600480360360208110156200049157600080fd5b50356001600160a01b031662000c85565b620003a262000c92565b620003a260048036036040811015620004c457600080fd5b506001600160a01b03813516906020013562000d0c565b620002be60048036036060811015620004f357600080fd5b506001600160a01b0381358116916020810135909116906040013562000d21565b6200036d600480360360208110156200052c57600080fd5b503562000d60565b6200053e62000def565b604080516001600160a01b039092168252519081900360200190f35b6200021762000dfe565b6200053e62000e1e565b6200036d600480360360408110156200058657600080fd5b506001600160a01b038135169060200135151562000e2d565b620002be60048036036040811015620005b757600080fd5b506001600160a01b03813516906020013562000eea565b620003a260048036036020811015620005e657600080fd5b50356001600160a01b031662000f29565b6200036d600480360360208110156200060f57600080fd5b50356001600160a01b031662000faf565b6200036d600480360360208110156200063857600080fd5b8101906020810181356401000000008111156200065457600080fd5b8201836020820111156200066757600080fd5b803590602001918460018302840111640100000000831117156200068a57600080fd5b50909250905062001066565b620003a2620011a8565b620003a260048036036040811015620006b857600080fd5b506001600160a01b0381358116916020013516620011ad565b620003a2620011bb565b6200036d60048036036040811015620006f357600080fd5b506001600160a01b038135169060200135151562001201565b6003805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015620007965780601f106200076a5761010080835404028352916020019162000796565b820191906000526020600020905b8154815290600101906020018083116200077857829003601f168201915b505050505081565b60006007543a60001480620007b25750455a115b15620008235760005a9050620007cd333387876001620012be565b6001925060005a820390506064838202045a92505b805a840310156200081a57600180546040805160208082019390935281518082038401815290820190915280519101209055620007e2565b50505062000838565b62000833333386866001620012be565b600191505b5092915050565b6006546040805163e2095c0760e01b815260048101849052815160009384936001600160a01b039091169263e2095c079260248083019392829003018186803b1580156200088c57600080fd5b505afa158015620008a1573d6000803e3d6000fd5b505050506040513d6040811015620008b857600080fd5b5080516020909101519092509050915091565b6040805182815290516000916001600160a01b0385169133917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925919081900360200190a36200091c338484620015fe565b5060015b92915050565b6000546001600160a01b0316331462000973576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9037bbb732b960b11b604482015290519081900360640190fd5b600054604080516001600160a01b039283168152918316602083015280517f5c486528ec3e3f0ea91181cff8116f02bfa350e03b8b6f12e00765adbb5af85c9281900390910190a1600080546001600160a01b0319166001600160a01b0392909216919091179055565b60056020526000908152604090205460ff1681565b60025481565b60006007543a6000148062000a0c5750455a115b1562000a7d5760005a905062000a27338787876000620012be565b6001925060005a820390506064838202045a92505b805a8403101562000a745760018054604080516020808201939093528151808203840181529082019091528051910120905562000a3c565b50505062000a92565b62000a8d338686866000620012be565b600191505b509392505050565b601281565b60075481565b60085460ff161562000ab357fe5b6008805460ff191660011790556002541562000acb57fe5b6006546001600160a01b03161562000adf57fe5b60405162000aed9062001f03565b604051809103906000f08015801562000b0a573d6000803e3d6000fd5b50600680546001600160a01b0319166001600160a01b039283161790819055604080516000815291909216602082015281517f4b388b1aa01b2653af632da9d80cca5cfe489300086d04070fca9dc860629d4f929181900390910190a1600f60078190556040805160008152602081019290925280517fcc8f22bdbd4465d62f4861f9dcc3c020cbf6f3ede75c5d0eebf924f06f23b1c99281900390910190a16040805182815290516001600160a01b0384169160009160008051602062002de88339815191529181900360200190a362000be6828262001662565b60025550565b60046020526000908152604090205460ff1681565b60065460408051637f36e6dd60e11b8152815160009384936001600160a01b039091169263fe6dcdba9260048083019392829003018186803b15801562000c4757600080fd5b505afa15801562000c5c573d6000803e3d6000fd5b505050506040513d604081101562000c7357600080fd5b50805160209091015190925090509091565b6000620009208262001702565b60065460408051637c32cdd160e01b815290516000926001600160a01b031691637c32cdd1916004808301926020929190829003018186803b15801562000cd857600080fd5b505afa15801562000ced573d6000803e3d6000fd5b505050506040513d602081101562000d0457600080fd5b505190505b90565b600062000d1a83836200173e565b9392505050565b60006007543a6000148062000d355750455a115b1562000d505760005a905062000a27338787876001620012be565b62000a8d338686866001620012be565b6000546001600160a01b0316331462000dad576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9037bbb732b960b11b604482015290519081900360640190fd5b600754604080519182526020820183905280517fcc8f22bdbd4465d62f4861f9dcc3c020cbf6f3ede75c5d0eebf924f06f23b1c99281900390910190a1600755565b6000546001600160a01b031681565b6040518060400160405280600481526020016329a42aa360e11b81525081565b6006546001600160a01b031681565b6000546001600160a01b0316331462000e7a576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9037bbb732b960b11b604482015290519081900360640190fd5b604080516001600160a01b0384168152821515602082015281517f88cf9b943f64811022537ee9f0141770d85e612eae3a3a39241abe5ca9f11382929181900390910190a16001600160a01b03919091166000908152600560205260409020805460ff1916911515919091179055565b60006007543a6000148062000efe5750455a115b1562000f195760005a9050620007cd333387876000620012be565b62000833333386866000620012be565b6006546040805163fd6aad2560e01b81526001600160a01b0384811660048301529151600093929092169163fd6aad2591602480820192602092909190829003018186803b15801562000f7b57600080fd5b505afa15801562000f90573d6000803e3d6000fd5b505050506040513d602081101562000fa757600080fd5b505192915050565b6000546001600160a01b0316331462000ffc576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9037bbb732b960b11b604482015290519081900360640190fd5b600654604080516001600160a01b039283168152918316602083015280517f4b388b1aa01b2653af632da9d80cca5cfe489300086d04070fca9dc860629d4f9281900390910190a1600680546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314620010b3576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9037bbb732b960b11b604482015290519081900360640190fd5b6040805181815260038054600260001961010060018416150201909116049282018390527fbcfc2e8e6857ca26084ba5543a45251aaf7690f73043fff1d18c7d5f80e5cbb19290918591859190819060208201906060830190879080156200115f5780601f1062001133576101008083540402835291602001916200115f565b820191906000526020600020905b8154815290600101906020018083116200114157829003601f168201915b50508381038252848152602001858580828437600083820152604051601f909101601f191690920182900397509095505050505050a1620011a36003838362001f11565b505050565b606481565b600062000d1a838362001786565b6006546040805163949d225d60e01b815290516000926001600160a01b03169163949d225d916004808301926020929190829003018186803b15801562000cd857600080fd5b6000546001600160a01b031633146200124e576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9037bbb732b960b11b604482015290519081900360640190fd5b604080516001600160a01b0384168152821515602082015281517fc3d26c130d120a4bb874de56c8b5fb727ad2cfc3551ca49cd42ef248e893b69a929181900390910190a16001600160a01b03919091166000908152600460205260409020805460ff1916911515919091179055565b816200130557826001600160a01b0316846001600160a01b031660008051602062002de883398151915260006040518082815260200191505060405180910390a3620015f7565b6000620013128562001702565b9050828110156200135f576040805162461bcd60e51b81526020600482015260126024820152710c4c2d8c2dcc6ca40dcdee840cadcdeeaced60731b604482015290519081900360640190fd5b856001600160a01b0316856001600160a01b0316146200140057600062001387868862001786565b90506000198114620013fe5783811015620013e0576040805162461bcd60e51b81526020600482015260146024820152730c2d8d8deeec2dcc6ca40dcdee840cadcdeeaced60631b604482015290519081900360640190fd5b620013fe8688620013f8848863ffffffff620017e716565b620015fe565b505b8260008062001421886200141b868663ffffffff620017e716565b62001662565b848062001437575062001435888862001835565b155b1562001583576200145086606463ffffffff6200187916565b91508560011462001462578162001465565b60005b90506200148b6200147d838363ffffffff620018e616565b849063ffffffff620017e716565b600254909350620014a3908363ffffffff620017e716565b6002556040805183815290516000916001600160a01b038b169160008051602062002de88339815191529181900360200190a36000620014e4898862001930565b905062001508816200141b84620014fb8562001702565b9063ffffffff620018e616565b6040805183815290516001600160a01b038316917f9c2270628a9b29d30ae96b6c4c14ed646ee134febdce38a5b77f2bde9cea2e20919081900360200190a2806001600160a01b0316896001600160a01b031660008051602062002de8833981519152846040518082815260200191505060405180910390a3505b856200159b84620014fb858563ffffffff620018e616565b14620015a357fe5b620015b8876200141b85620014fb8b62001702565b866001600160a01b0316886001600160a01b031660008051602062002de8833981519152856040518082815260200191505060405180910390a3505050505b5050505050565b6040805168616c6c6f77616e636560b81b6020808301919091526001600160601b0319606086901b1660298301528251601d818403018152603d9092019092528051910120620011a39082620016548662001a5c565b919063ffffffff62001a6816565b604080516662616c616e636560c81b815290519081900360070190206200168f9082620016548562001a5c565b6006546040805163516c1daf60e11b81526001600160a01b038581166004830152602482018590529151919092169163a2d83b5e91604480830192600092919082900301818387803b158015620016e557600080fd5b505af1158015620016fa573d6000803e3d6000fd5b505050505050565b604080516662616c616e636560c81b815290519081900360070190206000906200092090620017318462001a5c565b9063ffffffff62001bc416565b600062000d1a826040516020018080646e6f6e636560d81b81525060050182815260200191505060405160208183030381529060405280519060200120620017318562001a5c565b600062000d1a82604051602001808068616c6c6f77616e636560b81b815250600901826001600160a01b03166001600160a01b031660601b815260140191505060405160208183030381529060405280519060200120620017318562001a5c565b6000818310156200182f576040805162461bcd60e51b815260206004820152600d60248201526c53756220756e646572666c6f7760981b604482015290519081900360640190fd5b50900390565b6001600160a01b03821660009081526004602052604081205460ff168062000d1a5750506001600160a01b031660009081526005602052604090205460ff16919050565b600081620018bc576040805162461bcd60e51b815260206004820152600b60248201526a446976206279207a65726f60a81b604482015290519081900360640190fd5b6000828481620018c857fe5b049050828481620018d557fe5b061562000d1a576001019392505050565b60008282018381101562000d1a576040805162461bcd60e51b815260206004820152600c60248201526b416464206f766572666c6f7760a01b604482015290519081900360640190fd5b6000806200193e8362001d3f565b905060006200194e85836200173e565b90506200196085838360010162001d5e565b6006546040805163949d225d60e01b815290516001600160a01b0390921691630af2b3e591620019f091899186918891600191889163949d225d916004808301926020929190829003018186803b158015620019bb57600080fd5b505afa158015620019d0573d6000803e3d6000fd5b505050506040513d6020811015620019e757600080fd5b50510362001da8565b6040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801562001a2557600080fd5b505afa15801562001a3a573d6000803e3d6000fd5b505050506040513d602081101562001a5157600080fd5b505195945050505050565b6001600160a01b031690565b600062001a758462001e05565b905062001a828162001e92565b62001a925762001a928462001eca565b6040805160248101859052604480820185905282518083039091018152606490910182526020810180516001600160e01b031663e2e52ec160e01b178152915181516000936001600160a01b0386169392918291908083835b6020831062001b0c5780518252601f19909201916020918201910162001aeb565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811462001b70576040519150601f19603f3d011682016040523d82523d6000602084013e62001b75565b606091505b5050905080620015f7576040805162461bcd60e51b81526020600482015260156024820152746572726f722077726974696e672073746f7261676560581b604482015290519081900360640190fd5b60008062001bd28462001e05565b905062001bdf8162001e92565b62001bef57506000905062000920565b60408051602480820186905282518083039091018152604490910182526020810180516001600160e01b03166361da143960e01b178152915181516000936060936001600160a01b038716939092909182918083835b6020831062001c665780518252601f19909201916020918201910162001c45565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d806000811462001cc8576040519150601f19603f3d011682016040523d82523d6000602084013e62001ccd565b606091505b50915091508162001d1d576040805162461bcd60e51b81526020600482015260156024820152746572726f722072656164696e672073746f7261676560581b604482015290519081900360640190fd5b80806020019051602081101562001d3357600080fd5b50519695505050505050565b6000600019825b60019190910190600a90048062001d46575092915050565b620011a3826040516020018080646e6f6e636560d81b815250600501828152602001915050604051602081830303815290604052805190602001208260001b620016548662001a5c565b604080516001600160601b0319606087901b16602080830191909152603482018690526054808301869052835180840390910181526074909201909252805191012060009060018301818162001dfa57fe5b069695505050505050565b600060ff60f81b30836040518060200162001e209062001f96565b818103601f199081018352601f90910116604081815282516020938401206001600160f81b0319969096168383015260609490941b6001600160601b03191660218201526035810192909252605580830194909452825180830390940184526075909101909152815191012092915050565b6000813f801580159062000d1a57507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470141592915050565b60606040518060200162001ede9062001f96565b6020820181038252601f19601f820116604052509050818151602083016000f5505050565b610d018062001fc283390190565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1062001f545782800160ff1982351617855562001f84565b8280016001018555821562001f84579182015b8281111562001f8457823582559160200191906001019062001f67565b5062001f9292915062001fa4565b5090565b6101258062002cc383390190565b62000d0991905b8082111562001f92576000815560010162001fab56fe608060405234801561001057600080fd5b50600080546001600160a01b03191633908117825560408051928352602083019190915280517f5c486528ec3e3f0ea91181cff8116f02bfa350e03b8b6f12e00765adbb5af85c9281900390910190a1610074600161007960201b610b621760201c565b6100fc565b8054156100e757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f616c726561647920696e697469616c697a656400000000000000000000000000604482015290519081900360640190fd5b80546001810182556000918252602082200155565b610bf68061010b6000396000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c8063949d225d11610066578063949d225d1461012e578063a2d83b5e14610136578063e2095c0714610162578063fd6aad25146101a2578063fe6dcdba146101c85761009e565b80630af2b3e5146100a357806313af4035146100dc57806331fb7127146101045780637c32cdd11461011e5780638da5cb5b14610126575b600080fd5b6100c0600480360360208110156100b957600080fd5b50356101d0565b604080516001600160a01b039092168252519081900360200190f35b610102600480360360208110156100f257600080fd5b50356001600160a01b03166101ea565b005b61010c6102a0565b60408051918252519081900360200190f35b61010c6102a6565b6100c06102ad565b61010c6102bc565b6101026004803603604081101561014c57600080fd5b506001600160a01b0381351690602001356102cd565b61017f6004803603602081101561017857600080fd5b50356104fb565b604080516001600160a01b03909316835260208301919091528051918290030190f35b61010c600480360360208110156101b857600080fd5b50356001600160a01b0316610519565b61017f610534565b60006101e360018363ffffffff61054916565b5092915050565b6000546001600160a01b03163314610236576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9037bbb732b960b11b604482015290519081900360640190fd5b600054604080516001600160a01b039283168152918316602083015280517f5c486528ec3e3f0ea91181cff8116f02bfa350e03b8b6f12e00765adbb5af85c9281900390910190a1600080546001600160a01b0319166001600160a01b0392909216919091179055565b61020081565b6102005b90565b6000546001600160a01b031681565b60006102c8600161057c565b905090565b6000546001600160a01b03163314610319576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9037bbb732b960b11b604482015290519081900360640190fd5b6000610325600161057c565b90508061038757604080518381526000602082015281516001600160a01b038616927fb7c8eb45e695579273671351c1ee88509af6ec27e061176b10f5f9fb145eff93928290030190a26103816001848463ffffffff61058416565b506104f7565b6000610393600161064f565b91506103a8905060018563ffffffff61067c16565b1561041a576103bf6001858563ffffffff61069d16565b82610415576103ce60016107c5565b505060408051600081526020810184905281516001600160a01b038716927f61072af1539e7159a567565ab0a7863c5ad61aa8daa91cf3843c3bb8bccb00e7928290030190a25b6104f4565b8215801590610433575061020082108061043357508281105b156104f457610200821061049e5760008061044e60016107c5565b91509150816001600160a01b03167f61072af1539e7159a567565ab0a7863c5ad61aa8daa91cf3843c3bb8bccb00e78286604051808381526020018281526020019250505060405180910390a250505b6104b06001858563ffffffff61058416565b604080518481526020810184905281516001600160a01b038716927fb7c8eb45e695579273671351c1ee88509af6ec27e061176b10f5f9fb145eff93928290030190a25b50505b5050565b60008061050f60018463ffffffff61054916565b915091505b915091565b6001600160a01b031660009081526002602052604090205490565b600080610541600161064f565b915091509091565b60008061057184600001846001018154811061056157fe5b9060005260206000200154610905565b915091509250929050565b546000190190565b6001600160a01b0382166000908152600184016020526040902054156105f1576040805162461bcd60e51b815260206004820152601860248201527f54686520656e74727920616c7265616479206578697374730000000000000000604482015290519081900360640190fd5b60006105fd838361091a565b84546001810186556000868152602090200181905584549091506000190161062c85828463ffffffff61092e16565b6001600160a01b0390941660009081526001909501602052505060409092205550565b805460009081906002111561066957506000905080610514565b61050f8360000160018154811061056157fe5b6001600160a01b031660009081526001919091016020526040902054151590565b6001600160a01b03821660009081526001840160205260409020548061070a576040805162461bcd60e51b815260206004820152601960248201527f54686520656e74727920646f6573206e6f742065786973747300000000000000604482015290519081900360640190fd5b6000610716848461091a565b9050600085600001838154811061072957fe5b906000526020600020015490506000818310156107585761075187858563ffffffff610a0516565b905061077a565b818311156107715761075187858563ffffffff61092e16565b505050506107c0565b8287600001828154811061078a57fe5b6000918252602090912001558084146107bb576001600160a01b038616600090815260018801602052604090208190555b505050505b505050565b8054600090819060018111610821576040805162461bcd60e51b815260206004820152601860248201527f546865206865617020646f6573206e6f74206578697374730000000000000000604482015290519081900360640190fd5b6108348460000160018154811061056157fe5b6001600160a01b03821660009081526001870160205260408120559093509150600281141561086f5760016108698582610b25565b506108ff565b600084600001600183038154811061088357fe5b9060005260206000200154905080856000016001815481106108a157fe5b60009182526020909120015560001982016108bc8682610b25565b5060016108d086828463ffffffff610a0516565b9050808660010160006108e285610b18565b6001600160a01b0316815260208101919091526040016000205550505b50915091565b196001600160a01b0381169160a09190911c90565b60a01b6001600160a01b0391909116171990565b81600181146109fe57600084600283048154811061094857fe5b906000526020600020015490505b828110156109fc57828186600285048154811061096f57fe5b90600052602060002001600088600001868154811061098a57fe5b60009182526020822001939093555091909155829060018701906109ad84610b18565b6001600160a01b0316815260208101919091526040016000205560028204915081600114156109db576109fc565b8460028304815481106109ea57fe5b90600052602060002001549050610956565b505b9392505050565b8254829060001981015b81836002021015610b0f5785546002840290600090889083908110610a3057fe5b90600052602060002001549050600082841115610a88576000896000018460010181548110610a5b57fe5b9060005260206000200154905080831015610a7e57809150836001019350610a82565b8291505b50610a8b565b50805b80871115610a9b57505050610b0f565b80878a6000018881548110610aac57fe5b9060005260206000200160008c6000018781548110610ac757fe5b60009182526020822001939093555091909155869060018b0190610aea84610b18565b6001600160a01b0316815260208101919091526040016000205550909350610a0f9050565b50509392505050565b196001600160a01b031690565b8154818355818111156107c0576000838152602090206107c09181019083016102aa91905b80821115610b5e5760008155600101610b4a565b5090565b805415610bac576040805162461bcd60e51b8152602060048201526013602482015272185b1c9958591e481a5b9a5d1a585b1a5e9959606a1b604482015290519081900360640190fd5b8054600181018255600091825260208220015556fea265627a7a723058202bf26f45bb12b8ec6258f5039e299408732938409649721fca33bd765b3c5af864736f6c634300050a0032608060405234801561001057600080fd5b50600080546001600160a01b0319163317905560f4806100316000396000f3fe6080604052348015600f57600080fd5b506004361060325760003560e01c806361da1439146037578063e2e52ec1146063575b600080fd5b605160048036036020811015604b57600080fd5b50356085565b60408051918252519081900360200190f35b608360048036036040811015607757600080fd5b50803590602001356097565b005b60009081526001602052604090205490565b6000546001600160a01b0316331460ad57600080fd5b6000918252600160205260409091205556fea265627a7a72305820c625ddfc087af75f04c79f6b8213103319a49a2179f22a018ec9df402f19994a64736f6c634300050a0032ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa265627a7a72305820819b0f7a1fb90158588735b0c208ae7a4a02339f1c83345717350cfdfaffa31c64736f6c634300050a0032

Deployed Bytecode

0x60806040523480156200001157600080fd5b5060043610620002085760003560e01c806389535803116200011d578063a9059cbb11620000b1578063c57981b5116200007b578063c57981b51462000696578063dd62ed3e14620006a0578063fa7e8dc714620006d1578063ff12bbf414620006db5762000208565b8063a9059cbb146200059f578063b00cf04914620005ce578063bbac119314620005f7578063c47f002714620006205762000208565b80638da5cb5b11620000f35780638da5cb5b146200053457806395d89b41146200055a578063a12ab7701462000564578063a486309d146200056e5762000208565b80638953580314620004ac57806389f3546814620004db5780638cec999314620005145762000208565b806323b872dd11620001a157806343684b21116200016b57806343684b2114620004465780634849f5c8146200046f57806370a0823114620004795780637c32cdd114620004a25762000208565b806323b872dd14620003b4578063313ce56714620003ed5780633767e339146200040d578063399ae72414620004175762000208565b8063095ea7b311620001e3578063095ea7b3146200031557806313af4035146200034457806316b627d1146200036f57806318160ddd14620003985762000208565b806306fdde03146200020d57806308acece2146200028f57806308eaae4d14620002d2575b600080fd5b620002176200070c565b6040805160208082528351818301528351919283929083019185019080838360005b838110156200025357818101518382015260200162000239565b50505050905090810190601f168015620002815780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b620002be60048036036040811015620002a757600080fd5b506001600160a01b0381351690602001356200079e565b604080519115158252519081900360200190f35b620002f260048036036020811015620002ea57600080fd5b50356200083f565b604080516001600160a01b03909316835260208301919091528051918290030190f35b620002be600480360360408110156200032d57600080fd5b506001600160a01b038135169060200135620008cb565b6200036d600480360360208110156200035c57600080fd5b50356001600160a01b031662000926565b005b620002be600480360360208110156200038757600080fd5b50356001600160a01b0316620009dd565b620003a2620009f2565b60408051918252519081900360200190f35b620002be60048036036060811015620003cc57600080fd5b506001600160a01b03813581169160208101359091169060400135620009f8565b620003f762000a9a565b6040805160ff9092168252519081900360200190f35b620003a262000a9f565b6200036d600480360360408110156200042f57600080fd5b506001600160a01b03813516906020013562000aa5565b620002be600480360360208110156200045e57600080fd5b50356001600160a01b031662000bec565b620002f262000c01565b620003a2600480360360208110156200049157600080fd5b50356001600160a01b031662000c85565b620003a262000c92565b620003a260048036036040811015620004c457600080fd5b506001600160a01b03813516906020013562000d0c565b620002be60048036036060811015620004f357600080fd5b506001600160a01b0381358116916020810135909116906040013562000d21565b6200036d600480360360208110156200052c57600080fd5b503562000d60565b6200053e62000def565b604080516001600160a01b039092168252519081900360200190f35b6200021762000dfe565b6200053e62000e1e565b6200036d600480360360408110156200058657600080fd5b506001600160a01b038135169060200135151562000e2d565b620002be60048036036040811015620005b757600080fd5b506001600160a01b03813516906020013562000eea565b620003a260048036036020811015620005e657600080fd5b50356001600160a01b031662000f29565b6200036d600480360360208110156200060f57600080fd5b50356001600160a01b031662000faf565b6200036d600480360360208110156200063857600080fd5b8101906020810181356401000000008111156200065457600080fd5b8201836020820111156200066757600080fd5b803590602001918460018302840111640100000000831117156200068a57600080fd5b50909250905062001066565b620003a2620011a8565b620003a260048036036040811015620006b857600080fd5b506001600160a01b0381358116916020013516620011ad565b620003a2620011bb565b6200036d60048036036040811015620006f357600080fd5b506001600160a01b038135169060200135151562001201565b6003805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015620007965780601f106200076a5761010080835404028352916020019162000796565b820191906000526020600020905b8154815290600101906020018083116200077857829003601f168201915b505050505081565b60006007543a60001480620007b25750455a115b15620008235760005a9050620007cd333387876001620012be565b6001925060005a820390506064838202045a92505b805a840310156200081a57600180546040805160208082019390935281518082038401815290820190915280519101209055620007e2565b50505062000838565b62000833333386866001620012be565b600191505b5092915050565b6006546040805163e2095c0760e01b815260048101849052815160009384936001600160a01b039091169263e2095c079260248083019392829003018186803b1580156200088c57600080fd5b505afa158015620008a1573d6000803e3d6000fd5b505050506040513d6040811015620008b857600080fd5b5080516020909101519092509050915091565b6040805182815290516000916001600160a01b0385169133917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925919081900360200190a36200091c338484620015fe565b5060015b92915050565b6000546001600160a01b0316331462000973576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9037bbb732b960b11b604482015290519081900360640190fd5b600054604080516001600160a01b039283168152918316602083015280517f5c486528ec3e3f0ea91181cff8116f02bfa350e03b8b6f12e00765adbb5af85c9281900390910190a1600080546001600160a01b0319166001600160a01b0392909216919091179055565b60056020526000908152604090205460ff1681565b60025481565b60006007543a6000148062000a0c5750455a115b1562000a7d5760005a905062000a27338787876000620012be565b6001925060005a820390506064838202045a92505b805a8403101562000a745760018054604080516020808201939093528151808203840181529082019091528051910120905562000a3c565b50505062000a92565b62000a8d338686866000620012be565b600191505b509392505050565b601281565b60075481565b60085460ff161562000ab357fe5b6008805460ff191660011790556002541562000acb57fe5b6006546001600160a01b03161562000adf57fe5b60405162000aed9062001f03565b604051809103906000f08015801562000b0a573d6000803e3d6000fd5b50600680546001600160a01b0319166001600160a01b039283161790819055604080516000815291909216602082015281517f4b388b1aa01b2653af632da9d80cca5cfe489300086d04070fca9dc860629d4f929181900390910190a1600f60078190556040805160008152602081019290925280517fcc8f22bdbd4465d62f4861f9dcc3c020cbf6f3ede75c5d0eebf924f06f23b1c99281900390910190a16040805182815290516001600160a01b0384169160009160008051602062002de88339815191529181900360200190a362000be6828262001662565b60025550565b60046020526000908152604090205460ff1681565b60065460408051637f36e6dd60e11b8152815160009384936001600160a01b039091169263fe6dcdba9260048083019392829003018186803b15801562000c4757600080fd5b505afa15801562000c5c573d6000803e3d6000fd5b505050506040513d604081101562000c7357600080fd5b50805160209091015190925090509091565b6000620009208262001702565b60065460408051637c32cdd160e01b815290516000926001600160a01b031691637c32cdd1916004808301926020929190829003018186803b15801562000cd857600080fd5b505afa15801562000ced573d6000803e3d6000fd5b505050506040513d602081101562000d0457600080fd5b505190505b90565b600062000d1a83836200173e565b9392505050565b60006007543a6000148062000d355750455a115b1562000d505760005a905062000a27338787876001620012be565b62000a8d338686866001620012be565b6000546001600160a01b0316331462000dad576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9037bbb732b960b11b604482015290519081900360640190fd5b600754604080519182526020820183905280517fcc8f22bdbd4465d62f4861f9dcc3c020cbf6f3ede75c5d0eebf924f06f23b1c99281900390910190a1600755565b6000546001600160a01b031681565b6040518060400160405280600481526020016329a42aa360e11b81525081565b6006546001600160a01b031681565b6000546001600160a01b0316331462000e7a576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9037bbb732b960b11b604482015290519081900360640190fd5b604080516001600160a01b0384168152821515602082015281517f88cf9b943f64811022537ee9f0141770d85e612eae3a3a39241abe5ca9f11382929181900390910190a16001600160a01b03919091166000908152600560205260409020805460ff1916911515919091179055565b60006007543a6000148062000efe5750455a115b1562000f195760005a9050620007cd333387876000620012be565b62000833333386866000620012be565b6006546040805163fd6aad2560e01b81526001600160a01b0384811660048301529151600093929092169163fd6aad2591602480820192602092909190829003018186803b15801562000f7b57600080fd5b505afa15801562000f90573d6000803e3d6000fd5b505050506040513d602081101562000fa757600080fd5b505192915050565b6000546001600160a01b0316331462000ffc576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9037bbb732b960b11b604482015290519081900360640190fd5b600654604080516001600160a01b039283168152918316602083015280517f4b388b1aa01b2653af632da9d80cca5cfe489300086d04070fca9dc860629d4f9281900390910190a1600680546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314620010b3576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9037bbb732b960b11b604482015290519081900360640190fd5b6040805181815260038054600260001961010060018416150201909116049282018390527fbcfc2e8e6857ca26084ba5543a45251aaf7690f73043fff1d18c7d5f80e5cbb19290918591859190819060208201906060830190879080156200115f5780601f1062001133576101008083540402835291602001916200115f565b820191906000526020600020905b8154815290600101906020018083116200114157829003601f168201915b50508381038252848152602001858580828437600083820152604051601f909101601f191690920182900397509095505050505050a1620011a36003838362001f11565b505050565b606481565b600062000d1a838362001786565b6006546040805163949d225d60e01b815290516000926001600160a01b03169163949d225d916004808301926020929190829003018186803b15801562000cd857600080fd5b6000546001600160a01b031633146200124e576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9037bbb732b960b11b604482015290519081900360640190fd5b604080516001600160a01b0384168152821515602082015281517fc3d26c130d120a4bb874de56c8b5fb727ad2cfc3551ca49cd42ef248e893b69a929181900390910190a16001600160a01b03919091166000908152600460205260409020805460ff1916911515919091179055565b816200130557826001600160a01b0316846001600160a01b031660008051602062002de883398151915260006040518082815260200191505060405180910390a3620015f7565b6000620013128562001702565b9050828110156200135f576040805162461bcd60e51b81526020600482015260126024820152710c4c2d8c2dcc6ca40dcdee840cadcdeeaced60731b604482015290519081900360640190fd5b856001600160a01b0316856001600160a01b0316146200140057600062001387868862001786565b90506000198114620013fe5783811015620013e0576040805162461bcd60e51b81526020600482015260146024820152730c2d8d8deeec2dcc6ca40dcdee840cadcdeeaced60631b604482015290519081900360640190fd5b620013fe8688620013f8848863ffffffff620017e716565b620015fe565b505b8260008062001421886200141b868663ffffffff620017e716565b62001662565b848062001437575062001435888862001835565b155b1562001583576200145086606463ffffffff6200187916565b91508560011462001462578162001465565b60005b90506200148b6200147d838363ffffffff620018e616565b849063ffffffff620017e716565b600254909350620014a3908363ffffffff620017e716565b6002556040805183815290516000916001600160a01b038b169160008051602062002de88339815191529181900360200190a36000620014e4898862001930565b905062001508816200141b84620014fb8562001702565b9063ffffffff620018e616565b6040805183815290516001600160a01b038316917f9c2270628a9b29d30ae96b6c4c14ed646ee134febdce38a5b77f2bde9cea2e20919081900360200190a2806001600160a01b0316896001600160a01b031660008051602062002de8833981519152846040518082815260200191505060405180910390a3505b856200159b84620014fb858563ffffffff620018e616565b14620015a357fe5b620015b8876200141b85620014fb8b62001702565b866001600160a01b0316886001600160a01b031660008051602062002de8833981519152856040518082815260200191505060405180910390a3505050505b5050505050565b6040805168616c6c6f77616e636560b81b6020808301919091526001600160601b0319606086901b1660298301528251601d818403018152603d9092019092528051910120620011a39082620016548662001a5c565b919063ffffffff62001a6816565b604080516662616c616e636560c81b815290519081900360070190206200168f9082620016548562001a5c565b6006546040805163516c1daf60e11b81526001600160a01b038581166004830152602482018590529151919092169163a2d83b5e91604480830192600092919082900301818387803b158015620016e557600080fd5b505af1158015620016fa573d6000803e3d6000fd5b505050505050565b604080516662616c616e636560c81b815290519081900360070190206000906200092090620017318462001a5c565b9063ffffffff62001bc416565b600062000d1a826040516020018080646e6f6e636560d81b81525060050182815260200191505060405160208183030381529060405280519060200120620017318562001a5c565b600062000d1a82604051602001808068616c6c6f77616e636560b81b815250600901826001600160a01b03166001600160a01b031660601b815260140191505060405160208183030381529060405280519060200120620017318562001a5c565b6000818310156200182f576040805162461bcd60e51b815260206004820152600d60248201526c53756220756e646572666c6f7760981b604482015290519081900360640190fd5b50900390565b6001600160a01b03821660009081526004602052604081205460ff168062000d1a5750506001600160a01b031660009081526005602052604090205460ff16919050565b600081620018bc576040805162461bcd60e51b815260206004820152600b60248201526a446976206279207a65726f60a81b604482015290519081900360640190fd5b6000828481620018c857fe5b049050828481620018d557fe5b061562000d1a576001019392505050565b60008282018381101562000d1a576040805162461bcd60e51b815260206004820152600c60248201526b416464206f766572666c6f7760a01b604482015290519081900360640190fd5b6000806200193e8362001d3f565b905060006200194e85836200173e565b90506200196085838360010162001d5e565b6006546040805163949d225d60e01b815290516001600160a01b0390921691630af2b3e591620019f091899186918891600191889163949d225d916004808301926020929190829003018186803b158015620019bb57600080fd5b505afa158015620019d0573d6000803e3d6000fd5b505050506040513d6020811015620019e757600080fd5b50510362001da8565b6040518263ffffffff1660e01b81526004018082815260200191505060206040518083038186803b15801562001a2557600080fd5b505afa15801562001a3a573d6000803e3d6000fd5b505050506040513d602081101562001a5157600080fd5b505195945050505050565b6001600160a01b031690565b600062001a758462001e05565b905062001a828162001e92565b62001a925762001a928462001eca565b6040805160248101859052604480820185905282518083039091018152606490910182526020810180516001600160e01b031663e2e52ec160e01b178152915181516000936001600160a01b0386169392918291908083835b6020831062001b0c5780518252601f19909201916020918201910162001aeb565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811462001b70576040519150601f19603f3d011682016040523d82523d6000602084013e62001b75565b606091505b5050905080620015f7576040805162461bcd60e51b81526020600482015260156024820152746572726f722077726974696e672073746f7261676560581b604482015290519081900360640190fd5b60008062001bd28462001e05565b905062001bdf8162001e92565b62001bef57506000905062000920565b60408051602480820186905282518083039091018152604490910182526020810180516001600160e01b03166361da143960e01b178152915181516000936060936001600160a01b038716939092909182918083835b6020831062001c665780518252601f19909201916020918201910162001c45565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d806000811462001cc8576040519150601f19603f3d011682016040523d82523d6000602084013e62001ccd565b606091505b50915091508162001d1d576040805162461bcd60e51b81526020600482015260156024820152746572726f722072656164696e672073746f7261676560581b604482015290519081900360640190fd5b80806020019051602081101562001d3357600080fd5b50519695505050505050565b6000600019825b60019190910190600a90048062001d46575092915050565b620011a3826040516020018080646e6f6e636560d81b815250600501828152602001915050604051602081830303815290604052805190602001208260001b620016548662001a5c565b604080516001600160601b0319606087901b16602080830191909152603482018690526054808301869052835180840390910181526074909201909252805191012060009060018301818162001dfa57fe5b069695505050505050565b600060ff60f81b30836040518060200162001e209062001f96565b818103601f199081018352601f90910116604081815282516020938401206001600160f81b0319969096168383015260609490941b6001600160601b03191660218201526035810192909252605580830194909452825180830390940184526075909101909152815191012092915050565b6000813f801580159062000d1a57507fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470141592915050565b60606040518060200162001ede9062001f96565b6020820181038252601f19601f820116604052509050818151602083016000f5505050565b610d018062001fc283390190565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1062001f545782800160ff1982351617855562001f84565b8280016001018555821562001f84579182015b8281111562001f8457823582559160200191906001019062001f67565b5062001f9292915062001fa4565b5090565b6101258062002cc383390190565b62000d0991905b8082111562001f92576000815560010162001fab56fe608060405234801561001057600080fd5b50600080546001600160a01b03191633908117825560408051928352602083019190915280517f5c486528ec3e3f0ea91181cff8116f02bfa350e03b8b6f12e00765adbb5af85c9281900390910190a1610074600161007960201b610b621760201c565b6100fc565b8054156100e757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f616c726561647920696e697469616c697a656400000000000000000000000000604482015290519081900360640190fd5b80546001810182556000918252602082200155565b610bf68061010b6000396000f3fe608060405234801561001057600080fd5b506004361061009e5760003560e01c8063949d225d11610066578063949d225d1461012e578063a2d83b5e14610136578063e2095c0714610162578063fd6aad25146101a2578063fe6dcdba146101c85761009e565b80630af2b3e5146100a357806313af4035146100dc57806331fb7127146101045780637c32cdd11461011e5780638da5cb5b14610126575b600080fd5b6100c0600480360360208110156100b957600080fd5b50356101d0565b604080516001600160a01b039092168252519081900360200190f35b610102600480360360208110156100f257600080fd5b50356001600160a01b03166101ea565b005b61010c6102a0565b60408051918252519081900360200190f35b61010c6102a6565b6100c06102ad565b61010c6102bc565b6101026004803603604081101561014c57600080fd5b506001600160a01b0381351690602001356102cd565b61017f6004803603602081101561017857600080fd5b50356104fb565b604080516001600160a01b03909316835260208301919091528051918290030190f35b61010c600480360360208110156101b857600080fd5b50356001600160a01b0316610519565b61017f610534565b60006101e360018363ffffffff61054916565b5092915050565b6000546001600160a01b03163314610236576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9037bbb732b960b11b604482015290519081900360640190fd5b600054604080516001600160a01b039283168152918316602083015280517f5c486528ec3e3f0ea91181cff8116f02bfa350e03b8b6f12e00765adbb5af85c9281900390910190a1600080546001600160a01b0319166001600160a01b0392909216919091179055565b61020081565b6102005b90565b6000546001600160a01b031681565b60006102c8600161057c565b905090565b6000546001600160a01b03163314610319576040805162461bcd60e51b815260206004820152600a60248201526937b7363c9037bbb732b960b11b604482015290519081900360640190fd5b6000610325600161057c565b90508061038757604080518381526000602082015281516001600160a01b038616927fb7c8eb45e695579273671351c1ee88509af6ec27e061176b10f5f9fb145eff93928290030190a26103816001848463ffffffff61058416565b506104f7565b6000610393600161064f565b91506103a8905060018563ffffffff61067c16565b1561041a576103bf6001858563ffffffff61069d16565b82610415576103ce60016107c5565b505060408051600081526020810184905281516001600160a01b038716927f61072af1539e7159a567565ab0a7863c5ad61aa8daa91cf3843c3bb8bccb00e7928290030190a25b6104f4565b8215801590610433575061020082108061043357508281105b156104f457610200821061049e5760008061044e60016107c5565b91509150816001600160a01b03167f61072af1539e7159a567565ab0a7863c5ad61aa8daa91cf3843c3bb8bccb00e78286604051808381526020018281526020019250505060405180910390a250505b6104b06001858563ffffffff61058416565b604080518481526020810184905281516001600160a01b038716927fb7c8eb45e695579273671351c1ee88509af6ec27e061176b10f5f9fb145eff93928290030190a25b50505b5050565b60008061050f60018463ffffffff61054916565b915091505b915091565b6001600160a01b031660009081526002602052604090205490565b600080610541600161064f565b915091509091565b60008061057184600001846001018154811061056157fe5b9060005260206000200154610905565b915091509250929050565b546000190190565b6001600160a01b0382166000908152600184016020526040902054156105f1576040805162461bcd60e51b815260206004820152601860248201527f54686520656e74727920616c7265616479206578697374730000000000000000604482015290519081900360640190fd5b60006105fd838361091a565b84546001810186556000868152602090200181905584549091506000190161062c85828463ffffffff61092e16565b6001600160a01b0390941660009081526001909501602052505060409092205550565b805460009081906002111561066957506000905080610514565b61050f8360000160018154811061056157fe5b6001600160a01b031660009081526001919091016020526040902054151590565b6001600160a01b03821660009081526001840160205260409020548061070a576040805162461bcd60e51b815260206004820152601960248201527f54686520656e74727920646f6573206e6f742065786973747300000000000000604482015290519081900360640190fd5b6000610716848461091a565b9050600085600001838154811061072957fe5b906000526020600020015490506000818310156107585761075187858563ffffffff610a0516565b905061077a565b818311156107715761075187858563ffffffff61092e16565b505050506107c0565b8287600001828154811061078a57fe5b6000918252602090912001558084146107bb576001600160a01b038616600090815260018801602052604090208190555b505050505b505050565b8054600090819060018111610821576040805162461bcd60e51b815260206004820152601860248201527f546865206865617020646f6573206e6f74206578697374730000000000000000604482015290519081900360640190fd5b6108348460000160018154811061056157fe5b6001600160a01b03821660009081526001870160205260408120559093509150600281141561086f5760016108698582610b25565b506108ff565b600084600001600183038154811061088357fe5b9060005260206000200154905080856000016001815481106108a157fe5b60009182526020909120015560001982016108bc8682610b25565b5060016108d086828463ffffffff610a0516565b9050808660010160006108e285610b18565b6001600160a01b0316815260208101919091526040016000205550505b50915091565b196001600160a01b0381169160a09190911c90565b60a01b6001600160a01b0391909116171990565b81600181146109fe57600084600283048154811061094857fe5b906000526020600020015490505b828110156109fc57828186600285048154811061096f57fe5b90600052602060002001600088600001868154811061098a57fe5b60009182526020822001939093555091909155829060018701906109ad84610b18565b6001600160a01b0316815260208101919091526040016000205560028204915081600114156109db576109fc565b8460028304815481106109ea57fe5b90600052602060002001549050610956565b505b9392505050565b8254829060001981015b81836002021015610b0f5785546002840290600090889083908110610a3057fe5b90600052602060002001549050600082841115610a88576000896000018460010181548110610a5b57fe5b9060005260206000200154905080831015610a7e57809150836001019350610a82565b8291505b50610a8b565b50805b80871115610a9b57505050610b0f565b80878a6000018881548110610aac57fe5b9060005260206000200160008c6000018781548110610ac757fe5b60009182526020822001939093555091909155869060018b0190610aea84610b18565b6001600160a01b0316815260208101919091526040016000205550909350610a0f9050565b50509392505050565b196001600160a01b031690565b8154818355818111156107c0576000838152602090206107c09181019083016102aa91905b80821115610b5e5760008155600101610b4a565b5090565b805415610bac576040805162461bcd60e51b8152602060048201526013602482015272185b1c9958591e481a5b9a5d1a585b1a5e9959606a1b604482015290519081900360640190fd5b8054600181018255600091825260208220015556fea265627a7a723058202bf26f45bb12b8ec6258f5039e299408732938409649721fca33bd765b3c5af864736f6c634300050a0032608060405234801561001057600080fd5b50600080546001600160a01b0319163317905560f4806100316000396000f3fe6080604052348015600f57600080fd5b506004361060325760003560e01c806361da1439146037578063e2e52ec1146063575b600080fd5b605160048036036020811015604b57600080fd5b50356085565b60408051918252519081900360200190f35b608360048036036040811015607757600080fd5b50803590602001356097565b005b60009081526001602052604090205490565b6000546001600160a01b0316331460ad57600080fd5b6000918252600160205260409091205556fea265627a7a72305820c625ddfc087af75f04c79f6b8213103319a49a2179f22a018ec9df402f19994a64736f6c634300050a0032ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa265627a7a72305820819b0f7a1fb90158588735b0c208ae7a4a02339f1c83345717350cfdfaffa31c64736f6c634300050a0032

Deployed Bytecode Sourcemap

16319:9273:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16319:9273:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17006:41;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;17006:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24963:196;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;24963:196:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;23769:112;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23769:112:0;;:::i;:::-;;;;-1:-1:-1;;;;;23769:112:0;;;;;;;;;;;;;;;;;;;;;24544:213;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;24544:213:0;;;;;;;;:::i;410:134::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;410:134:0;-1:-1:-1;;;;;410:134:0;;:::i;:::-;;17217:43;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17217:43:0;-1:-1:-1;;;;;17217:43:0;;:::i;16831:26::-;;;:::i;:::-;;;;;;;;;;;;;;;;25167:204;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;25167:204:0;;;;;;;;;;;;;;;;;:::i;17099:35::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;17324:23;;;:::i;17374:638::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;17374:638:0;;;;;;;;:::i;17165:45::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;17165:45:0;-1:-1:-1;;;;;17165:45:0;;:::i;23889:96::-;;;:::i;24282:109::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24282:109:0;-1:-1:-1;;;;;24282:109:0;;:::i;23573:91::-;;;:::i;24112:124::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;24112:124:0;;;;;;;;:::i;25379:210::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;25379:210:0;;;;;;;;;;;;;;;;;:::i;23248:131::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23248:131:0;;:::i;96:20::-;;;:::i;:::-;;;;-1:-1:-1;;;;;96:20:0;;;;;;;;;;;;;;17054:38;;;:::i;17282:16::-;;;:::i;22734:179::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;22734:179:0;;;;;;;;;;:::i;24765:190::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;24765:190:0;;;;;;;;:::i;23993:111::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23993:111:0;-1:-1:-1;;;;;23993:111:0;;:::i;23387:133::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23387:133:0;-1:-1:-1;;;;;23387:133:0;;:::i;23114:126::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;23114:126:0;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;23114:126:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;23114:126:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;23114:126:0;;-1:-1:-1;23114:126:0;-1:-1:-1;23114:126:0;:::i;16947:33::-;;;:::i;24399:137::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;24399:137:0;;;;;;;;;;:::i;23672:89::-;;;:::i;22921:185::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;22921:185:0;;;;;;;;;;:::i;17006:41::-;;;;;;;;;;;;;;;-1:-1:-1;;17006:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;24963:196::-;25056:4;25037:8;;5468:11;5483:1;5468:16;:46;;;;5500:14;5488:9;:26;5468:46;5464:454;;;5531:16;5550:9;5531:28;;25073:56;25087:10;25099;25111:3;25116:6;25124:4;25073:13;:56::i;:::-;25147:4;25140:11;;5590:13;5617:9;5606:20;;;-1:-1:-1;5678:3:0;5659:15;;;5658:23;5707:9;5696:20;;5731:142;5761:6;5749:9;5738:8;:20;:29;5731:142;;;5851:4;;;5834:22;;;;;;;;;;;;;26:21:-1;;;22:32;;6:49;;5834:22:0;;;;;;5824:33;;;;;5817:40;;5731:142;;;5464:454;;;;;;25073:56;25087:10;25099;25111:3;25116:6;25124:4;25073:13;:56::i;:::-;25147:4;25140:11;;5905:1;24963:196;;;;;:::o;23769:112::-;23859:4;;:14;;;-1:-1:-1;;;23859:14:0;;;;;;;;;;23823:7;;;;-1:-1:-1;;;;;23859:4:0;;;;:10;;:14;;;;;;;;;;;:4;:14;;;5:2:-1;;;;30:1;27;20:12;5:2;23859:14:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23859:14:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23859:14:0;;;;;;;;;-1:-1:-1;23859:14:0;-1:-1:-1;23769:112:0;;;:::o;24544:213::-;24635:38;;;;;;;;24613:4;;-1:-1:-1;;;;;24635:38:0;;;24644:10;;24635:38;;;;;;;;;;24684:43;24698:10;24710:8;24720:6;24684:13;:43::i;:::-;-1:-1:-1;24745:4:0;24544:213;;;;;:::o;410:134::-;362:5;;-1:-1:-1;;;;;362:5:0;348:10;:19;340:42;;;;;-1:-1:-1;;;340:42:0;;;;;;;;;;;;-1:-1:-1;;;340:42:0;;;;;;;;;;;;;;;497:5;;479:32;;;-1:-1:-1;;;;;497:5:0;;;479:32;;;;;;;;;;;;;;;;;;;;;522:5;:14;;-1:-1:-1;;;;;;522:14:0;-1:-1:-1;;;;;522:14:0;;;;;;;;;;410:134::o;17217:43::-;;;;;;;;;;;;;;;:::o;16831:26::-;;;;:::o;25167:204::-;25272:4;25253:8;;5468:11;5483:1;5468:16;:46;;;;5500:14;5488:9;:26;5468:46;5464:454;;;5531:16;5550:9;5531:28;;25289:52;25303:10;25315:5;25322:3;25327:6;25335:5;25289:13;:52::i;:::-;25359:4;25352:11;;5590:13;5617:9;5606:20;;;-1:-1:-1;5678:3:0;5659:15;;;5658:23;5707:9;5696:20;;5731:142;5761:6;5749:9;5738:8;:20;:29;5731:142;;;5851:4;;;5834:22;;;;;;;;;;;;;26:21:-1;;;22:32;;6:49;;5834:22:0;;;;;;5824:33;;;;;5817:40;;5731:142;;;5464:454;;;;;;25289:52;25303:10;25315:5;25322:3;25327:6;25335:5;25289:13;:52::i;:::-;25359:4;25352:11;;5905:1;25167:204;;;;;;:::o;17099:35::-;17132:2;17099:35;:::o;17324:23::-;;;;:::o;17374:638::-;17498:6;;;;17497:7;17490:15;;;;17516:6;:13;;-1:-1:-1;;17516:13:0;17525:4;17516:13;;;17575:11;;:16;17568:24;;;;17618:4;;-1:-1:-1;;;;;17618:4:0;17610:27;17603:35;;;;17682:10;;;;;:::i;:::-;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;17675:4:0;:17;;-1:-1:-1;;;;;;17675:17:0;-1:-1:-1;;;;;17675:17:0;;;;;;;;17708:34;;;-1:-1:-1;17708:34:0;;17736:4;;;;17708:34;;;;;;;;;;;;;;;;;17844:2;17833:8;:13;;;17862:24;;;17874:1;17862:24;;;;;;;;;;;;;;;;;;;;;17902:34;;;;;;;;-1:-1:-1;;;;;17902:34:0;;;17919:1;;-1:-1:-1;;;;;;;;;;;17902:34:0;;;;;;;;17947:25;17959:3;17964:7;17947:11;:25::i;:::-;17983:11;:21;-1:-1:-1;17374:638:0:o;17165:45::-;;;;;;;;;;;;;;;:::o;23889:96::-;23967:4;;:10;;;-1:-1:-1;;;23967:10:0;;;;23931:7;;;;-1:-1:-1;;;;;23967:4:0;;;;:8;;:10;;;;;;;;;;;:4;:10;;;5:2:-1;;;;30:1;27;20:12;5:2;23967:10:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23967:10:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23967:10:0;;;;;;;;;-1:-1:-1;23967:10:0;-1:-1:-1;23889:96:0;;:::o;24282:109::-;24339:7;24366:17;24377:5;24366:10;:17::i;23573:91::-;23642:4;;:14;;;-1:-1:-1;;;23642:14:0;;;;23615:7;;-1:-1:-1;;;;;23642:4:0;;:12;;:14;;;;;;;;;;;;;;:4;:14;;;5:2:-1;;;;30:1;27;20:12;5:2;23642:14:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23642:14:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23642:14:0;;-1:-1:-1;23573:91:0;;:::o;24112:124::-;24182:7;24209:19;24216:5;24223:4;24209:6;:19::i;:::-;24202:26;24112:124;-1:-1:-1;;;24112:124:0:o;25379:210::-;25491:4;25472:8;;5468:11;5483:1;5468:16;:46;;;;5500:14;5488:9;:26;5468:46;5464:454;;;5531:16;5550:9;5531:28;;25508:51;25522:10;25534:5;25541:3;25546:6;25554:4;25508:13;:51::i;5464:454::-;25508:51;25522:10;25534:5;25541:3;25546:6;25554:4;25508:13;:51::i;23248:131::-;362:5;;-1:-1:-1;;;;;362:5:0;348:10;:19;340:42;;;;;-1:-1:-1;;;340:42:0;;;;;;;;;;;;-1:-1:-1;;;340:42:0;;;;;;;;;;;;;;;23330:8;;23318:27;;;;;;;;;;;;;;;;;;;;;;;;23356:8;:15;23248:131::o;96:20::-;;;-1:-1:-1;;;;;96:20:0;;:::o;17054:38::-;;;;;;;;;;;;;;-1:-1:-1;;;17054:38:0;;;;:::o;17282:16::-;;;-1:-1:-1;;;;;17282:16:0;;:::o;22734:179::-;362:5;;-1:-1:-1;;;;;362:5:0;348:10;:19;340:42;;;;;-1:-1:-1;;;340:42:0;;;;;;;;;;;;-1:-1:-1;;;340:42:0;;;;;;;;;;;;;;;22829:32;;;-1:-1:-1;;;;;22829:32:0;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22872:18:0;;;;;;;;:11;:18;;;;;:33;;-1:-1:-1;;22872:33:0;;;;;;;;;;22734:179::o;24765:190::-;24851:4;24832:8;;5468:11;5483:1;5468:16;:46;;;;5500:14;5488:9;:26;5468:46;5464:454;;;5531:16;5550:9;5531:28;;24868:57;24882:10;24894;24906:3;24911:6;24919:5;24868:13;:57::i;5464:454::-;24868:57;24882:10;24894;24906:3;24911:6;24919:5;24868:13;:57::i;23993:111::-;24077:4;;:19;;;-1:-1:-1;;;24077:19:0;;-1:-1:-1;;;;;24077:19:0;;;;;;;;;24050:7;;24077:4;;;;;:12;;:19;;;;;;;;;;;;;;;:4;:19;;;5:2:-1;;;;30:1;27;20:12;5:2;24077:19:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24077:19:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24077:19:0;;23993:111;-1:-1:-1;;23993:111:0:o;23387:133::-;362:5;;-1:-1:-1;;;;;362:5:0;348:10;:19;340:42;;;;;-1:-1:-1;;;340:42:0;;;;;;;;;;;;-1:-1:-1;;;340:42:0;;;;;;;;;;;;;;;23467:4;;23451:38;;;-1:-1:-1;;;;;23467:4:0;;;23451:38;;;;;;;;;;;;;;;;;;;;;23500:4;:12;;-1:-1:-1;;;;;;23500:12:0;-1:-1:-1;;;;;23500:12:0;;;;;;;;;;23387:133::o;23114:126::-;362:5;;-1:-1:-1;;;;;362:5:0;348:10;:19;340:42;;;;;-1:-1:-1;;;340:42:0;;;;;;;;;;;;-1:-1:-1;;;340:42:0;;;;;;;;;;;;;;;23189:20;;;;;;23197:4;23189:20;;;-1:-1:-1;;23189:20:0;;;;;;;;;;;;;;;;;;;23197:4;;23203:5;;;;23189:20;;;;;;;;;;;23197:4;;23189:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;23189:20:0;;;;;;;;;;;;;;;1:33:-1;99:1;81:16;;;74:27;23189:20:0;;137:4:-1;117:14;;;-1:-1;;113:30;157:16;;;23189:20:0;;;;-1:-1:-1;23189:20:0;;-1:-1:-1;;;;;;23189:20:0;23220:12;:4;23227:5;;23220:12;:::i;:::-;;23114:126;;:::o;16947:33::-;16977:3;16947:33;:::o;24399:137::-;24474:7;24501:27;24512:5;24519:8;24501:10;:27::i;23672:89::-;23742:4;;:11;;;-1:-1:-1;;;23742:11:0;;;;23715:7;;-1:-1:-1;;;;;23742:4:0;;:9;;:11;;;;;;;;;;;;;;:4;:11;;;5:2:-1;;;;30:1;27;20:12;22921:185:0;362:5;;-1:-1:-1;;;;;362:5:0;348:10;:19;340:42;;;;;-1:-1:-1;;;340:42:0;;;;;;;;;;;;-1:-1:-1;;;340:42:0;;;;;;;;;;;;;;;23018:34;;;-1:-1:-1;;;;;23018:34:0;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23063:20:0;;;;;;;;:13;:20;;;;;:35;;-1:-1:-1;;23063:35:0;;;;;;;;;;22921:185::o;20205:2483::-;20410:11;20406:93;;20459:3;-1:-1:-1;;;;;20443:23:0;20452:5;-1:-1:-1;;;;;20443:23:0;-1:-1:-1;;;;;;;;;;;20464:1:0;20443:23;;;;;;;;;;;;;;;;;;20481:7;;20406:93;20543:19;20565:17;20576:5;20565:10;:17::i;:::-;20543:39;;20616:6;20601:11;:21;;20593:52;;;;;-1:-1:-1;;;20593:52:0;;;;;;;;;;;;-1:-1:-1;;;20593:52:0;;;;;;;;;;;;;;;20711:9;-1:-1:-1;;;;;20702:18:0;:5;-1:-1:-1;;;;;20702:18:0;;20698:480;;20780:21;20804:28;20815:5;20822:9;20804:10;:28::i;:::-;20780:52;;-1:-1:-1;;20919:13:0;:25;20915:252;;21043:6;21026:13;:23;;21018:56;;;;;-1:-1:-1;;;21018:56:0;;;;;;;;;;;;-1:-1:-1;;;21018:56:0;;;;;;;;;;;;;;;21093:58;21107:5;21114:9;21125:25;:13;21143:6;21125:25;:17;:25;:::i;:::-;21093:13;:58::i;:::-;20698:480;;21289:6;21271:15;;21396:43;21408:5;21415:23;:11;21289:6;21415:23;:15;:23;:::i;:::-;21396:11;:43::i;:::-;21583:7;:38;;;;21595:26;21610:5;21617:3;21595:14;:26::i;:::-;21594:27;21583:38;21579:843;;;21777:20;:6;16977:3;21777:20;:15;:20;:::i;:::-;21770:27;;21819:6;21829:1;21819:11;:22;;21837:4;21819:22;;;21833:1;21819:22;21812:29;-1:-1:-1;21919:27:0;21931:14;:4;21812:29;21931:14;:8;:14;:::i;:::-;21919:7;;:27;:11;:27;:::i;:::-;22005:11;;21909:37;;-1:-1:-1;22005:21:0;;22021:4;22005:21;:15;:21;:::i;:::-;21991:11;:35;22046:33;;;;;;;;22070:1;;-1:-1:-1;;;;;22046:33:0;;;-1:-1:-1;;;;;;;;;;;22046:33:0;;;;;;;;22171:14;22188:26;22200:5;22207:6;22188:11;:26::i;:::-;22171:43;;22272:49;22284:6;22292:28;22315:4;22292:18;22303:6;22292:10;:18::i;:::-;:22;:28;:22;:28;:::i;22272:49::-;22341:20;;;;;;;;-1:-1:-1;;;;;22341:20:0;;;;;;;;;;;;;22397:6;-1:-1:-1;;;;;22381:29:0;22390:5;-1:-1:-1;;;;;22381:29:0;-1:-1:-1;;;;;;;;;;;22405:4:0;22381:29;;;;;;;;;;;;;;;;;;21579:843;;22534:6;22503:27;22522:7;22503:14;:4;22512;22503:14;:8;:14;:::i;:27::-;:37;22496:45;;;;22589:46;22601:3;22606:28;22626:7;22606:15;22617:3;22606:10;:15::i;22589:46::-;22667:3;-1:-1:-1;;;;;22651:29:0;22660:5;-1:-1:-1;;;;;22651:29:0;-1:-1:-1;;;;;;;;;;;22672:7:0;22651:29;;;;;;;;;;;;;;;;;;20205:2483;;;;;;;;;;:::o;18742:188::-;18864:39;;;-1:-1:-1;;;18864:39:0;;;;;;;;-1:-1:-1;;;;;;18864:39:0;;;;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;18864:39:0;;;;;;;18854:50;;;;;18834:88;;18914:6;18834:13;18841:5;18834:6;:13::i;:::-;:19;:88;;:19;:88;:::i;19118:172::-;16905:20;;;-1:-1:-1;;;16905:20:0;;;;;;;;;;;;19192:51;;19233:8;19192:13;19199:5;19192:6;:13::i;:51::-;19254:4;;:28;;;-1:-1:-1;;;19254:28:0;;-1:-1:-1;;;;;19254:28:0;;;;;;;;;;;;;;;:4;;;;;:11;;:28;;;;;:4;;:28;;;;;;;:4;;:28;;;5:2:-1;;;;30:1;27;20:12;5:2;19254:28:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;19254:28:0;;;;19118:172;;:::o;18203:133::-;16905:20;;;-1:-1:-1;;;16905:20:0;;;;;;;;;;;;18261:7;;18296:31;;:13;18303:5;18296:6;:13::i;:::-;:18;:31;:18;:31;:::i;18542:174::-;18610:7;18645:62;18700:4;18674:31;;;;;;-1:-1:-1;;;18674:31:0;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;18674:31:0;;;18664:42;;;;;;18645:13;18652:5;18645:6;:13::i;18344:190::-;18420:7;18455:70;18514:8;18484:39;;;;;;-1:-1:-1;;;18484:39:0;;;;;;-1:-1:-1;;;;;18484:39:0;-1:-1:-1;;;;;18484:39:0;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;18484:39:0;;;18474:50;;;;;;18455:13;18462:5;18455:6;:13::i;3785:141::-;3843:7;3876:1;3871;:6;;3863:32;;;;;-1:-1:-1;;;3863:32:0;;;;;;;;;;;;-1:-1:-1;;;3863:32:0;;;;;;;;;;;;;;;-1:-1:-1;3913:5:0;;;3785:141::o;19343:145::-;-1:-1:-1;;;;;19442:20:0;;19418:4;19442:20;;;:13;:20;;;;;;;;;:38;;-1:-1:-1;;;;;;;19464:16:0;;;;;:11;:16;;;;;;;;;19343:145;-1:-1:-1;19343:145:0:o;4318:232::-;4381:7;4409:6;4401:30;;;;;-1:-1:-1;;;4401:30:0;;;;;;;;;;;;-1:-1:-1;;;4401:30:0;;;;;;;;;;;;;;;4442:9;4458:1;4454;:5;;;;;;4442:17;;4478:1;4474;:5;;;;;;:10;4470:52;;4509:1;4505:5;4541:1;4318:232;-1:-1:-1;;;4318:232:0:o;3613:164::-;3671:7;3703:5;;;3727:6;;;;3719:31;;;;;-1:-1:-1;;;3719:31:0;;;;;;;;;;;;-1:-1:-1;;;3719:31:0;;;;;;;;;;;;;;19726:471;19796:14;19868:17;19888:29;19910:6;19888:21;:29::i;:::-;19868:49;;19982:13;19998:24;20005:5;20012:9;19998:6;:24::i;:::-;19982:40;;20033:38;20043:5;20050:9;20061:5;20069:1;20061:9;20033;:38::i;:::-;20124:4;;20172:11;;;-1:-1:-1;;;20172:11:0;;;;-1:-1:-1;;;;;20124:4:0;;;;:14;;20139:49;;20147:5;;20154;;20161:9;;20124:4;;;;20172:9;;:11;;;;;;;;;;;;;;20124:4;20172:11;;;5:2:-1;;;;30:1;27;20:12;5:2;20172:11:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20172:11:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20172:11:0;:15;20139:7;:49::i;:::-;20124:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20124:65:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;20124:65:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20124:65:0;;19726:471;-1:-1:-1;;;;;19726:471:0:o;18091:104::-;-1:-1:-1;;;;;18176:10:0;;18091:104::o;2324:569::-;2440:17;2472:21;2485:7;2472:12;:21::i;:::-;2440:54;;2510:37;2540:5;2510:21;:37::i;:::-;2505:86;;2564:15;2571:7;2564:6;:15::i;:::-;2696:124;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;2696:124:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;2662:169:0;;;;2644:12;;-1:-1:-1;;;;;2662:19:0;;;2696:124;2662:169;;;25:18:-1;2662:169:0;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;2662:169:0;;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;2643:188:0;;;2852:7;2844:41;;;;;-1:-1:-1;;;2844:41:0;;;;;;;;;;;;-1:-1:-1;;;2844:41:0;;;;;;;;;;;;;;2901:610;2994:7;3014:17;3046:21;3059:7;3046:12;:21::i;:::-;3014:54;;3084:37;3114:5;3084:21;:37::i;:::-;3079:88;;-1:-1:-1;3153:1:0;;-1:-1:-1;3138:17:0;;3079:88;3295:98;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;3295:98:0;;;;;;;25:18:-1;;61:17;;-1:-1;;;;;182:15;-1:-1;;;179:29;160:49;;3255:149:0;;;;3220:12;;3234:17;;-1:-1:-1;;;;;3255:25:0;;;3295:98;;3255:149;;;;;;25:18:-1;36:153;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;3255:149:0;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;3219:185:0;;;;3425:7;3417:41;;;;;-1:-1:-1;;;3417:41:0;;;;;;;;;;;;-1:-1:-1;;;3417:41:0;;;;;;;;;;;;;;;3487:4;3476:27;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3476:27:0;;2901:610;-1:-1:-1;;;;;;2901:610:0:o;4644:270::-;4708:7;-1:-1:-1;;4779:5:0;4797:83;4840:9;;;;;;4823:2;4815:10;;;4797:83;;-1:-1:-1;4899:7:0;4644:270;-1:-1:-1;;4644:270:0:o;18938:172::-;19022:80;19078:4;19052:31;;;;;;-1:-1:-1;;;19052:31:0;;;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;19052:31:0;;;19042:42;;;;;;19094:6;19086:15;;19022:13;19029:5;19022:6;:13::i;19496:222::-;19642:31;;;-1:-1:-1;;;;;;19642:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;19642:31:0;;;;;;;19632:42;;;;;19589:7;;19708:1;19701:8;;19632:42;19701:8;19693:17;;;;;;19496:222;-1:-1:-1;;;;;;19496:222:0:o;1631:439::-;1692:7;1847:4;1842:10;;1887:4;1919:7;1963:30;;;;;;;;:::i;:::-;21:26:-1;;;-1:-1;;21:26;;;7:41;;87:2;69:12;;;65:26;61:2;54:38;;;1953:41:0;;41:4:-1;30:16;;;1953:41:0;-1:-1:-1;;;;;;1799:218:0;;;;;;;;;;;;;-1:-1:-1;;;;;;1799:218:0;;;;;;;;;;;;;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;1799:218:0;;;;;;;1767:269;;;;;;1631:439;-1:-1:-1;;1631:439:0:o;1182:323::-;1240:4;1347:18;;1384:22;;;;;:113;;-1:-1:-1;1430:66:0;1410:87;;;1377:120;-1:-1:-1;;1182:323:0:o;2078:238::-;2130:21;2154:30;;;;;;;;:::i;:::-;41:4:-1;34:5;30:16;25:3;21:26;14:5;7:41;87:2;83:7;78:2;73:3;69:12;65:26;61:2;54:38;2154:30:0;2130:54;;2298:7;2287:8;2281:15;2274:4;2264:8;2260:19;2257:1;2249:57;2245:62;2243:66;;:::o;16319:9273::-;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;16319:9273:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16319:9273:0;;;-1:-1:-1;16319:9273:0;:::i;:::-;;;:::o;:::-;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;

Swarm Source

bzzr://819b0f7a1fb90158588735b0c208ae7a4a02339f1c83345717350cfdfaffa31c
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.