ETH Price: $1,971.24 (-1.83%)
 

Overview

Max Total Supply

20,000,000,000 BLOOD

Holders

213 (0.00%)

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 8 Decimals)

Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

The token used for the BLOOD platform (BLOODLAND, BLOOD wallet, etc.)

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
TestToken

Compiler Version
v0.5.8+commit.23d335f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity Multiple files format)

File 11 of 11: TestToken.sol
pragma solidity ^0.5.0;

import "./BloodToken.sol";

contract TestToken is BloodToken {

    constructor()
    BloodToken("BLOOD", "BLOOD", 8, 40e9)
    public
    {
        mint(msg.sender, 20e9 * (10 ** uint256(decimals())));
    }
}

File 1 of 11: BloodToken.sol
pragma solidity ^0.5.0;

import "./Ownable.sol";
import "./Math.sol";
import "./ERC20.sol";
import "./ERC20Detailed.sol";
import "./LockAmount.sol";

contract BloodToken is ERC20, ERC20Detailed, LockAmount {
    using Math for uint256;

    uint256 private _maxSupply;
    
    constructor(string memory name, string memory symbol, uint8 decimals, uint256 maximumSupply) public ERC20Detailed(name, symbol, decimals) {
        _maxSupply = maximumSupply * (10 ** uint256(decimals));
    }
    
    /**
     * @dev 최대 공급량
     */
    function maxSupply() public view returns (uint256) {
        return _maxSupply;
    }
    
    /**
     * @dev 사용가능 잔액조회
     */
    function availableBalanceOf(address account) public view returns (uint256) {
        require(account != address(0), "BloodToken: address is the zero address");

        uint256 lockedAmount = getLockedAmountOfLockTable(account);
        
        // 현재 잔액 락금액을 뺌, 락금액이 더 큰 경우 0
        if (_balances[account] < lockedAmount) return 0;
        
        return _balances[account].sub(lockedAmount);
    }
    
    /**
     * @dev ADMIN 발행
     */
    function mint(address account, uint256 amount) onlyOwner public returns (bool) { 
        require(_totalSupply.add(amount) <= _maxSupply, "BloodToken: Issued exceeds maximum supply");
        
        _mint(account, amount);
        return true;
    }
    
    /**
     * @dev ADMIN 소각
     */
    function burn(uint256 amount) onlyOwner public returns (bool){
        require(_balances[_msgSender()] >= amount, "BloodToken: destruction amount exceeds balance");
        
        _burn(_msgSender(), amount);
        return true;
    }

    /**
     * @dev ERC20 _transfer() 재정의
     */
    function _transfer(address sender, address recipient, uint256 amount) internal {
        require(sender != address(0), "BloodToken: transfer from the zero address");
        require(recipient != address(0), "BloodToken: transfer to the zero address");
        
        uint256 lockedAmount = getLockedAmountOfLockTable(sender);
        require(_balances[sender].sub(amount) >= lockedAmount, "BloodToken: exceeded amount available");

        _balances[sender] = _balances[sender].sub(amount, "BloodToken: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }
    
    /**
     * @dev 락금액조회
     */
    function getLockedAmount(address account) public view returns (uint256) {
        require(account != address(0), "BloodToken: address is the zero address");

        uint256 lockedAmount = getLockedAmountOfLockTable(account);

        // 락금액과 현재 잔액을 비교하여 작은 값을 출력
        return Math.min(lockedAmount, _balances[account]);
    }
}

File 2 of 11: Context.sol
pragma solidity ^0.5.0;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
contract Context {
    // Empty internal constructor, to prevent people from mistakenly deploying
    // an instance of this contract, which should be used via inheritance.
    constructor () public { }
    // solhint-disable-previous-line no-empty-blocks

    function _msgSender() internal view returns (address payable) {
        return msg.sender;
    }

    function _msgData() internal view returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

File 3 of 11: ERC20.sol
pragma solidity ^0.5.0;

import "./Context.sol";
import "./IERC20.sol";
import "./SafeMath.sol";

/**
 * @dev Implementation of the {IERC20} interface.
 */
contract ERC20 is Context, IERC20 {
    using SafeMath for uint256;

    mapping (address => uint256) internal _balances;

    mapping (address => mapping (address => uint256)) internal _allowances;

    uint256 internal _totalSupply;

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20};
     *
     * Requirements:
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for `sender`'s tokens of at least
     * `amount`.
     */
    function transferFrom(address sender, address recipient, uint256 amount) public returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(address sender, address recipient, uint256 amount) internal {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements
     *
     * - `to` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal {
        require(account != address(0), "ERC20: mint to the zero address");

        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Mint(account, amount);
        emit Transfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal {
        require(account != address(0), "ERC20: burn from the zero address");

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
        emit Burn(account, amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens.
     *
     * This is internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(address owner, address spender, uint256 amount) internal {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`.`amount` is then deducted
     * from the caller's allowance.
     *
     * See {_burn} and {_approve}.
     */
    function _burnFrom(address account, uint256 amount) internal {
        _burn(account, amount);
        _approve(account, _msgSender(), _allowances[account][_msgSender()].sub(amount, "ERC20: burn amount exceeds allowance"));
    }
}

File 4 of 11: ERC20Detailed.sol
pragma solidity ^0.5.0;

import "./IERC20.sol";

/**
 * @dev Optional functions from the ERC20 standard.
 */
contract ERC20Detailed is IERC20 {
    string private _name;
    string private _symbol;
    uint8 private _decimals;

    /**
     * @dev Sets the values for `name`, `symbol`, and `decimals`. All three of
     * these values are immutable: they can only be set once during
     * construction.
     */
    constructor (string memory name, string memory symbol, uint8 decimals) public {
        _name = name;
        _symbol = symbol;
        _decimals = decimals;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5,05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei.
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view returns (uint8) {
        return _decimals;
    }
}

File 5 of 11: IERC20.sol
pragma solidity ^0.5.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP. Does not include
 * the optional functions; to access them see {ERC20Detailed}.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

File 6 of 11: LockAmount.sol
pragma solidity ^0.5.0;

import "./Ownable.sol";

contract LockAmount is Ownable {
    /**
     * @dev 락정보 정의 (시간, 락금액)
     */
    struct LockInfo {
        uint256 timestamp;
        uint256 lockedAmount;
    }
    
    /**
     * @dev 락정보
     */
    mapping (address => string) internal _accountLockTypes;
    mapping (string => LockInfo[]) internal _lockInfoTable;
    
    /**
     * @dev 이벤트
     */
    event SetAccountLockType(address account, string lockType);
    event AddLockInfo(string  lockType, uint256 timestamp, uint256 lockAmount);
    event RemoveLockInfo(string lockType, uint256 timestamp);
    event ClearLockInfo(string lockType);
    
    /**
     * @dev 락테이블에서 현재시간의 락잔액조회
     */
    function getLockedAmountOfLockTable(address account) public view returns (uint256) {
        string memory lockType = _accountLockTypes[account];
        if (bytes(lockType).length != 0) {
            // 락금액 검색
            LockInfo[] memory array = _lockInfoTable[lockType];
            for (uint256 i = 0; i < array.length; i++) {
                if (array[i].timestamp >= block.timestamp) {
                    return array[i].lockedAmount;
                }
            }
        }
        return 0;
    }
    
    function getblockTimestamp() public view returns (uint256) {
        return block.timestamp;
    }
    
    /**
     * @dev ADMIN 락타입 설정
     */
    function setAccountLockType(address account, string memory lockType) onlyOwner public returns (bool) {
        _accountLockTypes[account] = lockType;
        emit SetAccountLockType(account, lockType);
        return true;
    }
    
    /**
     * @dev 락타입
     */
    function getAddressLockType (address account) public view returns (string memory) {
        return _accountLockTypes[account];
    }
    
    /**
     * @dev ADMIN 락정보 추가
     */
    function addLockInfo(string memory lockType, uint256 timestamp, uint256 lockAmount) onlyOwner public returns (bool) {
        require(bytes(lockType).length != 0, "lockType must be not empty");

        // 락정보 인덱스 검색
        uint256 index = 0;
        LockInfo[] storage array = _lockInfoTable[lockType];
        for (index = 0; index < array.length; index++) {
            if (array[index].timestamp < timestamp) continue;
            if (array[index].timestamp > timestamp) break;

            if (index - 1 < array.length && array[index - 1].lockedAmount < lockAmount) return false;          
            if (index + 1 < array.length && array[index + 1].lockedAmount > lockAmount) return false;
            
            array[index].lockedAmount = lockAmount;
            
            emit AddLockInfo(lockType, timestamp, lockAmount);
            return true;
        }
        
        if (index - 1 < array.length && array[index - 1].lockedAmount < lockAmount) return false;          
        if (index < array.length && array[index].lockedAmount > lockAmount) return false;
        
        // 락정보 삽입
        array.length++;
        for (uint256 i = array.length - 1; i > index; i--) {
            array[i] = array[i - 1];
        }
        array[index] = LockInfo(timestamp, lockAmount);
        
        emit AddLockInfo(lockType, timestamp, lockAmount);
        return true;
    }
    
    /**
     * @dev ADMIN 락정보 삭제
     */
    function removeLockInfo(string memory lockType, uint256 timestamp) onlyOwner public returns (bool) {
        require(bytes(lockType).length != 0, "lockType must be not empty");

        LockInfo[] storage array = _lockInfoTable[lockType];
        if (array.length == 0) return false;

        // 락정보 인덱스 검색
        uint256 index = 2 ** 256 - 1;
        for (uint256 i = 0; i < array.length; i++) {
            if (array[i].timestamp == timestamp) {
                index = i;
                break;
            }
        }
        
        if (index == 2 ** 256 - 1) return false;

        // 락정보 삭제
        for (uint256 j = index; j < array.length - 1; j++) {
            array[j] = array[j + 1];
        }
        delete array[array.length - 1];
        array.length--;
        
        emit RemoveLockInfo(lockType, timestamp);
        return true;
    }

    /**
     * @dev ADMIN 락정보 클리어
     */
    function clearLockInfo(string memory lockType) onlyOwner public returns (bool) {
        require(bytes(lockType).length != 0, "lockType must be not empty");

        LockInfo[] storage array = _lockInfoTable[lockType];
        if (array.length == 0) return false;
        
        // 락정보 클리어
        for (uint256 i = 0; i < array.length; i++) {
            delete array[i];
        }
        array.length = 0;
        
        emit ClearLockInfo(lockType);
        return true;
    }

    /**
     * @dev 락타입별 정보 개수 조회
     */
    function getLockInfoCount(string memory lockType) public view returns (uint256) {
        return _lockInfoTable[lockType].length;
    }

    /**
     * @dev 락타입별 인덱스로 시간 조회
     */
    function getLockInfoAtIndex(string memory lockType, uint256 index) public view returns (uint256, uint256) {
        return (_lockInfoTable[lockType][index].timestamp, _lockInfoTable[lockType][index].lockedAmount);
    }
    
    /**
     * @dev 락타입별 시간, 락금액 조회
     */
    function getLockInfo(string memory lockType) public view returns (uint256[] memory, uint256[] memory) {
        uint256 index = 0;
        
        LockInfo[] memory array = _lockInfoTable[lockType];
        uint256[] memory timestamps = new uint256[](array.length);
        uint256[] memory lockedAmounts = new uint256[](array.length);
        
        for (index = 0; index < array.length; index++) {
            timestamps[index] = array[index].timestamp;
            lockedAmounts[index] = array[index].lockedAmount;
        }
        
        return (timestamps, lockedAmounts);
    }
}

File 7 of 11: Math.sol
pragma solidity ^0.5.0;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a >= b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow, so we distribute
        return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2);
    }
}

File 8 of 11: Migrations.sol
pragma solidity >=0.4.25 <0.6.0;

contract Migrations {
  address public owner;
  uint public last_completed_migration;

  modifier restricted() {
    if (msg.sender == owner) _;
  }

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

  function setCompleted(uint completed) public restricted {
    last_completed_migration = completed;
  }

  function upgrade(address new_address) public restricted {
    Migrations upgraded = Migrations(new_address);
    upgraded.setCompleted(last_completed_migration);
  }
}

File 9 of 11: Ownable.sol
pragma solidity ^0.5.0;

import "./Context.sol";
/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () public {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(isOwner(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Returns true if the caller is the current owner.
     */
    function isOwner() public view returns (bool) {
        return _msgSender() == _owner;
    }

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

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     */
    function _transferOwnership(address newOwner) internal {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

File 10 of 11: SafeMath.sol
pragma solidity ^0.5.0;

/**
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     *
     * NOTE: This is a feature of the next version of OpenZeppelin Contracts.
     * @dev Get it via `npm install @openzeppelin/contracts@next`.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     * NOTE: This is a feature of the next version of OpenZeppelin Contracts.
     * @dev Get it via `npm install @openzeppelin/contracts@next`.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     *
     * NOTE: This is a feature of the next version of OpenZeppelin Contracts.
     * @dev Get it via `npm install @openzeppelin/contracts@next`.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

Contract Security Audit

Contract ABI

API
[{"constant":false,"inputs":[{"name":"lockType","type":"string"}],"name":"clearLockInfo","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"amount","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"sender","type":"address"},{"name":"recipient","type":"address"},{"name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"availableBalanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"lockType","type":"string"}],"name":"getLockInfoCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"},{"name":"amount","type":"uint256"}],"name":"mint","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"amount","type":"uint256"}],"name":"burn","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"lockType","type":"string"},{"name":"timestamp","type":"uint256"},{"name":"lockAmount","type":"uint256"}],"name":"addLockInfo","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"lockType","type":"string"},{"name":"index","type":"uint256"}],"name":"getLockInfoAtIndex","outputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"lockType","type":"string"},{"name":"timestamp","type":"uint256"}],"name":"removeLockInfo","outputs":[{"name":"","type":"bool"}],"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":"isOwner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"getLockedAmount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"spender","type":"address"},{"name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"getLockedAmountOfLockTable","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"recipient","type":"address"},{"name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"},{"name":"lockType","type":"string"}],"name":"setAccountLockType","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"getAddressLockType","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"maxSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"lockType","type":"string"}],"name":"getLockInfo","outputs":[{"name":"","type":"uint256[]"},{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getblockTimestamp","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"account","type":"address"},{"indexed":false,"name":"lockType","type":"string"}],"name":"SetAccountLockType","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"lockType","type":"string"},{"indexed":false,"name":"timestamp","type":"uint256"},{"indexed":false,"name":"lockAmount","type":"uint256"}],"name":"AddLockInfo","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"lockType","type":"string"},{"indexed":false,"name":"timestamp","type":"uint256"}],"name":"RemoveLockInfo","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"lockType","type":"string"}],"name":"ClearLockInfo","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","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":"account","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"account","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"Mint","type":"event"}]

60806040523480156200001157600080fd5b506040518060400160405280600581526020017f424c4f4f440000000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f424c4f4f4400000000000000000000000000000000000000000000000000000081525060086409502f90008383838260039080519060200190620000a19291906200062f565b508160049080519060200190620000ba9291906200062f565b5080600560006101000a81548160ff021916908360ff1602179055505050506000620000eb620001d260201b60201c565b905080600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3508160ff16600a0a810260088190555050505050620001cb33620001b2620001da60201b60201c565b60ff16600a0a6404a817c80002620001f160201b60201c565b50620006de565b600033905090565b6000600560009054906101000a900460ff16905090565b6000620002036200030a60201b60201c565b62000276576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60085462000295836002546200037160201b6200355b1790919060201c565b1115620002ee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180620045c76029913960400191505060405180910390fd5b620003008383620003fa60201b60201c565b6001905092915050565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1662000355620001d260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b600080828401905083811015620003f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156200049e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b620004ba816002546200037160201b6200355b1790919060201c565b60028190555062000518816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546200037160201b6200355b1790919060201c565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968858282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a18173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200067257805160ff1916838001178555620006a3565b82800160010185558215620006a3579182015b82811115620006a257825182559160200191906001019062000685565b5b509050620006b29190620006b6565b5090565b620006db91905b80821115620006d7576000816000905550600101620006bd565b5090565b90565b613ed980620006ee6000396000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c80637c90895111610104578063a9059cbb116100a2578063dd62ed3e11610071578063dd62ed3e14610ddb578063f2fde38b14610e53578063fc45465d14610e97578063fcbd675b14610fef576101da565b8063a9059cbb14610ba7578063c6842afe14610c0d578063ca3b11e914610d00578063d5abeb0114610dbd576101da565b8063929ec537116100de578063929ec53714610a0e57806395d89b4114610a66578063a457c2d714610ae9578063a467240d14610b4f576101da565b80637c908951146108c55780638da5cb5b146109a25780638f32d59b146109ec576101da565b8063395093511161017c5780634b59bef91161014b5780634b59bef91461069c578063687f13611461078357806370a0823114610863578063715018a6146108bb576101da565b806339509351146104bb57806339c726c51461052157806340c10f19146105f057806342966c6814610656576101da565b806318160ddd116101b857806318160ddd1461039b57806323b872dd146103b957806325d998bb1461043f578063313ce56714610497576101da565b806302726066146101df57806306fdde03146102b2578063095ea7b314610335575b600080fd5b610298600480360360208110156101f557600080fd5b810190808035906020019064010000000081111561021257600080fd5b82018360208201111561022457600080fd5b8035906020019184600183028401116401000000008311171561024657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061100d565b604051808215151515815260200191505060405180910390f35b6102ba611288565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102fa5780820151818401526020810190506102df565b50505050905090810190601f1680156103275780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103816004803603604081101561034b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061132a565b604051808215151515815260200191505060405180910390f35b6103a3611348565b6040518082815260200191505060405180910390f35b610425600480360360608110156103cf57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611352565b604051808215151515815260200191505060405180910390f35b6104816004803603602081101561045557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061142b565b6040518082815260200191505060405180910390f35b61049f611569565b604051808260ff1660ff16815260200191505060405180910390f35b610507600480360360408110156104d157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611580565b604051808215151515815260200191505060405180910390f35b6105da6004803603602081101561053757600080fd5b810190808035906020019064010000000081111561055457600080fd5b82018360208201111561056657600080fd5b8035906020019184600183028401116401000000008311171561058857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611633565b6040518082815260200191505060405180910390f35b61063c6004803603604081101561060657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506116a9565b604051808215151515815260200191505060405180910390f35b6106826004803603602081101561066c57600080fd5b81019080803590602001909291905050506117a8565b604051808215151515815260200191505060405180910390f35b610769600480360360608110156106b257600080fd5b81019080803590602001906401000000008111156106cf57600080fd5b8201836020820111156106e157600080fd5b8035906020019184600183028401116401000000008311171561070357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190929190803590602001909291905050506118dc565b604051808215151515815260200191505060405180910390f35b6108466004803603604081101561079957600080fd5b81019080803590602001906401000000008111156107b657600080fd5b8201836020820111156107c857600080fd5b803590602001918460018302840111640100000000831117156107ea57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190929190505050611e21565b604051808381526020018281526020019250505060405180910390f35b6108a56004803603602081101561087957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611f3b565b6040518082815260200191505060405180910390f35b6108c3611f83565b005b610988600480360360408110156108db57600080fd5b81019080803590602001906401000000008111156108f857600080fd5b82018360208201111561090a57600080fd5b8035906020019184600183028401116401000000008311171561092c57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001909291905050506120be565b604051808215151515815260200191505060405180910390f35b6109aa612446565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6109f4612470565b604051808215151515815260200191505060405180910390f35b610a5060048036036020811015610a2457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506124cf565b6040518082815260200191505060405180910390f35b610a6e6125b3565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610aae578082015181840152602081019050610a93565b50505050905090810190601f168015610adb5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610b3560048036036040811015610aff57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612655565b604051808215151515815260200191505060405180910390f35b610b9160048036036020811015610b6557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612722565b6040518082815260200191505060405180910390f35b610bf360048036036040811015610bbd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061294a565b604051808215151515815260200191505060405180910390f35b610ce660048036036040811015610c2357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610c6057600080fd5b820183602082011115610c7257600080fd5b80359060200191846001830284011164010000000083111715610c9457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612968565b604051808215151515815260200191505060405180910390f35b610d4260048036036020811015610d1657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612b12565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610d82578082015181840152602081019050610d67565b50505050905090810190601f168015610daf5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610dc5612bf3565b6040518082815260200191505060405180910390f35b610e3d60048036036040811015610df157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612bfd565b6040518082815260200191505060405180910390f35b610e9560048036036020811015610e6957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612c84565b005b610f5060048036036020811015610ead57600080fd5b8101908080359060200190640100000000811115610eca57600080fd5b820183602082011115610edc57600080fd5b80359060200191846001830284011164010000000083111715610efe57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612d0a565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015610f97578082015181840152602081019050610f7c565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015610fd9578082015181840152602081019050610fbe565b5050505090500194505050505060405180910390f35b610ff7612edd565b6040518082815260200191505060405180910390f35b6000611017612470565b611089576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600082511415611101576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f6c6f636b54797065206d757374206265206e6f7420656d70747900000000000081525060200191505060405180910390fd5b60006007836040518082805190602001908083835b602083106111395780518252602082019150602081019050602083039250611116565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390209050600081805490501415611185576000915050611283565b60008090505b81805490508110156111d1578181815481106111a357fe5b906000526020600020906002020160008082016000905560018201600090555050808060010191505061118b565b50600081816111e09190613b8b565b507ff6167012eb14e580088bffbf04b6e5adbd1a1607ce8d4f3954e208f96b9e3b21836040518080602001828103825283818151815260200191508051906020019080838360005b83811015611243578082015181840152602081019050611228565b50505050905090810190601f1680156112705780820380516001836020036101000a031916815260200191505b509250505060405180910390a160019150505b919050565b606060038054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156113205780601f106112f557610100808354040283529160200191611320565b820191906000526020600020905b81548152906001019060200180831161130357829003601f168201915b5050505050905090565b600061133e611337612ee5565b8484612eed565b6001905092915050565b6000600254905090565b600061135f8484846130e4565b6114208461136b612ee5565b61141b85604051806060016040528060288152602001613d4c60289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006113d1612ee5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546134519092919063ffffffff16565b612eed565b600190509392505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114b2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180613d256027913960400191505060405180910390fd5b60006114bd83612722565b9050806000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561150f576000915050611564565b611560816000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461351190919063ffffffff16565b9150505b919050565b6000600560009054906101000a900460ff16905090565b600061162961158d612ee5565b84611624856001600061159e612ee5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461355b90919063ffffffff16565b612eed565b6001905092915050565b60006007826040518082805190602001908083835b6020831061166b5780518252602082019150602081019050602083039250611648565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020805490509050919050565b60006116b3612470565b611725576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60085461173d8360025461355b90919063ffffffff16565b1115611794576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180613cfc6029913960400191505060405180910390fd5b61179e83836135e3565b6001905092915050565b60006117b2612470565b611824576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b81600080611830612ee5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156118c2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180613e0d602e913960400191505060405180910390fd5b6118d36118cd612ee5565b83613809565b60019050919050565b60006118e6612470565b611958576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000845114156119d0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f6c6f636b54797065206d757374206265206e6f7420656d70747900000000000081525060200191505060405180910390fd5b600080905060006007866040518082805190602001908083835b60208310611a0d57805182526020820191506020810190506020830392506119ea565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390209050600091505b8080549050821015611c175784818381548110611a6057fe5b9060005260206000209060020201600001541015611a7d57611c0a565b84818381548110611a8a57fe5b9060005260206000209060020201600001541115611aa757611c17565b808054905060018303108015611adc575083816001840381548110611ac857fe5b906000526020600020906002020160010154105b15611aec57600092505050611e1a565b808054905060018301108015611b21575083816001840181548110611b0d57fe5b906000526020600020906002020160010154115b15611b3157600092505050611e1a565b83818381548110611b3e57fe5b9060005260206000209060020201600101819055507f1ba5f59fb673da2820ae8b9513623b5fe79351a8a0f0c5145e8c86f535ff6a8c8686866040518080602001848152602001838152602001828103825285818151815260200191508051906020019080838360005b83811015611bc3578082015181840152602081019050611ba8565b50505050905090810190601f168015611bf05780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a1600192505050611e1a565b8180600101925050611a47565b808054905060018303108015611c4c575083816001840381548110611c3857fe5b906000526020600020906002020160010154105b15611c5c57600092505050611e1a565b808054905082108015611c8b575083818381548110611c7757fe5b906000526020600020906002020160010154115b15611c9b57600092505050611e1a565b808054809190600101611cae9190613b8b565b506000600182805490500390505b82811115611d2057816001820381548110611cd357fe5b9060005260206000209060020201828281548110611ced57fe5b90600052602060002090600202016000820154816000015560018201548160010155905050808060019003915050611cbc565b50604051806040016040528086815260200185815250818381548110611d4257fe5b906000526020600020906002020160008201518160000155602082015181600101559050507f1ba5f59fb673da2820ae8b9513623b5fe79351a8a0f0c5145e8c86f535ff6a8c8686866040518080602001848152602001838152602001828103825285818151815260200191508051906020019080838360005b83811015611dd7578082015181840152602081019050611dbc565b50505050905090810190601f168015611e045780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a16001925050505b9392505050565b6000806007846040518082805190602001908083835b60208310611e5a5780518252602082019150602081019050602083039250611e37565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208381548110611e9857fe5b9060005260206000209060020201600001546007856040518082805190602001908083835b60208310611ee05780518252602082019150602081019050602083039250611ebd565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208481548110611f1e57fe5b906000526020600020906002020160010154915091509250929050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611f8b612470565b611ffd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60006120c8612470565b61213a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000835114156121b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f6c6f636b54797065206d757374206265206e6f7420656d70747900000000000081525060200191505060405180910390fd5b60006007846040518082805190602001908083835b602083106121ea57805182526020820191506020810190506020830392506121c7565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390209050600081805490501415612236576000915050612440565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff905060008090505b82805490508110156122a7578483828154811061227a57fe5b906000526020600020906002020160000154141561229a578091506122a7565b8080600101915050612261565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114156122db57600092505050612440565b60008190505b600183805490500381101561234b578260018201815481106122ff57fe5b906000526020600020906002020183828154811061231957fe5b9060005260206000209060020201600082015481600001556001820154816001015590505080806001019150506122e1565b508160018380549050038154811061235f57fe5b906000526020600020906002020160008082016000905560018201600090555050818054809190600190036123949190613b8b565b507f5a5db866003c18fface30c2ea88bffd481d153b5e9172acd0ad263d09bac48b585856040518080602001838152602001828103825284818151815260200191508051906020019080838360005b838110156123fe5780820151818401526020810190506123e3565b50505050905090810190601f16801561242b5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a16001925050505b92915050565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166124b3612ee5565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612556576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180613d256027913960400191505060405180910390fd5b600061256183612722565b90506125ab816000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613a2c565b915050919050565b606060048054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561264b5780601f106126205761010080835404028352916020019161264b565b820191906000526020600020905b81548152906001019060200180831161262e57829003601f168201915b5050505050905090565b6000612718612662612ee5565b8461271385604051806060016040528060258152602001613e89602591396001600061268c612ee5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546134519092919063ffffffff16565b612eed565b6001905092915050565b60006060600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156127f95780601f106127ce576101008083540402835291602001916127f9565b820191906000526020600020905b8154815290600101906020018083116127dc57829003601f168201915b50505050509050600081511461293f5760606007826040518082805190602001908083835b60208310612841578051825260208201915060208101905060208303925061281e565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020805480602002602001604051908101604052809291908181526020016000905b828210156128da57838290600052602060002090600202016040518060400160405290816000820154815260200160018201548152505081526020019060010190612894565b50505050905060008090505b815181101561293c57428282815181106128fc57fe5b6020026020010151600001511061292f5781818151811061291957fe5b6020026020010151602001519350505050612945565b80806001019150506128e6565b50505b60009150505b919050565b600061295e612957612ee5565b84846130e4565b6001905092915050565b6000612972612470565b6129e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b81600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209080519060200190612a37929190613bbd565b507fb0dc66e6b6e6ed00537a8c37c828962f561572dbbe594ad1d914bb60c5b745138383604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b83811015612acd578082015181840152602081019050612ab2565b50505050905090810190601f168015612afa5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a16001905092915050565b6060600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612be75780601f10612bbc57610100808354040283529160200191612be7565b820191906000526020600020905b815481529060010190602001808311612bca57829003601f168201915b50505050509050919050565b6000600854905090565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b612c8c612470565b612cfe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b612d0781613a45565b50565b606080600080905060606007856040518082805190602001908083835b60208310612d4a5780518252602082019150602081019050602083039250612d27565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020805480602002602001604051908101604052809291908181526020016000905b82821015612de357838290600052602060002090600202016040518060400160405290816000820154815260200160018201548152505081526020019060010190612d9d565b50505050905060608151604051908082528060200260200182016040528015612e1b5781602001602082028038833980820191505090505b50905060608251604051908082528060200260200182016040528015612e505781602001602082028038833980820191505090505b509050600093505b8251841015612ece57828481518110612e6d57fe5b602002602001015160000151828581518110612e8557fe5b602002602001018181525050828481518110612e9d57fe5b602002602001015160200151818581518110612eb557fe5b6020026020010181815250508380600101945050612e58565b81819550955050505050915091565b600042905090565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612f73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180613e3b6024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ff9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180613cda6022913960400191505060405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561316a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180613e5f602a913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156131f0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180613d9f6028913960400191505060405180910390fd5b60006131fb84612722565b90508061324f836000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461351190919063ffffffff16565b10156132a6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180613de86025913960400191505060405180910390fd5b613311826040518060600160405280602b8152602001613d74602b91396000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546134519092919063ffffffff16565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506133a4826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461355b90919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a350505050565b60008383111582906134fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156134c35780820151818401526020810190506134a8565b50505050905090810190601f1680156134f05780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b600061355383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613451565b905092915050565b6000808284019050838110156135d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613686576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b61369b8160025461355b90919063ffffffff16565b6002819055506136f2816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461355b90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968858282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a18173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561388f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613dc76021913960400191505060405180910390fd5b6138fa81604051806060016040528060228152602001613c92602291396000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546134519092919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506139518160025461351190919063ffffffff16565b600281905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a37fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a15050565b6000818310613a3b5781613a3d565b825b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613acb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180613cb46026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b815481835581811115613bb857600202816002028360005260206000209182019101613bb79190613c3d565b5b505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613bfe57805160ff1916838001178555613c2c565b82800160010185558215613c2c579182015b82811115613c2b578251825591602001919060010190613c10565b5b509050613c399190613c6c565b5090565b613c6991905b80821115613c6557600080820160009055600182016000905550600201613c43565b5090565b90565b613c8e91905b80821115613c8a576000816000905550600101613c72565b5090565b9056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e63654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f2061646472657373426c6f6f64546f6b656e3a204973737565642065786365656473206d6178696d756d20737570706c79426c6f6f64546f6b656e3a206164647265737320697320746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365426c6f6f64546f6b656e3a207472616e7366657220616d6f756e7420657863656564732062616c616e6365426c6f6f64546f6b656e3a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e2066726f6d20746865207a65726f2061646472657373426c6f6f64546f6b656e3a20657863656564656420616d6f756e7420617661696c61626c65426c6f6f64546f6b656e3a206465737472756374696f6e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373426c6f6f64546f6b656e3a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa165627a7a72305820cf85e25dd5cc7656fbdd92e6ae1a152ed5a74b1c7b40b8ad81457882ecf343980029426c6f6f64546f6b656e3a204973737565642065786365656473206d6178696d756d20737570706c79

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101da5760003560e01c80637c90895111610104578063a9059cbb116100a2578063dd62ed3e11610071578063dd62ed3e14610ddb578063f2fde38b14610e53578063fc45465d14610e97578063fcbd675b14610fef576101da565b8063a9059cbb14610ba7578063c6842afe14610c0d578063ca3b11e914610d00578063d5abeb0114610dbd576101da565b8063929ec537116100de578063929ec53714610a0e57806395d89b4114610a66578063a457c2d714610ae9578063a467240d14610b4f576101da565b80637c908951146108c55780638da5cb5b146109a25780638f32d59b146109ec576101da565b8063395093511161017c5780634b59bef91161014b5780634b59bef91461069c578063687f13611461078357806370a0823114610863578063715018a6146108bb576101da565b806339509351146104bb57806339c726c51461052157806340c10f19146105f057806342966c6814610656576101da565b806318160ddd116101b857806318160ddd1461039b57806323b872dd146103b957806325d998bb1461043f578063313ce56714610497576101da565b806302726066146101df57806306fdde03146102b2578063095ea7b314610335575b600080fd5b610298600480360360208110156101f557600080fd5b810190808035906020019064010000000081111561021257600080fd5b82018360208201111561022457600080fd5b8035906020019184600183028401116401000000008311171561024657600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061100d565b604051808215151515815260200191505060405180910390f35b6102ba611288565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102fa5780820151818401526020810190506102df565b50505050905090810190601f1680156103275780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103816004803603604081101561034b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061132a565b604051808215151515815260200191505060405180910390f35b6103a3611348565b6040518082815260200191505060405180910390f35b610425600480360360608110156103cf57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611352565b604051808215151515815260200191505060405180910390f35b6104816004803603602081101561045557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061142b565b6040518082815260200191505060405180910390f35b61049f611569565b604051808260ff1660ff16815260200191505060405180910390f35b610507600480360360408110156104d157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611580565b604051808215151515815260200191505060405180910390f35b6105da6004803603602081101561053757600080fd5b810190808035906020019064010000000081111561055457600080fd5b82018360208201111561056657600080fd5b8035906020019184600183028401116401000000008311171561058857600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611633565b6040518082815260200191505060405180910390f35b61063c6004803603604081101561060657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506116a9565b604051808215151515815260200191505060405180910390f35b6106826004803603602081101561066c57600080fd5b81019080803590602001909291905050506117a8565b604051808215151515815260200191505060405180910390f35b610769600480360360608110156106b257600080fd5b81019080803590602001906401000000008111156106cf57600080fd5b8201836020820111156106e157600080fd5b8035906020019184600183028401116401000000008311171561070357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190929190803590602001909291905050506118dc565b604051808215151515815260200191505060405180910390f35b6108466004803603604081101561079957600080fd5b81019080803590602001906401000000008111156107b657600080fd5b8201836020820111156107c857600080fd5b803590602001918460018302840111640100000000831117156107ea57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929080359060200190929190505050611e21565b604051808381526020018281526020019250505060405180910390f35b6108a56004803603602081101561087957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611f3b565b6040518082815260200191505060405180910390f35b6108c3611f83565b005b610988600480360360408110156108db57600080fd5b81019080803590602001906401000000008111156108f857600080fd5b82018360208201111561090a57600080fd5b8035906020019184600183028401116401000000008311171561092c57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290803590602001909291905050506120be565b604051808215151515815260200191505060405180910390f35b6109aa612446565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6109f4612470565b604051808215151515815260200191505060405180910390f35b610a5060048036036020811015610a2457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506124cf565b6040518082815260200191505060405180910390f35b610a6e6125b3565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610aae578082015181840152602081019050610a93565b50505050905090810190601f168015610adb5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610b3560048036036040811015610aff57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612655565b604051808215151515815260200191505060405180910390f35b610b9160048036036020811015610b6557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612722565b6040518082815260200191505060405180910390f35b610bf360048036036040811015610bbd57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061294a565b604051808215151515815260200191505060405180910390f35b610ce660048036036040811015610c2357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190640100000000811115610c6057600080fd5b820183602082011115610c7257600080fd5b80359060200191846001830284011164010000000083111715610c9457600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612968565b604051808215151515815260200191505060405180910390f35b610d4260048036036020811015610d1657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612b12565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610d82578082015181840152602081019050610d67565b50505050905090810190601f168015610daf5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610dc5612bf3565b6040518082815260200191505060405180910390f35b610e3d60048036036040811015610df157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612bfd565b6040518082815260200191505060405180910390f35b610e9560048036036020811015610e6957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612c84565b005b610f5060048036036020811015610ead57600080fd5b8101908080359060200190640100000000811115610eca57600080fd5b820183602082011115610edc57600080fd5b80359060200191846001830284011164010000000083111715610efe57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050612d0a565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015610f97578082015181840152602081019050610f7c565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015610fd9578082015181840152602081019050610fbe565b5050505090500194505050505060405180910390f35b610ff7612edd565b6040518082815260200191505060405180910390f35b6000611017612470565b611089576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600082511415611101576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f6c6f636b54797065206d757374206265206e6f7420656d70747900000000000081525060200191505060405180910390fd5b60006007836040518082805190602001908083835b602083106111395780518252602082019150602081019050602083039250611116565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390209050600081805490501415611185576000915050611283565b60008090505b81805490508110156111d1578181815481106111a357fe5b906000526020600020906002020160008082016000905560018201600090555050808060010191505061118b565b50600081816111e09190613b8b565b507ff6167012eb14e580088bffbf04b6e5adbd1a1607ce8d4f3954e208f96b9e3b21836040518080602001828103825283818151815260200191508051906020019080838360005b83811015611243578082015181840152602081019050611228565b50505050905090810190601f1680156112705780820380516001836020036101000a031916815260200191505b509250505060405180910390a160019150505b919050565b606060038054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156113205780601f106112f557610100808354040283529160200191611320565b820191906000526020600020905b81548152906001019060200180831161130357829003601f168201915b5050505050905090565b600061133e611337612ee5565b8484612eed565b6001905092915050565b6000600254905090565b600061135f8484846130e4565b6114208461136b612ee5565b61141b85604051806060016040528060288152602001613d4c60289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006113d1612ee5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546134519092919063ffffffff16565b612eed565b600190509392505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114b2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180613d256027913960400191505060405180910390fd5b60006114bd83612722565b9050806000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054101561150f576000915050611564565b611560816000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461351190919063ffffffff16565b9150505b919050565b6000600560009054906101000a900460ff16905090565b600061162961158d612ee5565b84611624856001600061159e612ee5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461355b90919063ffffffff16565b612eed565b6001905092915050565b60006007826040518082805190602001908083835b6020831061166b5780518252602082019150602081019050602083039250611648565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020805490509050919050565b60006116b3612470565b611725576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60085461173d8360025461355b90919063ffffffff16565b1115611794576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526029815260200180613cfc6029913960400191505060405180910390fd5b61179e83836135e3565b6001905092915050565b60006117b2612470565b611824576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b81600080611830612ee5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156118c2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602e815260200180613e0d602e913960400191505060405180910390fd5b6118d36118cd612ee5565b83613809565b60019050919050565b60006118e6612470565b611958576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000845114156119d0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f6c6f636b54797065206d757374206265206e6f7420656d70747900000000000081525060200191505060405180910390fd5b600080905060006007866040518082805190602001908083835b60208310611a0d57805182526020820191506020810190506020830392506119ea565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390209050600091505b8080549050821015611c175784818381548110611a6057fe5b9060005260206000209060020201600001541015611a7d57611c0a565b84818381548110611a8a57fe5b9060005260206000209060020201600001541115611aa757611c17565b808054905060018303108015611adc575083816001840381548110611ac857fe5b906000526020600020906002020160010154105b15611aec57600092505050611e1a565b808054905060018301108015611b21575083816001840181548110611b0d57fe5b906000526020600020906002020160010154115b15611b3157600092505050611e1a565b83818381548110611b3e57fe5b9060005260206000209060020201600101819055507f1ba5f59fb673da2820ae8b9513623b5fe79351a8a0f0c5145e8c86f535ff6a8c8686866040518080602001848152602001838152602001828103825285818151815260200191508051906020019080838360005b83811015611bc3578082015181840152602081019050611ba8565b50505050905090810190601f168015611bf05780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a1600192505050611e1a565b8180600101925050611a47565b808054905060018303108015611c4c575083816001840381548110611c3857fe5b906000526020600020906002020160010154105b15611c5c57600092505050611e1a565b808054905082108015611c8b575083818381548110611c7757fe5b906000526020600020906002020160010154115b15611c9b57600092505050611e1a565b808054809190600101611cae9190613b8b565b506000600182805490500390505b82811115611d2057816001820381548110611cd357fe5b9060005260206000209060020201828281548110611ced57fe5b90600052602060002090600202016000820154816000015560018201548160010155905050808060019003915050611cbc565b50604051806040016040528086815260200185815250818381548110611d4257fe5b906000526020600020906002020160008201518160000155602082015181600101559050507f1ba5f59fb673da2820ae8b9513623b5fe79351a8a0f0c5145e8c86f535ff6a8c8686866040518080602001848152602001838152602001828103825285818151815260200191508051906020019080838360005b83811015611dd7578082015181840152602081019050611dbc565b50505050905090810190601f168015611e045780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a16001925050505b9392505050565b6000806007846040518082805190602001908083835b60208310611e5a5780518252602082019150602081019050602083039250611e37565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208381548110611e9857fe5b9060005260206000209060020201600001546007856040518082805190602001908083835b60208310611ee05780518252602082019150602081019050602083039250611ebd565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208481548110611f1e57fe5b906000526020600020906002020160010154915091509250929050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611f8b612470565b611ffd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60006120c8612470565b61213a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000835114156121b2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f6c6f636b54797065206d757374206265206e6f7420656d70747900000000000081525060200191505060405180910390fd5b60006007846040518082805190602001908083835b602083106121ea57805182526020820191506020810190506020830392506121c7565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390209050600081805490501415612236576000915050612440565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff905060008090505b82805490508110156122a7578483828154811061227a57fe5b906000526020600020906002020160000154141561229a578091506122a7565b8080600101915050612261565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114156122db57600092505050612440565b60008190505b600183805490500381101561234b578260018201815481106122ff57fe5b906000526020600020906002020183828154811061231957fe5b9060005260206000209060020201600082015481600001556001820154816001015590505080806001019150506122e1565b508160018380549050038154811061235f57fe5b906000526020600020906002020160008082016000905560018201600090555050818054809190600190036123949190613b8b565b507f5a5db866003c18fface30c2ea88bffd481d153b5e9172acd0ad263d09bac48b585856040518080602001838152602001828103825284818151815260200191508051906020019080838360005b838110156123fe5780820151818401526020810190506123e3565b50505050905090810190601f16801561242b5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a16001925050505b92915050565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166124b3612ee5565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612556576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180613d256027913960400191505060405180910390fd5b600061256183612722565b90506125ab816000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054613a2c565b915050919050565b606060048054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561264b5780601f106126205761010080835404028352916020019161264b565b820191906000526020600020905b81548152906001019060200180831161262e57829003601f168201915b5050505050905090565b6000612718612662612ee5565b8461271385604051806060016040528060258152602001613e89602591396001600061268c612ee5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546134519092919063ffffffff16565b612eed565b6001905092915050565b60006060600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156127f95780601f106127ce576101008083540402835291602001916127f9565b820191906000526020600020905b8154815290600101906020018083116127dc57829003601f168201915b50505050509050600081511461293f5760606007826040518082805190602001908083835b60208310612841578051825260208201915060208101905060208303925061281e565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020805480602002602001604051908101604052809291908181526020016000905b828210156128da57838290600052602060002090600202016040518060400160405290816000820154815260200160018201548152505081526020019060010190612894565b50505050905060008090505b815181101561293c57428282815181106128fc57fe5b6020026020010151600001511061292f5781818151811061291957fe5b6020026020010151602001519350505050612945565b80806001019150506128e6565b50505b60009150505b919050565b600061295e612957612ee5565b84846130e4565b6001905092915050565b6000612972612470565b6129e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b81600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209080519060200190612a37929190613bbd565b507fb0dc66e6b6e6ed00537a8c37c828962f561572dbbe594ad1d914bb60c5b745138383604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200180602001828103825283818151815260200191508051906020019080838360005b83811015612acd578082015181840152602081019050612ab2565b50505050905090810190601f168015612afa5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a16001905092915050565b6060600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015612be75780601f10612bbc57610100808354040283529160200191612be7565b820191906000526020600020905b815481529060010190602001808311612bca57829003601f168201915b50505050509050919050565b6000600854905090565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b612c8c612470565b612cfe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b612d0781613a45565b50565b606080600080905060606007856040518082805190602001908083835b60208310612d4a5780518252602082019150602081019050602083039250612d27565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020805480602002602001604051908101604052809291908181526020016000905b82821015612de357838290600052602060002090600202016040518060400160405290816000820154815260200160018201548152505081526020019060010190612d9d565b50505050905060608151604051908082528060200260200182016040528015612e1b5781602001602082028038833980820191505090505b50905060608251604051908082528060200260200182016040528015612e505781602001602082028038833980820191505090505b509050600093505b8251841015612ece57828481518110612e6d57fe5b602002602001015160000151828581518110612e8557fe5b602002602001018181525050828481518110612e9d57fe5b602002602001015160200151818581518110612eb557fe5b6020026020010181815250508380600101945050612e58565b81819550955050505050915091565b600042905090565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612f73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180613e3b6024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ff9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180613cda6022913960400191505060405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561316a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180613e5f602a913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156131f0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180613d9f6028913960400191505060405180910390fd5b60006131fb84612722565b90508061324f836000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461351190919063ffffffff16565b10156132a6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180613de86025913960400191505060405180910390fd5b613311826040518060600160405280602b8152602001613d74602b91396000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546134519092919063ffffffff16565b6000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506133a4826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461355b90919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a350505050565b60008383111582906134fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156134c35780820151818401526020810190506134a8565b50505050905090810190601f1680156134f05780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b600061355383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250613451565b905092915050565b6000808284019050838110156135d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613686576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b61369b8160025461355b90919063ffffffff16565b6002819055506136f2816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461355b90919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055507f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d41213968858282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a18173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561388f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613dc76021913960400191505060405180910390fd5b6138fa81604051806060016040528060228152602001613c92602291396000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546134519092919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506139518160025461351190919063ffffffff16565b600281905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a37fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58282604051808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a15050565b6000818310613a3b5781613a3d565b825b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613acb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180613cb46026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b815481835581811115613bb857600202816002028360005260206000209182019101613bb79190613c3d565b5b505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10613bfe57805160ff1916838001178555613c2c565b82800160010185558215613c2c579182015b82811115613c2b578251825591602001919060010190613c10565b5b509050613c399190613c6c565b5090565b613c6991905b80821115613c6557600080820160009055600182016000905550600201613c43565b5090565b90565b613c8e91905b80821115613c8a576000816000905550600101613c72565b5090565b9056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e63654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f2061646472657373426c6f6f64546f6b656e3a204973737565642065786365656473206d6178696d756d20737570706c79426c6f6f64546f6b656e3a206164647265737320697320746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365426c6f6f64546f6b656e3a207472616e7366657220616d6f756e7420657863656564732062616c616e6365426c6f6f64546f6b656e3a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e2066726f6d20746865207a65726f2061646472657373426c6f6f64546f6b656e3a20657863656564656420616d6f756e7420617661696c61626c65426c6f6f64546f6b656e3a206465737472756374696f6e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373426c6f6f64546f6b656e3a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa165627a7a72305820cf85e25dd5cc7656fbdd92e6ae1a152ed5a74b1c7b40b8ad81457882ecf343980029

Deployed Bytecode Sourcemap

53:182:10:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;53:182:10;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4351:495:5;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;4351:495:5;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;4351:495:5;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;4351:495:5;;;;;;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;4351:495:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;4351:495:5;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;644:81:3;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;644:81:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1391:149:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;1391:149:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;450:89;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1998:300;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;1998:300:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;691:435:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;691:435:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1472:81:3;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;2693:207:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;2693:207:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;4914:135:5;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;4914:135:5;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;4914:135:5;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;4914:135:5;;;;;;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;4914:135:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;4914:135:5;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1177:251:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;1177:251:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;1479:237;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;1479:237:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;1931:1416:5;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;1931:1416:5;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;1931:1416:5;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;1931:1416:5;;;;;;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;1931:1416:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;1931:1416:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;5123:219;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;5123:219:5;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;5123:219:5;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;5123:219:5;;;;;;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;5123:219:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;5123:219:5;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;597:108:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;597:108:2;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1677:137:8;;;:::i;:::-;;3408:883:5;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;3408:883:5;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;3408:883:5;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;3408:883:5;;;;;;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;3408:883:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;3408:883:5;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;892:77:8;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;1243:92;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;2492:366:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;2492:366:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;838:85:3;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;838:85:3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3387:258:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;3387:258:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;775:518:5;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;775:518:5;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;908:155:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;908:155:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;1462:228:5;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;1462:228:5;;;;;;;;;;;;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;1462:228:5;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;1462:228:5;;;;;;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;1462:228:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;1462:228:5;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;1738:132;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;1738:132:5;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;1738:132:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;542:85:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1121:132:2;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;1121:132:2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1963:107:8;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;1963:107:8;;;;;;;;;;;;;;;;;;;:::i;:::-;;5418:589:5;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;5418:589:5;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;5418:589:5;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;5418:589:5;;;;;;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;5418:589:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;5418:589:5;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;5418:589:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;5418:589:5;;;;;;;;;;;;;;;;;;;1303:98;;;:::i;:::-;;;;;;;;;;;;;;;;;;;4351:495;4424:4;1096:9:8;:7;:9::i;:::-;1088:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4474:1:5;4454:8;4448:22;:27;;4440:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4517:24;4544:14;4559:8;4544:24;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;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;;;4544:24:5;;;;;;;;;;;;;;;;;;;;;4517:51;;4598:1;4582:5;:12;;;;:17;4578:35;;;4608:5;4601:12;;;;;4578:35;4668:9;4680:1;4668:13;;4663:83;4687:5;:12;;;;4683:1;:16;4663:83;;;4727:5;4733:1;4727:8;;;;;;;;;;;;;;;;;;;4720:15;;;;;;;;;;;;;;4701:3;;;;;;;4663:83;;;;4770:1;4755:5;:16;;;;;:::i;:::-;;4795:23;4809:8;4795:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;4795:23:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4835:4;4828:11;;;1152:1:8;4351:495:5;;;:::o;644:81:3:-;681:13;713:5;706:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;644:81;:::o;1391:149:2:-;1457:4;1473:39;1482:12;:10;:12::i;:::-;1496:7;1505:6;1473:8;:39::i;:::-;1529:4;1522:11;;1391:149;;;;:::o;450:89::-;494:7;520:12;;513:19;;450:89;:::o;1998:300::-;2087:4;2103:36;2113:6;2121:9;2132:6;2103:9;:36::i;:::-;2149:121;2158:6;2166:12;:10;:12::i;:::-;2180:89;2218:6;2180:89;;;;;;;;;;;;;;;;;:11;:19;2192:6;2180:19;;;;;;;;;;;;;;;:33;2200:12;:10;:12::i;:::-;2180:33;;;;;;;;;;;;;;;;:37;;:89;;;;;:::i;:::-;2149:8;:121::i;:::-;2287:4;2280:11;;1998:300;;;;;:::o;691:435:0:-;757:7;803:1;784:21;;:7;:21;;;;776:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;860:20;883:35;910:7;883:26;:35::i;:::-;860:58;;1035:12;1014:9;:18;1024:7;1014:18;;;;;;;;;;;;;;;;:33;1010:47;;;1056:1;1049:8;;;;;1010:47;1083:36;1106:12;1083:9;:18;1093:7;1083:18;;;;;;;;;;;;;;;;:22;;:36;;;;:::i;:::-;1076:43;;;691:435;;;;:::o;1472:81:3:-;1513:5;1537:9;;;;;;;;;;;1530:16;;1472:81;:::o;2693:207:2:-;2773:4;2789:83;2798:12;:10;:12::i;:::-;2812:7;2821:50;2860:10;2821:11;:25;2833:12;:10;:12::i;:::-;2821:25;;;;;;;;;;;;;;;:34;2847:7;2821:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;2789:8;:83::i;:::-;2889:4;2882:11;;2693:207;;;;:::o;4914:135:5:-;4985:7;5011:14;5026:8;5011:24;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;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;;;5011:24:5;;;;;;;;;;;;;;;;;;;;;:31;;;;5004:38;;4914:135;;;:::o;1177:251:0:-;1250:4;1096:9:8;:7;:9::i;:::-;1088:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1303:10:0;;1275:24;1292:6;1275:12;;:16;;:24;;;;:::i;:::-;:38;;1267:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1378:22;1384:7;1393:6;1378:5;:22::i;:::-;1417:4;1410:11;;1177:251;;;;:::o;1479:237::-;1535:4;1096:9:8;:7;:9::i;:::-;1088:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1585:6:0;1558:9;:23;1568:12;:10;:12::i;:::-;1558:23;;;;;;;;;;;;;;;;:33;;1550:92;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1661:27;1667:12;:10;:12::i;:::-;1681:6;1661:5;:27::i;:::-;1705:4;1698:11;;1479:237;;;:::o;1931:1416:5:-;2041:4;1096:9:8;:7;:9::i;:::-;1088:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2091:1:5;2071:8;2065:22;:27;;2057:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2172:13;2188:1;2172:17;;2199:24;2226:14;2241:8;2226:24;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;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;;;2226:24:5;;;;;;;;;;;;;;;;;;;;;2199:51;;2273:1;2265:9;;2260:560;2284:5;:12;;;;2276:5;:20;2260:560;;;2350:9;2325:5;2331;2325:12;;;;;;;;;;;;;;;;;;:22;;;:34;2321:48;;;2361:8;;2321:48;2412:9;2387:5;2393;2387:12;;;;;;;;;;;;;;;;;;:22;;;:34;2383:45;;;2423:5;;2383:45;2459:5;:12;;;;2455:1;2447:5;:9;:24;:70;;;;;2507:10;2475:5;2489:1;2481:5;:9;2475:16;;;;;;;;;;;;;;;;;;:29;;;:42;2447:70;2443:88;;;2526:5;2519:12;;;;;;2443:88;2571:5;:12;;;;2567:1;2559:5;:9;:24;:70;;;;;2619:10;2587:5;2601:1;2593:5;:9;2587:16;;;;;;;;;;;;;;;;;;:29;;;:42;2559:70;2555:88;;;2638:5;2631:12;;;;;;2555:88;2698:10;2670:5;2676;2670:12;;;;;;;;;;;;;;;;;;:25;;:38;;;;2740:44;2752:8;2762:9;2773:10;2740:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;2740:44:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2805:4;2798:11;;;;;;2260:560;2298:7;;;;;;;2260:560;;;2854:5;:12;;;;2850:1;2842:5;:9;:24;:70;;;;;2902:10;2870:5;2884:1;2876:5;:9;2870:16;;;;;;;;;;;;;;;;;;:29;;;:42;2842:70;2838:88;;;2921:5;2914:12;;;;;;2838:88;2958:5;:12;;;;2950:5;:20;:62;;;;;3002:10;2974:5;2980;2974:12;;;;;;;;;;;;;;;;;;:25;;;:38;2950:62;2946:80;;;3021:5;3014:12;;;;;;2946:80;3073:5;:14;;;;;;;;;;;:::i;:::-;;3102:9;3129:1;3114:5;:12;;;;:16;3102:28;;3097:99;3136:5;3132:1;:9;3097:99;;;3173:5;3183:1;3179;:5;3173:12;;;;;;;;;;;;;;;;;;3162:5;3168:1;3162:8;;;;;;;;;;;;;;;;;;:23;;;;;;;;;;;;;;;;;;;3143:3;;;;;;;;3097:99;;;;3220:31;;;;;;;;3229:9;3220:31;;;;3240:10;3220:31;;;3205:5;3211;3205:12;;;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;;3275:44;3287:8;3297:9;3308:10;3275:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;3275:44:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3336:4;3329:11;;;;1152:1:8;1931:1416:5;;;;;:::o;5123:219::-;5211:7;5220;5247:14;5262:8;5247:24;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;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;;;5247:24:5;;;;;;;;;;;;;;;;;;;;;5272:5;5247:31;;;;;;;;;;;;;;;;;;:41;;;5290:14;5305:8;5290:24;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;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;;;5290:24:5;;;;;;;;;;;;;;;;;;;;;5315:5;5290:31;;;;;;;;;;;;;;;;;;:44;;;5239:96;;;;5123:219;;;;;:::o;597:108:2:-;654:7;680:9;:18;690:7;680:18;;;;;;;;;;;;;;;;673:25;;597:108;;;:::o;1677:137:8:-;1096:9;:7;:9::i;:::-;1088:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1775:1;1738:40;;1759:6;;;;;;;;;;;1738:40;;;;;;;;;;;;1805:1;1788:6;;:19;;;;;;;;;;;;;;;;;;1677:137::o;3408:883:5:-;3501:4;1096:9:8;:7;:9::i;:::-;1088:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3551:1:5;3531:8;3525:22;:27;;3517:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3594:24;3621:14;3636:8;3621:24;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;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;;;3621:24:5;;;;;;;;;;;;;;;;;;;;;3594:51;;3675:1;3659:5;:12;;;;:17;3655:35;;;3685:5;3678:12;;;;;3655:35;3739:13;3755:12;3739:28;;3782:9;3794:1;3782:13;;3777:169;3801:5;:12;;;;3797:1;:16;3777:169;;;3860:9;3838:5;3844:1;3838:8;;;;;;;;;;;;;;;;;;:18;;;:31;3834:102;;;3897:1;3889:9;;3916:5;;3834:102;3815:3;;;;;;;3777:169;;;;3977:12;3968:5;:21;3964:39;;;3998:5;3991:12;;;;;;3964:39;4047:9;4059:5;4047:17;;4042:99;4085:1;4070:5;:12;;;;:16;4066:1;:20;4042:99;;;4118:5;4128:1;4124;:5;4118:12;;;;;;;;;;;;;;;;;;4107:5;4113:1;4107:8;;;;;;;;;;;;;;;;;;:23;;;;;;;;;;;;;;;;;;;4088:3;;;;;;;4042:99;;;;4157:5;4178:1;4163:5;:12;;;;:16;4157:23;;;;;;;;;;;;;;;;;;;4150:30;;;;;;;;;;;;;;4190:5;:14;;;;;;;;;;;;:::i;:::-;;4228:35;4243:8;4253:9;4228:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;4228:35:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4280:4;4273:11;;;;1152:1:8;3408:883:5;;;;:::o;892:77:8:-;930:7;956:6;;;;;;;;;;;949:13;;892:77;:::o;1243:92::-;1283:4;1322:6;;;;;;;;;;;1306:22;;:12;:10;:12::i;:::-;:22;;;1299:29;;1243:92;:::o;2492:366:0:-;2555:7;2601:1;2582:21;;:7;:21;;;;2574:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2658:20;2681:35;2708:7;2681:26;:35::i;:::-;2658:58;;2809:42;2818:12;2832:9;:18;2842:7;2832:18;;;;;;;;;;;;;;;;2809:8;:42::i;:::-;2802:49;;;2492:366;;;:::o;838:85:3:-;877:13;909:7;902:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;838:85;:::o;3387:258:2:-;3472:4;3488:129;3497:12;:10;:12::i;:::-;3511:7;3520:96;3559:15;3520:96;;;;;;;;;;;;;;;;;:11;:25;3532:12;:10;:12::i;:::-;3520:25;;;;;;;;;;;;;;;:34;3546:7;3520:34;;;;;;;;;;;;;;;;:38;;:96;;;;;:::i;:::-;3488:8;:129::i;:::-;3634:4;3627:11;;3387:258;;;;:::o;775:518:5:-;849:7;868:22;893:17;:26;911:7;893:26;;;;;;;;;;;;;;;868:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;959:1;939:8;933:22;:27;929:340;;1008:23;1034:14;1049:8;1034:24;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;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;;;1034:24:5;;;;;;;;;;;;;;;;;;;;;1008:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1077:9;1089:1;1077:13;;1072:187;1096:5;:12;1092:1;:16;1072:187;;;1159:15;1137:5;1143:1;1137:8;;;;;;;;;;;;;;:18;;;:37;1133:112;;1205:5;1211:1;1205:8;;;;;;;;;;;;;;:21;;;1198:28;;;;;;;1133:112;1110:3;;;;;;;1072:187;;;;929:340;;1285:1;1278:8;;;775:518;;;;:::o;908:155:2:-;977:4;993:42;1003:12;:10;:12::i;:::-;1017:9;1028:6;993:9;:42::i;:::-;1052:4;1045:11;;908:155;;;;:::o;1462:228:5:-;1557:4;1096:9:8;:7;:9::i;:::-;1088:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1602:8:5;1573:17;:26;1591:7;1573:26;;;;;;;;;;;;;;;:37;;;;;;;;;;;;:::i;:::-;;1625;1644:7;1653:8;1625:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;1625:37:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1679:4;1672:11;;1462:228;;;;:::o;1738:132::-;1805:13;1837:17;:26;1855:7;1837:26;;;;;;;;;;;;;;;1830:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1738:132;;;:::o;542:85:0:-;584:7;610:10;;603:17;;542:85;:::o;1121:132:2:-;1193:7;1219:11;:18;1231:5;1219:18;;;;;;;;;;;;;;;:27;1238:7;1219:27;;;;;;;;;;;;;;;;1212:34;;1121:132;;;;:::o;1963:107:8:-;1096:9;:7;:9::i;:::-;1088:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2035:28;2054:8;2035:18;:28::i;:::-;1963:107;:::o;5418:589:5:-;5484:16;5502;5530:13;5546:1;5530:17;;5566:23;5592:14;5607:8;5592:24;;;;;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;182:3;176:10;171:3;164:23;98:2;93:3;89:12;82:19;;123:2;118:3;114:12;107:19;;148:2;143:3;139:12;132:19;;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;;;5592:24:5;;;;;;;;;;;;;;;;;;;;;5566:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5626:27;5670:5;:12;5656:27;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;5656:27:5;;;;5626:57;;5693:30;5740:5;:12;5726:27;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;148:4;140:6;136:17;126:27;;0:157;5726:27:5;;;;5693:60;;5785:1;5777:9;;5772:176;5796:5;:12;5788:5;:20;5772:176;;;5853:5;5859;5853:12;;;;;;;;;;;;;;:22;;;5833:10;5844:5;5833:17;;;;;;;;;;;;;:42;;;;;5912:5;5918;5912:12;;;;;;;;;;;;;;:25;;;5889:13;5903:5;5889:20;;;;;;;;;;;;;:48;;;;;5810:7;;;;;;;5772:176;;;5974:10;5986:13;5966:34;;;;;;;;5418:589;;;:::o;1303:98::-;1353:7;1379:15;1372:22;;1303:98;:::o;786:96:1:-;831:15;865:10;858:17;;786:96;:::o;6313:332:2:-;6423:1;6406:19;;:5;:19;;;;6398:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6503:1;6484:21;;:7;:21;;;;6476:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6585:6;6555:11;:18;6567:5;6555:18;;;;;;;;;;;;;;;:27;6574:7;6555:27;;;;;;;;;;;;;;;:36;;;;6622:7;6606:32;;6615:5;6606:32;;;6631:6;6606:32;;;;;;;;;;;;;;;;;;6313:332;;;:::o;1778:660:0:-;1893:1;1875:20;;:6;:20;;;;1867:75;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1981:1;1960:23;;:9;:23;;;;1952:76;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2047:20;2070:34;2097:6;2070:26;:34::i;:::-;2047:57;;2155:12;2122:29;2144:6;2122:9;:17;2132:6;2122:17;;;;;;;;;;;;;;;;:21;;:29;;;;:::i;:::-;:45;;2114:95;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2240:76;2262:6;2240:76;;;;;;;;;;;;;;;;;:9;:17;2250:6;2240:17;;;;;;;;;;;;;;;;:21;;:76;;;;;:::i;:::-;2220:9;:17;2230:6;2220:17;;;;;;;;;;;;;;;:96;;;;2349:32;2374:6;2349:9;:20;2359:9;2349:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;2326:9;:20;2336:9;2326:20;;;;;;;;;;;;;;;:55;;;;2413:9;2396:35;;2405:6;2396:35;;;2424:6;2396:35;;;;;;;;;;;;;;;;;;1778:660;;;;:::o;1844:187:9:-;1930:7;1962:1;1957;:6;;1965:12;1949:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;1949:29:9;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1988:9;2004:1;2000;:5;1988:17;;2023:1;2016:8;;;1844:187;;;;;:::o;1274:134::-;1332:7;1358:43;1362:1;1365;1358:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;1351:50;;1274:134;;;;:::o;834:176::-;892:7;911:9;927:1;923;:5;911:17;;951:1;946;:6;;938:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1002:1;995:8;;;834:176;;;;:::o;4853:338:2:-;4947:1;4928:21;;:7;:21;;;;4920:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5011:24;5028:6;5011:12;;:16;;:24;;;;:::i;:::-;4996:12;:39;;;;5066:30;5089:6;5066:9;:18;5076:7;5066:18;;;;;;;;;;;;;;;;:22;;:30;;;;:::i;:::-;5045:9;:18;5055:7;5045:18;;;;;;;;;;;;;;;:51;;;;5111:21;5116:7;5125:6;5111:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;5168:7;5147:37;;5164:1;5147:37;;;5177:6;5147:37;;;;;;;;;;;;;;;;;;4853:338;;:::o;5510:378::-;5604:1;5585:21;;:7;:21;;;;5577:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5676:68;5699:6;5676:68;;;;;;;;;;;;;;;;;:9;:18;5686:7;5676:18;;;;;;;;;;;;;;;;:22;;:68;;;;;:::i;:::-;5655:9;:18;5665:7;5655:18;;;;;;;;;;;;;;;:89;;;;5769:24;5786:6;5769:12;;:16;;:24;;;;:::i;:::-;5754:12;:39;;;;5834:1;5808:37;;5817:7;5808:37;;;5838:6;5808:37;;;;;;;;;;;;;;;;;;5860:21;5865:7;5874:6;5860:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;5510:378;;:::o;358:104:6:-;416:7;446:1;442;:5;:13;;454:1;442:13;;;450:1;442:13;435:20;;358:104;;;;:::o;2171:225:8:-;2264:1;2244:22;;:8;:22;;;;2236:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2353:8;2324:38;;2345:6;;;;;;;;;;;2324:38;;;;;;;;;;;;2381:8;2372:6;;:17;;;;;;;;;;;;;;;;;;2171:225;:::o;53:182:10:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o

Swarm Source

bzzr://cf85e25dd5cc7656fbdd92e6ae1a152ed5a74b1c7b40b8ad81457882ecf34398
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.