32) { return false; } $ipLong = ip2long($ip); $subnetLong = ip2long($subnet); if ($ipLong === false || $subnetLong === false) { return false; } $mask = $bits === 0 ? 0 : (-1 << (32 - $bits)) & 0xFFFFFFFF; return ($ipLong & $mask) === ($subnetLong & $mask); } function isGeoBypassTrustedIp(string $ip): bool { $ip = normalizeClientIp($ip); if ($ip === '') { return false; } if (in_array($ip, getGeoBypassTrustedIps(), true)) { return true; } if (filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) { foreach (getGeoBypassTrustedCidrs() as $cidr) { if (ipv4InCidr($ip, $cidr)) { return true; } } } return false; }