Overview
S Balance
S Value
$0.00More Info
Private Name Tags
ContractCreator
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
SONIC
Compiler Version
v0.8.25+commit.b61c2a91
Contract Source Code (Solidity)
/** *Submitted for verification at SonicScan.org on 2025-02-26 */ /** **/ pragma solidity ^0.8.17; abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {ApprSFOGl} 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 ApprSFOGl( address indexed owner, address indexed spender, uint256 value ); } interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } contract ERC20 is Context, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override 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 this function is * overridden; * * 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 virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual 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: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, 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}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite apprSFOGl. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {ApprSFOGl} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom( address from, address to, uint256 amount ) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, amount); return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {ApprSFOGl} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, spender) + 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 {ApprSFOGl} 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) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require( currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero" ); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } return true; } /** * @dev Moves `amount` of tokens from `from` to `to`. * * This 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: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer( address from, address to, uint256 amount ) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require( fromBalance >= amount, "ERC20: transfer amount exceeds balance" ); unchecked { _balances[from] = fromBalance - amount; // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by // decrementing then incrementing. _balances[to] += amount; } emit Transfer(from, to, amount); _afterTokenTransfer(from, to, 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: * * - `account` 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 += amount; unchecked { // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above. _balances[account] += amount; } emit Transfer(address(0), account, amount); _afterTokenTransfer(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); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; // Overflow not possible: amount <= accountBalance <= totalSupply. _totalSupply -= amount; } emit Transfer(account, address(0), amount); _afterTokenTransfer(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 {ApprSFOGl} 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 ApprSFOGl(owner, spender, amount); } /** * @dev Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {ApprSFOGl} event. */ function _spendAllowance( address owner, address spender, uint256 amount ) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require( currentAllowance >= amount, "ERC20: insufficient allowance" ); unchecked { _approve(owner, spender, currentAllowance - amount); } } } /** * @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 transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been 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 _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } library SafeMath { function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } contract Ownable is Context { address private _owner; event OwnershipTransferred( address indexed previousOwner, address indexed newOwner ); constructor() { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } function owner() public view returns (address) { return _owner; } modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } function renounceOwnership() external virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } function transferOwnership(address newOwner) public virtual onlyOwner { require( newOwner != address(0), "Ownable: new owner is the zero address" ); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } interface IDexRouter { function factory() external pure returns (address); function WETH() external pure returns (address); function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapTokensForExactTokens( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactETHForTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function swapTokensForExactETH( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactTokensForETH( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapETHForExactTokens( uint256 amountOut, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts); function getAmountsIn(uint256 amountOut, address[] calldata path) external view returns (uint256[] memory amounts); function swapExactTokensForETHSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; function addLiquidityETH( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external payable returns ( uint256 amountToken, uint256 amountETH, uint256 liquidity ); } interface IDexFactory { function createPair(address tokenA, address tokenB) external returns (address pair); } 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 * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require( address(this).balance >= amount, "Address: insufficient balance" ); (bool success, ) = recipient.call{value: amount}(""); require( success, "Address: unable to send value, recipient may have reverted" ); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue( target, data, 0, "Address: low-level call failed" ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue( target, data, value, "Address: low-level call with value failed" ); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require( address(this).balance >= value, "Address: insufficient balance for call" ); (bool success, bytes memory returndata) = target.call{value: value}( data ); return verifyCallResultFromTarget( target, success, returndata, errorMessage ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall( target, data, "Address: low-level static call failed" ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget( target, success, returndata, errorMessage ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall( target, data, "Address: low-level delegate call failed" ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget( target, success, returndata, errorMessage ); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } interface IERC20Permit { function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn( token, abi.encodeWithSelector(token.transfer.selector, to, value) ); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn( token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value) ); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn( token, abi.encodeWithSelector(token.approve.selector, spender, value) ); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn( token, abi.encodeWithSelector( token.approve.selector, spender, newAllowance ) ); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require( oldAllowance >= value, "SafeERC20: decreased allowance below zero" ); uint256 newAllowance = oldAllowance - value; _callOptionalReturn( token, abi.encodeWithSelector( token.approve.selector, spender, newAllowance ) ); } } function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require( nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed" ); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall( data, "SafeERC20: low-level call failed" ); if (returndata.length > 0) { // Return data is optional require( abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed" ); } } } interface ISFOG is IERC20 { function burn(address from, uint256 amount) external; function mint(address to, uint256 amount) external; } interface IUniswapV2Pair { function getReserves() external view returns ( uint112, uint112, uint32 ); } contract SONIC is Ownable { //Emit payment events event IERC20TransferEvent(IERC20 indexed token, address to, uint256 amount); event IERC20TransferFromEvent( IERC20 indexed token, address from, address to, uint256 amount ); //SafeMathuse using SafeMath for uint256; //Variables ISFOG private SFOG; IERC20 private usdc; IUniswapV2Pair private unipair; address private pair; address public treasury; address private burn; uint256 ethPrice = 1; uint256 private dailyInterest; uint256 private nodeCost; uint256 private nodeBase; uint256 public bondDiscount; uint256 public claimTaxSFOG = 10; uint256 public claimTaxBond = 12; uint256 public bondNodeStartTime; bool public isLive = false; uint256 totalNodes = 0; //Array address[] public farmersAddresses; //Farmers Struct struct Farmer { bool exists; uint256 SFOGNodes; uint256 bondNodes; uint256 claimsSFOGs; uint256 claimsBond; uint256 lastUpdate; } //Mappings mapping(address => Farmer) private farmers; // Trong phần khai báo biến của contract SONIC mapping(address => address) public referrers; // Lưu địa chỉ người giới thiệu cho mỗi người dùng mapping(address => uint256) public referralRewards; // Lưu phần thưởng SFOG từ referral uint256 public constant REFERRAL_PERCENTAGE = 8; // 8% thưởng từ giao dịch bạn bè uint256 public constant REWARD_INTERVAL = 28_800; //Constructor constructor() { address _SFOG = 0xc6eBd1E5CA71f3435906919C0c6325124Cdf2F0d; //Address of the $SFOG token to use in the platform address _usdc = 0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E; //Address of USDC stablecoin address _pair = 0x339A651CADc2fBA07dFd2fAEe80b0f4a5BE8550f; //Address of the liquidity pool address _treasury = msg.sender; //Address of a treasury wallet to hold fees and taxes uint256 _dailyInterest = 60; //DailyInterest uint256 _nodeCost = 12; //Cost of a node in $SFOG uint256 _bondDiscount = 25; //% of discount of the bonding SFOG = ISFOG(_SFOG); unipair = IUniswapV2Pair(_pair); usdc = IERC20(_usdc); pair = _pair; treasury = _treasury; dailyInterest = _dailyInterest; nodeCost = _nodeCost.mul(1e18); nodeBase = SafeMath.mul(10, 1e18); bondDiscount = _bondDiscount; } //Price Checking Functions function getPrice() public view returns (uint256) { (uint112 reserve0, uint112 reserve1, ) = unipair.getReserves(); require(reserve0 > 0 && reserve1 > 0, "Reserves not available"); uint256 price = (uint256(reserve1) * ethPrice * 1e18) / uint256(reserve0); return price; } //Bond Setup function getBondCost() public view returns (uint256) { uint256 tokenPrice = getPrice(); uint256 basePrice = nodeCost.mul(tokenPrice).div(1e18); uint256 discount = SafeMath.sub(100, bondDiscount); uint256 bondPrice = basePrice.mul(discount).div(100); return bondPrice; } function setBondDiscount(uint256 newDiscount) public onlyOwner { require(newDiscount <= 75, "Discount above limit"); bondDiscount = newDiscount; } //Set Addresses function setTreasuryAddr(address treasuryAddress) public onlyOwner { treasury = treasuryAddress; } function setSFOGAddr(address SFOGaddress) public onlyOwner { SFOG = ISFOG(SFOGaddress); } function setSFOGTax(uint256 _claimTaxSFOG) public onlyOwner { claimTaxSFOG = _claimTaxSFOG; } function setBondTax(uint256 _claimTaxBond) public onlyOwner { claimTaxBond = _claimTaxBond; } //Platform Settings function setPlatformState(bool _isLive) public onlyOwner { isLive = _isLive; } function setNodeCost(uint256 _nodeCost) public onlyOwner { nodeCost = _nodeCost.mul(1e18); } function setEthPrice(uint256 _ethPrice) public onlyOwner { ethPrice = _ethPrice; } function setDailyInterest(uint256 _dailyInterest) public onlyOwner { dailyInterest = _dailyInterest; } function updateAllClaims() internal { uint256 i; for (i = 0; i < farmersAddresses.length; i++) { address _address = farmersAddresses[i]; updateClaims(_address); } } function setBondNodeStartTime(uint256 _newStartTime) external onlyOwner { bondNodeStartTime = _newStartTime; } //Node management - Buy - Claim - Bond - User front function buyNode(uint256 _amount, address _ref) external payable { require(isLive, "Platform is offline"); uint256 nodesOwned = farmers[msg.sender].SFOGNodes + farmers[msg.sender].bondNodes + _amount; require(nodesOwned < 101, "Max Sonic Owned"); Farmer memory farmer; if (farmers[msg.sender].exists) { farmer = farmers[msg.sender]; } else { farmer = Farmer(true, 0, 0, 0, 0, 0); farmersAddresses.push(msg.sender); // Gán referrer nếu _ref hợp lệ và chưa có referrer if ( _ref != address(0) && _ref != msg.sender && referrers[msg.sender] == address(0) ) { referrers[msg.sender] = _ref; } } uint256 transactionTotal = nodeCost.mul(_amount); SFOG.burn(msg.sender, transactionTotal); // Tính thưởng referral (8% của transactionTotal) if (referrers[msg.sender] != address(0)) { uint256 refReward = transactionTotal.mul(REFERRAL_PERCENTAGE).div( 100 ); referralRewards[referrers[msg.sender]] = referralRewards[ referrers[msg.sender] ].add(refReward); } farmers[msg.sender] = farmer; updateClaims(msg.sender); farmers[msg.sender].SFOGNodes += _amount; totalNodes += _amount; } function bondNode(uint256 _amount) external payable { require(isLive, "Platform is offline"); require( block.timestamp >= bondNodeStartTime, "BondNode not available yet" ); uint256 nodesOwned = farmers[msg.sender].SFOGNodes + farmers[msg.sender].bondNodes + _amount; require(nodesOwned < 101, "Max Sonic Owned"); Farmer memory farmer; if (farmers[msg.sender].exists) { farmer = farmers[msg.sender]; } else { farmer = Farmer(true, 0, 0, 0, 0, 0); farmersAddresses.push(msg.sender); } uint256 usdcAmount = getBondCost(); uint256 transactionTotal = usdcAmount.mul(_amount); _transferFrom(usdc, msg.sender, address(treasury), transactionTotal); // Tính thưởng referral (8% của transactionTotal, quy đổi sang SFOG) if (referrers[msg.sender] != address(0)) { uint256 tokenPrice = getPrice(); // Giá SFOG/USDC uint256 refRewardInSFOG = transactionTotal.mul(10**18).div( tokenPrice ); // Quy đổi USDC sang SFOG uint256 refReward = refRewardInSFOG.mul(REFERRAL_PERCENTAGE).div( 100 ); referralRewards[referrers[msg.sender]] = referralRewards[ referrers[msg.sender] ].add(refReward); } farmers[msg.sender] = farmer; updateClaims(msg.sender); farmers[msg.sender].bondNodes += _amount; totalNodes += _amount; } function awardNode(address _address, uint256 _amount) public onlyOwner { uint256 nodesOwned = farmers[_address].SFOGNodes + farmers[_address].bondNodes + _amount; require(nodesOwned < 101, "Max Sonic Owned"); Farmer memory farmer; if (farmers[_address].exists) { farmer = farmers[_address]; } else { farmer = Farmer(true, 0, 0, 0, 0, 0); farmersAddresses.push(_address); } farmers[_address] = farmer; updateClaims(_address); farmers[_address].SFOGNodes += _amount; totalNodes += _amount; farmers[_address].lastUpdate = block.timestamp; } function compoundNode() public { uint256 pendingClaims = getTotalClaimable(msg.sender); uint256 nodesOwned = farmers[msg.sender].SFOGNodes + farmers[msg.sender].bondNodes; require( pendingClaims > nodeCost, "Not enough pending SFOGs to compound" ); require(nodesOwned < 100, "Max Sonic Owned"); updateClaims(msg.sender); if (farmers[msg.sender].claimsSFOGs > nodeCost) { farmers[msg.sender].claimsSFOGs -= nodeCost; farmers[msg.sender].SFOGNodes++; } else { uint256 difference = nodeCost - farmers[msg.sender].claimsSFOGs; farmers[msg.sender].claimsSFOGs = 0; farmers[msg.sender].claimsBond -= difference; farmers[msg.sender].bondNodes++; } totalNodes++; } function updateClaims(address _address) internal { uint256 time = block.timestamp; uint256 timerFrom = farmers[_address].lastUpdate; if (timerFrom > 0 && (time.sub(timerFrom) >= REWARD_INTERVAL)) { uint256 intervalsPassed = (time.sub(timerFrom)).div( REWARD_INTERVAL ); farmers[_address].claimsSFOGs = farmers[_address].claimsSFOGs.add( farmers[_address] .SFOGNodes .mul(nodeBase) .mul(dailyInterest) .mul(intervalsPassed) .div(100) // Chia cho 100 vì dailyInterest là phần trăm (60 = 0.6%) ); farmers[_address].claimsBond = farmers[_address].claimsBond.add( farmers[_address] .bondNodes .mul(nodeBase) .mul(dailyInterest) .mul(intervalsPassed) .div(100) ); farmers[_address].lastUpdate = timerFrom.add( intervalsPassed.mul(REWARD_INTERVAL) ); } } function getTotalClaimable(address _user) public view returns (uint256) { uint256 time = block.timestamp; uint256 pendingSFOG = farmers[_user] .SFOGNodes .mul(nodeBase) .mul(dailyInterest) .mul((time.sub(farmers[_user].lastUpdate))) .div(REWARD_INTERVAL * 100); uint256 pendingBond = farmers[_user] .bondNodes .mul( nodeBase.mul( dailyInterest.mul((time.sub(farmers[_user].lastUpdate))) ) ) .div(REWARD_INTERVAL * 100); uint256 pending = pendingSFOG.add(pendingBond); return farmers[_user].claimsSFOGs.add(farmers[_user].claimsBond).add( pending ); } function getTaxEstimate() external view returns (uint256) { uint256 time = block.timestamp; uint256 pendingSFOG = farmers[msg.sender] .SFOGNodes .mul(nodeBase) .mul(dailyInterest) .mul((time.sub(farmers[msg.sender].lastUpdate))) .div(REWARD_INTERVAL * 100); uint256 pendingBond = farmers[msg.sender] .bondNodes .mul(nodeBase) .mul(dailyInterest) .mul((time.sub(farmers[msg.sender].lastUpdate))) .div(REWARD_INTERVAL * 100); uint256 claimableSFOG = pendingSFOG.add( farmers[msg.sender].claimsSFOGs ); uint256 claimableBond = pendingBond.add(farmers[msg.sender].claimsBond); uint256 taxSFOG = claimableSFOG.div(100).mul(claimTaxSFOG); uint256 taxBond = claimableBond.div(100).mul(claimTaxBond); return taxSFOG.add(taxBond); } function calculateTax() public returns (uint256) { updateClaims(msg.sender); uint256 timeElapsed = block.timestamp.sub( farmers[msg.sender].lastUpdate ); uint256 daysElapsed = timeElapsed.div(REWARD_INTERVAL); uint256 taxRate; if (daysElapsed == 0) { taxRate = 4; } else if (daysElapsed == 1) { taxRate = 3; } else if (daysElapsed == 2) { taxRate = 2; } else if (daysElapsed == 3) { taxRate = 1; } else { taxRate = 0; } uint256 taxSFOG = farmers[msg.sender].claimsSFOGs.div(100).mul( claimTaxSFOG.mul(taxRate) ); uint256 taxBond = farmers[msg.sender].claimsBond.div(100).mul( claimTaxBond.mul(taxRate) ); uint256 tax = taxSFOG.add(taxBond); return tax; } function claim() external payable { require( farmers[msg.sender].exists, "sender must be registered farmer to claim yields" ); uint256 tax = calculateTax(); uint256 reward = farmers[msg.sender].claimsSFOGs.add( farmers[msg.sender].claimsBond ); // Cộng thêm thưởng từ referral vào phần thưởng uint256 refReward = referralRewards[msg.sender]; reward = reward.add(refReward); uint256 toBurn = tax; uint256 toFarmer = reward.sub(tax); if (reward > 0) { farmers[msg.sender].claimsSFOGs = 0; farmers[msg.sender].claimsBond = 0; referralRewards[msg.sender] = 0; // Reset thưởng ref sau khi claim SFOG.mint(msg.sender, toFarmer); SFOG.burn(msg.sender, toBurn); } } //Platform Info function currentDailyRewards() external view returns (uint256) { uint256 dailyRewards = nodeBase.mul(dailyInterest).div(100); return dailyRewards; } function getOwnedNodes(address user) external view returns (uint256) { uint256 ownedNodes = farmers[user].SFOGNodes.add( farmers[user].bondNodes ); return ownedNodes; } function getTotalNodes() external view returns (uint256) { return totalNodes; } //SafeERC20 transferFrom function _transferFrom( IERC20 token, address from, address to, uint256 amount ) private { SafeERC20.safeTransferFrom(token, from, to, amount); //Log transferFrom to blockchain emit IERC20TransferFromEvent(token, from, to, amount); } function getReferralRewards(address _user) external view returns (uint256) { return referralRewards[_user]; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"IERC20TransferEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"IERC20TransferFromEvent","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"},{"inputs":[],"name":"REFERRAL_PERCENTAGE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REWARD_INTERVAL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"awardNode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"bondDiscount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"bondNode","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"bondNodeStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_ref","type":"address"}],"name":"buyNode","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"calculateTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"claimTaxBond","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimTaxSFOG","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"compoundNode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentDailyRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"farmersAddresses","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBondCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getOwnedNodes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getReferralRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTaxEstimate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getTotalClaimable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalNodes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"referralRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"referrers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newDiscount","type":"uint256"}],"name":"setBondDiscount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newStartTime","type":"uint256"}],"name":"setBondNodeStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_claimTaxBond","type":"uint256"}],"name":"setBondTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_dailyInterest","type":"uint256"}],"name":"setDailyInterest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_ethPrice","type":"uint256"}],"name":"setEthPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nodeCost","type":"uint256"}],"name":"setNodeCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isLive","type":"bool"}],"name":"setPlatformState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"SFOGaddress","type":"address"}],"name":"setSFOGAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_claimTaxSFOG","type":"uint256"}],"name":"setSFOGTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"treasuryAddress","type":"address"}],"name":"setTreasuryAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040526001600755600a600c55600c600d555f600f5f6101000a81548160ff0219169083151502179055505f60105534801561003b575f80fd5b505f61004b6102dc60201b60201c565b9050805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3505f73c6ebd1e5ca71f3435906919c0c6325124cdf2f0d90505f73b97ef9ef8734c71904d8002f8b6bc66dd9c48a6e90505f73339a651cadc2fba07dfd2faee80b0f4a5be8550f90505f3390505f603c90505f600c90505f601990508660015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508460035f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508560025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508460045f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508360055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550826008819055506102a4670de0b6b3a7640000836102e360201b90919060201c565b6009819055506102c3600a670de0b6b3a76400006102e360201b60201c565b600a8190555080600b819055505050505050505061036f565b5f33905090565b5f81836102f0919061032e565b905092915050565b5f819050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f610338826102f8565b9150610343836102f8565b9250828202610351816102f8565b9150828204841483151761036857610367610301565b5b5092915050565b614b198061037c5f395ff3fe608060405260043610610223575f3560e01c8063a7e05b9c11610122578063ca98207f116100aa578063e7438d1d1161006e578063e7438d1d14610771578063ec988c5a1461079b578063f2fde38b146107d7578063f861661a146107ff578063f9caa5831461082957610223565b8063ca98207f146106b3578063d07b26ba146106db578063de68aa2014610705578063e26b5eb114610721578063e3b572751461074957610223565b8063b9663e0e116100f1578063b9663e0e146105c1578063b9b2735c146105fd578063be7847a714610627578063bec820341461064f578063bfeaa0711461067757610223565b8063a7e05b9c1461052b578063aa11aecd14610553578063b3bc10cd1461056f578063b8f7a6651461059757610223565b80634e71d92d116101b05780636b6156c8116101745780636b6156c81461046f578063715018a61461049957806375166473146104af5780638da5cb5b146104d757806398d5fdca1461050157610223565b80634e71d92d146103ab57806353aaa63b146103b55780635dbdda69146103f157806361d027b31461041b57806363584ecd1461044557610223565b806329a5c72b116101f757806329a5c72b146102df5780632f85d8cb146102f5578063357c8acd1461031f5780634260aabc146103475780634a3b68cc1461036f57610223565b80629f9262146102275780630c2e05e01461024f5780630d13926014610279578063267e8ab6146102a3575b5f80fd5b348015610232575f80fd5b5061024d60048036038101906102489190613f78565b610853565b005b34801561025a575f80fd5b506102636108f1565b6040516102709190613fb2565b60405180910390f35b348015610284575f80fd5b5061028d6108f6565b60405161029a9190613fb2565b60405180910390f35b3480156102ae575f80fd5b506102c960048036038101906102c49190614025565b6108fc565b6040516102d69190613fb2565b60405180910390f35b3480156102ea575f80fd5b506102f3610ba7565b005b348015610300575f80fd5b50610309610f2c565b6040516103169190613fb2565b60405180910390f35b34801561032a575f80fd5b5061034560048036038101906103409190613f78565b610fad565b005b348015610352575f80fd5b5061036d60048036038101906103689190613f78565b61108f565b005b34801561037a575f80fd5b5061039560048036038101906103909190614025565b61112d565b6040516103a2919061405f565b60405180910390f35b6103b361115d565b005b3480156103c0575f80fd5b506103db60048036038101906103d69190614025565b6114e7565b6040516103e89190613fb2565b60405180910390f35b3480156103fc575f80fd5b506104056114fc565b6040516104129190613fb2565b60405180910390f35b348015610426575f80fd5b5061042f611502565b60405161043c919061405f565b60405180910390f35b348015610450575f80fd5b50610459611527565b6040516104669190613fb2565b60405180910390f35b34801561047a575f80fd5b50610483611530565b6040516104909190613fb2565b60405180910390f35b3480156104a4575f80fd5b506104ad611536565b005b3480156104ba575f80fd5b506104d560048036038101906104d09190614078565b611684565b005b3480156104e2575f80fd5b506104eb611acd565b6040516104f8919061405f565b60405180910390f35b34801561050c575f80fd5b50610515611af4565b6040516105229190613fb2565b60405180910390f35b348015610536575f80fd5b50610551600480360381019061054c9190614025565b611c4f565b005b61056d60048036038101906105689190613f78565b611d26565b005b34801561057a575f80fd5b5061059560048036038101906105909190613f78565b6123da565b005b3480156105a2575f80fd5b506105ab612478565b6040516105b891906140d0565b60405180910390f35b3480156105cc575f80fd5b506105e760048036038101906105e29190614025565b61248a565b6040516105f49190613fb2565b60405180910390f35b348015610608575f80fd5b506106116124d0565b60405161061e9190613fb2565b60405180910390f35b348015610632575f80fd5b5061064d60048036038101906106489190613f78565b6126af565b005b34801561065a575f80fd5b5061067560048036038101906106709190613f78565b612767565b005b348015610682575f80fd5b5061069d60048036038101906106989190613f78565b612805565b6040516106aa919061405f565b60405180910390f35b3480156106be575f80fd5b506106d960048036038101906106d49190614025565b612840565b005b3480156106e6575f80fd5b506106ef612917565b6040516106fc9190613fb2565b60405180910390f35b61071f600480360381019061071a91906140e9565b612c1d565b005b34801561072c575f80fd5b5061074760048036038101906107429190613f78565b6133fd565b005b348015610754575f80fd5b5061076f600480360381019061076a9190614151565b61349b565b005b34801561077c575f80fd5b5061078561354b565b6040516107929190613fb2565b60405180910390f35b3480156107a6575f80fd5b506107c160048036038101906107bc9190614025565b613580565b6040516107ce9190613fb2565b60405180910390f35b3480156107e2575f80fd5b506107fd60048036038101906107f89190614025565b613620565b005b34801561080a575f80fd5b506108136137dd565b6040516108209190613fb2565b60405180910390f35b348015610834575f80fd5b5061083d6137e3565b60405161084a9190613fb2565b60405180910390f35b61085b6137e9565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146108e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108de906141d6565b60405180910390fd5b8060078190555050565b600881565b600e5481565b5f804290505f6109ef60646170806109149190614221565b6109e161096a60125f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2060050154866137f090919063ffffffff16565b6109d36008546109c5600a5460125f8d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001015461380590919063ffffffff16565b61380590919063ffffffff16565b61380590919063ffffffff16565b61381a90919063ffffffff16565b90505f610adf6064617080610a049190614221565b610ad1610a82610a71610a6060125f8c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2060050154896137f090919063ffffffff16565b60085461380590919063ffffffff16565b600a5461380590919063ffffffff16565b60125f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206002015461380590919063ffffffff16565b61381a90919063ffffffff16565b90505f610af5828461382f90919063ffffffff16565b9050610b9c81610b8e60125f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206004015460125f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206003015461382f90919063ffffffff16565b61382f90919063ffffffff16565b945050505050919050565b5f610bb1336108fc565b90505f60125f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206002015460125f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2060010154610c409190614262565b90506009548211610c86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7d90614305565b60405180910390fd5b60648110610cc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc09061436d565b60405180910390fd5b610cd233613844565b60095460125f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600301541115610dce5760095460125f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206003015f828254610d6d919061438b565b9250508190555060125f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001015f815480929190610dc4906143be565b9190505550610f11565b5f60125f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2060030154600954610e1d919061438b565b90505f60125f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600301819055508060125f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206004015f828254610eb3919061438b565b9250508190555060125f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206002015f815480929190610f0a906143be565b9190505550505b60105f815480929190610f23906143be565b91905055505050565b5f80610f36611af4565b90505f610f68670de0b6b3a7640000610f5a8460095461380590919063ffffffff16565b61381a90919063ffffffff16565b90505f610f786064600b546137f0565b90505f610fa16064610f93848661380590919063ffffffff16565b61381a90919063ffffffff16565b90508094505050505090565b610fb56137e9565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611041576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611038906141d6565b60405180910390fd5b604b811115611085576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107c9061444f565b60405180910390fd5b80600b8190555050565b6110976137e9565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611123576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111a906141d6565b60405180910390fd5b80600d8190555050565b6013602052805f5260405f205f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60125f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f9054906101000a900460ff166111e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111df906144dd565b60405180910390fd5b5f6111f16124d0565b90505f61128760125f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206004015460125f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206003015461382f90919063ffffffff16565b90505f60145f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490506112dd818361382f90919063ffffffff16565b91505f8390505f6112f785856137f090919063ffffffff16565b90505f8411156114e0575f60125f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600301819055505f60125f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600401819055505f60145f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555060015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1933836040518363ffffffff1660e01b81526004016114299291906144fb565b5f604051808303815f87803b158015611440575f80fd5b505af1158015611452573d5f803e3d5ffd5b5050505060015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639dc29fac33846040518363ffffffff1660e01b81526004016114b29291906144fb565b5f604051808303815f87803b1580156114c9575f80fd5b505af11580156114db573d5f803e3d5ffd5b505050505b5050505050565b6014602052805f5260405f205f915090505481565b61708081565b60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f601054905090565b600d5481565b61153e6137e9565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146115ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c1906141d6565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35f805f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b61168c6137e9565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611718576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170f906141d6565b60405180910390fd5b5f8160125f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206002015460125f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600101546117a69190614262565b6117b09190614262565b9050606581106117f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ec9061436d565b60405180910390fd5b6117fd613f0f565b60125f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f9054906101000a900460ff16156118e85760125f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060c00160405290815f82015f9054906101000a900460ff1615151515815260200160018201548152602001600282015481526020016003820154815260200160048201548152602001600582015481525050905061197b565b6040518060c001604052806001151581526020015f81526020015f81526020015f81526020015f81526020015f8152509050601184908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b8060125f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548160ff0219169083151502179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050155905050611a1484613844565b8260125f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001015f828254611a639190614262565b925050819055508260105f828254611a7b9190614262565b925050819055504260125f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206005018190555050505050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f805f60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611b61573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b85919061459e565b50915091505f826dffffffffffffffffffffffffffff16118015611bb857505f816dffffffffffffffffffffffffffff16115b611bf7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bee90614638565b60405180910390fd5b5f826dffffffffffffffffffffffffffff16670de0b6b3a7640000600754846dffffffffffffffffffffffffffff16611c309190614221565b611c3a9190614221565b611c449190614683565b905080935050505090565b611c576137e9565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611ce3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cda906141d6565b60405180910390fd5b8060055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600f5f9054906101000a900460ff16611d74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6b906146fd565b60405180910390fd5b600e54421015611db9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db090614765565b60405180910390fd5b5f8160125f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206002015460125f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2060010154611e479190614262565b611e519190614262565b905060658110611e96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8d9061436d565b60405180910390fd5b611e9e613f0f565b60125f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f9054906101000a900460ff1615611f895760125f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060c00160405290815f82015f9054906101000a900460ff1615151515815260200160018201548152602001600282015481526020016003820154815260200160048201548152602001600582015481525050905061201c565b6040518060c001604052806001151581526020015f81526020015f81526020015f81526020015f81526020015f8152509050601133908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5f612025610f2c565b90505f61203b858361380590919063ffffffff16565b905061208b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff163360055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684613b98565b5f73ffffffffffffffffffffffffffffffffffffffff1660135f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146122cc575f612123611af4565b90505f61215382612145670de0b6b3a76400008661380590919063ffffffff16565b61381a90919063ffffffff16565b90505f61217d606461216f60088561380590919063ffffffff16565b61381a90919063ffffffff16565b905061222b8160145f60135f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461382f90919063ffffffff16565b60145f60135f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505050505b8260125f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548160ff0219169083151502179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015590505061236533613844565b8460125f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206002015f8282546123b49190614262565b925050819055508460105f8282546123cc9190614262565b925050819055505050505050565b6123e26137e9565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461246e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612465906141d6565b60405180910390fd5b80600e8190555050565b600f5f9054906101000a900460ff1681565b5f60145f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b5f6124da33613844565b5f61252e60125f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2060050154426137f090919063ffffffff16565b90505f6125466170808361381a90919063ffffffff16565b90505f8082036125595760049050612593565b6001820361256a5760039050612592565b6002820361257b5760029050612591565b6003820361258c5760019050612590565b5f90505b5b5b5b5f61260e6125ac83600c5461380590919063ffffffff16565b612600606460125f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206003015461381a90919063ffffffff16565b61380590919063ffffffff16565b90505f61268b61262984600d5461380590919063ffffffff16565b61267d606460125f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206004015461381a90919063ffffffff16565b61380590919063ffffffff16565b90505f6126a1828461382f90919063ffffffff16565b905080965050505050505090565b6126b76137e9565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612743576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273a906141d6565b60405180910390fd5b61275e670de0b6b3a76400008261380590919063ffffffff16565b60098190555050565b61276f6137e9565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146127fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f2906141d6565b60405180910390fd5b8060088190555050565b60118181548110612814575f80fd5b905f5260205f20015f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6128486137e9565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146128d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128cb906141d6565b60405180910390fd5b8060015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f804290505f612a0a606461708061292f9190614221565b6129fc61298560125f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2060050154866137f090919063ffffffff16565b6129ee6008546129e0600a5460125f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001015461380590919063ffffffff16565b61380590919063ffffffff16565b61380590919063ffffffff16565b61381a90919063ffffffff16565b90505f612afa6064617080612a1f9190614221565b612aec612a7560125f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2060050154876137f090919063ffffffff16565b612ade600854612ad0600a5460125f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206002015461380590919063ffffffff16565b61380590919063ffffffff16565b61380590919063ffffffff16565b61381a90919063ffffffff16565b90505f612b5060125f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600301548461382f90919063ffffffff16565b90505f612ba660125f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600401548461382f90919063ffffffff16565b90505f612bd1600c54612bc360648661381a90919063ffffffff16565b61380590919063ffffffff16565b90505f612bfc600d54612bee60648661381a90919063ffffffff16565b61380590919063ffffffff16565b9050612c11818361382f90919063ffffffff16565b97505050505050505090565b600f5f9054906101000a900460ff16612c6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c62906146fd565b60405180910390fd5b5f8260125f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206002015460125f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2060010154612cf99190614262565b612d039190614262565b905060658110612d48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3f9061436d565b60405180910390fd5b612d50613f0f565b60125f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f9054906101000a900460ff1615612e3b5760125f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060c00160405290815f82015f9054906101000a900460ff1615151515815260200160018201548152602001600282015481526020016003820154815260200160048201548152602001600582015481525050905061304a565b6040518060c001604052806001151581526020015f81526020015f81526020015f81526020015f81526020015f8152509050601133908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015612f3557503373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b8015612fc857505f73ffffffffffffffffffffffffffffffffffffffff1660135f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b15613049578260135f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5b5f6130608560095461380590919063ffffffff16565b905060015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639dc29fac33836040518363ffffffff1660e01b81526004016130be9291906144fb565b5f604051808303815f87803b1580156130d5575f80fd5b505af11580156130e7573d5f803e3d5ffd5b505050505f73ffffffffffffffffffffffffffffffffffffffff1660135f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146132ef575f6131a2606461319460088561380590919063ffffffff16565b61381a90919063ffffffff16565b90506132508160145f60135f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461382f90919063ffffffff16565b60145f60135f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b8160125f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548160ff0219169083151502179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015590505061338833613844565b8460125f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001015f8282546133d79190614262565b925050819055508460105f8282546133ef9190614262565b925050819055505050505050565b6134056137e9565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613491576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613488906141d6565b60405180910390fd5b80600c8190555050565b6134a36137e9565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461352f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613526906141d6565b60405180910390fd5b80600f5f6101000a81548160ff02191690831515021790555050565b5f806135776064613569600854600a5461380590919063ffffffff16565b61381a90919063ffffffff16565b90508091505090565b5f8061361560125f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206002015460125f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001015461382f90919063ffffffff16565b905080915050919050565b6136286137e9565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146136b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136ab906141d6565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613722576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613719906147f3565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600c5481565b600b5481565b5f33905090565b5f81836137fd919061438b565b905092915050565b5f81836138129190614221565b905092915050565b5f81836138279190614683565b905092915050565b5f818361383c9190614262565b905092915050565b5f4290505f60125f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206005015490505f811180156138af57506170806138ac82846137f090919063ffffffff16565b10155b15613b93575f6138dc6170806138ce84866137f090919063ffffffff16565b61381a90919063ffffffff16565b90506139be61396f606461396184613953600854613945600a5460125f8e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001015461380590919063ffffffff16565b61380590919063ffffffff16565b61380590919063ffffffff16565b61381a90919063ffffffff16565b60125f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206003015461382f90919063ffffffff16565b60125f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2060030181905550613ae2613a936064613a8584613a77600854613a69600a5460125f8e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206002015461380590919063ffffffff16565b61380590919063ffffffff16565b61380590919063ffffffff16565b61381a90919063ffffffff16565b60125f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206004015461382f90919063ffffffff16565b60125f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2060040181905550613b4d613b3e6170808361380590919063ffffffff16565b8361382f90919063ffffffff16565b60125f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2060050181905550505b505050565b613ba484848484613bfc565b8373ffffffffffffffffffffffffffffffffffffffff167f7f2ff68728cab042a64a647a38c53882201e6d9b7bc67ef9903160c7fea189f9848484604051613bee93929190614811565b60405180910390a250505050565b613c7f846323b872dd60e01b858585604051602401613c1d93929190614811565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613c85565b50505050565b5f613ce6826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16613d4a9092919063ffffffff16565b90505f81511115613d455780806020019051810190613d05919061485a565b613d44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d3b906148f5565b60405180910390fd5b5b505050565b6060613d5884845f85613d61565b90509392505050565b606082471015613da6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d9d90614983565b60405180910390fd5b5f808673ffffffffffffffffffffffffffffffffffffffff168587604051613dce91906149f3565b5f6040518083038185875af1925050503d805f8114613e08576040519150601f19603f3d011682016040523d82523d5f602084013e613e0d565b606091505b5091509150613e1e87838387613e2a565b92505050949350505050565b60608315613e8b575f835103613e8357613e4385613e9e565b613e82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e7990614a53565b60405180910390fd5b5b829050613e96565b613e958383613ec0565b5b949350505050565b5f808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b5f82511115613ed25781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f069190614ac3565b60405180910390fd5b6040518060c001604052805f151581526020015f81526020015f81526020015f81526020015f81526020015f81525090565b5f80fd5b5f819050919050565b613f5781613f45565b8114613f61575f80fd5b50565b5f81359050613f7281613f4e565b92915050565b5f60208284031215613f8d57613f8c613f41565b5b5f613f9a84828501613f64565b91505092915050565b613fac81613f45565b82525050565b5f602082019050613fc55f830184613fa3565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f613ff482613fcb565b9050919050565b61400481613fea565b811461400e575f80fd5b50565b5f8135905061401f81613ffb565b92915050565b5f6020828403121561403a57614039613f41565b5b5f61404784828501614011565b91505092915050565b61405981613fea565b82525050565b5f6020820190506140725f830184614050565b92915050565b5f806040838503121561408e5761408d613f41565b5b5f61409b85828601614011565b92505060206140ac85828601613f64565b9150509250929050565b5f8115159050919050565b6140ca816140b6565b82525050565b5f6020820190506140e35f8301846140c1565b92915050565b5f80604083850312156140ff576140fe613f41565b5b5f61410c85828601613f64565b925050602061411d85828601614011565b9150509250929050565b614130816140b6565b811461413a575f80fd5b50565b5f8135905061414b81614127565b92915050565b5f6020828403121561416657614165613f41565b5b5f6141738482850161413d565b91505092915050565b5f82825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f6141c060208361417c565b91506141cb8261418c565b602082019050919050565b5f6020820190508181035f8301526141ed816141b4565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61422b82613f45565b915061423683613f45565b925082820261424481613f45565b9150828204841483151761425b5761425a6141f4565b5b5092915050565b5f61426c82613f45565b915061427783613f45565b925082820190508082111561428f5761428e6141f4565b5b92915050565b7f4e6f7420656e6f7567682070656e64696e672053464f477320746f20636f6d705f8201527f6f756e6400000000000000000000000000000000000000000000000000000000602082015250565b5f6142ef60248361417c565b91506142fa82614295565b604082019050919050565b5f6020820190508181035f83015261431c816142e3565b9050919050565b7f4d617820536f6e6963204f776e656400000000000000000000000000000000005f82015250565b5f614357600f8361417c565b915061436282614323565b602082019050919050565b5f6020820190508181035f8301526143848161434b565b9050919050565b5f61439582613f45565b91506143a083613f45565b92508282039050818111156143b8576143b76141f4565b5b92915050565b5f6143c882613f45565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036143fa576143f96141f4565b5b600182019050919050565b7f446973636f756e742061626f7665206c696d69740000000000000000000000005f82015250565b5f61443960148361417c565b915061444482614405565b602082019050919050565b5f6020820190508181035f8301526144668161442d565b9050919050565b7f73656e646572206d7573742062652072656769737465726564206661726d65725f8201527f20746f20636c61696d207969656c647300000000000000000000000000000000602082015250565b5f6144c760308361417c565b91506144d28261446d565b604082019050919050565b5f6020820190508181035f8301526144f4816144bb565b9050919050565b5f60408201905061450e5f830185614050565b61451b6020830184613fa3565b9392505050565b5f6dffffffffffffffffffffffffffff82169050919050565b61454481614522565b811461454e575f80fd5b50565b5f8151905061455f8161453b565b92915050565b5f63ffffffff82169050919050565b61457d81614565565b8114614587575f80fd5b50565b5f8151905061459881614574565b92915050565b5f805f606084860312156145b5576145b4613f41565b5b5f6145c286828701614551565b93505060206145d386828701614551565b92505060406145e48682870161458a565b9150509250925092565b7f5265736572766573206e6f7420617661696c61626c65000000000000000000005f82015250565b5f61462260168361417c565b915061462d826145ee565b602082019050919050565b5f6020820190508181035f83015261464f81614616565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61468d82613f45565b915061469883613f45565b9250826146a8576146a7614656565b5b828204905092915050565b7f506c6174666f726d206973206f66666c696e65000000000000000000000000005f82015250565b5f6146e760138361417c565b91506146f2826146b3565b602082019050919050565b5f6020820190508181035f830152614714816146db565b9050919050565b7f426f6e644e6f6465206e6f7420617661696c61626c65207965740000000000005f82015250565b5f61474f601a8361417c565b915061475a8261471b565b602082019050919050565b5f6020820190508181035f83015261477c81614743565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f6147dd60268361417c565b91506147e882614783565b604082019050919050565b5f6020820190508181035f83015261480a816147d1565b9050919050565b5f6060820190506148245f830186614050565b6148316020830185614050565b61483e6040830184613fa3565b949350505050565b5f8151905061485481614127565b92915050565b5f6020828403121561486f5761486e613f41565b5b5f61487c84828501614846565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e5f8201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b5f6148df602a8361417c565b91506148ea82614885565b604082019050919050565b5f6020820190508181035f83015261490c816148d3565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f5f8201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b5f61496d60268361417c565b915061497882614913565b604082019050919050565b5f6020820190508181035f83015261499a81614961565b9050919050565b5f81519050919050565b5f81905092915050565b8281835e5f83830152505050565b5f6149cd826149a1565b6149d781856149ab565b93506149e78185602086016149b5565b80840191505092915050565b5f6149fe82846149c3565b915081905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000005f82015250565b5f614a3d601d8361417c565b9150614a4882614a09565b602082019050919050565b5f6020820190508181035f830152614a6a81614a31565b9050919050565b5f81519050919050565b5f601f19601f8301169050919050565b5f614a9582614a71565b614a9f818561417c565b9350614aaf8185602086016149b5565b614ab881614a7b565b840191505092915050565b5f6020820190508181035f830152614adb8184614a8b565b90509291505056fea264697066735822122005599912f5ec5282320917e31f97721af6d12f20815be706610cd057fb0995cd64736f6c63430008190033
Deployed Bytecode
0x608060405260043610610223575f3560e01c8063a7e05b9c11610122578063ca98207f116100aa578063e7438d1d1161006e578063e7438d1d14610771578063ec988c5a1461079b578063f2fde38b146107d7578063f861661a146107ff578063f9caa5831461082957610223565b8063ca98207f146106b3578063d07b26ba146106db578063de68aa2014610705578063e26b5eb114610721578063e3b572751461074957610223565b8063b9663e0e116100f1578063b9663e0e146105c1578063b9b2735c146105fd578063be7847a714610627578063bec820341461064f578063bfeaa0711461067757610223565b8063a7e05b9c1461052b578063aa11aecd14610553578063b3bc10cd1461056f578063b8f7a6651461059757610223565b80634e71d92d116101b05780636b6156c8116101745780636b6156c81461046f578063715018a61461049957806375166473146104af5780638da5cb5b146104d757806398d5fdca1461050157610223565b80634e71d92d146103ab57806353aaa63b146103b55780635dbdda69146103f157806361d027b31461041b57806363584ecd1461044557610223565b806329a5c72b116101f757806329a5c72b146102df5780632f85d8cb146102f5578063357c8acd1461031f5780634260aabc146103475780634a3b68cc1461036f57610223565b80629f9262146102275780630c2e05e01461024f5780630d13926014610279578063267e8ab6146102a3575b5f80fd5b348015610232575f80fd5b5061024d60048036038101906102489190613f78565b610853565b005b34801561025a575f80fd5b506102636108f1565b6040516102709190613fb2565b60405180910390f35b348015610284575f80fd5b5061028d6108f6565b60405161029a9190613fb2565b60405180910390f35b3480156102ae575f80fd5b506102c960048036038101906102c49190614025565b6108fc565b6040516102d69190613fb2565b60405180910390f35b3480156102ea575f80fd5b506102f3610ba7565b005b348015610300575f80fd5b50610309610f2c565b6040516103169190613fb2565b60405180910390f35b34801561032a575f80fd5b5061034560048036038101906103409190613f78565b610fad565b005b348015610352575f80fd5b5061036d60048036038101906103689190613f78565b61108f565b005b34801561037a575f80fd5b5061039560048036038101906103909190614025565b61112d565b6040516103a2919061405f565b60405180910390f35b6103b361115d565b005b3480156103c0575f80fd5b506103db60048036038101906103d69190614025565b6114e7565b6040516103e89190613fb2565b60405180910390f35b3480156103fc575f80fd5b506104056114fc565b6040516104129190613fb2565b60405180910390f35b348015610426575f80fd5b5061042f611502565b60405161043c919061405f565b60405180910390f35b348015610450575f80fd5b50610459611527565b6040516104669190613fb2565b60405180910390f35b34801561047a575f80fd5b50610483611530565b6040516104909190613fb2565b60405180910390f35b3480156104a4575f80fd5b506104ad611536565b005b3480156104ba575f80fd5b506104d560048036038101906104d09190614078565b611684565b005b3480156104e2575f80fd5b506104eb611acd565b6040516104f8919061405f565b60405180910390f35b34801561050c575f80fd5b50610515611af4565b6040516105229190613fb2565b60405180910390f35b348015610536575f80fd5b50610551600480360381019061054c9190614025565b611c4f565b005b61056d60048036038101906105689190613f78565b611d26565b005b34801561057a575f80fd5b5061059560048036038101906105909190613f78565b6123da565b005b3480156105a2575f80fd5b506105ab612478565b6040516105b891906140d0565b60405180910390f35b3480156105cc575f80fd5b506105e760048036038101906105e29190614025565b61248a565b6040516105f49190613fb2565b60405180910390f35b348015610608575f80fd5b506106116124d0565b60405161061e9190613fb2565b60405180910390f35b348015610632575f80fd5b5061064d60048036038101906106489190613f78565b6126af565b005b34801561065a575f80fd5b5061067560048036038101906106709190613f78565b612767565b005b348015610682575f80fd5b5061069d60048036038101906106989190613f78565b612805565b6040516106aa919061405f565b60405180910390f35b3480156106be575f80fd5b506106d960048036038101906106d49190614025565b612840565b005b3480156106e6575f80fd5b506106ef612917565b6040516106fc9190613fb2565b60405180910390f35b61071f600480360381019061071a91906140e9565b612c1d565b005b34801561072c575f80fd5b5061074760048036038101906107429190613f78565b6133fd565b005b348015610754575f80fd5b5061076f600480360381019061076a9190614151565b61349b565b005b34801561077c575f80fd5b5061078561354b565b6040516107929190613fb2565b60405180910390f35b3480156107a6575f80fd5b506107c160048036038101906107bc9190614025565b613580565b6040516107ce9190613fb2565b60405180910390f35b3480156107e2575f80fd5b506107fd60048036038101906107f89190614025565b613620565b005b34801561080a575f80fd5b506108136137dd565b6040516108209190613fb2565b60405180910390f35b348015610834575f80fd5b5061083d6137e3565b60405161084a9190613fb2565b60405180910390f35b61085b6137e9565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146108e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108de906141d6565b60405180910390fd5b8060078190555050565b600881565b600e5481565b5f804290505f6109ef60646170806109149190614221565b6109e161096a60125f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2060050154866137f090919063ffffffff16565b6109d36008546109c5600a5460125f8d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001015461380590919063ffffffff16565b61380590919063ffffffff16565b61380590919063ffffffff16565b61381a90919063ffffffff16565b90505f610adf6064617080610a049190614221565b610ad1610a82610a71610a6060125f8c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2060050154896137f090919063ffffffff16565b60085461380590919063ffffffff16565b600a5461380590919063ffffffff16565b60125f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206002015461380590919063ffffffff16565b61381a90919063ffffffff16565b90505f610af5828461382f90919063ffffffff16565b9050610b9c81610b8e60125f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206004015460125f8b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206003015461382f90919063ffffffff16565b61382f90919063ffffffff16565b945050505050919050565b5f610bb1336108fc565b90505f60125f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206002015460125f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2060010154610c409190614262565b90506009548211610c86576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7d90614305565b60405180910390fd5b60648110610cc9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc09061436d565b60405180910390fd5b610cd233613844565b60095460125f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600301541115610dce5760095460125f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206003015f828254610d6d919061438b565b9250508190555060125f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001015f815480929190610dc4906143be565b9190505550610f11565b5f60125f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2060030154600954610e1d919061438b565b90505f60125f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600301819055508060125f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206004015f828254610eb3919061438b565b9250508190555060125f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206002015f815480929190610f0a906143be565b9190505550505b60105f815480929190610f23906143be565b91905055505050565b5f80610f36611af4565b90505f610f68670de0b6b3a7640000610f5a8460095461380590919063ffffffff16565b61381a90919063ffffffff16565b90505f610f786064600b546137f0565b90505f610fa16064610f93848661380590919063ffffffff16565b61381a90919063ffffffff16565b90508094505050505090565b610fb56137e9565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611041576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611038906141d6565b60405180910390fd5b604b811115611085576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107c9061444f565b60405180910390fd5b80600b8190555050565b6110976137e9565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611123576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111a906141d6565b60405180910390fd5b80600d8190555050565b6013602052805f5260405f205f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60125f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f9054906101000a900460ff166111e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111df906144dd565b60405180910390fd5b5f6111f16124d0565b90505f61128760125f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206004015460125f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206003015461382f90919063ffffffff16565b90505f60145f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490506112dd818361382f90919063ffffffff16565b91505f8390505f6112f785856137f090919063ffffffff16565b90505f8411156114e0575f60125f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600301819055505f60125f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600401819055505f60145f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208190555060015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166340c10f1933836040518363ffffffff1660e01b81526004016114299291906144fb565b5f604051808303815f87803b158015611440575f80fd5b505af1158015611452573d5f803e3d5ffd5b5050505060015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639dc29fac33846040518363ffffffff1660e01b81526004016114b29291906144fb565b5f604051808303815f87803b1580156114c9575f80fd5b505af11580156114db573d5f803e3d5ffd5b505050505b5050505050565b6014602052805f5260405f205f915090505481565b61708081565b60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f601054905090565b600d5481565b61153e6137e9565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146115ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115c1906141d6565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35f805f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b61168c6137e9565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611718576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170f906141d6565b60405180910390fd5b5f8160125f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206002015460125f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600101546117a69190614262565b6117b09190614262565b9050606581106117f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ec9061436d565b60405180910390fd5b6117fd613f0f565b60125f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f9054906101000a900460ff16156118e85760125f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060c00160405290815f82015f9054906101000a900460ff1615151515815260200160018201548152602001600282015481526020016003820154815260200160048201548152602001600582015481525050905061197b565b6040518060c001604052806001151581526020015f81526020015f81526020015f81526020015f81526020015f8152509050601184908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b8060125f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548160ff0219169083151502179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a08201518160050155905050611a1484613844565b8260125f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001015f828254611a639190614262565b925050819055508260105f828254611a7b9190614262565b925050819055504260125f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206005018190555050505050565b5f805f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b5f805f60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611b61573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b85919061459e565b50915091505f826dffffffffffffffffffffffffffff16118015611bb857505f816dffffffffffffffffffffffffffff16115b611bf7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bee90614638565b60405180910390fd5b5f826dffffffffffffffffffffffffffff16670de0b6b3a7640000600754846dffffffffffffffffffffffffffff16611c309190614221565b611c3a9190614221565b611c449190614683565b905080935050505090565b611c576137e9565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611ce3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cda906141d6565b60405180910390fd5b8060055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600f5f9054906101000a900460ff16611d74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d6b906146fd565b60405180910390fd5b600e54421015611db9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db090614765565b60405180910390fd5b5f8160125f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206002015460125f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2060010154611e479190614262565b611e519190614262565b905060658110611e96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8d9061436d565b60405180910390fd5b611e9e613f0f565b60125f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f9054906101000a900460ff1615611f895760125f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060c00160405290815f82015f9054906101000a900460ff1615151515815260200160018201548152602001600282015481526020016003820154815260200160048201548152602001600582015481525050905061201c565b6040518060c001604052806001151581526020015f81526020015f81526020015f81526020015f81526020015f8152509050601133908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5f612025610f2c565b90505f61203b858361380590919063ffffffff16565b905061208b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff163360055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684613b98565b5f73ffffffffffffffffffffffffffffffffffffffff1660135f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146122cc575f612123611af4565b90505f61215382612145670de0b6b3a76400008661380590919063ffffffff16565b61381a90919063ffffffff16565b90505f61217d606461216f60088561380590919063ffffffff16565b61381a90919063ffffffff16565b905061222b8160145f60135f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461382f90919063ffffffff16565b60145f60135f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505050505b8260125f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548160ff0219169083151502179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015590505061236533613844565b8460125f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206002015f8282546123b49190614262565b925050819055508460105f8282546123cc9190614262565b925050819055505050505050565b6123e26137e9565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461246e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612465906141d6565b60405180910390fd5b80600e8190555050565b600f5f9054906101000a900460ff1681565b5f60145f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b5f6124da33613844565b5f61252e60125f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2060050154426137f090919063ffffffff16565b90505f6125466170808361381a90919063ffffffff16565b90505f8082036125595760049050612593565b6001820361256a5760039050612592565b6002820361257b5760029050612591565b6003820361258c5760019050612590565b5f90505b5b5b5b5f61260e6125ac83600c5461380590919063ffffffff16565b612600606460125f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206003015461381a90919063ffffffff16565b61380590919063ffffffff16565b90505f61268b61262984600d5461380590919063ffffffff16565b61267d606460125f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206004015461381a90919063ffffffff16565b61380590919063ffffffff16565b90505f6126a1828461382f90919063ffffffff16565b905080965050505050505090565b6126b76137e9565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612743576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273a906141d6565b60405180910390fd5b61275e670de0b6b3a76400008261380590919063ffffffff16565b60098190555050565b61276f6137e9565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146127fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f2906141d6565b60405180910390fd5b8060088190555050565b60118181548110612814575f80fd5b905f5260205f20015f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6128486137e9565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146128d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128cb906141d6565b60405180910390fd5b8060015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f804290505f612a0a606461708061292f9190614221565b6129fc61298560125f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2060050154866137f090919063ffffffff16565b6129ee6008546129e0600a5460125f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001015461380590919063ffffffff16565b61380590919063ffffffff16565b61380590919063ffffffff16565b61381a90919063ffffffff16565b90505f612afa6064617080612a1f9190614221565b612aec612a7560125f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2060050154876137f090919063ffffffff16565b612ade600854612ad0600a5460125f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206002015461380590919063ffffffff16565b61380590919063ffffffff16565b61380590919063ffffffff16565b61381a90919063ffffffff16565b90505f612b5060125f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600301548461382f90919063ffffffff16565b90505f612ba660125f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600401548461382f90919063ffffffff16565b90505f612bd1600c54612bc360648661381a90919063ffffffff16565b61380590919063ffffffff16565b90505f612bfc600d54612bee60648661381a90919063ffffffff16565b61380590919063ffffffff16565b9050612c11818361382f90919063ffffffff16565b97505050505050505090565b600f5f9054906101000a900460ff16612c6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c62906146fd565b60405180910390fd5b5f8260125f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206002015460125f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2060010154612cf99190614262565b612d039190614262565b905060658110612d48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d3f9061436d565b60405180910390fd5b612d50613f0f565b60125f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f015f9054906101000a900460ff1615612e3b5760125f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206040518060c00160405290815f82015f9054906101000a900460ff1615151515815260200160018201548152602001600282015481526020016003820154815260200160048201548152602001600582015481525050905061304a565b6040518060c001604052806001151581526020015f81526020015f81526020015f81526020015f81526020015f8152509050601133908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015612f3557503373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b8015612fc857505f73ffffffffffffffffffffffffffffffffffffffff1660135f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16145b15613049578260135f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5b5f6130608560095461380590919063ffffffff16565b905060015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16639dc29fac33836040518363ffffffff1660e01b81526004016130be9291906144fb565b5f604051808303815f87803b1580156130d5575f80fd5b505af11580156130e7573d5f803e3d5ffd5b505050505f73ffffffffffffffffffffffffffffffffffffffff1660135f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146132ef575f6131a2606461319460088561380590919063ffffffff16565b61381a90919063ffffffff16565b90506132508160145f60135f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461382f90919063ffffffff16565b60145f60135f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550505b8160125f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f820151815f015f6101000a81548160ff0219169083151502179055506020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015590505061338833613844565b8460125f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001015f8282546133d79190614262565b925050819055508460105f8282546133ef9190614262565b925050819055505050505050565b6134056137e9565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613491576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613488906141d6565b60405180910390fd5b80600c8190555050565b6134a36137e9565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461352f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613526906141d6565b60405180910390fd5b80600f5f6101000a81548160ff02191690831515021790555050565b5f806135776064613569600854600a5461380590919063ffffffff16565b61381a90919063ffffffff16565b90508091505090565b5f8061361560125f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206002015460125f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001015461382f90919063ffffffff16565b905080915050919050565b6136286137e9565b73ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146136b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136ab906141d6565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613722576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613719906147f3565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff165f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600c5481565b600b5481565b5f33905090565b5f81836137fd919061438b565b905092915050565b5f81836138129190614221565b905092915050565b5f81836138279190614683565b905092915050565b5f818361383c9190614262565b905092915050565b5f4290505f60125f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206005015490505f811180156138af57506170806138ac82846137f090919063ffffffff16565b10155b15613b93575f6138dc6170806138ce84866137f090919063ffffffff16565b61381a90919063ffffffff16565b90506139be61396f606461396184613953600854613945600a5460125f8e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001015461380590919063ffffffff16565b61380590919063ffffffff16565b61380590919063ffffffff16565b61381a90919063ffffffff16565b60125f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206003015461382f90919063ffffffff16565b60125f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2060030181905550613ae2613a936064613a8584613a77600854613a69600a5460125f8e73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206002015461380590919063ffffffff16565b61380590919063ffffffff16565b61380590919063ffffffff16565b61381a90919063ffffffff16565b60125f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206004015461382f90919063ffffffff16565b60125f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2060040181905550613b4d613b3e6170808361380590919063ffffffff16565b8361382f90919063ffffffff16565b60125f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2060050181905550505b505050565b613ba484848484613bfc565b8373ffffffffffffffffffffffffffffffffffffffff167f7f2ff68728cab042a64a647a38c53882201e6d9b7bc67ef9903160c7fea189f9848484604051613bee93929190614811565b60405180910390a250505050565b613c7f846323b872dd60e01b858585604051602401613c1d93929190614811565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613c85565b50505050565b5f613ce6826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16613d4a9092919063ffffffff16565b90505f81511115613d455780806020019051810190613d05919061485a565b613d44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d3b906148f5565b60405180910390fd5b5b505050565b6060613d5884845f85613d61565b90509392505050565b606082471015613da6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d9d90614983565b60405180910390fd5b5f808673ffffffffffffffffffffffffffffffffffffffff168587604051613dce91906149f3565b5f6040518083038185875af1925050503d805f8114613e08576040519150601f19603f3d011682016040523d82523d5f602084013e613e0d565b606091505b5091509150613e1e87838387613e2a565b92505050949350505050565b60608315613e8b575f835103613e8357613e4385613e9e565b613e82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e7990614a53565b60405180910390fd5b5b829050613e96565b613e958383613ec0565b5b949350505050565b5f808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b5f82511115613ed25781518083602001fd5b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613f069190614ac3565b60405180910390fd5b6040518060c001604052805f151581526020015f81526020015f81526020015f81526020015f81526020015f81525090565b5f80fd5b5f819050919050565b613f5781613f45565b8114613f61575f80fd5b50565b5f81359050613f7281613f4e565b92915050565b5f60208284031215613f8d57613f8c613f41565b5b5f613f9a84828501613f64565b91505092915050565b613fac81613f45565b82525050565b5f602082019050613fc55f830184613fa3565b92915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f613ff482613fcb565b9050919050565b61400481613fea565b811461400e575f80fd5b50565b5f8135905061401f81613ffb565b92915050565b5f6020828403121561403a57614039613f41565b5b5f61404784828501614011565b91505092915050565b61405981613fea565b82525050565b5f6020820190506140725f830184614050565b92915050565b5f806040838503121561408e5761408d613f41565b5b5f61409b85828601614011565b92505060206140ac85828601613f64565b9150509250929050565b5f8115159050919050565b6140ca816140b6565b82525050565b5f6020820190506140e35f8301846140c1565b92915050565b5f80604083850312156140ff576140fe613f41565b5b5f61410c85828601613f64565b925050602061411d85828601614011565b9150509250929050565b614130816140b6565b811461413a575f80fd5b50565b5f8135905061414b81614127565b92915050565b5f6020828403121561416657614165613f41565b5b5f6141738482850161413d565b91505092915050565b5f82825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f6141c060208361417c565b91506141cb8261418c565b602082019050919050565b5f6020820190508181035f8301526141ed816141b4565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61422b82613f45565b915061423683613f45565b925082820261424481613f45565b9150828204841483151761425b5761425a6141f4565b5b5092915050565b5f61426c82613f45565b915061427783613f45565b925082820190508082111561428f5761428e6141f4565b5b92915050565b7f4e6f7420656e6f7567682070656e64696e672053464f477320746f20636f6d705f8201527f6f756e6400000000000000000000000000000000000000000000000000000000602082015250565b5f6142ef60248361417c565b91506142fa82614295565b604082019050919050565b5f6020820190508181035f83015261431c816142e3565b9050919050565b7f4d617820536f6e6963204f776e656400000000000000000000000000000000005f82015250565b5f614357600f8361417c565b915061436282614323565b602082019050919050565b5f6020820190508181035f8301526143848161434b565b9050919050565b5f61439582613f45565b91506143a083613f45565b92508282039050818111156143b8576143b76141f4565b5b92915050565b5f6143c882613f45565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036143fa576143f96141f4565b5b600182019050919050565b7f446973636f756e742061626f7665206c696d69740000000000000000000000005f82015250565b5f61443960148361417c565b915061444482614405565b602082019050919050565b5f6020820190508181035f8301526144668161442d565b9050919050565b7f73656e646572206d7573742062652072656769737465726564206661726d65725f8201527f20746f20636c61696d207969656c647300000000000000000000000000000000602082015250565b5f6144c760308361417c565b91506144d28261446d565b604082019050919050565b5f6020820190508181035f8301526144f4816144bb565b9050919050565b5f60408201905061450e5f830185614050565b61451b6020830184613fa3565b9392505050565b5f6dffffffffffffffffffffffffffff82169050919050565b61454481614522565b811461454e575f80fd5b50565b5f8151905061455f8161453b565b92915050565b5f63ffffffff82169050919050565b61457d81614565565b8114614587575f80fd5b50565b5f8151905061459881614574565b92915050565b5f805f606084860312156145b5576145b4613f41565b5b5f6145c286828701614551565b93505060206145d386828701614551565b92505060406145e48682870161458a565b9150509250925092565b7f5265736572766573206e6f7420617661696c61626c65000000000000000000005f82015250565b5f61462260168361417c565b915061462d826145ee565b602082019050919050565b5f6020820190508181035f83015261464f81614616565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61468d82613f45565b915061469883613f45565b9250826146a8576146a7614656565b5b828204905092915050565b7f506c6174666f726d206973206f66666c696e65000000000000000000000000005f82015250565b5f6146e760138361417c565b91506146f2826146b3565b602082019050919050565b5f6020820190508181035f830152614714816146db565b9050919050565b7f426f6e644e6f6465206e6f7420617661696c61626c65207965740000000000005f82015250565b5f61474f601a8361417c565b915061475a8261471b565b602082019050919050565b5f6020820190508181035f83015261477c81614743565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f6147dd60268361417c565b91506147e882614783565b604082019050919050565b5f6020820190508181035f83015261480a816147d1565b9050919050565b5f6060820190506148245f830186614050565b6148316020830185614050565b61483e6040830184613fa3565b949350505050565b5f8151905061485481614127565b92915050565b5f6020828403121561486f5761486e613f41565b5b5f61487c84828501614846565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e5f8201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b5f6148df602a8361417c565b91506148ea82614885565b604082019050919050565b5f6020820190508181035f83015261490c816148d3565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f5f8201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b5f61496d60268361417c565b915061497882614913565b604082019050919050565b5f6020820190508181035f83015261499a81614961565b9050919050565b5f81519050919050565b5f81905092915050565b8281835e5f83830152505050565b5f6149cd826149a1565b6149d781856149ab565b93506149e78185602086016149b5565b80840191505092915050565b5f6149fe82846149c3565b915081905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000005f82015250565b5f614a3d601d8361417c565b9150614a4882614a09565b602082019050919050565b5f6020820190508181035f830152614a6a81614a31565b9050919050565b5f81519050919050565b5f601f19601f8301169050919050565b5f614a9582614a71565b614a9f818561417c565b9350614aaf8185602086016149b5565b614ab881614a7b565b840191505092915050565b5f6020820190508181035f830152614adb8184614a8b565b90509291505056fea264697066735822122005599912f5ec5282320917e31f97721af6d12f20815be706610cd057fb0995cd64736f6c63430008190033
Deployed Bytecode Sourcemap
37817:15456:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42075:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39326:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38594:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48655:815;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46596:868;;;;;;;;;;;;;:::i;:::-;;40846:319;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41173:169;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41719:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39104:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51368:899;;;:::i;:::-;;39225:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39423:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38296:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52698:93;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38555:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19201:150;;;;;;;;;;;;;:::i;:::-;;45882:706;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18987:79;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40487:331;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41373:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44246:1628;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42533:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38635:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53147:123;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50438:922;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41961:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42179:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38714:33;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41493:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49478:952;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42724:1514;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41604:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41861:92;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52298:171;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52477:213;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19359:281;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38516:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38480:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42075:96;19124:12;:10;:12::i;:::-;19114:22;;:6;;;;;;;;;;:22;;;19106:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;42154:9:::1;42143:8;:20;;;;42075:96:::0;:::o;39326:47::-;39372:1;39326:47;:::o;38594:32::-;;;;:::o;48655:815::-;48718:7;48738:12;48753:15;48738:30;;48779:19;48801:197;48994:3;39465:6;48976:21;;;;:::i;:::-;48801:156;48920:35;48929:7;:14;48937:5;48929:14;;;;;;;;;;;;;;;:25;;;48920:4;:8;;:35;;;;:::i;:::-;48801:99;48886:13;;48801:66;48858:8;;48801:7;:14;48809:5;48801:14;;;;;;;;;;;;;;;:38;;;:56;;:66;;;;:::i;:::-;:84;;:99;;;;:::i;:::-;:117;;:156;;;;:::i;:::-;:174;;:197;;;;:::i;:::-;48779:219;;49009:19;49031:241;49268:3;39465:6;49250:21;;;;:::i;:::-;49031:200;49106:110;49141:56;49160:35;49169:7;:14;49177:5;49169:14;;;;;;;;;;;;;;;:25;;;49160:4;:8;;:35;;;;:::i;:::-;49141:13;;:17;;:56;;;;:::i;:::-;49106:8;;:12;;:110;;;;:::i;:::-;49031:7;:14;49039:5;49031:14;;;;;;;;;;;;;;;:38;;;:56;;:200;;;;:::i;:::-;:218;;:241;;;;:::i;:::-;49009:263;;49283:15;49301:28;49317:11;49301;:15;;:28;;;;:::i;:::-;49283:46;;49360:102;49440:7;49360:57;49391:7;:14;49399:5;49391:14;;;;;;;;;;;;;;;:25;;;49360:7;:14;49368:5;49360:14;;;;;;;;;;;;;;;:26;;;:30;;:57;;;;:::i;:::-;:61;;:102;;;;:::i;:::-;49340:122;;;;;;48655:815;;;:::o;46596:868::-;46638:21;46662:29;46680:10;46662:17;:29::i;:::-;46638:53;;46702:18;46768:7;:19;46776:10;46768:19;;;;;;;;;;;;;;;:29;;;46723:7;:19;46731:10;46723:19;;;;;;;;;;;;;;;:29;;;:74;;;;:::i;:::-;46702:95;;46846:8;;46830:13;:24;46808:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;46950:3;46937:10;:16;46929:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;46984:24;46997:10;46984:12;:24::i;:::-;47057:8;;47023:7;:19;47031:10;47023:19;;;;;;;;;;;;;;;:31;;;:42;47019:415;;;47117:8;;47082:7;:19;47090:10;47082:19;;;;;;;;;;;;;;;:31;;;:43;;;;;;;:::i;:::-;;;;;;;;47140:7;:19;47148:10;47140:19;;;;;;;;;;;;;;;:29;;;:31;;;;;;;;;:::i;:::-;;;;;;47019:415;;;47204:18;47236:7;:19;47244:10;47236:19;;;;;;;;;;;;;;;:31;;;47225:8;;:42;;;;:::i;:::-;47204:63;;47316:1;47282:7;:19;47290:10;47282:19;;;;;;;;;;;;;;;:31;;:35;;;;47366:10;47332:7;:19;47340:10;47332:19;;;;;;;;;;;;;;;:30;;;:44;;;;;;;:::i;:::-;;;;;;;;47391:7;:19;47399:10;47391:19;;;;;;;;;;;;;;;:29;;;:31;;;;;;;;;:::i;:::-;;;;;;47189:245;47019:415;47444:10;;:12;;;;;;;;;:::i;:::-;;;;;;46627:837;;46596:868::o;40846:319::-;40890:7;40910:18;40931:10;:8;:10::i;:::-;40910:31;;40952:17;40972:34;41001:4;40972:24;40985:10;40972:8;;:12;;:24;;;;:::i;:::-;:28;;:34;;;;:::i;:::-;40952:54;;41017:16;41036:31;41049:3;41054:12;;41036;:31::i;:::-;41017:50;;41078:17;41098:32;41126:3;41098:23;41112:8;41098:9;:13;;:23;;;;:::i;:::-;:27;;:32;;;;:::i;:::-;41078:52;;41148:9;41141:16;;;;;;40846:319;:::o;41173:169::-;19124:12;:10;:12::i;:::-;19114:22;;:6;;;;;;;;;;:22;;;19106:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;41270:2:::1;41255:11;:17;;41247:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;41323:11;41308:12;:26;;;;41173:169:::0;:::o;41719:107::-;19124:12;:10;:12::i;:::-;19114:22;;:6;;;;;;;;;;:22;;;19106:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;41805:13:::1;41790:12;:28;;;;41719:107:::0;:::o;39104:44::-;;;;;;;;;;;;;;;;;;;;;;:::o;51368:899::-;51435:7;:19;51443:10;51435:19;;;;;;;;;;;;;;;:26;;;;;;;;;;;;51413:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;51550:11;51564:14;:12;:14::i;:::-;51550:28;;51589:14;51606:91;51656:7;:19;51664:10;51656:19;;;;;;;;;;;;;;;:30;;;51606:7;:19;51614:10;51606:19;;;;;;;;;;;;;;;:31;;;:35;;:91;;;;:::i;:::-;51589:108;;51781:17;51801:15;:27;51817:10;51801:27;;;;;;;;;;;;;;;;51781:47;;51848:21;51859:9;51848:6;:10;;:21;;;;:::i;:::-;51839:30;;51882:14;51899:3;51882:20;;51913:16;51932:15;51943:3;51932:6;:10;;:15;;;;:::i;:::-;51913:34;;51973:1;51964:6;:10;51960:300;;;52025:1;51991:7;:19;51999:10;51991:19;;;;;;;;;;;;;;;:31;;:35;;;;52074:1;52041:7;:19;52049:10;52041:19;;;;;;;;;;;;;;;:30;;:34;;;;52120:1;52090:15;:27;52106:10;52090:27;;;;;;;;;;;;;;;:31;;;;52173:4;;;;;;;;;;;:9;;;52183:10;52195:8;52173:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52219:4;;;;;;;;;;;:9;;;52229:10;52241:6;52219:29;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51960:300;51402:865;;;;;51368:899::o;39225:50::-;;;;;;;;;;;;;;;;;:::o;39423:48::-;39465:6;39423:48;:::o;38296:23::-;;;;;;;;;;;;;:::o;52698:93::-;52746:7;52773:10;;52766:17;;52698:93;:::o;38555:32::-;;;;:::o;19201:150::-;19124:12;:10;:12::i;:::-;19114:22;;:6;;;;;;;;;;:22;;;19106:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;19310:1:::1;19273:40;;19294:6;::::0;::::1;;;;;;;;19273:40;;;;;;;;;;;;19341:1;19324:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;19201:150::o:0;45882:706::-;19124:12;:10;:12::i;:::-;19114:22;;:6;;;;;;;;;;:22;;;19106:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;45964:18:::1;46071:7;46028;:17;46036:8;46028:17;;;;;;;;;;;;;;;:27;;;45985:7;:17;45993:8;45985:17;;;;;;;;;;;;;;;:27;;;:70;;;;:::i;:::-;:93;;;;:::i;:::-;45964:114;;46110:3;46097:10;:16;46089:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;46144:20;;:::i;:::-;46179:7;:17;46187:8;46179:17;;;;;;;;;;;;;;;:24;;;;;;;;;;;;46175:198;;;46229:7;:17;46237:8;46229:17;;;;;;;;;;;;;;;46220:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;46175:198;;;46288:27;;;;;;;;46295:4;46288:27;;;;;;46301:1;46288:27;;;;46304:1;46288:27;;;;46307:1;46288:27;;;;46310:1;46288:27;;;;46313:1;46288:27;;::::0;46279:36:::1;;46330:16;46352:8;46330:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46175:198;46403:6;46383:7;:17;46391:8;46383:17;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46420:22;46433:8;46420:12;:22::i;:::-;46484:7;46453;:17;46461:8;46453:17;;;;;;;;;;;;;;;:27;;;:38;;;;;;;:::i;:::-;;;;;;;;46516:7;46502:10;;:21;;;;;;;:::i;:::-;;;;;;;;46565:15;46534:7;:17;46542:8;46534:17;;;;;;;;;;;;;;;:28;;:46;;;;45953:635;;45882:706:::0;;:::o;18987:79::-;19025:7;19052:6;;;;;;;;;;;19045:13;;18987:79;:::o;40487:331::-;40528:7;40549:16;40567;40589:7;;;;;;;;;;;:19;;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40548:62;;;;;40642:1;40631:8;:12;;;:28;;;;;40658:1;40647:8;:12;;;40631:28;40623:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;40699:13;40776:8;40768:17;;40747:4;40736:8;;40724;40716:17;;:28;;;;:::i;:::-;:35;;;;:::i;:::-;40715:70;;;;:::i;:::-;40699:86;;40805:5;40798:12;;;;;40487:331;:::o;41373:112::-;19124:12;:10;:12::i;:::-;19114:22;;:6;;;;;;;;;;:22;;;19106:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;41462:15:::1;41451:8;;:26;;;;;;;;;;;;;;;;;;41373:112:::0;:::o;44246:1628::-;44317:6;;;;;;;;;;;44309:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;44399:17;;44380:15;:36;;44358:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;44481:18;44592:7;44547;:19;44555:10;44547:19;;;;;;;;;;;;;;;:29;;;44502:7;:19;44510:10;44502:19;;;;;;;;;;;;;;;:29;;;:74;;;;:::i;:::-;:97;;;;:::i;:::-;44481:118;;44631:3;44618:10;:16;44610:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;44667:20;;:::i;:::-;44702:7;:19;44710:10;44702:19;;;;;;;;;;;;;;;:26;;;;;;;;;;;;44698:204;;;44754:7;:19;44762:10;44754:19;;;;;;;;;;;;;;;44745:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44698:204;;;44815:27;;;;;;;;44822:4;44815:27;;;;;;44828:1;44815:27;;;;44831:1;44815:27;;;;44834:1;44815:27;;;;44837:1;44815:27;;;;44840:1;44815:27;;;44806:36;;44857:16;44879:10;44857:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44698:204;44914:18;44935:13;:11;:13::i;:::-;44914:34;;44959:24;44986:23;45001:7;44986:10;:14;;:23;;;;:::i;:::-;44959:50;;45020:68;45034:4;;;;;;;;;;;45040:10;45060:8;;;;;;;;;;;45071:16;45020:13;:68::i;:::-;45225:1;45192:35;;:9;:21;45202:10;45192:21;;;;;;;;;;;;;;;;;;;;;;;;;:35;;;45188:520;;45244:18;45265:10;:8;:10::i;:::-;45244:31;;45308:23;45334:76;45385:10;45334:28;45355:6;45334:16;:20;;:28;;;;:::i;:::-;:32;;:76;;;;:::i;:::-;45308:102;;45454:17;45474:81;45537:3;45474:40;39372:1;45474:15;:19;;:40;;;;:::i;:::-;:44;;:81;;;;:::i;:::-;45454:101;;45611:85;45686:9;45611:15;:70;45645:9;:21;45655:10;45645:21;;;;;;;;;;;;;;;;;;;;;;;;;45611:70;;;;;;;;;;;;;;;;:74;;:85;;;;:::i;:::-;45570:15;:38;45586:9;:21;45596:10;45586:21;;;;;;;;;;;;;;;;;;;;;;;;;45570:38;;;;;;;;;;;;;;;:126;;;;45229:479;;;45188:520;45742:6;45720:7;:19;45728:10;45720:19;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45759:24;45772:10;45759:12;:24::i;:::-;45827:7;45794;:19;45802:10;45794:19;;;;;;;;;;;;;;;:29;;;:40;;;;;;;:::i;:::-;;;;;;;;45859:7;45845:10;;:21;;;;;;;:::i;:::-;;;;;;;;44298:1576;;;;44246:1628;:::o;42533:124::-;19124:12;:10;:12::i;:::-;19114:22;;:6;;;;;;;;;;:22;;;19106:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;42636:13:::1;42616:17;:33;;;;42533:124:::0;:::o;38635:26::-;;;;;;;;;;;;;:::o;53147:123::-;53213:7;53240:15;:22;53256:5;53240:22;;;;;;;;;;;;;;;;53233:29;;53147:123;;;:::o;50438:922::-;50478:7;50498:24;50511:10;50498:12;:24::i;:::-;50535:19;50557:75;50591:7;:19;50599:10;50591:19;;;;;;;;;;;;;;;:30;;;50557:15;:19;;:75;;;;:::i;:::-;50535:97;;50643:19;50665:32;39465:6;50665:11;:15;;:32;;;;:::i;:::-;50643:54;;50710:15;50755:1;50740:11;:16;50736:302;;50783:1;50773:11;;50736:302;;;50821:1;50806:11;:16;50802:236;;50849:1;50839:11;;50802:236;;;50887:1;50872:11;:16;50868:170;;50915:1;50905:11;;50868:170;;;50953:1;50938:11;:16;50934:104;;50981:1;50971:11;;50934:104;;;51025:1;51015:11;;50934:104;50868:170;50802:236;50736:302;51050:15;51068:95;51127:25;51144:7;51127:12;;:16;;:25;;;;:::i;:::-;51068:40;51104:3;51068:7;:19;51076:10;51068:19;;;;;;;;;;;;;;;:31;;;:35;;:40;;;;:::i;:::-;:44;;:95;;;;:::i;:::-;51050:113;;51174:15;51192:94;51250:25;51267:7;51250:12;;:16;;:25;;;;:::i;:::-;51192:39;51227:3;51192:7;:19;51200:10;51192:19;;;;;;;;;;;;;;;:30;;;:34;;:39;;;;:::i;:::-;:43;;:94;;;;:::i;:::-;51174:112;;51297:11;51311:20;51323:7;51311;:11;;:20;;;;:::i;:::-;51297:34;;51349:3;51342:10;;;;;;;;50438:922;:::o;41961:106::-;19124:12;:10;:12::i;:::-;19114:22;;:6;;;;;;;;;;:22;;;19106:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;42040:19:::1;42054:4;42040:9;:13;;:19;;;;:::i;:::-;42029:8;:30;;;;41961:106:::0;:::o;42179:116::-;19124:12;:10;:12::i;:::-;19114:22;;:6;;;;;;;;;;:22;;;19106:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;42273:14:::1;42257:13;:30;;;;42179:116:::0;:::o;38714:33::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;41493:103::-;19124:12;:10;:12::i;:::-;19114:22;;:6;;;;;;;;;;:22;;;19106:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;41576:11:::1;41563:4;;:25;;;;;;;;;;;;;;;;;;41493:103:::0;:::o;49478:952::-;49527:7;49547:12;49562:15;49547:30;;49588:19;49610:207;49813:3;39465:6;49795:21;;;;:::i;:::-;49610:166;49734:40;49743:7;:19;49751:10;49743:19;;;;;;;;;;;;;;;:30;;;49734:4;:8;;:40;;;;:::i;:::-;49610:104;49700:13;;49610:71;49672:8;;49610:7;:19;49618:10;49610:19;;;;;;;;;;;;;;;:43;;;:61;;:71;;;;:::i;:::-;:89;;:104;;;;:::i;:::-;:122;;:166;;;;:::i;:::-;:184;;:207;;;;:::i;:::-;49588:229;;49828:19;49850:207;50053:3;39465:6;50035:21;;;;:::i;:::-;49850:166;49974:40;49983:7;:19;49991:10;49983:19;;;;;;;;;;;;;;;:30;;;49974:4;:8;;:40;;;;:::i;:::-;49850:104;49940:13;;49850:71;49912:8;;49850:7;:19;49858:10;49850:19;;;;;;;;;;;;;;;:43;;;:61;;:71;;;;:::i;:::-;:89;;:104;;;;:::i;:::-;:122;;:166;;;;:::i;:::-;:184;;:207;;;;:::i;:::-;49828:229;;50068:21;50092:72;50122:7;:19;50130:10;50122:19;;;;;;;;;;;;;;;:31;;;50092:11;:15;;:72;;;;:::i;:::-;50068:96;;50175:21;50199:47;50215:7;:19;50223:10;50215:19;;;;;;;;;;;;;;;:30;;;50199:11;:15;;:47;;;;:::i;:::-;50175:71;;50257:15;50275:40;50302:12;;50275:22;50293:3;50275:13;:17;;:22;;;;:::i;:::-;:26;;:40;;;;:::i;:::-;50257:58;;50326:15;50344:40;50371:12;;50344:22;50362:3;50344:13;:17;;:22;;;;:::i;:::-;:26;;:40;;;;:::i;:::-;50326:58;;50402:20;50414:7;50402;:11;;:20;;;;:::i;:::-;50395:27;;;;;;;;;49478:952;:::o;42724:1514::-;42808:6;;;;;;;;;;;42800:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;42849:18;42960:7;42915;:19;42923:10;42915:19;;;;;;;;;;;;;;;:29;;;42870:7;:19;42878:10;42870:19;;;;;;;;;;;;;;;:29;;;:74;;;;:::i;:::-;:97;;;;:::i;:::-;42849:118;;42999:3;42986:10;:16;42978:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;43035:20;;:::i;:::-;43070:7;:19;43078:10;43070:19;;;;;;;;;;;;;;;:26;;;;;;;;;;;;43066:507;;;43122:7;:19;43130:10;43122:19;;;;;;;;;;;;;;;43113:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43066:507;;;43183:27;;;;;;;;43190:4;43183:27;;;;;;43196:1;43183:27;;;;43199:1;43183:27;;;;43202:1;43183:27;;;;43205:1;43183:27;;;;43208:1;43183:27;;;43174:36;;43225:16;43247:10;43225:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43386:1;43370:18;;:4;:18;;;;:57;;;;;43417:10;43409:18;;:4;:18;;;;43370:57;:113;;;;;43481:1;43448:35;;:9;:21;43458:10;43448:21;;;;;;;;;;;;;;;;;;;;;;;;;:35;;;43370:113;43348:214;;;43542:4;43518:9;:21;43528:10;43518:21;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;43348:214;43066:507;43585:24;43612:21;43625:7;43612:8;;:12;;:21;;;;:::i;:::-;43585:48;;43644:4;;;;;;;;;;;:9;;;43654:10;43666:16;43644:39;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43798:1;43765:35;;:9;:21;43775:10;43765:21;;;;;;;;;;;;;;;;;;;;;;;;;:35;;;43761:311;;43817:17;43837:82;43901:3;43837:41;39372:1;43837:16;:20;;:41;;;;:::i;:::-;:45;;:82;;;;:::i;:::-;43817:102;;43975:85;44050:9;43975:15;:70;44009:9;:21;44019:10;44009:21;;;;;;;;;;;;;;;;;;;;;;;;;43975:70;;;;;;;;;;;;;;;;:74;;:85;;;;:::i;:::-;43934:15;:38;43950:9;:21;43960:10;43950:21;;;;;;;;;;;;;;;;;;;;;;;;;43934:38;;;;;;;;;;;;;;;:126;;;;43802:270;43761:311;44106:6;44084:7;:19;44092:10;44084:19;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44123:24;44136:10;44123:12;:24::i;:::-;44191:7;44158;:19;44166:10;44158:19;;;;;;;;;;;;;;;:29;;;:40;;;;;;;:::i;:::-;;;;;;;;44223:7;44209:10;;:21;;;;;;;:::i;:::-;;;;;;;;42789:1449;;;42724:1514;;:::o;41604:107::-;19124:12;:10;:12::i;:::-;19114:22;;:6;;;;;;;;;;:22;;;19106:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;41690:13:::1;41675:12;:28;;;;41604:107:::0;:::o;41861:92::-;19124:12;:10;:12::i;:::-;19114:22;;:6;;;;;;;;;;:22;;;19106:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;41938:7:::1;41929:6;;:16;;;;;;;;;;;;;;;;;;41861:92:::0;:::o;52298:171::-;52352:7;52372:20;52395:36;52427:3;52395:27;52408:13;;52395:8;;:12;;:27;;;;:::i;:::-;:31;;:36;;;;:::i;:::-;52372:59;;52449:12;52442:19;;;52298:171;:::o;52477:213::-;52537:7;52557:18;52578:76;52620:7;:13;52628:4;52620:13;;;;;;;;;;;;;;;:23;;;52578:7;:13;52586:4;52578:13;;;;;;;;;;;;;;;:23;;;:27;;:76;;;;:::i;:::-;52557:97;;52672:10;52665:17;;;52477:213;;;:::o;19359:281::-;19124:12;:10;:12::i;:::-;19114:22;;:6;;;;;;;;;;:22;;;19106:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;19482:1:::1;19462:22;;:8;:22;;::::0;19440:110:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;19595:8;19566:38;;19587:6;::::0;::::1;;;;;;;;19566:38;;;;;;;;;;;;19624:8;19615:6;::::0;:17:::1;;;;;;;;;;;;;;;;;;19359:281:::0;:::o;38516:32::-;;;;:::o;38480:27::-;;;;:::o;202:98::-;255:7;282:10;275:17;;202:98;:::o;17478:::-;17536:7;17567:1;17563;:5;;;;:::i;:::-;17556:12;;17478:98;;;;:::o;17584:::-;17642:7;17673:1;17669;:5;;;;:::i;:::-;17662:12;;17584:98;;;;:::o;17690:::-;17748:7;17779:1;17775;:5;;;;:::i;:::-;17768:12;;17690:98;;;;:::o;17372:::-;17430:7;17461:1;17457;:5;;;;:::i;:::-;17450:12;;17372:98;;;;:::o;47472:1175::-;47532:12;47547:15;47532:30;;47573:17;47593:7;:17;47601:8;47593:17;;;;;;;;;;;;;;;:28;;;47573:48;;47648:1;47636:9;:13;:57;;;;;39465:6;47654:19;47663:9;47654:4;:8;;:19;;;;:::i;:::-;:38;;47636:57;47632:1008;;;47710:23;47736:74;39465:6;47737:19;47746:9;47737:4;:8;;:19;;;;:::i;:::-;47736:25;;:74;;;;:::i;:::-;47710:100;;47857:330;47909:200;48105:3;47909:169;48062:15;47909:126;48021:13;;47909:85;47985:8;;47909:7;:17;47917:8;47909:17;;;;;;;;;;;;;;;:49;;;:75;;:85;;;;:::i;:::-;:111;;:126;;;;:::i;:::-;:152;;:169;;;;:::i;:::-;:195;;:200;;;;:::i;:::-;47857:7;:17;47865:8;47857:17;;;;;;;;;;;;;;;:29;;;:33;;:330;;;;:::i;:::-;47825:7;:17;47833:8;47825:17;;;;;;;;;;;;;;;:29;;:362;;;;48233:266;48284:200;48480:3;48284:169;48437:15;48284:126;48396:13;;48284:85;48360:8;;48284:7;:17;48292:8;48284:17;;;;;;;;;;;;;;;:49;;;:75;;:85;;;;:::i;:::-;:111;;:126;;;;:::i;:::-;:152;;:169;;;;:::i;:::-;:195;;:200;;;;:::i;:::-;48233:7;:17;48241:8;48233:17;;;;;;;;;;;;;;;:28;;;:32;;:266;;;;:::i;:::-;48202:7;:17;48210:8;48202:17;;;;;;;;;;;;;;;:28;;:297;;;;48545:83;48577:36;39465:6;48577:15;:19;;:36;;;;:::i;:::-;48545:9;:13;;:83;;;;:::i;:::-;48514:7;:17;48522:8;48514:17;;;;;;;;;;;;;;;:28;;:114;;;;47695:945;47632:1008;47521:1126;;47472:1175;:::o;52831:308::-;52972:51;52999:5;53006:4;53012:2;53016:6;52972:26;:51::i;:::-;53107:5;53083:48;;;53114:4;53120:2;53124:6;53083:48;;;;;;;;:::i;:::-;;;;;;;;52831:308;;;;:::o;33426:285::-;33570:133;33604:5;33647:27;;;33676:4;33682:2;33686:5;33624:68;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33570:19;:133::i;:::-;33426:285;;;;:::o;36668:802::-;37092:23;37118:106;37160:4;37118:106;;;;;;;;;;;;;;;;;37126:5;37118:27;;;;:106;;;;;:::i;:::-;37092:132;;37259:1;37239:10;:17;:21;37235:228;;;37354:10;37343:30;;;;;;;;;;;;:::i;:::-;37317:134;;;;;;;;;;;;:::i;:::-;;;;;;;;;37235:228;36738:732;36668:802;;:::o;26129:229::-;26266:12;26298:52;26320:6;26328:4;26334:1;26337:12;26298:21;:52::i;:::-;26291:59;;26129:229;;;;;:::o;27345:612::-;27515:12;27587:5;27562:21;:30;;27540:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;27670:12;27684:23;27711:6;:11;;27730:5;27751:4;27711:55;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27669:97;;;;27797:152;27842:6;27867:7;27893:10;27922:12;27797:26;:152::i;:::-;27777:172;;;;27345:612;;;;;;:::o;30480:644::-;30665:12;30694:7;30690:427;;;30743:1;30722:10;:17;:22;30718:290;;30940:18;30951:6;30940:10;:18::i;:::-;30932:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;30718:290;31029:10;31022:17;;;;30690:427;31072:33;31080:10;31092:12;31072:7;:33::i;:::-;30480:644;;;;;;;:::o;23179:326::-;23239:4;23496:1;23474:7;:19;;;:23;23467:30;;23179:326;;;:::o;31666:575::-;31870:1;31850:10;:17;:21;31846:388;;;32082:10;32076:17;32139:15;32126:10;32122:2;32118:19;32111:44;31846:388;32209:12;32202:20;;;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;88:117:1:-;197:1;194;187:12;334:77;371:7;400:5;389:16;;334:77;;;:::o;417:122::-;490:24;508:5;490:24;:::i;:::-;483:5;480:35;470:63;;529:1;526;519:12;470:63;417:122;:::o;545:139::-;591:5;629:6;616:20;607:29;;645:33;672:5;645:33;:::i;:::-;545:139;;;;:::o;690:329::-;749:6;798:2;786:9;777:7;773:23;769:32;766:119;;;804:79;;:::i;:::-;766:119;924:1;949:53;994:7;985:6;974:9;970:22;949:53;:::i;:::-;939:63;;895:117;690:329;;;;:::o;1025:118::-;1112:24;1130:5;1112:24;:::i;:::-;1107:3;1100:37;1025:118;;:::o;1149:222::-;1242:4;1280:2;1269:9;1265:18;1257:26;;1293:71;1361:1;1350:9;1346:17;1337:6;1293:71;:::i;:::-;1149:222;;;;:::o;1377:126::-;1414:7;1454:42;1447:5;1443:54;1432:65;;1377:126;;;:::o;1509:96::-;1546:7;1575:24;1593:5;1575:24;:::i;:::-;1564:35;;1509:96;;;:::o;1611:122::-;1684:24;1702:5;1684:24;:::i;:::-;1677:5;1674:35;1664:63;;1723:1;1720;1713:12;1664:63;1611:122;:::o;1739:139::-;1785:5;1823:6;1810:20;1801:29;;1839:33;1866:5;1839:33;:::i;:::-;1739:139;;;;:::o;1884:329::-;1943:6;1992:2;1980:9;1971:7;1967:23;1963:32;1960:119;;;1998:79;;:::i;:::-;1960:119;2118:1;2143:53;2188:7;2179:6;2168:9;2164:22;2143:53;:::i;:::-;2133:63;;2089:117;1884:329;;;;:::o;2219:118::-;2306:24;2324:5;2306:24;:::i;:::-;2301:3;2294:37;2219:118;;:::o;2343:222::-;2436:4;2474:2;2463:9;2459:18;2451:26;;2487:71;2555:1;2544:9;2540:17;2531:6;2487:71;:::i;:::-;2343:222;;;;:::o;2571:474::-;2639:6;2647;2696:2;2684:9;2675:7;2671:23;2667:32;2664:119;;;2702:79;;:::i;:::-;2664:119;2822:1;2847:53;2892:7;2883:6;2872:9;2868:22;2847:53;:::i;:::-;2837:63;;2793:117;2949:2;2975:53;3020:7;3011:6;3000:9;2996:22;2975:53;:::i;:::-;2965:63;;2920:118;2571:474;;;;;:::o;3051:90::-;3085:7;3128:5;3121:13;3114:21;3103:32;;3051:90;;;:::o;3147:109::-;3228:21;3243:5;3228:21;:::i;:::-;3223:3;3216:34;3147:109;;:::o;3262:210::-;3349:4;3387:2;3376:9;3372:18;3364:26;;3400:65;3462:1;3451:9;3447:17;3438:6;3400:65;:::i;:::-;3262:210;;;;:::o;3478:474::-;3546:6;3554;3603:2;3591:9;3582:7;3578:23;3574:32;3571:119;;;3609:79;;:::i;:::-;3571:119;3729:1;3754:53;3799:7;3790:6;3779:9;3775:22;3754:53;:::i;:::-;3744:63;;3700:117;3856:2;3882:53;3927:7;3918:6;3907:9;3903:22;3882:53;:::i;:::-;3872:63;;3827:118;3478:474;;;;;:::o;3958:116::-;4028:21;4043:5;4028:21;:::i;:::-;4021:5;4018:32;4008:60;;4064:1;4061;4054:12;4008:60;3958:116;:::o;4080:133::-;4123:5;4161:6;4148:20;4139:29;;4177:30;4201:5;4177:30;:::i;:::-;4080:133;;;;:::o;4219:323::-;4275:6;4324:2;4312:9;4303:7;4299:23;4295:32;4292:119;;;4330:79;;:::i;:::-;4292:119;4450:1;4475:50;4517:7;4508:6;4497:9;4493:22;4475:50;:::i;:::-;4465:60;;4421:114;4219:323;;;;:::o;4548:169::-;4632:11;4666:6;4661:3;4654:19;4706:4;4701:3;4697:14;4682:29;;4548:169;;;;:::o;4723:182::-;4863:34;4859:1;4851:6;4847:14;4840:58;4723:182;:::o;4911:366::-;5053:3;5074:67;5138:2;5133:3;5074:67;:::i;:::-;5067:74;;5150:93;5239:3;5150:93;:::i;:::-;5268:2;5263:3;5259:12;5252:19;;4911:366;;;:::o;5283:419::-;5449:4;5487:2;5476:9;5472:18;5464:26;;5536:9;5530:4;5526:20;5522:1;5511:9;5507:17;5500:47;5564:131;5690:4;5564:131;:::i;:::-;5556:139;;5283:419;;;:::o;5708:180::-;5756:77;5753:1;5746:88;5853:4;5850:1;5843:15;5877:4;5874:1;5867:15;5894:410;5934:7;5957:20;5975:1;5957:20;:::i;:::-;5952:25;;5991:20;6009:1;5991:20;:::i;:::-;5986:25;;6046:1;6043;6039:9;6068:30;6086:11;6068:30;:::i;:::-;6057:41;;6247:1;6238:7;6234:15;6231:1;6228:22;6208:1;6201:9;6181:83;6158:139;;6277:18;;:::i;:::-;6158:139;5942:362;5894:410;;;;:::o;6310:191::-;6350:3;6369:20;6387:1;6369:20;:::i;:::-;6364:25;;6403:20;6421:1;6403:20;:::i;:::-;6398:25;;6446:1;6443;6439:9;6432:16;;6467:3;6464:1;6461:10;6458:36;;;6474:18;;:::i;:::-;6458:36;6310:191;;;;:::o;6507:223::-;6647:34;6643:1;6635:6;6631:14;6624:58;6716:6;6711:2;6703:6;6699:15;6692:31;6507:223;:::o;6736:366::-;6878:3;6899:67;6963:2;6958:3;6899:67;:::i;:::-;6892:74;;6975:93;7064:3;6975:93;:::i;:::-;7093:2;7088:3;7084:12;7077:19;;6736:366;;;:::o;7108:419::-;7274:4;7312:2;7301:9;7297:18;7289:26;;7361:9;7355:4;7351:20;7347:1;7336:9;7332:17;7325:47;7389:131;7515:4;7389:131;:::i;:::-;7381:139;;7108:419;;;:::o;7533:165::-;7673:17;7669:1;7661:6;7657:14;7650:41;7533:165;:::o;7704:366::-;7846:3;7867:67;7931:2;7926:3;7867:67;:::i;:::-;7860:74;;7943:93;8032:3;7943:93;:::i;:::-;8061:2;8056:3;8052:12;8045:19;;7704:366;;;:::o;8076:419::-;8242:4;8280:2;8269:9;8265:18;8257:26;;8329:9;8323:4;8319:20;8315:1;8304:9;8300:17;8293:47;8357:131;8483:4;8357:131;:::i;:::-;8349:139;;8076:419;;;:::o;8501:194::-;8541:4;8561:20;8579:1;8561:20;:::i;:::-;8556:25;;8595:20;8613:1;8595:20;:::i;:::-;8590:25;;8639:1;8636;8632:9;8624:17;;8663:1;8657:4;8654:11;8651:37;;;8668:18;;:::i;:::-;8651:37;8501:194;;;;:::o;8701:233::-;8740:3;8763:24;8781:5;8763:24;:::i;:::-;8754:33;;8809:66;8802:5;8799:77;8796:103;;8879:18;;:::i;:::-;8796:103;8926:1;8919:5;8915:13;8908:20;;8701:233;;;:::o;8940:170::-;9080:22;9076:1;9068:6;9064:14;9057:46;8940:170;:::o;9116:366::-;9258:3;9279:67;9343:2;9338:3;9279:67;:::i;:::-;9272:74;;9355:93;9444:3;9355:93;:::i;:::-;9473:2;9468:3;9464:12;9457:19;;9116:366;;;:::o;9488:419::-;9654:4;9692:2;9681:9;9677:18;9669:26;;9741:9;9735:4;9731:20;9727:1;9716:9;9712:17;9705:47;9769:131;9895:4;9769:131;:::i;:::-;9761:139;;9488:419;;;:::o;9913:235::-;10053:34;10049:1;10041:6;10037:14;10030:58;10122:18;10117:2;10109:6;10105:15;10098:43;9913:235;:::o;10154:366::-;10296:3;10317:67;10381:2;10376:3;10317:67;:::i;:::-;10310:74;;10393:93;10482:3;10393:93;:::i;:::-;10511:2;10506:3;10502:12;10495:19;;10154:366;;;:::o;10526:419::-;10692:4;10730:2;10719:9;10715:18;10707:26;;10779:9;10773:4;10769:20;10765:1;10754:9;10750:17;10743:47;10807:131;10933:4;10807:131;:::i;:::-;10799:139;;10526:419;;;:::o;10951:332::-;11072:4;11110:2;11099:9;11095:18;11087:26;;11123:71;11191:1;11180:9;11176:17;11167:6;11123:71;:::i;:::-;11204:72;11272:2;11261:9;11257:18;11248:6;11204:72;:::i;:::-;10951:332;;;;;:::o;11289:114::-;11326:7;11366:30;11359:5;11355:42;11344:53;;11289:114;;;:::o;11409:122::-;11482:24;11500:5;11482:24;:::i;:::-;11475:5;11472:35;11462:63;;11521:1;11518;11511:12;11462:63;11409:122;:::o;11537:143::-;11594:5;11625:6;11619:13;11610:22;;11641:33;11668:5;11641:33;:::i;:::-;11537:143;;;;:::o;11686:93::-;11722:7;11762:10;11755:5;11751:22;11740:33;;11686:93;;;:::o;11785:120::-;11857:23;11874:5;11857:23;:::i;:::-;11850:5;11847:34;11837:62;;11895:1;11892;11885:12;11837:62;11785:120;:::o;11911:141::-;11967:5;11998:6;11992:13;11983:22;;12014:32;12040:5;12014:32;:::i;:::-;11911:141;;;;:::o;12058:661::-;12145:6;12153;12161;12210:2;12198:9;12189:7;12185:23;12181:32;12178:119;;;12216:79;;:::i;:::-;12178:119;12336:1;12361:64;12417:7;12408:6;12397:9;12393:22;12361:64;:::i;:::-;12351:74;;12307:128;12474:2;12500:64;12556:7;12547:6;12536:9;12532:22;12500:64;:::i;:::-;12490:74;;12445:129;12613:2;12639:63;12694:7;12685:6;12674:9;12670:22;12639:63;:::i;:::-;12629:73;;12584:128;12058:661;;;;;:::o;12725:172::-;12865:24;12861:1;12853:6;12849:14;12842:48;12725:172;:::o;12903:366::-;13045:3;13066:67;13130:2;13125:3;13066:67;:::i;:::-;13059:74;;13142:93;13231:3;13142:93;:::i;:::-;13260:2;13255:3;13251:12;13244:19;;12903:366;;;:::o;13275:419::-;13441:4;13479:2;13468:9;13464:18;13456:26;;13528:9;13522:4;13518:20;13514:1;13503:9;13499:17;13492:47;13556:131;13682:4;13556:131;:::i;:::-;13548:139;;13275:419;;;:::o;13700:180::-;13748:77;13745:1;13738:88;13845:4;13842:1;13835:15;13869:4;13866:1;13859:15;13886:185;13926:1;13943:20;13961:1;13943:20;:::i;:::-;13938:25;;13977:20;13995:1;13977:20;:::i;:::-;13972:25;;14016:1;14006:35;;14021:18;;:::i;:::-;14006:35;14063:1;14060;14056:9;14051:14;;13886:185;;;;:::o;14077:169::-;14217:21;14213:1;14205:6;14201:14;14194:45;14077:169;:::o;14252:366::-;14394:3;14415:67;14479:2;14474:3;14415:67;:::i;:::-;14408:74;;14491:93;14580:3;14491:93;:::i;:::-;14609:2;14604:3;14600:12;14593:19;;14252:366;;;:::o;14624:419::-;14790:4;14828:2;14817:9;14813:18;14805:26;;14877:9;14871:4;14867:20;14863:1;14852:9;14848:17;14841:47;14905:131;15031:4;14905:131;:::i;:::-;14897:139;;14624:419;;;:::o;15049:176::-;15189:28;15185:1;15177:6;15173:14;15166:52;15049:176;:::o;15231:366::-;15373:3;15394:67;15458:2;15453:3;15394:67;:::i;:::-;15387:74;;15470:93;15559:3;15470:93;:::i;:::-;15588:2;15583:3;15579:12;15572:19;;15231:366;;;:::o;15603:419::-;15769:4;15807:2;15796:9;15792:18;15784:26;;15856:9;15850:4;15846:20;15842:1;15831:9;15827:17;15820:47;15884:131;16010:4;15884:131;:::i;:::-;15876:139;;15603:419;;;:::o;16028:225::-;16168:34;16164:1;16156:6;16152:14;16145:58;16237:8;16232:2;16224:6;16220:15;16213:33;16028:225;:::o;16259:366::-;16401:3;16422:67;16486:2;16481:3;16422:67;:::i;:::-;16415:74;;16498:93;16587:3;16498:93;:::i;:::-;16616:2;16611:3;16607:12;16600:19;;16259:366;;;:::o;16631:419::-;16797:4;16835:2;16824:9;16820:18;16812:26;;16884:9;16878:4;16874:20;16870:1;16859:9;16855:17;16848:47;16912:131;17038:4;16912:131;:::i;:::-;16904:139;;16631:419;;;:::o;17056:442::-;17205:4;17243:2;17232:9;17228:18;17220:26;;17256:71;17324:1;17313:9;17309:17;17300:6;17256:71;:::i;:::-;17337:72;17405:2;17394:9;17390:18;17381:6;17337:72;:::i;:::-;17419;17487:2;17476:9;17472:18;17463:6;17419:72;:::i;:::-;17056:442;;;;;;:::o;17504:137::-;17558:5;17589:6;17583:13;17574:22;;17605:30;17629:5;17605:30;:::i;:::-;17504:137;;;;:::o;17647:345::-;17714:6;17763:2;17751:9;17742:7;17738:23;17734:32;17731:119;;;17769:79;;:::i;:::-;17731:119;17889:1;17914:61;17967:7;17958:6;17947:9;17943:22;17914:61;:::i;:::-;17904:71;;17860:125;17647:345;;;;:::o;17998:229::-;18138:34;18134:1;18126:6;18122:14;18115:58;18207:12;18202:2;18194:6;18190:15;18183:37;17998:229;:::o;18233:366::-;18375:3;18396:67;18460:2;18455:3;18396:67;:::i;:::-;18389:74;;18472:93;18561:3;18472:93;:::i;:::-;18590:2;18585:3;18581:12;18574:19;;18233:366;;;:::o;18605:419::-;18771:4;18809:2;18798:9;18794:18;18786:26;;18858:9;18852:4;18848:20;18844:1;18833:9;18829:17;18822:47;18886:131;19012:4;18886:131;:::i;:::-;18878:139;;18605:419;;;:::o;19030:225::-;19170:34;19166:1;19158:6;19154:14;19147:58;19239:8;19234:2;19226:6;19222:15;19215:33;19030:225;:::o;19261:366::-;19403:3;19424:67;19488:2;19483:3;19424:67;:::i;:::-;19417:74;;19500:93;19589:3;19500:93;:::i;:::-;19618:2;19613:3;19609:12;19602:19;;19261:366;;;:::o;19633:419::-;19799:4;19837:2;19826:9;19822:18;19814:26;;19886:9;19880:4;19876:20;19872:1;19861:9;19857:17;19850:47;19914:131;20040:4;19914:131;:::i;:::-;19906:139;;19633:419;;;:::o;20058:98::-;20109:6;20143:5;20137:12;20127:22;;20058:98;;;:::o;20162:147::-;20263:11;20300:3;20285:18;;20162:147;;;;:::o;20315:139::-;20404:6;20399:3;20394;20388:23;20445:1;20436:6;20431:3;20427:16;20420:27;20315:139;;;:::o;20460:386::-;20564:3;20592:38;20624:5;20592:38;:::i;:::-;20646:88;20727:6;20722:3;20646:88;:::i;:::-;20639:95;;20743:65;20801:6;20796:3;20789:4;20782:5;20778:16;20743:65;:::i;:::-;20833:6;20828:3;20824:16;20817:23;;20568:278;20460:386;;;;:::o;20852:271::-;20982:3;21004:93;21093:3;21084:6;21004:93;:::i;:::-;20997:100;;21114:3;21107:10;;20852:271;;;;:::o;21129:179::-;21269:31;21265:1;21257:6;21253:14;21246:55;21129:179;:::o;21314:366::-;21456:3;21477:67;21541:2;21536:3;21477:67;:::i;:::-;21470:74;;21553:93;21642:3;21553:93;:::i;:::-;21671:2;21666:3;21662:12;21655:19;;21314:366;;;:::o;21686:419::-;21852:4;21890:2;21879:9;21875:18;21867:26;;21939:9;21933:4;21929:20;21925:1;21914:9;21910:17;21903:47;21967:131;22093:4;21967:131;:::i;:::-;21959:139;;21686:419;;;:::o;22111:99::-;22163:6;22197:5;22191:12;22181:22;;22111:99;;;:::o;22216:102::-;22257:6;22308:2;22304:7;22299:2;22292:5;22288:14;22284:28;22274:38;;22216:102;;;:::o;22324:377::-;22412:3;22440:39;22473:5;22440:39;:::i;:::-;22495:71;22559:6;22554:3;22495:71;:::i;:::-;22488:78;;22575:65;22633:6;22628:3;22621:4;22614:5;22610:16;22575:65;:::i;:::-;22665:29;22687:6;22665:29;:::i;:::-;22660:3;22656:39;22649:46;;22416:285;22324:377;;;;:::o;22707:313::-;22820:4;22858:2;22847:9;22843:18;22835:26;;22907:9;22901:4;22897:20;22893:1;22882:9;22878:17;22871:47;22935:78;23008:4;22999:6;22935:78;:::i;:::-;22927:86;;22707:313;;;;:::o
Swarm Source
ipfs://05599912f5ec5282320917e31f97721af6d12f20815be706610cd057fb0995cd
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ Download: CSV Export ]
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.