Feature Tip: Add private address tag to any address under My Name Tag !
ERC-20
Overview
Max Total Supply
3,057.73333333333371637 JCoin
Holders
5
Total Transfers
-
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
JCoin
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-03-25 */ // SPDX-License-Identifier: UNLICENSED pragma solidity 0.6.12; /** * @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) { 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; } } /** * @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); } abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor (address owner) internal { _owner = owner; emit OwnershipTransferred(address(0), owner); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public onlyOwner { _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). */ function _transferOwnership(address newOwner) internal { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin guidelines: functions revert instead * of returning `false` on failure. This behavior is nonetheless conventional * and does not conflict with the expectations of ERC20 applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Ownable, IERC20 { using SafeMath for uint256; mapping (address => uint256) private _balances; mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; uint8 private _decimals; /** * @dev Sets the values for {name} and {symbol}, initializes {decimals} with * a default value of 6. * * To select a different value for {decimals}, use {_setupDecimals}. * * All three of these values are immutable: they can only be set once during * construction. */ constructor (address owner_, string memory name_, string memory symbol_) public Ownable(owner_) { _name = name_; _symbol = symbol_; _decimals = 18; } /** * @dev Returns the name of the token. */ function name() public view returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5,05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is * called. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view returns (uint8) { return _decimals; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view override returns (uint256) { return _totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) { _transfer(sender, recipient, amount); _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance")); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue)); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero")); return true; } /** * @dev Moves tokens `amount` from `sender` to `recipient`. * * This is internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer(address sender, address recipient, uint256 amount) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance"); _balances[recipient] = _balances[recipient].add(amount); emit Transfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `to` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); _beforeTokenTransfer(address(0), account, amount); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance"); _totalSupply = _totalSupply.sub(amount); emit Transfer(account, address(0), amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve(address owner, address spender, uint256 amount) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Sets {decimals} to a value other than the default one of 18. * * WARNING: This function should only be called from the constructor. Most * applications that interact with token contracts will not expect * {decimals} to ever change, and may work incorrectly if it does. */ function _setupDecimals(uint8 decimals_) internal { _decimals = decimals_; } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be to transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { } } /** * @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) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } contract JCoin is ERC20 { using SafeERC20 for IERC20; bool public isSwapPaused; address public revenueOwner; uint32 public interestBasisPoints; // 1 basis point = 0.01%; 10000 basis points = 100% IERC20 public lockedToken; uint256 public unlockTimestamp; mapping(address/*asset*/ => uint256/*price*/) public assets; // address(0) = ETH uint256 private constant ONE = 10**18; event Swap(address indexed buyer, address indexed fromAsset, // address(0) = ETH uint256 fromAmount, uint256 toAmount, uint32 indexed refCode); event GetUnlocked(address indexed buyer, uint256 burnAmount, uint256 unlockedAmount); event Withdraw(address indexed msgSender, bool isMsgSenderRevenueOwner, bool isEth, address indexed to, uint256 amount); event SetPrice(address indexed asset, uint256 price); event SwapPause(bool on); event SetRevenueOwner(address indexed msgSender, address indexed newRevenueOwner); // Constructor: //-------------------------------------------------------------------------------------------------------------------------- constructor(address _owner, string memory _name, string memory _symbol, address _revenueOwner, uint32 _interestBasisPoints, IERC20 _lockedToken, uint256 _unlockTimestamp, address[] memory _assetAddresses, uint256[] memory _assetPrices) public ERC20(_owner, _name, _symbol) { require(_assetAddresses.length == _assetPrices.length); revenueOwner = _revenueOwner; emit SetRevenueOwner(_msgSender(), _revenueOwner); interestBasisPoints = _interestBasisPoints; lockedToken = _lockedToken; unlockTimestamp = _unlockTimestamp; for(uint32 i = 0; i < _assetPrices.length; ++i) { assets[_assetAddresses[i]] = _assetPrices[i]; emit SetPrice(_assetAddresses[i], _assetPrices[i]); } emit SwapPause(false); } //-------------------------------------------------------------------------------------------------------------------------- // Revenue owner methods: //-------------------------------------------------------------------------------------------------------------------------- modifier onlyRevenueOwner() { require(revenueOwner == _msgSender(), "ERR_MSG_SENDER_NOT_REVENUE_OWNER"); _; } function setRevenueOwner(address payable _newRevenueOwner) external onlyRevenueOwner { revenueOwner = _newRevenueOwner; emit SetRevenueOwner(_msgSender(), _newRevenueOwner); } function withdrawEth(address payable _to, uint256 _amount) external onlyRevenueOwner { _withdrawEth(_to, _amount); } function withdrawLockedToken(address _to, uint256 _amount) external onlyRevenueOwner { _withdrawLockedToken(_to, _amount); } //-------------------------------------------------------------------------------------------------------------------------- // Owner methods: //-------------------------------------------------------------------------------------------------------------------------- function withdrawEth(uint256 _amount) external onlyOwner { _withdrawEth(payable(revenueOwner), _amount); } function withdrawLockedToken(uint256 _amount) external onlyOwner { _withdrawLockedToken(revenueOwner, _amount); } function setPrices(address[] calldata _assetAddresses, uint256[] calldata _assetPrices) external onlyOwner { require(_assetAddresses.length == _assetPrices.length, "ERR_ARRAYS_LENGTHS_DONT_MATCH"); for(uint32 i = 0; i < _assetAddresses.length; ++i) { assets[_assetAddresses[i]] = _assetPrices[i]; emit SetPrice(_assetAddresses[i], _assetPrices[i]); } } function swapPause(bool _on) external onlyOwner { require(isSwapPaused != _on); isSwapPaused = _on; emit SwapPause(_on); } //-------------------------------------------------------------------------------------------------------------------------- // Withdraw helpers: //-------------------------------------------------------------------------------------------------------------------------- function _withdrawEth(address payable _to, uint256 _amount) private { if(_amount == 0) { _amount = address(this).balance; } _to.transfer(_amount); emit Withdraw(_msgSender(), _msgSender() == revenueOwner, true, _to, _amount); } function _withdrawLockedToken(address _to, uint256 _amount) private { uint256 collateralAmount = collateralAmount(); if(_amount == 0) { _amount = lockedToken.balanceOf(address(this)) - collateralAmount; } lockedToken.safeTransfer(_to, _amount); require(lockedToken.balanceOf(address(this)) >= collateralAmount, "ERR_INVALID_AMOUNT"); emit Withdraw(_msgSender(), _msgSender() == revenueOwner, false, _to, _amount); } //-------------------------------------------------------------------------------------------------------------------------- // Price calculator: //-------------------------------------------------------------------------------------------------------------------------- function calcPrice(address _fromAsset, uint256 _fromAmount) public view returns (uint256 toActualAmount_, uint256 fromActualAmount_) { require(_fromAmount > 0, "ERR_ZERO_PAYMENT"); uint256 fromAssetPrice = assets[_fromAsset]; require(fromAssetPrice > 0, "ERR_ASSET_NOT_SUPPORTED"); if(isSwapPaused) return (0, 0); uint256 toAvailableForSell = availableForSellAmount(); fromActualAmount_ = _fromAmount; toActualAmount_ = _fromAmount.mul(ONE).div(fromAssetPrice); if(toActualAmount_ > toAvailableForSell) { toActualAmount_ = toAvailableForSell; fromActualAmount_ = toAvailableForSell.mul(fromAssetPrice).div(ONE); } } //-------------------------------------------------------------------------------------------------------------------------- // Swap: //-------------------------------------------------------------------------------------------------------------------------- function swapFromEth(uint256 _toExpectedAmount, uint32 _refCode) external payable { _swap(address(0), msg.value, _toExpectedAmount, _refCode); } function swapFromErc20(IERC20 _fromAsset, uint256 _toExpectedAmount, uint32 _refCode) external { require(address(_fromAsset) != address(0), "ERR_WRONG_SWAP_FUNCTION"); uint256 fromAmount = _fromAsset.allowance(_msgSender(), address(this)); _fromAsset.safeTransferFrom(_msgSender(), revenueOwner, fromAmount); _swap(address(_fromAsset), fromAmount, _toExpectedAmount, _refCode); } function _swap(address _fromAsset, uint256 _fromAmount, uint256 _toExpectedAmount, uint32 _refCode) private { require(!isSwapPaused, "ERR_SWAP_PAUSED"); require(_toExpectedAmount > 0, "ERR_ZERO_EXPECTED_AMOUNT"); (uint256 toActualAmount, uint256 fromActualAmount) = calcPrice(_fromAsset, _fromAmount); require(_validateAmount(toActualAmount, _toExpectedAmount), "ERR_EXPECTED_AMOUNT_MISMATCH"); require(_fromAmount == fromActualAmount, "ERR_WRONG_PAYMENT_AMOUNT"); _mint(_msgSender(), toActualAmount); emit Swap(_msgSender(), _fromAsset, _fromAmount, toActualAmount, _refCode); } function _validateAmount(uint256 _a, uint256 _b) private pure returns (bool) { return _a > _b ? (_a - _b <= 10**14) : (_b - _a <= 10**14); } //-------------------------------------------------------------------------------------------------------------------------- // Get unlocked: //-------------------------------------------------------------------------------------------------------------------------- function getUnlocked(uint256 _amount) external { require(unlockTimestamp <= now, "ERR_NOT_YET_UNLOCKED"); if(_amount == 0) _amount = balanceOf(_msgSender()); _burn(_msgSender(), _amount); uint256 unlockedAmount = _getAmountWithInterest(_amount); lockedToken.safeTransfer(_msgSender(), unlockedAmount); emit GetUnlocked(_msgSender(), _amount, unlockedAmount); } //-------------------------------------------------------------------------------------------------------------------------- // Interest and collateral: //-------------------------------------------------------------------------------------------------------------------------- function _getAmountWithInterest(uint256 _amount) private view returns (uint256) { return _amount.add(_amount.mul(interestBasisPoints) / 10000); } function collateralAmount() public view returns (uint256) { return _getAmountWithInterest(totalSupply()); } function availableForSellAmount() public view returns (uint256) { return (lockedToken.balanceOf(address(this)).sub(collateralAmount())).mul(10000) / (10000 + interestBasisPoints); } //-------------------------------------------------------------------------------------------------------------------------- }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"address","name":"_revenueOwner","type":"address"},{"internalType":"uint32","name":"_interestBasisPoints","type":"uint32"},{"internalType":"contract IERC20","name":"_lockedToken","type":"address"},{"internalType":"uint256","name":"_unlockTimestamp","type":"uint256"},{"internalType":"address[]","name":"_assetAddresses","type":"address[]"},{"internalType":"uint256[]","name":"_assetPrices","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":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"burnAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"unlockedAmount","type":"uint256"}],"name":"GetUnlocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"asset","type":"address"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"SetPrice","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"msgSender","type":"address"},{"indexed":true,"internalType":"address","name":"newRevenueOwner","type":"address"}],"name":"SetRevenueOwner","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":true,"internalType":"address","name":"fromAsset","type":"address"},{"indexed":false,"internalType":"uint256","name":"fromAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toAmount","type":"uint256"},{"indexed":true,"internalType":"uint32","name":"refCode","type":"uint32"}],"name":"Swap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"on","type":"bool"}],"name":"SwapPause","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":true,"internalType":"address","name":"msgSender","type":"address"},{"indexed":false,"internalType":"bool","name":"isMsgSenderRevenueOwner","type":"bool"},{"indexed":false,"internalType":"bool","name":"isEth","type":"bool"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"assets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"availableForSellAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_fromAsset","type":"address"},{"internalType":"uint256","name":"_fromAmount","type":"uint256"}],"name":"calcPrice","outputs":[{"internalType":"uint256","name":"toActualAmount_","type":"uint256"},{"internalType":"uint256","name":"fromActualAmount_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collateralAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"getUnlocked","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"interestBasisPoints","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSwapPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockedToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revenueOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_assetAddresses","type":"address[]"},{"internalType":"uint256[]","name":"_assetPrices","type":"uint256[]"}],"name":"setPrices","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"_newRevenueOwner","type":"address"}],"name":"setRevenueOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_fromAsset","type":"address"},{"internalType":"uint256","name":"_toExpectedAmount","type":"uint256"},{"internalType":"uint32","name":"_refCode","type":"uint32"}],"name":"swapFromErc20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_toExpectedAmount","type":"uint256"},{"internalType":"uint32","name":"_refCode","type":"uint32"}],"name":"swapFromEth","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bool","name":"_on","type":"bool"}],"name":"swapPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unlockTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawLockedToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawLockedToken","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604051620046a7380380620046a783398181016040526101208110156200003857600080fd5b8101908080519060200190929190805160405193929190846401000000008211156200006357600080fd5b838201915060208201858111156200007a57600080fd5b82518660018202830111640100000000821117156200009857600080fd5b8083526020830192505050908051906020019080838360005b83811015620000ce578082015181840152602081019050620000b1565b50505050905090810190601f168015620000fc5780820380516001836020036101000a031916815260200191505b50604052602001805160405193929190846401000000008211156200012057600080fd5b838201915060208201858111156200013757600080fd5b82518660018202830111640100000000821117156200015557600080fd5b8083526020830192505050908051906020019080838360005b838110156200018b5780820151818401526020810190506200016e565b50505050905090810190601f168015620001b95780820380516001836020036101000a031916815260200191505b5060405260200180519060200190929190805190602001909291908051906020019092919080519060200190929190805160405193929190846401000000008211156200020557600080fd5b838201915060208201858111156200021c57600080fd5b82518660208202830111640100000000821117156200023a57600080fd5b8083526020830192505050908051906020019060200280838360005b838110156200027357808201518184015260208101905062000256565b50505050905001604052602001805160405193929190846401000000008211156200029d57600080fd5b83820191506020820185811115620002b457600080fd5b8251866020820283011164010000000082111715620002d257600080fd5b8083526020830192505050908051906020019060200280838360005b838110156200030b578082015181840152602081019050620002ee565b5050505090500160405250505088888882806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3508160049080519060200190620003d092919062000696565b508060059080519060200190620003e992919062000696565b506012600660006101000a81548160ff021916908360ff16021790555050505080518251146200041857600080fd5b85600660026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508573ffffffffffffffffffffffffffffffffffffffff16620004806200068e60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff167fe4eda84b169f86de2634dab43df96dba581c2d8197f7f12446ae1e12c28d761560405160405180910390a384600660166101000a81548163ffffffff021916908363ffffffff16021790555083600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508260088190555060005b81518163ffffffff1610156200064457818163ffffffff16815181106200055157fe5b602002602001015160096000858463ffffffff16815181106200057057fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550828163ffffffff1681518110620005c957fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff167f95dce27040c59c8b1c445b284f81a3aaae6eecd7d08d5c7684faee64cdb514a1838363ffffffff16815181106200061b57fe5b60200260200101516040518082815260200191505060405180910390a28060010190506200052e565b507f312d72ca021d177c56f65b37b2540c610a21e44bba0064fcc02be2c857c94dfc600060405180821515815260200191505060405180910390a15050505050505050506200073c565b600033905090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620006d957805160ff19168380011785556200070a565b828001600101855582156200070a579182015b8281111562000709578251825591602001919060010190620006ec565b5b5090506200071991906200071d565b5090565b5b80821115620007385760008160009055506001016200071e565b5090565b613f5b806200074c6000396000f3fe6080604052600436106101ee5760003560e01c80638da5cb5b1161010d578063ae2ef271116100a0578063dec6b4d71161006f578063dec6b4d714610bac578063eaf3b7c214610bed578063f11b818814610c28578063f2fde38b14610c8d578063f925081b14610cde576101ee565b8063ae2ef27114610a54578063b136e29914610a81578063c311d04914610aec578063dd62ed3e14610b27576101ee565b8063a457c2d7116100dc578063a457c2d714610916578063a76c671914610987578063a9059cbb146109b8578063aa082a9d14610a29576101ee565b80638da5cb5b146107bf57806392d09ceb1461080057806395d89b411461082b578063a0e69543146108bb576101ee565b8063395093511161018557806370a082311161015457806370a0823114610692578063715018a6146106f757806383c406f51461070e5780638d01857b14610784576101ee565b806339509351146104cb5780634352fa9f1461053c5780635b13d382146106175780635bb04b4f14610654576101ee565b806318160ddd116101c157806318160ddd146103865780631b9a91a4146103b157806323b872dd1461040c578063313ce5671461049d576101ee565b806306fdde03146101f3578063095ea7b3146102835780630d77c9ef146102f45780630f45cc8114610345575b600080fd5b3480156101ff57600080fd5b50610208610d09565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561024857808201518184015260208101905061022d565b50505050905090810190601f1680156102755780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561028f57600080fd5b506102dc600480360360408110156102a657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610dab565b60405180821515815260200191505060405180910390f35b34801561030057600080fd5b506103436004803603602081101561031757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610dc9565b005b34801561035157600080fd5b5061035a610f38565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561039257600080fd5b5061039b610f5e565b6040518082815260200191505060405180910390f35b3480156103bd57600080fd5b5061040a600480360360408110156103d457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610f68565b005b34801561041857600080fd5b506104856004803603606081101561042f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611040565b60405180821515815260200191505060405180910390f35b3480156104a957600080fd5b506104b2611119565b604051808260ff16815260200191505060405180910390f35b3480156104d757600080fd5b50610524600480360360408110156104ee57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611130565b60405180821515815260200191505060405180910390f35b34801561054857600080fd5b506106156004803603604081101561055f57600080fd5b810190808035906020019064010000000081111561057c57600080fd5b82018360208201111561058e57600080fd5b803590602001918460208302840111640100000000831117156105b057600080fd5b9091929391929390803590602001906401000000008111156105d157600080fd5b8201836020820111156105e357600080fd5b8035906020019184602083028401116401000000008311171561060557600080fd5b90919293919293905050506111e3565b005b34801561062357600080fd5b506106526004803603602081101561063a57600080fd5b8101908080351515906020019092919050505061146a565b005b6106906004803603604081101561066a57600080fd5b8101908080359060200190929190803563ffffffff1690602001909291905050506115a8565b005b34801561069e57600080fd5b506106e1600480360360208110156106b557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506115b9565b6040518082815260200191505060405180910390f35b34801561070357600080fd5b5061070c611602565b005b34801561071a57600080fd5b506107676004803603604081101561073157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611788565b604051808381526020018281526020019250505060405180910390f35b34801561079057600080fd5b506107bd600480360360208110156107a757600080fd5b8101908080359060200190929190505050611960565b005b3480156107cb57600080fd5b506107d4611a57565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561080c57600080fd5b50610815611a80565b6040518082815260200191505060405180910390f35b34801561083757600080fd5b50610840611a97565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610880578082015181840152602081019050610865565b50505050905090810190601f1680156108ad5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156108c757600080fd5b50610914600480360360408110156108de57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611b39565b005b34801561092257600080fd5b5061096f6004803603604081101561093957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611c11565b60405180821515815260200191505060405180910390f35b34801561099357600080fd5b5061099c611cde565b604051808263ffffffff16815260200191505060405180910390f35b3480156109c457600080fd5b50610a11600480360360408110156109db57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611cf4565b60405180821515815260200191505060405180910390f35b348015610a3557600080fd5b50610a3e611d12565b6040518082815260200191505060405180910390f35b348015610a6057600080fd5b50610a69611d18565b60405180821515815260200191505060405180910390f35b348015610a8d57600080fd5b50610aea60048036036060811015610aa457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803563ffffffff169060200190929190505050611d2b565b005b348015610af857600080fd5b50610b2560048036036020811015610b0f57600080fd5b8101908080359060200190929190505050611f01565b005b348015610b3357600080fd5b50610b9660048036036040811015610b4a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611ff8565b6040518082815260200191505060405180910390f35b348015610bb857600080fd5b50610bc161207f565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610bf957600080fd5b50610c2660048036036020811015610c1057600080fd5b81019080803590602001909291905050506120a5565b005b348015610c3457600080fd5b50610c7760048036036020811015610c4b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061220c565b6040518082815260200191505060405180910390f35b348015610c9957600080fd5b50610cdc60048036036020811015610cb057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612224565b005b348015610cea57600080fd5b50610cf36122f8565b6040518082815260200191505060405180910390f35b606060048054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610da15780601f10610d7657610100808354040283529160200191610da1565b820191906000526020600020905b815481529060010190602001808311610d8457829003601f168201915b5050505050905090565b6000610dbf610db8612415565b848461241d565b6001905092915050565b610dd1612415565b73ffffffffffffffffffffffffffffffffffffffff16600660029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e93576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4552525f4d53475f53454e4445525f4e4f545f524556454e55455f4f574e455281525060200191505060405180910390fd5b80600660026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16610ef3612415565b73ffffffffffffffffffffffffffffffffffffffff167fe4eda84b169f86de2634dab43df96dba581c2d8197f7f12446ae1e12c28d761560405160405180910390a350565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600354905090565b610f70612415565b73ffffffffffffffffffffffffffffffffffffffff16600660029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611032576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4552525f4d53475f53454e4445525f4e4f545f524556454e55455f4f574e455281525060200191505060405180910390fd5b61103c8282612614565b5050565b600061104d848484612744565b61110e84611059612415565b61110985604051806060016040528060288152602001613e4560289139600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006110bf612415565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612a099092919063ffffffff16565b61241d565b600190509392505050565b6000600660009054906101000a900460ff16905090565b60006111d961113d612415565b846111d4856002600061114e612415565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612ac990919063ffffffff16565b61241d565b6001905092915050565b6111eb612415565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146112ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b818190508484905014611326576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f4552525f4152524159535f4c454e475448535f444f4e545f4d4154434800000081525060200191505060405180910390fd5b60005b848490508163ffffffff1610156114635782828263ffffffff1681811061134c57fe5b905060200201356009600087878563ffffffff1681811061136957fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555084848263ffffffff168181106113d657fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f95dce27040c59c8b1c445b284f81a3aaae6eecd7d08d5c7684faee64cdb514a184848463ffffffff1681811061143c57fe5b905060200201356040518082815260200191505060405180910390a2806001019050611329565b5050505050565b611472612415565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611532576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b801515600660019054906101000a900460ff161515141561155257600080fd5b80600660016101000a81548160ff0219169083151502179055507f312d72ca021d177c56f65b37b2540c610a21e44bba0064fcc02be2c857c94dfc8160405180821515815260200191505060405180910390a150565b6115b56000348484612b51565b5050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61160a612415565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146116ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60008060008311611801576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f4552525f5a45524f5f5041594d454e540000000000000000000000000000000081525060200191505060405180910390fd5b6000600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600081116118bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f4552525f41535345545f4e4f545f535550504f5254454400000000000000000081525060200191505060405180910390fd5b600660019054906101000a900460ff16156118dd576000809250925050611959565b60006118e76122f8565b90508492506119198261190b670de0b6b3a764000088612de090919063ffffffff16565b612e6690919063ffffffff16565b93508084111561195657809350611953670de0b6b3a76400006119458484612de090919063ffffffff16565b612e6690919063ffffffff16565b92505b50505b9250929050565b611968612415565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611a28576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b611a54600660029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682612eb0565b50565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000611a92611a8d610f5e565b6131f1565b905090565b606060058054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611b2f5780601f10611b0457610100808354040283529160200191611b2f565b820191906000526020600020905b815481529060010190602001808311611b1257829003601f168201915b5050505050905090565b611b41612415565b73ffffffffffffffffffffffffffffffffffffffff16600660029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611c03576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4552525f4d53475f53454e4445525f4e4f545f524556454e55455f4f574e455281525060200191505060405180910390fd5b611c0d8282612eb0565b5050565b6000611cd4611c1e612415565b84611ccf85604051806060016040528060258152602001613f016025913960026000611c48612415565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612a099092919063ffffffff16565b61241d565b6001905092915050565b600660169054906101000a900463ffffffff1681565b6000611d08611d01612415565b8484612744565b6001905092915050565b60085481565b600660019054906101000a900460ff1681565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611dce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f4552525f57524f4e475f535741505f46554e4354494f4e00000000000000000081525060200191505060405180910390fd5b60008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e611df4612415565b306040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b158015611e5c57600080fd5b505afa158015611e70573d6000803e3d6000fd5b505050506040513d6020811015611e8657600080fd5b81019080805190602001909291905050509050611eef611ea4612415565b600660029054906101000a900473ffffffffffffffffffffffffffffffffffffffff16838773ffffffffffffffffffffffffffffffffffffffff16613242909392919063ffffffff16565b611efb84828585612b51565b50505050565b611f09612415565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611fc9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b611ff5600660029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682612614565b50565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600660029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b42600854111561211d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4552525f4e4f545f5945545f554e4c4f434b454400000000000000000000000081525060200191505060405180910390fd5b600081141561213957612136612131612415565b6115b9565b90505b61214a612144612415565b82613303565b6000612155826131f1565b90506121ab612162612415565b82600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166134c99092919063ffffffff16565b6121b3612415565b73ffffffffffffffffffffffffffffffffffffffff167fdf2f45720c721a4efe46d90b1ab992c559316bc5bad60e3c559631ec40ee54318383604051808381526020018281526020019250505060405180910390a25050565b60096020528060005260406000206000915090505481565b61222c612415565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146122ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6122f58161356b565b50565b6000600660169054906101000a900463ffffffff166127100163ffffffff166124086127106123fa612328611a80565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156123b157600080fd5b505afa1580156123c5573d6000803e3d6000fd5b505050506040513d60208110156123db57600080fd5b81019080805190602001909291905050506136ae90919063ffffffff16565b612de090919063ffffffff16565b8161240f57fe5b04905090565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156124a3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180613eb36024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612529576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180613db66022913960400191505060405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b6000811415612621574790505b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015612667573d6000803e3d6000fd5b508173ffffffffffffffffffffffffffffffffffffffff16612687612415565b73ffffffffffffffffffffffffffffffffffffffff167f360d00e4a2309e5de1072a0e3bd0b848ffcec72efe000944922f6c71782c76db600660029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166126ff612415565b73ffffffffffffffffffffffffffffffffffffffff16146001856040518084151581526020018315158152602001828152602001935050505060405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156127ca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180613e8e6025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612850576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180613d4b6023913960400191505060405180910390fd5b61285b8383836136f8565b6128c781604051806060016040528060268152602001613dd860269139600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612a099092919063ffffffff16565b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061295c81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612ac990919063ffffffff16565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b6000838311158290612ab6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612a7b578082015181840152602081019050612a60565b50505050905090810190601f168015612aa85780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b600080828401905083811015612b47576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600660019054906101000a900460ff1615612bd4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f4552525f535741505f504155534544000000000000000000000000000000000081525060200191505060405180910390fd5b60008211612c4a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f4552525f5a45524f5f45585045435445445f414d4f554e54000000000000000081525060200191505060405180910390fd5b600080612c578686611788565b91509150612c6582856136fd565b612cd7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4552525f45585045435445445f414d4f554e545f4d49534d415443480000000081525060200191505060405180910390fd5b808514612d4c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f4552525f57524f4e475f5041594d454e545f414d4f554e54000000000000000081525060200191505060405180910390fd5b612d5d612d57612415565b8361372c565b8263ffffffff168673ffffffffffffffffffffffffffffffffffffffff16612d83612415565b73ffffffffffffffffffffffffffffffffffffffff167fc882928881e33d45dd26a8fa23de7ae554add97f4347ee9526b1c467afa0d9ca8886604051808381526020018281526020019250505060405180910390a4505050505050565b600080831415612df35760009050612e60565b6000828402905082848281612e0457fe5b0414612e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613e246021913960400191505060405180910390fd5b809150505b92915050565b6000612ea883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506138f5565b905092915050565b6000612eba611a80565b90506000821415612f8e5780600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612f4f57600080fd5b505afa158015612f63573d6000803e3d6000fd5b505050506040513d6020811015612f7957600080fd5b81019080805190602001909291905050500391505b612fdb8383600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166134c99092919063ffffffff16565b80600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561306557600080fd5b505afa158015613079573d6000803e3d6000fd5b505050506040513d602081101561308f57600080fd5b81019080805190602001909291905050501015613114576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f4552525f494e56414c49445f414d4f554e54000000000000000000000000000081525060200191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff16613133612415565b73ffffffffffffffffffffffffffffffffffffffff167f360d00e4a2309e5de1072a0e3bd0b848ffcec72efe000944922f6c71782c76db600660029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166131ab612415565b73ffffffffffffffffffffffffffffffffffffffff16146000866040518084151581526020018315158152602001828152602001935050505060405180910390a3505050565b600061323b612710613224600660169054906101000a900463ffffffff1663ffffffff1685612de090919063ffffffff16565b8161322b57fe5b0483612ac990919063ffffffff16565b9050919050565b6132fd846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506139bb565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613389576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613e6d6021913960400191505060405180910390fd5b613395826000836136f8565b61340181604051806060016040528060228152602001613d6e60229139600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612a099092919063ffffffff16565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613459816003546136ae90919063ffffffff16565b600381905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b6135668363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506139bb565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156135f1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180613d906026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006136f083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612a09565b905092915050565b505050565b600081831161371757655af3107a40008383031115613724565b655af3107a400082840311155b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156137cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b6137db600083836136f8565b6137f081600354612ac990919063ffffffff16565b60038190555061384881600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612ac990919063ffffffff16565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b600080831182906139a1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561396657808201518184015260208101905061394b565b50505050905090810190601f1680156139935780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816139ad57fe5b049050809150509392505050565b6060613a1d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16613aaa9092919063ffffffff16565b9050600081511115613aa557808060200190516020811015613a3e57600080fd5b8101908080519060200190929190505050613aa4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180613ed7602a913960400191505060405180910390fd5b5b505050565b6060613ab98484600085613ac2565b90509392505050565b606082471015613b1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180613dfe6026913960400191505060405180910390fd5b613b2685613c6b565b613b98576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b60208310613be85780518252602082019150602081019050602083039250613bc5565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613c4a576040519150601f19603f3d011682016040523d82523d6000602084013e613c4f565b606091505b5091509150613c5f828286613c7e565b92505050949350505050565b600080823b905060008111915050919050565b60608315613c8e57829050613d43565b600083511115613ca15782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613d08578082015181840152602081019050613ced565b50505050905090810190601f168015613d355780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b939250505056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e63654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573735361666545524332303a204552433230206f7065726174696f6e20646964206e6f74207375636365656445524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212203075687ef6353ccff88e3a62af9e696d4b13d6d3db2a4544e1b9bb43da4a87c964736f6c634300060c0033000000000000000000000000283f1a655d5282ca8d101262a14ae7237ffecc91000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001600000000000000000000000009871b829359c0edba1eb55722e25a8cbf7b4dead00000000000000000000000000000000000000000000000000000000000222e00000000000000000000000007420b4b9a0110cdc71fb720908340c03f9bc03ec0000000000000000000000000000000000000000000000000000000061564f8000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000000054a436f696e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054a436f696e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000006b175474e89094c44da98b954eedeac495271d0f0000000000000000000000004fabb145d64652a948d72533023f6e7a623c7c53000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000038d7ea4c68000000000000000000000000000000000000000000000000000000000000016e360000000000000000000000000000000000000000000000000000000000016e36000000000000000000000000000000000000000000000000014d1120d7b16000000000000000000000000000000000000000000000000000014d1120d7b160000
Deployed Bytecode
0x6080604052600436106101ee5760003560e01c80638da5cb5b1161010d578063ae2ef271116100a0578063dec6b4d71161006f578063dec6b4d714610bac578063eaf3b7c214610bed578063f11b818814610c28578063f2fde38b14610c8d578063f925081b14610cde576101ee565b8063ae2ef27114610a54578063b136e29914610a81578063c311d04914610aec578063dd62ed3e14610b27576101ee565b8063a457c2d7116100dc578063a457c2d714610916578063a76c671914610987578063a9059cbb146109b8578063aa082a9d14610a29576101ee565b80638da5cb5b146107bf57806392d09ceb1461080057806395d89b411461082b578063a0e69543146108bb576101ee565b8063395093511161018557806370a082311161015457806370a0823114610692578063715018a6146106f757806383c406f51461070e5780638d01857b14610784576101ee565b806339509351146104cb5780634352fa9f1461053c5780635b13d382146106175780635bb04b4f14610654576101ee565b806318160ddd116101c157806318160ddd146103865780631b9a91a4146103b157806323b872dd1461040c578063313ce5671461049d576101ee565b806306fdde03146101f3578063095ea7b3146102835780630d77c9ef146102f45780630f45cc8114610345575b600080fd5b3480156101ff57600080fd5b50610208610d09565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561024857808201518184015260208101905061022d565b50505050905090810190601f1680156102755780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561028f57600080fd5b506102dc600480360360408110156102a657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610dab565b60405180821515815260200191505060405180910390f35b34801561030057600080fd5b506103436004803603602081101561031757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610dc9565b005b34801561035157600080fd5b5061035a610f38565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561039257600080fd5b5061039b610f5e565b6040518082815260200191505060405180910390f35b3480156103bd57600080fd5b5061040a600480360360408110156103d457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610f68565b005b34801561041857600080fd5b506104856004803603606081101561042f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611040565b60405180821515815260200191505060405180910390f35b3480156104a957600080fd5b506104b2611119565b604051808260ff16815260200191505060405180910390f35b3480156104d757600080fd5b50610524600480360360408110156104ee57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611130565b60405180821515815260200191505060405180910390f35b34801561054857600080fd5b506106156004803603604081101561055f57600080fd5b810190808035906020019064010000000081111561057c57600080fd5b82018360208201111561058e57600080fd5b803590602001918460208302840111640100000000831117156105b057600080fd5b9091929391929390803590602001906401000000008111156105d157600080fd5b8201836020820111156105e357600080fd5b8035906020019184602083028401116401000000008311171561060557600080fd5b90919293919293905050506111e3565b005b34801561062357600080fd5b506106526004803603602081101561063a57600080fd5b8101908080351515906020019092919050505061146a565b005b6106906004803603604081101561066a57600080fd5b8101908080359060200190929190803563ffffffff1690602001909291905050506115a8565b005b34801561069e57600080fd5b506106e1600480360360208110156106b557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506115b9565b6040518082815260200191505060405180910390f35b34801561070357600080fd5b5061070c611602565b005b34801561071a57600080fd5b506107676004803603604081101561073157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611788565b604051808381526020018281526020019250505060405180910390f35b34801561079057600080fd5b506107bd600480360360208110156107a757600080fd5b8101908080359060200190929190505050611960565b005b3480156107cb57600080fd5b506107d4611a57565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561080c57600080fd5b50610815611a80565b6040518082815260200191505060405180910390f35b34801561083757600080fd5b50610840611a97565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610880578082015181840152602081019050610865565b50505050905090810190601f1680156108ad5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156108c757600080fd5b50610914600480360360408110156108de57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611b39565b005b34801561092257600080fd5b5061096f6004803603604081101561093957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611c11565b60405180821515815260200191505060405180910390f35b34801561099357600080fd5b5061099c611cde565b604051808263ffffffff16815260200191505060405180910390f35b3480156109c457600080fd5b50610a11600480360360408110156109db57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611cf4565b60405180821515815260200191505060405180910390f35b348015610a3557600080fd5b50610a3e611d12565b6040518082815260200191505060405180910390f35b348015610a6057600080fd5b50610a69611d18565b60405180821515815260200191505060405180910390f35b348015610a8d57600080fd5b50610aea60048036036060811015610aa457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190803563ffffffff169060200190929190505050611d2b565b005b348015610af857600080fd5b50610b2560048036036020811015610b0f57600080fd5b8101908080359060200190929190505050611f01565b005b348015610b3357600080fd5b50610b9660048036036040811015610b4a57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611ff8565b6040518082815260200191505060405180910390f35b348015610bb857600080fd5b50610bc161207f565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015610bf957600080fd5b50610c2660048036036020811015610c1057600080fd5b81019080803590602001909291905050506120a5565b005b348015610c3457600080fd5b50610c7760048036036020811015610c4b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061220c565b6040518082815260200191505060405180910390f35b348015610c9957600080fd5b50610cdc60048036036020811015610cb057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612224565b005b348015610cea57600080fd5b50610cf36122f8565b6040518082815260200191505060405180910390f35b606060048054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610da15780601f10610d7657610100808354040283529160200191610da1565b820191906000526020600020905b815481529060010190602001808311610d8457829003601f168201915b5050505050905090565b6000610dbf610db8612415565b848461241d565b6001905092915050565b610dd1612415565b73ffffffffffffffffffffffffffffffffffffffff16600660029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e93576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4552525f4d53475f53454e4445525f4e4f545f524556454e55455f4f574e455281525060200191505060405180910390fd5b80600660026101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16610ef3612415565b73ffffffffffffffffffffffffffffffffffffffff167fe4eda84b169f86de2634dab43df96dba581c2d8197f7f12446ae1e12c28d761560405160405180910390a350565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600354905090565b610f70612415565b73ffffffffffffffffffffffffffffffffffffffff16600660029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611032576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4552525f4d53475f53454e4445525f4e4f545f524556454e55455f4f574e455281525060200191505060405180910390fd5b61103c8282612614565b5050565b600061104d848484612744565b61110e84611059612415565b61110985604051806060016040528060288152602001613e4560289139600260008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006110bf612415565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612a099092919063ffffffff16565b61241d565b600190509392505050565b6000600660009054906101000a900460ff16905090565b60006111d961113d612415565b846111d4856002600061114e612415565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612ac990919063ffffffff16565b61241d565b6001905092915050565b6111eb612415565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146112ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b818190508484905014611326576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f4552525f4152524159535f4c454e475448535f444f4e545f4d4154434800000081525060200191505060405180910390fd5b60005b848490508163ffffffff1610156114635782828263ffffffff1681811061134c57fe5b905060200201356009600087878563ffffffff1681811061136957fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555084848263ffffffff168181106113d657fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f95dce27040c59c8b1c445b284f81a3aaae6eecd7d08d5c7684faee64cdb514a184848463ffffffff1681811061143c57fe5b905060200201356040518082815260200191505060405180910390a2806001019050611329565b5050505050565b611472612415565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611532576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b801515600660019054906101000a900460ff161515141561155257600080fd5b80600660016101000a81548160ff0219169083151502179055507f312d72ca021d177c56f65b37b2540c610a21e44bba0064fcc02be2c857c94dfc8160405180821515815260200191505060405180910390a150565b6115b56000348484612b51565b5050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61160a612415565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146116ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60008060008311611801576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f4552525f5a45524f5f5041594d454e540000000000000000000000000000000081525060200191505060405180910390fd5b6000600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600081116118bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f4552525f41535345545f4e4f545f535550504f5254454400000000000000000081525060200191505060405180910390fd5b600660019054906101000a900460ff16156118dd576000809250925050611959565b60006118e76122f8565b90508492506119198261190b670de0b6b3a764000088612de090919063ffffffff16565b612e6690919063ffffffff16565b93508084111561195657809350611953670de0b6b3a76400006119458484612de090919063ffffffff16565b612e6690919063ffffffff16565b92505b50505b9250929050565b611968612415565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611a28576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b611a54600660029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682612eb0565b50565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000611a92611a8d610f5e565b6131f1565b905090565b606060058054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611b2f5780601f10611b0457610100808354040283529160200191611b2f565b820191906000526020600020905b815481529060010190602001808311611b1257829003601f168201915b5050505050905090565b611b41612415565b73ffffffffffffffffffffffffffffffffffffffff16600660029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611c03576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4552525f4d53475f53454e4445525f4e4f545f524556454e55455f4f574e455281525060200191505060405180910390fd5b611c0d8282612eb0565b5050565b6000611cd4611c1e612415565b84611ccf85604051806060016040528060258152602001613f016025913960026000611c48612415565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612a099092919063ffffffff16565b61241d565b6001905092915050565b600660169054906101000a900463ffffffff1681565b6000611d08611d01612415565b8484612744565b6001905092915050565b60085481565b600660019054906101000a900460ff1681565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611dce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f4552525f57524f4e475f535741505f46554e4354494f4e00000000000000000081525060200191505060405180910390fd5b60008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e611df4612415565b306040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060206040518083038186803b158015611e5c57600080fd5b505afa158015611e70573d6000803e3d6000fd5b505050506040513d6020811015611e8657600080fd5b81019080805190602001909291905050509050611eef611ea4612415565b600660029054906101000a900473ffffffffffffffffffffffffffffffffffffffff16838773ffffffffffffffffffffffffffffffffffffffff16613242909392919063ffffffff16565b611efb84828585612b51565b50505050565b611f09612415565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611fc9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b611ff5600660029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682612614565b50565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600660029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b42600854111561211d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f4552525f4e4f545f5945545f554e4c4f434b454400000000000000000000000081525060200191505060405180910390fd5b600081141561213957612136612131612415565b6115b9565b90505b61214a612144612415565b82613303565b6000612155826131f1565b90506121ab612162612415565b82600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166134c99092919063ffffffff16565b6121b3612415565b73ffffffffffffffffffffffffffffffffffffffff167fdf2f45720c721a4efe46d90b1ab992c559316bc5bad60e3c559631ec40ee54318383604051808381526020018281526020019250505060405180910390a25050565b60096020528060005260406000206000915090505481565b61222c612415565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146122ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6122f58161356b565b50565b6000600660169054906101000a900463ffffffff166127100163ffffffff166124086127106123fa612328611a80565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156123b157600080fd5b505afa1580156123c5573d6000803e3d6000fd5b505050506040513d60208110156123db57600080fd5b81019080805190602001909291905050506136ae90919063ffffffff16565b612de090919063ffffffff16565b8161240f57fe5b04905090565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156124a3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180613eb36024913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612529576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526022815260200180613db66022913960400191505060405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040518082815260200191505060405180910390a3505050565b6000811415612621574790505b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015612667573d6000803e3d6000fd5b508173ffffffffffffffffffffffffffffffffffffffff16612687612415565b73ffffffffffffffffffffffffffffffffffffffff167f360d00e4a2309e5de1072a0e3bd0b848ffcec72efe000944922f6c71782c76db600660029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166126ff612415565b73ffffffffffffffffffffffffffffffffffffffff16146001856040518084151581526020018315158152602001828152602001935050505060405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156127ca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180613e8e6025913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612850576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180613d4b6023913960400191505060405180910390fd5b61285b8383836136f8565b6128c781604051806060016040528060268152602001613dd860269139600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612a099092919063ffffffff16565b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061295c81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612ac990919063ffffffff16565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a3505050565b6000838311158290612ab6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612a7b578082015181840152602081019050612a60565b50505050905090810190601f168015612aa85780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b600080828401905083811015612b47576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f536166654d6174683a206164646974696f6e206f766572666c6f77000000000081525060200191505060405180910390fd5b8091505092915050565b600660019054906101000a900460ff1615612bd4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f4552525f535741505f504155534544000000000000000000000000000000000081525060200191505060405180910390fd5b60008211612c4a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f4552525f5a45524f5f45585045435445445f414d4f554e54000000000000000081525060200191505060405180910390fd5b600080612c578686611788565b91509150612c6582856136fd565b612cd7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4552525f45585045435445445f414d4f554e545f4d49534d415443480000000081525060200191505060405180910390fd5b808514612d4c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260188152602001807f4552525f57524f4e475f5041594d454e545f414d4f554e54000000000000000081525060200191505060405180910390fd5b612d5d612d57612415565b8361372c565b8263ffffffff168673ffffffffffffffffffffffffffffffffffffffff16612d83612415565b73ffffffffffffffffffffffffffffffffffffffff167fc882928881e33d45dd26a8fa23de7ae554add97f4347ee9526b1c467afa0d9ca8886604051808381526020018281526020019250505060405180910390a4505050505050565b600080831415612df35760009050612e60565b6000828402905082848281612e0457fe5b0414612e5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613e246021913960400191505060405180910390fd5b809150505b92915050565b6000612ea883836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506138f5565b905092915050565b6000612eba611a80565b90506000821415612f8e5780600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612f4f57600080fd5b505afa158015612f63573d6000803e3d6000fd5b505050506040513d6020811015612f7957600080fd5b81019080805190602001909291905050500391505b612fdb8383600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166134c99092919063ffffffff16565b80600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b15801561306557600080fd5b505afa158015613079573d6000803e3d6000fd5b505050506040513d602081101561308f57600080fd5b81019080805190602001909291905050501015613114576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f4552525f494e56414c49445f414d4f554e54000000000000000000000000000081525060200191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff16613133612415565b73ffffffffffffffffffffffffffffffffffffffff167f360d00e4a2309e5de1072a0e3bd0b848ffcec72efe000944922f6c71782c76db600660029054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166131ab612415565b73ffffffffffffffffffffffffffffffffffffffff16146000866040518084151581526020018315158152602001828152602001935050505060405180910390a3505050565b600061323b612710613224600660169054906101000a900463ffffffff1663ffffffff1685612de090919063ffffffff16565b8161322b57fe5b0483612ac990919063ffffffff16565b9050919050565b6132fd846323b872dd60e01b858585604051602401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506139bb565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613389576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180613e6d6021913960400191505060405180910390fd5b613395826000836136f8565b61340181604051806060016040528060228152602001613d6e60229139600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612a099092919063ffffffff16565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550613459816003546136ae90919063ffffffff16565b600381905550600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b6135668363a9059cbb60e01b8484604051602401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506139bb565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156135f1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180613d906026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006136f083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612a09565b905092915050565b505050565b600081831161371757655af3107a40008383031115613724565b655af3107a400082840311155b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156137cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f45524332303a206d696e7420746f20746865207a65726f20616464726573730081525060200191505060405180910390fd5b6137db600083836136f8565b6137f081600354612ac990919063ffffffff16565b60038190555061384881600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612ac990919063ffffffff16565b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b600080831182906139a1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b8381101561396657808201518184015260208101905061394b565b50505050905090810190601f1680156139935780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816139ad57fe5b049050809150509392505050565b6060613a1d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16613aaa9092919063ffffffff16565b9050600081511115613aa557808060200190516020811015613a3e57600080fd5b8101908080519060200190929190505050613aa4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180613ed7602a913960400191505060405180910390fd5b5b505050565b6060613ab98484600085613ac2565b90509392505050565b606082471015613b1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180613dfe6026913960400191505060405180910390fd5b613b2685613c6b565b613b98576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000081525060200191505060405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b60208310613be85780518252602082019150602081019050602083039250613bc5565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114613c4a576040519150601f19603f3d011682016040523d82523d6000602084013e613c4f565b606091505b5091509150613c5f828286613c7e565b92505050949350505050565b600080823b905060008111915050919050565b60608315613c8e57829050613d43565b600083511115613ca15782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015613d08578082015181840152602081019050613ced565b50505050905090810190601f168015613d355780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b939250505056fe45524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e63654f776e61626c653a206e6577206f776e657220697320746865207a65726f206164647265737345524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e6365416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f7745524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f20616464726573735361666545524332303a204552433230206f7065726174696f6e20646964206e6f74207375636365656445524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212203075687ef6353ccff88e3a62af9e696d4b13d6d3db2a4544e1b9bb43da4a87c964736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000283f1a655d5282ca8d101262a14ae7237ffecc91000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001600000000000000000000000009871b829359c0edba1eb55722e25a8cbf7b4dead00000000000000000000000000000000000000000000000000000000000222e00000000000000000000000007420b4b9a0110cdc71fb720908340c03f9bc03ec0000000000000000000000000000000000000000000000000000000061564f8000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000000054a436f696e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054a436f696e00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000006b175474e89094c44da98b954eedeac495271d0f0000000000000000000000004fabb145d64652a948d72533023f6e7a623c7c53000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000038d7ea4c68000000000000000000000000000000000000000000000000000000000000016e360000000000000000000000000000000000000000000000000000000000016e36000000000000000000000000000000000000000000000000014d1120d7b16000000000000000000000000000000000000000000000000000014d1120d7b160000
-----Decoded View---------------
Arg [0] : _owner (address): 0x283F1a655d5282cA8D101262a14aE7237FfecC91
Arg [1] : _name (string): JCoin
Arg [2] : _symbol (string): JCoin
Arg [3] : _revenueOwner (address): 0x9871B829359c0EdBa1Eb55722E25a8cBf7B4DeAD
Arg [4] : _interestBasisPoints (uint32): 140000
Arg [5] : _lockedToken (address): 0x7420B4b9a0110cdC71fB720908340C03F9Bc03EC
Arg [6] : _unlockTimestamp (uint256): 1633046400
Arg [7] : _assetAddresses (address[]): 0x0000000000000000000000000000000000000000,0xdAC17F958D2ee523a2206206994597C13D831ec7,0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48,0x6B175474E89094C44Da98b954EedeAC495271d0F,0x4Fabb145d64652a948d72533023f6E7A623C7C53
Arg [8] : _assetPrices (uint256[]): 1000000000000000,1500000,1500000,1500000000000000000,1500000000000000000
-----Encoded View---------------
25 Constructor Arguments found :
Arg [0] : 000000000000000000000000283f1a655d5282ca8d101262a14ae7237ffecc91
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [3] : 0000000000000000000000009871b829359c0edba1eb55722e25a8cbf7b4dead
Arg [4] : 00000000000000000000000000000000000000000000000000000000000222e0
Arg [5] : 0000000000000000000000007420b4b9a0110cdc71fb720908340c03f9bc03ec
Arg [6] : 0000000000000000000000000000000000000000000000000000000061564f80
Arg [7] : 00000000000000000000000000000000000000000000000000000000000001a0
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000260
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [10] : 4a436f696e000000000000000000000000000000000000000000000000000000
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [12] : 4a436f696e000000000000000000000000000000000000000000000000000000
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [14] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [15] : 000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7
Arg [16] : 000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48
Arg [17] : 0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f
Arg [18] : 0000000000000000000000004fabb145d64652a948d72533023f6e7a623c7c53
Arg [19] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [20] : 00000000000000000000000000000000000000000000000000038d7ea4c68000
Arg [21] : 000000000000000000000000000000000000000000000000000000000016e360
Arg [22] : 000000000000000000000000000000000000000000000000000000000016e360
Arg [23] : 00000000000000000000000000000000000000000000000014d1120d7b160000
Arg [24] : 00000000000000000000000000000000000000000000000014d1120d7b160000
Deployed Bytecode Sourcemap
31138:10163:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12298:83;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14404:169;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;33822:213;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;31366:25;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;13373:100;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;34047:135;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;15055:321;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;13225:83;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;15785:218;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;34913:448;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;35373:179;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;38095:163;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;13536:119;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;9504:130;;;;;;;;;;;;;:::i;:::-;;37016:793;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;34769:132;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;8902:73;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;40830:126;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;12500:87;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34194:143;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;16506:269;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;31274:33;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;13868:175;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;31398:30;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;31209:24;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;38270:445;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;34632:125;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;14106:151;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;31240:27;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;39885:464;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;31435:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;9779:103;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;40968:200;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;12298:83;12335:13;12368:5;12361:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12298:83;:::o;14404:169::-;14487:4;14504:39;14513:12;:10;:12::i;:::-;14527:7;14536:6;14504:8;:39::i;:::-;14561:4;14554:11;;14404:169;;;;:::o;33822:213::-;33741:12;:10;:12::i;:::-;33725:28;;:12;;;;;;;;;;;:28;;;33717:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33938:16:::1;33923:12;;:31;;;;;;;;;;;;;;;;;;34010:16;33980:47;;33996:12;:10;:12::i;:::-;33980:47;;;;;;;;;;;;33822:213:::0;:::o;31366:25::-;;;;;;;;;;;;;:::o;13373:100::-;13426:7;13453:12;;13446:19;;13373:100;:::o;34047:135::-;33741:12;:10;:12::i;:::-;33725:28;;:12;;;;;;;;;;;:28;;;33717:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34148:26:::1;34161:3;34166:7;34148:12;:26::i;:::-;34047:135:::0;;:::o;15055:321::-;15161:4;15178:36;15188:6;15196:9;15207:6;15178:9;:36::i;:::-;15225:121;15234:6;15242:12;:10;:12::i;:::-;15256:89;15294:6;15256:89;;;;;;;;;;;;;;;;;:11;:19;15268:6;15256:19;;;;;;;;;;;;;;;:33;15276:12;:10;:12::i;:::-;15256:33;;;;;;;;;;;;;;;;:37;;:89;;;;;:::i;:::-;15225:8;:121::i;:::-;15364:4;15357:11;;15055:321;;;;;:::o;13225:83::-;13266:5;13291:9;;;;;;;;;;;13284:16;;13225:83;:::o;15785:218::-;15873:4;15890:83;15899:12;:10;:12::i;:::-;15913:7;15922:50;15961:10;15922:11;:25;15934:12;:10;:12::i;:::-;15922:25;;;;;;;;;;;;;;;:34;15948:7;15922:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;15890:8;:83::i;:::-;15991:4;15984:11;;15785:218;;;;:::o;34913:448::-;9106:12;:10;:12::i;:::-;9096:22;;:6;;;;;;;;;;:22;;;9088:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35070:12:::1;;:19;;35044:15;;:22;;:45;35036:87;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;35148:8;35144:210;35166:15;;:22;;35162:1;:26;;;35144:210;;;35248:12;;35261:1;35248:15;;;;;;;;;;;;;;;35219:6;:26;35226:15;;35242:1;35226:18;;;;;;;;;;;;;;;;;35219:26;;;;;;;;;;;;;;;:44;;;;35306:15;;35322:1;35306:18;;;;;;;;;;;;;;;;;35297:45;;;35326:12;;35339:1;35326:15;;;;;;;;;;;;;;;35297:45;;;;;;;;;;;;;;;;;;35190:3;;;;;35144:210;;;;34913:448:::0;;;;:::o;35373:179::-;9106:12;:10;:12::i;:::-;9096:22;;:6;;;;;;;;;;:22;;;9088:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35461:3:::1;35445:19;;:12;;;;;;;;;;;:19;;;;35437:28;;;::::0;::::1;;35501:3;35486:12;;:18;;;;;;;;;;;;;;;;;;35530:14;35540:3;35530:14;;;;;;;;;;;;;;;;;;;;35373:179:::0;:::o;38095:163::-;38193:57;38207:1;38211:9;38222:17;38241:8;38193:5;:57::i;:::-;38095:163;;:::o;13536:119::-;13602:7;13629:9;:18;13639:7;13629:18;;;;;;;;;;;;;;;;13622:25;;13536:119;;;:::o;9504:130::-;9106:12;:10;:12::i;:::-;9096:22;;:6;;;;;;;;;;:22;;;9088:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9599:1:::1;9562:40;;9583:6;::::0;::::1;;;;;;;;9562:40;;;;;;;;;;;;9626:1;9609:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;9504:130::o:0;37016:793::-;37097:23;37122:25;37187:1;37173:11;:15;37165:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37230:22;37255:6;:18;37262:10;37255:18;;;;;;;;;;;;;;;;37230:43;;37309:1;37292:14;:18;37284:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37362:12;;;;;;;;;;;37359:30;;;37384:1;37387;37376:13;;;;;;;37359:30;37410:26;37439:24;:22;:24::i;:::-;37410:53;;37504:11;37484:31;;37546:40;37571:14;37546:20;31558:6;37546:11;:15;;:20;;;;:::i;:::-;:24;;:40;;;;:::i;:::-;37528:58;;37628:18;37610:15;:36;37607:195;;;37690:18;37672:36;;37743:47;31558:6;37743:38;37766:14;37743:18;:22;;:38;;;;:::i;:::-;:42;;:47;;;;:::i;:::-;37723:67;;37607:195;37016:793;;;;;;;;:::o;34769:132::-;9106:12;:10;:12::i;:::-;9096:22;;:6;;;;;;;;;;:22;;;9088:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34850:43:::1;34871:12;;;;;;;;;;;34885:7;34850:20;:43::i;:::-;34769:132:::0;:::o;8902:73::-;8940:7;8963:6;;;;;;;;;;;8956:13;;8902:73;:::o;40830:126::-;40879:7;40911:37;40934:13;:11;:13::i;:::-;40911:22;:37::i;:::-;40904:44;;40830:126;:::o;12500:87::-;12539:13;12572:7;12565:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12500:87;:::o;34194:143::-;33741:12;:10;:12::i;:::-;33725:28;;:12;;;;;;;;;;;:28;;;33717:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34295:34:::1;34316:3;34321:7;34295:20;:34::i;:::-;34194:143:::0;;:::o;16506:269::-;16599:4;16616:129;16625:12;:10;:12::i;:::-;16639:7;16648:96;16687:15;16648:96;;;;;;;;;;;;;;;;;:11;:25;16660:12;:10;:12::i;:::-;16648:25;;;;;;;;;;;;;;;:34;16674:7;16648:34;;;;;;;;;;;;;;;;:38;;:96;;;;;:::i;:::-;16616:8;:129::i;:::-;16763:4;16756:11;;16506:269;;;;:::o;31274:33::-;;;;;;;;;;;;;:::o;13868:175::-;13954:4;13971:42;13981:12;:10;:12::i;:::-;13995:9;14006:6;13971:9;:42::i;:::-;14031:4;14024:11;;13868:175;;;;:::o;31398:30::-;;;;:::o;31209:24::-;;;;;;;;;;;;;:::o;38270:445::-;38420:1;38389:33;;38397:10;38389:33;;;;38381:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38471:18;38492:10;:20;;;38513:12;:10;:12::i;:::-;38535:4;38492:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38471:70;;38552:67;38580:12;:10;:12::i;:::-;38594;;;;;;;;;;;38608:10;38552;:27;;;;:67;;;;;;:::i;:::-;38640;38654:10;38667;38679:17;38698:8;38640:5;:67::i;:::-;38270:445;;;;:::o;34632:125::-;9106:12;:10;:12::i;:::-;9096:22;;:6;;;;;;;;;;:22;;;9088:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34705:44:::1;34726:12;;;;;;;;;;;34741:7;34705:12;:44::i;:::-;34632:125:::0;:::o;14106:151::-;14195:7;14222:11;:18;14234:5;14222:18;;;;;;;;;;;;;;;:27;14241:7;14222:27;;;;;;;;;;;;;;;;14215:34;;14106:151;;;;:::o;31240:27::-;;;;;;;;;;;;;:::o;39885:464::-;39975:3;39956:15;;:22;;39948:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40038:1;40027:7;:12;40024:50;;;40051:23;40061:12;:10;:12::i;:::-;40051:9;:23::i;:::-;40041:33;;40024:50;40095:28;40101:12;:10;:12::i;:::-;40115:7;40095:5;:28::i;:::-;40144:22;40169:31;40192:7;40169:22;:31::i;:::-;40144:56;;40211:54;40236:12;:10;:12::i;:::-;40250:14;40211:11;;;;;;;;;;;:24;;;;:54;;;;;:::i;:::-;40303:12;:10;:12::i;:::-;40291:50;;;40317:7;40326:14;40291:50;;;;;;;;;;;;;;;;;;;;;;;;39885:464;;:::o;31435:59::-;;;;;;;;;;;;;;;;;:::o;9779:103::-;9106:12;:10;:12::i;:::-;9096:22;;:6;;;;;;;;;;:22;;;9088:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9848:28:::1;9867:8;9848:18;:28::i;:::-;9779:103:::0;:::o;40968:200::-;41023:7;41140:19;;;;;;;;;;;41132:5;:27;41055:105;;:73;41122:5;41056:60;41097:18;:16;:18::i;:::-;41056:11;;;;;;;;;;;:21;;;41086:4;41056:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:40;;:60;;;;:::i;:::-;41055:66;;:73;;;;:::i;:::-;:105;;;;;;41048:112;;40968:200;:::o;8115:106::-;8168:15;8203:10;8196:17;;8115:106;:::o;19653:346::-;19772:1;19755:19;;:5;:19;;;;19747:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19853:1;19834:21;;:7;:21;;;;19826:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19937:6;19907:11;:18;19919:5;19907:18;;;;;;;;;;;;;;;:27;19926:7;19907:27;;;;;;;;;;;;;;;:36;;;;19975:7;19959:32;;19968:5;19959:32;;;19984:6;19959:32;;;;;;;;;;;;;;;;;;19653:346;;;:::o;35850:315::-;35948:1;35937:7;:12;35934:84;;;35985:21;35975:31;;35934:84;36038:3;:12;;:21;36051:7;36038:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36144:3;36085:72;;36094:12;:10;:12::i;:::-;36085:72;;;36124:12;;;;;;;;;;;36108:28;;:12;:10;:12::i;:::-;:28;;;36138:4;36149:7;36085:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35850:315;;:::o;17265:539::-;17389:1;17371:20;;:6;:20;;;;17363:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17473:1;17452:23;;:9;:23;;;;17444:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17528:47;17549:6;17557:9;17568:6;17528:20;:47::i;:::-;17608:71;17630:6;17608:71;;;;;;;;;;;;;;;;;:9;:17;17618:6;17608:17;;;;;;;;;;;;;;;;:21;;:71;;;;;:::i;:::-;17588:9;:17;17598:6;17588:17;;;;;;;;;;;;;;;:91;;;;17713:32;17738:6;17713:9;:20;17723:9;17713:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;17690:9;:20;17700:9;17690:20;;;;;;;;;;;;;;;:55;;;;17778:9;17761:35;;17770:6;17761:35;;;17789:6;17761:35;;;;;;;;;;;;;;;;;;17265:539;;;:::o;1812:192::-;1898:7;1931:1;1926;:6;;1934:12;1918:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1958:9;1974:1;1970;:5;1958:17;;1995:1;1988:8;;;1812:192;;;;;:::o;909:181::-;967:7;987:9;1003:1;999;:5;987:17;;1028:1;1023;:6;;1015:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1081:1;1074:8;;;909:181;;;;:::o;38727:693::-;38860:12;;;;;;;;;;;38859:13;38851:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38931:1;38911:17;:21;38903:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38983:22;39007:24;39035:34;39045:10;39057:11;39035:9;:34::i;:::-;38982:87;;;;39102:50;39118:14;39134:17;39102:15;:50::i;:::-;39094:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39219:16;39204:11;:31;39196:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39285:35;39291:12;:10;:12::i;:::-;39305:14;39285:5;:35::i;:::-;39403:8;39343:69;;39362:10;39343:69;;39348:12;:10;:12::i;:::-;39343:69;;;39374:11;39387:14;39343:69;;;;;;;;;;;;;;;;;;;;;;;;38727:693;;;;;;:::o;2263:471::-;2321:7;2571:1;2566;:6;2562:47;;;2596:1;2589:8;;;;2562:47;2621:9;2637:1;2633;:5;2621:17;;2666:1;2661;2657;:5;;;;;;:10;2649:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2725:1;2718:8;;;2263:471;;;;;:::o;3210:132::-;3268:7;3295:39;3299:1;3302;3295:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;3288:46;;3210:132;;;;:::o;36177:541::-;36261:24;36288:18;:16;:18::i;:::-;36261:45;;36341:1;36330:7;:12;36327:118;;;36417:16;36378:11;;;;;;;;;;;:21;;;36408:4;36378:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:55;36368:65;;36327:118;36465:38;36490:3;36495:7;36465:11;;;;;;;;;;;:24;;;;:38;;;;;:::i;:::-;36572:16;36532:11;;;;;;;;;;;:21;;;36562:4;36532:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:56;;36524:87;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36697:3;36637:73;;36646:12;:10;:12::i;:::-;36637:73;;;36676:12;;;;;;;;;;;36660:28;;:12;:10;:12::i;:::-;:28;;;36690:5;36702:7;36637:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36177:541;;;:::o;40654:164::-;40725:7;40757:53;40804:5;40769:32;40781:19;;;;;;;;;;;40769:32;;:7;:11;;:32;;;;:::i;:::-;:40;;;;;;40757:7;:11;;:53;;;;:::i;:::-;40750:60;;40654:164;;;:::o;29774:205::-;29875:96;29895:5;29925:27;;;29954:4;29960:2;29964:5;29902:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29875:19;:96::i;:::-;29774:205;;;;:::o;18797:418::-;18900:1;18881:21;;:7;:21;;;;18873:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18953:49;18974:7;18991:1;18995:6;18953:20;:49::i;:::-;19036:68;19059:6;19036:68;;;;;;;;;;;;;;;;;:9;:18;19046:7;19036:18;;;;;;;;;;;;;;;;:22;;:68;;;;;:::i;:::-;19015:9;:18;19025:7;19015:18;;;;;;;;;;;;;;;:89;;;;19130:24;19147:6;19130:12;;:16;;:24;;;;:::i;:::-;19115:12;:39;;;;19196:1;19170:37;;19179:7;19170:37;;;19200:6;19170:37;;;;;;;;;;;;;;;;;;18797:418;;:::o;29589:177::-;29672:86;29692:5;29722:23;;;29747:2;29751:5;29699:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29672:19;:86::i;:::-;29589:177;;;:::o;9980:215::-;10070:1;10050:22;;:8;:22;;;;10042:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10156:8;10127:38;;10148:6;;;;;;;;;;10127:38;;;;;;;;;;;;10181:8;10172:6;;:17;;;;;;;;;;;;;;;;;;9980:215;:::o;1373:136::-;1431:7;1458:43;1462:1;1465;1458:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;1451:50;;1373:136;;;;:::o;21024:92::-;;;;:::o;39432:159::-;39503:4;39537:2;39532;:7;:51;;39576:6;39570:2;39565;:7;:17;;39532:51;;;39554:6;39548:2;39543;:7;:17;;39532:51;39525:58;;39432:159;;;;:::o;18086:378::-;18189:1;18170:21;;:7;:21;;;;18162:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18240:49;18269:1;18273:7;18282:6;18240:20;:49::i;:::-;18317:24;18334:6;18317:12;;:16;;:24;;;;:::i;:::-;18302:12;:39;;;;18373:30;18396:6;18373:9;:18;18383:7;18373:18;;;;;;;;;;;;;;;;:22;;:30;;;;:::i;:::-;18352:9;:18;18362:7;18352:18;;;;;;;;;;;;;;;:51;;;;18440:7;18419:37;;18436:1;18419:37;;;18449:6;18419:37;;;;;;;;;;;;;;;;;;18086:378;;:::o;3838:278::-;3924:7;3956:1;3952;:5;3959:12;3944:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3983:9;3999:1;3995;:5;;;;;;3983:17;;4107:1;4100:8;;;3838:278;;;;;:::o;30370:761::-;30794:23;30820:69;30848:4;30820:69;;;;;;;;;;;;;;;;;30828:5;30820:27;;;;:69;;;;;:::i;:::-;30794:95;;30924:1;30904:10;:17;:21;30900:224;;;31046:10;31035:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31027:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30900:224;30370:761;;;:::o;24722:195::-;24825:12;24857:52;24879:6;24887:4;24893:1;24896:12;24857:21;:52::i;:::-;24850:59;;24722:195;;;;;:::o;25774:530::-;25901:12;25959:5;25934:21;:30;;25926:81;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26026:18;26037:6;26026:10;:18::i;:::-;26018:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26152:12;26166:23;26193:6;:11;;26213:5;26221:4;26193:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26151:75;;;;26244:52;26262:7;26271:10;26283:12;26244:17;:52::i;:::-;26237:59;;;;25774:530;;;;;;:::o;21804:422::-;21864:4;22072:12;22183:7;22171:20;22163:28;;22217:1;22210:4;:8;22203:15;;;21804:422;;;:::o;28314:742::-;28429:12;28458:7;28454:595;;;28489:10;28482:17;;;;28454:595;28623:1;28603:10;:17;:21;28599:439;;;28866:10;28860:17;28927:15;28914:10;28910:2;28906:19;28899:44;28814:148;29009:12;29002:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28314:742;;;;;;:::o
Swarm Source
ipfs://3075687ef6353ccff88e3a62af9e696d4b13d6d3db2a4544e1b9bb43da4a87c9
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.