Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
LotteryToken
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2021-01-28
*/
// SPDX-License-Identifier: MIT
// File: @openzeppelin\contracts-ethereum-package\contracts\Initializable.sol
pragma solidity >=0.4.24 <0.7.0;
/**
* @title Initializable
*
* @dev Helper contract to support initializer functions. To use it, replace
* the constructor with a function that has the `initializer` modifier.
* WARNING: Unlike constructors, initializer functions must be manually
* invoked. This applies both to deploying an Initializable contract, as well
* as extending an Initializable contract via inheritance.
* WARNING: When used with inheritance, manual care must be taken to not invoke
* a parent initializer twice, or ensure that all initializers are idempotent,
* because this is not dealt with automatically as with constructors.
*/
contract Initializable {
/**
* @dev Indicates that the contract has been initialized.
*/
bool private initialized;
/**
* @dev Indicates that the contract is in the process of being initialized.
*/
bool private initializing;
/**
* @dev Modifier to use in the initializer function of a contract.
*/
modifier initializer() {
require(initializing || isConstructor() || !initialized, "Contract instance has already been initialized");
bool isTopLevelCall = !initializing;
if (isTopLevelCall) {
initializing = true;
initialized = true;
}
_;
if (isTopLevelCall) {
initializing = false;
}
}
/// @dev Returns true if and only if the function is running in the constructor
function isConstructor() private view returns (bool) {
// extcodesize checks the size of the code stored in an address, and
// address returns the current address. Since the code is still not
// deployed when running a constructor, any checks on its code size will
// yield zero, making it an effective way to detect if a contract is
// under construction or not.
address self = address(this);
uint256 cs;
assembly { cs := extcodesize(self) }
return cs == 0;
}
// Reserved storage space to allow for layout changes in the future.
uint256[50] private ______gap;
}
// File: node_modules\@openzeppelin\contracts-ethereum-package\contracts\GSN\Context.sol
pragma solidity ^0.6.0;
/*
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with GSN meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
contract ContextUpgradeSafe is Initializable {
// Empty internal constructor, to prevent people from mistakenly deploying
// an instance of this contract, which should be used via inheritance.
function __Context_init() internal initializer {
__Context_init_unchained();
}
function __Context_init_unchained() internal initializer {
}
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;
}
uint256[50] private __gap;
}
// File: @openzeppelin\contracts-ethereum-package\contracts\access\Ownable.sol
pragma solidity ^0.6.0;
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
contract OwnableUpgradeSafe is Initializable, ContextUpgradeSafe {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
function __Ownable_init() internal initializer {
__Context_init_unchained();
__Ownable_init_unchained();
}
function __Ownable_init_unchained() internal initializer {
address msgSender = _msgSender();
_owner = msgSender;
emit OwnershipTransferred(address(0), msgSender);
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(_owner == _msgSender(), "Ownable: caller is not the owner");
_;
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
emit OwnershipTransferred(_owner, address(0));
_owner = address(0);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
uint256[49] private __gap;
}
// File: @openzeppelin\contracts-ethereum-package\contracts\math\SafeMath.sol
pragma solidity ^0.6.0;
/**
* @dev Wrappers over Solidity's arithmetic operations with added overflow
* checks.
*
* Arithmetic operations in Solidity wrap on overflow. This can easily result
* in bugs, because programmers usually assume that an overflow raises an
* error, which is the standard behavior in high level programming languages.
* `SafeMath` restores this intuition by reverting the transaction when an
* operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, "SafeMath: subtraction overflow");
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, "SafeMath: division by zero");
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts with custom message on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
// Solidity only automatically asserts when dividing by 0
require(b > 0, errorMessage);
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return mod(a, b, "SafeMath: modulo by zero");
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts with custom message when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b != 0, errorMessage);
return a % b;
}
}
// File: @openzeppelin\contracts-ethereum-package\contracts\utils\Address.sol
pragma solidity ^0.6.2;
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*/
function isContract(address account) internal view returns (bool) {
// According to EIP-1052, 0x0 is the value returned for not-yet created accounts
// and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
// for accounts without code, i.e. `keccak256('')`
bytes32 codehash;
bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
// solhint-disable-next-line no-inline-assembly
assembly { codehash := extcodehash(account) }
return (codehash != accountHash && codehash != 0x0);
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
// solhint-disable-next-line avoid-low-level-calls, avoid-call-value
(bool success, ) = recipient.call{ value: amount }("");
require(success, "Address: unable to send value, recipient may have reverted");
}
}
// File: @openzeppelin\contracts-ethereum-package\contracts\token\ERC20\IERC20.sol
pragma solidity ^0.6.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `sender` to `recipient` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
}
// File: contracts\ERC20.sol
pragma solidity ^0.6.0;
/**
* @dev Implementation of the {IERC20} interface.
*
* This implementation is agnostic to the way tokens are created. This means
* that a supply mechanism has to be added in a derived contract using {_mint}.
* For a generic mechanism see {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 Initializable, ContextUpgradeSafe, IERC20 {
using SafeMath for uint256;
using Address for address;
mapping (address => uint256) private _balances;
mapping (address => mapping (address => uint256)) private _allowances;
uint256 internal _totalSupply;
string private _name;
string private _symbol;
uint8 private _decimals;
/**
* @dev Sets the values for {name} and {symbol}, initializes {decimals} with
* a default value of 18.
*
* To select a different value for {decimals}, use {_setupDecimals}.
*
* All three of these values are immutable: they can only be set once during
* construction.
*/
function __ERC20_init(string memory name, string memory symbol) internal initializer {
__Context_init_unchained();
__ERC20_init_unchained(name, symbol);
}
function __ERC20_init_unchained(string memory name, string memory symbol) internal initializer {
_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 virtual 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 { }
}
// File: contracts\interfaces\ILotteryToken.sol
pragma solidity ^0.6.0;
interface ILotteryToken {
struct Lottery {
uint256 id;
uint256 participationFee;
uint256 startedAt;
uint256 finishedAt;
uint256 participants;
address winner;
uint256 epochId;
uint256 winningPrize;
bool isActive;
}
struct Epoch {
uint256 totalFees;
uint256 minParticipationFee;
uint256 firstLotteryId;
uint256 lastLotteryId;
}
struct UserBalance {
uint256 lastGameId;
uint256 balance;
uint256 at;
}
function lockTransfer() external;
function unlockTransfer() external;
function startLottery(uint256 _participationFee) external returns (Lottery memory startedLottery);
function finishLottery(
uint256 _participants,
address _winnerAddress,
address _marketingAddress,
uint256 _winningPrizeValue,
uint256 _marketingFeeValue
) external returns (Lottery memory finishedLotteryGame);
function lastLottery() external view returns (Lottery memory lottery);
function lastEpoch() external view returns (Epoch memory epoch);
}
// File: contracts\interfaces\ILotteryGame.sol
pragma solidity ^0.6.0;
interface ILotteryGame {
function setOracleIpfsHash(string memory _hash) external;
function setProvableGasLimit(uint256 _amount) external;
function setParticipationFee(uint256 _participationFee) external;
function lockTransfer() external;
function unlockTransfer() external;
function startGame() external payable;
function restartProvableQuery() external payable;
}
// File: contracts\LotteryToken.sol
pragma solidity ^0.6.0;
pragma experimental ABIEncoderV2;
contract LotteryToken is ILotteryToken, OwnableUpgradeSafe, ERC20 {
using SafeMath for uint256;
using Address for address;
uint256 public constant GAMES_PER_EPOCH = 30;
uint256 public constant PRECISION = 1_000_000_000_000_000_000;
uint256 public constant TOTAL_ALLOCATED = 2_000_000_000;
Epoch[] public epochs;
Lottery[] public lotteries;
bool public isTransferLocked;
address [] public participants;
mapping(address => UserBalance) public balances;
ILotteryGame public lotteryGame;
modifier onlyLotteryGame() {
require(msg.sender == address(lotteryGame), "Only allowed to call by Lottery game contract");
_;
}
function initialize(
address _lotteryGame,
address _addressTyler
) public initializer {
__ERC20_init('Lotto', 'LOTTO');
__Ownable_init();
lotteryGame = ILotteryGame(_lotteryGame);
// 2,000,000,000 allocate for all
_mint(_addressTyler, TOTAL_ALLOCATED.mul(PRECISION));
epochs.push(
Epoch(
0, // uint256 totalFees;
0, // uint256 minParticipationFee;
0, // uint256 firstGameId;
0 // uint256 lastGameId;
)
);
lotteries.push(
Lottery(
0, // uint256 id;
0, // uint256 participationFee;
0, // uint256 startedAt;
0, // uint256 finishedAt;
0, // uint256 participants;
address(0), // address winner;
0, // uint256 epochId;
0, // uint256 winningPrize;
false // bool isActive;
)
);
}
function burn(address account, uint256 amount) external onlyOwner {
_burn(account, amount);
}
function lockTransfer() onlyLotteryGame() override public {
isTransferLocked = true;
}
function unlockTransfer() onlyLotteryGame() override public {
isTransferLocked = false;
}
function startLottery(uint256 _participationFee) override public onlyLotteryGame() returns (Lottery memory _lotteryGame) {
Lottery storage lottery = lotteries[lotteries.length - 1];
// in case if prev game was not finished, halt it
if (lottery.finishedAt == 0) {
lottery.finishedAt = block.timestamp;
lottery.isActive = false;
}
Epoch storage currentEpoch = epochs[epochs.length - 1];
uint256 newGameId = lotteries.length;
if (newGameId - currentEpoch.firstLotteryId >= GAMES_PER_EPOCH) {
currentEpoch.lastLotteryId = lottery.id;
epochs.push(
Epoch(
0,
_participationFee,
newGameId,
0
)
);
currentEpoch = epochs[epochs.length - 1];
} else {
if (currentEpoch.minParticipationFee == 0) {
currentEpoch.minParticipationFee = _participationFee;
}
if (currentEpoch.minParticipationFee > _participationFee) {
currentEpoch.minParticipationFee = _participationFee;
}
}
lotteries.push(
Lottery(
newGameId, // uint256 id;
_participationFee, // uint256 participationFee;
block.timestamp, // uint256 startedAt;
0, // uint256 finishedAt;
0, // uint256 participants;
address(0), // address winner;
epochs.length - 1, // uint256 epochId;
0, // uint256 winningPrize;
true // bool isActive;
)
);
return lotteries[lotteries.length - 1];
}
function finishLottery(
uint256 _participants,
address _winnerAddress,
address _marketingAddress,
uint256 _winningPrizeValue,
uint256 _marketingFeeValue
) external onlyLotteryGame() override returns (Lottery memory finishedLotteryGame) {
Lottery storage lottery = lotteries[lotteries.length - 1];
require(lottery.isActive == true, "Lottery game is not active");
lottery.participants = _participants;
lottery.winner = _winnerAddress;
lottery.winningPrize = _winningPrizeValue;
lottery.finishedAt = block.timestamp;
lottery.isActive = false;
Epoch storage epoch = epochs[lottery.epochId];
epoch.lastLotteryId = lottery.id;
epoch.totalFees = epoch.totalFees.add(lottery.participationFee);
uint256 winnerBalance = balanceOf(_winnerAddress).add(_winningPrizeValue);
balances[_winnerAddress] = UserBalance(
lottery.id,
winnerBalance,
block.timestamp
);
emit Transfer(address(this), _winnerAddress, _winningPrizeValue);
uint256 marketingBalance = balanceOf(_marketingAddress).add(_marketingFeeValue);
balances[_marketingAddress] = UserBalance(
lottery.id,
marketingBalance,
block.timestamp
);
emit Transfer(address(this), _marketingAddress, _marketingFeeValue);
return lottery;
}
function balanceOf(address account) public view override returns (uint256) {
UserBalance storage userBalance = balances[account];
if (lotteries.length == 0 || userBalance.balance == 0) {
return userBalance.balance;
}
Lottery storage lottery = lotteries[userBalance.lastGameId];
Epoch storage epoch = epochs[lottery.epochId];
uint256 calculatedBalance = userBalance.balance;
if (epoch.lastLotteryId > userBalance.lastGameId) {
calculatedBalance = calculateBalanceAfterGames(
calculatedBalance,
userBalance.lastGameId + 1,
epoch.lastLotteryId
);
}
if (lottery.epochId + 1 < epochs.length) {
for (uint256 epochId = lottery.epochId + 1; epochId < epochs.length && calculatedBalance > 0; epochId++) {
epoch = epochs[epochId];
if (calculatedBalance >= epoch.totalFees) {
calculatedBalance = calculatedBalance.sub(epoch.totalFees);
} else {
if (calculatedBalance > epoch.minParticipationFee) {
calculatedBalance = calculateBalanceAfterGames(
calculatedBalance,
epoch.firstLotteryId,
epoch.lastLotteryId
);
}
}
}
}
return calculatedBalance;
}
function participantsCount() public view returns (uint256) {
return participants.length;
}
function lotteriesCount() public view returns (uint256) {
return lotteries.length;
}
function epochsCount() public view returns (uint256) {
return epochs.length;
}
function lastLottery() public view override returns (Lottery memory lottery) {
if (lotteries.length == 0) {
return Lottery(0, 0, 0, 0, 0, address(0), 0, 0, false);
}
return lotteries[lotteries.length - 1];
}
function lastEpoch() external view override returns (Epoch memory epoch) {
return epochs[epochs.length - 1];
}
function participantsBalances(uint256 from, uint256 count) public view returns (
address [] memory participantAddresses,
uint256 [] memory participantBalances
) {
uint256 finalCount = from + count <= participants.length ? count : participants.length.sub(from);
participantAddresses = new address[](finalCount);
participantBalances = new uint256[](finalCount);
for (uint256 i = from; i < from + finalCount; i++) {
participantAddresses[i - from] = participants[i];
participantBalances[i - from] = balanceOf(participants[i]);
}
}
function calculateBalanceAfterGames(
uint256 _calculatedBalance,
uint256 _fromGameId,
uint256 _toGameId
) internal view returns(uint256) {
for (uint256 i = _fromGameId; i <= _toGameId && _calculatedBalance > 0; i++) {
Lottery storage lottery = lotteries[i];
if (_calculatedBalance >= lottery.participationFee) {
_calculatedBalance = _calculatedBalance.sub(lottery.participationFee);
}
}
return _calculatedBalance;
}
function _transfer(address sender, address recipient, uint256 amount) internal override(ERC20) {
require(sender != address(0), "ERC20: transfer from the zero address");
require(recipient != address(0), "ERC20: transfer to the zero address");
require(!isTransferLocked, "The Game is running, all transfers are locked");
_beforeTokenTransfer(sender, recipient, amount);
uint256 senderBalance = balanceOf(sender).sub(amount, "ERC20: transfer amount exceeds balance");
Lottery memory lottery = lastLottery();
balances[sender] = UserBalance(
lottery.id,
senderBalance,
block.timestamp
);
if (balances[recipient].at == 0 && amount > 0) {
participants.push(recipient);
}
uint256 recipientBalance = balanceOf(recipient).add(amount);
balances[recipient] = UserBalance(
lottery.id,
recipientBalance,
block.timestamp
);
emit Transfer(sender, recipient, amount);
}
function _mint(address account, uint256 amount) internal override {
require(account != address(0), "ERC20: mint to the zero address");
uint256 balance = balanceOf(account).add(amount);
if (balances[account].at == 0 && amount > 0) {
participants.push(account);
}
Lottery memory lottery = lastLottery();
balances[account].lastGameId = lottery.id;
balances[account].balance = balance;
balances[account].at = block.timestamp;
_totalSupply = _totalSupply.add(amount);
emit Transfer(address(0), account, amount);
}
function _burn(address account, uint256 amount) internal override {
require(account != address(0), "ERC20: burn from the zero address");
uint256 balance = balanceOf(account).sub(amount, "ERC20: burn amount exceeds balance");
Lottery memory lottery = lastLottery();
balances[account].lastGameId = lottery.id;
balances[account].balance = balance;
balances[account].at = block.timestamp;
_totalSupply = _totalSupply.sub(amount);
emit Transfer(account, address(0), amount);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"GAMES_PER_EPOCH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRECISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOTAL_ALLOCATED","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balances","outputs":[{"internalType":"uint256","name":"lastGameId","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"at","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"epochs","outputs":[{"internalType":"uint256","name":"totalFees","type":"uint256"},{"internalType":"uint256","name":"minParticipationFee","type":"uint256"},{"internalType":"uint256","name":"firstLotteryId","type":"uint256"},{"internalType":"uint256","name":"lastLotteryId","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"epochsCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_participants","type":"uint256"},{"internalType":"address","name":"_winnerAddress","type":"address"},{"internalType":"address","name":"_marketingAddress","type":"address"},{"internalType":"uint256","name":"_winningPrizeValue","type":"uint256"},{"internalType":"uint256","name":"_marketingFeeValue","type":"uint256"}],"name":"finishLottery","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"participationFee","type":"uint256"},{"internalType":"uint256","name":"startedAt","type":"uint256"},{"internalType":"uint256","name":"finishedAt","type":"uint256"},{"internalType":"uint256","name":"participants","type":"uint256"},{"internalType":"address","name":"winner","type":"address"},{"internalType":"uint256","name":"epochId","type":"uint256"},{"internalType":"uint256","name":"winningPrize","type":"uint256"},{"internalType":"bool","name":"isActive","type":"bool"}],"internalType":"struct ILotteryToken.Lottery","name":"finishedLotteryGame","type":"tuple"}],"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":[{"internalType":"address","name":"_lotteryGame","type":"address"},{"internalType":"address","name":"_addressTyler","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isTransferLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastEpoch","outputs":[{"components":[{"internalType":"uint256","name":"totalFees","type":"uint256"},{"internalType":"uint256","name":"minParticipationFee","type":"uint256"},{"internalType":"uint256","name":"firstLotteryId","type":"uint256"},{"internalType":"uint256","name":"lastLotteryId","type":"uint256"}],"internalType":"struct ILotteryToken.Epoch","name":"epoch","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastLottery","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"participationFee","type":"uint256"},{"internalType":"uint256","name":"startedAt","type":"uint256"},{"internalType":"uint256","name":"finishedAt","type":"uint256"},{"internalType":"uint256","name":"participants","type":"uint256"},{"internalType":"address","name":"winner","type":"address"},{"internalType":"uint256","name":"epochId","type":"uint256"},{"internalType":"uint256","name":"winningPrize","type":"uint256"},{"internalType":"bool","name":"isActive","type":"bool"}],"internalType":"struct ILotteryToken.Lottery","name":"lottery","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"lotteries","outputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"participationFee","type":"uint256"},{"internalType":"uint256","name":"startedAt","type":"uint256"},{"internalType":"uint256","name":"finishedAt","type":"uint256"},{"internalType":"uint256","name":"participants","type":"uint256"},{"internalType":"address","name":"winner","type":"address"},{"internalType":"uint256","name":"epochId","type":"uint256"},{"internalType":"uint256","name":"winningPrize","type":"uint256"},{"internalType":"bool","name":"isActive","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lotteriesCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lotteryGame","outputs":[{"internalType":"contract ILotteryGame","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":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"participants","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"from","type":"uint256"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"participantsBalances","outputs":[{"internalType":"address[]","name":"participantAddresses","type":"address[]"},{"internalType":"uint256[]","name":"participantBalances","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"participantsCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_participationFee","type":"uint256"}],"name":"startLottery","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"participationFee","type":"uint256"},{"internalType":"uint256","name":"startedAt","type":"uint256"},{"internalType":"uint256","name":"finishedAt","type":"uint256"},{"internalType":"uint256","name":"participants","type":"uint256"},{"internalType":"address","name":"winner","type":"address"},{"internalType":"uint256","name":"epochId","type":"uint256"},{"internalType":"uint256","name":"winningPrize","type":"uint256"},{"internalType":"bool","name":"isActive","type":"bool"}],"internalType":"struct ILotteryToken.Lottery","name":"_lotteryGame","type":"tuple"}],"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":"unlockTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
608060405234801561001057600080fd5b5061471d806100206000396000f3fe608060405234801561001057600080fd5b50600436106102115760003560e01c80638da5cb5b11610125578063ac5c0e7a116100ad578063c6b61e4c1161007c578063c6b61e4c1461062b578063c6bec93a1461065e578063dd60c8981461068e578063dd62ed3e146106ac578063f2fde38b146106dc57610211565b8063ac5c0e7a146105b5578063af0b4b27146105e5578063bf6d9abd14610603578063c433cfad1461060d57610211565b80639dc29fac116100f45780639dc29fac146104fd578063a01c62f714610519578063a457c2d714610537578063a9059cbb14610567578063aaf5eb681461059757610211565b80638da5cb5b14610485578063916e1c57146104a357806393d39240146104c157806395d89b41146104df57610211565b8063278c5dea116101a8578063395093511161017757806339509351146103e1578063485cc9551461041157806350d9533e1461042d57806370a082311461044b578063715018a61461047b57610211565b8063278c5dea1461033057806327e235e314610361578063313ce5671461039357806335c1d349146103b157610211565b806318160ddd116101e457806318160ddd146102ba5780631a9aea0a146102d85780631be929fa146102e257806323b872dd1461030057610211565b806306a4c9831461021657806306fdde0314610234578063095ea7b3146102525780631398e07614610282575b600080fd5b61021e6106f8565b60405161022b9190614363565b60405180910390f35b61023c61075b565b6040516102499190614181565b60405180910390f35b61026c6004803603810190610267919061383c565b6107fd565b604051610279919061414b565b60405180910390f35b61029c60048036038101906102979190613878565b61081b565b6040516102b199989796959493929190614431565b60405180910390f35b6102c26108a3565b6040516102cf919061439a565b60405180910390f35b6102e06108ad565b005b6102ea61095a565b6040516102f7919061439a565b60405180910390f35b61031a600480360381019061031591906137ed565b610962565b604051610327919061414b565b60405180910390f35b61034a60048036038101906103459190613918565b610a3b565b604051610358929190614114565b60405180910390f35b61037b60048036038101906103769190613788565b610c02565b60405161038a939291906143b5565b60405180910390f35b61039b610c2c565b6040516103a891906144be565b60405180910390f35b6103cb60048036038101906103c69190613878565b610c43565b6040516103d891906140f9565b60405180910390f35b6103fb60048036038101906103f6919061383c565b610c7f565b604051610408919061414b565b60405180910390f35b61042b600480360381019061042691906137b1565b610d32565b005b6104356110b7565b604051610442919061439a565b60405180910390f35b61046560048036038101906104609190613788565b6110c4565b604051610472919061439a565b60405180910390f35b610483611269565b005b61048d6113c1565b60405161049a91906140f9565b60405180910390f35b6104ab6113eb565b6040516104b8919061439a565b60405180910390f35b6104c96113f8565b6040516104d6919061439a565b60405180910390f35b6104e76113fd565b6040516104f49190614181565b60405180910390f35b6105176004803603810190610512919061383c565b61149f565b005b610521611544565b60405161052e919061414b565b60405180910390f35b610551600480360381019061054c919061383c565b611557565b60405161055e919061414b565b60405180910390f35b610581600480360381019061057c919061383c565b611624565b60405161058e919061414b565b60405180910390f35b61059f611642565b6040516105ac919061439a565b60405180910390f35b6105cf60048036038101906105ca91906138a1565b61164e565b6040516105dc919061437e565b60405180910390f35b6105ed611b0c565b6040516105fa919061437e565b60405180910390f35b61060b611c76565b005b610615611d23565b6040516106229190614166565b60405180910390f35b61064560048036038101906106409190613878565b611d49565b60405161065594939291906143ec565b60405180910390f35b61067860048036038101906106739190613878565b611d86565b604051610685919061437e565b60405180910390f35b6106966121c5565b6040516106a3919061439a565b60405180910390f35b6106c660048036038101906106c191906137b1565b6121d2565b6040516106d3919061439a565b60405180910390f35b6106f660048036038101906106f19190613788565b612259565b005b610700613635565b609d6001609d80549050038154811061071557fe5b9060005260206000209060040201604051806080016040529081600082015481526020016001820154815260200160028201548152602001600382015481525050905090565b6060609a8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156107f35780601f106107c8576101008083540402835291602001916107f3565b820191906000526020600020905b8154815290600101906020018083116107d657829003601f168201915b5050505050905090565b600061081161080a612420565b8484612428565b6001905092915050565b609e818154811061082857fe5b90600052602060002090600902016000915090508060000154908060010154908060020154908060030154908060040154908060050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060060154908060070154908060080160009054906101000a900460ff16905089565b6000609954905090565b60a260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461093d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093490614223565b60405180910390fd5b6001609f60006101000a81548160ff021916908315150217905550565b637735940081565b600061096f8484846125f3565b610a308461097b612420565b610a2b8560405180606001604052806028815260200161469b60289139609860008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006109e1612420565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546129be9092919063ffffffff16565b612428565b600190509392505050565b606080600060a0805490508486011115610a6c57610a678560a080549050612a1990919063ffffffff16565b610a6e565b835b90508067ffffffffffffffff81118015610a8757600080fd5b50604051908082528060200260200182016040528015610ab65781602001602082028036833780820191505090505b5092508067ffffffffffffffff81118015610ad057600080fd5b50604051908082528060200260200182016040528015610aff5781602001602082028036833780820191505090505b50915060008590505b818601811015610bf95760a08181548110610b1f57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168487830381518110610b5857fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050610bd260a08281548110610ba257fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166110c4565b8387830381518110610be057fe5b6020026020010181815250508080600101915050610b08565b50509250929050565b60a16020528060005260406000206000915090508060000154908060010154908060020154905083565b6000609c60009054906101000a900460ff16905090565b60a08181548110610c5057fe5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000610d28610c8c612420565b84610d238560986000610c9d612420565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612a6390919063ffffffff16565b612428565b6001905092915050565b600060019054906101000a900460ff1680610d515750610d50612ab8565b5b80610d67575060008054906101000a900460ff16155b610da6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9d906142c3565b60405180910390fd5b60008060019054906101000a900460ff161590508015610df6576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b610e6a6040518060400160405280600581526020017f4c6f74746f0000000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f4c4f54544f000000000000000000000000000000000000000000000000000000815250612acf565b610e72612bcb565b8260a260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610edb82610ed6670de0b6b3a76400006377359400612cc390919063ffffffff16565b612d33565b609d604051806080016040528060008152602001600081526020016000815260200160008152509080600181540180825580915050600190039060005260206000209060040201600090919091909150600082015181600001556020820151816001015560408201518160020155606082015181600301555050609e6040518061012001604052806000815260200160008152602001600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001600015158152509080600181540180825580915050600190039060005260206000209060090201600090919091909150600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060c0820151816006015560e082015181600701556101008201518160080160006101000a81548160ff021916908315150217905550505080156110b25760008060016101000a81548160ff0219169083151502179055505b505050565b6000609e80549050905090565b60008060a160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000609e805490501480611120575060008160010154145b15611132578060010154915050611264565b6000609e82600001548154811061114557fe5b906000526020600020906009020190506000609d82600601548154811061116857fe5b906000526020600020906004020190506000836001015490508360000154826003015411156111aa576111a78160018660000154018460030154612fef565b90505b609d805490506001846006015401101561125c576000600184600601540190505b609d80549050811080156111df5750600082115b1561125a57609d81815481106111f157fe5b906000526020600020906004020192508260000154821061122a57611223836000015483612a1990919063ffffffff16565b915061124d565b826001015482111561124c576112498284600201548560030154612fef565b91505b5b80806001019150506111cb565b505b809450505050505b919050565b611271612420565b73ffffffffffffffffffffffffffffffffffffffff16606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611300576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f7906142a3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000606560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000609d80549050905090565b601e81565b6060609b8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114955780601f1061146a57610100808354040283529160200191611495565b820191906000526020600020905b81548152906001019060200180831161147857829003601f168201915b5050505050905090565b6114a7612420565b73ffffffffffffffffffffffffffffffffffffffff16606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611536576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152d906142a3565b60405180910390fd5b6115408282613068565b5050565b609f60009054906101000a900460ff1681565b600061161a611564612420565b84611615856040518060600160405280602581526020016146c3602591396098600061158e612420565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546129be9092919063ffffffff16565b612428565b6001905092915050565b6000611638611631612420565b84846125f3565b6001905092915050565b670de0b6b3a764000081565b61165661365d565b60a260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146116e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116dd90614223565b60405180910390fd5b6000609e6001609e8054905003815481106116fd57fe5b90600052602060002090600902019050600115158160080160009054906101000a900460ff16151514611765576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175c906141c3565b60405180910390fd5b868160040181905550858160050160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083816007018190555042816003018190555060008160080160006101000a81548160ff0219169083151502179055506000609d8260060154815481106117f357fe5b906000526020600020906004020190508160000154816003018190555061182b82600101548260000154612a6390919063ffffffff16565b81600001819055506000611850866118428a6110c4565b612a6390919063ffffffff16565b90506040518060600160405280846000015481526020018281526020014281525060a160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000820151816000015560208201518160010155604082015181600201559050508773ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8860405161192e919061439a565b60405180910390a36000611953866119458a6110c4565b612a6390919063ffffffff16565b90506040518060600160405280856000015481526020018281526020014281525060a160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000820151816000015560208201518160010155604082015181600201559050508773ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef88604051611a31919061439a565b60405180910390a3836040518061012001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160068201548152602001600782015481526020016008820160009054906101000a900460ff16151515158152505094505050505095945050505050565b611b1461365d565b6000609e805490501415611b8a576040518061012001604052806000815260200160008152602001600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001600015158152509050611c73565b609e6001609e805490500381548110611b9f57fe5b90600052602060002090600902016040518061012001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160068201548152602001600782015481526020016008820160009054906101000a900460ff16151515158152505090505b90565b60a260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfd90614223565b60405180910390fd5b6000609f60006101000a81548160ff021916908315150217905550565b60a260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b609d8181548110611d5657fe5b90600052602060002090600402016000915090508060000154908060010154908060020154908060030154905084565b611d8e61365d565b60a260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611e1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1590614223565b60405180910390fd5b6000609e6001609e805490500381548110611e3557fe5b90600052602060002090600902019050600081600301541415611e795742816003018190555060008160080160006101000a81548160ff0219169083151502179055505b6000609d6001609d805490500381548110611e9057fe5b906000526020600020906004020190506000609e805490509050601e8260020154820310611f675782600001548260030181905550609d60405180608001604052806000815260200187815260200183815260200160008152509080600181540180825580915050600190039060005260206000209060040201600090919091909150600082015181600001556020820151816001015560408201518160020155606082015181600301555050609d6001609d805490500381548110611f5257fe5b90600052602060002090600402019150611f95565b600082600101541415611f7e578482600101819055505b8482600101541115611f94578482600101819055505b5b609e6040518061012001604052808381526020018781526020014281526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016001609d8054905003815260200160008152602001600115158152509080600181540180825580915050600190039060005260206000209060090201600090919091909150600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060c0820151816006015560e082015181600701556101008201518160080160006101000a81548160ff0219169083151502179055505050609e6001609e8054905003815481106120ea57fe5b90600052602060002090600902016040518061012001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160068201548152602001600782015481526020016008820160009054906101000a900460ff1615151515815250509350505050919050565b600060a080549050905090565b6000609860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b612261612420565b73ffffffffffffffffffffffffffffffffffffffff16606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146122f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e7906142a3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612360576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612357906141e3565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380606560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612498576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248f90614323565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612508576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ff90614203565b60405180910390fd5b80609860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516125e6919061439a565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612663576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265a90614303565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ca906141a3565b60405180910390fd5b609f60009054906101000a900460ff1615612723576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271a90614263565b60405180910390fd5b61272e838383613283565b60006127658260405180606001604052806026815260200161467560269139612756876110c4565b6129be9092919063ffffffff16565b905061276f61365d565b612777611b0c565b90506040518060600160405280826000015181526020018381526020014281525060a160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082015181600001556020820151816001015560408201518160020155905050600060a160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002015414801561284a5750600083115b156128b35760a0849080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b60006128d0846128c2876110c4565b612a6390919063ffffffff16565b90506040518060600160405280836000015181526020018281526020014281525060a160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000820151816000015560208201518160010155604082015181600201559050508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516129ae919061439a565b60405180910390a3505050505050565b6000838311158290612a06576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129fd9190614181565b60405180910390fd5b5060008385039050809150509392505050565b6000612a5b83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506129be565b905092915050565b600080828401905083811015612aae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aa590614243565b60405180910390fd5b8091505092915050565b6000803090506000813b9050600081149250505090565b600060019054906101000a900460ff1680612aee5750612aed612ab8565b5b80612b04575060008054906101000a900460ff16155b612b43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b3a906142c3565b60405180910390fd5b60008060019054906101000a900460ff161590508015612b93576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b612b9b613288565b612ba58383613370565b8015612bc65760008060016101000a81548160ff0219169083151502179055505b505050565b600060019054906101000a900460ff1680612bea5750612be9612ab8565b5b80612c00575060008054906101000a900460ff16155b612c3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c36906142c3565b60405180910390fd5b60008060019054906101000a900460ff161590508015612c8f576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b612c97613288565b612c9f6134a4565b8015612cc05760008060016101000a81548160ff0219169083151502179055505b50565b600080831415612cd65760009050612d2d565b6000828402905082848281612ce757fe5b0414612d28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d1f90614283565b60405180910390fd5b809150505b92915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612da3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9a90614343565b60405180910390fd5b6000612dc082612db2856110c4565b612a6390919063ffffffff16565b9050600060a160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154148015612e145750600082115b15612e7d5760a0839080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b612e8561365d565b612e8d611b0c565b9050806000015160a160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055508160a160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055504260a160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020181905550612f7d83609954612a6390919063ffffffff16565b6099819055508373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85604051612fe1919061439a565b60405180910390a350505050565b6000808390505b8281111580156130065750600085115b1561305d576000609e828154811061301a57fe5b906000526020600020906009020190508060010154861061304f5761304c816001015487612a1990919063ffffffff16565b95505b508080600101915050612ff6565b508390509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130cf906142e3565b60405180910390fd5b600061310f8260405180606001604052806022815260200161465360229139613100866110c4565b6129be9092919063ffffffff16565b905061311961365d565b613121611b0c565b9050806000015160a160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055508160a160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055504260a160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002018190555061321183609954612a1990919063ffffffff16565b609981905550600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85604051613275919061439a565b60405180910390a350505050565b505050565b600060019054906101000a900460ff16806132a757506132a6612ab8565b5b806132bd575060008054906101000a900460ff16155b6132fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132f3906142c3565b60405180910390fd5b60008060019054906101000a900460ff16159050801561334c576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b801561336d5760008060016101000a81548160ff0219169083151502179055505b50565b600060019054906101000a900460ff168061338f575061338e612ab8565b5b806133a5575060008054906101000a900460ff16155b6133e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133db906142c3565b60405180910390fd5b60008060019054906101000a900460ff161590508015613434576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b82609a908051906020019061344a9291906136c1565b5081609b90805190602001906134619291906136c1565b506012609c60006101000a81548160ff021916908360ff160217905550801561349f5760008060016101000a81548160ff0219169083151502179055505b505050565b600060019054906101000a900460ff16806134c357506134c2612ab8565b5b806134d9575060008054906101000a900460ff16155b613518576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161350f906142c3565b60405180910390fd5b60008060019054906101000a900460ff161590508015613568576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b6000613572612420565b905080606560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35080156136325760008060016101000a81548160ff0219169083151502179055505b50565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b6040518061012001604052806000815260200160008152602001600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000151581525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061370257805160ff1916838001178555613730565b82800160010185558215613730579182015b8281111561372f578251825591602001919060010190613714565b5b50905061373d9190613741565b5090565b5b8082111561375a576000816000905550600101613742565b5090565b60008135905061376d81614624565b92915050565b6000813590506137828161463b565b92915050565b60006020828403121561379a57600080fd5b60006137a88482850161375e565b91505092915050565b600080604083850312156137c457600080fd5b60006137d28582860161375e565b92505060206137e38582860161375e565b9150509250929050565b60008060006060848603121561380257600080fd5b60006138108682870161375e565b93505060206138218682870161375e565b925050604061383286828701613773565b9150509250925092565b6000806040838503121561384f57600080fd5b600061385d8582860161375e565b925050602061386e85828601613773565b9150509250929050565b60006020828403121561388a57600080fd5b600061389884828501613773565b91505092915050565b600080600080600060a086880312156138b957600080fd5b60006138c788828901613773565b95505060206138d88882890161375e565b94505060406138e98882890161375e565b93505060606138fa88828901613773565b925050608061390b88828901613773565b9150509295509295909350565b6000806040838503121561392b57600080fd5b600061393985828601613773565b925050602061394a85828601613773565b9150509250929050565b60006139608383613984565b60208301905092915050565b600061397883836140cc565b60208301905092915050565b61398d81614567565b82525050565b61399c81614567565b82525050565b60006139ad826144f9565b6139b78185614534565b93506139c2836144d9565b8060005b838110156139f35781516139da8882613954565b97506139e58361451a565b9250506001810190506139c6565b5085935050505092915050565b6000613a0b82614504565b613a158185614545565b9350613a20836144e9565b8060005b83811015613a51578151613a38888261396c565b9750613a4383614527565b925050600181019050613a24565b5085935050505092915050565b613a6781614579565b82525050565b613a7681614579565b82525050565b613a85816145bc565b82525050565b6000613a968261450f565b613aa08185614556565b9350613ab08185602086016145e0565b613ab981614613565b840191505092915050565b6000613ad1602383614556565b91507f45524332303a207472616e7366657220746f20746865207a65726f206164647260008301527f65737300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613b37601a83614556565b91507f4c6f74746572792067616d65206973206e6f74206163746976650000000000006000830152602082019050919050565b6000613b77602683614556565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613bdd602283614556565b91507f45524332303a20617070726f766520746f20746865207a65726f20616464726560008301527f73730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613c43602d83614556565b91507f4f6e6c7920616c6c6f77656420746f2063616c6c206279204c6f74746572792060008301527f67616d6520636f6e7472616374000000000000000000000000000000000000006020830152604082019050919050565b6000613ca9601b83614556565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b6000613ce9602d83614556565b91507f5468652047616d652069732072756e6e696e672c20616c6c207472616e73666560008301527f727320617265206c6f636b6564000000000000000000000000000000000000006020830152604082019050919050565b6000613d4f602183614556565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613db5602083614556565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613df5602e83614556565b91507f436f6e747261637420696e7374616e63652068617320616c726561647920626560008301527f656e20696e697469616c697a65640000000000000000000000000000000000006020830152604082019050919050565b6000613e5b602183614556565b91507f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008301527f73000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613ec1602583614556565b91507f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613f27602483614556565b91507f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613f8d601f83614556565b91507f45524332303a206d696e7420746f20746865207a65726f2061646472657373006000830152602082019050919050565b608082016000820151613fd660008501826140cc565b506020820151613fe960208501826140cc565b506040820151613ffc60408501826140cc565b50606082015161400f60608501826140cc565b50505050565b6101208201600082015161402c60008501826140cc565b50602082015161403f60208501826140cc565b50604082015161405260408501826140cc565b50606082015161406560608501826140cc565b50608082015161407860808501826140cc565b5060a082015161408b60a0850182613984565b5060c082015161409e60c08501826140cc565b5060e08201516140b160e08501826140cc565b506101008201516140c6610100850182613a5e565b50505050565b6140d5816145a5565b82525050565b6140e4816145a5565b82525050565b6140f3816145af565b82525050565b600060208201905061410e6000830184613993565b92915050565b6000604082019050818103600083015261412e81856139a2565b905081810360208301526141428184613a00565b90509392505050565b60006020820190506141606000830184613a6d565b92915050565b600060208201905061417b6000830184613a7c565b92915050565b6000602082019050818103600083015261419b8184613a8b565b905092915050565b600060208201905081810360008301526141bc81613ac4565b9050919050565b600060208201905081810360008301526141dc81613b2a565b9050919050565b600060208201905081810360008301526141fc81613b6a565b9050919050565b6000602082019050818103600083015261421c81613bd0565b9050919050565b6000602082019050818103600083015261423c81613c36565b9050919050565b6000602082019050818103600083015261425c81613c9c565b9050919050565b6000602082019050818103600083015261427c81613cdc565b9050919050565b6000602082019050818103600083015261429c81613d42565b9050919050565b600060208201905081810360008301526142bc81613da8565b9050919050565b600060208201905081810360008301526142dc81613de8565b9050919050565b600060208201905081810360008301526142fc81613e4e565b9050919050565b6000602082019050818103600083015261431c81613eb4565b9050919050565b6000602082019050818103600083015261433c81613f1a565b9050919050565b6000602082019050818103600083015261435c81613f80565b9050919050565b60006080820190506143786000830184613fc0565b92915050565b6000610120820190506143946000830184614015565b92915050565b60006020820190506143af60008301846140db565b92915050565b60006060820190506143ca60008301866140db565b6143d760208301856140db565b6143e460408301846140db565b949350505050565b600060808201905061440160008301876140db565b61440e60208301866140db565b61441b60408301856140db565b61442860608301846140db565b95945050505050565b600061012082019050614447600083018c6140db565b614454602083018b6140db565b614461604083018a6140db565b61446e60608301896140db565b61447b60808301886140db565b61448860a0830187613993565b61449560c08301866140db565b6144a260e08301856140db565b6144b0610100830184613a6d565b9a9950505050505050505050565b60006020820190506144d360008301846140ea565b92915050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600061457282614585565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006145c7826145ce565b9050919050565b60006145d982614585565b9050919050565b60005b838110156145fe5780820151818401526020810190506145e3565b8381111561460d576000848401525b50505050565b6000601f19601f8301169050919050565b61462d81614567565b811461463857600080fd5b50565b614644816145a5565b811461464f57600080fd5b5056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212208174f8de31554ee6553b2bdcdd4608327311579889ef960796b295c35326734064736f6c634300060c0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102115760003560e01c80638da5cb5b11610125578063ac5c0e7a116100ad578063c6b61e4c1161007c578063c6b61e4c1461062b578063c6bec93a1461065e578063dd60c8981461068e578063dd62ed3e146106ac578063f2fde38b146106dc57610211565b8063ac5c0e7a146105b5578063af0b4b27146105e5578063bf6d9abd14610603578063c433cfad1461060d57610211565b80639dc29fac116100f45780639dc29fac146104fd578063a01c62f714610519578063a457c2d714610537578063a9059cbb14610567578063aaf5eb681461059757610211565b80638da5cb5b14610485578063916e1c57146104a357806393d39240146104c157806395d89b41146104df57610211565b8063278c5dea116101a8578063395093511161017757806339509351146103e1578063485cc9551461041157806350d9533e1461042d57806370a082311461044b578063715018a61461047b57610211565b8063278c5dea1461033057806327e235e314610361578063313ce5671461039357806335c1d349146103b157610211565b806318160ddd116101e457806318160ddd146102ba5780631a9aea0a146102d85780631be929fa146102e257806323b872dd1461030057610211565b806306a4c9831461021657806306fdde0314610234578063095ea7b3146102525780631398e07614610282575b600080fd5b61021e6106f8565b60405161022b9190614363565b60405180910390f35b61023c61075b565b6040516102499190614181565b60405180910390f35b61026c6004803603810190610267919061383c565b6107fd565b604051610279919061414b565b60405180910390f35b61029c60048036038101906102979190613878565b61081b565b6040516102b199989796959493929190614431565b60405180910390f35b6102c26108a3565b6040516102cf919061439a565b60405180910390f35b6102e06108ad565b005b6102ea61095a565b6040516102f7919061439a565b60405180910390f35b61031a600480360381019061031591906137ed565b610962565b604051610327919061414b565b60405180910390f35b61034a60048036038101906103459190613918565b610a3b565b604051610358929190614114565b60405180910390f35b61037b60048036038101906103769190613788565b610c02565b60405161038a939291906143b5565b60405180910390f35b61039b610c2c565b6040516103a891906144be565b60405180910390f35b6103cb60048036038101906103c69190613878565b610c43565b6040516103d891906140f9565b60405180910390f35b6103fb60048036038101906103f6919061383c565b610c7f565b604051610408919061414b565b60405180910390f35b61042b600480360381019061042691906137b1565b610d32565b005b6104356110b7565b604051610442919061439a565b60405180910390f35b61046560048036038101906104609190613788565b6110c4565b604051610472919061439a565b60405180910390f35b610483611269565b005b61048d6113c1565b60405161049a91906140f9565b60405180910390f35b6104ab6113eb565b6040516104b8919061439a565b60405180910390f35b6104c96113f8565b6040516104d6919061439a565b60405180910390f35b6104e76113fd565b6040516104f49190614181565b60405180910390f35b6105176004803603810190610512919061383c565b61149f565b005b610521611544565b60405161052e919061414b565b60405180910390f35b610551600480360381019061054c919061383c565b611557565b60405161055e919061414b565b60405180910390f35b610581600480360381019061057c919061383c565b611624565b60405161058e919061414b565b60405180910390f35b61059f611642565b6040516105ac919061439a565b60405180910390f35b6105cf60048036038101906105ca91906138a1565b61164e565b6040516105dc919061437e565b60405180910390f35b6105ed611b0c565b6040516105fa919061437e565b60405180910390f35b61060b611c76565b005b610615611d23565b6040516106229190614166565b60405180910390f35b61064560048036038101906106409190613878565b611d49565b60405161065594939291906143ec565b60405180910390f35b61067860048036038101906106739190613878565b611d86565b604051610685919061437e565b60405180910390f35b6106966121c5565b6040516106a3919061439a565b60405180910390f35b6106c660048036038101906106c191906137b1565b6121d2565b6040516106d3919061439a565b60405180910390f35b6106f660048036038101906106f19190613788565b612259565b005b610700613635565b609d6001609d80549050038154811061071557fe5b9060005260206000209060040201604051806080016040529081600082015481526020016001820154815260200160028201548152602001600382015481525050905090565b6060609a8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156107f35780601f106107c8576101008083540402835291602001916107f3565b820191906000526020600020905b8154815290600101906020018083116107d657829003601f168201915b5050505050905090565b600061081161080a612420565b8484612428565b6001905092915050565b609e818154811061082857fe5b90600052602060002090600902016000915090508060000154908060010154908060020154908060030154908060040154908060050160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060060154908060070154908060080160009054906101000a900460ff16905089565b6000609954905090565b60a260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461093d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093490614223565b60405180910390fd5b6001609f60006101000a81548160ff021916908315150217905550565b637735940081565b600061096f8484846125f3565b610a308461097b612420565b610a2b8560405180606001604052806028815260200161469b60289139609860008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006109e1612420565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546129be9092919063ffffffff16565b612428565b600190509392505050565b606080600060a0805490508486011115610a6c57610a678560a080549050612a1990919063ffffffff16565b610a6e565b835b90508067ffffffffffffffff81118015610a8757600080fd5b50604051908082528060200260200182016040528015610ab65781602001602082028036833780820191505090505b5092508067ffffffffffffffff81118015610ad057600080fd5b50604051908082528060200260200182016040528015610aff5781602001602082028036833780820191505090505b50915060008590505b818601811015610bf95760a08181548110610b1f57fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168487830381518110610b5857fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050610bd260a08281548110610ba257fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166110c4565b8387830381518110610be057fe5b6020026020010181815250508080600101915050610b08565b50509250929050565b60a16020528060005260406000206000915090508060000154908060010154908060020154905083565b6000609c60009054906101000a900460ff16905090565b60a08181548110610c5057fe5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000610d28610c8c612420565b84610d238560986000610c9d612420565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612a6390919063ffffffff16565b612428565b6001905092915050565b600060019054906101000a900460ff1680610d515750610d50612ab8565b5b80610d67575060008054906101000a900460ff16155b610da6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9d906142c3565b60405180910390fd5b60008060019054906101000a900460ff161590508015610df6576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b610e6a6040518060400160405280600581526020017f4c6f74746f0000000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f4c4f54544f000000000000000000000000000000000000000000000000000000815250612acf565b610e72612bcb565b8260a260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610edb82610ed6670de0b6b3a76400006377359400612cc390919063ffffffff16565b612d33565b609d604051806080016040528060008152602001600081526020016000815260200160008152509080600181540180825580915050600190039060005260206000209060040201600090919091909150600082015181600001556020820151816001015560408201518160020155606082015181600301555050609e6040518061012001604052806000815260200160008152602001600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001600015158152509080600181540180825580915050600190039060005260206000209060090201600090919091909150600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060c0820151816006015560e082015181600701556101008201518160080160006101000a81548160ff021916908315150217905550505080156110b25760008060016101000a81548160ff0219169083151502179055505b505050565b6000609e80549050905090565b60008060a160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000609e805490501480611120575060008160010154145b15611132578060010154915050611264565b6000609e82600001548154811061114557fe5b906000526020600020906009020190506000609d82600601548154811061116857fe5b906000526020600020906004020190506000836001015490508360000154826003015411156111aa576111a78160018660000154018460030154612fef565b90505b609d805490506001846006015401101561125c576000600184600601540190505b609d80549050811080156111df5750600082115b1561125a57609d81815481106111f157fe5b906000526020600020906004020192508260000154821061122a57611223836000015483612a1990919063ffffffff16565b915061124d565b826001015482111561124c576112498284600201548560030154612fef565b91505b5b80806001019150506111cb565b505b809450505050505b919050565b611271612420565b73ffffffffffffffffffffffffffffffffffffffff16606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611300576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f7906142a3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000606560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000609d80549050905090565b601e81565b6060609b8054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114955780601f1061146a57610100808354040283529160200191611495565b820191906000526020600020905b81548152906001019060200180831161147857829003601f168201915b5050505050905090565b6114a7612420565b73ffffffffffffffffffffffffffffffffffffffff16606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611536576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152d906142a3565b60405180910390fd5b6115408282613068565b5050565b609f60009054906101000a900460ff1681565b600061161a611564612420565b84611615856040518060600160405280602581526020016146c3602591396098600061158e612420565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546129be9092919063ffffffff16565b612428565b6001905092915050565b6000611638611631612420565b84846125f3565b6001905092915050565b670de0b6b3a764000081565b61165661365d565b60a260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146116e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116dd90614223565b60405180910390fd5b6000609e6001609e8054905003815481106116fd57fe5b90600052602060002090600902019050600115158160080160009054906101000a900460ff16151514611765576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175c906141c3565b60405180910390fd5b868160040181905550858160050160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555083816007018190555042816003018190555060008160080160006101000a81548160ff0219169083151502179055506000609d8260060154815481106117f357fe5b906000526020600020906004020190508160000154816003018190555061182b82600101548260000154612a6390919063ffffffff16565b81600001819055506000611850866118428a6110c4565b612a6390919063ffffffff16565b90506040518060600160405280846000015481526020018281526020014281525060a160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000820151816000015560208201518160010155604082015181600201559050508773ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8860405161192e919061439a565b60405180910390a36000611953866119458a6110c4565b612a6390919063ffffffff16565b90506040518060600160405280856000015481526020018281526020014281525060a160008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000820151816000015560208201518160010155604082015181600201559050508773ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef88604051611a31919061439a565b60405180910390a3836040518061012001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160068201548152602001600782015481526020016008820160009054906101000a900460ff16151515158152505094505050505095945050505050565b611b1461365d565b6000609e805490501415611b8a576040518061012001604052806000815260200160008152602001600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001600015158152509050611c73565b609e6001609e805490500381548110611b9f57fe5b90600052602060002090600902016040518061012001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160068201548152602001600782015481526020016008820160009054906101000a900460ff16151515158152505090505b90565b60a260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cfd90614223565b60405180910390fd5b6000609f60006101000a81548160ff021916908315150217905550565b60a260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b609d8181548110611d5657fe5b90600052602060002090600402016000915090508060000154908060010154908060020154908060030154905084565b611d8e61365d565b60a260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611e1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1590614223565b60405180910390fd5b6000609e6001609e805490500381548110611e3557fe5b90600052602060002090600902019050600081600301541415611e795742816003018190555060008160080160006101000a81548160ff0219169083151502179055505b6000609d6001609d805490500381548110611e9057fe5b906000526020600020906004020190506000609e805490509050601e8260020154820310611f675782600001548260030181905550609d60405180608001604052806000815260200187815260200183815260200160008152509080600181540180825580915050600190039060005260206000209060040201600090919091909150600082015181600001556020820151816001015560408201518160020155606082015181600301555050609d6001609d805490500381548110611f5257fe5b90600052602060002090600402019150611f95565b600082600101541415611f7e578482600101819055505b8482600101541115611f94578482600101819055505b5b609e6040518061012001604052808381526020018781526020014281526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016001609d8054905003815260200160008152602001600115158152509080600181540180825580915050600190039060005260206000209060090201600090919091909150600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060c0820151816006015560e082015181600701556101008201518160080160006101000a81548160ff0219169083151502179055505050609e6001609e8054905003815481106120ea57fe5b90600052602060002090600902016040518061012001604052908160008201548152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200160068201548152602001600782015481526020016008820160009054906101000a900460ff1615151515815250509350505050919050565b600060a080549050905090565b6000609860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b612261612420565b73ffffffffffffffffffffffffffffffffffffffff16606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146122f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e7906142a3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612360576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612357906141e3565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16606560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380606560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612498576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248f90614323565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612508576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ff90614203565b60405180910390fd5b80609860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516125e6919061439a565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612663576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265a90614303565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156126d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126ca906141a3565b60405180910390fd5b609f60009054906101000a900460ff1615612723576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161271a90614263565b60405180910390fd5b61272e838383613283565b60006127658260405180606001604052806026815260200161467560269139612756876110c4565b6129be9092919063ffffffff16565b905061276f61365d565b612777611b0c565b90506040518060600160405280826000015181526020018381526020014281525060a160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082015181600001556020820151816001015560408201518160020155905050600060a160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002015414801561284a5750600083115b156128b35760a0849080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b60006128d0846128c2876110c4565b612a6390919063ffffffff16565b90506040518060600160405280836000015181526020018281526020014281525060a160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000820151816000015560208201518160010155604082015181600201559050508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040516129ae919061439a565b60405180910390a3505050505050565b6000838311158290612a06576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129fd9190614181565b60405180910390fd5b5060008385039050809150509392505050565b6000612a5b83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506129be565b905092915050565b600080828401905083811015612aae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aa590614243565b60405180910390fd5b8091505092915050565b6000803090506000813b9050600081149250505090565b600060019054906101000a900460ff1680612aee5750612aed612ab8565b5b80612b04575060008054906101000a900460ff16155b612b43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b3a906142c3565b60405180910390fd5b60008060019054906101000a900460ff161590508015612b93576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b612b9b613288565b612ba58383613370565b8015612bc65760008060016101000a81548160ff0219169083151502179055505b505050565b600060019054906101000a900460ff1680612bea5750612be9612ab8565b5b80612c00575060008054906101000a900460ff16155b612c3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c36906142c3565b60405180910390fd5b60008060019054906101000a900460ff161590508015612c8f576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b612c97613288565b612c9f6134a4565b8015612cc05760008060016101000a81548160ff0219169083151502179055505b50565b600080831415612cd65760009050612d2d565b6000828402905082848281612ce757fe5b0414612d28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d1f90614283565b60405180910390fd5b809150505b92915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612da3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9a90614343565b60405180910390fd5b6000612dc082612db2856110c4565b612a6390919063ffffffff16565b9050600060a160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154148015612e145750600082115b15612e7d5760a0839080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b612e8561365d565b612e8d611b0c565b9050806000015160a160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055508160a160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055504260a160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020181905550612f7d83609954612a6390919063ffffffff16565b6099819055508373ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85604051612fe1919061439a565b60405180910390a350505050565b6000808390505b8281111580156130065750600085115b1561305d576000609e828154811061301a57fe5b906000526020600020906009020190508060010154861061304f5761304c816001015487612a1990919063ffffffff16565b95505b508080600101915050612ff6565b508390509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156130d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130cf906142e3565b60405180910390fd5b600061310f8260405180606001604052806022815260200161465360229139613100866110c4565b6129be9092919063ffffffff16565b905061311961365d565b613121611b0c565b9050806000015160a160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001819055508160a160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055504260a160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002018190555061321183609954612a1990919063ffffffff16565b609981905550600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef85604051613275919061439a565b60405180910390a350505050565b505050565b600060019054906101000a900460ff16806132a757506132a6612ab8565b5b806132bd575060008054906101000a900460ff16155b6132fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132f3906142c3565b60405180910390fd5b60008060019054906101000a900460ff16159050801561334c576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b801561336d5760008060016101000a81548160ff0219169083151502179055505b50565b600060019054906101000a900460ff168061338f575061338e612ab8565b5b806133a5575060008054906101000a900460ff16155b6133e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133db906142c3565b60405180910390fd5b60008060019054906101000a900460ff161590508015613434576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b82609a908051906020019061344a9291906136c1565b5081609b90805190602001906134619291906136c1565b506012609c60006101000a81548160ff021916908360ff160217905550801561349f5760008060016101000a81548160ff0219169083151502179055505b505050565b600060019054906101000a900460ff16806134c357506134c2612ab8565b5b806134d9575060008054906101000a900460ff16155b613518576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161350f906142c3565b60405180910390fd5b60008060019054906101000a900460ff161590508015613568576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b6000613572612420565b905080606560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35080156136325760008060016101000a81548160ff0219169083151502179055505b50565b6040518060800160405280600081526020016000815260200160008152602001600081525090565b6040518061012001604052806000815260200160008152602001600081526020016000815260200160008152602001600073ffffffffffffffffffffffffffffffffffffffff16815260200160008152602001600081526020016000151581525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061370257805160ff1916838001178555613730565b82800160010185558215613730579182015b8281111561372f578251825591602001919060010190613714565b5b50905061373d9190613741565b5090565b5b8082111561375a576000816000905550600101613742565b5090565b60008135905061376d81614624565b92915050565b6000813590506137828161463b565b92915050565b60006020828403121561379a57600080fd5b60006137a88482850161375e565b91505092915050565b600080604083850312156137c457600080fd5b60006137d28582860161375e565b92505060206137e38582860161375e565b9150509250929050565b60008060006060848603121561380257600080fd5b60006138108682870161375e565b93505060206138218682870161375e565b925050604061383286828701613773565b9150509250925092565b6000806040838503121561384f57600080fd5b600061385d8582860161375e565b925050602061386e85828601613773565b9150509250929050565b60006020828403121561388a57600080fd5b600061389884828501613773565b91505092915050565b600080600080600060a086880312156138b957600080fd5b60006138c788828901613773565b95505060206138d88882890161375e565b94505060406138e98882890161375e565b93505060606138fa88828901613773565b925050608061390b88828901613773565b9150509295509295909350565b6000806040838503121561392b57600080fd5b600061393985828601613773565b925050602061394a85828601613773565b9150509250929050565b60006139608383613984565b60208301905092915050565b600061397883836140cc565b60208301905092915050565b61398d81614567565b82525050565b61399c81614567565b82525050565b60006139ad826144f9565b6139b78185614534565b93506139c2836144d9565b8060005b838110156139f35781516139da8882613954565b97506139e58361451a565b9250506001810190506139c6565b5085935050505092915050565b6000613a0b82614504565b613a158185614545565b9350613a20836144e9565b8060005b83811015613a51578151613a38888261396c565b9750613a4383614527565b925050600181019050613a24565b5085935050505092915050565b613a6781614579565b82525050565b613a7681614579565b82525050565b613a85816145bc565b82525050565b6000613a968261450f565b613aa08185614556565b9350613ab08185602086016145e0565b613ab981614613565b840191505092915050565b6000613ad1602383614556565b91507f45524332303a207472616e7366657220746f20746865207a65726f206164647260008301527f65737300000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613b37601a83614556565b91507f4c6f74746572792067616d65206973206e6f74206163746976650000000000006000830152602082019050919050565b6000613b77602683614556565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613bdd602283614556565b91507f45524332303a20617070726f766520746f20746865207a65726f20616464726560008301527f73730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613c43602d83614556565b91507f4f6e6c7920616c6c6f77656420746f2063616c6c206279204c6f74746572792060008301527f67616d6520636f6e7472616374000000000000000000000000000000000000006020830152604082019050919050565b6000613ca9601b83614556565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b6000613ce9602d83614556565b91507f5468652047616d652069732072756e6e696e672c20616c6c207472616e73666560008301527f727320617265206c6f636b6564000000000000000000000000000000000000006020830152604082019050919050565b6000613d4f602183614556565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613db5602083614556565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613df5602e83614556565b91507f436f6e747261637420696e7374616e63652068617320616c726561647920626560008301527f656e20696e697469616c697a65640000000000000000000000000000000000006020830152604082019050919050565b6000613e5b602183614556565b91507f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360008301527f73000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613ec1602583614556565b91507f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008301527f64726573730000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613f27602483614556565b91507f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613f8d601f83614556565b91507f45524332303a206d696e7420746f20746865207a65726f2061646472657373006000830152602082019050919050565b608082016000820151613fd660008501826140cc565b506020820151613fe960208501826140cc565b506040820151613ffc60408501826140cc565b50606082015161400f60608501826140cc565b50505050565b6101208201600082015161402c60008501826140cc565b50602082015161403f60208501826140cc565b50604082015161405260408501826140cc565b50606082015161406560608501826140cc565b50608082015161407860808501826140cc565b5060a082015161408b60a0850182613984565b5060c082015161409e60c08501826140cc565b5060e08201516140b160e08501826140cc565b506101008201516140c6610100850182613a5e565b50505050565b6140d5816145a5565b82525050565b6140e4816145a5565b82525050565b6140f3816145af565b82525050565b600060208201905061410e6000830184613993565b92915050565b6000604082019050818103600083015261412e81856139a2565b905081810360208301526141428184613a00565b90509392505050565b60006020820190506141606000830184613a6d565b92915050565b600060208201905061417b6000830184613a7c565b92915050565b6000602082019050818103600083015261419b8184613a8b565b905092915050565b600060208201905081810360008301526141bc81613ac4565b9050919050565b600060208201905081810360008301526141dc81613b2a565b9050919050565b600060208201905081810360008301526141fc81613b6a565b9050919050565b6000602082019050818103600083015261421c81613bd0565b9050919050565b6000602082019050818103600083015261423c81613c36565b9050919050565b6000602082019050818103600083015261425c81613c9c565b9050919050565b6000602082019050818103600083015261427c81613cdc565b9050919050565b6000602082019050818103600083015261429c81613d42565b9050919050565b600060208201905081810360008301526142bc81613da8565b9050919050565b600060208201905081810360008301526142dc81613de8565b9050919050565b600060208201905081810360008301526142fc81613e4e565b9050919050565b6000602082019050818103600083015261431c81613eb4565b9050919050565b6000602082019050818103600083015261433c81613f1a565b9050919050565b6000602082019050818103600083015261435c81613f80565b9050919050565b60006080820190506143786000830184613fc0565b92915050565b6000610120820190506143946000830184614015565b92915050565b60006020820190506143af60008301846140db565b92915050565b60006060820190506143ca60008301866140db565b6143d760208301856140db565b6143e460408301846140db565b949350505050565b600060808201905061440160008301876140db565b61440e60208301866140db565b61441b60408301856140db565b61442860608301846140db565b95945050505050565b600061012082019050614447600083018c6140db565b614454602083018b6140db565b614461604083018a6140db565b61446e60608301896140db565b61447b60808301886140db565b61448860a0830187613993565b61449560c08301866140db565b6144a260e08301856140db565b6144b0610100830184613a6d565b9a9950505050505050505050565b60006020820190506144d360008301846140ea565b92915050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600061457282614585565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b60006145c7826145ce565b9050919050565b60006145d982614585565b9050919050565b60005b838110156145fe5780820151818401526020810190506145e3565b8381111561460d576000848401525b50505050565b6000601f19601f8301169050919050565b61462d81614567565b811461463857600080fd5b50565b614644816145a5565b811461464f57600080fd5b5056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212208174f8de31554ee6553b2bdcdd4608327311579889ef960796b295c35326734064736f6c634300060c0033
Deployed Bytecode Sourcemap
30287:11205:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37867:124;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19574:83;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21688:169;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30640:26;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;20649:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32187;;;:::i;:::-;;30548:55;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22331:321;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37999:629;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;30749:47;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;20501:83;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30712:30;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23061:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31003:1061;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37399:98;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35743:1536;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5581:148;;;:::i;:::-;;4939:79;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37505:92;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30427:44;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19776:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32072:107;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30675:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23782:269;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21152:175;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30478:61;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34231:1504;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37605:254;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32295:103;;;:::i;:::-;;30805:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30612:21;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;32406:1817;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37287:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21390:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5884:244;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37867:124;37920:18;;:::i;:::-;37958:6;37981:1;37965:6;:13;;;;:17;37958:25;;;;;;;;;;;;;;;;;;37951:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37867:124;:::o;19574:83::-;19611:13;19644:5;19637:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19574:83;:::o;21688:169::-;21771:4;21788:39;21797:12;:10;:12::i;:::-;21811:7;21820:6;21788:8;:39::i;:::-;21845:4;21838:11;;21688:169;;;;:::o;30640:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;20649:100::-;20702:7;20729:12;;20722:19;;20649:100;:::o;32187:::-;30913:11;;;;;;;;;;;30891:34;;:10;:34;;;30883:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;32275:4:::1;32256:16;;:23;;;;;;;;;;;;;;;;;;32187:100::o:0;30548:55::-;30590:13;30548:55;:::o;22331:321::-;22437:4;22454:36;22464:6;22472:9;22483:6;22454:9;:36::i;:::-;22501:121;22510:6;22518:12;:10;:12::i;:::-;22532:89;22570:6;22532:89;;;;;;;;;;;;;;;;;:11;:19;22544:6;22532:19;;;;;;;;;;;;;;;:33;22552:12;:10;:12::i;:::-;22532:33;;;;;;;;;;;;;;;;:37;;:89;;;;;:::i;:::-;22501:8;:121::i;:::-;22640:4;22633:11;;22331:321;;;;;:::o;37999:629::-;38089:38;38138:37;38194:18;38231:12;:19;;;;38222:5;38215:4;:12;:35;;:75;;38261:29;38285:4;38261:12;:19;;;;:23;;:29;;;;:::i;:::-;38215:75;;;38253:5;38215:75;38194:96;;38340:10;38326:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38303:48;;38398:10;38384:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38362:47;;38427:9;38439:4;38427:16;;38422:199;38456:10;38449:4;:17;38445:1;:21;38422:199;;;38521:12;38534:1;38521:15;;;;;;;;;;;;;;;;;;;;;;;;;38488:20;38513:4;38509:1;:8;38488:30;;;;;;;;;;;;;:48;;;;;;;;;;;38583:26;38593:12;38606:1;38593:15;;;;;;;;;;;;;;;;;;;;;;;;;38583:9;:26::i;:::-;38551:19;38575:4;38571:1;:8;38551:29;;;;;;;;;;;;;:58;;;;;38468:3;;;;;;;38422:199;;;;37999:629;;;;;;:::o;30749:47::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;20501:83::-;20542:5;20567:9;;;;;;;;;;;20560:16;;20501:83;:::o;30712:30::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;23061:218::-;23149:4;23166:83;23175:12;:10;:12::i;:::-;23189:7;23198:50;23237:10;23198:11;:25;23210:12;:10;:12::i;:::-;23198:25;;;;;;;;;;;;;;;:34;23224:7;23198:34;;;;;;;;;;;;;;;;:38;;:50;;;;:::i;:::-;23166:8;:83::i;:::-;23267:4;23260:11;;23061:218;;;;:::o;31003:1061::-;1171:12;;;;;;;;;;;:31;;;;1187:15;:13;:15::i;:::-;1171:31;:47;;;;1207:11;;;;;;;;;;1206:12;1171:47;1163:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;1278:19;1301:12;;;;;;;;;;;1300:13;1278:35;;1324:14;1320:83;;;1364:4;1349:12;;:19;;;;;;;;;;;;;;;;;;1391:4;1377:11;;:18;;;;;;;;;;;;;;;;;;1320:83;31123:30:::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;::::0;:12:::1;:30::i;:::-;31164:16;:14;:16::i;:::-;31220:12;31193:11;;:40;;;;;;;;;;;;;;;;;;31289:52;31295:13;31310:30;30514:25;30590:13;31310:19;;:30;;;;:::i;:::-;31289:5;:52::i;:::-;31354:6;31380:201;;;;;;;;31404:1;31380:201;;;;31446:1;31380:201;;;;31498:1;31380:201;;;;31542:1;31380:201;;::::0;31354:238:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31605:9;31634:411;;;;;;;;31660:1;31634:411;;;;31695:1;31634:411;;;;31744:1;31634:411;;;;31786:1;31634:411;;;;31829:1;31634:411;;;;31882:1;31634:411;;;;;;31922:1;31634:411;;;;31962:1;31634:411;;;;32007:5;31634:411;;;;::::0;31605:451:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1425:14:::0;1421:57;;;1465:5;1450:12;;:20;;;;;;;;;;;;;;;;;;1421:57;31003:1061;;;:::o;37399:98::-;37446:7;37473:9;:16;;;;37466:23;;37399:98;:::o;35743:1536::-;35809:7;35829:31;35863:8;:17;35872:7;35863:17;;;;;;;;;;;;;;;35829:51;;35917:1;35897:9;:16;;;;:21;:49;;;;35945:1;35922:11;:19;;;:24;35897:49;35893:108;;;35970:11;:19;;;35963:26;;;;;35893:108;36013:23;36039:9;36049:11;:22;;;36039:33;;;;;;;;;;;;;;;;;;36013:59;;36083:19;36105:6;36112:7;:15;;;36105:23;;;;;;;;;;;;;;;;;;36083:45;;36141:25;36169:11;:19;;;36141:47;;36227:11;:22;;;36205:5;:19;;;:44;36201:257;;;36286:160;36331:17;36392:1;36367:11;:22;;;:26;36412:5;:19;;;36286:26;:160::i;:::-;36266:180;;36201:257;36496:6;:13;;;;36492:1;36474:7;:15;;;:19;:35;36470:765;;;36531:15;36567:1;36549:7;:15;;;:19;36531:37;;36526:698;36580:6;:13;;;;36570:7;:23;:48;;;;;36617:1;36597:17;:21;36570:48;36526:698;;;36658:6;36665:7;36658:15;;;;;;;;;;;;;;;;;;36650:23;;36719:5;:15;;;36698:17;:36;36694:515;;36779:38;36801:5;:15;;;36779:17;:21;;:38;;;;:::i;:::-;36759:58;;36694:515;;;36890:5;:25;;;36870:17;:45;36866:324;;;36964:202;37021:17;37069:5;:20;;;37120:5;:19;;;36964:26;:202::i;:::-;36944:222;;36866:324;36694:515;36620:9;;;;;;;36526:698;;;;36470:765;37254:17;37247:24;;;;;;35743:1536;;;;:::o;5581:148::-;5161:12;:10;:12::i;:::-;5151:22;;:6;;;;;;;;;;;:22;;;5143:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;5688:1:::1;5651:40;;5672:6;;;;;;;;;;;5651:40;;;;;;;;;;;;5719:1;5702:6;;:19;;;;;;;;;;;;;;;;;;5581:148::o:0;4939:79::-;4977:7;5004:6;;;;;;;;;;;4997:13;;4939:79;:::o;37505:92::-;37549:7;37576:6;:13;;;;37569:20;;37505:92;:::o;30427:44::-;30469:2;30427:44;:::o;19776:87::-;19815:13;19848:7;19841:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19776:87;:::o;32072:107::-;5161:12;:10;:12::i;:::-;5151:22;;:6;;;;;;;;;;;:22;;;5143:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;32149:22:::1;32155:7;32164:6;32149:5;:22::i;:::-;32072:107:::0;;:::o;30675:28::-;;;;;;;;;;;;;:::o;23782:269::-;23875:4;23892:129;23901:12;:10;:12::i;:::-;23915:7;23924:96;23963:15;23924:96;;;;;;;;;;;;;;;;;:11;:25;23936:12;:10;:12::i;:::-;23924:25;;;;;;;;;;;;;;;:34;23950:7;23924:34;;;;;;;;;;;;;;;;:38;;:96;;;;;:::i;:::-;23892:8;:129::i;:::-;24039:4;24032:11;;23782:269;;;;:::o;21152:175::-;21238:4;21255:42;21265:12;:10;:12::i;:::-;21279:9;21290:6;21255:9;:42::i;:::-;21315:4;21308:11;;21152:175;;;;:::o;30478:61::-;30514:25;30478:61;:::o;34231:1504::-;34481:34;;:::i;:::-;30913:11;;;;;;;;;;;30891:34;;:10;:34;;;30883:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;34528:23:::1;34554:9;34583:1;34564:9;:16;;;;:20;34554:31;;;;;;;;;;;;;;;;;;34528:57;;34626:4;34606:24;;:7;:16;;;;;;;;;;;;:24;;;34598:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;34697:13;34674:7;:20;;:36;;;;34738:14;34721:7;:14;;;:31;;;;;;;;;;;;;;;;;;34786:18;34763:7;:20;;:41;;;;34838:15;34817:7;:18;;:36;;;;34883:5;34864:7;:16;;;:24;;;;;;;;;;;;;;;;;;34901:19;34923:6;34930:7;:15;;;34923:23;;;;;;;;;;;;;;;;;;34901:45;;34979:7;:10;;;34957:5;:19;;:32;;;;35018:45;35038:7;:24;;;35018:5;:15;;;:19;;:45;;;;:::i;:::-;35000:5;:15;;:63;;;;35084:21;35108:49;35138:18;35108:25;35118:14;35108:9;:25::i;:::-;:29;;:49;;;;:::i;:::-;35084:73;;35197:105;;;;;;;;35223:7;:10;;;35197:105;;;;35248:13;35197:105;;;;35276:15;35197:105;;::::0;35170:8:::1;:24;35179:14;35170:24;;;;;;;;;;;;;;;:132;;;;;;;;;;;;;;;;;;;;;;;;;;;35344:14;35320:59;;35337:4;35320:59;;;35360:18;35320:59;;;;;;:::i;:::-;;;;;;;;35392:24;35419:52;35452:18;35419:28;35429:17;35419:9;:28::i;:::-;:32;;:52;;;;:::i;:::-;35392:79;;35514:108;;;;;;;;35540:7;:10;;;35514:108;;;;35565:16;35514:108;;;;35596:15;35514:108;;::::0;35484:8:::1;:27;35493:17;35484:27;;;;;;;;;;;;;;;:138;;;;;;;;;;;;;;;;;;;;;;;;;;;35664:17;35640:62;;35657:4;35640:62;;;35683:18;35640:62;;;;;;:::i;:::-;;;;;;;;35720:7;35713:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;34231:1504:::0;;;;;;;:::o;37605:254::-;37658:22;;:::i;:::-;37717:1;37697:9;:16;;;;:21;37693:108;;;37742:47;;;;;;;;37750:1;37742:47;;;;37753:1;37742:47;;;;37756:1;37742:47;;;;37759:1;37742:47;;;;37762:1;37742:47;;;;37773:1;37742:47;;;;;;37777:1;37742:47;;;;37780:1;37742:47;;;;37783:5;37742:47;;;;;37735:54;;;;37693:108;37820:9;37849:1;37830:9;:16;;;;:20;37820:31;;;;;;;;;;;;;;;;;;37813:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37605:254;;:::o;32295:103::-;30913:11;;;;;;;;;;;30891:34;;:10;:34;;;30883:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;32385:5:::1;32366:16;;:24;;;;;;;;;;;;;;;;;;32295:103::o:0;30805:31::-;;;;;;;;;;;;;:::o;30612:21::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;32406:1817::-;32498:27;;:::i;:::-;30913:11;;;;;;;;;;;30891:34;;:10;:34;;;30883:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;32538:23:::1;32564:9;32593:1;32574:9;:16;;;;:20;32564:31;;;;;;;;;;;;;;;;;;32538:57;;32693:1;32671:7;:18;;;:23;32667:131;;;32732:15;32711:7;:18;;:36;;;;32781:5;32762:7;:16;;;:24;;;;;;;;;;;;;;;;;;32667:131;32818:26;32847:6;32870:1;32854:6;:13;;;;:17;32847:25;;;;;;;;;;;;;;;;;;32818:54;;32885:17;32905:9;:16;;;;32885:36;;30469:2;32950:12;:27;;;32938:9;:39;:58;32934:714;;33042:7;:10;;;33013:12;:26;;:39;;;;33069:6;33099:144;;;;;;;;33127:1;33099:144;;;;33151:17;33099:144;;;;33191:9;33099:144;;;;33223:1;33099:144;;::::0;33069:189:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33290:6;33313:1;33297:6;:13;;;;:17;33290:25;;;;;;;;;;;;;;;;;;33275:40;;32934:714;;;33388:1;33352:12;:32;;;:37;33348:130;;;33445:17;33410:12;:32;;:52;;;;33348:130;33531:17;33496:12;:32;;;:52;33492:145;;;33604:17;33569:12;:32;;:52;;;;33492:145;32934:714;33660:9;33689:464;;;;;;;;33715:9;33689:464;;;;33758:17;33689:464;;;;33823:15;33689:464;;;;33879:1;33689:464;;;;33922:1;33689:464;;;;33975:1;33689:464;;;;;;34031:1;34015:6;:13;;;;:17;33689:464;;;;34071:1;33689:464;;;;34116:4;33689:464;;;;::::0;33660:504:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34184:9;34213:1;34194:9;:16;;;;:20;34184:31;;;;;;;;;;;;;;;;;;34177:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;32406:1817:::0;;;:::o;37287:104::-;37337:7;37364:12;:19;;;;37357:26;;37287:104;:::o;21390:151::-;21479:7;21506:11;:18;21518:5;21506:18;;;;;;;;;;;;;;;:27;21525:7;21506:27;;;;;;;;;;;;;;;;21499:34;;21390:151;;;;:::o;5884:244::-;5161:12;:10;:12::i;:::-;5151:22;;:6;;;;;;;;;;;:22;;;5143:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;5993:1:::1;5973:22;;:8;:22;;;;5965:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;6083:8;6054:38;;6075:6;;;;;;;;;;;6054:38;;;;;;;;;;;;6112:8;6103:6;;:17;;;;;;;;;;;;;;;;;;5884:244:::0;:::o;3215:106::-;3268:15;3303:10;3296:17;;3215:106;:::o;26927:346::-;27046:1;27029:19;;:5;:19;;;;27021:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;27127:1;27108:21;;:7;:21;;;;27100:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;27211:6;27181:11;:18;27193:5;27181:18;;;;;;;;;;;;;;;:27;27200:7;27181:27;;;;;;;;;;;;;;;:36;;;;27249:7;27233:32;;27242:5;27233:32;;;27258:6;27233:32;;;;;;:::i;:::-;;;;;;;;26927:346;;;:::o;39181:1090::-;39313:1;39295:20;;:6;:20;;;;39287:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;39397:1;39376:23;;:9;:23;;;;39368:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;39459:16;;;;;;;;;;;39458:17;39450:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;39538:47;39559:6;39567:9;39578:6;39538:20;:47::i;:::-;39598:21;39622:71;39644:6;39622:71;;;;;;;;;;;;;;;;;:17;39632:6;39622:9;:17::i;:::-;:21;;:71;;;;;:::i;:::-;39598:95;;39706:22;;:::i;:::-;39731:13;:11;:13::i;:::-;39706:38;;39776:105;;;;;;;;39802:7;:10;;;39776:105;;;;39827:13;39776:105;;;;39855:15;39776:105;;;39757:8;:16;39766:6;39757:16;;;;;;;;;;;;;;;:124;;;;;;;;;;;;;;;;;;;;;;;;;;;39924:1;39898:8;:19;39907:9;39898:19;;;;;;;;;;;;;;;:22;;;:27;:41;;;;;39938:1;39929:6;:10;39898:41;39894:102;;;39956:12;39974:9;39956:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39894:102;40008:24;40035:32;40060:6;40035:20;40045:9;40035;:20::i;:::-;:24;;:32;;;;:::i;:::-;40008:59;;40102:108;;;;;;;;40128:7;:10;;;40102:108;;;;40153:16;40102:108;;;;40184:15;40102:108;;;40080:8;:19;40089:9;40080:19;;;;;;;;;;;;;;;:130;;;;;;;;;;;;;;;;;;;;;;;;;;;40245:9;40228:35;;40237:6;40228:35;;;40256:6;40228:35;;;;;;:::i;:::-;;;;;;;;39181:1090;;;;;;:::o;7996:192::-;8082:7;8115:1;8110;:6;;8118:12;8102:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;8142:9;8158:1;8154;:5;8142:17;;8179:1;8172:8;;;7996:192;;;;;:::o;7565:136::-;7623:7;7650:43;7654:1;7657;7650:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;7643:50;;7565:136;;;;:::o;7109:181::-;7167:7;7187:9;7203:1;7199;:5;7187:17;;7228:1;7223;:6;;7215:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;7281:1;7274:8;;;7109:181;;;;:::o;1572:508::-;1619:4;1966:12;1989:4;1966:28;;2001:10;2047:4;2035:17;2029:23;;2073:1;2067:2;:7;2060:14;;;;1572:508;:::o;19141:177::-;1171:12;;;;;;;;;;;:31;;;;1187:15;:13;:15::i;:::-;1171:31;:47;;;;1207:11;;;;;;;;;;1206:12;1171:47;1163:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;1278:19;1301:12;;;;;;;;;;;1300:13;1278:35;;1324:14;1320:83;;;1364:4;1349:12;;:19;;;;;;;;;;;;;;;;;;1391:4;1377:11;;:18;;;;;;;;;;;;;;;;;;1320:83;19237:26:::1;:24;:26::i;:::-;19274:36;19297:4;19303:6;19274:22;:36::i;:::-;1425:14:::0;1421:57;;;1465:5;1450:12;;:20;;;;;;;;;;;;;;;;;;1421:57;19141:177;;;:::o;4517:129::-;1171:12;;;;;;;;;;;:31;;;;1187:15;:13;:15::i;:::-;1171:31;:47;;;;1207:11;;;;;;;;;;1206:12;1171:47;1163:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;1278:19;1301:12;;;;;;;;;;;1300:13;1278:35;;1324:14;1320:83;;;1364:4;1349:12;;:19;;;;;;;;;;;;;;;;;;1391:4;1377:11;;:18;;;;;;;;;;;;;;;;;;1320:83;4575:26:::1;:24;:26::i;:::-;4612;:24;:26::i;:::-;1425:14:::0;1421:57;;;1465:5;1450:12;;:20;;;;;;;;;;;;;;;;;;1421:57;4517:129;:::o;8439:471::-;8497:7;8747:1;8742;:6;8738:47;;;8772:1;8765:8;;;;8738:47;8797:9;8813:1;8809;:5;8797:17;;8842:1;8837;8833;:5;;;;;;:10;8825:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;8901:1;8894:8;;;8439:471;;;;;:::o;40279:636::-;40383:1;40364:21;;:7;:21;;;;40356:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;40434:15;40452:30;40475:6;40452:18;40462:7;40452:9;:18::i;:::-;:22;;:30;;;;:::i;:::-;40434:48;;40523:1;40499:8;:17;40508:7;40499:17;;;;;;;;;;;;;;;:20;;;:25;:39;;;;;40537:1;40528:6;:10;40499:39;40495:98;;;40555:12;40573:7;40555:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40495:98;40605:22;;:::i;:::-;40630:13;:11;:13::i;:::-;40605:38;;40687:7;:10;;;40656:8;:17;40665:7;40656:17;;;;;;;;;;;;;;;:28;;:41;;;;40736:7;40708:8;:17;40717:7;40708:17;;;;;;;;;;;;;;;:25;;:35;;;;40777:15;40754:8;:17;40763:7;40754:17;;;;;;;;;;;;;;;:20;;:38;;;;40828:24;40845:6;40828:12;;:16;;:24;;;;:::i;:::-;40813:12;:39;;;;40891:7;40870:37;;40887:1;40870:37;;;40900:6;40870:37;;;;;;:::i;:::-;;;;;;;;40279:636;;;;:::o;38636:537::-;38796:7;38821:9;38833:11;38821:23;;38816:312;38851:9;38846:1;:14;;:40;;;;;38885:1;38864:18;:22;38846:40;38816:312;;;38908:23;38934:9;38944:1;38934:12;;;;;;;;;;;;;;;;;;38908:38;;38987:7;:24;;;38965:18;:46;38961:156;;39053:48;39076:7;:24;;;39053:18;:22;;:48;;;;:::i;:::-;39032:69;;38961:156;38816:312;38888:3;;;;;;;38816:312;;;;39147:18;39140:25;;38636:537;;;;;:::o;40923:566::-;41027:1;41008:21;;:7;:21;;;;41000:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;41080:15;41098:68;41121:6;41098:68;;;;;;;;;;;;;;;;;:18;41108:7;41098:9;:18::i;:::-;:22;;:68;;;;;:::i;:::-;41080:86;;41179:22;;:::i;:::-;41204:13;:11;:13::i;:::-;41179:38;;41261:7;:10;;;41230:8;:17;41239:7;41230:17;;;;;;;;;;;;;;;:28;;:41;;;;41310:7;41282:8;:17;41291:7;41282:17;;;;;;;;;;;;;;;:25;;:35;;;;41351:15;41328:8;:17;41337:7;41328:17;;;;;;;;;;;;;;;:20;;:38;;;;41402:24;41419:6;41402:12;;:16;;:24;;;;:::i;:::-;41387:12;:39;;;;41470:1;41444:37;;41453:7;41444:37;;;41474:6;41444:37;;;;;;:::i;:::-;;;;;;;;40923:566;;;;:::o;28298:92::-;;;;:::o;3136:69::-;1171:12;;;;;;;;;;;:31;;;;1187:15;:13;:15::i;:::-;1171:31;:47;;;;1207:11;;;;;;;;;;1206:12;1171:47;1163:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;1278:19;1301:12;;;;;;;;;;;1300:13;1278:35;;1324:14;1320:83;;;1364:4;1349:12;;:19;;;;;;;;;;;;;;;;;;1391:4;1377:11;;:18;;;;;;;;;;;;;;;;;;1320:83;1425:14;1421:57;;;1465:5;1450:12;;:20;;;;;;;;;;;;;;;;;;1421:57;3136:69;:::o;19326:178::-;1171:12;;;;;;;;;;;:31;;;;1187:15;:13;:15::i;:::-;1171:31;:47;;;;1207:11;;;;;;;;;;1206:12;1171:47;1163:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;1278:19;1301:12;;;;;;;;;;;1300:13;1278:35;;1324:14;1320:83;;;1364:4;1349:12;;:19;;;;;;;;;;;;;;;;;;1391:4;1377:11;;:18;;;;;;;;;;;;;;;;;;1320:83;19440:4:::1;19432:5;:12;;;;;;;;;;;;:::i;:::-;;19465:6;19455:7;:16;;;;;;;;;;;;:::i;:::-;;19494:2;19482:9;;:14;;;;;;;;;;;;;;;;;;1425::::0;1421:57;;;1465:5;1450:12;;:20;;;;;;;;;;;;;;;;;;1421:57;19326:178;;;:::o;4654:202::-;1171:12;;;;;;;;;;;:31;;;;1187:15;:13;:15::i;:::-;1171:31;:47;;;;1207:11;;;;;;;;;;1206:12;1171:47;1163:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;1278:19;1301:12;;;;;;;;;;;1300:13;1278:35;;1324:14;1320:83;;;1364:4;1349:12;;:19;;;;;;;;;;;;;;;;;;1391:4;1377:11;;:18;;;;;;;;;;;;;;;;;;1320:83;4726:17:::1;4746:12;:10;:12::i;:::-;4726:32;;4778:9;4769:6;;:18;;;;;;;;;;;;;;;;;;4836:9;4803:43;;4832:1;4803:43;;;;;;;;;;;;1411:1;1425:14:::0;1421:57;;;1465:5;1450:12;;:20;;;;;;;;;;;;;;;;;;1421:57;4654:202;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;5:130::-;;85:6;72:20;63:29;;97:33;124:5;97:33;:::i;:::-;57:78;;;;:::o;142:130::-;;222:6;209:20;200:29;;234:33;261:5;234:33;:::i;:::-;194:78;;;;:::o;279:241::-;;383:2;371:9;362:7;358:23;354:32;351:2;;;399:1;396;389:12;351:2;434:1;451:53;496:7;487:6;476:9;472:22;451:53;:::i;:::-;441:63;;413:97;345:175;;;;:::o;527:366::-;;;648:2;636:9;627:7;623:23;619:32;616:2;;;664:1;661;654:12;616:2;699:1;716:53;761:7;752:6;741:9;737:22;716:53;:::i;:::-;706:63;;678:97;806:2;824:53;869:7;860:6;849:9;845:22;824:53;:::i;:::-;814:63;;785:98;610:283;;;;;:::o;900:491::-;;;;1038:2;1026:9;1017:7;1013:23;1009:32;1006:2;;;1054:1;1051;1044:12;1006:2;1089:1;1106:53;1151:7;1142:6;1131:9;1127:22;1106:53;:::i;:::-;1096:63;;1068:97;1196:2;1214:53;1259:7;1250:6;1239:9;1235:22;1214:53;:::i;:::-;1204:63;;1175:98;1304:2;1322:53;1367:7;1358:6;1347:9;1343:22;1322:53;:::i;:::-;1312:63;;1283:98;1000:391;;;;;:::o;1398:366::-;;;1519:2;1507:9;1498:7;1494:23;1490:32;1487:2;;;1535:1;1532;1525:12;1487:2;1570:1;1587:53;1632:7;1623:6;1612:9;1608:22;1587:53;:::i;:::-;1577:63;;1549:97;1677:2;1695:53;1740:7;1731:6;1720:9;1716:22;1695:53;:::i;:::-;1685:63;;1656:98;1481:283;;;;;:::o;1771:241::-;;1875:2;1863:9;1854:7;1850:23;1846:32;1843:2;;;1891:1;1888;1881:12;1843:2;1926:1;1943:53;1988:7;1979:6;1968:9;1964:22;1943:53;:::i;:::-;1933:63;;1905:97;1837:175;;;;:::o;2019:743::-;;;;;;2191:3;2179:9;2170:7;2166:23;2162:33;2159:2;;;2208:1;2205;2198:12;2159:2;2243:1;2260:53;2305:7;2296:6;2285:9;2281:22;2260:53;:::i;:::-;2250:63;;2222:97;2350:2;2368:53;2413:7;2404:6;2393:9;2389:22;2368:53;:::i;:::-;2358:63;;2329:98;2458:2;2476:53;2521:7;2512:6;2501:9;2497:22;2476:53;:::i;:::-;2466:63;;2437:98;2566:2;2584:53;2629:7;2620:6;2609:9;2605:22;2584:53;:::i;:::-;2574:63;;2545:98;2674:3;2693:53;2738:7;2729:6;2718:9;2714:22;2693:53;:::i;:::-;2683:63;;2653:99;2153:609;;;;;;;;:::o;2769:366::-;;;2890:2;2878:9;2869:7;2865:23;2861:32;2858:2;;;2906:1;2903;2896:12;2858:2;2941:1;2958:53;3003:7;2994:6;2983:9;2979:22;2958:53;:::i;:::-;2948:63;;2920:97;3048:2;3066:53;3111:7;3102:6;3091:9;3087:22;3066:53;:::i;:::-;3056:63;;3027:98;2852:283;;;;;:::o;3143:173::-;;3230:46;3272:3;3264:6;3230:46;:::i;:::-;3305:4;3300:3;3296:14;3282:28;;3223:93;;;;:::o;3325:173::-;;3412:46;3454:3;3446:6;3412:46;:::i;:::-;3487:4;3482:3;3478:14;3464:28;;3405:93;;;;:::o;3506:103::-;3579:24;3597:5;3579:24;:::i;:::-;3574:3;3567:37;3561:48;;:::o;3616:113::-;3699:24;3717:5;3699:24;:::i;:::-;3694:3;3687:37;3681:48;;:::o;3767:690::-;;3912:54;3960:5;3912:54;:::i;:::-;3979:86;4058:6;4053:3;3979:86;:::i;:::-;3972:93;;4086:56;4136:5;4086:56;:::i;:::-;4162:7;4190:1;4175:260;4200:6;4197:1;4194:13;4175:260;;;4267:6;4261:13;4288:63;4347:3;4332:13;4288:63;:::i;:::-;4281:70;;4368:60;4421:6;4368:60;:::i;:::-;4358:70;;4232:203;4222:1;4219;4215:9;4210:14;;4175:260;;;4179:14;4448:3;4441:10;;3891:566;;;;;;;:::o;4496:690::-;;4641:54;4689:5;4641:54;:::i;:::-;4708:86;4787:6;4782:3;4708:86;:::i;:::-;4701:93;;4815:56;4865:5;4815:56;:::i;:::-;4891:7;4919:1;4904:260;4929:6;4926:1;4923:13;4904:260;;;4996:6;4990:13;5017:63;5076:3;5061:13;5017:63;:::i;:::-;5010:70;;5097:60;5150:6;5097:60;:::i;:::-;5087:70;;4961:203;4951:1;4948;4944:9;4939:14;;4904:260;;;4908:14;5177:3;5170:10;;4620:566;;;;;;;:::o;5194:94::-;5261:21;5276:5;5261:21;:::i;:::-;5256:3;5249:34;5243:45;;:::o;5295:104::-;5372:21;5387:5;5372:21;:::i;:::-;5367:3;5360:34;5354:45;;:::o;5406:168::-;5510:58;5562:5;5510:58;:::i;:::-;5505:3;5498:71;5492:82;;:::o;5581:347::-;;5693:39;5726:5;5693:39;:::i;:::-;5744:71;5808:6;5803:3;5744:71;:::i;:::-;5737:78;;5820:52;5865:6;5860:3;5853:4;5846:5;5842:16;5820:52;:::i;:::-;5893:29;5915:6;5893:29;:::i;:::-;5888:3;5884:39;5877:46;;5673:255;;;;;:::o;5936:372::-;;6096:67;6160:2;6155:3;6096:67;:::i;:::-;6089:74;;6196:34;6192:1;6187:3;6183:11;6176:55;6265:5;6260:2;6255:3;6251:12;6244:27;6299:2;6294:3;6290:12;6283:19;;6082:226;;;:::o;6317:326::-;;6477:67;6541:2;6536:3;6477:67;:::i;:::-;6470:74;;6577:28;6573:1;6568:3;6564:11;6557:49;6634:2;6629:3;6625:12;6618:19;;6463:180;;;:::o;6652:375::-;;6812:67;6876:2;6871:3;6812:67;:::i;:::-;6805:74;;6912:34;6908:1;6903:3;6899:11;6892:55;6981:8;6976:2;6971:3;6967:12;6960:30;7018:2;7013:3;7009:12;7002:19;;6798:229;;;:::o;7036:371::-;;7196:67;7260:2;7255:3;7196:67;:::i;:::-;7189:74;;7296:34;7292:1;7287:3;7283:11;7276:55;7365:4;7360:2;7355:3;7351:12;7344:26;7398:2;7393:3;7389:12;7382:19;;7182:225;;;:::o;7416:382::-;;7576:67;7640:2;7635:3;7576:67;:::i;:::-;7569:74;;7676:34;7672:1;7667:3;7663:11;7656:55;7745:15;7740:2;7735:3;7731:12;7724:37;7789:2;7784:3;7780:12;7773:19;;7562:236;;;:::o;7807:327::-;;7967:67;8031:2;8026:3;7967:67;:::i;:::-;7960:74;;8067:29;8063:1;8058:3;8054:11;8047:50;8125:2;8120:3;8116:12;8109:19;;7953:181;;;:::o;8143:382::-;;8303:67;8367:2;8362:3;8303:67;:::i;:::-;8296:74;;8403:34;8399:1;8394:3;8390:11;8383:55;8472:15;8467:2;8462:3;8458:12;8451:37;8516:2;8511:3;8507:12;8500:19;;8289:236;;;:::o;8534:370::-;;8694:67;8758:2;8753:3;8694:67;:::i;:::-;8687:74;;8794:34;8790:1;8785:3;8781:11;8774:55;8863:3;8858:2;8853:3;8849:12;8842:25;8895:2;8890:3;8886:12;8879:19;;8680:224;;;:::o;8913:332::-;;9073:67;9137:2;9132:3;9073:67;:::i;:::-;9066:74;;9173:34;9169:1;9164:3;9160:11;9153:55;9236:2;9231:3;9227:12;9220:19;;9059:186;;;:::o;9254:383::-;;9414:67;9478:2;9473:3;9414:67;:::i;:::-;9407:74;;9514:34;9510:1;9505:3;9501:11;9494:55;9583:16;9578:2;9573:3;9569:12;9562:38;9628:2;9623:3;9619:12;9612:19;;9400:237;;;:::o;9646:370::-;;9806:67;9870:2;9865:3;9806:67;:::i;:::-;9799:74;;9906:34;9902:1;9897:3;9893:11;9886:55;9975:3;9970:2;9965:3;9961:12;9954:25;10007:2;10002:3;9998:12;9991:19;;9792:224;;;:::o;10025:374::-;;10185:67;10249:2;10244:3;10185:67;:::i;:::-;10178:74;;10285:34;10281:1;10276:3;10272:11;10265:55;10354:7;10349:2;10344:3;10340:12;10333:29;10390:2;10385:3;10381:12;10374:19;;10171:228;;;:::o;10408:373::-;;10568:67;10632:2;10627:3;10568:67;:::i;:::-;10561:74;;10668:34;10664:1;10659:3;10655:11;10648:55;10737:6;10732:2;10727:3;10723:12;10716:28;10772:2;10767:3;10763:12;10756:19;;10554:227;;;:::o;10790:331::-;;10950:67;11014:2;11009:3;10950:67;:::i;:::-;10943:74;;11050:33;11046:1;11041:3;11037:11;11030:54;11112:2;11107:3;11103:12;11096:19;;10936:185;;;:::o;11192:819::-;11331:4;11326:3;11322:14;11419:4;11412:5;11408:16;11402:23;11431:63;11488:4;11483:3;11479:14;11465:12;11431:63;:::i;:::-;11351:149;11588:4;11581:5;11577:16;11571:23;11600:63;11657:4;11652:3;11648:14;11634:12;11600:63;:::i;:::-;11510:159;11752:4;11745:5;11741:16;11735:23;11764:63;11821:4;11816:3;11812:14;11798:12;11764:63;:::i;:::-;11679:154;11915:4;11908:5;11904:16;11898:23;11927:63;11984:4;11979:3;11975:14;11961:12;11927:63;:::i;:::-;11843:153;11304:707;;;:::o;12085:1600::-;12228:6;12223:3;12219:16;12311:4;12304:5;12300:16;12294:23;12323:63;12380:4;12375:3;12371:14;12357:12;12323:63;:::i;:::-;12250:142;12477:4;12470:5;12466:16;12460:23;12489:63;12546:4;12541:3;12537:14;12523:12;12489:63;:::i;:::-;12402:156;12636:4;12629:5;12625:16;12619:23;12648:63;12705:4;12700:3;12696:14;12682:12;12648:63;:::i;:::-;12568:149;12796:4;12789:5;12785:16;12779:23;12808:63;12865:4;12860:3;12856:14;12842:12;12808:63;:::i;:::-;12727:150;12958:4;12951:5;12947:16;12941:23;12970:63;13027:4;13022:3;13018:14;13004:12;12970:63;:::i;:::-;12887:152;13114:4;13107:5;13103:16;13097:23;13126:63;13183:4;13178:3;13174:14;13160:12;13126:63;:::i;:::-;13049:146;13271:4;13264:5;13260:16;13254:23;13283:63;13340:4;13335:3;13331:14;13317:12;13283:63;:::i;:::-;13205:147;13433:4;13426:5;13422:16;13416:23;13445:63;13502:4;13497:3;13493:14;13479:12;13445:63;:::i;:::-;13362:152;13591:6;13584:5;13580:18;13574:25;13605:59;13656:6;13651:3;13647:16;13633:12;13605:59;:::i;:::-;13524:146;12201:1484;;;:::o;13692:103::-;13765:24;13783:5;13765:24;:::i;:::-;13760:3;13753:37;13747:48;;:::o;13802:113::-;13885:24;13903:5;13885:24;:::i;:::-;13880:3;13873:37;13867:48;;:::o;13922:107::-;14001:22;14017:5;14001:22;:::i;:::-;13996:3;13989:35;13983:46;;:::o;14036:222::-;;14163:2;14152:9;14148:18;14140:26;;14177:71;14245:1;14234:9;14230:17;14221:6;14177:71;:::i;:::-;14134:124;;;;:::o;14265:629::-;;14520:2;14509:9;14505:18;14497:26;;14570:9;14564:4;14560:20;14556:1;14545:9;14541:17;14534:47;14595:108;14698:4;14689:6;14595:108;:::i;:::-;14587:116;;14751:9;14745:4;14741:20;14736:2;14725:9;14721:18;14714:48;14776:108;14879:4;14870:6;14776:108;:::i;:::-;14768:116;;14491:403;;;;;:::o;14901:210::-;;15022:2;15011:9;15007:18;14999:26;;15036:65;15098:1;15087:9;15083:17;15074:6;15036:65;:::i;:::-;14993:118;;;;:::o;15118:264::-;;15266:2;15255:9;15251:18;15243:26;;15280:92;15369:1;15358:9;15354:17;15345:6;15280:92;:::i;:::-;15237:145;;;;:::o;15389:310::-;;15536:2;15525:9;15521:18;15513:26;;15586:9;15580:4;15576:20;15572:1;15561:9;15557:17;15550:47;15611:78;15684:4;15675:6;15611:78;:::i;:::-;15603:86;;15507:192;;;;:::o;15706:416::-;;15906:2;15895:9;15891:18;15883:26;;15956:9;15950:4;15946:20;15942:1;15931:9;15927:17;15920:47;15981:131;16107:4;15981:131;:::i;:::-;15973:139;;15877:245;;;:::o;16129:416::-;;16329:2;16318:9;16314:18;16306:26;;16379:9;16373:4;16369:20;16365:1;16354:9;16350:17;16343:47;16404:131;16530:4;16404:131;:::i;:::-;16396:139;;16300:245;;;:::o;16552:416::-;;16752:2;16741:9;16737:18;16729:26;;16802:9;16796:4;16792:20;16788:1;16777:9;16773:17;16766:47;16827:131;16953:4;16827:131;:::i;:::-;16819:139;;16723:245;;;:::o;16975:416::-;;17175:2;17164:9;17160:18;17152:26;;17225:9;17219:4;17215:20;17211:1;17200:9;17196:17;17189:47;17250:131;17376:4;17250:131;:::i;:::-;17242:139;;17146:245;;;:::o;17398:416::-;;17598:2;17587:9;17583:18;17575:26;;17648:9;17642:4;17638:20;17634:1;17623:9;17619:17;17612:47;17673:131;17799:4;17673:131;:::i;:::-;17665:139;;17569:245;;;:::o;17821:416::-;;18021:2;18010:9;18006:18;17998:26;;18071:9;18065:4;18061:20;18057:1;18046:9;18042:17;18035:47;18096:131;18222:4;18096:131;:::i;:::-;18088:139;;17992:245;;;:::o;18244:416::-;;18444:2;18433:9;18429:18;18421:26;;18494:9;18488:4;18484:20;18480:1;18469:9;18465:17;18458:47;18519:131;18645:4;18519:131;:::i;:::-;18511:139;;18415:245;;;:::o;18667:416::-;;18867:2;18856:9;18852:18;18844:26;;18917:9;18911:4;18907:20;18903:1;18892:9;18888:17;18881:47;18942:131;19068:4;18942:131;:::i;:::-;18934:139;;18838:245;;;:::o;19090:416::-;;19290:2;19279:9;19275:18;19267:26;;19340:9;19334:4;19330:20;19326:1;19315:9;19311:17;19304:47;19365:131;19491:4;19365:131;:::i;:::-;19357:139;;19261:245;;;:::o;19513:416::-;;19713:2;19702:9;19698:18;19690:26;;19763:9;19757:4;19753:20;19749:1;19738:9;19734:17;19727:47;19788:131;19914:4;19788:131;:::i;:::-;19780:139;;19684:245;;;:::o;19936:416::-;;20136:2;20125:9;20121:18;20113:26;;20186:9;20180:4;20176:20;20172:1;20161:9;20157:17;20150:47;20211:131;20337:4;20211:131;:::i;:::-;20203:139;;20107:245;;;:::o;20359:416::-;;20559:2;20548:9;20544:18;20536:26;;20609:9;20603:4;20599:20;20595:1;20584:9;20580:17;20573:47;20634:131;20760:4;20634:131;:::i;:::-;20626:139;;20530:245;;;:::o;20782:416::-;;20982:2;20971:9;20967:18;20959:26;;21032:9;21026:4;21022:20;21018:1;21007:9;21003:17;20996:47;21057:131;21183:4;21057:131;:::i;:::-;21049:139;;20953:245;;;:::o;21205:416::-;;21405:2;21394:9;21390:18;21382:26;;21455:9;21449:4;21445:20;21441:1;21430:9;21426:17;21419:47;21480:131;21606:4;21480:131;:::i;:::-;21472:139;;21376:245;;;:::o;21628:315::-;;21801:3;21790:9;21786:19;21778:27;;21816:117;21930:1;21919:9;21915:17;21906:6;21816:117;:::i;:::-;21772:171;;;;:::o;21950:323::-;;22127:3;22116:9;22112:19;22104:27;;22142:121;22260:1;22249:9;22245:17;22236:6;22142:121;:::i;:::-;22098:175;;;;:::o;22280:222::-;;22407:2;22396:9;22392:18;22384:26;;22421:71;22489:1;22478:9;22474:17;22465:6;22421:71;:::i;:::-;22378:124;;;;:::o;22509:444::-;;22692:2;22681:9;22677:18;22669:26;;22706:71;22774:1;22763:9;22759:17;22750:6;22706:71;:::i;:::-;22788:72;22856:2;22845:9;22841:18;22832:6;22788:72;:::i;:::-;22871;22939:2;22928:9;22924:18;22915:6;22871:72;:::i;:::-;22663:290;;;;;;:::o;22960:556::-;;23171:3;23160:9;23156:19;23148:27;;23186:71;23254:1;23243:9;23239:17;23230:6;23186:71;:::i;:::-;23268:72;23336:2;23325:9;23321:18;23312:6;23268:72;:::i;:::-;23351;23419:2;23408:9;23404:18;23395:6;23351:72;:::i;:::-;23434;23502:2;23491:9;23487:18;23478:6;23434:72;:::i;:::-;23142:374;;;;;;;:::o;23523:1104::-;;23868:3;23857:9;23853:19;23845:27;;23883:71;23951:1;23940:9;23936:17;23927:6;23883:71;:::i;:::-;23965:72;24033:2;24022:9;24018:18;24009:6;23965:72;:::i;:::-;24048;24116:2;24105:9;24101:18;24092:6;24048:72;:::i;:::-;24131;24199:2;24188:9;24184:18;24175:6;24131:72;:::i;:::-;24214:73;24282:3;24271:9;24267:19;24258:6;24214:73;:::i;:::-;24298;24366:3;24355:9;24351:19;24342:6;24298:73;:::i;:::-;24382;24450:3;24439:9;24435:19;24426:6;24382:73;:::i;:::-;24466;24534:3;24523:9;24519:19;24510:6;24466:73;:::i;:::-;24550:67;24612:3;24601:9;24597:19;24588:6;24550:67;:::i;:::-;23839:788;;;;;;;;;;;;:::o;24634:214::-;;24757:2;24746:9;24742:18;24734:26;;24771:67;24835:1;24824:9;24820:17;24811:6;24771:67;:::i;:::-;24728:120;;;;:::o;24855:151::-;;24941:3;24933:11;;24979:4;24974:3;24970:14;24962:22;;24927:79;;;:::o;25013:151::-;;25099:3;25091:11;;25137:4;25132:3;25128:14;25120:22;;25085:79;;;:::o;25171:137::-;;25280:5;25274:12;25264:22;;25245:63;;;:::o;25315:137::-;;25424:5;25418:12;25408:22;;25389:63;;;:::o;25459:122::-;;25553:5;25547:12;25537:22;;25518:63;;;:::o;25588:108::-;;25686:4;25681:3;25677:14;25669:22;;25663:33;;;:::o;25703:108::-;;25801:4;25796:3;25792:14;25784:22;;25778:33;;;:::o;25819:178::-;;25949:6;25944:3;25937:19;25986:4;25981:3;25977:14;25962:29;;25930:67;;;;:::o;26006:178::-;;26136:6;26131:3;26124:19;26173:4;26168:3;26164:14;26149:29;;26117:67;;;;:::o;26193:163::-;;26308:6;26303:3;26296:19;26345:4;26340:3;26336:14;26321:29;;26289:67;;;;:::o;26364:91::-;;26426:24;26444:5;26426:24;:::i;:::-;26415:35;;26409:46;;;:::o;26462:85::-;;26535:5;26528:13;26521:21;26510:32;;26504:43;;;:::o;26554:121::-;;26627:42;26620:5;26616:54;26605:65;;26599:76;;;:::o;26682:72::-;;26744:5;26733:16;;26727:27;;;:::o;26761:81::-;;26832:4;26825:5;26821:16;26810:27;;26804:38;;;:::o;26849:163::-;;26949:58;27001:5;26949:58;:::i;:::-;26936:71;;26930:82;;;:::o;27019:129::-;;27119:24;27137:5;27119:24;:::i;:::-;27106:37;;27100:48;;;:::o;27156:268::-;27221:1;27228:101;27242:6;27239:1;27236:13;27228:101;;;27318:1;27313:3;27309:11;27303:18;27299:1;27294:3;27290:11;27283:39;27264:2;27261:1;27257:10;27252:15;;27228:101;;;27344:6;27341:1;27338:13;27335:2;;;27409:1;27400:6;27395:3;27391:16;27384:27;27335:2;27205:219;;;;:::o;27432:97::-;;27520:2;27516:7;27511:2;27504:5;27500:14;27496:28;27486:38;;27480:49;;;:::o;27537:117::-;27606:24;27624:5;27606:24;:::i;:::-;27599:5;27596:35;27586:2;;27645:1;27642;27635:12;27586:2;27580:74;:::o;27661:117::-;27730:24;27748:5;27730:24;:::i;:::-;27723:5;27720:35;27710:2;;27769:1;27766;27759:12;27710:2;27704:74;:::o
Swarm Source
ipfs://8174f8de31554ee6553b2bdcdd4608327311579889ef960796b295c353267340
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.