struct Entry { std::string ip; std::optional<uint16_t> port; };
std::optional<Entry> ParseEntry(const std::string& s) {
Entry e;
auto colon = s.rfind(':');
if (colon == std::string::npos) {
e.ip = s;
} else {
e.ip = s.substr(0, colon);
uint16_t p;
if (!ParsePort(s.substr(colon + 1), &p)) return std::nullopt;
e.port = p;
}
if (!IsValidIp(e.ip)) return std::nullopt;
return e;
}