def find_recursive(domain: str, dns_servers: tp.Dict[str, str], trace: Trace) -> tp.Optional[IpRecord]: for server_domain, host in dns_servers.items(): trace.add(f"{host} {server_domain}") response = create_and_send_request(domain, host) if not response.request_success or not response.parsed_success: continue if response.aa: return response.get_a_ip_record() domains, servers = response.get_domains_and_servers() if len(servers) == 0 and len(domains) != 0: new_domain = domains[0] result = find_recursive(new_domain, ROOT_SERVERS_DNS, trace) if result: dns_servers = {new_domain: ip for _, ip in result.ips} return find_recursive(domain, dns_servers, trace) else: return find_recursive(domain, servers, trace) return None