ETH Price: $2,938.95 (-0.67%)

Token

ArbiFLUX (ArbiFLUX)

Overview

Max Total Supply

349,615.826275361481276905 ArbiFLUX

Holders

180 (0.00%)

Market

Price

$0.00 @ 0.000000 ETH

Onchain Market Cap

-

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0.141663015059864466 ArbiFLUX

Value
$0.00
0xBCCE08C0e9293E103010e51f82b23A1f3EDfb315
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Datamine's ArbiFLUX is DeFi's first inflation-resistant currency built on Arbitrum L2. Market equilibrium is established using a variation of Proof-of-Burn algorithm.

Contract Source Code Verified (Exact Match)

Contract Name:
ArbiFluxToken

Compiler Version
v0.6.9+commit.3e3065ac

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Arbiscan.io on 2021-10-21
*/

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

// File: @openzeppelin/contracts/GSN/Context.sol

pragma solidity ^0.6.0;

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

    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;
    }
}

// File: @openzeppelin/contracts/token/ERC777/IERC777.sol

pragma solidity ^0.6.0;

/**
 * @dev Interface of the ERC777Token standard as defined in the EIP.
 *
 * This contract uses the
 * https://eips.ethereum.org/EIPS/eip-1820[ERC1820 registry standard] to let
 * token holders and recipients react to token movements by using setting implementers
 * for the associated interfaces in said registry. See {IERC1820Registry} and
 * {ERC1820Implementer}.
 */
