ETH Price: $2,385.22 (+1.86%)
Gas: 4.84 Gwei

Token

Vevue Media, Inc. (VUE)
 

Overview

Max Total Supply

100,000,000 VUE

Holders

65

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
478 VUE

Value
$0.00
0x1a733f3Cd7056e8E9E2a8eeb14D651D65473b1B7
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Similar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0x2c3D7c64...127cE43De
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
RestrictedToken

Compiler Version
v0.5.12+commit.7709ece9

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2019-10-18
*/

// File: contracts/ITransferRules.sol

pragma solidity 0.5.12;

contract ITransferRules {
    /// @notice Detects if a transfer will be reverted and if so returns an appropriate reference code
    /// @param from Sending address
    /// @param to Receiving address
    /// @param value Amount of tokens being transferred
    /// @return Code by which to reference message for rejection reasoning
    function detectTransferRestriction(
        address token,
        address from,
        address to,
        uint256 value
    ) external view returns (uint8);

    /// @notice Returns a human-readable message for a given restriction code
    /// @param restrictionCode Identifier for looking up a message
    /// @return Text showing the restriction's reasoning
    function messageForTransferRestriction(uint8 restrictionCode)
        external
        view
        returns (string memory);

    function checkSuccess(uint8 restrictionCode) external view returns (bool);
}

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

pragma solidity ^0.5.0;

/**
 * @title Roles
 * @dev Library for managing addresses assigned to a Role.
 */
library Roles {
    struct Role {
        mapping (address => bool) bearer;
    }

    /**
     * @dev Give an account access to this role.
     */
    function add(Role storage role, address account) internal {
        require(!has(role, account), "Roles: account already has role");
        role.bearer[account] = true;
    }

    /**
     * @dev Remove an account's access to this role.
     */
    function remove(Role storage role, address account) internal {
        require(has(role, account), "Roles: account does not have role");
        role.bearer[account] = false;
    }

    /**
     * @dev Check if an account has this role.
     * @return bool
     */
    function has(Role storage role, address account) internal view returns (bool) {
        require(account != address(0), "Roles: account is the zero address");
        return role.bearer[account];
    }
}

// File: @openzeppelin/contracts/token/ERC20/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.
     *
     * > 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);
}

// File: @openzeppelin/contracts/math/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) {
        require(b <= a, "SafeMath: subtraction overflow");
        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) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, "SafeMath: division by zero");
        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) {
        require(b != 0, "SafeMath: modulo by zero");
        return a % b;
    }
}

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

pragma solidity ^0.5.0;



/**
 * @dev Implementation of the `IERC20` interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using `_mint`.
 * For a generic mechanism see `ERC20Mintable`.
 *
 * *For a detailed writeup see our guide [How to implement supply
 * mechanisms](https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226).*
 *
 * We have followed general OpenZeppelin guidelines: functions revert instead
 * of returning `false` on failure. This behavior is nonetheless conventional
 * and does not conflict with the expectations of ERC20 applications.
 *
 * Additionally, an `Approval` event is emitted on calls to `transferFrom`.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard `decreaseAllowance` and `increaseAllowance`
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See `IERC20.approve`.
 */
