ETH Price: $2,039.53 (+0.56%)
 

More Info

Private Name Tags

TokenTracker

Multichain Info

No addresses found
Transaction Hash
Block
From
To
Transfer420216012026-02-11 17:55:4927 days ago1770832549IN
CHOOCH: CHOOCH Token
0 ETH0.000000620.01122825
Approve411945592026-01-23 14:27:4546 days ago1769178465IN
CHOOCH: CHOOCH Token
0 ETH0.000000620.01224182
Approve405145582026-01-07 20:41:0362 days ago1767818463IN
CHOOCH: CHOOCH Token
0 ETH0.000000140.00276712
Approve402533262026-01-01 19:33:1968 days ago1767295999IN
CHOOCH: CHOOCH Token
0 ETH0.000000090.00177864
Approve400227422025-12-27 11:27:1173 days ago1766834831IN
CHOOCH: CHOOCH Token
0 ETH0.000000020.00050005
Approve400226162025-12-27 11:22:5973 days ago1766834579IN
CHOOCH: CHOOCH Token
0 ETH0.000000020.0005
Approve399269982025-12-25 6:15:4375 days ago1766643343IN
CHOOCH: CHOOCH Token
0 ETH0.000000150.00304346
Approve399217202025-12-25 3:19:4775 days ago1766632787IN
CHOOCH: CHOOCH Token
0 ETH0.000000070.0015
Approve397197232025-12-20 11:06:3380 days ago1766228793IN
CHOOCH: CHOOCH Token
0 ETH0.000000070.00143767
Approve393890852025-12-12 19:25:1788 days ago1765567517IN
CHOOCH: CHOOCH Token
0 ETH0.000000080.00159964
Approve393537042025-12-11 23:45:5588 days ago1765496755IN
CHOOCH: CHOOCH Token
0 ETH0.000000060.00120773
Approve393536812025-12-11 23:45:0988 days ago1765496709IN
CHOOCH: CHOOCH Token
0 ETH0.000000060.0012
Approve393536612025-12-11 23:44:2988 days ago1765496669IN
CHOOCH: CHOOCH Token
0 ETH0.000000060.0012
Approve393107922025-12-10 23:55:3189 days ago1765410931IN
CHOOCH: CHOOCH Token
0 ETH0.000000010.00032184
Approve393106902025-12-10 23:52:0789 days ago1765410727IN
CHOOCH: CHOOCH Token
0 ETH0.000000010.00032768
Approve393104822025-12-10 23:45:1189 days ago1765410311IN
CHOOCH: CHOOCH Token
0 ETH0.000000010.0003203
Approve393080622025-12-10 22:24:3189 days ago1765405471IN
CHOOCH: CHOOCH Token
0 ETH0.000000150.00305256
Approve393079722025-12-10 22:21:3189 days ago1765405291IN
CHOOCH: CHOOCH Token
0 ETH0.000000180.00352279
Approve393057952025-12-10 21:08:5790 days ago1765400937IN
CHOOCH: CHOOCH Token
0 ETH0.000000190.00383135
Approve393057862025-12-10 21:08:3990 days ago1765400919IN
CHOOCH: CHOOCH Token
0 ETH0.000000180.00365466
Approve393057312025-12-10 21:06:4990 days ago1765400809IN
CHOOCH: CHOOCH Token
0 ETH0.000000170.00348138
Approve393021042025-12-10 19:05:5590 days ago1765393555IN
CHOOCH: CHOOCH Token
0 ETH0.000001650.03247498
Approve392775992025-12-10 5:29:0590 days ago1765344545IN
CHOOCH: CHOOCH Token
0 ETH0.000062312
Approve392775992025-12-10 5:29:0590 days ago1765344545IN
CHOOCH: CHOOCH Token
0 ETH0.000062312
Approve392765722025-12-10 4:54:5190 days ago1765342491IN
CHOOCH: CHOOCH Token
0 ETH0.000062312
View all transactions

Parent Transaction Hash Block From To
View All Internal Transactions

Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
CHOOCH

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at basescan.org on 2025-08-01
*/

// File: @openzeppelin/contracts/access/IAccessControl.sol


// OpenZeppelin Contracts (last updated v5.3.0) (access/IAccessControl.sol)

pragma solidity ^0.8.20;

/**
 * @dev External interface of AccessControl declared to support ERC-165 detection.
 */
interface IAccessControl {
    /**
     * @dev The `account` is missing a role.
     */
    error AccessControlUnauthorizedAccount(address account, bytes32 neededRole);

    /**
     * @dev The caller of a function is not the expected one.
     *
     * NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.
     */
    error AccessControlBadConfirmation();

    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted to signal this.
     */
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call. This account bears the admin role (for the granted role).
     * Expected in cases where the role was granted using the internal {AccessControl-_grantRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) external view returns (bool);

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {AccessControl-_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) external view returns (bytes32);

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `callerConfirmation`.
     */
    function renounceRole(bytes32 role, address callerConfirmation) external;
}

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


// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)

pragma solidity ^0.8.20;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/IERC165.sol)

pragma solidity ^0.8.20;

/**
 * @dev Interface of the ERC-165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[ERC].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/ERC165.sol)

pragma solidity ^0.8.20;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC-165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

// File: @openzeppelin/contracts/access/AccessControl.sol


// OpenZeppelin Contracts (last updated v5.3.0) (access/AccessControl.sol)

pragma solidity ^0.8.20;




/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms. This is a lightweight version that doesn't allow enumerating role
 * members except through off-chain means by accessing the contract event logs. Some
 * applications may benefit from on-chain enumerability, for those cases see
 * {AccessControlEnumerable}.
 *
 * Roles are referred to by their `bytes32` identifier. These should be exposed
 * in the external API and be unique. The best way to achieve this is by
 * using `public constant` hash digests:
 *
 * ```solidity
 * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
 * ```
 *
 * Roles can be used to represent a set of permissions. To restrict access to a
 * function call, use {hasRole}:
 *
 * ```solidity
 * function foo() public {
 *     require(hasRole(MY_ROLE, msg.sender));
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {_setRoleAdmin}.
 *
 * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules}
 * to enforce additional security measures for this role.
 */
abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping(address account => bool) hasRole;
        bytes32 adminRole;
    }

    mapping(bytes32 role => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Modifier that checks that an account has a specific role. Reverts
     * with an {AccessControlUnauthorizedAccount} error including the required role.
     */
    modifier onlyRole(bytes32 role) {
        _checkRole(role);
        _;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view virtual returns (bool) {
        return _roles[role].hasRole[account];
    }

    /**
     * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `_msgSender()`
     * is missing `role`. Overriding this function changes the behavior of the {onlyRole} modifier.
     */
    function _checkRole(bytes32 role) internal view virtual {
        _checkRole(role, _msgSender());
    }

    /**
     * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `account`
     * is missing `role`.
     */
    function _checkRole(bytes32 role, address account) internal view virtual {
        if (!hasRole(role, account)) {
            revert AccessControlUnauthorizedAccount(account, role);
        }
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view virtual returns (bytes32) {
        return _roles[role].adminRole;
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     *
     * May emit a {RoleGranted} event.
     */
    function grantRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {
        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     *
     * May emit a {RoleRevoked} event.
     */
    function revokeRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {
        _revokeRole(role, account);
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been revoked `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `callerConfirmation`.
     *
     * May emit a {RoleRevoked} event.
     */
    function renounceRole(bytes32 role, address callerConfirmation) public virtual {
        if (callerConfirmation != _msgSender()) {
            revert AccessControlBadConfirmation();
        }

        _revokeRole(role, callerConfirmation);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        bytes32 previousAdminRole = getRoleAdmin(role);
        _roles[role].adminRole = adminRole;
        emit RoleAdminChanged(role, previousAdminRole, adminRole);
    }

    /**
     * @dev Attempts to grant `role` to `account` and returns a boolean indicating if `role` was granted.
     *
     * Internal function without access restriction.
     *
     * May emit a {RoleGranted} event.
     */
    function _grantRole(bytes32 role, address account) internal virtual returns (bool) {
        if (!hasRole(role, account)) {
            _roles[role].hasRole[account] = true;
            emit RoleGranted(role, account, _msgSender());
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Attempts to revoke `role` from `account` and returns a boolean indicating if `role` was revoked.
     *
     * Internal function without access restriction.
     *
     * May emit a {RoleRevoked} event.
     */
    function _revokeRole(bytes32 role, address account) internal virtual returns (bool) {
        if (hasRole(role, account)) {
            _roles[role].hasRole[account] = false;
            emit RoleRevoked(role, account, _msgSender());
            return true;
        } else {
            return false;
        }
    }
}

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be _NOT_ENTERED
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;
    }

    function _nonReentrantAfter() private {
        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
     * `nonReentrant` function in the call stack.
     */
    function _reentrancyGuardEntered() internal view returns (bool) {
        return _status == _ENTERED;
    }
}

// File: @openzeppelin/contracts/security/Pausable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        _requireNotPaused();
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        _requirePaused();
        _;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Throws if the contract is paused.
     */
    function _requireNotPaused() internal view virtual {
        require(!paused(), "Pausable: paused");
    }

    /**
     * @dev Throws if the contract is not paused.
     */
    function _requirePaused() internal view virtual {
        require(paused(), "Pausable: not paused");
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

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


// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.20;

/**
 * @dev Interface of the ERC-20 standard as defined in the ERC.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

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

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

    /**
     * @dev Moves a `value` amount of tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 value) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the
     * caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 value) external returns (bool);

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to` using the
     * allowance mechanism. `value` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 value) external returns (bool);
}

// File: CHOOCH.sol


pragma solidity 0.8.20;






/**
 * @title CHOOCH - The Token That Actually Goes Hard (Trust Edition)
 * @dev Built different with minimal admin powers because we're not trying to rug you
 * 
 * 🔥 CHOOCH PHILOSOPHY: Maximum sesh energy, minimal admin control, zero bullshit
 * 
 * 🚀 WHY CHOOCH HITS DIFFERENT:
 * ✅ 0% Taxes Forever (No greedy admin fee extractions - we're not parasites)
 * ✅ Minimal Admin Powers (Can't drain your bag even if we wanted to)
 * ✅ Lossless Protection (Actual hack prevention that works)
 * ✅ Built-in Decentralization (Admin powers get renounced like your ex)
 * ✅ Burn Features (Community can torch supply when feeling destructive)  
 * ✅ Anti-Bot Launch Protection (Fuck the snipers, real gators only)
 * ✅ Emergency Pause Only (For hack protection, not power trips)
 * ✅ Community Governance Ready (Multisig transition built-in)
 * 
 * 🛡️ TRUST-FIRST ARCHITECTURE:
 * We could have given ourselves god mode powers, but that's sus as fuck.
 * Instead we built this with minimal admin control because:
 * - Can't print tokens (supply is immutable like your bad decisions)
 * - Can't drain wallets (your bag stays your bag)
 * - Can't change taxes (0% forever, we're not the IRS)
 * - Can't blacklist arbitrarily (decentralized means decentralized)
 * - Launch controls expire after 24h (then it's full degen mode)
 * - Admin powers can be renounced (full decentralization when ready)
 * 
 * 📊 THE NUMBERS:
 * - Total Supply: 1,690,420,069,000 CHOOCH (1.69T - nice)
 * - 18 decimals for maximum compatibility
 * - Zero taxes, zero admin extraction, zero rugpull capability
 * - Deflationary burns available for when we're feeling destructive
 * 
 * 🎯 BUILT FOR THE LONG SESH:
 * This isn't another admin-controlled shitcoin. We built CHOOCH with minimal 
 * admin powers because trust is earned, not demanded. Launch controls help 
 * prevent bot snipers, then we step back and let the community take over.
 * That's how you build something that actually lasts longer than your 
 * attention span after a 3-day bender.
 */

// ============ LOSSLESS PROTOCOL INTERFACES ============
interface ILosslessController {
    function beforeTransfer(address sender, address recipient, uint256 amount) external;
    function afterTransfer(address sender, address recipient, uint256 amount) external;
    function beforeTransferFrom(address msgSender, address sender, address recipient, uint256 amount) external;
    function afterTransferFrom(address msgSender, address sender, address recipient, uint256 amount) external;
    function beforeApprove(address sender, address spender, uint256 amount) external;
    function afterApprove(address sender, address spender, uint256 amount) external;
    function beforeIncreaseAllowance(address msgSender, address spender, uint256 addedValue) external;
    function afterIncreaseAllowance(address msgSender, address spender, uint256 addedValue) external;
    function beforeDecreaseAllowance(address msgSender, address spender, uint256 subtractedValue) external;
    function afterDecreaseAllowance(address msgSender, address spender, uint256 subtractedValue) external;
    function beforeMint(address to, uint256 amount) external;
    function afterMint(address to, uint256 amount) external;
    function beforeBurn(address account, uint256 amount) external;
    function afterBurn(address account, uint256 amount) external;
}

interface ILERC20 {
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    function increaseAllowance(address spender, uint256 addedValue) external returns (bool);
    function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool);

    function transferOutBlacklistedFunds(address[] calldata from) external;
    function setLosslessAdmin(address newAdmin) external;
    function transferRecoveryAdminOwnership(address candidate, bytes32 keyHash) external;
    function acceptRecoveryAdminOwnership(bytes memory key) external;
    function proposeLosslessTurnOff() external;
    function executeLosslessTurnOff() external;
    function executeLosslessTurnOn() external;
    function getAdmin() external view returns (address);

    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
    event NewAdmin(address indexed newAdmin);
    event NewRecoveryAdminProposal(address indexed candidate);
    event NewRecoveryAdmin(address indexed newRecoveryAdmin);
    event LosslessTurnOffProposal(uint256 turnOffDate);
    event LosslessOff();
    event LosslessOn();
}

contract CHOOCH is Context, ILERC20, AccessControl, ReentrancyGuard, Pausable {
    
    // ============ ERC20 BASIC INFO ============
    string private constant _name = "CHOOCH";
    string private constant _symbol = "CHOOCH";
    uint8 private constant _decimals = 18;
    uint256 private constant _totalSupply = 1690420069000 * 10**18; // 1.69T tokens - IMMUTABLE
    
    // ============ ERC20 STATE ============
    mapping(address => uint256) private _balances;
    mapping(address => mapping(address => uint256)) private _allowances;
    uint256 private _currentSupply; // Can only decrease via burns, never increase
    
    // ============ MINIMAL ROLES - TRUST FOCUSED ============
    bytes32 public constant LAUNCH_ADMIN_ROLE = keccak256("LAUNCH_ADMIN_ROLE");     // Can enable trading & set initial limits
    bytes32 public constant EMERGENCY_ROLE = keccak256("EMERGENCY_ROLE");           // Can pause in emergencies
    bytes32 public constant LOSSLESS_ADMIN_ROLE = keccak256("LOSSLESS_ADMIN_ROLE"); // Manages Lossless integration
    
    // ============ ADMIN RENUNCIATION TRACKING ============
    bool public launchAdminRenounced = false;      // Track if launch admin powers were renounced
    bool public emergencyAdminRenounced = false;   // Track if emergency admin powers were renounced
    uint256 public adminRenunciationTime;          // When admin powers were renounced
    
    // ============ LOSSLESS INTEGRATION ============
    ILosslessController public lossless;
    address public admin;
    address public recoveryAdmin;
    address private recoveryAdminCandidate;
    bytes32 private recoveryAdminKeyHash;
    uint256 public timelockPeriod;
    uint256 public losslessTurnOffTimestamp;
    bool public isLosslessOn = true;
    
    // ============ IMMUTABLE TOKEN FEATURES ============
    bool public constant IS_TAX_FREE = true;           // IMMUTABLE - Cannot be changed
    uint256 public constant BUY_TAX = 0;               // IMMUTABLE - Cannot be changed
    uint256 public constant SELL_TAX = 0;              // IMMUTABLE - Cannot be changed  
    uint256 public constant TRANSFER_TAX = 0;          // IMMUTABLE - Cannot be changed
    
    // ============ BURN FEATURES (DEFLATIONARY) ============
    uint256 public totalBurned;
    mapping(address => uint256) public burnedByAddress;
    bool public constant BURN_ENABLED = true;          // IMMUTABLE - Always enabled
    
    // ============ LAUNCH PERIOD CONTROLS (TEMPORARY) ============
    bool public tradingEnabled = false;
    uint256 public tradingEnabledTimestamp;
    uint256 public maxTransactionAmount;
    uint256 public maxWalletAmount;
    mapping(address => bool) public isExcludedFromLimits;
    
    // Launch period protection (disabled after renunciation)
    uint256 public launchTimestamp;
    uint256 public constant LAUNCH_PROTECTION_PERIOD = 24 hours; // 24h protection max
    mapping(address => uint256) public lastTransactionBlock;
    
    // ============ EVENTS ============
    event Burn(address indexed from, uint256 value);
    event TradingEnabled(uint256 timestamp);
    event LimitsUpdated(uint256 maxTransaction, uint256 maxWallet);
    event EmergencyAction(string action, address indexed actor, uint256 value);
    event SupplyReduction(uint256 newSupply, uint256 burnedAmount);
    
    // ============ TRUST & DECENTRALIZATION EVENTS ============
    event AdminRoleRenounced(bytes32 indexed role, address indexed admin, uint256 timestamp);
    event DecentralizationCompleted(uint256 timestamp);
    event CommunityGovernanceActivated(address indexed multisig, uint256 timestamp);
    
    // ============ MODIFIERS ============
    
    modifier lssTransfer(address sender, address recipient, uint256 amount) {
        if (isLosslessOn) {
            lossless.beforeTransfer(sender, recipient, amount);
        }
        _;
        if (isLosslessOn) {
            lossless.afterTransfer(sender, recipient, amount);
        }
    }
    
    modifier lssTransferFrom(address sender, address recipient, uint256 amount) {
        if (isLosslessOn) {
            lossless.beforeTransferFrom(_msgSender(), sender, recipient, amount);
        }
        _;
        if (isLosslessOn) {
            lossless.afterTransferFrom(_msgSender(), sender, recipient, amount);
        }
    }
    
    modifier lssApprove(address spender, uint256 amount) {
        if (isLosslessOn) {
            lossless.beforeApprove(_msgSender(), spender, amount);
        }
        _;
        if (isLosslessOn) {
            lossless.afterApprove(_msgSender(), spender, amount);
        }
    }
    
    modifier lssBurn(address account, uint256 amount) {
        if (isLosslessOn) {
            lossless.beforeBurn(account, amount);
        }
        _;
        if (isLosslessOn) {
            lossless.afterBurn(account, amount);
        }
    }
    
    modifier onlyDuringLaunchPeriod() {
        require(!launchAdminRenounced, "CHOOCH: Launch admin powers renounced");
        require(block.timestamp < launchTimestamp + LAUNCH_PROTECTION_PERIOD, "CHOOCH: Launch period ended");
        _;
    }
    
    modifier tradingActive() {
        require(tradingEnabled || isExcludedFromLimits[_msgSender()], "CHOOCH: Trading not enabled");
        _;
    }
    
    modifier validAddress(address account) {
        require(account != address(0), "CHOOCH: Zero address");
        _;
    }
    
    // ============ CONSTRUCTOR ============
    constructor(
        address _losslessController,
        address _losslessAdmin,
        address _emergencyAdmin,
        address _recoveryAdmin,
        uint256 _timelockPeriod
    ) {
        require(_losslessController != address(0), "CHOOCH: Invalid controller");
        require(_losslessAdmin != address(0), "CHOOCH: Invalid lossless admin");
        require(_emergencyAdmin != address(0), "CHOOCH: Invalid emergency admin");
        require(_recoveryAdmin != address(0), "CHOOCH: Invalid recovery admin");
        require(_timelockPeriod >= 1 hours, "CHOOCH: Timelock too short");
        require(_timelockPeriod <= 30 days, "CHOOCH: Timelock too long");
        
        // Initialize Lossless integration
        lossless = ILosslessController(_losslessController);
        admin = _losslessAdmin;
        recoveryAdmin = _recoveryAdmin;
        timelockPeriod = _timelockPeriod;
        
        // Set up MINIMAL role hierarchy
        _grantRole(DEFAULT_ADMIN_ROLE, _msgSender());           // For setup only
        _grantRole(LAUNCH_ADMIN_ROLE, _msgSender());            // Can enable trading & set limits
        _grantRole(EMERGENCY_ROLE, _emergencyAdmin);            // Can pause in emergencies
        _grantRole(LOSSLESS_ADMIN_ROLE, _losslessAdmin);        // Manages Lossless
        
        // Initialize IMMUTABLE token supply
        _currentSupply = _totalSupply;
        _balances[_msgSender()] = _totalSupply;
        
        // Set initial reasonable limits (can be adjusted during launch period only)
        maxTransactionAmount = _totalSupply / 200;  // 0.5%
        maxWalletAmount = _totalSupply / 100;       // 1%
        
        // Exclude important addresses from limits
        isExcludedFromLimits[_msgSender()] = true;
        isExcludedFromLimits[_losslessAdmin] = true;
        isExcludedFromLimits[_emergencyAdmin] = true;
        isExcludedFromLimits[_recoveryAdmin] = true;
        
        launchTimestamp = block.timestamp;
        
        emit Transfer(address(0), _msgSender(), _totalSupply);
    }
    
    // ============ ERC20 VIEW FUNCTIONS ============
    
    function name() public pure override returns (string memory) {
        return _name;
    }
    
    function symbol() public pure override returns (string memory) {
        return _symbol;
    }
    
    function decimals() public pure override returns (uint8) {
        return _decimals;
    }
    
    function totalSupply() public view override returns (uint256) {
        return _currentSupply;
    }
    
    function balanceOf(address account) public view override returns (uint256) {
        return _balances[account];
    }
    
    function allowance(address owner, address spender) public view override returns (uint256) {
        return _allowances[owner][spender];
    }
    
    // ============ ERC20 TRANSFER FUNCTIONS (IMMUTABLE 0% TAX) ============
    
    function transfer(address to, uint256 amount) 
        public 
        override 
        whenNotPaused
        tradingActive 
        validAddress(to) 
        lssTransfer(_msgSender(), to, amount) 
        returns (bool) 
    {
        _transfer(_msgSender(), to, amount);
        return true;
    }
    
    function transferFrom(address from, address to, uint256 amount) 
        public 
        override 
        whenNotPaused
        tradingActive 
        validAddress(to) 
        lssTransferFrom(from, to, amount) 
        returns (bool) 
    {
        uint256 currentAllowance = _allowances[from][_msgSender()];
        require(currentAllowance >= amount, "CHOOCH: Transfer exceeds allowance");
        
        _transfer(from, to, amount);
        _approve(from, _msgSender(), currentAllowance - amount);
        
        return true;
    }
    
    function approve(address spender, uint256 amount) 
        public 
        override 
        whenNotPaused
        validAddress(spender) 
        lssApprove(spender, amount) 
        returns (bool) 
    {
        _approve(_msgSender(), spender, amount);
        return true;
    }
    
    function increaseAllowance(address spender, uint256 addedValue) 
        public 
        override 
        whenNotPaused
        validAddress(spender) 
        returns (bool) 
    {
        if (isLosslessOn) {
            lossless.beforeIncreaseAllowance(_msgSender(), spender, addedValue);
        }
        
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);
        
        if (isLosslessOn) {
            lossless.afterIncreaseAllowance(_msgSender(), spender, addedValue);
        }
        
        return true;
    }
    
    function decreaseAllowance(address spender, uint256 subtractedValue) 
        public 
        override 
        whenNotPaused
        validAddress(spender) 
        returns (bool) 
    {
        if (isLosslessOn) {
            lossless.beforeDecreaseAllowance(_msgSender(), spender, subtractedValue);
        }
        
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "CHOOCH: Decreased allowance below zero");
        
        _approve(_msgSender(), spender, currentAllowance - subtractedValue);
        
        if (isLosslessOn) {
            lossless.afterDecreaseAllowance(_msgSender(), spender, subtractedValue);
        }
        
        return true;
    }
    
    // ============ INTERNAL TRANSFER LOGIC (CLEAN, NO TAX) ============
    
    function _transfer(address from, address to, uint256 amount) internal {
        require(from != address(0), "CHOOCH: Transfer from zero address");
        require(to != address(0), "CHOOCH: Transfer to zero address");
        require(_balances[from] >= amount, "CHOOCH: Transfer exceeds balance");
        
        // Launch period protection (only if admin hasn't been renounced)
        if (!launchAdminRenounced && 
            block.timestamp < launchTimestamp + LAUNCH_PROTECTION_PERIOD && 
            !isExcludedFromLimits[from] && !isExcludedFromLimits[to]) {
            require(lastTransactionBlock[from] != block.number, "CHOOCH: One transaction per block");
            lastTransactionBlock[from] = block.number;
        }
        
        // Transaction and wallet limits (only during launch period)
        if (!launchAdminRenounced && !isExcludedFromLimits[from] && !isExcludedFromLimits[to]) {
            require(amount <= maxTransactionAmount, "CHOOCH: Exceeds max transaction");
            require(_balances[to] + amount <= maxWalletAmount, "CHOOCH: Exceeds max wallet");
        }
        
        // Clean, tax-free transfer
        _balances[from] -= amount;
        _balances[to] += amount;
        
        emit Transfer(from, to, amount);
    }
    
    function _approve(address owner, address spender, uint256 amount) internal {
        require(owner != address(0), "CHOOCH: Approve from zero address");
        require(spender != address(0), "CHOOCH: Approve to zero address");
        
        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }
    
    // ============ BURNING FUNCTIONS (ALWAYS ENABLED) ============
    
    function burn(uint256 amount) external whenNotPaused {
        _burn(_msgSender(), amount);
    }
    
    function burnFrom(address account, uint256 amount) external whenNotPaused {
        uint256 currentAllowance = _allowances[account][_msgSender()];
        require(currentAllowance >= amount, "CHOOCH: Burn exceeds allowance");
        
        _burn(account, amount);
        _approve(account, _msgSender(), currentAllowance - amount);
    }
    
    function _burn(address account, uint256 amount) internal lssBurn(account, amount) {
        require(account != address(0), "CHOOCH: Burn from zero address");
        require(_balances[account] >= amount, "CHOOCH: Burn exceeds balance");
        require(amount > 0, "CHOOCH: Cannot burn zero amount");
        require(_currentSupply >= amount, "CHOOCH: Burn exceeds supply");
        
        _balances[account] -= amount;
        _currentSupply -= amount;
        totalBurned += amount;
        burnedByAddress[account] += amount;
        
        emit Transfer(account, address(0), amount);
        emit Burn(account, amount);
        emit SupplyReduction(_currentSupply, totalBurned);
    }
    
    // ============ MINIMAL ADMIN FUNCTIONS (LAUNCH PERIOD ONLY) ============
    
    function enableTrading() external onlyRole(LAUNCH_ADMIN_ROLE) {
        require(!tradingEnabled, "CHOOCH: Trading already enabled");
        tradingEnabled = true;
        tradingEnabledTimestamp = block.timestamp;
        emit TradingEnabled(block.timestamp);
    }
    
    function updateLimits(uint256 _maxTransaction, uint256 _maxWallet) 
        external 
        onlyRole(LAUNCH_ADMIN_ROLE) 
        onlyDuringLaunchPeriod
    {
        require(_maxTransaction > 0, "CHOOCH: Max transaction cannot be zero");
        require(_maxWallet > 0, "CHOOCH: Max wallet cannot be zero");
        require(_maxTransaction <= _totalSupply, "CHOOCH: Max transaction exceeds supply");
        require(_maxWallet <= _totalSupply, "CHOOCH: Max wallet exceeds supply");
        require(_maxTransaction >= _totalSupply / 1000, "CHOOCH: Max transaction too low"); // 0.1% min
        require(_maxWallet >= _totalSupply / 500, "CHOOCH: Max wallet too low"); // 0.2% min
        
        maxTransactionAmount = _maxTransaction;
        maxWalletAmount = _maxWallet;
        emit LimitsUpdated(_maxTransaction, _maxWallet);
    }
    
    function excludeFromLimits(address account, bool excluded) 
        external 
        onlyRole(LAUNCH_ADMIN_ROLE) 
        onlyDuringLaunchPeriod
        validAddress(account) 
    {
        isExcludedFromLimits[account] = excluded;
    }
    
    // ============ EMERGENCY FUNCTIONS (MINIMAL & TRANSPARENT) ============
    
    function pause() external onlyRole(EMERGENCY_ROLE) {
        _pause();
        emit EmergencyAction("Contract Paused", _msgSender(), block.timestamp);
    }
    
    function unpause() external onlyRole(EMERGENCY_ROLE) {
        _unpause();
        emit EmergencyAction("Contract Unpaused", _msgSender(), block.timestamp);
    }
    
    // IMPORTANT: Can only recover tokens that are NOT CHOOCH tokens
    function emergencyRecoverAccidentalTokens(address token, address to, uint256 amount) 
        external 
        onlyRole(EMERGENCY_ROLE) 
        nonReentrant 
        validAddress(to)
    {
        require(token != address(this), "CHOOCH: Cannot recover CHOOCH tokens");
        require(amount > 0, "CHOOCH: Amount must be greater than zero");
        
        if (token == address(0)) {
            // Recover accidentally sent ETH
            require(address(this).balance >= amount, "CHOOCH: Insufficient ETH balance");
            payable(to).transfer(amount);
        } else {
            // Recover accidentally sent other tokens
            require(IERC20(token).balanceOf(address(this)) >= amount, "CHOOCH: Insufficient token balance");
            IERC20(token).transfer(to, amount);
        }
        
        emit EmergencyAction("Accidental Token Recovery", to, amount);
    }
    
    // ============ ADMIN RENUNCIATION FUNCTIONS (DECENTRALIZATION) ============
    
    function renounceLaunchAdmin() external onlyRole(LAUNCH_ADMIN_ROLE) {
        require(!launchAdminRenounced, "CHOOCH: Already renounced");
        
        launchAdminRenounced = true;
        adminRenunciationTime = block.timestamp;
        
        _revokeRole(LAUNCH_ADMIN_ROLE, _msgSender());
        
        emit AdminRoleRenounced(LAUNCH_ADMIN_ROLE, _msgSender(), block.timestamp);
        
        // Check if all admin roles are renounced
        if (launchAdminRenounced && emergencyAdminRenounced) {
            emit DecentralizationCompleted(block.timestamp);
        }
    }
    
    function renounceEmergencyAdmin() external onlyRole(EMERGENCY_ROLE) {
        require(!emergencyAdminRenounced, "CHOOCH: Already renounced");
        
        emergencyAdminRenounced = true;
        if (adminRenunciationTime == 0) {
            adminRenunciationTime = block.timestamp;
        }
        
        _revokeRole(EMERGENCY_ROLE, _msgSender());
        
        emit AdminRoleRenounced(EMERGENCY_ROLE, _msgSender(), block.timestamp);
        
        // Check if all admin roles are renounced
        if (launchAdminRenounced && emergencyAdminRenounced) {
            emit DecentralizationCompleted(block.timestamp);
        }
    }
    
    function transferEmergencyRoleToMultisig(address multisig) 
        external 
        onlyRole(EMERGENCY_ROLE) 
        validAddress(multisig)
    {
        require(!emergencyAdminRenounced, "CHOOCH: Emergency role already renounced");
        require(multisig != _msgSender(), "CHOOCH: Cannot transfer to self");
        
        _grantRole(EMERGENCY_ROLE, multisig);
        _revokeRole(EMERGENCY_ROLE, _msgSender());
        
        emit CommunityGovernanceActivated(multisig, block.timestamp);
    }
    
    // ============ LOSSLESS FUNCTIONS (HACK PROTECTION) ============
    
    function getAdmin() public view override returns (address) {
        return admin;
    }
    
    function setLosslessAdmin(address newAdmin) external override onlyRole(LOSSLESS_ADMIN_ROLE) {
        require(newAdmin != address(0), "CHOOCH: Invalid admin");
        require(newAdmin != admin, "CHOOCH: Same admin");
        emit NewAdmin(newAdmin);
        admin = newAdmin;
    }
    
    function transferRecoveryAdminOwnership(address candidate, bytes32 keyHash) 
        external 
        override 
        onlyRole(LOSSLESS_ADMIN_ROLE)
    {
        require(candidate != address(0), "CHOOCH: Invalid candidate");
        recoveryAdminCandidate = candidate;
        recoveryAdminKeyHash = keyHash;
        emit NewRecoveryAdminProposal(candidate);
    }
    
    function acceptRecoveryAdminOwnership(bytes memory key) external override {
        require(_msgSender() == recoveryAdminCandidate, "CHOOCH: Not candidate");
        require(keccak256(key) == recoveryAdminKeyHash, "CHOOCH: Invalid key");
        
        emit NewRecoveryAdmin(recoveryAdminCandidate);
        recoveryAdmin = recoveryAdminCandidate;
        recoveryAdminCandidate = address(0);
        recoveryAdminKeyHash = bytes32(0);
    }
    
    function proposeLosslessTurnOff() external override onlyRole(LOSSLESS_ADMIN_ROLE) {
        require(losslessTurnOffTimestamp == 0, "CHOOCH: Already proposed");
        require(isLosslessOn, "CHOOCH: Already off");
        
        losslessTurnOffTimestamp = block.timestamp + timelockPeriod;
        emit LosslessTurnOffProposal(losslessTurnOffTimestamp);
    }
    
    function executeLosslessTurnOff() external override onlyRole(LOSSLESS_ADMIN_ROLE) {
        require(losslessTurnOffTimestamp != 0, "CHOOCH: Not proposed");
        require(block.timestamp >= losslessTurnOffTimestamp, "CHOOCH: Timelock active");
        
        isLosslessOn = false;
        losslessTurnOffTimestamp = 0;
        emit LosslessOff();
    }
    
    function executeLosslessTurnOn() external override onlyRole(LOSSLESS_ADMIN_ROLE) {
        require(!isLosslessOn, "CHOOCH: Already on");
        
        isLosslessOn = true;
        losslessTurnOffTimestamp = 0;
        emit LosslessOn();
    }
    
    function transferOutBlacklistedFunds(address[] calldata from) 
        external 
        override 
    {
        require(_msgSender() == address(lossless), "CHOOCH: Only lossless");
        require(isLosslessOn, "CHOOCH: Lossless off");
        require(from.length > 0, "CHOOCH: Empty array");
        
        uint256 totalAmount = 0;
        
        for (uint256 i = 0; i < from.length; i++) {
            address fromAddress = from[i];
            require(fromAddress != address(0), "CHOOCH: Invalid address");
            uint256 balance = _balances[fromAddress];
            
            if (balance > 0) {
                _balances[fromAddress] = 0;
                totalAmount += balance;
                emit Transfer(fromAddress, address(lossless), balance);
            }
        }
        
        if (totalAmount > 0) {
            _balances[address(lossless)] += totalAmount;
        }
    }
    
    // ============ VIEW FUNCTIONS ============
    
    function currentSupply() external view returns (uint256) {
        return _currentSupply;
    }
    
    function burnRate() external view returns (uint256) {
        if (_totalSupply == 0) return 0;
        return (totalBurned * 10000) / _totalSupply; // Basis points
    }
    
    function getTokenomicsInfo() external pure returns (
        uint256 buyTax,
        uint256 sellTax,
        uint256 transferTax,
        bool isTaxFree,
        string memory description
    ) {
        return (
            BUY_TAX,
            SELL_TAX,
            TRANSFER_TAX,
            IS_TAX_FREE,
            "CHOOCH: 100% tax-free forever, minimal admin powers, maximum trust"
        );
    }
    
    function isLaunched() external view returns (bool) {
        return block.timestamp >= launchTimestamp;
    }
    
    function getLaunchInfo() external view returns (
        uint256 timestamp,
        bool trading,
        uint256 tradingTimestamp,
        bool protectionActive,
        bool launchPeriodEnded
    ) {
        return (
            launchTimestamp,
            tradingEnabled,
            tradingEnabledTimestamp,
            block.timestamp < launchTimestamp + LAUNCH_PROTECTION_PERIOD,
            block.timestamp >= launchTimestamp + LAUNCH_PROTECTION_PERIOD
        );
    }
    
    function getDecentralizationInfo() external view returns (
        bool launchAdminActive,
        bool emergencyAdminActive,
        bool fullyDecentralized,
        uint256 renunciationTimestamp,
        bool limitsActive
    ) {
        bool fullyDecentral = launchAdminRenounced && emergencyAdminRenounced;
        bool limitsStillActive = !launchAdminRenounced && 
                                block.timestamp < launchTimestamp + LAUNCH_PROTECTION_PERIOD;
        
        return (
            !launchAdminRenounced,
            !emergencyAdminRenounced,
            fullyDecentral,
            adminRenunciationTime,
            limitsStillActive
        );
    }
    
    function getSecurityInfo() external view returns (
        bool losslessActive,
        address losslessController,
        address currentAdmin,
        address currentRecoveryAdmin,
        uint256 timelock
    ) {
        return (
            isLosslessOn,
            address(lossless),
            admin,
            recoveryAdmin,
            timelockPeriod
        );
    }
    
    // ============ RECEIVE/FALLBACK ============
    receive() external payable {
        revert("CHOOCH: Direct ETH not accepted");
    }
    
    fallback() external payable {
        revert("CHOOCH: Function does not exist");
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_losslessController","type":"address"},{"internalType":"address","name":"_losslessAdmin","type":"address"},{"internalType":"address","name":"_emergencyAdmin","type":"address"},{"internalType":"address","name":"_recoveryAdmin","type":"address"},{"internalType":"uint256","name":"_timelockPeriod","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"admin","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"AdminRoleRenounced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"multisig","type":"address"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"CommunityGovernanceActivated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"DecentralizationCompleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"action","type":"string"},{"indexed":true,"internalType":"address","name":"actor","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"EmergencyAction","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"maxTransaction","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxWallet","type":"uint256"}],"name":"LimitsUpdated","type":"event"},{"anonymous":false,"inputs":[],"name":"LosslessOff","type":"event"},{"anonymous":false,"inputs":[],"name":"LosslessOn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"turnOffDate","type":"uint256"}],"name":"LosslessTurnOffProposal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAdmin","type":"address"}],"name":"NewAdmin","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newRecoveryAdmin","type":"address"}],"name":"NewRecoveryAdmin","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"candidate","type":"address"}],"name":"NewRecoveryAdminProposal","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"burnedAmount","type":"uint256"}],"name":"SupplyReduction","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"TradingEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"BURN_ENABLED","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BUY_TAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EMERGENCY_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"IS_TAX_FREE","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LAUNCH_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LAUNCH_PROTECTION_PERIOD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LOSSLESS_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SELL_TAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRANSFER_TAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"key","type":"bytes"}],"name":"acceptRecoveryAdminOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"adminRenunciationTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burnRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"burnedByAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergencyAdminRenounced","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"emergencyRecoverAccidentalTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"executeLosslessTurnOff","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"executeLosslessTurnOn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDecentralizationInfo","outputs":[{"internalType":"bool","name":"launchAdminActive","type":"bool"},{"internalType":"bool","name":"emergencyAdminActive","type":"bool"},{"internalType":"bool","name":"fullyDecentralized","type":"bool"},{"internalType":"uint256","name":"renunciationTimestamp","type":"uint256"},{"internalType":"bool","name":"limitsActive","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLaunchInfo","outputs":[{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"bool","name":"trading","type":"bool"},{"internalType":"uint256","name":"tradingTimestamp","type":"uint256"},{"internalType":"bool","name":"protectionActive","type":"bool"},{"internalType":"bool","name":"launchPeriodEnded","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSecurityInfo","outputs":[{"internalType":"bool","name":"losslessActive","type":"bool"},{"internalType":"address","name":"losslessController","type":"address"},{"internalType":"address","name":"currentAdmin","type":"address"},{"internalType":"address","name":"currentRecoveryAdmin","type":"address"},{"internalType":"uint256","name":"timelock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokenomicsInfo","outputs":[{"internalType":"uint256","name":"buyTax","type":"uint256"},{"internalType":"uint256","name":"sellTax","type":"uint256"},{"internalType":"uint256","name":"transferTax","type":"uint256"},{"internalType":"bool","name":"isTaxFree","type":"bool"},{"internalType":"string","name":"description","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExcludedFromLimits","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isLaunched","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isLosslessOn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastTransactionBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchAdminRenounced","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lossless","outputs":[{"internalType":"contract ILosslessController","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"losslessTurnOffTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransactionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proposeLosslessTurnOff","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"recoveryAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceEmergencyAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceLaunchAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"setLosslessAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"timelockPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingEnabledTimestamp","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":"multisig","type":"address"}],"name":"transferEmergencyRoleToMultisig","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"from","type":"address[]"}],"name":"transferOutBlacklistedFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"candidate","type":"address"},{"internalType":"bytes32","name":"keyHash","type":"bytes32"}],"name":"transferRecoveryAdminOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxTransaction","type":"uint256"},{"internalType":"uint256","name":"_maxWallet","type":"uint256"}],"name":"updateLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040526006805461ffff19169055600f805460ff1990811660011790915560128054909116905534801562000034575f80fd5b506040516200424b3803806200424b83398101604081905262000057916200050d565b600180556002805460ff191690556001600160a01b038516620000c15760405162461bcd60e51b815260206004820152601a60248201527f43484f4f43483a20496e76616c696420636f6e74726f6c6c657200000000000060448201526064015b60405180910390fd5b6001600160a01b038416620001195760405162461bcd60e51b815260206004820152601e60248201527f43484f4f43483a20496e76616c6964206c6f73736c6573732061646d696e00006044820152606401620000b8565b6001600160a01b038316620001715760405162461bcd60e51b815260206004820152601f60248201527f43484f4f43483a20496e76616c696420656d657267656e63792061646d696e006044820152606401620000b8565b6001600160a01b038216620001c95760405162461bcd60e51b815260206004820152601e60248201527f43484f4f43483a20496e76616c6964207265636f766572792061646d696e00006044820152606401620000b8565b610e108110156200021d5760405162461bcd60e51b815260206004820152601a60248201527f43484f4f43483a2054696d656c6f636b20746f6f2073686f72740000000000006044820152606401620000b8565b62278d00811115620002725760405162461bcd60e51b815260206004820152601960248201527f43484f4f43483a2054696d656c6f636b20746f6f206c6f6e67000000000000006044820152606401620000b8565b600880546001600160a01b038088166001600160a01b03199283161790925560098054878416908316179055600a805492851692909116919091179055600d819055620002c75f620002c13390565b62000445565b50620002f47f7c40d5c3a0ded30ce1f4aefc0ffa0ae4e05a6b698b759a90fbdd0ef31cfe9cd13362000445565b50620003217fbf233dd2aafeb4d50879c4aa5c81e96d92f6e6945c906a58f9f2d1c1631b4b268462000445565b506200034e7f261ff18f0ac1ec491087976045becb30b450301d7ca8a65eefee86a7c82e62998562000445565b506c15560ab54925129e44b52000006005819055335f908152600360205260409020819055620003819060c89062000570565b6014556200039e60646c15560ab54925129e44b520000062000570565b601555335f8181526016602090815260408083208054600160ff1991821681179092556001600160a01b038a81168652838620805483168417905589811686528386208054831684179055881685528285208054909116909117905542601755516c15560ab54925129e44b520000081527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3505050505062000590565b5f828152602081815260408083206001600160a01b038516845290915281205460ff16620004e8575f838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556200049f3390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001620004eb565b505f5b92915050565b80516001600160a01b038116811462000508575f80fd5b919050565b5f805f805f60a0868803121562000522575f80fd5b6200052d86620004f1565b94506200053d60208701620004f1565b93506200054d60408701620004f1565b92506200055d60608701620004f1565b9150608086015190509295509295909350565b5f826200058b57634e487b7160e01b5f52601260045260245ffd5b500490565b613cad806200059e5f395ff3fe60806040526004361061041e575f3560e01c806379cc67901161021d578063c0a904a211610122578063dd62ed3e116100aa578063e55c07c511610079578063e55c07c514610c0d578063f470d47014610c38578063f851a44014610c7f578063fae3720114610c9e578063ff42420a14610cbc57610470565b8063dd62ed3e14610b75578063ddb69c9314610bb9578063de4cab0714610bd8578063e3edc3cb14610bf857610470565b8063ccfb7633116100f1578063ccfb76331461063c578063d173dffb146104ec578063d547741f14610b2d578063d6e242b814610b4c578063d89135cd14610b6057610470565b8063c0a904a214610ac0578063c6d8b6d714610adf578063c8c8ebe414610aff578063ccfa214f14610b1457610470565b8063a217fddf116101a5578063a9059cbb11610174578063a9059cbb14610a45578063aa4bde2814610a64578063b38fe95714610a79578063b5c2287714610a8d578063bed9985014610aac57610470565b8063a217fddf146104ec578063a2240e19146109dc578063a457c2d7146109fb578063a707603814610a1a57610470565b80638a8c523c116101ec5780638a8c523c1461096b57806391d148541461097f57806393310ffe1461099e578063936af911146109bd57806395d89b411461050d57610470565b806379cc6790146108cc5780638456cb59146108eb5780638701b75c146108ff5780638711a7191461091357610470565b806336568abe116103235780635cce86cd116102ab5780636e5b326f1161027a5780636e5b326f1461084e5780636e9960c31461086757806370a082311461088457806372e2bff8146108b8578063771282f61461058157610470565b80635cce86cd146107d75780635f6529a31461080557806361086b001461082457806365cf7c9b1461083957610470565b80634ada218b116102f25780634ada218b1461077d57806354ad8aee146104ec57806359c89d39146107965780635b8a194a146107ac5780635c975abb146107c057610470565b806336568abe1461070c578063395093511461072b5780633f4ba83a1461074a57806342966c681461075e57610470565b8063248a9ca3116103a65780632ecaf675116103755780632ecaf6751461066f5780632f2ff15d14610684578063307aebc9146106a3578063313ce567146106ba57806334f6ebf5146106d557610470565b8063248a9ca3146105f957806325b617031461062757806328de61281461063c5780632baa3c9e1461065057610470565b8063095ea7b3116103ed578063095ea7b31461056257806318160ddd146105815780631dfa8e7a1461059557806320df4359146105ba57806323b872dd146105da57610470565b806301ffc9a7146104b857806302af37bb146104ec57806306fdde031461050d5780630783dafe1461054157610470565b366104705760405162461bcd60e51b815260206004820152601f60248201527f43484f4f43483a2044697265637420455448206e6f742061636365707465640060448201526064015b60405180910390fd5b60405162461bcd60e51b815260206004820152601f60248201527f43484f4f43483a2046756e6374696f6e20646f6573206e6f74206578697374006044820152606401610467565b3480156104c3575f80fd5b506104d76104d2366004613728565b610cfc565b60405190151581526020015b60405180910390f35b3480156104f7575f80fd5b506104ff5f81565b6040519081526020016104e3565b348015610518575f80fd5b506040805180820182526006815265086909e9e86960d31b602082015290516104e39190613799565b34801561054c575f80fd5b5061056061055b3660046137c6565b610d32565b005b34801561056d575f80fd5b506104d761057c3660046137df565b610eae565b34801561058c575f80fd5b506005546104ff565b3480156105a0575f80fd5b506105a9610fd0565b6040516104e3959493929190613807565b3480156105c5575f80fd5b506104ff5f80516020613bd683398151915281565b3480156105e5575f80fd5b506104d76105f436600461383e565b611005565b348015610604575f80fd5b506104ff610613366004613877565b5f9081526020819052604090206001015490565b348015610632575f80fd5b506104ff60135481565b348015610647575f80fd5b506104d7600181565b34801561065b575f80fd5b5061056061066a3660046137c6565b611265565b34801561067a575f80fd5b506104ff600d5481565b34801561068f575f80fd5b5061056061069e36600461388e565b611373565b3480156106ae575f80fd5b506017544210156104d7565b3480156106c5575f80fd5b50604051601281526020016104e3565b3480156106e0575f80fd5b506008546106f4906001600160a01b031681565b6040516001600160a01b0390911681526020016104e3565b348015610717575f80fd5b5061056061072636600461388e565b61139d565b348015610736575f80fd5b506104d76107453660046137df565b6113d5565b348015610755575f80fd5b5061056061151a565b348015610769575f80fd5b50610560610778366004613877565b61159c565b348015610788575f80fd5b506012546104d79060ff1681565b3480156107a1575f80fd5b506104ff6201518081565b3480156107b7575f80fd5b506105606115b1565b3480156107cb575f80fd5b5060025460ff166104d7565b3480156107e2575f80fd5b506104d76107f13660046137c6565b60166020525f908152604090205460ff1681565b348015610810575f80fd5b50600a546106f4906001600160a01b031681565b34801561082f575f80fd5b506104ff600e5481565b348015610844575f80fd5b506104ff60175481565b348015610859575f80fd5b506006546104d79060ff1681565b348015610872575f80fd5b506009546001600160a01b03166106f4565b34801561088f575f80fd5b506104ff61089e3660046137c6565b6001600160a01b03165f9081526003602052604090205490565b3480156108c3575f80fd5b5061056061164d565b3480156108d7575f80fd5b506105606108e63660046137df565b611777565b3480156108f6575f80fd5b5061056061180b565b34801561090a575f80fd5b50610560611884565b34801561091e575f80fd5b50600f54600854600954600a54600d546040805160ff909616151586526001600160a01b03948516602087015292841692850192909252919091166060830152608082015260a0016104e3565b348015610976575f80fd5b50610560611965565b34801561098a575f80fd5b506104d761099936600461388e565b611a14565b3480156109a9575f80fd5b506105606109b83660046137df565b611a3c565b3480156109c8575f80fd5b506105606109d73660046138b8565b611af9565b3480156109e7575f80fd5b506105606109f6366004613927565b611d44565b348015610a06575f80fd5b506104d7610a153660046137df565b61207f565b348015610a25575f80fd5b506104ff610a343660046137c6565b60186020525f908152604090205481565b348015610a50575f80fd5b506104d7610a5f3660046137df565b612221565b348015610a6f575f80fd5b506104ff60155481565b348015610a84575f80fd5b506105606123b4565b348015610a98575f80fd5b50610560610aa736600461395b565b61249f565b348015610ab7575f80fd5b506104ff6125aa565b348015610acb575f80fd5b50610560610ada366004613a13565b6125d8565b348015610aea575f80fd5b506104ff5f80516020613bf683398151915281565b348015610b0a575f80fd5b506104ff60145481565b348015610b1f575f80fd5b50600f546104d79060ff1681565b348015610b38575f80fd5b50610560610b4736600461388e565b6126c4565b348015610b57575f80fd5b506105606126e8565b348015610b6b575f80fd5b506104ff60105481565b348015610b80575f80fd5b506104ff610b8f366004613a48565b6001600160a01b039182165f90815260046020908152604080832093909416825291909152205490565b348015610bc4575f80fd5b50610560610bd336600461383e565b6127d9565b348015610be3575f80fd5b506104ff5f80516020613c1683398151915281565b348015610c03575f80fd5b506104ff60075481565b348015610c18575f80fd5b506104ff610c273660046137c6565b60116020525f908152604090205481565b348015610c43575f80fd5b50610c4c612b32565b6040516104e395949392919094151585529215156020850152901515604084015260608301521515608082015260a00190565b348015610c8a575f80fd5b506009546106f4906001600160a01b031681565b348015610ca9575f80fd5b506006546104d790610100900460ff1681565b348015610cc7575f80fd5b50610cd0612ba3565b60408051958652931515602086015292840191909152151560608301521515608082015260a0016104e3565b5f6001600160e01b03198216637965db0b60e01b1480610d2c57506301ffc9a760e01b6001600160e01b03198316145b92915050565b5f80516020613bd6833981519152610d4981612bf5565b816001600160a01b038116610d705760405162461bcd60e51b815260040161046790613a70565b600654610100900460ff1615610dd95760405162461bcd60e51b815260206004820152602860248201527f43484f4f43483a20456d657267656e637920726f6c6520616c72656164792072604482015267195b9bdd5b98d95960c21b6064820152608401610467565b336001600160a01b03841603610e315760405162461bcd60e51b815260206004820152601f60248201527f43484f4f43483a2043616e6e6f74207472616e7366657220746f2073656c66006044820152606401610467565b610e485f80516020613bd683398151915284612bff565b50610e655f80516020613bd683398151915233612c8e565b612c8e565b50826001600160a01b03167fbd68b82c6da210de6b11033390a9a8d9119a3116ff5c4a29259e8a2771ddf73942604051610ea191815260200190565b60405180910390a2505050565b5f610eb7612cf7565b826001600160a01b038116610ede5760405162461bcd60e51b815260040161046790613a70565b600f548490849060ff1615610f4d576008546001600160a01b03166347abf3be3384846040518463ffffffff1660e01b8152600401610f1f93929190613a9e565b5f604051808303815f87803b158015610f36575f80fd5b505af1158015610f48573d5f803e3d5ffd5b505050505b610f58338787612d3f565b60019350600f5460ff1615610fc7576008546001600160a01b031663900f66ef3384846040518463ffffffff1660e01b8152600401610f9993929190613a9e565b5f604051808303815f87803b158015610fb0575f80fd5b505af1158015610fc2573d5f803e3d5ffd5b505050505b50505092915050565b5f805f8060605f805f6001604051806080016040528060428152602001613c3660429139945094509450945094509091929394565b5f61100e612cf7565b60125460ff168061102d5750335f9081526016602052604090205460ff165b6110795760405162461bcd60e51b815260206004820152601b60248201527f43484f4f43483a2054726164696e67206e6f7420656e61626c656400000000006044820152606401610467565b826001600160a01b0381166110a05760405162461bcd60e51b815260040161046790613a70565b600f5485908590859060ff161561112f576008546001600160a01b031663379f5c69336040516001600160e01b031960e084901b1681526001600160a01b03918216600482015281871660248201529085166044820152606481018490526084015f604051808303815f87803b158015611118575f80fd5b505af115801561112a573d5f803e3d5ffd5b505050505b6001600160a01b0388165f908152600460209081526040808320338452909152902054868110156111ad5760405162461bcd60e51b815260206004820152602260248201527f43484f4f43483a205472616e73666572206578636565647320616c6c6f77616e604482015261636560f01b6064820152608401610467565b6111b8898989612e56565b6111cc89336111c78a85613ad6565b612d3f565b6001955050600f5460ff161561125a576008546001600160a01b031663a56e8adf336040516001600160e01b031960e084901b1681526001600160a01b03918216600482015281871660248201529085166044820152606481018490526084015f604051808303815f87803b158015611243575f80fd5b505af1158015611255573d5f803e3d5ffd5b505050505b505050509392505050565b5f80516020613c1683398151915261127c81612bf5565b6001600160a01b0382166112ca5760405162461bcd60e51b815260206004820152601560248201527421a427a7a1a41d1024b73b30b634b21030b236b4b760591b6044820152606401610467565b6009546001600160a01b039081169083160361131d5760405162461bcd60e51b815260206004820152601260248201527121a427a7a1a41d1029b0b6b29030b236b4b760711b6044820152606401610467565b6040516001600160a01b038316907f71614071b88dee5e0b2ae578a9dd7b2ebbe9ae832ba419dc0242cd065a290b6c905f90a250600980546001600160a01b0319166001600160a01b0392909216919091179055565b5f8281526020819052604090206001015461138d81612bf5565b6113978383612bff565b50505050565b6001600160a01b03811633146113c65760405163334bd91960e11b815260040160405180910390fd5b6113d08282612c8e565b505050565b5f6113de612cf7565b826001600160a01b0381166114055760405162461bcd60e51b815260040161046790613a70565b600f5460ff1615611470576008546001600160a01b031663cf5961bb3386866040518463ffffffff1660e01b815260040161144293929190613a9e565b5f604051808303815f87803b158015611459575f80fd5b505af115801561146b573d5f803e3d5ffd5b505050505b335f8181526004602090815260408083206001600160a01b03891684529091529020546114a5919086906111c7908790613ae9565b600f5460ff1615611510576008546001600160a01b03166334d01aa83386866040518463ffffffff1660e01b81526004016114e293929190613a9e565b5f604051808303815f87803b1580156114f9575f80fd5b505af115801561150b573d5f803e3d5ffd5b505050505b5060019392505050565b5f80516020613bd683398151915261153181612bf5565b611539613228565b604080518181526011918101919091527010dbdb9d1c9858dd08155b9c185d5cd959607a1b606082015242602082015233907f6758593a60801a617f0db7ba7baa12f6c9e46bafd2d55b3dad6b807d1c215a9c906080015b60405180910390a250565b6115a4612cf7565b6115ae338261327a565b50565b5f80516020613c168339815191526115c881612bf5565b600f5460ff16156116105760405162461bcd60e51b815260206004820152601260248201527121a427a7a1a41d1020b63932b0b23c9037b760711b6044820152606401610467565b600f805460ff191660011790555f600e8190556040517f1ba3b66404043da8297d0b876fa6464f2cb127edfc6626308046d4503028322b9190a150565b5f80516020613bf683398151915261166481612bf5565b60065460ff16156116b35760405162461bcd60e51b815260206004820152601960248201527810d213d3d0d20e88105b1c9958591e481c995b9bdd5b98d959603a1b6044820152606401610467565b6006805460ff19166001179055426007556116dc5f80516020613bf6833981519152610e603390565b5060405142815233905f80516020613bf6833981519152907f6f14834714f36016612ec4a4b3c78404cc1dccc78980d9d9137ae20a79b3497b906020015b60405180910390a360065460ff16801561173b5750600654610100900460ff165b156115ae576040514281527f901e130572be1ff621f91c146de69136a06a3162f2a1c3d09a008b28600a7d68906020015b60405180910390a150565b61177f612cf7565b6001600160a01b0382165f908152600460209081526040808320338452909152902054818110156117f25760405162461bcd60e51b815260206004820152601e60248201527f43484f4f43483a204275726e206578636565647320616c6c6f77616e636500006044820152606401610467565b6117fc838361327a565b6113d083336111c78585613ad6565b5f80516020613bd683398151915261182281612bf5565b61182a61360c565b60408051818152600f918101919091526e10dbdb9d1c9858dd0814185d5cd959608a1b606082015242602082015233907f6758593a60801a617f0db7ba7baa12f6c9e46bafd2d55b3dad6b807d1c215a9c90608001611591565b5f80516020613bd683398151915261189b81612bf5565b600654610100900460ff16156118ef5760405162461bcd60e51b815260206004820152601960248201527810d213d3d0d20e88105b1c9958591e481c995b9bdd5b98d959603a1b6044820152606401610467565b6006805461ff0019166101001790556007545f0361190c57426007555b6119235f80516020613bd683398151915233612c8e565b5060405142815233905f80516020613bd6833981519152907f6f14834714f36016612ec4a4b3c78404cc1dccc78980d9d9137ae20a79b3497b9060200161171a565b5f80516020613bf683398151915261197c81612bf5565b60125460ff16156119cf5760405162461bcd60e51b815260206004820152601f60248201527f43484f4f43483a2054726164696e6720616c726561647920656e61626c6564006044820152606401610467565b6012805460ff191660011790554260138190556040517fb3da2db3dfc3778f99852546c6e9ab39ec253f9de7b0847afec61bd27878e9239161176c9190815260200190565b5f918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b5f80516020613c16833981519152611a5381612bf5565b6001600160a01b038316611aa95760405162461bcd60e51b815260206004820152601960248201527f43484f4f43483a20496e76616c69642063616e646964617465000000000000006044820152606401610467565b600b80546001600160a01b0319166001600160a01b038516908117909155600c8390556040517f6c591da8da2f6e69746d7d9ae61c27ee29fbe303798141b4942ae2aef54274b1905f90a2505050565b6008546001600160a01b0316336001600160a01b031614611b545760405162461bcd60e51b815260206004820152601560248201527443484f4f43483a204f6e6c79206c6f73736c65737360581b6044820152606401610467565b600f5460ff16611b9d5760405162461bcd60e51b815260206004820152601460248201527321a427a7a1a41d102637b9b9b632b9b99037b33360611b6044820152606401610467565b80611be05760405162461bcd60e51b815260206004820152601360248201527243484f4f43483a20456d70747920617272617960681b6044820152606401610467565b5f805b82811015611d0a575f848483818110611bfe57611bfe613afc565b9050602002016020810190611c1391906137c6565b90506001600160a01b038116611c6b5760405162461bcd60e51b815260206004820152601760248201527f43484f4f43483a20496e76616c696420616464726573730000000000000000006044820152606401610467565b6001600160a01b0381165f908152600360205260409020548015611cf5576001600160a01b0382165f90815260036020526040812055611cab8185613ae9565b6008546040518381529195506001600160a01b0390811691908416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35b50508080611d0290613b10565b915050611be3565b5080156113d0576008546001600160a01b03165f9081526003602052604081208054839290611d3a908490613ae9565b9091555050505050565b5f80516020613bf6833981519152611d5b81612bf5565b60065460ff1615611d7e5760405162461bcd60e51b815260040161046790613b28565b62015180601754611d8f9190613ae9565b4210611ddd5760405162461bcd60e51b815260206004820152601b60248201527f43484f4f43483a204c61756e636820706572696f6420656e64656400000000006044820152606401610467565b5f8311611e3b5760405162461bcd60e51b815260206004820152602660248201527f43484f4f43483a204d6178207472616e73616374696f6e2063616e6e6f74206260448201526565207a65726f60d01b6064820152608401610467565b5f8211611e945760405162461bcd60e51b815260206004820152602160248201527f43484f4f43483a204d61782077616c6c65742063616e6e6f74206265207a65726044820152606f60f81b6064820152608401610467565b6c15560ab54925129e44b5200000831115611f005760405162461bcd60e51b815260206004820152602660248201527f43484f4f43483a204d6178207472616e73616374696f6e206578636565647320604482015265737570706c7960d01b6064820152608401610467565b6c15560ab54925129e44b5200000821115611f675760405162461bcd60e51b815260206004820152602160248201527f43484f4f43483a204d61782077616c6c6574206578636565647320737570706c6044820152607960f81b6064820152608401610467565b611f806103e86c15560ab54925129e44b5200000613b6d565b831015611fcf5760405162461bcd60e51b815260206004820152601f60248201527f43484f4f43483a204d6178207472616e73616374696f6e20746f6f206c6f77006044820152606401610467565b611fe86101f46c15560ab54925129e44b5200000613b6d565b8210156120375760405162461bcd60e51b815260206004820152601a60248201527f43484f4f43483a204d61782077616c6c657420746f6f206c6f770000000000006044820152606401610467565b6014839055601582905560408051848152602081018490527f4d4981437d0211f9e6843eb024d9ada1fa3a99514d4343d4aece106dd11524bb910160405180910390a1505050565b5f612088612cf7565b826001600160a01b0381166120af5760405162461bcd60e51b815260040161046790613a70565b600f5460ff161561211a576008546001600160a01b031663568c75a93386866040518463ffffffff1660e01b81526004016120ec93929190613a9e565b5f604051808303815f87803b158015612103575f80fd5b505af1158015612115573d5f803e3d5ffd5b505050505b335f9081526004602090815260408083206001600160a01b03881684529091529020548381101561219c5760405162461bcd60e51b815260206004820152602660248201527f43484f4f43483a2044656372656173656420616c6c6f77616e63652062656c6f60448201526577207a65726f60d01b6064820152608401610467565b6121ab33866111c78785613ad6565b600f5460ff1615612216576008546001600160a01b031663ded1f4d03387876040518463ffffffff1660e01b81526004016121e893929190613a9e565b5f604051808303815f87803b1580156121ff575f80fd5b505af1158015612211573d5f803e3d5ffd5b505050505b506001949350505050565b5f61222a612cf7565b60125460ff16806122495750335f9081526016602052604090205460ff165b6122955760405162461bcd60e51b815260206004820152601b60248201527f43484f4f43483a2054726164696e67206e6f7420656e61626c656400000000006044820152606401610467565b826001600160a01b0381166122bc5760405162461bcd60e51b815260040161046790613a70565b33600f548590859060ff161561232e57600854604051631ffb811f60e01b81526001600160a01b0390911690631ffb811f9061230090869086908690600401613a9e565b5f604051808303815f87803b158015612317575f80fd5b505af1158015612329573d5f803e3d5ffd5b505050505b612339338888612e56565b60019450600f5460ff16156123aa57600854604051637a48316560e11b81526001600160a01b039091169063f49062ca9061237c90869086908690600401613a9e565b5f604051808303815f87803b158015612393575f80fd5b505af11580156123a5573d5f803e3d5ffd5b505050505b5050505092915050565b5f80516020613c168339815191526123cb81612bf5565b600e545f036124135760405162461bcd60e51b815260206004820152601460248201527310d213d3d0d20e88139bdd081c1c9bdc1bdcd95960621b6044820152606401610467565b600e544210156124655760405162461bcd60e51b815260206004820152601760248201527f43484f4f43483a2054696d656c6f636b206163746976650000000000000000006044820152606401610467565b600f805460ff191690555f600e8190556040517f3eb72350c9c7928d31e9ab450bfff2c159434aa4b82658a7d8eae7f109cb4e7b9190a150565b600b546001600160a01b0316336001600160a01b0316146124fa5760405162461bcd60e51b815260206004820152601560248201527443484f4f43483a204e6f742063616e64696461746560581b6044820152606401610467565b600c5481516020830120146125475760405162461bcd60e51b815260206004820152601360248201527243484f4f43483a20496e76616c6964206b657960681b6044820152606401610467565b600b546040516001600160a01b03909116907fb94bba6936ec7f75ee931dadf6e1a4d66b43d09b6fa0178fb13df9b77fb5841f905f90a250600b8054600a80546001600160a01b03199081166001600160a01b038416179091551690555f600c55565b5f6c15560ab54925129e44b52000006010546127106125c99190613b8c565b6125d39190613b6d565b905090565b5f80516020613bf68339815191526125ef81612bf5565b60065460ff16156126125760405162461bcd60e51b815260040161046790613b28565b620151806017546126239190613ae9565b42106126715760405162461bcd60e51b815260206004820152601b60248201527f43484f4f43483a204c61756e636820706572696f6420656e64656400000000006044820152606401610467565b826001600160a01b0381166126985760405162461bcd60e51b815260040161046790613a70565b50506001600160a01b03919091165f908152601660205260409020805460ff1916911515919091179055565b5f828152602081905260409020600101546126de81612bf5565b6113978383612c8e565b5f80516020613c168339815191526126ff81612bf5565b600e541561274f5760405162461bcd60e51b815260206004820152601860248201527f43484f4f43483a20416c72656164792070726f706f73656400000000000000006044820152606401610467565b600f5460ff166127975760405162461bcd60e51b815260206004820152601360248201527221a427a7a1a41d1020b63932b0b23c9037b33360691b6044820152606401610467565b600d546127a49042613ae9565b600e8190556040519081527f6ca688e6e3ddd707280140b2bf0106afe883689b6c74e68cbd517576dd9c245a9060200161176c565b5f80516020613bd68339815191526127f081612bf5565b6127f8613649565b826001600160a01b03811661281f5760405162461bcd60e51b815260040161046790613a70565b306001600160a01b038616036128835760405162461bcd60e51b8152602060048201526024808201527f43484f4f43483a2043616e6e6f74207265636f7665722043484f4f434820746f6044820152636b656e7360e01b6064820152608401610467565b5f83116128e35760405162461bcd60e51b815260206004820152602860248201527f43484f4f43483a20416d6f756e74206d7573742062652067726561746572207460448201526768616e207a65726f60c01b6064820152608401610467565b6001600160a01b03851661297a57824710156129415760405162461bcd60e51b815260206004820181905260248201527f43484f4f43483a20496e73756666696369656e74204554482062616c616e63656044820152606401610467565b6040516001600160a01b0385169084156108fc029085905f818181858888f19350505050158015612974573d5f803e3d5ffd5b50612aad565b6040516370a0823160e01b815230600482015283906001600160a01b038716906370a0823190602401602060405180830381865afa1580156129be573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129e29190613ba3565b1015612a3b5760405162461bcd60e51b815260206004820152602260248201527f43484f4f43483a20496e73756666696369656e7420746f6b656e2062616c616e604482015261636560f01b6064820152608401610467565b60405163a9059cbb60e01b81526001600160a01b0385811660048301526024820185905286169063a9059cbb906044016020604051808303815f875af1158015612a87573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612aab9190613bba565b505b836001600160a01b03167f6758593a60801a617f0db7ba7baa12f6c9e46bafd2d55b3dad6b807d1c215a9c84604051612b20919060408082526019908201527f4163636964656e74616c20546f6b656e205265636f76657279000000000000006060820152602081019190915260800190565b60405180910390a25061139760018055565b6006545f908190819081908190819060ff168015612b575750600654610100900460ff165b6006549091505f9060ff16158015612b7e575062015180601754612b7b9190613ae9565b42105b60065460075460ff808316159b61010090930416159950939750929550935090915050565b5f805f805f60175460125f9054906101000a900460ff1660135462015180601754612bce9190613ae9565b421062015180601754612be19190613ae9565b421015945094509450945094509091929394565b6115ae81336136a2565b5f612c0a8383611a14565b612c87575f838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055612c3f3390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610d2c565b505f610d2c565b5f612c998383611a14565b15612c87575f838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610d2c565b60025460ff1615612d3d5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610467565b565b6001600160a01b038316612d9f5760405162461bcd60e51b815260206004820152602160248201527f43484f4f43483a20417070726f76652066726f6d207a65726f206164647265736044820152607360f81b6064820152608401610467565b6001600160a01b038216612df55760405162461bcd60e51b815260206004820152601f60248201527f43484f4f43483a20417070726f766520746f207a65726f2061646472657373006044820152606401610467565b6001600160a01b038381165f8181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038316612eb75760405162461bcd60e51b815260206004820152602260248201527f43484f4f43483a205472616e736665722066726f6d207a65726f206164647265604482015261737360f01b6064820152608401610467565b6001600160a01b038216612f0d5760405162461bcd60e51b815260206004820181905260248201527f43484f4f43483a205472616e7366657220746f207a65726f20616464726573736044820152606401610467565b6001600160a01b0383165f90815260036020526040902054811115612f745760405162461bcd60e51b815260206004820181905260248201527f43484f4f43483a205472616e7366657220657863656564732062616c616e63656044820152606401610467565b60065460ff16158015612f96575062015180601754612f939190613ae9565b42105b8015612fba57506001600160a01b0383165f9081526016602052604090205460ff16155b8015612fde57506001600160a01b0382165f9081526016602052604090205460ff16155b1561306f576001600160a01b0383165f908152601860205260409020544390036130545760405162461bcd60e51b815260206004820152602160248201527f43484f4f43483a204f6e65207472616e73616374696f6e2070657220626c6f636044820152606b60f81b6064820152608401610467565b6001600160a01b0383165f9081526018602052604090204390555b60065460ff1615801561309a57506001600160a01b0383165f9081526016602052604090205460ff16155b80156130be57506001600160a01b0382165f9081526016602052604090205460ff16155b15613189576014548111156131155760405162461bcd60e51b815260206004820152601f60248201527f43484f4f43483a2045786365656473206d6178207472616e73616374696f6e006044820152606401610467565b6015546001600160a01b0383165f9081526003602052604090205461313b908390613ae9565b11156131895760405162461bcd60e51b815260206004820152601a60248201527f43484f4f43483a2045786365656473206d61782077616c6c65740000000000006044820152606401610467565b6001600160a01b0383165f90815260036020526040812080548392906131b0908490613ad6565b90915550506001600160a01b0382165f90815260036020526040812080548392906131dc908490613ae9565b92505081905550816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612e4991815260200190565b6132306136df565b6002805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600f548290829060ff16156132eb57600854604051634a1fefbd60e01b81526001600160a01b0384811660048301526024820184905290911690634a1fefbd906044015f604051808303815f87803b1580156132d4575f80fd5b505af11580156132e6573d5f803e3d5ffd5b505050505b6001600160a01b0384166133415760405162461bcd60e51b815260206004820152601e60248201527f43484f4f43483a204275726e2066726f6d207a65726f206164647265737300006044820152606401610467565b6001600160a01b0384165f908152600360205260409020548311156133a85760405162461bcd60e51b815260206004820152601c60248201527f43484f4f43483a204275726e20657863656564732062616c616e6365000000006044820152606401610467565b5f83116133f75760405162461bcd60e51b815260206004820152601f60248201527f43484f4f43483a2043616e6e6f74206275726e207a65726f20616d6f756e74006044820152606401610467565b8260055410156134495760405162461bcd60e51b815260206004820152601b60248201527f43484f4f43483a204275726e206578636565647320737570706c7900000000006044820152606401610467565b6001600160a01b0384165f9081526003602052604081208054859290613470908490613ad6565b925050819055508260055f8282546134889190613ad6565b925050819055508260105f8282546134a09190613ae9565b90915550506001600160a01b0384165f90815260116020526040812080548592906134cc908490613ae9565b90915550506040518381525f906001600160a01b038616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3836001600160a01b03167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58460405161354c91815260200190565b60405180910390a27f32c3bb07da1fa54acaf9cd038b7d0b7e94a0ef767e1a7885771f73c0ae7e6ebb600554601054604051613592929190918252602082015260400190565b60405180910390a1600f5460ff1615611397576008546040516325c70d2d60e21b81526001600160a01b038481166004830152602482018490529091169063971c34b4906044015f604051808303815f87803b1580156135f0575f80fd5b505af1158015613602573d5f803e3d5ffd5b5050505050505050565b613614612cf7565b6002805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861325d3390565b60026001540361369b5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610467565b6002600155565b6136ac8282611a14565b6136db5760405163e2517d3f60e01b81526001600160a01b038216600482015260248101839052604401610467565b5050565b60025460ff16612d3d5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610467565b5f60208284031215613738575f80fd5b81356001600160e01b03198116811461374f575f80fd5b9392505050565b5f81518084525f5b8181101561377a5760208185018101518683018201520161375e565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f61374f6020830184613756565b80356001600160a01b03811681146137c1575f80fd5b919050565b5f602082840312156137d6575f80fd5b61374f826137ab565b5f80604083850312156137f0575f80fd5b6137f9836137ab565b946020939093013593505050565b858152846020820152836040820152821515606082015260a060808201525f61383360a0830184613756565b979650505050505050565b5f805f60608486031215613850575f80fd5b613859846137ab565b9250613867602085016137ab565b9150604084013590509250925092565b5f60208284031215613887575f80fd5b5035919050565b5f806040838503121561389f575f80fd5b823591506138af602084016137ab565b90509250929050565b5f80602083850312156138c9575f80fd5b823567ffffffffffffffff808211156138e0575f80fd5b818501915085601f8301126138f3575f80fd5b813581811115613901575f80fd5b8660208260051b8501011115613915575f80fd5b60209290920196919550909350505050565b5f8060408385031215613938575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52604160045260245ffd5b5f6020828403121561396b575f80fd5b813567ffffffffffffffff80821115613982575f80fd5b818401915084601f830112613995575f80fd5b8135818111156139a7576139a7613947565b604051601f8201601f19908116603f011681019083821181831017156139cf576139cf613947565b816040528281528760208487010111156139e7575f80fd5b826020860160208301375f928101602001929092525095945050505050565b80151581146115ae575f80fd5b5f8060408385031215613a24575f80fd5b613a2d836137ab565b91506020830135613a3d81613a06565b809150509250929050565b5f8060408385031215613a59575f80fd5b613a62836137ab565b91506138af602084016137ab565b60208082526014908201527343484f4f43483a205a65726f206164647265737360601b604082015260600190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610d2c57610d2c613ac2565b80820180821115610d2c57610d2c613ac2565b634e487b7160e01b5f52603260045260245ffd5b5f60018201613b2157613b21613ac2565b5060010190565b60208082526025908201527f43484f4f43483a204c61756e63682061646d696e20706f776572732072656e6f6040820152641d5b98d95960da1b606082015260800190565b5f82613b8757634e487b7160e01b5f52601260045260245ffd5b500490565b8082028115828204841417610d2c57610d2c613ac2565b5f60208284031215613bb3575f80fd5b5051919050565b5f60208284031215613bca575f80fd5b815161374f81613a0656febf233dd2aafeb4d50879c4aa5c81e96d92f6e6945c906a58f9f2d1c1631b4b267c40d5c3a0ded30ce1f4aefc0ffa0ae4e05a6b698b759a90fbdd0ef31cfe9cd1261ff18f0ac1ec491087976045becb30b450301d7ca8a65eefee86a7c82e629943484f4f43483a2031303025207461782d6672656520666f72657665722c206d696e696d616c2061646d696e20706f776572732c206d6178696d756d207472757374a26469706673582212204d0ccfb85d18e30f0a56afc023ba9e1108d1b8fbcfc59331bfef47e070f1b70164736f6c6343000814003300000000000000000000000038d40f5c8375f84c5b90bc460a94a436d09133fb0000000000000000000000008540cf5afac19619a349fdaa7a9fa85ef2f097330000000000000000000000008513f04fdc62bfd78177f72a189a2d589a35e8550000000000000000000000008513f04fdc62bfd78177f72a189a2d589a35e8550000000000000000000000000000000000000000000000000000000000015180

Deployed Bytecode

0x60806040526004361061041e575f3560e01c806379cc67901161021d578063c0a904a211610122578063dd62ed3e116100aa578063e55c07c511610079578063e55c07c514610c0d578063f470d47014610c38578063f851a44014610c7f578063fae3720114610c9e578063ff42420a14610cbc57610470565b8063dd62ed3e14610b75578063ddb69c9314610bb9578063de4cab0714610bd8578063e3edc3cb14610bf857610470565b8063ccfb7633116100f1578063ccfb76331461063c578063d173dffb146104ec578063d547741f14610b2d578063d6e242b814610b4c578063d89135cd14610b6057610470565b8063c0a904a214610ac0578063c6d8b6d714610adf578063c8c8ebe414610aff578063ccfa214f14610b1457610470565b8063a217fddf116101a5578063a9059cbb11610174578063a9059cbb14610a45578063aa4bde2814610a64578063b38fe95714610a79578063b5c2287714610a8d578063bed9985014610aac57610470565b8063a217fddf146104ec578063a2240e19146109dc578063a457c2d7146109fb578063a707603814610a1a57610470565b80638a8c523c116101ec5780638a8c523c1461096b57806391d148541461097f57806393310ffe1461099e578063936af911146109bd57806395d89b411461050d57610470565b806379cc6790146108cc5780638456cb59146108eb5780638701b75c146108ff5780638711a7191461091357610470565b806336568abe116103235780635cce86cd116102ab5780636e5b326f1161027a5780636e5b326f1461084e5780636e9960c31461086757806370a082311461088457806372e2bff8146108b8578063771282f61461058157610470565b80635cce86cd146107d75780635f6529a31461080557806361086b001461082457806365cf7c9b1461083957610470565b80634ada218b116102f25780634ada218b1461077d57806354ad8aee146104ec57806359c89d39146107965780635b8a194a146107ac5780635c975abb146107c057610470565b806336568abe1461070c578063395093511461072b5780633f4ba83a1461074a57806342966c681461075e57610470565b8063248a9ca3116103a65780632ecaf675116103755780632ecaf6751461066f5780632f2ff15d14610684578063307aebc9146106a3578063313ce567146106ba57806334f6ebf5146106d557610470565b8063248a9ca3146105f957806325b617031461062757806328de61281461063c5780632baa3c9e1461065057610470565b8063095ea7b3116103ed578063095ea7b31461056257806318160ddd146105815780631dfa8e7a1461059557806320df4359146105ba57806323b872dd146105da57610470565b806301ffc9a7146104b857806302af37bb146104ec57806306fdde031461050d5780630783dafe1461054157610470565b366104705760405162461bcd60e51b815260206004820152601f60248201527f43484f4f43483a2044697265637420455448206e6f742061636365707465640060448201526064015b60405180910390fd5b60405162461bcd60e51b815260206004820152601f60248201527f43484f4f43483a2046756e6374696f6e20646f6573206e6f74206578697374006044820152606401610467565b3480156104c3575f80fd5b506104d76104d2366004613728565b610cfc565b60405190151581526020015b60405180910390f35b3480156104f7575f80fd5b506104ff5f81565b6040519081526020016104e3565b348015610518575f80fd5b506040805180820182526006815265086909e9e86960d31b602082015290516104e39190613799565b34801561054c575f80fd5b5061056061055b3660046137c6565b610d32565b005b34801561056d575f80fd5b506104d761057c3660046137df565b610eae565b34801561058c575f80fd5b506005546104ff565b3480156105a0575f80fd5b506105a9610fd0565b6040516104e3959493929190613807565b3480156105c5575f80fd5b506104ff5f80516020613bd683398151915281565b3480156105e5575f80fd5b506104d76105f436600461383e565b611005565b348015610604575f80fd5b506104ff610613366004613877565b5f9081526020819052604090206001015490565b348015610632575f80fd5b506104ff60135481565b348015610647575f80fd5b506104d7600181565b34801561065b575f80fd5b5061056061066a3660046137c6565b611265565b34801561067a575f80fd5b506104ff600d5481565b34801561068f575f80fd5b5061056061069e36600461388e565b611373565b3480156106ae575f80fd5b506017544210156104d7565b3480156106c5575f80fd5b50604051601281526020016104e3565b3480156106e0575f80fd5b506008546106f4906001600160a01b031681565b6040516001600160a01b0390911681526020016104e3565b348015610717575f80fd5b5061056061072636600461388e565b61139d565b348015610736575f80fd5b506104d76107453660046137df565b6113d5565b348015610755575f80fd5b5061056061151a565b348015610769575f80fd5b50610560610778366004613877565b61159c565b348015610788575f80fd5b506012546104d79060ff1681565b3480156107a1575f80fd5b506104ff6201518081565b3480156107b7575f80fd5b506105606115b1565b3480156107cb575f80fd5b5060025460ff166104d7565b3480156107e2575f80fd5b506104d76107f13660046137c6565b60166020525f908152604090205460ff1681565b348015610810575f80fd5b50600a546106f4906001600160a01b031681565b34801561082f575f80fd5b506104ff600e5481565b348015610844575f80fd5b506104ff60175481565b348015610859575f80fd5b506006546104d79060ff1681565b348015610872575f80fd5b506009546001600160a01b03166106f4565b34801561088f575f80fd5b506104ff61089e3660046137c6565b6001600160a01b03165f9081526003602052604090205490565b3480156108c3575f80fd5b5061056061164d565b3480156108d7575f80fd5b506105606108e63660046137df565b611777565b3480156108f6575f80fd5b5061056061180b565b34801561090a575f80fd5b50610560611884565b34801561091e575f80fd5b50600f54600854600954600a54600d546040805160ff909616151586526001600160a01b03948516602087015292841692850192909252919091166060830152608082015260a0016104e3565b348015610976575f80fd5b50610560611965565b34801561098a575f80fd5b506104d761099936600461388e565b611a14565b3480156109a9575f80fd5b506105606109b83660046137df565b611a3c565b3480156109c8575f80fd5b506105606109d73660046138b8565b611af9565b3480156109e7575f80fd5b506105606109f6366004613927565b611d44565b348015610a06575f80fd5b506104d7610a153660046137df565b61207f565b348015610a25575f80fd5b506104ff610a343660046137c6565b60186020525f908152604090205481565b348015610a50575f80fd5b506104d7610a5f3660046137df565b612221565b348015610a6f575f80fd5b506104ff60155481565b348015610a84575f80fd5b506105606123b4565b348015610a98575f80fd5b50610560610aa736600461395b565b61249f565b348015610ab7575f80fd5b506104ff6125aa565b348015610acb575f80fd5b50610560610ada366004613a13565b6125d8565b348015610aea575f80fd5b506104ff5f80516020613bf683398151915281565b348015610b0a575f80fd5b506104ff60145481565b348015610b1f575f80fd5b50600f546104d79060ff1681565b348015610b38575f80fd5b50610560610b4736600461388e565b6126c4565b348015610b57575f80fd5b506105606126e8565b348015610b6b575f80fd5b506104ff60105481565b348015610b80575f80fd5b506104ff610b8f366004613a48565b6001600160a01b039182165f90815260046020908152604080832093909416825291909152205490565b348015610bc4575f80fd5b50610560610bd336600461383e565b6127d9565b348015610be3575f80fd5b506104ff5f80516020613c1683398151915281565b348015610c03575f80fd5b506104ff60075481565b348015610c18575f80fd5b506104ff610c273660046137c6565b60116020525f908152604090205481565b348015610c43575f80fd5b50610c4c612b32565b6040516104e395949392919094151585529215156020850152901515604084015260608301521515608082015260a00190565b348015610c8a575f80fd5b506009546106f4906001600160a01b031681565b348015610ca9575f80fd5b506006546104d790610100900460ff1681565b348015610cc7575f80fd5b50610cd0612ba3565b60408051958652931515602086015292840191909152151560608301521515608082015260a0016104e3565b5f6001600160e01b03198216637965db0b60e01b1480610d2c57506301ffc9a760e01b6001600160e01b03198316145b92915050565b5f80516020613bd6833981519152610d4981612bf5565b816001600160a01b038116610d705760405162461bcd60e51b815260040161046790613a70565b600654610100900460ff1615610dd95760405162461bcd60e51b815260206004820152602860248201527f43484f4f43483a20456d657267656e637920726f6c6520616c72656164792072604482015267195b9bdd5b98d95960c21b6064820152608401610467565b336001600160a01b03841603610e315760405162461bcd60e51b815260206004820152601f60248201527f43484f4f43483a2043616e6e6f74207472616e7366657220746f2073656c66006044820152606401610467565b610e485f80516020613bd683398151915284612bff565b50610e655f80516020613bd683398151915233612c8e565b612c8e565b50826001600160a01b03167fbd68b82c6da210de6b11033390a9a8d9119a3116ff5c4a29259e8a2771ddf73942604051610ea191815260200190565b60405180910390a2505050565b5f610eb7612cf7565b826001600160a01b038116610ede5760405162461bcd60e51b815260040161046790613a70565b600f548490849060ff1615610f4d576008546001600160a01b03166347abf3be3384846040518463ffffffff1660e01b8152600401610f1f93929190613a9e565b5f604051808303815f87803b158015610f36575f80fd5b505af1158015610f48573d5f803e3d5ffd5b505050505b610f58338787612d3f565b60019350600f5460ff1615610fc7576008546001600160a01b031663900f66ef3384846040518463ffffffff1660e01b8152600401610f9993929190613a9e565b5f604051808303815f87803b158015610fb0575f80fd5b505af1158015610fc2573d5f803e3d5ffd5b505050505b50505092915050565b5f805f8060605f805f6001604051806080016040528060428152602001613c3660429139945094509450945094509091929394565b5f61100e612cf7565b60125460ff168061102d5750335f9081526016602052604090205460ff165b6110795760405162461bcd60e51b815260206004820152601b60248201527f43484f4f43483a2054726164696e67206e6f7420656e61626c656400000000006044820152606401610467565b826001600160a01b0381166110a05760405162461bcd60e51b815260040161046790613a70565b600f5485908590859060ff161561112f576008546001600160a01b031663379f5c69336040516001600160e01b031960e084901b1681526001600160a01b03918216600482015281871660248201529085166044820152606481018490526084015f604051808303815f87803b158015611118575f80fd5b505af115801561112a573d5f803e3d5ffd5b505050505b6001600160a01b0388165f908152600460209081526040808320338452909152902054868110156111ad5760405162461bcd60e51b815260206004820152602260248201527f43484f4f43483a205472616e73666572206578636565647320616c6c6f77616e604482015261636560f01b6064820152608401610467565b6111b8898989612e56565b6111cc89336111c78a85613ad6565b612d3f565b6001955050600f5460ff161561125a576008546001600160a01b031663a56e8adf336040516001600160e01b031960e084901b1681526001600160a01b03918216600482015281871660248201529085166044820152606481018490526084015f604051808303815f87803b158015611243575f80fd5b505af1158015611255573d5f803e3d5ffd5b505050505b505050509392505050565b5f80516020613c1683398151915261127c81612bf5565b6001600160a01b0382166112ca5760405162461bcd60e51b815260206004820152601560248201527421a427a7a1a41d1024b73b30b634b21030b236b4b760591b6044820152606401610467565b6009546001600160a01b039081169083160361131d5760405162461bcd60e51b815260206004820152601260248201527121a427a7a1a41d1029b0b6b29030b236b4b760711b6044820152606401610467565b6040516001600160a01b038316907f71614071b88dee5e0b2ae578a9dd7b2ebbe9ae832ba419dc0242cd065a290b6c905f90a250600980546001600160a01b0319166001600160a01b0392909216919091179055565b5f8281526020819052604090206001015461138d81612bf5565b6113978383612bff565b50505050565b6001600160a01b03811633146113c65760405163334bd91960e11b815260040160405180910390fd5b6113d08282612c8e565b505050565b5f6113de612cf7565b826001600160a01b0381166114055760405162461bcd60e51b815260040161046790613a70565b600f5460ff1615611470576008546001600160a01b031663cf5961bb3386866040518463ffffffff1660e01b815260040161144293929190613a9e565b5f604051808303815f87803b158015611459575f80fd5b505af115801561146b573d5f803e3d5ffd5b505050505b335f8181526004602090815260408083206001600160a01b03891684529091529020546114a5919086906111c7908790613ae9565b600f5460ff1615611510576008546001600160a01b03166334d01aa83386866040518463ffffffff1660e01b81526004016114e293929190613a9e565b5f604051808303815f87803b1580156114f9575f80fd5b505af115801561150b573d5f803e3d5ffd5b505050505b5060019392505050565b5f80516020613bd683398151915261153181612bf5565b611539613228565b604080518181526011918101919091527010dbdb9d1c9858dd08155b9c185d5cd959607a1b606082015242602082015233907f6758593a60801a617f0db7ba7baa12f6c9e46bafd2d55b3dad6b807d1c215a9c906080015b60405180910390a250565b6115a4612cf7565b6115ae338261327a565b50565b5f80516020613c168339815191526115c881612bf5565b600f5460ff16156116105760405162461bcd60e51b815260206004820152601260248201527121a427a7a1a41d1020b63932b0b23c9037b760711b6044820152606401610467565b600f805460ff191660011790555f600e8190556040517f1ba3b66404043da8297d0b876fa6464f2cb127edfc6626308046d4503028322b9190a150565b5f80516020613bf683398151915261166481612bf5565b60065460ff16156116b35760405162461bcd60e51b815260206004820152601960248201527810d213d3d0d20e88105b1c9958591e481c995b9bdd5b98d959603a1b6044820152606401610467565b6006805460ff19166001179055426007556116dc5f80516020613bf6833981519152610e603390565b5060405142815233905f80516020613bf6833981519152907f6f14834714f36016612ec4a4b3c78404cc1dccc78980d9d9137ae20a79b3497b906020015b60405180910390a360065460ff16801561173b5750600654610100900460ff165b156115ae576040514281527f901e130572be1ff621f91c146de69136a06a3162f2a1c3d09a008b28600a7d68906020015b60405180910390a150565b61177f612cf7565b6001600160a01b0382165f908152600460209081526040808320338452909152902054818110156117f25760405162461bcd60e51b815260206004820152601e60248201527f43484f4f43483a204275726e206578636565647320616c6c6f77616e636500006044820152606401610467565b6117fc838361327a565b6113d083336111c78585613ad6565b5f80516020613bd683398151915261182281612bf5565b61182a61360c565b60408051818152600f918101919091526e10dbdb9d1c9858dd0814185d5cd959608a1b606082015242602082015233907f6758593a60801a617f0db7ba7baa12f6c9e46bafd2d55b3dad6b807d1c215a9c90608001611591565b5f80516020613bd683398151915261189b81612bf5565b600654610100900460ff16156118ef5760405162461bcd60e51b815260206004820152601960248201527810d213d3d0d20e88105b1c9958591e481c995b9bdd5b98d959603a1b6044820152606401610467565b6006805461ff0019166101001790556007545f0361190c57426007555b6119235f80516020613bd683398151915233612c8e565b5060405142815233905f80516020613bd6833981519152907f6f14834714f36016612ec4a4b3c78404cc1dccc78980d9d9137ae20a79b3497b9060200161171a565b5f80516020613bf683398151915261197c81612bf5565b60125460ff16156119cf5760405162461bcd60e51b815260206004820152601f60248201527f43484f4f43483a2054726164696e6720616c726561647920656e61626c6564006044820152606401610467565b6012805460ff191660011790554260138190556040517fb3da2db3dfc3778f99852546c6e9ab39ec253f9de7b0847afec61bd27878e9239161176c9190815260200190565b5f918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b5f80516020613c16833981519152611a5381612bf5565b6001600160a01b038316611aa95760405162461bcd60e51b815260206004820152601960248201527f43484f4f43483a20496e76616c69642063616e646964617465000000000000006044820152606401610467565b600b80546001600160a01b0319166001600160a01b038516908117909155600c8390556040517f6c591da8da2f6e69746d7d9ae61c27ee29fbe303798141b4942ae2aef54274b1905f90a2505050565b6008546001600160a01b0316336001600160a01b031614611b545760405162461bcd60e51b815260206004820152601560248201527443484f4f43483a204f6e6c79206c6f73736c65737360581b6044820152606401610467565b600f5460ff16611b9d5760405162461bcd60e51b815260206004820152601460248201527321a427a7a1a41d102637b9b9b632b9b99037b33360611b6044820152606401610467565b80611be05760405162461bcd60e51b815260206004820152601360248201527243484f4f43483a20456d70747920617272617960681b6044820152606401610467565b5f805b82811015611d0a575f848483818110611bfe57611bfe613afc565b9050602002016020810190611c1391906137c6565b90506001600160a01b038116611c6b5760405162461bcd60e51b815260206004820152601760248201527f43484f4f43483a20496e76616c696420616464726573730000000000000000006044820152606401610467565b6001600160a01b0381165f908152600360205260409020548015611cf5576001600160a01b0382165f90815260036020526040812055611cab8185613ae9565b6008546040518381529195506001600160a01b0390811691908416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35b50508080611d0290613b10565b915050611be3565b5080156113d0576008546001600160a01b03165f9081526003602052604081208054839290611d3a908490613ae9565b9091555050505050565b5f80516020613bf6833981519152611d5b81612bf5565b60065460ff1615611d7e5760405162461bcd60e51b815260040161046790613b28565b62015180601754611d8f9190613ae9565b4210611ddd5760405162461bcd60e51b815260206004820152601b60248201527f43484f4f43483a204c61756e636820706572696f6420656e64656400000000006044820152606401610467565b5f8311611e3b5760405162461bcd60e51b815260206004820152602660248201527f43484f4f43483a204d6178207472616e73616374696f6e2063616e6e6f74206260448201526565207a65726f60d01b6064820152608401610467565b5f8211611e945760405162461bcd60e51b815260206004820152602160248201527f43484f4f43483a204d61782077616c6c65742063616e6e6f74206265207a65726044820152606f60f81b6064820152608401610467565b6c15560ab54925129e44b5200000831115611f005760405162461bcd60e51b815260206004820152602660248201527f43484f4f43483a204d6178207472616e73616374696f6e206578636565647320604482015265737570706c7960d01b6064820152608401610467565b6c15560ab54925129e44b5200000821115611f675760405162461bcd60e51b815260206004820152602160248201527f43484f4f43483a204d61782077616c6c6574206578636565647320737570706c6044820152607960f81b6064820152608401610467565b611f806103e86c15560ab54925129e44b5200000613b6d565b831015611fcf5760405162461bcd60e51b815260206004820152601f60248201527f43484f4f43483a204d6178207472616e73616374696f6e20746f6f206c6f77006044820152606401610467565b611fe86101f46c15560ab54925129e44b5200000613b6d565b8210156120375760405162461bcd60e51b815260206004820152601a60248201527f43484f4f43483a204d61782077616c6c657420746f6f206c6f770000000000006044820152606401610467565b6014839055601582905560408051848152602081018490527f4d4981437d0211f9e6843eb024d9ada1fa3a99514d4343d4aece106dd11524bb910160405180910390a1505050565b5f612088612cf7565b826001600160a01b0381166120af5760405162461bcd60e51b815260040161046790613a70565b600f5460ff161561211a576008546001600160a01b031663568c75a93386866040518463ffffffff1660e01b81526004016120ec93929190613a9e565b5f604051808303815f87803b158015612103575f80fd5b505af1158015612115573d5f803e3d5ffd5b505050505b335f9081526004602090815260408083206001600160a01b03881684529091529020548381101561219c5760405162461bcd60e51b815260206004820152602660248201527f43484f4f43483a2044656372656173656420616c6c6f77616e63652062656c6f60448201526577207a65726f60d01b6064820152608401610467565b6121ab33866111c78785613ad6565b600f5460ff1615612216576008546001600160a01b031663ded1f4d03387876040518463ffffffff1660e01b81526004016121e893929190613a9e565b5f604051808303815f87803b1580156121ff575f80fd5b505af1158015612211573d5f803e3d5ffd5b505050505b506001949350505050565b5f61222a612cf7565b60125460ff16806122495750335f9081526016602052604090205460ff165b6122955760405162461bcd60e51b815260206004820152601b60248201527f43484f4f43483a2054726164696e67206e6f7420656e61626c656400000000006044820152606401610467565b826001600160a01b0381166122bc5760405162461bcd60e51b815260040161046790613a70565b33600f548590859060ff161561232e57600854604051631ffb811f60e01b81526001600160a01b0390911690631ffb811f9061230090869086908690600401613a9e565b5f604051808303815f87803b158015612317575f80fd5b505af1158015612329573d5f803e3d5ffd5b505050505b612339338888612e56565b60019450600f5460ff16156123aa57600854604051637a48316560e11b81526001600160a01b039091169063f49062ca9061237c90869086908690600401613a9e565b5f604051808303815f87803b158015612393575f80fd5b505af11580156123a5573d5f803e3d5ffd5b505050505b5050505092915050565b5f80516020613c168339815191526123cb81612bf5565b600e545f036124135760405162461bcd60e51b815260206004820152601460248201527310d213d3d0d20e88139bdd081c1c9bdc1bdcd95960621b6044820152606401610467565b600e544210156124655760405162461bcd60e51b815260206004820152601760248201527f43484f4f43483a2054696d656c6f636b206163746976650000000000000000006044820152606401610467565b600f805460ff191690555f600e8190556040517f3eb72350c9c7928d31e9ab450bfff2c159434aa4b82658a7d8eae7f109cb4e7b9190a150565b600b546001600160a01b0316336001600160a01b0316146124fa5760405162461bcd60e51b815260206004820152601560248201527443484f4f43483a204e6f742063616e64696461746560581b6044820152606401610467565b600c5481516020830120146125475760405162461bcd60e51b815260206004820152601360248201527243484f4f43483a20496e76616c6964206b657960681b6044820152606401610467565b600b546040516001600160a01b03909116907fb94bba6936ec7f75ee931dadf6e1a4d66b43d09b6fa0178fb13df9b77fb5841f905f90a250600b8054600a80546001600160a01b03199081166001600160a01b038416179091551690555f600c55565b5f6c15560ab54925129e44b52000006010546127106125c99190613b8c565b6125d39190613b6d565b905090565b5f80516020613bf68339815191526125ef81612bf5565b60065460ff16156126125760405162461bcd60e51b815260040161046790613b28565b620151806017546126239190613ae9565b42106126715760405162461bcd60e51b815260206004820152601b60248201527f43484f4f43483a204c61756e636820706572696f6420656e64656400000000006044820152606401610467565b826001600160a01b0381166126985760405162461bcd60e51b815260040161046790613a70565b50506001600160a01b03919091165f908152601660205260409020805460ff1916911515919091179055565b5f828152602081905260409020600101546126de81612bf5565b6113978383612c8e565b5f80516020613c168339815191526126ff81612bf5565b600e541561274f5760405162461bcd60e51b815260206004820152601860248201527f43484f4f43483a20416c72656164792070726f706f73656400000000000000006044820152606401610467565b600f5460ff166127975760405162461bcd60e51b815260206004820152601360248201527221a427a7a1a41d1020b63932b0b23c9037b33360691b6044820152606401610467565b600d546127a49042613ae9565b600e8190556040519081527f6ca688e6e3ddd707280140b2bf0106afe883689b6c74e68cbd517576dd9c245a9060200161176c565b5f80516020613bd68339815191526127f081612bf5565b6127f8613649565b826001600160a01b03811661281f5760405162461bcd60e51b815260040161046790613a70565b306001600160a01b038616036128835760405162461bcd60e51b8152602060048201526024808201527f43484f4f43483a2043616e6e6f74207265636f7665722043484f4f434820746f6044820152636b656e7360e01b6064820152608401610467565b5f83116128e35760405162461bcd60e51b815260206004820152602860248201527f43484f4f43483a20416d6f756e74206d7573742062652067726561746572207460448201526768616e207a65726f60c01b6064820152608401610467565b6001600160a01b03851661297a57824710156129415760405162461bcd60e51b815260206004820181905260248201527f43484f4f43483a20496e73756666696369656e74204554482062616c616e63656044820152606401610467565b6040516001600160a01b0385169084156108fc029085905f818181858888f19350505050158015612974573d5f803e3d5ffd5b50612aad565b6040516370a0823160e01b815230600482015283906001600160a01b038716906370a0823190602401602060405180830381865afa1580156129be573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129e29190613ba3565b1015612a3b5760405162461bcd60e51b815260206004820152602260248201527f43484f4f43483a20496e73756666696369656e7420746f6b656e2062616c616e604482015261636560f01b6064820152608401610467565b60405163a9059cbb60e01b81526001600160a01b0385811660048301526024820185905286169063a9059cbb906044016020604051808303815f875af1158015612a87573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612aab9190613bba565b505b836001600160a01b03167f6758593a60801a617f0db7ba7baa12f6c9e46bafd2d55b3dad6b807d1c215a9c84604051612b20919060408082526019908201527f4163636964656e74616c20546f6b656e205265636f76657279000000000000006060820152602081019190915260800190565b60405180910390a25061139760018055565b6006545f908190819081908190819060ff168015612b575750600654610100900460ff165b6006549091505f9060ff16158015612b7e575062015180601754612b7b9190613ae9565b42105b60065460075460ff808316159b61010090930416159950939750929550935090915050565b5f805f805f60175460125f9054906101000a900460ff1660135462015180601754612bce9190613ae9565b421062015180601754612be19190613ae9565b421015945094509450945094509091929394565b6115ae81336136a2565b5f612c0a8383611a14565b612c87575f838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055612c3f3390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610d2c565b505f610d2c565b5f612c998383611a14565b15612c87575f838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610d2c565b60025460ff1615612d3d5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610467565b565b6001600160a01b038316612d9f5760405162461bcd60e51b815260206004820152602160248201527f43484f4f43483a20417070726f76652066726f6d207a65726f206164647265736044820152607360f81b6064820152608401610467565b6001600160a01b038216612df55760405162461bcd60e51b815260206004820152601f60248201527f43484f4f43483a20417070726f766520746f207a65726f2061646472657373006044820152606401610467565b6001600160a01b038381165f8181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038316612eb75760405162461bcd60e51b815260206004820152602260248201527f43484f4f43483a205472616e736665722066726f6d207a65726f206164647265604482015261737360f01b6064820152608401610467565b6001600160a01b038216612f0d5760405162461bcd60e51b815260206004820181905260248201527f43484f4f43483a205472616e7366657220746f207a65726f20616464726573736044820152606401610467565b6001600160a01b0383165f90815260036020526040902054811115612f745760405162461bcd60e51b815260206004820181905260248201527f43484f4f43483a205472616e7366657220657863656564732062616c616e63656044820152606401610467565b60065460ff16158015612f96575062015180601754612f939190613ae9565b42105b8015612fba57506001600160a01b0383165f9081526016602052604090205460ff16155b8015612fde57506001600160a01b0382165f9081526016602052604090205460ff16155b1561306f576001600160a01b0383165f908152601860205260409020544390036130545760405162461bcd60e51b815260206004820152602160248201527f43484f4f43483a204f6e65207472616e73616374696f6e2070657220626c6f636044820152606b60f81b6064820152608401610467565b6001600160a01b0383165f9081526018602052604090204390555b60065460ff1615801561309a57506001600160a01b0383165f9081526016602052604090205460ff16155b80156130be57506001600160a01b0382165f9081526016602052604090205460ff16155b15613189576014548111156131155760405162461bcd60e51b815260206004820152601f60248201527f43484f4f43483a2045786365656473206d6178207472616e73616374696f6e006044820152606401610467565b6015546001600160a01b0383165f9081526003602052604090205461313b908390613ae9565b11156131895760405162461bcd60e51b815260206004820152601a60248201527f43484f4f43483a2045786365656473206d61782077616c6c65740000000000006044820152606401610467565b6001600160a01b0383165f90815260036020526040812080548392906131b0908490613ad6565b90915550506001600160a01b0382165f90815260036020526040812080548392906131dc908490613ae9565b92505081905550816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051612e4991815260200190565b6132306136df565b6002805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600f548290829060ff16156132eb57600854604051634a1fefbd60e01b81526001600160a01b0384811660048301526024820184905290911690634a1fefbd906044015f604051808303815f87803b1580156132d4575f80fd5b505af11580156132e6573d5f803e3d5ffd5b505050505b6001600160a01b0384166133415760405162461bcd60e51b815260206004820152601e60248201527f43484f4f43483a204275726e2066726f6d207a65726f206164647265737300006044820152606401610467565b6001600160a01b0384165f908152600360205260409020548311156133a85760405162461bcd60e51b815260206004820152601c60248201527f43484f4f43483a204275726e20657863656564732062616c616e6365000000006044820152606401610467565b5f83116133f75760405162461bcd60e51b815260206004820152601f60248201527f43484f4f43483a2043616e6e6f74206275726e207a65726f20616d6f756e74006044820152606401610467565b8260055410156134495760405162461bcd60e51b815260206004820152601b60248201527f43484f4f43483a204275726e206578636565647320737570706c7900000000006044820152606401610467565b6001600160a01b0384165f9081526003602052604081208054859290613470908490613ad6565b925050819055508260055f8282546134889190613ad6565b925050819055508260105f8282546134a09190613ae9565b90915550506001600160a01b0384165f90815260116020526040812080548592906134cc908490613ae9565b90915550506040518381525f906001600160a01b038616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a3836001600160a01b03167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca58460405161354c91815260200190565b60405180910390a27f32c3bb07da1fa54acaf9cd038b7d0b7e94a0ef767e1a7885771f73c0ae7e6ebb600554601054604051613592929190918252602082015260400190565b60405180910390a1600f5460ff1615611397576008546040516325c70d2d60e21b81526001600160a01b038481166004830152602482018490529091169063971c34b4906044015f604051808303815f87803b1580156135f0575f80fd5b505af1158015613602573d5f803e3d5ffd5b5050505050505050565b613614612cf7565b6002805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861325d3390565b60026001540361369b5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610467565b6002600155565b6136ac8282611a14565b6136db5760405163e2517d3f60e01b81526001600160a01b038216600482015260248101839052604401610467565b5050565b60025460ff16612d3d5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610467565b5f60208284031215613738575f80fd5b81356001600160e01b03198116811461374f575f80fd5b9392505050565b5f81518084525f5b8181101561377a5760208185018101518683018201520161375e565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f61374f6020830184613756565b80356001600160a01b03811681146137c1575f80fd5b919050565b5f602082840312156137d6575f80fd5b61374f826137ab565b5f80604083850312156137f0575f80fd5b6137f9836137ab565b946020939093013593505050565b858152846020820152836040820152821515606082015260a060808201525f61383360a0830184613756565b979650505050505050565b5f805f60608486031215613850575f80fd5b613859846137ab565b9250613867602085016137ab565b9150604084013590509250925092565b5f60208284031215613887575f80fd5b5035919050565b5f806040838503121561389f575f80fd5b823591506138af602084016137ab565b90509250929050565b5f80602083850312156138c9575f80fd5b823567ffffffffffffffff808211156138e0575f80fd5b818501915085601f8301126138f3575f80fd5b813581811115613901575f80fd5b8660208260051b8501011115613915575f80fd5b60209290920196919550909350505050565b5f8060408385031215613938575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52604160045260245ffd5b5f6020828403121561396b575f80fd5b813567ffffffffffffffff80821115613982575f80fd5b818401915084601f830112613995575f80fd5b8135818111156139a7576139a7613947565b604051601f8201601f19908116603f011681019083821181831017156139cf576139cf613947565b816040528281528760208487010111156139e7575f80fd5b826020860160208301375f928101602001929092525095945050505050565b80151581146115ae575f80fd5b5f8060408385031215613a24575f80fd5b613a2d836137ab565b91506020830135613a3d81613a06565b809150509250929050565b5f8060408385031215613a59575f80fd5b613a62836137ab565b91506138af602084016137ab565b60208082526014908201527343484f4f43483a205a65726f206164647265737360601b604082015260600190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610d2c57610d2c613ac2565b80820180821115610d2c57610d2c613ac2565b634e487b7160e01b5f52603260045260245ffd5b5f60018201613b2157613b21613ac2565b5060010190565b60208082526025908201527f43484f4f43483a204c61756e63682061646d696e20706f776572732072656e6f6040820152641d5b98d95960da1b606082015260800190565b5f82613b8757634e487b7160e01b5f52601260045260245ffd5b500490565b8082028115828204841417610d2c57610d2c613ac2565b5f60208284031215613bb3575f80fd5b5051919050565b5f60208284031215613bca575f80fd5b815161374f81613a0656febf233dd2aafeb4d50879c4aa5c81e96d92f6e6945c906a58f9f2d1c1631b4b267c40d5c3a0ded30ce1f4aefc0ffa0ae4e05a6b698b759a90fbdd0ef31cfe9cd1261ff18f0ac1ec491087976045becb30b450301d7ca8a65eefee86a7c82e629943484f4f43483a2031303025207461782d6672656520666f72657665722c206d696e696d616c2061646d696e20706f776572732c206d6178696d756d207472757374a26469706673582212204d0ccfb85d18e30f0a56afc023ba9e1108d1b8fbcfc59331bfef47e070f1b70164736f6c63430008140033

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

00000000000000000000000038d40f5c8375f84c5b90bc460a94a436d09133fb0000000000000000000000008540cf5afac19619a349fdaa7a9fa85ef2f097330000000000000000000000008513f04fdc62bfd78177f72a189a2d589a35e8550000000000000000000000008513f04fdc62bfd78177f72a189a2d589a35e8550000000000000000000000000000000000000000000000000000000000015180

-----Decoded View---------------
Arg [0] : _losslessController (address): 0x38D40f5c8375F84C5B90bc460A94a436D09133fB
Arg [1] : _losslessAdmin (address): 0x8540cf5Afac19619a349fdAa7A9fa85Ef2F09733
Arg [2] : _emergencyAdmin (address): 0x8513F04fDC62Bfd78177F72A189a2D589A35E855
Arg [3] : _recoveryAdmin (address): 0x8513F04fDC62Bfd78177F72A189a2D589A35E855
Arg [4] : _timelockPeriod (uint256): 86400

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 00000000000000000000000038d40f5c8375f84c5b90bc460a94a436d09133fb
Arg [1] : 0000000000000000000000008540cf5afac19619a349fdaa7a9fa85ef2f09733
Arg [2] : 0000000000000000000000008513f04fdc62bfd78177f72a189a2d589a35e855
Arg [3] : 0000000000000000000000008513f04fdc62bfd78177f72a189a2d589a35e855
Arg [4] : 0000000000000000000000000000000000000000000000000000000000015180


Deployed Bytecode Sourcemap

27639:24962:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52449:41;;-1:-1:-1;;;52449:41:0;;216:2:1;52449:41:0;;;198:21:1;255:2;235:18;;;228:30;294:33;274:18;;;267:61;345:18;;52449:41:0;;;;;;;;27639:24962;52549:41;;-1:-1:-1;;;52549:41:0;;576:2:1;52549:41:0;;;558:21:1;615:2;595:18;;;588:30;654:33;634:18;;;627:61;705:18;;52549:41:0;374:355:1;8870:204:0;;;;;;;;;;-1:-1:-1;8870:204:0;;;;;:::i;:::-;;:::i;:::-;;;1190:14:1;;1183:22;1165:41;;1153:2;1138:18;8870:204:0;;;;;;;;29592:35;;;;;;;;;;;;29626:1;29592:35;;;;;1363:25:1;;;1351:2;1336:18;29592:35:0;1217:177:1;35389:92:0;;;;;;;;;;-1:-1:-1;35468:5:0;;;;;;;;;;;-1:-1:-1;;;35468:5:0;;;;35389:92;;;;35468:5;35389:92;:::i;46032:516::-;;;;;;;;;;-1:-1:-1;46032:516:0;;;;;:::i;:::-;;:::i;:::-;;37080:290;;;;;;;;;;-1:-1:-1;37080:290:0;;;;;:::i;:::-;;:::i;35705:102::-;;;;;;;;;;-1:-1:-1;35785:14:0;;35705:102;;50195:419;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;28478:68::-;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;28478:68:0;;36512:556;;;;;;;;;;-1:-1:-1;36512:556:0;;;;;:::i;:::-;;:::i;10150:122::-;;;;;;;;;;-1:-1:-1;10150:122:0;;;;;:::i;:::-;10215:7;10242:12;;;;;;;;;;:22;;;;10150:122;30222:38;;;;;;;;;;;;;;;;29503:39;;;;;;;;;;;;29538:4;29503:39;;46739:287;;;;;;;;;;-1:-1:-1;46739:287:0;;;;;:::i;:::-;;:::i;29318:29::-;;;;;;;;;;;;;;;;10582:138;;;;;;;;;;-1:-1:-1;10582:138:0;;;;;:::i;:::-;;:::i;50626:111::-;;;;;;;;;;-1:-1:-1;50714:15:0;;50695;:34;;50626:111;;35601:92;;;;;;;;;;-1:-1:-1;35601:92:0;;27912:2;4303:36:1;;4291:2;4276:18;35601:92:0;4161:184:1;29126:35:0;;;;;;;;;;-1:-1:-1;29126:35:0;;;;-1:-1:-1;;;;;29126:35:0;;;;;;-1:-1:-1;;;;;4541:32:1;;;4523:51;;4511:2;4496:18;29126:35:0;4350:230:1;11719:251:0;;;;;;;;;;-1:-1:-1;11719:251:0;;;;;:::i;:::-;;:::i;37382:580::-;;;;;;;;;;-1:-1:-1;37382:580:0;;;;;:::i;:::-;;:::i;43492:165::-;;;;;;;;;;;;;:::i;40560:99::-;;;;;;;;;;-1:-1:-1;40560:99:0;;;;;:::i;:::-;;:::i;30181:34::-;;;;;;;;;;-1:-1:-1;30181:34:0;;;;;;;;30511:59;;;;;;;;;;;;30562:8;30511:59;;48642:251;;;;;;;;;;;;;:::i;18411:86::-;;;;;;;;;;-1:-1:-1;18482:7:0;;;;18411:86;;30346:52;;;;;;;;;;-1:-1:-1;30346:52:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;29195:28;;;;;;;;;;-1:-1:-1;29195:28:0;;;;-1:-1:-1;;;;;29195:28:0;;;29354:39;;;;;;;;;;;;;;;;30474:30;;;;;;;;;;;;;;;;28776:40;;;;;;;;;;-1:-1:-1;28776:40:0;;;;;;;;46637:90;;;;;;;;;;-1:-1:-1;46714:5:0;;-1:-1:-1;;;;;46714:5:0;46637:90;;35819:119;;;;;;;;;;-1:-1:-1;35819:119:0;;;;;:::i;:::-;-1:-1:-1;;;;;35912:18:0;35885:7;35912:18;;;:9;:18;;;;;;;35819:119;44748:601;;;;;;;;;;;;;:::i;40671:346::-;;;;;;;;;;-1:-1:-1;40671:346:0;;;;;:::i;:::-;;:::i;43321:159::-;;;;;;;;;;;;;:::i;45361:659::-;;;;;;;;;;;;;:::i;51954:394::-;;;;;;;;;;-1:-1:-1;52208:12:0;;52243:8;;52267:5;;52287:13;;52315:14;;51954:394;;;52208:12;;;;5256:14:1;5249:22;5231:41;;-1:-1:-1;;;;;52243:8:0;;;5341:2:1;5326:18;;5319:43;52267:5:0;;;5378:18:1;;;5371:43;;;;52287:13:0;;;;5445:2:1;5430:18;;5423:43;5497:3;5482:19;;5475:35;5218:3;5203:19;51954:394:0;4978:538:1;41832:271:0;;;;;;;;;;;;;:::i;9166:138::-;;;;;;;;;;-1:-1:-1;9166:138:0;;;;;:::i;:::-;;:::i;47038:376::-;;;;;;;;;;-1:-1:-1;47038:376:0;;;;;:::i;:::-;;:::i;48905:930::-;;;;;;;;;;-1:-1:-1;48905:930:0;;;;;:::i;:::-;;:::i;42115:853::-;;;;;;;;;;-1:-1:-1;42115:853:0;;;;;:::i;:::-;;:::i;37974:761::-;;;;;;;;;;-1:-1:-1;37974:761:0;;;;;:::i;:::-;;:::i;30599:55::-;;;;;;;;;;-1:-1:-1;30599:55:0;;;;;:::i;:::-;;;;;;;;;;;;;;36189:311;;;;;;;;;;-1:-1:-1;36189:311:0;;;;;:::i;:::-;;:::i;30309:30::-;;;;;;;;;;;;;;;;48268:362;;;;;;;;;;;;;:::i;47426:451::-;;;;;;;;;;-1:-1:-1;47426:451:0;;;;;:::i;:::-;;:::i;50011:172::-;;;;;;;;;;;;;:::i;42980:245::-;;;;;;;;;;-1:-1:-1;42980:245:0;;;;;:::i;:::-;;:::i;28350:74::-;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;28350:74:0;;30267:35;;;;;;;;;;;;;;;;29400:31;;;;;;;;;;-1:-1:-1;29400:31:0;;;;;;;;11013:140;;;;;;;;;;-1:-1:-1;11013:140:0;;;;;:::i;:::-;;:::i;47889:367::-;;;;;;;;;;;;;:::i;29930:26::-;;;;;;;;;;;;;;;;35950:143;;;;;;;;;;-1:-1:-1;35950:143:0;;;;;:::i;:::-;-1:-1:-1;;;;;36058:18:0;;;36031:7;36058:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;35950:143;43739:909;;;;;;;;;;-1:-1:-1;43739:909:0;;;;;:::i;:::-;;:::i;28591:78::-;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;28591:78:0;;28977:36;;;;;;;;;;;;;;;;29963:50;;;;;;;;;;-1:-1:-1;29963:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;51252:690;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;8679:14:1;;8672:22;8654:41;;8738:14;;8731:22;8726:2;8711:18;;8704:50;8797:14;;8790:22;8785:2;8770:18;;8763:50;8844:2;8829:18;;8822:34;8900:14;8893:22;8887:3;8872:19;;8865:51;8641:3;8626:19;;8419:503;29168:20:0;;;;;;;;;;-1:-1:-1;29168:20:0;;;;-1:-1:-1;;;;;29168:20:0;;;28875:43;;;;;;;;;;-1:-1:-1;28875:43:0;;;;;;;;;;;50749:491;;;;;;;;;;;;;:::i;:::-;;;;9168:25:1;;;9236:14;;9229:22;9224:2;9209:18;;9202:50;9268:18;;;9261:34;;;;9338:14;9331:22;9326:2;9311:18;;9304:50;9398:14;9391:22;9385:3;9370:19;;9363:51;9155:3;9140:19;50749:491:0;8927:493:1;8870:204:0;8955:4;-1:-1:-1;;;;;;8979:47:0;;-1:-1:-1;;;8979:47:0;;:87;;-1:-1:-1;;;;;;;;;;6306:40:0;;;9030:36;8972:94;8870:204;-1:-1:-1;;8870:204:0:o;46032:516::-;-1:-1:-1;;;;;;;;;;;8762:16:0;8773:4;8762:10;:16::i;:::-;46168:8;-1:-1:-1;;;;;33099:21:0;::::1;33091:54;;;;-1:-1:-1::0;;;33091:54:0::1;;;;;;;:::i;:::-;46203:23:::2;::::0;::::2;::::0;::::2;;;46202:24;46194:77;;;::::0;-1:-1:-1;;;46194:77:0;;9976:2:1;46194:77:0::2;::::0;::::2;9958:21:1::0;10015:2;9995:18;;;9988:30;10054:34;10034:18;;;10027:62;-1:-1:-1;;;10105:18:1;;;10098:38;10153:19;;46194:77:0::2;9774:404:1::0;46194:77:0::2;4249:10:::0;-1:-1:-1;;;;;46290:24:0;::::2;::::0;46282:68:::2;;;::::0;-1:-1:-1;;;46282:68:0;;10385:2:1;46282:68:0::2;::::0;::::2;10367:21:1::0;10424:2;10404:18;;;10397:30;10463:33;10443:18;;;10436:61;10514:18;;46282:68:0::2;10183:355:1::0;46282:68:0::2;46371:36;-1:-1:-1::0;;;;;;;;;;;46398:8:0::2;46371:10;:36::i;:::-;-1:-1:-1::0;46418:41:0::2;-1:-1:-1::0;;;;;;;;;;;4249:10:0;46418:11:::2;:41::i;46446:12::-;46418:11;:41::i;:::-;;46514:8;-1:-1:-1::0;;;;;46485:55:0::2;;46524:15;46485:55;;;;1363:25:1::0;;1351:2;1336:18;;1217:177;46485:55:0::2;;;;;;;;8789:1:::1;46032:516:::0;;:::o;37080:290::-;37278:4;18016:19;:17;:19::i;:::-;37212:7;-1:-1:-1;;;;;33099:21:0;::::1;33091:54;;;;-1:-1:-1::0;;;33091:54:0::1;;;;;;;:::i;:::-;32127:12:::2;::::0;37242:7;;37251:6;;32127:12:::2;;32123:98;;;32156:8;::::0;-1:-1:-1;;;;;32156:8:0::2;:22;4249:10:::0;32193:7:::2;32202:6;32156:53;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;32123:98;37301:39:::3;4249:10:::0;37324:7:::3;37333:6;37301:8;:39::i;:::-;37358:4;37351:11;;32247:12:::2;::::0;::::2;;32243:97;;;32276:8;::::0;-1:-1:-1;;;;;32276:8:0::2;:21;4249:10:::0;32312:7:::2;32321:6;32276:52;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;32243:97;33156:1;;18046::::1;37080:290:::0;;;;:::o;50195:419::-;50257:14;50282:15;50308:19;50338:14;50363:25;29626:1;29716;29811;29538:4;50407:199;;;;;;;;;;;;;;;;;;;;;;;;;;;50195:419;;;;;:::o;36512:556::-;36749:4;18016:19;:17;:19::i;:::-;32925:14:::1;::::0;::::1;;::::0;:52:::1;;-1:-1:-1::0;4249:10:0;32943:34:::1;::::0;;;:20:::1;:34;::::0;;;;;::::1;;32925:52;32917:92;;;::::0;-1:-1:-1;;;32917:92:0;;11125:2:1;32917:92:0::1;::::0;::::1;11107:21:1::0;11164:2;11144:18;;;11137:30;11203:29;11183:18;;;11176:57;11250:18;;32917:92:0::1;10923:351:1::0;32917:92:0::1;36682:2:::0;-1:-1:-1;;;;;33099:21:0;::::2;33091:54;;;;-1:-1:-1::0;;;33091:54:0::2;;;;;;;:::i;:::-;31797:12:::3;::::0;36712:4;;36718:2;;36722:6;;31797:12:::3;;31793:113;;;31826:8;::::0;-1:-1:-1;;;;;31826:8:0::3;:27;4249:10:::0;31826:68:::3;::::0;-1:-1:-1;;;;;;31826:68:0::3;::::0;;;;;;-1:-1:-1;;;;;11566:15:1;;;31826:68:0::3;::::0;::::3;11548:34:1::0;11618:15;;;11598:18;;;11591:43;11670:15;;;11650:18;;;11643:43;11702:18;;;11695:34;;;11482:19;;31826:68:0::3;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;31793:113;-1:-1:-1::0;;;;;36799:17:0;::::4;36772:24;36799:17:::0;;;:11:::4;:17;::::0;;;;;;;4249:10;36799:31;;;;;;;;36849:26;;::::4;;36841:73;;;::::0;-1:-1:-1;;;36841:73:0;;11942:2:1;36841:73:0::4;::::0;::::4;11924:21:1::0;11981:2;11961:18;;;11954:30;12020:34;12000:18;;;11993:62;-1:-1:-1;;;12071:18:1;;;12064:32;12113:19;;36841:73:0::4;11740:398:1::0;36841:73:0::4;36935:27;36945:4;36951:2;36955:6;36935:9;:27::i;:::-;36973:55;36982:4:::0;4249:10;37002:25:::4;37021:6:::0;37002:16;:25:::4;:::i;:::-;36973:8;:55::i;:::-;37056:4;37049:11;;;31932:12:::3;::::0;::::3;;31928:112;;;31961:8;::::0;-1:-1:-1;;;;;31961:8:0::3;:26;4249:10:::0;31961:67:::3;::::0;-1:-1:-1;;;;;;31961:67:0::3;::::0;;;;;;-1:-1:-1;;;;;11566:15:1;;;31961:67:0::3;::::0;::::3;11548:34:1::0;11618:15;;;11598:18;;;11591:43;11670:15;;;11650:18;;;11643:43;11702:18;;;11695:34;;;11482:19;;31961:67:0::3;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;31928:112;33156:1;;;33020::::2;36512:556:::0;;;;;:::o;46739:287::-;-1:-1:-1;;;;;;;;;;;8762:16:0;8773:4;8762:10;:16::i;:::-;-1:-1:-1;;;;;46850:22:0;::::1;46842:56;;;::::0;-1:-1:-1;;;46842:56:0;;12610:2:1;46842:56:0::1;::::0;::::1;12592:21:1::0;12649:2;12629:18;;;12622:30;-1:-1:-1;;;12668:18:1;;;12661:51;12729:18;;46842:56:0::1;12408:345:1::0;46842:56:0::1;46929:5;::::0;-1:-1:-1;;;;;46929:5:0;;::::1;46917:17:::0;;::::1;::::0;46909:48:::1;;;::::0;-1:-1:-1;;;46909:48:0;;12960:2:1;46909:48:0::1;::::0;::::1;12942:21:1::0;12999:2;12979:18;;;12972:30;-1:-1:-1;;;13018:18:1;;;13011:48;13076:18;;46909:48:0::1;12758:342:1::0;46909:48:0::1;46973:18;::::0;-1:-1:-1;;;;;46973:18:0;::::1;::::0;::::1;::::0;;;::::1;-1:-1:-1::0;47002:5:0::1;:16:::0;;-1:-1:-1;;;;;;47002:16:0::1;-1:-1:-1::0;;;;;47002:16:0;;;::::1;::::0;;;::::1;::::0;;46739:287::o;10582:138::-;10215:7;10242:12;;;;;;;;;;:22;;;8762:16;8773:4;8762:10;:16::i;:::-;10687:25:::1;10698:4;10704:7;10687:10;:25::i;:::-;;10582:138:::0;;;:::o;11719:251::-;-1:-1:-1;;;;;11813:34:0;;4249:10;11813:34;11809:104;;11871:30;;-1:-1:-1;;;11871:30:0;;;;;;;;;;;11809:104;11925:37;11937:4;11943:18;11925:11;:37::i;:::-;;11719:251;;:::o;37382:580::-;37556:4;18016:19;:17;:19::i;:::-;37528:7;-1:-1:-1;;;;;33099:21:0;::::1;33091:54;;;;-1:-1:-1::0;;;33091:54:0::1;;;;;;;:::i;:::-;37583:12:::2;::::0;::::2;;37579:112;;;37612:8;::::0;-1:-1:-1;;;;;37612:8:0::2;:32;4249:10:::0;37659:7:::2;37668:10;37612:67;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;37579:112;4249:10:::0;37743:25:::2;::::0;;;:11:::2;:25;::::0;;;;;;;-1:-1:-1;;;;;37743:34:0;::::2;::::0;;;;;;;;37711:80:::2;::::0;4249:10;37734:7;;37743:47:::2;::::0;37780:10;;37743:47:::2;:::i;37711:80::-;37816:12;::::0;::::2;;37812:111;;;37845:8;::::0;-1:-1:-1;;;;;37845:8:0::2;:31;4249:10:::0;37891:7:::2;37900:10;37845:66;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;37812:111;-1:-1:-1::0;37950:4:0::2;::::0;37382:580;-1:-1:-1;;;37382:580:0:o;43492:165::-;-1:-1:-1;;;;;;;;;;;8762:16:0;8773:4;8762:10;:16::i;:::-;43556:10:::1;:8;:10::i;:::-;43582:67;::::0;;13447:21:1;;;13504:2;13484:18;;;13477:30;;;;-1:-1:-1;;;13538:2:1;13523:18;;13516:47;43633:15:0::1;13630:4:1::0;13615:20;;13608:36;4249:10:0;;43582:67:::1;::::0;13595:3:1;13580:19;43582:67:0::1;;;;;;;;43492:165:::0;:::o;40560:99::-;18016:19;:17;:19::i;:::-;40624:27:::1;4249:10:::0;40644:6:::1;40624:5;:27::i;:::-;40560:99:::0;:::o;48642:251::-;-1:-1:-1;;;;;;;;;;;8762:16:0;8773:4;8762:10;:16::i;:::-;48743:12:::1;::::0;::::1;;48742:13;48734:44;;;::::0;-1:-1:-1;;;48734:44:0;;13857:2:1;48734:44:0::1;::::0;::::1;13839:21:1::0;13896:2;13876:18;;;13869:30;-1:-1:-1;;;13915:18:1;;;13908:48;13973:18;;48734:44:0::1;13655:342:1::0;48734:44:0::1;48799:12;:19:::0;;-1:-1:-1;;48799:19:0::1;48814:4;48799:19;::::0;;:12:::1;48829:24;:28:::0;;;48873:12:::1;::::0;::::1;::::0;48799;48873::::1;48642:251:::0;:::o;44748:601::-;-1:-1:-1;;;;;;;;;;;8762:16:0;8773:4;8762:10;:16::i;:::-;44836:20:::1;::::0;::::1;;44835:21;44827:59;;;::::0;-1:-1:-1;;;44827:59:0;;14204:2:1;44827:59:0::1;::::0;::::1;14186:21:1::0;14243:2;14223:18;;;14216:30;-1:-1:-1;;;14262:18:1;;;14255:55;14327:18;;44827:59:0::1;14002:349:1::0;44827:59:0::1;44907:20;:27:::0;;-1:-1:-1;;44907:27:0::1;44930:4;44907:27;::::0;;44969:15:::1;44945:21;:39:::0;45005:44:::1;-1:-1:-1::0;;;;;;;;;;;45036:12:0::1;4249:10:::0;;4169:98;45005:44:::1;-1:-1:-1::0;45075:68:0::1;::::0;45127:15:::1;1363:25:1::0;;4249:10:0;;-1:-1:-1;;;;;;;;;;;28394:30:0;45075:68:::1;::::0;1351:2:1;1336:18;45075:68:0::1;;;;;;;;45219:20;::::0;::::1;;:47:::0;::::1;;;-1:-1:-1::0;45243:23:0::1;::::0;::::1;::::0;::::1;;;45219:47;45215:127;;;45288:42;::::0;45314:15:::1;1363:25:1::0;;45288:42:0::1;::::0;1351:2:1;1336:18;45288:42:0::1;;;;;;;;44748:601:::0;:::o;40671:346::-;18016:19;:17;:19::i;:::-;-1:-1:-1;;;;;40783:20:0;::::1;40756:24;40783:20:::0;;;:11:::1;:20;::::0;;;;;;;4249:10;40783:34;;;;;;;;40836:26;;::::1;;40828:69;;;::::0;-1:-1:-1;;;40828:69:0;;14558:2:1;40828:69:0::1;::::0;::::1;14540:21:1::0;14597:2;14577:18;;;14570:30;14636:32;14616:18;;;14609:60;14686:18;;40828:69:0::1;14356:354:1::0;40828:69:0::1;40918:22;40924:7;40933:6;40918:5;:22::i;:::-;40951:58;40960:7:::0;4249:10;40983:25:::1;41002:6:::0;40983:16;:25:::1;:::i;43321:159::-:0;-1:-1:-1;;;;;;;;;;;8762:16:0;8773:4;8762:10;:16::i;:::-;43383:8:::1;:6;:8::i;:::-;43407:65;::::0;;14927:21:1;;;14984:2;14964:18;;;14957:30;;;;-1:-1:-1;;;15018:2:1;15003:18;;14996:45;43456:15:0::1;15108:4:1::0;15093:20;;15086:36;4249:10:0;;43407:65:::1;::::0;15073:3:1;15058:19;43407:65:0::1;14715:413:1::0;45361:659:0;-1:-1:-1;;;;;;;;;;;8762:16:0;8773:4;8762:10;:16::i;:::-;45449:23:::1;::::0;::::1;::::0;::::1;;;45448:24;45440:62;;;::::0;-1:-1:-1;;;45440:62:0;;14204:2:1;45440:62:0::1;::::0;::::1;14186:21:1::0;14243:2;14223:18;;;14216:30;-1:-1:-1;;;14262:18:1;;;14255:55;14327:18;;45440:62:0::1;14002:349:1::0;45440:62:0::1;45523:23;:30:::0;;-1:-1:-1;;45523:30:0::1;;;::::0;;45568:21:::1;::::0;45523:30;45568:26;45564:98:::1;;45635:15;45611:21;:39:::0;45564:98:::1;45682:41;-1:-1:-1::0;;;;;;;;;;;4249:10:0;46418:11:::2;:41::i;45682:::-:1;-1:-1:-1::0;45749:65:0::1;::::0;45798:15:::1;1363:25:1::0;;4249:10:0;;-1:-1:-1;;;;;;;;;;;28519:27:0;45749:65:::1;::::0;1351:2:1;1336:18;45749:65:0::1;1217:177:1::0;41832:271:0;-1:-1:-1;;;;;;;;;;;8762:16:0;8773:4;8762:10;:16::i;:::-;41914:14:::1;::::0;::::1;;41913:15;41905:59;;;::::0;-1:-1:-1;;;41905:59:0;;15335:2:1;41905:59:0::1;::::0;::::1;15317:21:1::0;15374:2;15354:18;;;15347:30;15413:33;15393:18;;;15386:61;15464:18;;41905:59:0::1;15133:355:1::0;41905:59:0::1;41975:14;:21:::0;;-1:-1:-1;;41975:21:0::1;41992:4;41975:21;::::0;;42033:15:::1;42007:23;:41:::0;;;42064:31:::1;::::0;::::1;::::0;::::1;::::0;1363:25:1;;;1351:2;1336:18;;1217:177;9166:138:0;9243:4;9267:12;;;;;;;;;;;-1:-1:-1;;;;;9267:29:0;;;;;;;;;;;;;;;9166:138::o;47038:376::-;-1:-1:-1;;;;;;;;;;;8762:16:0;8773:4;8762:10;:16::i;:::-;-1:-1:-1;;;;;47216:23:0;::::1;47208:61;;;::::0;-1:-1:-1;;;47208:61:0;;15695:2:1;47208:61:0::1;::::0;::::1;15677:21:1::0;15734:2;15714:18;;;15707:30;15773:27;15753:18;;;15746:55;15818:18;;47208:61:0::1;15493:349:1::0;47208:61:0::1;47280:22;:34:::0;;-1:-1:-1;;;;;;47280:34:0::1;-1:-1:-1::0;;;;;47280:34:0;::::1;::::0;;::::1;::::0;;;47325:20:::1;:30:::0;;;47371:35:::1;::::0;::::1;::::0;-1:-1:-1;;47371:35:0::1;47038:376:::0;;;:::o;48905:930::-;49054:8;;-1:-1:-1;;;;;49054:8:0;4249:10;-1:-1:-1;;;;;49030:33:0;;49022:67;;;;-1:-1:-1;;;49022:67:0;;16049:2:1;49022:67:0;;;16031:21:1;16088:2;16068:18;;;16061:30;-1:-1:-1;;;16107:18:1;;;16100:51;16168:18;;49022:67:0;15847:345:1;49022:67:0;49108:12;;;;49100:45;;;;-1:-1:-1;;;49100:45:0;;16399:2:1;49100:45:0;;;16381:21:1;16438:2;16418:18;;;16411:30;-1:-1:-1;;;16457:18:1;;;16450:50;16517:18;;49100:45:0;16197:344:1;49100:45:0;49164:15;49156:47;;;;-1:-1:-1;;;49156:47:0;;16748:2:1;49156:47:0;;;16730:21:1;16787:2;16767:18;;;16760:30;-1:-1:-1;;;16806:18:1;;;16799:49;16865:18;;49156:47:0;16546:343:1;49156:47:0;49224:19;49273:9;49268:449;49288:15;;;49268:449;;;49325:19;49347:4;;49352:1;49347:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;49325:29;-1:-1:-1;;;;;;49377:25:0;;49369:61;;;;-1:-1:-1;;;49369:61:0;;17228:2:1;49369:61:0;;;17210:21:1;17267:2;17247:18;;;17240:30;17306:25;17286:18;;;17279:53;17349:18;;49369:61:0;17026:347:1;49369:61:0;-1:-1:-1;;;;;49463:22:0;;49445:15;49463:22;;;:9;:22;;;;;;49518:11;;49514:192;;-1:-1:-1;;;;;49550:22:0;;49575:1;49550:22;;;:9;:22;;;;;:26;49595:22;49610:7;49595:22;;:::i;:::-;49671:8;;49641:49;;1363:25:1;;;49595:22:0;;-1:-1:-1;;;;;;49671:8:0;;;;49641:49;;;;;;1351:2:1;1336:18;49641:49:0;;;;;;;49514:192;49310:407;;49305:3;;;;;:::i;:::-;;;;49268:449;;;-1:-1:-1;49741:15:0;;49737:91;;49791:8;;-1:-1:-1;;;;;49791:8:0;49773:28;;;;:9;:28;;;;;:43;;49805:11;;49773:28;:43;;49805:11;;49773:43;:::i;:::-;;;;-1:-1:-1;;49011:824:0;48905:930;;:::o;42115:853::-;-1:-1:-1;;;;;;;;;;;8762:16:0;8773:4;8762:10;:16::i;:::-;32676:20:::1;::::0;::::1;;32675:21;32667:71;;;;-1:-1:-1::0;;;32667:71:0::1;;;;;;;:::i;:::-;30562:8;32775:15;;:42;;;;:::i;:::-;32757:15;:60;32749:100;;;::::0;-1:-1:-1;;;32749:100:0;;18126:2:1;32749:100:0::1;::::0;::::1;18108:21:1::0;18165:2;18145:18;;;18138:30;18204:29;18184:18;;;18177:57;18251:18;;32749:100:0::1;17924:351:1::0;32749:100:0::1;42314:1:::2;42296:15;:19;42288:70;;;::::0;-1:-1:-1;;;42288:70:0;;18482:2:1;42288:70:0::2;::::0;::::2;18464:21:1::0;18521:2;18501:18;;;18494:30;18560:34;18540:18;;;18533:62;-1:-1:-1;;;18611:18:1;;;18604:36;18657:19;;42288:70:0::2;18280:402:1::0;42288:70:0::2;42390:1;42377:10;:14;42369:60;;;::::0;-1:-1:-1;;;42369:60:0;;18889:2:1;42369:60:0::2;::::0;::::2;18871:21:1::0;18928:2;18908:18;;;18901:30;18967:34;18947:18;;;18940:62;-1:-1:-1;;;19018:18:1;;;19011:31;19059:19;;42369:60:0::2;18687:397:1::0;42369:60:0::2;27961:22;42448:15;:31;;42440:82;;;::::0;-1:-1:-1;;;42440:82:0;;19291:2:1;42440:82:0::2;::::0;::::2;19273:21:1::0;19330:2;19310:18;;;19303:30;19369:34;19349:18;;;19342:62;-1:-1:-1;;;19420:18:1;;;19413:36;19466:19;;42440:82:0::2;19089:402:1::0;42440:82:0::2;27961:22;42541:10;:26;;42533:72;;;::::0;-1:-1:-1;;;42533:72:0;;19698:2:1;42533:72:0::2;::::0;::::2;19680:21:1::0;19737:2;19717:18;;;19710:30;19776:34;19756:18;;;19749:62;-1:-1:-1;;;19827:18:1;;;19820:31;19868:19;;42533:72:0::2;19496:397:1::0;42533:72:0::2;42643:19;42658:4;27961:22;42643:19;:::i;:::-;42624:15;:38;;42616:82;;;::::0;-1:-1:-1;;;42616:82:0;;20322:2:1;42616:82:0::2;::::0;::::2;20304:21:1::0;20361:2;20341:18;;;20334:30;20400:33;20380:18;;;20373:61;20451:18;;42616:82:0::2;20120:355:1::0;42616:82:0::2;42743:18;42758:3;27961:22;42743:18;:::i;:::-;42729:10;:32;;42721:71;;;::::0;-1:-1:-1;;;42721:71:0;;20682:2:1;42721:71:0::2;::::0;::::2;20664:21:1::0;20721:2;20701:18;;;20694:30;20760:28;20740:18;;;20733:56;20806:18;;42721:71:0::2;20480:350:1::0;42721:71:0::2;42825:20;:38:::0;;;42874:15:::2;:28:::0;;;42918:42:::2;::::0;;21009:25:1;;;21065:2;21050:18;;21043:34;;;42918:42:0::2;::::0;20982:18:1;42918:42:0::2;;;;;;;42115:853:::0;;;:::o;37974:761::-;38153:4;18016:19;:17;:19::i;:::-;38125:7;-1:-1:-1;;;;;33099:21:0;::::1;33091:54;;;;-1:-1:-1::0;;;33091:54:0::1;;;;;;;:::i;:::-;38180:12:::2;::::0;::::2;;38176:117;;;38209:8;::::0;-1:-1:-1;;;;;38209:8:0::2;:32;4249:10:::0;38256:7:::2;38265:15;38209:72;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;38176:117;4249:10:::0;38313:24:::2;38340:25:::0;;;:11:::2;:25;::::0;;;;;;;-1:-1:-1;;;;;38340:34:0;::::2;::::0;;;;;;;;38393:35;;::::2;;38385:86;;;::::0;-1:-1:-1;;;38385:86:0;;21290:2:1;38385:86:0::2;::::0;::::2;21272:21:1::0;21329:2;21309:18;;;21302:30;21368:34;21348:18;;;21341:62;-1:-1:-1;;;21419:18:1;;;21412:36;21465:19;;38385:86:0::2;21088:402:1::0;38385:86:0::2;38492:67;4249:10:::0;38515:7;38524:34:::2;38543:15:::0;38524:16;:34:::2;:::i;38492:67::-;38584:12;::::0;::::2;;38580:116;;;38613:8;::::0;-1:-1:-1;;;;;38613:8:0::2;:31;4249:10:::0;38659:7:::2;38668:15;38613:71;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;38580:116;-1:-1:-1::0;38723:4:0::2;::::0;37974:761;-1:-1:-1;;;;37974:761:0:o;36189:311::-;36412:4;18016:19;:17;:19::i;:::-;32925:14:::1;::::0;::::1;;::::0;:52:::1;;-1:-1:-1::0;4249:10:0;32943:34:::1;::::0;;;:20:::1;:34;::::0;;;;;::::1;;32925:52;32917:92;;;::::0;-1:-1:-1;;;32917:92:0;;11125:2:1;32917:92:0::1;::::0;::::1;11107:21:1::0;11164:2;11144:18;;;11137:30;11203:29;11183:18;;;11176:57;11250:18;;32917:92:0::1;10923:351:1::0;32917:92:0::1;36341:2:::0;-1:-1:-1;;;;;33099:21:0;::::2;33091:54;;;;-1:-1:-1::0;;;33091:54:0::2;;;;;;;:::i;:::-;4249:10:::0;31480:12:::3;::::0;36381:2;;36385:6;;31480:12:::3;;31476:95;;;31509:8;::::0;:50:::3;::::0;-1:-1:-1;;;31509:50:0;;-1:-1:-1;;;;;31509:8:0;;::::3;::::0;:23:::3;::::0;:50:::3;::::0;31533:6;;31541:9;;31552:6;;31509:50:::3;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;31476:95;36435:35:::4;4249:10:::0;36459:2:::4;36463:6;36435:9;:35::i;:::-;36488:4;36481:11;;31597:12:::3;::::0;::::3;;31593:94;;;31626:8;::::0;:49:::3;::::0;-1:-1:-1;;;31626:49:0;;-1:-1:-1;;;;;31626:8:0;;::::3;::::0;:22:::3;::::0;:49:::3;::::0;31649:6;;31657:9;;31668:6;;31626:49:::3;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;::::0;::::3;;;;;;;;;31593:94;33156:1;;;33020::::2;36189:311:::0;;;;:::o;48268:362::-;-1:-1:-1;;;;;;;;;;;8762:16:0;8773:4;8762:10;:16::i;:::-;48369:24:::1;;48397:1;48369:29:::0;48361:62:::1;;;::::0;-1:-1:-1;;;48361:62:0;;21697:2:1;48361:62:0::1;::::0;::::1;21679:21:1::0;21736:2;21716:18;;;21709:30;-1:-1:-1;;;21755:18:1;;;21748:50;21815:18;;48361:62:0::1;21495:344:1::0;48361:62:0::1;48461:24;;48442:15;:43;;48434:79;;;::::0;-1:-1:-1;;;48434:79:0;;22046:2:1;48434:79:0::1;::::0;::::1;22028:21:1::0;22085:2;22065:18;;;22058:30;22124:25;22104:18;;;22097:53;22167:18;;48434:79:0::1;21844:347:1::0;48434:79:0::1;48534:12;:20:::0;;-1:-1:-1;;48534:20:0::1;::::0;;48549:5:::1;48565:24;:28:::0;;;48609:13:::1;::::0;::::1;::::0;48549:5;48609:13:::1;48268:362:::0;:::o;47426:451::-;47535:22;;-1:-1:-1;;;;;47535:22:0;4249:10;-1:-1:-1;;;;;47519:38:0;;47511:72;;;;-1:-1:-1;;;47511:72:0;;22398:2:1;47511:72:0;;;22380:21:1;22437:2;22417:18;;;22410:30;-1:-1:-1;;;22456:18:1;;;22449:51;22517:18;;47511:72:0;22196:345:1;47511:72:0;47620:20;;47602:14;;;;;;:38;47594:70;;;;-1:-1:-1;;;47594:70:0;;22748:2:1;47594:70:0;;;22730:21:1;22787:2;22767:18;;;22760:30;-1:-1:-1;;;22806:18:1;;;22799:49;22865:18;;47594:70:0;22546:343:1;47594:70:0;47707:22;;47690:40;;-1:-1:-1;;;;;47707:22:0;;;;47690:40;;47707:22;;47690:40;-1:-1:-1;47757:22:0;;;47741:13;:38;;-1:-1:-1;;;;;;47741:38:0;;;-1:-1:-1;;;;;47757:22:0;;47741:38;;;;47790:35;;;47757:22;47836:20;:33;47426:451::o;50011:172::-;50054:7;27961:22;50124:11;;50138:5;50124:19;;;;:::i;:::-;50123:36;;;;:::i;:::-;50116:43;;50011:172;:::o;42980:245::-;-1:-1:-1;;;;;;;;;;;8762:16:0;8773:4;8762:10;:16::i;:::-;32676:20:::1;::::0;::::1;;32675:21;32667:71;;;;-1:-1:-1::0;;;32667:71:0::1;;;;;;;:::i;:::-;30562:8;32775:15;;:42;;;;:::i;:::-;32757:15;:60;32749:100;;;::::0;-1:-1:-1;;;32749:100:0;;18126:2:1;32749:100:0::1;::::0;::::1;18108:21:1::0;18165:2;18145:18;;;18138:30;18204:29;18184:18;;;18177:57;18251:18;;32749:100:0::1;17924:351:1::0;32749:100:0::1;43151:7:::0;-1:-1:-1;;;;;33099:21:0;::::2;33091:54;;;;-1:-1:-1::0;;;33091:54:0::2;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;;;43177:29:0;;;::::3;;::::0;;;:20:::3;:29;::::0;;;;:40;;-1:-1:-1;;43177:40:0::3;::::0;::::3;;::::0;;;::::3;::::0;;42980:245::o;11013:140::-;10215:7;10242:12;;;;;;;;;;:22;;;8762:16;8773:4;8762:10;:16::i;:::-;11119:26:::1;11131:4;11137:7;11119:11;:26::i;47889:367::-:0;-1:-1:-1;;;;;;;;;;;8762:16:0;8773:4;8762:10;:16::i;:::-;47990:24:::1;::::0;:29;47982:66:::1;;;::::0;-1:-1:-1;;;47982:66:0;;23269:2:1;47982:66:0::1;::::0;::::1;23251:21:1::0;23308:2;23288:18;;;23281:30;23347:26;23327:18;;;23320:54;23391:18;;47982:66:0::1;23067:348:1::0;47982:66:0::1;48067:12;::::0;::::1;;48059:44;;;::::0;-1:-1:-1;;;48059:44:0;;23622:2:1;48059:44:0::1;::::0;::::1;23604:21:1::0;23661:2;23641:18;;;23634:30;-1:-1:-1;;;23680:18:1;;;23673:49;23739:18;;48059:44:0::1;23420:343:1::0;48059:44:0::1;48169:14;::::0;48151:32:::1;::::0;:15:::1;:32;:::i;:::-;48124:24;:59:::0;;;48199:49:::1;::::0;1363:25:1;;;48199:49:0::1;::::0;1351:2:1;1336:18;48199:49:0::1;1217:177:1::0;43739:909:0;-1:-1:-1;;;;;;;;;;;8762:16:0;8773:4;8762:10;:16::i;:::-;15843:21:::1;:19;:21::i;:::-;43924:2:::0;-1:-1:-1;;;;;33099:21:0;::::2;33091:54;;;;-1:-1:-1::0;;;33091:54:0::2;;;;;;;:::i;:::-;43969:4:::3;-1:-1:-1::0;;;;;43952:22:0;::::3;::::0;43944:71:::3;;;::::0;-1:-1:-1;;;43944:71:0;;23970:2:1;43944:71:0::3;::::0;::::3;23952:21:1::0;24009:2;23989:18;;;23982:30;24048:34;24028:18;;;24021:62;-1:-1:-1;;;24099:18:1;;;24092:34;24143:19;;43944:71:0::3;23768:400:1::0;43944:71:0::3;44043:1;44034:6;:10;44026:63;;;::::0;-1:-1:-1;;;44026:63:0;;24375:2:1;44026:63:0::3;::::0;::::3;24357:21:1::0;24414:2;24394:18;;;24387:30;24453:34;24433:18;;;24426:62;-1:-1:-1;;;24504:18:1;;;24497:38;24552:19;;44026:63:0::3;24173:404:1::0;44026:63:0::3;-1:-1:-1::0;;;;;44114:19:0;::::3;44110:449;;44229:6;44204:21;:31;;44196:76;;;::::0;-1:-1:-1;;;44196:76:0;;24784:2:1;44196:76:0::3;::::0;::::3;24766:21:1::0;;;24803:18;;;24796:30;24862:34;24842:18;;;24835:62;24914:18;;44196:76:0::3;24582:356:1::0;44196:76:0::3;44287:28;::::0;-1:-1:-1;;;;;44287:20:0;::::3;::::0;:28;::::3;;;::::0;44308:6;;44287:28:::3;::::0;;;44308:6;44287:20;:28;::::3;;;;;;;;;;;;;::::0;::::3;;;;;;44110:449;;;44411:38;::::0;-1:-1:-1;;;44411:38:0;;44443:4:::3;44411:38;::::0;::::3;4523:51:1::0;44453:6:0;;-1:-1:-1;;;;;44411:23:0;::::3;::::0;::::3;::::0;4496:18:1;;44411:38:0::3;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:48;;44403:95;;;::::0;-1:-1:-1;;;44403:95:0;;25334:2:1;44403:95:0::3;::::0;::::3;25316:21:1::0;25373:2;25353:18;;;25346:30;25412:34;25392:18;;;25385:62;-1:-1:-1;;;25463:18:1;;;25456:32;25505:19;;44403:95:0::3;25132:398:1::0;44403:95:0::3;44513:34;::::0;-1:-1:-1;;;44513:34:0;;-1:-1:-1;;;;;25727:32:1;;;44513:34:0::3;::::0;::::3;25709:51:1::0;25776:18;;;25769:34;;;44513:22:0;::::3;::::0;::::3;::::0;25682:18:1;;44513:34:0::3;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;44110:449;44629:2;-1:-1:-1::0;;;;;44584:56:0::3;;44633:6;44584:56;;;;;26294:2:1::0;26276:21;;;26333:2;26313:18;;;26306:30;26372:27;26367:2;26352:18;;26345:55;26467:4;26452:20;;26445:36;;;;26432:3;26417:19;;26064:423;44584:56:0::3;;;;;;;;15875:1:::2;15887:20:::1;15281:1:::0;16407:22;;16224:213;51252:690;51521:20;;51320:22;;;;;;;;;;;;51521:20;;:47;;;;-1:-1:-1;51545:23:0;;;;;;;51521:47;51605:20;;51499:69;;-1:-1:-1;51579:22:0;;51605:20;;51604:21;:119;;;;;30562:8;51681:15;;:42;;;;:::i;:::-;51663:15;:60;51604:119;51767:20;;51870:21;;51767:20;;;;51766:21;;51767:20;51803:23;;;;51802:24;;-1:-1:-1;51841:14:0;;-1:-1:-1;51870:21:0;;-1:-1:-1;51870:21:0;-1:-1:-1;51252:690:0;;-1:-1:-1;;51252:690:0:o;50749:491::-;50807:17;50835:12;50858:24;50893:21;50925:22;50988:15;;51018:14;;;;;;;;;;;51047:23;;30562:8;51103:15;;:42;;;;:::i;:::-;51085:15;:60;30562:8;51179:15;;:42;;;;:::i;:::-;51160:15;:61;;50966:266;;;;;;;;;;50749:491;;;;;:::o;9519:105::-;9586:30;9597:4;4249:10;9586;:30::i;12596:324::-;12673:4;12695:22;12703:4;12709:7;12695;:22::i;:::-;12690:223;;12734:6;:12;;;;;;;;;;;-1:-1:-1;;;;;12734:29:0;;;;;;;;;:36;;-1:-1:-1;;12734:36:0;12766:4;12734:36;;;12817:12;4249:10;;4169:98;12817:12;-1:-1:-1;;;;;12790:40:0;12808:7;-1:-1:-1;;;;;12790:40:0;12802:4;12790:40;;;;;;;;;;-1:-1:-1;12852:4:0;12845:11;;12690:223;-1:-1:-1;12896:5:0;12889:12;;13166:325;13244:4;13265:22;13273:4;13279:7;13265;:22::i;:::-;13261:223;;;13336:5;13304:12;;;;;;;;;;;-1:-1:-1;;;;;13304:29:0;;;;;;;;;;:37;;-1:-1:-1;;13304:37:0;;;13361:40;4249:10;;13304:12;;13361:40;;13336:5;13361:40;-1:-1:-1;13423:4:0;13416:11;;18570:108;18482:7;;;;18640:9;18632:38;;;;-1:-1:-1;;;18632:38:0;;26694:2:1;18632:38:0;;;26676:21:1;26733:2;26713:18;;;26706:30;-1:-1:-1;;;26752:18:1;;;26745:46;26808:18;;18632:38:0;26492:340:1;18632:38:0;18570:108::o;40133:340::-;-1:-1:-1;;;;;40227:19:0;;40219:65;;;;-1:-1:-1;;;40219:65:0;;27039:2:1;40219:65:0;;;27021:21:1;27078:2;27058:18;;;27051:30;27117:34;27097:18;;;27090:62;-1:-1:-1;;;27168:18:1;;;27161:31;27209:19;;40219:65:0;26837:397:1;40219:65:0;-1:-1:-1;;;;;40303:21:0;;40295:65;;;;-1:-1:-1;;;40295:65:0;;27441:2:1;40295:65:0;;;27423:21:1;27480:2;27460:18;;;27453:30;27519:33;27499:18;;;27492:61;27570:18;;40295:65:0;27239:355:1;40295:65:0;-1:-1:-1;;;;;40381:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;40433:32;;1363:25:1;;;40433:32:0;;1336:18:1;40433:32:0;;;;;;;;40133:340;;;:::o;38827:1294::-;-1:-1:-1;;;;;38916:18:0;;38908:65;;;;-1:-1:-1;;;38908:65:0;;27801:2:1;38908:65:0;;;27783:21:1;27840:2;27820:18;;;27813:30;27879:34;27859:18;;;27852:62;-1:-1:-1;;;27930:18:1;;;27923:32;27972:19;;38908:65:0;27599:398:1;38908:65:0;-1:-1:-1;;;;;38992:16:0;;38984:61;;;;-1:-1:-1;;;38984:61:0;;28204:2:1;38984:61:0;;;28186:21:1;;;28223:18;;;28216:30;28282:34;28262:18;;;28255:62;28334:18;;38984:61:0;28002:356:1;38984:61:0;-1:-1:-1;;;;;39064:15:0;;;;;;:9;:15;;;;;;:25;-1:-1:-1;39064:25:0;39056:70;;;;-1:-1:-1;;;39056:70:0;;28565:2:1;39056:70:0;;;28547:21:1;;;28584:18;;;28577:30;28643:34;28623:18;;;28616:62;28695:18;;39056:70:0;28363:356:1;39056:70:0;39227:20;;;;39226:21;:99;;;;;30562:8;39283:15;;:42;;;;:::i;:::-;39265:15;:60;39226:99;:144;;;;-1:-1:-1;;;;;;39344:26:0;;;;;;:20;:26;;;;;;;;39343:27;39226:144;:173;;;;-1:-1:-1;;;;;;39375:24:0;;;;;;:20;:24;;;;;;;;39374:25;39226:173;39222:350;;;-1:-1:-1;;;;;39424:26:0;;;;;;:20;:26;;;;;;39454:12;39424:42;;39416:88;;;;-1:-1:-1;;;39416:88:0;;28926:2:1;39416:88:0;;;28908:21:1;28965:2;28945:18;;;28938:30;29004:34;28984:18;;;28977:62;-1:-1:-1;;;29055:18:1;;;29048:31;29096:19;;39416:88:0;28724:397:1;39416:88:0;-1:-1:-1;;;;;39519:26:0;;;;;;:20;:26;;;;;39548:12;39519:41;;39222:350;39667:20;;;;39666:21;:52;;;;-1:-1:-1;;;;;;39692:26:0;;;;;;:20;:26;;;;;;;;39691:27;39666:52;:81;;;;-1:-1:-1;;;;;;39723:24:0;;;;;;:20;:24;;;;;;;;39722:25;39666:81;39662:283;;;39782:20;;39772:6;:30;;39764:74;;;;-1:-1:-1;;;39764:74:0;;29328:2:1;39764:74:0;;;29310:21:1;29367:2;29347:18;;;29340:30;29406:33;29386:18;;;29379:61;29457:18;;39764:74:0;29126:355:1;39764:74:0;39887:15;;-1:-1:-1;;;;;39861:13:0;;;;;;:9;:13;;;;;;:22;;39877:6;;39861:22;:::i;:::-;:41;;39853:80;;;;-1:-1:-1;;;39853:80:0;;29688:2:1;39853:80:0;;;29670:21:1;29727:2;29707:18;;;29700:30;29766:28;29746:18;;;29739:56;29812:18;;39853:80:0;29486:350:1;39853:80:0;-1:-1:-1;;;;;40002:15:0;;;;;;:9;:15;;;;;:25;;40021:6;;40002:15;:25;;40021:6;;40002:25;:::i;:::-;;;;-1:-1:-1;;;;;;;40038:13:0;;;;;;:9;:13;;;;;:23;;40055:6;;40038:13;:23;;40055:6;;40038:23;:::i;:::-;;;;;;;;40102:2;-1:-1:-1;;;;;40087:26:0;40096:4;-1:-1:-1;;;;;40087:26:0;;40106:6;40087:26;;;;1363:25:1;;1351:2;1336:18;;1217:177;19266:120:0;18275:16;:14;:16::i;:::-;19325:7:::1;:15:::0;;-1:-1:-1;;19325:15:0::1;::::0;;19356:22:::1;4249:10:::0;19365:12:::1;19356:22;::::0;-1:-1:-1;;;;;4541:32:1;;;4523:51;;4511:2;4496:18;19356:22:0::1;;;;;;;19266:120::o:0;41029:706::-;32424:12;;41094:7;;41103:6;;32424:12;;32420:81;;;32453:8;;:36;;-1:-1:-1;;;32453:36:0;;-1:-1:-1;;;;;25727:32:1;;;32453:36:0;;;25709:51:1;25776:18;;;25769:34;;;32453:8:0;;;;:19;;25682:18:1;;32453:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32420:81;-1:-1:-1;;;;;41130:21:0;::::1;41122:64;;;::::0;-1:-1:-1;;;41122:64:0;;30043:2:1;41122:64:0::1;::::0;::::1;30025:21:1::0;30082:2;30062:18;;;30055:30;30121:32;30101:18;;;30094:60;30171:18;;41122:64:0::1;29841:354:1::0;41122:64:0::1;-1:-1:-1::0;;;;;41205:18:0;::::1;;::::0;;;:9:::1;:18;::::0;;;;;:28;-1:-1:-1;41205:28:0::1;41197:69;;;::::0;-1:-1:-1;;;41197:69:0;;30402:2:1;41197:69:0::1;::::0;::::1;30384:21:1::0;30441:2;30421:18;;;30414:30;30480;30460:18;;;30453:58;30528:18;;41197:69:0::1;30200:352:1::0;41197:69:0::1;41294:1;41285:6;:10;41277:54;;;::::0;-1:-1:-1;;;41277:54:0;;30759:2:1;41277:54:0::1;::::0;::::1;30741:21:1::0;30798:2;30778:18;;;30771:30;30837:33;30817:18;;;30810:61;30888:18;;41277:54:0::1;30557:355:1::0;41277:54:0::1;41368:6;41350:14;;:24;;41342:64;;;::::0;-1:-1:-1;;;41342:64:0;;31119:2:1;41342:64:0::1;::::0;::::1;31101:21:1::0;31158:2;31138:18;;;31131:30;31197:29;31177:18;;;31170:57;31244:18;;41342:64:0::1;30917:351:1::0;41342:64:0::1;-1:-1:-1::0;;;;;41427:18:0;::::1;;::::0;;;:9:::1;:18;::::0;;;;:28;;41449:6;;41427:18;:28:::1;::::0;41449:6;;41427:28:::1;:::i;:::-;;;;;;;;41484:6;41466:14;;:24;;;;;;;:::i;:::-;;;;;;;;41516:6;41501:11;;:21;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;41533:24:0;::::1;;::::0;;;:15:::1;:24;::::0;;;;:34;;41561:6;;41533:24;:34:::1;::::0;41561:6;;41533:34:::1;:::i;:::-;::::0;;;-1:-1:-1;;41593:37:0::1;::::0;1363:25:1;;;41619:1:0::1;::::0;-1:-1:-1;;;;;41593:37:0;::::1;::::0;::::1;::::0;1351:2:1;1336:18;41593:37:0::1;;;;;;;41651:7;-1:-1:-1::0;;;;;41646:21:0::1;;41660:6;41646:21;;;;1363:25:1::0;;1351:2;1336:18;;1217:177;41646:21:0::1;;;;;;;;41683:44;41699:14;;41715:11;;41683:44;;;;;;21009:25:1::0;;;21065:2;21050:18;;21043:34;20997:2;20982:18;;20835:248;41683:44:0::1;;;;;;;;32527:12:::0;;;;32523:80;;;32556:8;;:35;;-1:-1:-1;;;32556:35:0;;-1:-1:-1;;;;;25727:32:1;;;32556:35:0;;;25709:51:1;25776:18;;;25769:34;;;32556:8:0;;;;:18;;25682::1;;32556:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41029:706;;;;:::o;19007:118::-;18016:19;:17;:19::i;:::-;19067:7:::1;:14:::0;;-1:-1:-1;;19067:14:0::1;19077:4;19067:14;::::0;;19097:20:::1;19104:12;4249:10:::0;;4169:98;15923:293;15325:1;16057:7;;:19;16049:63;;;;-1:-1:-1;;;16049:63:0;;31475:2:1;16049:63:0;;;31457:21:1;31514:2;31494:18;;;31487:30;31553:33;31533:18;;;31526:61;31604:18;;16049:63:0;31273:355:1;16049:63:0;15325:1;16190:7;:18;15923:293::o;9760:201::-;9849:22;9857:4;9863:7;9849;:22::i;:::-;9844:110;;9895:47;;-1:-1:-1;;;9895:47:0;;-1:-1:-1;;;;;25727:32:1;;9895:47:0;;;25709:51:1;25776:18;;;25769:34;;;25682:18;;9895:47:0;25535:274:1;9844:110:0;9760:201;;:::o;18755:108::-;18482:7;;;;18814:41;;;;-1:-1:-1;;;18814:41:0;;32114:2:1;18814:41:0;;;32096:21:1;32153:2;32133:18;;;32126:30;-1:-1:-1;;;32172:18:1;;;32165:50;32232:18;;18814:41:0;31912:344:1;734:286;792:6;845:2;833:9;824:7;820:23;816:32;813:52;;;861:1;858;851:12;813:52;887:23;;-1:-1:-1;;;;;;939:32:1;;929:43;;919:71;;986:1;983;976:12;919:71;1009:5;734:286;-1:-1:-1;;;734:286:1:o;1399:423::-;1441:3;1479:5;1473:12;1506:6;1501:3;1494:19;1531:1;1541:162;1555:6;1552:1;1549:13;1541:162;;;1617:4;1673:13;;;1669:22;;1663:29;1645:11;;;1641:20;;1634:59;1570:12;1541:162;;;1545:3;1748:1;1741:4;1732:6;1727:3;1723:16;1719:27;1712:38;1811:4;1804:2;1800:7;1795:2;1787:6;1783:15;1779:29;1774:3;1770:39;1766:50;1759:57;;;1399:423;;;;:::o;1827:220::-;1976:2;1965:9;1958:21;1939:4;1996:45;2037:2;2026:9;2022:18;2014:6;1996:45;:::i;2052:173::-;2120:20;;-1:-1:-1;;;;;2169:31:1;;2159:42;;2149:70;;2215:1;2212;2205:12;2149:70;2052:173;;;:::o;2230:186::-;2289:6;2342:2;2330:9;2321:7;2317:23;2313:32;2310:52;;;2358:1;2355;2348:12;2310:52;2381:29;2400:9;2381:29;:::i;2421:254::-;2489:6;2497;2550:2;2538:9;2529:7;2525:23;2521:32;2518:52;;;2566:1;2563;2556:12;2518:52;2589:29;2608:9;2589:29;:::i;:::-;2579:39;2665:2;2650:18;;;;2637:32;;-1:-1:-1;;;2421:254:1:o;2680:517::-;2935:6;2924:9;2917:25;2978:6;2973:2;2962:9;2958:18;2951:34;3021:6;3016:2;3005:9;3001:18;2994:34;3078:6;3071:14;3064:22;3059:2;3048:9;3044:18;3037:50;3124:3;3118;3107:9;3103:19;3096:32;2898:4;3145:46;3186:3;3175:9;3171:19;3163:6;3145:46;:::i;:::-;3137:54;2680:517;-1:-1:-1;;;;;;;2680:517:1:o;3384:328::-;3461:6;3469;3477;3530:2;3518:9;3509:7;3505:23;3501:32;3498:52;;;3546:1;3543;3536:12;3498:52;3569:29;3588:9;3569:29;:::i;:::-;3559:39;;3617:38;3651:2;3640:9;3636:18;3617:38;:::i;:::-;3607:48;;3702:2;3691:9;3687:18;3674:32;3664:42;;3384:328;;;;;:::o;3717:180::-;3776:6;3829:2;3817:9;3808:7;3804:23;3800:32;3797:52;;;3845:1;3842;3835:12;3797:52;-1:-1:-1;3868:23:1;;3717:180;-1:-1:-1;3717:180:1:o;3902:254::-;3970:6;3978;4031:2;4019:9;4010:7;4006:23;4002:32;3999:52;;;4047:1;4044;4037:12;3999:52;4083:9;4070:23;4060:33;;4112:38;4146:2;4135:9;4131:18;4112:38;:::i;:::-;4102:48;;3902:254;;;;;:::o;5780:615::-;5866:6;5874;5927:2;5915:9;5906:7;5902:23;5898:32;5895:52;;;5943:1;5940;5933:12;5895:52;5983:9;5970:23;6012:18;6053:2;6045:6;6042:14;6039:34;;;6069:1;6066;6059:12;6039:34;6107:6;6096:9;6092:22;6082:32;;6152:7;6145:4;6141:2;6137:13;6133:27;6123:55;;6174:1;6171;6164:12;6123:55;6214:2;6201:16;6240:2;6232:6;6229:14;6226:34;;;6256:1;6253;6246:12;6226:34;6309:7;6304:2;6294:6;6291:1;6287:14;6283:2;6279:23;6275:32;6272:45;6269:65;;;6330:1;6327;6320:12;6269:65;6361:2;6353:11;;;;;6383:6;;-1:-1:-1;5780:615:1;;-1:-1:-1;;;;5780:615:1:o;6400:248::-;6468:6;6476;6529:2;6517:9;6508:7;6504:23;6500:32;6497:52;;;6545:1;6542;6535:12;6497:52;-1:-1:-1;;6568:23:1;;;6638:2;6623:18;;;6610:32;;-1:-1:-1;6400:248:1:o;6653:127::-;6714:10;6709:3;6705:20;6702:1;6695:31;6745:4;6742:1;6735:15;6769:4;6766:1;6759:15;6785:921;6853:6;6906:2;6894:9;6885:7;6881:23;6877:32;6874:52;;;6922:1;6919;6912:12;6874:52;6962:9;6949:23;6991:18;7032:2;7024:6;7021:14;7018:34;;;7048:1;7045;7038:12;7018:34;7086:6;7075:9;7071:22;7061:32;;7131:7;7124:4;7120:2;7116:13;7112:27;7102:55;;7153:1;7150;7143:12;7102:55;7189:2;7176:16;7211:2;7207;7204:10;7201:36;;;7217:18;;:::i;:::-;7292:2;7286:9;7260:2;7346:13;;-1:-1:-1;;7342:22:1;;;7366:2;7338:31;7334:40;7322:53;;;7390:18;;;7410:22;;;7387:46;7384:72;;;7436:18;;:::i;:::-;7476:10;7472:2;7465:22;7511:2;7503:6;7496:18;7551:7;7546:2;7541;7537;7533:11;7529:20;7526:33;7523:53;;;7572:1;7569;7562:12;7523:53;7628:2;7623;7619;7615:11;7610:2;7602:6;7598:15;7585:46;7673:1;7651:15;;;7668:2;7647:24;7640:35;;;;-1:-1:-1;7655:6:1;6785:921;-1:-1:-1;;;;;6785:921:1:o;7711:118::-;7797:5;7790:13;7783:21;7776:5;7773:32;7763:60;;7819:1;7816;7809:12;7834:315;7899:6;7907;7960:2;7948:9;7939:7;7935:23;7931:32;7928:52;;;7976:1;7973;7966:12;7928:52;7999:29;8018:9;7999:29;:::i;:::-;7989:39;;8078:2;8067:9;8063:18;8050:32;8091:28;8113:5;8091:28;:::i;:::-;8138:5;8128:15;;;7834:315;;;;;:::o;8154:260::-;8222:6;8230;8283:2;8271:9;8262:7;8258:23;8254:32;8251:52;;;8299:1;8296;8289:12;8251:52;8322:29;8341:9;8322:29;:::i;:::-;8312:39;;8370:38;8404:2;8393:9;8389:18;8370:38;:::i;9425:344::-;9627:2;9609:21;;;9666:2;9646:18;;;9639:30;-1:-1:-1;;;9700:2:1;9685:18;;9678:50;9760:2;9745:18;;9425:344::o;10543:375::-;-1:-1:-1;;;;;10801:15:1;;;10783:34;;10853:15;;;;10848:2;10833:18;;10826:43;10900:2;10885:18;;10878:34;;;;10733:2;10718:18;;10543:375::o;12143:127::-;12204:10;12199:3;12195:20;12192:1;12185:31;12235:4;12232:1;12225:15;12259:4;12256:1;12249:15;12275:128;12342:9;;;12363:11;;;12360:37;;;12377:18;;:::i;13105:125::-;13170:9;;;13191:10;;;13188:36;;;13204:18;;:::i;16894:127::-;16955:10;16950:3;16946:20;16943:1;16936:31;16986:4;16983:1;16976:15;17010:4;17007:1;17000:15;17378:135;17417:3;17438:17;;;17435:43;;17458:18;;:::i;:::-;-1:-1:-1;17505:1:1;17494:13;;17378:135::o;17518:401::-;17720:2;17702:21;;;17759:2;17739:18;;;17732:30;17798:34;17793:2;17778:18;;17771:62;-1:-1:-1;;;17864:2:1;17849:18;;17842:35;17909:3;17894:19;;17518:401::o;19898:217::-;19938:1;19964;19954:132;;20008:10;20003:3;19999:20;19996:1;19989:31;20043:4;20040:1;20033:15;20071:4;20068:1;20061:15;19954:132;-1:-1:-1;20100:9:1;;19898:217::o;22894:168::-;22967:9;;;22998;;23015:15;;;23009:22;;22995:37;22985:71;;23036:18;;:::i;24943:184::-;25013:6;25066:2;25054:9;25045:7;25041:23;25037:32;25034:52;;;25082:1;25079;25072:12;25034:52;-1:-1:-1;25105:16:1;;24943:184;-1:-1:-1;24943:184:1:o;25814:245::-;25881:6;25934:2;25922:9;25913:7;25909:23;25905:32;25902:52;;;25950:1;25947;25940:12;25902:52;25982:9;25976:16;26001:28;26023:5;26001:28;:::i

Swarm Source

ipfs://4d0ccfb85d18e30f0a56afc023ba9e1108d1b8fbcfc59331bfef47e070f1b701

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

OVERVIEW

CHOOCH is a Base-powered meme token built for the culture a community-led experiment focused on fun, fairness, and fully decentralized ownership. With transparent tokenomics and renounced controls, CHOOCH keeps the community in charge of the sesh.

Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
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.