interface IERC777 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

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

    /**
     * @dev Returns the smallest part of the token that is not divisible. This
     * means all token operations (creation, movement and destruction) must have
     * amounts that are a multiple of this number.
     *
     * For most token contracts, this value will equal 1.
     */
    function granularity() external view returns (uint256);

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

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

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * If send or receive hooks are registered for the caller and `recipient`,
     * the corresponding functions will be called with `data` and empty
     * `operatorData`. See {IERC777Sender} and {IERC777Recipient}.
     *
     * Emits a {Sent} event.
     *
     * Requirements
     *
     * - the caller must have at least `amount` tokens.
     * - `recipient` cannot be the zero address.
     * - if `recipient` is a contract, it must implement the {IERC777Recipient}
     * interface.
     */
    function send(address recipient, uint256 amount, bytes calldata data) external;

    /**
     * @dev Destroys `amount` tokens from the caller's account, reducing the
     * total supply.
     *
     * If a send hook is registered for the caller, the corresponding function
     * will be called with `data` and empty `operatorData`. See {IERC777Sender}.
     *
     * Emits a {Burned} event.
     *
     * Requirements
     *
     * - the caller must have at least `amount` tokens.
     */
    function burn(uint256 amount, bytes calldata data) external;

    /**
     * @dev Returns true if an account is an operator of `tokenHolder`.
     * Operators can send and burn tokens on behalf of their owners. All
     * accounts are their own operator.
     *
     * See {operatorSend} and {operatorBurn}.
     */
    function isOperatorFor(address operator, address tokenHolder) external view returns (bool);

    /**
     * @dev Make an account an operator of the caller.
     *
     * See {isOperatorFor}.
     *
     * Emits an {AuthorizedOperator} event.
     *
     * Requirements
     *
     * - `operator` cannot be calling address.
     */
    function authorizeOperator(address operator) external;

    /**
     * @dev Revoke an account's operator status for the caller.
     *
     * See {isOperatorFor} and {defaultOperators}.
     *
     * Emits a {RevokedOperator} event.
     *
     * Requirements
     *
     * - `operator` cannot be calling address.
     */
    function revokeOperator(address operator) external;

    /**
     * @dev Returns the list of default operators. These accounts are operators
     * for all token holders, even if {authorizeOperator} was never called on
     * them.
     *
     * This list is immutable, but individual holders may revoke these via
     * {revokeOperator}, in which case {isOperatorFor} will return false.
     */
    function defaultOperators() external view returns (address[] memory);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient`. The caller must
     * be an operator of `sender`.
     *
     * If send or receive hooks are registered for `sender` and `recipient`,
     * the corresponding functions will be called with `data` and
     * `operatorData`. See {IERC777Sender} and {IERC777Recipient}.
     *
     * Emits a {Sent} event.
     *
     * Requirements
     *
     * - `sender` cannot be the zero address.
     * - `sender` must have at least `amount` tokens.
     * - the caller must be an operator for `sender`.
     * - `recipient` cannot be the zero address.
     * - if `recipient` is a contract, it must implement the {IERC777Recipient}
     * interface.
     */
    function operatorSend(
        address sender,
        address recipient,
        uint256 amount,
        bytes calldata data,
        bytes calldata operatorData
    ) external;

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the total supply.
     * The caller must be an operator of `account`.
     *
     * If a send hook is registered for `account`, the corresponding function
     * will be called with `data` and `operatorData`. See {IERC777Sender}.
     *
     * Emits a {Burned} event.
     *
     * Requirements
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     * - the caller must be an operator for `account`.
     */
    function operatorBurn(
        address account,
        uint256 amount,
        bytes calldata data,
        bytes calldata operatorData
    ) external;

    event Sent(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256 amount,
        bytes data,
        bytes operatorData
    );

    event Minted(address indexed operator, address indexed to, uint256 amount, bytes data, bytes operatorData);

    event Burned(address indexed operator, address indexed from, uint256 amount, bytes data, bytes operatorData);

    event AuthorizedOperator(address indexed operator, address indexed tokenHolder);

    event RevokedOperator(address indexed operator, address indexed tokenHolder);
}

// File: @openzeppelin/contracts/token/ERC777/IERC777Recipient.sol

pragma solidity ^0.6.0;

/**
 * @dev Interface of the ERC777TokensRecipient standard as defined in the EIP.
 *
 * Accounts can be notified of {IERC777} tokens being sent to them by having a
 * contract implement this interface (contract holders can be their own
 * implementer) and registering it on the
 * https://eips.ethereum.org/EIPS/eip-1820[ERC1820 global registry].
 *
 * See {IERC1820Registry} and {ERC1820Implementer}.
 */
interface IERC777Recipient {
    /**
     * @dev Called by an {IERC777} token contract whenever tokens are being
     * moved or created into a registered account (`to`). The type of operation
     * is conveyed by `from` being the zero address or not.
     *
     * This call occurs _after_ the token contract's state is updated, so
     * {IERC777-balanceOf}, etc., can be used to query the post-operation state.
     *
     * This function may revert to prevent the operation from being executed.
     */
    function tokensReceived(
        address operator,
        address from,
        address to,
        uint256 amount,
        bytes calldata userData,
        bytes calldata operatorData
    ) external;
}

// File: @openzeppelin/contracts/token/ERC777/IERC777Sender.sol

pragma solidity ^0.6.0;

/**
 * @dev Interface of the ERC777TokensSender standard as defined in the EIP.
 *
 * {IERC777} Token holders can be notified of operations performed on their
 * tokens by having a contract implement this interface (contract holders can be
 *  their own implementer) and registering it on the
 * https://eips.ethereum.org/EIPS/eip-1820[ERC1820 global registry].
 *
 * See {IERC1820Registry} and {ERC1820Implementer}.
 */
interface IERC777Sender {
    /**
     * @dev Called by an {IERC777} token contract whenever a registered holder's
     * (`from`) tokens are about to be moved or destroyed. The type of operation
     * is conveyed by `to` being the zero address or not.
     *
     * This call occurs _before_ the token contract's state is updated, so
     * {IERC777-balanceOf}, etc., can be used to query the pre-operation state.
     *
     * This function may revert to prevent the operation from being executed.
     */
    function tokensToSend(
        address operator,
        address from,
        address to,
        uint256 amount,
        bytes calldata userData,
        bytes calldata operatorData
    ) external;
}

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

pragma solidity ^0.6.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
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);
}

// File: @openzeppelin/contracts/math/SafeMath.sol

pragma solidity ^0.6.0;

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

        return c;
    }

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

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     */
    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) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

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

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

// File: @openzeppelin/contracts/utils/Address.sol

pragma solidity ^0.6.2;

/**
 * @dev Collection of functions related to the address type
 */
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");
    }
}

// File: @openzeppelin/contracts/introspection/IERC1820Registry.sol

pragma solidity ^0.6.0;

/**
 * @dev Interface of the global ERC1820 Registry, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1820[EIP]. Accounts may register
 * implementers for interfaces in this registry, as well as query support.
 *
 * Implementers may be shared by multiple accounts, and can also implement more
 * than a single interface for each account. Contracts can implement interfaces
 * for themselves, but externally-owned accounts (EOA) must delegate this to a
 * contract.
 *
 * {IERC165} interfaces can also be queried via the registry.
 *
 * For an in-depth explanation and source code analysis, see the EIP text.
 */
interface IERC1820Registry {
    /**
     * @dev Sets `newManager` as the manager for `account`. A manager of an
     * account is able to set interface implementers for it.
     *
     * By default, each account is its own manager. Passing a value of `0x0` in
     * `newManager` will reset the manager to this initial state.
     *
     * Emits a {ManagerChanged} event.
     *
     * Requirements:
     *
     * - the caller must be the current manager for `account`.
     */
    function setManager(address account, address newManager) external;

    /**
     * @dev Returns the manager for `account`.
     *
     * See {setManager}.
     */
    function getManager(address account) external view returns (address);

    /**
     * @dev Sets the `implementer` contract as ``account``'s implementer for
     * `interfaceHash`.
     *
     * `account` being the zero address is an alias for the caller's address.
     * The zero address can also be used in `implementer` to remove an old one.
     *
     * See {interfaceHash} to learn how these are created.
     *
     * Emits an {InterfaceImplementerSet} event.
     *
     * Requirements:
     *
     * - the caller must be the current manager for `account`.
     * - `interfaceHash` must not be an {IERC165} interface id (i.e. it must not
     * end in 28 zeroes).
     * - `implementer` must implement {IERC1820Implementer} and return true when
     * queried for support, unless `implementer` is the caller. See
     * {IERC1820Implementer-canImplementInterfaceForAddress}.
     */
    function setInterfaceImplementer(address account, bytes32 interfaceHash, address implementer) external;

    /**
     * @dev Returns the implementer of `interfaceHash` for `account`. If no such
     * implementer is registered, returns the zero address.
     *
     * If `interfaceHash` is an {IERC165} interface id (i.e. it ends with 28
     * zeroes), `account` will be queried for support of it.
     *
     * `account` being the zero address is an alias for the caller's address.
     */
    function getInterfaceImplementer(address account, bytes32 interfaceHash) external view returns (address);

    /**
     * @dev Returns the interface hash for an `interfaceName`, as defined in the
     * corresponding
     * https://eips.ethereum.org/EIPS/eip-1820#interface-name[section of the EIP].
     */
    function interfaceHash(string calldata interfaceName) external pure returns (bytes32);

    /**
     *  @notice Updates the cache with whether the contract implements an ERC165 interface or not.
     *  @param account Address of the contract for which to update the cache.
     *  @param interfaceId ERC165 interface for which to update the cache.
     */
    function updateERC165Cache(address account, bytes4 interfaceId) external;

    /**
     *  @notice Checks whether a contract implements an ERC165 interface or not.
     *  If the result is not cached a direct lookup on the contract address is performed.
     *  If the result is not cached or the cached value is out-of-date, the cache MUST be updated manually by calling
     *  {updateERC165Cache} with the contract address.
     *  @param account Address of the contract to check.
     *  @param interfaceId ERC165 interface to check.
     *  @return True if `account` implements `interfaceId`, false otherwise.
     */
    function implementsERC165Interface(address account, bytes4 interfaceId) external view returns (bool);

    /**
     *  @notice Checks whether a contract implements an ERC165 interface or not without using nor updating the cache.
     *  @param account Address of the contract to check.
     *  @param interfaceId ERC165 interface to check.
     *  @return True if `account` implements `interfaceId`, false otherwise.
     */
    function implementsERC165InterfaceNoCache(address account, bytes4 interfaceId) external view returns (bool);

    event InterfaceImplementerSet(address indexed account, bytes32 indexed interfaceHash, address indexed implementer);

    event ManagerChanged(address indexed account, address indexed newManager);
}

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

pragma solidity ^0.6.0;









/**
 * @dev Implementation of the {IERC777} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 *
 * Support for ERC20 is included in this contract, as specified by the EIP: both
 * the ERC777 and ERC20 interfaces can be safely used when interacting with it.
 * Both {IERC777-Sent} and {IERC20-Transfer} events are emitted on token
 * movements.
 *
 * Additionally, the {IERC777-granularity} value is hard-coded to `1`, meaning that there
 * are no special restrictions in the amount of tokens that created, moved, or
 * destroyed. This makes integration with ERC20 applications seamless.
 */
contract ERC777 is Context, IERC777, IERC20 {
    using SafeMath for uint256;
    using Address for address;

    IERC1820Registry constant internal _ERC1820_REGISTRY = IERC1820Registry(0x1820a4B7618BdE71Dce8cdc73aAB6C95905faD24);

    mapping(address => uint256) private _balances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    // We inline the result of the following hashes because Solidity doesn't resolve them at compile time.
    // See https://github.com/ethereum/solidity/issues/4024.

    // keccak256("ERC777TokensSender")
    bytes32 constant private _TOKENS_SENDER_INTERFACE_HASH =
        0x29ddb589b1fb5fc7cf394961c1adf5f8c6454761adf795e67fe149f658abe895;

    // keccak256("ERC777TokensRecipient")
    bytes32 constant private _TOKENS_RECIPIENT_INTERFACE_HASH =
        0xb281fc8c12954d22544db45de3159a39272895b169a852b314f9cc762e44c53b;

    // This isn't ever read from - it's only used to respond to the defaultOperators query.
    address[] private _defaultOperatorsArray;

    // Immutable, but accounts may revoke them (tracked in __revokedDefaultOperators).
    mapping(address => bool) private _defaultOperators;

    // For each account, a mapping of its operators and revoked default operators.
    mapping(address => mapping(address => bool)) private _operators;
    mapping(address => mapping(address => bool)) private _revokedDefaultOperators;

    // ERC20-allowances
    mapping (address => mapping (address => uint256)) private _allowances;

    /**
     * @dev `defaultOperators` may be an empty array.
     */
    constructor(
        string memory name,
        string memory symbol,
        address[] memory defaultOperators
    ) public {
        _name = name;
        _symbol = symbol;

        _defaultOperatorsArray = defaultOperators;
        for (uint256 i = 0; i < _defaultOperatorsArray.length; i++) {
            _defaultOperators[_defaultOperatorsArray[i]] = true;
        }

        // register interfaces
        _ERC1820_REGISTRY.setInterfaceImplementer(address(this), keccak256("ERC777Token"), address(this));
        _ERC1820_REGISTRY.setInterfaceImplementer(address(this), keccak256("ERC20Token"), address(this));
    }

    /**
     * @dev See {IERC777-name}.
     */
    function name() public view override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC777-symbol}.
     */
    function symbol() public view override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {ERC20-decimals}.
     *
     * Always returns 18, as per the
     * [ERC777 EIP](https://eips.ethereum.org/EIPS/eip-777#backward-compatibility).
     */
    function decimals() public pure returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC777-granularity}.
     *
     * This implementation always returns `1`.
     */
    function granularity() public view override returns (uint256) {
        return 1;
    }

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

    /**
     * @dev Returns the amount of tokens owned by an account (`tokenHolder`).
     */
    function balanceOf(address tokenHolder) public view override(IERC20, IERC777) returns (uint256) {
        return _balances[tokenHolder];
    }

    /**
     * @dev See {IERC777-send}.
     *
     * Also emits a {IERC20-Transfer} event for ERC20 compatibility.
     */
    function send(address recipient, uint256 amount, bytes memory data) public override  {
        _send(_msgSender(), recipient, amount, data, "", true);
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Unlike `send`, `recipient` is _not_ required to implement the {IERC777Recipient}
     * interface if it is a contract.
     *
     * Also emits a {Sent} event.
     */
    function transfer(address recipient, uint256 amount) public override returns (bool) {
        require(recipient != address(0), "ERC777: transfer to the zero address");

        address from = _msgSender();

        _callTokensToSend(from, from, recipient, amount, "", "");

        _move(from, from, recipient, amount, "", "");

        _callTokensReceived(from, from, recipient, amount, "", "", false);

        return true;
    }

    /**
     * @dev See {IERC777-burn}.
     *
     * Also emits a {IERC20-Transfer} event for ERC20 compatibility.
     */
    function burn(uint256 amount, bytes memory data) public override  {
        _burn(_msgSender(), amount, data, "");
    }

    /**
     * @dev See {IERC777-isOperatorFor}.
     */
    function isOperatorFor(
        address operator,
        address tokenHolder
    ) public view override returns (bool) {
        return operator == tokenHolder ||
            (_defaultOperators[operator] && !_revokedDefaultOperators[tokenHolder][operator]) ||
            _operators[tokenHolder][operator];
    }

    /**
     * @dev See {IERC777-authorizeOperator}.
     */
    function authorizeOperator(address operator) public override  {
        require(_msgSender() != operator, "ERC777: authorizing self as operator");

        if (_defaultOperators[operator]) {
            delete _revokedDefaultOperators[_msgSender()][operator];
        } else {
            _operators[_msgSender()][operator] = true;
        }

        emit AuthorizedOperator(operator, _msgSender());
    }

    /**
     * @dev See {IERC777-revokeOperator}.
     */
    function revokeOperator(address operator) public override  {
        require(operator != _msgSender(), "ERC777: revoking self as operator");

        if (_defaultOperators[operator]) {
            _revokedDefaultOperators[_msgSender()][operator] = true;
        } else {
            delete _operators[_msgSender()][operator];
        }

        emit RevokedOperator(operator, _msgSender());
    }

    /**
     * @dev See {IERC777-defaultOperators}.
     */
    function defaultOperators() public view override returns (address[] memory) {
        return _defaultOperatorsArray;
    }

    /**
     * @dev See {IERC777-operatorSend}.
     *
     * Emits {Sent} and {IERC20-Transfer} events.
     */
    function operatorSend(
        address sender,
        address recipient,
        uint256 amount,
        bytes memory data,
        bytes memory operatorData
    )
    public override
    {
        require(isOperatorFor(_msgSender(), sender), "ERC777: caller is not an operator for holder");
        _send(sender, recipient, amount, data, operatorData, true);
    }

    /**
     * @dev See {IERC777-operatorBurn}.
     *
     * Emits {Burned} and {IERC20-Transfer} events.
     */
    function operatorBurn(address account, uint256 amount, bytes memory data, bytes memory operatorData) public override {
        require(isOperatorFor(_msgSender(), account), "ERC777: caller is not an operator for holder");
        _burn(account, amount, data, operatorData);
    }

    /**
     * @dev See {IERC20-allowance}.
     *
     * Note that operator and allowance concepts are orthogonal: operators may
     * not have allowance, and accounts with allowance may not be operators
     * themselves.
     */
    function allowance(address holder, address spender) public view override returns (uint256) {
        return _allowances[holder][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Note that accounts cannot have allowance issued by their operators.
     */
    function approve(address spender, uint256 value) public override returns (bool) {
        address holder = _msgSender();
        _approve(holder, spender, value);
        return true;
    }

   /**
    * @dev See {IERC20-transferFrom}.
    *
    * Note that operator and allowance concepts are orthogonal: operators cannot
    * call `transferFrom` (unless they have allowance), and accounts with
    * allowance cannot call `operatorSend` (unless they are operators).
    *
    * Emits {Sent}, {IERC20-Transfer} and {IERC20-Approval} events.
    */
    function transferFrom(address holder, address recipient, uint256 amount) public override returns (bool) {
        require(recipient != address(0), "ERC777: transfer to the zero address");
        require(holder != address(0), "ERC777: transfer from the zero address");

        address spender = _msgSender();

        _callTokensToSend(spender, holder, recipient, amount, "", "");

        _move(spender, holder, recipient, amount, "", "");
        _approve(holder, spender, _allowances[holder][spender].sub(amount, "ERC777: transfer amount exceeds allowance"));

        _callTokensReceived(spender, holder, recipient, amount, "", "", false);

        return true;
    }

    /**
     * @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * If a send hook is registered for `account`, the corresponding function
     * will be called with `operator`, `data` and `operatorData`.
     *
     * See {IERC777Sender} and {IERC777Recipient}.
     *
     * Emits {Minted} and {IERC20-Transfer} events.
     *
     * Requirements
     *
     * - `account` cannot be the zero address.
     * - if `account` is a contract, it must implement the {IERC777Recipient}
     * interface.
     */
    function _mint(
        address account,
        uint256 amount,
        bytes memory userData,
        bytes memory operatorData
    )
    internal virtual
    {
        require(account != address(0), "ERC777: mint to the zero address");

        address operator = _msgSender();

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

        // Update state variables
        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);

        _callTokensReceived(operator, address(0), account, amount, userData, operatorData, true);

        emit Minted(operator, account, amount, userData, operatorData);
        emit Transfer(address(0), account, amount);
    }

    /**
     * @dev Send tokens
     * @param from address token holder address
     * @param to address recipient address
     * @param amount uint256 amount of tokens to transfer
     * @param userData bytes extra information provided by the token holder (if any)
     * @param operatorData bytes extra information provided by the operator (if any)
     * @param requireReceptionAck if true, contract recipients are required to implement ERC777TokensRecipient
     */
    function _send(
        address from,
        address to,
        uint256 amount,
        bytes memory userData,
        bytes memory operatorData,
        bool requireReceptionAck
    )
        internal
    {
        require(from != address(0), "ERC777: send from the zero address");
        require(to != address(0), "ERC777: send to the zero address");

        address operator = _msgSender();

        _callTokensToSend(operator, from, to, amount, userData, operatorData);

        _move(operator, from, to, amount, userData, operatorData);

        _callTokensReceived(operator, from, to, amount, userData, operatorData, requireReceptionAck);
    }

    /**
     * @dev Burn tokens
     * @param from address token holder address
     * @param amount uint256 amount of tokens to burn
     * @param data bytes extra information provided by the token holder
     * @param operatorData bytes extra information provided by the operator (if any)
     */
    function _burn(
        address from,
        uint256 amount,
        bytes memory data,
        bytes memory operatorData
    )
        internal virtual
    {
        require(from != address(0), "ERC777: burn from the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, address(0), amount);

        _callTokensToSend(operator, from, address(0), amount, data, operatorData);

        // Update state variables
        _balances[from] = _balances[from].sub(amount, "ERC777: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);

        emit Burned(operator, from, amount, data, operatorData);
        emit Transfer(from, address(0), amount);
    }

    function _move(
        address operator,
        address from,
        address to,
        uint256 amount,
        bytes memory userData,
        bytes memory operatorData
    )
        private
    {
        _beforeTokenTransfer(operator, from, to, amount);

        _balances[from] = _balances[from].sub(amount, "ERC777: transfer amount exceeds balance");
        _balances[to] = _balances[to].add(amount);

        emit Sent(operator, from, to, amount, userData, operatorData);
        emit Transfer(from, to, amount);
    }

    /**
     * @dev See {ERC20-_approve}.
     *
     * Note that accounts cannot have allowance issued by their operators.
     */
    function _approve(address holder, address spender, uint256 value) internal {
        require(holder != address(0), "ERC777: approve from the zero address");
        require(spender != address(0), "ERC777: approve to the zero address");

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

    /**
     * @dev Call from.tokensToSend() if the interface is registered
     * @param operator address operator requesting the transfer
     * @param from address token holder address
     * @param to address recipient address
     * @param amount uint256 amount of tokens to transfer
     * @param userData bytes extra information provided by the token holder (if any)
     * @param operatorData bytes extra information provided by the operator (if any)
     */
    function _callTokensToSend(
        address operator,
        address from,
        address to,
        uint256 amount,
        bytes memory userData,
        bytes memory operatorData
    )
        private
    {
        address implementer = _ERC1820_REGISTRY.getInterfaceImplementer(from, _TOKENS_SENDER_INTERFACE_HASH);
        if (implementer != address(0)) {
            IERC777Sender(implementer).tokensToSend(operator, from, to, amount, userData, operatorData);
        }
    }

    /**
     * @dev Call to.tokensReceived() if the interface is registered. Reverts if the recipient is a contract but
     * tokensReceived() was not registered for the recipient
     * @param operator address operator requesting the transfer
     * @param from address token holder address
     * @param to address recipient address
     * @param amount uint256 amount of tokens to transfer
     * @param userData bytes extra information provided by the token holder (if any)
     * @param operatorData bytes extra information provided by the operator (if any)
     * @param requireReceptionAck if true, contract recipients are required to implement ERC777TokensRecipient
     */
    function _callTokensReceived(
        address operator,
        address from,
        address to,
        uint256 amount,
        bytes memory userData,
        bytes memory operatorData,
        bool requireReceptionAck
    )
        private
    {
        address implementer = _ERC1820_REGISTRY.getInterfaceImplementer(to, _TOKENS_RECIPIENT_INTERFACE_HASH);
        if (implementer != address(0)) {
            IERC777Recipient(implementer).tokensReceived(operator, from, to, amount, userData, operatorData);
        } else if (requireReceptionAck) {
            require(!to.isContract(), "ERC777: token recipient contract has no implementer for ERC777TokensRecipient");
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes
     * calls to {send}, {transfer}, {operatorSend}, minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - when `from` is zero, `tokenId` will be minted for `to`.
     * - when `to` is zero, ``from``'s `tokenId` 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 operator, address from, address to, uint256 tokenId) internal virtual { }
}

// File: @openzeppelin/contracts/math/Math.sol

pragma solidity ^0.6.0;

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

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

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

// File: contracts/ArbiFLUXToken.sol

pragma solidity 0.6.9;







/**
 * @dev Representation of each FLUX Lock-in
 */
struct AddressLock {
    /**
     * @dev FLUX locked-in amount
     */
    uint256 amount;

    /**
     * @dev How much ArbiFLUX was burned
     */
    uint256 burnedAmount;

    /**
     * @dev When did the lock-in start
     */
    uint256 blockNumber;

    /**
     * @dev When was the last time this address minted?
     */
    uint256 lastMintBlockNumber;

    /**
     * @dev Who is allowed to mint on behalf of this address
     */
    address minterAddress;
}

/**
 * @dev Datamine Crypto - ArbiFLUX Smart Contract
 */
contract ArbiFluxToken is ERC777, IERC777Recipient {
    /**
     * @dev Protect against overflows by using safe math operations (these are .add,.sub functions)
     */
    using SafeMath for uint256;

    /**
     * @dev for the re-entrancy attack protection
     */
    mapping(address => bool) private mutex;

    /**
     * @dev To avoid re-entrancy attacks
     */
    modifier preventRecursion() {
        if(mutex[_msgSender()] == false) {
            mutex[_msgSender()] = true;
            _; // Call the actual code
            mutex[_msgSender()] = false;
        }
        
        // Don't call the method if you are inside one already (_ above is what does the calling)
    }

    /**
     * @dev To limit one action per block per address 
     */
    modifier preventSameBlock(address targetAddress) {
        require(addressLocks[targetAddress].blockNumber != block.number && addressLocks[targetAddress].lastMintBlockNumber != block.number, "You can not lock/unlock/mint in the same block");
        
        _; // Call the actual code
    }

    /**
     * @dev FLUX must be locked-in to execute this function
     */
    modifier requireLocked(address targetAddress, bool requiredState) {
        if (requiredState) {
            require(addressLocks[targetAddress].amount != 0, "You must have locked-in your FLUX tokens");
        }else{
            require(addressLocks[targetAddress].amount == 0, "You must have unlocked your FLUX tokens");
        }

        _; // Call the actual code
    }

    /**
     * @dev This will be FLUX token smart contract address
     */
    IERC777 immutable private _token;

    IERC1820Registry private _erc1820 = IERC1820Registry(0x1820a4B7618BdE71Dce8cdc73aAB6C95905faD24);
    bytes32 constant private TOKENS_RECIPIENT_INTERFACE_HASH = keccak256("ERC777TokensRecipient");
	
    /**
     * @dev Decline some incoming transactions (Only allow ArbiFLUX smart contract to send/recieve FLUX tokens)
     */
    function tokensReceived(
        address operator,
        address from,
        address to,
        uint256 amount,
        bytes calldata,
        bytes calldata
    ) external override {
        require(amount > 0, "You must receive a positive number of tokens");
        require(_msgSender() == address(_token), "You can only lock-in FLUX tokens");

        // Ensure someone doesn't send in some FLUX to this contract by mistake (Only the contract itself can send itself FLUX)
        require(operator == address(this) , "Only ArbiFLUX contract can send itself FLUX tokens");
        require(to == address(this), "Funds must be coming into ArbiFLUX token");
        require(from != to, "Why would ArbiFLUX contract send tokens to itself?");
    }

    /**
     * @dev Set to 5760 on mainnet (min 24 hours before time bonus starts)
     */
    uint256 immutable private _startTimeReward;

    /**
     * @dev Set to 161280 on mainnet (max 28 days before max 3x time reward bonus)
     */
    uint256 immutable private _maxTimeReward;

    /**
     * @dev How long until you can lock-in any FLUX token amount
     */
    uint256 immutable private _failsafeTargetBlock;
	 
    constructor(address token, uint256 startTimeReward, uint256 maxTimeReward, uint256 failsafeBlockDuration) public ERC777("ArbiFLUX", "ArbiFLUX", new address[](0)) {
		require(maxTimeReward > 0, "maxTimeReward must be at least 1 block"); // to avoid division by 0

        _token = IERC777(token);
        _startTimeReward = startTimeReward;
        _maxTimeReward = maxTimeReward;
        _failsafeTargetBlock = block.number.add(failsafeBlockDuration);

        _erc1820.setInterfaceImplementer(address(this), TOKENS_RECIPIENT_INTERFACE_HASH, address(this));
    }

    /**
     * @dev How much max FLUX can you lock-in during failsafe duration?
     */
     uint256 private constant _failsafeMaxAmount = 100 * (10 ** 18);

    /**
     * @dev 0.00000001 ArbiFLUX minted/block/1 FLUX
     * @dev 10^18 / 10^8 = 10^10
     */
    uint256 private constant _mintPerBlockDivisor = 10 ** 8;

    /**
     * @dev To avoid small ArbiFLUX/FLUX burn ratios we multiply the ratios by this number.
     */
    uint256 private constant _ratioMultiplier = 10 ** 10;

    /**
     * @dev To get 4 decimals on our multipliers we'll multiply all ratios & divide ratios by this number.
	 * @dev This is done because we're using integers without any decimals.
     */
    uint256 private constant _percentMultiplier = 10000;

    /**
     * @dev This is our max 10x ArbiFLUX burn multiplier. It's multiplicative with the time multiplier.
     */
    uint256 private constant _maxBurnMultiplier = 100000;

    /**
     * @dev This is our max 3x FLUX lock-in time multiplier. It's multiplicative with the burn multiplier.
     */
	uint256 private constant _maxTimeMultiplier = 30000;

	/**
	 * @dev How does time reward bonus scales? This is the "2x" in the "1x base + (0x to 2x bonus) = max 3x"
	 */
	uint256 private constant  _targetBlockMultiplier = 20000;
    
    /**
     * @dev PUBLIC FACING: By making addressLocks public we can access elements through the contract view (vs having to create methods)
     */
    mapping (address => AddressLock) public addressLocks;
    
    /**
     * @dev PUBLIC FACING: Store how much locked in FLUX there is globally
     */
    uint256 public globalLockedAmount;
    
    /**
     * @dev PUBLIC FACING: Store how much is burned globally (only from the locked-in FLUX addresses)
     */
    uint256 public globalBurnedAmount;

    // Events
    event Locked(address sender, uint256 blockNumber, address minterAddress, uint256 amount, uint256 burnedAmountIncrease);
    event Unlocked(address sender, uint256 amount, uint256 burnedAmountDecrease);
    event BurnedToAddress(address sender, address targetAddress, uint256 amount);
    event Minted(address sender, uint256 blockNumber, address sourceAddress, address targetAddress, uint256 targetBlock, uint256 amount);
    
    //////////////////// END HEADER //////////////////////

	/**
	 * @dev PUBLIC FACING: Lock-in FLUX tokens with the specified address as the minter.
	 */
    function lock(address minterAddress, uint256 amount) 
        preventRecursion 
        preventSameBlock(_msgSender())
        requireLocked(_msgSender(), false) // Ensure FLUX is unlocked for sender
    public {
        require(amount > 0, "You must provide a positive amount to lock-in");

        // Ensure you can only lock up to 100 FLUX during failsafe period
        if (block.number < _failsafeTargetBlock) {
            require(amount <= _failsafeMaxAmount, "You can only lock-in up to 100 FLUX during failsafe.");
        }

        AddressLock storage senderAddressLock = addressLocks[_msgSender()]; // Shortcut accessor

        senderAddressLock.amount = amount;
        senderAddressLock.blockNumber = block.number;
        senderAddressLock.lastMintBlockNumber = block.number; // Reset the last mint height to new lock height
        senderAddressLock.minterAddress = minterAddress;
        
        globalLockedAmount = globalLockedAmount.add(amount);
        globalBurnedAmount = globalBurnedAmount.add(senderAddressLock.burnedAmount);

        emit Locked(_msgSender(), block.number, minterAddress, amount, senderAddressLock.burnedAmount);

        // Send [amount] of FLUX token from the address that is calling this function to ArbiFLUX smart contract.
        IERC777(_token).operatorSend(_msgSender(), address(this), amount, "", ""); // [RE-ENTRANCY WARNING] external call, must be at the end
    }
    
	/**
	 * @dev PUBLIC FACING: Unlock any sender locked-in FLUX tokens
	 */
    function unlock() 
        preventRecursion 
        preventSameBlock(_msgSender())
        requireLocked(_msgSender(), true)  // Ensure FLUX is locked-in for sender
    public {
        AddressLock storage senderAddressLock = addressLocks[_msgSender()]; // Shortcut accessor

        uint256 amount = senderAddressLock.amount;
        senderAddressLock.amount = 0;

        globalLockedAmount = globalLockedAmount.sub(amount);
        globalBurnedAmount = globalBurnedAmount.sub(senderAddressLock.burnedAmount);

        emit Unlocked(_msgSender(), amount, senderAddressLock.burnedAmount);

        // Send back the locked-in FLUX amount to person calling the method
        IERC777(_token).send(_msgSender(), amount, ""); // [RE-ENTRANCY WARNING] external call, must be at the end       
    }

	/**
	 * @dev PUBLIC FACING: Burn ArbiFLUX tokens to a specific address
	 */
    function burnToAddress(address targetAddress, uint256 amount) 
        preventRecursion 
        requireLocked(targetAddress, true) // Ensure the address you are burning to has FLUX locked-in
    public {
        require(amount > 0, "You must burn > 0 ArbiFLUX");

        AddressLock storage targetAddressLock = addressLocks[targetAddress]; // Shortcut accessor, pay attention to targetAddress here
        
        targetAddressLock.burnedAmount = targetAddressLock.burnedAmount.add(amount);

        globalBurnedAmount = globalBurnedAmount.add(amount);
        
        emit BurnedToAddress(_msgSender(), targetAddress, amount);

        // Call the normal ERC-777 burn (this will destroy ArbiFLUX tokens). We don't check address balance for amount because the internal burn does this check for us.
        _burn(_msgSender(), amount, "", ""); // [RE-ENTRANCY WARNING] external call, must be at the end      
    }

	/**
	 * @dev PUBLIC FACING: Mint ArbiFLUX tokens from a specific address to a specified address UP TO the target block
	 */
    function mintToAddress(address sourceAddress, address targetAddress, uint256 targetBlock) 
        preventRecursion 
        preventSameBlock(sourceAddress)
        requireLocked(sourceAddress, true) // Ensure the adress that is being minted from has FLUX locked-in
    public {
        require(targetBlock <= block.number, "You can only mint up to current block");
        
        AddressLock storage sourceAddressLock = addressLocks[sourceAddress]; // Shortcut accessor, pay attention to sourceAddress here
        
        require(sourceAddressLock.lastMintBlockNumber < targetBlock, "You can only mint ahead of last mint block");
        require(sourceAddressLock.minterAddress == _msgSender(), "You must be the delegated minter of the sourceAddress");

        uint256 mintAmount = getMintAmount(sourceAddress, targetBlock);
        require(mintAmount > 0, "You can not mint zero balance");
        
        sourceAddressLock.lastMintBlockNumber = targetBlock; // Reset the mint height

        emit Minted(_msgSender(), block.number, sourceAddress, targetAddress, targetBlock, mintAmount);

        // Call the normal ERC-777 mint (this will mint ArbiFLUX tokens to targetAddress)
        _mint(targetAddress, mintAmount, "", ""); // [RE-ENTRANCY WARNING] external call, must be at the end      
    }

    //////////////////// VIEW ONLY //////////////////////

	/**
	 * @dev PUBLIC FACING: Get mint amount of a specific amount up to a target block
	 */
    function getMintAmount(address targetAddress, uint256 targetBlock) public view returns(uint256) {
        AddressLock storage targetAddressLock = addressLocks[targetAddress]; // Shortcut accessor

        // Ensure this address has FLUX locked-in
        if (targetAddressLock.amount == 0) {
            return 0;
        }

        require(targetBlock <= block.number, "You can only calculate up to current block");
        require(targetAddressLock.lastMintBlockNumber <= targetBlock, "You can only specify blocks at or ahead of last mint block");

        uint256 blocksMinted = targetBlock.sub(targetAddressLock.lastMintBlockNumber);

        uint256 amount = targetAddressLock.amount; // Total of locked-in FLUX for this address
        uint256 blocksMintedByAmount = amount.mul(blocksMinted);

        // Adjust by multipliers
        uint256 burnMultiplier = getAddressBurnMultiplier(targetAddress);
        uint256 timeMultipler = getAddressTimeMultiplier(targetAddress);
        uint256 fluxAfterMultiplier = blocksMintedByAmount.mul(burnMultiplier).div(_percentMultiplier).mul(timeMultipler).div(_percentMultiplier);

        uint256 actualFluxMinted = fluxAfterMultiplier.div(_mintPerBlockDivisor);
        return actualFluxMinted;
    }
    
	/**
	 * @dev PUBLIC FACING: Find out the current address FLUX lock-in time bonus (Using 1 block = 15 sec formula)
	 */
    function getAddressTimeMultiplier(address targetAddress) public view returns(uint256) {
        AddressLock storage targetAddressLock = addressLocks[targetAddress]; // Shortcut accessor

        // Ensure this address has FLUX locked-in
        if (targetAddressLock.amount == 0) {
            return _percentMultiplier;
        }
        
        // You don't get any bonus until min blocks passed
        uint256 targetBlockNumber = targetAddressLock.blockNumber.add(_startTimeReward);
        if (block.number < targetBlockNumber) {
            return _percentMultiplier;
        }

        // 24 hours - min before starting to receive rewards
        // 28 days - max for waiting 28 days (The function returns PERCENT (10000x) the multiplier for 4 decimal accuracy
        uint256 blockDiff = block.number.sub(targetBlockNumber).mul(_targetBlockMultiplier).div(_maxTimeReward).add(_percentMultiplier); 

        uint256 timeMultiplier = Math.min(_maxTimeMultiplier, blockDiff); // Min 1x, Max 3x
        return timeMultiplier;
    }

    /**
     * @dev PUBLIC FACING: Get burn multipler for a specific address. This will be returned as PERCENT (10000x)
     */
    function getAddressBurnMultiplier(address targetAddress) public view returns(uint256) {
        uint256 myRatio = getAddressRatio(targetAddress);
        uint256 globalRatio = getGlobalRatio();
        
        // Avoid division by 0 & ensure 1x multiplier if nothing is locked
        if (globalRatio == 0 || myRatio == 0) {
            return _percentMultiplier;
        }

        // The final multiplier is return with 10000x multiplication and will need to be divided by 10000 for final number
        uint256 burnMultiplier = Math.min(_maxBurnMultiplier, myRatio.mul(_percentMultiplier).div(globalRatio).add(_percentMultiplier)); // Min 1x, Max 10x
        return burnMultiplier;
    }

    /**
     * @dev PUBLIC FACING: Get FLUX/ArbiFLUX burn ratio for a specific address
     */
    function getAddressRatio(address targetAddress) public view returns(uint256) {
        AddressLock storage targetAddressLock = addressLocks[targetAddress]; // Shortcut accessor

        uint256 addressLockedAmount = targetAddressLock.amount;
        uint256 addressBurnedAmount = targetAddressLock.burnedAmount;

        // If you haven't minted or burned anything then you get the default 1x multiplier
        if (addressLockedAmount == 0) {
            return 0;
        }

        // Burn/Lock-in ratios for both address & network
        // Note that we multiply both ratios by the ratio multiplier before dividing. For tiny ArbiFLUX/FLUX burn ratios.
        uint256 myRatio = addressBurnedAmount.mul(_ratioMultiplier).div(addressLockedAmount);
        return myRatio;
    }

    /**
     * @dev PUBLIC FACING: Get FLUX/ArbiFLUX burn ratio for global (entire network)
     */
    function getGlobalRatio() public view returns(uint256) {
        // If you haven't minted or burned anything then you get the default 1x multiplier
        if (globalLockedAmount == 0) {
            return 0;
        }

        // Burn/Lock-in ratios for both address & network
        // Note that we multiply both ratios by the ratio multiplier before dividing. For tiny ArbiFLUX/FLUX burn ratios.
        uint256 globalRatio = globalBurnedAmount.mul(_ratioMultiplier).div(globalLockedAmount);
        return globalRatio;
    }

    /**
     * @dev PUBLIC FACING: Grab a collection of data
     * @dev ABIEncoderV2 was still experimental at time of writing this. Better approach would be to return struct.
     */
    function getAddressDetails(address targetAddress) public view returns(uint256,uint256,uint256,uint256,uint256,uint256,uint256) {
        uint256 fluxBalance = balanceOf(targetAddress);
        uint256 mintAmount = getMintAmount(targetAddress, block.number);

        uint256 addressTimeMultiplier = getAddressTimeMultiplier(targetAddress);
        uint256 addressBurnMultiplier = getAddressBurnMultiplier(targetAddress);

        return (
            block.number, 
            fluxBalance, 
            mintAmount, 
            addressTimeMultiplier,
            addressBurnMultiplier,
            globalLockedAmount, 
            globalBurnedAmount);
    }
    
    /**
     * @dev PUBLIC FACING: Grab additional token details
     * @dev ABIEncoderV2 was still experimental at time of writing this. Better approach would be to return struct.
     */
    function getAddressTokenDetails(address targetAddress) public view returns(uint256,bool,uint256,uint256,uint256) {
        bool isFluxOperator = IERC777(_token).isOperatorFor(address(this), targetAddress);
        uint256 damBalance = IERC777(_token).balanceOf(targetAddress);

        uint256 myRatio = getAddressRatio(targetAddress);
        uint256 globalRatio = getGlobalRatio();

        return (
            block.number, 
            isFluxOperator, 
            damBalance,
            myRatio,
            globalRatio);
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"startTimeReward","type":"uint256"},{"internalType":"uint256","name":"maxTimeReward","type":"uint256"},{"internalType":"uint256","name":"failsafeBlockDuration","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"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":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"tokenHolder","type":"address"}],"name":"AuthorizedOperator","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"operatorData","type":"bytes"}],"name":"Burned","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address","name":"targetAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BurnedToAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"blockNumber","type":"uint256"},{"indexed":false,"internalType":"address","name":"minterAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"burnedAmountIncrease","type":"uint256"}],"name":"Locked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"blockNumber","type":"uint256"},{"indexed":false,"internalType":"address","name":"sourceAddress","type":"address"},{"indexed":false,"internalType":"address","name":"targetAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"targetBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Minted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"operatorData","type":"bytes"}],"name":"Minted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"tokenHolder","type":"address"}],"name":"RevokedOperator","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"},{"indexed":false,"internalType":"bytes","name":"operatorData","type":"bytes"}],"name":"Sent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"burnedAmountDecrease","type":"uint256"}],"name":"Unlocked","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressLocks","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"burnedAmount","type":"uint256"},{"internalType":"uint256","name":"blockNumber","type":"uint256"},{"internalType":"uint256","name":"lastMintBlockNumber","type":"uint256"},{"internalType":"address","name":"minterAddress","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"holder","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":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"authorizeOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenHolder","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"targetAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnToAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"defaultOperators","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"targetAddress","type":"address"}],"name":"getAddressBurnMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"targetAddress","type":"address"}],"name":"getAddressDetails","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"targetAddress","type":"address"}],"name":"getAddressRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"targetAddress","type":"address"}],"name":"getAddressTimeMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"targetAddress","type":"address"}],"name":"getAddressTokenDetails","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getGlobalRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"targetAddress","type":"address"},{"internalType":"uint256","name":"targetBlock","type":"uint256"}],"name":"getMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"globalBurnedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"globalLockedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"granularity","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"tokenHolder","type":"address"}],"name":"isOperatorFor","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"minterAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sourceAddress","type":"address"},{"internalType":"address","name":"targetAddress","type":"address"},{"internalType":"uint256","name":"targetBlock","type":"uint256"}],"name":"mintToAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"bytes","name":"operatorData","type":"bytes"}],"name":"operatorBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"bytes","name":"operatorData","type":"bytes"}],"name":"operatorSend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"revokeOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"send","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"tokensReceived","outputs":[],"stateMutability":"nonpayable","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":"holder","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":[],"name":"unlock","outputs":[],"stateMutability":"nonpayable","type":"function"}]

610100604052600a80546001600160a01b031916731820a4b7618bde71dce8cdc73aab6c95905fad241790553480156200003857600080fd5b50604051620041a3380380620041a3833981810160405260808110156200005e57600080fd5b50805160208083015160408085015160609095015181518083018352600880825267082e4c4d28c98aab60c31b8287018181528551808701875292835282880191909152845160008152968701909452815196979496949592949193909291620000cb916002916200040f565b508151620000e19060039060208501906200040f565b508051620000f790600490602084019062000494565b5060005b6004548110156200015757600160056000600484815481106200011a57fe5b6000918252602080832091909101546001600160a01b031683528201929092526040019020805460ff1916911515919091179055600101620000fb565b50604080516a22a9219b9b9baa37b5b2b760a91b8152815190819003600b0181206329965a1d60e01b82523060048301819052602483019190915260448201529051731820a4b7618bde71dce8cdc73aab6c95905fad24916329965a1d91606480830192600092919082900301818387803b158015620001d657600080fd5b505af1158015620001eb573d6000803e3d6000fd5b5050604080516922a92199182a37b5b2b760b11b8152815190819003600a0181206329965a1d60e01b82523060048301819052602483019190915260448201529051731820a4b7618bde71dce8cdc73aab6c95905fad2493506329965a1d9250606480830192600092919082900301818387803b1580156200026c57600080fd5b505af115801562000281573d6000803e3d6000fd5b5050505050505060008211620002c95760405162461bcd60e51b81526004018080602001828103825260268152602001806200417d6026913960400191505060405180910390fd5b606084901b6001600160601b03191660805260a083905260c0829052620002fd4382620003ad602090811b6200273a17901c565b60e052600a54604080517f455243373737546f6b656e73526563697069656e740000000000000000000000815281519081900360150181206329965a1d60e01b825230600483018190526024830191909152604482015290516001600160a01b03909216916329965a1d9160648082019260009290919082900301818387803b1580156200038a57600080fd5b505af11580156200039f573d6000803e3d6000fd5b505050505050505062000541565b60008282018381101562000408576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200045257805160ff191683800117855562000482565b8280016001018555821562000482579182015b828111156200048257825182559160200191906001019062000465565b5062000490929150620004fa565b5090565b828054828255906000526020600020908101928215620004ec579160200282015b82811115620004ec57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190620004b5565b50620004909291506200051a565b6200051791905b8082111562000490576000815560010162000501565b90565b6200051791905b80821115620004905780546001600160a01b031916815560010162000521565b60805160601c60a05160c05160e051613bef6200058e600039806112e052508061169952508061164c525080610bf552806114355280611df2528061231c52806123fe5250613bef6000f3fe608060405234801561001057600080fd5b50600436106101fa5760003560e01c806370a082311161011a578063a69df4b5116100ad578063d95b63711161007c578063d95b637114610949578063dd62ed3e14610977578063fad8b32a146109a5578063fc673c4f146109cb578063fe9d930314610b09576101fa565b8063a69df4b51461088e578063a9059cbb14610896578063aff510a7146108c2578063be6ca56d146108f8576101fa565b80638238ba80116100e95780638238ba801461074d578063959b8c3f146107a757806395d89b41146107cd5780639bd9bbc6146107d5576101fa565b806370a08231146106cd578063710b2d8c146106f35780637e3fa2b9146107195780637fd2ca1314610721576101fa565b80633133e3ab1161019257806338ee5fb11161016157806338ee5fb11461054e57806345958be414610556578063556f0dc71461057c57806362ad1b8314610584576101fa565b80633133e3ab146104a4578063313ce5671461050257806332b04a0114610520578063331d7cfa14610546576101fa565b806318160ddd116101ce57806318160ddd146103fc578063195d0e281461041657806323b872dd14610442578063282d3fdf14610478576101fa565b806223de29146101ff57806306e48538146102e757806306fdde031461033f578063095ea7b3146103bc575b600080fd5b6102e5600480360360c081101561021557600080fd5b6001600160a01b03823581169260208101358216926040820135909216916060820135919081019060a081016080820135600160201b81111561025757600080fd5b82018360208201111561026957600080fd5b803590602001918460018302840111600160201b8311171561028a57600080fd5b919390929091602081019035600160201b8111156102a757600080fd5b8201836020820111156102b957600080fd5b803590602001918460018302840111600160201b831117156102da57600080fd5b509092509050610bb4565b005b6102ef610d69565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561032b578181015183820152602001610313565b505050509050019250505060405180910390f35b610347610dcc565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610381578181015183820152602001610369565b50505050905090810190601f1680156103ae5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103e8600480360360408110156103d257600080fd5b506001600160a01b038135169060200135610e56565b604080519115158252519081900360200190f35b610404610e7a565b60408051918252519081900360200190f35b6104046004803603604081101561042c57600080fd5b506001600160a01b038135169060200135610e80565b6103e86004803603606081101561045857600080fd5b506001600160a01b03813581169160208101359091169060400135610fd3565b6102e56004803603604081101561048e57600080fd5b506001600160a01b038135169060200135611156565b6104ca600480360360208110156104ba57600080fd5b50356001600160a01b0316611532565b604080519788526020880196909652868601949094526060860192909252608085015260a084015260c0830152519081900360e00190f35b61050a61158f565b6040805160ff9092168252519081900360200190f35b6104046004803603602081101561053657600080fd5b50356001600160a01b0316611594565b610404611609565b61040461160f565b6104046004803603602081101561056c57600080fd5b50356001600160a01b0316611615565b6104046116e8565b6102e5600480360360a081101561059a57600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b8111156105d457600080fd5b8201836020820111156105e657600080fd5b803590602001918460018302840111600160201b8311171561060757600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b81111561065957600080fd5b82018360208201111561066b57600080fd5b803590602001918460018302840111600160201b8311171561068c57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506116ed945050505050565b610404600480360360208110156106e357600080fd5b50356001600160a01b031661174f565b6104046004803603602081101561070957600080fd5b50356001600160a01b031661176a565b6104046117b5565b6102e56004803603604081101561073757600080fd5b506001600160a01b0381351690602001356117f2565b6107736004803603602081101561076357600080fd5b50356001600160a01b03166119df565b6040805195865260208601949094528484019290925260608401526001600160a01b03166080830152519081900360a00190f35b6102e5600480360360208110156107bd57600080fd5b50356001600160a01b0316611a17565b610347611b63565b6102e5600480360360608110156107eb57600080fd5b6001600160a01b0382351691602081013591810190606081016040820135600160201b81111561081a57600080fd5b82018360208201111561082c57600080fd5b803590602001918460018302840111600160201b8311171561084d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611bc4945050505050565b6102e5611bee565b6103e8600480360360408110156108ac57600080fd5b506001600160a01b038135169060200135611ed6565b6102e5600480360360608110156108d857600080fd5b506001600160a01b03813581169160208101359091169060400135611faf565b61091e6004803603602081101561090e57600080fd5b50356001600160a01b0316612311565b6040805195865293151560208601528484019290925260608401526080830152519081900360a00190f35b6103e86004803603604081101561095f57600080fd5b506001600160a01b03813581169160200135166124a1565b6104046004803603604081101561098d57600080fd5b506001600160a01b0381358116916020013516612543565b6102e5600480360360208110156109bb57600080fd5b50356001600160a01b031661256e565b6102e5600480360360808110156109e157600080fd5b6001600160a01b0382351691602081013591810190606081016040820135600160201b811115610a1057600080fd5b820183602082011115610a2257600080fd5b803590602001918460018302840111600160201b83111715610a4357600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b811115610a9557600080fd5b820183602082011115610aa757600080fd5b803590602001918460018302840111600160201b83111715610ac857600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506126ba945050505050565b6102e560048036036040811015610b1f57600080fd5b81359190810190604081016020820135600160201b811115610b4057600080fd5b820183602082011115610b5257600080fd5b803590602001918460018302840111600160201b83111715610b7357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550612718945050505050565b60008511610bf35760405162461bcd60e51b815260040180806020018281038252602c815260200180613a07602c913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610c25612794565b6001600160a01b031614610c80576040805162461bcd60e51b815260206004820181905260248201527f596f752063616e206f6e6c79206c6f636b2d696e20464c555820746f6b656e73604482015290519081900360640190fd5b6001600160a01b0388163014610cc75760405162461bcd60e51b81526004018080602001828103825260328152602001806139196032913960400191505060405180910390fd5b6001600160a01b0386163014610d0e5760405162461bcd60e51b81526004018080602001828103825260288152602001806137b46028913960400191505060405180910390fd5b856001600160a01b0316876001600160a01b03161415610d5f5760405162461bcd60e51b81526004018080602001828103825260328152602001806137396032913960400191505060405180910390fd5b5050505050505050565b60606004805480602002602001604051908101604052809291908181526020018280548015610dc157602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610da3575b505050505090505b90565b60028054604080516020601f6000196101006001871615020190941685900493840181900481028201810190925282815260609390929091830182828015610dc15780601f10610e2a57610100808354040283529160200191610dc1565b820191906000526020600020905b815481529060010190602001808311610e3857509395945050505050565b600080610e61612794565b9050610e6e818585612798565b60019150505b92915050565b60015490565b6001600160a01b0382166000908152600b602052604081208054610ea8576000915050610e74565b43831115610ee75760405162461bcd60e51b815260040180806020018281038252602a815260200180613b90602a913960400191505060405180910390fd5b8281600301541115610f2a5760405162461bcd60e51b815260040180806020018281038252603a815260200180613a33603a913960400191505060405180910390fd5b6000610f4382600301548561288490919063ffffffff16565b82549091506000610f5a828463ffffffff6128c616565b90506000610f6788611594565b90506000610f7489611615565b90506000610fac612710610f9484610fa083838a8a63ffffffff6128c616565b9063ffffffff61291f16565b9063ffffffff6128c616565b90506000610fc4826305f5e10063ffffffff61291f16565b9b9a5050505050505050505050565b60006001600160a01b03831661101a5760405162461bcd60e51b81526004018080602001828103825260248152602001806139e36024913960400191505060405180910390fd5b6001600160a01b03841661105f5760405162461bcd60e51b8152600401808060200182810382526026815260200180613af06026913960400191505060405180910390fd5b6000611069612794565b9050611097818686866040518060200160405280600081525060405180602001604052806000815250612961565b6110c3818686866040518060200160405280600081525060405180602001604052806000815250612ba9565b61111d858261111886604051806060016040528060298152602001613ac7602991396001600160a01b03808c166000908152600860209081526040808320938b1683529290522054919063ffffffff612dce16565b612798565b61114b8186868660405180602001604052806000815250604051806020016040528060008152506000612e65565b506001949350505050565b60096000611162612794565b6001600160a01b0316815260208101919091526040016000205460ff1661152e57600160096000611191612794565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790556111c1612794565b6001600160a01b0381166000908152600b6020526040902060020154431480159061120757506001600160a01b0381166000908152600b60205260409020600301544314155b6112425760405162461bcd60e51b815260040180806020018281038252602e815260200180613a6d602e913960400191505060405180910390fd5b61124a612794565b6001600160a01b0381166000908152600b60205260408120541561129f5760405162461bcd60e51b815260040180806020018281038252602781526020018061384f6027913960400191505060405180910390fd5b600084116112de5760405162461bcd60e51b815260040180806020018281038252602d8152602001806137dc602d913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000043101561134e5768056bc75e2d6310000084111561134e5760405162461bcd60e51b8152600401808060200182810382526034815260200180613b396034913960400191505060405180910390fd5b6000600b600061135c612794565b6001600160a01b0390811682526020820192909252604001600020868155436002820181905560038201556004810180546001600160a01b03191692891692909217909155600c549091506113b1908661273a565b600c556001810154600d546113cb9163ffffffff61273a16565b600d557f839301d49a1ea695b991657eb992fdd6280a423122f6d73152cd912b0fdb79706113f7612794565b6001830154604080516001600160a01b039384168152436020820152928a1683820152606083018990526080830191909152519081900360a00190a17f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166362ad1b8361146a612794565b6040805160e084811b6001600160e01b03191682526001600160a01b03939093166004820152306024820152604481018a905260a06064820152600060a48201819052608482019390935260e481018390529051610124808301939282900301818387803b1580156114db57600080fd5b505af11580156114ef573d6000803e3d6000fd5b5050505050505050600060096000611505612794565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790555b5050565b6000806000806000806000806115478961174f565b905060006115558a43610e80565b905060006115628b611615565b9050600061156f8c611594565b600c54600d54439f969e50949c50929a5098509096509094509092505050565b601290565b6000806115a08361176a565b905060006115ac6117b5565b90508015806115b9575081155b156115ca5761271092505050611604565b60006115fe620186a06115f96127106115ed86610f94898463ffffffff6128c616565b9063ffffffff61273a16565b6130fb565b93505050505b919050565b600c5481565b600d5481565b6001600160a01b0381166000908152600b60205260408120805461163e57612710915050611604565b6002810154600090611676907f000000000000000000000000000000000000000000000000000000000000000063ffffffff61273a16565b90508043101561168c5761271092505050611604565b60006116ce6127106115ed7f0000000000000000000000000000000000000000000000000000000000000000610f94614e20610fa0438963ffffffff61288416565b905060006116de617530836130fb565b9695505050505050565b600190565b6116fe6116f8612794565b866124a1565b6117395760405162461bcd60e51b815260040180806020018281038252602c815260200180613a9b602c913960400191505060405180910390fd5b61174885858585856001613111565b5050505050565b6001600160a01b031660009081526020819052604090205490565b6001600160a01b0381166000908152600b60205260408120805460018201548161179a5760009350505050611604565b60006116de83610f94846402540be40063ffffffff6128c616565b6000600c54600014156117ca57506000610dc9565b60006117ec600c54610f946402540be400600d546128c690919063ffffffff16565b91505090565b600960006117fe612794565b6001600160a01b0316815260208101919091526040016000205460ff1661152e5760016009600061182d612794565b6001600160a01b031681526020810191909152604001600020805491151560ff199092169190911790558160016001600160a01b0382166000908152600b60205260409020546118ae5760405162461bcd60e51b81526004018080602001828103825260288152602001806138f16028913960400191505060405180910390fd5b60008311611903576040805162461bcd60e51b815260206004820152601a60248201527f596f75206d757374206275726e203e20302041726269464c5558000000000000604482015290519081900360640190fd5b6001600160a01b0384166000908152600b602052604090206001810154611930908563ffffffff61273a16565b6001820155600d54611948908563ffffffff61273a16565b600d557f0988e44904d6f878152b5838c395fd103556e89960b84cca544f25bb8e14544d611974612794565b604080516001600160a01b0392831681529188166020830152818101879052519081900360600190a16119ce6119a8612794565b8560405180602001604052806000815250604051806020016040528060008152506131e8565b505050600060096000611505612794565b600b6020526000908152604090208054600182015460028301546003840154600490940154929391929091906001600160a01b031685565b806001600160a01b0316611a29612794565b6001600160a01b03161415611a6f5760405162461bcd60e51b815260040180806020018281038252602481526020018061382b6024913960400191505060405180910390fd5b6001600160a01b03811660009081526005602052604090205460ff1615611ad25760076000611a9c612794565b6001600160a01b03908116825260208083019390935260409182016000908120918516815292529020805460ff19169055611b19565b600160066000611ae0612794565b6001600160a01b03908116825260208083019390935260409182016000908120918616815292529020805460ff19169115159190911790555b611b21612794565b6001600160a01b0316816001600160a01b03167ff4caeb2d6ca8932a215a353d0703c326ec2d81fc68170f320eb2ab49e9df61f960405160405180910390a350565b60038054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610dc15780601f10610e2a57610100808354040283529160200191610dc1565b611be9611bcf612794565b848484604051806020016040528060008152506001613111565b505050565b60096000611bfa612794565b6001600160a01b0316815260208101919091526040016000205460ff16611ed457600160096000611c29612794565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055611c59612794565b6001600160a01b0381166000908152600b60205260409020600201544314801590611c9f57506001600160a01b0381166000908152600b60205260409020600301544314155b611cda5760405162461bcd60e51b815260040180806020018281038252602e815260200180613a6d602e913960400191505060405180910390fd5b611ce2612794565b60016001600160a01b0382166000908152600b6020526040902054611d385760405162461bcd60e51b81526004018080602001828103825260288152602001806138f16028913960400191505060405180910390fd5b6000600b6000611d46612794565b6001600160a01b03168152602081019190915260400160009081208054918155600c54909250611d7c908263ffffffff61288416565b600c556001820154600d54611d969163ffffffff61288416565b600d557f3f2f29fa02cc34566ac167b446be0be9e0254cac18eda93b2dfe6a7a7c8affb9611dc2612794565b6001840154604080516001600160a01b0390931683526020830185905282810191909152519081900360600190a17f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316639bd9bbc6611e27612794565b604080516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820185905260606044830152600060648301819052905160a48084019382900301818387803b158015611e8057600080fd5b505af1158015611e94573d6000803e3d6000fd5b505050505050505050600060096000611eab612794565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790555b565b60006001600160a01b038316611f1d5760405162461bcd60e51b81526004018080602001828103825260248152602001806139e36024913960400191505060405180910390fd5b6000611f27612794565b9050611f55818286866040518060200160405280600081525060405180602001604052806000815250612961565b611f81818286866040518060200160405280600081525060405180602001604052806000815250612ba9565b610e6e8182868660405180602001604052806000815250604051806020016040528060008152506000612e65565b60096000611fbb612794565b6001600160a01b0316815260208101919091526040016000205460ff16611be957600160096000611fea612794565b6001600160a01b03908116825260208083019390935260409182016000908120805460ff19169515159590951790945586168352600b9091529020600201548390431480159061205557506001600160a01b0381166000908152600b60205260409020600301544314155b6120905760405162461bcd60e51b815260040180806020018281038252602e815260200180613a6d602e913960400191505060405180910390fd5b8360016001600160a01b0382166000908152600b60205260409020546120e75760405162461bcd60e51b81526004018080602001828103825260288152602001806138f16028913960400191505060405180910390fd5b438411156121265760405162461bcd60e51b81526004018080602001828103825260258152602001806138cc6025913960400191505060405180910390fd5b6001600160a01b0386166000908152600b60205260409020600381015485116121805760405162461bcd60e51b815260040180806020018281038252602a8152602001806139b9602a913960400191505060405180910390fd5b612188612794565b60048201546001600160a01b039081169116146121d65760405162461bcd60e51b81526004018080602001828103825260358152602001806138766035913960400191505060405180910390fd5b60006121e28887610e80565b905060008111612239576040805162461bcd60e51b815260206004820152601d60248201527f596f752063616e206e6f74206d696e74207a65726f2062616c616e6365000000604482015290519081900360640190fd5b600382018690557f362b95f53c81f53b3bf4a4ee37bdb0d75f2ecd94ae81b2a82579218fbedf99ed612269612794565b604080516001600160a01b039283168152436020820152828c1681830152918a1660608301526080820189905260a08201849052519081900360c00190a16122d18782604051806020016040528060008152506040518060200160405280600081525061342e565b50505050506000600960006122e4612794565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055505050565b6000806000806000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d95b637130896040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b03168152602001826001600160a01b03166001600160a01b031681526020019250505060206040518083038186803b1580156123aa57600080fd5b505afa1580156123be573d6000803e3d6000fd5b505050506040513d60208110156123d457600080fd5b5051604080516370a0823160e01b81526001600160a01b038a8116600483015291519293506000927f0000000000000000000000000000000000000000000000000000000000000000909216916370a0823191602480820192602092909190829003018186803b15801561244757600080fd5b505afa15801561245b573d6000803e3d6000fd5b505050506040513d602081101561247157600080fd5b5051905060006124808961176a565b9050600061248c6117b5565b439b949a509298509096509094509092505050565b6000816001600160a01b0316836001600160a01b0316148061250c57506001600160a01b03831660009081526005602052604090205460ff16801561250c57506001600160a01b0380831660009081526007602090815260408083209387168352929052205460ff16155b8061253c57506001600160a01b0380831660009081526006602090815260408083209387168352929052205460ff165b9392505050565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205490565b612576612794565b6001600160a01b0316816001600160a01b031614156125c65760405162461bcd60e51b81526004018080602001828103825260218152602001806138ab6021913960400191505060405180910390fd5b6001600160a01b03811660009081526005602052604090205460ff1615612632576001600760006125f5612794565b6001600160a01b03908116825260208083019390935260409182016000908120918616815292529020805460ff1916911515919091179055612670565b6006600061263e612794565b6001600160a01b03908116825260208083019390935260409182016000908120918516815292529020805460ff191690555b612678612794565b6001600160a01b0316816001600160a01b03167f50546e66e5f44d728365dc3908c63bc5cfeeab470722c1677e3073a6ac294aa160405160405180910390a350565b6126cb6126c5612794565b856124a1565b6127065760405162461bcd60e51b815260040180806020018281038252602c815260200180613a9b602c913960400191505060405180910390fd5b612712848484846131e8565b50505050565b61152e612723612794565b8383604051806020016040528060008152506131e8565b60008282018381101561253c576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b3390565b6001600160a01b0383166127dd5760405162461bcd60e51b81526004018080602001828103825260258152602001806137146025913960400191505060405180910390fd5b6001600160a01b0382166128225760405162461bcd60e51b8152600401808060200182810382526023815260200180613b6d6023913960400191505060405180910390fd5b6001600160a01b03808416600081815260086020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b600061253c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612dce565b6000826128d557506000610e74565b828202828482816128e257fe5b041461253c5760405162461bcd60e51b815260040180806020018281038252602181526020018061394b6021913960400191505060405180910390fd5b600061253c83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613672565b6040805163555ddc6560e11b81526001600160a01b03871660048201527f29ddb589b1fb5fc7cf394961c1adf5f8c6454761adf795e67fe149f658abe89560248201529051600091731820a4b7618bde71dce8cdc73aab6c95905fad249163aabbb8ca91604480820192602092909190829003018186803b1580156129e557600080fd5b505afa1580156129f9573d6000803e3d6000fd5b505050506040513d6020811015612a0f57600080fd5b505190506001600160a01b03811615612ba057806001600160a01b03166375ab97828888888888886040518763ffffffff1660e01b815260040180876001600160a01b03166001600160a01b03168152602001866001600160a01b03166001600160a01b03168152602001856001600160a01b03166001600160a01b031681526020018481526020018060200180602001838103835285818151815260200191508051906020019080838360005b83811015612ad5578181015183820152602001612abd565b50505050905090810190601f168015612b025780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b83811015612b35578181015183820152602001612b1d565b50505050905090810190601f168015612b625780820380516001836020036101000a031916815260200191505b5098505050505050505050600060405180830381600087803b158015612b8757600080fd5b505af1158015612b9b573d6000803e3d6000fd5b505050505b50505050505050565b612bb586868686612712565b612bf88360405180606001604052806027815260200161378d602791396001600160a01b038816600090815260208190526040902054919063ffffffff612dce16565b6001600160a01b038087166000908152602081905260408082209390935590861681522054612c2d908463ffffffff61273a16565b600080866001600160a01b03166001600160a01b0316815260200190815260200160002081905550836001600160a01b0316856001600160a01b0316876001600160a01b03167f06b541ddaa720db2b10a4d0cdac39b8d360425fc073085fac19bc82614677987868686604051808481526020018060200180602001838103835285818151815260200191508051906020019080838360005b83811015612cde578181015183820152602001612cc6565b50505050905090810190601f168015612d0b5780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b83811015612d3e578181015183820152602001612d26565b50505050905090810190601f168015612d6b5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a4836001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a3505050505050565b60008184841115612e5d5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612e22578181015183820152602001612e0a565b50505050905090810190601f168015612e4f5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6040805163555ddc6560e11b81526001600160a01b03871660048201527fb281fc8c12954d22544db45de3159a39272895b169a852b314f9cc762e44c53b60248201529051600091731820a4b7618bde71dce8cdc73aab6c95905fad249163aabbb8ca91604480820192602092909190829003018186803b158015612ee957600080fd5b505afa158015612efd573d6000803e3d6000fd5b505050506040513d6020811015612f1357600080fd5b505190506001600160a01b038116156130a757806001600160a01b03166223de298989898989896040518763ffffffff1660e01b815260040180876001600160a01b03166001600160a01b03168152602001866001600160a01b03166001600160a01b03168152602001856001600160a01b03166001600160a01b031681526020018481526020018060200180602001838103835285818151815260200191508051906020019080838360005b83811015612fd8578181015183820152602001612fc0565b50505050905090810190601f1680156130055780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b83811015613038578181015183820152602001613020565b50505050905090810190601f1680156130655780820380516001836020036101000a031916815260200191505b5098505050505050505050600060405180830381600087803b15801561308a57600080fd5b505af115801561309e573d6000803e3d6000fd5b50505050610d5f565b8115610d5f576130bf866001600160a01b03166136d7565b15610d5f5760405162461bcd60e51b815260040180806020018281038252604d81526020018061396c604d913960600191505060405180910390fd5b600081831061310a578161253c565b5090919050565b6001600160a01b0386166131565760405162461bcd60e51b815260040180806020018281038252602281526020018061376b6022913960400191505060405180910390fd5b6001600160a01b0385166131b1576040805162461bcd60e51b815260206004820181905260248201527f4552433737373a2073656e6420746f20746865207a65726f2061646472657373604482015290519081900360640190fd5b60006131bb612794565b90506131cb818888888888612961565b6131d9818888888888612ba9565b612ba081888888888888612e65565b6001600160a01b03841661322d5760405162461bcd60e51b81526004018080602001828103825260228152602001806138096022913960400191505060405180910390fd5b6000613237612794565b90506132468186600087612712565b61325581866000878787612961565b61329884604051806060016040528060238152602001613b16602391396001600160a01b038816600090815260208190526040902054919063ffffffff612dce16565b6001600160a01b0386166000908152602081905260409020556001546132c4908563ffffffff61288416565b600181905550846001600160a01b0316816001600160a01b03167fa78a9be3a7b862d26933ad85fb11d80ef66b8f972d7cbba06621d583943a4098868686604051808481526020018060200180602001838103835285818151815260200191508051906020019080838360005b83811015613349578181015183820152602001613331565b50505050905090810190601f1680156133765780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b838110156133a9578181015183820152602001613391565b50505050905090810190601f1680156133d65780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a36040805185815290516000916001600160a01b038816917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050505050565b6001600160a01b038416613489576040805162461bcd60e51b815260206004820181905260248201527f4552433737373a206d696e7420746f20746865207a65726f2061646472657373604482015290519081900360640190fd5b6000613493612794565b90506134a28160008787612712565b6001546134b5908563ffffffff61273a16565b6001556001600160a01b0385166000908152602081905260409020546134e1908563ffffffff61273a16565b6001600160a01b03861660009081526020819052604081209190915561350e908290878787876001612e65565b846001600160a01b0316816001600160a01b03167f2fe5be0146f74c5bce36c0b80911af6c7d86ff27e89d5cfa61fc681327954e5d868686604051808481526020018060200180602001838103835285818151815260200191508051906020019080838360005b8381101561358d578181015183820152602001613575565b50505050905090810190601f1680156135ba5780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b838110156135ed5781810151838201526020016135d5565b50505050905090810190601f16801561361a5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a36040805185815290516001600160a01b038716916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050505050565b600081836136c15760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315612e22578181015183820152602001612e0a565b5060008385816136cd57fe5b0495945050505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159061370b57508115155b94935050505056fe4552433737373a20617070726f76652066726f6d20746865207a65726f206164647265737357687920776f756c642041726269464c555820636f6e74726163742073656e6420746f6b656e7320746f20697473656c663f4552433737373a2073656e642066726f6d20746865207a65726f20616464726573734552433737373a207472616e7366657220616d6f756e7420657863656564732062616c616e636546756e6473206d75737420626520636f6d696e6720696e746f2041726269464c555820746f6b656e596f75206d7573742070726f76696465206120706f73697469766520616d6f756e7420746f206c6f636b2d696e4552433737373a206275726e2066726f6d20746865207a65726f20616464726573734552433737373a20617574686f72697a696e672073656c66206173206f70657261746f72596f75206d757374206861766520756e6c6f636b656420796f757220464c555820746f6b656e73596f75206d757374206265207468652064656c656761746564206d696e746572206f662074686520736f75726365416464726573734552433737373a207265766f6b696e672073656c66206173206f70657261746f72596f752063616e206f6e6c79206d696e7420757020746f2063757272656e7420626c6f636b596f75206d7573742068617665206c6f636b65642d696e20796f757220464c555820746f6b656e734f6e6c792041726269464c555820636f6e74726163742063616e2073656e6420697473656c6620464c555820746f6b656e73536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774552433737373a20746f6b656e20726563697069656e7420636f6e747261637420686173206e6f20696d706c656d656e74657220666f7220455243373737546f6b656e73526563697069656e74596f752063616e206f6e6c79206d696e74206168656164206f66206c617374206d696e7420626c6f636b4552433737373a207472616e7366657220746f20746865207a65726f2061646472657373596f75206d7573742072656365697665206120706f736974697665206e756d626572206f6620746f6b656e73596f752063616e206f6e6c79207370656369667920626c6f636b73206174206f72206168656164206f66206c617374206d696e7420626c6f636b596f752063616e206e6f74206c6f636b2f756e6c6f636b2f6d696e7420696e207468652073616d6520626c6f636b4552433737373a2063616c6c6572206973206e6f7420616e206f70657261746f7220666f7220686f6c6465724552433737373a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654552433737373a207472616e736665722066726f6d20746865207a65726f20616464726573734552433737373a206275726e20616d6f756e7420657863656564732062616c616e6365596f752063616e206f6e6c79206c6f636b2d696e20757020746f2031303020464c555820647572696e67206661696c736166652e4552433737373a20617070726f766520746f20746865207a65726f2061646472657373596f752063616e206f6e6c792063616c63756c61746520757020746f2063757272656e7420626c6f636ba26469706673582212209a443e8f1673384126ace78d3da1f585a17cbca92ca3cadaa317a1c76e95578b64736f6c634300060900336d617854696d65526577617264206d757374206265206174206c65617374203120626c6f636b000000000000000000000000f80d589b3dbe130c270a69f1a69d050f268786df000000000000000000000000000000000000000000000000000000000000168000000000000000000000000000000000000000000000000000000000000276000000000000000000000000000000000000000000000000000000000000027600

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101fa5760003560e01c806370a082311161011a578063a69df4b5116100ad578063d95b63711161007c578063d95b637114610949578063dd62ed3e14610977578063fad8b32a146109a5578063fc673c4f146109cb578063fe9d930314610b09576101fa565b8063a69df4b51461088e578063a9059cbb14610896578063aff510a7146108c2578063be6ca56d146108f8576101fa565b80638238ba80116100e95780638238ba801461074d578063959b8c3f146107a757806395d89b41146107cd5780639bd9bbc6146107d5576101fa565b806370a08231146106cd578063710b2d8c146106f35780637e3fa2b9146107195780637fd2ca1314610721576101fa565b80633133e3ab1161019257806338ee5fb11161016157806338ee5fb11461054e57806345958be414610556578063556f0dc71461057c57806362ad1b8314610584576101fa565b80633133e3ab146104a4578063313ce5671461050257806332b04a0114610520578063331d7cfa14610546576101fa565b806318160ddd116101ce57806318160ddd146103fc578063195d0e281461041657806323b872dd14610442578063282d3fdf14610478576101fa565b806223de29146101ff57806306e48538146102e757806306fdde031461033f578063095ea7b3146103bc575b600080fd5b6102e5600480360360c081101561021557600080fd5b6001600160a01b03823581169260208101358216926040820135909216916060820135919081019060a081016080820135600160201b81111561025757600080fd5b82018360208201111561026957600080fd5b803590602001918460018302840111600160201b8311171561028a57600080fd5b919390929091602081019035600160201b8111156102a757600080fd5b8201836020820111156102b957600080fd5b803590602001918460018302840111600160201b831117156102da57600080fd5b509092509050610bb4565b005b6102ef610d69565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561032b578181015183820152602001610313565b505050509050019250505060405180910390f35b610347610dcc565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610381578181015183820152602001610369565b50505050905090810190601f1680156103ae5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103e8600480360360408110156103d257600080fd5b506001600160a01b038135169060200135610e56565b604080519115158252519081900360200190f35b610404610e7a565b60408051918252519081900360200190f35b6104046004803603604081101561042c57600080fd5b506001600160a01b038135169060200135610e80565b6103e86004803603606081101561045857600080fd5b506001600160a01b03813581169160208101359091169060400135610fd3565b6102e56004803603604081101561048e57600080fd5b506001600160a01b038135169060200135611156565b6104ca600480360360208110156104ba57600080fd5b50356001600160a01b0316611532565b604080519788526020880196909652868601949094526060860192909252608085015260a084015260c0830152519081900360e00190f35b61050a61158f565b6040805160ff9092168252519081900360200190f35b6104046004803603602081101561053657600080fd5b50356001600160a01b0316611594565b610404611609565b61040461160f565b6104046004803603602081101561056c57600080fd5b50356001600160a01b0316611615565b6104046116e8565b6102e5600480360360a081101561059a57600080fd5b6001600160a01b03823581169260208101359091169160408201359190810190608081016060820135600160201b8111156105d457600080fd5b8201836020820111156105e657600080fd5b803590602001918460018302840111600160201b8311171561060757600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b81111561065957600080fd5b82018360208201111561066b57600080fd5b803590602001918460018302840111600160201b8311171561068c57600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506116ed945050505050565b610404600480360360208110156106e357600080fd5b50356001600160a01b031661174f565b6104046004803603602081101561070957600080fd5b50356001600160a01b031661176a565b6104046117b5565b6102e56004803603604081101561073757600080fd5b506001600160a01b0381351690602001356117f2565b6107736004803603602081101561076357600080fd5b50356001600160a01b03166119df565b6040805195865260208601949094528484019290925260608401526001600160a01b03166080830152519081900360a00190f35b6102e5600480360360208110156107bd57600080fd5b50356001600160a01b0316611a17565b610347611b63565b6102e5600480360360608110156107eb57600080fd5b6001600160a01b0382351691602081013591810190606081016040820135600160201b81111561081a57600080fd5b82018360208201111561082c57600080fd5b803590602001918460018302840111600160201b8311171561084d57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611bc4945050505050565b6102e5611bee565b6103e8600480360360408110156108ac57600080fd5b506001600160a01b038135169060200135611ed6565b6102e5600480360360608110156108d857600080fd5b506001600160a01b03813581169160208101359091169060400135611faf565b61091e6004803603602081101561090e57600080fd5b50356001600160a01b0316612311565b6040805195865293151560208601528484019290925260608401526080830152519081900360a00190f35b6103e86004803603604081101561095f57600080fd5b506001600160a01b03813581169160200135166124a1565b6104046004803603604081101561098d57600080fd5b506001600160a01b0381358116916020013516612543565b6102e5600480360360208110156109bb57600080fd5b50356001600160a01b031661256e565b6102e5600480360360808110156109e157600080fd5b6001600160a01b0382351691602081013591810190606081016040820135600160201b811115610a1057600080fd5b820183602082011115610a2257600080fd5b803590602001918460018302840111600160201b83111715610a4357600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295949360208101935035915050600160201b811115610a9557600080fd5b820183602082011115610aa757600080fd5b803590602001918460018302840111600160201b83111715610ac857600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506126ba945050505050565b6102e560048036036040811015610b1f57600080fd5b81359190810190604081016020820135600160201b811115610b4057600080fd5b820183602082011115610b5257600080fd5b803590602001918460018302840111600160201b83111715610b7357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550612718945050505050565b60008511610bf35760405162461bcd60e51b815260040180806020018281038252602c815260200180613a07602c913960400191505060405180910390fd5b7f000000000000000000000000f80d589b3dbe130c270a69f1a69d050f268786df6001600160a01b0316610c25612794565b6001600160a01b031614610c80576040805162461bcd60e51b815260206004820181905260248201527f596f752063616e206f6e6c79206c6f636b2d696e20464c555820746f6b656e73604482015290519081900360640190fd5b6001600160a01b0388163014610cc75760405162461bcd60e51b81526004018080602001828103825260328152602001806139196032913960400191505060405180910390fd5b6001600160a01b0386163014610d0e5760405162461bcd60e51b81526004018080602001828103825260288152602001806137b46028913960400191505060405180910390fd5b856001600160a01b0316876001600160a01b03161415610d5f5760405162461bcd60e51b81526004018080602001828103825260328152602001806137396032913960400191505060405180910390fd5b5050505050505050565b60606004805480602002602001604051908101604052809291908181526020018280548015610dc157602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610da3575b505050505090505b90565b60028054604080516020601f6000196101006001871615020190941685900493840181900481028201810190925282815260609390929091830182828015610dc15780601f10610e2a57610100808354040283529160200191610dc1565b820191906000526020600020905b815481529060010190602001808311610e3857509395945050505050565b600080610e61612794565b9050610e6e818585612798565b60019150505b92915050565b60015490565b6001600160a01b0382166000908152600b602052604081208054610ea8576000915050610e74565b43831115610ee75760405162461bcd60e51b815260040180806020018281038252602a815260200180613b90602a913960400191505060405180910390fd5b8281600301541115610f2a5760405162461bcd60e51b815260040180806020018281038252603a815260200180613a33603a913960400191505060405180910390fd5b6000610f4382600301548561288490919063ffffffff16565b82549091506000610f5a828463ffffffff6128c616565b90506000610f6788611594565b90506000610f7489611615565b90506000610fac612710610f9484610fa083838a8a63ffffffff6128c616565b9063ffffffff61291f16565b9063ffffffff6128c616565b90506000610fc4826305f5e10063ffffffff61291f16565b9b9a5050505050505050505050565b60006001600160a01b03831661101a5760405162461bcd60e51b81526004018080602001828103825260248152602001806139e36024913960400191505060405180910390fd5b6001600160a01b03841661105f5760405162461bcd60e51b8152600401808060200182810382526026815260200180613af06026913960400191505060405180910390fd5b6000611069612794565b9050611097818686866040518060200160405280600081525060405180602001604052806000815250612961565b6110c3818686866040518060200160405280600081525060405180602001604052806000815250612ba9565b61111d858261111886604051806060016040528060298152602001613ac7602991396001600160a01b03808c166000908152600860209081526040808320938b1683529290522054919063ffffffff612dce16565b612798565b61114b8186868660405180602001604052806000815250604051806020016040528060008152506000612e65565b506001949350505050565b60096000611162612794565b6001600160a01b0316815260208101919091526040016000205460ff1661152e57600160096000611191612794565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790556111c1612794565b6001600160a01b0381166000908152600b6020526040902060020154431480159061120757506001600160a01b0381166000908152600b60205260409020600301544314155b6112425760405162461bcd60e51b815260040180806020018281038252602e815260200180613a6d602e913960400191505060405180910390fd5b61124a612794565b6001600160a01b0381166000908152600b60205260408120541561129f5760405162461bcd60e51b815260040180806020018281038252602781526020018061384f6027913960400191505060405180910390fd5b600084116112de5760405162461bcd60e51b815260040180806020018281038252602d8152602001806137dc602d913960400191505060405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000cfe5e643101561134e5768056bc75e2d6310000084111561134e5760405162461bcd60e51b8152600401808060200182810382526034815260200180613b396034913960400191505060405180910390fd5b6000600b600061135c612794565b6001600160a01b0390811682526020820192909252604001600020868155436002820181905560038201556004810180546001600160a01b03191692891692909217909155600c549091506113b1908661273a565b600c556001810154600d546113cb9163ffffffff61273a16565b600d557f839301d49a1ea695b991657eb992fdd6280a423122f6d73152cd912b0fdb79706113f7612794565b6001830154604080516001600160a01b039384168152436020820152928a1683820152606083018990526080830191909152519081900360a00190a17f000000000000000000000000f80d589b3dbe130c270a69f1a69d050f268786df6001600160a01b03166362ad1b8361146a612794565b6040805160e084811b6001600160e01b03191682526001600160a01b03939093166004820152306024820152604481018a905260a06064820152600060a48201819052608482019390935260e481018390529051610124808301939282900301818387803b1580156114db57600080fd5b505af11580156114ef573d6000803e3d6000fd5b5050505050505050600060096000611505612794565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790555b5050565b6000806000806000806000806115478961174f565b905060006115558a43610e80565b905060006115628b611615565b9050600061156f8c611594565b600c54600d54439f969e50949c50929a5098509096509094509092505050565b601290565b6000806115a08361176a565b905060006115ac6117b5565b90508015806115b9575081155b156115ca5761271092505050611604565b60006115fe620186a06115f96127106115ed86610f94898463ffffffff6128c616565b9063ffffffff61273a16565b6130fb565b93505050505b919050565b600c5481565b600d5481565b6001600160a01b0381166000908152600b60205260408120805461163e57612710915050611604565b6002810154600090611676907f000000000000000000000000000000000000000000000000000000000000168063ffffffff61273a16565b90508043101561168c5761271092505050611604565b60006116ce6127106115ed7f0000000000000000000000000000000000000000000000000000000000027600610f94614e20610fa0438963ffffffff61288416565b905060006116de617530836130fb565b9695505050505050565b600190565b6116fe6116f8612794565b866124a1565b6117395760405162461bcd60e51b815260040180806020018281038252602c815260200180613a9b602c913960400191505060405180910390fd5b61174885858585856001613111565b5050505050565b6001600160a01b031660009081526020819052604090205490565b6001600160a01b0381166000908152600b60205260408120805460018201548161179a5760009350505050611604565b60006116de83610f94846402540be40063ffffffff6128c616565b6000600c54600014156117ca57506000610dc9565b60006117ec600c54610f946402540be400600d546128c690919063ffffffff16565b91505090565b600960006117fe612794565b6001600160a01b0316815260208101919091526040016000205460ff1661152e5760016009600061182d612794565b6001600160a01b031681526020810191909152604001600020805491151560ff199092169190911790558160016001600160a01b0382166000908152600b60205260409020546118ae5760405162461bcd60e51b81526004018080602001828103825260288152602001806138f16028913960400191505060405180910390fd5b60008311611903576040805162461bcd60e51b815260206004820152601a60248201527f596f75206d757374206275726e203e20302041726269464c5558000000000000604482015290519081900360640190fd5b6001600160a01b0384166000908152600b602052604090206001810154611930908563ffffffff61273a16565b6001820155600d54611948908563ffffffff61273a16565b600d557f0988e44904d6f878152b5838c395fd103556e89960b84cca544f25bb8e14544d611974612794565b604080516001600160a01b0392831681529188166020830152818101879052519081900360600190a16119ce6119a8612794565b8560405180602001604052806000815250604051806020016040528060008152506131e8565b505050600060096000611505612794565b600b6020526000908152604090208054600182015460028301546003840154600490940154929391929091906001600160a01b031685565b806001600160a01b0316611a29612794565b6001600160a01b03161415611a6f5760405162461bcd60e51b815260040180806020018281038252602481526020018061382b6024913960400191505060405180910390fd5b6001600160a01b03811660009081526005602052604090205460ff1615611ad25760076000611a9c612794565b6001600160a01b03908116825260208083019390935260409182016000908120918516815292529020805460ff19169055611b19565b600160066000611ae0612794565b6001600160a01b03908116825260208083019390935260409182016000908120918616815292529020805460ff19169115159190911790555b611b21612794565b6001600160a01b0316816001600160a01b03167ff4caeb2d6ca8932a215a353d0703c326ec2d81fc68170f320eb2ab49e9df61f960405160405180910390a350565b60038054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610dc15780601f10610e2a57610100808354040283529160200191610dc1565b611be9611bcf612794565b848484604051806020016040528060008152506001613111565b505050565b60096000611bfa612794565b6001600160a01b0316815260208101919091526040016000205460ff16611ed457600160096000611c29612794565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055611c59612794565b6001600160a01b0381166000908152600b60205260409020600201544314801590611c9f57506001600160a01b0381166000908152600b60205260409020600301544314155b611cda5760405162461bcd60e51b815260040180806020018281038252602e815260200180613a6d602e913960400191505060405180910390fd5b611ce2612794565b60016001600160a01b0382166000908152600b6020526040902054611d385760405162461bcd60e51b81526004018080602001828103825260288152602001806138f16028913960400191505060405180910390fd5b6000600b6000611d46612794565b6001600160a01b03168152602081019190915260400160009081208054918155600c54909250611d7c908263ffffffff61288416565b600c556001820154600d54611d969163ffffffff61288416565b600d557f3f2f29fa02cc34566ac167b446be0be9e0254cac18eda93b2dfe6a7a7c8affb9611dc2612794565b6001840154604080516001600160a01b0390931683526020830185905282810191909152519081900360600190a17f000000000000000000000000f80d589b3dbe130c270a69f1a69d050f268786df6001600160a01b0316639bd9bbc6611e27612794565b604080516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820185905260606044830152600060648301819052905160a48084019382900301818387803b158015611e8057600080fd5b505af1158015611e94573d6000803e3d6000fd5b505050505050505050600060096000611eab612794565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790555b565b60006001600160a01b038316611f1d5760405162461bcd60e51b81526004018080602001828103825260248152602001806139e36024913960400191505060405180910390fd5b6000611f27612794565b9050611f55818286866040518060200160405280600081525060405180602001604052806000815250612961565b611f81818286866040518060200160405280600081525060405180602001604052806000815250612ba9565b610e6e8182868660405180602001604052806000815250604051806020016040528060008152506000612e65565b60096000611fbb612794565b6001600160a01b0316815260208101919091526040016000205460ff16611be957600160096000611fea612794565b6001600160a01b03908116825260208083019390935260409182016000908120805460ff19169515159590951790945586168352600b9091529020600201548390431480159061205557506001600160a01b0381166000908152600b60205260409020600301544314155b6120905760405162461bcd60e51b815260040180806020018281038252602e815260200180613a6d602e913960400191505060405180910390fd5b8360016001600160a01b0382166000908152600b60205260409020546120e75760405162461bcd60e51b81526004018080602001828103825260288152602001806138f16028913960400191505060405180910390fd5b438411156121265760405162461bcd60e51b81526004018080602001828103825260258152602001806138cc6025913960400191505060405180910390fd5b6001600160a01b0386166000908152600b60205260409020600381015485116121805760405162461bcd60e51b815260040180806020018281038252602a8152602001806139b9602a913960400191505060405180910390fd5b612188612794565b60048201546001600160a01b039081169116146121d65760405162461bcd60e51b81526004018080602001828103825260358152602001806138766035913960400191505060405180910390fd5b60006121e28887610e80565b905060008111612239576040805162461bcd60e51b815260206004820152601d60248201527f596f752063616e206e6f74206d696e74207a65726f2062616c616e6365000000604482015290519081900360640190fd5b600382018690557f362b95f53c81f53b3bf4a4ee37bdb0d75f2ecd94ae81b2a82579218fbedf99ed612269612794565b604080516001600160a01b039283168152436020820152828c1681830152918a1660608301526080820189905260a08201849052519081900360c00190a16122d18782604051806020016040528060008152506040518060200160405280600081525061342e565b50505050506000600960006122e4612794565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055505050565b6000806000806000807f000000000000000000000000f80d589b3dbe130c270a69f1a69d050f268786df6001600160a01b031663d95b637130896040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b03168152602001826001600160a01b03166001600160a01b031681526020019250505060206040518083038186803b1580156123aa57600080fd5b505afa1580156123be573d6000803e3d6000fd5b505050506040513d60208110156123d457600080fd5b5051604080516370a0823160e01b81526001600160a01b038a8116600483015291519293506000927f000000000000000000000000f80d589b3dbe130c270a69f1a69d050f268786df909216916370a0823191602480820192602092909190829003018186803b15801561244757600080fd5b505afa15801561245b573d6000803e3d6000fd5b505050506040513d602081101561247157600080fd5b5051905060006124808961176a565b9050600061248c6117b5565b439b949a509298509096509094509092505050565b6000816001600160a01b0316836001600160a01b0316148061250c57506001600160a01b03831660009081526005602052604090205460ff16801561250c57506001600160a01b0380831660009081526007602090815260408083209387168352929052205460ff16155b8061253c57506001600160a01b0380831660009081526006602090815260408083209387168352929052205460ff165b9392505050565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205490565b612576612794565b6001600160a01b0316816001600160a01b031614156125c65760405162461bcd60e51b81526004018080602001828103825260218152602001806138ab6021913960400191505060405180910390fd5b6001600160a01b03811660009081526005602052604090205460ff1615612632576001600760006125f5612794565b6001600160a01b03908116825260208083019390935260409182016000908120918616815292529020805460ff1916911515919091179055612670565b6006600061263e612794565b6001600160a01b03908116825260208083019390935260409182016000908120918516815292529020805460ff191690555b612678612794565b6001600160a01b0316816001600160a01b03167f50546e66e5f44d728365dc3908c63bc5cfeeab470722c1677e3073a6ac294aa160405160405180910390a350565b6126cb6126c5612794565b856124a1565b6127065760405162461bcd60e51b815260040180806020018281038252602c815260200180613a9b602c913960400191505060405180910390fd5b612712848484846131e8565b50505050565b61152e612723612794565b8383604051806020016040528060008152506131e8565b60008282018381101561253c576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b3390565b6001600160a01b0383166127dd5760405162461bcd60e51b81526004018080602001828103825260258152602001806137146025913960400191505060405180910390fd5b6001600160a01b0382166128225760405162461bcd60e51b8152600401808060200182810382526023815260200180613b6d6023913960400191505060405180910390fd5b6001600160a01b03808416600081815260086020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b600061253c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612dce565b6000826128d557506000610e74565b828202828482816128e257fe5b041461253c5760405162461bcd60e51b815260040180806020018281038252602181526020018061394b6021913960400191505060405180910390fd5b600061253c83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613672565b6040805163555ddc6560e11b81526001600160a01b03871660048201527f29ddb589b1fb5fc7cf394961c1adf5f8c6454761adf795e67fe149f658abe89560248201529051600091731820a4b7618bde71dce8cdc73aab6c95905fad249163aabbb8ca91604480820192602092909190829003018186803b1580156129e557600080fd5b505afa1580156129f9573d6000803e3d6000fd5b505050506040513d6020811015612a0f57600080fd5b505190506001600160a01b03811615612ba057806001600160a01b03166375ab97828888888888886040518763ffffffff1660e01b815260040180876001600160a01b03166001600160a01b03168152602001866001600160a01b03166001600160a01b03168152602001856001600160a01b03166001600160a01b031681526020018481526020018060200180602001838103835285818151815260200191508051906020019080838360005b83811015612ad5578181015183820152602001612abd565b50505050905090810190601f168015612b025780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b83811015612b35578181015183820152602001612b1d565b50505050905090810190601f168015612b625780820380516001836020036101000a031916815260200191505b5098505050505050505050600060405180830381600087803b158015612b8757600080fd5b505af1158015612b9b573d6000803e3d6000fd5b505050505b50505050505050565b612bb586868686612712565b612bf88360405180606001604052806027815260200161378d602791396001600160a01b038816600090815260208190526040902054919063ffffffff612dce16565b6001600160a01b038087166000908152602081905260408082209390935590861681522054612c2d908463ffffffff61273a16565b600080866001600160a01b03166001600160a01b0316815260200190815260200160002081905550836001600160a01b0316856001600160a01b0316876001600160a01b03167f06b541ddaa720db2b10a4d0cdac39b8d360425fc073085fac19bc82614677987868686604051808481526020018060200180602001838103835285818151815260200191508051906020019080838360005b83811015612cde578181015183820152602001612cc6565b50505050905090810190601f168015612d0b5780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b83811015612d3e578181015183820152602001612d26565b50505050905090810190601f168015612d6b5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a4836001600160a01b0316856001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040518082815260200191505060405180910390a3505050505050565b60008184841115612e5d5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612e22578181015183820152602001612e0a565b50505050905090810190601f168015612e4f5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b6040805163555ddc6560e11b81526001600160a01b03871660048201527fb281fc8c12954d22544db45de3159a39272895b169a852b314f9cc762e44c53b60248201529051600091731820a4b7618bde71dce8cdc73aab6c95905fad249163aabbb8ca91604480820192602092909190829003018186803b158015612ee957600080fd5b505afa158015612efd573d6000803e3d6000fd5b505050506040513d6020811015612f1357600080fd5b505190506001600160a01b038116156130a757806001600160a01b03166223de298989898989896040518763ffffffff1660e01b815260040180876001600160a01b03166001600160a01b03168152602001866001600160a01b03166001600160a01b03168152602001856001600160a01b03166001600160a01b031681526020018481526020018060200180602001838103835285818151815260200191508051906020019080838360005b83811015612fd8578181015183820152602001612fc0565b50505050905090810190601f1680156130055780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b83811015613038578181015183820152602001613020565b50505050905090810190601f1680156130655780820380516001836020036101000a031916815260200191505b5098505050505050505050600060405180830381600087803b15801561308a57600080fd5b505af115801561309e573d6000803e3d6000fd5b50505050610d5f565b8115610d5f576130bf866001600160a01b03166136d7565b15610d5f5760405162461bcd60e51b815260040180806020018281038252604d81526020018061396c604d913960600191505060405180910390fd5b600081831061310a578161253c565b5090919050565b6001600160a01b0386166131565760405162461bcd60e51b815260040180806020018281038252602281526020018061376b6022913960400191505060405180910390fd5b6001600160a01b0385166131b1576040805162461bcd60e51b815260206004820181905260248201527f4552433737373a2073656e6420746f20746865207a65726f2061646472657373604482015290519081900360640190fd5b60006131bb612794565b90506131cb818888888888612961565b6131d9818888888888612ba9565b612ba081888888888888612e65565b6001600160a01b03841661322d5760405162461bcd60e51b81526004018080602001828103825260228152602001806138096022913960400191505060405180910390fd5b6000613237612794565b90506132468186600087612712565b61325581866000878787612961565b61329884604051806060016040528060238152602001613b16602391396001600160a01b038816600090815260208190526040902054919063ffffffff612dce16565b6001600160a01b0386166000908152602081905260409020556001546132c4908563ffffffff61288416565b600181905550846001600160a01b0316816001600160a01b03167fa78a9be3a7b862d26933ad85fb11d80ef66b8f972d7cbba06621d583943a4098868686604051808481526020018060200180602001838103835285818151815260200191508051906020019080838360005b83811015613349578181015183820152602001613331565b50505050905090810190601f1680156133765780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b838110156133a9578181015183820152602001613391565b50505050905090810190601f1680156133d65780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a36040805185815290516000916001600160a01b038816917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050505050565b6001600160a01b038416613489576040805162461bcd60e51b815260206004820181905260248201527f4552433737373a206d696e7420746f20746865207a65726f2061646472657373604482015290519081900360640190fd5b6000613493612794565b90506134a28160008787612712565b6001546134b5908563ffffffff61273a16565b6001556001600160a01b0385166000908152602081905260409020546134e1908563ffffffff61273a16565b6001600160a01b03861660009081526020819052604081209190915561350e908290878787876001612e65565b846001600160a01b0316816001600160a01b03167f2fe5be0146f74c5bce36c0b80911af6c7d86ff27e89d5cfa61fc681327954e5d868686604051808481526020018060200180602001838103835285818151815260200191508051906020019080838360005b8381101561358d578181015183820152602001613575565b50505050905090810190601f1680156135ba5780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b838110156135ed5781810151838201526020016135d5565b50505050905090810190601f16801561361a5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a36040805185815290516001600160a01b038716916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050505050565b600081836136c15760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315612e22578181015183820152602001612e0a565b5060008385816136cd57fe5b0495945050505050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47081811480159061370b57508115155b94935050505056fe4552433737373a20617070726f76652066726f6d20746865207a65726f206164647265737357687920776f756c642041726269464c555820636f6e74726163742073656e6420746f6b656e7320746f20697473656c663f4552433737373a2073656e642066726f6d20746865207a65726f20616464726573734552433737373a207472616e7366657220616d6f756e7420657863656564732062616c616e636546756e6473206d75737420626520636f6d696e6720696e746f2041726269464c555820746f6b656e596f75206d7573742070726f76696465206120706f73697469766520616d6f756e7420746f206c6f636b2d696e4552433737373a206275726e2066726f6d20746865207a65726f20616464726573734552433737373a20617574686f72697a696e672073656c66206173206f70657261746f72596f75206d757374206861766520756e6c6f636b656420796f757220464c555820746f6b656e73596f75206d757374206265207468652064656c656761746564206d696e746572206f662074686520736f75726365416464726573734552433737373a207265766f6b696e672073656c66206173206f70657261746f72596f752063616e206f6e6c79206d696e7420757020746f2063757272656e7420626c6f636b596f75206d7573742068617665206c6f636b65642d696e20796f757220464c555820746f6b656e734f6e6c792041726269464c555820636f6e74726163742063616e2073656e6420697473656c6620464c555820746f6b656e73536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774552433737373a20746f6b656e20726563697069656e7420636f6e747261637420686173206e6f20696d706c656d656e74657220666f7220455243373737546f6b656e73526563697069656e74596f752063616e206f6e6c79206d696e74206168656164206f66206c617374206d696e7420626c6f636b4552433737373a207472616e7366657220746f20746865207a65726f2061646472657373596f75206d7573742072656365697665206120706f736974697665206e756d626572206f6620746f6b656e73596f752063616e206f6e6c79207370656369667920626c6f636b73206174206f72206168656164206f66206c617374206d696e7420626c6f636b596f752063616e206e6f74206c6f636b2f756e6c6f636b2f6d696e7420696e207468652073616d6520626c6f636b4552433737373a2063616c6c6572206973206e6f7420616e206f70657261746f7220666f7220686f6c6465724552433737373a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e63654552433737373a207472616e736665722066726f6d20746865207a65726f20616464726573734552433737373a206275726e20616d6f756e7420657863656564732062616c616e6365596f752063616e206f6e6c79206c6f636b2d696e20757020746f2031303020464c555820647572696e67206661696c736166652e4552433737373a20617070726f766520746f20746865207a65726f2061646472657373596f752063616e206f6e6c792063616c63756c61746520757020746f2063757272656e7420626c6f636ba26469706673582212209a443e8f1673384126ace78d3da1f585a17cbca92ca3cadaa317a1c76e95578b64736f6c63430006090033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000f80d589b3dbe130c270a69f1a69d050f268786df000000000000000000000000000000000000000000000000000000000000168000000000000000000000000000000000000000000000000000000000000276000000000000000000000000000000000000000000000000000000000000027600

-----Decoded View---------------
Arg [0] : token (address): 0xF80D589b3Dbe130c270a69F1a69D050f268786Df
Arg [1] : startTimeReward (uint256): 5760
Arg [2] : maxTimeReward (uint256): 161280
Arg [3] : failsafeBlockDuration (uint256): 161280

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000f80d589b3dbe130c270a69f1a69d050f268786df
Arg [1] : 0000000000000000000000000000000000000000000000000000000000001680
Arg [2] : 0000000000000000000000000000000000000000000000000000000000027600
Arg [3] : 0000000000000000000000000000000000000000000000000000000000027600


Deployed Bytecode Sourcemap

44952:17740:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46973:766;;;;;;;;;;;;;;;;-1:-1:-1;;;;;46973:766:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;46973:766:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;46973:766:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;46973:766:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;46973:766:0;;;;;;;;;;-1:-1:-1;46973:766:0;;-1:-1:-1;46973:766:0;-1:-1:-1;46973:766:0;:::i;:::-;;32861:124;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29042:92;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34436:193;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;34436:193:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;29836:117;;;:::i;:::-;;;;;;;;;;;;;;;;56212:1271;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;56212:1271:0;;;;;;;;:::i;35005:686::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;35005:686:0;;;;;;;;;;;;;;;;;:::i;51215:1446::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;51215:1446:0;;;;;;;;:::i;61264:673::-;;;;;;;;;;;;;;;;-1:-1:-1;61264:673:0;-1:-1:-1;;;;;61264:673:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29483:76;;;:::i;:::-;;;;;;;;;;;;;;;;;;;58813:703;;;;;;;;;;;;;;;;-1:-1:-1;58813:703:0;-1:-1:-1;;;;;58813:703:0;;:::i;50394:33::-;;;:::i;50561:::-;;;:::i;57618:1056::-;;;;;;;;;;;;;;;;-1:-1:-1;57618:1056:0;-1:-1:-1;;;;;57618:1056:0;;:::i;29681:89::-;;;:::i;33111:377::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33111:377:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33111:377:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33111:377:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33111:377:0;;;;;;;;-1:-1:-1;33111:377:0;;-1:-1:-1;;;;;33111:377:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33111:377:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33111:377:0;;-1:-1:-1;33111:377:0;;-1:-1:-1;;;;;33111:377:0:i;30058:144::-;;;;;;;;;;;;;;;;-1:-1:-1;30058:144:0;-1:-1:-1;;;;;30058:144:0;;:::i;59622:795::-;;;;;;;;;;;;;;;;-1:-1:-1;59622:795:0;-1:-1:-1;;;;;59622:795:0;;:::i;60528:539::-;;;:::i;53650:933::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;53650:933:0;;;;;;;;:::i;50235:52::-;;;;;;;;;;;;;;;;-1:-1:-1;50235:52:0;-1:-1:-1;;;;;50235:52:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;50235:52:0;;;;;;;;;;;;;;31900:415;;;;;;;;;;;;;;;;-1:-1:-1;31900:415:0;-1:-1:-1;;;;;31900:415:0;;:::i;29195:96::-;;;:::i;30339:158::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;30339:158:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;30339:158:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;30339:158:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30339:158:0;;-1:-1:-1;30339:158:0;;-1:-1:-1;;;;;30339:158:0:i;52750:812::-;;;:::i;30738:443::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;30738:443:0;;;;;;;;:::i;54719:1329::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;54719:1329:0;;;;;;;;;;;;;;;;;:::i;62142:547::-;;;;;;;;;;;;;;;;-1:-1:-1;62142:547:0;-1:-1:-1;;;;;62142:547:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31508:320;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;31508:320:0;;;;;;;;;;:::i;34146:145::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;34146:145:0;;;;;;;;;;:::i;32384:406::-;;;;;;;;;;;;;;;;-1:-1:-1;32384:406:0;-1:-1:-1;;;;;32384:406:0;;:::i;33616:282::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33616:282:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33616:282:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33616:282:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33616:282:0;;;;;;;;-1:-1:-1;33616:282:0;;-1:-1:-1;;;;;33616:282:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;33616:282:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33616:282:0;;-1:-1:-1;33616:282:0;;-1:-1:-1;;;;;33616:282:0:i;31318:122::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31318:122:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;31318:122:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31318:122:0;;-1:-1:-1;31318:122:0;;-1:-1:-1;;;;;31318:122:0:i;46973:766::-;47196:1;47187:6;:10;47179:67;;;;-1:-1:-1;;;47179:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47289:6;-1:-1:-1;;;;;47265:31:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;47265:31:0;;47257:76;;;;;-1:-1:-1;;;47257:76:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47483:25:0;;47503:4;47483:25;47475:89;;;;-1:-1:-1;;;47475:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47583:19:0;;47597:4;47583:19;47575:72;;;;-1:-1:-1;;;47575:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47674:2;-1:-1:-1;;;;;47666:10:0;:4;-1:-1:-1;;;;;47666:10:0;;;47658:73;;;;-1:-1:-1;;;47658:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46973:766;;;;;;;;:::o;32861:124::-;32919:16;32955:22;32948:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32948:29:0;;;;;;;;;;;;;;;;;;;;;;;32861:124;;:::o;29042:92::-;29121:5;29114:12;;;;;;;-1:-1:-1;;29114:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29088:13;;29114:12;;29121:5;;29114:12;;29121:5;29114:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29114:12:0;;29042:92;-1:-1:-1;;;;;29042:92:0:o;34436:193::-;34510:4;34527:14;34544:12;:10;:12::i;:::-;34527:29;;34567:32;34576:6;34584:7;34593:5;34567:8;:32::i;:::-;34617:4;34610:11;;;34436:193;;;;;:::o;29836:117::-;29933:12;;29836:117;:::o;56212:1271::-;-1:-1:-1;;;;;56359:27:0;;56299:7;56359:27;;;:12;:27;;;;;56475:24;;56471:70;;56528:1;56521:8;;;;;56471:70;56576:12;56561:11;:27;;56553:82;;;;-1:-1:-1;;;56553:82:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56695:11;56654:17;:37;;;:52;;56646:123;;;;-1:-1:-1;;;56646:123:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56782:20;56805:54;56821:17;:37;;;56805:11;:15;;:54;;;;:::i;:::-;56889:24;;56782:77;;-1:-1:-1;56872:14:0;56999:24;56889;56782:77;56999:24;:10;:24;:::i;:::-;56968:55;;57070:22;57095:39;57120:13;57095:24;:39::i;:::-;57070:64;;57145:21;57169:39;57194:13;57169:24;:39::i;:::-;57145:63;-1:-1:-1;57219:27:0;57249:107;49514:5;57249:83;57145:63;57249:64;49514:5;57249:83;:20;57274:14;57249:40;:24;:40;:::i;:::-;:44;:64;:44;:64;:::i;:::-;:68;:83;:68;:83;:::i;:107::-;57219:137;-1:-1:-1;57369:24:0;57396:45;57219:137;49080:7;57396:45;:23;:45;:::i;:::-;57369:72;56212:1271;-1:-1:-1;;;;;;;;;;;56212:1271:0:o;35005:686::-;35103:4;-1:-1:-1;;;;;35128:23:0;;35120:72;;;;-1:-1:-1;;;35120:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;35211:20:0;;35203:71;;;;-1:-1:-1;;;35203:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35287:15;35305:12;:10;:12::i;:::-;35287:30;;35330:61;35348:7;35357:6;35365:9;35376:6;35330:61;;;;;;;;;;;;;;;;;;;;;;;;:17;:61::i;:::-;35404:49;35410:7;35419:6;35427:9;35438:6;35404:49;;;;;;;;;;;;;;;;;;;;;;;;:5;:49::i;:::-;35464:112;35473:6;35481:7;35490:85;35523:6;35490:85;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;35490:19:0;;;;;;;:11;:19;;;;;;;;:28;;;;;;;;;;;:85;;:32;:85;:::i;:::-;35464:8;:112::i;:::-;35589:70;35609:7;35618:6;35626:9;35637:6;35589:70;;;;;;;;;;;;;;;;;;;;;;;;35653:5;35589:19;:70::i;:::-;-1:-1:-1;35679:4:0;;35005:686;-1:-1:-1;;;;35005:686:0:o;51215:1446::-;45382:5;:19;45388:12;:10;:12::i;:::-;-1:-1:-1;;;;;45382:19:0;;;;;;;;;;;;-1:-1:-1;45382:19:0;;;;45379:168;;45449:4;45427:5;:19;45433:12;:10;:12::i;:::-;-1:-1:-1;;;;;45427:19:0;;;;;;;;;;;;-1:-1:-1;45427:19:0;:26;;-1:-1:-1;;45427:26:0;;;;;;;;;;51322:12:::1;:10;:12::i;:::-;-1:-1:-1::0;;;;;45813:27:0;::::1;;::::0;;;:12:::1;:27;::::0;;;;:39:::1;;::::0;45856:12:::1;45813:55;::::0;::::1;::::0;:122:::1;;-1:-1:-1::0;;;;;;45872:27:0;::::1;;::::0;;;:12:::1;:27;::::0;;;;:47:::1;;::::0;45923:12:::1;45872:63;;45813:122;45805:181;;;;-1:-1:-1::0;;;45805:181:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51359:12:::2;:10;:12::i;:::-;-1:-1:-1::0;;;;;46369:27:0;::::2;51373:5;46369:27:::0;;;:12:::2;:27;::::0;;;;:34;:39;46361:91:::2;;;;-1:-1:-1::0;;;46361:91:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51458:1:::3;51449:6;:10;51441:68;;;;-1:-1:-1::0;;;51441:68:0::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51616:20;51601:12;:35;51597:161;;;48902:16;51661:6;:28;;51653:93;;;;-1:-1:-1::0;;;51653:93:0::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51770:37;51810:12;:26;51823:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;51810:26:0;;::::3;::::0;;::::3;::::0;::::3;::::0;;;;;;-1:-1:-1;51810:26:0;51870:33;;;51946:12:::3;51914:29;::::0;::::3;:44:::0;;;51969:37:::3;::::0;::::3;:52:::0;52081:31:::3;::::0;::::3;:47:::0;;-1:-1:-1;;;;;;52081:47:0::3;::::0;;::::3;::::0;;;::::3;::::0;;;52170:18:::3;::::0;51810:26;;-1:-1:-1;52170:30:0::3;::::0;51870:33;52170:22:::3;:30::i;:::-;52149:18;:51:::0;52255:30:::3;::::0;::::3;::::0;52232:18:::3;::::0;:54:::3;::::0;::::3;:22;:54;:::i;:::-;52211:18;:75:::0;52304:89:::3;52311:12;:10;:12::i;:::-;52362:30;::::0;::::3;::::0;52304:89:::3;::::0;;-1:-1:-1;;;;;52304:89:0;;::::3;::::0;;52325:12:::3;52304:89;::::0;::::3;::::0;;;::::3;::::0;;;;;;;;;;;;;;;;;;;;;;;;;::::3;52529:6;-1:-1:-1::0;;;;;52521:28:0::3;;52550:12;:10;:12::i;:::-;52521:73;::::0;;::::3;::::0;;;-1:-1:-1;;;;;;52521:73:0;;;-1:-1:-1;;;;;52521:73:0;;;::::3;;::::0;::::3;::::0;52572:4:::3;52521:73:::0;;;;;;;;;;;;;;;-1:-1:-1;52521:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;52521:73:0;;;;;-1:-1:-1;52521:73:0;;::::3;;::::0;::::3;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;46476:1;46007::::2;;45468::::1;45530:5:::0;45508;:19;45514:12;:10;:12::i;:::-;-1:-1:-1;;;;;45508:19:0;;;;;;;;;;;;-1:-1:-1;45508:19:0;:27;;-1:-1:-1;;45508:27:0;;;;;;;;;;45379:168;51215:1446;;:::o;61264:673::-;61334:7;61342;61350;61358;61366;61374;61382;61402:19;61424:24;61434:13;61424:9;:24::i;:::-;61402:46;;61459:18;61480:42;61494:13;61509:12;61480:13;:42::i;:::-;61459:63;;61535:29;61567:39;61592:13;61567:24;:39::i;:::-;61535:71;;61617:29;61649:39;61674:13;61649:24;:39::i;:::-;61876:18;;61910;;61723:12;;61751:11;;-1:-1:-1;61778:10:0;;-1:-1:-1;61804:21:0;;-1:-1:-1;61804:21:0;-1:-1:-1;61876:18:0;;-1:-1:-1;61910:18:0;;-1:-1:-1;61264:673:0;;-1:-1:-1;;;61264:673:0:o;29483:76::-;29549:2;29483:76;:::o;58813:703::-;58890:7;58910:15;58928:30;58944:13;58928:15;:30::i;:::-;58910:48;;58969:19;58991:16;:14;:16::i;:::-;58969:38;-1:-1:-1;59108:16:0;;;:32;;-1:-1:-1;59128:12:0;;59108:32;59104:90;;;49514:5;59157:25;;;;;;59104:90;59330:22;59355:102;49697:6;59384:72;49514:5;59384:48;59420:11;59384:31;:7;49514:5;59384:31;:11;:31;:::i;:48::-;:52;:72;:52;:72;:::i;:::-;59355:8;:102::i;:::-;59330:127;-1:-1:-1;;;;58813:703:0;;;;:::o;50394:33::-;;;;:::o;50561:::-;;;;:::o;57618:1056::-;-1:-1:-1;;;;;57755:27:0;;57695:7;57755:27;;;:12;:27;;;;;57871:24;;57867:87;;49514:5;57917:25;;;;;57867:87;58062:29;;;;58034:25;;58062:51;;58096:16;58062:51;:33;:51;:::i;:::-;58034:79;;58143:17;58128:12;:32;58124:90;;;49514:5;58177:25;;;;;;58124:90;58411:17;58431:107;49514:5;58431:83;58499:14;58431:63;50062:5;58431:35;:12;58448:17;58431:35;:16;:35;:::i;:107::-;58411:127;;58552:22;58577:39;49881:5;58606:9;58577:8;:39::i;:::-;58552:64;57618:1056;-1:-1:-1;;;;;;57618:1056:0:o;29681:89::-;29761:1;29681:89;:::o;33111:377::-;33327:35;33341:12;:10;:12::i;:::-;33355:6;33327:13;:35::i;:::-;33319:92;;;;-1:-1:-1;;;33319:92:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33422:58;33428:6;33436:9;33447:6;33455:4;33461:12;33475:4;33422:5;:58::i;:::-;33111:377;;;;;:::o;30058:144::-;-1:-1:-1;;;;;30172:22:0;30145:7;30172:22;;;;;;;;;;;;30058:144::o;59622:795::-;-1:-1:-1;;;;;59750:27:0;;59690:7;59750:27;;;:12;:27;;;;;59841:24;;59906:30;;;;60045:24;60041:65;;60093:1;60086:8;;;;;;;60041:65;60300:15;60318:66;60364:19;60318:41;:19;49251:8;60318:41;:23;:41;:::i;60528:539::-;60574:7;60690:18;;60712:1;60690:23;60686:64;;;-1:-1:-1;60737:1:0;60730:8;;60686:64;60944:19;60966:64;61011:18;;60966:40;49251:8;60966:18;;:22;;:40;;;;:::i;:64::-;60944:86;-1:-1:-1;;60528:539:0;:::o;53650:933::-;45382:5;:19;45388:12;:10;:12::i;:::-;-1:-1:-1;;;;;45382:19:0;;;;;;;;;;;;-1:-1:-1;45382:19:0;;;;45379:168;;45449:4;45427:5;:19;45433:12;:10;:12::i;:::-;-1:-1:-1;;;;;45427:19:0;;;;;;;;;;;;-1:-1:-1;45427:19:0;:26;;;;;-1:-1:-1;;45427:26:0;;;;;;;;;53763:13;45427:26;-1:-1:-1;;;;;46246:27:0;::::1;;::::0;;;:12:::1;:27;::::0;;;;:34;46238:92:::1;;;;-1:-1:-1::0;;;46238:92:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53884:1:::2;53875:6;:10;53867:49;;;::::0;;-1:-1:-1;;;53867:49:0;;::::2;;::::0;::::2;::::0;::::2;::::0;;;;::::2;::::0;;;;;;;;;;;;;::::2;;-1:-1:-1::0;;;;;53969:27:0;::::2;53929:37;53969:27:::0;;;:12:::2;:27;::::0;;;;54108:30:::2;::::0;::::2;::::0;:42:::2;::::0;54143:6;54108:42:::2;:34;:42;:::i;:::-;54075:30;::::0;::::2;:75:::0;54184:18:::2;::::0;:30:::2;::::0;54207:6;54184:30:::2;:22;:30;:::i;:::-;54163:18;:51:::0;54240:52:::2;54256:12;:10;:12::i;:::-;54240:52;::::0;;-1:-1:-1;;;;;54240:52:0;;::::2;::::0;;;;::::2;;::::0;::::2;::::0;;;;;;;;;;;;;;;::::2;54475:35;54481:12;:10;:12::i;:::-;54495:6;54475:35;;;;;;;;;;;::::0;::::2;;;;;;;;;;;::::0;:5:::2;:35::i;:::-;46476:1;45468::::1;;45530:5:::0;45508;:19;45514:12;:10;:12::i;50235:52::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;50235:52:0;;:::o;31900:415::-;31997:8;-1:-1:-1;;;;;31981:24:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;31981:24:0;;;31973:73;;;;-1:-1:-1;;;31973:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32063:27:0;;;;;;:17;:27;;;;;;;;32059:189;;;32114:24;:38;32139:12;:10;:12::i;:::-;-1:-1:-1;;;;;32114:38:0;;;;;;;;;;;;;;;;;-1:-1:-1;32114:38:0;;;:48;;;;;;;;;32107:55;;-1:-1:-1;;32107:55:0;;;32059:189;;;32232:4;32195:10;:24;32206:12;:10;:12::i;:::-;-1:-1:-1;;;;;32195:24:0;;;;;;;;;;;;;;;;;-1:-1:-1;32195:24:0;;;:34;;;;;;;;;:41;;-1:-1:-1;;32195:41:0;;;;;;;;;;32059:189;32294:12;:10;:12::i;:::-;-1:-1:-1;;;;;32265:42:0;32284:8;-1:-1:-1;;;;;32265:42:0;;;;;;;;;;;31900:415;:::o;29195:96::-;29276:7;29269:14;;;;;;;;-1:-1:-1;;29269:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29243:13;;29269:14;;29276:7;;29269:14;;29276:7;29269:14;;;;;;;;;;;;;;;;;;;;;;;;30339:158;30435:54;30441:12;:10;:12::i;:::-;30455:9;30466:6;30474:4;30435:54;;;;;;;;;;;;30484:4;30435:5;:54::i;:::-;30339:158;;;:::o;52750:812::-;45382:5;:19;45388:12;:10;:12::i;:::-;-1:-1:-1;;;;;45382:19:0;;;;;;;;;;;;-1:-1:-1;45382:19:0;;;;45379:168;;45449:4;45427:5;:19;45433:12;:10;:12::i;:::-;-1:-1:-1;;;;;45427:19:0;;;;;;;;;;;;-1:-1:-1;45427:19:0;:26;;-1:-1:-1;;45427:26:0;;;;;;;;;;52822:12:::1;:10;:12::i;:::-;-1:-1:-1::0;;;;;45813:27:0;::::1;;::::0;;;:12:::1;:27;::::0;;;;:39:::1;;::::0;45856:12:::1;45813:55;::::0;::::1;::::0;:122:::1;;-1:-1:-1::0;;;;;;45872:27:0;::::1;;::::0;;;:12:::1;:27;::::0;;;;:47:::1;;::::0;45923:12:::1;45872:63;;45813:122;45805:181;;;;-1:-1:-1::0;;;45805:181:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52859:12:::2;:10;:12::i;:::-;52873:4;-1:-1:-1::0;;;;;46246:27:0;::::2;;::::0;;;:12:::2;:27;::::0;;;;:34;46238:92:::2;;;;-1:-1:-1::0;;;46238:92:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52942:37:::3;52982:12;:26;52995:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;52982:26:0::3;::::0;;::::3;::::0;::::3;::::0;;;;;;-1:-1:-1;52982:26:0;;;53059:24;;53094:28;;;53156:18:::3;::::0;52982:26;;-1:-1:-1;53156:30:0::3;::::0;53059:24;53156:30:::3;:22;:30;:::i;:::-;53135:18;:51:::0;53241:30:::3;::::0;::::3;::::0;53218:18:::3;::::0;:54:::3;::::0;::::3;:22;:54;:::i;:::-;53197:18;:75:::0;53290:62:::3;53299:12;:10;:12::i;:::-;53321:30;::::0;::::3;::::0;53290:62:::3;::::0;;-1:-1:-1;;;;;53290:62:0;;::::3;::::0;;::::3;::::0;::::3;::::0;;;;;;;;;;;;;;;;;;::::3;53450:6;-1:-1:-1::0;;;;;53442:20:0::3;;53463:12;:10;:12::i;:::-;53442:46;::::0;;-1:-1:-1;;;;;;53442:46:0::3;::::0;;;;;;-1:-1:-1;;;;;53442:46:0;;::::3;;::::0;::::3;::::0;;;;;;;;;;;;-1:-1:-1;53442:46:0;;;;;;;;;;;;;;;;;;-1:-1:-1;53442:46:0;;::::3;;::::0;::::3;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;46476:1;;46007::::2;;45468::::1;45530:5:::0;45508;:19;45514:12;:10;:12::i;:::-;-1:-1:-1;;;;;45508:19:0;;;;;;;;;;;;-1:-1:-1;45508:19:0;:27;;-1:-1:-1;;45508:27:0;;;;;;;;;;45379:168;52750:812::o;30738:443::-;30816:4;-1:-1:-1;;;;;30841:23:0;;30833:72;;;;-1:-1:-1;;;30833:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30918:12;30933;:10;:12::i;:::-;30918:27;;30958:56;30976:4;30982;30988:9;30999:6;30958:56;;;;;;;;;;;;;;;;;;;;;;;;:17;:56::i;:::-;31027:44;31033:4;31039;31045:9;31056:6;31027:44;;;;;;;;;;;;;;;;;;;;;;;;:5;:44::i;:::-;31084:65;31104:4;31110;31116:9;31127:6;31084:65;;;;;;;;;;;;;;;;;;;;;;;;31143:5;31084:19;:65::i;54719:1329::-;45382:5;:19;45388:12;:10;:12::i;:::-;-1:-1:-1;;;;;45382:19:0;;;;;;;;;;;;-1:-1:-1;45382:19:0;;;;45379:168;;45449:4;45427:5;:19;45433:12;:10;:12::i;:::-;-1:-1:-1;;;;;45427:19:0;;;;;;;;;;;;;;;;;-1:-1:-1;45427:19:0;;;:26;;-1:-1:-1;;45427:26:0;;;;;;;;;;;45813:27;::::1;::::0;;:12:::1;:27:::0;;;;;:39:::1;;::::0;:27;;45856:12:::1;45813:55;::::0;::::1;::::0;:122:::1;;-1:-1:-1::0;;;;;;45872:27:0;::::1;;::::0;;;:12:::1;:27;::::0;;;;:47:::1;;::::0;45923:12:::1;45872:63;;45813:122;45805:181;;;;-1:-1:-1::0;;;45805:181:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54901:13:::0;54916:4:::2;-1:-1:-1::0;;;;;46246:27:0;::::2;;::::0;;;:12:::2;:27;::::0;;;;:34;46238:92:::2;;;;-1:-1:-1::0;;;46238:92:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55034:12:::3;55019:11;:27;;55011:77;;;;-1:-1:-1::0;;;55011:77:0::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;55149:27:0;::::3;55109:37;55149:27:::0;;;:12:::3;:27;::::0;;;;55263:37:::3;::::0;::::3;::::0;:51;-1:-1:-1;55255:106:0::3;;;;-1:-1:-1::0;;;55255:106:0::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55415:12;:10;:12::i;:::-;55380:31;::::0;::::3;::::0;-1:-1:-1;;;;;55380:31:0;;::::3;:47:::0;::::3;;55372:113;;;;-1:-1:-1::0;;;55372:113:0::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55498:18;55519:41;55533:13;55548:11;55519:13;:41::i;:::-;55498:62;;55592:1;55579:10;:14;55571:56;;;::::0;;-1:-1:-1;;;55571:56:0;;::::3;;::::0;::::3;::::0;::::3;::::0;;;;::::3;::::0;;;;;;;;;;;;;::::3;;55648:37;::::0;::::3;:51:::0;;;55742:89:::3;55749:12;:10;:12::i;:::-;55742:89;::::0;;-1:-1:-1;;;;;55742:89:0;;::::3;::::0;;55763:12:::3;55742:89;::::0;::::3;::::0;;;::::3;::::0;;;;;;::::3;::::0;;;;;;;;;;;;;;;;;;;;;;;;::::3;55935:40;55941:13;55956:10;55935:40;;;;;;;;;;;::::0;::::3;;;;;;;;;;;::::0;:5:::3;:40::i;:::-;46476:1;;46007::::2;;45468::::1;45530:5:::0;45508;:19;45514:12;:10;:12::i;:::-;-1:-1:-1;;;;;45508:19:0;;;;;;;;;;;;-1:-1:-1;45508:19:0;:27;;-1:-1:-1;;45508:27:0;;;;;;;;;;-1:-1:-1;;;54719:1329:0:o;62142:547::-;62217:7;62225:4;62230:7;62238;62246;62266:19;62296:6;-1:-1:-1;;;;;62288:29:0;;62326:4;62333:13;62288:59;;;;;;;;;;;;;-1:-1:-1;;;;;62288:59:0;-1:-1:-1;;;;;62288:59:0;;;;;;-1:-1:-1;;;;;62288:59:0;-1:-1:-1;;;;;62288:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;62288:59:0;62379:40;;;-1:-1:-1;;;62379:40:0;;-1:-1:-1;;;;;62379:40:0;;;;;;;;;62288:59;;-1:-1:-1;;;62387:6:0;62379:25;;;;;;:40;;;;;62288:59;;62379:40;;;;;;;;:25;:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;62379:40:0;;-1:-1:-1;62432:15:0;62450:30;62466:13;62450:15;:30::i;:::-;62432:48;;62491:19;62513:16;:14;:16::i;:::-;62564:12;;62592:14;;-1:-1:-1;62622:10:0;;-1:-1:-1;62647:7:0;;-1:-1:-1;62592:14:0;;-1:-1:-1;62142:547:0;;-1:-1:-1;;;62142:547:0:o;31508:320::-;31625:4;31661:11;-1:-1:-1;;;;;31649:23:0;:8;-1:-1:-1;;;;;31649:23:0;;:121;;;-1:-1:-1;;;;;;31690:27:0;;;;;;:17;:27;;;;;;;;:79;;;;-1:-1:-1;;;;;;31722:37:0;;;;;;;:24;:37;;;;;;;;:47;;;;;;;;;;;;31721:48;31690:79;31649:171;;;-1:-1:-1;;;;;;31787:23:0;;;;;;;:10;:23;;;;;;;;:33;;;;;;;;;;;;31649:171;31642:178;31508:320;-1:-1:-1;;;31508:320:0:o;34146:145::-;-1:-1:-1;;;;;34255:19:0;;;34228:7;34255:19;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;34146:145::o;32384:406::-;32474:12;:10;:12::i;:::-;-1:-1:-1;;;;;32462:24:0;:8;-1:-1:-1;;;;;32462:24:0;;;32454:70;;;;-1:-1:-1;;;32454:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32541:27:0;;;;;;:17;:27;;;;;;;;32537:189;;;32636:4;32585:24;:38;32610:12;:10;:12::i;:::-;-1:-1:-1;;;;;32585:38:0;;;;;;;;;;;;;;;;;-1:-1:-1;32585:38:0;;;:48;;;;;;;;;:55;;-1:-1:-1;;32585:55:0;;;;;;;;;;32537:189;;;32680:10;:24;32691:12;:10;:12::i;:::-;-1:-1:-1;;;;;32680:24:0;;;;;;;;;;;;;;;;;-1:-1:-1;32680:24:0;;;:34;;;;;;;;;32673:41;;-1:-1:-1;;32673:41:0;;;32537:189;32769:12;:10;:12::i;:::-;-1:-1:-1;;;;;32743:39:0;32759:8;-1:-1:-1;;;;;32743:39:0;;;;;;;;;;;32384:406;:::o;33616:282::-;33752:36;33766:12;:10;:12::i;:::-;33780:7;33752:13;:36::i;:::-;33744:93;;;;-1:-1:-1;;;33744:93:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33848:42;33854:7;33863:6;33871:4;33877:12;33848:5;:42::i;:::-;33616:282;;;;:::o;31318:122::-;31395:37;31401:12;:10;:12::i;:::-;31415:6;31423:4;31395:37;;;;;;;;;;;;:5;:37::i;13778:181::-;13836:7;13868:5;;;13892:6;;;;13884:46;;;;;-1:-1:-1;;;13884:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;875:106;963:10;875:106;:::o;39947:341::-;-1:-1:-1;;;;;40041:20:0;;40033:70;;;;-1:-1:-1;;;40033:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40122:21:0;;40114:69;;;;-1:-1:-1;;;40114:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;40196:19:0;;;;;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;:36;;;40248:32;;;;;;;;;;;;;;;;;39947:341;;;:::o;14234:136::-;14292:7;14319:43;14323:1;14326;14319:43;;;;;;;;;;;;;;;;;:3;:43::i;15108:471::-;15166:7;15411:6;15407:47;;-1:-1:-1;15441:1:0;15434:8;;15407:47;15478:5;;;15482:1;15478;:5;:1;15502:5;;;;;:10;15494:56;;;;-1:-1:-1;;;15494:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16047:132;16105:7;16132:39;16136:1;16139;16132:39;;;;;;;;;;;;;;;;;:3;:39::i;40772:498::-;41025:78;;;-1:-1:-1;;;41025:78:0;;-1:-1:-1;;;;;41025:78:0;;;;;;27377:66;41025:78;;;;;;41003:19;;26898:42;;41025:41;;:78;;;;;;;;;;;;;;;26898:42;41025:78;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41025:78:0;;-1:-1:-1;;;;;;41118:25:0;;;41114:149;;41174:11;-1:-1:-1;;;;;41160:39:0;;41200:8;41210:4;41216:2;41220:6;41228:8;41238:12;41160:91;;;;;;;;;;;;;-1:-1:-1;;;;;41160:91:0;-1:-1:-1;;;;;41160:91:0;;;;;;-1:-1:-1;;;;;41160:91:0;-1:-1:-1;;;;;41160:91:0;;;;;;-1:-1:-1;;;;;41160:91:0;-1:-1:-1;;;;;41160:91:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41160:91:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41114:149;40772:498;;;;;;;:::o;39258:544::-;39477:48;39498:8;39508:4;39514:2;39518:6;39477:20;:48::i;:::-;39556:70;39576:6;39556:70;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;39556:15:0;;:9;:15;;;;;;;;;;;;:70;;:19;:70;:::i;:::-;-1:-1:-1;;;;;39538:15:0;;;:9;:15;;;;;;;;;;;:88;;;;39653:13;;;;;;;:25;;39671:6;39653:25;:17;:25;:::i;:::-;39637:9;:13;39647:2;-1:-1:-1;;;;;39637:13:0;-1:-1:-1;;;;;39637:13:0;;;;;;;;;;;;:41;;;;39717:2;-1:-1:-1;;;;;39696:56:0;39711:4;-1:-1:-1;;;;;39696:56:0;39701:8;-1:-1:-1;;;;;39696:56:0;;39721:6;39729:8;39739:12;39696:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39696:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39783:2;-1:-1:-1;;;;;39768:26:0;39777:4;-1:-1:-1;;;;;39768:26:0;;39787:6;39768:26;;;;;;;;;;;;;;;;;;39258:544;;;;;;:::o;14665:192::-;14751:7;14787:12;14779:6;;;;14771:29;;;;-1:-1:-1;;;14771:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;14823:5:0;;;14665:192::o;41972:705::-;42262:79;;;-1:-1:-1;;;42262:79:0;;-1:-1:-1;;;;;42262:79:0;;;;;;27564:66;42262:79;;;;;;42240:19;;26898:42;;42262:41;;:79;;;;;;;;;;;;;;;26898:42;42262:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42262:79:0;;-1:-1:-1;;;;;;42356:25:0;;;42352:318;;42415:11;-1:-1:-1;;;;;42398:44:0;;42443:8;42453:4;42459:2;42463:6;42471:8;42481:12;42398:96;;;;;;;;;;;;;-1:-1:-1;;;;;42398:96:0;-1:-1:-1;;;;;42398:96:0;;;;;;-1:-1:-1;;;;;42398:96:0;-1:-1:-1;;;;;42398:96:0;;;;;;-1:-1:-1;;;;;42398:96:0;-1:-1:-1;;;;;42398:96:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42398:96:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42352:318;;;42516:19;42512:158;;;42561:15;:2;-1:-1:-1;;;;;42561:13:0;;:15::i;:::-;42560:16;42552:106;;;;-1:-1:-1;;;42552:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43836;43894:7;43925:1;43921;:5;:13;;43933:1;43921:13;;;-1:-1:-1;43929:1:0;;43836:106;-1:-1:-1;43836:106:0:o;37514:674::-;-1:-1:-1;;;;;37750:18:0;;37742:65;;;;-1:-1:-1;;;37742:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37826:16:0;;37818:61;;;;;-1:-1:-1;;;37818:61:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37892:16;37911:12;:10;:12::i;:::-;37892:31;;37936:69;37954:8;37964:4;37970:2;37974:6;37982:8;37992:12;37936:17;:69::i;:::-;38018:57;38024:8;38034:4;38040:2;38044:6;38052:8;38062:12;38018:5;:57::i;:::-;38088:92;38108:8;38118:4;38124:2;38128:6;38136:8;38146:12;38160:19;38088;:92::i;38502:748::-;-1:-1:-1;;;;;38686:18:0;;38678:65;;;;-1:-1:-1;;;38678:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38756:16;38775:12;:10;:12::i;:::-;38756:31;;38800:56;38821:8;38831:4;38845:1;38849:6;38800:20;:56::i;:::-;38869:73;38887:8;38897:4;38911:1;38915:6;38923:4;38929:12;38869:17;:73::i;:::-;39008:66;39028:6;39008:66;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;39008:15:0;;:9;:15;;;;;;;;;;;;:66;;:19;:66;:::i;:::-;-1:-1:-1;;;;;38990:15:0;;:9;:15;;;;;;;;;;:84;39100:12;;:24;;39117:6;39100:24;:16;:24;:::i;:::-;39085:12;:39;;;;39159:4;-1:-1:-1;;;;;39142:50:0;39149:8;-1:-1:-1;;;;;39142:50:0;;39165:6;39173:4;39179:12;39142:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39142:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39208:34;;;;;;;;39231:1;;-1:-1:-1;;;;;39208:34:0;;;;;;;;;;;;38502:748;;;;;:::o;36280:747::-;-1:-1:-1;;;;;36467:21:0;;36459:66;;;;;-1:-1:-1;;;36459:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36538:16;36557:12;:10;:12::i;:::-;36538:31;;36582:59;36603:8;36621:1;36625:7;36634:6;36582:20;:59::i;:::-;36704:12;;:24;;36721:6;36704:24;:16;:24;:::i;:::-;36689:12;:39;-1:-1:-1;;;;;36760:18:0;;:9;:18;;;;;;;;;;;:30;;36783:6;36760:30;:22;:30;:::i;:::-;-1:-1:-1;;;;;36739:18:0;;:9;:18;;;;;;;;;;:51;;;;36803:88;;36823:8;;36749:7;36854:6;36862:8;36872:12;36886:4;36803:19;:88::i;:::-;36926:7;-1:-1:-1;;;;;36909:57:0;36916:8;-1:-1:-1;;;;;36909:57:0;;36935:6;36943:8;36953:12;36909:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36909:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36982:37;;;;;;;;-1:-1:-1;;;;;36982:37:0;;;36999:1;;36982:37;;;;;;;;;36280:747;;;;;:::o;16667:345::-;16753:7;16855:12;16848:5;16840:28;;;;-1:-1:-1;;;16840:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16879:9;16895:1;16891;:5;;;;;;;16667:345;-1:-1:-1;;;;;16667:345:0:o;19011:619::-;19071:4;19539:20;;19382:66;19579:23;;;;;;:42;;-1:-1:-1;19606:15:0;;;19579:42;19571:51;19011:619;-1:-1:-1;;;;19011:619:0:o

Swarm Source

ipfs://9a443e8f1673384126ace78d3da1f585a17cbca92ca3cadaa317a1c76e95578b
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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