contract ERC20 is IERC20 {
    using SafeMath for uint256;

    mapping (address => uint256) private _balances;

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

    uint256 private _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(msg.sender, 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 value) public returns (bool) {
        _approve(msg.sender, spender, value);
        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 `value`.
     * - 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, msg.sender, _allowances[sender][msg.sender].sub(amount));
        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(msg.sender, spender, _allowances[msg.sender][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(msg.sender, spender, _allowances[msg.sender][spender].sub(subtractedValue));
        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);
        _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 Transfer(address(0), account, amount);
    }

     /**
     * @dev Destoys `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 value) internal {
        require(account != address(0), "ERC20: burn from the zero address");

        _totalSupply = _totalSupply.sub(value);
        _balances[account] = _balances[account].sub(value);
        emit Transfer(account, address(0), value);
    }

    /**
     * @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 value) internal {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

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

    /**
     * @dev Destoys `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, msg.sender, _allowances[account][msg.sender].sub(amount));
    }
}

// File: contracts/RestrictedToken.sol

pragma solidity 0.5.12;




/// @title Restricted Token
/// @author CoMakery, Inc.
/// @notice An ERC-20 token with ERC-1404 transfer restrictions for managing security tokens, etc.
contract RestrictedToken is ERC20 {
  using SafeMath for uint256;

  string public symbol;
  string public name;
  uint8 public decimals;
  ITransferRules public transferRules;

  using Roles for Roles.Role;
  Roles.Role private _contractAdmins;
  Roles.Role private _transferAdmins;

  uint256 public maxTotalSupply;
  uint256 public contractAdminCount;

  // Transfer restriction "eternal storage" mappings that can be used by future TransferRules contract upgrades
  // They are accessed through getter and setter methods
  mapping(address => uint256) private _maxBalances;
  mapping(address => uint256) private _lockUntil; // unix timestamp to lock funds until
  mapping(address => uint256) private _transferGroups; // restricted groups like Reg D Accredited US, Reg CF Unaccredited US and Reg S Foreign
  mapping(uint256 => mapping(uint256 => uint256)) private _allowGroupTransfers; // approve transfers between groups: from => to => TimeLockUntil
  mapping(address => bool) private _frozenAddresses;

  bool public isPaused = false;

  uint256 public constant MAX_UINT256 = ((2 ** 255 - 1) * 2) + 1; // get max uint256 without overflow

  event RoleChange(address indexed grantor, address indexed grantee, string role, bool indexed status);
  event AddressMaxBalance(address indexed admin, address indexed addr, uint256 indexed value);
  event AddressTimeLock(address indexed admin, address indexed addr, uint256 indexed value);
  event AddressTransferGroup(address indexed admin, address indexed addr, uint256 indexed value);
  event AddressFrozen(address indexed admin, address indexed addr, bool indexed status);
  event AllowGroupTransfer(address indexed admin, uint256 indexed fromGroup, uint256 indexed toGroup, uint256 lockedUntil);

  event Pause(address admin, bool status);
  event Upgrade(address admin, address oldRules, address newRules);

  constructor(
    address transferRules_,
    address contractAdmin_,
    address tokenReserveAdmin_,
    string memory symbol_,
    string memory name_,
    uint8 decimals_,
    uint256 totalSupply_,
    uint256 maxTotalSupply_
  ) public {
    require(transferRules_ != address(0), "Transfer rules address cannot be 0x0");
    require(contractAdmin_ != address(0), "Token owner address cannot be 0x0");
    require(tokenReserveAdmin_ != address(0), "Token reserve admin address cannot be 0x0");

    // Transfer rules can be swapped out for a new contract inheriting from the ITransferRules interface
    // The "eternal storage" for rule data stays in this RestrictedToken contract for use by TransferRules contract upgrades
    transferRules = ITransferRules(transferRules_);
    symbol = symbol_;
    name = name_;
    decimals = decimals_;
    maxTotalSupply = maxTotalSupply_;

    _contractAdmins.add(contractAdmin_);
    contractAdminCount = 1;

    _mint(tokenReserveAdmin_, totalSupply_);
  }

  modifier onlyContractAdmin() {
    require(_contractAdmins.has(msg.sender), "DOES NOT HAVE CONTRACT OWNER ROLE");
    _;
  }

   modifier onlyTransferAdmin() {
    require(_transferAdmins.has(msg.sender), "DOES NOT HAVE TRANSFER ADMIN ROLE");
    _;
  }

  modifier onlyTransferAdminOrContractAdmin() {
    require((_contractAdmins.has(msg.sender) || _transferAdmins.has(msg.sender)),
    "DOES NOT HAVE TRANSFER ADMIN OR CONTRACT ADMIN ROLE");
    _;
  }

  modifier validAddress(address addr) {
    require(addr != address(0), "Address cannot be 0x0");
    _;
  }

  /// @dev Authorizes an address holder to write transfer restriction rules
  /// @param addr The address to grant transfer admin rights to
  function grantTransferAdmin(address addr) external validAddress(addr) onlyContractAdmin {
    _transferAdmins.add(addr);
    emit RoleChange(msg.sender, addr, "TransferAdmin", true);
  }

  /// @dev Revokes authorization to write transfer restriction rules
  /// @param addr The address to grant transfer admin rights to
  function revokeTransferAdmin(address addr) external validAddress(addr) onlyContractAdmin  {
    _transferAdmins.remove(addr);
    emit RoleChange(msg.sender, addr, "TransferAdmin", false);
  }

  /// @dev Checks if an address is an authorized transfer admin.
  /// @param addr The address to check for transfer admin privileges.
  /// @return hasPermission returns true if the address has transfer admin permission and false if not.
  function checkTransferAdmin(address addr) external view returns(bool hasPermission) {
    return _transferAdmins.has(addr);
  }

  /// @dev Authorizes an address holder to be a contract admin. Contract admins grant privileges to accounts.
  /// Contract admins can mint/burn tokens and freeze accounts.
  /// @param addr The address to grant transfer admin rights to.
  function grantContractAdmin(address addr) external validAddress(addr) onlyContractAdmin {
    _contractAdmins.add(addr);
    contractAdminCount = contractAdminCount.add(1);
    emit RoleChange(msg.sender, addr, "ContractAdmin", true);
  }

  /// @dev Revokes authorization as a contract admin.
  /// The contract requires there is at least 1 Contract Admin to avoid locking the Contract Admin functionality.
  /// @param addr The address to remove contract admin rights from
  function revokeContractAdmin(address addr) external validAddress(addr) onlyContractAdmin {
    require(contractAdminCount > 1, "Must have at least one contract admin");
    _contractAdmins.remove(addr);
    contractAdminCount = contractAdminCount.sub(1);
    emit RoleChange(msg.sender, addr, "ContractAdmin", false);
  }

  /// @dev Checks if an address is an authorized contract admin.
  /// @param addr The address to check for contract admin privileges.
  /// @return hasPermission returns true if the address has contract admin permission and false if not.
  function checkContractAdmin(address addr) external view returns(bool hasPermission) {
    return _contractAdmins.has(addr);
  }

  /// @dev Enforces transfer restrictions managed using the ERC-1404 standard functions.
  /// The TransferRules contract defines what the rules are. The data inputs to those rules remains in the RestrictedToken contract.
  /// TransferRules is a separate contract so its logic can be upgraded.
  /// @param from The address the tokens are transferred from
  /// @param to The address the tokens would be transferred to
  /// @param value the quantity of tokens to be transferred
  function enforceTransferRestrictions(address from, address to, uint256 value) private view {
    uint8 restrictionCode = detectTransferRestriction(from, to, value);
    require(transferRules.checkSuccess(restrictionCode), messageForTransferRestriction(restrictionCode));
  }

  /// @dev Calls the TransferRules detectTransferRetriction function to determine if tokens can be transferred.
  /// detectTransferRestriction returns a status code.
  /// @param from The address the tokens are transferred from
  /// @param to The address the tokens would be transferred to
  /// @param value The quantity of tokens to be transferred
  function detectTransferRestriction(address from, address to, uint256 value) public view returns(uint8) {
    return transferRules.detectTransferRestriction(address(this), from, to, value);
  }

  /// @dev Calls TransferRules to lookup a human readable error message that goes with an error code.
  /// @param restrictionCode is an error code to lookup an error code for
  function messageForTransferRestriction(uint8 restrictionCode) public view returns(string memory) {
    return transferRules.messageForTransferRestriction(restrictionCode);
  }

  /// @dev Sets the maximum number of tokens an address will be allowed to hold.
  /// Addresses can hold 0 tokens by default.
  /// @param addr The address to restrict
  /// @param updatedValue the maximum number of tokens the address can hold
  function setMaxBalance(address addr, uint256 updatedValue) public validAddress(addr) onlyTransferAdmin {
    _maxBalances[addr] = updatedValue;
    emit AddressMaxBalance(msg.sender, addr, updatedValue);
  }

  /// @dev Gets the maximum number of tokens an address is allowed to hold
  /// @param addr The address to check restrictions for
  function getMaxBalance(address addr) external view returns(uint256) {
    return _maxBalances[addr];
  }

  /// @dev Lock tokens in the address from being transfered until the specified time
  /// @param addr The address to restrict
  /// @param timestamp The time the tokens will be locked until as a Unix timetsamp.
  /// Unix timestamp is the number of seconds since the Unix epoch of 00:00:00 UTC on 1 January 1970.
  function setLockUntil(address addr, uint256 timestamp) public validAddress(addr)  onlyTransferAdmin {
    _lockUntil[addr] = timestamp;
    emit AddressTimeLock(msg.sender, addr, timestamp);
  }
  /// @dev A convenience method to remove an addresses timelock. It sets the lock date to 0 which corresponds to the
  /// earliest possible timestamp in the past 00:00:00 UTC on 1 January 1970.
  /// @param addr The address to remove the timelock for.
  function removeLockUntil(address addr) external validAddress(addr) onlyTransferAdmin {
    _lockUntil[addr] = 0;
    emit AddressTimeLock(msg.sender, addr, 0);
  }

  /// @dev Check when the address will be locked for transfers until
  /// @param addr The address to check
  /// @return timestamp The time the address will be locked until.
  /// The format is the number of seconds since the Unix epoch of 00:00:00 UTC on 1 January 1970.
  function getLockUntil(address addr) external view returns(uint256 timestamp) {
    return _lockUntil[addr];
  }

  /// @dev Set the one group that the address belongs to, such as a US Reg CF investor group.
  /// @param addr The address to set the group for.
  /// @param groupID The uint256 numeric ID of the group.
  function setTransferGroup(address addr, uint256 groupID) public validAddress(addr) onlyTransferAdmin {
    _transferGroups[addr] = groupID;
    emit AddressTransferGroup(msg.sender, addr, groupID);
  }

  /// @dev Gets the transfer group the address belongs to. The default group is 0.
  /// @param addr The address to check.
  /// @return groupID The group id of the address.
  function getTransferGroup(address addr) external view returns(uint256 groupID) {
    return _transferGroups[addr];
  }

  /// @dev Freezes or unfreezes an address.
  /// Tokens in a frozen address cannot be transferred from until the address is unfrozen.
  /// @param addr The address to be frozen.
  /// @param status The frozenAddress status of the address. True means frozen false means not frozen.
  function freeze(address addr, bool status) public validAddress(addr)  onlyTransferAdminOrContractAdmin {
    _frozenAddresses[addr] = status;
    emit AddressFrozen(msg.sender, addr, status);
  }

  /// @dev Checks the status of an address to see if its frozen
  /// @param addr The address to check
  /// @return status Returns true if the address is frozen and false if its not frozen.
  function getFrozenStatus(address addr) external view returns(bool status) {
    return _frozenAddresses[addr];
  }

  /// @dev A convenience method for updating the transfer group, lock until, max balance, and freeze status.
  /// The convenience method also helps to reduce gas costs.
  /// @param addr The address to set permissions for.
  /// @param groupID The ID of the address
  /// @param timeLockUntil The unix timestamp that the address should be locked until. Use 0 if it's not locked.
  /// The format is the number of seconds since the Unix epoch of 00:00:00 UTC on 1 January 1970.
  /// @param maxBalance Is the maximum number of tokens the account can hold.
  /// @param status The frozenAddress status of the address. True means frozen false means not frozen.
  function setAddressPermissions(address addr, uint256 groupID, uint256 timeLockUntil,
    uint256 maxBalance, bool status) public validAddress(addr) onlyTransferAdmin {
    setTransferGroup(addr, groupID);
    setLockUntil(addr, timeLockUntil);
    setMaxBalance(addr, maxBalance);
    freeze(addr, status);
  }

  /// @dev Sets an allowed transfer from a group to another group beginning at a specific time.
  /// There is only one definitive rule per from and to group.
  /// @param from The group the transfer is coming from.
  /// @param to The group the transfer is going to.
  /// @param lockedUntil The unix timestamp that the transfer is locked until. 0 is a special number. 0 means the transfer is not allowed.
  /// This is because in the smart contract mapping all pairs are implicitly defined with a default lockedUntil value of 0.
  /// But no transfers should be authorized until explicitly allowed. Thus 0 must mean no transfer is allowed.
  function setAllowGroupTransfer(uint256 from, uint256 to, uint256 lockedUntil) external onlyTransferAdmin {
    _allowGroupTransfers[from][to] = lockedUntil;
    emit AllowGroupTransfer(msg.sender, from, to, lockedUntil);
  }

  /// @dev Checks to see when a transfer between two addresses would be allowed.
  /// @param from The address the transfer is coming from
  /// @param to The address the transfer is going to
  /// @return timestamp The Unix timestamp of the time the transfer would be allowed. A 0 means never.
  /// The format is the number of seconds since the Unix epoch of 00:00:00 UTC on 1 January 1970.
  function getAllowTransferTime(address from, address to) external view returns(uint timestamp) {
    return _allowGroupTransfers[_transferGroups[from]][_transferGroups[to]];
  }

  /// @dev Checks to see when a transfer between two groups would be allowed.
  /// @param from The group id the transfer is coming from
  /// @param to The group id the transfer is going to
  /// @return timestamp The Unix timestamp of the time the transfer would be allowed. A 0 means never.
  /// The format is the number of seconds since the Unix epoch of 00:00:00 UTC on 1 January 1970.
  function getAllowGroupTransferTime(uint from, uint to) external view returns(uint timestamp) {
    return _allowGroupTransfers[from][to];
  }

  /// @dev Destroys tokens and removes them from the total supply. Can only be called by an address with a Contract Admin role.
  /// @param from The address to destroy the tokens from.
  /// @param value The number of tokens to destroy from the address.
  function burn(address from, uint256 value) external validAddress(from) onlyContractAdmin {
    require(value <= balanceOf(from), "Insufficent tokens to burn");
    _burn(from, value);
  }

  /// @dev Allows the contract admin to create new tokens in a specified address.
  /// The total number of tokens cannot exceed the maxTotalSupply (the "Hard Cap").
  /// @param to The addres to mint tokens into.
  /// @param value The number of tokens to mint.
  function mint(address to, uint256 value) external validAddress(to) onlyContractAdmin  {
    require(SafeMath.add(totalSupply(), value) <= maxTotalSupply, "Cannot mint more than the max total supply");
    _mint(to, value);
  }

  /// @dev Allows the contract admin to pause transfers.
  function pause() external onlyContractAdmin() {
    isPaused = true;
    emit Pause(msg.sender, true);
  }

  /// @dev Allows the contract admin to unpause transfers.
  function unpause() external onlyContractAdmin() {
    isPaused = false;
    emit Pause(msg.sender, false);
  }

  /// @dev Allows the contrac admin to upgrade the transfer rules.
  /// The upgraded transfer rules must implement the ITransferRules interface which conforms to the ERC-1404 token standard.
  /// @param newTransferRules The address of the deployed TransferRules contract.
  function upgradeTransferRules(ITransferRules newTransferRules) external onlyContractAdmin {
    require(address(newTransferRules) != address(0x0), "Address cannot be 0x0");
    address oldRules = address(transferRules);
    transferRules = newTransferRules;
    emit Upgrade(msg.sender, oldRules, address(newTransferRules));
  }

  function transfer(address to, uint256 value) public validAddress(to) returns(bool success) {
    require(value <= balanceOf(msg.sender), "Insufficent tokens");
    enforceTransferRestrictions(msg.sender, to, value);
    super.transfer(to, value);
    return true;
  }

  function transferFrom(address from, address to, uint256 value) public validAddress(from) validAddress(to) returns(bool success) {
    require(value <= allowance(from, to), "The approved allowance is lower than the transfer amount");
    require(value <= balanceOf(from), "Insufficent tokens");
    enforceTransferRestrictions(from, to, value);
    super.transferFrom(from, to, value);
    return true;
  }

  function safeApprove(address spender, uint256 value) public {
    // safeApprove should only be called when setting an initial allowance,
    // or when resetting it to zero. To increase and decrease it, use
    // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
    require((value == 0) || (allowance(address(msg.sender), spender) == 0),
        "Cannot approve from non-zero to non-zero allowance"
    );
    approve(spender, value);
  }
}

// File: contracts/TransferRules.sol

pragma solidity 0.5.12;




contract TransferRules is ITransferRules {
    using SafeMath for uint256;
    mapping(uint8 => string) internal errorMessage;

    uint8 public constant SUCCESS = 0;
    uint8 public constant GREATER_THAN_RECIPIENT_MAX_BALANCE = 1;
    uint8 public constant SENDER_TOKENS_TIME_LOCKED = 2;
    uint8 public constant DO_NOT_SEND_TO_TOKEN_CONTRACT = 3;
    uint8 public constant DO_NOT_SEND_TO_EMPTY_ADDRESS = 4;
    uint8 public constant SENDER_ADDRESS_FROZEN = 5;
    uint8 public constant ALL_TRANSFERS_PAUSED = 6;
    uint8 public constant TRANSFER_GROUP_NOT_APPROVED = 7;
    uint8 public constant TRANSFER_GROUP_NOT_ALLOWED_UNTIL_LATER = 8;

  constructor() public {
    errorMessage[SUCCESS] = "SUCCESS";
    errorMessage[GREATER_THAN_RECIPIENT_MAX_BALANCE] = "GREATER THAN RECIPIENT MAX BALANCE";
    errorMessage[SENDER_TOKENS_TIME_LOCKED] = "SENDER TOKENS LOCKED";
    errorMessage[DO_NOT_SEND_TO_TOKEN_CONTRACT] = "DO NOT SEND TO TOKEN CONTRACT";
    errorMessage[DO_NOT_SEND_TO_EMPTY_ADDRESS] = "DO NOT SEND TO EMPTY ADDRESS";
    errorMessage[SENDER_ADDRESS_FROZEN] = "SENDER ADDRESS IS FROZEN";
    errorMessage[ALL_TRANSFERS_PAUSED] = "ALL TRANSFERS PAUSED";
    errorMessage[TRANSFER_GROUP_NOT_APPROVED] = "TRANSFER GROUP NOT APPROVED";
    errorMessage[TRANSFER_GROUP_NOT_ALLOWED_UNTIL_LATER] = "TRANSFER GROUP NOT ALLOWED UNTIL LATER";
  }

  /// @notice Detects if a transfer will be reverted and if so returns an appropriate reference code
  /// @param from Sending address
  /// @param to Receiving address
  /// @param value Amount of tokens being transferred
  /// @return Code by which to reference message for rejection reason
  function detectTransferRestriction(address _token, address from, address to, uint256 value) external view returns(uint8) {
    RestrictedToken token = RestrictedToken(_token);
    if (token.isPaused()) return ALL_TRANSFERS_PAUSED;
    if (to == address(0)) return DO_NOT_SEND_TO_EMPTY_ADDRESS;
    if (to == address(token)) return DO_NOT_SEND_TO_TOKEN_CONTRACT;

    if (token.balanceOf(to).add(value) > token.getMaxBalance(to)) return GREATER_THAN_RECIPIENT_MAX_BALANCE;
    if (now < token.getLockUntil(from)) return SENDER_TOKENS_TIME_LOCKED;
    if (token.getFrozenStatus(from)) return SENDER_ADDRESS_FROZEN;

    uint256 lockedUntil = token.getAllowTransferTime(from, to);
    if (0 == lockedUntil) return TRANSFER_GROUP_NOT_APPROVED;
    if (now < lockedUntil) return TRANSFER_GROUP_NOT_ALLOWED_UNTIL_LATER;

    return SUCCESS;
  }

  /// @notice Returns a human-readable message for a given restriction code
  /// @param restrictionCode Identifier for looking up a message
  /// @return Text showing the restriction's reasoning
  function messageForTransferRestriction(uint8 restrictionCode) external view returns(string memory) {
    return errorMessage[restrictionCode];
  }

  /// @notice a method for checking a response code to determine if a transfer was succesful.
  /// Defining this separately from the token contract allows it to be upgraded.
  /// For instance this method would need to be upgraded if the SUCCESS code was changed to 1
  /// as specified in ERC-1066 instead of 0 as specified in ERC-1404.
  /// @param restrictionCode The code to check.
  /// @return isSuccess A boolean indicating if the code is the SUCCESS code.
  function checkSuccess(uint8 restrictionCode) external view returns(bool isSuccess) {
    return restrictionCode == SUCCESS;
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"transferRules_","type":"address"},{"internalType":"address","name":"contractAdmin_","type":"address"},{"internalType":"address","name":"tokenReserveAdmin_","type":"address"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"string","name":"name_","type":"string"},{"internalType":"uint8","name":"decimals_","type":"uint8"},{"internalType":"uint256","name":"totalSupply_","type":"uint256"},{"internalType":"uint256","name":"maxTotalSupply_","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"admin","type":"address"},{"indexed":true,"internalType":"address","name":"addr","type":"address"},{"indexed":true,"internalType":"bool","name":"status","type":"bool"}],"name":"AddressFrozen","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"admin","type":"address"},{"indexed":true,"internalType":"address","name":"addr","type":"address"},{"indexed":true,"internalType":"uint256","name":"value","type":"uint256"}],"name":"AddressMaxBalance","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"admin","type":"address"},{"indexed":true,"internalType":"address","name":"addr","type":"address"},{"indexed":true,"internalType":"uint256","name":"value","type":"uint256"}],"name":"AddressTimeLock","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"admin","type":"address"},{"indexed":true,"internalType":"address","name":"addr","type":"address"},{"indexed":true,"internalType":"uint256","name":"value","type":"uint256"}],"name":"AddressTransferGroup","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"admin","type":"address"},{"indexed":true,"internalType":"uint256","name":"fromGroup","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"toGroup","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lockedUntil","type":"uint256"}],"name":"AllowGroupTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"admin","type":"address"},{"indexed":false,"internalType":"bool","name":"status","type":"bool"}],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"grantor","type":"address"},{"indexed":true,"internalType":"address","name":"grantee","type":"address"},{"indexed":false,"internalType":"string","name":"role","type":"string"},{"indexed":true,"internalType":"bool","name":"status","type":"bool"}],"name":"RoleChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"admin","type":"address"},{"indexed":false,"internalType":"address","name":"oldRules","type":"address"},{"indexed":false,"internalType":"address","name":"newRules","type":"address"}],"name":"Upgrade","type":"event"},{"constant":true,"inputs":[],"name":"MAX_UINT256","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"checkContractAdmin","outputs":[{"internalType":"bool","name":"hasPermission","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"checkTransferAdmin","outputs":[{"internalType":"bool","name":"hasPermission","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"contractAdminCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"detectTransferRestriction","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bool","name":"status","type":"bool"}],"name":"freeze","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"from","type":"uint256"},{"internalType":"uint256","name":"to","type":"uint256"}],"name":"getAllowGroupTransferTime","outputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"getAllowTransferTime","outputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"getFrozenStatus","outputs":[{"internalType":"bool","name":"status","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"getLockUntil","outputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"getMaxBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"getTransferGroup","outputs":[{"internalType":"uint256","name":"groupID","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"grantContractAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"grantTransferAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"maxTotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint8","name":"restrictionCode","type":"uint8"}],"name":"messageForTransferRestriction","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"mint","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"removeLockUntil","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"revokeContractAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"revokeTransferAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"safeApprove","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"groupID","type":"uint256"},{"internalType":"uint256","name":"timeLockUntil","type":"uint256"},{"internalType":"uint256","name":"maxBalance","type":"uint256"},{"internalType":"bool","name":"status","type":"bool"}],"name":"setAddressPermissions","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"from","type":"uint256"},{"internalType":"uint256","name":"to","type":"uint256"},{"internalType":"uint256","name":"lockedUntil","type":"uint256"}],"name":"setAllowGroupTransfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"setLockUntil","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"updatedValue","type":"uint256"}],"name":"setMaxBalance","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"groupID","type":"uint256"}],"name":"setTransferGroup","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"transferRules","outputs":[{"internalType":"contract ITransferRules","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"contract ITransferRules","name":"newTransferRules","type":"address"}],"name":"upgradeTransferRules","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]

6080604052600f805460ff191690553480156200001b57600080fd5b506040516200304c3803806200304c83398181016040526101008110156200004257600080fd5b8151602083015160408085015160608601805192519496939591949391820192846401000000008211156200007657600080fd5b9083019060208201858111156200008c57600080fd5b8251640100000000811182820188101715620000a757600080fd5b82525081516020918201929091019080838360005b83811015620000d6578181015183820152602001620000bc565b50505050905090810190601f168015620001045780820380516001836020036101000a031916815260200191505b50604052602001805160405193929190846401000000008211156200012857600080fd5b9083019060208201858111156200013e57600080fd5b82516401000000008111828201881017156200015957600080fd5b82525081516020918201929091019080838360005b83811015620001885781810151838201526020016200016e565b50505050905090810190601f168015620001b65780820380516001836020036101000a031916815260200191505b5060409081526020820151908201516060909201519093509091506001600160a01b03881662000232576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180620030066024913960400191505060405180910390fd5b6001600160a01b03871662000293576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018062002fbc6021913960400191505060405180910390fd5b6001600160a01b038616620002f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602981526020018062002fdd6029913960400191505060405180910390fd5b60058054610100600160a81b0319166101006001600160a01b038b160217905584516200032990600390602088019062000656565b5083516200033f90600490602087019062000656565b506005805460ff191660ff851617905560088190556200036d60068862000395602090811b6200231a17901c565b60016009556200038786836001600160e01b036200043c16565b5050505050505050620006fb565b620003aa82826001600160e01b036200055716565b156200041757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500604482015290519081900360640190fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b6001600160a01b038216620004b257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b620004ce81600254620005da60201b620021c91790919060201c565b6002556001600160a01b0382166000908152602081815260409091205462000501918390620021c9620005da821b17901c565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b60006001600160a01b038216620005ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806200302a6022913960400191505060405180910390fd5b506001600160a01b03166000908152602091909152604090205460ff1690565b6000828201838110156200064f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200069957805160ff1916838001178555620006c9565b82800160010185558215620006c9579182015b82811115620006c9578251825591602001919060010190620006ac565b50620006d7929150620006db565b5090565b620006f891905b80821115620006d75760008155600101620006e2565b90565b6128b1806200070b6000396000f3fe608060405234801561001057600080fd5b50600436106102695760003560e01c806364ca0ac311610151578063b187bd26116100c3578063db74fa3611610087578063db74fa36146107e8578063dd62ed3e1461080e578063dfb7300e1461083c578063e98a0c6414610862578063fbc6d1cb1461088b578063fc96f7d8146108b757610269565b8063b187bd2614610732578063bf120ae51461073a578063c63aa52114610768578063ceca46c21461078e578063d4ce1415146107b257610269565b80638e64eac5116101155780638e64eac51461067857806395d89b411461068057806395ed620a146106885780639dc29fac146106ae578063a457c2d7146106da578063a9059cbb1461070657610269565b806364ca0ac3146105d257806370a08231146105fe5780637f4ab1dd146106245780638456cb59146106445780638d56cc9c1461064c57610269565b806333a581d2116101ea57806340c10f19116101ae57806340c10f19146104c657806340dc95c5146104f257806343c8fc6f1461052057806345d11299146105465780634723778c14610586578063587c9571146105ac57610269565b806333a581d21461044157806339509351146104495780633b1f927f146104755780633c637d741461049b5780633f4ba83a146104be57610269565b806318160ddd1161023157806318160ddd146103b157806323b872dd146103b95780632ab4d052146103ef57806330e15818146103f7578063313ce5671461042357610269565b8063025cb46b1461026e57806306fdde03146102a8578063079ade0114610325578063095ea7b31461035d5780631309d2e514610389575b600080fd5b6102946004803603602081101561028457600080fd5b50356001600160a01b03166108dd565b604080519115158252519081900360200190f35b6102b06108f6565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102ea5781810151838201526020016102d2565b50505050905090810190601f1680156103175780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61034b6004803603602081101561033b57600080fd5b50356001600160a01b0316610984565b60408051918252519081900360200190f35b6102946004803603604081101561037357600080fd5b506001600160a01b03813516906020013561099f565b6103af6004803603602081101561039f57600080fd5b50356001600160a01b03166109b5565b005b61034b610aaf565b610294600480360360608110156103cf57600080fd5b506001600160a01b03813581169160208101359091169060400135610ab5565b61034b610c08565b6103af6004803603604081101561040d57600080fd5b506001600160a01b038135169060200135610c0e565b61042b610cef565b6040805160ff9092168252519081900360200190f35b61034b610cf8565b6102946004803603604081101561045f57600080fd5b506001600160a01b038135169060200135610cfe565b6103af6004803603602081101561048b57600080fd5b50356001600160a01b0316610d3f565b61034b600480360360408110156104b157600080fd5b5080359060200135610e20565b6103af610e3d565b6103af600480360360408110156104dc57600080fd5b506001600160a01b038135169060200135610ed0565b61034b6004803603604081101561050857600080fd5b506001600160a01b0381358116916020013516610fc6565b6103af6004803603602081101561053657600080fd5b50356001600160a01b0316611004565b6103af600480360360a081101561055c57600080fd5b506001600160a01b03813516906020810135906040810135906060810135906080013515156110fe565b6103af6004803603602081101561059c57600080fd5b50356001600160a01b03166111c4565b6103af600480360360208110156105c257600080fd5b50356001600160a01b03166112d5565b6103af600480360360408110156105e857600080fd5b506001600160a01b038135169060200135611427565b61034b6004803603602081101561061457600080fd5b50356001600160a01b0316611508565b6102b06004803603602081101561063a57600080fd5b503560ff16611523565b6103af61166a565b6103af6004803603604081101561066257600080fd5b506001600160a01b038135169060200135611703565b61034b6117e4565b6102b06117ea565b6102946004803603602081101561069e57600080fd5b50356001600160a01b0316611845565b6103af600480360360408110156106c457600080fd5b506001600160a01b038135169060200135611858565b610294600480360360408110156106f057600080fd5b506001600160a01b038135169060200135611955565b6102946004803603604081101561071c57600080fd5b506001600160a01b038135169060200135611991565b610294611a4f565b6103af6004803603604081101561075057600080fd5b506001600160a01b0381351690602001351515611a58565b61034b6004803603602081101561077e57600080fd5b50356001600160a01b0316611b5d565b610796611b78565b604080516001600160a01b039092168252519081900360200190f35b61042b600480360360608110156107c857600080fd5b506001600160a01b03813581169160208101359091169060400135611b8c565b61034b600480360360208110156107fe57600080fd5b50356001600160a01b0316611c2a565b61034b6004803603604081101561082457600080fd5b506001600160a01b0381358116916020013516611c45565b6103af6004803603602081101561085257600080fd5b50356001600160a01b0316611c70565b6103af6004803603606081101561087857600080fd5b5080359060208101359060400135611d7a565b6103af600480360360408110156108a157600080fd5b506001600160a01b038135169060200135611e1f565b610294600480360360208110156108cd57600080fd5b50356001600160a01b0316611e78565b60006108f060068363ffffffff611e9616565b92915050565b6004805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152929183018282801561097c5780601f106109515761010080835404028352916020019161097c565b820191906000526020600020905b81548152906001019060200180831161095f57829003601f168201915b505050505081565b6001600160a01b03166000908152600b602052604090205490565b60006109ac338484611efd565b50600192915050565b806001600160a01b0381166109ff576040805162461bcd60e51b81526020600482015260156024820152600080516020612672833981519152604482015290519081900360640190fd5b610a1060063363ffffffff611e9616565b610a4b5760405162461bcd60e51b81526004018080602001828103825260218152602001806126b46021913960400191505060405180910390fd5b610a5c60078363ffffffff611fe916565b604080516020808252600d908201526c2a3930b739b332b920b236b4b760991b8183015290516000916001600160a01b0385169133916000805160206127b2833981519152919081900360600190a45050565b60025490565b6000836001600160a01b038116610b01576040805162461bcd60e51b81526020600482015260156024820152600080516020612672833981519152604482015290519081900360640190fd5b836001600160a01b038116610b4b576040805162461bcd60e51b81526020600482015260156024820152600080516020612672833981519152604482015290519081900360640190fd5b610b558686611c45565b841115610b935760405162461bcd60e51b815260040180806020018281038252603881526020018061281b6038913960400191505060405180910390fd5b610b9c86611508565b841115610be5576040805162461bcd60e51b8152602060048201526012602482015271496e737566666963656e7420746f6b656e7360701b604482015290519081900360640190fd5b610bf0868686612050565b610bfb868686612177565b5060019695505050505050565b60085481565b816001600160a01b038116610c58576040805162461bcd60e51b81526020600482015260156024820152600080516020612672833981519152604482015290519081900360640190fd5b610c6960073363ffffffff611e9616565b610ca45760405162461bcd60e51b81526004018080602001828103825260218152602001806127706021913960400191505060405180910390fd5b6001600160a01b0383166000818152600b60205260408082208590555184929133917fb52d7c619ff55f3f330a200dfb412b8dae21bbabf8fecf8d1b6626e47560c8dc9190a4505050565b60055460ff1681565b60001981565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916109ac918590610d3a908663ffffffff6121c916565b611efd565b806001600160a01b038116610d89576040805162461bcd60e51b81526020600482015260156024820152600080516020612672833981519152604482015290519081900360640190fd5b610d9a60073363ffffffff611e9616565b610dd55760405162461bcd60e51b81526004018080602001828103825260218152602001806127706021913960400191505060405180910390fd5b6001600160a01b0382166000818152600b60205260408082208290555190919033907fb52d7c619ff55f3f330a200dfb412b8dae21bbabf8fecf8d1b6626e47560c8dc908490a45050565b6000918252600d6020908152604080842092845291905290205490565b610e4e60063363ffffffff611e9616565b610e895760405162461bcd60e51b81526004018080602001828103825260218152602001806126b46021913960400191505060405180910390fd5b600f805460ff19169055604080513381526000602082015281517f0d7fd1e314b29407db3d79c46ecf1fa3d2108961fab8d20584277358cac41e89929181900390910190a1565b816001600160a01b038116610f1a576040805162461bcd60e51b81526020600482015260156024820152600080516020612672833981519152604482015290519081900360640190fd5b610f2b60063363ffffffff611e9616565b610f665760405162461bcd60e51b81526004018080602001828103825260218152602001806126b46021913960400191505060405180910390fd5b600854610f7a610f74610aaf565b846121c9565b1115610fb75760405162461bcd60e51b815260040180806020018281038252602a815260200180612853602a913960400191505060405180910390fd5b610fc1838361222a565b505050565b6001600160a01b039182166000908152600c60208181526040808420548452600d825280842094909516835290815283822054825291909152205490565b806001600160a01b03811661104e576040805162461bcd60e51b81526020600482015260156024820152600080516020612672833981519152604482015290519081900360640190fd5b61105f60063363ffffffff611e9616565b61109a5760405162461bcd60e51b81526004018080602001828103825260218152602001806126b46021913960400191505060405180910390fd5b6110ab60078363ffffffff61231a16565b604080516020808252600d908201526c2a3930b739b332b920b236b4b760991b8183015290516001916001600160a01b0385169133916000805160206127b2833981519152919081900360600190a45050565b846001600160a01b038116611148576040805162461bcd60e51b81526020600482015260156024820152600080516020612672833981519152604482015290519081900360640190fd5b61115960073363ffffffff611e9616565b6111945760405162461bcd60e51b81526004018080602001828103825260218152602001806127706021913960400191505060405180910390fd5b61119e8686611427565b6111a88685610c0e565b6111b28684611703565b6111bc8683611a58565b505050505050565b806001600160a01b03811661120e576040805162461bcd60e51b81526020600482015260156024820152600080516020612672833981519152604482015290519081900360640190fd5b61121f60063363ffffffff611e9616565b61125a5760405162461bcd60e51b81526004018080602001828103825260218152602001806126b46021913960400191505060405180910390fd5b61126b60068363ffffffff61231a16565b60095461127f90600163ffffffff6121c916565b600955604080516020808252600d908201526c21b7b73a3930b1ba20b236b4b760991b8183015290516001916001600160a01b0385169133916000805160206127b2833981519152919081900360600190a45050565b806001600160a01b03811661131f576040805162461bcd60e51b81526020600482015260156024820152600080516020612672833981519152604482015290519081900360640190fd5b61133060063363ffffffff611e9616565b61136b5760405162461bcd60e51b81526004018080602001828103825260218152602001806126b46021913960400191505060405180910390fd5b6001600954116113ac5760405162461bcd60e51b81526004018080602001828103825260258152602001806126d56025913960400191505060405180910390fd5b6113bd60068363ffffffff611fe916565b6009546113d190600163ffffffff61239b16565b600955604080516020808252600d908201526c21b7b73a3930b1ba20b236b4b760991b8183015290516000916001600160a01b0385169133916000805160206127b2833981519152919081900360600190a45050565b816001600160a01b038116611471576040805162461bcd60e51b81526020600482015260156024820152600080516020612672833981519152604482015290519081900360640190fd5b61148260073363ffffffff611e9616565b6114bd5760405162461bcd60e51b81526004018080602001828103825260218152602001806127706021913960400191505060405180910390fd5b6001600160a01b0383166000818152600c60205260408082208590555184929133917ff213aa445739b8d5bb514c5e3142fe13baacfa991314172ceaf756996259b8b39190a4505050565b6001600160a01b031660009081526020819052604090205490565b60055460408051637f4ab1dd60e01b815260ff84166004820152905160609261010090046001600160a01b031691637f4ab1dd916024808301926000929190829003018186803b15801561157657600080fd5b505afa15801561158a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156115b357600080fd5b81019080805160405193929190846401000000008211156115d357600080fd5b9083019060208201858111156115e857600080fd5b825164010000000081118282018810171561160257600080fd5b82525081516020918201929091019080838360005b8381101561162f578181015183820152602001611617565b50505050905090810190601f16801561165c5780820380516001836020036101000a031916815260200191505b506040525050509050919050565b61167b60063363ffffffff611e9616565b6116b65760405162461bcd60e51b81526004018080602001828103825260218152602001806126b46021913960400191505060405180910390fd5b600f805460ff1916600190811790915560408051338152602081019290925280517f0d7fd1e314b29407db3d79c46ecf1fa3d2108961fab8d20584277358cac41e899281900390910190a1565b816001600160a01b03811661174d576040805162461bcd60e51b81526020600482015260156024820152600080516020612672833981519152604482015290519081900360640190fd5b61175e60073363ffffffff611e9616565b6117995760405162461bcd60e51b81526004018080602001828103825260218152602001806127706021913960400191505060405180910390fd5b6001600160a01b0383166000818152600a60205260408082208590555184929133917f0765aaf231b09368f07b83425559b145d7d386b1ff8f16c157a2ff2c7b9896fe9190a4505050565b60095481565b6003805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152929183018282801561097c5780601f106109515761010080835404028352916020019161097c565b60006108f060078363ffffffff611e9616565b816001600160a01b0381166118a2576040805162461bcd60e51b81526020600482015260156024820152600080516020612672833981519152604482015290519081900360640190fd5b6118b360063363ffffffff611e9616565b6118ee5760405162461bcd60e51b81526004018080602001828103825260218152602001806126b46021913960400191505060405180910390fd5b6118f783611508565b82111561194b576040805162461bcd60e51b815260206004820152601a60248201527f496e737566666963656e7420746f6b656e7320746f206275726e000000000000604482015290519081900360640190fd5b610fc183836123f8565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916109ac918590610d3a908663ffffffff61239b16565b6000826001600160a01b0381166119dd576040805162461bcd60e51b81526020600482015260156024820152600080516020612672833981519152604482015290519081900360640190fd5b6119e633611508565b831115611a2f576040805162461bcd60e51b8152602060048201526012602482015271496e737566666963656e7420746f6b656e7360701b604482015290519081900360640190fd5b611a3a338585612050565b611a4484846124d1565b506001949350505050565b600f5460ff1681565b816001600160a01b038116611aa2576040805162461bcd60e51b81526020600482015260156024820152600080516020612672833981519152604482015290519081900360640190fd5b611ab360063363ffffffff611e9616565b80611aca5750611aca60073363ffffffff611e9616565b611b055760405162461bcd60e51b81526004018080602001828103825260338152602001806126fa6033913960400191505060405180910390fd5b6001600160a01b0383166000818152600e6020526040808220805460ff1916861515908117909155905190929133917f17ec2643977f0865dd45350e9efdcdfead258c9220974e67d1a37ca1447722939190a4505050565b6001600160a01b03166000908152600a602052604090205490565b60055461010090046001600160a01b031681565b6005546040805163cfdb31a960e01b81523060048201526001600160a01b038681166024830152858116604483015260648201859052915160009361010090049092169163cfdb31a991608480820192602092909190829003018186803b158015611bf657600080fd5b505afa158015611c0a573d6000803e3d6000fd5b505050506040513d6020811015611c2057600080fd5b5051949350505050565b6001600160a01b03166000908152600c602052604090205490565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b611c8160063363ffffffff611e9616565b611cbc5760405162461bcd60e51b81526004018080602001828103825260218152602001806126b46021913960400191505060405180910390fd5b6001600160a01b038116611d05576040805162461bcd60e51b81526020600482015260156024820152600080516020612672833981519152604482015290519081900360640190fd5b600580546001600160a01b03838116610100818102610100600160a81b03198516179094556040805133815294909304919091166020840181905283830191909152905190917f8c78349fc44add47ae711ddc6e926b7845597c57473e587420693d8d0547845a919081900360600190a15050565b611d8b60073363ffffffff611e9616565b611dc65760405162461bcd60e51b81526004018080602001828103825260218152602001806127706021913960400191505060405180910390fd5b6000838152600d60209081526040808320858452825291829020839055815183815291518492869233927f5845e315015ee03f0d4ab1d198172b4f733609dc3de8b957ae1d86c8740301899281900390910190a4505050565b801580611e335750611e313383611c45565b155b611e6e5760405162461bcd60e51b815260040180806020018281038252603281526020018061261d6032913960400191505060405180910390fd5b610fc1828261099f565b6001600160a01b03166000908152600e602052604090205460ff1690565b60006001600160a01b038216611edd5760405162461bcd60e51b815260040180806020018281038252602281526020018061274e6022913960400191505060405180910390fd5b506001600160a01b03166000908152602091909152604090205460ff1690565b6001600160a01b038316611f425760405162461bcd60e51b81526004018080602001828103825260248152602001806127f76024913960400191505060405180910390fd5b6001600160a01b038216611f875760405162461bcd60e51b81526004018080602001828103825260228152602001806126926022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b611ff38282611e96565b61202e5760405162461bcd60e51b815260040180806020018281038252602181526020018061272d6021913960400191505060405180910390fd5b6001600160a01b0316600090815260209190915260409020805460ff19169055565b600061205d848484611b8c565b60055460408051637d8e7d1b60e01b815260ff8416600482015290519293506101009091046001600160a01b031691637d8e7d1b91602480820192602092909190829003018186803b1580156120b257600080fd5b505afa1580156120c6573d6000803e3d6000fd5b505050506040513d60208110156120dc57600080fd5b50516120e782611523565b906121705760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561213557818101518382015260200161211d565b50505050905090810190601f1680156121625780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5050505050565b60006121848484846124da565b6001600160a01b0384166000908152600160209081526040808320338085529252909120546121bf918691610d3a908663ffffffff61239b16565b5060019392505050565b600082820183811015612223576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6001600160a01b038216612285576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b600254612298908263ffffffff6121c916565b6002556001600160a01b0382166000908152602081905260409020546122c4908263ffffffff6121c916565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6123248282611e96565b15612376576040805162461bcd60e51b815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500604482015290519081900360640190fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b6000828211156123f2576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b6001600160a01b03821661243d5760405162461bcd60e51b81526004018080602001828103825260218152602001806127916021913960400191505060405180910390fd5b600254612450908263ffffffff61239b16565b6002556001600160a01b03821660009081526020819052604090205461247c908263ffffffff61239b16565b6001600160a01b038316600081815260208181526040808320949094558351858152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a35050565b60006109ac3384845b6001600160a01b03831661251f5760405162461bcd60e51b81526004018080602001828103825260258152602001806127d26025913960400191505060405180910390fd5b6001600160a01b0382166125645760405162461bcd60e51b815260040180806020018281038252602381526020018061264f6023913960400191505060405180910390fd5b6001600160a01b03831660009081526020819052604090205461258d908263ffffffff61239b16565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546125c2908263ffffffff6121c916565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a350505056fe43616e6e6f7420617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e636545524332303a207472616e7366657220746f20746865207a65726f2061646472657373416464726573732063616e6e6f7420626520307830000000000000000000000045524332303a20617070726f766520746f20746865207a65726f2061646472657373444f4553204e4f54204841564520434f4e5452414354204f574e455220524f4c454d7573742068617665206174206c65617374206f6e6520636f6e74726163742061646d696e444f4553204e4f542048415645205452414e534645522041444d494e204f5220434f4e54524143542041444d494e20524f4c45526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c65526f6c65733a206163636f756e7420697320746865207a65726f2061646472657373444f4553204e4f542048415645205452414e534645522041444d494e20524f4c4545524332303a206275726e2066726f6d20746865207a65726f2061646472657373b8d6abb0a3f68d78d33d9d0a174f38ab8806c36318ade20e0eff6b585c8d413b45524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737354686520617070726f76656420616c6c6f77616e6365206973206c6f776572207468616e20746865207472616e7366657220616d6f756e7443616e6e6f74206d696e74206d6f7265207468616e20746865206d617820746f74616c20737570706c79a265627a7a72315820ccfbc6e4dd4827747e21570ea618016582b01d4b9bb253a408ff0135733064a964736f6c634300050c0032546f6b656e206f776e657220616464726573732063616e6e6f7420626520307830546f6b656e20726573657276652061646d696e20616464726573732063616e6e6f74206265203078305472616e736665722072756c657320616464726573732063616e6e6f7420626520307830526f6c65733a206163636f756e7420697320746865207a65726f20616464726573730000000000000000000000005b097a5f2d5579912494dbbeef8c0c1c8e1fe170000000000000000000000000fb87c53b7770b451a5f193fe9e954d87d2872855000000000000000000000000a153dd6e4725c94066a7aa3425a3a737cfaf7c1200000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000052b7d2dcc80cd2e400000000000000000000000000000000000000000000000052b7d2dcc80cd2e4000000000000000000000000000000000000000000000000000000000000000000000758595a546573740000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000155265737472696374656420546f6b656e20546573740000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102695760003560e01c806364ca0ac311610151578063b187bd26116100c3578063db74fa3611610087578063db74fa36146107e8578063dd62ed3e1461080e578063dfb7300e1461083c578063e98a0c6414610862578063fbc6d1cb1461088b578063fc96f7d8146108b757610269565b8063b187bd2614610732578063bf120ae51461073a578063c63aa52114610768578063ceca46c21461078e578063d4ce1415146107b257610269565b80638e64eac5116101155780638e64eac51461067857806395d89b411461068057806395ed620a146106885780639dc29fac146106ae578063a457c2d7146106da578063a9059cbb1461070657610269565b806364ca0ac3146105d257806370a08231146105fe5780637f4ab1dd146106245780638456cb59146106445780638d56cc9c1461064c57610269565b806333a581d2116101ea57806340c10f19116101ae57806340c10f19146104c657806340dc95c5146104f257806343c8fc6f1461052057806345d11299146105465780634723778c14610586578063587c9571146105ac57610269565b806333a581d21461044157806339509351146104495780633b1f927f146104755780633c637d741461049b5780633f4ba83a146104be57610269565b806318160ddd1161023157806318160ddd146103b157806323b872dd146103b95780632ab4d052146103ef57806330e15818146103f7578063313ce5671461042357610269565b8063025cb46b1461026e57806306fdde03146102a8578063079ade0114610325578063095ea7b31461035d5780631309d2e514610389575b600080fd5b6102946004803603602081101561028457600080fd5b50356001600160a01b03166108dd565b604080519115158252519081900360200190f35b6102b06108f6565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102ea5781810151838201526020016102d2565b50505050905090810190601f1680156103175780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61034b6004803603602081101561033b57600080fd5b50356001600160a01b0316610984565b60408051918252519081900360200190f35b6102946004803603604081101561037357600080fd5b506001600160a01b03813516906020013561099f565b6103af6004803603602081101561039f57600080fd5b50356001600160a01b03166109b5565b005b61034b610aaf565b610294600480360360608110156103cf57600080fd5b506001600160a01b03813581169160208101359091169060400135610ab5565b61034b610c08565b6103af6004803603604081101561040d57600080fd5b506001600160a01b038135169060200135610c0e565b61042b610cef565b6040805160ff9092168252519081900360200190f35b61034b610cf8565b6102946004803603604081101561045f57600080fd5b506001600160a01b038135169060200135610cfe565b6103af6004803603602081101561048b57600080fd5b50356001600160a01b0316610d3f565b61034b600480360360408110156104b157600080fd5b5080359060200135610e20565b6103af610e3d565b6103af600480360360408110156104dc57600080fd5b506001600160a01b038135169060200135610ed0565b61034b6004803603604081101561050857600080fd5b506001600160a01b0381358116916020013516610fc6565b6103af6004803603602081101561053657600080fd5b50356001600160a01b0316611004565b6103af600480360360a081101561055c57600080fd5b506001600160a01b03813516906020810135906040810135906060810135906080013515156110fe565b6103af6004803603602081101561059c57600080fd5b50356001600160a01b03166111c4565b6103af600480360360208110156105c257600080fd5b50356001600160a01b03166112d5565b6103af600480360360408110156105e857600080fd5b506001600160a01b038135169060200135611427565b61034b6004803603602081101561061457600080fd5b50356001600160a01b0316611508565b6102b06004803603602081101561063a57600080fd5b503560ff16611523565b6103af61166a565b6103af6004803603604081101561066257600080fd5b506001600160a01b038135169060200135611703565b61034b6117e4565b6102b06117ea565b6102946004803603602081101561069e57600080fd5b50356001600160a01b0316611845565b6103af600480360360408110156106c457600080fd5b506001600160a01b038135169060200135611858565b610294600480360360408110156106f057600080fd5b506001600160a01b038135169060200135611955565b6102946004803603604081101561071c57600080fd5b506001600160a01b038135169060200135611991565b610294611a4f565b6103af6004803603604081101561075057600080fd5b506001600160a01b0381351690602001351515611a58565b61034b6004803603602081101561077e57600080fd5b50356001600160a01b0316611b5d565b610796611b78565b604080516001600160a01b039092168252519081900360200190f35b61042b600480360360608110156107c857600080fd5b506001600160a01b03813581169160208101359091169060400135611b8c565b61034b600480360360208110156107fe57600080fd5b50356001600160a01b0316611c2a565b61034b6004803603604081101561082457600080fd5b506001600160a01b0381358116916020013516611c45565b6103af6004803603602081101561085257600080fd5b50356001600160a01b0316611c70565b6103af6004803603606081101561087857600080fd5b5080359060208101359060400135611d7a565b6103af600480360360408110156108a157600080fd5b506001600160a01b038135169060200135611e1f565b610294600480360360208110156108cd57600080fd5b50356001600160a01b0316611e78565b60006108f060068363ffffffff611e9616565b92915050565b6004805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152929183018282801561097c5780601f106109515761010080835404028352916020019161097c565b820191906000526020600020905b81548152906001019060200180831161095f57829003601f168201915b505050505081565b6001600160a01b03166000908152600b602052604090205490565b60006109ac338484611efd565b50600192915050565b806001600160a01b0381166109ff576040805162461bcd60e51b81526020600482015260156024820152600080516020612672833981519152604482015290519081900360640190fd5b610a1060063363ffffffff611e9616565b610a4b5760405162461bcd60e51b81526004018080602001828103825260218152602001806126b46021913960400191505060405180910390fd5b610a5c60078363ffffffff611fe916565b604080516020808252600d908201526c2a3930b739b332b920b236b4b760991b8183015290516000916001600160a01b0385169133916000805160206127b2833981519152919081900360600190a45050565b60025490565b6000836001600160a01b038116610b01576040805162461bcd60e51b81526020600482015260156024820152600080516020612672833981519152604482015290519081900360640190fd5b836001600160a01b038116610b4b576040805162461bcd60e51b81526020600482015260156024820152600080516020612672833981519152604482015290519081900360640190fd5b610b558686611c45565b841115610b935760405162461bcd60e51b815260040180806020018281038252603881526020018061281b6038913960400191505060405180910390fd5b610b9c86611508565b841115610be5576040805162461bcd60e51b8152602060048201526012602482015271496e737566666963656e7420746f6b656e7360701b604482015290519081900360640190fd5b610bf0868686612050565b610bfb868686612177565b5060019695505050505050565b60085481565b816001600160a01b038116610c58576040805162461bcd60e51b81526020600482015260156024820152600080516020612672833981519152604482015290519081900360640190fd5b610c6960073363ffffffff611e9616565b610ca45760405162461bcd60e51b81526004018080602001828103825260218152602001806127706021913960400191505060405180910390fd5b6001600160a01b0383166000818152600b60205260408082208590555184929133917fb52d7c619ff55f3f330a200dfb412b8dae21bbabf8fecf8d1b6626e47560c8dc9190a4505050565b60055460ff1681565b60001981565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916109ac918590610d3a908663ffffffff6121c916565b611efd565b806001600160a01b038116610d89576040805162461bcd60e51b81526020600482015260156024820152600080516020612672833981519152604482015290519081900360640190fd5b610d9a60073363ffffffff611e9616565b610dd55760405162461bcd60e51b81526004018080602001828103825260218152602001806127706021913960400191505060405180910390fd5b6001600160a01b0382166000818152600b60205260408082208290555190919033907fb52d7c619ff55f3f330a200dfb412b8dae21bbabf8fecf8d1b6626e47560c8dc908490a45050565b6000918252600d6020908152604080842092845291905290205490565b610e4e60063363ffffffff611e9616565b610e895760405162461bcd60e51b81526004018080602001828103825260218152602001806126b46021913960400191505060405180910390fd5b600f805460ff19169055604080513381526000602082015281517f0d7fd1e314b29407db3d79c46ecf1fa3d2108961fab8d20584277358cac41e89929181900390910190a1565b816001600160a01b038116610f1a576040805162461bcd60e51b81526020600482015260156024820152600080516020612672833981519152604482015290519081900360640190fd5b610f2b60063363ffffffff611e9616565b610f665760405162461bcd60e51b81526004018080602001828103825260218152602001806126b46021913960400191505060405180910390fd5b600854610f7a610f74610aaf565b846121c9565b1115610fb75760405162461bcd60e51b815260040180806020018281038252602a815260200180612853602a913960400191505060405180910390fd5b610fc1838361222a565b505050565b6001600160a01b039182166000908152600c60208181526040808420548452600d825280842094909516835290815283822054825291909152205490565b806001600160a01b03811661104e576040805162461bcd60e51b81526020600482015260156024820152600080516020612672833981519152604482015290519081900360640190fd5b61105f60063363ffffffff611e9616565b61109a5760405162461bcd60e51b81526004018080602001828103825260218152602001806126b46021913960400191505060405180910390fd5b6110ab60078363ffffffff61231a16565b604080516020808252600d908201526c2a3930b739b332b920b236b4b760991b8183015290516001916001600160a01b0385169133916000805160206127b2833981519152919081900360600190a45050565b846001600160a01b038116611148576040805162461bcd60e51b81526020600482015260156024820152600080516020612672833981519152604482015290519081900360640190fd5b61115960073363ffffffff611e9616565b6111945760405162461bcd60e51b81526004018080602001828103825260218152602001806127706021913960400191505060405180910390fd5b61119e8686611427565b6111a88685610c0e565b6111b28684611703565b6111bc8683611a58565b505050505050565b806001600160a01b03811661120e576040805162461bcd60e51b81526020600482015260156024820152600080516020612672833981519152604482015290519081900360640190fd5b61121f60063363ffffffff611e9616565b61125a5760405162461bcd60e51b81526004018080602001828103825260218152602001806126b46021913960400191505060405180910390fd5b61126b60068363ffffffff61231a16565b60095461127f90600163ffffffff6121c916565b600955604080516020808252600d908201526c21b7b73a3930b1ba20b236b4b760991b8183015290516001916001600160a01b0385169133916000805160206127b2833981519152919081900360600190a45050565b806001600160a01b03811661131f576040805162461bcd60e51b81526020600482015260156024820152600080516020612672833981519152604482015290519081900360640190fd5b61133060063363ffffffff611e9616565b61136b5760405162461bcd60e51b81526004018080602001828103825260218152602001806126b46021913960400191505060405180910390fd5b6001600954116113ac5760405162461bcd60e51b81526004018080602001828103825260258152602001806126d56025913960400191505060405180910390fd5b6113bd60068363ffffffff611fe916565b6009546113d190600163ffffffff61239b16565b600955604080516020808252600d908201526c21b7b73a3930b1ba20b236b4b760991b8183015290516000916001600160a01b0385169133916000805160206127b2833981519152919081900360600190a45050565b816001600160a01b038116611471576040805162461bcd60e51b81526020600482015260156024820152600080516020612672833981519152604482015290519081900360640190fd5b61148260073363ffffffff611e9616565b6114bd5760405162461bcd60e51b81526004018080602001828103825260218152602001806127706021913960400191505060405180910390fd5b6001600160a01b0383166000818152600c60205260408082208590555184929133917ff213aa445739b8d5bb514c5e3142fe13baacfa991314172ceaf756996259b8b39190a4505050565b6001600160a01b031660009081526020819052604090205490565b60055460408051637f4ab1dd60e01b815260ff84166004820152905160609261010090046001600160a01b031691637f4ab1dd916024808301926000929190829003018186803b15801561157657600080fd5b505afa15801561158a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405260208110156115b357600080fd5b81019080805160405193929190846401000000008211156115d357600080fd5b9083019060208201858111156115e857600080fd5b825164010000000081118282018810171561160257600080fd5b82525081516020918201929091019080838360005b8381101561162f578181015183820152602001611617565b50505050905090810190601f16801561165c5780820380516001836020036101000a031916815260200191505b506040525050509050919050565b61167b60063363ffffffff611e9616565b6116b65760405162461bcd60e51b81526004018080602001828103825260218152602001806126b46021913960400191505060405180910390fd5b600f805460ff1916600190811790915560408051338152602081019290925280517f0d7fd1e314b29407db3d79c46ecf1fa3d2108961fab8d20584277358cac41e899281900390910190a1565b816001600160a01b03811661174d576040805162461bcd60e51b81526020600482015260156024820152600080516020612672833981519152604482015290519081900360640190fd5b61175e60073363ffffffff611e9616565b6117995760405162461bcd60e51b81526004018080602001828103825260218152602001806127706021913960400191505060405180910390fd5b6001600160a01b0383166000818152600a60205260408082208590555184929133917f0765aaf231b09368f07b83425559b145d7d386b1ff8f16c157a2ff2c7b9896fe9190a4505050565b60095481565b6003805460408051602060026001851615610100026000190190941693909304601f8101849004840282018401909252818152929183018282801561097c5780601f106109515761010080835404028352916020019161097c565b60006108f060078363ffffffff611e9616565b816001600160a01b0381166118a2576040805162461bcd60e51b81526020600482015260156024820152600080516020612672833981519152604482015290519081900360640190fd5b6118b360063363ffffffff611e9616565b6118ee5760405162461bcd60e51b81526004018080602001828103825260218152602001806126b46021913960400191505060405180910390fd5b6118f783611508565b82111561194b576040805162461bcd60e51b815260206004820152601a60248201527f496e737566666963656e7420746f6b656e7320746f206275726e000000000000604482015290519081900360640190fd5b610fc183836123f8565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916109ac918590610d3a908663ffffffff61239b16565b6000826001600160a01b0381166119dd576040805162461bcd60e51b81526020600482015260156024820152600080516020612672833981519152604482015290519081900360640190fd5b6119e633611508565b831115611a2f576040805162461bcd60e51b8152602060048201526012602482015271496e737566666963656e7420746f6b656e7360701b604482015290519081900360640190fd5b611a3a338585612050565b611a4484846124d1565b506001949350505050565b600f5460ff1681565b816001600160a01b038116611aa2576040805162461bcd60e51b81526020600482015260156024820152600080516020612672833981519152604482015290519081900360640190fd5b611ab360063363ffffffff611e9616565b80611aca5750611aca60073363ffffffff611e9616565b611b055760405162461bcd60e51b81526004018080602001828103825260338152602001806126fa6033913960400191505060405180910390fd5b6001600160a01b0383166000818152600e6020526040808220805460ff1916861515908117909155905190929133917f17ec2643977f0865dd45350e9efdcdfead258c9220974e67d1a37ca1447722939190a4505050565b6001600160a01b03166000908152600a602052604090205490565b60055461010090046001600160a01b031681565b6005546040805163cfdb31a960e01b81523060048201526001600160a01b038681166024830152858116604483015260648201859052915160009361010090049092169163cfdb31a991608480820192602092909190829003018186803b158015611bf657600080fd5b505afa158015611c0a573d6000803e3d6000fd5b505050506040513d6020811015611c2057600080fd5b5051949350505050565b6001600160a01b03166000908152600c602052604090205490565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b611c8160063363ffffffff611e9616565b611cbc5760405162461bcd60e51b81526004018080602001828103825260218152602001806126b46021913960400191505060405180910390fd5b6001600160a01b038116611d05576040805162461bcd60e51b81526020600482015260156024820152600080516020612672833981519152604482015290519081900360640190fd5b600580546001600160a01b03838116610100818102610100600160a81b03198516179094556040805133815294909304919091166020840181905283830191909152905190917f8c78349fc44add47ae711ddc6e926b7845597c57473e587420693d8d0547845a919081900360600190a15050565b611d8b60073363ffffffff611e9616565b611dc65760405162461bcd60e51b81526004018080602001828103825260218152602001806127706021913960400191505060405180910390fd5b6000838152600d60209081526040808320858452825291829020839055815183815291518492869233927f5845e315015ee03f0d4ab1d198172b4f733609dc3de8b957ae1d86c8740301899281900390910190a4505050565b801580611e335750611e313383611c45565b155b611e6e5760405162461bcd60e51b815260040180806020018281038252603281526020018061261d6032913960400191505060405180910390fd5b610fc1828261099f565b6001600160a01b03166000908152600e602052604090205460ff1690565b60006001600160a01b038216611edd5760405162461bcd60e51b815260040180806020018281038252602281526020018061274e6022913960400191505060405180910390fd5b506001600160a01b03166000908152602091909152604090205460ff1690565b6001600160a01b038316611f425760405162461bcd60e51b81526004018080602001828103825260248152602001806127f76024913960400191505060405180910390fd5b6001600160a01b038216611f875760405162461bcd60e51b81526004018080602001828103825260228152602001806126926022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b611ff38282611e96565b61202e5760405162461bcd60e51b815260040180806020018281038252602181526020018061272d6021913960400191505060405180910390fd5b6001600160a01b0316600090815260209190915260409020805460ff19169055565b600061205d848484611b8c565b60055460408051637d8e7d1b60e01b815260ff8416600482015290519293506101009091046001600160a01b031691637d8e7d1b91602480820192602092909190829003018186803b1580156120b257600080fd5b505afa1580156120c6573d6000803e3d6000fd5b505050506040513d60208110156120dc57600080fd5b50516120e782611523565b906121705760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561213557818101518382015260200161211d565b50505050905090810190601f1680156121625780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5050505050565b60006121848484846124da565b6001600160a01b0384166000908152600160209081526040808320338085529252909120546121bf918691610d3a908663ffffffff61239b16565b5060019392505050565b600082820183811015612223576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6001600160a01b038216612285576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b600254612298908263ffffffff6121c916565b6002556001600160a01b0382166000908152602081905260409020546122c4908263ffffffff6121c916565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6123248282611e96565b15612376576040805162461bcd60e51b815260206004820152601f60248201527f526f6c65733a206163636f756e7420616c72656164792068617320726f6c6500604482015290519081900360640190fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b6000828211156123f2576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b6001600160a01b03821661243d5760405162461bcd60e51b81526004018080602001828103825260218152602001806127916021913960400191505060405180910390fd5b600254612450908263ffffffff61239b16565b6002556001600160a01b03821660009081526020819052604090205461247c908263ffffffff61239b16565b6001600160a01b038316600081815260208181526040808320949094558351858152935191937fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef929081900390910190a35050565b60006109ac3384845b6001600160a01b03831661251f5760405162461bcd60e51b81526004018080602001828103825260258152602001806127d26025913960400191505060405180910390fd5b6001600160a01b0382166125645760405162461bcd60e51b815260040180806020018281038252602381526020018061264f6023913960400191505060405180910390fd5b6001600160a01b03831660009081526020819052604090205461258d908263ffffffff61239b16565b6001600160a01b0380851660009081526020819052604080822093909355908416815220546125c2908263ffffffff6121c916565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a350505056fe43616e6e6f7420617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e636545524332303a207472616e7366657220746f20746865207a65726f2061646472657373416464726573732063616e6e6f7420626520307830000000000000000000000045524332303a20617070726f766520746f20746865207a65726f2061646472657373444f4553204e4f54204841564520434f4e5452414354204f574e455220524f4c454d7573742068617665206174206c65617374206f6e6520636f6e74726163742061646d696e444f4553204e4f542048415645205452414e534645522041444d494e204f5220434f4e54524143542041444d494e20524f4c45526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c65526f6c65733a206163636f756e7420697320746865207a65726f2061646472657373444f4553204e4f542048415645205452414e534645522041444d494e20524f4c4545524332303a206275726e2066726f6d20746865207a65726f2061646472657373b8d6abb0a3f68d78d33d9d0a174f38ab8806c36318ade20e0eff6b585c8d413b45524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737354686520617070726f76656420616c6c6f77616e6365206973206c6f776572207468616e20746865207472616e7366657220616d6f756e7443616e6e6f74206d696e74206d6f7265207468616e20746865206d617820746f74616c20737570706c79a265627a7a72315820ccfbc6e4dd4827747e21570ea618016582b01d4b9bb253a408ff0135733064a964736f6c634300050c0032

Deployed Bytecode Sourcemap

16913:17347:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16913:17347:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22787:129;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22787:129:0;-1:-1:-1;;;;;22787:129:0;;:::i;:::-;;;;;;;;;;;;;;;;;;17010:18;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;17010:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26543:113;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26543:113:0;-1:-1:-1;;;;;26543:113:0;;:::i;:::-;;;;;;;;;;;;;;;;11171:148;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;11171:148:0;;;;;;;;:::i;20907:195::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20907:195:0;-1:-1:-1;;;;;20907:195:0;;:::i;:::-;;10194:91;;;:::i;33389:411::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;33389:411:0;;;;;;;;;;;;;;;;;:::i;17212:29::-;;;:::i;25637:197::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;25637:197:0;;;;;;;;:::i;17033:21::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;17980:62;;;:::i;12455:206::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;12455:206:0;;;;;;;;:::i;26094:166::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;26094:166:0;-1:-1:-1;;;;;26094:166:0;;:::i;31038:143::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31038:143:0;;;;;;;:::i;32376:113::-;;;:::i;31908:229::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;31908:229:0;;;;;;;;:::i;30457:178::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;30457:178:0;;;;;;;;;;:::i;20577:189::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;20577:189:0;-1:-1:-1;;;;;20577:189:0;;:::i;28855:316::-;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;;;;;;28855:316:0;;;;;;;;;;;;;;;;;;;;;;;;;:::i;21727:242::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21727:242:0;-1:-1:-1;;;;;21727:242:0;;:::i;22213:326::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;22213:326:0;-1:-1:-1;;;;;22213:326:0;;:::i;26869:204::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;26869:204:0;;;;;;;;:::i;10348:110::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;10348:110:0;-1:-1:-1;;;;;10348:110:0;;:::i;24426:177::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24426:177:0;;;;:::i;32201:109::-;;;:::i;24858:210::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;24858:210:0;;;;;;;;:::i;17246:33::-;;;:::i;16985:20::-;;;:::i;21350:129::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;21350:129:0;-1:-1:-1;;;;;21350:129:0;;:::i;31445:190::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;31445:190:0;;;;;;;;:::i;13164:216::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;13164:216:0;;;;;;;;:::i;33111:272::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;33111:272:0;;;;;;;;:::i;17945:28::-;;;:::i;27668:198::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;27668:198:0;;;;;;;;;;:::i;25207:106::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;25207:106:0;-1:-1:-1;;;;;25207:106:0;;:::i;17059:35::-;;;:::i;:::-;;;;-1:-1:-1;;;;;17059:35:0;;;;;;;;;;;;;;24048:194;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;24048:194:0;;;;;;;;;;;;;;;;;:::i;27256:120::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;27256:120:0;-1:-1:-1;;;;;27256:120:0;;:::i;10890:134::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;10890:134:0;;;;;;;;;;:::i;32772:333::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32772:333:0;-1:-1:-1;;;;;32772:333:0;;:::i;29826:227::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29826:227:0;;;;;;;;;;;;:::i;33806:451::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;;;;;;33806:451:0;;;;;;;;:::i;28066:116::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;28066:116:0;-1:-1:-1;;;;;28066:116:0;;:::i;22787:129::-;22851:18;22885:25;:15;22905:4;22885:25;:19;:25;:::i;:::-;22878:32;22787:129;-1:-1:-1;;22787:129:0:o;17010:18::-;;;;;;;;;;;;;;;-1:-1:-1;;17010:18:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;26543:113::-;-1:-1:-1;;;;;26634:16:0;26601:17;26634:16;;;:10;:16;;;;;;;26543:113::o;11171:148::-;11236:4;11253:36;11262:10;11274:7;11283:5;11253:8;:36::i;:::-;-1:-1:-1;11307:4:0;11171:148;;;;:::o;20907:195::-;20972:4;-1:-1:-1;;;;;20371:18:0;;20363:52;;;;;-1:-1:-1;;;20363:52:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20363:52:0;;;;;;;;;;;;;;;19889:31;:15;19909:10;19889:31;:19;:31;:::i;:::-;19881:77;;;;-1:-1:-1;;;19881:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21004:28;:15;21027:4;21004:28;:22;:28;:::i;:::-;21044:52;;;;;;;;;;;;-1:-1:-1;;;21044:52:0;;;;;;21090:5;;-1:-1:-1;;;;;21044:52:0;;;21055:10;;-1:-1:-1;;;;;;;;;;;21044:52:0;;;;;;;;;20907:195;;:::o;10194:91::-;10265:12;;10194:91;:::o;33389:411::-;33503:12;33472:4;-1:-1:-1;;;;;20371:18:0;;20363:52;;;;;-1:-1:-1;;;20363:52:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20363:52:0;;;;;;;;;;;;;;;33491:2;-1:-1:-1;;;;;20371:18:0;;20363:52;;;;;-1:-1:-1;;;20363:52:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20363:52:0;;;;;;;;;;;;;;;33541:19;33551:4;33557:2;33541:9;:19::i;:::-;33532:5;:28;;33524:97;;;;-1:-1:-1;;;33524:97:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33645:15;33655:4;33645:9;:15::i;:::-;33636:5;:24;;33628:55;;;;;-1:-1:-1;;;33628:55:0;;;;;;;;;;;;-1:-1:-1;;;33628:55:0;;;;;;;;;;;;;;;33690:44;33718:4;33724:2;33728:5;33690:27;:44::i;:::-;33741:35;33760:4;33766:2;33770:5;33741:18;:35::i;:::-;-1:-1:-1;33790:4:0;;33389:411;-1:-1:-1;;;;;;33389:411:0:o;17212:29::-;;;;:::o;25637:197::-;25712:4;-1:-1:-1;;;;;20371:18:0;;20363:52;;;;;-1:-1:-1;;;20363:52:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20363:52:0;;;;;;;;;;;;;;;20023:31;:15;20043:10;20023:31;:19;:31;:::i;:::-;20015:77;;;;-1:-1:-1;;;20015:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25744:16:0;;;;;;:10;:16;;;;;;:28;;;25784:44;25763:9;;25744:16;25800:10;;25784:44;;25744:16;25784:44;25637:197;;;:::o;17033:21::-;;;;;;:::o;17980:62::-;-1:-1:-1;;17980:62:0;:::o;12455:206::-;12561:10;12535:4;12582:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;12582:32:0;;;;;;;;;;12535:4;;12552:79;;12573:7;;12582:48;;12619:10;12582:48;:36;:48;:::i;:::-;12552:8;:79::i;26094:166::-;26155:4;-1:-1:-1;;;;;20371:18:0;;20363:52;;;;;-1:-1:-1;;;20363:52:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20363:52:0;;;;;;;;;;;;;;;20023:31;:15;20043:10;20023:31;:19;:31;:::i;:::-;20015:77;;;;-1:-1:-1;;;20015:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26186:16:0;;26205:1;26186:16;;;:10;:16;;;;;;:20;;;26218:36;26205:1;;26186:16;26234:10;;26218:36;;26205:1;;26218:36;26094:166;;:::o;31038:143::-;31115:14;31145:26;;;:20;:26;;;;;;;;:30;;;;;;;;;;31038:143::o;32376:113::-;19889:31;:15;19909:10;19889:31;:19;:31;:::i;:::-;19881:77;;;;-1:-1:-1;;;19881:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32431:8;:16;;-1:-1:-1;;32431:16:0;;;32459:24;;;32465:10;32459:24;;32442:5;32459:24;;;;;;;;;;;;;;;;;32376:113::o;31908:229::-;31971:2;-1:-1:-1;;;;;20371:18:0;;20363:52;;;;;-1:-1:-1;;;20363:52:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20363:52:0;;;;;;;;;;;;;;;19889:31;:15;19909:10;19889:31;:19;:31;:::i;:::-;19881:77;;;;-1:-1:-1;;;19881:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32047:14;;32009:34;32022:13;:11;:13::i;:::-;32037:5;32009:12;:34::i;:::-;:52;;32001:107;;;;-1:-1:-1;;;32001:107:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32115:16;32121:2;32125:5;32115;:16::i;:::-;31908:229;;;:::o;30457:178::-;-1:-1:-1;;;;;30586:21:0;;;30535:14;30586:21;;;:15;:21;;;;;;;;;30565:43;;:20;:43;;;;;30609:19;;;;;;;;;;;;;30565:64;;;;;;;;;30457:178::o;20577:189::-;20641:4;-1:-1:-1;;;;;20371:18:0;;20363:52;;;;;-1:-1:-1;;;20363:52:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20363:52:0;;;;;;;;;;;;;;;19889:31;:15;19909:10;19889:31;:19;:31;:::i;:::-;19881:77;;;;-1:-1:-1;;;19881:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20672:25;:15;20692:4;20672:25;:19;:25;:::i;:::-;20709:51;;;;;;;;;;;;-1:-1:-1;;;20709:51:0;;;;;;20755:4;;-1:-1:-1;;;;;20709:51:0;;;20720:10;;-1:-1:-1;;;;;;;;;;;20709:51:0;;;;;;;;;20577:189;;:::o;28855:316::-;28998:4;-1:-1:-1;;;;;20371:18:0;;20363:52;;;;;-1:-1:-1;;;20363:52:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20363:52:0;;;;;;;;;;;;;;;20023:31;:15;20043:10;20023:31;:19;:31;:::i;:::-;20015:77;;;;-1:-1:-1;;;20015:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29029:31;29046:4;29052:7;29029:16;:31::i;:::-;29067:33;29080:4;29086:13;29067:12;:33::i;:::-;29107:31;29121:4;29127:10;29107:13;:31::i;:::-;29145:20;29152:4;29158:6;29145;:20::i;:::-;28855:316;;;;;;:::o;21727:242::-;21791:4;-1:-1:-1;;;;;20371:18:0;;20363:52;;;;;-1:-1:-1;;;20363:52:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20363:52:0;;;;;;;;;;;;;;;19889:31;:15;19909:10;19889:31;:19;:31;:::i;:::-;19881:77;;;;-1:-1:-1;;;19881:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21822:25;:15;21842:4;21822:25;:19;:25;:::i;:::-;21875:18;;:25;;21898:1;21875:25;:22;:25;:::i;:::-;21854:18;:46;21912:51;;;;;;;;;;;;-1:-1:-1;;;21912:51:0;;;;;;21958:4;;-1:-1:-1;;;;;21912:51:0;;;21923:10;;-1:-1:-1;;;;;;;;;;;21912:51:0;;;;;;;;;21727:242;;:::o;22213:326::-;22278:4;-1:-1:-1;;;;;20371:18:0;;20363:52;;;;;-1:-1:-1;;;20363:52:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20363:52:0;;;;;;;;;;;;;;;19889:31;:15;19909:10;19889:31;:19;:31;:::i;:::-;19881:77;;;;-1:-1:-1;;;19881:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22338:1;22317:18;;:22;22309:72;;;;-1:-1:-1;;;22309:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22388:28;:15;22411:4;22388:28;:22;:28;:::i;:::-;22444:18;;:25;;22467:1;22444:25;:22;:25;:::i;:::-;22423:18;:46;22481:52;;;;;;;;;;;;-1:-1:-1;;;22481:52:0;;;;;;22527:5;;-1:-1:-1;;;;;22481:52:0;;;22492:10;;-1:-1:-1;;;;;;;;;;;22481:52:0;;;;;;;;;22213:326;;:::o;26869:204::-;26946:4;-1:-1:-1;;;;;20371:18:0;;20363:52;;;;;-1:-1:-1;;;20363:52:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20363:52:0;;;;;;;;;;;;;;;20023:31;:15;20043:10;20023:31;:19;:31;:::i;:::-;20015:77;;;;-1:-1:-1;;;20015:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26977:21:0;;;;;;:15;:21;;;;;;:31;;;27020:47;27001:7;;26977:21;27041:10;;27020:47;;26977:21;27020:47;26869:204;;;:::o;10348:110::-;-1:-1:-1;;;;;10432:18:0;10405:7;10432:18;;;;;;;;;;;;10348:110::o;24426:177::-;24537:13;;:60;;;-1:-1:-1;;;24537:60:0;;;;;;;;;;;24508:13;;24537;;;-1:-1:-1;;;;;24537:13:0;;:43;;:60;;;;;-1:-1:-1;;24537:60:0;;;;;;;:13;:60;;;5:2:-1;;;;30:1;27;20:12;5:2;24537:60:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24537:60:0;;;;;;39:16:-1;36:1;17:17;2:54;101:4;24537:60:0;80:15:-1;;;-1:-1;;76:31;65:43;;120:4;113:20;13:2;5:11;;2:2;;;29:1;26;19:12;2:2;24537:60:0;;;;;;;;;;;;;19:11:-1;14:3;11:20;8:2;;;44:1;41;34:12;8:2;62:21;;;;123:4;114:14;;138:31;;;135:2;;;182:1;179;172:12;135:2;213:10;;261:11;244:29;;285:43;;;282:58;-1:-1;233:115;230:2;;;361:1;358;351:12;230:2;372:25;;-1:-1;24537:60:0;;420:4:-1;411:14;;;;24537:60:0;;;;;411:14:-1;24537:60:0;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;24537:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24530:67;;24426:177;;;:::o;32201:109::-;19889:31;:15;19909:10;19889:31;:19;:31;:::i;:::-;19881:77;;;;-1:-1:-1;;;19881:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32254:8;:15;;-1:-1:-1;;32254:15:0;32265:4;32254:15;;;;;;32281:23;;;32287:10;32281:23;;;;;;;;;;;;;;;;;;;;;32201:109::o;24858:210::-;24937:4;-1:-1:-1;;;;;20371:18:0;;20363:52;;;;;-1:-1:-1;;;20363:52:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20363:52:0;;;;;;;;;;;;;;;20023:31;:15;20043:10;20023:31;:19;:31;:::i;:::-;20015:77;;;;-1:-1:-1;;;20015:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24968:18:0;;;;;;:12;:18;;;;;;:33;;;25013:49;24989:12;;24968:18;25031:10;;25013:49;;24968:18;25013:49;24858:210;;;:::o;17246:33::-;;;;:::o;16985:20::-;;;;;;;;;;;;;;;-1:-1:-1;;16985:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21350:129;21414:18;21448:25;:15;21468:4;21448:25;:19;:25;:::i;31445:190::-;31510:4;-1:-1:-1;;;;;20371:18:0;;20363:52;;;;;-1:-1:-1;;;20363:52:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20363:52:0;;;;;;;;;;;;;;;19889:31;:15;19909:10;19889:31;:19;:31;:::i;:::-;19881:77;;;;-1:-1:-1;;;19881:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31558:15;31568:4;31558:9;:15::i;:::-;31549:5;:24;;31541:63;;;;;-1:-1:-1;;;31541:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;31611:18;31617:4;31623:5;31611;:18::i;13164:216::-;13275:10;13249:4;13296:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;13296:32:0;;;;;;;;;;13249:4;;13266:84;;13287:7;;13296:53;;13333:15;13296:53;:36;:53;:::i;33111:272::-;33188:12;33176:2;-1:-1:-1;;;;;20371:18:0;;20363:52;;;;;-1:-1:-1;;;20363:52:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20363:52:0;;;;;;;;;;;;;;;33226:21;33236:10;33226:9;:21::i;:::-;33217:5;:30;;33209:61;;;;;-1:-1:-1;;;33209:61:0;;;;;;;;;;;;-1:-1:-1;;;33209:61:0;;;;;;;;;;;;;;;33277:50;33305:10;33317:2;33321:5;33277:27;:50::i;:::-;33334:25;33349:2;33353:5;33334:14;:25::i;:::-;-1:-1:-1;33373:4:0;;33111:272;-1:-1:-1;;;;33111:272:0:o;17945:28::-;;;;;;:::o;27668:198::-;27731:4;-1:-1:-1;;;;;20371:18:0;;20363:52;;;;;-1:-1:-1;;;20363:52:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20363:52:0;;;;;;;;;;;;;;;20172:31;:15;20192:10;20172:31;:19;:31;:::i;:::-;:66;;;-1:-1:-1;20207:31:0;:15;20227:10;20207:31;:19;:31;:::i;:::-;20163:137;;;;-1:-1:-1;;;20163:137:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27778:22:0;;;;;;:16;:22;;;;;;:31;;-1:-1:-1;;27778:31:0;;;;;;;;;;27821:39;;27778:31;;:22;27835:10;;27821:39;;27778:22;27821:39;27668:198;;;:::o;25207:106::-;-1:-1:-1;;;;;25289:18:0;25266:7;25289:18;;;:12;:18;;;;;;;25207:106::o;17059:35::-;;;;;;-1:-1:-1;;;;;17059:35:0;;:::o;24048:194::-;24165:13;;:71;;;-1:-1:-1;;;24165:71:0;;24213:4;24165:71;;;;-1:-1:-1;;;;;24165:71:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;24165:13:0;;;;;;;:39;;:71;;;;;;;;;;;;;;;:13;:71;;;5:2:-1;;;;30:1;27;20:12;5:2;24165:71:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24165:71:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;24165:71:0;;24048:194;-1:-1:-1;;;;24048:194:0:o;27256:120::-;-1:-1:-1;;;;;27349:21:0;27318:15;27349:21;;;:15;:21;;;;;;;27256:120::o;10890:134::-;-1:-1:-1;;;;;10989:18:0;;;10962:7;10989:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;10890:134::o;32772:333::-;19889:31;:15;19909:10;19889:31;:19;:31;:::i;:::-;19881:77;;;;-1:-1:-1;;;19881:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32877:41:0;;32869:75;;;;;-1:-1:-1;;;32869:75:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;32869:75:0;;;;;;;;;;;;;;;32978:13;;;-1:-1:-1;;;;;32999:32:0;;;32978:13;32999:32;;;-1:-1:-1;;;;;;32999:32:0;;;;;;33043:56;;;33051:10;33043:56;;32978:13;;;;;;;;33043:56;;;;;;;;;;;;;;;32978:13;;33043:56;;;;;;;;;;19965:1;32772:333;:::o;29826:227::-;20023:31;:15;20043:10;20023:31;:19;:31;:::i;:::-;20015:77;;;;-1:-1:-1;;;20015:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29938:26;;;;:20;:26;;;;;;;;:30;;;;;;;;;:44;;;29994:53;;;;;;;29965:2;;29959:4;;30013:10;;29994:53;;;;;;;;;;29826:227;;;:::o;33806:451::-;34090:10;;;34089:62;;;34106:39;34124:10;34137:7;34106:9;:39::i;:::-;:44;34089:62;34081:140;;;;-1:-1:-1;;;34081:140:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34228:23;34236:7;34245:5;34228:7;:23::i;28066:116::-;-1:-1:-1;;;;;28154:22:0;28127:11;28154:22;;;:16;:22;;;;;;;;;28066:116::o;1866:203::-;1938:4;-1:-1:-1;;;;;1963:21:0;;1955:68;;;;-1:-1:-1;;;1955:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;2041:20:0;:11;:20;;;;;;;;;;;;;;;1866:203::o;15966:335::-;-1:-1:-1;;;;;16059:19:0;;16051:68;;;;-1:-1:-1;;;16051:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16138:21:0;;16130:68;;;;-1:-1:-1;;;16130:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16211:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:35;;;16262:31;;;;;;;;;;;;;;;;;15966:335;;;:::o;1588:183::-;1668:18;1672:4;1678:7;1668:3;:18::i;:::-;1660:64;;;;-1:-1:-1;;;1660:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1735:20:0;1758:5;1735:20;;;;;;;;;;;:28;;-1:-1:-1;;1735:28:0;;;1588:183::o;23408:277::-;23506:21;23530:42;23556:4;23562:2;23566:5;23530:25;:42::i;:::-;23587:13;;:43;;;-1:-1:-1;;;23587:43:0;;;;;;;;;;;;;-1:-1:-1;23587:13:0;;;;-1:-1:-1;;;;;23587:13:0;;:26;;:43;;;;;;;;;;;;;;;:13;:43;;;5:2:-1;;;;30:1;27;20:12;5:2;23587:43:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;23587:43:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;23587:43:0;23632:46;23662:15;23632:29;:46::i;:::-;23579:100;;;;;-1:-1:-1;;;23579:100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;23579:100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23408:277;;;;:::o;11790:256::-;11879:4;11896:36;11906:6;11914:9;11925:6;11896:9;:36::i;:::-;-1:-1:-1;;;;;11972:19:0;;;;;;:11;:19;;;;;;;;11960:10;11972:31;;;;;;;;;11943:73;;11952:6;;11972:43;;12008:6;11972:43;:35;:43;:::i;11943:73::-;-1:-1:-1;12034:4:0;11790:256;;;;;:::o;5860:181::-;5918:7;5950:5;;;5974:6;;;;5966:46;;;;;-1:-1:-1;;;5966:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;6032:1;5860:181;-1:-1:-1;;;5860:181:0:o;14580:308::-;-1:-1:-1;;;;;14656:21:0;;14648:65;;;;;-1:-1:-1;;;14648:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;14741:12;;:24;;14758:6;14741:24;:16;:24;:::i;:::-;14726:12;:39;-1:-1:-1;;;;;14797:18:0;;:9;:18;;;;;;;;;;;:30;;14820:6;14797:30;:22;:30;:::i;:::-;-1:-1:-1;;;;;14776:18:0;;:9;:18;;;;;;;;;;;:51;;;;14843:37;;;;;;;14776:18;;:9;;14843:37;;;;;;;;;;14580:308;;:::o;1330:178::-;1408:18;1412:4;1418:7;1408:3;:18::i;:::-;1407:19;1399:63;;;;;-1:-1:-1;;;1399:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1473:20:0;:11;:20;;;;;;;;;;;:27;;-1:-1:-1;;1473:27:0;1496:4;1473:27;;;1330:178::o;6316:184::-;6374:7;6407:1;6402;:6;;6394:49;;;;;-1:-1:-1;;;6394:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6466:5:0;;;6316:184::o;15220:306::-;-1:-1:-1;;;;;15295:21:0;;15287:67;;;;-1:-1:-1;;;15287:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15382:12;;:23;;15399:5;15382:23;:16;:23;:::i;:::-;15367:12;:38;-1:-1:-1;;;;;15437:18:0;;:9;:18;;;;;;;;;;;:29;;15460:5;15437:29;:22;:29;:::i;:::-;-1:-1:-1;;;;;15416:18:0;;:9;:18;;;;;;;;;;;:50;;;;15482:36;;;;;;;15416:9;;15482:36;;;;;;;;;;;15220:306;;:::o;10671:156::-;10740:4;10757:40;10767:10;10779:9;10790:6;13870:429;-1:-1:-1;;;;;13968:20:0;;13960:70;;;;-1:-1:-1;;;13960:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14049:23:0;;14041:71;;;;-1:-1:-1;;;14041:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14145:17:0;;:9;:17;;;;;;;;;;;:29;;14167:6;14145:29;:21;:29;:::i;:::-;-1:-1:-1;;;;;14125:17:0;;;:9;:17;;;;;;;;;;;:49;;;;14208:20;;;;;;;:32;;14233:6;14208:32;:24;:32;:::i;:::-;-1:-1:-1;;;;;14185:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;14256:35;;;;;;;14185:20;;14256:35;;;;;;;;;;;;;13870:429;;;:::o

Swarm Source

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