Token DokiDokiAzuki

 

Overview [ERC-20]

Price
$0.01 @ 0.000008 Eth (+0.02%)
Fully Diluted Market Cap
Max Total Supply:
25,650,311.55490136353127335 AZUKI

Holders:
1,339 (0.00%)

Transfers:
-

 
Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

OVERVIEW

$AZUKI is a secondary token created for up-coming Doki Doki NFT DaPP and full-service NFT platform.

Market

Volume (24H):$0.00
Market Capitalization:$0.00
Circulating Supply:0.00 AZUKI
Market Data Source: Coinmarketcap

# Exchange Pair Price  24H Volume % Volume
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
AzukiToken

Compiler Version
v0.7.4+commit.3f05b770

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

pragma solidity ^0.7.0;

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

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

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

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

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

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

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

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

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

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


library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

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

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

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

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

        return c;
    }

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

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

        return c;
    }

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

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

library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        return (codehash != accountHash && codehash != 0x0);
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain`call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return _functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        return _functionCallWithValue(target, data, value, errorMessage);
    }

    function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

contract ERC20 is Context, IERC20 {
    using SafeMath for uint256;
    using Address for address;

    mapping (address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;
    uint8 private _decimals;

    /**
     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with
     * a default value of 18.
     *
     * To select a different value for {decimals}, use {_setupDecimals}.
     *
     * All three of these values are immutable: they can only be set once during
     * construction.
     */
    constructor (string memory name, string memory symbol) {
        _name = name;
        _symbol = symbol;
        _decimals = 18;
    }

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

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

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

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

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view override 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 virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

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

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

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

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

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

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

        _beforeTokenTransfer(sender, recipient, amount);

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

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

        _beforeTokenTransfer(address(0), account, amount);

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

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

        _beforeTokenTransfer(account, address(0), amount);

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

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

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

    /**
     * @dev Sets {decimals} to a value other than the default one of 18.
     *
     * WARNING: This function should only be called from the constructor. Most
     * applications that interact with token contracts will not expect
     * {decimals} to ever change, and may work incorrectly if it does.
     */
    function _setupDecimals(uint8 decimals_) internal {
        _decimals = decimals_;
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be to transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }
}


contract Ownable is Context {
    address private _owner;

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

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

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

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

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

contract AzukiToken is ERC20("DokiDokiAzuki", "AZUKI"), Ownable {
    using SafeMath for uint256;
    using Address for address;

    mapping(string => uint) public operationLockTime;
    mapping(string => bool) public operationTimelockEnabled;
    string private MINT = "mint";
    string private TRANSFER = "transfer";
    string private ADDMINTER = "add_minter";
    string private BURNRATE = "burn_rate";
    uint public unlockDuration = 2 days;

    // mint for Owner
    address public mintTo = address(0);
    uint public mintAmount = 0;
    // add mint for Owner
    address public newMinter = address(0);
    uint public newBurnRate = 0;

    mapping(address => bool) public minters;

    // transfer burn
    uint public burnRate = 5;
    mapping(address => bool) public transferBlacklist;
    mapping(address => bool) public transferFromBlacklist;

    event GonnaMint(address to, uint amount, uint releaseTime);
    event GonnaAddMinter(address newMinter, uint releaseTime);
    event GonnaLockTransfer(uint releaseTime);
    event GonnaChangeBurnRate(uint burnRate);

    modifier onlyMinter() {
        require(minters[msg.sender], "Restricted to minters.");
        _;
    }

    function mint(address to, uint amount) public onlyMinter {
        if (operationTimelockEnabled[MINT]) {
            require(msg.sender != owner(), "Sorry, this function has been locked for Owner.");
        }
        _mint(to, amount);
    }

    function burn(uint amount) public {
        require(amount > 0);
        require(balanceOf(msg.sender) >= amount);
        _burn(msg.sender, amount);
    }

    function addMinter(address account) public onlyOwner {
        require(!operationTimelockEnabled[ADDMINTER], "Sorry, this function has been locked for Owner.");
        minters[account] = true;
    }

    function removeMinter(address account) public onlyOwner {
        minters[account] = false;
    }

    function gonnaMint(address to, uint amount) public onlyOwner {
        mintTo = to;
        mintAmount = amount;
        operationLockTime[MINT] = block.timestamp + unlockDuration;

        emit GonnaMint(to, amount, operationLockTime[MINT]);
    }

    function releaseMint() public onlyOwner {
        require(mintAmount != 0, "mint amount can not be 0.");
        require(block.timestamp >= operationLockTime[MINT], "Mint operation is pending.");
        _mint(mintTo, mintAmount);
        mintTo = address(0);
        mintAmount = 0;
    }

    function gonnaAddMinter(address account) public onlyOwner {
        newMinter = account;
        operationLockTime[ADDMINTER] = block.timestamp + unlockDuration;

        emit GonnaAddMinter(account, operationLockTime[ADDMINTER]);
    }

    function releaseNewMinter() public onlyOwner {
        require(newMinter != address(0), "New minter can not be 0x000.");
        require(block.timestamp >= operationLockTime[ADDMINTER], "Add minter operation is pending.");
        minters[newMinter] = true;
        newMinter = address(0);
    }

    function gonnaLockTransfer() public onlyOwner {
        operationLockTime[TRANSFER] = block.timestamp + unlockDuration;

        emit GonnaLockTransfer(operationLockTime[TRANSFER]);
    }

    function releaseTransferLock() public onlyOwner {
        require(!operationTimelockEnabled[TRANSFER], "Transfer is being locked.");
        require(block.timestamp >= operationLockTime[TRANSFER], "Transfer lock operation is pending.");
        operationTimelockEnabled[TRANSFER] = true;
    }

    function unlockTransfer() public onlyOwner {
        operationTimelockEnabled[TRANSFER] = false;
    }

    function gonnaChangeBurnRate(uint newRate) public onlyOwner {
        newBurnRate = newRate;
        operationLockTime[BURNRATE] = block.timestamp + unlockDuration;
        emit GonnaChangeBurnRate(newRate);
    }

    function releaseNewBurnRate() public onlyOwner {
        require(block.timestamp >= operationLockTime[BURNRATE], "Changing to new burning rate is pending.");
        burnRate = newBurnRate;
    }

    function changeTimelockDuration(uint duration) public onlyOwner {
        require(duration >= 1 days, "Duration must be greater than 1 day.");
        unlockDuration = duration;
    }

    function lockMint() public onlyOwner {
        operationTimelockEnabled[MINT] = true;
    }

    function lockAddMinter() public onlyOwner {
        operationTimelockEnabled[ADDMINTER] = true;
    }

    function addToTransferBlacklist(address account) public onlyOwner {
        transferBlacklist[account] = true;
    }

    function removeFromTransferBlacklist(address account) public onlyOwner {
        transferBlacklist[account] = false;
    }

    function addToTransferFromBlacklist(address account) public onlyOwner {
        transferFromBlacklist[account] = true;
    }

    function removeFromTransferFromBlacklist(address account) public onlyOwner {
        transferFromBlacklist[account] = false;
    }

    function transfer(address recipient, uint256 amount) public override returns (bool) {
        require(msg.sender == owner() || !operationTimelockEnabled[TRANSFER], "Transfer is being locked.");
        uint256 burnAmount = 0;
        if (transferBlacklist[msg.sender]) {
            burnAmount = amount.mul(burnRate).div(100);
        }
        uint256 transferAmount = amount.sub(burnAmount);
        require(balanceOf(msg.sender) >= amount, "insufficient balance.");
        super.transfer(recipient, transferAmount);
        if (burnAmount != 0) {
            _burn(msg.sender, burnAmount);
        }
        return true;
    }

    function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) {
        require(sender == owner() || !operationTimelockEnabled[TRANSFER], "TransferFrom is being locked.");
        uint256 burnAmount = 0;
        if (transferFromBlacklist[recipient]) {
            burnAmount = amount.mul(burnRate).div(100);
        }
        uint256 transferAmount = amount.sub(burnAmount);
        require(balanceOf(sender) >= amount, "insufficient balance.");
        super.transferFrom(sender, recipient, transferAmount);
        if (burnAmount != 0) {
            _burn(sender, burnAmount);
        }
        return true;
    }
}

Contract Security Audit

Contract ABI

[{"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":"newMinter","type":"address"},{"indexed":false,"internalType":"uint256","name":"releaseTime","type":"uint256"}],"name":"GonnaAddMinter","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"burnRate","type":"uint256"}],"name":"GonnaChangeBurnRate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"releaseTime","type":"uint256"}],"name":"GonnaLockTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"releaseTime","type":"uint256"}],"name":"GonnaMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","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"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addToTransferBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addToTransferFromBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burnRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"duration","type":"uint256"}],"name":"changeTimelockDuration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"gonnaAddMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newRate","type":"uint256"}],"name":"gonnaChangeBurnRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gonnaLockTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"gonnaMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lockAddMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lockMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintTo","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minters","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"newBurnRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"newMinter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"operationLockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"operationTimelockEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"releaseMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"releaseNewBurnRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"releaseNewMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"releaseTransferLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeFromTransferBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeFromTransferFromBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"transferBlacklist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"transferFromBlacklist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unlockDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unlockTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526040518060400160405280600481526020017f6d696e740000000000000000000000000000000000000000000000000000000081525060089080519060200190620000519291906200035f565b506040518060400160405280600881526020017f7472616e73666572000000000000000000000000000000000000000000000000815250600990805190602001906200009f9291906200035f565b506040518060400160405280600a81526020017f6164645f6d696e74657200000000000000000000000000000000000000000000815250600a9080519060200190620000ed9291906200035f565b506040518060400160405280600981526020017f6275726e5f726174650000000000000000000000000000000000000000000000815250600b90805190602001906200013b9291906200035f565b506202a300600c556000600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600e556000600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060006010556005601255348015620001e357600080fd5b506040518060400160405280600d81526020017f446f6b69446f6b69417a756b69000000000000000000000000000000000000008152506040518060400160405280600581526020017f415a554b490000000000000000000000000000000000000000000000000000008152508160039080519060200190620002689291906200035f565b508060049080519060200190620002819291906200035f565b506012600560006101000a81548160ff021916908360ff16021790555050506000620002b26200035760201b60201c565b905080600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35062000415565b600033905090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282620003975760008555620003e3565b82601f10620003b257805160ff1916838001178555620003e3565b82800160010185558215620003e3579182015b82811115620003e2578251825591602001919060010190620003c5565b5b509050620003f29190620003f6565b5090565b5b8082111562000411576000816000905550600101620003f7565b5090565b614c2a80620004256000396000f3fe608060405234801561001057600080fd5b506004361061027f5760003560e01c8063845ffac21161015c578063bed99850116100ce578063e0b6bb6711610087578063e0b6bb6714610c4a578063eab7e3f414610c54578063f1c6886014610c5e578063f2fde38b14610d2d578063f46eccc414610d71578063f92368f014610dcb5761027f565b8063bed9985014610b3e578063bf6d9abd14610b5c578063c62b754714610b66578063dc23ea0414610baa578063dd0d148914610bb4578063dd62ed3e14610bd25761027f565b8063983b2d5611610120578063983b2d5614610976578063a3e07108146109ba578063a457c2d7146109ee578063a9059cbb14610a52578063ab0f20c414610ab6578063bb8cdb3c14610b105761027f565b8063845ffac2146108635780638a1fcd601461086d5780638da5cb5b1461088b57806392123470146108bf57806395d89b41146108f35761027f565b806339509351116101f55780636614b24e116101b95780636614b24e1461070b5780636b7fef141461076557806370a08231146107a9578063715018a614610801578063789fe3551461080b5780637c2d93fb146108155761027f565b806339509351146105df57806340c10f191461064357806342966c68146106915780635a2bcc18146106bf5780635d17bfcd146106dd5761027f565b806323b872dd1161024757806323b872dd146103d757806328d748c41461045b5780633092afd51461049f578063313ce567146104e357806336daf90f14610504578063378f5b931461050e5761027f565b806306fdde0314610284578063095ea7b3146103075780630c2fc1971461036b57806318160ddd146103af5780631dfe90fc146103cd575b600080fd5b61028c610e0f565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156102cc5780820151818401526020810190506102b1565b50505050905090810190601f1680156102f95780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103536004803603604081101561031d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610eb1565b60405180821515815260200191505060405180910390f35b6103ad6004803603602081101561038157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610ecf565b005b6103b7610ff4565b6040518082815260200191505060405180910390f35b6103d5610ffe565b005b610443600480360360608110156103ed57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611155565b60405180821515815260200191505060405180910390f35b61049d6004803603602081101561047157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506113c7565b005b6104e1600480360360208110156104b557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506114ec565b005b6104eb611611565b604051808260ff16815260200191505060405180910390f35b61050c611628565b005b6105c76004803603602081101561052457600080fd5b810190808035906020019064010000000081111561054157600080fd5b82018360208201111561055357600080fd5b8035906020019184600183028401116401000000008311171561057557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050611818565b60405180821515815260200191505060405180910390f35b61062b600480360360408110156105f557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061184e565b60405180821515815260200191505060405180910390f35b61068f6004803603604081101561065957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611901565b005b6106bd600480360360208110156106a757600080fd5b8101908080359060200190929190505050611ae0565b005b6106c7611b0f565b6040518082815260200191505060405180910390f35b610709600480360360208110156106f357600080fd5b8101908080359060200190929190505050611b15565b005b61074d6004803603602081101561072157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611c45565b60405180821515815260200191505060405180910390f35b6107a76004803603602081101561077b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611c65565b005b6107eb600480360360208110156107bf57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611d8a565b6040518082815260200191505060405180910390f35b610809611dd2565b005b610813611f5d565b005b6108616004803603604081101561082b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612202565b005b61086b612462565b005b610875612602565b6040518082815260200191505060405180910390f35b610893612608565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6108c7612632565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6108fb612658565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561093b578082015181840152602081019050610920565b50505050905090810190601f1680156109685780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6109b86004803603602081101561098c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506126fa565b005b6109c26128f5565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610a3a60048036036040811015610a0457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061291b565b60405180821515815260200191505060405180910390f35b610a9e60048036036040811015610a6857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506129e8565b60405180821515815260200191505060405180910390f35b610af860048036036020811015610acc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612c58565b60405180821515815260200191505060405180910390f35b610b3c60048036036020811015610b2657600080fd5b8101908080359060200190929190505050612c78565b005b610b46612dfe565b6040518082815260200191505060405180910390f35b610b64612e04565b005b610ba860048036036020811015610b7c57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612f5b565b005b610bb2613080565b005b610bbc613395565b6040518082815260200191505060405180910390f35b610c3460048036036040811015610be857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061339b565b6040518082815260200191505060405180910390f35b610c52613422565b005b610c5c613579565b005b610d1760048036036020811015610c7457600080fd5b8101908080359060200190640100000000811115610c9157600080fd5b820183602082011115610ca357600080fd5b80359060200191846001830284011164010000000083111715610cc557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506138ae565b6040518082815260200191505060405180910390f35b610d6f60048036036020811015610d4357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506138dc565b005b610db360048036036020811015610d8757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613aec565b60405180821515815260200191505060405180910390f35b610e0d60048036036020811015610de157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050613b0c565b005b606060038054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610ea75780601f10610e7c57610100808354040283529160200191610ea7565b820191906000526020600020905b815481529060010190602001808311610e8a57829003601f168201915b5050505050905090565b6000610ec5610ebe613d5c565b8484613d64565b6001905092915050565b610ed7613d5c565b73ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f99576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000601460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000600254905090565b611006613d5c565b73ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146110c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b60016007600a60405180828054600181600116156101000203166002900480156111295780601f10611107576101008083540402835291820191611129565b820191906000526020600020905b815481529060010190602001808311611115575b5050915050908152602001604051809103902060006101000a81548160ff021916908315150217905550565b600061115f612608565b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061121557506007600960405180828054600181600116156101000203166002900480156111f25780601f106111d05761010080835404028352918201916111f2565b820191906000526020600020905b8154815290600101906020018083116111de575b5050915050908152602001604051809103902060009054906101000a900460ff16155b611287576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f5472616e7366657246726f6d206973206265696e67206c6f636b65642e00000081525060200191505060405180910390fd5b6000601460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16156113065761130360646112f560125486613f5b90919063ffffffff16565b613fe190919063ffffffff16565b90505b600061131b828561402b90919063ffffffff16565b90508361132787611d8a565b101561139b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f696e73756666696369656e742062616c616e63652e000000000000000000000081525060200191505060405180910390fd5b6113a6868683614075565b50600082146113ba576113b9868361414e565b5b6001925050509392505050565b6113cf613d5c565b73ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611491576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6114f4613d5c565b73ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146115b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b6000600560009054906101000a900460ff16905090565b611630613d5c565b73ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146116f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600c5442016006600960405180828054600181600116156101000203166002900480156117565780601f10611734576101008083540402835291820191611756565b820191906000526020600020905b815481529060010190602001808311611742575b50509150509081526020016040518091039020819055507f55876d4d45126da385fe679337e59204e67de9f940cad7ee31fca23b586698ae6006600960405180828054600181600116156101000203166002900480156117ed5780601f106117cb5761010080835404028352918201916117ed565b820191906000526020600020905b8154815290600101906020018083116117d9575b50509150509081526020016040518091039020546040518082815260200191505060405180910390a1565b6007818051602081018201805184825260208301602085012081835280955050505050506000915054906101000a900460ff1681565b60006118f761185b613d5c565b846118f2856001600061186c613d5c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461431290919063ffffffff16565b613d64565b6001905092915050565b601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166119c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260168152602001807f5265737472696374656420746f206d696e746572732e0000000000000000000081525060200191505060405180910390fd5b600760086040518082805460018160011615610100020316600290048015611a1f5780601f106119fd576101008083540402835291820191611a1f565b820191906000526020600020905b815481529060010190602001808311611a0b575b5050915050908152602001604051809103902060009054906101000a900460ff1615611ad257611a4d612608565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415611ad1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180614aa2602f913960400191505060405180910390fd5b5b611adc828261439a565b5050565b60008111611aed57600080fd5b80611af733611d8a565b1015611b0257600080fd5b611b0c338261414e565b50565b600e5481565b611b1d613d5c565b73ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611bdf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b62015180811015611c3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180614ad16024913960400191505060405180910390fd5b80600c8190555050565b60136020528060005260406000206000915054906101000a900460ff1681565b611c6d613d5c565b73ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611d2f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6001601460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611dda613d5c565b73ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611e9c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b611f65613d5c565b73ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612027576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000600e5414156120a0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f6d696e7420616d6f756e742063616e206e6f7420626520302e0000000000000081525060200191505060405180910390fd5b6006600860405180828054600181600116156101000203166002900480156120ff5780601f106120dd5761010080835404028352918201916120ff565b820191906000526020600020905b8154815290600101906020018083116120eb575b5050915050908152602001604051809103902054421015612188576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f4d696e74206f7065726174696f6e2069732070656e64696e672e00000000000081525060200191505060405180910390fd5b6121b6600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600e5461439a565b6000600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600e81905550565b61220a613d5c565b73ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146122cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b81600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600e81905550600c5442016006600860405180828054600181600116156101000203166002900480156123785780601f10612356576101008083540402835291820191612378565b820191906000526020600020905b815481529060010190602001808311612364575b50509150509081526020016040518091039020819055507fa98185265754d2900747b6b8c10848dc79f4e12ee76feba2eaf9d4b8a67d60a182826006600860405180828054600181600116156101000203166002900480156124115780601f106123ef576101008083540402835291820191612411565b820191906000526020600020905b8154815290600101906020018083116123fd575b5050915050908152602001604051809103902054604051808473ffffffffffffffffffffffffffffffffffffffff168152602001838152602001828152602001935050505060405180910390a15050565b61246a613d5c565b73ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461252c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6006600b604051808280546001816001161561010002031660029004801561258b5780601f1061256957610100808354040283529182019161258b565b820191906000526020600020905b815481529060010190602001808311612577575b50509150509081526020016040518091039020544210156125f7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180614b5f6028913960400191505060405180910390fd5b601054601281905550565b600c5481565b6000600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060048054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156126f05780601f106126c5576101008083540402835291602001916126f0565b820191906000526020600020905b8154815290600101906020018083116126d357829003601f168201915b5050505050905090565b612702613d5c565b73ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146127c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6007600a60405180828054600181600116156101000203166002900480156128235780601f10612801576101008083540402835291820191612823565b820191906000526020600020905b81548152906001019060200180831161280f575b5050915050908152602001604051809103902060009054906101000a900460ff161561289a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602f815260200180614aa2602f913960400191505060405180910390fd5b6001601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006129de612928613d5c565b846129d985604051806060016040528060258152602001614bd06025913960016000612952613d5c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546145619092919063ffffffff16565b613d64565b6001905092915050565b60006129f2612608565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612aa85750600760096040518082805460018160011615610100020316600290048015612a855780601f10612a63576101008083540402835291820191612a85565b820191906000526020600020905b815481529060010190602001808311612a71575b5050915050908152602001604051809103902060009054906101000a900460ff16155b612b1a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f5472616e73666572206973206265696e67206c6f636b65642e0000000000000081525060200191505060405180910390fd5b6000601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615612b9957612b966064612b8860125486613f5b90919063ffffffff16565b613fe190919063ffffffff16565b90505b6000612bae828561402b90919063ffffffff16565b905083612bba33611d8a565b1015612c2e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f696e73756666696369656e742062616c616e63652e000000000000000000000081525060200191505060405180910390fd5b612c388582614621565b5060008214612c4c57612c4b338361414e565b5b60019250505092915050565b60146020528060005260406000206000915054906101000a900460ff1681565b612c80613d5c565b73ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612d42576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80601081905550600c5442016006600b6040518082805460018160011615610100020316600290048015612dad5780601f10612d8b576101008083540402835291820191612dad565b820191906000526020600020905b815481529060010190602001808311612d99575b50509150509081526020016040518091039020819055507f345a03d72d12b87ae23e1533d3d18656ab883faa8693c7bd66b77b01663f7181816040518082815260200191505060405180910390a150565b60125481565b612e0c613d5c565b73ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612ece576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000600760096040518082805460018160011615610100020316600290048015612f2f5780601f10612f0d576101008083540402835291820191612f2f565b820191906000526020600020905b815481529060010190602001808311612f1b575b5050915050908152602001604051809103902060006101000a81548160ff021916908315150217905550565b612f63613d5c565b73ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613025576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6001601360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b613088613d5c565b73ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461314a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6007600960405180828054600181600116156101000203166002900480156131a95780601f106131875761010080835404028352918201916131a9565b820191906000526020600020905b815481529060010190602001808311613195575b5050915050908152602001604051809103902060009054906101000a900460ff161561323d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f5472616e73666572206973206265696e67206c6f636b65642e0000000000000081525060200191505060405180910390fd5b60066009604051808280546001816001161561010002031660029004801561329c5780601f1061327a57610100808354040283529182019161329c565b820191906000526020600020905b815481529060010190602001808311613288575b5050915050908152602001604051809103902054421015613308576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180614a596023913960400191505060405180910390fd5b60016007600960405180828054600181600116156101000203166002900480156133695780601f10613347576101008083540402835291820191613369565b820191906000526020600020905b815481529060010190602001808311613355575b5050915050908152602001604051809103902060006101000a81548160ff021916908315150217905550565b60105481565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b61342a613d5c565b73ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146134ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600160076008604051808280546001816001161561010002031660029004801561354d5780601f1061352b57610100808354040283529182019161354d565b820191906000526020600020905b815481529060010190602001808311613539575b5050915050908152602001604051809103902060006101000a81548160ff021916908315150217905550565b613581613d5c565b73ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613643576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415613708576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4e6577206d696e7465722063616e206e6f742062652030783030302e0000000081525060200191505060405180910390fd5b6006600a60405180828054600181600116156101000203166002900480156137675780601f10613745576101008083540402835291820191613767565b820191906000526020600020905b815481529060010190602001808311613753575b50509150509081526020016040518091039020544210156137f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f416464206d696e746572206f7065726174696f6e2069732070656e64696e672e81525060200191505060405180910390fd5b600160116000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6006818051602081018201805184825260208301602085012081835280955050505050506000915090505481565b6138e4613d5c565b73ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146139a6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613a2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180614a116026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60116020528060005260406000206000915054906101000a900460ff1681565b613b14613d5c565b73ffffffffffffffffffffffffffffffffffffffff16600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613bd6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600c5442016006600a6040518082805460018160011615610100020316600290048015613c7b5780601f10613c59576101008083540402835291820191613c7b565b820191906000526020600020905b815481529060010190602001808311613c67575b50509150509081526020016040518091039020819055507fa6f5763e6668bad747a51d5de2662e5a5a6c81b64ba87e3155cbf7cb4ecdf95a816006600a6040518082805460018160011615610100020316600290048015613d135780601f10613cf1576101008083540402835291820191613d13565b820191906000526020600020905b815481529060010190602001808311613cff575b5050915050908152602001604051809103902054604051808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a150565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415613dea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180614bac6024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613e70576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180614a376022913960400191505060405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b600080831415613f6e5760009050613fdb565b6000828402905082848281613f7f57fe5b0414613fd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614af56021913960400191505060405180910390fd5b809150505b92915050565b600061402383836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061463f565b905092915050565b600061406d83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250614561565b905092915050565b6000614082848484614705565b6141438461408e613d5c565b61413e85604051806060016040528060288152602001614b1660289139600160008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006140f4613d5c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546145619092919063ffffffff16565b613d64565b600190509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156141d4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180614b3e6021913960400191505060405180910390fd5b6141e0826000836149c6565b61424b816040518060600160405280602281526020016149ef602291396000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546145619092919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506142a28160025461402b90919063ffffffff16565b600281905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b600080828401905083811015614390576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561443d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b614449600083836149c6565b61445e8160025461431290919063ffffffff16565b6002819055506144b5816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461431290919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b600083831115829061460e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156145d35780820151818401526020810190506145b8565b50505050905090810190601f1680156146005780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b600061463561462e613d5c565b8484614705565b6001905092915050565b600080831182906146eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b838110156146b0578082015181840152602081019050614695565b50505050905090810190601f1680156146dd5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816146f757fe5b049050809150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561478b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180614b876025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415614811576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806149cc6023913960400191505060405180910390fd5b61481c8383836149c6565b61488781604051806060016040528060268152602001614a7c602691396000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546145619092919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061491a816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461431290919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b50505056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e63654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f20616464726573735472616e73666572206c6f636b206f7065726174696f6e2069732070656e64696e672e45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365536f7272792c20746869732066756e6374696f6e20686173206265656e206c6f636b656420666f72204f776e65722e4475726174696f6e206d7573742062652067726561746572207468616e2031206461792e536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f20616464726573734368616e67696e6720746f206e6577206275726e696e6720726174652069732070656e64696e672e45524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f206164647265737345524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212201557ae18d9d08fd3139c4e6198e6165818bf30496dc6d2785adfebbb593f516864736f6c63430007040033

Deployed ByteCode Sourcemap

25274:6401:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14767:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16873:169;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;30211:132;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;15842:100;;;:::i;:::-;;;;;;;;;;;;;;;;;;;29708:103;;;:::i;:::-;;31002:670;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;29945:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;27137:99;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;15694:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;28366:191;;;:::i;:::-;;25467:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;18246:218;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;26505:247;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;26760:159;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;25805:26;;;:::i;:::-;;;;;;;;;;;;;;;;;;;29413:186;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;26046:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;30077:126;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;16005:119;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;24720:148;;;:::i;:::-;;27506:295;;;:::i;:::-;;27244:254;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;29207:198;;;:::i;:::-;;25697:35;;;:::i;:::-;;;;;;;;;;;;;;;;;;;24078:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;25764:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;14969:87;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26927:202;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;25865:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;18967:269;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;30351:643;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;26102:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;28982:217;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;26015:24;;;:::i;:::-;;;;;;;;;;;;;;;;;;;28870:104;;;:::i;:::-;;29819:118;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;28565:297;;;:::i;:::-;;25909:27;;;:::i;:::-;;;;;;;;;;;;;;;;;;;16575:151;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;29607:93;;;:::i;:::-;;28058:300;;;:::i;:::-;;25412:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;25023:244;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;25945:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;27809:241;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;14767:83;14804:13;14837:5;14830:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14767:83;:::o;16873:169::-;16956:4;16973:39;16982:12;:10;:12::i;:::-;16996:7;17005:6;16973:8;:39::i;:::-;17030:4;17023:11;;16873:169;;;;:::o;30211:132::-;24300:12;:10;:12::i;:::-;24290:22;;:6;;;;;;;;;;;:22;;;24282:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30330:5:::1;30297:21;:30;30319:7;30297:30;;;;;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;30211:132:::0;:::o;15842:100::-;15895:7;15922:12;;15915:19;;15842:100;:::o;29708:103::-;24300:12;:10;:12::i;:::-;24290:22;;:6;;;;;;;;;;;:22;;;24282:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29799:4:::1;29761:24;29786:9;29761:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;29708:103::o:0;31002:670::-;31100:4;31135:7;:5;:7::i;:::-;31125:17;;:6;:17;;;:56;;;;31147:24;31172:8;31147:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31146:35;31125:56;31117:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31226:18;31263:21;:32;31285:9;31263:32;;;;;;;;;;;;;;;;;;;;;;;;;31259:107;;;31325:29;31350:3;31325:20;31336:8;;31325:6;:10;;:20;;;;:::i;:::-;:24;;:29;;;;:::i;:::-;31312:42;;31259:107;31376:22;31401;31412:10;31401:6;:10;;:22;;;;:::i;:::-;31376:47;;31463:6;31442:17;31452:6;31442:9;:17::i;:::-;:27;;31434:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31506:53;31525:6;31533:9;31544:14;31506:18;:53::i;:::-;;31588:1;31574:10;:15;31570:73;;31606:25;31612:6;31620:10;31606:5;:25::i;:::-;31570:73;31660:4;31653:11;;;;31002:670;;;;;:::o;29945:124::-;24300:12;:10;:12::i;:::-;24290:22;;:6;;;;;;;;;;;:22;;;24282:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30056:5:::1;30027:17;:26;30045:7;30027:26;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;29945:124:::0;:::o;27137:99::-;24300:12;:10;:12::i;:::-;24290:22;;:6;;;;;;;;;;;:22;;;24282:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27223:5:::1;27204:7;:16;27212:7;27204:16;;;;;;;;;;;;;;;;:24;;;;;;;;;;;;;;;;;;27137:99:::0;:::o;15694:83::-;15735:5;15760:9;;;;;;;;;;;15753:16;;15694:83;:::o;28366:191::-;24300:12;:10;:12::i;:::-;24290:22;;:6;;;;;;;;;;;:22;;;24282:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28471:14:::1;;28453:15;:32;28423:17;28441:8;28423:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:62;;;;28503:46;28521:17;28539:8;28521:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28503:46;;;;;;;;;;;;;;;;;;28366:191::o:0;25467:55::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;18246:218::-;18334:4;18351:83;18360:12;:10;:12::i;:::-;18374:7;18383:50;18422:10;18383:11;:25;18395:12;:10;:12::i;:::-;18383:25;;;;;;;;;;;;;;;:34;18409:7;18383:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;18351:8;:83::i;:::-;18452:4;18445:11;;18246:218;;;;:::o;26505:247::-;26431:7;:19;26439:10;26431:19;;;;;;;;;;;;;;;;;;;;;;;;;26423:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26577:24:::1;26602:4;26577:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26573:144;;;26646:7;:5;:7::i;:::-;26632:21;;:10;:21;;;;26624:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26573:144;26727:17;26733:2;26737:6;26727:5;:17::i;:::-;26505:247:::0;;:::o;26760:159::-;26822:1;26813:6;:10;26805:19;;;;;;26868:6;26843:21;26853:10;26843:9;:21::i;:::-;:31;;26835:40;;;;;;26886:25;26892:10;26904:6;26886:5;:25::i;:::-;26760:159;:::o;25805:26::-;;;;:::o;29413:186::-;24300:12;:10;:12::i;:::-;24290:22;;:6;;;;;;;;;;;:22;;;24282:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29508:6:::1;29496:8;:18;;29488:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29583:8;29566:14;:25;;;;29413:186:::0;:::o;26046:49::-;;;;;;;;;;;;;;;;;;;;;;:::o;30077:126::-;24300:12;:10;:12::i;:::-;24290:22;;:6;;;;;;;;;;;:22;;;24282:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30191:4:::1;30158:21;:30;30180:7;30158:30;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;30077:126:::0;:::o;16005:119::-;16071:7;16098:9;:18;16108:7;16098:18;;;;;;;;;;;;;;;;16091:25;;16005:119;;;:::o;24720:148::-;24300:12;:10;:12::i;:::-;24290:22;;:6;;;;;;;;;;;:22;;;24282:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24827:1:::1;24790:40;;24811:6;;;;;;;;;;;24790:40;;;;;;;;;;;;24858:1;24841:6;;:19;;;;;;;;;;;;;;;;;;24720:148::o:0;27506:295::-;24300:12;:10;:12::i;:::-;24290:22;;:6;;;;;;;;;;;:22;;;24282:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27579:1:::1;27565:10;;:15;;27557:53;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;27648:17;27666:4;27648:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27629:15;:42;;27621:81;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;27713:25;27719:6;;;;;;;;;;;27727:10;;27713:5;:25::i;:::-;27766:1;27749:6;;:19;;;;;;;;;;;;;;;;;;27792:1;27779:10;:14;;;;27506:295::o:0;27244:254::-;24300:12;:10;:12::i;:::-;24290:22;;:6;;;;;;;;;;;:22;;;24282:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27325:2:::1;27316:6;;:11;;;;;;;;;;;;;;;;;;27351:6;27338:10;:19;;;;27412:14;;27394:15;:32;27368:17;27386:4;27368:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:58;;;;27444:46;27454:2;27458:6;27466:17;27484:4;27466:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27444:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27244:254:::0;;:::o;29207:198::-;24300:12;:10;:12::i;:::-;24290:22;;:6;;;;;;;;;;;:22;;;24282:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29292:17:::1;29310:8;29292:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29273:15;:46;;29265:99;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29386:11;;29375:8;:22;;;;29207:198::o:0;25697:35::-;;;;:::o;24078:79::-;24116:7;24143:6;;;;;;;;;;;24136:13;;24078:79;:::o;25764:34::-;;;;;;;;;;;;;:::o;14969:87::-;15008:13;15041:7;15034:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14969:87;:::o;26927:202::-;24300:12;:10;:12::i;:::-;24290:22;;:6;;;;;;;;;;;:22;;;24282:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27000:24:::1;27025:9;27000:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26999:36;26991:96;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27117:4;27098:7;:16;27106:7;27098:16;;;;;;;;;;;;;;;;:23;;;;;;;;;;;;;;;;;;26927:202:::0;:::o;25865:37::-;;;;;;;;;;;;;:::o;18967:269::-;19060:4;19077:129;19086:12;:10;:12::i;:::-;19100:7;19109:96;19148:15;19109:96;;;;;;;;;;;;;;;;;:11;:25;19121:12;:10;:12::i;:::-;19109:25;;;;;;;;;;;;;;;:34;19135:7;19109:34;;;;;;;;;;;;;;;;:38;;:96;;;;;:::i;:::-;19077:8;:129::i;:::-;19224:4;19217:11;;18967:269;;;;:::o;30351:643::-;30429:4;30468:7;:5;:7::i;:::-;30454:21;;:10;:21;;;:60;;;;30480:24;30505:8;30480:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30479:35;30454:60;30446:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30555:18;30592:17;:29;30610:10;30592:29;;;;;;;;;;;;;;;;;;;;;;;;;30588:104;;;30651:29;30676:3;30651:20;30662:8;;30651:6;:10;;:20;;;;:::i;:::-;:24;;:29;;;;:::i;:::-;30638:42;;30588:104;30702:22;30727;30738:10;30727:6;:10;;:22;;;;:::i;:::-;30702:47;;30793:6;30768:21;30778:10;30768:9;:21::i;:::-;:31;;30760:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30836:41;30851:9;30862:14;30836;:41::i;:::-;;30906:1;30892:10;:15;30888:77;;30924:29;30930:10;30942;30924:5;:29::i;:::-;30888:77;30982:4;30975:11;;;;30351:643;;;;:::o;26102:53::-;;;;;;;;;;;;;;;;;;;;;;:::o;28982:217::-;24300:12;:10;:12::i;:::-;24290:22;;:6;;;;;;;;;;;:22;;;24282:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29067:7:::1;29053:11;:21;;;;29133:14;;29115:15;:32;29085:17;29103:8;29085:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:62;;;;29163:28;29183:7;29163:28;;;;;;;;;;;;;;;;;;28982:217:::0;:::o;26015:24::-;;;;:::o;28870:104::-;24300:12;:10;:12::i;:::-;24290:22;;:6;;;;;;;;;;;:22;;;24282:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28961:5:::1;28924:24;28949:8;28924:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;28870:104::o:0;29819:118::-;24300:12;:10;:12::i;:::-;24290:22;;:6;;;;;;;;;;;:22;;;24282:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29925:4:::1;29896:17;:26;29914:7;29896:26;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;29819:118:::0;:::o;28565:297::-;24300:12;:10;:12::i;:::-;24290:22;;:6;;;;;;;;;;;:22;;;24282:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28633:24:::1;28658:8;28633:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28632:35;28624:73;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;28735:17;28753:8;28735:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28716:15;:46;;28708:94;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28850:4;28813:24;28838:8;28813:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:41;;;;;;;;;;;;;;;;;;28565:297::o:0;25909:27::-;;;;:::o;16575:151::-;16664:7;16691:11;:18;16703:5;16691:18;;;;;;;;;;;;;;;:27;16710:7;16691:27;;;;;;;;;;;;;;;;16684:34;;16575:151;;;;:::o;29607:93::-;24300:12;:10;:12::i;:::-;24290:22;;:6;;;;;;;;;;;:22;;;24282:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29688:4:::1;29655:24;29680:4;29655:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;29607:93::o:0;28058:300::-;24300:12;:10;:12::i;:::-;24290:22;;:6;;;;;;;;;;;:22;;;24282:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28143:1:::1;28122:23;;:9;;;;;;;;;;;:23;;;;28114:64;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;28216:17;28234:9;28216:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28197:15;:47;;28189:92;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;28313:4;28292:7;:18;28300:9;;;;;;;;;;;28292:18;;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;28348:1;28328:9;;:22;;;;;;;;;;;;;;;;;;28058:300::o:0;25412:48::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25023:244::-;24300:12;:10;:12::i;:::-;24290:22;;:6;;;;;;;;;;;:22;;;24282:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25132:1:::1;25112:22;;:8;:22;;;;25104:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25222:8;25193:38;;25214:6;;;;;;;;;;;25193:38;;;;;;;;;;;;25251:8;25242:6;;:17;;;;;;;;;;;;;;;;;;25023:244:::0;:::o;25945:39::-;;;;;;;;;;;;;;;;;;;;;;:::o;27809:241::-;24300:12;:10;:12::i;:::-;24290:22;;:6;;;;;;;;;;;:22;;;24282:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27890:7:::1;27878:9;;:19;;;;;;;;;;;;;;;;;;27957:14;;27939:15;:32;27908:17;27926:9;27908:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:63;;;;27989:53;28004:7;28013:17;28031:9;28013:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27989:53;;;;;;;;;;;;;;;;;;;;;;;;;;27809:241:::0;:::o;60:106::-;113:15;148:10;141:17;;60:106;:::o;22114:346::-;22233:1;22216:19;;:5;:19;;;;22208:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22314:1;22295:21;;:7;:21;;;;22287:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22398:6;22368:11;:18;22380:5;22368:18;;;;;;;;;;;;;;;:27;22387:7;22368:27;;;;;;;;;;;;;;;:36;;;;22436:7;22420:32;;22429:5;22420:32;;;22445:6;22420:32;;;;;;;;;;;;;;;;;;22114:346;;;:::o;4672:471::-;4730:7;4980:1;4975;:6;4971:47;;;5005:1;4998:8;;;;4971:47;5030:9;5046:1;5042;:5;5030:17;;5075:1;5070;5066;:5;;;;;;:10;5058:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5134:1;5127:8;;;4672:471;;;;;:::o;5619:132::-;5677:7;5704:39;5708:1;5711;5704:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;5697:46;;5619:132;;;;:::o;3782:136::-;3840:7;3867:43;3871:1;3874;3867:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;3860:50;;3782:136;;;;:::o;17516:321::-;17622:4;17639:36;17649:6;17657:9;17668:6;17639:9;:36::i;:::-;17686:121;17695:6;17703:12;:10;:12::i;:::-;17717:89;17755:6;17717:89;;;;;;;;;;;;;;;;;:11;:19;17729:6;17717:19;;;;;;;;;;;;;;;:33;17737:12;:10;:12::i;:::-;17717:33;;;;;;;;;;;;;;;;:37;;:89;;;;;:::i;:::-;17686:8;:121::i;:::-;17825:4;17818:11;;17516:321;;;;;:::o;21256:418::-;21359:1;21340:21;;:7;:21;;;;21332:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21412:49;21433:7;21450:1;21454:6;21412:20;:49::i;:::-;21495:68;21518:6;21495:68;;;;;;;;;;;;;;;;;:9;:18;21505:7;21495:18;;;;;;;;;;;;;;;;:22;;:68;;;;;:::i;:::-;21474:9;:18;21484:7;21474:18;;;;;;;;;;;;;;;:89;;;;21589:24;21606:6;21589:12;;:16;;:24;;;;:::i;:::-;21574:12;:39;;;;21655:1;21629:37;;21638:7;21629:37;;;21659:6;21629:37;;;;;;;;;;;;;;;;;;21256:418;;:::o;3318:181::-;3376:7;3396:9;3412:1;3408;:5;3396:17;;3437:1;3432;:6;;3424:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3490:1;3483:8;;;3318:181;;;;:::o;20546:378::-;20649:1;20630:21;;:7;:21;;;;20622:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20700:49;20729:1;20733:7;20742:6;20700:20;:49::i;:::-;20777:24;20794:6;20777:12;;:16;;:24;;;;:::i;:::-;20762:12;:39;;;;20833:30;20856:6;20833:9;:18;20843:7;20833:18;;;;;;;;;;;;;;;;:22;;:30;;;;:::i;:::-;20812:9;:18;20822:7;20812:18;;;;;;;;;;;;;;;:51;;;;20900:7;20879:37;;20896:1;20879:37;;;20909:6;20879:37;;;;;;;;;;;;;;;;;;20546:378;;:::o;4221:192::-;4307:7;4340:1;4335;:6;;4343:12;4327:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4367:9;4383:1;4379;:5;4367:17;;4404:1;4397:8;;;4221:192;;;;;:::o;16337:175::-;16423:4;16440:42;16450:12;:10;:12::i;:::-;16464:9;16475:6;16440:9;:42::i;:::-;16500:4;16493:11;;16337:175;;;;:::o;6247:278::-;6333:7;6365:1;6361;:5;6368:12;6353:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6392:9;6408:1;6404;:5;;;;;;6392:17;;6516:1;6509:8;;;6247:278;;;;;:::o;19726:539::-;19850:1;19832:20;;:6;:20;;;;19824:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19934:1;19913:23;;:9;:23;;;;19905:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19989:47;20010:6;20018:9;20029:6;19989:20;:47::i;:::-;20069:71;20091:6;20069:71;;;;;;;;;;;;;;;;;:9;:17;20079:6;20069:17;;;;;;;;;;;;;;;;:21;;:71;;;;;:::i;:::-;20049:9;:17;20059:6;20049:17;;;;;;;;;;;;;;;:91;;;;20174:32;20199:6;20174:9;:20;20184:9;20174:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;20151:9;:20;20161:9;20151:20;;;;;;;;;;;;;;;:55;;;;20239:9;20222:35;;20231:6;20222:35;;;20250:6;20222:35;;;;;;;;;;;;;;;;;;19726:539;;;:::o;23485:92::-;;;;:::o

Swarm Source

ipfs://1557ae18d9d08fd3139c4e6198e6165818bf30496dc6d2785adfebbb593f5168

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.