Overview
APE Balance
27.365000000000000031 APE
APE Value
$29.86 (@ $1.09/APE)More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 84 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Buy Shares | 8370016 | 4 hrs ago | IN | 5 APE | 0.0012287 | ||||
Claim Winnings | 8321490 | 26 hrs ago | IN | 0 APE | 0.00195774 | ||||
Claim Winnings | 7772952 | 9 days ago | IN | 0 APE | 0.00189706 | ||||
Claim Winnings | 7772933 | 9 days ago | IN | 0 APE | 0.00195744 | ||||
Claim Winnings | 7553125 | 13 days ago | IN | 0 APE | 0.00195744 | ||||
Claim Winnings | 7553085 | 13 days ago | IN | 0 APE | 0.00195774 | ||||
Claim Winnings | 7553072 | 13 days ago | IN | 0 APE | 0.00189706 | ||||
Resolve Market | 7542753 | 14 days ago | IN | 0 APE | 0.00270542 | ||||
Resolve Market | 7542704 | 14 days ago | IN | 0 APE | 0.00264563 | ||||
Resolve Market | 7542631 | 14 days ago | IN | 0 APE | 0.0025233 | ||||
Resolve Market | 7542579 | 14 days ago | IN | 0 APE | 0.0025834 | ||||
Resolve Market | 7542518 | 14 days ago | IN | 0 APE | 0.00276582 | ||||
Resolve Market | 7542491 | 14 days ago | IN | 0 APE | 0.00264563 | ||||
Buy Shares | 7323340 | 19 days ago | IN | 1 APE | 0.00209809 | ||||
Buy Shares | 7291895 | 20 days ago | IN | 2 APE | 0.00209779 | ||||
Create Market | 7291145 | 20 days ago | IN | 0 APE | 0.00560335 | ||||
Buy Shares | 7283719 | 21 days ago | IN | 5 APE | 0.00166309 | ||||
Buy Shares | 7279123 | 21 days ago | IN | 1 APE | 0.00209809 | ||||
Buy Shares | 7279120 | 21 days ago | IN | 1 APE | 0.00209779 | ||||
Create Market | 7261519 | 21 days ago | IN | 0 APE | 0.00560241 | ||||
Buy Shares | 7253271 | 22 days ago | IN | 5 APE | 0.00122837 | ||||
Buy Shares | 7253234 | 22 days ago | IN | 5 APE | 0.00166309 | ||||
Buy Shares | 7253206 | 22 days ago | IN | 1 APE | 0.00166309 | ||||
Buy Shares | 7252951 | 22 days ago | IN | 5 APE | 0.00122868 | ||||
Buy Shares | 7252945 | 22 days ago | IN | 4 APE | 0.00122837 |
Latest 14 internal transactions
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
8321490 | 26 hrs ago | 7.01999999 APE | ||||
7772952 | 9 days ago | 6.92999999 APE | ||||
7772933 | 9 days ago | 16.19999999 APE | ||||
7553125 | 13 days ago | 1.61999999 APE | ||||
7553085 | 13 days ago | 5.84999999 APE | ||||
7553072 | 13 days ago | 5.77499999 APE | ||||
7252901 | 22 days ago | 6.92999999 APE | ||||
7252701 | 22 days ago | 1.31999999 APE | ||||
7252699 | 22 days ago | 1.98 APE | ||||
6809586 | 31 days ago | 10.72499999 APE | ||||
6790206 | 32 days ago | 2.63999999 APE | ||||
6790181 | 32 days ago | 1.07249999 APE | ||||
6775536 | 32 days ago | 1.07249999 APE | ||||
6760971 | 32 days ago | 10 APE |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
PrimapePrediction
Compiler Version
v0.8.26+commit.8a97fa7a
Contract Source Code (Solidity)
/** *Submitted for verification at apescan.io on 2024-12-15 */ // File: @thirdweb-dev/contracts/extension/interface/IOwnable.sol pragma solidity ^0.8.0; /// @author thirdweb /** * Thirdweb's `Ownable` is a contract extension to be used with any base contract. It exposes functions for setting and reading * who the 'owner' of the inheriting smart contract is, and lets the inheriting contract perform conditional logic that uses * information about who the contract's owner is. */ interface IOwnable { /// @dev Returns the owner of the contract. function owner() external view returns (address); /// @dev Lets a module admin set a new owner for the contract. The new owner must be a module admin. function setOwner(address _newOwner) external; /// @dev Emitted when a new Owner is set. event OwnerUpdated(address indexed prevOwner, address indexed newOwner); } // File: @thirdweb-dev/contracts/extension/Ownable.sol pragma solidity ^0.8.0; /// @author thirdweb /** * @title Ownable * @notice Thirdweb's `Ownable` is a contract extension to be used with any base contract. It exposes functions for setting and reading * who the 'owner' of the inheriting smart contract is, and lets the inheriting contract perform conditional logic that uses * information about who the contract's owner is. */ abstract contract Ownable is IOwnable { /// @dev The sender is not authorized to perform the action error OwnableUnauthorized(); /// @dev Owner of the contract (purpose: OpenSea compatibility) address private _owner; /// @dev Reverts if caller is not the owner. modifier onlyOwner() { if (msg.sender != _owner) { revert OwnableUnauthorized(); } _; } /** * @notice Returns the owner of the contract. */ function owner() public view override returns (address) { return _owner; } /** * @notice Lets an authorized wallet set a new owner for the contract. * @param _newOwner The address to set as the new owner of the contract. */ function setOwner(address _newOwner) external override { if (!_canSetOwner()) { revert OwnableUnauthorized(); } _setupOwner(_newOwner); } /// @dev Lets a contract admin set a new owner for the contract. The new owner must be a contract admin. function _setupOwner(address _newOwner) internal { address _prevOwner = _owner; _owner = _newOwner; emit OwnerUpdated(_prevOwner, _newOwner); } /// @dev Returns whether owner can be set in the given execution context. function _canSetOwner() internal view virtual returns (bool); } // File: @thirdweb-dev/contracts/extension/interface/IPermissions.sol pragma solidity ^0.8.0; /// @author thirdweb /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IPermissions { /** * @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 signaling this. * * _Available since v3.1._ */ 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, an admin role * bearer except when using {AccessControl-_setupRole}. */ 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 `account`. */ function renounceRole(bytes32 role, address account) external; } // File: @thirdweb-dev/contracts/lib/Strings.sol pragma solidity ^0.8.0; /// @author thirdweb /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /// @dev Returns the hexadecimal representation of `value`. /// The output is prefixed with "0x", encoded using 2 hexadecimal digits per byte, /// and the alphabets are capitalized conditionally according to /// https://eips.ethereum.org/EIPS/eip-55 function toHexStringChecksummed(address value) internal pure returns (string memory str) { str = toHexString(value); /// @solidity memory-safe-assembly assembly { let mask := shl(6, div(not(0), 255)) // `0b010000000100000000 ...` let o := add(str, 0x22) let hashed := and(keccak256(o, 40), mul(34, mask)) // `0b10001000 ... ` let t := shl(240, 136) // `0b10001000 << 240` for { let i := 0 } 1 { } { mstore(add(i, i), mul(t, byte(i, hashed))) i := add(i, 1) if eq(i, 20) { break } } mstore(o, xor(mload(o), shr(1, and(mload(0x00), and(mload(o), mask))))) o := add(o, 0x20) mstore(o, xor(mload(o), shr(1, and(mload(0x20), and(mload(o), mask))))) } } /// @dev Returns the hexadecimal representation of `value`. /// The output is prefixed with "0x" and encoded using 2 hexadecimal digits per byte. function toHexString(address value) internal pure returns (string memory str) { str = toHexStringNoPrefix(value); /// @solidity memory-safe-assembly assembly { let strLength := add(mload(str), 2) // Compute the length. mstore(str, 0x3078) // Write the "0x" prefix. str := sub(str, 2) // Move the pointer. mstore(str, strLength) // Write the length. } } /// @dev Returns the hexadecimal representation of `value`. /// The output is encoded using 2 hexadecimal digits per byte. function toHexStringNoPrefix(address value) internal pure returns (string memory str) { /// @solidity memory-safe-assembly assembly { str := mload(0x40) // Allocate the memory. // We need 0x20 bytes for the trailing zeros padding, 0x20 bytes for the length, // 0x02 bytes for the prefix, and 0x28 bytes for the digits. // The next multiple of 0x20 above (0x20 + 0x20 + 0x02 + 0x28) is 0x80. mstore(0x40, add(str, 0x80)) // Store "0123456789abcdef" in scratch space. mstore(0x0f, 0x30313233343536373839616263646566) str := add(str, 2) mstore(str, 40) let o := add(str, 0x20) mstore(add(o, 40), 0) value := shl(96, value) // We write the string from rightmost digit to leftmost digit. // The following is essentially a do-while loop that also handles the zero case. for { let i := 0 } 1 { } { let p := add(o, add(i, i)) let temp := byte(i, value) mstore8(add(p, 1), mload(and(temp, 15))) mstore8(p, mload(shr(4, temp))) i := add(i, 1) if eq(i, 20) { break } } } } /// @dev Returns the hex encoded string from the raw bytes. /// The output is encoded using 2 hexadecimal digits per byte. function toHexString(bytes memory raw) internal pure returns (string memory str) { str = toHexStringNoPrefix(raw); /// @solidity memory-safe-assembly assembly { let strLength := add(mload(str), 2) // Compute the length. mstore(str, 0x3078) // Write the "0x" prefix. str := sub(str, 2) // Move the pointer. mstore(str, strLength) // Write the length. } } /// @dev Returns the hex encoded string from the raw bytes. /// The output is encoded using 2 hexadecimal digits per byte. function toHexStringNoPrefix(bytes memory raw) internal pure returns (string memory str) { /// @solidity memory-safe-assembly assembly { let length := mload(raw) str := add(mload(0x40), 2) // Skip 2 bytes for the optional prefix. mstore(str, add(length, length)) // Store the length of the output. // Store "0123456789abcdef" in scratch space. mstore(0x0f, 0x30313233343536373839616263646566) let o := add(str, 0x20) let end := add(raw, length) for { } iszero(eq(raw, end)) { } { raw := add(raw, 1) mstore8(add(o, 1), mload(and(mload(raw), 15))) mstore8(o, mload(and(shr(4, mload(raw)), 15))) o := add(o, 2) } mstore(o, 0) // Zeroize the slot after the string. mstore(0x40, add(o, 0x20)) // Allocate the memory. } } } // File: @thirdweb-dev/contracts/extension/Permissions.sol pragma solidity ^0.8.0; /// @author thirdweb /** * @title Permissions * @dev This contracts provides extending-contracts with role-based access control mechanisms */ contract Permissions is IPermissions { /// @dev The `account` is missing a role. error PermissionsUnauthorizedAccount(address account, bytes32 neededRole); /// @dev The `account` already is a holder of `role` error PermissionsAlreadyGranted(address account, bytes32 role); /// @dev Invalid priviledge to revoke error PermissionsInvalidPermission(address expected, address actual); /// @dev Map from keccak256 hash of a role => a map from address => whether address has role. mapping(bytes32 => mapping(address => bool)) private _hasRole; /// @dev Map from keccak256 hash of a role to role admin. See {getRoleAdmin}. mapping(bytes32 => bytes32) private _getRoleAdmin; /// @dev Default admin role for all roles. Only accounts with this role can grant/revoke other roles. bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /// @dev Modifier that checks if an account has the specified role; reverts otherwise. modifier onlyRole(bytes32 role) { _checkRole(role, msg.sender); _; } /** * @notice Checks whether an account has a particular role. * @dev Returns `true` if `account` has been granted `role`. * * @param role keccak256 hash of the role. e.g. keccak256("TRANSFER_ROLE") * @param account Address of the account for which the role is being checked. */ function hasRole(bytes32 role, address account) public view override returns (bool) { return _hasRole[role][account]; } /** * @notice Checks whether an account has a particular role; * role restrictions can be swtiched on and off. * * @dev Returns `true` if `account` has been granted `role`. * Role restrictions can be swtiched on and off: * - If address(0) has ROLE, then the ROLE restrictions * don't apply. * - If address(0) does not have ROLE, then the ROLE * restrictions will apply. * * @param role keccak256 hash of the role. e.g. keccak256("TRANSFER_ROLE") * @param account Address of the account for which the role is being checked. */ function hasRoleWithSwitch(bytes32 role, address account) public view returns (bool) { if (!_hasRole[role][address(0)]) { return _hasRole[role][account]; } return true; } /** * @notice Returns the admin role that controls the specified role. * @dev See {grantRole} and {revokeRole}. * To change a role's admin, use {_setRoleAdmin}. * * @param role keccak256 hash of the role. e.g. keccak256("TRANSFER_ROLE") */ function getRoleAdmin(bytes32 role) external view override returns (bytes32) { return _getRoleAdmin[role]; } /** * @notice Grants a role to an account, if not previously granted. * @dev Caller must have admin role for the `role`. * Emits {RoleGranted Event}. * * @param role keccak256 hash of the role. e.g. keccak256("TRANSFER_ROLE") * @param account Address of the account to which the role is being granted. */ function grantRole(bytes32 role, address account) public virtual override { _checkRole(_getRoleAdmin[role], msg.sender); if (_hasRole[role][account]) { revert PermissionsAlreadyGranted(account, role); } _setupRole(role, account); } /** * @notice Revokes role from an account. * @dev Caller must have admin role for the `role`. * Emits {RoleRevoked Event}. * * @param role keccak256 hash of the role. e.g. keccak256("TRANSFER_ROLE") * @param account Address of the account from which the role is being revoked. */ function revokeRole(bytes32 role, address account) public virtual override { _checkRole(_getRoleAdmin[role], msg.sender); _revokeRole(role, account); } /** * @notice Revokes role from the account. * @dev Caller must have the `role`, with caller being the same as `account`. * Emits {RoleRevoked Event}. * * @param role keccak256 hash of the role. e.g. keccak256("TRANSFER_ROLE") * @param account Address of the account from which the role is being revoked. */ function renounceRole(bytes32 role, address account) public virtual override { if (msg.sender != account) { revert PermissionsInvalidPermission(msg.sender, account); } _revokeRole(role, account); } /// @dev Sets `adminRole` as `role`'s admin role. function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = _getRoleAdmin[role]; _getRoleAdmin[role] = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /// @dev Sets up `role` for `account` function _setupRole(bytes32 role, address account) internal virtual { _hasRole[role][account] = true; emit RoleGranted(role, account, msg.sender); } /// @dev Revokes `role` from `account` function _revokeRole(bytes32 role, address account) internal virtual { _checkRole(role, account); delete _hasRole[role][account]; emit RoleRevoked(role, account, msg.sender); } /// @dev Checks `role` for `account`. Reverts with a message including the required role. function _checkRole(bytes32 role, address account) internal view virtual { if (!_hasRole[role][account]) { revert PermissionsUnauthorizedAccount(account, role); } } /// @dev Checks `role` for `account`. Reverts with a message including the required role. function _checkRoleWithSwitch(bytes32 role, address account) internal view virtual { if (!hasRoleWithSwitch(role, account)) { revert PermissionsUnauthorizedAccount(account, role); } } } // File: @thirdweb-dev/contracts/extension/interface/IContractMetadata.sol pragma solidity ^0.8.0; /// @author thirdweb /** * Thirdweb's `ContractMetadata` is a contract extension for any base contracts. It lets you set a metadata URI * for you contract. * * Additionally, `ContractMetadata` is necessary for NFT contracts that want royalties to get distributed on OpenSea. */ interface IContractMetadata { /// @dev Returns the metadata URI of the contract. function contractURI() external view returns (string memory); /** * @dev Sets contract URI for the storefront-level metadata of the contract. * Only module admin can call this function. */ function setContractURI(string calldata _uri) external; /// @dev Emitted when the contract URI is updated. event ContractURIUpdated(string prevURI, string newURI); } // File: @thirdweb-dev/contracts/extension/ContractMetadata.sol pragma solidity ^0.8.0; /// @author thirdweb /** * @title Contract Metadata * @notice Thirdweb's `ContractMetadata` is a contract extension for any base contracts. It lets you set a metadata URI * for you contract. * Additionally, `ContractMetadata` is necessary for NFT contracts that want royalties to get distributed on OpenSea. */ abstract contract ContractMetadata is IContractMetadata { /// @dev The sender is not authorized to perform the action error ContractMetadataUnauthorized(); /// @notice Returns the contract metadata URI. string public override contractURI; /** * @notice Lets a contract admin set the URI for contract-level metadata. * @dev Caller should be authorized to setup contractURI, e.g. contract admin. * See {_canSetContractURI}. * Emits {ContractURIUpdated Event}. * * @param _uri keccak256 hash of the role. e.g. keccak256("TRANSFER_ROLE") */ function setContractURI(string memory _uri) external override { if (!_canSetContractURI()) { revert ContractMetadataUnauthorized(); } _setupContractURI(_uri); } /// @dev Lets a contract admin set the URI for contract-level metadata. function _setupContractURI(string memory _uri) internal { string memory prevURI = contractURI; contractURI = _uri; emit ContractURIUpdated(prevURI, _uri); } /// @dev Returns whether contract metadata can be set in the given execution context. function _canSetContractURI() internal view virtual returns (bool); } // File: @thirdweb-dev/contracts/extension/interface/IPermissionsEnumerable.sol pragma solidity ^0.8.0; /// @author thirdweb /** * @dev External interface of AccessControlEnumerable declared to support ERC165 detection. */ interface IPermissionsEnumerable is IPermissions { /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * [forum post](https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296) * for more information. */ function getRoleMember(bytes32 role, uint256 index) external view returns (address); /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) external view returns (uint256); } // File: @thirdweb-dev/contracts/extension/PermissionsEnumerable.sol pragma solidity ^0.8.0; /// @author thirdweb /** * @title PermissionsEnumerable * @dev This contracts provides extending-contracts with role-based access control mechanisms. * Also provides interfaces to view all members with a given role, and total count of members. */ contract PermissionsEnumerable is IPermissionsEnumerable, Permissions { /** * @notice A data structure to store data of members for a given role. * * @param index Current index in the list of accounts that have a role. * @param members map from index => address of account that has a role * @param indexOf map from address => index which the account has. */ struct RoleMembers { uint256 index; mapping(uint256 => address) members; mapping(address => uint256) indexOf; } /// @dev map from keccak256 hash of a role to its members' data. See {RoleMembers}. mapping(bytes32 => RoleMembers) private roleMembers; /** * @notice Returns the role-member from a list of members for a role, * at a given index. * @dev Returns `member` who has `role`, at `index` of role-members list. * See struct {RoleMembers}, and mapping {roleMembers} * * @param role keccak256 hash of the role. e.g. keccak256("TRANSFER_ROLE") * @param index Index in list of current members for the role. * * @return member Address of account that has `role` */ function getRoleMember(bytes32 role, uint256 index) external view override returns (address member) { uint256 currentIndex = roleMembers[role].index; uint256 check; for (uint256 i = 0; i < currentIndex; i += 1) { if (roleMembers[role].members[i] != address(0)) { if (check == index) { member = roleMembers[role].members[i]; return member; } check += 1; } else if (hasRole(role, address(0)) && i == roleMembers[role].indexOf[address(0)]) { check += 1; } } } /** * @notice Returns total number of accounts that have a role. * @dev Returns `count` of accounts that have `role`. * See struct {RoleMembers}, and mapping {roleMembers} * * @param role keccak256 hash of the role. e.g. keccak256("TRANSFER_ROLE") * * @return count Total number of accounts that have `role` */ function getRoleMemberCount(bytes32 role) external view override returns (uint256 count) { uint256 currentIndex = roleMembers[role].index; for (uint256 i = 0; i < currentIndex; i += 1) { if (roleMembers[role].members[i] != address(0)) { count += 1; } } if (hasRole(role, address(0))) { count += 1; } } /// @dev Revokes `role` from `account`, and removes `account` from {roleMembers} /// See {_removeMember} function _revokeRole(bytes32 role, address account) internal override { super._revokeRole(role, account); _removeMember(role, account); } /// @dev Grants `role` to `account`, and adds `account` to {roleMembers} /// See {_addMember} function _setupRole(bytes32 role, address account) internal override { super._setupRole(role, account); _addMember(role, account); } /// @dev adds `account` to {roleMembers}, for `role` function _addMember(bytes32 role, address account) internal { uint256 idx = roleMembers[role].index; roleMembers[role].index += 1; roleMembers[role].members[idx] = account; roleMembers[role].indexOf[account] = idx; } /// @dev removes `account` from {roleMembers}, for `role` function _removeMember(bytes32 role, address account) internal { uint256 idx = roleMembers[role].indexOf[account]; delete roleMembers[role].members[idx]; delete roleMembers[role].indexOf[account]; } } // File: @thirdweb-dev/contracts/external-deps/openzeppelin/security/ReentrancyGuard.sol // OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; abstract contract ReentrancyGuard { 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. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: contracts/PrimapePrediction.sol pragma solidity ^0.8.26; /** * @title PrimapePrediction * @dev A multi-outcome, pari-mutuel style prediction market using the chain's native token. * * Features: * - Multiple outcomes per market. * - Early resolution by the owner. * - Adjustable platform fees. * - Role-based access control (owner, market creators). * - A claim deadline after resolution, allowing leftover funds to be swept by the owner. * * How it Works: * Users buy shares for an outcome in a prediction market. After resolution, winners claim their share * of the losing side’s pot. If some winners never claim, after the claim deadline, the owner can sweep * unclaimed funds. */ contract PrimapePrediction is Ownable, ReentrancyGuard, PermissionsEnumerable, ContractMetadata { struct Market { string question; uint256 endTime; bool resolved; uint256 winningOptionIndex; // If unresolved, set to type(uint256).max uint256 claimDeadline; // After this, unclaimed funds can be swept by the owner uint256 totalPool; // Tracks total funds available for claiming at resolution } // Role for market creators bytes32 public constant MARKET_CREATOR_ROLE = keccak256("MARKET_CREATOR_ROLE"); uint256 public marketCount; mapping(uint256 => Market) public markets; // Market data mapping(uint256 => string[]) public marketOptions; mapping(uint256 => mapping(uint256 => uint256)) public totalSharesPerOption; // marketId => optionIndex => total mapping(uint256 => mapping(address => mapping(uint256 => uint256))) public userSharesPerOption; // user balances mapping(uint256 => mapping(address => bool)) public hasClaimed; // Platform fee (in basis points) uint256 public feeBps = 100; // 1% default uint256 public platformBalance; // Grace period (e.g., 30 days) after which owner can sweep unclaimed funds uint256 public constant CLAIM_GRACE_PERIOD = 30 days; /// Events event MarketCreated(uint256 indexed marketId, string question, string[] options, uint256 endTime); event SharesPurchased(uint256 indexed marketId, address indexed buyer, uint256 optionIndex, uint256 amount); event MarketResolved(uint256 indexed marketId, uint256 winningOptionIndex); event Claimed(uint256 indexed marketId, address indexed user, uint256 amount); event FeeUpdated(uint256 newFeeBps); event FeesWithdrawn(uint256 amount, address indexed recipient); event UnclaimedFundsSwept(uint256 indexed marketId, uint256 amount); constructor() { _setupOwner(msg.sender); _setupRole(DEFAULT_ADMIN_ROLE, msg.sender); } /// @dev Ownable override function _canSetOwner() internal view virtual override returns (bool) { return msg.sender == owner(); } /// @dev ContractMetadata override for setting contract URI function _canSetContractURI() internal view virtual override returns (bool) { return msg.sender == owner(); } /** * @notice Create a new market */ function createMarket( string memory _question, string[] memory _options, uint256 _duration ) external returns (uint256) { require(msg.sender == owner() || hasRole(MARKET_CREATOR_ROLE, msg.sender), "Not authorized"); require(_duration > 0, "Duration must be positive"); require(_options.length >= 2, "At least two outcomes"); uint256 marketId = marketCount++; Market storage market = markets[marketId]; market.question = _question; market.endTime = block.timestamp + _duration; market.resolved = false; market.winningOptionIndex = type(uint256).max; for (uint256 i = 0; i < _options.length; i++) { marketOptions[marketId].push(_options[i]); } emit MarketCreated(marketId, _question, _options, market.endTime); return marketId; } /** * @notice Buy shares in a market outcome */ function buyShares(uint256 _marketId, uint256 _optionIndex) external payable { Market storage market = markets[_marketId]; require(block.timestamp < market.endTime, "Market ended"); require(!market.resolved, "Market resolved"); require(_optionIndex < marketOptions[_marketId].length, "Invalid option"); require(msg.value > 0, "No funds"); uint256 feeAmount = (msg.value * feeBps) / 10000; uint256 netAmount = msg.value - feeAmount; platformBalance += feeAmount; userSharesPerOption[_marketId][msg.sender][_optionIndex] += netAmount; totalSharesPerOption[_marketId][_optionIndex] += netAmount; emit SharesPurchased(_marketId, msg.sender, _optionIndex, netAmount); } /** * @notice Resolve a market */ function resolveMarket(uint256 _marketId, uint256 _winningOptionIndex) external { require(msg.sender == owner(), "Only owner"); Market storage market = markets[_marketId]; require(!market.resolved, "Already resolved"); require(_winningOptionIndex < marketOptions[_marketId].length, "Invalid outcome"); market.winningOptionIndex = _winningOptionIndex; market.resolved = true; market.claimDeadline = block.timestamp + CLAIM_GRACE_PERIOD; uint256 optionCount = marketOptions[_marketId].length; uint256 totalPool = 0; for (uint256 i = 0; i < optionCount; i++) { totalPool += totalSharesPerOption[_marketId][i]; } market.totalPool = totalPool; emit MarketResolved(_marketId, _winningOptionIndex); } /** * @notice Claim winnings */ function claimWinnings(uint256 _marketId) external nonReentrant { Market storage market = markets[_marketId]; require(market.resolved, "Not resolved"); require(block.timestamp < market.claimDeadline, "Claim expired"); require(!hasClaimed[_marketId][msg.sender], "Already claimed"); uint256 winningOption = market.winningOptionIndex; uint256 userShares = userSharesPerOption[_marketId][msg.sender][winningOption]; require(userShares > 0, "No winnings"); uint256 winningShares = totalSharesPerOption[_marketId][winningOption]; uint256 losingShares = 0; uint256 optionCount = marketOptions[_marketId].length; for (uint256 i = 0; i < optionCount; i++) { if (i != winningOption) { losingShares += totalSharesPerOption[_marketId][i]; } } uint256 rewardRatio = winningShares > 0 ? (losingShares * 1e18) / winningShares : 0; uint256 winnings = userShares + (userShares * rewardRatio) / 1e18; userSharesPerOption[_marketId][msg.sender][winningOption] = 0; hasClaimed[_marketId][msg.sender] = true; market.totalPool -= winnings; (bool success, ) = payable(msg.sender).call{value: winnings}(""); require(success, "Transfer failed"); emit Claimed(_marketId, msg.sender, winnings); } /** * @notice Batch claim for multiple users */ function batchClaimWinnings(uint256 _marketId, address[] calldata _users) external nonReentrant { Market storage market = markets[_marketId]; require(market.resolved, "Not resolved"); require(block.timestamp < market.claimDeadline, "Claim expired"); uint256 winningOption = market.winningOptionIndex; uint256 winningShares = totalSharesPerOption[_marketId][winningOption]; uint256 losingShares = 0; uint256 optionCount = marketOptions[_marketId].length; for (uint256 i = 0; i < optionCount; i++) { if (i != winningOption) { losingShares += totalSharesPerOption[_marketId][i]; } } uint256 rewardRatio = winningShares > 0 ? (losingShares * 1e18) / winningShares : 0; for (uint256 i = 0; i < _users.length; i++) { address user = _users[i]; if (hasClaimed[_marketId][user]) continue; uint256 userShares = userSharesPerOption[_marketId][user][winningOption]; if (userShares == 0) continue; uint256 winnings = userShares + (userShares * rewardRatio) / 1e18; hasClaimed[_marketId][user] = true; userSharesPerOption[_marketId][user][winningOption] = 0; market.totalPool -= winnings; (bool success, ) = payable(user).call{value: winnings}(""); require(success, "Transfer failed"); emit Claimed(_marketId, user, winnings); } } /** * @notice Sweep unclaimed funds after claim deadline */ function sweepUnclaimedFunds(uint256 _marketId) external nonReentrant { Market storage market = markets[_marketId]; require(market.resolved, "Not resolved"); require(block.timestamp > market.claimDeadline, "Deadline not passed"); uint256 leftover = market.totalPool; market.totalPool = 0; if (leftover > 0) { (bool success, ) = payable(owner()).call{value: leftover}(""); require(success, "Transfer failed"); } emit UnclaimedFundsSwept(_marketId, leftover); } /** * @notice Get market info */ function getMarketInfo(uint256 _marketId) external view returns ( string memory question, uint256 endTime, bool resolved, uint256 winningOptionIndex ) { Market storage market = markets[_marketId]; return (market.question, market.endTime, market.resolved, market.winningOptionIndex); } /** * @notice Get market options */ function getMarketOptions(uint256 _marketId) external view returns (string[] memory) { string[] memory opts = new string[](marketOptions[_marketId].length); for (uint256 i = 0; i < marketOptions[_marketId].length; i++) { opts[i] = marketOptions[_marketId][i]; } return opts; } /** * @notice Get total shares for each option */ function getMarketTotalShares(uint256 _marketId) external view returns (uint256[] memory totals) { uint256 optionCount = marketOptions[_marketId].length; totals = new uint256[](optionCount); for (uint256 i = 0; i < optionCount; i++) { totals[i] = totalSharesPerOption[_marketId][i]; } } /** * @notice Get user shares */ function getUserShares(uint256 _marketId, address _user) external view returns (uint256[] memory balances) { uint256 optionCount = marketOptions[_marketId].length; balances = new uint256[](optionCount); for (uint256 i = 0; i < optionCount; i++) { balances[i] = userSharesPerOption[_marketId][_user][i]; } } /** * @notice Update fee BPS */ function setFeeBps(uint256 _feeBps) external onlyOwner { require(_feeBps <= 1000, "Fee too high"); feeBps = _feeBps; emit FeeUpdated(_feeBps); } /** * @notice Withdraw platform fees */ function withdrawFees(address payable _recipient, uint256 _amount) external onlyOwner nonReentrant { require(_amount <= platformBalance, "Not enough fees"); platformBalance -= _amount; (bool success, ) = _recipient.call{value: _amount}(""); require(success, "Withdraw failed"); emit FeesWithdrawn(_amount, _recipient); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ContractMetadataUnauthorized","type":"error"},{"inputs":[],"name":"OwnableUnauthorized","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"PermissionsAlreadyGranted","type":"error"},{"inputs":[{"internalType":"address","name":"expected","type":"address"},{"internalType":"address","name":"actual","type":"address"}],"name":"PermissionsInvalidPermission","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"PermissionsUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"marketId","type":"uint256"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Claimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"prevURI","type":"string"},{"indexed":false,"internalType":"string","name":"newURI","type":"string"}],"name":"ContractURIUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newFeeBps","type":"uint256"}],"name":"FeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"}],"name":"FeesWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"marketId","type":"uint256"},{"indexed":false,"internalType":"string","name":"question","type":"string"},{"indexed":false,"internalType":"string[]","name":"options","type":"string[]"},{"indexed":false,"internalType":"uint256","name":"endTime","type":"uint256"}],"name":"MarketCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"marketId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"winningOptionIndex","type":"uint256"}],"name":"MarketResolved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"prevOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerUpdated","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":true,"internalType":"uint256","name":"marketId","type":"uint256"},{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"optionIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SharesPurchased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"marketId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"UnclaimedFundsSwept","type":"event"},{"inputs":[],"name":"CLAIM_GRACE_PERIOD","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":"MARKET_CREATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketId","type":"uint256"},{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"batchClaimWinnings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketId","type":"uint256"},{"internalType":"uint256","name":"_optionIndex","type":"uint256"}],"name":"buyShares","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketId","type":"uint256"}],"name":"claimWinnings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_question","type":"string"},{"internalType":"string[]","name":"_options","type":"string[]"},{"internalType":"uint256","name":"_duration","type":"uint256"}],"name":"createMarket","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeBps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketId","type":"uint256"}],"name":"getMarketInfo","outputs":[{"internalType":"string","name":"question","type":"string"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"bool","name":"resolved","type":"bool"},{"internalType":"uint256","name":"winningOptionIndex","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketId","type":"uint256"}],"name":"getMarketOptions","outputs":[{"internalType":"string[]","name":"","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketId","type":"uint256"}],"name":"getMarketTotalShares","outputs":[{"internalType":"uint256[]","name":"totals","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"member","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketId","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"getUserShares","outputs":[{"internalType":"uint256[]","name":"balances","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"hasClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRoleWithSwitch","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"marketOptions","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"markets","outputs":[{"internalType":"string","name":"question","type":"string"},{"internalType":"uint256","name":"endTime","type":"uint256"},{"internalType":"bool","name":"resolved","type":"bool"},{"internalType":"uint256","name":"winningOptionIndex","type":"uint256"},{"internalType":"uint256","name":"claimDeadline","type":"uint256"},{"internalType":"uint256","name":"totalPool","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"platformBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketId","type":"uint256"},{"internalType":"uint256","name":"_winningOptionIndex","type":"uint256"}],"name":"resolveMarket","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":"string","name":"_uri","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_feeBps","type":"uint256"}],"name":"setFeeBps","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_marketId","type":"uint256"}],"name":"sweepUnclaimedFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"totalSharesPerOption","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"userSharesPerOption","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"_recipient","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawFees","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526064600c5534801561001557600080fd5b506001805561002333610033565b61002e600033610083565b61018a565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d769190a35050565b61008d828261009b565b61009782826100f6565b5050565b60008281526002602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b6000828152600460205260408120805491600191906101158385610163565b9091555050600092835260046020908152604080852083865260018101835281862080546001600160a01b039096166001600160a01b03199096168617905593855260029093019052912055565b8082018082111561018457634e487b7160e01b600052601160045260246000fd5b92915050565b612a81806101996000396000f3fe6080604052600436106102045760003560e01c80638da5cb5b11610118578063ad3b1b47116100a0578063ca15c8731161006f578063ca15c8731461068a578063d547741f146106aa578063e8a3d485146106ca578063ec979082146106df578063fbc529cb146106f557600080fd5b8063ad3b1b47146105f1578063ae42820c14610611578063b1283e7714610645578063beebc5da1461067757600080fd5b80639bfc1196116100e75780639bfc11961461053e578063a217fddf1461055e578063a32fa5b314610573578063a9bcea8314610593578063ad2b69bc146105b357600080fd5b80638da5cb5b146104ac5780639010d07c146104de57806391d14854146104fe578063938e3d7b1461051e57600080fd5b80633bdfa9821161019b57806362a5dbbc1161016a57806362a5dbbc146103de578063677bd9ff146103f457806372c27b6214610414578063835dc40b14610434578063873f6f9e1461046157600080fd5b80633bdfa982146103295780633ec791931461035657806356d334041461038657806360557333146103be57600080fd5b806327536b28116101d757806327536b28146102b25780632e2106af146102d25780632f2ff15d146102e957806336568abe1461030957600080fd5b806305d45d5f1461020957806313af40351461023f578063248a9ca31461026157806324a9d8531461029c575b600080fd5b34801561021557600080fd5b5061022961022436600461228a565b610715565b6040516102369190612345565b60405180910390f35b34801561024b57600080fd5b5061025f61025a366004612374565b61086d565b005b34801561026d57600080fd5b5061028e61027c36600461228a565b60009081526003602052604090205490565b604051908152602001610236565b3480156102a857600080fd5b5061028e600c5481565b3480156102be57600080fd5b5061025f6102cd366004612391565b6108a4565b3480156102de57600080fd5b5061028e62278d0081565b3480156102f557600080fd5b5061025f610304366004612410565b610c3b565b34801561031557600080fd5b5061025f610324366004612410565b610cb8565b34801561033557600080fd5b50610349610344366004612440565b610cfc565b6040516102369190612462565b34801561036257600080fd5b5061037661037136600461228a565b610db5565b6040516102369493929190612475565b34801561039257600080fd5b5061028e6103a1366004612440565b600960209081526000928352604080842090915290825290205481565b3480156103ca57600080fd5b5061025f6103d9366004612440565b610e81565b3480156103ea57600080fd5b5061028e600d5481565b34801561040057600080fd5b5061025f61040f36600461228a565b611021565b34801561042057600080fd5b5061025f61042f36600461228a565b61134d565b34801561044057600080fd5b5061045461044f366004612410565b6113f4565b60405161023691906124a4565b34801561046d57600080fd5b5061049c61047c366004612410565b600b60209081526000928352604080842090915290825290205460ff1681565b6040519015158152602001610236565b3480156104b857600080fd5b506000546001600160a01b03165b6040516001600160a01b039091168152602001610236565b3480156104ea57600080fd5b506104c66104f9366004612440565b6114af565b34801561050a57600080fd5b5061049c610519366004612410565b61159e565b34801561052a57600080fd5b5061025f61053936600461259c565b6115c9565b34801561054a57600080fd5b5061025f61055936600461228a565b6115fd565b34801561056a57600080fd5b5061028e600081565b34801561057f57600080fd5b5061049c61058e366004612410565b611769565b34801561059f57600080fd5b506104546105ae36600461228a565b6117bf565b3480156105bf57600080fd5b5061028e6105ce3660046125d8565b600a60209081526000938452604080852082529284528284209052825290205481565b3480156105fd57600080fd5b5061025f61060c366004612610565b611868565b34801561061d57600080fd5b5061028e7fd3065a24ad9e7725d223007135762d2902038999e3e5829146654498a58d979581565b34801561065157600080fd5b5061066561066036600461228a565b6119e3565b6040516102369695949392919061263c565b61025f610685366004612440565b611aa4565b34801561069657600080fd5b5061028e6106a536600461228a565b611cb0565b3480156106b657600080fd5b5061025f6106c5366004612410565b611d39565b3480156106d657600080fd5b50610349611d52565b3480156106eb57600080fd5b5061028e60065481565b34801561070157600080fd5b5061028e610710366004612678565b611d5f565b600081815260086020526040812054606091906001600160401b0381111561073f5761073f6124e7565b60405190808252806020026020018201604052801561077257816020015b606081526020019060019003908161075d5790505b50905060005b6000848152600860205260409020548110156108665760008481526008602052604090208054829081106107ae576107ae61277c565b9060005260206000200180546107c390612792565b80601f01602080910402602001604051908101604052809291908181526020018280546107ef90612792565b801561083c5780601f106108115761010080835404028352916020019161083c565b820191906000526020600020905b81548152906001019060200180831161081f57829003601f168201915b50505050508282815181106108535761085361277c565b6020908102919091010152600101610778565b5092915050565b6000546001600160a01b03163314610898576040516316ccb9cb60e11b815260040160405180910390fd5b6108a181611f74565b50565b6002600154036108cf5760405162461bcd60e51b81526004016108c6906127c6565b60405180910390fd5b6002600181905560008481526007602052604090209081015460ff166109075760405162461bcd60e51b81526004016108c6906127fd565b8060040154421061094a5760405162461bcd60e51b815260206004820152600d60248201526c10db185a5b48195e1c1a5c9959609a1b60448201526064016108c6565b600381015460008581526009602090815260408083208484528252808320548884526008909252822054909190815b818110156109b7578481146109af5760008981526009602090815260408083208484529091529020546109ac9084612839565b92505b600101610979565b5060008084116109c85760006109e5565b836109db84670de0b6b3a764000061284c565b6109e59190612863565b905060005b87811015610c2b576000898983818110610a0657610a0661277c565b9050602002016020810190610a1b9190612374565b60008c8152600b602090815260408083206001600160a01b038516845290915290205490915060ff1615610a4f5750610c23565b60008b8152600a602090815260408083206001600160a01b038516845282528083208a845290915281205490819003610a89575050610c23565b6000670de0b6b3a7640000610a9e868461284c565b610aa89190612863565b610ab29083612839565b90506001600b60008f81526020019081526020016000206000856001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600a60008f81526020019081526020016000206000856001600160a01b03166001600160a01b0316815260200190815260200160002060008b815260200190815260200160002081905550808a6005016000828254610b649190612885565b90915550506040516000906001600160a01b0385169083908381818185875af1925050503d8060008114610bb4576040519150601f19603f3d011682016040523d82523d6000602084013e610bb9565b606091505b5050905080610bda5760405162461bcd60e51b81526004016108c690612898565b836001600160a01b03168e7f4ec90e965519d92681267467f775ada5bd214aa92c0dc93d90a5e880ce9ed02684604051610c1691815260200190565b60405180910390a3505050505b6001016109ea565b5050600180555050505050505050565b600082815260036020526040902054610c549033611fc4565b60008281526002602090815260408083206001600160a01b038516845290915290205460ff1615610caa57604051636a4e0b3560e11b81526001600160a01b0382166004820152602481018390526044016108c6565b610cb48282612019565b5050565b336001600160a01b03821614610cf2576040516320b4e31160e11b81523360048201526001600160a01b03821660248201526044016108c6565b610cb4828261202d565b60086020528160005260406000208181548110610d1857600080fd5b90600052602060002001600091509150508054610d3490612792565b80601f0160208091040260200160405190810160405280929190818152602001828054610d6090612792565b8015610dad5780601f10610d8257610100808354040283529160200191610dad565b820191906000526020600020905b815481529060010190602001808311610d9057829003601f168201915b505050505081565b60008181526007602052604081206001810154600282015460038301548354606095948594859491938493919260ff16918490610df190612792565b80601f0160208091040260200160405190810160405280929190818152602001828054610e1d90612792565b8015610e6a5780601f10610e3f57610100808354040283529160200191610e6a565b820191906000526020600020905b815481529060010190602001808311610e4d57829003601f168201915b505050505093509450945094509450509193509193565b6000546001600160a01b03163314610ec85760405162461bcd60e51b815260206004820152600a60248201526927b7363c9037bbb732b960b11b60448201526064016108c6565b6000828152600760205260409020600281015460ff1615610f1e5760405162461bcd60e51b815260206004820152601060248201526f105b1c9958591e481c995cdbdb1d995960821b60448201526064016108c6565b6000838152600860205260409020548210610f6d5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206f7574636f6d6560881b60448201526064016108c6565b6003810182905560028101805460ff19166001179055610f9062278d0042612839565b600482015560008381526008602052604081205490805b82811015610fdd576000868152600960209081526040808320848452909152902054610fd39083612839565b9150600101610fa7565b506005830181905560405184815285907f6dfc24f0f2fb42e49fb4fa3ffa8abb148cab908a1fb8335b3f128a08b2594af19060200160405180910390a25050505050565b6002600154036110435760405162461bcd60e51b81526004016108c6906127c6565b6002600181905560008281526007602052604090209081015460ff1661107b5760405162461bcd60e51b81526004016108c6906127fd565b806004015442106110be5760405162461bcd60e51b815260206004820152600d60248201526c10db185a5b48195e1c1a5c9959609a1b60448201526064016108c6565b6000828152600b6020908152604080832033845290915290205460ff161561111a5760405162461bcd60e51b815260206004820152600f60248201526e105b1c9958591e4818db185a5b5959608a1b60448201526064016108c6565b60038101546000838152600a6020908152604080832033845282528083208484529091529020548061117c5760405162461bcd60e51b815260206004820152600b60248201526a4e6f2077696e6e696e677360a81b60448201526064016108c6565b60008481526009602090815260408083208584528252808320548784526008909252822054909190815b818110156111e4578581146111dc5760008881526009602090815260408083208484529091529020546111d99084612839565b92505b6001016111a6565b5060008084116111f5576000611212565b8361120884670de0b6b3a764000061284c565b6112129190612863565b90506000670de0b6b3a7640000611229838861284c565b6112339190612863565b61123d9087612839565b60008a8152600a60209081526040808320338085529083528184208c855283528184208490558d8452600b83528184209084529091528120805460ff1916600117905560058a0180549293508392909190611299908490612885565b9091555050604051600090339083908381818185875af1925050503d80600081146112e0576040519150601f19603f3d011682016040523d82523d6000602084013e6112e5565b606091505b50509050806113065760405162461bcd60e51b81526004016108c690612898565b60405182815233908b907f4ec90e965519d92681267467f775ada5bd214aa92c0dc93d90a5e880ce9ed0269060200160405180910390a35050600180555050505050505050565b6000546001600160a01b03163314611378576040516316ccb9cb60e11b815260040160405180910390fd5b6103e88111156113b95760405162461bcd60e51b815260206004820152600c60248201526b08ccaca40e8dede40d0d2ced60a31b60448201526064016108c6565b600c8190556040518181527f8c4d35e54a3f2ef1134138fd8ea3daee6a3c89e10d2665996babdf70261e2c769060200160405180910390a150565b600082815260086020526040902054606090806001600160401b0381111561141e5761141e6124e7565b604051908082528060200260200182016040528015611447578160200160208202803683370190505b50915060005b818110156114a7576000858152600a602090815260408083206001600160a01b0388168452825280832084845290915290205483518490839081106114945761149461277c565b602090810291909101015260010161144d565b505092915050565b60008281526004602052604081205481805b828110156115945760008681526004602090815260408083208484526001019091529020546001600160a01b03161561153d5784820361152b5760008681526004602090815260408083209383526001909301905220546001600160a01b03169250611598915050565b611536600183612839565b9150611582565b61154886600061159e565b801561156f5750600086815260046020908152604080832083805260020190915290205481145b156115825761157f600183612839565b91505b61158d600182612839565b90506114c1565b5050505b92915050565b60009182526002602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6000546001600160a01b031633146115f457604051639f7f092560e01b815260040160405180910390fd5b6108a181612084565b60026001540361161f5760405162461bcd60e51b81526004016108c6906127c6565b6002600181905560008281526007602052604090209081015460ff166116575760405162461bcd60e51b81526004016108c6906127fd565b806004015442116116a05760405162461bcd60e51b8152602060048201526013602482015272111958591b1a5b99481b9bdd081c185cdcd959606a1b60448201526064016108c6565b6005810180546000909155801561172657600080546040516001600160a01b039091169083908381818185875af1925050503d80600081146116fe576040519150601f19603f3d011682016040523d82523d6000602084013e611703565b606091505b50509050806117245760405162461bcd60e51b81526004016108c690612898565b505b827ff4bf90035c7e096a7a037eff84fb48fb9368cad4918e30fa4b0dae33461a93578260405161175891815260200190565b60405180910390a250506001805550565b600082815260026020908152604080832083805290915281205460ff166117b6575060008281526002602090815260408083206001600160a01b038516845290915290205460ff16611598565b50600192915050565b600081815260086020526040902054606090806001600160401b038111156117e9576117e96124e7565b604051908082528060200260200182016040528015611812578160200160208202803683370190505b50915060005b81811015611861576000848152600960209081526040808320848452909152902054835184908390811061184e5761184e61277c565b6020908102919091010152600101611818565b5050919050565b6000546001600160a01b03163314611893576040516316ccb9cb60e11b815260040160405180910390fd5b6002600154036118b55760405162461bcd60e51b81526004016108c6906127c6565b6002600155600d548111156118fe5760405162461bcd60e51b815260206004820152600f60248201526e4e6f7420656e6f756768206665657360881b60448201526064016108c6565b80600d60008282546119109190612885565b90915550506040516000906001600160a01b0384169083908381818185875af1925050503d8060008114611960576040519150601f19603f3d011682016040523d82523d6000602084013e611965565b606091505b50509050806119a85760405162461bcd60e51b815260206004820152600f60248201526e15da5d1a191c985dc819985a5b1959608a1b60448201526064016108c6565b826001600160a01b03167f812bcf6853ebc81dc0a1d2323893eedad6cd086a4398311a699e0a7acdf187b38360405161175891815260200190565b6007602052600090815260409020805481906119fe90612792565b80601f0160208091040260200160405190810160405280929190818152602001828054611a2a90612792565b8015611a775780601f10611a4c57610100808354040283529160200191611a77565b820191906000526020600020905b815481529060010190602001808311611a5a57829003601f168201915b50505060018401546002850154600386015460048701546005909701549596929560ff9092169450925086565b600082815260076020526040902060018101544210611af45760405162461bcd60e51b815260206004820152600c60248201526b13585c9ad95d08195b99195960a21b60448201526064016108c6565b600281015460ff1615611b3b5760405162461bcd60e51b815260206004820152600f60248201526e13585c9ad95d081c995cdbdb1d9959608a1b60448201526064016108c6565b6000838152600860205260409020548210611b895760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b21037b83a34b7b760911b60448201526064016108c6565b60003411611bc45760405162461bcd60e51b81526020600482015260086024820152674e6f2066756e647360c01b60448201526064016108c6565b6000612710600c5434611bd7919061284c565b611be19190612863565b90506000611bef8234612885565b905081600d6000828254611c039190612839565b90915550506000858152600a60209081526040808320338452825280832087845290915281208054839290611c39908490612839565b9091555050600085815260096020908152604080832087845290915281208054839290611c67908490612839565b90915550506040805185815260208101839052339187917fce81571c08c76465bdf390ad1abe80af8c51c6c4566e3485f9395f13d5ad6328910160405180910390a35050505050565b600081815260046020526040812054815b81811015611d145760008481526004602090815260408083208484526001019091529020546001600160a01b031615611d0257611cff600184612839565b92505b611d0d600182612839565b9050611cc1565b50611d2083600061159e565b15611d3357611d30600183612839565b91505b50919050565b600082815260036020526040902054610cf29033611fc4565b60058054610d3490612792565b600080546001600160a01b0316331480611d9e5750611d9e7fd3065a24ad9e7725d223007135762d2902038999e3e5829146654498a58d97953361159e565b611ddb5760405162461bcd60e51b815260206004820152600e60248201526d139bdd08185d5d1a1bdc9a5e995960921b60448201526064016108c6565b60008211611e2b5760405162461bcd60e51b815260206004820152601960248201527f4475726174696f6e206d75737420626520706f7369746976650000000000000060448201526064016108c6565b600283511015611e755760405162461bcd60e51b81526020600482015260156024820152744174206c656173742074776f206f7574636f6d657360581b60448201526064016108c6565b6006805460009182611e86836128c1565b90915550600081815260076020526040902090915080611ea68782612929565b50611eb18442612839565b600182015560028101805460ff19169055600019600382015560005b8551811015611f2a5760008381526008602052604090208651879083908110611ef857611ef861277c565b60209081029190910181015182546001810184556000938452919092200190611f219082612929565b50600101611ecd565b50817fdb6ae5c511cd814e8b6d7dd1f64d32f3bd488e4361486cdcfa2e2debaeddca8787878460010154604051611f63939291906129e7565b60405180910390a250949350505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d769190a35050565b60008281526002602090815260408083206001600160a01b038516845290915290205460ff16610cb45760405163043c588360e11b81526001600160a01b0382166004820152602481018390526044016108c6565b6120238282612160565b610cb482826121bb565b6120378282612228565b60008281526004602090815260408083206001600160a01b03851680855260028201808552838620805487526001909301855292852080546001600160a01b031916905584529152555050565b60006005805461209390612792565b80601f01602080910402602001604051908101604052809291908181526020018280546120bf90612792565b801561210c5780601f106120e15761010080835404028352916020019161210c565b820191906000526020600020905b8154815290600101906020018083116120ef57829003601f168201915b5050505050905081600590816121229190612929565b507fc9c7c3fe08b88b4df9d4d47ef47d2c43d55c025a0ba88ca442580ed9e7348a168183604051612154929190612a1d565b60405180910390a15050565b60008281526002602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b6000828152600460205260408120805491600191906121da8385612839565b9091555050600092835260046020908152604080852083865260018101835281862080546001600160a01b039096166001600160a01b03199096168617905593855260029093019052912055565b6122328282611fc4565b60008281526002602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60006020828403121561229c57600080fd5b5035919050565b6000815180845260005b818110156122c9576020818501810151868301820152016122ad565b506000602082860101526020601f19601f83011685010191505092915050565b600082825180855260208501945060208160051b8301016020850160005b8381101561233957601f198584030188526123238383516122a3565b6020988901989093509190910190600101612307565b50909695505050505050565b60208152600061235860208301846122e9565b9392505050565b6001600160a01b03811681146108a157600080fd5b60006020828403121561238657600080fd5b81356123588161235f565b6000806000604084860312156123a657600080fd5b8335925060208401356001600160401b038111156123c357600080fd5b8401601f810186136123d457600080fd5b80356001600160401b038111156123ea57600080fd5b8660208260051b84010111156123ff57600080fd5b939660209190910195509293505050565b6000806040838503121561242357600080fd5b8235915060208301356124358161235f565b809150509250929050565b6000806040838503121561245357600080fd5b50508035926020909101359150565b60208152600061235860208301846122a3565b60808152600061248860808301876122a3565b6020830195909552509115156040830152606090910152919050565b602080825282518282018190526000918401906040840190835b818110156124dc5783518352602093840193909201916001016124be565b509095945050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715612525576125256124e7565b604052919050565b600082601f83011261253e57600080fd5b81356001600160401b03811115612557576125576124e7565b61256a601f8201601f19166020016124fd565b81815284602083860101111561257f57600080fd5b816020850160208301376000918101602001919091529392505050565b6000602082840312156125ae57600080fd5b81356001600160401b038111156125c457600080fd5b6125d08482850161252d565b949350505050565b6000806000606084860312156125ed57600080fd5b8335925060208401356125ff8161235f565b929592945050506040919091013590565b6000806040838503121561262357600080fd5b823561262e8161235f565b946020939093013593505050565b60c08152600061264f60c08301896122a3565b60208301979097525093151560408501526060840192909252608083015260a090910152919050565b60008060006060848603121561268d57600080fd5b83356001600160401b038111156126a357600080fd5b6126af8682870161252d565b93505060208401356001600160401b038111156126cb57600080fd5b8401601f810186136126dc57600080fd5b80356001600160401b038111156126f5576126f56124e7565b8060051b612705602082016124fd565b9182526020818401810192908101908984111561272157600080fd5b6020850192505b838310156127675782356001600160401b0381111561274657600080fd5b6127558b60208389010161252d565b83525060209283019290910190612728565b96999698505050506040949094013593505050565b634e487b7160e01b600052603260045260246000fd5b600181811c908216806127a657607f821691505b602082108103611d3357634e487b7160e01b600052602260045260246000fd5b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252600c908201526b139bdd081c995cdbdb1d995960a21b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b8082018082111561159857611598612823565b808202811582820484141761159857611598612823565b60008261288057634e487b7160e01b600052601260045260246000fd5b500490565b8181038181111561159857611598612823565b6020808252600f908201526e151c985b9cd9995c8819985a5b1959608a1b604082015260600190565b6000600182016128d3576128d3612823565b5060010190565b601f82111561292457806000526020600020601f840160051c810160208510156129015750805b601f840160051c820191505b81811015612921576000815560010161290d565b50505b505050565b81516001600160401b03811115612942576129426124e7565b612956816129508454612792565b846128da565b6020601f82116001811461298a57600083156129725750848201515b600019600385901b1c1916600184901b178455612921565b600084815260208120601f198516915b828110156129ba578785015182556020948501946001909201910161299a565b50848210156129d85786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b6060815260006129fa60608301866122a3565b8281036020840152612a0c81866122e9565b915050826040830152949350505050565b604081526000612a3060408301856122a3565b8281036020840152612a4281856122a3565b9594505050505056fea264697066735822122062168fffb4b3c93877e968c36b4d650e7ea8d0c1577ff5bfb9a1cac66ddcfa4664736f6c634300081a0033
Deployed Bytecode
0x6080604052600436106102045760003560e01c80638da5cb5b11610118578063ad3b1b47116100a0578063ca15c8731161006f578063ca15c8731461068a578063d547741f146106aa578063e8a3d485146106ca578063ec979082146106df578063fbc529cb146106f557600080fd5b8063ad3b1b47146105f1578063ae42820c14610611578063b1283e7714610645578063beebc5da1461067757600080fd5b80639bfc1196116100e75780639bfc11961461053e578063a217fddf1461055e578063a32fa5b314610573578063a9bcea8314610593578063ad2b69bc146105b357600080fd5b80638da5cb5b146104ac5780639010d07c146104de57806391d14854146104fe578063938e3d7b1461051e57600080fd5b80633bdfa9821161019b57806362a5dbbc1161016a57806362a5dbbc146103de578063677bd9ff146103f457806372c27b6214610414578063835dc40b14610434578063873f6f9e1461046157600080fd5b80633bdfa982146103295780633ec791931461035657806356d334041461038657806360557333146103be57600080fd5b806327536b28116101d757806327536b28146102b25780632e2106af146102d25780632f2ff15d146102e957806336568abe1461030957600080fd5b806305d45d5f1461020957806313af40351461023f578063248a9ca31461026157806324a9d8531461029c575b600080fd5b34801561021557600080fd5b5061022961022436600461228a565b610715565b6040516102369190612345565b60405180910390f35b34801561024b57600080fd5b5061025f61025a366004612374565b61086d565b005b34801561026d57600080fd5b5061028e61027c36600461228a565b60009081526003602052604090205490565b604051908152602001610236565b3480156102a857600080fd5b5061028e600c5481565b3480156102be57600080fd5b5061025f6102cd366004612391565b6108a4565b3480156102de57600080fd5b5061028e62278d0081565b3480156102f557600080fd5b5061025f610304366004612410565b610c3b565b34801561031557600080fd5b5061025f610324366004612410565b610cb8565b34801561033557600080fd5b50610349610344366004612440565b610cfc565b6040516102369190612462565b34801561036257600080fd5b5061037661037136600461228a565b610db5565b6040516102369493929190612475565b34801561039257600080fd5b5061028e6103a1366004612440565b600960209081526000928352604080842090915290825290205481565b3480156103ca57600080fd5b5061025f6103d9366004612440565b610e81565b3480156103ea57600080fd5b5061028e600d5481565b34801561040057600080fd5b5061025f61040f36600461228a565b611021565b34801561042057600080fd5b5061025f61042f36600461228a565b61134d565b34801561044057600080fd5b5061045461044f366004612410565b6113f4565b60405161023691906124a4565b34801561046d57600080fd5b5061049c61047c366004612410565b600b60209081526000928352604080842090915290825290205460ff1681565b6040519015158152602001610236565b3480156104b857600080fd5b506000546001600160a01b03165b6040516001600160a01b039091168152602001610236565b3480156104ea57600080fd5b506104c66104f9366004612440565b6114af565b34801561050a57600080fd5b5061049c610519366004612410565b61159e565b34801561052a57600080fd5b5061025f61053936600461259c565b6115c9565b34801561054a57600080fd5b5061025f61055936600461228a565b6115fd565b34801561056a57600080fd5b5061028e600081565b34801561057f57600080fd5b5061049c61058e366004612410565b611769565b34801561059f57600080fd5b506104546105ae36600461228a565b6117bf565b3480156105bf57600080fd5b5061028e6105ce3660046125d8565b600a60209081526000938452604080852082529284528284209052825290205481565b3480156105fd57600080fd5b5061025f61060c366004612610565b611868565b34801561061d57600080fd5b5061028e7fd3065a24ad9e7725d223007135762d2902038999e3e5829146654498a58d979581565b34801561065157600080fd5b5061066561066036600461228a565b6119e3565b6040516102369695949392919061263c565b61025f610685366004612440565b611aa4565b34801561069657600080fd5b5061028e6106a536600461228a565b611cb0565b3480156106b657600080fd5b5061025f6106c5366004612410565b611d39565b3480156106d657600080fd5b50610349611d52565b3480156106eb57600080fd5b5061028e60065481565b34801561070157600080fd5b5061028e610710366004612678565b611d5f565b600081815260086020526040812054606091906001600160401b0381111561073f5761073f6124e7565b60405190808252806020026020018201604052801561077257816020015b606081526020019060019003908161075d5790505b50905060005b6000848152600860205260409020548110156108665760008481526008602052604090208054829081106107ae576107ae61277c565b9060005260206000200180546107c390612792565b80601f01602080910402602001604051908101604052809291908181526020018280546107ef90612792565b801561083c5780601f106108115761010080835404028352916020019161083c565b820191906000526020600020905b81548152906001019060200180831161081f57829003601f168201915b50505050508282815181106108535761085361277c565b6020908102919091010152600101610778565b5092915050565b6000546001600160a01b03163314610898576040516316ccb9cb60e11b815260040160405180910390fd5b6108a181611f74565b50565b6002600154036108cf5760405162461bcd60e51b81526004016108c6906127c6565b60405180910390fd5b6002600181905560008481526007602052604090209081015460ff166109075760405162461bcd60e51b81526004016108c6906127fd565b8060040154421061094a5760405162461bcd60e51b815260206004820152600d60248201526c10db185a5b48195e1c1a5c9959609a1b60448201526064016108c6565b600381015460008581526009602090815260408083208484528252808320548884526008909252822054909190815b818110156109b7578481146109af5760008981526009602090815260408083208484529091529020546109ac9084612839565b92505b600101610979565b5060008084116109c85760006109e5565b836109db84670de0b6b3a764000061284c565b6109e59190612863565b905060005b87811015610c2b576000898983818110610a0657610a0661277c565b9050602002016020810190610a1b9190612374565b60008c8152600b602090815260408083206001600160a01b038516845290915290205490915060ff1615610a4f5750610c23565b60008b8152600a602090815260408083206001600160a01b038516845282528083208a845290915281205490819003610a89575050610c23565b6000670de0b6b3a7640000610a9e868461284c565b610aa89190612863565b610ab29083612839565b90506001600b60008f81526020019081526020016000206000856001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600a60008f81526020019081526020016000206000856001600160a01b03166001600160a01b0316815260200190815260200160002060008b815260200190815260200160002081905550808a6005016000828254610b649190612885565b90915550506040516000906001600160a01b0385169083908381818185875af1925050503d8060008114610bb4576040519150601f19603f3d011682016040523d82523d6000602084013e610bb9565b606091505b5050905080610bda5760405162461bcd60e51b81526004016108c690612898565b836001600160a01b03168e7f4ec90e965519d92681267467f775ada5bd214aa92c0dc93d90a5e880ce9ed02684604051610c1691815260200190565b60405180910390a3505050505b6001016109ea565b5050600180555050505050505050565b600082815260036020526040902054610c549033611fc4565b60008281526002602090815260408083206001600160a01b038516845290915290205460ff1615610caa57604051636a4e0b3560e11b81526001600160a01b0382166004820152602481018390526044016108c6565b610cb48282612019565b5050565b336001600160a01b03821614610cf2576040516320b4e31160e11b81523360048201526001600160a01b03821660248201526044016108c6565b610cb4828261202d565b60086020528160005260406000208181548110610d1857600080fd5b90600052602060002001600091509150508054610d3490612792565b80601f0160208091040260200160405190810160405280929190818152602001828054610d6090612792565b8015610dad5780601f10610d8257610100808354040283529160200191610dad565b820191906000526020600020905b815481529060010190602001808311610d9057829003601f168201915b505050505081565b60008181526007602052604081206001810154600282015460038301548354606095948594859491938493919260ff16918490610df190612792565b80601f0160208091040260200160405190810160405280929190818152602001828054610e1d90612792565b8015610e6a5780601f10610e3f57610100808354040283529160200191610e6a565b820191906000526020600020905b815481529060010190602001808311610e4d57829003601f168201915b505050505093509450945094509450509193509193565b6000546001600160a01b03163314610ec85760405162461bcd60e51b815260206004820152600a60248201526927b7363c9037bbb732b960b11b60448201526064016108c6565b6000828152600760205260409020600281015460ff1615610f1e5760405162461bcd60e51b815260206004820152601060248201526f105b1c9958591e481c995cdbdb1d995960821b60448201526064016108c6565b6000838152600860205260409020548210610f6d5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206f7574636f6d6560881b60448201526064016108c6565b6003810182905560028101805460ff19166001179055610f9062278d0042612839565b600482015560008381526008602052604081205490805b82811015610fdd576000868152600960209081526040808320848452909152902054610fd39083612839565b9150600101610fa7565b506005830181905560405184815285907f6dfc24f0f2fb42e49fb4fa3ffa8abb148cab908a1fb8335b3f128a08b2594af19060200160405180910390a25050505050565b6002600154036110435760405162461bcd60e51b81526004016108c6906127c6565b6002600181905560008281526007602052604090209081015460ff1661107b5760405162461bcd60e51b81526004016108c6906127fd565b806004015442106110be5760405162461bcd60e51b815260206004820152600d60248201526c10db185a5b48195e1c1a5c9959609a1b60448201526064016108c6565b6000828152600b6020908152604080832033845290915290205460ff161561111a5760405162461bcd60e51b815260206004820152600f60248201526e105b1c9958591e4818db185a5b5959608a1b60448201526064016108c6565b60038101546000838152600a6020908152604080832033845282528083208484529091529020548061117c5760405162461bcd60e51b815260206004820152600b60248201526a4e6f2077696e6e696e677360a81b60448201526064016108c6565b60008481526009602090815260408083208584528252808320548784526008909252822054909190815b818110156111e4578581146111dc5760008881526009602090815260408083208484529091529020546111d99084612839565b92505b6001016111a6565b5060008084116111f5576000611212565b8361120884670de0b6b3a764000061284c565b6112129190612863565b90506000670de0b6b3a7640000611229838861284c565b6112339190612863565b61123d9087612839565b60008a8152600a60209081526040808320338085529083528184208c855283528184208490558d8452600b83528184209084529091528120805460ff1916600117905560058a0180549293508392909190611299908490612885565b9091555050604051600090339083908381818185875af1925050503d80600081146112e0576040519150601f19603f3d011682016040523d82523d6000602084013e6112e5565b606091505b50509050806113065760405162461bcd60e51b81526004016108c690612898565b60405182815233908b907f4ec90e965519d92681267467f775ada5bd214aa92c0dc93d90a5e880ce9ed0269060200160405180910390a35050600180555050505050505050565b6000546001600160a01b03163314611378576040516316ccb9cb60e11b815260040160405180910390fd5b6103e88111156113b95760405162461bcd60e51b815260206004820152600c60248201526b08ccaca40e8dede40d0d2ced60a31b60448201526064016108c6565b600c8190556040518181527f8c4d35e54a3f2ef1134138fd8ea3daee6a3c89e10d2665996babdf70261e2c769060200160405180910390a150565b600082815260086020526040902054606090806001600160401b0381111561141e5761141e6124e7565b604051908082528060200260200182016040528015611447578160200160208202803683370190505b50915060005b818110156114a7576000858152600a602090815260408083206001600160a01b0388168452825280832084845290915290205483518490839081106114945761149461277c565b602090810291909101015260010161144d565b505092915050565b60008281526004602052604081205481805b828110156115945760008681526004602090815260408083208484526001019091529020546001600160a01b03161561153d5784820361152b5760008681526004602090815260408083209383526001909301905220546001600160a01b03169250611598915050565b611536600183612839565b9150611582565b61154886600061159e565b801561156f5750600086815260046020908152604080832083805260020190915290205481145b156115825761157f600183612839565b91505b61158d600182612839565b90506114c1565b5050505b92915050565b60009182526002602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6000546001600160a01b031633146115f457604051639f7f092560e01b815260040160405180910390fd5b6108a181612084565b60026001540361161f5760405162461bcd60e51b81526004016108c6906127c6565b6002600181905560008281526007602052604090209081015460ff166116575760405162461bcd60e51b81526004016108c6906127fd565b806004015442116116a05760405162461bcd60e51b8152602060048201526013602482015272111958591b1a5b99481b9bdd081c185cdcd959606a1b60448201526064016108c6565b6005810180546000909155801561172657600080546040516001600160a01b039091169083908381818185875af1925050503d80600081146116fe576040519150601f19603f3d011682016040523d82523d6000602084013e611703565b606091505b50509050806117245760405162461bcd60e51b81526004016108c690612898565b505b827ff4bf90035c7e096a7a037eff84fb48fb9368cad4918e30fa4b0dae33461a93578260405161175891815260200190565b60405180910390a250506001805550565b600082815260026020908152604080832083805290915281205460ff166117b6575060008281526002602090815260408083206001600160a01b038516845290915290205460ff16611598565b50600192915050565b600081815260086020526040902054606090806001600160401b038111156117e9576117e96124e7565b604051908082528060200260200182016040528015611812578160200160208202803683370190505b50915060005b81811015611861576000848152600960209081526040808320848452909152902054835184908390811061184e5761184e61277c565b6020908102919091010152600101611818565b5050919050565b6000546001600160a01b03163314611893576040516316ccb9cb60e11b815260040160405180910390fd5b6002600154036118b55760405162461bcd60e51b81526004016108c6906127c6565b6002600155600d548111156118fe5760405162461bcd60e51b815260206004820152600f60248201526e4e6f7420656e6f756768206665657360881b60448201526064016108c6565b80600d60008282546119109190612885565b90915550506040516000906001600160a01b0384169083908381818185875af1925050503d8060008114611960576040519150601f19603f3d011682016040523d82523d6000602084013e611965565b606091505b50509050806119a85760405162461bcd60e51b815260206004820152600f60248201526e15da5d1a191c985dc819985a5b1959608a1b60448201526064016108c6565b826001600160a01b03167f812bcf6853ebc81dc0a1d2323893eedad6cd086a4398311a699e0a7acdf187b38360405161175891815260200190565b6007602052600090815260409020805481906119fe90612792565b80601f0160208091040260200160405190810160405280929190818152602001828054611a2a90612792565b8015611a775780601f10611a4c57610100808354040283529160200191611a77565b820191906000526020600020905b815481529060010190602001808311611a5a57829003601f168201915b50505060018401546002850154600386015460048701546005909701549596929560ff9092169450925086565b600082815260076020526040902060018101544210611af45760405162461bcd60e51b815260206004820152600c60248201526b13585c9ad95d08195b99195960a21b60448201526064016108c6565b600281015460ff1615611b3b5760405162461bcd60e51b815260206004820152600f60248201526e13585c9ad95d081c995cdbdb1d9959608a1b60448201526064016108c6565b6000838152600860205260409020548210611b895760405162461bcd60e51b815260206004820152600e60248201526d24b73b30b634b21037b83a34b7b760911b60448201526064016108c6565b60003411611bc45760405162461bcd60e51b81526020600482015260086024820152674e6f2066756e647360c01b60448201526064016108c6565b6000612710600c5434611bd7919061284c565b611be19190612863565b90506000611bef8234612885565b905081600d6000828254611c039190612839565b90915550506000858152600a60209081526040808320338452825280832087845290915281208054839290611c39908490612839565b9091555050600085815260096020908152604080832087845290915281208054839290611c67908490612839565b90915550506040805185815260208101839052339187917fce81571c08c76465bdf390ad1abe80af8c51c6c4566e3485f9395f13d5ad6328910160405180910390a35050505050565b600081815260046020526040812054815b81811015611d145760008481526004602090815260408083208484526001019091529020546001600160a01b031615611d0257611cff600184612839565b92505b611d0d600182612839565b9050611cc1565b50611d2083600061159e565b15611d3357611d30600183612839565b91505b50919050565b600082815260036020526040902054610cf29033611fc4565b60058054610d3490612792565b600080546001600160a01b0316331480611d9e5750611d9e7fd3065a24ad9e7725d223007135762d2902038999e3e5829146654498a58d97953361159e565b611ddb5760405162461bcd60e51b815260206004820152600e60248201526d139bdd08185d5d1a1bdc9a5e995960921b60448201526064016108c6565b60008211611e2b5760405162461bcd60e51b815260206004820152601960248201527f4475726174696f6e206d75737420626520706f7369746976650000000000000060448201526064016108c6565b600283511015611e755760405162461bcd60e51b81526020600482015260156024820152744174206c656173742074776f206f7574636f6d657360581b60448201526064016108c6565b6006805460009182611e86836128c1565b90915550600081815260076020526040902090915080611ea68782612929565b50611eb18442612839565b600182015560028101805460ff19169055600019600382015560005b8551811015611f2a5760008381526008602052604090208651879083908110611ef857611ef861277c565b60209081029190910181015182546001810184556000938452919092200190611f219082612929565b50600101611ecd565b50817fdb6ae5c511cd814e8b6d7dd1f64d32f3bd488e4361486cdcfa2e2debaeddca8787878460010154604051611f63939291906129e7565b60405180910390a250949350505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d769190a35050565b60008281526002602090815260408083206001600160a01b038516845290915290205460ff16610cb45760405163043c588360e11b81526001600160a01b0382166004820152602481018390526044016108c6565b6120238282612160565b610cb482826121bb565b6120378282612228565b60008281526004602090815260408083206001600160a01b03851680855260028201808552838620805487526001909301855292852080546001600160a01b031916905584529152555050565b60006005805461209390612792565b80601f01602080910402602001604051908101604052809291908181526020018280546120bf90612792565b801561210c5780601f106120e15761010080835404028352916020019161210c565b820191906000526020600020905b8154815290600101906020018083116120ef57829003601f168201915b5050505050905081600590816121229190612929565b507fc9c7c3fe08b88b4df9d4d47ef47d2c43d55c025a0ba88ca442580ed9e7348a168183604051612154929190612a1d565b60405180910390a15050565b60008281526002602090815260408083206001600160a01b0385168085529252808320805460ff1916600117905551339285917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d9190a45050565b6000828152600460205260408120805491600191906121da8385612839565b9091555050600092835260046020908152604080852083865260018101835281862080546001600160a01b039096166001600160a01b03199096168617905593855260029093019052912055565b6122328282611fc4565b60008281526002602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60006020828403121561229c57600080fd5b5035919050565b6000815180845260005b818110156122c9576020818501810151868301820152016122ad565b506000602082860101526020601f19601f83011685010191505092915050565b600082825180855260208501945060208160051b8301016020850160005b8381101561233957601f198584030188526123238383516122a3565b6020988901989093509190910190600101612307565b50909695505050505050565b60208152600061235860208301846122e9565b9392505050565b6001600160a01b03811681146108a157600080fd5b60006020828403121561238657600080fd5b81356123588161235f565b6000806000604084860312156123a657600080fd5b8335925060208401356001600160401b038111156123c357600080fd5b8401601f810186136123d457600080fd5b80356001600160401b038111156123ea57600080fd5b8660208260051b84010111156123ff57600080fd5b939660209190910195509293505050565b6000806040838503121561242357600080fd5b8235915060208301356124358161235f565b809150509250929050565b6000806040838503121561245357600080fd5b50508035926020909101359150565b60208152600061235860208301846122a3565b60808152600061248860808301876122a3565b6020830195909552509115156040830152606090910152919050565b602080825282518282018190526000918401906040840190835b818110156124dc5783518352602093840193909201916001016124be565b509095945050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715612525576125256124e7565b604052919050565b600082601f83011261253e57600080fd5b81356001600160401b03811115612557576125576124e7565b61256a601f8201601f19166020016124fd565b81815284602083860101111561257f57600080fd5b816020850160208301376000918101602001919091529392505050565b6000602082840312156125ae57600080fd5b81356001600160401b038111156125c457600080fd5b6125d08482850161252d565b949350505050565b6000806000606084860312156125ed57600080fd5b8335925060208401356125ff8161235f565b929592945050506040919091013590565b6000806040838503121561262357600080fd5b823561262e8161235f565b946020939093013593505050565b60c08152600061264f60c08301896122a3565b60208301979097525093151560408501526060840192909252608083015260a090910152919050565b60008060006060848603121561268d57600080fd5b83356001600160401b038111156126a357600080fd5b6126af8682870161252d565b93505060208401356001600160401b038111156126cb57600080fd5b8401601f810186136126dc57600080fd5b80356001600160401b038111156126f5576126f56124e7565b8060051b612705602082016124fd565b9182526020818401810192908101908984111561272157600080fd5b6020850192505b838310156127675782356001600160401b0381111561274657600080fd5b6127558b60208389010161252d565b83525060209283019290910190612728565b96999698505050506040949094013593505050565b634e487b7160e01b600052603260045260246000fd5b600181811c908216806127a657607f821691505b602082108103611d3357634e487b7160e01b600052602260045260246000fd5b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252600c908201526b139bdd081c995cdbdb1d995960a21b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b8082018082111561159857611598612823565b808202811582820484141761159857611598612823565b60008261288057634e487b7160e01b600052601260045260246000fd5b500490565b8181038181111561159857611598612823565b6020808252600f908201526e151c985b9cd9995c8819985a5b1959608a1b604082015260600190565b6000600182016128d3576128d3612823565b5060010190565b601f82111561292457806000526020600020601f840160051c810160208510156129015750805b601f840160051c820191505b81811015612921576000815560010161290d565b50505b505050565b81516001600160401b03811115612942576129426124e7565b612956816129508454612792565b846128da565b6020601f82116001811461298a57600083156129725750848201515b600019600385901b1c1916600184901b178455612921565b600084815260208120601f198516915b828110156129ba578785015182556020948501946001909201910161299a565b50848210156129d85786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b6060815260006129fa60608301866122a3565b8281036020840152612a0c81866122e9565b915050826040830152949350505050565b604081526000612a3060408301856122a3565b8281036020840152612a4281856122a3565b9594505050505056fea264697066735822122062168fffb4b3c93877e968c36b4d650e7ea8d0c1577ff5bfb9a1cac66ddcfa4664736f6c634300081a0033
Deployed Bytecode Sourcemap
29479:11112:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38753:330;;;;;;;;;;-1:-1:-1;38753:330:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2120:182;;;;;;;;;;-1:-1:-1;2120:182:0;;;;;:::i;:::-;;:::i;:::-;;16092:122;;;;;;;;;;-1:-1:-1;16092:122:0;;;;;:::i;:::-;16160:7;16187:19;;;:13;:19;;;;;;;16092:122;;;;2284:25:1;;;2272:2;2257:18;16092:122:0;2138:177:1;30583:27:0;;;;;;;;;;;;;;;;36104:1529;;;;;;;;;;-1:-1:-1;36104:1529:0;;;;;:::i;:::-;;:::i;30751:52::-;;;;;;;;;;;;30796:7;30751:52;;16619:285;;;;;;;;;;-1:-1:-1;16619:285:0;;;;;:::i;:::-;;:::i;17867:242::-;;;;;;;;;;-1:-1:-1;17867:242:0;;;;;:::i;:::-;;:::i;30181:49::-;;;;;;;;;;-1:-1:-1;30181:49:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;38344:348::-;;;;;;;;;;-1:-1:-1;38344:348:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;30237:75::-;;;;;;;;;;-1:-1:-1;30237:75:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;33730:834;;;;;;;;;;-1:-1:-1;33730:834:0;;;;;:::i;:::-;;:::i;30631:30::-;;;;;;;;;;;;;;;;34621:1410;;;;;;;;;;-1:-1:-1;34621:1410:0;;;;;:::i;:::-;;:::i;39973:176::-;;;;;;;;;;-1:-1:-1;39973:176:0;;;;;:::i;:::-;;:::i;39556:360::-;;;;;;;;;;-1:-1:-1;39556:360:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;30473:62::-;;;;;;;;;;-1:-1:-1;30473:62:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5782:14:1;;5775:22;5757:41;;5745:2;5730:18;30473:62:0;5617:187:1;1850:88:0;;;;;;;;;;-1:-1:-1;1897:7:0;1924:6;-1:-1:-1;;;;;1924:6:0;1850:88;;;-1:-1:-1;;;;;5973:32:1;;;5955:51;;5943:2;5928:18;1850:88:0;5809:203:1;25086:648:0;;;;;;;;;;-1:-1:-1;25086:648:0;;;;;:::i;:::-;;:::i;14643:133::-;;;;;;;;;;-1:-1:-1;14643:133:0;;;;;:::i;:::-;;:::i;21561:207::-;;;;;;;;;;-1:-1:-1;21561:207:0;;;;;:::i;:::-;;:::i;37718:568::-;;;;;;;;;;-1:-1:-1;37718:568:0;;;;;:::i;:::-;;:::i;14046:49::-;;;;;;;;;;-1:-1:-1;14046:49:0;14091:4;14046:49;;15543:217;;;;;;;;;;-1:-1:-1;15543:217:0;;;;;:::i;:::-;;:::i;39158:340::-;;;;;;;;;;-1:-1:-1;39158:340:0;;;;;:::i;:::-;;:::i;30355:94::-;;;;;;;;;;-1:-1:-1;30355:94:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40214:374;;;;;;;;;;-1:-1:-1;40214:374:0;;;;;:::i;:::-;;:::i;29991:78::-;;;;;;;;;;;;30037:32;29991:78;;30111:41;;;;;;;;;;-1:-1:-1;30111:41:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;:::i;32897:774::-;;;;;;:::i;:::-;;:::i;26152:409::-;;;;;;;;;;-1:-1:-1;26152:409:0;;;;;:::i;:::-;;:::i;17285:174::-;;;;;;;;;;-1:-1:-1;17285:174:0;;;;;:::i;:::-;;:::i;21113:34::-;;;;;;;;;;;;;:::i;30078:26::-;;;;;;;;;;;;;;;;31921:903;;;;;;;;;;-1:-1:-1;31921:903:0;;;;;:::i;:::-;;:::i;38753:330::-;38849:20;38885:24;;;:13;:24;;;;;:31;38821:15;;38849:20;-1:-1:-1;;;;;38872:45:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38849:68;;38933:9;38928:126;38952:24;;;;:13;:24;;;;;:31;38948:35;;38928:126;;;39015:24;;;;:13;:24;;;;;:27;;39040:1;;39015:27;;;;;;:::i;:::-;;;;;;;;39005:37;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:4;39010:1;39005:7;;;;;;;;:::i;:::-;;;;;;;;;;:37;38985:3;;38928:126;;;-1:-1:-1;39071:4:0;38753:330;-1:-1:-1;;38753:330:0:o;2120:182::-;31610:4;1924:6;-1:-1:-1;;;;;1924:6:0;31634:10;:21;2186:76;;2229:21;;-1:-1:-1;;;2229:21:0;;;;;;;;;;;2186:76;2272:22;2284:9;2272:11;:22::i;:::-;2120:182;:::o;36104:1529::-;28069:1;28385:7;;:19;28377:63;;;;-1:-1:-1;;;28377:63:0;;;;;;;:::i;:::-;;;;;;;;;28069:1;28518:7;:18;;;36211:21:::1;36235:18:::0;;;:7:::1;:18;::::0;;;;36272:15;;::::1;::::0;::::1;;36264:40;;;;-1:-1:-1::0;;;36264:40:0::1;;;;;;;:::i;:::-;36341:6;:20;;;36323:15;:38;36315:64;;;::::0;-1:-1:-1;;;36315:64:0;;11995:2:1;36315:64:0::1;::::0;::::1;11977:21:1::0;12034:2;12014:18;;;12007:30;-1:-1:-1;;;12053:18:1;;;12046:43;12106:18;;36315:64:0::1;11793:337:1::0;36315:64:0::1;36416:25;::::0;::::1;::::0;36392:21:::1;36476:31:::0;;;:20:::1;:31;::::0;;;;;;;:46;;;;;;;;;36590:24;;;:13:::1;:24:::0;;;;;:31;36476:46;;36392:21;;36632:177:::1;36656:11;36652:1;:15;36632:177;;;36698:13;36693:1;:18;36689:109;;36748:31;::::0;;;:20:::1;:31;::::0;;;;;;;:34;;;;;;;;;36732:50:::1;::::0;;::::1;:::i;:::-;;;36689:109;36669:3;;36632:177;;;;36821:19;36859:1:::0;36843:13:::1;:17;:61;;36903:1;36843:61;;;36887:13:::0;36864:19:::1;:12:::0;36879:4:::1;36864:19;:::i;:::-;36863:37;;;;:::i;:::-;36821:83;;36922:9;36917:709;36937:17:::0;;::::1;36917:709;;;36976:12;36991:6;;36998:1;36991:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;37019:21;::::0;;;:10:::1;:21;::::0;;;;;;;-1:-1:-1;;;;;37019:27:0;::::1;::::0;;;;;;;;36976:24;;-1:-1:-1;37019:27:0::1;;37015:41;;;37048:8;;;37015:41;37073:18;37094:30:::0;;;:19:::1;:30;::::0;;;;;;;-1:-1:-1;;;;;37094:36:0;::::1;::::0;;;;;;;:51;;;;;;;;;;37164:15;;;37160:29:::1;;37181:8;;;;37160:29;37206:16;37267:4;37239:24;37252:11:::0;37239:10;:24:::1;:::i;:::-;37238:33;;;;:::i;:::-;37225:46;::::0;:10;:46:::1;:::i;:::-;37206:65;;37316:4;37286:10;:21;37297:9;37286:21;;;;;;;;;;;:27;37308:4;-1:-1:-1::0;;;;;37286:27:0::1;-1:-1:-1::0;;;;;37286:27:0::1;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;37389:1;37335:19;:30;37355:9;37335:30;;;;;;;;;;;:36;37366:4;-1:-1:-1::0;;;;;37335:36:0::1;-1:-1:-1::0;;;;;37335:36:0::1;;;;;;;;;;;;:51;37372:13;37335:51;;;;;;;;;;;:55;;;;37427:8;37407:6;:16;;;:28;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;37471:39:0::1;::::0;37453:12:::1;::::0;-1:-1:-1;;;;;37471:18:0;::::1;::::0;37497:8;;37453:12;37471:39;37453:12;37471:39;37497:8;37471:18;:39:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37452:58;;;37533:7;37525:35;;;;-1:-1:-1::0;;;37525:35:0::1;;;;;;;:::i;:::-;37599:4;-1:-1:-1::0;;;;;37580:34:0::1;37588:9;37580:34;37605:8;37580:34;;;;2284:25:1::0;;2272:2;2257:18;;2138:177;37580:34:0::1;;;;;;;;36961:665;;;;36917:709;36956:3;;36917:709;;;-1:-1:-1::0;;28025:1:0;28697:22;;-1:-1:-1;;;;;;;;36104:1529:0:o;16619:285::-;16715:19;;;;:13;:19;;;;;;16704:43;;16736:10;16704;:43::i;:::-;16762:14;;;;:8;:14;;;;;;;;-1:-1:-1;;;;;16762:23:0;;;;;;;;;;;;16758:103;;;16809:40;;-1:-1:-1;;;16809:40:0;;-1:-1:-1;;;;;13671:32:1;;16809:40:0;;;13653:51:1;13720:18;;;13713:34;;;13626:18;;16809:40:0;13479:274:1;16758:103:0;16871:25;16882:4;16888:7;16871:10;:25::i;:::-;16619:285;;:::o;17867:242::-;17959:10;-1:-1:-1;;;;;17959:21:0;;;17955:110;;18004:49;;-1:-1:-1;;;18004:49:0;;18033:10;18004:49;;;13932:51:1;-1:-1:-1;;;;;14019:32:1;;13999:18;;;13992:60;13905:18;;18004:49:0;13758:300:1;17955:110:0;18075:26;18087:4;18093:7;18075:11;:26::i;30181:49::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;38344:348::-;38452:15;38571:18;;;:7;:18;;;;;38625:14;;;;38641:15;;;;38658:25;;;;38600:84;;38419:22;;38452:15;;;;;38571:18;;;;38625:14;;38641:15;;;38571:18;;38600:84;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38344:348;;;;;:::o;33730:834::-;1897:7;1924:6;-1:-1:-1;;;;;1924:6:0;33829:10;:21;33821:44;;;;-1:-1:-1;;;33821:44:0;;14265:2:1;33821:44:0;;;14247:21:1;14304:2;14284:18;;;14277:30;-1:-1:-1;;;14323:18:1;;;14316:40;14373:18;;33821:44:0;14063:334:1;33821:44:0;33876:21;33900:18;;;:7;:18;;;;;33938:15;;;;;;33937:16;33929:45;;;;-1:-1:-1;;;33929:45:0;;14604:2:1;33929:45:0;;;14586:21:1;14643:2;14623:18;;;14616:30;-1:-1:-1;;;14662:18:1;;;14655:46;14718:18;;33929:45:0;14402:340:1;33929:45:0;34015:24;;;;:13;:24;;;;;:31;33993:53;;33985:81;;;;-1:-1:-1;;;33985:81:0;;14949:2:1;33985:81:0;;;14931:21:1;14988:2;14968:18;;;14961:30;-1:-1:-1;;;15007:18:1;;;15000:45;15062:18;;33985:81:0;14747:339:1;33985:81:0;34079:25;;;:47;;;34137:15;;;:22;;-1:-1:-1;;34137:22:0;34155:4;34137:22;;;34193:36;30796:7;34193:15;:36;:::i;:::-;34170:20;;;:59;34242:19;34264:24;;;:13;:24;;;;;:31;;34242:19;34338:116;34362:11;34358:1;:15;34338:116;;;34408:31;;;;:20;:31;;;;;;;;:34;;;;;;;;;34395:47;;;;:::i;:::-;;-1:-1:-1;34375:3:0;;34338:116;;;-1:-1:-1;34464:16:0;;;:28;;;34510:46;;2284:25:1;;;34525:9:0;;34510:46;;2272:2:1;2257:18;34510:46:0;;;;;;;33810:754;;;33730:834;;:::o;34621:1410::-;28069:1;28385:7;;:19;28377:63;;;;-1:-1:-1;;;28377:63:0;;;;;;;:::i;:::-;28069:1;28518:7;:18;;;34696:21:::1;34720:18:::0;;;:7:::1;:18;::::0;;;;34757:15;;::::1;::::0;::::1;;34749:40;;;;-1:-1:-1::0;;;34749:40:0::1;;;;;;;:::i;:::-;34826:6;:20;;;34808:15;:38;34800:64;;;::::0;-1:-1:-1;;;34800:64:0;;11995:2:1;34800:64:0::1;::::0;::::1;11977:21:1::0;12034:2;12014:18;;;12007:30;-1:-1:-1;;;12053:18:1;;;12046:43;12106:18;;34800:64:0::1;11793:337:1::0;34800:64:0::1;34884:21;::::0;;;:10:::1;:21;::::0;;;;;;;34906:10:::1;34884:33:::0;;;;;;;;::::1;;34883:34;34875:62;;;::::0;-1:-1:-1;;;34875:62:0;;15293:2:1;34875:62:0::1;::::0;::::1;15275:21:1::0;15332:2;15312:18;;;15305:30;-1:-1:-1;;;15351:18:1;;;15344:45;15406:18;;34875:62:0::1;15091:339:1::0;34875:62:0::1;34974:25;::::0;::::1;::::0;34950:21:::1;35031:30:::0;;;:19:::1;:30;::::0;;;;;;;35062:10:::1;35031:42:::0;;;;;;;:57;;;;;;;;;35107:14;35099:38:::1;;;::::0;-1:-1:-1;;;35099:38:0;;15637:2:1;35099:38:0::1;::::0;::::1;15619:21:1::0;15676:2;15656:18;;;15649:30;-1:-1:-1;;;15695:18:1;;;15688:41;15746:18;;35099:38:0::1;15435:335:1::0;35099:38:0::1;35150:21;35174:31:::0;;;:20:::1;:31;::::0;;;;;;;:46;;;;;;;;;35288:24;;;:13:::1;:24:::0;;;;;:31;35174:46;;35150:21;;35330:177:::1;35354:11;35350:1;:15;35330:177;;;35396:13;35391:1;:18;35387:109;;35446:31;::::0;;;:20:::1;:31;::::0;;;;;;;:34;;;;;;;;;35430:50:::1;::::0;;::::1;:::i;:::-;;;35387:109;35367:3;;35330:177;;;;35519:19;35557:1:::0;35541:13:::1;:17;:61;;35601:1;35541:61;;;35585:13:::0;35562:19:::1;:12:::0;35577:4:::1;35562:19;:::i;:::-;35561:37;;;;:::i;:::-;35519:83:::0;-1:-1:-1;35613:16:0::1;35674:4;35646:24;35519:83:::0;35646:10;:24:::1;:::i;:::-;35645:33;;;;:::i;:::-;35632:46;::::0;:10;:46:::1;:::i;:::-;35751:1;35691:30:::0;;;:19:::1;:30;::::0;;;;;;;35722:10:::1;35691:42:::0;;;;;;;;;:57;;;;;;;;:61;;;35763:21;;;:10:::1;:21:::0;;;;;:33;;;;;;;;:40;;-1:-1:-1;;35763:40:0::1;35799:4;35763:40;::::0;;35814:16:::1;::::0;::::1;:28:::0;;35613:65;;-1:-1:-1;35613:65:0;;35814:16;;35751:1;35814:28:::1;::::0;35613:65;;35814:28:::1;:::i;:::-;::::0;;;-1:-1:-1;;35874:45:0::1;::::0;35856:12:::1;::::0;35882:10:::1;::::0;35906:8;;35856:12;35874:45;35856:12;35874:45;35906:8;35882:10;35874:45:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35855:64;;;35938:7;35930:35;;;;-1:-1:-1::0;;;35930:35:0::1;;;;;;;:::i;:::-;35983:40;::::0;2284:25:1;;;36002:10:0::1;::::0;35991:9;;35983:40:::1;::::0;2272:2:1;2257:18;35983:40:0::1;;;;;;;-1:-1:-1::0;;28025:1:0;28697:22;;-1:-1:-1;;;;;;;;34621:1410:0:o;39973:176::-;1690:6;;-1:-1:-1;;;;;1690:6:0;1676:10;:20;1672:81;;1720:21;;-1:-1:-1;;;1720:21:0;;;;;;;;;;;1672:81;40058:4:::1;40047:7;:15;;40039:40;;;::::0;-1:-1:-1;;;40039:40:0;;15977:2:1;40039:40:0::1;::::0;::::1;15959:21:1::0;16016:2;15996:18;;;15989:30;-1:-1:-1;;;16035:18:1;;;16028:42;16087:18;;40039:40:0::1;15775:336:1::0;40039:40:0::1;40090:6;:16:::0;;;40122:19:::1;::::0;2284:25:1;;;40122:19:0::1;::::0;2272:2:1;2257:18;40122:19:0::1;;;;;;;39973:176:::0;:::o;39556:360::-;39674:19;39696:24;;;:13;:24;;;;;:31;39636:25;;39696:31;-1:-1:-1;;;;;39749:26:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39749:26:0;;39738:37;;39791:9;39786:123;39810:11;39806:1;:15;39786:123;;;39857:30;;;;:19;:30;;;;;;;;-1:-1:-1;;;;;39857:37:0;;;;;;;;;:40;;;;;;;;;39843:11;;:8;;39895:1;;39843:11;;;;;;:::i;:::-;;;;;;;;;;:54;39823:3;;39786:123;;;;39663:253;39556:360;;;;:::o;25086:648::-;25170:14;25220:17;;;:11;:17;;;;;:23;25170:14;;25280:447;25304:12;25300:1;:16;25280:447;;;25385:1;25345:17;;;:11;:17;;;;;;;;:28;;;:25;;:28;;;;;;-1:-1:-1;;;;;25345:28:0;:42;25341:375;;25421:5;25412;:14;25408:136;;25460:17;;;;:11;:17;;;;;;;;:28;;;:25;;;;:28;;;;-1:-1:-1;;;;;25460:28:0;;-1:-1:-1;25511:13:0;;-1:-1:-1;;25511:13:0;25408:136;25562:10;25571:1;25562:10;;:::i;:::-;;;25341:375;;;25598:25;25606:4;25620:1;25598:7;:25::i;:::-;:71;;;;-1:-1:-1;25632:17:0;;;;:11;:17;;;;;;;;:37;;;:25;;:37;;;;;;25627:42;;25598:71;25594:122;;;25690:10;25699:1;25690:10;;:::i;:::-;;;25594:122;25318:6;25323:1;25318:6;;:::i;:::-;;;25280:447;;;;25186:548;;25086:648;;;;;:::o;14643:133::-;14721:4;14745:14;;;:8;:14;;;;;;;;-1:-1:-1;;;;;14745:23:0;;;;;;;;;;;;;;;14643:133::o;21561:207::-;31610:4;1924:6;-1:-1:-1;;;;;1924:6:0;31634:10;:21;21634:91;;21683:30;;-1:-1:-1;;;21683:30:0;;;;;;;;;;;21634:91;21737:23;21755:4;21737:17;:23::i;37718:568::-;28069:1;28385:7;;:19;28377:63;;;;-1:-1:-1;;;28377:63:0;;;;;;;:::i;:::-;28069:1;28518:7;:18;;;37799:21:::1;37823:18:::0;;;:7:::1;:18;::::0;;;;37860:15;;::::1;::::0;::::1;;37852:40;;;;-1:-1:-1::0;;;37852:40:0::1;;;;;;;:::i;:::-;37929:6;:20;;;37911:15;:38;37903:70;;;::::0;-1:-1:-1;;;37903:70:0;;16318:2:1;37903:70:0::1;::::0;::::1;16300:21:1::0;16357:2;16337:18;;;16330:30;-1:-1:-1;;;16376:18:1;;;16369:49;16435:18;;37903:70:0::1;16116:343:1::0;37903:70:0::1;38005:16;::::0;::::1;::::0;;37986::::1;38032:20:::0;;;38069:12;;38065:156:::1;;38099:12;1924:6:::0;;38117:42:::1;::::0;-1:-1:-1;;;;;1924:6:0;;;;38146:8;;38099:12;38117:42;38099:12;38117:42;38146:8;1924:6;38117:42:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38098:61;;;38182:7;38174:35;;;;-1:-1:-1::0;;;38174:35:0::1;;;;;;;:::i;:::-;38083:138;38065:156;38258:9;38238:40;38269:8;38238:40;;;;2284:25:1::0;;2272:2;2257:18;;2138:177;38238:40:0::1;;;;;;;;-1:-1:-1::0;;28025:1:0;28697:22;;-1:-1:-1;37718:568:0:o;15543:217::-;15622:4;15644:14;;;:8;:14;;;;;;;;:26;;;;;;;;;;;15639:90;;-1:-1:-1;15694:14:0;;;;:8;:14;;;;;;;;-1:-1:-1;;;;;15694:23:0;;;;;;;;;;;;15687:30;;15639:90;-1:-1:-1;15748:4:0;15543:217;;;;:::o;39158:340::-;39266:19;39288:24;;;:13;:24;;;;;:31;39230:23;;39288:31;-1:-1:-1;;;;;39339:26:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39339:26:0;;39330:35;;39381:9;39376:115;39400:11;39396:1;:15;39376:115;;;39445:31;;;;:20;:31;;;;;;;;:34;;;;;;;;;39433:9;;:6;;39477:1;;39433:9;;;;;;:::i;:::-;;;;;;;;;;:46;39413:3;;39376:115;;;;39255:243;39158:340;;;:::o;40214:374::-;1690:6;;-1:-1:-1;;;;;1690:6:0;1676:10;:20;1672:81;;1720:21;;-1:-1:-1;;;1720:21:0;;;;;;;;;;;1672:81;28069:1:::1;28385:7;;:19:::0;28377:63:::1;;;;-1:-1:-1::0;;;28377:63:0::1;;;;;;;:::i;:::-;28069:1;28518:7;:18:::0;40343:15:::2;::::0;40332:26;::::2;;40324:54;;;::::0;-1:-1:-1;;;40324:54:0;;16666:2:1;40324:54:0::2;::::0;::::2;16648:21:1::0;16705:2;16685:18;;;16678:30;-1:-1:-1;;;16724:18:1;;;16717:45;16779:18;;40324:54:0::2;16464:339:1::0;40324:54:0::2;40408:7;40389:15;;:26;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;40447:35:0::2;::::0;40429:12:::2;::::0;-1:-1:-1;;;;;40447:15:0;::::2;::::0;40470:7;;40429:12;40447:35;40429:12;40447:35;40470:7;40447:15;:35:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40428:54;;;40501:7;40493:35;;;::::0;-1:-1:-1;;;40493:35:0;;17010:2:1;40493:35:0::2;::::0;::::2;16992:21:1::0;17049:2;17029:18;;;17022:30;-1:-1:-1;;;17068:18:1;;;17061:45;17123:18;;40493:35:0::2;16808:339:1::0;40493:35:0::2;40569:10;-1:-1:-1::0;;;;;40546:34:0::2;;40560:7;40546:34;;;;2284:25:1::0;;2272:2;2257:18;;2138:177;30111:41:0;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;30111:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30111:41:0;-1:-1:-1;30111:41:0;:::o;32897:774::-;32985:21;33009:18;;;:7;:18;;;;;33064:14;;;;33046:15;:32;33038:57;;;;-1:-1:-1;;;33038:57:0;;17354:2:1;33038:57:0;;;17336:21:1;17393:2;17373:18;;;17366:30;-1:-1:-1;;;17412:18:1;;;17405:42;17464:18;;33038:57:0;17152:336:1;33038:57:0;33115:15;;;;;;33114:16;33106:44;;;;-1:-1:-1;;;33106:44:0;;17695:2:1;33106:44:0;;;17677:21:1;17734:2;17714:18;;;17707:30;-1:-1:-1;;;17753:18:1;;;17746:45;17808:18;;33106:44:0;17493:339:1;33106:44:0;33184:24;;;;:13;:24;;;;;:31;33169:46;;33161:73;;;;-1:-1:-1;;;33161:73:0;;18039:2:1;33161:73:0;;;18021:21:1;18078:2;18058:18;;;18051:30;-1:-1:-1;;;18097:18:1;;;18090:44;18151:18;;33161:73:0;17837:338:1;33161:73:0;33265:1;33253:9;:13;33245:34;;;;-1:-1:-1;;;33245:34:0;;18382:2:1;33245:34:0;;;18364:21:1;18421:1;18401:18;;;18394:29;-1:-1:-1;;;18439:18:1;;;18432:38;18487:18;;33245:34:0;18180:331:1;33245:34:0;33292:17;33335:5;33325:6;;33313:9;:18;;;;:::i;:::-;33312:28;;;;:::i;:::-;33292:48;-1:-1:-1;33351:17:0;33371:21;33292:48;33371:9;:21;:::i;:::-;33351:41;;33424:9;33405:15;;:28;;;;;;;:::i;:::-;;;;-1:-1:-1;;33444:30:0;;;;:19;:30;;;;;;;;33475:10;33444:42;;;;;;;:56;;;;;;;;:69;;33504:9;;33444:30;:69;;33504:9;;33444:69;:::i;:::-;;;;-1:-1:-1;;33524:31:0;;;;:20;:31;;;;;;;;:45;;;;;;;;:58;;33573:9;;33524:31;:58;;33573:9;;33524:58;:::i;:::-;;;;-1:-1:-1;;33600:63:0;;;18690:25:1;;;18746:2;18731:18;;18724:34;;;33627:10:0;;33616:9;;33600:63;;18663:18:1;33600:63:0;;;;;;;32974:697;;;32897:774;;:::o;26152:409::-;26226:13;26275:17;;;:11;:17;;;;;:23;26226:13;26311:165;26335:12;26331:1;:16;26311:165;;;26416:1;26376:17;;;:11;:17;;;;;;;;:28;;;:25;;:28;;;;;;-1:-1:-1;;;;;26376:28:0;:42;26372:93;;26439:10;26448:1;26439:10;;:::i;:::-;;;26372:93;26349:6;26354:1;26349:6;;:::i;:::-;;;26311:165;;;;26490:25;26498:4;26512:1;26490:7;:25::i;:::-;26486:68;;;26532:10;26541:1;26532:10;;:::i;:::-;;;26486:68;26241:320;26152:409;;;:::o;17285:174::-;17382:19;;;;:13;:19;;;;;;17371:43;;17403:10;17371;:43::i;21113:34::-;;;;;;;:::i;31921:903::-;32065:7;1924:6;;-1:-1:-1;;;;;1924:6:0;32093:10;:21;;:65;;;32118:40;30037:32;32147:10;32118:7;:40::i;:::-;32085:92;;;;-1:-1:-1;;;32085:92:0;;18971:2:1;32085:92:0;;;18953:21:1;19010:2;18990:18;;;18983:30;-1:-1:-1;;;19029:18:1;;;19022:44;19083:18;;32085:92:0;18769:338:1;32085:92:0;32208:1;32196:9;:13;32188:51;;;;-1:-1:-1;;;32188:51:0;;19314:2:1;32188:51:0;;;19296:21:1;19353:2;19333:18;;;19326:30;19392:27;19372:18;;;19365:55;19437:18;;32188:51:0;19112:349:1;32188:51:0;32277:1;32258:8;:15;:20;;32250:54;;;;-1:-1:-1;;;32250:54:0;;19668:2:1;32250:54:0;;;19650:21:1;19707:2;19687:18;;;19680:30;-1:-1:-1;;;19726:18:1;;;19719:51;19787:18;;32250:54:0;19466:345:1;32250:54:0;32336:11;:13;;32317:16;;;32336:13;;;:::i;:::-;;;;-1:-1:-1;32360:21:0;32384:17;;;:7;:17;;;;;32317:32;;-1:-1:-1;32384:17:0;32414:27;32432:9;32384:17;32414:27;:::i;:::-;-1:-1:-1;32469:27:0;32487:9;32469:15;:27;:::i;:::-;32452:14;;;:44;32507:15;;;:23;;-1:-1:-1;;32507:23:0;;;-1:-1:-1;;32541:25:0;;;:45;32525:5;32599:114;32623:8;:15;32619:1;:19;32599:114;;;32660:23;;;;:13;:23;;;;;32689:11;;:8;;32698:1;;32689:11;;;;;;:::i;:::-;;;;;;;;;;;;32660:41;;;;;;;-1:-1:-1;32660:41:0;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;32640:3:0;;32599:114;;;;32744:8;32730:60;32754:9;32765:8;32775:6;:14;;;32730:60;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;32808:8:0;31921:903;-1:-1:-1;;;;31921:903:0:o;2420:177::-;2480:18;2501:6;;-1:-1:-1;;;;;2518:18:0;;;-1:-1:-1;;;;;;2518:18:0;;;;;;2554:35;;2501:6;;;;;;;2554:35;;2480:18;2554:35;2469:128;2420:177;:::o;19006:200::-;19095:14;;;;:8;:14;;;;;;;;-1:-1:-1;;;;;19095:23:0;;;;;;;;;;;;19090:109;;19142:45;;-1:-1:-1;;;19142:45:0;;-1:-1:-1;;;;;13671:32:1;;19142:45:0;;;13653:51:1;13720:18;;;13713:34;;;13626:18;;19142:45:0;13479:274:1;26966:155:0;27046:31;27063:4;27069:7;27046:16;:31::i;:::-;27088:25;27099:4;27105:7;27088:10;:25::i;26689:160::-;26770:32;26788:4;26794:7;26770:17;:32::i;:::-;27591:11;27605:17;;;:11;:17;;;;;;;;-1:-1:-1;;;;;27605:34:0;;;;;:25;;;:34;;;;;;;;27659:30;;:25;;;;:30;;;;;27652:37;;-1:-1:-1;;;;;;27652:37:0;;;27707:34;;;;27700:41;16619:285;;:::o;21853:190::-;21920:21;21944:11;21920:35;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21980:4;21966:11;:18;;;;;;:::i;:::-;;22002:33;22021:7;22030:4;22002:33;;;;;;;:::i;:::-;;;;;;;;21909:134;21853:190;:::o;18472:171::-;18551:14;;;;:8;:14;;;;;;;;-1:-1:-1;;;;;18551:23:0;;;;;;;;;;:30;;-1:-1:-1;;18551:30:0;18577:4;18551:30;;;18597:38;18624:10;;18560:4;;18597:38;;18551:14;18597:38;18472:171;;:::o;27187:259::-;27258:11;27272:17;;;:11;:17;;;;;:23;;;27333:1;;27272:17;27306:28;27333:1;27272:23;27306:28;:::i;:::-;;;;-1:-1:-1;;27347:17:0;;;;:11;:17;;;;;;;;:30;;;:25;;;:30;;;;;:40;;-1:-1:-1;;;;;27347:40:0;;;-1:-1:-1;;;;;;27347:40:0;;;;;;;27398:34;;;:25;;;;:34;;;;:40;27187:259::o;18695:208::-;18775:25;18786:4;18792:7;18775:10;:25::i;:::-;18818:14;;;;:8;:14;;;;;;;;-1:-1:-1;;;;;18818:23:0;;;;;;;;;;18811:30;;-1:-1:-1;;18811:30:0;;;18857:38;18884:10;;18827:4;;18857:38;;18818:14;18857:38;18695:208;;:::o;14:226:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;187:23:1;;14:226;-1:-1:-1;14:226:1:o;245:400::-;287:3;325:5;319:12;352:6;347:3;340:19;377:1;387:139;401:6;398:1;395:13;387:139;;;509:4;494:13;;;490:24;;484:31;464:11;;;460:22;;453:63;416:12;387:139;;;391:3;571:1;564:4;555:6;550:3;546:16;542:27;535:38;634:4;627:2;623:7;618:2;610:6;606:15;602:29;597:3;593:39;589:50;582:57;;;245:400;;;;:::o;650:579::-;702:3;733;765:5;759:12;792:6;787:3;780:19;824:4;819:3;815:14;808:21;;882:4;872:6;869:1;865:14;858:5;854:26;850:37;921:4;914:5;910:16;944:1;954:249;968:6;965:1;962:13;954:249;;;1055:2;1051:7;1043:5;1037:4;1033:16;1029:30;1024:3;1017:43;1081:38;1114:4;1105:6;1099:13;1081:38;:::i;:::-;1154:4;1179:14;;;;1073:46;;-1:-1:-1;1142:17:1;;;;;990:1;983:9;954:249;;;-1:-1:-1;1219:4:1;;650:579;-1:-1:-1;;;;;;650:579:1:o;1234:280::-;1433:2;1422:9;1415:21;1396:4;1453:55;1504:2;1493:9;1489:18;1481:6;1453:55;:::i;:::-;1445:63;1234:280;-1:-1:-1;;;1234:280:1:o;1519:131::-;-1:-1:-1;;;;;1594:31:1;;1584:42;;1574:70;;1640:1;1637;1630:12;1655:247;1714:6;1767:2;1755:9;1746:7;1742:23;1738:32;1735:52;;;1783:1;1780;1773:12;1735:52;1822:9;1809:23;1841:31;1866:5;1841:31;:::i;2502:724::-;2597:6;2605;2613;2666:2;2654:9;2645:7;2641:23;2637:32;2634:52;;;2682:1;2679;2672:12;2634:52;2727:23;;;-1:-1:-1;2825:2:1;2810:18;;2797:32;-1:-1:-1;;;;;2841:30:1;;2838:50;;;2884:1;2881;2874:12;2838:50;2907:22;;2960:4;2952:13;;2948:27;-1:-1:-1;2938:55:1;;2989:1;2986;2979:12;2938:55;3029:2;3016:16;-1:-1:-1;;;;;3047:6:1;3044:30;3041:50;;;3087:1;3084;3077:12;3041:50;3140:7;3135:2;3125:6;3122:1;3118:14;3114:2;3110:23;3106:32;3103:45;3100:65;;;3161:1;3158;3151:12;3100:65;2502:724;;3192:2;3184:11;;;;;-1:-1:-1;3214:6:1;;-1:-1:-1;;;2502:724:1:o;3231:367::-;3299:6;3307;3360:2;3348:9;3339:7;3335:23;3331:32;3328:52;;;3376:1;3373;3366:12;3328:52;3421:23;;;-1:-1:-1;3520:2:1;3505:18;;3492:32;3533:33;3492:32;3533:33;:::i;:::-;3585:7;3575:17;;;3231:367;;;;;:::o;3603:346::-;3671:6;3679;3732:2;3720:9;3711:7;3707:23;3703:32;3700:52;;;3748:1;3745;3738:12;3700:52;-1:-1:-1;;3793:23:1;;;3913:2;3898:18;;;3885:32;;-1:-1:-1;3603:346:1:o;3954:220::-;4103:2;4092:9;4085:21;4066:4;4123:45;4164:2;4153:9;4149:18;4141:6;4123:45;:::i;4179:445::-;4406:3;4395:9;4388:22;4369:4;4427:46;4468:3;4457:9;4453:19;4445:6;4427:46;:::i;:::-;4504:2;4489:18;;4482:34;;;;-1:-1:-1;4559:14:1;;4552:22;4547:2;4532:18;;4525:50;4606:2;4591:18;;;4584:34;4419:54;4179:445;-1:-1:-1;4179:445:1:o;5001:611::-;5191:2;5203:21;;;5273:13;;5176:18;;;5295:22;;;5143:4;;5374:15;;;5348:2;5333:18;;;5143:4;5417:169;5431:6;5428:1;5425:13;5417:169;;;5492:13;;5480:26;;5535:2;5561:15;;;;5526:12;;;;5453:1;5446:9;5417:169;;;-1:-1:-1;5603:3:1;;5001:611;-1:-1:-1;;;;;5001:611:1:o;6368:127::-;6429:10;6424:3;6420:20;6417:1;6410:31;6460:4;6457:1;6450:15;6484:4;6481:1;6474:15;6500:275;6571:2;6565:9;6636:2;6617:13;;-1:-1:-1;;6613:27:1;6601:40;;-1:-1:-1;;;;;6656:34:1;;6692:22;;;6653:62;6650:88;;;6718:18;;:::i;:::-;6754:2;6747:22;6500:275;;-1:-1:-1;6500:275:1:o;6780:559::-;6823:5;6876:3;6869:4;6861:6;6857:17;6853:27;6843:55;;6894:1;6891;6884:12;6843:55;6934:6;6921:20;-1:-1:-1;;;;;6956:6:1;6953:30;6950:56;;;6986:18;;:::i;:::-;7030:59;7077:2;7054:17;;-1:-1:-1;;7050:31:1;7083:4;7046:42;7030:59;:::i;:::-;7114:6;7105:7;7098:23;7168:3;7161:4;7152:6;7144;7140:19;7136:30;7133:39;7130:59;;;7185:1;7182;7175:12;7130:59;7250:6;7243:4;7235:6;7231:17;7224:4;7215:7;7211:18;7198:59;7306:1;7277:20;;;7299:4;7273:31;7266:42;;;;7281:7;6780:559;-1:-1:-1;;;6780:559:1:o;7344:322::-;7413:6;7466:2;7454:9;7445:7;7441:23;7437:32;7434:52;;;7482:1;7479;7472:12;7434:52;7522:9;7509:23;-1:-1:-1;;;;;7547:6:1;7544:30;7541:50;;;7587:1;7584;7577:12;7541:50;7610;7652:7;7643:6;7632:9;7628:22;7610:50;:::i;:::-;7600:60;7344:322;-1:-1:-1;;;;7344:322:1:o;7671:487::-;7748:6;7756;7764;7817:2;7805:9;7796:7;7792:23;7788:32;7785:52;;;7833:1;7830;7823:12;7785:52;7878:23;;;-1:-1:-1;7977:2:1;7962:18;;7949:32;7990:33;7949:32;7990:33;:::i;:::-;7671:487;;8042:7;;-1:-1:-1;;;8122:2:1;8107:18;;;;8094:32;;7671:487::o;8163:375::-;8239:6;8247;8300:2;8288:9;8279:7;8275:23;8271:32;8268:52;;;8316:1;8313;8306:12;8268:52;8355:9;8342:23;8374:31;8399:5;8374:31;:::i;:::-;8424:5;8502:2;8487:18;;;;8474:32;;-1:-1:-1;;;8163:375:1:o;8543:589::-;8826:3;8815:9;8808:22;8789:4;8847:46;8888:3;8877:9;8873:19;8865:6;8847:46;:::i;:::-;8924:2;8909:18;;8902:34;;;;-1:-1:-1;8979:14:1;;8972:22;8967:2;8952:18;;8945:50;9026:2;9011:18;;9004:34;;;;9069:3;9054:19;;9047:35;9113:3;9098:19;;;9091:35;8839:54;8543:589;-1:-1:-1;8543:589:1:o;9137:1433::-;9259:6;9267;9275;9328:2;9316:9;9307:7;9303:23;9299:32;9296:52;;;9344:1;9341;9334:12;9296:52;9384:9;9371:23;-1:-1:-1;;;;;9409:6:1;9406:30;9403:50;;;9449:1;9446;9439:12;9403:50;9472;9514:7;9505:6;9494:9;9490:22;9472:50;:::i;:::-;9462:60;;;9575:2;9564:9;9560:18;9547:32;-1:-1:-1;;;;;9594:8:1;9591:32;9588:52;;;9636:1;9633;9626:12;9588:52;9659:24;;9714:4;9706:13;;9702:27;-1:-1:-1;9692:55:1;;9743:1;9740;9733:12;9692:55;9783:2;9770:16;-1:-1:-1;;;;;9801:6:1;9798:30;9795:56;;;9831:18;;:::i;:::-;9877:6;9874:1;9870:14;9904:28;9928:2;9924;9920:11;9904:28;:::i;:::-;9966:19;;;10010:2;10040:11;;;10036:20;;;10001:12;;;;10068:19;;;10065:39;;;10100:1;10097;10090:12;10065:39;10132:2;10128;10124:11;10113:22;;10144:299;10160:6;10155:3;10152:15;10144:299;;;10246:3;10233:17;-1:-1:-1;;;;;10269:11:1;10266:35;10263:55;;;10314:1;10311;10304:12;10263:55;10343:57;10392:7;10387:2;10373:11;10369:2;10365:20;10361:29;10343:57;:::i;:::-;10331:70;;-1:-1:-1;10430:2:1;10177:12;;;;10421;;;;10144:299;;;9137:1433;;10462:5;;-1:-1:-1;;;;10536:2:1;10521:18;;;;10508:32;;-1:-1:-1;;;9137:1433:1:o;10575:127::-;10636:10;10631:3;10627:20;10624:1;10617:31;10667:4;10664:1;10657:15;10691:4;10688:1;10681:15;10707:380;10786:1;10782:12;;;;10829;;;10850:61;;10904:4;10896:6;10892:17;10882:27;;10850:61;10957:2;10949:6;10946:14;10926:18;10923:38;10920:161;;11003:10;10998:3;10994:20;10991:1;10984:31;11038:4;11035:1;11028:15;11066:4;11063:1;11056:15;11092:355;11294:2;11276:21;;;11333:2;11313:18;;;11306:30;11372:33;11367:2;11352:18;;11345:61;11438:2;11423:18;;11092:355::o;11452:336::-;11654:2;11636:21;;;11693:2;11673:18;;;11666:30;-1:-1:-1;;;11727:2:1;11712:18;;11705:42;11779:2;11764:18;;11452:336::o;12135:127::-;12196:10;12191:3;12187:20;12184:1;12177:31;12227:4;12224:1;12217:15;12251:4;12248:1;12241:15;12267:125;12332:9;;;12353:10;;;12350:36;;;12366:18;;:::i;12397:168::-;12470:9;;;12501;;12518:15;;;12512:22;;12498:37;12488:71;;12539:18;;:::i;12570:217::-;12610:1;12636;12626:132;;12680:10;12675:3;12671:20;12668:1;12661:31;12715:4;12712:1;12705:15;12743:4;12740:1;12733:15;12626:132;-1:-1:-1;12772:9:1;;12570:217::o;12792:128::-;12859:9;;;12880:11;;;12877:37;;;12894:18;;:::i;13135:339::-;13337:2;13319:21;;;13376:2;13356:18;;;13349:30;-1:-1:-1;;;13410:2:1;13395:18;;13388:45;13465:2;13450:18;;13135:339::o;19816:135::-;19855:3;19876:17;;;19873:43;;19896:18;;:::i;:::-;-1:-1:-1;19943:1:1;19932:13;;19816:135::o;20082:518::-;20184:2;20179:3;20176:11;20173:421;;;20220:5;20217:1;20210:16;20264:4;20261:1;20251:18;20334:2;20322:10;20318:19;20315:1;20311:27;20305:4;20301:38;20370:4;20358:10;20355:20;20352:47;;;-1:-1:-1;20393:4:1;20352:47;20448:2;20443:3;20439:12;20436:1;20432:20;20426:4;20422:31;20412:41;;20503:81;20521:2;20514:5;20511:13;20503:81;;;20580:1;20566:16;;20547:1;20536:13;20503:81;;;20507:3;;20173:421;20082:518;;;:::o;20776:1299::-;20902:3;20896:10;-1:-1:-1;;;;;20921:6:1;20918:30;20915:56;;;20951:18;;:::i;:::-;20980:97;21070:6;21030:38;21062:4;21056:11;21030:38;:::i;:::-;21024:4;20980:97;:::i;:::-;21126:4;21157:2;21146:14;;21174:1;21169:649;;;;21862:1;21879:6;21876:89;;;-1:-1:-1;21931:19:1;;;21925:26;21876:89;-1:-1:-1;;20733:1:1;20729:11;;;20725:24;20721:29;20711:40;20757:1;20753:11;;;20708:57;21978:81;;21139:930;;21169:649;20029:1;20022:14;;;20066:4;20053:18;;-1:-1:-1;;21205:20:1;;;21323:222;21337:7;21334:1;21331:14;21323:222;;;21419:19;;;21413:26;21398:42;;21526:4;21511:20;;;;21479:1;21467:14;;;;21353:12;21323:222;;;21327:3;21573:6;21564:7;21561:19;21558:201;;;21634:19;;;21628:26;-1:-1:-1;;21717:1:1;21713:14;;;21729:3;21709:24;21705:37;21701:42;21686:58;21671:74;;21558:201;-1:-1:-1;;;;21805:1:1;21789:14;;;21785:22;21772:36;;-1:-1:-1;20776:1299:1:o;22080:514::-;22355:2;22344:9;22337:21;22318:4;22381:45;22422:2;22411:9;22407:18;22399:6;22381:45;:::i;:::-;22474:9;22466:6;22462:22;22457:2;22446:9;22442:18;22435:50;22502:43;22538:6;22530;22502:43;:::i;:::-;22494:51;;;22581:6;22576:2;22565:9;22561:18;22554:34;22080:514;;;;;;:::o;22599:383::-;22796:2;22785:9;22778:21;22759:4;22822:45;22863:2;22852:9;22848:18;22840:6;22822:45;:::i;:::-;22915:9;22907:6;22903:22;22898:2;22887:9;22883:18;22876:50;22943:33;22969:6;22961;22943:33;:::i;:::-;22935:41;22599:383;-1:-1:-1;;;;;22599:383:1:o
Swarm Source
ipfs://62168fffb4b3c93877e968c36b4d650e7ea8d0c1577ff5bfb9a1cac66ddcfa46
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
APE | Ape (APE) | 100.00% | $1.09 | 27.365 | $29.83 |
[ Download: CSV Export ]
[ 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.