Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 65 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Approve | 19195363 | 201 days ago | IN | 0 ETH | 0.00179202 | ||||
Approve | 19190387 | 202 days ago | IN | 0 ETH | 0.00404187 | ||||
Approve | 19190356 | 202 days ago | IN | 0 ETH | 0.00413726 | ||||
Approve | 19190339 | 202 days ago | IN | 0 ETH | 0.00420143 | ||||
Revoke Ownership | 19190338 | 202 days ago | IN | 0 ETH | 0.00175309 | ||||
Approve | 19190336 | 202 days ago | IN | 0 ETH | 0.00374993 | ||||
Approve | 19190317 | 202 days ago | IN | 0 ETH | 0.00359646 | ||||
Approve | 19190311 | 202 days ago | IN | 0 ETH | 0.00369456 | ||||
Approve | 19190310 | 202 days ago | IN | 0 ETH | 0.00360124 | ||||
Approve | 19190309 | 202 days ago | IN | 0 ETH | 0.00342135 | ||||
Approve | 19190308 | 202 days ago | IN | 0 ETH | 0.0020594 | ||||
Approve | 19190308 | 202 days ago | IN | 0 ETH | 0.00197993 | ||||
Approve | 19190307 | 202 days ago | IN | 0 ETH | 0.00388828 | ||||
Approve | 19190305 | 202 days ago | IN | 0 ETH | 0.00374138 | ||||
Approve | 19190304 | 202 days ago | IN | 0 ETH | 0.00385095 | ||||
Approve | 19190302 | 202 days ago | IN | 0 ETH | 0.00433748 | ||||
Approve | 19190301 | 202 days ago | IN | 0 ETH | 0.00440852 | ||||
Approve | 19190300 | 202 days ago | IN | 0 ETH | 0.00389615 | ||||
Approve | 19190299 | 202 days ago | IN | 0 ETH | 0.00423339 | ||||
Approve | 19190299 | 202 days ago | IN | 0 ETH | 0.00433187 | ||||
Approve | 19190298 | 202 days ago | IN | 0 ETH | 0.00400532 | ||||
Approve | 19190295 | 202 days ago | IN | 0 ETH | 0.00405682 | ||||
Approve | 19190295 | 202 days ago | IN | 0 ETH | 0.00419987 | ||||
Approve | 19190294 | 202 days ago | IN | 0 ETH | 0.00473532 | ||||
Approve | 19190294 | 202 days ago | IN | 0 ETH | 0.00488304 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
SQUID404
Compiler Version
v0.8.24+commit.e11b9ed9
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-02-09 */ // SPDX-License-Identifier: MIT /* #SQUID404 First squid protocol powered by ERC-404 experimental token standard. LaunchTime: 11:30 UTC February 9 today liquidity: 95% + 10 ETH DEV Twitter: https://x.com/cryptoprolegend/status/1755904738862719012?s=20 (with 1.2M followers) Twitter: https://twitter.com/SQUID_ERC404 Website: https://squid404.com/ */ pragma solidity ^0.8.24; interface Callable { function tokenCallback(address _from, uint256 _tokens, bytes calldata _data) external returns (bool); } interface ERC20Interface { function balanceOf(address) external view returns (uint256); function allowance(address, address) external view returns (uint256); function transfer(address, uint256) external returns (bool); function transferFrom(address, address, uint256) external returns (bool); } pragma solidity ^0.8.20; /** * @dev Standard signed math utilities missing in the Solidity language. */ library SignedMath { /** * @dev Returns the largest of two signed numbers. */ function max(int256 a, int256 b) internal pure returns (int256) { return a > b ? a : b; } /** * @dev Returns the smallest of two signed numbers. */ function min(int256 a, int256 b) internal pure returns (int256) { return a < b ? a : b; } /** * @dev Returns the average of two signed numbers without overflow. * The result is rounded towards zero. */ function average(int256 a, int256 b) internal pure returns (int256) { // Formula from the book "Hacker's Delight" int256 x = (a & b) + ((a ^ b) >> 1); return x + (int256(uint256(x) >> 255) & (a ^ b)); } /** * @dev Returns the absolute unsigned value of a signed value. */ function abs(int256 n) internal pure returns (uint256) { unchecked { // must be unchecked in order to support `n = type(int256).min` return uint256(n >= 0 ? n : -n); } } } /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Muldiv operation overflow. */ error MathOverflowedMulDiv(); enum Rounding { Floor, // Toward negative infinity Ceil, // Toward positive infinity Trunc, // Toward zero Expand // Away from zero } /** * @dev Returns the addition of two unsigned integers, with an overflow flag. */ 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); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds towards infinity instead * of rounding towards zero. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { if (b == 0) { // Guarantee the same behavior as in a regular Solidity division. return a / b; } // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or * denominator == 0. * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by * Uniswap Labs also under MIT license. */ function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0 = x * y; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { // Solidity will revert if denominator == 0, unlike the div opcode on its own. // The surrounding unchecked block does not change this fact. // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. if (denominator <= prod1) { revert MathOverflowedMulDiv(); } /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. // Always >= 1. See https://cs.stackexchange.com/q/138556/92363. uint256 twos = denominator & (0 - denominator); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also // works in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded * towards zero. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (unsignedRoundsUp(rounding) && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2 of a positive value rounded towards zero. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (unsignedRoundsUp(rounding) && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10 of a positive value rounded towards zero. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10 ** 64) { value /= 10 ** 64; result += 64; } if (value >= 10 ** 32) { value /= 10 ** 32; result += 32; } if (value >= 10 ** 16) { value /= 10 ** 16; result += 16; } if (value >= 10 ** 8) { value /= 10 ** 8; result += 8; } if (value >= 10 ** 4) { value /= 10 ** 4; result += 4; } if (value >= 10 ** 2) { value /= 10 ** 2; result += 2; } if (value >= 10 ** 1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (unsignedRoundsUp(rounding) && 10 ** result < value ? 1 : 0); } } /** * @dev Return the log in base 256 of a positive value rounded towards zero. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 256, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (unsignedRoundsUp(rounding) && 1 << (result << 3) < value ? 1 : 0); } } /** * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers. */ function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) { return uint8(rounding) % 2 == 1; } } /** * @dev String operations. */ library Strings { bytes16 private constant HEX_DIGITS = "0123456789abcdef"; uint8 private constant ADDRESS_LENGTH = 20; /** * @dev The `value` string doesn't fit in the specified `length`. */ error StringsInsufficientHexLength(uint256 value, uint256 length); /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), HEX_DIGITS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `int256` to its ASCII `string` decimal representation. */ function toStringSigned(int256 value) internal pure returns (string memory) { return string.concat(value < 0 ? "-" : "", toString(SignedMath.abs(value))); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { uint256 localValue = value; bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = HEX_DIGITS[localValue & 0xf]; localValue >>= 4; } if (localValue != 0) { revert StringsInsufficientHexLength(value, length); } return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal * representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), ADDRESS_LENGTH); } /** * @dev Returns true if the two strings are equal. */ function equal(string memory a, string memory b) internal pure returns (bool) { return bytes(a).length == bytes(b).length && keccak256(bytes(a)) == keccak256(bytes(b)); } } abstract contract Ownable { event OwnershipTransferred(address indexed user, address indexed newOwner); error Unauthorized(); error InvalidOwner(); address public owner; modifier onlyOwner() virtual { if (msg.sender != owner) revert Unauthorized(); _; } constructor(address _owner) { if (_owner == address(0)) revert InvalidOwner(); owner = _owner; emit OwnershipTransferred(address(0), _owner); } function transferOwnership(address _owner) public virtual onlyOwner { if (_owner == address(0)) revert InvalidOwner(); owner = _owner; emit OwnershipTransferred(msg.sender, _owner); } function revokeOwnership() public virtual onlyOwner { owner = address(0); emit OwnershipTransferred(msg.sender, address(0)); } } abstract contract ERC721Receiver { function onERC721Received( address, address, uint256, bytes calldata ) external virtual returns (bytes4) { return ERC721Receiver.onERC721Received.selector; } } /// @notice ERC404 /// A gas-efficient, mixed ERC20 / ERC721 implementation /// with native liquidity and fractionalization. /// /// This is an experimental standard designed to integrate /// with pre-existing ERC20 / ERC721 support as smoothly as /// possible. /// /// @dev In order to support full functionality of ERC20 and ERC721 /// supply assumptions are made that slightly constraint usage. /// Ensure decimals are sufficiently large (standard 18 recommended) /// as ids are effectively encoded in the lowest range of amounts. /// /// NFTs are spent on ERC20 functions in a FILO queue, this is by /// design. /// abstract contract ERC404 is Ownable { // Events event ERC20Transfer( address indexed from, address indexed to, uint256 amount ); event Approval( address indexed owner, address indexed spender, uint256 amount ); event Transfer( address indexed from, address indexed to, uint256 indexed id ); event ERC721Approval( address indexed owner, address indexed spender, uint256 indexed id ); event ApprovalForAll( address indexed owner, address indexed operator, bool approved ); // Errors error NotFound(); error AlreadyExists(); error InvalidRecipient(); error InvalidSender(); error UnsafeRecipient(); // Metadata /// @dev Token name string public name; /// @dev Token symbol string public symbol; /// @dev Decimals for fractional representation uint8 public immutable decimals; /// @dev Total supply in fractionalized representation uint256 public immutable totalSupply; /// @dev Current mint counter, monotonically increasing to ensure accurate ownership uint256 public minted; // Mappings /// @dev Balance of user in fractional representation mapping(address => uint256) public balanceOf; /// @dev Allowance of user in fractional representation mapping(address => mapping(address => uint256)) public allowance; /// @dev Approval in native representaion mapping(uint256 => address) public getApproved; /// @dev Approval for all in native representation mapping(address => mapping(address => bool)) public isApprovedForAll; /// @dev Owner of id in native representation mapping(uint256 => address) internal _ownerOf; /// @dev Array of owned ids in native representation mapping(address => uint256[]) private _owned; function getLastOwnedTokenId(address owner) internal view returns (uint256) { require(_owned[owner].length > 0, "Owner has no tokens"); return _owned[owner][_owned[owner].length - 1]; } function getOwnedTokens(address owner) internal view returns(uint[] memory){ return _owned[owner]; } /// @dev Tracks indices for the _owned mapping mapping(uint256 => uint256) internal _ownedIndex; /// @dev Addresses whitelisted from minting / burning for gas savings (pairs, routers, etc) mapping(address => bool) public whitelist; // Constructor constructor( string memory _name, string memory _symbol, uint8 _decimals, uint256 _totalNativeSupply, address _owner ) Ownable(_owner) { name = _name; symbol = _symbol; decimals = _decimals; totalSupply = _totalNativeSupply * (10 ** decimals); setWhitelist(_owner,true); } /// @notice Initialization function to set pairs / etc /// saving gas by avoiding mint / burn on unnecessary targets function setWhitelist(address target, bool state) public onlyOwner { whitelist[target] = state; } /// @notice Allows a user to ignore gas cost of NFT transfers permanently. function setWhitelist() public { if(balanceOf[msg.sender]==0) whitelist[msg.sender] = true; } /// @notice Function to find owner of a given native token function ownerOf(uint256 id) public view virtual returns (address owner) { owner = _ownerOf[id]; if (owner == address(0)) { revert NotFound(); } } /// @notice tokenURI must be implemented by child contract function tokenURI(uint256 id) public view virtual returns (string memory); /// @notice Function for token approvals /// @dev This function assumes id / native if amount less than or equal to current max id function approve( address spender, uint256 amountOrId ) public virtual returns (bool) { if (amountOrId <= minted && amountOrId > 0) { address owner = _ownerOf[amountOrId]; if (msg.sender != owner && !isApprovedForAll[owner][msg.sender]) { revert Unauthorized(); } getApproved[amountOrId] = spender; emit Approval(owner, spender, amountOrId); } else { allowance[msg.sender][spender] = amountOrId; emit Approval(msg.sender, spender, amountOrId); } return true; } /// @notice Function native approvals function setApprovalForAll(address operator, bool approved) public virtual { isApprovedForAll[msg.sender][operator] = approved; emit ApprovalForAll(msg.sender, operator, approved); } /// @notice Function for mixed transfers /// @dev This function assumes id / native if amount less than or equal to current max id function transferFrom( address from, address to, uint256 amountOrId ) public virtual { if (amountOrId <= minted) { if (from != _ownerOf[amountOrId]) { revert InvalidSender(); } if (to == address(0)) { revert InvalidRecipient(); } if ( msg.sender != from && !isApprovedForAll[from][msg.sender] && msg.sender != getApproved[amountOrId] ) { revert Unauthorized(); } balanceOf[from] -= _getUnit(); unchecked { balanceOf[to] += _getUnit(); } _ownerOf[amountOrId] = to; delete getApproved[amountOrId]; // update _owned for sender uint256 updatedId = _owned[from][_owned[from].length - 1]; _owned[from][_ownedIndex[amountOrId]] = updatedId; // pop _owned[from].pop(); // update index for the moved id _ownedIndex[updatedId] = _ownedIndex[amountOrId]; // push token to to owned _owned[to].push(amountOrId); // update index for to owned _ownedIndex[amountOrId] = _owned[to].length - 1; emit Transfer(from, to, amountOrId); emit ERC20Transfer(from, to, _getUnit()); } else { uint256 allowed = allowance[from][msg.sender]; if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amountOrId; _transfer(from, to, amountOrId); } } /// @notice Function for fractional transfers function transfer( address to, uint256 amount ) public virtual returns (bool) { return _transfer(msg.sender, to, amount); } /// @notice Function for native transfers with contract support function safeTransferFrom( address from, address to, uint256 id ) public virtual { transferFrom(from, to, id); if ( to.code.length != 0 && ERC721Receiver(to).onERC721Received(msg.sender, from, id, "") != ERC721Receiver.onERC721Received.selector ) { revert UnsafeRecipient(); } } /// @notice Function for native transfers with contract support and callback data function safeTransferFrom( address from, address to, uint256 id, bytes calldata data ) public virtual { transferFrom(from, to, id); if ( to.code.length != 0 && ERC721Receiver(to).onERC721Received(msg.sender, from, id, data) != ERC721Receiver.onERC721Received.selector ) { revert UnsafeRecipient(); } } /// @notice Internal function for fractional transfers function _transfer( address from, address to, uint256 amount ) internal returns (bool) { uint256 unit = _getUnit(); uint256 balanceBeforeSender = balanceOf[from]; uint256 balanceBeforeReceiver = balanceOf[to]; balanceOf[from] -= amount; unchecked { balanceOf[to] += amount; } // Skip burn for certain addresses to save gas if (!whitelist[from]) { uint256 tokens_to_burn = (balanceBeforeSender / unit) - (balanceOf[from] / unit); for (uint256 i = 0; i < tokens_to_burn; i++) { _burn(from); } } // Skip minting for certain addresses to save gas if (!whitelist[to]) { uint256 tokens_to_mint = (balanceOf[to] / unit) - (balanceBeforeReceiver / unit); for (uint256 i = 0; i < tokens_to_mint; i++) { _mint(to); } } emit ERC20Transfer(from, to, amount); return true; } // Internal utility logic function _getUnit() internal view returns (uint256) { return 10 ** decimals; } function _mint(address to) internal virtual { if (to == address(0)) { revert InvalidRecipient(); } unchecked { minted++; } uint256 id = minted; if (_ownerOf[id] != address(0)) { revert AlreadyExists(); } _ownerOf[id] = to; _owned[to].push(id); _ownedIndex[id] = _owned[to].length - 1; emit Transfer(address(0), to, id); } function _burn(address from) internal virtual { if (from == address(0)) { revert InvalidSender(); } uint256 id = _owned[from][_owned[from].length - 1]; _owned[from].pop(); delete _ownedIndex[id]; delete _ownerOf[id]; delete getApproved[id]; emit Transfer(from, address(0), id); } function _setNameSymbol( string memory _name, string memory _symbol ) internal { name = _name; symbol = _symbol; } } contract SQUID404 is ERC404 { string public dataURI; string public baseTokenURI; uint deckSize = 100; constructor() ERC404("SQUID404", "SQUID404", 18, deckSize, msg.sender) { balanceOf[msg.sender] = deckSize * 10 ** 18; } function setDataURI(string memory _dataURI) public onlyOwner { dataURI = _dataURI; } function setTokenURI(string memory _tokenURI) public onlyOwner { baseTokenURI = _tokenURI; } function setNameSymbol( string memory _name, string memory _symbol ) public onlyOwner { _setNameSymbol(_name, _symbol); } uint slots = deckSize; mapping(uint=>uint) slot; mapping(uint=>bool) usedSlot; mapping(uint=>uint) public card_used_by_ID; event MintExtended(address indexed to, uint indexed card); function _mint(address to) internal override { super._mint(to); uint id = this.minted(); uint slotID = uint(keccak256(abi.encodePacked(id,blockhash(block.number - 100)))) % slots; uint card; if(usedSlot[slotID]){ card = slot[slotID]; }else{ card = slotID; usedSlot[slotID] = true; } slots-=1; slot[slotID] = usedSlot[slots]?slot[slots]:slots; usedSlot[slots] = true; card_used_by_ID[id] = card; emit MintExtended(to,card); } function _burn(address from) internal override { uint id = getLastOwnedTokenId(from); slot[slots] = card_used_by_ID[id]; slots+=1; super._burn(from); } function deck()public view returns(uint[] memory slot_cardIDs,bool[] memory slotsUsed){ slot_cardIDs = new uint[](slots); slotsUsed = new bool[](slots); for(uint i;i<slots;i++){ slot_cardIDs[i] = usedSlot[i]?slot[i]:i; slotsUsed[i] = usedSlot[i]; } } function tokenURI(uint256 id) public view override returns (string memory) { if (bytes(baseTokenURI).length > 0) { return string.concat(baseTokenURI, Strings.toString(card_used_by_ID[id]) ); } else { return string.concat( "data:application/json;utf8,", json(id) ); } } function json(uint256 id) public view returns(string memory){ uint cardID = card_used_by_ID[id]; string memory _cardID = Strings.toString( cardID ); string[] memory attributes = new string[](20); attributes[0] = "Strength"; attributes[1] = "Dexterity"; attributes[2] = "Constitution"; attributes[3] = "Intelligence"; attributes[4] = "Wisdom"; attributes[5] = "Charisma"; attributes[6] = "Speed"; attributes[7] = "Luck"; attributes[8] = "Armor Class"; attributes[9] = "Hit Points"; attributes[10] = "Courage"; attributes[11] = "Moral Alignment"; attributes[12] = "Ambition"; attributes[13] = "Sense of Humor"; attributes[14] = "Loyalty"; attributes[15] = "Adventurousness"; attributes[16] = "Discipline"; attributes[17] = "Curiosity"; attributes[18] = "Resilience"; attributes[19] = "Creativity"; string memory attrString = ''; string memory _str = ''; string memory _str2 = ''; string memory _str3 = ''; uint stat; uint batchBonus; // Iterate through the attributes array and concatenate two strings at a time for (uint256 i = 0; i < attributes.length; i += 1){ //Batch Bonus & Rare stat rolls batchBonus = Math.sqrt(uint(keccak256(abi.encodePacked( "Never Gonna Give You Up",cardID,i)))% (cardID<339?80000:160000)); stat = 20 - Math.sqrt(uint(keccak256(abi.encodePacked( "Decentralized Public Infrastructure."/*rng seed*/, cardID/*unique to each card in deck*/, i/*to differentiate on each attribute*/))) % (400-batchBonus) ); _str = string.concat(i==0?'':',', '{"trait_type":"'); _str2 = string.concat(attributes[i], '","value":'); _str3 = string.concat( Strings.toString(stat), '}'); attrString = string.concat(attrString, string.concat(_str, string.concat(_str2, _str3) ) ); } string memory jsonPreImage = string.concat( string.concat( string.concat('{"name": "Anon #', string.concat( _cardID, string.concat('", "id":', Strings.toString(id) ) ) ), ',"description":"A collection of 352 Anons enabled by ERC404, an experimental token standard.","external_url":"https://anonethereum.com","image":"' ), string.concat(dataURI, _cardID) ); string memory jsonPostImage = string.concat( '.mp4","attributes":[',attrString ); jsonPostImage = string.concat( jsonPostImage, ']}' ); return string.concat(jsonPreImage,jsonPostImage); } function gallery(address addr) public view returns(string memory galleryJson ){ galleryJson = '['; uint[] memory IDs = getOwnedTokens(addr); for(uint i;i<IDs.length;i++){ galleryJson = string.concat(galleryJson,json(IDs[i]) ); if(i!=IDs.length-1){ galleryJson = string.concat(galleryJson,','); } } galleryJson = string.concat(galleryJson,']'); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyExists","type":"error"},{"inputs":[],"name":"InvalidOwner","type":"error"},{"inputs":[],"name":"InvalidRecipient","type":"error"},{"inputs":[],"name":"InvalidSender","type":"error"},{"inputs":[],"name":"NotFound","type":"error"},{"inputs":[],"name":"Unauthorized","type":"error"},{"inputs":[],"name":"UnsafeRecipient","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"ERC721Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"card","type":"uint256"}],"name":"MintExtended","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amountOrId","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"card_used_by_ID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dataURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deck","outputs":[{"internalType":"uint256[]","name":"slot_cardIDs","type":"uint256[]"},{"internalType":"bool[]","name":"slotsUsed","type":"bool[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"gallery","outputs":[{"internalType":"string","name":"galleryJson","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"json","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"revokeOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_dataURI","type":"string"}],"name":"setDataURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"}],"name":"setNameSymbol","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_tokenURI","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bool","name":"state","type":"bool"}],"name":"setWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amountOrId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60c06040526064600e55600e54600f553480156200001b575f80fd5b506040518060400160405280600881526020017f53515549443430340000000000000000000000000000000000000000000000008152506040518060400160405280600881526020017f53515549443430340000000000000000000000000000000000000000000000008152506012600e5433805f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620000f5576040517f49e27cff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3508460019081620001a091906200059e565b508360029081620001b291906200059e565b508260ff1660808160ff1681525050608051600a620001d291906200080b565b82620001df91906200085b565b60a08181525050620001f98160016200025d60201b60201c565b5050505050670de0b6b3a7640000600e546200021691906200085b565b60045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550620008a5565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614620002e2576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600b5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680620003b657607f821691505b602082108103620003cc57620003cb62000371565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302620004307fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620003f3565b6200043c8683620003f3565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f62000486620004806200047a8462000454565b6200045d565b62000454565b9050919050565b5f819050919050565b620004a18362000466565b620004b9620004b0826200048d565b848454620003ff565b825550505050565b5f90565b620004cf620004c1565b620004dc81848462000496565b505050565b5b818110156200050357620004f75f82620004c5565b600181019050620004e2565b5050565b601f82111562000552576200051c81620003d2565b6200052784620003e4565b8101602085101562000537578190505b6200054f6200054685620003e4565b830182620004e1565b50505b505050565b5f82821c905092915050565b5f620005745f198460080262000557565b1980831691505092915050565b5f6200058e838362000563565b9150826002028217905092915050565b620005a9826200033a565b67ffffffffffffffff811115620005c557620005c462000344565b5b620005d182546200039e565b620005de82828562000507565b5f60209050601f83116001811462000614575f8415620005ff578287015190505b6200060b858262000581565b8655506200067a565b601f1984166200062486620003d2565b5f5b828110156200064d5784890151825560018201915060208501945060208101905062000626565b868310156200066d578489015162000669601f89168262000563565b8355505b6001600288020188555050505b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f8160011c9050919050565b5f808291508390505b60018511156200070c57808604811115620006e457620006e362000682565b5b6001851615620006f45780820291505b80810290506200070485620006af565b9450620006c4565b94509492505050565b5f82620007265760019050620007f8565b8162000735575f9050620007f8565b81600181146200074e576002811462000759576200078f565b6001915050620007f8565b60ff8411156200076e576200076d62000682565b5b8360020a91508482111562000788576200078762000682565b5b50620007f8565b5060208310610133831016604e8410600b8410161715620007c95782820a905083811115620007c357620007c262000682565b5b620007f8565b620007d88484846001620006bb565b92509050818404811115620007f257620007f162000682565b5b81810290505b9392505050565b5f60ff82169050919050565b5f620008178262000454565b91506200082483620007ff565b9250620008537fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000715565b905092915050565b5f620008678262000454565b9150620008748362000454565b9250828202620008848162000454565b915082820484148315176200089e576200089d62000682565b5b5092915050565b60805160a05161534d620008ce5f395f6109f601525f81816113c70152612c20015261534d5ff3fe608060405234801561000f575f80fd5b50600436106101ee575f3560e01c80638da5cb5b1161010d578063c87b56dd116100a0578063e0df5b6f1161006f578063e0df5b6f146105cb578063e985e9c5146105e7578063f28ca1dd14610617578063f2fde38b14610635576101ee565b8063c87b56dd1461051d578063d547cfb71461054d578063d57d56af1461056b578063dd62ed3e1461059b576101ee565b8063a22cb465116100dc578063a22cb465146104ab578063a9059cbb146104c7578063b88d4fde146104f7578063b923b20514610513576101ee565b80638da5cb5b1461040f5780638ed8d0321461042d57806395d89b411461045d5780639b19251a1461047b576101ee565b806342842e0e116101855780636352211e116101545780636352211e1461036057806365c3175b1461039057806370a08231146103af57806374e18e96146103df576101ee565b806342842e0e146102ee5780634f02c4201461030a578063504334c21461032857806353d6fd5914610344576101ee565b806318d217c3116101c157806318d217c31461028e57806323b872dd146102aa5780632b968958146102c6578063313ce567146102d0576101ee565b806306fdde03146101f2578063081812fc14610210578063095ea7b31461024057806318160ddd14610270575b5f80fd5b6101fa610651565b6040516102079190613d4a565b60405180910390f35b61022a60048036038101906102259190613dae565b6106dd565b6040516102379190613e18565b60405180910390f35b61025a60048036038101906102559190613e5b565b61070d565b6040516102679190613eb3565b60405180910390f35b6102786109f4565b6040516102859190613edb565b60405180910390f35b6102a860048036038101906102a39190614020565b610a18565b005b6102c460048036038101906102bf9190614067565b610aaf565b005b6102ce6112a6565b005b6102d86113c5565b6040516102e591906140d2565b60405180910390f35b61030860048036038101906103039190614067565b6113e9565b005b610312611518565b60405161031f9190613edb565b60405180910390f35b610342600480360381019061033d91906140eb565b61151e565b005b61035e6004803603810190610359919061418b565b6115b0565b005b61037a60048036038101906103759190613dae565b61168c565b6040516103879190613e18565b60405180910390f35b61039861172a565b6040516103a6929190614337565b60405180910390f35b6103c960048036038101906103c4919061436c565b611882565b6040516103d69190613edb565b60405180910390f35b6103f960048036038101906103f49190613dae565b611897565b6040516104069190613d4a565b60405180910390f35b610417612352565b6040516104249190613e18565b60405180910390f35b61044760048036038101906104429190613dae565b612375565b6040516104549190613edb565b60405180910390f35b61046561238a565b6040516104729190613d4a565b60405180910390f35b6104956004803603810190610490919061436c565b612416565b6040516104a29190613eb3565b60405180910390f35b6104c560048036038101906104c0919061418b565b612433565b005b6104e160048036038101906104dc9190613e5b565b61252b565b6040516104ee9190613eb3565b60405180910390f35b610511600480360381019061050c91906143f4565b61253f565b005b61051b612674565b005b61053760048036038101906105329190613dae565b612710565b6040516105449190613d4a565b60405180910390f35b61055561279b565b6040516105629190613d4a565b60405180910390f35b6105856004803603810190610580919061436c565b612827565b6040516105929190613d4a565b60405180910390f35b6105b560048036038101906105b09190614478565b61292b565b6040516105c29190613edb565b60405180910390f35b6105e560048036038101906105e09190614020565b61294b565b005b61060160048036038101906105fc9190614478565b6129e2565b60405161060e9190613eb3565b60405180910390f35b61061f612a0c565b60405161062c9190613d4a565b60405180910390f35b61064f600480360381019061064a919061436c565b612a98565b005b6001805461065e906144e3565b80601f016020809104026020016040519081016040528092919081815260200182805461068a906144e3565b80156106d55780601f106106ac576101008083540402835291602001916106d5565b820191905f5260205f20905b8154815290600101906020018083116106b857829003601f168201915b505050505081565b6006602052805f5260405f205f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f600354821115801561071f57505f82115b15610907575f60085f8481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015610816575060075f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b1561084d576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8360065f8581526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925856040516108f99190613edb565b60405180910390a3506109ea565b8160055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516109e19190613edb565b60405180910390a35b6001905092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a9c576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600c9081610aab91906146b0565b5050565b60035481116111675760085f8281526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614610b4d576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610bb2576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015610c70575060075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b8015610cd8575060065f8281526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b15610d0f576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d17612c1d565b60045f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610d6291906147ac565b92505081905550610d71612c1d565b60045f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508160085f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060065f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555f60095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600160095f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2080549050610ec791906147ac565b81548110610ed857610ed76147df565b5b905f5260205f20015490508060095f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600a5f8581526020019081526020015f205481548110610f4457610f436147df565b5b905f5260205f20018190555060095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805480610f9d57610f9c61480c565b5b600190038181905f5260205f20015f90559055600a5f8381526020019081526020015f2054600a5f8381526020019081526020015f208190555060095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2082908060018154018082558091505060019003905f5260205f20015f9091909190915055600160095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208054905061108591906147ac565b600a5f8481526020019081526020015f2081905550818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e03148761114c612c1d565b6040516111599190613edb565b60405180910390a3506112a1565b5f60055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461129357818161121691906147ac565b60055f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b61129e848484612c50565b50505b505050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461132a576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3565b7f000000000000000000000000000000000000000000000000000000000000000081565b6113f4838383610aaf565b5f8273ffffffffffffffffffffffffffffffffffffffff163b141580156114dc575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168273ffffffffffffffffffffffffffffffffffffffff1663150b7a023386856040518463ffffffff1660e01b815260040161147a9392919061486c565b6020604051808303815f875af1158015611496573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114ba9190614909565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614155b15611513576040517f3da6393100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b60035481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146115a2576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6115ac8282612f94565b5050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611634576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600b5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b5f60085f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611725576040517fc5723b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b606080600f5467ffffffffffffffff81111561174957611748613efc565b5b6040519080825280602002602001820160405280156117775781602001602082028036833780820191505090505b509150600f5467ffffffffffffffff81111561179657611795613efc565b5b6040519080825280602002602001820160405280156117c45781602001602082028036833780820191505090505b5090505f5b600f5481101561187d5760115f8281526020019081526020015f205f9054906101000a900460ff166117fb578061180e565b60105f8281526020019081526020015f20545b838281518110611821576118206147df565b5b60200260200101818152505060115f8281526020019081526020015f205f9054906101000a900460ff1682828151811061185e5761185d6147df565b5b60200260200101901515908115158152505080806001019150506117c9565b509091565b6004602052805f5260405f205f915090505481565b60605f60125f8481526020019081526020015f205490505f6118b882612fb8565b90505f601467ffffffffffffffff8111156118d6576118d5613efc565b5b60405190808252806020026020018201604052801561190957816020015b60608152602001906001900390816118f45790505b5090506040518060400160405280600881526020017f537472656e677468000000000000000000000000000000000000000000000000815250815f81518110611955576119546147df565b5b60200260200101819052506040518060400160405280600981526020017f4465787465726974790000000000000000000000000000000000000000000000815250816001815181106119aa576119a96147df565b5b60200260200101819052506040518060400160405280600c81526020017f436f6e737469747574696f6e0000000000000000000000000000000000000000815250816002815181106119ff576119fe6147df565b5b60200260200101819052506040518060400160405280600c81526020017f496e74656c6c6967656e6365000000000000000000000000000000000000000081525081600381518110611a5457611a536147df565b5b60200260200101819052506040518060400160405280600681526020017f576973646f6d000000000000000000000000000000000000000000000000000081525081600481518110611aa957611aa86147df565b5b60200260200101819052506040518060400160405280600881526020017f4368617269736d6100000000000000000000000000000000000000000000000081525081600581518110611afe57611afd6147df565b5b60200260200101819052506040518060400160405280600581526020017f537065656400000000000000000000000000000000000000000000000000000081525081600681518110611b5357611b526147df565b5b60200260200101819052506040518060400160405280600481526020017f4c75636b0000000000000000000000000000000000000000000000000000000081525081600781518110611ba857611ba76147df565b5b60200260200101819052506040518060400160405280600b81526020017f41726d6f7220436c61737300000000000000000000000000000000000000000081525081600881518110611bfd57611bfc6147df565b5b60200260200101819052506040518060400160405280600a81526020017f48697420506f696e74730000000000000000000000000000000000000000000081525081600981518110611c5257611c516147df565b5b60200260200101819052506040518060400160405280600781526020017f436f75726167650000000000000000000000000000000000000000000000000081525081600a81518110611ca757611ca66147df565b5b60200260200101819052506040518060400160405280600f81526020017f4d6f72616c20416c69676e6d656e74000000000000000000000000000000000081525081600b81518110611cfc57611cfb6147df565b5b60200260200101819052506040518060400160405280600881526020017f416d626974696f6e00000000000000000000000000000000000000000000000081525081600c81518110611d5157611d506147df565b5b60200260200101819052506040518060400160405280600e81526020017f53656e7365206f662048756d6f7200000000000000000000000000000000000081525081600d81518110611da657611da56147df565b5b60200260200101819052506040518060400160405280600781526020017f4c6f79616c74790000000000000000000000000000000000000000000000000081525081600e81518110611dfb57611dfa6147df565b5b60200260200101819052506040518060400160405280600f81526020017f416476656e7475726f75736e657373000000000000000000000000000000000081525081600f81518110611e5057611e4f6147df565b5b60200260200101819052506040518060400160405280600a81526020017f4469736369706c696e650000000000000000000000000000000000000000000081525081601081518110611ea557611ea46147df565b5b60200260200101819052506040518060400160405280600981526020017f437572696f73697479000000000000000000000000000000000000000000000081525081601181518110611efa57611ef96147df565b5b60200260200101819052506040518060400160405280600a81526020017f526573696c69656e63650000000000000000000000000000000000000000000081525081601281518110611f4f57611f4e6147df565b5b60200260200101819052506040518060400160405280600a81526020017f437265617469766974790000000000000000000000000000000000000000000081525081601381518110611fa457611fa36147df565b5b60200260200101819052505f60405180602001604052805f81525090505f60405180602001604052805f81525090505f60405180602001604052805f81525090505f60405180602001604052805f81525090505f805f5b875181101561220b5761205d6101538b10612019576202710061201e565b620138805b62ffffff168b836040516020016120369291906149a8565b604051602081830303815290604052805190602001205f1c6120589190614a0b565b613082565b91506120aa8261019061207091906147ac565b8b83604051602001612083929190614aab565b604051602081830303815290604052805190602001205f1c6120a59190614a0b565b613082565b60146120b691906147ac565b92505f81146120fa576040518060400160405280600181526020017f2c0000000000000000000000000000000000000000000000000000000000000081525061210a565b60405180602001604052805f8152505b60405160200161211a9190614b37565b604051602081830303815290604052955087818151811061213e5761213d6147df565b5b60200260200101516040516020016121569190614b82565b604051602081830303815290604052945061217083612fb8565b6040516020016121809190614bcd565b6040516020818303038152906040529350868686866040516020016121a6929190614bf2565b6040516020818303038152906040526040516020016121c6929190614bf2565b6040516020818303038152906040526040516020016121e6929190614bf2565b60405160208183030381529060405296506001816122049190614c15565b9050611ffb565b505f886122178d612fb8565b6040516020016122279190614c6e565b604051602081830303815290604052604051602001612247929190614bf2565b6040516020818303038152906040526040516020016122669190614cb9565b6040516020818303038152906040526040516020016122859190614dc0565b604051602081830303815290604052600c8a6040516020016122a8929190614e61565b6040516020818303038152906040526040516020016122c8929190614bf2565b60405160208183030381529060405290505f876040516020016122eb9190614eaa565b60405160208183030381529060405290508060405160200161230d9190614ef5565b60405160208183030381529060405290508181604051602001612331929190614bf2565b6040516020818303038152906040529b505050505050505050505050919050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6012602052805f5260405f205f915090505481565b60028054612397906144e3565b80601f01602080910402602001604051908101604052809291908181526020018280546123c3906144e3565b801561240e5780601f106123e55761010080835404028352916020019161240e565b820191905f5260205f20905b8154815290600101906020018083116123f157829003601f168201915b505050505081565b600b602052805f5260405f205f915054906101000a900460ff1681565b8060075f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161251f9190613eb3565b60405180910390a35050565b5f612537338484612c50565b905092915050565b61254a858585610aaf565b5f8473ffffffffffffffffffffffffffffffffffffffff163b14158015612636575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168473ffffffffffffffffffffffffffffffffffffffff1663150b7a0233888787876040518663ffffffff1660e01b81526004016125d4959493929190614f46565b6020604051808303815f875af11580156125f0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126149190614909565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614155b1561266d576040517f3da6393100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b5f60045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20540361270e576001600b5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505b565b60605f600d8054612720906144e3565b9050111561276b57600d61274460125f8581526020019081526020015f2054612fb8565b604051602001612755929190614e61565b6040516020818303038152906040529050612796565b61277482611897565b6040516020016127849190614fb8565b60405160208183030381529060405290505b919050565b600d80546127a8906144e3565b80601f01602080910402602001604051908101604052809291908181526020018280546127d4906144e3565b801561281f5780601f106127f65761010080835404028352916020019161281f565b820191905f5260205f20905b81548152906001019060200180831161280257829003601f168201915b505050505081565b60606040518060400160405280600181526020017f5b0000000000000000000000000000000000000000000000000000000000000081525090505f61286b83613178565b90505f5b8151811015612902578261289c83838151811061288f5761288e6147df565b5b6020026020010151611897565b6040516020016128ad929190614bf2565b6040516020818303038152906040529250600182516128cc91906147ac565b81146128f557826040516020016128e39190615003565b60405160208183030381529060405292505b808060010191505061286f565b5081604051602001612914919061504e565b604051602081830303815290604052915050919050565b6005602052815f5260405f20602052805f5260405f205f91509150505481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146129cf576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600d90816129de91906146b0565b5050565b6007602052815f5260405f20602052805f5260405f205f915091509054906101000a900460ff1681565b600c8054612a19906144e3565b80601f0160208091040260200160405190810160405280929190818152602001828054612a45906144e3565b8015612a905780601f10612a6757610100808354040283529160200191612a90565b820191905f5260205f20905b815481529060010190602001808311612a7357829003601f168201915b505050505081565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612b1c576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612b81576040517f49e27cff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350565b5f7f0000000000000000000000000000000000000000000000000000000000000000600a612c4b91906151a2565b905090565b5f80612c5a612c1d565b90505f60045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f60045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508460045f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254612d2a91906147ac565b925050819055508460045f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282540192505081905550600b5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16612e4e575f8360045f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054612e1391906151ec565b8484612e1f91906151ec565b612e2991906147ac565b90505f5b81811015612e4b57612e3e8961320b565b8080600101915050612e2d565b50505b600b5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16612f21575f8382612ea991906151ec565b8460045f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054612ef291906151ec565b612efc91906147ac565b90505f5b81811015612f1e57612f1188613266565b8080600101915050612f00565b50505b8573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e03148787604051612f7e9190613edb565b60405180910390a3600193505050509392505050565b8160019081612fa391906146b0565b508060029081612fb391906146b0565b505050565b60605f6001612fc68461348b565b0190505f8167ffffffffffffffff811115612fe457612fe3613efc565b5b6040519080825280601f01601f1916602001820160405280156130165781602001600182028036833780820191505090505b5090505f82602001820190505b600115613077578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161306c5761306b6149de565b5b0494505f8503613023575b819350505050919050565b5f808203613092575f9050613173565b5f600161309e846135dc565b901c6001901b905060018184816130b8576130b76149de565b5b048201901c905060018184816130d1576130d06149de565b5b048201901c905060018184816130ea576130e96149de565b5b048201901c90506001818481613103576131026149de565b5b048201901c9050600181848161311c5761311b6149de565b5b048201901c90506001818481613135576131346149de565b5b048201901c9050600181848161314e5761314d6149de565b5b048201901c905061316f81828581613169576131686149de565b5b046136b3565b9150505b919050565b606060095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208054806020026020016040519081016040528092919081815260200182805480156131ff57602002820191905f5260205f20905b8154815260200190600101908083116131eb575b50505050509050919050565b5f613215826136cb565b905060125f8281526020019081526020015f205460105f600f5481526020019081526020015f20819055506001600f5f8282546132529190614c15565b92505081905550613262826137f9565b5050565b61326f81613a3e565b5f3073ffffffffffffffffffffffffffffffffffffffff16634f02c4206040518163ffffffff1660e01b8152600401602060405180830381865afa1580156132b9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906132dd9190615230565b90505f600f54826064436132f191906147ac565b40604051602001613303929190615284565b604051602081830303815290604052805190602001205f1c6133259190614a0b565b90505f60115f8381526020019081526020015f205f9054906101000a900460ff16156133645760105f8381526020019081526020015f20549050613391565b819050600160115f8481526020019081526020015f205f6101000a81548160ff0219169083151502179055505b6001600f5f8282546133a391906147ac565b9250508190555060115f600f5481526020019081526020015f205f9054906101000a900460ff166133d657600f546133eb565b60105f600f5481526020019081526020015f20545b60105f8481526020019081526020015f2081905550600160115f600f5481526020019081526020015f205f6101000a81548160ff0219169083151502179055508060125f8581526020019081526020015f2081905550808473ffffffffffffffffffffffffffffffffffffffff167f792daa4b2623ba70e38af40290b50417d8a1620a7deee03ad74ed721bf9c897f60405160405180910390a350505050565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106134e7577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816134dd576134dc6149de565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310613524576d04ee2d6d415b85acef8100000000838161351a576135196149de565b5b0492506020810190505b662386f26fc10000831061355357662386f26fc100008381613549576135486149de565b5b0492506010810190505b6305f5e100831061357c576305f5e1008381613572576135716149de565b5b0492506008810190505b61271083106135a1576127108381613597576135966149de565b5b0492506004810190505b606483106135c457606483816135ba576135b96149de565b5b0492506002810190505b600a83106135d3576001810190505b80915050919050565b5f805f90505f608084901c11156135fb57608083901c92506080810190505b5f604084901c111561361557604083901c92506040810190505b5f602084901c111561362f57602083901c92506020810190505b5f601084901c111561364957601083901c92506010810190505b5f600884901c111561366357600883901c92506008810190505b5f600484901c111561367d57600483901c92506004810190505b5f600284901c111561369757600283901c92506002810190505b5f600184901c11156136aa576001810190505b80915050919050565b5f8183106136c157816136c3565b825b905092915050565b5f8060095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805490501161374e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613745906152f9565b60405180910390fd5b60095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600160095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805490506137d891906147ac565b815481106137e9576137e86147df565b5b905f5260205f2001549050919050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361385e576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600160095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805490506138e991906147ac565b815481106138fa576138f96147df565b5b905f5260205f200154905060095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208054806139525761395161480c565b5b600190038181905f5260205f20015f90559055600a5f8281526020019081526020015f205f905560085f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560065f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055805f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613aa3576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60035f81548092919060010191905055505f60035490505f73ffffffffffffffffffffffffffffffffffffffff1660085f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613b4f576040517f23369fa600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160085f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081908060018154018082558091505060019003905f5260205f20015f9091909190915055600160095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2080549050613c4c91906147ac565b600a5f8381526020019081526020015f2081905550808273ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015613cf7578082015181840152602081019050613cdc565b5f8484015250505050565b5f601f19601f8301169050919050565b5f613d1c82613cc0565b613d268185613cca565b9350613d36818560208601613cda565b613d3f81613d02565b840191505092915050565b5f6020820190508181035f830152613d628184613d12565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f819050919050565b613d8d81613d7b565b8114613d97575f80fd5b50565b5f81359050613da881613d84565b92915050565b5f60208284031215613dc357613dc2613d73565b5b5f613dd084828501613d9a565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f613e0282613dd9565b9050919050565b613e1281613df8565b82525050565b5f602082019050613e2b5f830184613e09565b92915050565b613e3a81613df8565b8114613e44575f80fd5b50565b5f81359050613e5581613e31565b92915050565b5f8060408385031215613e7157613e70613d73565b5b5f613e7e85828601613e47565b9250506020613e8f85828601613d9a565b9150509250929050565b5f8115159050919050565b613ead81613e99565b82525050565b5f602082019050613ec65f830184613ea4565b92915050565b613ed581613d7b565b82525050565b5f602082019050613eee5f830184613ecc565b92915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b613f3282613d02565b810181811067ffffffffffffffff82111715613f5157613f50613efc565b5b80604052505050565b5f613f63613d6a565b9050613f6f8282613f29565b919050565b5f67ffffffffffffffff821115613f8e57613f8d613efc565b5b613f9782613d02565b9050602081019050919050565b828183375f83830152505050565b5f613fc4613fbf84613f74565b613f5a565b905082815260208101848484011115613fe057613fdf613ef8565b5b613feb848285613fa4565b509392505050565b5f82601f83011261400757614006613ef4565b5b8135614017848260208601613fb2565b91505092915050565b5f6020828403121561403557614034613d73565b5b5f82013567ffffffffffffffff81111561405257614051613d77565b5b61405e84828501613ff3565b91505092915050565b5f805f6060848603121561407e5761407d613d73565b5b5f61408b86828701613e47565b935050602061409c86828701613e47565b92505060406140ad86828701613d9a565b9150509250925092565b5f60ff82169050919050565b6140cc816140b7565b82525050565b5f6020820190506140e55f8301846140c3565b92915050565b5f806040838503121561410157614100613d73565b5b5f83013567ffffffffffffffff81111561411e5761411d613d77565b5b61412a85828601613ff3565b925050602083013567ffffffffffffffff81111561414b5761414a613d77565b5b61415785828601613ff3565b9150509250929050565b61416a81613e99565b8114614174575f80fd5b50565b5f8135905061418581614161565b92915050565b5f80604083850312156141a1576141a0613d73565b5b5f6141ae85828601613e47565b92505060206141bf85828601614177565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6141fb81613d7b565b82525050565b5f61420c83836141f2565b60208301905092915050565b5f602082019050919050565b5f61422e826141c9565b61423881856141d3565b9350614243836141e3565b805f5b8381101561427357815161425a8882614201565b975061426583614218565b925050600181019050614246565b5085935050505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6142b281613e99565b82525050565b5f6142c383836142a9565b60208301905092915050565b5f602082019050919050565b5f6142e582614280565b6142ef818561428a565b93506142fa8361429a565b805f5b8381101561432a57815161431188826142b8565b975061431c836142cf565b9250506001810190506142fd565b5085935050505092915050565b5f6040820190508181035f83015261434f8185614224565b9050818103602083015261436381846142db565b90509392505050565b5f6020828403121561438157614380613d73565b5b5f61438e84828501613e47565b91505092915050565b5f80fd5b5f80fd5b5f8083601f8401126143b4576143b3613ef4565b5b8235905067ffffffffffffffff8111156143d1576143d0614397565b5b6020830191508360018202830111156143ed576143ec61439b565b5b9250929050565b5f805f805f6080868803121561440d5761440c613d73565b5b5f61441a88828901613e47565b955050602061442b88828901613e47565b945050604061443c88828901613d9a565b935050606086013567ffffffffffffffff81111561445d5761445c613d77565b5b6144698882890161439f565b92509250509295509295909350565b5f806040838503121561448e5761448d613d73565b5b5f61449b85828601613e47565b92505060206144ac85828601613e47565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806144fa57607f821691505b60208210810361450d5761450c6144b6565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830261456f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614534565b6145798683614534565b95508019841693508086168417925050509392505050565b5f819050919050565b5f6145b46145af6145aa84613d7b565b614591565b613d7b565b9050919050565b5f819050919050565b6145cd8361459a565b6145e16145d9826145bb565b848454614540565b825550505050565b5f90565b6145f56145e9565b6146008184846145c4565b505050565b5b81811015614623576146185f826145ed565b600181019050614606565b5050565b601f8211156146685761463981614513565b61464284614525565b81016020851015614651578190505b61466561465d85614525565b830182614605565b50505b505050565b5f82821c905092915050565b5f6146885f198460080261466d565b1980831691505092915050565b5f6146a08383614679565b9150826002028217905092915050565b6146b982613cc0565b67ffffffffffffffff8111156146d2576146d1613efc565b5b6146dc82546144e3565b6146e7828285614627565b5f60209050601f831160018114614718575f8415614706578287015190505b6147108582614695565b865550614777565b601f19841661472686614513565b5f5b8281101561474d57848901518255600182019150602085019450602081019050614728565b8683101561476a5784890151614766601f891682614679565b8355505b6001600288020188555050505b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6147b682613d7b565b91506147c183613d7b565b92508282039050818111156147d9576147d861477f565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b5f82825260208201905092915050565b50565b5f6148575f83614839565b915061486282614849565b5f82019050919050565b5f60808201905061487f5f830186613e09565b61488c6020830185613e09565b6148996040830184613ecc565b81810360608301526148aa8161484c565b9050949350505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6148e8816148b4565b81146148f2575f80fd5b50565b5f81519050614903816148df565b92915050565b5f6020828403121561491e5761491d613d73565b5b5f61492b848285016148f5565b91505092915050565b5f81905092915050565b7f4e6576657220476f6e6e61204769766520596f752055700000000000000000005f82015250565b5f614972601783614934565b915061497d8261493e565b601782019050919050565b5f819050919050565b6149a261499d82613d7b565b614988565b82525050565b5f6149b282614966565b91506149be8285614991565b6020820191506149ce8284614991565b6020820191508190509392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f614a1582613d7b565b9150614a2083613d7b565b925082614a3057614a2f6149de565b5b828206905092915050565b7f446563656e7472616c697a6564205075626c696320496e6672617374727563745f8201527f7572652e00000000000000000000000000000000000000000000000000000000602082015250565b5f614a95602483614934565b9150614aa082614a3b565b602482019050919050565b5f614ab582614a89565b9150614ac18285614991565b602082019150614ad18284614991565b6020820191508190509392505050565b5f614aeb82613cc0565b614af58185614934565b9350614b05818560208601613cda565b80840191505092915050565b7f7b2274726169745f74797065223a220000000000000000000000000000000000815250565b5f614b428284614ae1565b9150614b4d82614b11565b600f8201915081905092915050565b7f222c2276616c7565223a00000000000000000000000000000000000000000000815250565b5f614b8d8284614ae1565b9150614b9882614b5c565b600a8201915081905092915050565b7f7d00000000000000000000000000000000000000000000000000000000000000815250565b5f614bd88284614ae1565b9150614be382614ba7565b60018201915081905092915050565b5f614bfd8285614ae1565b9150614c098284614ae1565b91508190509392505050565b5f614c1f82613d7b565b9150614c2a83613d7b565b9250828201905080821115614c4257614c4161477f565b5b92915050565b7f222c20226964223a000000000000000000000000000000000000000000000000815250565b5f614c7882614c48565b600882019150614c888284614ae1565b915081905092915050565b7f7b226e616d65223a2022416e6f6e202300000000000000000000000000000000815250565b5f614cc382614c93565b601082019150614cd38284614ae1565b915081905092915050565b7f2c226465736372697074696f6e223a224120636f6c6c656374696f6e206f66205f8201527f33353220416e6f6e7320656e61626c6564206279204552433430342c20616e2060208201527f6578706572696d656e74616c20746f6b656e207374616e646172642e222c226560408201527f787465726e616c5f75726c223a2268747470733a2f2f616e6f6e65746865726560608201527f756d2e636f6d222c22696d616765223a22000000000000000000000000000000608082015250565b5f614daa609183614934565b9150614db582614cde565b609182019050919050565b5f614dcb8284614ae1565b9150614dd682614d9e565b915081905092915050565b5f8154614ded816144e3565b614df78186614934565b9450600182165f8114614e115760018114614e2657614e58565b60ff1983168652811515820286019350614e58565b614e2f85614513565b5f5b83811015614e5057815481890152600182019150602081019050614e31565b838801955050505b50505092915050565b5f614e6c8285614de1565b9150614e788284614ae1565b91508190509392505050565b7f2e6d7034222c2261747472696275746573223a5b000000000000000000000000815250565b5f614eb482614e84565b601482019150614ec48284614ae1565b915081905092915050565b7f5d7d000000000000000000000000000000000000000000000000000000000000815250565b5f614f008284614ae1565b9150614f0b82614ecf565b60028201915081905092915050565b5f614f258385614839565b9350614f32838584613fa4565b614f3b83613d02565b840190509392505050565b5f608082019050614f595f830188613e09565b614f666020830187613e09565b614f736040830186613ecc565b8181036060830152614f86818486614f1a565b90509695505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b757466382c0000000000815250565b5f614fc282614f92565b601b82019150614fd28284614ae1565b915081905092915050565b7f2c00000000000000000000000000000000000000000000000000000000000000815250565b5f61500e8284614ae1565b915061501982614fdd565b60018201915081905092915050565b7f5d00000000000000000000000000000000000000000000000000000000000000815250565b5f6150598284614ae1565b915061506482615028565b60018201915081905092915050565b5f8160011c9050919050565b5f808291508390505b60018511156150c8578086048111156150a4576150a361477f565b5b60018516156150b35780820291505b80810290506150c185615073565b9450615088565b94509492505050565b5f826150e0576001905061519b565b816150ed575f905061519b565b8160018114615103576002811461510d5761513c565b600191505061519b565b60ff84111561511f5761511e61477f565b5b8360020a9150848211156151365761513561477f565b5b5061519b565b5060208310610133831016604e8410600b84101617156151715782820a90508381111561516c5761516b61477f565b5b61519b565b61517e848484600161507f565b925090508184048111156151955761519461477f565b5b81810290505b9392505050565b5f6151ac82613d7b565b91506151b7836140b7565b92506151e47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846150d1565b905092915050565b5f6151f682613d7b565b915061520183613d7b565b925082615211576152106149de565b5b828204905092915050565b5f8151905061522a81613d84565b92915050565b5f6020828403121561524557615244613d73565b5b5f6152528482850161521c565b91505092915050565b5f819050919050565b5f819050919050565b61527e6152798261525b565b615264565b82525050565b5f61528f8285614991565b60208201915061529f828461526d565b6020820191508190509392505050565b7f4f776e657220686173206e6f20746f6b656e73000000000000000000000000005f82015250565b5f6152e3601383613cca565b91506152ee826152af565b602082019050919050565b5f6020820190508181035f830152615310816152d7565b905091905056fea2646970667358221220e787dba97cf251b70316324b95a1006752f35436591597fb573eb624057f742764736f6c63430008180033
Deployed Bytecode
0x608060405234801561000f575f80fd5b50600436106101ee575f3560e01c80638da5cb5b1161010d578063c87b56dd116100a0578063e0df5b6f1161006f578063e0df5b6f146105cb578063e985e9c5146105e7578063f28ca1dd14610617578063f2fde38b14610635576101ee565b8063c87b56dd1461051d578063d547cfb71461054d578063d57d56af1461056b578063dd62ed3e1461059b576101ee565b8063a22cb465116100dc578063a22cb465146104ab578063a9059cbb146104c7578063b88d4fde146104f7578063b923b20514610513576101ee565b80638da5cb5b1461040f5780638ed8d0321461042d57806395d89b411461045d5780639b19251a1461047b576101ee565b806342842e0e116101855780636352211e116101545780636352211e1461036057806365c3175b1461039057806370a08231146103af57806374e18e96146103df576101ee565b806342842e0e146102ee5780634f02c4201461030a578063504334c21461032857806353d6fd5914610344576101ee565b806318d217c3116101c157806318d217c31461028e57806323b872dd146102aa5780632b968958146102c6578063313ce567146102d0576101ee565b806306fdde03146101f2578063081812fc14610210578063095ea7b31461024057806318160ddd14610270575b5f80fd5b6101fa610651565b6040516102079190613d4a565b60405180910390f35b61022a60048036038101906102259190613dae565b6106dd565b6040516102379190613e18565b60405180910390f35b61025a60048036038101906102559190613e5b565b61070d565b6040516102679190613eb3565b60405180910390f35b6102786109f4565b6040516102859190613edb565b60405180910390f35b6102a860048036038101906102a39190614020565b610a18565b005b6102c460048036038101906102bf9190614067565b610aaf565b005b6102ce6112a6565b005b6102d86113c5565b6040516102e591906140d2565b60405180910390f35b61030860048036038101906103039190614067565b6113e9565b005b610312611518565b60405161031f9190613edb565b60405180910390f35b610342600480360381019061033d91906140eb565b61151e565b005b61035e6004803603810190610359919061418b565b6115b0565b005b61037a60048036038101906103759190613dae565b61168c565b6040516103879190613e18565b60405180910390f35b61039861172a565b6040516103a6929190614337565b60405180910390f35b6103c960048036038101906103c4919061436c565b611882565b6040516103d69190613edb565b60405180910390f35b6103f960048036038101906103f49190613dae565b611897565b6040516104069190613d4a565b60405180910390f35b610417612352565b6040516104249190613e18565b60405180910390f35b61044760048036038101906104429190613dae565b612375565b6040516104549190613edb565b60405180910390f35b61046561238a565b6040516104729190613d4a565b60405180910390f35b6104956004803603810190610490919061436c565b612416565b6040516104a29190613eb3565b60405180910390f35b6104c560048036038101906104c0919061418b565b612433565b005b6104e160048036038101906104dc9190613e5b565b61252b565b6040516104ee9190613eb3565b60405180910390f35b610511600480360381019061050c91906143f4565b61253f565b005b61051b612674565b005b61053760048036038101906105329190613dae565b612710565b6040516105449190613d4a565b60405180910390f35b61055561279b565b6040516105629190613d4a565b60405180910390f35b6105856004803603810190610580919061436c565b612827565b6040516105929190613d4a565b60405180910390f35b6105b560048036038101906105b09190614478565b61292b565b6040516105c29190613edb565b60405180910390f35b6105e560048036038101906105e09190614020565b61294b565b005b61060160048036038101906105fc9190614478565b6129e2565b60405161060e9190613eb3565b60405180910390f35b61061f612a0c565b60405161062c9190613d4a565b60405180910390f35b61064f600480360381019061064a919061436c565b612a98565b005b6001805461065e906144e3565b80601f016020809104026020016040519081016040528092919081815260200182805461068a906144e3565b80156106d55780601f106106ac576101008083540402835291602001916106d5565b820191905f5260205f20905b8154815290600101906020018083116106b857829003601f168201915b505050505081565b6006602052805f5260405f205f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f600354821115801561071f57505f82115b15610907575f60085f8481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015610816575060075f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b1561084d576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8360065f8581526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925856040516108f99190613edb565b60405180910390a3506109ea565b8160055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516109e19190613edb565b60405180910390a35b6001905092915050565b7f0000000000000000000000000000000000000000000000056bc75e2d6310000081565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a9c576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600c9081610aab91906146b0565b5050565b60035481116111675760085f8281526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614610b4d576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610bb2576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614158015610c70575060075f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b8015610cd8575060065f8281526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614155b15610d0f576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d17612c1d565b60045f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610d6291906147ac565b92505081905550610d71612c1d565b60045f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508160085f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060065f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555f60095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600160095f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2080549050610ec791906147ac565b81548110610ed857610ed76147df565b5b905f5260205f20015490508060095f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600a5f8581526020019081526020015f205481548110610f4457610f436147df565b5b905f5260205f20018190555060095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805480610f9d57610f9c61480c565b5b600190038181905f5260205f20015f90559055600a5f8381526020019081526020015f2054600a5f8381526020019081526020015f208190555060095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2082908060018154018082558091505060019003905f5260205f20015f9091909190915055600160095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208054905061108591906147ac565b600a5f8481526020019081526020015f2081905550818373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e03148761114c612c1d565b6040516111599190613edb565b60405180910390a3506112a1565b5f60055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff811461129357818161121691906147ac565b60055f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055505b61129e848484612c50565b50505b505050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461132a576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3565b7f000000000000000000000000000000000000000000000000000000000000001281565b6113f4838383610aaf565b5f8273ffffffffffffffffffffffffffffffffffffffff163b141580156114dc575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168273ffffffffffffffffffffffffffffffffffffffff1663150b7a023386856040518463ffffffff1660e01b815260040161147a9392919061486c565b6020604051808303815f875af1158015611496573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114ba9190614909565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614155b15611513576040517f3da6393100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050565b60035481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146115a2576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6115ac8282612f94565b5050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611634576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600b5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b5f60085f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611725576040517fc5723b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b606080600f5467ffffffffffffffff81111561174957611748613efc565b5b6040519080825280602002602001820160405280156117775781602001602082028036833780820191505090505b509150600f5467ffffffffffffffff81111561179657611795613efc565b5b6040519080825280602002602001820160405280156117c45781602001602082028036833780820191505090505b5090505f5b600f5481101561187d5760115f8281526020019081526020015f205f9054906101000a900460ff166117fb578061180e565b60105f8281526020019081526020015f20545b838281518110611821576118206147df565b5b60200260200101818152505060115f8281526020019081526020015f205f9054906101000a900460ff1682828151811061185e5761185d6147df565b5b60200260200101901515908115158152505080806001019150506117c9565b509091565b6004602052805f5260405f205f915090505481565b60605f60125f8481526020019081526020015f205490505f6118b882612fb8565b90505f601467ffffffffffffffff8111156118d6576118d5613efc565b5b60405190808252806020026020018201604052801561190957816020015b60608152602001906001900390816118f45790505b5090506040518060400160405280600881526020017f537472656e677468000000000000000000000000000000000000000000000000815250815f81518110611955576119546147df565b5b60200260200101819052506040518060400160405280600981526020017f4465787465726974790000000000000000000000000000000000000000000000815250816001815181106119aa576119a96147df565b5b60200260200101819052506040518060400160405280600c81526020017f436f6e737469747574696f6e0000000000000000000000000000000000000000815250816002815181106119ff576119fe6147df565b5b60200260200101819052506040518060400160405280600c81526020017f496e74656c6c6967656e6365000000000000000000000000000000000000000081525081600381518110611a5457611a536147df565b5b60200260200101819052506040518060400160405280600681526020017f576973646f6d000000000000000000000000000000000000000000000000000081525081600481518110611aa957611aa86147df565b5b60200260200101819052506040518060400160405280600881526020017f4368617269736d6100000000000000000000000000000000000000000000000081525081600581518110611afe57611afd6147df565b5b60200260200101819052506040518060400160405280600581526020017f537065656400000000000000000000000000000000000000000000000000000081525081600681518110611b5357611b526147df565b5b60200260200101819052506040518060400160405280600481526020017f4c75636b0000000000000000000000000000000000000000000000000000000081525081600781518110611ba857611ba76147df565b5b60200260200101819052506040518060400160405280600b81526020017f41726d6f7220436c61737300000000000000000000000000000000000000000081525081600881518110611bfd57611bfc6147df565b5b60200260200101819052506040518060400160405280600a81526020017f48697420506f696e74730000000000000000000000000000000000000000000081525081600981518110611c5257611c516147df565b5b60200260200101819052506040518060400160405280600781526020017f436f75726167650000000000000000000000000000000000000000000000000081525081600a81518110611ca757611ca66147df565b5b60200260200101819052506040518060400160405280600f81526020017f4d6f72616c20416c69676e6d656e74000000000000000000000000000000000081525081600b81518110611cfc57611cfb6147df565b5b60200260200101819052506040518060400160405280600881526020017f416d626974696f6e00000000000000000000000000000000000000000000000081525081600c81518110611d5157611d506147df565b5b60200260200101819052506040518060400160405280600e81526020017f53656e7365206f662048756d6f7200000000000000000000000000000000000081525081600d81518110611da657611da56147df565b5b60200260200101819052506040518060400160405280600781526020017f4c6f79616c74790000000000000000000000000000000000000000000000000081525081600e81518110611dfb57611dfa6147df565b5b60200260200101819052506040518060400160405280600f81526020017f416476656e7475726f75736e657373000000000000000000000000000000000081525081600f81518110611e5057611e4f6147df565b5b60200260200101819052506040518060400160405280600a81526020017f4469736369706c696e650000000000000000000000000000000000000000000081525081601081518110611ea557611ea46147df565b5b60200260200101819052506040518060400160405280600981526020017f437572696f73697479000000000000000000000000000000000000000000000081525081601181518110611efa57611ef96147df565b5b60200260200101819052506040518060400160405280600a81526020017f526573696c69656e63650000000000000000000000000000000000000000000081525081601281518110611f4f57611f4e6147df565b5b60200260200101819052506040518060400160405280600a81526020017f437265617469766974790000000000000000000000000000000000000000000081525081601381518110611fa457611fa36147df565b5b60200260200101819052505f60405180602001604052805f81525090505f60405180602001604052805f81525090505f60405180602001604052805f81525090505f60405180602001604052805f81525090505f805f5b875181101561220b5761205d6101538b10612019576202710061201e565b620138805b62ffffff168b836040516020016120369291906149a8565b604051602081830303815290604052805190602001205f1c6120589190614a0b565b613082565b91506120aa8261019061207091906147ac565b8b83604051602001612083929190614aab565b604051602081830303815290604052805190602001205f1c6120a59190614a0b565b613082565b60146120b691906147ac565b92505f81146120fa576040518060400160405280600181526020017f2c0000000000000000000000000000000000000000000000000000000000000081525061210a565b60405180602001604052805f8152505b60405160200161211a9190614b37565b604051602081830303815290604052955087818151811061213e5761213d6147df565b5b60200260200101516040516020016121569190614b82565b604051602081830303815290604052945061217083612fb8565b6040516020016121809190614bcd565b6040516020818303038152906040529350868686866040516020016121a6929190614bf2565b6040516020818303038152906040526040516020016121c6929190614bf2565b6040516020818303038152906040526040516020016121e6929190614bf2565b60405160208183030381529060405296506001816122049190614c15565b9050611ffb565b505f886122178d612fb8565b6040516020016122279190614c6e565b604051602081830303815290604052604051602001612247929190614bf2565b6040516020818303038152906040526040516020016122669190614cb9565b6040516020818303038152906040526040516020016122859190614dc0565b604051602081830303815290604052600c8a6040516020016122a8929190614e61565b6040516020818303038152906040526040516020016122c8929190614bf2565b60405160208183030381529060405290505f876040516020016122eb9190614eaa565b60405160208183030381529060405290508060405160200161230d9190614ef5565b60405160208183030381529060405290508181604051602001612331929190614bf2565b6040516020818303038152906040529b505050505050505050505050919050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6012602052805f5260405f205f915090505481565b60028054612397906144e3565b80601f01602080910402602001604051908101604052809291908181526020018280546123c3906144e3565b801561240e5780601f106123e55761010080835404028352916020019161240e565b820191905f5260205f20905b8154815290600101906020018083116123f157829003601f168201915b505050505081565b600b602052805f5260405f205f915054906101000a900460ff1681565b8060075f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161251f9190613eb3565b60405180910390a35050565b5f612537338484612c50565b905092915050565b61254a858585610aaf565b5f8473ffffffffffffffffffffffffffffffffffffffff163b14158015612636575063150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168473ffffffffffffffffffffffffffffffffffffffff1663150b7a0233888787876040518663ffffffff1660e01b81526004016125d4959493929190614f46565b6020604051808303815f875af11580156125f0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126149190614909565b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614155b1561266d576040517f3da6393100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5050505050565b5f60045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20540361270e576001600b5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505b565b60605f600d8054612720906144e3565b9050111561276b57600d61274460125f8581526020019081526020015f2054612fb8565b604051602001612755929190614e61565b6040516020818303038152906040529050612796565b61277482611897565b6040516020016127849190614fb8565b60405160208183030381529060405290505b919050565b600d80546127a8906144e3565b80601f01602080910402602001604051908101604052809291908181526020018280546127d4906144e3565b801561281f5780601f106127f65761010080835404028352916020019161281f565b820191905f5260205f20905b81548152906001019060200180831161280257829003601f168201915b505050505081565b60606040518060400160405280600181526020017f5b0000000000000000000000000000000000000000000000000000000000000081525090505f61286b83613178565b90505f5b8151811015612902578261289c83838151811061288f5761288e6147df565b5b6020026020010151611897565b6040516020016128ad929190614bf2565b6040516020818303038152906040529250600182516128cc91906147ac565b81146128f557826040516020016128e39190615003565b60405160208183030381529060405292505b808060010191505061286f565b5081604051602001612914919061504e565b604051602081830303815290604052915050919050565b6005602052815f5260405f20602052805f5260405f205f91509150505481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146129cf576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600d90816129de91906146b0565b5050565b6007602052815f5260405f20602052805f5260405f205f915091509054906101000a900460ff1681565b600c8054612a19906144e3565b80601f0160208091040260200160405190810160405280929190818152602001828054612a45906144e3565b8015612a905780601f10612a6757610100808354040283529160200191612a90565b820191905f5260205f20905b815481529060010190602001808311612a7357829003601f168201915b505050505081565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614612b1c576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612b81576040517f49e27cff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350565b5f7f0000000000000000000000000000000000000000000000000000000000000012600a612c4b91906151a2565b905090565b5f80612c5a612c1d565b90505f60045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f60045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490508460045f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254612d2a91906147ac565b925050819055508460045f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282540192505081905550600b5f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16612e4e575f8360045f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054612e1391906151ec565b8484612e1f91906151ec565b612e2991906147ac565b90505f5b81811015612e4b57612e3e8961320b565b8080600101915050612e2d565b50505b600b5f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16612f21575f8382612ea991906151ec565b8460045f8a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054612ef291906151ec565b612efc91906147ac565b90505f5b81811015612f1e57612f1188613266565b8080600101915050612f00565b50505b8573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e03148787604051612f7e9190613edb565b60405180910390a3600193505050509392505050565b8160019081612fa391906146b0565b508060029081612fb391906146b0565b505050565b60605f6001612fc68461348b565b0190505f8167ffffffffffffffff811115612fe457612fe3613efc565b5b6040519080825280601f01601f1916602001820160405280156130165781602001600182028036833780820191505090505b5090505f82602001820190505b600115613077578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a858161306c5761306b6149de565b5b0494505f8503613023575b819350505050919050565b5f808203613092575f9050613173565b5f600161309e846135dc565b901c6001901b905060018184816130b8576130b76149de565b5b048201901c905060018184816130d1576130d06149de565b5b048201901c905060018184816130ea576130e96149de565b5b048201901c90506001818481613103576131026149de565b5b048201901c9050600181848161311c5761311b6149de565b5b048201901c90506001818481613135576131346149de565b5b048201901c9050600181848161314e5761314d6149de565b5b048201901c905061316f81828581613169576131686149de565b5b046136b3565b9150505b919050565b606060095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208054806020026020016040519081016040528092919081815260200182805480156131ff57602002820191905f5260205f20905b8154815260200190600101908083116131eb575b50505050509050919050565b5f613215826136cb565b905060125f8281526020019081526020015f205460105f600f5481526020019081526020015f20819055506001600f5f8282546132529190614c15565b92505081905550613262826137f9565b5050565b61326f81613a3e565b5f3073ffffffffffffffffffffffffffffffffffffffff16634f02c4206040518163ffffffff1660e01b8152600401602060405180830381865afa1580156132b9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906132dd9190615230565b90505f600f54826064436132f191906147ac565b40604051602001613303929190615284565b604051602081830303815290604052805190602001205f1c6133259190614a0b565b90505f60115f8381526020019081526020015f205f9054906101000a900460ff16156133645760105f8381526020019081526020015f20549050613391565b819050600160115f8481526020019081526020015f205f6101000a81548160ff0219169083151502179055505b6001600f5f8282546133a391906147ac565b9250508190555060115f600f5481526020019081526020015f205f9054906101000a900460ff166133d657600f546133eb565b60105f600f5481526020019081526020015f20545b60105f8481526020019081526020015f2081905550600160115f600f5481526020019081526020015f205f6101000a81548160ff0219169083151502179055508060125f8581526020019081526020015f2081905550808473ffffffffffffffffffffffffffffffffffffffff167f792daa4b2623ba70e38af40290b50417d8a1620a7deee03ad74ed721bf9c897f60405160405180910390a350505050565b5f805f90507a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083106134e7577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816134dd576134dc6149de565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310613524576d04ee2d6d415b85acef8100000000838161351a576135196149de565b5b0492506020810190505b662386f26fc10000831061355357662386f26fc100008381613549576135486149de565b5b0492506010810190505b6305f5e100831061357c576305f5e1008381613572576135716149de565b5b0492506008810190505b61271083106135a1576127108381613597576135966149de565b5b0492506004810190505b606483106135c457606483816135ba576135b96149de565b5b0492506002810190505b600a83106135d3576001810190505b80915050919050565b5f805f90505f608084901c11156135fb57608083901c92506080810190505b5f604084901c111561361557604083901c92506040810190505b5f602084901c111561362f57602083901c92506020810190505b5f601084901c111561364957601083901c92506010810190505b5f600884901c111561366357600883901c92506008810190505b5f600484901c111561367d57600483901c92506004810190505b5f600284901c111561369757600283901c92506002810190505b5f600184901c11156136aa576001810190505b80915050919050565b5f8183106136c157816136c3565b825b905092915050565b5f8060095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805490501161374e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613745906152f9565b60405180910390fd5b60095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600160095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805490506137d891906147ac565b815481106137e9576137e86147df565b5b905f5260205f2001549050919050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361385e576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600160095f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805490506138e991906147ac565b815481106138fa576138f96147df565b5b905f5260205f200154905060095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208054806139525761395161480c565b5b600190038181905f5260205f20015f90559055600a5f8281526020019081526020015f205f905560085f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905560065f8281526020019081526020015f205f6101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055805f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603613aa3576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60035f81548092919060010191905055505f60035490505f73ffffffffffffffffffffffffffffffffffffffff1660085f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613b4f576040517f23369fa600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8160085f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060095f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081908060018154018082558091505060019003905f5260205f20015f9091909190915055600160095f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2080549050613c4c91906147ac565b600a5f8381526020019081526020015f2081905550808273ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015613cf7578082015181840152602081019050613cdc565b5f8484015250505050565b5f601f19601f8301169050919050565b5f613d1c82613cc0565b613d268185613cca565b9350613d36818560208601613cda565b613d3f81613d02565b840191505092915050565b5f6020820190508181035f830152613d628184613d12565b905092915050565b5f604051905090565b5f80fd5b5f80fd5b5f819050919050565b613d8d81613d7b565b8114613d97575f80fd5b50565b5f81359050613da881613d84565b92915050565b5f60208284031215613dc357613dc2613d73565b5b5f613dd084828501613d9a565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f613e0282613dd9565b9050919050565b613e1281613df8565b82525050565b5f602082019050613e2b5f830184613e09565b92915050565b613e3a81613df8565b8114613e44575f80fd5b50565b5f81359050613e5581613e31565b92915050565b5f8060408385031215613e7157613e70613d73565b5b5f613e7e85828601613e47565b9250506020613e8f85828601613d9a565b9150509250929050565b5f8115159050919050565b613ead81613e99565b82525050565b5f602082019050613ec65f830184613ea4565b92915050565b613ed581613d7b565b82525050565b5f602082019050613eee5f830184613ecc565b92915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b613f3282613d02565b810181811067ffffffffffffffff82111715613f5157613f50613efc565b5b80604052505050565b5f613f63613d6a565b9050613f6f8282613f29565b919050565b5f67ffffffffffffffff821115613f8e57613f8d613efc565b5b613f9782613d02565b9050602081019050919050565b828183375f83830152505050565b5f613fc4613fbf84613f74565b613f5a565b905082815260208101848484011115613fe057613fdf613ef8565b5b613feb848285613fa4565b509392505050565b5f82601f83011261400757614006613ef4565b5b8135614017848260208601613fb2565b91505092915050565b5f6020828403121561403557614034613d73565b5b5f82013567ffffffffffffffff81111561405257614051613d77565b5b61405e84828501613ff3565b91505092915050565b5f805f6060848603121561407e5761407d613d73565b5b5f61408b86828701613e47565b935050602061409c86828701613e47565b92505060406140ad86828701613d9a565b9150509250925092565b5f60ff82169050919050565b6140cc816140b7565b82525050565b5f6020820190506140e55f8301846140c3565b92915050565b5f806040838503121561410157614100613d73565b5b5f83013567ffffffffffffffff81111561411e5761411d613d77565b5b61412a85828601613ff3565b925050602083013567ffffffffffffffff81111561414b5761414a613d77565b5b61415785828601613ff3565b9150509250929050565b61416a81613e99565b8114614174575f80fd5b50565b5f8135905061418581614161565b92915050565b5f80604083850312156141a1576141a0613d73565b5b5f6141ae85828601613e47565b92505060206141bf85828601614177565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6141fb81613d7b565b82525050565b5f61420c83836141f2565b60208301905092915050565b5f602082019050919050565b5f61422e826141c9565b61423881856141d3565b9350614243836141e3565b805f5b8381101561427357815161425a8882614201565b975061426583614218565b925050600181019050614246565b5085935050505092915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b6142b281613e99565b82525050565b5f6142c383836142a9565b60208301905092915050565b5f602082019050919050565b5f6142e582614280565b6142ef818561428a565b93506142fa8361429a565b805f5b8381101561432a57815161431188826142b8565b975061431c836142cf565b9250506001810190506142fd565b5085935050505092915050565b5f6040820190508181035f83015261434f8185614224565b9050818103602083015261436381846142db565b90509392505050565b5f6020828403121561438157614380613d73565b5b5f61438e84828501613e47565b91505092915050565b5f80fd5b5f80fd5b5f8083601f8401126143b4576143b3613ef4565b5b8235905067ffffffffffffffff8111156143d1576143d0614397565b5b6020830191508360018202830111156143ed576143ec61439b565b5b9250929050565b5f805f805f6080868803121561440d5761440c613d73565b5b5f61441a88828901613e47565b955050602061442b88828901613e47565b945050604061443c88828901613d9a565b935050606086013567ffffffffffffffff81111561445d5761445c613d77565b5b6144698882890161439f565b92509250509295509295909350565b5f806040838503121561448e5761448d613d73565b5b5f61449b85828601613e47565b92505060206144ac85828601613e47565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806144fa57607f821691505b60208210810361450d5761450c6144b6565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830261456f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614534565b6145798683614534565b95508019841693508086168417925050509392505050565b5f819050919050565b5f6145b46145af6145aa84613d7b565b614591565b613d7b565b9050919050565b5f819050919050565b6145cd8361459a565b6145e16145d9826145bb565b848454614540565b825550505050565b5f90565b6145f56145e9565b6146008184846145c4565b505050565b5b81811015614623576146185f826145ed565b600181019050614606565b5050565b601f8211156146685761463981614513565b61464284614525565b81016020851015614651578190505b61466561465d85614525565b830182614605565b50505b505050565b5f82821c905092915050565b5f6146885f198460080261466d565b1980831691505092915050565b5f6146a08383614679565b9150826002028217905092915050565b6146b982613cc0565b67ffffffffffffffff8111156146d2576146d1613efc565b5b6146dc82546144e3565b6146e7828285614627565b5f60209050601f831160018114614718575f8415614706578287015190505b6147108582614695565b865550614777565b601f19841661472686614513565b5f5b8281101561474d57848901518255600182019150602085019450602081019050614728565b8683101561476a5784890151614766601f891682614679565b8355505b6001600288020188555050505b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6147b682613d7b565b91506147c183613d7b565b92508282039050818111156147d9576147d861477f565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b5f82825260208201905092915050565b50565b5f6148575f83614839565b915061486282614849565b5f82019050919050565b5f60808201905061487f5f830186613e09565b61488c6020830185613e09565b6148996040830184613ecc565b81810360608301526148aa8161484c565b9050949350505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6148e8816148b4565b81146148f2575f80fd5b50565b5f81519050614903816148df565b92915050565b5f6020828403121561491e5761491d613d73565b5b5f61492b848285016148f5565b91505092915050565b5f81905092915050565b7f4e6576657220476f6e6e61204769766520596f752055700000000000000000005f82015250565b5f614972601783614934565b915061497d8261493e565b601782019050919050565b5f819050919050565b6149a261499d82613d7b565b614988565b82525050565b5f6149b282614966565b91506149be8285614991565b6020820191506149ce8284614991565b6020820191508190509392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f614a1582613d7b565b9150614a2083613d7b565b925082614a3057614a2f6149de565b5b828206905092915050565b7f446563656e7472616c697a6564205075626c696320496e6672617374727563745f8201527f7572652e00000000000000000000000000000000000000000000000000000000602082015250565b5f614a95602483614934565b9150614aa082614a3b565b602482019050919050565b5f614ab582614a89565b9150614ac18285614991565b602082019150614ad18284614991565b6020820191508190509392505050565b5f614aeb82613cc0565b614af58185614934565b9350614b05818560208601613cda565b80840191505092915050565b7f7b2274726169745f74797065223a220000000000000000000000000000000000815250565b5f614b428284614ae1565b9150614b4d82614b11565b600f8201915081905092915050565b7f222c2276616c7565223a00000000000000000000000000000000000000000000815250565b5f614b8d8284614ae1565b9150614b9882614b5c565b600a8201915081905092915050565b7f7d00000000000000000000000000000000000000000000000000000000000000815250565b5f614bd88284614ae1565b9150614be382614ba7565b60018201915081905092915050565b5f614bfd8285614ae1565b9150614c098284614ae1565b91508190509392505050565b5f614c1f82613d7b565b9150614c2a83613d7b565b9250828201905080821115614c4257614c4161477f565b5b92915050565b7f222c20226964223a000000000000000000000000000000000000000000000000815250565b5f614c7882614c48565b600882019150614c888284614ae1565b915081905092915050565b7f7b226e616d65223a2022416e6f6e202300000000000000000000000000000000815250565b5f614cc382614c93565b601082019150614cd38284614ae1565b915081905092915050565b7f2c226465736372697074696f6e223a224120636f6c6c656374696f6e206f66205f8201527f33353220416e6f6e7320656e61626c6564206279204552433430342c20616e2060208201527f6578706572696d656e74616c20746f6b656e207374616e646172642e222c226560408201527f787465726e616c5f75726c223a2268747470733a2f2f616e6f6e65746865726560608201527f756d2e636f6d222c22696d616765223a22000000000000000000000000000000608082015250565b5f614daa609183614934565b9150614db582614cde565b609182019050919050565b5f614dcb8284614ae1565b9150614dd682614d9e565b915081905092915050565b5f8154614ded816144e3565b614df78186614934565b9450600182165f8114614e115760018114614e2657614e58565b60ff1983168652811515820286019350614e58565b614e2f85614513565b5f5b83811015614e5057815481890152600182019150602081019050614e31565b838801955050505b50505092915050565b5f614e6c8285614de1565b9150614e788284614ae1565b91508190509392505050565b7f2e6d7034222c2261747472696275746573223a5b000000000000000000000000815250565b5f614eb482614e84565b601482019150614ec48284614ae1565b915081905092915050565b7f5d7d000000000000000000000000000000000000000000000000000000000000815250565b5f614f008284614ae1565b9150614f0b82614ecf565b60028201915081905092915050565b5f614f258385614839565b9350614f32838584613fa4565b614f3b83613d02565b840190509392505050565b5f608082019050614f595f830188613e09565b614f666020830187613e09565b614f736040830186613ecc565b8181036060830152614f86818486614f1a565b90509695505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b757466382c0000000000815250565b5f614fc282614f92565b601b82019150614fd28284614ae1565b915081905092915050565b7f2c00000000000000000000000000000000000000000000000000000000000000815250565b5f61500e8284614ae1565b915061501982614fdd565b60018201915081905092915050565b7f5d00000000000000000000000000000000000000000000000000000000000000815250565b5f6150598284614ae1565b915061506482615028565b60018201915081905092915050565b5f8160011c9050919050565b5f808291508390505b60018511156150c8578086048111156150a4576150a361477f565b5b60018516156150b35780820291505b80810290506150c185615073565b9450615088565b94509492505050565b5f826150e0576001905061519b565b816150ed575f905061519b565b8160018114615103576002811461510d5761513c565b600191505061519b565b60ff84111561511f5761511e61477f565b5b8360020a9150848211156151365761513561477f565b5b5061519b565b5060208310610133831016604e8410600b84101617156151715782820a90508381111561516c5761516b61477f565b5b61519b565b61517e848484600161507f565b925090508184048111156151955761519461477f565b5b81810290505b9392505050565b5f6151ac82613d7b565b91506151b7836140b7565b92506151e47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846150d1565b905092915050565b5f6151f682613d7b565b915061520183613d7b565b925082615211576152106149de565b5b828204905092915050565b5f8151905061522a81613d84565b92915050565b5f6020828403121561524557615244613d73565b5b5f6152528482850161521c565b91505092915050565b5f819050919050565b5f819050919050565b61527e6152798261525b565b615264565b82525050565b5f61528f8285614991565b60208201915061529f828461526d565b6020820191508190509392505050565b7f4f776e657220686173206e6f20746f6b656e73000000000000000000000000005f82015250565b5f6152e3601383613cca565b91506152ee826152af565b602082019050919050565b5f6020820190508181035f830152615310816152d7565b905091905056fea2646970667358221220e787dba97cf251b70316324b95a1006752f35436591597fb573eb624057f742764736f6c63430008180033
Deployed Bytecode Sourcemap
32531:5673:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23153:18;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23864:46;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26237:642;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23389:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32798:98;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27286:1716;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21150:151;;;:::i;:::-;;23289:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29298:405;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23524:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33018:158;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25363:111;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25749:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34050:272;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;23630:44;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34748:3036;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20591:20;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33278:42;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23207:20;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24778:41;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26930:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29061:160;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29798:437;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25563:114;;;:::i;:::-;;34336:404;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32594:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37792:409;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23744:64;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32904:106;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23975:68;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32566:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20923:219;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23153:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;23864:46::-;;;;;;;;;;;;;;;;;;;;;;:::o;26237:642::-;26340:4;26375:6;;26361:10;:20;;:38;;;;;26398:1;26385:10;:14;26361:38;26357:491;;;26416:13;26432:8;:20;26441:10;26432:20;;;;;;;;;;;;;;;;;;;;;26416:36;;26487:5;26473:19;;:10;:19;;;;:59;;;;;26497:16;:23;26514:5;26497:23;;;;;;;;;;;;;;;:35;26521:10;26497:35;;;;;;;;;;;;;;;;;;;;;;;;;26496:36;26473:59;26469:121;;;26560:14;;;;;;;;;;;;;;26469:121;26632:7;26606:11;:23;26618:10;26606:23;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;26677:7;26661:36;;26670:5;26661:36;;;26686:10;26661:36;;;;;;:::i;:::-;;;;;;;;26401:308;26357:491;;;26763:10;26730:9;:21;26740:10;26730:21;;;;;;;;;;;;;;;:30;26752:7;26730:30;;;;;;;;;;;;;;;:43;;;;26816:7;26795:41;;26804:10;26795:41;;;26825:10;26795:41;;;;;;:::i;:::-;;;;;;;;26357:491;26867:4;26860:11;;26237:642;;;;:::o;23389:36::-;;;:::o;32798:98::-;20678:5;;;;;;;;;;20664:19;;:10;:19;;;20660:46;;20692:14;;;;;;;;;;;;;;20660:46;32880:8:::1;32870:7;:18;;;;;;:::i;:::-;;32798:98:::0;:::o;27286:1716::-;27432:6;;27418:10;:20;27414:1581;;27467:8;:20;27476:10;27467:20;;;;;;;;;;;;;;;;;;;;;27459:28;;:4;:28;;;27455:91;;27515:15;;;;;;;;;;;;;;27455:91;27580:1;27566:16;;:2;:16;;;27562:82;;27610:18;;;;;;;;;;;;;;27562:82;27696:4;27682:18;;:10;:18;;;;:74;;;;;27722:16;:22;27739:4;27722:22;;;;;;;;;;;;;;;:34;27745:10;27722:34;;;;;;;;;;;;;;;;;;;;;;;;;27721:35;27682:74;:132;;;;;27791:11;:23;27803:10;27791:23;;;;;;;;;;;;;;;;;;;;;27777:37;;:10;:37;;;;27682:132;27660:226;;;27856:14;;;;;;;;;;;;;;27660:226;27921:10;:8;:10::i;:::-;27902:9;:15;27912:4;27902:15;;;;;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;;;;;27994:10;:8;:10::i;:::-;27977:9;:13;27987:2;27977:13;;;;;;;;;;;;;;;;:27;;;;;;;;;;;28059:2;28036:8;:20;28045:10;28036:20;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;28083:11;:23;28095:10;28083:23;;;;;;;;;;;;28076:30;;;;;;;;;;;28164:17;28184:6;:12;28191:4;28184:12;;;;;;;;;;;;;;;28219:1;28197:6;:12;28204:4;28197:12;;;;;;;;;;;;;;;:19;;;;:23;;;;:::i;:::-;28184:37;;;;;;;;:::i;:::-;;;;;;;;;;28164:57;;28276:9;28236:6;:12;28243:4;28236:12;;;;;;;;;;;;;;;28249:11;:23;28261:10;28249:23;;;;;;;;;;;;28236:37;;;;;;;;:::i;:::-;;;;;;;;;:49;;;;28320:6;:12;28327:4;28320:12;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;28424:11;:23;28436:10;28424:23;;;;;;;;;;;;28399:11;:22;28411:9;28399:22;;;;;;;;;;;:48;;;;28501:6;:10;28508:2;28501:10;;;;;;;;;;;;;;;28517;28501:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28631:1;28611:6;:10;28618:2;28611:10;;;;;;;;;;;;;;;:17;;;;:21;;;;:::i;:::-;28585:11;:23;28597:10;28585:23;;;;;;;;;;;:47;;;;28673:10;28669:2;28654:30;;28663:4;28654:30;;;;;;;;;;;;28724:2;28704:35;;28718:4;28704:35;;;28728:10;:8;:10::i;:::-;28704:35;;;;;;:::i;:::-;;;;;;;;27440:1311;27414:1581;;;28772:15;28790:9;:15;28800:4;28790:15;;;;;;;;;;;;;;;:27;28806:10;28790:27;;;;;;;;;;;;;;;;28772:45;;28849:17;28838:7;:28;28834:101;;28925:10;28915:7;:20;;;;:::i;:::-;28885:9;:15;28895:4;28885:15;;;;;;;;;;;;;;;:27;28901:10;28885:27;;;;;;;;;;;;;;;:50;;;;28834:101;28952:31;28962:4;28968:2;28972:10;28952:9;:31::i;:::-;;28757:238;27414:1581;27286:1716;;;:::o;21150:151::-;20678:5;;;;;;;;;;20664:19;;:10;:19;;;20660:46;;20692:14;;;;;;;;;;;;;;20660:46;21229:1:::1;21213:5:::0;::::1;:18;;;;;;;;;;;;;;;;;;21290:1;21249:44;;21270:10;21249:44;;;;;;;;;;;;21150:151::o:0;23289:31::-;;;:::o;29298:405::-;29422:26;29435:4;29441:2;29445;29422:12;:26::i;:::-;29497:1;29479:2;:14;;;:19;;:154;;;;;29593:40;;;29515:118;;;29530:2;29515:35;;;29551:10;29563:4;29569:2;29515:61;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:118;;;;;29479:154;29461:235;;;29667:17;;;;;;;;;;;;;;29461:235;29298:405;;;:::o;23524:21::-;;;;:::o;33018:158::-;20678:5;;;;;;;;;;20664:19;;:10;:19;;;20660:46;;20692:14;;;;;;;;;;;;;;20660:46;33138:30:::1;33153:5;33160:7;33138:14;:30::i;:::-;33018:158:::0;;:::o;25363:111::-;20678:5;;;;;;;;;;20664:19;;:10;:19;;;20660:46;;20692:14;;;;;;;;;;;;;;20660:46;25461:5:::1;25441:9;:17;25451:6;25441:17;;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;25363:111:::0;;:::o;25749:193::-;25807:13;25841:8;:12;25850:2;25841:12;;;;;;;;;;;;;;;;;;;;;25833:20;;25887:1;25870:19;;:5;:19;;;25866:69;;25913:10;;;;;;;;;;;;;;25866:69;25749:193;;;:::o;34050:272::-;34085:26;34112:23;34167:5;;34156:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34141:32;;34201:5;;34190:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34178:29;;34216:6;34212:106;34225:5;;34223:1;:7;34212:106;;;34259:8;:11;34268:1;34259:11;;;;;;;;;;;;;;;;;;;;;:21;;34279:1;34259:21;;;34271:4;:7;34276:1;34271:7;;;;;;;;;;;;34259:21;34241:12;34254:1;34241:15;;;;;;;;:::i;:::-;;;;;;;:39;;;;;34301:8;:11;34310:1;34301:11;;;;;;;;;;;;;;;;;;;;;34286:9;34296:1;34286:12;;;;;;;;:::i;:::-;;;;;;;:26;;;;;;;;;;;34231:3;;;;;;;34212:106;;;;34050:272;;:::o;23630:44::-;;;;;;;;;;;;;;;;;:::o;34748:3036::-;34794:13;34819:11;34833:15;:19;34849:2;34833:19;;;;;;;;;;;;34819:33;;34863:21;34887:26;34905:6;34887:16;:26::i;:::-;34863:50;;34926:26;34968:2;34955:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34926:45;;34986:26;;;;;;;;;;;;;;;;;:10;34997:1;34986:13;;;;;;;;:::i;:::-;;;;;;;:26;;;;35027:27;;;;;;;;;;;;;;;;;:10;35038:1;35027:13;;;;;;;;:::i;:::-;;;;;;;:27;;;;35069:30;;;;;;;;;;;;;;;;;:10;35080:1;35069:13;;;;;;;;:::i;:::-;;;;;;;:30;;;;35114;;;;;;;;;;;;;;;;;:10;35125:1;35114:13;;;;;;;;:::i;:::-;;;;;;;:30;;;;35159:24;;;;;;;;;;;;;;;;;:10;35170:1;35159:13;;;;;;;;:::i;:::-;;;;;;;:24;;;;35198:26;;;;;;;;;;;;;;;;;:10;35209:1;35198:13;;;;;;;;:::i;:::-;;;;;;;:26;;;;35239:23;;;;;;;;;;;;;;;;;:10;35250:1;35239:13;;;;;;;;:::i;:::-;;;;;;;:23;;;;35277:22;;;;;;;;;;;;;;;;;:10;35288:1;35277:13;;;;;;;;:::i;:::-;;;;;;;:22;;;;35314:29;;;;;;;;;;;;;;;;;:10;35325:1;35314:13;;;;;;;;:::i;:::-;;;;;;;:29;;;;35358:28;;;;;;;;;;;;;;;;;:10;35369:1;35358:13;;;;;;;;:::i;:::-;;;;;;;:28;;;;35401:26;;;;;;;;;;;;;;;;;:10;35412:2;35401:14;;;;;;;;:::i;:::-;;;;;;;:26;;;;35442:34;;;;;;;;;;;;;;;;;:10;35453:2;35442:14;;;;;;;;:::i;:::-;;;;;;;:34;;;;35491:27;;;;;;;;;;;;;;;;;:10;35502:2;35491:14;;;;;;;;:::i;:::-;;;;;;;:27;;;;35533:33;;;;;;;;;;;;;;;;;:10;35544:2;35533:14;;;;;;;;:::i;:::-;;;;;;;:33;;;;35581:26;;;;;;;;;;;;;;;;;:10;35592:2;35581:14;;;;;;;;:::i;:::-;;;;;;;:26;;;;35622:34;;;;;;;;;;;;;;;;;:10;35633:2;35622:14;;;;;;;;:::i;:::-;;;;;;;:34;;;;35671:29;;;;;;;;;;;;;;;;;:10;35682:2;35671:14;;;;;;;;:::i;:::-;;;;;;;:29;;;;35715:28;;;;;;;;;;;;;;;;;:10;35726:2;35715:14;;;;;;;;:::i;:::-;;;;;;;:28;;;;35758:29;;;;;;;;;;;;;;;;;:10;35769:2;35758:14;;;;;;;;:::i;:::-;;;;;;;:29;;;;35802;;;;;;;;;;;;;;;;;:10;35813:2;35802:14;;;;;;;;:::i;:::-;;;;;;;:29;;;;35844:24;:29;;;;;;;;;;;;;;35884:18;:23;;;;;;;;;;;;;;35918:19;:24;;;;;;;;;;;;;;35953:19;:24;;;;;;;;;;;;;;35988:9;36008:15;36126:9;36121:964;36145:10;:17;36141:1;:21;36121:964;;;36244:158;36384:3;36377:6;:10;:23;;36394:6;36377:23;;;36388:5;36377:23;36254:147;;36338:6;36345:1;36269:78;;;;;;;;;:::i;:::-;;;;;;;;;;;;;36259:89;;;;;;36254:95;;:147;;;;:::i;:::-;36244:9;:158::i;:::-;36231:171;;36431:261;36666:10;36662:3;:14;;;;:::i;:::-;36560:6;36616:1;36456:200;;;;;;;;;:::i;:::-;;;;;;;;;;;;;36446:211;;;;;;36441:217;;:236;;;;:::i;:::-;36431:9;:261::i;:::-;36426:2;:266;;;;:::i;:::-;36419:273;;36733:1;36730;:4;:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36716:45;;;;;;;;:::i;:::-;;;;;;;;;;;;;36709:52;;36798:10;36809:1;36798:13;;;;;;;;:::i;:::-;;;;;;;;36784:42;;;;;;;;:::i;:::-;;;;;;;;;;;;;36776:50;;36864:22;36881:4;36864:16;:22::i;:::-;36849:43;;;;;;;;:::i;:::-;;;;;;;;;;;;;36841:51;;36934:10;36977:4;37018:5;37025;37004:27;;;;;;;;;:::i;:::-;;;;;;;;;;;;;36963:91;;;;;;;;;:::i;:::-;;;;;;;;;;;;;36920:153;;;;;;;;;:::i;:::-;;;;;;;;;;;;;36907:166;;36169:1;36164:6;;;;;:::i;:::-;;;36121:964;;;;37097:26;37235:7;37271:20;37288:2;37271:16;:20::i;:::-;37244:49;;;;;;;;:::i;:::-;;;;;;;;;;;;;37220:75;;;;;;;;;:::i;:::-;;;;;;;;;;;;;37186:111;;;;;;;;:::i;:::-;;;;;;;;;;;;;37154:324;;;;;;;;:::i;:::-;;;;;;;;;;;;;37507:7;37516;37493:31;;;;;;;;;:::i;:::-;;;;;;;;;;;;;37126:409;;;;;;;;;:::i;:::-;;;;;;;;;;;;;37097:438;;37548:27;37629:10;37578:72;;;;;;;;:::i;:::-;;;;;;;;;;;;;37548:102;;37694:13;37679:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;37663:52;;37749:12;37762:13;37735:41;;;;;;;;;:::i;:::-;;;;;;;;;;;;;37728:48;;;;;;;;;;;;;34748:3036;;;:::o;20591:20::-;;;;;;;;;;;;:::o;33278:42::-;;;;;;;;;;;;;;;;;:::o;23207:20::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;24778:41::-;;;;;;;;;;;;;;;;;;;;;;:::o;26930:207::-;27057:8;27016:16;:28;27033:10;27016:28;;;;;;;;;;;;;;;:38;27045:8;27016:38;;;;;;;;;;;;;;;;:49;;;;;;;;;;;;;;;;;;27110:8;27083:46;;27098:10;27083:46;;;27120:8;27083:46;;;;;;:::i;:::-;;;;;;;;26930:207;;:::o;29061:160::-;29156:4;29180:33;29190:10;29202:2;29206:6;29180:9;:33::i;:::-;29173:40;;29061:160;;;;:::o;29798:437::-;29952:26;29965:4;29971:2;29975;29952:12;:26::i;:::-;30027:1;30009:2;:14;;;:19;;:156;;;;;30125:40;;;30045:120;;;30060:2;30045:35;;;30081:10;30093:4;30099:2;30103:4;;30045:63;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:120;;;;;30009:156;29991:237;;;30199:17;;;;;;;;;;;;;;29991:237;29798:437;;;;;:::o;25563:114::-;25628:1;25605:9;:21;25615:10;25605:21;;;;;;;;;;;;;;;;:24;25602:67;;25665:4;25641:9;:21;25651:10;25641:21;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;25602:67;25563:114::o;34336:404::-;34396:13;34457:1;34434:12;34428:26;;;;;:::i;:::-;;;:30;34424:309;;;34496:12;34510:37;34527:15;:19;34543:2;34527:19;;;;;;;;;;;;34510:16;:37::i;:::-;34482:67;;;;;;;;;:::i;:::-;;;;;;;;;;;;;34475:74;;;;34424:309;34694:8;34699:2;34694:4;:8::i;:::-;34606:115;;;;;;;;:::i;:::-;;;;;;;;;;;;;34582:139;;34336:404;;;;:::o;32594:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;37792:409::-;37843:25;37878:17;;;;;;;;;;;;;;;;;;;37903;37923:20;37938:4;37923:14;:20::i;:::-;37903:40;;37955:6;37951:191;37964:3;:10;37962:1;:12;37951:191;;;38016:11;38028:12;38033:3;38037:1;38033:6;;;;;;;;:::i;:::-;;;;;;;;38028:4;:12::i;:::-;38002:40;;;;;;;;;:::i;:::-;;;;;;;;;;;;;37988:54;;38068:1;38057:3;:10;:12;;;;:::i;:::-;38054:1;:15;38051:83;;38108:11;38094:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;38080:44;;38051:83;37975:3;;;;;;;37951:191;;;;38177:11;38163:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;38149:44;;37870:331;37792:409;;;:::o;23744:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;32904:106::-;20678:5;;;;;;;;;;20664:19;;:10;:19;;;20660:46;;20692:14;;;;;;;;;;;;;;20660:46;32993:9:::1;32978:12;:24;;;;;;:::i;:::-;;32904:106:::0;:::o;23975:68::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;32566:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;20923:219::-;20678:5;;;;;;;;;;20664:19;;:10;:19;;;20660:46;;20692:14;;;;;;;;;;;;;;20660:46;21024:1:::1;21006:20;;:6;:20;;::::0;21002:47:::1;;21035:14;;;;;;;;;;;;;;21002:47;21070:6;21062:5;::::0;:14:::1;;;;;;;;;;;;;;;;;;21127:6;21094:40;;21115:10;21094:40;;;;;;;;;;;;20923:219:::0;:::o;31401:92::-;31444:7;31477:8;31471:2;:14;;;;:::i;:::-;31464:21;;31401:92;:::o;30303:1059::-;30416:4;30433:12;30448:10;:8;:10::i;:::-;30433:25;;30469:27;30499:9;:15;30509:4;30499:15;;;;;;;;;;;;;;;;30469:45;;30525:29;30557:9;:13;30567:2;30557:13;;;;;;;;;;;;;;;;30525:45;;30602:6;30583:9;:15;30593:4;30583:15;;;;;;;;;;;;;;;;:25;;;;;;;:::i;:::-;;;;;;;;30663:6;30646:9;:13;30656:2;30646:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;30754:9;:15;30764:4;30754:15;;;;;;;;;;;;;;;;;;;;;;;;;30749:234;;30786:22;30861:4;30843:9;:15;30853:4;30843:15;;;;;;;;;;;;;;;;:22;;;;:::i;:::-;30834:4;30812:19;:26;;;;:::i;:::-;30811:55;;;;:::i;:::-;30786:80;;30886:9;30881:91;30905:14;30901:1;:18;30881:91;;;30945:11;30951:4;30945:5;:11::i;:::-;30921:3;;;;;;;30881:91;;;;30771:212;30749:234;31059:9;:13;31069:2;31059:13;;;;;;;;;;;;;;;;;;;;;;;;;31054:230;;31089:22;31164:4;31140:21;:28;;;;:::i;:::-;31131:4;31115:9;:13;31125:2;31115:13;;;;;;;;;;;;;;;;:20;;;;:::i;:::-;31114:55;;;;:::i;:::-;31089:80;;31189:9;31184:89;31208:14;31204:1;:18;31184:89;;;31248:9;31254:2;31248:5;:9::i;:::-;31224:3;;;;;;;31184:89;;;;31074:210;31054:230;31321:2;31301:31;;31315:4;31301:31;;;31325:6;31301:31;;;;;;:::i;:::-;;;;;;;;31350:4;31343:11;;;;;30303:1059;;;;;:::o;32364:160::-;32484:5;32477:4;:12;;;;;;:::i;:::-;;32509:7;32500:6;:16;;;;;;:::i;:::-;;32364:160;;:::o;17884:718::-;17940:13;17991:14;18028:1;18008:17;18019:5;18008:10;:17::i;:::-;:21;17991:38;;18044:20;18078:6;18067:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18044:41;;18100:11;18229:6;18225:2;18221:15;18213:6;18209:28;18202:35;;18266:290;18273:4;18266:290;;;18298:5;;;;;;;;18440:10;18435:2;18428:5;18424:14;18419:32;18414:3;18406:46;18498:2;18489:11;;;;;;:::i;:::-;;;;;18532:1;18523:5;:10;18266:290;18519:21;18266:290;18577:6;18570:13;;;;;17884:718;;;:::o;10720:1673::-;10768:7;10797:1;10792;:6;10788:47;;10822:1;10815:8;;;;10788:47;11526:14;11560:1;11549:7;11554:1;11549:4;:7::i;:::-;:12;;11543:1;:19;;11526:36;;12028:1;12017:6;12013:1;:10;;;;;:::i;:::-;;;12004:6;:19;12003:26;;11994:35;;12078:1;12067:6;12063:1;:10;;;;;:::i;:::-;;;12054:6;:19;12053:26;;12044:35;;12128:1;12117:6;12113:1;:10;;;;;:::i;:::-;;;12104:6;:19;12103:26;;12094:35;;12178:1;12167:6;12163:1;:10;;;;;:::i;:::-;;;12154:6;:19;12153:26;;12144:35;;12228:1;12217:6;12213:1;:10;;;;;:::i;:::-;;;12204:6;:19;12203:26;;12194:35;;12278:1;12267:6;12263:1;:10;;;;;:::i;:::-;;;12254:6;:19;12253:26;;12244:35;;12328:1;12317:6;12313:1;:10;;;;;:::i;:::-;;;12304:6;:19;12303:26;;12294:35;;12351:23;12355:6;12367;12363:1;:10;;;;;:::i;:::-;;;12351:3;:23::i;:::-;12344:30;;;10720:1673;;;;:::o;24459:105::-;24520:13;24546:6;:13;24553:5;24546:13;;;;;;;;;;;;;;;24539:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24459:105;;;:::o;33872:173::-;33930:7;33940:25;33960:4;33940:19;:25::i;:::-;33930:35;;33984:15;:19;34000:2;33984:19;;;;;;;;;;;;33970:4;:11;33975:5;;33970:11;;;;;;;;;;;:33;;;;34017:1;34010:5;;:8;;;;;;;:::i;:::-;;;;;;;;34023:17;34035:4;34023:11;:17::i;:::-;33919:126;33872:173;:::o;33391:476::-;33441:15;33453:2;33441:11;:15::i;:::-;33461:7;33471:4;:11;;;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33461:23;;33491:11;33575:5;;33537:2;33565:3;33550:12;:18;;;;:::i;:::-;33540:29;33520:50;;;;;;;;;:::i;:::-;;;;;;;;;;;;;33510:61;;;;;;33505:67;;:75;;;;:::i;:::-;33491:89;;33585:9;33602:8;:16;33611:6;33602:16;;;;;;;;;;;;;;;;;;;;;33599:109;;;33632:4;:12;33637:6;33632:12;;;;;;;;;;;;33625:19;;33599:109;;;33667:6;33660:13;;33698:4;33679:8;:16;33688:6;33679:16;;;;;;;;;;;;:23;;;;;;;;;;;;;;;;;;33599:109;33719:1;33712:5;;:8;;;;;;;:::i;:::-;;;;;;;;33740;:15;33749:5;;33740:15;;;;;;;;;;;;;;;;;;;;;:33;;33768:5;;33740:33;;;33756:4;:11;33761:5;;33756:11;;;;;;;;;;;;33740:33;33725:4;:12;33730:6;33725:12;;;;;;;;;;;:48;;;;33796:4;33778:8;:15;33787:5;;33778:15;;;;;;;;;;;;:22;;;;;;;;;;;;;;;;;;33827:4;33805:15;:19;33821:2;33805:19;;;;;;;;;;;:26;;;;33857:4;33854:2;33841:21;;;;;;;;;;;;33436:431;;;33391:476;:::o;14447:948::-;14500:7;14520:14;14537:1;14520:18;;14587:8;14578:5;:17;14574:106;;14625:8;14616:17;;;;;;:::i;:::-;;;;;14662:2;14652:12;;;;14574:106;14707:8;14698:5;:17;14694:106;;14745:8;14736:17;;;;;;:::i;:::-;;;;;14782:2;14772:12;;;;14694:106;14827:8;14818:5;:17;14814:106;;14865:8;14856:17;;;;;;:::i;:::-;;;;;14902:2;14892:12;;;;14814:106;14947:7;14938:5;:16;14934:103;;14984:7;14975:16;;;;;;:::i;:::-;;;;;15020:1;15010:11;;;;14934:103;15064:7;15055:5;:16;15051:103;;15101:7;15092:16;;;;;;:::i;:::-;;;;;15137:1;15127:11;;;;15051:103;15181:7;15172:5;:16;15168:103;;15218:7;15209:16;;;;;;:::i;:::-;;;;;15254:1;15244:11;;;;15168:103;15298:7;15289:5;:16;15285:68;;15336:1;15326:11;;;;15285:68;15381:6;15374:13;;;14447:948;;;:::o;12879:1019::-;12931:7;12951:14;12968:1;12951:18;;13024:1;13018:3;13009:5;:12;;:16;13005:102;;;13056:3;13046:13;;;;;13088:3;13078:13;;;;13005:102;13139:1;13134:2;13125:5;:11;;:15;13121:99;;;13171:2;13161:12;;;;;13202:2;13192:12;;;;13121:99;13252:1;13247:2;13238:5;:11;;:15;13234:99;;;13284:2;13274:12;;;;;13315:2;13305:12;;;;13234:99;13365:1;13360:2;13351:5;:11;;:15;13347:99;;;13397:2;13387:12;;;;;13428:2;13418:12;;;;13347:99;13477:1;13473;13464:5;:10;;:14;13460:96;;;13509:1;13499:11;;;;;13539:1;13529:11;;;;13460:96;13587:1;13583;13574:5;:10;;:14;13570:96;;;13619:1;13609:11;;;;;13649:1;13639:11;;;;13570:96;13697:1;13693;13684:5;:10;;:14;13680:96;;;13729:1;13719:11;;;;;13759:1;13749:11;;;;13680:96;13807:1;13803;13794:5;:10;;:14;13790:66;;;13839:1;13829:11;;;;13790:66;13884:6;13877:13;;;12879:1019;;;:::o;4557:106::-;4615:7;4646:1;4642;:5;:13;;4654:1;4642:13;;;4650:1;4642:13;4635:20;;4557:106;;;;:::o;24263:193::-;24330:7;24375:1;24352:6;:13;24359:5;24352:13;;;;;;;;;;;;;;;:20;;;;:24;24344:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;24412:6;:13;24419:5;24412:13;;;;;;;;;;;;;;;24449:1;24426:6;:13;24433:5;24426:13;;;;;;;;;;;;;;;:20;;;;:24;;;;:::i;:::-;24412:39;;;;;;;;:::i;:::-;;;;;;;;;;24405:46;;24263:193;;;:::o;31983:373::-;32060:1;32044:18;;:4;:18;;;32040:73;;32086:15;;;;;;;;;;;;;;32040:73;32125:10;32138:6;:12;32145:4;32138:12;;;;;;;;;;;;;;;32173:1;32151:6;:12;32158:4;32151:12;;;;;;;;;;;;;;;:19;;;;:23;;;;:::i;:::-;32138:37;;;;;;;;:::i;:::-;;;;;;;;;;32125:50;;32186:6;:12;32193:4;32186:12;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;32222:11;:15;32234:2;32222:15;;;;;;;;;;;32215:22;;;32255:8;:12;32264:2;32255:12;;;;;;;;;;;;32248:19;;;;;;;;;;;32285:11;:15;32297:2;32285:15;;;;;;;;;;;;32278:22;;;;;;;;;;;32345:2;32341:1;32318:30;;32327:4;32318:30;;;;;;;;;;;;32029:327;31983:373;:::o;31501:474::-;31574:1;31560:16;;:2;:16;;;31556:74;;31600:18;;;;;;;;;;;;;;31556:74;31667:6;;:8;;;;;;;;;;;;;31699:10;31712:6;;31699:19;;31759:1;31735:26;;:8;:12;31744:2;31735:12;;;;;;;;;;;;;;;;;;;;;:26;;;31731:81;;31785:15;;;;;;;;;;;;;;31731:81;31839:2;31824:8;:12;31833:2;31824:12;;;;;;;;;;;;:17;;;;;;;;;;;;;;;;;;31852:6;:10;31859:2;31852:10;;;;;;;;;;;;;;;31868:2;31852:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31920:1;31900:6;:10;31907:2;31900:10;;;;;;;;;;;;;;;:17;;;;:21;;;;:::i;:::-;31882:11;:15;31894:2;31882:15;;;;;;;;;;;:39;;;;31964:2;31960;31939:28;;31956:1;31939:28;;;;;;;;;;;;31545:430;31501:474;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:246::-;368:1;378:113;392:6;389:1;386:13;378:113;;;477:1;472:3;468:11;462:18;458:1;453:3;449:11;442:39;414:2;411:1;407:10;402:15;;378:113;;;525:1;516:6;511:3;507:16;500:27;349:184;287:246;;;:::o;539:102::-;580:6;631:2;627:7;622:2;615:5;611:14;607:28;597:38;;539:102;;;:::o;647:377::-;735:3;763:39;796:5;763:39;:::i;:::-;818:71;882:6;877:3;818:71;:::i;:::-;811:78;;898:65;956:6;951:3;944:4;937:5;933:16;898:65;:::i;:::-;988:29;1010:6;988:29;:::i;:::-;983:3;979:39;972:46;;739:285;647:377;;;;:::o;1030:313::-;1143:4;1181:2;1170:9;1166:18;1158:26;;1230:9;1224:4;1220:20;1216:1;1205:9;1201:17;1194:47;1258:78;1331:4;1322:6;1258:78;:::i;:::-;1250:86;;1030:313;;;;:::o;1349:75::-;1382:6;1415:2;1409:9;1399:19;;1349:75;:::o;1430:117::-;1539:1;1536;1529:12;1553:117;1662:1;1659;1652:12;1676:77;1713:7;1742:5;1731:16;;1676:77;;;:::o;1759:122::-;1832:24;1850:5;1832:24;:::i;:::-;1825:5;1822:35;1812:63;;1871:1;1868;1861:12;1812:63;1759:122;:::o;1887:139::-;1933:5;1971:6;1958:20;1949:29;;1987:33;2014:5;1987:33;:::i;:::-;1887:139;;;;:::o;2032:329::-;2091:6;2140:2;2128:9;2119:7;2115:23;2111:32;2108:119;;;2146:79;;:::i;:::-;2108:119;2266:1;2291:53;2336:7;2327:6;2316:9;2312:22;2291:53;:::i;:::-;2281:63;;2237:117;2032:329;;;;:::o;2367:126::-;2404:7;2444:42;2437:5;2433:54;2422:65;;2367:126;;;:::o;2499:96::-;2536:7;2565:24;2583:5;2565:24;:::i;:::-;2554:35;;2499:96;;;:::o;2601:118::-;2688:24;2706:5;2688:24;:::i;:::-;2683:3;2676:37;2601:118;;:::o;2725:222::-;2818:4;2856:2;2845:9;2841:18;2833:26;;2869:71;2937:1;2926:9;2922:17;2913:6;2869:71;:::i;:::-;2725:222;;;;:::o;2953:122::-;3026:24;3044:5;3026:24;:::i;:::-;3019:5;3016:35;3006:63;;3065:1;3062;3055:12;3006:63;2953:122;:::o;3081:139::-;3127:5;3165:6;3152:20;3143:29;;3181:33;3208:5;3181:33;:::i;:::-;3081:139;;;;:::o;3226:474::-;3294:6;3302;3351:2;3339:9;3330:7;3326:23;3322:32;3319:119;;;3357:79;;:::i;:::-;3319:119;3477:1;3502:53;3547:7;3538:6;3527:9;3523:22;3502:53;:::i;:::-;3492:63;;3448:117;3604:2;3630:53;3675:7;3666:6;3655:9;3651:22;3630:53;:::i;:::-;3620:63;;3575:118;3226:474;;;;;:::o;3706:90::-;3740:7;3783:5;3776:13;3769:21;3758:32;;3706:90;;;:::o;3802:109::-;3883:21;3898:5;3883:21;:::i;:::-;3878:3;3871:34;3802:109;;:::o;3917:210::-;4004:4;4042:2;4031:9;4027:18;4019:26;;4055:65;4117:1;4106:9;4102:17;4093:6;4055:65;:::i;:::-;3917:210;;;;:::o;4133:118::-;4220:24;4238:5;4220:24;:::i;:::-;4215:3;4208:37;4133:118;;:::o;4257:222::-;4350:4;4388:2;4377:9;4373:18;4365:26;;4401:71;4469:1;4458:9;4454:17;4445:6;4401:71;:::i;:::-;4257:222;;;;:::o;4485:117::-;4594:1;4591;4584:12;4608:117;4717:1;4714;4707:12;4731:180;4779:77;4776:1;4769:88;4876:4;4873:1;4866:15;4900:4;4897:1;4890:15;4917:281;5000:27;5022:4;5000:27;:::i;:::-;4992:6;4988:40;5130:6;5118:10;5115:22;5094:18;5082:10;5079:34;5076:62;5073:88;;;5141:18;;:::i;:::-;5073:88;5181:10;5177:2;5170:22;4960:238;4917:281;;:::o;5204:129::-;5238:6;5265:20;;:::i;:::-;5255:30;;5294:33;5322:4;5314:6;5294:33;:::i;:::-;5204:129;;;:::o;5339:308::-;5401:4;5491:18;5483:6;5480:30;5477:56;;;5513:18;;:::i;:::-;5477:56;5551:29;5573:6;5551:29;:::i;:::-;5543:37;;5635:4;5629;5625:15;5617:23;;5339:308;;;:::o;5653:146::-;5750:6;5745:3;5740;5727:30;5791:1;5782:6;5777:3;5773:16;5766:27;5653:146;;;:::o;5805:425::-;5883:5;5908:66;5924:49;5966:6;5924:49;:::i;:::-;5908:66;:::i;:::-;5899:75;;5997:6;5990:5;5983:21;6035:4;6028:5;6024:16;6073:3;6064:6;6059:3;6055:16;6052:25;6049:112;;;6080:79;;:::i;:::-;6049:112;6170:54;6217:6;6212:3;6207;6170:54;:::i;:::-;5889:341;5805:425;;;;;:::o;6250:340::-;6306:5;6355:3;6348:4;6340:6;6336:17;6332:27;6322:122;;6363:79;;:::i;:::-;6322:122;6480:6;6467:20;6505:79;6580:3;6572:6;6565:4;6557:6;6553:17;6505:79;:::i;:::-;6496:88;;6312:278;6250:340;;;;:::o;6596:509::-;6665:6;6714:2;6702:9;6693:7;6689:23;6685:32;6682:119;;;6720:79;;:::i;:::-;6682:119;6868:1;6857:9;6853:17;6840:31;6898:18;6890:6;6887:30;6884:117;;;6920:79;;:::i;:::-;6884:117;7025:63;7080:7;7071:6;7060:9;7056:22;7025:63;:::i;:::-;7015:73;;6811:287;6596:509;;;;:::o;7111:619::-;7188:6;7196;7204;7253:2;7241:9;7232:7;7228:23;7224:32;7221:119;;;7259:79;;:::i;:::-;7221:119;7379:1;7404:53;7449:7;7440:6;7429:9;7425:22;7404:53;:::i;:::-;7394:63;;7350:117;7506:2;7532:53;7577:7;7568:6;7557:9;7553:22;7532:53;:::i;:::-;7522:63;;7477:118;7634:2;7660:53;7705:7;7696:6;7685:9;7681:22;7660:53;:::i;:::-;7650:63;;7605:118;7111:619;;;;;:::o;7736:86::-;7771:7;7811:4;7804:5;7800:16;7789:27;;7736:86;;;:::o;7828:112::-;7911:22;7927:5;7911:22;:::i;:::-;7906:3;7899:35;7828:112;;:::o;7946:214::-;8035:4;8073:2;8062:9;8058:18;8050:26;;8086:67;8150:1;8139:9;8135:17;8126:6;8086:67;:::i;:::-;7946:214;;;;:::o;8166:834::-;8254:6;8262;8311:2;8299:9;8290:7;8286:23;8282:32;8279:119;;;8317:79;;:::i;:::-;8279:119;8465:1;8454:9;8450:17;8437:31;8495:18;8487:6;8484:30;8481:117;;;8517:79;;:::i;:::-;8481:117;8622:63;8677:7;8668:6;8657:9;8653:22;8622:63;:::i;:::-;8612:73;;8408:287;8762:2;8751:9;8747:18;8734:32;8793:18;8785:6;8782:30;8779:117;;;8815:79;;:::i;:::-;8779:117;8920:63;8975:7;8966:6;8955:9;8951:22;8920:63;:::i;:::-;8910:73;;8705:288;8166:834;;;;;:::o;9006:116::-;9076:21;9091:5;9076:21;:::i;:::-;9069:5;9066:32;9056:60;;9112:1;9109;9102:12;9056:60;9006:116;:::o;9128:133::-;9171:5;9209:6;9196:20;9187:29;;9225:30;9249:5;9225:30;:::i;:::-;9128:133;;;;:::o;9267:468::-;9332:6;9340;9389:2;9377:9;9368:7;9364:23;9360:32;9357:119;;;9395:79;;:::i;:::-;9357:119;9515:1;9540:53;9585:7;9576:6;9565:9;9561:22;9540:53;:::i;:::-;9530:63;;9486:117;9642:2;9668:50;9710:7;9701:6;9690:9;9686:22;9668:50;:::i;:::-;9658:60;;9613:115;9267:468;;;;;:::o;9741:114::-;9808:6;9842:5;9836:12;9826:22;;9741:114;;;:::o;9861:184::-;9960:11;9994:6;9989:3;9982:19;10034:4;10029:3;10025:14;10010:29;;9861:184;;;;:::o;10051:132::-;10118:4;10141:3;10133:11;;10171:4;10166:3;10162:14;10154:22;;10051:132;;;:::o;10189:108::-;10266:24;10284:5;10266:24;:::i;:::-;10261:3;10254:37;10189:108;;:::o;10303:179::-;10372:10;10393:46;10435:3;10427:6;10393:46;:::i;:::-;10471:4;10466:3;10462:14;10448:28;;10303:179;;;;:::o;10488:113::-;10558:4;10590;10585:3;10581:14;10573:22;;10488:113;;;:::o;10637:732::-;10756:3;10785:54;10833:5;10785:54;:::i;:::-;10855:86;10934:6;10929:3;10855:86;:::i;:::-;10848:93;;10965:56;11015:5;10965:56;:::i;:::-;11044:7;11075:1;11060:284;11085:6;11082:1;11079:13;11060:284;;;11161:6;11155:13;11188:63;11247:3;11232:13;11188:63;:::i;:::-;11181:70;;11274:60;11327:6;11274:60;:::i;:::-;11264:70;;11120:224;11107:1;11104;11100:9;11095:14;;11060:284;;;11064:14;11360:3;11353:10;;10761:608;;;10637:732;;;;:::o;11375:111::-;11439:6;11473:5;11467:12;11457:22;;11375:111;;;:::o;11492:181::-;11588:11;11622:6;11617:3;11610:19;11662:4;11657:3;11653:14;11638:29;;11492:181;;;;:::o;11679:129::-;11743:4;11766:3;11758:11;;11796:4;11791:3;11787:14;11779:22;;11679:129;;;:::o;11814:99::-;11885:21;11900:5;11885:21;:::i;:::-;11880:3;11873:34;11814:99;;:::o;11919:167::-;11982:10;12003:40;12039:3;12031:6;12003:40;:::i;:::-;12075:4;12070:3;12066:14;12052:28;;11919:167;;;;:::o;12092:110::-;12159:4;12191;12186:3;12182:14;12174:22;;12092:110;;;:::o;12232:708::-;12345:3;12374:51;12419:5;12374:51;:::i;:::-;12441:83;12517:6;12512:3;12441:83;:::i;:::-;12434:90;;12548:53;12595:5;12548:53;:::i;:::-;12624:7;12655:1;12640:275;12665:6;12662:1;12659:13;12640:275;;;12741:6;12735:13;12768:57;12821:3;12806:13;12768:57;:::i;:::-;12761:64;;12848:57;12898:6;12848:57;:::i;:::-;12838:67;;12700:215;12687:1;12684;12680:9;12675:14;;12640:275;;;12644:14;12931:3;12924:10;;12350:590;;;12232:708;;;;:::o;12946:622::-;13161:4;13199:2;13188:9;13184:18;13176:26;;13248:9;13242:4;13238:20;13234:1;13223:9;13219:17;13212:47;13276:108;13379:4;13370:6;13276:108;:::i;:::-;13268:116;;13431:9;13425:4;13421:20;13416:2;13405:9;13401:18;13394:48;13459:102;13556:4;13547:6;13459:102;:::i;:::-;13451:110;;12946:622;;;;;:::o;13574:329::-;13633:6;13682:2;13670:9;13661:7;13657:23;13653:32;13650:119;;;13688:79;;:::i;:::-;13650:119;13808:1;13833:53;13878:7;13869:6;13858:9;13854:22;13833:53;:::i;:::-;13823:63;;13779:117;13574:329;;;;:::o;13909:117::-;14018:1;14015;14008:12;14032:117;14141:1;14138;14131:12;14168:552;14225:8;14235:6;14285:3;14278:4;14270:6;14266:17;14262:27;14252:122;;14293:79;;:::i;:::-;14252:122;14406:6;14393:20;14383:30;;14436:18;14428:6;14425:30;14422:117;;;14458:79;;:::i;:::-;14422:117;14572:4;14564:6;14560:17;14548:29;;14626:3;14618:4;14610:6;14606:17;14596:8;14592:32;14589:41;14586:128;;;14633:79;;:::i;:::-;14586:128;14168:552;;;;;:::o;14726:963::-;14823:6;14831;14839;14847;14855;14904:3;14892:9;14883:7;14879:23;14875:33;14872:120;;;14911:79;;:::i;:::-;14872:120;15031:1;15056:53;15101:7;15092:6;15081:9;15077:22;15056:53;:::i;:::-;15046:63;;15002:117;15158:2;15184:53;15229:7;15220:6;15209:9;15205:22;15184:53;:::i;:::-;15174:63;;15129:118;15286:2;15312:53;15357:7;15348:6;15337:9;15333:22;15312:53;:::i;:::-;15302:63;;15257:118;15442:2;15431:9;15427:18;15414:32;15473:18;15465:6;15462:30;15459:117;;;15495:79;;:::i;:::-;15459:117;15608:64;15664:7;15655:6;15644:9;15640:22;15608:64;:::i;:::-;15590:82;;;;15385:297;14726:963;;;;;;;;:::o;15695:474::-;15763:6;15771;15820:2;15808:9;15799:7;15795:23;15791:32;15788:119;;;15826:79;;:::i;:::-;15788:119;15946:1;15971:53;16016:7;16007:6;15996:9;15992:22;15971:53;:::i;:::-;15961:63;;15917:117;16073:2;16099:53;16144:7;16135:6;16124:9;16120:22;16099:53;:::i;:::-;16089:63;;16044:118;15695:474;;;;;:::o;16175:180::-;16223:77;16220:1;16213:88;16320:4;16317:1;16310:15;16344:4;16341:1;16334:15;16361:320;16405:6;16442:1;16436:4;16432:12;16422:22;;16489:1;16483:4;16479:12;16510:18;16500:81;;16566:4;16558:6;16554:17;16544:27;;16500:81;16628:2;16620:6;16617:14;16597:18;16594:38;16591:84;;16647:18;;:::i;:::-;16591:84;16412:269;16361:320;;;:::o;16687:141::-;16736:4;16759:3;16751:11;;16782:3;16779:1;16772:14;16816:4;16813:1;16803:18;16795:26;;16687:141;;;:::o;16834:93::-;16871:6;16918:2;16913;16906:5;16902:14;16898:23;16888:33;;16834:93;;;:::o;16933:107::-;16977:8;17027:5;17021:4;17017:16;16996:37;;16933:107;;;;:::o;17046:393::-;17115:6;17165:1;17153:10;17149:18;17188:97;17218:66;17207:9;17188:97;:::i;:::-;17306:39;17336:8;17325:9;17306:39;:::i;:::-;17294:51;;17378:4;17374:9;17367:5;17363:21;17354:30;;17427:4;17417:8;17413:19;17406:5;17403:30;17393:40;;17122:317;;17046:393;;;;;:::o;17445:60::-;17473:3;17494:5;17487:12;;17445:60;;;:::o;17511:142::-;17561:9;17594:53;17612:34;17621:24;17639:5;17621:24;:::i;:::-;17612:34;:::i;:::-;17594:53;:::i;:::-;17581:66;;17511:142;;;:::o;17659:75::-;17702:3;17723:5;17716:12;;17659:75;;;:::o;17740:269::-;17850:39;17881:7;17850:39;:::i;:::-;17911:91;17960:41;17984:16;17960:41;:::i;:::-;17952:6;17945:4;17939:11;17911:91;:::i;:::-;17905:4;17898:105;17816:193;17740:269;;;:::o;18015:73::-;18060:3;18015:73;:::o;18094:189::-;18171:32;;:::i;:::-;18212:65;18270:6;18262;18256:4;18212:65;:::i;:::-;18147:136;18094:189;;:::o;18289:186::-;18349:120;18366:3;18359:5;18356:14;18349:120;;;18420:39;18457:1;18450:5;18420:39;:::i;:::-;18393:1;18386:5;18382:13;18373:22;;18349:120;;;18289:186;;:::o;18481:543::-;18582:2;18577:3;18574:11;18571:446;;;18616:38;18648:5;18616:38;:::i;:::-;18700:29;18718:10;18700:29;:::i;:::-;18690:8;18686:44;18883:2;18871:10;18868:18;18865:49;;;18904:8;18889:23;;18865:49;18927:80;18983:22;19001:3;18983:22;:::i;:::-;18973:8;18969:37;18956:11;18927:80;:::i;:::-;18586:431;;18571:446;18481:543;;;:::o;19030:117::-;19084:8;19134:5;19128:4;19124:16;19103:37;;19030:117;;;;:::o;19153:169::-;19197:6;19230:51;19278:1;19274:6;19266:5;19263:1;19259:13;19230:51;:::i;:::-;19226:56;19311:4;19305;19301:15;19291:25;;19204:118;19153:169;;;;:::o;19327:295::-;19403:4;19549:29;19574:3;19568:4;19549:29;:::i;:::-;19541:37;;19611:3;19608:1;19604:11;19598:4;19595:21;19587:29;;19327:295;;;;:::o;19627:1395::-;19744:37;19777:3;19744:37;:::i;:::-;19846:18;19838:6;19835:30;19832:56;;;19868:18;;:::i;:::-;19832:56;19912:38;19944:4;19938:11;19912:38;:::i;:::-;19997:67;20057:6;20049;20043:4;19997:67;:::i;:::-;20091:1;20115:4;20102:17;;20147:2;20139:6;20136:14;20164:1;20159:618;;;;20821:1;20838:6;20835:77;;;20887:9;20882:3;20878:19;20872:26;20863:35;;20835:77;20938:67;20998:6;20991:5;20938:67;:::i;:::-;20932:4;20925:81;20794:222;20129:887;;20159:618;20211:4;20207:9;20199:6;20195:22;20245:37;20277:4;20245:37;:::i;:::-;20304:1;20318:208;20332:7;20329:1;20326:14;20318:208;;;20411:9;20406:3;20402:19;20396:26;20388:6;20381:42;20462:1;20454:6;20450:14;20440:24;;20509:2;20498:9;20494:18;20481:31;;20355:4;20352:1;20348:12;20343:17;;20318:208;;;20554:6;20545:7;20542:19;20539:179;;;20612:9;20607:3;20603:19;20597:26;20655:48;20697:4;20689:6;20685:17;20674:9;20655:48;:::i;:::-;20647:6;20640:64;20562:156;20539:179;20764:1;20760;20752:6;20748:14;20744:22;20738:4;20731:36;20166:611;;;20129:887;;19719:1303;;;19627:1395;;:::o;21028:180::-;21076:77;21073:1;21066:88;21173:4;21170:1;21163:15;21197:4;21194:1;21187:15;21214:194;21254:4;21274:20;21292:1;21274:20;:::i;:::-;21269:25;;21308:20;21326:1;21308:20;:::i;:::-;21303:25;;21352:1;21349;21345:9;21337:17;;21376:1;21370:4;21367:11;21364:37;;;21381:18;;:::i;:::-;21364:37;21214:194;;;;:::o;21414:180::-;21462:77;21459:1;21452:88;21559:4;21556:1;21549:15;21583:4;21580:1;21573:15;21600:180;21648:77;21645:1;21638:88;21745:4;21742:1;21735:15;21769:4;21766:1;21759:15;21786:168;21869:11;21903:6;21898:3;21891:19;21943:4;21938:3;21934:14;21919:29;;21786:168;;;;:::o;21960:114::-;;:::o;22080:362::-;22221:3;22242:65;22305:1;22300:3;22242:65;:::i;:::-;22235:72;;22316:93;22405:3;22316:93;:::i;:::-;22434:1;22429:3;22425:11;22418:18;;22080:362;;;:::o;22448:748::-;22697:4;22735:3;22724:9;22720:19;22712:27;;22749:71;22817:1;22806:9;22802:17;22793:6;22749:71;:::i;:::-;22830:72;22898:2;22887:9;22883:18;22874:6;22830:72;:::i;:::-;22912;22980:2;22969:9;22965:18;22956:6;22912:72;:::i;:::-;23031:9;23025:4;23021:20;23016:2;23005:9;23001:18;22994:48;23059:130;23184:4;23059:130;:::i;:::-;23051:138;;22448:748;;;;;;:::o;23202:149::-;23238:7;23278:66;23271:5;23267:78;23256:89;;23202:149;;;:::o;23357:120::-;23429:23;23446:5;23429:23;:::i;:::-;23422:5;23419:34;23409:62;;23467:1;23464;23457:12;23409:62;23357:120;:::o;23483:141::-;23539:5;23570:6;23564:13;23555:22;;23586:32;23612:5;23586:32;:::i;:::-;23483:141;;;;:::o;23630:349::-;23699:6;23748:2;23736:9;23727:7;23723:23;23719:32;23716:119;;;23754:79;;:::i;:::-;23716:119;23874:1;23899:63;23954:7;23945:6;23934:9;23930:22;23899:63;:::i;:::-;23889:73;;23845:127;23630:349;;;;:::o;23985:148::-;24087:11;24124:3;24109:18;;23985:148;;;;:::o;24139:173::-;24279:25;24275:1;24267:6;24263:14;24256:49;24139:173;:::o;24318:402::-;24478:3;24499:85;24581:2;24576:3;24499:85;:::i;:::-;24492:92;;24593:93;24682:3;24593:93;:::i;:::-;24711:2;24706:3;24702:12;24695:19;;24318:402;;;:::o;24726:79::-;24765:7;24794:5;24783:16;;24726:79;;;:::o;24811:157::-;24916:45;24936:24;24954:5;24936:24;:::i;:::-;24916:45;:::i;:::-;24911:3;24904:58;24811:157;;:::o;24974:663::-;25215:3;25237:148;25381:3;25237:148;:::i;:::-;25230:155;;25395:75;25466:3;25457:6;25395:75;:::i;:::-;25495:2;25490:3;25486:12;25479:19;;25508:75;25579:3;25570:6;25508:75;:::i;:::-;25608:2;25603:3;25599:12;25592:19;;25628:3;25621:10;;24974:663;;;;;:::o;25643:180::-;25691:77;25688:1;25681:88;25788:4;25785:1;25778:15;25812:4;25809:1;25802:15;25829:176;25861:1;25878:20;25896:1;25878:20;:::i;:::-;25873:25;;25912:20;25930:1;25912:20;:::i;:::-;25907:25;;25951:1;25941:35;;25956:18;;:::i;:::-;25941:35;25997:1;25994;25990:9;25985:14;;25829:176;;;;:::o;26011:223::-;26151:34;26147:1;26139:6;26135:14;26128:58;26220:6;26215:2;26207:6;26203:15;26196:31;26011:223;:::o;26240:402::-;26400:3;26421:85;26503:2;26498:3;26421:85;:::i;:::-;26414:92;;26515:93;26604:3;26515:93;:::i;:::-;26633:2;26628:3;26624:12;26617:19;;26240:402;;;:::o;26648:663::-;26889:3;26911:148;27055:3;26911:148;:::i;:::-;26904:155;;27069:75;27140:3;27131:6;27069:75;:::i;:::-;27169:2;27164:3;27160:12;27153:19;;27182:75;27253:3;27244:6;27182:75;:::i;:::-;27282:2;27277:3;27273:12;27266:19;;27302:3;27295:10;;26648:663;;;;;:::o;27317:390::-;27423:3;27451:39;27484:5;27451:39;:::i;:::-;27506:89;27588:6;27583:3;27506:89;:::i;:::-;27499:96;;27604:65;27662:6;27657:3;27650:4;27643:5;27639:16;27604:65;:::i;:::-;27694:6;27689:3;27685:16;27678:23;;27427:280;27317:390;;;;:::o;27713:242::-;27882:66;27877:3;27870:79;27713:242;:::o;27961:542::-;28184:3;28206:95;28297:3;28288:6;28206:95;:::i;:::-;28199:102;;28311:138;28445:3;28311:138;:::i;:::-;28474:2;28469:3;28465:12;28458:19;;28494:3;28487:10;;27961:542;;;;:::o;28509:242::-;28678:66;28673:3;28666:79;28509:242;:::o;28757:542::-;28980:3;29002:95;29093:3;29084:6;29002:95;:::i;:::-;28995:102;;29107:138;29241:3;29107:138;:::i;:::-;29270:2;29265:3;29261:12;29254:19;;29290:3;29283:10;;28757:542;;;;:::o;29305:170::-;29469:3;29464;29457:16;29305:170;:::o;29477:519::-;29699:3;29717:95;29808:3;29799:6;29717:95;:::i;:::-;29710:102;;29818:137;29951:3;29818:137;:::i;:::-;29976:1;29971:3;29967:11;29960:18;;29991:3;29984:10;;29477:519;;;;:::o;29998:419::-;30178:3;30196:95;30287:3;30278:6;30196:95;:::i;:::-;30189:102;;30304:95;30395:3;30386:6;30304:95;:::i;:::-;30297:102;;30412:3;30405:10;;29998:419;;;;;:::o;30419:171::-;30459:3;30474:20;30492:1;30474:20;:::i;:::-;30469:25;;30504:20;30522:1;30504:20;:::i;:::-;30499:25;;30543:1;30540;30536:9;30529:16;;30560:3;30557:1;30554:10;30551:36;;;30567:18;;:::i;:::-;30551:36;30419:171;;;;:::o;30592:233::-;30756:66;30751:3;30744:79;30592:233;:::o;30827:519::-;31049:3;31060:137;31193:3;31060:137;:::i;:::-;31218:1;31213:3;31209:11;31202:18;;31233:95;31324:3;31315:6;31233:95;:::i;:::-;31226:102;;31341:3;31334:10;;30827:519;;;;:::o;31348:234::-;31513:66;31508:3;31501:79;31348:234;:::o;31584:522::-;31807:3;31818:138;31952:3;31818:138;:::i;:::-;31977:2;31972:3;31968:12;31961:19;;31993:95;32084:3;32075:6;31993:95;:::i;:::-;31986:102;;32101:3;32094:10;;31584:522;;;;:::o;32108:563::-;32244:66;32240:1;32232:6;32228:14;32221:90;32341:34;32336:2;32328:6;32324:15;32317:59;32406:66;32401:2;32393:6;32389:15;32382:91;32503:66;32498:2;32490:6;32486:15;32479:91;32601:66;32595:3;32587:6;32583:16;32576:92;32108:563;:::o;32673:388::-;32833:3;32850:86;32932:3;32927;32850:86;:::i;:::-;32843:93;;32941;33030:3;32941:93;:::i;:::-;33055:3;33050;33046:13;33039:20;;32673:388;;;:::o;33063:525::-;33296:3;33314:95;33405:3;33396:6;33314:95;:::i;:::-;33307:102;;33422:148;33566:3;33422:148;:::i;:::-;33415:155;;33583:3;33576:10;;33063:525;;;;:::o;33610:794::-;33713:3;33746:5;33740:12;33771:36;33797:9;33771:36;:::i;:::-;33819:89;33901:6;33896:3;33819:89;:::i;:::-;33812:96;;33935:1;33924:9;33920:17;33947:1;33942:150;;;;34102:1;34097:305;;;;33913:489;;33942:150;34018:4;34014:9;34003;33999:25;33994:3;33987:38;34076:6;34069:14;34062:22;34054:6;34050:35;34045:3;34041:45;34034:52;;33942:150;;34097:305;34156:38;34188:5;34156:38;:::i;:::-;34212:1;34222:142;34236:6;34233:1;34230:13;34222:142;;;34306:7;34300:14;34296:1;34291:3;34287:11;34280:35;34352:1;34343:7;34339:15;34328:26;;34258:4;34255:1;34251:12;34246:17;;34222:142;;;34389:6;34384:3;34380:16;34373:23;;34104:298;;33913:489;;33717:687;;33610:794;;;;:::o;34406:413::-;34583:3;34601:92;34689:3;34680:6;34601:92;:::i;:::-;34594:99;;34706:95;34797:3;34788:6;34706:95;:::i;:::-;34699:102;;34814:3;34807:10;;34406:413;;;;;:::o;34821:234::-;34986:66;34981:3;34974:79;34821:234;:::o;35057:522::-;35280:3;35291:138;35425:3;35291:138;:::i;:::-;35450:2;35445:3;35441:12;35434:19;;35466:95;35557:3;35548:6;35466:95;:::i;:::-;35459:102;;35574:3;35567:10;;35057:522;;;;:::o;35581:167::-;35741:4;35736:3;35729:17;35581:167;:::o;35750:503::-;35972:3;35986:95;36077:3;36068:6;35986:95;:::i;:::-;35979:102;;36083:137;36216:3;36083:137;:::i;:::-;36237:1;36232:3;36228:11;36221:18;;36248:3;36241:10;;35750:503;;;;:::o;36273:286::-;36369:3;36382:70;36445:6;36440:3;36382:70;:::i;:::-;36375:77;;36454:56;36503:6;36498:3;36491:5;36454:56;:::i;:::-;36527:29;36549:6;36527:29;:::i;:::-;36522:3;36518:39;36511:46;;36273:286;;;;;:::o;36561:608::-;36766:4;36796:3;36785:9;36781:19;36773:27;;36802:71;36870:1;36859:9;36855:17;36846:6;36802:71;:::i;:::-;36875:72;36943:2;36932:9;36928:18;36919:6;36875:72;:::i;:::-;36949;37017:2;37006:9;37002:18;36993:6;36949:72;:::i;:::-;37060:9;37054:4;37050:20;37045:2;37034:9;37030:18;37023:48;37080:86;37161:4;37152:6;37144;37080:86;:::i;:::-;37072:94;;36561:608;;;;;;;;:::o;37171:193::-;37332:29;37327:3;37320:42;37171:193;:::o;37366:506::-;37589:3;37596:138;37730:3;37596:138;:::i;:::-;37751:2;37746:3;37742:12;37735:19;;37763:95;37854:3;37845:6;37763:95;:::i;:::-;37756:102;;37867:3;37860:10;;37366:506;;;;:::o;37874:166::-;38034:3;38029;38022:16;37874:166;:::o;38042:503::-;38264:3;38278:95;38369:3;38360:6;38278:95;:::i;:::-;38271:102;;38375:137;38508:3;38375:137;:::i;:::-;38529:1;38524:3;38520:11;38513:18;;38540:3;38533:10;;38042:503;;;;:::o;38547:166::-;38707:3;38702;38695:16;38547:166;:::o;38715:503::-;38937:3;38951:95;39042:3;39033:6;38951:95;:::i;:::-;38944:102;;39048:137;39181:3;39048:137;:::i;:::-;39202:1;39197:3;39193:11;39186:18;;39213:3;39206:10;;38715:503;;;;:::o;39220:82::-;39262:8;39293:5;39290:1;39286:13;39273:26;;39220:82;;;:::o;39304:700::-;39365:5;39372:4;39388:6;39379:15;;39404:5;39395:14;;39410:592;39431:1;39421:8;39418:15;39410:592;;;39502:4;39497:3;39493:14;39487:4;39484:24;39481:50;;;39511:18;;:::i;:::-;39481:50;39553:1;39543:8;39539:16;39536:387;;;39912:4;39905:5;39901:16;39892:25;;39536:387;39946:4;39940;39936:15;39928:23;;39968:32;39991:8;39968:32;:::i;:::-;39956:44;;39410:592;;;39304:700;;;;;;;:::o;40006:845::-;40060:5;40219:8;40209:40;;40240:1;40231:10;;40242:5;;40209:40;40260:4;40250:36;;40277:1;40268:10;;40279:5;;40250:36;40330:4;40362:1;40357:27;;;;40390:1;40385:143;;;;40323:205;;40357:27;40375:1;40366:10;;40377:5;;;40385:143;40414:3;40404:8;40401:17;40398:43;;;40421:18;;:::i;:::-;40398:43;40462:8;40459:1;40455:16;40446:25;;40489:3;40482:5;40479:14;40476:40;;;40496:18;;:::i;:::-;40476:40;40521:5;;;40323:205;;40613:2;40603:8;40600:16;40594:3;40588:4;40585:13;40581:36;40571:2;40561:8;40558:16;40553:2;40547:4;40544:12;40540:35;40532:87;40529:182;;;40645:8;40639:4;40635:19;40626:28;;40672:3;40665:5;40662:14;40659:40;;;40679:18;;:::i;:::-;40659:40;40704:5;;40529:182;40728:42;40766:3;40756:8;40750:4;40747:1;40728:42;:::i;:::-;40713:57;;;;40794:4;40789:3;40785:14;40778:5;40775:25;40772:51;;;40803:18;;:::i;:::-;40772:51;40844:4;40837:5;40833:16;40824:25;;40006:845;;;;;;:::o;40853:253::-;40911:5;40927:23;40945:4;40927:23;:::i;:::-;40919:31;;40963:25;40979:8;40963:25;:::i;:::-;40951:37;;40999:104;41036:66;41026:8;41020:4;40999:104;:::i;:::-;40990:113;;40853:253;;;;:::o;41108:149::-;41148:1;41157:20;41175:1;41157:20;:::i;:::-;41152:25;;41183:20;41201:1;41183:20;:::i;:::-;41178:25;;41214:1;41204:35;;41219:18;;:::i;:::-;41204:35;41253:1;41250;41246:9;41241:14;;41108:149;;;;:::o;41259:123::-;41316:5;41339:6;41333:13;41324:22;;41347:33;41374:5;41347:33;:::i;:::-;41259:123;;;;:::o;41384:307::-;41454:6;41495:2;41483:9;41474:7;41470:23;41466:32;41463:119;;;41501:79;;:::i;:::-;41463:119;41605:1;41622:64;41678:7;41669:6;41658:9;41654:22;41622:64;:::i;:::-;41612:74;;41584:104;41384:307;;;;:::o;41693:65::-;41730:7;41751:5;41740:16;;41693:65;;;:::o;41760:67::-;41799:7;41820:5;41809:16;;41760:67;;;:::o;41829:145::-;41926:45;41946:24;41964:5;41946:24;:::i;:::-;41926:45;:::i;:::-;41921:3;41914:58;41829:145;;:::o;41976:353::-;42116:3;42123:75;42194:3;42185:6;42123:75;:::i;:::-;42215:2;42210:3;42206:12;42199:19;;42220:75;42291:3;42282:6;42220:75;:::i;:::-;42312:2;42307:3;42303:12;42296:19;;42324:3;42317:10;;41976:353;;;;;:::o;42331:157::-;42463:21;42459:1;42451:6;42447:14;42440:45;42331:157;:::o;42490:338::-;42632:3;42645:67;42709:2;42704:3;42645:67;:::i;:::-;42638:74;;42713:93;42802:3;42713:93;:::i;:::-;42823:2;42818:3;42814:12;42807:19;;42490:338;;;:::o;42830:391::-;42996:4;43026:2;43015:9;43011:18;43003:26;;43067:9;43061:4;43057:20;43053:1;43042:9;43038:17;43031:47;43087:131;43213:4;43087:131;:::i;:::-;43079:139;;42830:391;;;:::o
Swarm Source
ipfs://e787dba97cf251b70316324b95a1006752f35436591597fb573eb624057f7427
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ 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.