lft-3.8/000755 000766 000000 00000000000 13263007004 012064 5ustar00vicwheel000000 000000 lft-3.8/lft_lib.c000644 000766 000000 00000440704 13263006600 013655 0ustar00vicwheel000000 000000 /* * lft_lib.c * Layer Four Traceroute * * This file is part of LFT. * * The LFT software provided in this Distribution is * Copyright 2010 VOSTROM Holdings, Inc. * * The full text of our legal notices is contained in the file called * COPYING, included with this Distribution. * */ #define _USE_32BIT_TIME_T #include "lft_lib.h" #include "lft_btcptrace.h" #include "lft_icmptrace.h" /*---------------------------------------------------------------------------*/ /* GraphViz output defines */ #define GVGRAPHNAME "lftpath" /* #define GVHOPSTYLE_BASE "shape = rect, penwidth=1" #define GVHOPSTYLE_SOURCE "shape = rect, style=filled, fillcolor=lightskyblue, color=skyblue, penwidth=2" #define GVHOPSTYLE_TARGET_OPEN "shape = rect, style=filled, fillcolor=palegreen, color=mediumspringgreen, penwidth=2" #define GVHOPSTYLE_TARGET_CLOSED "shape = rect, style=filled, fillcolor=tomato, color=orangered, penwidth=2" #define GVHOPSTYLE_TARGET_FILTERED "shape = rect, style=filled, fillcolor=grey, color=mediumspringgreen, penwidth=2" #define GVHOPSTYLE_HOLE "shape = note, style=filled, fillcolor=lightgrey, color=slategrey, penwidth=2" #define GVHOPSTYLE_ANOMALY1 "shape = rect, style=filled, fillcolor=salmon, skew=.4, color=orangered, penwidth=2" #define GVHOPSTYLE_ANOMALY2 "shape = rect, style=filled, fillcolor=lemonchiffon, skew=.4, color=orangered, penwidth=2" #define GVHOPSTYLE_ANOMALY3 "shape = rect, style=filled, fillcolor=lightgrey, color=slategrey, skew=.4, penwidth=2" */ #define GVHOPSTYLE_BASE "shape = none" #define GVHOPSTYLE_SOURCE "shape = none" #define GVHOPSTYLE_TARGET_OPEN "shape = none" #define GVHOPSTYLE_TARGET_CLOSED "shape = none" #define GVHOPSTYLE_TARGET_FILTERED "shape = none" #define GVHOPSTYLE_HOLE "shape = none" /* Firewall - The next gateway may statefully inspect packets */ #define GVHOPSTYLE_ANOMALY1 "shape = none" /* Firewall - The next gateway may implement a flag-based state filter */ #define GVHOPSTYLE_ANOMALY2 "shape = none" /* 4.2-3 BSD bug - The next gateway may errantly reply with reused TTLs */ #define GVHOPSTYLE_ANOMALY3 "shape = none" #define GV_ANOMALY1_TEXT "Stateful Firewall" #define GV_ANOMALY2_TEXT "Flag-based Firewall" #define GV_ANOMALY3_TEXT "BSD-stack TTL Reused" #define GVFONTSIZE "12" #define GVFONTNAME "Helvetica" static const char GVNTBEG[]="
"; static const char GVNTEND[]="
"; static const char GVNIMG_SOURCE[]="source.png"; static const char GVNIMG_TRGOPEN[]="dest.png"; static const char GVNIMG_TRGCLOSED[]="dest_closed.png"; static const char GVNIMG_TRGFILTERED[]="dest_prohibited.png"; static const char GVNIMG_ANOMALY1[]="firewall_smart.png"; static const char GVNIMG_ANOMALY2[]="firewall_stupid.png"; static const char GVNIMG_ANOMALY3[]="firewall_stupid.png"; static const char GVNIMG_REGULAR[]="router.png"; static const char GVNIMG_HOLE[]="router_cloaked.png"; static const char GVNIMG_SEAM[]="router_seam.png"; #if defined(WIN32) || defined(_WIN32) static const char DIRECTORY_SPLITTER='\\'; #else static const char DIRECTORY_SPLITTER='/'; #endif /*---------------------------------------------------------------------------*/ static const int start_dport = 33434; /* starting port for UDP tracing (traceroute compatibility for some targets that care */ const int maxpacklen = 16 * 1024; /* maximum user-supplied probe length */ /* Ethernet=1500, GigEther(jumbo)=9000 */ static const int minpacklen = 60; /* minimum user-supplied probe length */ const char * icmp_messages[] = { "endpoint", "net unreachable", "host unreachable", "protocol unreachable", "port unreachable", "need fragment", "source fail", "net unknown", "host unknown", "src isolated", "net prohib", "host prohib", "bad tos/net", "bad tos/hst", "prohibited", "precedence violation", "precedence cutoff" }; static char time_format[] = "%d-%b-%y %H:%M:%S %Z"; /* time display format */ static char tbuf[128]; const char *appname = "LFT"; static const int hop_info_size = 256; /* can't be more than this */ static const unsigned int max_net_dev_input = 64; /* only take this much input */ static const int def_payload_len = 10; /* default payload length for UDP packets */ #if defined( __CYGWIN__ ) || defined( WIN32 ) || defined(_WIN32) static int sock = -1; #endif static int global_output_style=0; /* 0 - ordinary output, 1 - xml output, 2 - GraphViz output */ void GraphVizOutput(lft_session_params * sess); /*---------------------------------------------------------------------------*/ static void LFTDefaultErrorHandler(lft_session_params * sess, int code, const void * params) { const WrnBadHopStateParam * wbhsp; switch(code) { case WRN_CANT_SETUP_FIN: if(global_output_style==1) printf("%s",code, "TCP flags are selected automatically using (-E) option.\n\t\t\tIgnoring FINs-only (-F) option and using adaptive Engine.\n"); else fprintf (stderr, "LFT warning: TCP flags are selected automatically using (-E) option.\n\t\t\tIgnoring FINs-only (-F) option and using adaptive Engine.\n"); break; case WRN_CANT_DISP_HOST_NAMES: if(global_output_style==1) printf("%s",code, "I can't display hostnames (-h) unless I resolve them.\n\t\t\tIgnoring your request to display hostnames exclusively.\n"); else fprintf (stderr, "LFT warning: I can't display hostnames (-h) unless I resolve them.\n\t\t\tIgnoring your request to display hostnames exclusively.\n"); break; case WRN_ADAPTIVE_DISABLED_BY_UDP: if(global_output_style==1) printf("%s",code,"Disabling adaptive mode while using UDP."); else fprintf (stderr,"LFT warning: Disabling adaptive mode while using UDP.\n"); break; case WRN_FIN_DISABLED_BY_UDP: if(global_output_style==1) printf("%s",code,"Disabling FINs-only mode while using UDP."); else fprintf (stderr,"LFT warning: Disabling FINs-only mode while using UDP.\n"); break; case WRN_ONLY_ONE_ASN_LOOKUP: if(global_output_style==1) printf("%s",code,"Only one ASN lookup source may be used--you selected "); else fprintf (stderr,"LFT warning: Only one ASN lookup source may be used--you selected "); if(global_output_style!=1) { if(sess->use_cymru) fprintf (stderr,"Cymru.\n\t\t\tIgnoring your request to use "); if(sess->use_ris) fprintf (stderr,"RIPE NCC RIS.\n\t\t\tIgnoring your request to use "); if(sess->use_radb) fprintf (stderr,"RADB.\n\t\t\tIgnoring your request to use "); switch(*((const int *)params)) { case ASN_LOOKUP_RIS: fprintf (stderr,"RIPE NCC RIS.\n"); break; case ASN_LOOKUP_RADB: fprintf (stderr,"RADB.\n"); break; case ASN_LOOKUP_CYMRU: fprintf (stderr,"Cymru.\n"); break; } if(global_output_style==1) printf(""); } break; case WRN_UDP_PORT_TOO_HIGH: if(global_output_style==1) printf("Starting UDP port %d is too high. Will start with %d instead.", code, *((const int *)params), sess->dport); else fprintf (stderr, "LFT warning: Starting UDP port %d is too high. Will start with %d instead.\n", *((const int *)params), sess->dport); break; case WRN_PACKET_LENGTH_TOO_HIGH: if(global_output_style==1) printf("Packet length %d is too high. Will use %d instead.", code, *((const int *)params), maxpacklen); else fprintf (stderr, "LFT warning: Packet length %d is too high. Will use %d instead.\n", *((const int *)params), maxpacklen); break; case WRN_PACKET_LENGTH_TOO_LOW: if(global_output_style==1) printf("Packet length %d is too low. Will use %d instead.", code, *((const int *)params), minpacklen); else fprintf (stderr, "LFT warning: Packet length %d is too low. Will use %d instead.\n", *((const int *)params), minpacklen); break; case WRN_CANT_DISABLE_RESOLVER: if(global_output_style==1) printf("%s",code, "LFT warning: I can't display hostnames (-h) unless I resolve them.\n\t\t\tIgnoring your request not to resolve DNS.\n"); else fprintf (stderr, "LFT warning: I can't display hostnames (-h) unless I resolve them.\n\t\t\tIgnoring your request not to resolve DNS.\n"); break; case WRN_ALREADY_RANDOM_SPORT: if(global_output_style==1) printf("%s",code, "LFT warning: You already asked to use a random source port.\n\t\t\tIgnoring request to set specific source port.\n"); else fprintf (stderr, "LFT warning: You already asked to use a random source port.\n\t\t\tIgnoring request to set specific source port.\n"); break; case WRN_ADAPTIVE_DISABLED_BY_FIN: if(global_output_style==1) printf("%s",code, "LFT warning: TCP flags are selected automatically using (-E) option.\n\t\t\tIgnoring adaptive Engine (-E) option and using FINs-only (-F).\n"); else fprintf (stderr, "LFT warning: TCP flags are selected automatically using (-E) option.\n\t\t\tIgnoring adaptive Engine (-E) option and using FINs-only (-F).\n"); break; case ERR_DEVNAME_TOO_LONG: if(global_output_style==1) printf("Net interface names are limited to %d characters. (e.g., \"eth0\" or \"ppp0\" or \"10.10.10.10\")",code, max_net_dev_input); else fprintf (stderr, "Net interface names are limited to %d characters. (e.g., \"eth0\" or \"ppp0\" or \"10.10.10.10\")\n", max_net_dev_input); sess->exit_state=-1; break; case WRN_UNABLE_SETUP_UTC: if(global_output_style==1) printf("%s",code,"Unable to set TZ to UTC."); else fprintf(stderr, "LFT: Unable to set TZ to UTC.\n"); break; case ERR_UNKNOWN_HOST: if(global_output_style==1) printf("Unknown host: %s",code,(const char *)params); else fprintf (stderr, "LFT: Unknown host: %s\n", (const char *)params); sess->exit_state=-2; break; case WRN_GETIFFORREMOTE_SOCKET: if(global_output_style==1) #if defined( __CYGWIN__ ) || defined( WIN32 ) || defined(_WIN32) printf("socket: %s",code,strerror(errno)); #else printf("Socket trouble; unable to determine interface",code); #endif else #if defined( __CYGWIN__ ) || defined( WIN32 ) || defined(_WIN32) perror("socket"); #else perror("LFT: Socket trouble; unable to determine interface"); #endif break; case WRN_GETIFFORREMOTE_CONNECT: if(global_output_style==1) printf("UDP connect(); unable to determine interface: %s",code,strerror(errno)); else perror("LFT: UDP connect(); unable to determine interface"); break; case WRN_GETIFFORREMOTE_SOCKNAME: if(global_output_style==1) printf("getsockname: %s",code,strerror(errno)); else perror("getsockname"); break; case ERR_RAW_SOCKET: if(global_output_style==1) printf("raw socket: %s",code,strerror(errno)); else perror ("LFT: raw socket"); sess->exit_state=-3; break; case ERR_SOCKET_BIND: if(global_output_style==1) printf("bind: %s",code,strerror(errno)); else perror ("LFT: bind"); sess->exit_state=-4; break; case WRN_WSAIOCTL: if(global_output_style==1) printf("WSAIoctl: %s",code,strerror(errno)); else perror("LFT: WSAIoctl"); break; case ERR_IP_HDRINCL: if(global_output_style==1) printf("IP_HDRINCL: %s",code,strerror(errno)); else perror ("LFT: IP_HDRINCL"); sess->exit_state=-5; break; case ERR_NOT_ENOUGH_MEM: if(global_output_style==1) printf("malloc(): %s",code,strerror(errno)); else perror("malloc"); sess->exit_state=-6; break; case ERR_RAW_TCP_DISABLED: if(global_output_style==1) { printf("sendto: %s\n",code,strerror(errno)); #if defined( __CYGWIN__ ) || defined( WIN32 ) || defined(_WIN32) if (!sess->protocol) { printf("Your platform may prevent you from using raw TCP sockets.\n"); printf("Try UDP-based tracing instead using the \"-u\" option.\n"); } #else printf("Your platform may prevent you from using raw TCP sockets.\n"); printf("This could be the result of a local (host-based) firewall\n"); printf("or a permissions problem on this binary or the BPF device.\n"); if(sess->adaptive) printf("You can try TCP-based tracing without using adaptive mode.\n"); printf("You can try UDP-based tracing using the \"-u\" option.\n"); #endif printf("\n"); } else { #if defined( __CYGWIN__ ) || defined( WIN32 ) || defined(_WIN32) perror ("sendto"); if (!sess->protocol) { fprintf(stderr,"LFT: Your platform may prevent you from using raw TCP sockets.\n"); fprintf(stderr," Try UDP-based tracing instead using the \"-u\" option.\n"); } #else perror ("sendto"); fprintf(stderr,"LFT: Your platform may prevent you from using raw TCP sockets.\n"); fprintf(stderr," This could be the result of a local (host-based) firewall\n"); fprintf(stderr," or a permissions problem on this binary or the BPF device.\n"); if (sess->adaptive) fprintf(stderr," You can try TCP-based tracing without using adaptive mode.\n"); fprintf(stderr," You can try UDP-based tracing using the \"-u\" option.\n"); #endif } sess->exit_state=-7; break; case WRN_BAD_HOP_STATE: wbhsp=(const WrnBadHopStateParam *)params; if(global_output_style==1) printf("Bad state %#x for hop %d", code, wbhsp->h->state, wbhsp->nhop); else fprintf(stderr,"Bad state %#x for hop %d\n", wbhsp->h->state, wbhsp->nhop); break; case WRN_NS_LOOKUP_FAILED: if(global_output_style==1) { printf("", code); if(sess->use_radb) printf ("The RADB lookup failed."); else if(sess->use_cymru) printf ("The Cymru lookup failed."); else if(sess->use_ris) printf ("The RIPE NCC RIS lookup failed."); else printf ("The Prefix WhoIs lookup failed."); printf(""); } else { if(sess->use_radb) fprintf(stderr,"The RADB lookup failed.\n"); else if(sess->use_cymru) fprintf(stderr,"The Cymru lookup failed.\n"); else if(sess->use_ris) fprintf(stderr,"The RIPE NCC RIS lookup failed.\n"); else fprintf(stderr,"The Prefix WhoIs lookup failed.\n"); } break; case ERR_WIN_SELECT: if(global_output_style==1) printf("select: %s",code,strerror(errno)); else perror("select"); sess->exit_state=-8; break; case ERR_WIN_RECV: if(global_output_style==1) printf("read: %s",code,strerror(errno)); else perror("read"); sess->exit_state=-9; break; case ERR_WIN_WSASTARTUP: if(global_output_style==1) printf("WSAStartup: %s",code,strerror(errno)); else perror("WSAStartup"); sess->exit_state=-10; break; case ERR_PCAP_ERROR: if(global_output_style==1) printf("%s",code,(const char *)params); else fprintf (stderr, "LFT: %s\n", (const char *)params); sess->exit_state=-11; break; case ERR_DISCOVER_INTERFACE: if(global_output_style==1) printf("Failed to discover an appropriate interface",code); else fprintf (stderr, "LFT: Failed to discover an appropriate interface.\n"); sess->exit_state=-12; break; case ERR_UNKNOWN_INTERFACE: if(global_output_style==1) printf("Unable to locate a local interface with IP address %s",code,sess->userdev); else fprintf (stderr, "LFT: Unable to locate a local interface with IP address %s\n", sess->userdev); sess->exit_state=-13; break; case ERR_PCAP_DEV_UNAVAILABLE: if(global_output_style==1) printf("The network device \"%s\" isn\'t available to LFT. Try another or fix:\nERROR: %s",code,sess->pcap_dev,(const char *)params); else fprintf (stderr, "The network device \"%s\" isn\'t available to LFT. Try another or fix:\nERROR: %s\n", sess->pcap_dev, (const char *)params); sess->exit_state=-14; break; case WRN_BIOCIMMEDIATE: if(global_output_style==1) printf("BIOCIMMEDIATE: %s", code, (const char *)params); else fprintf(stderr, "BIOCIMMEDIATE: %s\n",(const char *)params); sess->exit_state=-34; break; case WRN_OCHECK_OPEN_SOCK: if(global_output_style!=1 && sess->noisy>1) fprintf(stderr, "LFT: Error opening socket.\n"); if(global_output_style==1) printf("Error opening socket", code); break; case WRN_OCHECK_IOCTL: if(global_output_style!=1 && sess->noisy>1) fprintf(stderr, "LFT: Error setting nonblocking mode (IOCTL).\n"); if(global_output_style==1) printf("Error setting nonblocking mode (IOCTL)", code); break; case WRN_OCHECK_SELECT: if(global_output_style!=1 && sess->noisy>1) fprintf(stderr, "LFT: Error on socket select call.\n"); if(global_output_style==1) printf("Error on socket select call", code); break; case WRN_OCHECK_GETERROR: if(global_output_style!=1 && sess->noisy>1) fprintf(stderr, "LFT: Error trying to read socket error.\n"); if(global_output_style==1) printf("Error trying to read socket error", code); break; case WRN_OCHECK_SOCKERROR: if(global_output_style!=1 && sess->noisy>1) fprintf(stderr, "LFT: Error on socket.\n"); if(global_output_style==1) printf("Error on socket", code); break; case WRN_OCHECK_TIMEOUT: if(global_output_style!=1 && sess->noisy>1) fprintf(stderr, "LFT: Timeout on socket.\n"); if(global_output_style==1) printf("Timeout on socket", code); break; case WRN_OCHECK_FCNTLGET: if(global_output_style!=1 && sess->noisy>1) fprintf(stderr, "LFT: Error setting nonblocking mode (FCNTL GET).\n"); if(global_output_style==1) printf("Error setting nonblocking mode (FCNTL GET)", code); break; case WRN_OCHECK_FCNTLSET: if(global_output_style!=1 && sess->noisy>1) fprintf(stderr, "LFT: Error setting nonblocking mode (FCNTL SET).\n"); if(global_output_style==1) printf("Error setting nonblocking mode (FCNTL SET)", code); break; case WRN_OCHECK_CONNECTERR: if(global_output_style!=1 && sess->noisy>1) fprintf(stderr, "LFT: Error trying socket connect.\n"); if(global_output_style==1) printf("Error trying socket connect", code); break; case ERR_PCAP_NONBLOCK_ERROR: if(global_output_style==1) printf("%s",code,(const char *)params); else fprintf (stderr, "LFT: Failed to set nonblocking mode.\n %s\n", (const char *)params); sess->exit_state=-35; break; } } /*---------------------------------------------------------------------------*/ static void print_host (lft_session_params * sess, struct in_addr addr) { struct hostent *h; if (!sess->resolve_names) { if(global_output_style==1) printf (" ip=\"%s\"", inet_ntoa (addr)); else printf ("%s", inet_ntoa (addr)); } else { h = gethostbyaddr ((void *) &addr, 4, AF_INET); if (h) { if(global_output_style==1) printf (" host=\"%s\"", h->h_name); else printf ("%s", h->h_name); if (!sess->hostnames_only) { if(global_output_style==1) printf (" ip=\"%s\"", inet_ntoa (addr)); else printf(" (%s)", inet_ntoa (addr)); } } else { if(global_output_style==1) printf (" ip=\"%s\"", inet_ntoa (addr)); else printf ("%s", inet_ntoa (addr)); } } } /*---------------------------------------------------------------------------*/ double timediff_ms (struct timeval prior, struct timeval latter) { return (latter.tv_usec - prior.tv_usec) / 1000. + (latter.tv_sec - prior.tv_sec) * 1000.; } /*---------------------------------------------------------------------------*/ static void EvtPacketInfoDefaultHandler(lft_session_params * sess, const EvtPacketInfoParam * ehip) { char ind=' '; if(ehip->tp->recv.tv_sec) { if (ehip->last_hop.s_addr != ehip->tp->hopaddr.s_addr) { if (sess->do_aslookup) { if(global_output_style==1) printf(" asn=\"%d\"", ehip->asnumber); else { if (ehip->asnumber) printf(" [%d]", ehip->asnumber); else printf(" [AS?]"); } } if (sess->do_netlookup) { if(global_output_style==1) printf(" net=\"%s\"", ehip->netname); else { if(ehip->netname && strlen(ehip->netname)>0) printf(" [%s]", ehip->netname); else printf(" [Net?]"); } } if (ehip->tp->icmp_type < -2 || ehip->tp->icmp_type > 17) { if(global_output_style==1) printf(" icmpcode=\"%d\"", ehip->tp->icmp_type); else printf (" [icmp code %d]", ehip->tp->icmp_type); } else if (ehip->tp->icmp_type >= 0) { if(global_output_style==1) printf (" icmpmsg=\"%s\"", icmp_messages[ehip->tp->icmp_type + 1]); else printf (" [%s]", icmp_messages[ehip->tp->icmp_type + 1]); } if (ehip->tp->icmp_type == -1) { if(global_output_style==1) printf(" trgstate=\""); else printf(" [target"); if(sess->protocol==0 || sess->protocol==4) { if(!(global_output_style==1)) printf(" "); if (sess->target_open > 0) printf("open"); else { if(sess->target_filtered > 0) printf("filtered"); else printf("closed"); } } if(global_output_style==1) printf("\""); else printf("]"); } if(ehip->is_asseam) { if(global_output_style==1) printf(" asseam=\"1"); else printf(" (AS-Method Seam"); } if(ehip->is_netseam) { if(global_output_style==1) printf(" netseam=\"1"); else { if(ehip->is_asseam) printf(", Network-Method Seam"); else printf(" (Network-Method Seam"); } } if(ehip->is_asseam || ehip->is_netseam) { if(ehip->seam_traced) { if(global_output_style==1) printf("\" seamstate=\""); else printf(": "); if(ehip->is_open) printf("OPEN"); else { if(ehip->is_filtered) printf("FILTERED"); else printf("CLOSED"); } } if(global_output_style==1) printf("\""); else printf(")"); } if(global_output_style!=1) printf(" "); print_host (sess, ehip->tp->hopaddr); if (ehip->tp->icmp_type == -1 && (sess->protocol<2 || sess->protocol>3)) { if(global_output_style==1) printf(" port=\"%d\"",sess->dport); else printf(":%d",sess->dport); } } else { if(global_output_style==1) ind=';'; else ind='/'; } if(global_output_style==1) { if(ind==';') printf (";%.1f", timediff_ms(ehip->tp->sent, ehip->tp->recv)); else printf (" timems=\"%.1f", timediff_ms(ehip->tp->sent, ehip->tp->recv)); } else printf ("%c%.1f", ind, timediff_ms(ehip->tp->sent, ehip->tp->recv)); } } /*---------------------------------------------------------------------------*/ static void LFTDefaultEventHandler(lft_session_params * sess, int code, const void * params) { const EvtSentPacketParam * spparam; const EvtNoReplyParam * nrparam; const struct trace_packet_s * packet; const EvtDebugCheckpoint1Param * edcpparam; const EvtNonSeqPacketParam * enspparam; const EvtRecvPacketParam * erpparam; const EvtIncomingICMPUDPParam * eiiuparam; const EvtIncomingICMPTCPParam * eiitparam; const EvtIncomingICMPEchoParam * eiiiparam; const EvtIncomingICMPICMPParam * eicmparam; const struct tcphdr *tcp; const struct udphdr *udp; const struct icmp_echo_header_s * echo; const struct ip * ip; const struct icmp * icmp; if(global_output_style==1 && code!=EVT_RPT_PACKET_LIST_END && code!=EVT_RPT_PACKET_INFO) printf("\n",sess->sport,sess->dport); else printf ("Autoconfigured to source port %d, destination port %d.\n",sess->sport, sess->dport); } break; case EVT_ADDRESS_INITIALIZED: if(global_output_style<2) { print_host (sess, sess->local_address); if(global_output_style==1) { printf(" protocol=\"%d\"",sess->protocol); if(sess->protocol!=2 && sess->protocol!=3) { if (sess->random_source) printf (" rndsport=\"1\" sport=\"%d\"", sess->sport); else printf (" rndsport=\"0\" sport=\"%d\"", sess->sport); } printf(" />\n"); } else { if(!global_output_style) { if(sess->protocol==2 || sess->protocol==3) printf("\n"); else if (sess->random_source) printf (":%d (pseudo-random)\n", sess->sport); else printf (":%d\n", sess->sport); } } } break; case EVT_SENT_PACKET: spparam=(const EvtSentPacketParam *)params; if(global_output_style==1) { printf(" protocol=\"%d\" ttl=\"%d\"", sess->protocol, spparam->nhop+1); if(!sess->protocol || sess->protocol==4) { int flcnt=0; printf(" seq=\"%u\" xflags=\"%#x\" flags=\"", spparam->tseq, spparam->flags); if (spparam->flags & TH_RST) { printf ("RST"); flcnt++; } if (spparam->flags & TH_ACK) { if(flcnt) printf(";"); printf("ACK"); flcnt++; } if (spparam->flags & TH_SYN) { if(flcnt) printf(";"); printf ("SYN"); flcnt++; } if (spparam->flags & TH_FIN) { if(flcnt) printf(";"); printf ("FIN"); flcnt++; } if(!flcnt) printf("none"); printf("\" />\n"); } else if(sess->protocol==1) { printf(" dport=\"%d\" />\n", (sess->dport + spparam->tttl)); } else { printf(" />\n"); } } else if(!global_output_style) { if(!sess->protocol || sess->protocol==4) { printf("SENT TCP TTL=%d SEQ=%u FLAGS=%#x ( ", spparam->nhop+1, spparam->tseq, spparam->flags); if (spparam->flags & TH_RST) printf ("RST "); if (spparam->flags & TH_ACK) printf ("ACK "); if (spparam->flags & TH_SYN) printf ("SYN "); if (spparam->flags & TH_FIN) printf ("FIN "); printf(")\n"); } else if(sess->protocol==1) { printf("SENT UDP TTL=%d DPORT=%d\n", spparam->nhop+1, (sess->dport + spparam->tttl)); } else { printf("SENT ICMP TTL=%d\n", spparam->nhop+1); } } break; case EVT_SHOW_PAYLOAD: packet=(const struct trace_packet_s *)params; if(global_output_style==1) { if(!packet->payload_len) printf(" payloadlen=\"%d\" />\n", packet->payload_len); else printf(" payloadlen=\"%d\">%s\n", packet->payload_len, packet->payload); } else if(!global_output_style) { if(!packet->payload_len) printf("Payload: Length=%d Contents=EMPTY\n", packet->payload_len); else printf("Payload: Length=%d Contents=\"%s\"\n", packet->payload_len, packet->payload); } break; case EVT_SHOW_UDP_CHECKSUM: packet=(const struct trace_packet_s *)params; if(global_output_style==1) printf(" udpsum=\"%#x\"/>\n",packet->udp_hdr.uh_sum); else if(!global_output_style) printf("UDP Checksum = %#x\n",packet->udp_hdr.uh_sum); break; case EVT_SHOW_TCP_CHECKSUM: packet=(const struct trace_packet_s *)params; if(global_output_style==1) printf(" tcpsum=\"%#x\"/>\n",packet->tcp_hdr.th_sum); else if(!global_output_style) printf("TCP Checksum = %#x\n",packet->tcp_hdr.th_sum); break; case EVT_SHOW_HOPS: if(global_output_style==1) printf(" uphops=\"%d\" />\n", (int)(*((const short *)params))); else if(!global_output_style) printf("Upping states of the hops following %d\n", (int)(*((const short *)params))); break; case EVT_SHOW_NUM_HOPS: if(global_output_style<2) { if(global_output_style) printf(" numhops=\"%d\" />\n", (sess->num_hops+1)); else printf ("Concluding with %d hops.\n", (sess->num_hops+1)); } break; case EVT_TRACE_COMPLETED: if(global_output_style<2) { if(global_output_style) { printf(" />\n"); } else { if (sess->num_hops && !sess->nostatus && !sess->noisy) printf ("T\n"); else if (!sess->noisy && !sess->nostatus) printf ("\n"); } } break; case EVT_ON_RESOLUTION: if(global_output_style<2) { if(global_output_style) { printf(" asresolutiontype=\""); if(sess->use_radb) printf ("RADB"); else if(sess->use_cymru) printf ("Cymru"); else if(sess->use_ris) printf ("RIPE"); else printf ("PWhoIs"); printf("\" />\n"); } else { if(sess->use_radb) printf ("Using RADB for in-line AS resolution...\n"); else if(sess->use_cymru) printf ("Using Cymru for bulk AS resolution...\n"); else if(sess->use_ris) printf ("Using RIPE NCC RIS for bulk AS resolution...\n"); else printf ("Using Prefix WhoIs for bulk AS resolution...\n"); } } break; case EVT_TRACE_REPORT_START: if(global_output_style<2) { if(!global_output_style) printf ("TTL LFT trace to "); print_host (sess, sess->remote_address); if(global_output_style) { printf(" protocol=\"%d\"",sess->protocol); switch(sess->protocol) { case 0: printf(" protocolname=\"TCP\" dport=\"%d\" />\n",sess->dport); break; case 4: printf(" protocolname=\"TCP\" dportrange=\"%d-%d\" />\n",sess->dport,(sess->dport + (*((const int *)params)))); break; case 1: printf(" protocolname=\"UDP\" dportrange=\"%d-%d\" />\n",sess->dport,(sess->dport + (*((const int *)params)))); break; case 2: printf(" protocolname=\"ICMP\" />\n"); break; case 3: printf(" protocolname=\"RFC1393\" />\n"); break; } } else { switch(sess->protocol) { case 0: printf(":%d/tcp\n",sess->dport); break; case 4: printf(":%d-%d/tcp\n",sess->dport, (sess->dport + (*((const int *)params)))); break; case 1: printf(":%d-%d/udp\n",sess->dport, (sess->dport + (*((const int *)params)))); break; case 2: printf("/icmp\n"); break; case 3: printf("/rfc1393\n"); break; } } } break; case EVT_RPT_NO_REPLY: if(global_output_style<2) { nrparam=(const EvtNoReplyParam *)params; if(global_output_style) { printf(" firstholehop=\"%d\" lastholehop=\"%d\" />\n", nrparam->hopno - nrparam->noreply + 1, nrparam->hopno); } else { if (nrparam->noreply == 1) printf("** [neglected] no reply packets received from TTL %d\n", nrparam->hopno); if (nrparam->noreply > 1) printf("** [neglected] no reply packets received from TTLs %d through %d\n", nrparam->hopno - nrparam->noreply + 1, nrparam->hopno); } } break; case EVT_RPT_FRW_INSPECT_PACKS: if(global_output_style<2) { if(global_output_style) printf(" />\n"); else printf("** [firewall] the next gateway may statefully inspect packets\n"); } break; case EVT_RPT_FRW_STATE_FILTER: if(global_output_style<2) { if(global_output_style) printf(" />\n"); else printf("** [firewall] the next gateway may implement a flag-based state filter\n"); } break; case EVT_RPT_BSD_BUG: if(global_output_style<2) { if(global_output_style) printf(" />\n"); else printf("** [4.2-3 BSD bug?] the next gateway may errantly reply with reused TTLs\n"); } break; case EVT_RPT_PACKET_INFO: if(global_output_style<2) { EvtPacketInfoDefaultHandler(sess, (const EvtPacketInfoParam *)params); } break; case EVT_RPT_PACKET_LIST_END: if(global_output_style<2) { if(global_output_style) printf("\" />\n"); else printf ("ms\n"); } break; case EVT_RPT_HOP_INFO_START: if(global_output_style<2) { if(global_output_style) printf (" index=\"%2d\"", (*((const int *)params)) + 1); else printf ("%2d ", (*((const int *)params)) + 1); } break; case EVT_RPT_NO_HOPS: if(global_output_style<2) { if(global_output_style) { printf(" protocol=\"%d\"",sess->protocol); if(sess->protocol==0 || sess->protocol==4) printf(" protocolname=\"TCP\""); else if(sess->protocol==1) printf(" protocolname=\"UDP\""); else printf(" protocolname=\"ICMP\""); if(sess->target_anomaly) printf(" targetanomaly=\"1\""); if(sess->target_anomaly || sess->protocol==0) printf(" dport=\"%d\"",sess->dport); if(!sess->target_anomaly && (sess->protocol==1 || sess->protocol==4)) printf(" dportrange=\"%d-%d\"",sess->dport,(sess->dport + (*((const int *)params)))); printf(" />\n"); } else { if (sess->target_anomaly) printf("** [%d/tcp sequence anomaly from target] Try advanced options (use -VV to see packets).\n", sess->dport); else if (sess->protocol==1) printf("** [%d-%d/udp no reply from target] Use -VV to see packets.\n", sess->dport, (sess->dport + (*((const int *)params)))); else if (sess->protocol==0) printf("** [%d/tcp no reply from target] Try advanced options (use -VV to see packets).\n", sess->dport); else if (sess->protocol==4) printf("** [%d-%d/tcp no reply from target] Use -VV to see packets.\n", sess->dport, (sess->dport + (*((const int *)params)))); else printf("** [icmp no reply from target] Try advanced options (use -VV to see packets).\n"); } } break; case EVT_RPT_TIME_TRACE: if(global_output_style<2) { gettimeofday (&(sess->now), NULL); #if defined( __CYGWIN__ ) || defined( WIN32 ) || defined(_WIN32) if(!sess->UseLocalTime) (void)strftime(tbuf, sizeof(tbuf), time_format, (struct tm *) gmtime((time_t *) &(sess->now.tv_sec))); else #endif (void)strftime(tbuf, sizeof(tbuf), time_format, (struct tm *)localtime((time_t *) &(sess->now.tv_sec))); if(global_output_style) { printf (" finishtime=\"%s\"", tbuf); printf (" elapsed=\"%.2f\"",(timediff_ms(sess->begin_time, sess->now) / 1000)); printf (" tracingtime=\"%.2f\"", (timediff_ms(sess->begin_time, sess->trace_done_time) / 1000)); if (sess->resolve_names || sess->do_aslookup || sess->do_netlookup) printf(" resolvingtime=\"%.2f\"", (timediff_ms(sess->trace_done_time, sess->now) / 1000)); printf(" />\n"); } else { printf ("LFT trace finished at %s", tbuf); printf (" (%.2fs elapsed)",(timediff_ms(sess->begin_time, sess->now) / 1000)); if (sess->noisy) { printf ("\nTime spent tracing: %.2fs", (timediff_ms(sess->begin_time, sess->trace_done_time) / 1000)); if (sess->resolve_names || sess->do_aslookup || sess->do_netlookup) printf(", resolving: %.2fs", (timediff_ms(sess->trace_done_time, sess->now) / 1000)); } printf("\n"); } } break; case EVT_ON_EXIT: if(global_output_style==1) printf(" />\n"); sess->exit_state=-100; if(global_output_style==2) GraphVizOutput(sess); break; case EVT_TTL_NO_REPLY: if(global_output_style<2) { if(global_output_style) printf(" ttl=\"%d\" />\n", (*((const int *)params))); else printf("No reply on TTL %d\n", (*((const int *)params))); } break; case EVT_PROGRESS_NO_REPLY: if(global_output_style<2) { if(global_output_style) printf(" />\n"); else printf("*"); } break; case EVT_PROGRESS_SKIP_PACKET: if(global_output_style<2) { if(global_output_style) printf(" />\n"); else printf("?"); } break; case EVT_TTL_TOUT_RESEND: if(global_output_style<2) { if(global_output_style) printf(" ttl=\"%d\" />\n", (*((const int *)params))); else printf("TTL %d timed out, (resending)\n",(*((const int *)params))); } break; case EVT_TTL_TOUT_GIVINGUP: if(global_output_style<2) { if(global_output_style) printf(" ttl=\"%d\" />\n", (*((const int *)params))); else printf("TTL %d timed out, (giving up)\n",(*((const int *)params))); } break; case EVT_DBG_CHECKPOINT1: if(global_output_style<2) { edcpparam=(const EvtDebugCheckpoint1Param *)params; if(global_output_style) { printf (" hilength=\"%d\" last_return=\"%d\"", sess->hop_info_length, edcpparam->last_return); printf (" no_reply=\"%d\" ahead_limit=\"%d\"", edcpparam->no_reply, sess->ahead_limit); printf (" num_hops=\"%d\" need_reply=\"%d\" />\n", sess->num_hops, edcpparam->need_reply); } else { printf ("| hilength %d, last_return %d\n", sess->hop_info_length, edcpparam->last_return); printf ("| no_reply %d, ahead_limit %d\n", edcpparam->no_reply, sess->ahead_limit); printf ("| num_hops %d, need_reply %d\n", sess->num_hops, edcpparam->need_reply); } } break; case EVT_CANT_RELIABLY_RTRIP: if(global_output_style<2) { if(global_output_style) printf(" />\n"); else printf("LFT can\'t reliably round-trip. Close-proximity filter in the way?\n"); } break; case EVT_HAVE_UNANSWERRED_HOPS: if(global_output_style<2) { if(global_output_style) printf(" />\n"); else printf("I still have unanswered hops.\n"); } break; case EVT_TOO_FAR_AHEAD: if(global_output_style<2) { if(global_output_style) printf(" />\n"); else printf("I\'m too far ahead, returning.\n"); } break; case EVT_HAVE_GAPS: if(global_output_style<2) { if(global_output_style) printf(" />\n"); else printf("I know the distance to the target, but I have gaps to fill. Returning...\n"); } break; case EVT_EITHER_RESP_OR_TOUT: if(global_output_style<2) { if(global_output_style) printf(" />\n"); else printf("Everyone either responded or timed out. "); } break; case EVT_LOOKFOR_UNINC_ACK: if(global_output_style<2) { if(global_output_style) printf(" />\n"); else printf("\nNo match in sequence check, looking for a match inside seq-.\n"); } break; case EVT_LOOKFOR_OFF_BY_LEN: if(global_output_style<2) { if(global_output_style) printf(" />\n"); else printf("No match in seq-, looking for a match inside seq+len.\n"); } break; case EVT_LOOKFOR_LAST_RESORT: if(global_output_style<2) { if(global_output_style) printf(" />\n"); else printf("No match in seq+len, looking for a match inside last resort loop.\n"); } break; case EVT_SKIP_PACKET: if(global_output_style<2) { if(global_output_style) printf(" />\n"); else printf("(packet not meant for us, skip)\n"); } break; case EVT_ACK_WAS_NOT_INC: if(global_output_style<2) { enspparam=(const EvtNonSeqPacketParam *)params; if(global_output_style) printf (" src=\"%s\" pttl=\"%d\" />\n", inet_ntoa (enspparam->ipaddr), enspparam->tp->hopno+1); else { printf ("SRC=%s PTTL=%d\n", inet_ntoa (enspparam->ipaddr), enspparam->tp->hopno+1); printf ("Target\'s ACK was not incremented. "); } } break; case EVT_RST_REL_TO_ISN: if(global_output_style<2) { enspparam=(const EvtNonSeqPacketParam *)params; if(global_output_style) { printf (" src=\"%s\" pttl=\"%d\"", inet_ntoa (enspparam->ipaddr), enspparam->tp->hopno+1); printf (" payloadlen=\"%d\" />\n", sess->payloadlen); } else { printf ("SRC=%s PTTL=%d\n", inet_ntoa (enspparam->ipaddr), enspparam->tp->hopno+1); printf ("Target\'s RST relates to the ISN + payload length (%d). ", sess->payloadlen); } } break; case EVT_ACK_WAS_WAY_OFF: if(global_output_style<2) { enspparam=(const EvtNonSeqPacketParam *)params; if(global_output_style) printf (" src=\"%s\" pttl=\"%d\" />\n", inet_ntoa (enspparam->ipaddr), enspparam->tp->hopno+1); else { printf ("SRC=%s PTTL=%d\n", inet_ntoa (enspparam->ipaddr), enspparam->tp->hopno+1); printf ("Target\'s ACK was way off. "); } } break; case EVT_DUPLICATE_PACKET: if(global_output_style<2) { if(global_output_style) printf(" />\n"); else printf ("(duplicate packet, skip)\n"); } break; case EVT_PROGRESS_DUPLICATE: if(global_output_style<2) { if(global_output_style) printf(" />\n"); else printf("!"); } break; case EVT_RECV_PACKET: if(global_output_style<2) { erpparam=(const EvtRecvPacketParam *)params; if(global_output_style) printf (" src=\"%s\" pttl=\"%d\" pseq=\"%u\" />\n", inet_ntoa (erpparam->ipaddr), erpparam->tp->hopno+1, erpparam->seq); else printf ("SRC=%s PTTL=%d PSEQ=%u\n", inet_ntoa (erpparam->ipaddr), erpparam->tp->hopno+1, erpparam->seq); } break; case EVT_PROGRESS_OK: if(global_output_style<2) { if(global_output_style) printf(" />\n"); else printf("."); } break; case EVT_TCP_PORT_CLOSED: if(global_output_style<2) { if(global_output_style) printf (" dport=\"%d\" />\n", sess->dport); else printf ("Port %d/tcp appears to be closed; target sent RST.\n", sess->dport); } break; case EVT_TCP_PORT_OPEN: if(global_output_style<2) { if(global_output_style) printf (" dport=\"%d\" />\n", sess->dport); else printf ("Port %d/tcp open; target attempted handshake.\n", sess->dport); } break; case EVT_PROCESS_PACKET_START: if(global_output_style<2) { if(global_output_style) printf(" />\n"); else printf("Received new data from packet capture; processing.\n"); } break; case EVT_UDP_NOT_FOR_US: if(global_output_style<2) { if(global_output_style) printf(" />\n"); else { if (sess->noisy>3) printf("Not for us\n"); else printf("?"); } } break; case EVT_INCOMING_ICMP_ICMP: if(global_output_style<2) { eicmparam=(const EvtIncomingICMPICMPParam *)params; if(global_output_style) { printf(" src=\"%s\" proto=\"%d\" ttl=\"%d\"", inet_ntoa(eicmparam->ip->ip_src), eicmparam->ip->ip_p, eicmparam->ip->ip_ttl); printf(" protocolname=\"ICMP\""); if (eicmparam->icmp->icmp_type == ICMP_TIMXCEED) printf(" icmptype=\"ICMP_TIMXCEED\""); else if (eicmparam->icmp->icmp_type == ICMP_UNREACH) printf(" icmptype=\"ICMP_UNREACH\""); printf(" echoid=\"%d\" echoseq=\"%d\"",(int)eicmparam->echo->id, (int)eicmparam->echo->sequence); printf(" />\n"); } else { printf("INCOMING IP: SRC=%s PROTO=%d TTL=%d\n", inet_ntoa(eicmparam->ip->ip_src), eicmparam->ip->ip_p, eicmparam->ip->ip_ttl); printf("\\->ICMP+ICMP: "); if (eicmparam->icmp->icmp_type == ICMP_TIMXCEED) printf("TTL exceeded; "); else if (eicmparam->icmp->icmp_type == ICMP_UNREACH) printf("unreachable; "); printf("ICMP echo ID=%d SEQ=%d\n",(int)eicmparam->echo->id, (int)eicmparam->echo->sequence); } } break; case EVT_INCOMING_ICMP_Echo: if(global_output_style<2) { eiiiparam=(const EvtIncomingICMPEchoParam *)params; if(global_output_style) { printf(" src=\"%s\" proto=\"%d\" ttl=\"%d\"", inet_ntoa(eiiiparam->ip->ip_src), eiiiparam->ip->ip_p, eiiiparam->ip->ip_ttl); printf(" protocolname=\"ECHO\" echoid=\"%d\" echoseq=\"%d\"",(int)eiiiparam->echo->id, (int)eiiiparam->echo->sequence); printf(" />\n"); } else { printf("INCOMING IP: SRC=%s PROTO=%d TTL=%d\n", inet_ntoa(eiiiparam->ip->ip_src), eiiiparam->ip->ip_p, eiiiparam->ip->ip_ttl); printf("\\->ICMP+ICMP echo: "); printf("ICMP echo ID=%d SEQ=%d\n",(int)eiiiparam->echo->id, (int)eiiiparam->echo->sequence); } } break; case EVT_INCOMING_ICMP_UDP: if(global_output_style<2) { eiiuparam=(const EvtIncomingICMPUDPParam *)params; if(global_output_style) { printf(" src=\"%s\" proto=\"%d\" ttl=\"%d\"", inet_ntoa (eiiuparam->orig_ip->ip_src), eiiuparam->ip->ip_p, eiiuparam->ip->ip_ttl); if (eiiuparam->icmp->icmp_type == ICMP_TIMXCEED) printf(" icmptype=\"ICMP_TIMXCEED\""); else if (eiiuparam->icmp->icmp_type == ICMP_UNREACH) printf(" icmptype=\"ICMP_UNREACH\""); printf(" protocolname=\"UDP\" sport=\"%d\" dport=\"%d\"",(ntohs (eiiuparam->udp->uh_sport)), (ntohs (eiiuparam->udp->uh_dport))); printf(" />\n"); } else { printf("INCOMING IP: SRC=%s PROTO=%d TTL=%d\n", inet_ntoa (eiiuparam->orig_ip->ip_src), eiiuparam->ip->ip_p, eiiuparam->ip->ip_ttl); printf("\\->ICMP+UDP: "); if (eiiuparam->icmp->icmp_type == ICMP_TIMXCEED) printf("TTL exceeded; "); else if (eiiuparam->icmp->icmp_type == ICMP_UNREACH) printf("unreachable; "); printf("UDP SPORT=%d DPORT=%d\n", (ntohs (eiiuparam->udp->uh_sport)), (ntohs (eiiuparam->udp->uh_dport))); } } break; case EVT_INCOMING_ICMP_TCP: if(global_output_style<2) { eiitparam=(const EvtIncomingICMPTCPParam *)params; if(global_output_style) { printf(" src=\"%s\" proto=\"%d\" ttl=\"%d\"", inet_ntoa (eiitparam->orig_ip->ip_src), eiitparam->ip->ip_p, eiitparam->ip->ip_ttl); if (eiitparam->icmp->icmp_type == ICMP_TIMXCEED) printf(" icmptype=\"ICMP_TIMXCEED\""); else if (eiitparam->icmp->icmp_type == ICMP_UNREACH) printf(" icmptype=\"ICMP_UNREACH\""); printf(" protocolname=\"TCP\" sport=\"%d\" dport=\"%d\"",(ntohs (eiitparam->tcp->th_sport)), (ntohs (eiitparam->tcp->th_dport))); printf(" />\n"); } else { printf("INCOMING IP: SRC=%s PROTO=%d TTL=%d\n", inet_ntoa (eiitparam->orig_ip->ip_src), eiitparam->ip->ip_p, eiitparam->ip->ip_ttl); printf("\\->ICMP+TCP: "); if (eiitparam->icmp->icmp_type == ICMP_TIMXCEED) printf("TTL exceeded; "); else if (eiitparam->icmp->icmp_type == ICMP_UNREACH) printf("unreachable; "); printf("TCP SPORT=%d DPORT=%d\n", (ntohs (eiitparam->tcp->th_sport)), (ntohs (eiitparam->tcp->th_dport))); } } break; case EVT_RCVD_ICMP_Echo: if(global_output_style<2) { echo=(const struct icmp_echo_header_s *)params; if(global_output_style) printf(" id=\"%d\" seq=\"%d\" />\n",(int)echo->id, (int)echo->sequence); else printf("RCVD ICMP echo ID=%d SEQ=%d ",(int)echo->id, (int)echo->sequence); } break; case EVT_RCVD_ICMP_ICMP: if(global_output_style<2) { icmp=(const struct icmp *)params; if(global_output_style) printf(" icmptype=\"%d\" icmpcode=\"%d\" />\n",(int)icmp->icmp_type,(int)icmp->icmp_code); else printf("RCVD ICMP type=%d code=%d ",(int)icmp->icmp_type,(int)icmp->icmp_code); } break; case EVT_RCVD_ICMP_UDP: if(global_output_style<2) { udp=(const struct udphdr *)params; if(global_output_style) printf(" seq=\"%u\" />\n",((ntohs (udp->uh_dport)) - sess->dport)); else printf ("RCVD ICMP SEQ=%u ", ((ntohs (udp->uh_dport)) - sess->dport)); } break; case EVT_RCVD_ICMP_TCP: if(global_output_style<2) { tcp=(const struct tcphdr *)params; if(global_output_style) printf(" seq=\"%u\" />\n",ntohl (tcp->th_seq)); else printf ("RCVD ICMP SEQ=%u ", ntohl (tcp->th_seq)); } break; case EVT_RCVD_TCP: if(global_output_style<2) { tcp=(const struct tcphdr *)params; if(global_output_style) { int flcnt=0; printf(" xflags=\"%#x\" flags=\"", tcp->th_flags); if (tcp->th_flags & TH_RST) { printf ("RST"); flcnt++; } if (tcp->th_flags & TH_ACK) { if(flcnt) printf(";"); printf("ACK"); flcnt++; } if (tcp->th_flags & TH_SYN) { if(flcnt) printf(";"); printf ("SYN"); flcnt++; } if (tcp->th_flags & TH_FIN) { if(flcnt) printf(";"); printf ("FIN"); flcnt++; } if(!flcnt) printf("none\""); else printf("\""); printf (" seq=\"%u\" ack=\"%u\"", ntohl (tcp->th_seq), ntohl (tcp->th_ack)); printf(" />\n"); } else { printf("RCVD TCP FLAGS=%#x ( ",tcp->th_flags); if (tcp->th_flags & TH_SYN) printf ("SYN "); if (tcp->th_flags & TH_ACK) printf ("ACK "); if (tcp->th_flags & TH_FIN) printf ("FIN "); if (tcp->th_flags & TH_RST) printf ("RST "); printf (") SEQ=%u ACK=%u ", ntohl (tcp->th_seq), ntohl (tcp->th_ack)); } } break; case EVT_RCVD_UNKNOWN: if(global_output_style<2) { ip=(const struct ip *)params; if(global_output_style) { printf(" protocolcode=\"%d\"", ip->ip_p); #if defined(WIN32) || defined(_WIN32) printf(" ipfrom=\"%d.%d.%d.%d\" ipto=\"%d.%d.%d.%d\"", (int)ip->ip_src.s_net,(int)ip->ip_src.s_host,(int)ip->ip_src.s_lh,(int)ip->ip_src.s_impno, (int)ip->ip_dst.s_net,(int)ip->ip_dst.s_host,(int)ip->ip_dst.s_lh,(int)ip->ip_dst.s_impno); #endif printf(" />\n"); } else { printf("Incoming datagram contains unsupported protocol %d.\n", ip->ip_p); #if defined(WIN32) || defined(_WIN32) if (sess->noisy > 4) printf("\t(from %d.%d.%d.%d to %d.%d.%d.%d)\n", (int)ip->ip_src.s_net,(int)ip->ip_src.s_host,(int)ip->ip_src.s_lh,(int)ip->ip_src.s_impno, (int)ip->ip_dst.s_net,(int)ip->ip_dst.s_host,(int)ip->ip_dst.s_lh,(int)ip->ip_dst.s_impno); #endif } } break; case EVT_DEVICE_SELECTED: if(global_output_style<2) { if(global_output_style) printf (" device=\"%s\" linktype=\"%d\" linktypename=\"%s\" />\n", sess->pcap_dev, sess->pcap_datalink, pcap_datalink_val_to_name(sess->pcap_datalink)); else printf ("Receiving on %s, type %d (%s), transmitting on %s as ", sess->pcap_dev, sess->pcap_datalink, pcap_datalink_val_to_name(sess->pcap_datalink), sess->pcap_send_dev); } break; case EVT_SHOW_INITIAL_SEQNUM: if(global_output_style<2) { if(global_output_style) printf (" seqstart=\"%d\" />\n", sess->seq_start); else { printf ("Receive link type is %s (%d), skipping %0d bytes\n", pcap_datalink_val_to_name(sess->pcap_datalink),sess->pcap_datalink,sess->skip_header_len); printf ("Transmit Initial Sequence Number (ISN) will be %d\n", sess->seq_start); } } break; case EVT_TRACE_START: if(global_output_style<2) { if(global_output_style) { memset(&tbuf, 0, sizeof(tbuf)); #if defined( __CYGWIN__ ) || defined( WIN32 ) || defined(_WIN32) if(!sess->UseLocalTime) (void)strftime(tbuf, sizeof(tbuf), time_format, (struct tm *) gmtime((time_t *) &(sess->begin_time.tv_sec))); else #endif (void)strftime(tbuf, sizeof(tbuf), time_format, (struct tm *) localtime((time_t *) &(sess->begin_time.tv_sec))); printf (" begtime=\"%s\" />\n", tbuf); } else { if (sess->timetrace) { memset(&tbuf, 0, sizeof(tbuf)); #if defined( __CYGWIN__ ) || defined( WIN32 ) || defined(_WIN32) if(!sess->UseLocalTime) (void)strftime(tbuf, sizeof(tbuf), time_format, (struct tm *) gmtime((time_t *) &(sess->begin_time.tv_sec))); else #endif (void)strftime(tbuf, sizeof(tbuf), time_format, (struct tm *) localtime((time_t *) &(sess->begin_time.tv_sec))); printf ("LFT trace started at %s\n", tbuf); } if (!sess->nostatus && !sess->noisy) printf("Tracing "); } } break; case EVT_DBG_CHECKPOINT2: if(global_output_style<2) { if(global_output_style) printf(" />\n"); else printf("Left dispatch.\n"); } break; case EVT_DBG_LOG_MESSAGE: if(global_output_style<2) { if(global_output_style) printf(">%s\n",(const char *)params); else printf("%s",(const char *)params); } break; case EVT_OCHECK_START: if(global_output_style<2) { if(global_output_style) { print_host (sess, sess->remote_address); printf(" dport=\"%d\" />\n",sess->dport); } else if(sess->noisy) { printf("TCP open checking started for "); print_host (sess, sess->remote_address); printf(" port %d.\n",sess->dport); } } break; case EVT_OCHECK_OPEN: if(global_output_style<2) { if(global_output_style) { print_host (sess, sess->remote_address); printf(" dport=\"%d\" />\n",sess->dport); } else if(sess->noisy) { printf("TCP port %d is open on ",sess->dport); print_host (sess, sess->remote_address); printf(".\n"); } } break; } } /*---------------------------------------------------------------------------*/ static LFT_CALLBACK LFTErrHandler=LFTDefaultErrorHandler; static LFT_CALLBACK LFTEvtHandler=LFTDefaultEventHandler; /*---------------------------------------------------------------------------*/ void LFTInitializeCallbacks(LFT_CALLBACK error_handler, LFT_CALLBACK event_handler) { if(error_handler) LFTErrHandler=error_handler; else LFTErrHandler=LFTDefaultErrorHandler; if(event_handler) LFTEvtHandler=event_handler; else LFTEvtHandler=LFTDefaultEventHandler; } /*---------------------------------------------------------------------------*/ lft_session_params * LFTSessionOpen(void) { lft_session_params * sess= (lft_session_params *)malloc(sizeof(lft_session_params)); memset(sess, 0,sizeof(lft_session_params)); sess->scatter_ms = 20; sess->ttl_min = 0; sess->hop_info_length = 0; sess->hop_info=NULL; sess->tcp_flags = TH_SYN; sess->use_fins = 0; sess->seq_start = 0; /* generate ISN internally by default */ sess->dport = 80; /* set default destination to tcp/80 HTTP */ sess->sport = 53; /* set default source to tcp/53 dns-xfer */ sess->auto_ports = 1; /* enable port autoselection by default */ sess->random_source = 0; /* disable random source port by default */ sess->set_tos = 0; /* disable set ToS bit by default */ sess->userlen = 0; /* user-requested packet length */ sess->payloadlen = 0; /* the final probe payloadlength */ sess->payload = NULL; sess->win_len = 32768; sess->timeout_ms = 250; /* timeout between retries */ sess->retry_max = 2; /* number of retries before giving up */ sess->retry_min = 1; /* minimum number of checks per hop */ sess->ahead_limit = 5; /* number of probes we can send * without replies if we don't know * the number of hops */ sess->dflag = 0; sess->ttl_limit = 30; /* max # hops to traverse (highest TTL) */ sess->break_on_icmp = 1; /* break on icmp other than time exceeded */ sess->noisy = 0; /* disable verbose debug by default */ sess->nostatus = 0; /* print status bar by default */ sess->userdevsel = 0; /* by default, we'll select the device */ sess->senddevsel = 0; /* by default, we won't use a spoof device */ sess->resolve_names = 1; /* dns resolution enabled by default */ sess->hostnames_only = 0; /* disable printing of IP addresses */ sess->timetrace = 0; /* disable tracer timing by default */ sess->adaptive = 0; /* disable state engine by default */ sess->protocol = 0; /* use UDP instead of TCP */ sess->do_netlookup = 0; /* disable netname lookup by default */ sess->do_aslookup = 0; /* disable asn lookup by default */ sess->use_radb = 0; /* use RADB instead of pwhois */ sess->use_cymru = 0; /* use Cymru instead of pwhois */ sess->use_ris = 0; /* use RIPE NCC RIS instead of pwhois */ sess->num_hops = 0; /*sess->num_sent = 0;*/ sess->num_rcvd = 0; sess->target_open = 0; sess->target_filtered = 0; sess->target_anomaly = 0; sess->hostname = NULL; sess->hostname_lsrr_size = 0; SLIST_INIT(&(sess->trace_packets)); sess->trace_packets_num = 0; sess->pcap_dev = NULL; sess->pcap_datalink = -1; sess->pcap_send_dev = NULL; sess->userdev = NULL; sess->senddev = NULL; sess->send_sock = 0; sess->btcpmap = NULL; sess->btcpmapsize = 0; sess->btcpdpucnt = 0; sess->trg_probe_is_sent = 0; sess->icmp_packet.packet = NULL; #if defined( __CYGWIN__ ) || defined( WIN32 ) || defined(_WIN32) sess->recv_sock = 0; sess->wsastarted = 0; #else sess->pcapdescr = 0; #endif sess->UseLocalTime=1; sess->exit_state=0; sess->is_graphviz_subquery=0; sess->check_seam=0; sess->graphviz_icon_path=NULL; /*sess->wsess=w_init();*/ return sess; } /*---------------------------------------------------------------------------*/ void LFTSessionClose(lft_session_params * sess) { struct trace_packet_info_s *tp; if(sess->hop_info) free(sess->hop_info); if(sess->send_sock > 0) #if defined(WIN32) || defined(_WIN32) closesocket(sess->send_sock); #else close(sess->send_sock); #endif #if defined(WIN32) || defined(_WIN32) if(sess->pcap_dev != NULL) free(sess->pcap_dev); if(sess->recv_sock > 0) closesocket(sess->send_sock); #else if(sess->pcapdescr != 0) { pcap_close(sess->pcapdescr); sess->pcapdescr=0; } #endif while(SLIST_FIRST(&(sess->trace_packets))) { tp=SLIST_FIRST(&(sess->trace_packets)); SLIST_REMOVE_HEAD(&(sess->trace_packets), next); free(tp); } if(sess->payload) free(sess->payload); if(sess->icmp_packet.packet) free(sess->icmp_packet.packet); if(sess->btcpmap) free(sess->btcpmap); free(sess); } /*---------------------------------------------------------------------------*/ /*Use TCP FIN packets exclusively (defaults are SYN)*/ int LFTSetupFIN(lft_session_params * sess) { if (sess->adaptive) { LFTErrHandler(sess, WRN_CANT_SETUP_FIN, NULL); return 0; } sess->tcp_flags = TH_FIN; sess->use_fins = 1; sess->dport = 25000; sess->auto_ports = 0; return 1; } /*---------------------------------------------------------------------------*/ /*Display hosts symbolically; suppress IP address display*/ int LFTSetupDispSymbHost(lft_session_params * sess) { if(!sess->resolve_names) { LFTErrHandler(sess, WRN_CANT_DISP_HOST_NAMES, NULL); return 0; } sess->hostnames_only = 1; return 1; } /*---------------------------------------------------------------------------*/ int LFTSetupUDPMode(lft_session_params * sess) { int prev_protocol; char tmp[30]; prev_protocol = sess->protocol; sess->protocol = 1; if(sess->adaptive) { LFTErrHandler(sess, WRN_ADAPTIVE_DISABLED_BY_UDP, NULL); sess->adaptive = 0; } if(sess->use_fins) { LFTErrHandler(sess, WRN_FIN_DISABLED_BY_UDP, NULL); sess->use_fins = 0; } if(!sess->dflag) sess->dport = (start_dport - 1); else { if(!prev_protocol) { sprintf(tmp,"%d",sess->dport); LFTSetupDestinationPort(sess, tmp); } } sess->auto_ports = 0; return 1; } /*---------------------------------------------------------------------------*/ int LFTSetupRISLookup(lft_session_params * sess) { int asnlkptp=ASN_LOOKUP_RIS; if(sess->use_cymru || sess->use_radb){ LFTErrHandler(sess, WRN_ONLY_ONE_ASN_LOOKUP, &asnlkptp); return 0; } sess->use_radb = 0; sess->use_ris = 1; sess->use_cymru = 0; sess->do_aslookup = 1; return 1; } /*---------------------------------------------------------------------------*/ int LFTSetupRADBLookup(lft_session_params * sess) { int asnlkptp=ASN_LOOKUP_RADB; if(sess->use_cymru || sess->use_ris){ LFTErrHandler(sess, WRN_ONLY_ONE_ASN_LOOKUP, &asnlkptp); return 0; } sess->use_radb = 1; sess->use_ris = 0; sess->use_cymru = 0; sess->do_aslookup = 1; return 1; } /*---------------------------------------------------------------------------*/ int LFTSetupCYMRULookup(lft_session_params * sess) { int asnlkptp=ASN_LOOKUP_CYMRU; if(sess->use_radb || sess->use_ris){ LFTErrHandler(sess, WRN_ONLY_ONE_ASN_LOOKUP, &asnlkptp); return 0; } sess->use_radb = 0; sess->use_ris = 0; sess->use_cymru = 1; sess->do_aslookup = 1; return 1; } /*---------------------------------------------------------------------------*/ int lft_resolve_port(lft_session_params * sess, const char *strport) { struct addrinfo hint, *ai; struct sockaddr_in addr; char *end; unsigned long port; /* * Check if this is numeric, if so simply convert. */ port = strtoul(strport, &end, 10); if (*end == '\0') { if (port > 65535) { /* XXX Error. Nothing checks for error, though. */ return (-1); } return (port); } /* * This is a named service, look it up. */ memset(&hint, 0, sizeof hint); hint.ai_family = AF_INET; if (sess->protocol == 1) { hint.ai_socktype = SOCK_DGRAM; hint.ai_protocol = IPPROTO_UDP; /* UDP */ } else { hint.ai_socktype = SOCK_STREAM; hint.ai_protocol = IPPROTO_TCP; /* TCP */ } if (getaddrinfo(NULL, strport, &hint, &ai) != 0) { /* XXX Error. Nothing checks for error, though. */ return (-1); } if (ai->ai_addrlen != sizeof addr) { /* XXX Error. Nothing checks for error, though. */ return (-1); } memcpy(&addr, ai->ai_addr, ai->ai_addrlen); return (ntohs(addr.sin_port)); } /*---------------------------------------------------------------------------*/ int LFTSetupDestinationPort(lft_session_params * sess, char * userport) { /* char strport[50]; sprintf(strport,"%u",userport); */ sess->dflag++; if(sess->protocol==1) { if(lft_resolve_port(sess, userport) > (65535 - sess->ttl_limit)) { sess->dport = (65535 - sess->ttl_limit) - 1; LFTErrHandler(sess, WRN_UDP_PORT_TOO_HIGH, &userport); } else sess->dport = lft_resolve_port(sess, userport) - 1; } else { sess->dport = lft_resolve_port (sess, userport); } sess->auto_ports = 0; return 1; } /*---------------------------------------------------------------------------*/ int LFTSetupLengthOfPacket(lft_session_params * sess, int plen) { if(plen > maxpacklen) { LFTErrHandler(sess, WRN_PACKET_LENGTH_TOO_HIGH, &plen); sess->userlen = maxpacklen; } else if(plen < minpacklen) { LFTErrHandler(sess, WRN_PACKET_LENGTH_TOO_LOW, &plen); sess->userlen = 0; } else sess->userlen = plen; return 1; } /*---------------------------------------------------------------------------*/ int LFTSetupDisableResolver(lft_session_params * sess) { if(!sess->hostnames_only) { sess->resolve_names = 0; } else { LFTErrHandler(sess, WRN_CANT_DISABLE_RESOLVER, NULL); } return 1; } /*---------------------------------------------------------------------------*/ int LFTSetupSourcePort(lft_session_params * sess, int port) { if(sess->random_source) { LFTErrHandler(sess, WRN_ALREADY_RANDOM_SPORT, NULL); return 0; } sess->sport = port; return 1; } /*---------------------------------------------------------------------------*/ int LFTSetupAdaptiveMode(lft_session_params * sess) { if (sess->protocol==1) { LFTErrHandler(sess, WRN_ADAPTIVE_DISABLED_BY_UDP, NULL); return 0; } if (sess->use_fins) { LFTErrHandler(sess, WRN_ADAPTIVE_DISABLED_BY_FIN, NULL); return 0; } sess->adaptive = 1; return 1; } /*---------------------------------------------------------------------------*/ int LFTSetupDevice(lft_session_params * sess,char * udev) { if (strlen (udev) > max_net_dev_input) { LFTErrHandler(sess, ERR_DEVNAME_TOO_LONG, NULL); return 0; } sess->userdevsel = 1; sess->userdev = udev; return 1; } /*---------------------------------------------------------------------------*/ int LFTSetupSendDevice(lft_session_params * sess,char * sdev) { if (strlen (sdev) > max_net_dev_input) { LFTErrHandler(sess, ERR_DEVNAME_TOO_LONG, NULL); return 0; } sess->senddevsel = 1; sess->senddev = sdev; return 1; } /*---------------------------------------------------------------------------*/ int LFTSetupUTCTimes(lft_session_params * sess) { #if defined(sun) if (putenv("TZ=GMT0") == -1) { LFTErrHandler(sess, WRN_UNABLE_SETUP_UTC, NULL); } #else #if !defined(WIN32) && !defined(_WIN32) if (setenv("TZ", "GMT0", 1) == -1) { LFTErrHandler(sess, WRN_UNABLE_SETUP_UTC, NULL); } #endif #endif sess->UseLocalTime=0; sess->timetrace = 1; return 1; } /*---------------------------------------------------------------------------*/ /* Refactored part of code */ /*---------------------------------------------------------------------------*/ unsigned int new_seq(lft_session_params * sess) { if (sess->adaptive) { return rand(); } else { return sess->seq_start + sess->trace_packets_num; } } /*---------------------------------------------------------------------------*/ #ifndef SCREWED_IP_LEN u_int32_t ip_cksum (const struct ip *ip) { register const u_short *sp = (u_short *) ip; register u_int32_t sum = 0; register int count; /* * No need for endian conversions. */ for (count = ip->ip_hl * 2; --count >= 0;) sum += *sp++; while (sum > 0xffff) sum = (sum & 0xffff) + (sum >> 16); sum = ~sum & 0xffff; return (sum); } #endif /*---------------------------------------------------------------------------*/ /* A standardized way of calculating checksums */ static unsigned short udp_cksum (unsigned short *addr, signed int len) { unsigned short answer = 0; register unsigned short *w = addr; register int nleft = len; register int sum = 0; while(nleft > 1) { sum += *w++; nleft -= 2; } if(nleft == 1) { *(unsigned char *)(&answer) = *(unsigned char *)w; sum += answer; } sum = (sum>>16) + (sum&0xffff); sum += (sum>>16); answer = ~sum; return (answer); } /*---------------------------------------------------------------------------*/ u_int32_t tcp_cksum (struct ip *ip, struct tcphdr *tcp, const char * payload, int payload_len) { u_int32_t sum = 0; register int count; u_short *sp; u_short *temptcp = (u_short *)malloc(sizeof(struct tcphdr)+payload_len+4); u_int32_t tempip; memset(temptcp, 0,sizeof(struct tcphdr)+payload_len+4); memcpy(temptcp, (char *)tcp, sizeof(struct tcphdr)); memcpy((u_char *)temptcp+sizeof(struct tcphdr),payload,payload_len); sp = temptcp; for(count = (sizeof(struct tcphdr)+payload_len+(sizeof(struct tcphdr)+payload_len)%2)/2; --count >= 0;) sum += *sp++; free(temptcp); memcpy(&tempip, &ip->ip_src, sizeof ip->ip_src); sum += (tempip >> 16) + (tempip & 0xffff); memcpy(&tempip, &ip->ip_dst, sizeof ip->ip_dst); sum += (tempip >> 16) + (tempip & 0xffff); sum += ip->ip_p << 8; sum += htons (sizeof (struct tcphdr)+payload_len); while (sum > 0xffff) sum = (sum & 0xffff) + (sum >> 16); sum = ~sum & 0xffff; return (sum); } /*---------------------------------------------------------------------------*/ static char * strtolower (char *input) { char *iter = input; if (input == NULL) return NULL; while (*iter) { *iter = tolower (*iter); iter++; } return input; } /*---------------------------------------------------------------------------*/ static void do_auto_ports (lft_session_params * sess, char *hostname, int init_dport) { /* * Provides rudimentary auto-select of source and destination ports * based on parsing the hostname supplied by the user * * EXPECTS a string like "mail.example.com" and RETURNS the * auto-selected src and dst ports if changed or NULL if unchanged * * Currently operates on user's input only as a call to * gethostbyaddr() before tracing could slow us down too much */ if (strlen(hostname) > 5) { const char *mailservers[] = { "mail", "smtp", "mx", "relay", "inbound" }; int cnt = 0; hostname = (char *) strtolower(hostname); for (cnt = 0 ; cnt < 5 ; cnt++) { if (strstr(hostname,mailservers[cnt])) { sess->dport = 25; sess->sport = 25; break; } } if (strncmp (hostname,"ftp",3) == 0) { sess->dport = 21; sess->sport = 19021; } else if (strncmp (hostname,"whois",5) == 0) { sess->dport = 43; sess->sport = 19043; } else if (strncmp (hostname,"imap",4) == 0) { sess->dport = 143; sess->sport = 19143; } else if (strncmp (hostname,"pop",3) == 0) { sess->dport = 110; sess->sport = 19110; } else if ((strncmp (hostname,"dns",3) == 0) || (strncmp (hostname,"ns",2) == 0) || (strncmp (hostname,"udns",4) == 0)) { sess->dport = 53; sess->sport = 53; } else if ((strncmp (hostname,"ntp",3) == 0) || (strncmp (hostname,"clock",5) == 0)) { sess->dport = 123; sess->sport = 123; } if (sess->noisy && (sess->dport != init_dport)) LFTEvtHandler(sess,EVT_AUTOCONFIGURED_TO_PORTS, NULL); } } /*---------------------------------------------------------------------------*/ unsigned int get_address(lft_session_params * sess, const char *host) { struct addrinfo hint, *ai; struct sockaddr_in addr; /* * Check if this is numeric, if so simply convert. */ if (inet_aton(host, &addr.sin_addr) == 1) return (addr.sin_addr.s_addr); /* * This is a named host, look it up. */ memset(&hint, 0, sizeof hint); hint.ai_family = AF_INET; if (getaddrinfo(host, NULL, &hint, &ai) != 0) { LFTErrHandler(sess, ERR_UNKNOWN_HOST, host); return (0); } if (ai->ai_addrlen != sizeof addr) { /* * XXX * Is there a better error? */ LFTErrHandler(sess, ERR_UNKNOWN_HOST, host); return (0); } memcpy(&addr, ai->ai_addr, ai->ai_addrlen); return (addr.sin_addr.s_addr); } /*---------------------------------------------------------------------------*/ #if defined( __CYGWIN__ ) || defined( WIN32 ) || defined(_WIN32) /* The Windows/Cygwin version of this function uses the winsock built-in WSAIoctl SIO_ROUTING_INTERFACE_QUERY to find the appropriate interface. */ static char * lft_getifforremote(lft_session_params * sess, const char *remote) { struct sockaddr_in in, out; unsigned long nBytesReturned; /* Only do this once of course */ if (sock < 0) { if ((sock = socket (AF_INET, SOCK_DGRAM, 0)) < 0) { LFTErrHandler(sess, WRN_GETIFFORREMOTE_SOCKET, NULL); if(sess->wsess != NULL) { free(sess->wsess); sess->wsess = NULL; } return NULL; } } /* Ask what i/f the packet should go out on */ in.sin_family = AF_INET; in.sin_port = 0; in.sin_addr.s_addr = get_address(sess, (char *)remote); if(sess->exit_state < 0){ if(sess->wsess != NULL) { free(sess->wsess); sess->wsess = NULL; } return NULL; } if (SOCKET_ERROR != WSAIoctl(sock, SIO_ROUTING_INTERFACE_QUERY, &in, sizeof(in), &out, sizeof(out), &nBytesReturned, NULL, NULL)) return lft_getifname(out.sin_addr); /* not found */ if(sess->wsess != NULL) { free(sess->wsess); sess->wsess = NULL; } return NULL; } #else /* The non-Windows version of this function uses connect() to acquire a (UDP) socket to the target and uses the OS's decision as to what interface is appropriate. */ static char * lft_getifforremote(lft_session_params * sess, const char *remote) { int sd; struct sockaddr_in sock; uint32_t socklen; uint16_t p1; /* TODO: fill with a better RANDOM */ p1 = rand() % 33525 + 32525; if ((sd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { LFTErrHandler(sess, WRN_GETIFFORREMOTE_SOCKET, NULL); if(sess->wsess != NULL) { free(sess->wsess); sess->wsess = NULL; } return NULL; } sock.sin_family = AF_INET; sock.sin_addr.s_addr = get_address(sess, remote); if(sess->exit_state < 0){ if(sess->wsess != NULL) { free(sess->wsess); sess->wsess = NULL; } return NULL; } sock.sin_port = htons(p1); if (connect(sd, (const struct sockaddr *)(const void *)&sock, sizeof sock) == -1) { LFTErrHandler(sess, WRN_GETIFFORREMOTE_CONNECT, NULL); #if defined(WIN32) || defined(_WIN32) closesocket(sd); #else close(sd); #endif if(sess->wsess != NULL) { free(sess->wsess); sess->wsess = NULL; } return NULL; } socklen = sizeof sock; if (getsockname(sd, (struct sockaddr *)(void *)&sock, &socklen) == -1) { LFTErrHandler(sess, WRN_GETIFFORREMOTE_SOCKNAME, NULL); #if defined(WIN32) || defined(_WIN32) closesocket(sd); #else close(sd); #endif if(sess->wsess != NULL) { free(sess->wsess); sess->wsess = NULL; } return NULL; } #if defined(WIN32) || defined(_WIN32) closesocket(sd); #else close(sd); #endif return lft_getifname(sock.sin_addr); } #endif /*---------------------------------------------------------------------------*/ static void init_address (lft_session_params * sess, char *remote, const char *pcap_dev) { (void)pcap_dev; /* this is now set inside device selection routines */ /* sess->local_address.s_addr = lft_getifaddr (pcap_dev); */ if (sess->noisy) { LFTEvtHandler(sess, EVT_ADDRESS_INITIALIZED, NULL); if(sess->exit_state < 0){ if(sess->wsess != NULL) { free(sess->wsess); sess->wsess = NULL; } return; } } sess->remote_address.s_addr = get_address(sess, remote); } /*---------------------------------------------------------------------------*/ static void open_sockets (lft_session_params * sess) { struct timeval tforid; #if defined( __CYGWIN__ ) || defined( WIN32 ) || defined(_WIN32) int optval = 1; DWORD dwBytesRet = 2048; int rmem = 120832; int wmem = 120832; BOOL blnFlag=TRUE; int ioctlret; #endif #ifdef IP_HDRINCL int on = 1; #endif int i; #if defined(sun) || defined(__CYGWIN__) || defined( WIN32 ) || defined(_WIN32) struct sockaddr_in local_bind; #endif #if defined(sun) sess->send_sock = socket (PF_INET, SOCK_RAW, IPPROTO_IP); #elif defined(BSD_IP_STACK) switch(sess->protocol) { case 0: /*TCP*/ case 4: /*TCP basic*/ sess->send_sock = socket (PF_INET, SOCK_RAW, IPPROTO_TCP); break; case 1: /*UDP*/ sess->send_sock = socket (PF_INET, SOCK_RAW, IPPROTO_UDP); break; case 2: /*ICMP basic*/ case 3: /*RFC1393*/ sess->send_sock = socket (PF_INET, SOCK_RAW, IPPROTO_RAW); break; } #elif defined(__CYGWIN__) || defined( WIN32 ) || defined(_WIN32) switch(sess->protocol) { case 0: /*TCP*/ case 1: /*UDP*/ case 4: /*TCP basic*/ sess->send_sock = socket (PF_INET, SOCK_RAW, IPPROTO_RAW); break; case 2: /*ICMP basic*/ case 3: /*RFC1393*/ sess->send_sock = socket (PF_INET, SOCK_RAW, IPPROTO_ICMP); break; } sess->recv_sock = socket (PF_INET, SOCK_RAW, IPPROTO_IP); if (sess->recv_sock < 0) { LFTErrHandler(sess, ERR_RAW_SOCKET, NULL); return; } local_bind.sin_addr = sess->local_address; local_bind.sin_port = 0; local_bind.sin_family = AF_INET; if (bind(sess->recv_sock, (const struct sockaddr *)(const void *)&local_bind, sizeof(local_bind)) < 0) { LFTErrHandler(sess, ERR_SOCKET_BIND, NULL); return; } /* apparently the cygwin include files don't define this: */ #ifndef SIO_RCVALL # define SIO_RCVALL 0x98000001 #endif ioctlret = WSAIoctl(sess->recv_sock, SIO_RCVALL, &optval, sizeof(optval), NULL, 0, &dwBytesRet, NULL, NULL); if (ioctlret < 0) { LFTErrHandler(sess, WRN_WSAIOCTL, NULL); if(sess->exit_state<0) return; } #else switch(sess->protocol) { case 0: /*TCP*/ case 1: /*UDP*/ case 4: /*TCP basic*/ sess->send_sock = socket (PF_INET, SOCK_RAW, IPPROTO_RAW); break; case 2: /*ICMP basic*/ case 3: /*RFC1393*/ sess->send_sock = socket (PF_INET, SOCK_RAW, IPPROTO_ICMP); break; } #endif if (sess->send_sock < 0) { LFTErrHandler(sess, ERR_RAW_SOCKET, NULL); if(sess->wsess) { free(sess->wsess); sess->wsess = NULL; } return; } #ifdef IP_HDRINCL if (setsockopt (sess->send_sock, IPPROTO_IP, IP_HDRINCL, (char *) &on, sizeof (on)) < 0) { LFTErrHandler(sess, ERR_IP_HDRINCL, NULL); return; } #endif #ifdef sun local_bind.sin_addr = sess->local_address; local_bind.sin_port = 0; local_bind.sin_family = AF_INET; if (bind (sess->send_sock, (const struct sockaddr *)&local_bind, sizeof (local_bind)) < 0) { LFTErrHandler(sess, ERR_SOCKET_BIND, NULL); return; } #endif #ifndef IPDEFTTL #define IPDEFTTL 200 #endif /* if(sess->protocol==4) { if(sess->userlen == 0) sess->userlen=def_payload_len; if(!(sess->payload = malloc(sess->userlen))) { LFTErrHandler(sess, ERR_NOT_ENOUGH_MEM, NULL); return; } memset(sess->payload, 0,sess->userlen); sess->trace_packet.payload_len = sess->userlen; sess->payloadlen = sess->trace_packet.payload_len; sess->trace_packet.payload = sess->payload; } else */ if(sess->protocol==2 || sess->protocol==3) /*ICMP base or ICMP RFC 1393*/ { u_short ptr2id[sizeof tforid / sizeof (u_short)]; u_short icmpid=0; unsigned int ptridx; gettimeofday(&tforid,NULL); memcpy(ptr2id, &tforid, sizeof ptr2id); for(ptridx=0;ptridxicmp_packet, 1, ptr2id[0], 1); } else /*TCP and UDP*/ { /* Prepare the trace packet (probe) */ memset (&(sess->trace_packet), 0, sizeof (sess->trace_packet)); if (sess->userlen == 0 && (sess->protocol==0 || sess->protocol==4)) { /* If user doesn't supply length, default to zero-payload for TCP packets */ sess->trace_packet.payload_len = 0; sess->trace_packet.payload = NULL; } else if (sess->userlen == 0) { if(!(sess->payload = malloc(def_payload_len))) { LFTErrHandler(sess, ERR_NOT_ENOUGH_MEM, NULL); return; } memset(sess->payload, 0, def_payload_len); sess->trace_packet.payload_len = def_payload_len; } else { if (sess->hostname_lsrr_size > 0) { if (sess->protocol==1) sess->userlen -= (sizeof (struct ip) + sizeof(struct udphdr) + sess->trace_packet.lsrr.ipl_len + 1); else sess->userlen -= (sizeof (struct ip) + sizeof(struct tcphdr) + sess->trace_packet.lsrr.ipl_len + 1); } else { if (sess->protocol==1) sess->userlen -= (sizeof (struct ip) + sizeof(struct udphdr)); else sess->userlen -= (sizeof (struct ip) + sizeof(struct tcphdr)); } if (!(sess->payload = malloc(sess->userlen+4))) { LFTErrHandler(sess, ERR_NOT_ENOUGH_MEM, NULL); return; } memset(sess->payload, 0, sess->userlen+4); sess->trace_packet.payload_len = sess->userlen; } sess->payloadlen = sess->trace_packet.payload_len; sess->trace_packet.payload = sess->payload; /* set up initial ip headers, etc. */ if (sess->hostname_lsrr_size > 0) { for (i = 0; i < sess->hostname_lsrr_size; i++) { sess->trace_packet.lsrr.data[i] = get_address(sess, sess->hostname_lsrr[i]); if(sess->exit_state<0) { if(sess->payload) { free(sess->payload); sess->payload=NULL; } return; } } sess->trace_packet.lsrr.ipl_code = IPOPT_LSRR; sess->trace_packet.lsrr.ipl_len = sess->hostname_lsrr_size * 4 + 3; sess->trace_packet.lsrr.ipl_ptr = 4; } sess->trace_packet.ip_hdr.ip_v = 4; if (sess->hostname_lsrr_size > 0) { sess->trace_packet.ip_hdr.ip_hl = 6 + sess->hostname_lsrr_size; /* 5 + 3byte lsrr + addresses + padding */ if (sess->protocol==1) sess->trace_packet.ip_hdr.ip_len = sizeof (struct ip) + sizeof(struct udphdr) + sess->trace_packet.lsrr.ipl_len + 1 + sess->trace_packet.payload_len; else sess->trace_packet.ip_hdr.ip_len = sizeof (struct ip) + sizeof(struct tcphdr) + sess->trace_packet.lsrr.ipl_len + 1 + sess->trace_packet.payload_len; } else { sess->trace_packet.ip_hdr.ip_hl = 5; if (sess->protocol==1) sess->trace_packet.ip_hdr.ip_len = sizeof (struct ip) + sizeof(struct udphdr) + sess->trace_packet.payload_len; else sess->trace_packet.ip_hdr.ip_len = sizeof (struct ip) + sizeof(struct tcphdr) + sess->trace_packet.payload_len; } sess->trace_packet.ip_hdr.ip_off = IP_DF; #ifdef SCREWED_IP_LEN /* trace_packet.ip_hdr.ip_len = sizeof (struct ip) + sizeof(struct tcphdr); */ #else sess->trace_packet.ip_hdr.ip_len = htons (sess->trace_packet.ip_hdr.ip_len); sess->trace_packet.ip_hdr.ip_off = htons(sess->trace_packet.ip_hdr.ip_off); #endif sess->trace_packet.ip_hdr.ip_ttl = IPDEFTTL; if (sess->protocol==1) sess->trace_packet.ip_hdr.ip_p = IPPROTO_UDP; else { sess->trace_packet.ip_hdr.ip_p = IPPROTO_TCP; if (sess->set_tos) sess->trace_packet.ip_hdr.ip_tos = TOSMINDELAY; sess->trace_packet.tcp_hdr.th_win = htons (sess->win_len); sess->trace_packet.tcp_hdr.th_off = sizeof (struct tcphdr) / 4; } } /* * Init hop storage (array) * Init global packet info storage (SLIST) * Init per-hop packet info storage (SLIST) */ sess->hop_info = (struct hop_info_s *)malloc (sizeof(struct hop_info_s) * hop_info_size); for (i = 0; i < 256; i++) { memset(&(sess->hop_info[i]), 0, sizeof(struct hop_info_s)); sess->hop_info[i].state = 0; sess->hop_info[i].done_packet = NULL; SLIST_INIT(&(sess->hop_info[i].packets)); } SLIST_INIT(&(sess->trace_packets)); } /*---------------------------------------------------------------------------*/ static unsigned int send_packet (lft_session_params * sess, short nhop, unsigned short ttl, unsigned int seq, unsigned char flags) { struct sockaddr_in dest; unsigned int tseq=0; unsigned short tttl=0; struct sumh sum; char *buf; char *bptr = NULL; int blen = 0; char *s; EvtSentPacketParam espparam; /* we'll use gettimeofday() from checktimeouts * instead of doing it again here */ /* gettimeofday (&now, NULL); */ struct trace_packet_info_s *pinfo = NULL; struct trace_packet_s *packet = NULL; #if defined( __CYGWIN__ ) || defined( WIN32 ) || defined(_WIN32) buf=(char *)_alloca(maxpacklen+64); #else buf=(char *)alloca(maxpacklen+64); #endif if (!(pinfo = (struct trace_packet_info_s *)malloc(sizeof(struct trace_packet_info_s)))) { LFTErrHandler(sess, ERR_NOT_ENOUGH_MEM, NULL); return 0; } memset(pinfo, 0, sizeof(struct trace_packet_info_s)); packet = &(pinfo->u.packet); memcpy(packet, &(sess->trace_packet), sizeof(struct trace_packet_s)); bptr = buf; dest.sin_family = AF_INET; dest.sin_addr = sess->remote_address; dest.sin_port = 0; if (seq == 0) tseq = new_seq(sess); else tseq = seq; if (nhop == -1) tttl = ttl; else tttl = nhop + 1; /*There is no place we use this variable*/ /*sess->num_sent++;*/ sess->ts_last_sent = sess->now; packet->ip_hdr.ip_ttl = tttl; packet->ip_hdr.ip_src = sess->local_address; packet->ip_hdr.ip_dst = sess->remote_address; espparam.flags=flags; espparam.nhop=nhop; espparam.tseq=tseq; espparam.tttl=tttl; if (sess->noisy > 1) { LFTEvtHandler(sess,EVT_SENT_PACKET, &espparam); if(sess->exit_state<0) { free(pinfo); return 0; } } packet->ip_hdr.ip_sum = 0; #if !defined(SCREWED_IP_LEN) packet->ip_hdr.ip_sum = ip_cksum(&packet->ip_hdr); #endif memcpy(bptr, &(packet->ip_hdr), sizeof(struct ip)); bptr += sizeof(struct ip); if (packet->lsrr.ipl_len > 0) { memcpy(bptr, &(packet->lsrr), packet->lsrr.ipl_len + 1); bptr += (packet->lsrr.ipl_len + 1); /* PADDING !!! */ } /* Layer-4 preparation */ if (sess->protocol==1) { if (sess->noisy > 5) { LFTEvtHandler(sess,EVT_SHOW_PAYLOAD, packet); if(sess->exit_state<0) { free(pinfo); return 0; } } /* Construct UDP (with payload) */ packet->udp_hdr.uh_dport = htons(sess->dport + tttl); packet->udp_hdr.uh_sport = htons (sess->sport); packet->udp_hdr.uh_ulen = htons ((sizeof (struct udphdr)) + packet->payload_len); /* truncated-udplength 0 packet->udp_hdr.uh_ulen = 0; packet->udp_hdr.th_flags = flags; */ /* create pseudo-header for checksum calculation */ sum.src=sess->local_address.s_addr; sum.dst=sess->remote_address.s_addr; sum.fill=0; sum.protocol=IPPROTO_UDP; sum.len=htons(sizeof(struct udphdr) + packet->payload_len); if(!( s = (char *)malloc(sizeof(struct sumh)+sizeof(struct udphdr)+packet->payload_len))) { LFTErrHandler(sess, ERR_NOT_ENOUGH_MEM, NULL); free(pinfo); return 0; } memset(s,0,(sizeof(struct sumh)+sizeof(struct udphdr)+packet->payload_len)); memcpy(s,&sum,sizeof(struct sumh)); memcpy(s+sizeof(struct sumh),&(packet->udp_hdr),sizeof(struct udphdr)); memcpy(s+sizeof(struct sumh)+sizeof(struct udphdr), packet->payload,packet->payload_len); packet->udp_hdr.uh_sum=udp_cksum((unsigned short *)(void *)s, sizeof(struct sumh)+sizeof(struct udphdr)+packet->payload_len); free(s); if (sess->noisy > 5) { LFTEvtHandler(sess,EVT_SHOW_UDP_CHECKSUM, packet); if(sess->exit_state<0) { free(pinfo); return 0; } } #if defined(SOLARIS_LENGTH_IN_CHECKSUM) packet->udp_hdr.uh_sum = htons (sizeof (struct udphdr) + packet->payload_len); #endif memcpy(bptr, &(packet->udp_hdr), sizeof(struct udphdr)); bptr += sizeof(packet->udp_hdr); memcpy(bptr, packet->payload, packet->payload_len); blen = sizeof(struct ip) + packet->lsrr.ipl_len + sizeof(struct udphdr) + packet->payload_len; } else { /* Construct TCP (no payload needed) */ if (sess->noisy > 5) { LFTEvtHandler(sess,EVT_SHOW_PAYLOAD, packet); if(sess->exit_state<0) { free(pinfo); return 0; } } packet->tcp_hdr.th_dport = htons (sess->dport); /* trace_packet.tcp_hdr.th_seq = htonl (seq_start + trace_packet_info_length); */ packet->tcp_hdr.th_seq = htonl (tseq); packet->tcp_hdr.th_sport = htons (sess->sport); packet->tcp_hdr.th_flags = flags; #if defined(SOLARIS_LENGTH_IN_CHECKSUM) packet->tcp_hdr.th_sum = htons (sizeof (struct tcphdr)) + packet->payload_len; #else packet->tcp_hdr.th_sum = 0; packet->tcp_hdr.th_sum = tcp_cksum(&packet->ip_hdr, &packet->tcp_hdr, packet->payload, packet->payload_len); #endif if (sess->noisy > 5) { LFTEvtHandler(sess,EVT_SHOW_TCP_CHECKSUM, packet); if(sess->exit_state<0) { free(pinfo); return 0; } } memcpy(bptr, &(packet->tcp_hdr), sizeof(struct tcphdr)); bptr += sizeof(packet->tcp_hdr); memcpy(bptr, packet->payload, packet->payload_len); blen = sizeof(struct ip) + packet->lsrr.ipl_len + sizeof(struct tcphdr) + packet->payload_len; } /* Packet is ready, fire away */ if (sendto (sess->send_sock, buf, blen, 0, (const struct sockaddr *)(const void *)&dest, sizeof (dest)) < 0) { LFTErrHandler(sess, ERR_RAW_TCP_DISABLED, NULL); free(pinfo); return 0; } pinfo->hopno = nhop; if (sess->protocol==1) pinfo->seq = sess->dport + tttl; else if(!sess->protocol) pinfo->seq = tseq; pinfo->sent = sess->now; SLIST_INSERT_HEAD(&(sess->trace_packets), pinfo, next); sess->trace_packets_num++; if (nhop != -1) { SLIST_INSERT_HEAD(&(sess->hop_info[nhop].packets), pinfo, next_by_hop); sess->hop_info[nhop].num_sent++; sess->hop_info[nhop].all_sent++; sess->hop_info[nhop].ts_last_sent = sess->now; } return tseq; } /*---------------------------------------------------------------------------*/ static unsigned int send_hop (lft_session_params * sess, short nhop) { WrnBadHopStateParam wbhsp; struct hop_info_s *h = &(sess->hop_info[nhop]); if (!sess->adaptive) return send_packet (sess, nhop , 0, 0, sess->tcp_flags); if (h->state == HS_SEND_FIN) { return send_packet(sess, nhop, 0, 0, TH_FIN); } if (h->state == HS_SEND_SYN) { return send_packet(sess, nhop, 0, 0, TH_SYN); } if (h->state == HS_SEND_SYN_ACK) { return send_packet(sess, nhop, 0, 0, HS_SEND_SYN_ACK); } wbhsp.h=h; wbhsp.nhop=nhop; LFTErrHandler(sess, WRN_BAD_HOP_STATE, &wbhsp); return -1; } /*---------------------------------------------------------------------------*/ int hop_state_up (lft_session_params * sess, short nhop) { struct hop_info_s *h = &(sess->hop_info[nhop]); if (h->state == HS_MAX) return -1; /* 1st try FIN, then SYN_ACK, then SYN, then fail (set to MAX) */ if (h->state == HS_SEND_FIN) h->state = HS_SEND_SYN_ACK; else if (h->state == HS_SEND_SYN_ACK) h->state = HS_SEND_SYN; else h->state = HS_MAX; h->num_sent = 0; /* for this state that is */ return 0; } /*---------------------------------------------------------------------------*/ int hop_state_copy(lft_session_params * sess, short nhop) { int i; if (sess->noisy > 4) LFTEvtHandler(sess,EVT_SHOW_HOPS, &nhop); if(sess->exit_state>=0) { for (i = (nhop+1); i <= 255; i++) if (sess->hop_info[i].state < sess->hop_info[nhop].state) { sess->hop_info[i].state = sess->hop_info[nhop].state; sess->hop_info[i].num_sent = 0; } } return 0; } /*---------------------------------------------------------------------------*/ static void finish (lft_session_params * sess) { int hopno; int maxhop; int reply, noreply; int as_for_hop = 0; struct trace_packet_info_s *tp; char *netname; /*int ocres;*/ char *myApp = (char *)malloc((strlen(version)+1 * sizeof(char)) + (strlen(appname) * sizeof(char))); struct ip_list_array *ipaslist = (struct ip_list_array *)malloc(sizeof(struct ip_list_array)); /* Variables for seam detection */ int icmpcode; int asseam_hopno=-1; struct in_addr asseam_hopaddr; int netseam_hopno=-1; struct in_addr netseam_hopaddr; struct in_addr classbmask; struct in_addr masked_target; int prevasn=-1; struct in_addr prevasn_hopaddr; int prevasn_hopno; int lastishole; int netreached=0; int isseam; /* ---------------------------- */ inet_aton("255.255.0.0", &classbmask); masked_target.s_addr=sess->remote_address.s_addr & classbmask.s_addr; EvtPacketInfoParam ehip; memset(ipaslist, 0, sizeof(struct ip_list_array)); memset(&tbuf, 0, sizeof(tbuf)); gettimeofday (&(sess->trace_done_time), NULL); /*if(sess->protocol==0) { ocres = open_check(sess, LFTErrHandler, LFTEvtHandler); LFTEvtHandler(sess,EVT_OPEN_CHECK_RESULT,&ocres); if(ocres==1) { sess->target_open=1; sess->target_filtered=0; } else { sess->target_open=0; if(ocres<0) sess->target_filtered=0; else sess->target_filtered=1; } }*/ if (sess->noisy > 3) { LFTEvtHandler(sess, EVT_SHOW_NUM_HOPS, NULL); if(sess->exit_state < 0) { free(ipaslist); free(myApp); return; } } if (sess->num_hops) { maxhop = sess->num_hops; /* display all packets we received from this host */ SLIST_FOREACH(tp, &(sess->trace_packets), next) if (tp->is_done) tp->hopno = maxhop; } else { maxhop = sess->hop_info_length - 1; } LFTEvtHandler(sess, EVT_TRACE_COMPLETED, NULL); if(sess->exit_state < 0) { free(ipaslist); free(myApp); return; } /* if user wants ASN resolution from pwhois/cymru/riswhois, do it in bulk */ if (sess->do_aslookup || sess->do_netlookup) { if(sess->noisy > 1) { LFTEvtHandler(sess,EVT_ON_RESOLUTION, NULL); if(sess->exit_state < 0) { free(ipaslist); free(myApp); return; } } if (!sess->use_radb) { /* populate bulk ip_addr_list structure */ for (hopno = sess->ttl_min; hopno <= maxhop; hopno++) { SLIST_FOREACH(tp, &(sess->hop_info[hopno].packets), next_by_hop) { if (tp->recv.tv_usec) { (*ipaslist).ipaddr[as_for_hop] = tp->hopaddr; as_for_hop++; (*ipaslist).numItems = (as_for_hop); break; } } } if (sess->use_cymru) { /* use cymru bulk service */ if (w_lookup_as_cymru_bulk(sess->wsess, &(*ipaslist)) != 0) if (sess->noisy) LFTErrHandler(sess, WRN_NS_LOOKUP_FAILED, NULL); } else if (sess->use_ris) { /* use RIPE NCC RIS service */ if (w_lookup_all_riswhois_bulk(sess->wsess, &(*ipaslist)) != 0) if (sess->noisy) LFTErrHandler(sess, WRN_NS_LOOKUP_FAILED, NULL); } else { /* use pwhois bulk service */ if ((strlen(version) * sizeof(char)) + 1 + (strlen(appname) * sizeof(char)) < 254) { *myApp = '\0'; strcat(myApp, appname); strcat(myApp, " "); strcat(myApp, version); strncpy((*ipaslist).application,myApp,511); } if (w_lookup_all_pwhois_bulk(sess->wsess, &(*ipaslist)) != 0) if (sess->noisy) LFTErrHandler(sess, WRN_NS_LOOKUP_FAILED, NULL); } if(sess->exit_state < 0) { free(ipaslist); free(myApp); return; } } } free(myApp); if(sess->protocol == 1) sess->dport++; LFTEvtHandler(sess,EVT_TRACE_REPORT_START, &maxhop); if(sess->exit_state < 0){ free(ipaslist); return; } /* seam detection */ as_for_hop=0; for(hopno = sess->ttl_min; hopno < sess->hop_info_length; hopno++) { struct in_addr last_hop; icmpcode=-100; last_hop.s_addr = 0; if(sess->hop_info[hopno].all_rcvd) { lastishole=0; SLIST_FOREACH(tp, &(sess->hop_info[hopno].packets), next_by_hop) { if(tp->recv.tv_sec) { if(hopno<=maxhop) icmpcode=tp->icmp_type; if(last_hop.s_addr != tp->hopaddr.s_addr) { if((tp->hopaddr.s_addr & classbmask.s_addr) == masked_target.s_addr) netreached=1; else { netseam_hopno=hopno; netseam_hopaddr=tp->hopaddr; } if(sess->do_aslookup || sess->do_netlookup) { if (sess->use_radb) { /* using RADB/IRR */ tp->asnumber = w_lookup_as(sess->wsess, inet_ntoa(tp->hopaddr)); } else { /* using pwhois by default */ tp->asnumber = (*ipaslist).asn[as_for_hop]; } if(prevasn==-1) { if(tp->asnumber) { prevasn=tp->asnumber; prevasn_hopno=hopno; prevasn_hopaddr=tp->hopaddr; } } else { if(tp->asnumber) { if(tp->asnumber!=prevasn) { asseam_hopno=prevasn_hopno; asseam_hopaddr=prevasn_hopaddr; } prevasn=tp->asnumber; prevasn_hopno=hopno; prevasn_hopaddr=tp->hopaddr; } } } last_hop=tp->hopaddr; } } } as_for_hop++; } else lastishole=1; if(icmpcode==-1) break; } if(!netreached) netseam_hopno=-1; if(lastishole) asseam_hopno=-1; /* -------------- */ noreply = 0; reply = 0; as_for_hop = 0; /* this correlates the hopno to the asn stored in ipaslist */ for (hopno = sess->ttl_min; hopno <= maxhop; hopno++) { struct in_addr last_hop; if (sess->hop_info[hopno].all_rcvd != 0) { if (noreply >= 1) { EvtNoReplyParam nrp; nrp.hopno=hopno; nrp.noreply=noreply; LFTEvtHandler(sess,EVT_RPT_NO_REPLY, &nrp); if(sess->exit_state < 0) { free(ipaslist); return; } } } last_hop.s_addr = 0; if ((sess->hop_info[hopno].state == HS_SEND_FIN) && (sess->hop_info[hopno+1].state == HS_SEND_SYN) && (sess->hop_info[hopno+1].ts_last_recv.tv_sec)) { LFTEvtHandler(sess,EVT_RPT_FRW_INSPECT_PACKS, NULL); if(sess->exit_state < 0){ free(ipaslist); return; } } if ((sess->hop_info[hopno].state != HS_SEND_SYN_ACK) && (sess->hop_info[hopno+1].state == HS_SEND_SYN_ACK) && (hopno == (sess->num_hops - 1))) { LFTEvtHandler(sess,EVT_RPT_FRW_STATE_FILTER, NULL); if(sess->exit_state < 0){ free(ipaslist); return; } } if ((sess->hop_info[hopno].flags & HF_ENDPOINT) && (noreply >= ((maxhop - sess->ttl_min)/2)) && sess->num_hops > 3) { LFTEvtHandler(sess,EVT_RPT_BSD_BUG, NULL); if(sess->exit_state < 0){ free(ipaslist); return; } } if (sess->hop_info[hopno].all_rcvd == 0) { reply = 0; } else { LFTEvtHandler(sess,EVT_RPT_HOP_INFO_START,&hopno); if(sess->exit_state < 0){ free(ipaslist); return; } SLIST_FOREACH(tp, &(sess->hop_info[hopno].packets), next_by_hop) { if (tp->recv.tv_sec) { reply = 1; if (last_hop.s_addr != tp->hopaddr.s_addr) { ehip.asnumber = 0; /* init/clear the ASN */ if (sess->do_aslookup) { if (sess->use_radb) { /* using RADB/IRR */ ehip.asnumber = w_lookup_as(sess->wsess, inet_ntoa(tp->hopaddr)); } else { /* using pwhois by default */ ehip.asnumber = (*ipaslist).asn[as_for_hop]; } } tp->asnumber=ehip.asnumber; ehip.netname=NULL; if (sess->do_netlookup) { if (!sess->do_aslookup || (sess->do_aslookup && !sess->use_cymru && !sess->use_radb)) { netname = (*ipaslist).netName[as_for_hop]; } else { netname = w_lookup_netname(sess->wsess, inet_ntoa(tp->hopaddr)); } ehip.netname=netname; } if(ehip.netname) strncpy(tp->netname, ehip.netname, 511); else tp->netname[0]=0; } ehip.last_hop=last_hop; tp->last_hop=ehip.last_hop; last_hop = tp->hopaddr; } ehip.tp=tp; /* seam processing */ isseam=0; ehip.is_asseam=0; ehip.is_netseam=0; ehip.is_open=0; ehip.is_filtered=0; ehip.seam_traced=0; if(sess->check_seam && hopno==asseam_hopno && tp->hopaddr.s_addr==asseam_hopaddr.s_addr) { isseam=1; ehip.is_asseam=1; } if(sess->check_seam && hopno==netseam_hopno && tp->hopaddr.s_addr==netseam_hopaddr.s_addr) { isseam=1; ehip.is_netseam=1; } if(isseam) { if(sess->check_seam) { int curroutputstyle=global_output_style; char hostname[100]; ehip.seam_traced=1; global_output_style=2; lft_session_params * subsess=LFTSessionOpen(); strncpy(hostname, inet_ntoa(tp->hopaddr),100); subsess->senddevsel = sess->senddevsel; subsess->senddev = sess->senddev; subsess->auto_ports=0; subsess->dport=179; subsess->seq_start=30; subsess->retry_min=1; subsess->retry_max=1; subsess->resolve_names=0; subsess->ahead_limit=1; subsess->break_on_icmp = 0; subsess->is_graphviz_subquery=1; subsess->hostname=hostname; subsess->hostname_lsrr_size = 0; LFTExecute(subsess); ehip.is_open=subsess->target_open; ehip.is_filtered=subsess->target_filtered; LFTSessionClose(subsess); global_output_style=curroutputstyle; } } /* --------------- */ LFTEvtHandler(sess,EVT_RPT_PACKET_INFO,&ehip); if(sess->exit_state < 0){ free(ipaslist); return; } } LFTEvtHandler(sess,EVT_RPT_PACKET_LIST_END,NULL); if(sess->exit_state < 0){ free(ipaslist); return; } } if (reply) { noreply = 0; as_for_hop++; } else noreply++; reply = 0; } /* for(...) */ if (!sess->num_hops){ LFTEvtHandler(sess, EVT_RPT_NO_HOPS, &maxhop); } if (sess->timetrace){ LFTEvtHandler(sess, EVT_RPT_TIME_TRACE, NULL); } LFTEvtHandler(sess, EVT_ON_EXIT, NULL); free(ipaslist); return; } /*---------------------------------------------------------------------------*/ static int check_timeouts (lft_session_params * sess) { int nhop; int need_reply = 0; int no_reply = 0; int last_return = 0; gettimeofday (&(sess->now), NULL); if (timediff_ms (sess->ts_last_sent, sess->now) < sess->scatter_ms) return 0; /* not ready to send another packet yet */ for (nhop = sess->ttl_min; nhop < sess->hop_info_length; nhop++) { if (!sess->hop_info[nhop].num_sent) { send_hop(sess, nhop); return 0; } } for (nhop = sess->ttl_min; nhop < sess->hop_info_length; nhop++) { if (sess->hop_info[nhop].num_sent <= sess->retry_max && !sess->hop_info[nhop].ts_last_recv.tv_sec) { if (sess->noisy > 4) { LFTEvtHandler(sess,EVT_TTL_NO_REPLY,&nhop); if(sess->exit_state<0) return 0; } if (timediff_ms (sess->hop_info[nhop].ts_last_sent, sess->now) >= sess->timeout_ms) { /* we timed out waiting for this hop -- retry if we have any * more tries */ if (sess->hop_info[nhop].num_sent < sess->retry_max) { if (!sess->noisy && !sess->nostatus) LFTEvtHandler(sess,EVT_PROGRESS_NO_REPLY,NULL); if (sess->noisy > 2) LFTEvtHandler(sess,EVT_TTL_TOUT_RESEND,&nhop); if(sess->exit_state<0) return 0; send_hop(sess, nhop); return 0; } else { if (!sess->adaptive || hop_state_up(sess, nhop)) { if (sess->noisy > 3) LFTEvtHandler(sess,EVT_TTL_TOUT_GIVINGUP,&nhop); if(sess->exit_state<0) return 0; no_reply++; } } } else { need_reply++; /* we have to wait for this one to timeout */ } } else { /* have reply */ last_return = nhop; } } if (sess->noisy > 4) { EvtDebugCheckpoint1Param edcp; edcp.last_return=last_return; edcp.need_reply=need_reply; edcp.no_reply=no_reply; LFTEvtHandler(sess,EVT_DBG_CHECKPOINT1,&edcp); if(sess->exit_state<0) return 0; } if (no_reply >= sess->ahead_limit) { /* we timed out. */ if ((last_return + 3) * 2 < sess->hop_info_length) { if ((need_reply < 3) && (sess->num_rcvd < 2)) LFTEvtHandler(sess,EVT_CANT_RELIABLY_RTRIP,NULL); if(sess->exit_state<0) return 0; finish (sess); return 1; } } if ((!sess->num_hops || sess->hop_info_length < sess->num_hops || need_reply) && sess->hop_info_length < sess->ttl_limit) { if (sess->noisy > 4) LFTEvtHandler(sess,EVT_HAVE_UNANSWERRED_HOPS,NULL); if (need_reply >= sess->ahead_limit) { if (sess->noisy > 4) LFTEvtHandler(sess,EVT_TOO_FAR_AHEAD,NULL); return 0; /* wait for some replies before we go on */ } if(sess->exit_state<0) return 0; if (sess->num_hops > 0 && sess->hop_info_length >= sess->num_hops) { if (sess->noisy > 3) LFTEvtHandler(sess,EVT_HAVE_GAPS,NULL); return 0; /* we know how long the path is -- * wait to fill in the blanks */ } nhop = sess->hop_info_length++; send_hop(sess, nhop); } else { if (sess->noisy >= 4) { LFTEvtHandler(sess,EVT_EITHER_RESP_OR_TOUT,NULL); if(sess->exit_state<0) return 0; } for (nhop = sess->ttl_min; nhop < sess->hop_info_length; nhop++) { if (sess->hop_info[nhop].num_sent < sess->retry_min && sess->hop_info[nhop].num_sent <= sess->retry_max) { send_hop(sess, nhop); return 0; } } /* If we're adaptive and target appears closed, increment state and try again */ if ((sess->adaptive) && (sess->target_open < 1) && (sess->hop_info[nhop].state != HS_MAX)) { hop_state_up(sess, nhop); send_hop(sess, nhop); return 0; } finish (sess); return 1; } return 0; } /*---------------------------------------------------------------------------*/ static void recv_packet (lft_session_params * sess, unsigned int seq, struct in_addr ipaddr, int icmp_type, const struct pcap_pkthdr *hdr) { double ms; struct trace_packet_info_s *tp = NULL; EvtNonSeqPacketParam ensp; /* Depending on the platform, we can use * the pcap header's timeval or we must call gettimeofday() for each packet */ #if defined( __CYGWIN__ ) || defined( WIN32 ) || defined(_WIN32) || defined( USE_GTOD ) (void)hdr; gettimeofday (&(sess->now), NULL); #else sess->now.tv_sec = hdr->ts.tv_sec; sess->now.tv_usec = hdr->ts.tv_usec; /* gettimeofday (&now, NULL); */ #endif /* First, search every probe to find an exact sequence match */ SLIST_FOREACH(tp, &(sess->trace_packets), next) { if (tp->seq == seq) { break; } } /* Next, if no probes have an exact sequence match, look for an unincremented ACK */ if (tp == NULL) { if (sess->noisy > 3) { LFTEvtHandler(sess,EVT_LOOKFOR_UNINC_ACK,NULL); if(sess->exit_state<0) return; } SLIST_FOREACH(tp, &(sess->trace_packets), next) { if (((tp->seq) == (seq +1)) && (icmp_type == -1)) break; } } /* Next, if no probes have an exact sequence match, look for an off-by-len */ if (tp == NULL) { if (sess->noisy > 3) { LFTEvtHandler(sess,EVT_LOOKFOR_OFF_BY_LEN,NULL); if(sess->exit_state<0) return; } SLIST_FOREACH(tp, &(sess->trace_packets), next) { if (((tp->seq) == (seq - sess->payloadlen)) && (icmp_type == -1)) break; } } /* Last resort. Catch any response from the target */ if (tp == NULL) { if (sess->noisy > 3) { LFTEvtHandler(sess,EVT_LOOKFOR_LAST_RESORT,NULL); if(sess->exit_state<0) return; } SLIST_FOREACH(tp, &(sess->trace_packets), next) { /* Special case: look for a response to our SYN_ACK */ if (tp->u.packet.tcp_hdr.th_flags == HS_SEND_SYN_ACK) { if (!tp->recv.tv_sec) { break; } } /* Truly the last resort: packet from the target with a wacky ACK sequence */ if ((ipaddr.s_addr == sess->remote_address.s_addr) && (tp->hopaddr.s_addr == 0) && (icmp_type == -1)) { sess->target_anomaly = 1; } } } /* This packet is not even close, drop it and move on */ if (!tp) { if (sess->noisy) LFTEvtHandler(sess,EVT_SKIP_PACKET,NULL); else if (!sess->nostatus) LFTEvtHandler(sess,EVT_PROGRESS_SKIP_PACKET,NULL); return; } if (tp->seq != seq) { ensp.ipaddr=ipaddr; ensp.tp=tp; if (((tp->seq) == (seq + 1)) && (icmp_type == -1)) { if (sess->noisy > 1) { LFTEvtHandler(sess,EVT_ACK_WAS_NOT_INC,&ensp); if(sess->exit_state<0) return; } /* return; */ } else if (((tp->seq) == (seq - sess->payloadlen)) && (icmp_type == -1)) { if (sess->noisy > 1) { LFTEvtHandler(sess,EVT_RST_REL_TO_ISN,&ensp); if(sess->exit_state<0) return; } /* return; */ } else if ((ipaddr.s_addr == sess->remote_address.s_addr) && (icmp_type == -1)) { if (sess->noisy > 1) { LFTEvtHandler(sess,EVT_ACK_WAS_WAY_OFF,&ensp); if(sess->exit_state<0) return; } /* return; */ } } if (tp->recv.tv_sec) { if (sess->noisy) LFTEvtHandler(sess,EVT_DUPLICATE_PACKET, NULL); else if (!sess->nostatus) LFTEvtHandler(sess,EVT_PROGRESS_DUPLICATE,NULL); return; } if (sess->noisy > 1) { EvtRecvPacketParam erpp; erpp.ipaddr=ipaddr; erpp.seq=seq; erpp.tp=tp; LFTEvtHandler(sess,EVT_RECV_PACKET,&erpp); } else { if (!sess->nostatus) LFTEvtHandler(sess,EVT_PROGRESS_OK,NULL); } if(sess->exit_state<0) return; /* increment received packet counter */ sess->num_rcvd++; tp->recv = sess->now; if (tp->hopno != -1) { sess->hop_info[tp->hopno].ts_last_recv = sess->now; sess->hop_info[tp->hopno].all_rcvd++; hop_state_copy(sess, tp->hopno); /* indicate this hop has a sequence anomaly */ if (icmp_type == -1) sess->hop_info[tp->hopno].flags |= HF_ENDPOINT; } tp->hopaddr = ipaddr; tp->icmp_type = icmp_type; if (icmp_type != -2 && (!sess->num_hops || sess->num_hops > tp->hopno)) if (sess->break_on_icmp || (icmp_type == -1)) { if (tp->hopno != -1) { /* we set fake type -1 when we get actual * tcp packet in return - meaning destination */ sess->num_hops = tp->hopno; tp->is_done = 1; if (sess->noisy > 1 && sess->target_open < 1) LFTEvtHandler(sess,EVT_TCP_PORT_CLOSED,NULL); else if (sess->noisy > 1 && sess->target_open > 0) LFTEvtHandler(sess,EVT_TCP_PORT_OPEN,NULL); if(sess->exit_state<0) return; } } /* adjust scatter if we have fast reply times */ ms = timediff_ms (tp->sent, tp->recv); sess->scatter_ms = (sess->scatter_ms * (sess->ahead_limit - 1) + ms) / sess->ahead_limit; } /*---------------------------------------------------------------------------*/ void lft_printf(lft_session_params * sess, const char *templ, ...) { va_list ap; char buf[1024]; va_start (ap, templ); vsprintf(buf, templ, ap); va_end (ap); LFTEvtHandler(sess, EVT_DBG_LOG_MESSAGE, buf); } /*---------------------------------------------------------------------------*/ static void process_packet (lft_session_params * sess, const u_char *packet, const struct pcap_pkthdr *hdr) { const struct ether_header *eptr; const struct ip *ip, *orig_ip; const struct tcphdr *tcp; const struct udphdr *udp; const struct icmp *icmp; if (sess->noisy > 4) { LFTEvtHandler(sess,EVT_PROCESS_PACKET_START,NULL); if(sess->exit_state<0) return; } check_timeouts (sess); if(sess->exit_state<0) return; /* Test EtherType to adjust Ethernet header length 802.1q VLAN Ethernet frame (dot1q) */ eptr = (const struct ether_header *) packet; if ((sess->skip_header_len == sizeof (struct ether_header)) && (ntohs (eptr->ether_type) == ETHERTYPE_VLAN)) { sess->skip_header_len += 4; } packet += sess->skip_header_len; ip = (const void *)packet; packet += 4 * ip->ip_hl; switch (ip->ip_p) { case IPPROTO_ICMP: orig_ip = ip; icmp = (const void *)packet; if (icmp->icmp_type != ICMP_UNREACH && icmp->icmp_type != ICMP_TIMXCEED) { return; } ip = &icmp->icmp_ip; if (sess->protocol==1) { if (ip->ip_p != IPPROTO_UDP) return; /* not a response to our udp probe */ } else { if (ip->ip_p != IPPROTO_TCP) return; /* not a response to our tcp probe */ } packet = (const u_char *)ip; packet += 4 * ip->ip_hl; if (sess->protocol==1) { udp = (const void *)packet; if (ntohs (udp->uh_sport) != sess->sport || ip->ip_src.s_addr != sess->local_address.s_addr || ip->ip_dst.s_addr != sess->remote_address.s_addr) { LFTEvtHandler(sess,EVT_UDP_NOT_FOR_US,NULL); return; /* not for us */ } if (sess->noisy > 2) { EvtIncomingICMPUDPParam eiiup; eiiup.icmp=icmp; eiiup.ip=ip; eiiup.orig_ip=orig_ip; eiiup.udp=udp; LFTEvtHandler(sess,EVT_INCOMING_ICMP_UDP,&eiiup); if(sess->exit_state<0) return; } if (sess->noisy > 1) { LFTEvtHandler(sess,EVT_RCVD_ICMP_UDP,udp); if(sess->exit_state<0) return; } recv_packet (sess, ntohs (udp->uh_dport) , orig_ip->ip_src, (icmp->icmp_type == ICMP_TIMXCEED) ? -2 : icmp->icmp_code, hdr); if(sess->exit_state<0) return; } else { tcp = (const void *)packet; if (ntohs (tcp->th_dport) != sess->dport || ip->ip_src.s_addr != sess->local_address.s_addr || ip->ip_dst.s_addr != sess->remote_address.s_addr) return; /* not for us */ if (sess->noisy > 2) { EvtIncomingICMPTCPParam eiitp; eiitp.icmp=icmp; eiitp.ip=ip; eiitp.orig_ip=orig_ip; eiitp.tcp=tcp; LFTEvtHandler(sess,EVT_INCOMING_ICMP_TCP,&eiitp); if(sess->exit_state<0) return; } if (sess->noisy > 1) { LFTEvtHandler(sess,EVT_RCVD_ICMP_TCP,tcp); if(sess->exit_state<0) return; } recv_packet (sess, ntohl (tcp->th_seq) , orig_ip->ip_src, (icmp->icmp_type == ICMP_TIMXCEED) ? -2 : icmp->icmp_code, hdr); if(sess->exit_state<0) return; } return; case IPPROTO_TCP: /* check for RST reply */ tcp = (const void *)packet; if (!(tcp->th_flags & TH_RST) && !(tcp->th_flags & TH_ACK) && !(tcp->th_flags & TH_SYN)) return; /* not what we're looking for */ if (ntohs (tcp->th_sport) != sess->dport || ip->ip_src.s_addr != sess->remote_address.s_addr || ip->ip_dst.s_addr != sess->local_address.s_addr) { return; /* not the right connection */ } if (sess->noisy > 1) { LFTEvtHandler(sess,EVT_RCVD_TCP,tcp); if(sess->exit_state<0) return; } /*if (ntohl(tcp->th_ack) < seq_start || ntohl(tcp->th_ack) > seq_start + trace_packet_info_length + 1) return; * not for us */ /* Check for SYN,ACK in response to determine if target is listening */ if ((tcp->th_flags & TH_ACK) && (tcp->th_flags & TH_SYN) && !(tcp->th_flags & TH_RST)) sess->target_open++; if ((tcp->th_flags & TH_ACK) && !(tcp->th_flags & TH_SYN) && (tcp->th_flags & TH_RST)) sess->target_open = 0; recv_packet (sess, ntohl (tcp->th_ack) - 1, ip->ip_src, -1, hdr); if(sess->exit_state<0) return; /*Could be nice to host and send a RESET here*/ /* send_packet(-1, IPDEFTTL, ntohl(tcp->th_ack) + 1, TH_RST); */ return; case IPPROTO_UDP: /* could be a probe we sent or something we don't support */ return; default: if (sess->noisy > 3) LFTEvtHandler(sess,EVT_RCVD_UNKNOWN,ip); } } /*---------------------------------------------------------------------------*/ #if !defined(__CYGWIN__) && !defined(WIN32) && !defined(_WIN32) static void pcap_process_packet (u_char * user_data, const struct pcap_pkthdr *hdr, const u_char * packet) { lft_session_params * sess=(lft_session_params *)(void *)user_data; if(sess->exit_state<0) return; process_packet(sess, packet, hdr); } #endif /*---------------------------------------------------------------------------*/ #if defined( __CYGWIN__ ) || defined( WIN32 ) || defined(_WIN32) void cygwin_process(lft_session_params * sess) { fd_set fds; struct timeval tm; int wsaerr; tm.tv_sec = 0; tm.tv_usec = 100000; FD_ZERO(&fds); FD_SET(sess->recv_sock, &fds); if (select(sess->recv_sock+1, &fds, 0, 0, &tm) < 0) { wsaerr=WSAGetLastError(); LFTErrHandler(sess, ERR_WIN_SELECT, NULL); return; } if (FD_ISSET(sess->recv_sock, &fds)) { /* read packet */ char packetbuf[2048]; int nread; memset(packetbuf, 0, sizeof(packetbuf)); nread = recv(sess->recv_sock, packetbuf, sizeof(packetbuf), 0); if (nread <= 0) { LFTErrHandler(sess, ERR_WIN_RECV, NULL); return; } process_packet(sess, packetbuf, NULL); } } #endif /*---------------------------------------------------------------------------*/ /* Main of lft */ /*---------------------------------------------------------------------------*/ void LFTExecute(lft_session_params * sess) { #if !defined(__CYGWIN__) && !defined(WIN32) && !defined(_WIN32) char ebuf[PCAP_ERRBUF_SIZE]; /*static pcap_t *pd;*/ #endif sess->exit_state = 0; if(sess->auto_ports != 0) { do_auto_ports(sess, sess->hostname, sess->dport); if(sess->exit_state < 0){ /* if(sess->hostname != NULL) free(sess->hostname); */ if(sess->wsess != NULL) { free(sess->wsess); sess->wsess = NULL; } return; } } if ((sess->do_netlookup != 0) || (sess->do_aslookup != 0)) { sess->wsess = w_init(); /* initialize the whois framework */ sess->wsess->logprintfCookie = sess; /*Parameter for lft_printf*/ } /* if not given network interface, select one automatically */ if (!sess->userdevsel) { sess->pcap_dev = lft_getifforremote(sess, sess->hostname); if(sess->exit_state < 0){ if(sess->wsess != NULL) { free(sess->wsess); sess->wsess = NULL; } /* if (sess->hostname != NULL) free(sess->hostname); */ return; } #if !defined(__CYGWIN__) && !defined(WIN32) && !defined(_WIN32) if (sess->pcap_dev == NULL) sess->pcap_dev = pcap_lookupdev (ebuf); if (sess->pcap_dev == NULL) { LFTErrHandler(sess, ERR_PCAP_ERROR, ebuf); if(sess->wsess != NULL) { free(sess->wsess); sess->wsess = NULL; } /* if (sess->hostname != NULL) free(sess->hostname); */ return; } #else if (sess->pcap_dev == NULL) { LFTErrHandler(sess, ERR_DISCOVER_INTERFACE, NULL); if(sess->wsess != NULL) { free(sess->wsess); sess->wsess = NULL; } return; } #endif /* we have a receive device, set the source address */ sess->pcap_send_dev = sess->pcap_dev; sess->local_address.s_addr = lft_getifaddr(sess->pcap_dev); } else { struct in_addr addr; if (inet_aton(sess->userdev, &addr)) { /* specified by ip address -- look up device. */ sess->pcap_dev = lft_getifname(addr); if (sess->pcap_dev != 0) { LFTErrHandler(sess, ERR_UNKNOWN_INTERFACE, NULL); if(sess->wsess != NULL) { free(sess->wsess); sess->wsess = NULL; } return; } /* we have a receive device, set the source address */ sess->local_address.s_addr = lft_getifaddr(sess->pcap_dev); } else sess->pcap_dev = sess->userdev; sess->pcap_send_dev = sess->userdev; sess->local_address.s_addr = lft_getifaddr(sess->pcap_dev); }; /* if user wants a different/spoof interface, facilitate */ if (sess->senddevsel > 0) { struct in_addr addr; if (inet_aton(sess->senddev, &addr)) { /* specified by ip address -- force using default device */ /*sess->pcap_send_dev = lft_getifname(addr);*/ sess->pcap_send_dev = lft_getifforremote(sess, sess->hostname); if (sess->pcap_send_dev == 0) { LFTErrHandler(sess, ERR_UNKNOWN_SEND_INTERFACE, NULL); return; } /* we have a send IP address, set the source address */ sess->local_address.s_addr = get_address(sess,sess->senddev); } else { sess->pcap_send_dev = sess->senddev; if (sess->pcap_send_dev == 0) { LFTErrHandler(sess, ERR_UNKNOWN_SEND_INTERFACE, NULL); return; } /* we have a send device, set the source address */ sess->local_address.s_addr = lft_getifaddr(sess->pcap_dev); } }; #if !defined(__CYGWIN__) && !defined(WIN32) && !defined(_WIN32) sess->pcapdescr = pcap_open_live (sess->pcap_dev, 1600, 0, 20, ebuf); /* retain and inform data link type */ if (sess->pcapdescr == 0) { LFTErrHandler(sess, ERR_PCAP_DEV_UNAVAILABLE, ebuf); if(sess->wsess != NULL) { free(sess->wsess); sess->wsess = NULL; } return; } sess->pcap_datalink = pcap_datalink(sess->pcapdescr); #if defined( __CYGWIN__ ) || defined( WIN32 ) || defined(_WIN32) sess->skip_header_len = 0; #else /* use pcap datalink type to determine skip_header_len */ if (sess->pcap_datalink == DLT_RAW) sess->skip_header_len = 0; else if (sess->pcap_datalink == DLT_PPP) sess->skip_header_len += 4; else if (sess->pcap_datalink == DLT_NULL) sess->skip_header_len += 4; else if (sess->pcap_datalink == DLT_PPP_ETHER) sess->skip_header_len += (8 + (sizeof (struct ether_header))); else if (sess->pcap_datalink == DLT_LINUX_SLL) sess->skip_header_len += 16; else /* assume ethernet: linktype EN10MB */ sess->skip_header_len = sizeof (struct ether_header); /* if we're on what looks like a serial link, up the timeout (scatter will take care of itself) */ /* if ((sess->pcap_datalink == DLT_PPP || sess->pcap_datalink == DLT_LINUX_SLL) && (sess->timeout_ms == DEFAULT_TIMEOUT_MS)) sess->timeout_ms += 5000; */ #endif if (sess->noisy) { LFTEvtHandler(sess,EVT_DEVICE_SELECTED,NULL); if(sess->exit_state < 0){ if(sess->wsess != NULL) { free(sess->wsess); sess->wsess = NULL; } return; } } #ifdef BSD_IP_STACK #ifndef NETBSD uint32_t bpfimmflag = 1; /* Instruct device to return packets immediately */ if (ioctl(pcap_fileno(sess->pcapdescr), BIOCIMMEDIATE, &bpfimmflag) < 0) { LFTErrHandler(sess, WRN_BIOCIMMEDIATE, pcap_strerror(errno)); if(sess->exit_state < 0){ if(sess->wsess != NULL) { free(sess->wsess); sess->wsess = NULL; } if(sess->pcapdescr != 0) { pcap_close(sess->pcapdescr); sess->pcapdescr=0; } return; } } #endif #endif /* Set pcap non-blocking mode */ if (pcap_setnonblock(sess->pcapdescr, 1, ebuf) < 0) { LFTErrHandler(sess, ERR_PCAP_NONBLOCK_ERROR, ebuf); if(sess->exit_state < 0){ if(sess->wsess != NULL) { free(sess->wsess); sess->wsess = NULL; } /* if(sess->hostname != NULL) free(sess->hostname); */ return; } } #endif if (sess->senddevsel > 0) init_address (sess, sess->hostname, sess->pcap_send_dev); else init_address (sess, sess->hostname, sess->pcap_dev); if(sess->exit_state < 0){ if(sess->wsess != NULL) { free(sess->wsess); sess->wsess = NULL; } /* if(sess->hostname != NULL) free(sess->hostname); */ return; } if (!sess->seq_start && sess->protocol != 1) { sess->seq_start = rand(); } if (sess->noisy > 3 || (sess->noisy > 0 && sess->seq_start)) { LFTEvtHandler(sess, EVT_SHOW_INITIAL_SEQNUM, NULL); if(sess->exit_state < 0){ if(sess->wsess != NULL) { free(sess->wsess); sess->wsess = NULL; } /* if (sess->hostname != NULL) free(sess->hostname); */ return; } } open_sockets(sess); if(sess->exit_state < 0) { if(sess->send_sock > 0) { #if defined(WIN32) || defined(_WIN32) closesocket(sess->send_sock); #else close(sess->send_sock); #endif sess->send_sock = 0; } #if defined(WIN32) || defined(_WIN32) if(sess->recv_sock > 0) { closesocket(sess->recv_sock); sess->recv_sock = 0; } #else if(sess->pcapdescr != 0) { pcap_close(sess->pcapdescr); sess->pcapdescr=0; } #endif return; } #if !defined(__CYGWIN__) && !defined(WIN32) && !defined(_WIN32) #ifndef LFT_DONT_USE_SAFE_UID if(!sess->check_seam && !sess->is_graphviz_subquery) setuid (getuid ()); #endif #endif if (sess->adaptive) { if (sess->retry_min < 2) sess->retry_min = 2; } if (sess->protocol==1) { if (sess->retry_min > 2) sess->retry_min = 2; } if (sess->retry_max < sess->retry_min) sess->retry_max = sess->retry_min; gettimeofday (&(sess->begin_time), NULL); LFTEvtHandler(sess,EVT_TRACE_START,NULL); if(sess->exit_state<0) { if(sess->send_sock > 0) { #if defined(WIN32) || defined(_WIN32) closesocket(sess->send_sock); #else close(sess->send_sock); #endif sess->send_sock = 0; } #if defined(WIN32) || defined(_WIN32) if(sess->recv_sock > 0) { closesocket(sess->recv_sock); sess->recv_sock = 0; } #endif return; } if(sess->protocol<2) /*UDP or TCP*/ { #if defined( __CYGWIN__ ) || defined( WIN32 ) || defined(_WIN32) for (;;) { cygwin_process(sess); if(sess->exit_state<0) break; if(check_timeouts(sess)) break; if(sess->exit_state<0) break; } #else while (pcap_dispatch (sess->pcapdescr, -1, pcap_process_packet, (u_char *)sess) >= 0) { if(sess->exit_state<0) break; if (sess->noisy > 6) { LFTEvtHandler(sess,EVT_DBG_CHECKPOINT2,NULL); if(sess->exit_state < 0) break; } if(check_timeouts (sess)) break; if(sess->exit_state < 0) break; } #endif } else { if(sess->protocol<4) icmp_trace_main_loop(sess, LFTErrHandler, LFTEvtHandler); /*ICMP traces*/ else tcp_base_trace_main_loop(sess, LFTErrHandler, LFTEvtHandler); } /*{ int i; printf("\n"); for(i=0;idebugmapidx;i++) { if(sess->debugmap[i].type) { printf("%3d <<<", i); printf("%3d %5d phop=%2d %d.%d.%d.%d\n", sess->debugmap[i].hop, sess->debugmap[i].port, sess->debugmap[i].phop, (int)sess->debugmap[i].ip.S_un.S_un_b.s_b1, (int)sess->debugmap[i].ip.S_un.S_un_b.s_b2, (int)sess->debugmap[i].ip.S_un.S_un_b.s_b3, (int)sess->debugmap[i].ip.S_un.S_un_b.s_b4); } else { printf("%3d -->", i); printf("%3d %5d\n", sess->debugmap[i].hop, sess->debugmap[i].port); } } }*/ if(sess->send_sock > 0) { #if defined(WIN32) || defined(_WIN32) closesocket(sess->send_sock); #else close(sess->send_sock); #endif sess->send_sock = 0; } #if defined(WIN32) || defined(_WIN32) if(sess->recv_sock > 0) { closesocket(sess->recv_sock); sess->recv_sock = 0; } #endif } /*---------------------------------------------------------------------------*/ void setOutputStyle(int nstyle) { if(nstyle<0 || nstyle>2) global_output_style=0; else global_output_style=nstyle; } int getOutputStyle(void) { return global_output_style; } int outputStyleIsXML(void) { if(global_output_style==1) return 1; return 0; } int outputStyleIsGraphViz(void) { if(global_output_style==2) return 1; return 0; } /*---------------------------------------------------------------------------*/ #define INCSIZE 500 static char * addtostringbuf(char * buf, size_t * bufsz, const char * addstr) { if(!buf || !(*bufsz)) { buf=malloc(INCSIZE); *bufsz=INCSIZE; buf[0]=0; } if(strlen(buf)+strlen(addstr)+1>(*bufsz)) { buf=realloc(buf, (*bufsz)+INCSIZE); *bufsz+=INCSIZE; } strncat(buf,addstr,(*bufsz) - strlen(buf) - 1); return buf; } /*---------------------------------------------------------------------------*/ static char * addNodeToRouteMap(char * routemap, size_t * routemapsz, char * prevlevelnodes, char ** currlevelnodes, size_t * currlevelnodessz, char * node) { char * pnode, * pnodeend; char pathbuff[100]; if((*currlevelnodes) && (*currlevelnodessz)) *currlevelnodes=addtostringbuf(*currlevelnodes, currlevelnodessz, ";"); *currlevelnodes=addtostringbuf(*currlevelnodes, currlevelnodessz, node); pnode=prevlevelnodes; pnodeend=pnode; while(pnodeend) { pnodeend=strchr(pnode,';'); if(pnodeend) *pnodeend=0; snprintf(pathbuff,100,"\t%s -> %s;\n",pnode,node); routemap=addtostringbuf(routemap, routemapsz, pathbuff); if(pnodeend) { *pnodeend=';'; pnode=pnodeend+1; } } return routemap; } /*---------------------------------------------------------------------------*/ static void UpdateLatency(const struct trace_packet_info_s *tp, double * minlat, double * maxlat, int * latinitialized) { double currlat=timediff_ms(tp->sent, tp->recv); if(!(*latinitialized)) { *minlat=currlat; *maxlat=currlat; *latinitialized=1; } else { if(*minlat > currlat) *minlat=currlat; if(*maxlat < currlat) *maxlat=currlat; } } /*---------------------------------------------------------------------------*/ static void PrintPacketInfoForGraphViz(lft_session_params * sess, const struct trace_packet_info_s *tp) { if(tp->recv.tv_sec) { if (tp->last_hop.s_addr != tp->hopaddr.s_addr) { if (sess->do_aslookup) { if (tp->asnumber) printf(" [%d]", tp->asnumber); else printf(" [AS?]"); } if (sess->do_netlookup) { if((uintptr_t)tp->netname && strlen(tp->netname)>0) printf(" [%s]", tp->netname); else printf(" [Net?]"); } if (tp->icmp_type < -2 || tp->icmp_type > 17) printf (" [icmp code %d]", tp->icmp_type); else { if (tp->icmp_type >= 0) printf (" [%s]", icmp_messages[tp->icmp_type + 1]); } printf(" "); print_host (sess, tp->hopaddr); if (tp->icmp_type == -1 && (sess->protocol<2 || sess->protocol>3)) printf(":%d",sess->dport); } } } /*---------------------------------------------------------------------------*/ void GraphVizOutput(lft_session_params * sess) { int reply,noreply,neglstart,neglend,anomtype,hopno,maxhop,icmpcode,holecount=0; char * rankstring=NULL; size_t rankstringsz=0; struct trace_packet_info_s *tp; char netnamecopy[512]; char * prevlevelnodes=NULL; size_t prevlevelnodessz=0; char * currlevelnodes=NULL; size_t currlevelnodessz=0; char * routemap=NULL; size_t routemapsz; char nodenamebuff[200]; double minlat, maxlat; char latencybuf[100]; int latinitialized; int asseam_hopno=-1; struct in_addr asseam_hopaddr; int netseam_hopno=-1; struct in_addr netseam_hopaddr; struct in_addr classbmask; struct in_addr masked_target; int prevasn=-1; struct in_addr prevasn_hopaddr; int prevasn_hopno; int lastishole; int netreached=0; int isseam; char cpath[1024]; int lastpos; if(sess->is_graphviz_subquery) return; if(sess->graphviz_icon_path) strncpy(cpath,sess->graphviz_icon_path,1022); else { if(!getcwd(cpath,1022)) { cpath[0]='.'; cpath[1]=DIRECTORY_SPLITTER; cpath[2]=0; } } lastpos=strlen(cpath)-1; if(cpath[lastpos]!=DIRECTORY_SPLITTER) { cpath[lastpos+1]=DIRECTORY_SPLITTER; cpath[lastpos+2]=0; } inet_aton("255.255.0.0", &classbmask); masked_target.s_addr=sess->remote_address.s_addr & classbmask.s_addr; printf("digraph %s {\n",GVGRAPHNAME); printf("\trankdir=TB;\n\tnode [fontname=%s,fontsize=%s];\n",GVFONTNAME,GVFONTSIZE); printf("\tSRC[%s, label=<",GVHOPSTYLE_SOURCE); prevlevelnodes=addtostringbuf(prevlevelnodes, &prevlevelnodessz, "SRC"); rankstring=addtostringbuf(rankstring, &rankstringsz, "Source"); printf("%s%s%s%s",GVNTBEG,cpath,GVNIMG_SOURCE,GVNTMID); print_host (sess, sess->local_address); if(sess->protocol==2 || sess->protocol==3) printf("%s>];\n",GVNTEND); else { if (sess->random_source) printf (":%d (pseudo-random)%s>];\n", sess->sport, GVNTEND); else printf (":%d%s>];\n", sess->sport, GVNTEND); } if (sess->num_hops) maxhop = sess->num_hops; else maxhop = sess->hop_info_length - 1; noreply = 0; reply = 0; neglstart=-1; neglend=-1; /* Find SEAMs at first*/ for(hopno = sess->ttl_min; hopno < sess->hop_info_length; hopno++) { icmpcode=-100; if(sess->hop_info[hopno].all_rcvd) { lastishole=0; SLIST_FOREACH(tp, &(sess->hop_info[hopno].packets), next_by_hop) { if(tp->recv.tv_sec) { if(hopno<=maxhop) icmpcode=tp->icmp_type; if(tp->last_hop.s_addr != tp->hopaddr.s_addr) { if((tp->hopaddr.s_addr & classbmask.s_addr) == masked_target.s_addr) netreached=1; else { netseam_hopno=hopno; netseam_hopaddr=tp->hopaddr; } if(sess->do_aslookup || sess->do_netlookup) { if(prevasn==-1) { if(tp->asnumber) { prevasn=tp->asnumber; prevasn_hopno=hopno; prevasn_hopaddr=tp->hopaddr; } } else { if(tp->asnumber) { if(tp->asnumber!=prevasn) { asseam_hopno=prevasn_hopno; asseam_hopaddr=prevasn_hopaddr; } prevasn=tp->asnumber; prevasn_hopno=hopno; prevasn_hopaddr=tp->hopaddr; } } } } } } } else lastishole=1; if(icmpcode==-1) break; } if(!netreached) netseam_hopno=-1; if(lastishole) asseam_hopno=-1; for(hopno = sess->ttl_min; hopno < sess->hop_info_length; hopno++) { icmpcode=-100; latinitialized=0; anomtype=0; if((sess->hop_info[hopno].state == HS_SEND_FIN) && (sess->hop_info[hopno+1].state == HS_SEND_SYN) && (sess->hop_info[hopno+1].ts_last_recv.tv_sec)) anomtype=1; if((sess->hop_info[hopno].state != HS_SEND_SYN_ACK) && (sess->hop_info[hopno+1].state == HS_SEND_SYN_ACK) && (hopno == (sess->num_hops - 1))) anomtype=2; if((sess->hop_info[hopno].flags & HF_ENDPOINT) && (noreply >= ((maxhop - sess->ttl_min)/2)) && sess->num_hops > 3) anomtype=3; if(sess->hop_info[hopno].all_rcvd == 0) { reply=0; if(neglstart==-1) neglstart=hopno; neglend=hopno; } else { if(neglstart!=-1) { holecount++; printf("\tHOLE%d[%s, label=<",holecount,GVHOPSTYLE_HOLE); printf("%s%s%s%s",GVNTBEG,cpath,GVNIMG_HOLE,GVNTMID); snprintf(nodenamebuff,200,"HOLE%d",holecount); printf("Potentially Cloaked Device%s>];\n",GVNTEND); routemap=addNodeToRouteMap(routemap, &routemapsz, prevlevelnodes, &currlevelnodes, &currlevelnodessz, nodenamebuff); free(prevlevelnodes); prevlevelnodes=currlevelnodes; prevlevelnodessz=currlevelnodessz; currlevelnodes=NULL; currlevelnodessz=0; if(neglstart == neglend) snprintf(nodenamebuff,200,"\"No reply received from TTL %d\"", neglstart+1); else snprintf(nodenamebuff,200,"\"No reply received from TTLs %d through %d\"", neglstart+1, neglend+1); rankstring=addtostringbuf(rankstring, &rankstringsz, " -> "); rankstring=addtostringbuf(rankstring, &rankstringsz, nodenamebuff); neglstart=-1; neglend=-1; } int cnt=0; SLIST_FOREACH(tp, &(sess->hop_info[hopno].packets), next_by_hop) { if(tp->recv.tv_sec) { const char * img=GVNIMG_REGULAR; cnt++; if(hopno<=maxhop) icmpcode=tp->icmp_type; reply = 1; strncpy(netnamecopy, tp->netname, 511); if(tp->last_hop.s_addr != tp->hopaddr.s_addr) { if(icmpcode==-1) { printf("\tTRG["); snprintf(nodenamebuff,200,"TRG"); if(sess->target_open > 0) { printf("%s, label=<%s%s", GVHOPSTYLE_TARGET_OPEN,GVNTBEG,cpath); img=GVNIMG_TRGOPEN; } else { if(sess->target_filtered) { printf("%s, label=<%s%s", GVHOPSTYLE_TARGET_FILTERED,GVNTBEG,cpath); img=GVNIMG_TRGFILTERED; } else { printf("%s, label=<%s%s", GVHOPSTYLE_TARGET_CLOSED, GVNTBEG, cpath); img=GVNIMG_TRGCLOSED; } } } else { printf("\tHOP%d_%d[",hopno+1,cnt); snprintf(nodenamebuff,200,"HOP%d_%d",hopno+1,cnt); switch (anomtype) { case 1: printf("%s, label=<%s%s", GVHOPSTYLE_ANOMALY1, GVNTBEG, cpath); img=GVNIMG_ANOMALY1; break; case 2: printf("%s, label=<%s%s", GVHOPSTYLE_ANOMALY2, GVNTBEG, cpath); img=GVNIMG_ANOMALY2; break; case 3: printf("%s, label=<%s%s", GVHOPSTYLE_ANOMALY3, GVNTBEG, cpath); img=GVNIMG_ANOMALY3; break; default: printf("%s, label=<%s%s", GVHOPSTYLE_BASE, GVNTBEG, cpath); img=GVNIMG_REGULAR; break; } } if(img==GVNIMG_REGULAR && ((hopno==asseam_hopno && tp->hopaddr.s_addr==asseam_hopaddr.s_addr) || (hopno==netseam_hopno && tp->hopaddr.s_addr==netseam_hopaddr.s_addr))) img=GVNIMG_SEAM; routemap=addNodeToRouteMap(routemap, &routemapsz, prevlevelnodes, &currlevelnodes, &currlevelnodessz, nodenamebuff); UpdateLatency(tp,&minlat,&maxlat,&latinitialized); printf("%s%s",img,GVNTMID); PrintPacketInfoForGraphViz(sess,tp); isseam=0; if(hopno==asseam_hopno && tp->hopaddr.s_addr==asseam_hopaddr.s_addr) { printf("(AS-Method Seam"); isseam=1; } if(hopno==netseam_hopno && tp->hopaddr.s_addr==netseam_hopaddr.s_addr) { printf("(Network-Method Seam"); isseam=1; } if(isseam) { if(sess->check_seam) { printf(": "); char hostname[100]; lft_session_params * subsess=LFTSessionOpen(); strncpy(hostname, inet_ntoa(tp->hopaddr),100); subsess->senddevsel = 1; subsess->senddev = sess->pcap_send_dev; subsess->userdevsel = 1; subsess->userdev = sess->pcap_dev; subsess->auto_ports=0; subsess->dport=179; subsess->seq_start=30; subsess->retry_min=1; subsess->retry_max=1; subsess->resolve_names=0; subsess->ahead_limit=1; subsess->break_on_icmp = 0; subsess->is_graphviz_subquery=1; subsess->hostname=hostname; subsess->hostname_lsrr_size = 0; LFTExecute(subsess); if(subsess->target_open > 0) printf("Vulnerable/Handshake"); else { if(subsess->target_filtered) printf("Protected/Filtered"); else printf("Vulnerable/Shun"); } LFTSessionClose(subsess); } printf(")"); } printf("%s>];\n",GVNTEND); } else UpdateLatency(tp,&minlat,&maxlat,&latinitialized); } } if(minlat==maxlat) snprintf(latencybuf,100,": %.1fms",minlat); else snprintf(latencybuf,100,": %.1f - %.1fms",minlat,maxlat); if(icmpcode==-1) { rankstring=addtostringbuf(rankstring, &rankstringsz, " -> \"Destination"); if (sess->protocol==0 || sess->protocol==4) { rankstring=addtostringbuf(rankstring, &rankstringsz, " [target "); if (sess->target_open > 0) rankstring=addtostringbuf(rankstring, &rankstringsz, "open]"); else { if(sess->target_filtered > 0) rankstring=addtostringbuf(rankstring, &rankstringsz, "filtered]"); else rankstring=addtostringbuf(rankstring, &rankstringsz, "closed]"); } } rankstring=addtostringbuf(rankstring, &rankstringsz, latencybuf); } else { snprintf(nodenamebuff,200,"\"%d", hopno+1); rankstring=addtostringbuf(rankstring, &rankstringsz, " -> "); rankstring=addtostringbuf(rankstring, &rankstringsz, nodenamebuff); rankstring=addtostringbuf(rankstring, &rankstringsz, latencybuf); } switch (anomtype) { case 1: rankstring=addtostringbuf(rankstring, &rankstringsz, "\\n"); rankstring=addtostringbuf(rankstring, &rankstringsz, GV_ANOMALY1_TEXT); break; case 2: rankstring=addtostringbuf(rankstring, &rankstringsz, "\\n"); rankstring=addtostringbuf(rankstring, &rankstringsz, GV_ANOMALY2_TEXT); break; case 3: rankstring=addtostringbuf(rankstring, &rankstringsz, "\\n"); rankstring=addtostringbuf(rankstring, &rankstringsz, GV_ANOMALY3_TEXT); break; default: break; } rankstring=addtostringbuf(rankstring, &rankstringsz, "\""); free(prevlevelnodes); prevlevelnodes=currlevelnodes; prevlevelnodessz=currlevelnodessz; currlevelnodes=NULL; currlevelnodessz=0; } if(icmpcode==-1) break; } if(neglstart!=-1) { holecount++; printf("\tHOLE%d[%s, label=<",holecount,GVHOPSTYLE_HOLE); printf("%s%s%s%s",GVNTBEG,cpath,GVNIMG_HOLE,GVNTMID); snprintf(nodenamebuff,200,"HOLE%d",holecount); printf("No Response%s>];\n",GVNTEND); routemap=addNodeToRouteMap(routemap, &routemapsz, prevlevelnodes, &currlevelnodes, &currlevelnodessz, nodenamebuff); free(prevlevelnodes); prevlevelnodes=currlevelnodes; prevlevelnodessz=currlevelnodessz; currlevelnodes=NULL; currlevelnodessz=0; snprintf(nodenamebuff,200,"\"No reply received after TTL %d\"", neglstart+1); rankstring=addtostringbuf(rankstring, &rankstringsz, " -> "); rankstring=addtostringbuf(rankstring, &rankstringsz, nodenamebuff); neglstart=-1; neglend=-1; } free(prevlevelnodes); printf("\tranksep=equally;\n\t{\n\t\tnode [shape=plaintext];\n\t\t%s;\n\t}\n",rankstring); free(rankstring); printf("%s",routemap); free(routemap); printf("}\n"); } /*---------------------------------------------------------------------------*/ lft-3.8/INSTALL000644 000766 000000 00000023563 11053131665 013134 0ustar00vicwheel000000 000000 ####################################################### ## Installation Instructions for Layer Four Traceroute ####################################################### Instructions are provided for different platforms below. ####################################################### On WINDOWS: ####################################################### Building this program on Windows is possible without UNIX-like compatibility environments. To compile the program, use the Microsoft Visual Studio Express edition which is free and may be downloaded from http://www.microsoft.com You must also download and install the Windows Platform SDK which is available from the same web site. The platform SDK provides the necessary Winsock header files. Please read the documentation related to fully installing the Windows Platform SDK for use with Visual Studio Express or your alternative compiler to ensure all necessary files are placed in the appropriate locations, specifically the header files. Using VS Express, you may build LFT by following these instructions: Open a Command Prompt window (cmd.exe), change directories to the "lft" folder you downloaded, and type the following commands (from inside the LFT folder): "%VS80COMNTOOLS%vsvars32.bat" nmake -f makefile.vc This will create lft.exe and whob.exe in the current folder. Of course, you may move the files wherever you choose. Depending on the Windows platform, you may or may not have TCP raw sockets functionality, causing TCP traces to fail. However, in this case ICMP and UDP traces should still work. You may also have to explicitly allow lft.exe to use the network by creating a rule in Windows (or your 3rd-party) Firewall. ####################################################### On UNIX-like operating systems: ####################################################### Some special options to consider when running './configure' are: 1. Using '--enable-gtod' is useful on platforms where BPF timestamps are not precise. This forces LFT to call gettimeofday() on each packet instead of relying on the timestamp in the packet's pcap header. 2. Using '--enable-universal' will automatically compile universal binaries on the Darwin/Mac OS X platform for PPC and Intel architectures. Below are generic installation instructions. The `configure' shell script attempts to guess correct values for various system-dependent variables used during compilation. It uses those values to create a `Makefile' in each directory of the package. It may also create one or more `.h' files containing system-dependent definitions. Finally, it creates a shell script `config.status' that you can run in the future to recreate the current configuration, a file `config.cache' that saves the results of its tests to speed up reconfiguring, and a file `config.log' containing compiler output (useful mainly for debugging `configure'). If you need to do unusual things to compile the package, please try to figure out how `configure' could check whether to do them, and mail diffs or instructions to the address given in the `README' so they can be considered for the next release. If at some point `config.cache' contains results you don't want to keep, you may remove or edit it. The file `configure.in' is used to create `configure' by a program called `autoconf'. You only need `configure.in' if you want to change it or regenerate `configure' using a newer version of `autoconf'. The simplest way to compile this package is: 1. `cd' to the directory containing the package's source code and type `./configure' to configure the package for your system. If you're using `csh' on an old version of System V, you might need to type `sh ./configure' instead to prevent `csh' from trying to execute `configure' itself. Running `configure' takes awhile. While running, it prints some messages telling which features it is checking for. 2. Type `make' to compile the package. 3. Optionally, type `make check' to run any self-tests that come with the package. 4. Type `make install' to install the programs and any data files and documentation. 5. You can remove the program binaries and object files from the source code directory by typing `make clean'. To also remove the files that `configure' created (so you can compile the package for a different kind of computer), type `make distclean'. There is also a `make maintainer-clean' target, but that is intended mainly for the package's developers. If you use it, you may have to get all sorts of other programs in order to regenerate files that came with the distribution. Compilers and Options ===================== Some systems require unusual options for compilation or linking that the `configure' script does not know about. You can give `configure' initial values for variables by setting them in the environment. Using a Bourne-compatible shell, you can do that on the command line like this: CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure Or on systems that have the `env' program, you can do it like this: env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure Compiling For Multiple Architectures ==================================== You can compile the package for more than one kind of computer at the same time, by placing the object files for each architecture in their own directory. To do this, you must use a version of `make' that supports the `VPATH' variable, such as GNU `make'. `cd' to the directory where you want the object files and executables to go and run the `configure' script. `configure' automatically checks for the source code in the directory that `configure' is in and in `..'. If you have to use a `make' that does not supports the `VPATH' variable, you have to compile the package for one architecture at a time in the source code directory. After you have installed the package for one architecture, use `make distclean' before reconfiguring for another architecture. Installation Names ================== By default, `make install' will install the package's files in `/usr/local/bin', `/usr/local/man', etc. You can specify an installation prefix other than `/usr/local' by giving `configure' the option `--prefix=PATH'. You can specify separate installation prefixes for architecture-specific files and architecture-independent files. If you give `configure' the option `--exec-prefix=PATH', the package will use PATH as the prefix for installing programs and libraries. Documentation and other data files will still use the regular prefix. In addition, if you use an unusual directory layout you can give options like `--bindir=PATH' to specify different values for particular kinds of files. Run `configure --help' for a list of the directories you can set and what kinds of files go in them. If the package supports it, you can cause programs to be installed with an extra prefix or suffix on their names by giving `configure' the option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. Optional Features ================= Some packages pay attention to `--enable-FEATURE' options to `configure', where FEATURE indicates an optional part of the package. They may also pay attention to `--with-PACKAGE' options, where PACKAGE is something like `gnu-as' or `x' (for the X Window System). The `README' should mention any `--enable-' and `--with-' options that the package recognizes. For packages that use the X Window System, `configure' can usually find the X include and library files automatically, but if it doesn't, you can use the `configure' options `--x-includes=DIR' and `--x-libraries=DIR' to specify their locations. Specifying the System Type ========================== There may be some features `configure' can not figure out automatically, but needs to determine by the type of host the package will run on. Usually `configure' can figure that out, but if it prints a message saying it can not guess the host type, give it the `--host=TYPE' option. TYPE can either be a short name for the system type, such as `sun4', or a canonical name with three fields: CPU-COMPANY-SYSTEM See the file `config.sub' for the possible values of each field. If `config.sub' isn't included in this package, then this package doesn't need to know the host type. If you are building compiler tools for cross-compiling, you can also use the `--target=TYPE' option to select the type of system they will produce code for and the `--build=TYPE' option to select the type of system on which you are compiling the package. Sharing Defaults ================ If you want to set default values for `configure' scripts to share, you can create a site shell script called `config.site' that gives default values for variables like `CC', `cache_file', and `prefix'. `configure' looks for `PREFIX/share/config.site' if it exists, then `PREFIX/etc/config.site' if it exists. Or, you can set the `CONFIG_SITE' environment variable to the location of the site script. A warning: not all `configure' scripts look for a site script. Operation Controls ================== `configure' recognizes the following options to control how it operates. `--cache-file=FILE' Use and save the results of the tests in FILE instead of `./config.cache'. Set FILE to `/dev/null' to disable caching, for debugging `configure'. `--help' Print a summary of the options to `configure', and exit. `--quiet' `--silent' `-q' Do not print messages saying which checks are being made. To suppress all normal output, redirect it to `/dev/null' (any error messages will still be shown). `--srcdir=DIR' Look for the package's source code in directory DIR. Usually `configure' can determine that directory automatically. `--version' Print the version of Autoconf used to generate the `configure' script, and exit. `configure' also accepts some other, not widely useful, options. lft-3.8/whois.c000644 000766 000000 00000251527 13263006600 013376 0ustar00vicwheel000000 000000 /* * Handle communication with whois servers. * * This file is part of the Prefix WhoIs Project. * See http://pwhois.org * * The full text of our legal notices is contained in the file called * COPYING, included with this Distribution. * * This software includes: * - simplified access to regular expressions * - tokenizer * - lookup functions for AS, NETNAME, ORGNAME * - works with the following sources: * ARIN, RIPE, APNIC, RADB, CYMRU, PWHOIS, RISWHOIS * - will do recursive lookups * - convenient framework for further whois digging * * To compile the standalone client: * cc -o whob whois.c -DSTANDALONE * * * Portions (c) Victor Oppleman (lft@oppleman.com) * Portions (c) 2011 Markus Gothe * Portions (c) 2002 Ugen Antsilevitch (ugen@xonix.com) * */ #include "lft_lib.h" #define PORT_WHOIS 43 #if defined(WIN32) || defined(_WIN32) #define read(a, b, c) recv(a, b, c, 0) #define write(a, b, c) send(a, b, c, 0) #define close(s) closesocket(s) #define snprintf _snprintf #endif #include "whois.h" #if defined(BSD_IP_STACK) #define pcap_snprintf snprintf #endif /*#define ASSERT(x) if (!(x)) { fprintf(stderr, "Assertion ("#x") failed\n"); exit(EXIT_FAILURE); }*/ /* OPTIONS and variable initialization */ static char pwhois_server[] = "whois.pwhois.org"; static char myaddress_server[] = "myaddress.today"; static char radb_server[] = "whois.ra.net"; static char cymru_server[] = "whois.cymru.com"; static char arin_server[] = "whois.arin.net"; static char apnic_server[] = "whois.apnic.net"; static char ripe_server[] = "whois.ripe.net"; static char ripe_ris_server[] = "riswhois.ripe.net"; #ifdef STANDALONE const char *version = "3.8"; /* set version string for library and client */ const char *appname = "WhoB"; /* set application name */ static int go_interactive = 0; /* We'll wait on STDIN unless args suggest otherwise */ static int use_cymru = 0; /* Don't use Cymru by default */ static int use_riswhois = 0; /* Don't use RIPE NCC RIS by default */ static int display_orgname = 1; /* Display orgname by default */ static int display_aspath = 0; /* Don't display AS-PATH by default */ static int display_netname = 0; /* Don't display netname by default */ static int display_radb_as = 0; /* Don't display RADB Origin-AS by default */ static int show_routes_byasn = 0; /* Don't show all advertisements by default */ static int show_routes_bytransitasn = 0; /* Don't show all routes that transit ASN by default */ static int show_networks_byasn = 0; /* Don't show all networks by default */ static int show_contacts_byasn = 0; /* Don't show all contact info by default */ static int show_routes_byprefix = 0; /* Don't show all routes by prefix by default */ static int show_server_status = 0; /* Don't show pwhois server status by default */ static int show_cache_date = 0; /* Don't show pwhois cache date by default */ static int read_from_file = 0; /* Don't read input from file by default */ static int riswhoisfromfile = 0; /* Don't use riswhois by default for readfromfile */ static int cymrufromfile = 0; /* Don't use Cymru by default for readfromfile */ static int use_gigo = 1; /* Use GIGO feature by default */ static int use_stdin = 0; /* Don't use STDIN for bulk file input by default */ static const unsigned int max_hostname_input = 200; /* Maximum length of input from user */ static const int max_lines = 2500; /* Maximum lines to read from bulk file per query */ static const int line_size = 256; /* Maximum line length */ static char hostname[256]; #endif /* END of OPTIONS and variable initialization */ #if defined(WIN32) || defined(_WIN32) char * index(char *s, char c) { char *t; if (!s) return NULL; for (t = s; *t; t++) if (*t == c) { return t; } /* Return terminating \0 if specifically requested */ if (c == '\0') return t; return NULL; } #endif #if defined(WIN32) || defined(_WIN32) int inet_aton(const char *cp, struct in_addr *pin) { if (!pin) return -1; pin->s_addr = inet_addr(cp); return (pin->s_addr != -1) ? 1 : 0; } #endif typedef struct token_s { char *ptr; } token_t; static token_t * tokens(char *buf, const char *sep) { char *c, *c1; int size, cur; token_t *rt; if (!buf || !sep) return NULL; size = 1; for (c = buf; *c ; c++) if (index(sep, *c)) { size++; while (*c && index(sep, *c)) c++; } size++; /* for the NULL */ if (!(rt = (token_t *)malloc(size * sizeof(token_t)))) return NULL; memset(rt, 0, size * sizeof(token_t)); rt[0].ptr = buf; cur = 0; for (c = buf; *c ; c++) { if (index(sep, *c)) { c1 = c; while (*c && index(sep, *c)) c++; if (*c) rt[++cur].ptr = c; *c1 = '\0'; } } rt[++cur].ptr = NULL; return rt; } typedef struct ip_blk_s { unsigned int start; unsigned int end; } ip_blk_t; static ip_blk_t * w_blk2range(char *s_start, char *s_end) { struct in_addr in; unsigned int s, e; ip_blk_t *r; if (!s_start || !s_end) return NULL; if (!inet_aton(s_start, &in)) return NULL; s = ntohl(in.s_addr); if (!inet_aton(s_end, &in)) return NULL; e = ntohl(in.s_addr); if (!(r = malloc(sizeof(ip_blk_t)))) return NULL; r->start = s; r->end = e; return r; } static ip_blk_t * w_mask2range(char *addr, char *mask) { struct in_addr in; unsigned int s, m; ip_blk_t *r; if (!addr || !mask) return NULL; m = (unsigned int)strtoul(mask, (char **)NULL, 10); if (m > 32) return NULL; if (!inet_aton(addr, &in)) return NULL; s = ntohl(in.s_addr); if (!(r = malloc(sizeof(ip_blk_t)))) return NULL; r->start = s &~ (((unsigned)0xffffffff) >> m); r->end = s | (((unsigned)0xffffffff) >> m); return r; } static int rm_spaces(char* str) { /* Remove spaces (isspace()) from anywhere within a string ONLY operates on a null-terminated (\0) string! */ int j = -1; unsigned int i; if (!str) return 0; for (i=0; i<=strlen(str); i++) if (!(isspace(*(str+i)))) *(str+(++j)) = *(str+i); else continue; return 1; } static char *match_prefix(const char *prefix, const char *target) { /* Target will be something like "origin: AS22773" and prefix will be "origin:" and * we return a pointer to "AS22773" */ while (*prefix) { if (tolower(*prefix) != tolower(*target)) return NULL; prefix++; target++; } while (isspace(*target)) target++; /* strip out the leading AS from the number */ if (strncmp(target,"AS",2) == 0) target += 2; return strdup(target); } static ip_blk_t *match_iprange(char *target) { /* matches something like "1.2.3.4-5.6.7.8" */ char *pos, *dash, *beforedash; /* ip_blk_t *out; */ while (isspace(*target)) target++; pos = target; while (*pos && !isspace(*pos)) pos++; beforedash = strdup(target); beforedash[pos-target] = 0; dash = strchr(target, '-'); if (!dash) return NULL; dash++; while (isspace(*dash)) dash++; return w_blk2range(beforedash, dash); } static ip_blk_t *match_ipprefix(char *target) { /* matches something like 1.2.3.0/24 */ char *slash, *pos; char *beforeslash; /* ip_blk_t *out; */ while (isspace(*target)) target++; pos = target; while (*pos && !isspace(*pos) && *pos != '/') pos++; beforeslash = strdup(target); beforeslash[pos - target] = 0; slash = strchr(target, '/'); if (!slash) return NULL; slash++; return w_mask2range(beforeslash, slash); } static char *match_inparens(char *target) { /* matches something like " (HELLO)" and returns "HELLO" */ char *end, *res; target = strchr(target, '('); if (!target) return NULL; target++; end = strchr(target, ')'); if (!end) return NULL; res = strdup(target); res[end - target] = 0; return res; } static char *match_afterparens(char *target) { /* matches something like " (HELLO) xxx" and returns a pointer to "xxx" */ target = strchr(target, '('); if (!target) return NULL; target = strchr(target, ')'); if (!target) return NULL; target++; while(*target && isspace(*target)) target++; if (*target) return strdup(target); else return NULL; } static int stricontains(const char *haystack, const char *needle) { /* Search for a substring without a string library */ int i, j, match; i = 0, j = 0; while (haystack[i] != '\0') { while (tolower(haystack[i]) != tolower(needle[0]) && haystack[i] != '\0') i++; if (haystack[i] == '\0') return (-1); match = i; while (tolower(haystack[i]) == tolower(needle[j]) && haystack[i] != '\0' && needle[j] != '\0') { i++; j++; } if (needle[j] == '\0') return (match); if (haystack[i] == '\0') return (-1); i = match + 1; j = 0; } return 0; } whois_session_params *w_init(void) { /* int e; */ whois_session_params *wsess = (whois_session_params *)malloc(sizeof(whois_session_params)); wsess->w_noisy = 0; /* Don't show debug msgs by default */ memset(&(wsess->pw_serv), 0, sizeof(wsess->pw_serv)); wsess->consolidated_asn[0] = wsess->consolidated_asp[0] = wsess->consolidated_route[0] = wsess->consolidated_orgname[0] = wsess->consolidated_netname[0] ='?'; wsess->consolidated_asn[1] = wsess->consolidated_asp[1] = wsess->consolidated_route[1] = wsess->consolidated_orgname[1] = wsess->consolidated_netname[1] =0; memset(&wsess->tbuf, 0, sizeof(wsess->tbuf)); wsess->logprintfCookie = 0; return wsess; } whois_session_params * w_reinit(whois_session_params * wsess) { /* int e; */ wsess->w_noisy = 0; /* Don't show debug msgs by default */ memset(&(wsess->pw_serv), 0, sizeof(wsess->pw_serv)); wsess->consolidated_asn[0] = wsess->consolidated_asp[0] = wsess->consolidated_route[0] = wsess->consolidated_orgname[0] = wsess->consolidated_netname[0] = '?'; wsess->consolidated_asn[1] = wsess->consolidated_asp[1] = wsess->consolidated_route[1] = wsess->consolidated_orgname[1] = wsess->consolidated_netname[1] = 0; memset(&wsess->tbuf, 0, sizeof(wsess->tbuf)); wsess->logprintfCookie = 0; return wsess; } __inline__ void w_close(whois_session_params * wsess) { free(wsess); } static char * w_ask(const char *serv, const char *q, const char *port) { int s; struct sockaddr_in sin4; struct hostent *hp; char *br; int q_s, br_s, cur, n, myport; char buf[128], *sendbuf; #ifdef USE_WHOIS_TIMEOUT #if defined(WIN32) || defined(_WIN32) int whreadtimeout = 20000; #else struct timeval whreadtimeout; whreadtimeout.tv_sec = 20; whreadtimeout.tv_usec = 0; #endif #endif if (!serv || !q) return NULL; if (!(hp = gethostbyname(serv))) return NULL; sin4.sin_family = AF_INET; if (port) { if (!(myport = (int)strtol(port, (char **)NULL, 10))) return NULL; sin4.sin_port = htons(myport); } else { sin4.sin_port = htons(PORT_WHOIS); } memcpy((void *)&sin4.sin_addr, hp->h_addr, hp->h_length); if ((s = socket(PF_INET, SOCK_STREAM, 0)) < 0) return NULL; #ifdef USE_WHOIS_TIMEOUT setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, &whreadtimeout, sizeof(whreadtimeout)); #endif if (connect(s, (const struct sockaddr *)(const void *)&sin4, sizeof (sin4)) < 0) return NULL; br_s = 512; if (!(br = (char *)malloc(br_s))) return NULL; q_s = strlen(q); sendbuf = (char *)malloc(q_s+2); if(q[q_s-1]=='\r' || q[q_s-1]=='\n') { strncpy(sendbuf, q, q_s+1); } else { strncpy(sendbuf, q, q_s+1); sendbuf[q_s]='\n'; q_s++; sendbuf[q_s]=0; } if (write(s, sendbuf, q_s) != q_s) /* || write(s, "\r\n", 2) != 2)*/ return NULL; cur = 0; while ((n = read(s, buf, sizeof(buf))) > 0) { if ((cur + n) >= br_s) { br_s = br_s * 2; if (!(br = realloc(br, br_s))) return NULL; } strncpy((char *)&br[cur], buf, n); cur += n; } br[cur] = 0; close(s); return br; } int w_lookup_all_pwhois(whois_session_params * wsess, char *addr) { token_t *ls; char *serv, *reply; const char *format; int i; if (!addr) return -1; if (strlen(wsess->pw_serv) > 0) serv = wsess->pw_serv; else serv = pwhois_server; reply = w_ask(serv, addr, NULL); if (!reply) { if (wsess->w_noisy) { if(wsess->logprintfCookie) lft_printf(wsess->logprintfCookie,"No reply from %s.\n",serv); else fprintf(stderr,"No reply from %s.\n",serv); } return -1; } ls = tokens(reply, "\n"); for (i = 0; ls[i].ptr; i++) { char *value = NULL; if ((value = match_prefix("origin-as:", ls[i].ptr))) { if (strncmp(wsess->consolidated_asn,"?",1) == 0) strncpy(wsess->consolidated_asn,value,255); } else if ((value = match_prefix("prefix:", ls[i].ptr))) { if (strncmp(wsess->consolidated_route,"?",1) == 0) strncpy(wsess->consolidated_route,value,255); } else if ((value = match_prefix("as-path:", ls[i].ptr))) { if (strncmp(wsess->consolidated_asp,"?",1) == 0) strncpy(wsess->consolidated_asp,value,255); } else if ((value = match_prefix("org-name:", ls[i].ptr))) { if (strncmp(wsess->consolidated_orgname,"?",1) == 0) strncpy(wsess->consolidated_orgname,value,255); } else if ((value = match_prefix("net-name:", ls[i].ptr))) { if (strncmp(wsess->consolidated_netname,"?",1) == 0) strncpy(wsess->consolidated_netname,value,255); } else if ((value = match_prefix("cache-date:", ls[i].ptr))) { if ((wsess->tval = atol(value)) != 0) { format = "%d-%b-%y %H:%M:%S %Z"; (void)strftime(wsess->tbuf, sizeof(wsess->tbuf), format, localtime(&wsess->tval)); } } if(value) free(value); } free(ls); free(reply); return 0; } int w_lookup_all_riswhois(whois_session_params * wsess, char *addr) { token_t *ls=NULL; char *serv=NULL, *reply=NULL; const char *risopts = "-1 -M "; /* 1 object/prefix, Most specific */ char *risquery = malloc((strlen(risopts)* sizeof(char)) + (strlen(addr) * sizeof(char)) + 1); unsigned int i; if (!addr) return -1; /* prepare the text-string-based query */ risquery[0]=0; strcat(risquery,risopts); strcat(risquery,addr); reply = w_ask(ripe_ris_server, risquery, NULL); if (!reply) { if (wsess->w_noisy) { if(wsess->logprintfCookie) lft_printf(wsess->logprintfCookie,"No reply from %s.\n",serv); else fprintf(stderr,"No reply from %s.\n",serv); } return -1; } ls = tokens(reply, "\n"); for (i = 0; ls[i].ptr; i++) { char *value = NULL; if ((value = match_prefix("origin:", ls[i].ptr))) { if (strncmp(wsess->consolidated_asn,"?",1) == 0) strncpy(wsess->consolidated_asn,value,255); } else if ((value = match_prefix("route:", ls[i].ptr))) { if (strncmp(wsess->consolidated_route,"?",1) == 0) strncpy(wsess->consolidated_route,value,255); } else if ((value = match_prefix("descr:", ls[i].ptr))) { if (strncmp(wsess->consolidated_orgname,"?",1) == 0) strncpy(wsess->consolidated_orgname,value,255); if (strncmp(wsess->consolidated_netname,"?",1) == 0) strncpy(wsess->consolidated_netname,value,255); } if(value) free(value); } free(ls); free(reply); free(risquery); return 0; } int w_lookup_as_pwhois(whois_session_params * wsess, char *addr) { token_t *ls; char *reply = NULL, *value = NULL; unsigned int i; int ans = 0; if (!addr) return 0; reply = w_ask(pwhois_server, addr, NULL); if (!reply) { if (wsess->w_noisy) { if(wsess->logprintfCookie) lft_printf(wsess->logprintfCookie,"No reply from %s.\n",pwhois_server); else fprintf(stderr,"No reply from %s.\n",pwhois_server); } return 0; } ls = tokens(reply, "\n"); for (i = 0; ls[i].ptr; i++) { if ((value = match_prefix("origin-as:", ls[i].ptr))) break; } free(ls); free(reply); if (!value) return 0; rm_spaces(value); for (i = 0; i < strlen(value); i++) { if (!isdigit(value[i])) { free(value); return 0; } } ans = strtol(value, (char **)NULL, 10); free(value); return ans; } int w_lookup_as_riswhois(whois_session_params * wsess, char *addr) { token_t *ls; char *reply = NULL, *value = NULL; const char *risopts = "-1 -M "; /* 1 object/prefix, Most specific */ char *risquery = malloc((strlen(risopts) * sizeof(char)) + (strlen(addr) * sizeof(char)) + 1); unsigned int i; int ans = 0; if (!addr) return 0; /* prepare the text-string-based query */ risquery[0]=0; strcat(risquery,risopts); strcat(risquery,addr); reply = w_ask(ripe_ris_server, risquery, NULL); if (!reply) { if (wsess->w_noisy) { if(wsess->logprintfCookie) lft_printf(wsess->logprintfCookie,"No reply from %s.\n",ripe_ris_server); else fprintf(stderr,"No reply from %s.\n",ripe_ris_server); } return 0; } ls = tokens(reply, "\n"); for (i = 0; ls[i].ptr; i++) { if ((value = match_prefix("origin:", ls[i].ptr))) break; } free(ls); free(reply); free(risquery); if (!value) return 0; rm_spaces(value); for (i = 0; i < strlen(value); i++) { if (!isdigit(value[i])) { free(value); return 0; } } ans = atoi(value); free(value); return ans; } int w_lookup_all_riswhois_bulk(whois_session_params * wsess, struct ip_list_array *iplist) { token_t *responses=0; char *reply=0; const char *bulk_begin = "-k -1 -M\n"; /* Keepalive, 1 object/prefix, Most specific */ const char *bulk_end = "-k"; char *bulk_ip_query = malloc((strlen(bulk_begin) * sizeof(char)) + ((strlen(bulk_end)+1) * sizeof(char)) + (16 * (*iplist).numItems)); int i = 0; unsigned int j = 0; int k = 0; int entity_id = 0; unsigned int until = 0; char *value = NULL; bulk_ip_query[0]=0; if (!iplist) return -1; /* clean up the response data set in case the caller doesn't (and we return error) */ for (i = 0; i < (*iplist).numItems; i++) { (*iplist).asn[(i)] = 0; memset((*iplist).netName[i],0,sizeof((*iplist).netName[i])); memset((*iplist).orgName[i],0,sizeof((*iplist).orgName[i])); } /* prepare the text-string-based query */ strcat(bulk_ip_query,bulk_begin); for (i = 0; i < ((*iplist).numItems); i++) { strcat(bulk_ip_query,inet_ntoa((*iplist).ipaddr[i])); strcat(bulk_ip_query,"\n"); } strcat(bulk_ip_query,bulk_end); reply = w_ask(ripe_ris_server, bulk_ip_query, NULL); if (!reply) { if (wsess->w_noisy) { if(wsess->logprintfCookie) lft_printf(wsess->logprintfCookie,"No reply from %s.\n",ripe_ris_server); else fprintf(stderr,"No reply from %s.\n",ripe_ris_server); } /* clean up the response data set in case the caller doesn't */ for (i = 0; i < (*iplist).numItems; i++) (*iplist).asn[(i)] = 0; return -1; } responses = tokens(reply, "\n"); for (i = 0; responses[i].ptr; i++) { value = NULL; if ((value = match_prefix("origin:", responses[i].ptr)) != NULL) { if (k > 0) { entity_id++; k = 0; } rm_spaces(value); /* strip out any spaces from the ASN */ for (j = 0; j < strlen(value); j++) { if (!isdigit(value[j])) { if (wsess->w_noisy) { if(wsess->logprintfCookie) lft_printf(wsess->logprintfCookie,"Parse error at \'%c\': non-numeric value at position %d of %s).\n",value[i],i,value); else printf("Parse error at \'%c\': non-numeric value at position %d of %s).\n",value[i],i,value); } break; } } if(strtol(value, (char **) NULL, 10)) { (*iplist).asn[(entity_id)] = strtol(value, (char **)NULL, 10); k++; } else if (wsess->w_noisy > 2) { if(wsess->logprintfCookie) lft_printf(wsess->logprintfCookie,"Skipping additional object for same query.\n"); else fprintf(stderr,"Skipping additional object for same query.\n"); } } else if ((value = match_prefix("descr:", responses[i].ptr))) { strncpy((*iplist).orgName[entity_id],value,100); /* yes, this is duplicated. riswhois adds a netname attribute here, so we reuse 'descr' */ for (until = 0; until < strlen(value); until++) { if (isspace(value[until])) break; } strncpy((*iplist).netName[entity_id],value,(until)); k++; } else if ((value = match_prefix("% ", responses[i].ptr)) != NULL) { if (i > 5 && k < 1) { /* Weed out up to 5 leading lines from RIPE NCC RIS */ if (wsess->w_noisy > 2) { if(wsess->logprintfCookie) lft_printf(wsess->logprintfCookie,"%% MATCHED on '%s'\n",responses[i].ptr); else printf("%% MATCHED on '%s'\n",responses[i].ptr); } /* (*iplist).asn[(entity_id)] = 0; */ k++; } /* else printf("'%s'\n",responses[i].ptr); */ } /* else printf("'%s'\n",responses[i].ptr); */ if(value) free(value); if ((entity_id) >= (*iplist).numItems) break; } free(responses); free(reply); free(bulk_ip_query); return 0; } int w_lookup_as(whois_session_params * wsess, char *addr) { token_t *ls; ip_blk_t *a = NULL, *b = NULL; /* char *sa, *sb; */ char *reply, *value = NULL; unsigned int i; int ans = 0; int use_this = 1; if (!addr) return 0; reply = w_ask(radb_server, addr, NULL); if (!reply) { if (wsess->w_noisy) { if(wsess->logprintfCookie) lft_printf(wsess->logprintfCookie,"No reply from %s.\n",radb_server); else fprintf(stderr,"No reply from %s.\n",radb_server); } return 0; } ls = tokens(reply, "\n"); for (i = 0; ls[i].ptr; i++) { value = NULL; if ((value = match_prefix("local-as:", ls[i].ptr)) != NULL) { break; } else if ((value = match_prefix("route:", ls[i].ptr)) != NULL) { a = match_ipprefix(value); if (b) { if (((b->end - b->start) > (a->end - a->start))) { use_this = 1; free(b); b = a; a = NULL; } else { use_this = 0; free(a); a = NULL; } } else { use_this = 1; b = a; a = NULL; } } else if (use_this && (value = match_prefix("origin:", ls[i].ptr))) { break; } if(value != NULL) free(value); } free(ls); free(reply); if(b != NULL) free(b); if (!value) return 0; rm_spaces(value); for (i = 0; i < strlen(value); i++) { if (!isdigit(value[i])) { return 0; } } ans = strtol(value, (char **)NULL, 10); free(value); return ans; } int w_lookup_as_cymru(whois_session_params * wsess, char *addr) { /* * Look up the ASN at the prefix-based Cymru whois server */ token_t *ls; char *reply; unsigned int i; char value[6]; memset(&value, 0, sizeof(value)); if (!addr) return 0; reply = w_ask(cymru_server, addr, NULL); if (!reply) { if (wsess->w_noisy) { if(wsess->logprintfCookie) lft_printf(wsess->logprintfCookie,"No reply from %s.\n",cymru_server); else fprintf(stderr,"No reply from %s.\n",cymru_server); } return 0; } ls = tokens(reply, "\n"); /* Set i to 1 to skip the first/header line of reply from cymru */ strncpy(value,ls[1].ptr,5); rm_spaces(value); /* strip out any spaces from the ASN */ for (i = 0; i < strlen(value); i++) { if (!isdigit(value[i])) { return 0; } } free(ls); free(reply); return (strtol(value, (char **)NULL, 10)); } int w_lookup_as_cymru_bulk(whois_session_params * wsess, struct ip_list_array *iplist) { token_t *responses; char *reply; const char *bulk_begin = "begin\n"; const char *bulk_end = "end\n"; char *bulk_ip_query = malloc((strlen(bulk_begin) * sizeof(char)) + (strlen(bulk_end)* sizeof(char)) + (16 * (*iplist).numItems)); int i; unsigned int j; char value[6]; memset(&value, 0, sizeof(value)); bulk_ip_query[0]=0; if (!iplist) return -1; /* clean up the response data set in case the caller doesn't (and we return error) */ for (i = 0; i < (*iplist).numItems; i++) (*iplist).asn[(i)] = 0; /* prepare the text-string-based query */ strcat(bulk_ip_query,bulk_begin); for (i = 0; i < ((*iplist).numItems); i++) { strcat(bulk_ip_query,inet_ntoa((*iplist).ipaddr[i])); strcat(bulk_ip_query,"\n"); } strcat(bulk_ip_query,bulk_end); reply = w_ask(cymru_server, bulk_ip_query, NULL); if (!reply) { if (wsess->w_noisy) { if(wsess->logprintfCookie) lft_printf(wsess->logprintfCookie,"No reply from %s.\n",cymru_server); else fprintf(stderr,"No reply from %s.\n",cymru_server); } return -1; } responses = tokens(reply, "\n"); /* Set i to 1 to skip the first/header line of reply from cymru */ for (i = 1; responses[i].ptr; i++) { strncpy(value,responses[i].ptr,5); rm_spaces(value); /* strip out any spaces from the ASN */ for (j = 0; j < strlen(value); j++) { if (!isdigit(value[j])) { if (wsess->w_noisy) { if(wsess->logprintfCookie) lft_printf(wsess->logprintfCookie,"Parse error at \'%c\': non-numeric value at position %d of %s).\n",value[i],i,value); else fprintf(stderr,"Parse error at \'%c\': non-numeric value at position %d of %s).\n",value[i],i,value); } break; } } if(strtol(value, (char **)NULL, 10)) { (*iplist).asn[(i-1)] = strtol(value, (char **)NULL, 10); } else { (*iplist).asn[(i-1)] = 0; } if ((i+1) > (*iplist).numItems) break; } free(responses); free(reply); free(bulk_ip_query); return 0; } #ifdef STANDALONE static int w_display_rvbyasn_pwhois(whois_session_params * wsess, char *asn) { char *reply; const char *query_begin = "routeview source-as="; char *whob_query = NULL; char *serv; if (!asn) return -1; if (strlen(wsess->pw_serv) > 0) serv = wsess->pw_serv; else serv = pwhois_server; whob_query = malloc( (strlen(appname) + strlen(version) + strlen(query_begin) + strlen(asn)) * sizeof(char) + 10); whob_query[0]=0; /* prepare the text-string-based query */ strcat(whob_query,"app=\""); strcat(whob_query,appname); strcat(whob_query," "); strcat(whob_query,version); strcat(whob_query,"\" "); strcat(whob_query,query_begin); strcat(whob_query,asn); strcat(whob_query,"\n"); reply = w_ask(serv, whob_query, NULL); if (!reply) { if (wsess->w_noisy) fprintf(stderr,"No reply from %s.\n",serv); return -1; } printf("%s",reply); free(reply); free(whob_query); return 0; } static int w_display_rvbytransitasn_pwhois(whois_session_params * wsess, char *asn) { char *reply; const char *query_begin = "routeview transit-as="; char *whob_query = NULL; char *serv; if (!asn) return -1; if (strlen(wsess->pw_serv) > 0) serv = wsess->pw_serv; else serv = pwhois_server; whob_query = malloc( (strlen(appname) + strlen(version) + strlen(query_begin) + strlen(asn)) * sizeof(char) + 10); whob_query[0]=0; /* prepare the text-string-based query */ strcat(whob_query,"app=\""); strcat(whob_query,appname); strcat(whob_query," "); strcat(whob_query,version); strcat(whob_query,"\" "); strcat(whob_query,query_begin); strcat(whob_query,asn); strcat(whob_query,"\n"); reply = w_ask(serv, whob_query, NULL); if (!reply) { if (wsess->w_noisy) fprintf(stderr,"No reply from %s.\n",serv); return -1; } printf("%s",reply); free(reply); free(whob_query); return 0; } static int w_display_contactsbyasn_pwhois(whois_session_params * wsess, char *asn) { char *reply; const char *query_begin = "registry source-as="; char *whob_query = NULL; char *serv; if (!asn) return -1; if (strlen(wsess->pw_serv) > 0) serv = wsess->pw_serv; else serv = pwhois_server; whob_query = malloc( ((strlen(appname) + strlen(version) + strlen(query_begin) + strlen(asn)) * sizeof(char)) + 10); whob_query[0]=0; /* prepare the text-string-based query */ strcat(whob_query,"app=\""); strcat(whob_query,appname); strcat(whob_query," "); strcat(whob_query,version); strcat(whob_query,"\" "); strcat(whob_query,query_begin); strcat(whob_query,asn); strcat(whob_query,"\n"); reply = w_ask(serv, whob_query, NULL); if (!reply) { if (wsess->w_noisy) fprintf(stderr,"No reply from %s.\n",serv); return -1; } printf("%s",reply); free(reply); free(whob_query); return 0; } static int w_display_networksbyasn_pwhois(whois_session_params * wsess, char *asn) { char *reply; const char *query_begin = "netblock source-as="; char *whob_query = NULL; char *serv; if (!asn) return -1; if (strlen(wsess->pw_serv) > 0) serv = wsess->pw_serv; else serv = pwhois_server; whob_query =(char *)malloc(((strlen(appname) + strlen(version) + strlen(query_begin) + strlen(asn)) * sizeof(char)) + 10); whob_query[0]=0; /* prepare the text-string-based query */ strcat(whob_query,"app=\""); strcat(whob_query,appname); strcat(whob_query," "); strcat(whob_query,version); strcat(whob_query,"\" "); strcat(whob_query,query_begin); strcat(whob_query,asn); strcat(whob_query,"\n"); reply = w_ask(serv, whob_query, NULL); if (!reply) { if (wsess->w_noisy) fprintf(stderr,"No reply from %s.\n",serv); return -1; } printf("%s",reply); free(reply); free(whob_query); return 0; } static int w_display_rvbyprefix_pwhois(whois_session_params * wsess, char *prefix) { char *reply; const char *query_begin = "routeview prefix="; char *whob_query = NULL; char *serv; if (!prefix) return -1; if (strlen(wsess->pw_serv) > 0) serv = wsess->pw_serv; else serv = pwhois_server; whob_query = malloc(((strlen(appname) * sizeof(char))+10) + (strlen(version) * sizeof(char)) + (strlen(query_begin) * sizeof(char)) + (strlen(prefix))* sizeof(char)); whob_query[0]=0; /* prepare the text-string-based query */ strcat(whob_query,"app=\""); strcat(whob_query,appname); strcat(whob_query," "); strcat(whob_query,version); strcat(whob_query,"\" "); strcat(whob_query,query_begin); strcat(whob_query,prefix); strcat(whob_query,"\n"); reply = w_ask(serv, whob_query, NULL); if (!reply) { if (wsess->w_noisy) fprintf(stderr,"No reply from %s.\n",serv); return -1; } printf("%s",reply); free(reply); free(whob_query); return 0; } static int w_display_bulkfromfile_pwhois(whois_session_params * wsess, char *filespec) { const char *query_begin = "begin\n"; const char *query_end = "end\n"; const char *appname_extras = "BULK_FILE"; const char *format_instructions = "type=cymru\n"; char *reply; char *serv; FILE *bulkFile; int num_lines = 0, i = 0; char *lines = malloc(line_size * max_lines); char *this_line = malloc(line_size); size_t whob_query_len = ((strlen(appname) * sizeof(char) +10) + (strlen(appname_extras) * sizeof(char)) + (strlen(version) * sizeof(char))) + (strlen(query_begin) * sizeof(char)) + (strlen(format_instructions) * sizeof(char)) + (strlen(query_end) * sizeof(char)) + (line_size * max_lines); char *whob_query = (char *)malloc(whob_query_len); reply = NULL; *whob_query = '\0'; if (!filespec) { fprintf(stderr,"You must specify a file to use (or '-' for stdin) for bulk query input.\n"); free(lines); free(this_line); free(whob_query); exit(EXIT_FAILURE); } if (!strncmp(filespec,"-",1) || use_stdin == 1) { bulkFile = stdin; } else bulkFile = fopen(filespec, "r"); if (!bulkFile) { fprintf(stderr,"%s: Unable to open \'%s\' for reading.\n",appname,filespec); free(lines); free(this_line); free(whob_query); exit(EXIT_FAILURE); } if (strlen(wsess->pw_serv) > 0) serv = wsess->pw_serv; else serv = pwhois_server; while (!feof(bulkFile)) { if (num_lines >= max_lines && wsess->w_noisy >= 2) fprintf(stderr,"Processing next batch of %d beginning at line %d.\n",max_lines,(num_lines+1)); memset(lines, 0, line_size * max_lines); memset(whob_query, 0, whob_query_len); for (i = 0; i < max_lines; i++) { if (fgets(this_line,line_size - 1,bulkFile)) { if (strncmp(this_line, "#", 1) && strncmp(this_line, ";", 1)) { strcat(lines,this_line); num_lines++; if (wsess->w_noisy >= 4) fprintf(stderr,"Line %d: %s",num_lines,this_line); } } else if (feof(bulkFile)) { if (wsess->w_noisy >= 2) fprintf(stderr,"End of file reached after reading %d lines.\n",num_lines); break; } else if (ferror(bulkFile)) { if (wsess->w_noisy >= 1) fprintf(stderr,"Error in stream on line %d.\n",num_lines+1); break; } } /* prepare the text-string-based query */ strcat(whob_query, query_begin); strcat(whob_query, "app=\""); strcat(whob_query, appname); strcat(whob_query, " "); strcat(whob_query, version); strcat(whob_query, " "); strcat(whob_query, appname_extras); strcat(whob_query, "\"\n"); if (use_cymru) strcat(whob_query, format_instructions); strcat(whob_query, lines); strcat(whob_query, query_end); reply = w_ask(serv, whob_query, NULL); if (!reply) { if (wsess->w_noisy) fprintf(stderr,"No reply from %s.\n",serv); free(this_line); free(lines); free(whob_query); free(reply); return -1; } printf("%s",reply); } free(this_line); free(lines); free(whob_query); free(reply); fclose(bulkFile); return 0; } static int w_display_bulkfromfile_riswhois(whois_session_params * wsess, char *filespec) { const char *query_begin = "-k -1 -M\n"; /* Keepalive, 1 object/prefix, Most specific */ const char *query_end = "-k"; char *reply; char *serv; FILE *bulkFile; int num_lines = 0, i = 0; char *lines = (char *)malloc(line_size * max_lines); char *this_line = (char *)malloc(line_size); size_t whob_query_len = 10 + (strlen(query_begin) * sizeof(char)) + (strlen(query_end) * sizeof(char)) + (line_size * max_lines); char *whob_query = (char *)malloc(whob_query_len); reply = NULL; *whob_query = '\0'; if (!filespec) { fprintf(stderr,"You must specify a file to use (or '-' for stdin) for bulk query input.\n"); free(lines); free(this_line); free(whob_query); exit(EXIT_FAILURE); } if (!strncmp(filespec,"-",1) || use_stdin == 1) { bulkFile = stdin; } else bulkFile = fopen(filespec, "r"); if (!bulkFile) { fprintf(stderr,"%s: Unable to open \'%s\' for reading.\n",appname,filespec); free(lines); free(this_line); free(whob_query); exit(EXIT_FAILURE); } if (strlen(wsess->pw_serv) > 0) serv = wsess->pw_serv; else serv = ripe_ris_server; while (!feof(bulkFile)) { if (num_lines >= max_lines && wsess->w_noisy >= 2) fprintf(stderr,"Processing next batch of %d beginning at line %d.\n",max_lines,(num_lines+1)); memset(lines, 0, line_size * max_lines); memset(whob_query, 0, whob_query_len); for (i = 0; i < max_lines; i++) { if (fgets(this_line,line_size - 1,bulkFile)) { if (strncmp(this_line, "#", 1) && strncmp(this_line, ";", 1)) { strcat(lines,this_line); num_lines++; if (wsess->w_noisy >= 4) fprintf(stderr,"Line %d: %s",num_lines,this_line); } } else if(feof(bulkFile)) { if (wsess->w_noisy >= 2) fprintf(stderr,"End of file reached after reading %d lines.\n",num_lines); break; } else if (ferror(bulkFile)) { if (wsess->w_noisy >= 1) fprintf(stderr,"Error in stream on line %d.\n",num_lines+1); break; } } /* prepare the text-string-based query */ strcat(whob_query, query_begin); strcat(whob_query, lines); strcat(whob_query, query_end); reply = w_ask(serv, whob_query, NULL); if (!reply) { if (wsess->w_noisy) fprintf(stderr,"No reply from %s.\n",serv); free(this_line); free(lines); free(whob_query); free(reply); return -1; } printf("%s",reply); } free(this_line); free(lines); free(whob_query); free(reply); fclose(bulkFile); return 0; } static int w_display_bulkfromfile_cymru(whois_session_params * wsess, char *filespec) { const char *query_begin = "begin\n"; const char *query_end = "end"; char *reply; char *serv; FILE *bulkFile; int num_lines = 0, i = 0; char *lines = (char *)malloc(line_size * max_lines); char *this_line = (char *)malloc(line_size); size_t whob_query_len = 10 + (strlen(query_begin) * sizeof(char)) + (strlen(query_end) * sizeof(char)) + (line_size * max_lines); char *whob_query = (char *)malloc(whob_query_len); reply = NULL; *whob_query = '\0'; if (!filespec) { fprintf(stderr,"You must specify a file to use (or '-' for stdin) for bulk query input.\n"); free(lines); free(this_line); free(whob_query); exit(EXIT_FAILURE); } if (!strncmp(filespec,"-",1) || use_stdin == 1) { bulkFile = stdin; } else bulkFile = fopen(filespec, "r"); if (!bulkFile) { fprintf(stderr,"%s: Unable to open \'%s\' for reading.\n",appname,filespec); free(lines); free(this_line); free(whob_query); exit(EXIT_FAILURE); } if (strlen(wsess->pw_serv) > 0) serv = wsess->pw_serv; else serv = cymru_server; while (!feof(bulkFile)) { if (num_lines >= max_lines && wsess->w_noisy >= 2) fprintf(stderr,"Processing next batch of %d beginning at line %d.\n",max_lines,(num_lines+1)); memset(lines, 0, line_size * max_lines); memset(whob_query, 0, whob_query_len); for (i = 0; i < max_lines; i++) { if (fgets(this_line, line_size - 1, bulkFile)) { if (strncmp(this_line, "#", 1) && strncmp(this_line, ";", 1)) { strcat(lines, this_line); num_lines++; if (wsess->w_noisy >= 4) fprintf(stderr,"Line %d: %s",num_lines,this_line); } } else if(feof(bulkFile)) { if (wsess->w_noisy >= 2) fprintf(stderr,"End of file reached after reading %d lines.\n",num_lines); break; } else if(ferror(bulkFile)) { if (wsess->w_noisy >= 1) fprintf(stderr,"Error in stream on line %d.\n",num_lines+1); break; } } /* prepare the text-string-based query */ strcat(whob_query, query_begin); strcat(whob_query, lines); strcat(whob_query, query_end); reply = w_ask(serv, whob_query, NULL); if (!reply) { if(wsess->w_noisy) fprintf(stderr,"No reply from %s.\n",serv); free(this_line); free(lines); free(whob_query); free(reply); return -1; } printf("%s",reply); } free(this_line); free(lines); free(whob_query); free(reply); fclose(bulkFile); return 0; } static int w_display_pwhois_version(whois_session_params * wsess) { char *reply; char *serv; if (strlen(wsess->pw_serv) > 0) serv = wsess->pw_serv; else serv = pwhois_server; if (wsess->w_noisy) fprintf(stderr,"Querying '%s' for version/status.\n",serv); reply = w_ask(serv, "version", NULL); if (!reply) { if(wsess->w_noisy) fprintf(stderr,"No reply from %s.\n",serv); return -1; } printf("%s",reply); free(reply); return 0; } static int w_display_myaddress_http(whois_session_params * wsess) { char *reply; char *serv; if (strlen(wsess->pw_serv) > 0) serv = wsess->pw_serv; else serv = myaddress_server; if (wsess->w_noisy) fprintf(stderr,"Querying '%s' for my public address.\n",serv); reply = w_ask(serv, "Accept:*/*\nHost: myaddress.today\nUser-Agent: WhoB\nGET /\n\n", "80"); if (!reply) { if(wsess->w_noisy) fprintf(stderr,"No reply from %s.\n",serv); return -1; } printf("%s",reply); free(reply); return 0; } static int w_display_myaddress(whois_session_params * wsess) { char *reply; char *serv; if (strlen(wsess->pw_serv) > 0) serv = wsess->pw_serv; else serv = pwhois_server; if (wsess->w_noisy) fprintf(stderr,"Querying '%s' for my public address.\n",serv); reply = w_ask(serv, "whoami", NULL); if (!reply) { if(wsess->w_noisy) fprintf(stderr,"No reply from %s.\n",serv); return -1; } printf("%s",reply); free(reply); return 0; } static int w_display_pwhois_gigo(whois_session_params * wsess, char *user_query) { char *reply; char *serv; if (strlen(wsess->pw_serv) > 0) serv = wsess->pw_serv; else serv = pwhois_server; if (wsess->w_noisy) fprintf(stderr,"Querying '%s' for: '%s'\n",serv,user_query); reply = w_ask(serv, user_query, NULL); if (!reply) { if (wsess->w_noisy) fprintf(stderr,"No reply from %s.\n",serv); return -1; } printf("%s",reply); free(reply); return 0; } #endif int w_lookup_all_pwhois_bulk(whois_session_params * wsess, struct ip_list_array *iplist) { token_t *responses; char *reply; const char *bulk_begin = "begin\n"; const char *bulk_end = "end\n"; char *bulk_ip_query = NULL; int i = 0, k = 0, entity_id = 0; unsigned int j = 0; char *value = NULL; if (!iplist) return -1; if ((uintptr_t)(*iplist).application) { bulk_ip_query = (char *)malloc(((strlen((*iplist).application) * sizeof(char)) +10) + ((strlen(bulk_begin) + strlen(bulk_end) + 1) * sizeof(char)) + (16 * (*iplist).numItems)); } else bulk_ip_query = (char *)malloc(((strlen(appname) * sizeof(char)) +10) + ((strlen(version) + strlen(bulk_begin) + strlen(bulk_end) + 1) * sizeof(char)) + (16 * (*iplist).numItems)); *bulk_ip_query = '\0'; /* clean up the response data set in case the caller doesn't (and we return error) */ for (i = 0; i < (*iplist).numItems; i++) { (*iplist).asn[(i)] = 0; memset((*iplist).netName[i],0,sizeof((*iplist).netName[i])); memset((*iplist).orgName[i],0,sizeof((*iplist).orgName[i])); } /* prepare the text-string-based query */ strcat(bulk_ip_query,bulk_begin); if ((uintptr_t)(*iplist).application) { strcat(bulk_ip_query, "app=\""); strcat(bulk_ip_query, (*iplist).application); strcat(bulk_ip_query, "\"\n"); } else { strcat(bulk_ip_query, "app=\""); strcat(bulk_ip_query, appname); strcat(bulk_ip_query, " "); strcat(bulk_ip_query, version); strcat(bulk_ip_query, "\"\n"); } for (i = 0; i < ((*iplist).numItems); i++) { strcat(bulk_ip_query, inet_ntoa((*iplist).ipaddr[i])); strcat(bulk_ip_query, "\n"); } strcat(bulk_ip_query, bulk_end); reply = w_ask(pwhois_server, bulk_ip_query, NULL); if (!reply) { if (wsess->w_noisy) { if(wsess->logprintfCookie) lft_printf(wsess->logprintfCookie,"No reply from %s.\n",pwhois_server); else fprintf(stderr,"No reply from %s.\n",pwhois_server); } /* clean up the response data set in case the caller doesn't */ for (i = 0; i < (*iplist).numItems; i++) (*iplist).asn[(i)] = 0; return -1; } responses = tokens(reply, "\n"); for(i = 0; responses[i].ptr; i++){ value = NULL; // printf("LINE %d: '%s'\n",i, responses[i].ptr); if((value = match_prefix("IP:", responses[i].ptr)) != NULL){ /* if any keys matched, increment the id of the array */ if(k > 0){ entity_id++; k = 0; } } else if((value = match_prefix("origin-as:", responses[i].ptr)) != NULL) { rm_spaces(value); /* strip out any spaces from the ASN */ for(j = 0; j < strlen(value); j++) { if(!isdigit(value[j])){ if (wsess->w_noisy) { if(wsess->logprintfCookie) lft_printf(wsess->logprintfCookie,"Parse error at \'%c\': non-numeric value at position %d of %s).\n",value[i],i,value); else fprintf(stderr,"Parse error at \'%c\': non-numeric value at position %d of %s).\n",value[i],i,value); } break; } } if ((int)strtol(value, (char **)NULL, 10)) { (*iplist).asn[(entity_id)] = strtol(value, (char **)NULL, 10); k++; } else { (*iplist).asn[(entity_id)] = 0; k++; } } else if ((value = match_prefix("org-name:", responses[i].ptr))) { strncpy((*iplist).orgName[entity_id],value,100); k++; } else if ((value = match_prefix("net-name:", responses[i].ptr))) { strncpy((*iplist).netName[entity_id],value,32); k++; } if(value) free(value); if ((entity_id+1) > (*iplist).numItems) break; } free(responses); free(reply); free(bulk_ip_query); return 0; } int w_lookup_all_pwhois_bulk_ext(whois_session_params * wsess, struct ext_ip_list_array *iplist) { token_t *responses; char *reply; const char *bulk_begin = "begin\n"; const char *bulk_end = "end\n"; char *bulk_ip_query = NULL; int i=0; unsigned int j=0; int k=0; int pntcnt; int entity_id = 0; char *value = NULL; if (!iplist) return -1; iplist->geoavailable=0; if ((uintptr_t)(*iplist).application) { bulk_ip_query = malloc(((strlen((*iplist).application) * sizeof(char)) +10) + ((strlen(bulk_begin) + strlen(bulk_end) + 1) * sizeof(char)) + (16 * (*iplist).numItems)); } else bulk_ip_query = malloc(((strlen(appname) * sizeof(char)) +10) + ((strlen(version) + strlen(bulk_begin) + strlen(bulk_end) + 1) * sizeof(char)) + (16 * (*iplist).numItems)); bulk_ip_query[0]=0; /* clean up the response data set in case the caller doesn't (and we return error) */ for (i = 0; i < (*iplist).numItems; i++) { (*iplist).asn[(i)] = 0; memset((*iplist).netName[i],0,sizeof((*iplist).netName[i])); memset((*iplist).orgName[i],0,sizeof((*iplist).orgName[i])); } /* prepare the text-string-based query */ strcat(bulk_ip_query,bulk_begin); if ((uintptr_t)(*iplist).application) { strcat(bulk_ip_query,"app=\""); strcat(bulk_ip_query,(*iplist).application); strcat(bulk_ip_query,"\"\n"); } else { strcat(bulk_ip_query,"app=\""); strcat(bulk_ip_query,appname); strcat(bulk_ip_query," "); strcat(bulk_ip_query,version); strcat(bulk_ip_query,"\"\n"); } for (i = 0; i < ((*iplist).numItems); i++) { strcat(bulk_ip_query,inet_ntoa((*iplist).ipaddr[i])); strcat(bulk_ip_query,"\n"); } strcat(bulk_ip_query,bulk_end); reply = w_ask(pwhois_server, bulk_ip_query, NULL); if (!reply) { if (wsess->w_noisy) { if(wsess->logprintfCookie) lft_printf(wsess->logprintfCookie,"No reply from %s.\n",pwhois_server); else fprintf(stderr,"No reply from %s.\n",pwhois_server); } /* clean up the response data set in case the caller doesn't */ for (i = 0; i < (*iplist).numItems; i++) (*iplist).asn[(i)] = 0; return -1; } responses = tokens(reply, "\n"); for (i = 0; responses[i].ptr; i++) { value = NULL; // printf("LINE %d: '%s'\n",i, responses[i].ptr); if ((value = match_prefix("IP:", responses[i].ptr)) != NULL) { /* if any keys matched, increment the id of the array */ if (k > 0) { entity_id++; k = 0; } } else if ((value = match_prefix("origin-as:", responses[i].ptr)) != NULL) { rm_spaces(value); /* strip out any spaces from the ASN */ for (j = 0; j < strlen(value); j++) { if (!isdigit(value[j])) { if (wsess->w_noisy) { if(wsess->logprintfCookie) lft_printf(wsess->logprintfCookie,"Parse error at \'%c\': non-numeric value at position %d of %s).\n",value[i],i,value); else fprintf(stderr,"Parse error at \'%c\': non-numeric value at position %d of %s).\n",value[i],i,value); } break; } } if(atoi(value)) { (*iplist).asn[(entity_id)] = atoi(value); k++; } else { (*iplist).asn[(entity_id)] = 0; k++; } } else if ((value = match_prefix("as-org-name-source:", responses[i].ptr))) { strncpy((*iplist).asOrgNameSource[entity_id],value,20); k++; } else if ((value = match_prefix("org-name-source:", responses[i].ptr))) { strncpy((*iplist).orgNameSource[entity_id],value,20); k++; } else if ((value = match_prefix("net-name-source:", responses[i].ptr))) { strncpy((*iplist).netNameSource[entity_id],value,20); k++; } else if ((value = match_prefix("prefix:", responses[i].ptr))) { strncpy((*iplist).prefix[entity_id],value,20); k++; } else if ((value = match_prefix("org-name:", responses[i].ptr))) { strncpy((*iplist).orgName[entity_id],value,100); k++; } else if ((value = match_prefix("net-name:", responses[i].ptr))) { strncpy((*iplist).netName[entity_id],value,32); k++; } else if ((value = match_prefix("longitude:", responses[i].ptr))) { rm_spaces(value); /* strip out any spaces from the LONGITUDE */ for (j = 0, pntcnt = 0; j < strlen(value); j++) { if(value[j]=='.') pntcnt++; if (!isdigit(value[j]) && (value[j]!='.' || pntcnt>1)) { if (wsess->w_noisy) { if(wsess->logprintfCookie) lft_printf(wsess->logprintfCookie,"Parse error at \'%c\': can't parse value at position %d of %s).\n",value[i],i,value); else fprintf(stderr,"Parse error at \'%c\': can't parse value at position %d of %s).\n",value[i],i,value); } break; } } (*iplist).longitude[(entity_id)]=atof(value); iplist->geoavailable++; k++; } else if ((value = match_prefix("latitude:", responses[i].ptr))) { rm_spaces(value); /* strip out any spaces from the LONGITUDE */ for (j = 0, pntcnt = 0; j < strlen(value); j++) { if(value[j]=='.') pntcnt++; if (!isdigit(value[j]) && (value[j]!='.' || pntcnt>1)) { if (wsess->w_noisy) { if(wsess->logprintfCookie) lft_printf(wsess->logprintfCookie,"Parse error at \'%c\': can't parse value at position %d of %s).\n",value[i],i,value); else fprintf(stderr,"Parse error at \'%c\': can't parse value at position %d of %s).\n",value[i],i,value); } break; } } (*iplist).latitude[(entity_id)]=atof(value); iplist->geoavailable++; k++; } else if ((value = match_prefix("city:", responses[i].ptr))) { strncpy((*iplist).city[entity_id],value,50); iplist->geoavailable++; k++; } else if ((value = match_prefix("country:", responses[i].ptr))) { strncpy((*iplist).country[entity_id],value,50); iplist->geoavailable++; k++; } else if ((value = match_prefix("region:", responses[i].ptr))) { strncpy((*iplist).state[entity_id],value,50); iplist->geoavailable++; k++; } if(value) free(value); if ((entity_id+1) > (*iplist).numItems) break; } free(responses); free(reply); free(bulk_ip_query); return 0; } static char * w_lookup_netname_other(whois_session_params * wsess, char *addr, char *serv) { token_t *ls; ip_blk_t *a = NULL, *b = NULL; char *reply, *ans = NULL; int i; int use_this = 1; if (!addr || !serv) return NULL; reply = w_ask(serv, addr, NULL); if (!reply) { if (wsess->w_noisy) { if(wsess->logprintfCookie) lft_printf(wsess->logprintfCookie,"No reply from %s.\n",serv); else fprintf(stderr,"No reply from %s.\n",serv); } return NULL; } ls = tokens(reply, "\n"); for (i = 0; ls[i].ptr; i++) { char *value=NULL; if ((value = match_prefix("inetnum:", ls[i].ptr))) { a = match_ipprefix(value); if (b) { if (((b->end - b->start) > (a->end - a->start))) { use_this = 1; free(b); b = a; a = NULL; } else { use_this = 0; free(a); a = NULL; } } else { use_this = 1; b = a; a = NULL; } free(value); } else if (use_this && (value = match_prefix("netname:", ls[i].ptr))) { if (ans) free(ans); ans = value; } } free(ls); free(reply); if (b) free(b); return ans; } char * w_lookup_netname(whois_session_params * wsess, char *addr) { token_t *ls; ip_blk_t *a = NULL, *b = NULL; char *na = NULL, *nb = NULL; char *reply, *ans = NULL; int i; int have_new, have_old; if (!addr) return NULL; reply = w_ask(arin_server, addr, NULL); if (!reply) { if (wsess->w_noisy) { if(wsess->logprintfCookie) lft_printf(wsess->logprintfCookie,"No reply from %s.\n",arin_server); else fprintf(stderr,"No reply from %s.\n",arin_server); } return NULL; } ls = tokens(reply, "\n"); ans = NULL; for (i = 0; ls[i].ptr; i++) { char *value; if ((value = match_prefix("netname:", ls[i].ptr))) { ans = value; break; } } if (!ans) { for (i = 0; ls[i].ptr; i++) { char *value; if ((value = match_inparens(ls[i].ptr))) { char *after = match_afterparens(ls[i].ptr); if (after) { na = value; a = match_iprange(after); } else { na = value; if (ls[i+1].ptr && (a = match_iprange(ls[i+1].ptr))) { /* successful match */ } else { /* Bad format */ free(na); na = NULL; continue; } } } have_new = (na && a); have_old = (nb && b); if (have_new) { if (have_old) { if (((b->end - b->start) > (a->end - a->start))) { /* keep new, discard old */ free(nb); free(b); nb = na; na = NULL; b = a; a = NULL; } else { /* keep old, discard new */ free(na); free(a); na = NULL; a = NULL; } } else { /* nothing old, save new */ nb = na; na = NULL; b = a; a = NULL; } } } /* loop */ if (na) free(na); if (a) free(a); if (b) free(b); free(ls); free(reply); if (!nb) return NULL; /* Add "!" to the beginning of the question */ na = malloc(strlen(nb) + 2); strcpy(&na[1], nb); na[0] = '!'; free(nb); reply = w_ask(arin_server, na, NULL); free(na); if (!reply) { if (wsess->w_noisy) { if(wsess->logprintfCookie) lft_printf(wsess->logprintfCookie,"No reply from %s.\n",arin_server); else fprintf(stderr,"No reply from %s.\n",arin_server); } return NULL; } ls = tokens(reply, "\n"); } for (i = 0; ls[i].ptr; i++) { char *value; if ((value = match_prefix("netname:", ls[i].ptr))) { ans = value; break; } } free(ls); free(reply); { char *other = NULL; if (ans && strstr(ans, "RIPE")) { other = w_lookup_netname_other(wsess, addr, ripe_server); } if (ans && !strncmp(ans, "APNIC", 5)) { other = w_lookup_netname_other(wsess, addr, apnic_server); } if (other) { char *together = malloc(strlen(ans) + strlen(other) + 2); together[0]=0; strcpy(together, ans); strcat(together, "/"); strcat(together, other); free(ans); ans = together; } } return ans; } static char * w_lookup_orgname_other(whois_session_params * wsess, char *addr, char *serv) { token_t *ls; ip_blk_t *a = NULL, *b = NULL; char *reply, *ans = NULL; int i; int use_this = 1; if (!addr || !serv) return NULL; reply = w_ask(serv, addr, NULL); if (!reply) { if (wsess->w_noisy) { if(wsess->logprintfCookie) lft_printf(wsess->logprintfCookie,"No reply from %s.\n",serv); else fprintf(stderr,"No reply from %s.\n",serv); } return NULL; } ls = tokens(reply, "\n"); for (i = 0; ls[i].ptr; i++) { char *value=NULL; if ((value = match_prefix("inetnum:", ls[i].ptr))) { a = match_ipprefix(value); if (b) { if (((b->end - b->start) > (a->end - a->start))) { use_this = 1; free(b); b = a; a = NULL; } else { use_this = 0; free(a); a = NULL; } } else { use_this = 1; b = a; a = NULL; } free(value); }else if (use_this && (value = match_prefix("orgname:", ls[i].ptr))) { if (ans) free(ans); ans = value; } } if (!ans) { for (i = 0; ls[i].ptr; i++) { char *value; if (use_this && (value = match_prefix("descr:", ls[i].ptr))) { if (ans) free(ans); ans = value; break; } } } free(ls); free(reply); if (b) free(b); return ans; } char * w_lookup_orgname(whois_session_params * wsess, char *addr) { token_t *ls; ip_blk_t *a = NULL, *b = NULL; char *na = NULL, *nb = NULL; char *reply, *ans = NULL; int i; int have_new, have_old; if (!addr) return NULL; reply = w_ask(arin_server, addr, NULL); if (!reply) { if (wsess->w_noisy) { if(wsess->logprintfCookie) lft_printf(wsess->logprintfCookie,"No reply from %s.\n",arin_server); else fprintf(stderr,"No reply from %s.\n",arin_server); } return NULL; } ls = tokens(reply, "\n"); for (i = 0; ls[i].ptr; i++) { char *value; if ((value = match_prefix("netname:", ls[i].ptr))) { ans = value; break; } } if (!ans) { for (i = 0; ls[i].ptr; i++) { char *value; if ((value = match_inparens(ls[i].ptr))) { char *after = match_afterparens(ls[i].ptr); if (after) { na = value; a = match_iprange(after); } else { na = value; if (ls[i+1].ptr && (a = match_iprange(ls[i+1].ptr))) { /* successful match */ } else { /* Bad format */ free(na); na = NULL; continue; } } } have_new = (na && a); have_old = (nb && b); if (have_new) { if (have_old) { if (((b->end - b->start) > (a->end - a->start))) { /* keep new, discard old */ free(nb); free(b); nb = na; na = NULL; b = a; a = NULL; } else { /* keep old, discard new */ free(na); free(a); na = NULL; a = NULL; } } else { /* nothing old, save new */ nb = na; na = NULL; b = a; a = NULL; } } } /* loop */ if (na) free(na); if (a) free(a); if (b) free(b); free(ls); free(reply); if (!nb) return NULL; /* Add "!" to the beginning of the question */ na = malloc(strlen(nb) + 2); strcpy(&na[1], nb); na[0] = '!'; free(nb); reply = w_ask(arin_server, na, NULL); free(na); if (!reply) { if (wsess->w_noisy) { if(wsess->logprintfCookie) lft_printf(wsess->logprintfCookie,"No reply from %s.\n",arin_server); else fprintf(stderr,"No reply from %s.\n",arin_server); } return NULL; } ls = tokens(reply, "\n"); } for (i = 0; ls[i].ptr; i++) { char *value; if ((value = match_prefix("orgname:", ls[i].ptr))) { if(ans) free(ans); ans = value; break; } } free(ls); free(reply); { char *other = NULL; if (ans && strstr(ans, "RIPE")) { other = w_lookup_orgname_other(wsess, addr, ripe_server); } if (ans && (!strncmp(ans, "APNIC", 5) || strstr(ans, "Asia Pacific Net") )) { other = w_lookup_orgname_other(wsess, addr, apnic_server); } if (other) { /* char *together = malloc(strlen(ans) + strlen(other) + 4); strcpy(together, other); strcat(together, " ("); strcat(together, ans); strcat(together, ")"); */ free(ans); ans = other; } } return ans; } #ifdef STANDALONE /*---------------------------------------------------------------------------*/ void lft_printf(lft_session_params * sess, const char *templ, ...) { va_list ap; char buf[1024]; (void)sess; va_start (ap, templ); vsprintf(buf, templ, ap); va_end (ap); printf("%s",buf); } /*---------------------------------------------------------------------------*/ static void usage (char *prog) { fprintf (stderr, "\nWhoB - version %s\n\n" " - a likable whois client from the Prefix WhoIs project\n" " visit http://www.pwhois.org\n" "\nUsage: %s [-g] [] \n" "\nMainstream Options:\n" " -g Disable GIGO mode; enable other options then submit query\n" " -R Display the Origin-AS on file at the RADB/IRR also\n" " -p Display the AS-Path learned by the pWhoIs server (pWhoIs-only)\n" " -n Display the network name on file at the registrar\n" " -t Display the date the route was last updated (pWhoIs-only)\n" " -u Display the date the route was last updated in GMT (pWhoIs-only)\n" " -o Disable display of the organization\'s name on file at the registrar\n" "\nAdvanced Options:\n" " -h host Specify your own pWhoIs-compatible server to query\n" " -f file Read from 'file' (or '-' as stdin) as bulk input to pWhoIs\n" " -c Use Cymru\'s whois server instead of pWhoIs\n" " -r Use RIPE NCC\'s RIS whois server instead of pWhoIs\n" "\nPrefix WhoIs Advanced Options:\n" " -A Display all routes transiting the target ASN (pWhoIs-only)\n" " -a Display all routes announced by the target ASN (pWhoIs-only)\n" " -P Display all routes respective to a target prefix (pWhoIs-only)\n" " -N Display all networks registered to the target ASN (pWhoIs-only)\n" " -O Display organizational contact info for the target ASN (pWhoIs-only)\n" "\nVerbosity Options and Status:\n" " -s Display the version and status of the pWhoIs server (pWhoIs-only)\n" " -V Display verbose/debug output. Use more \'V\'s for additional detail\n" " -v Display WhoB\'s version information and exit\n" " me|whoami Display the public IP address of this host\n" "\n" ,version,prog); fprintf(stderr,"Example: %s -gnp 1.2.3.4\n",prog); fprintf(stderr,"Returns: IP Address | ASN-by-prefix (prefix) | AS-Path | NetName | OrgName\n\n"); exit(EXIT_FAILURE); } static void show_startup_msgs (whois_session_params * wsess) { if (wsess->w_noisy) { fprintf(stderr,"WhoB version %s firing up...",version); if (wsess->w_noisy > 1) fprintf(stderr," (verbosity level %d)\n",wsess->w_noisy); else printf ("\n"); if (wsess->w_noisy > 1) { fprintf(stderr,"Data sources:"); if ((strlen(wsess->pw_serv) > 0) && (!use_cymru || read_from_file)) fprintf(stderr," %s (pWhoIs)",wsess->pw_serv); else if ((!use_cymru || read_from_file) && !use_riswhois) fprintf(stderr," %s (pWhoIs)", pwhois_server); else if (!use_cymru) fprintf(stderr," %s (RIPE NCC)", ripe_ris_server); if (use_cymru && !read_from_file) fprintf(stderr," %s (Cymru)",cymru_server); if (display_radb_as) fprintf(stderr,", %s (RADB)",radb_server); fprintf(stderr,".\n"); if (read_from_file) { if (cymrufromfile) fprintf(stderr,"Using Cymru for bulk file resolution.\n"); else if (riswhoisfromfile) fprintf(stderr,"Using RIPE NCC for bulk file resolution.\n"); else fprintf(stderr,"Using Prefix WhoIs for bulk file resolution.\n"); } } if (show_routes_byprefix == 1 && (show_routes_byasn == 1 || show_routes_bytransitasn == 1)) { fprintf(stderr,"You may only perform routeviews one at a time. Using by-ASN.\n"); show_routes_byprefix = 0; } } } int main(int ac, char **av) { struct hostent *he, *pwhost; char *addr = NULL; struct in_addr in, pws; int ch; int user_asn = 0; char user_asn_buf[10]; whois_session_params * wsess; memset(&hostname, 0, sizeof(hostname)); wsess = w_init(); setbuf(stdout, NULL); while ((ch = getopt (ac, av, "AaCcfgNnOopPRrstuVvh:w:")) != EOF) switch (ch) { case 'a': use_gigo = 0; show_routes_byasn = 1; go_interactive = 1; break; case 'A': use_gigo = 0; show_routes_bytransitasn = 1; go_interactive = 1; break; case 'N': use_gigo = 0; show_networks_byasn = 1; go_interactive = 1; break; case 'O': use_gigo = 0; show_contacts_byasn = 1; go_interactive = 1; break; case 's': use_gigo = 0; show_server_status = 1; go_interactive = 1; break; case 'P': use_gigo = 0; show_routes_byprefix = 1; go_interactive = 1; break; case 'v': usage(av[0]); break; case 'u': /* show all times in UTC */ #if defined(sun) if(putenv("TZ=GMT0") == -1) { fprintf(stderr, "%s: Unable to set TZ to UTC.",appname); } #else #if !defined(WIN32) && !defined(_WIN32) if (setenv("TZ", "GMT0", 1) == -1) { fprintf(stderr, "%s: Unable to set TZ to UTC.",appname); } #endif #endif show_cache_date = 1; break; case 't': show_cache_date = 1; break; case 'w': if (strlen(optarg) > max_hostname_input) { fprintf(stderr,"Sorry, the server name you supplied was unreasonably long.\n"); exit(EXIT_FAILURE); } if (inet_aton(optarg, &pws)) { strncpy(wsess->pw_serv, optarg, strlen(optarg)); } else { if (!(pwhost = gethostbyname(optarg))) { fprintf(stderr,"Sorry, I cannot resolve \'%s\' to use as your pWhoIs server.\n", optarg); exit(EXIT_FAILURE); } memcpy(&pws, pwhost->h_addr, pwhost->h_length); strncpy(wsess->pw_serv,inet_ntoa(pws),strlen(inet_ntoa(pws))); } break; case 'h': if (strlen(optarg) > max_hostname_input) { fprintf(stderr,"Sorry, the server name you supplied was unreasonably long.\n"); exit(EXIT_FAILURE); } if (inet_aton(optarg, &pws)) { strncpy(wsess->pw_serv,optarg,strlen(optarg)); } else { if (!(pwhost = gethostbyname(optarg))) { fprintf(stderr,"Sorry, I cannot resolve \'%s\' to use as your pWhoIs server.\n", optarg); exit(EXIT_FAILURE); } memcpy(&pws, pwhost->h_addr, pwhost->h_length); strncpy(wsess->pw_serv,inet_ntoa(pws),strlen(inet_ntoa(pws))); } break; case 'c': use_cymru = 1; /* cymrufromfile = 1; */ /* Use pwhois Cymru compatibility mode by default */ break; case 'C': use_cymru = 1; cymrufromfile = 1; break; case 'n': display_netname = 1; go_interactive = 1; break; case 'r': use_riswhois = 1; riswhoisfromfile = 1; break; case 'R': display_radb_as = 1; go_interactive = 1; break; case 'o': display_orgname = 0; go_interactive = 1; break; case 'p': display_aspath = 1; go_interactive = 1; break; case 'f': use_gigo = 0; read_from_file = 1; break; case 'V': wsess->w_noisy++; break; case 'g': use_gigo = 0; go_interactive = 1; break; default: usage (av[0]); } /* Catch hostname input without any arguments */ if ((ac - optind) > 0) go_interactive = 1; if (go_interactive > 0) { /* Quickly check stdin for input to avoid David having to type */ /* '-f -' to pipe into to whob, even if it has args :-) */ fd_set rfds; struct timeval timev; int selretval; /* Watch stdin (fd 0) briefly for input. */ FD_ZERO(&rfds); FD_SET(0, &rfds); timev.tv_sec = 0; timev.tv_usec = 100; selretval = select(1, &rfds, NULL, NULL, &timev); if (selretval) { /* There's input in them there hills, treat it as the input file */ use_gigo = 0; read_from_file = 1; use_stdin = 1; } /* else if (wsess->w_noisy) fprintf(stderr,"No input found on stdin.\n"); */ } else if (read_from_file < 1) { /* No indication we should be interactive based on arguments, so wait for STDIN */ use_gigo = 0; read_from_file = 1; use_stdin = 1; } if (((ac - optind) < 1) && (show_server_status != 1) && (go_interactive > 0)) usage (av[0]); /* Show the verbose startup information if verbosity is enabled/requested */ show_startup_msgs(wsess); if (show_server_status == 1) { w_display_pwhois_version(wsess); exit(EXIT_FAILURE); } else if ((read_from_file > 0 && use_stdin < 1) || go_interactive > 0) { if (strlen(av[optind]) > max_hostname_input) { fprintf(stderr,"Sorry, the subject name you supplied was unreasonably long.\n"); exit(EXIT_FAILURE); } else { strncpy(hostname,av[optind],strlen(av[optind])); optind++; } } if (read_from_file) { if (riswhoisfromfile) w_display_bulkfromfile_riswhois(wsess, hostname); else if (cymrufromfile) w_display_bulkfromfile_cymru(wsess, hostname); else w_display_bulkfromfile_pwhois(wsess, hostname); exit(EXIT_SUCCESS); } if (use_gigo > 0) { if (strncmp(hostname,"me",2) == 0 || strncmp(hostname,"whoami",6) == 0) { w_display_myaddress(wsess); exit(EXIT_SUCCESS); } else { w_display_pwhois_gigo(wsess, hostname); exit(EXIT_SUCCESS); } } if ((show_routes_byasn || show_routes_bytransitasn || show_contacts_byasn || show_networks_byasn) && (strlen(hostname) <= 10) && atoi(hostname) && stricontains(hostname,".") < 1) { user_asn = atoi(hostname); if (wsess->w_noisy > 1) fprintf(stderr,"Using user-supplied ASN %d for lookup.\n",user_asn); } else if (show_routes_byprefix == 1) { printf("Displaying all routes for prefix %s.\n",hostname); } else { if (strncmp(hostname,"me",2) == 0 || strncmp(hostname,"whoami",6) == 0) { w_display_myaddress(wsess); exit(EXIT_SUCCESS); } if (inet_aton(hostname, &in)) { addr = hostname; } else { if (!(he = gethostbyname(hostname))) { fprintf(stderr,"Sorry, I cannot resolve \'%s\'\n", hostname); exit(EXIT_FAILURE); } memcpy(&in, he->h_addr, he->h_length); addr = inet_ntoa(in); } } if (show_routes_byasn) { if (user_asn > 0) { printf("Displaying all routes whose Origin-AS is %d.\n", user_asn); snprintf(user_asn_buf,9,"%d",user_asn); w_display_rvbyasn_pwhois(wsess, user_asn_buf); } else { w_lookup_all_pwhois(wsess, addr); if (atoi(wsess->consolidated_asn)) { printf("Displaying all routes whose Origin-AS is %s.\n", wsess->consolidated_asn); w_display_rvbyasn_pwhois(wsess, wsess->consolidated_asn); } else { printf("Sorry, unable to resolve the ASN for %s (%s) at this time.\n",hostname,addr); } } } else if (show_routes_bytransitasn) { if (user_asn > 0) { printf("Displaying all routes whose Transit-AS is %d.\n", user_asn); snprintf(user_asn_buf,9,"%d",user_asn); w_display_rvbytransitasn_pwhois(wsess, user_asn_buf); } else { w_lookup_all_pwhois(wsess, addr); if (atoi(wsess->consolidated_asn)) { printf("Displaying all routes whose Transit-AS is %s.\n", wsess->consolidated_asn); w_display_rvbytransitasn_pwhois(wsess, wsess->consolidated_asn); } else { printf("Sorry, unable to resolve the ASN for %s (%s) at this time.\n",hostname,addr); } } } else if (show_networks_byasn) { if (user_asn > 0) { printf("Displaying all networks registered to the Origin-AS %d.\n", user_asn); snprintf(user_asn_buf,9,"%d",user_asn); w_display_networksbyasn_pwhois(wsess, user_asn_buf); } else { w_lookup_all_pwhois(wsess, addr); if (atoi(wsess->consolidated_asn)) { printf("Displaying all networks registered to the Origin-AS %s.\n", wsess->consolidated_asn); w_display_networksbyasn_pwhois(wsess, wsess->consolidated_asn); } else { printf("Sorry, unable to resolve the ASN for %s (%s) at this time.\n",hostname,addr); } } } else if (show_contacts_byasn) { if (user_asn > 0) { printf("Displaying all contact info on file for Origin-AS %d.\n", user_asn); snprintf(user_asn_buf,9,"%d",user_asn); w_display_contactsbyasn_pwhois(wsess, user_asn_buf); } else { w_lookup_all_pwhois(wsess, addr); if (atoi(wsess->consolidated_asn)) { printf("Displaying all contact info on file for Origin-AS %s.\n", wsess->consolidated_asn); w_display_contactsbyasn_pwhois(wsess, wsess->consolidated_asn); } else { printf("Unable to resolve the ASN for %s (%s) at this time.\n",hostname,addr); } } } else if (show_routes_byprefix) { w_display_rvbyprefix_pwhois(wsess, hostname); } else { printf("%s | Searching...", addr); if (use_cymru) { printf("\b\b\b\b\b\b\b\b\b\b\b\b"); printf("origin-as %d ", w_lookup_as_cymru(wsess, addr)); } else if (use_riswhois) { w_lookup_all_riswhois(wsess, addr); printf("\b\b\b\b\b\b\b\b\b\b\b\b"); printf("origin-as %s (%s) ", wsess->consolidated_asn, wsess->consolidated_route); } else { w_lookup_all_pwhois(wsess, addr); printf("\b\b\b\b\b\b\b\b\b\b\b\b"); printf("origin-as %s (%s) ", wsess->consolidated_asn, wsess->consolidated_route); if (show_cache_date && (strlen(wsess->tbuf) > 0)) printf("| %s ", wsess->tbuf); } if (display_radb_as) printf("| radb-as %d ", w_lookup_as(wsess, addr)); if ((display_aspath) && (!use_cymru) && (!use_riswhois)) printf("| as-path %s ", wsess->consolidated_asp); if (display_netname) { if (use_cymru) { printf("| %s ", w_lookup_netname(wsess, addr)); } else if (use_riswhois) { if (!display_orgname) printf("| %s ", wsess->consolidated_netname); } else { printf("| %s ", wsess->consolidated_netname); } } if (display_orgname) { if (use_cymru) { printf("| %s ", w_lookup_orgname(wsess, addr)); } else { printf("| %s ", wsess->consolidated_orgname); } } printf("\n"); } w_close(wsess); exit(EXIT_SUCCESS); } #endif lft-3.8/configure000755 000766 000000 00000511150 12732330274 014006 0ustar00vicwheel000000 000000 #! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # Use a proper internal environment variable to ensure we don't fall # into an infinite loop, continuously re-executing ourselves. if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then _as_can_reexec=no; export _as_can_reexec; # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 as_fn_exit 255 fi # We don't want this to propagate to other subprocesses. { _as_can_reexec=; unset _as_can_reexec;} if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1 test -x / || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : export CONFIG_SHELL # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. # Preserve -v and -x to the replacement shell. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV case $- in # (((( *v*x* | *x*v* ) as_opts=-vx ;; *v* ) as_opts=-v ;; *x* ) as_opts=-x ;; * ) as_opts= ;; esac exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} # Admittedly, this is quite paranoid, since all the known shells bail # out after a failed `exec'. $as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 exit 255 fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # If we had to re-execute with $CONFIG_SHELL, we're ensured to have # already done that, so ensure we don't try to do so again and fall # in an infinite loop. This has already happened in practice. _as_can_reexec=no; export _as_can_reexec # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME= PACKAGE_TARNAME= PACKAGE_VERSION= PACKAGE_STRING= PACKAGE_BUGREPORT= PACKAGE_URL= ac_unique_file="lft_ifname.h" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='LTLIBOBJS LIBOBJS ALLOCA EGREP GREP CPP INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM SET_MAKE LN_S OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC host_os host_vendor host_cpu host build_os build_vendor build_cpu build target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking enable_universal enable_gtod with_pcap ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *=) ac_optarg= ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error $? "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error $? "unrecognized option: \`$ac_option' Try \`$0 --help' for more information" ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error $? "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error $? "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error $? "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures this package to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking ...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/PACKAGE] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD] _ACEOF fi if test -n "$ac_init_help"; then cat <<\_ACEOF Optional Features: --disable-option-checking ignore unrecognized --enable/--with options --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) --enable-FEATURE[=ARG] include FEATURE [ARG=yes] --enable-universal whether to include intel and ppc arch for Mac OS X --enable-gtod use gettimeofday instead of pcap timestamps Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-pcap=PATH specify path to pcap library Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF configure generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || test -x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } > conftest.i && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if eval \${$3+:} false; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.i conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_mongrel # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_header_compile # ac_fn_c_check_type LINENO TYPE VAR INCLUDES # ------------------------------------------- # Tests whether TYPE exists after having included INCLUDES, setting cache # variable VAR accordingly. ac_fn_c_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof ($2)) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof (($2))) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else eval "$3=yes" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_type # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if eval \${$3+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno } # ac_fn_c_check_func cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by $as_me, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo $as_echo "## ---------------- ## ## Cache variables. ## ## ---------------- ##" echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo $as_echo "## ----------------- ## ## Output variables. ## ## ----------------- ##" echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then $as_echo "## ------------------- ## ## File substitutions. ## ## ------------------- ##" echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then $as_echo "## ----------- ## ## confdefs.h. ## ## ----------- ##" echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then # We do not want a PATH search for config.site. case $CONFIG_SITE in #(( -*) ac_site_file1=./$CONFIG_SITE;; */*) ac_site_file1=$CONFIG_SITE;; *) ac_site_file1=./$CONFIG_SITE;; esac elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" \ || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "failed to load site script $ac_site_file See \`config.log' for more details" "$LINENO" 5; } fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_config_headers="$ac_config_headers config/acconfig.h" ac_aux_dir= for ac_dir in config "$srcdir"/config; do if test -f "$ac_dir/install-sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install-sh -c" break elif test -f "$ac_dir/install.sh"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/install.sh -c" break elif test -f "$ac_dir/shtool"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/shtool install -c" break fi done if test -z "$ac_aux_dir"; then as_fn_error $? "cannot find install-sh, install.sh, or shtool in config \"$srcdir\"/config" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Make sure we can run config.sub. $SHELL "$ac_aux_dir/config.sub" sun4 >/dev/null 2>&1 || as_fn_error $? "cannot run $SHELL $ac_aux_dir/config.sub" "$LINENO" 5 { $as_echo "$as_me:${as_lineno-$LINENO}: checking build system type" >&5 $as_echo_n "checking build system type... " >&6; } if ${ac_cv_build+:} false; then : $as_echo_n "(cached) " >&6 else ac_build_alias=$build_alias test "x$ac_build_alias" = x && ac_build_alias=`$SHELL "$ac_aux_dir/config.guess"` test "x$ac_build_alias" = x && as_fn_error $? "cannot guess build type; you must specify one" "$LINENO" 5 ac_cv_build=`$SHELL "$ac_aux_dir/config.sub" $ac_build_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $ac_build_alias failed" "$LINENO" 5 fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_build" >&5 $as_echo "$ac_cv_build" >&6; } case $ac_cv_build in *-*-*) ;; *) as_fn_error $? "invalid value of canonical build" "$LINENO" 5;; esac build=$ac_cv_build ac_save_IFS=$IFS; IFS='-' set x $ac_cv_build shift build_cpu=$1 build_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: build_os=$* IFS=$ac_save_IFS case $build_os in *\ *) build_os=`echo "$build_os" | sed 's/ /-/g'`;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking host system type" >&5 $as_echo_n "checking host system type... " >&6; } if ${ac_cv_host+:} false; then : $as_echo_n "(cached) " >&6 else if test "x$host_alias" = x; then ac_cv_host=$ac_cv_build else ac_cv_host=`$SHELL "$ac_aux_dir/config.sub" $host_alias` || as_fn_error $? "$SHELL $ac_aux_dir/config.sub $host_alias failed" "$LINENO" 5 fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_host" >&5 $as_echo "$ac_cv_host" >&6; } case $ac_cv_host in *-*-*) ;; *) as_fn_error $? "invalid value of canonical host" "$LINENO" 5;; esac host=$ac_cv_host ac_save_IFS=$IFS; IFS='-' set x $ac_cv_host shift host_cpu=$1 host_vendor=$2 shift; shift # Remember, the first character of IFS is used to create $*, # except with old shells: host_os=$* IFS=$ac_save_IFS case $host_os in *\ *) host_os=`echo "$host_os" | sed 's/ /-/g'`;; esac case $host_os in *cygwin* ) CYGWIN=yes;; * ) CYGWIN=no;; esac cat >>confdefs.h <<_ACEOF #define HOST_SYSTEM_TYPE "$host" _ACEOF ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if ${ac_cv_prog_ac_ct_CC+:} false; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "no acceptable C compiler found in \$PATH See \`config.log' for more details" "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error 77 "C compiler cannot create executables See \`config.log' for more details" "$LINENO" 5; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details" "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if ${ac_cv_objext+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "cannot compute suffix of object files: cannot compile See \`config.log' for more details" "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if ${ac_cv_c_compiler_gnu+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if ${ac_cv_prog_cc_g+:} false; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if ${ac_cv_prog_cc_c89+:} false; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include struct stat; /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ln -s works" >&5 $as_echo_n "checking whether ln -s works... " >&6; } LN_S=$as_ln_s if test "$LN_S" = "ln -s"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no, using $LN_S" >&5 $as_echo "no, using $LN_S" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 $as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } set x ${MAKE-make} ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : $as_echo_n "(cached) " >&6 else cat >conftest.make <<\_ACEOF SHELL = /bin/sh all: @echo '@@@%%%=$(MAKE)=@@@%%%' _ACEOF # GNU make sometimes prints "make[1]: Entering ...", which would confuse us. case `${MAKE-make} -f conftest.make 2>/dev/null` in *@@@%%%=?*=@@@%%%*) eval ac_cv_prog_make_${ac_make}_set=yes;; *) eval ac_cv_prog_make_${ac_make}_set=no;; esac rm -f conftest.make fi if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } SET_MAKE= else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } SET_MAKE="MAKE=${MAKE-make}" fi # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if ${ac_cv_path_install+:} false; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking for gethostbyname in -lnsl" >&5 $as_echo_n "checking for gethostbyname in -lnsl... " >&6; } if ${ac_cv_lib_nsl_gethostbyname+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lnsl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char gethostbyname (); int main () { return gethostbyname (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_nsl_gethostbyname=yes else ac_cv_lib_nsl_gethostbyname=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nsl_gethostbyname" >&5 $as_echo "$ac_cv_lib_nsl_gethostbyname" >&6; } if test "x$ac_cv_lib_nsl_gethostbyname" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBNSL 1 _ACEOF LIBS="-lnsl $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for connect in -lsocket" >&5 $as_echo_n "checking for connect in -lsocket... " >&6; } if ${ac_cv_lib_socket_connect+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lsocket $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char connect (); int main () { return connect (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_socket_connect=yes else ac_cv_lib_socket_connect=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_connect" >&5 $as_echo "$ac_cv_lib_socket_connect" >&6; } if test "x$ac_cv_lib_socket_connect" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBSOCKET 1 _ACEOF LIBS="-lsocket $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inet_aton in -lresolv" >&5 $as_echo_n "checking for inet_aton in -lresolv... " >&6; } if ${ac_cv_lib_resolv_inet_aton+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lresolv $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char inet_aton (); int main () { return inet_aton (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_resolv_inet_aton=yes else ac_cv_lib_resolv_inet_aton=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_resolv_inet_aton" >&5 $as_echo "$ac_cv_lib_resolv_inet_aton" >&6; } if test "x$ac_cv_lib_resolv_inet_aton" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBRESOLV 1 _ACEOF LIBS="-lresolv $LIBS" fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sin in -lm" >&5 $as_echo_n "checking for sin in -lm... " >&6; } if ${ac_cv_lib_m_sin+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lm $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char sin (); int main () { return sin (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_m_sin=yes else ac_cv_lib_m_sin=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_m_sin" >&5 $as_echo "$ac_cv_lib_m_sin" >&6; } if test "x$ac_cv_lib_m_sin" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBM 1 _ACEOF LIBS="-lm $LIBS" fi # Checks for header files and functions ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if ${ac_cv_prog_CPP+:} false; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.i conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.i conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.i conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error $? "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details" "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if ${ac_cv_path_GREP+:} false; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_GREP" || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error $? "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if ${ac_cv_path_EGREP+:} false; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" as_fn_executable_p "$ac_path_EGREP" || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error $? "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if ${ac_cv_header_stdc+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done for ac_header in arpa/inet.h fcntl.h limits.h netdb.h netinet/in.h stdlib.h string.h strings.h sys/ioctl.h sys/socket.h sys/time.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 $as_echo_n "checking for an ANSI C-conforming const... " >&6; } if ${ac_cv_c_const+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __cplusplus /* Ultrix mips cc rejects this sort of thing. */ typedef int charset[2]; const charset cs = { 0, 0 }; /* SunOS 4.1.1 cc rejects this. */ char const *const *pcpcc; char **ppc; /* NEC SVR4.0.2 mips cc rejects this. */ struct point {int x, y;}; static struct point const zero = {0,0}; /* AIX XL C 1.02.0.0 rejects this. It does not let you subtract one const X* pointer from another in an arm of an if-expression whose if-part is not a constant expression */ const char *g = "string"; pcpcc = &g + (g ? g-g : 0); /* HPUX 7.0 cc rejects these. */ ++pcpcc; ppc = (char**) pcpcc; pcpcc = (char const *const *) ppc; { /* SCO 3.2v4 cc rejects this sort of thing. */ char tx; char *t = &tx; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; if (s) return 0; } { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ int x[] = {25, 17}; const int *foo = &x[0]; ++foo; } { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ typedef const int *iptr; iptr p = 0; ++p; } { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ struct s { int j; const int *ap[3]; } bx; struct s *b = &bx; b->j = 5; } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; if (!foo) return 0; } return !cs[0] && !zero.x; #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_const=yes else ac_cv_c_const=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 $as_echo "$ac_cv_c_const" >&6; } if test $ac_cv_c_const = no; then $as_echo "#define const /**/" >>confdefs.h fi ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" if test "x$ac_cv_type_size_t" = xyes; then : else cat >>confdefs.h <<_ACEOF #define size_t unsigned int _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5 $as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; } if ${ac_cv_header_time+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { if ((struct tm *) 0) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_time=yes else ac_cv_header_time=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5 $as_echo "$ac_cv_header_time" >&6; } if test $ac_cv_header_time = yes; then $as_echo "#define TIME_WITH_SYS_TIME 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether struct tm is in sys/time.h or time.h" >&5 $as_echo_n "checking whether struct tm is in sys/time.h or time.h... " >&6; } if ${ac_cv_struct_tm+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { struct tm tm; int *p = &tm.tm_sec; return !p; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_struct_tm=time.h else ac_cv_struct_tm=sys/time.h fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_struct_tm" >&5 $as_echo "$ac_cv_struct_tm" >&6; } if test $ac_cv_struct_tm = sys/time.h; then $as_echo "#define TM_IN_SYS_TIME 1" >>confdefs.h fi if test $ac_cv_c_compiler_gnu = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC needs -traditional" >&5 $as_echo_n "checking whether $CC needs -traditional... " >&6; } if ${ac_cv_prog_gcc_traditional+:} false; then : $as_echo_n "(cached) " >&6 else ac_pattern="Autoconf.*'x'" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include Autoconf TIOCGETP _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "$ac_pattern" >/dev/null 2>&1; then : ac_cv_prog_gcc_traditional=yes else ac_cv_prog_gcc_traditional=no fi rm -f conftest* if test $ac_cv_prog_gcc_traditional = no; then cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include Autoconf TCGETA _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "$ac_pattern" >/dev/null 2>&1; then : ac_cv_prog_gcc_traditional=yes fi rm -f conftest* fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_gcc_traditional" >&5 $as_echo "$ac_cv_prog_gcc_traditional" >&6; } if test $ac_cv_prog_gcc_traditional = yes; then CC="$CC -traditional" fi fi # The Ultrix 4.2 mips builtin alloca declared by alloca.h only works # for constant arguments. Useless! { $as_echo "$as_me:${as_lineno-$LINENO}: checking for working alloca.h" >&5 $as_echo_n "checking for working alloca.h... " >&6; } if ${ac_cv_working_alloca_h+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { char *p = (char *) alloca (2 * sizeof (int)); if (p) return 0; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_working_alloca_h=yes else ac_cv_working_alloca_h=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_working_alloca_h" >&5 $as_echo "$ac_cv_working_alloca_h" >&6; } if test $ac_cv_working_alloca_h = yes; then $as_echo "#define HAVE_ALLOCA_H 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for alloca" >&5 $as_echo_n "checking for alloca... " >&6; } if ${ac_cv_func_alloca_works+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __GNUC__ # define alloca __builtin_alloca #else # ifdef _MSC_VER # include # define alloca _alloca # else # ifdef HAVE_ALLOCA_H # include # else # ifdef _AIX #pragma alloca # else # ifndef alloca /* predefined by HP cc +Olibcalls */ void *alloca (size_t); # endif # endif # endif # endif #endif int main () { char *p = (char *) alloca (1); if (p) return 0; ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_func_alloca_works=yes else ac_cv_func_alloca_works=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_alloca_works" >&5 $as_echo "$ac_cv_func_alloca_works" >&6; } if test $ac_cv_func_alloca_works = yes; then $as_echo "#define HAVE_ALLOCA 1" >>confdefs.h else # The SVR3 libPW and SVR4 libucb both contain incompatible functions # that cause trouble. Some versions do not even contain alloca or # contain a buggy version. If you still want to use their alloca, # use ar to extract alloca.o from them instead of compiling alloca.c. ALLOCA=\${LIBOBJDIR}alloca.$ac_objext $as_echo "#define C_ALLOCA 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether \`alloca.c' needs Cray hooks" >&5 $as_echo_n "checking whether \`alloca.c' needs Cray hooks... " >&6; } if ${ac_cv_os_cray+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined CRAY && ! defined CRAY2 webecray #else wenotbecray #endif _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "webecray" >/dev/null 2>&1; then : ac_cv_os_cray=yes else ac_cv_os_cray=no fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_os_cray" >&5 $as_echo "$ac_cv_os_cray" >&6; } if test $ac_cv_os_cray = yes; then for ac_func in _getb67 GETB67 getb67; do as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define CRAY_STACKSEG_END $ac_func _ACEOF break fi done fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking stack direction for C alloca" >&5 $as_echo_n "checking stack direction for C alloca... " >&6; } if ${ac_cv_c_stack_direction+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_c_stack_direction=0 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default int find_stack_direction (int *addr, int depth) { int dir, dummy = 0; if (! addr) addr = &dummy; *addr = addr < &dummy ? 1 : addr == &dummy ? 0 : -1; dir = depth ? find_stack_direction (addr, depth - 1) : 0; return dir + dummy; } int main (int argc, char **argv) { return find_stack_direction (0, argc + !argv + 20) < 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_c_stack_direction=1 else ac_cv_c_stack_direction=-1 fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_stack_direction" >&5 $as_echo "$ac_cv_c_stack_direction" >&6; } cat >>confdefs.h <<_ACEOF #define STACK_DIRECTION $ac_cv_c_stack_direction _ACEOF fi for ac_header in stdlib.h do : ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" if test "x$ac_cv_header_stdlib_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STDLIB_H 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU libc compatible malloc" >&5 $as_echo_n "checking for GNU libc compatible malloc... " >&6; } if ${ac_cv_func_malloc_0_nonnull+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_malloc_0_nonnull=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined STDC_HEADERS || defined HAVE_STDLIB_H # include #else char *malloc (); #endif int main () { return ! malloc (0); ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_malloc_0_nonnull=yes else ac_cv_func_malloc_0_nonnull=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_malloc_0_nonnull" >&5 $as_echo "$ac_cv_func_malloc_0_nonnull" >&6; } if test $ac_cv_func_malloc_0_nonnull = yes; then : $as_echo "#define HAVE_MALLOC 1" >>confdefs.h else $as_echo "#define HAVE_MALLOC 0" >>confdefs.h case " $LIBOBJS " in *" malloc.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS malloc.$ac_objext" ;; esac $as_echo "#define malloc rpl_malloc" >>confdefs.h fi for ac_header in stdlib.h do : ac_fn_c_check_header_mongrel "$LINENO" "stdlib.h" "ac_cv_header_stdlib_h" "$ac_includes_default" if test "x$ac_cv_header_stdlib_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STDLIB_H 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNU libc compatible realloc" >&5 $as_echo_n "checking for GNU libc compatible realloc... " >&6; } if ${ac_cv_func_realloc_0_nonnull+:} false; then : $as_echo_n "(cached) " >&6 else if test "$cross_compiling" = yes; then : ac_cv_func_realloc_0_nonnull=no else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #if defined STDC_HEADERS || defined HAVE_STDLIB_H # include #else char *realloc (); #endif int main () { return ! realloc (0, 0); ; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : ac_cv_func_realloc_0_nonnull=yes else ac_cv_func_realloc_0_nonnull=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_realloc_0_nonnull" >&5 $as_echo "$ac_cv_func_realloc_0_nonnull" >&6; } if test $ac_cv_func_realloc_0_nonnull = yes; then : $as_echo "#define HAVE_REALLOC 1" >>confdefs.h else $as_echo "#define HAVE_REALLOC 0" >>confdefs.h case " $LIBOBJS " in *" realloc.$ac_objext "* ) ;; *) LIBOBJS="$LIBOBJS realloc.$ac_objext" ;; esac $as_echo "#define realloc rpl_realloc" >>confdefs.h fi for ac_header in sys/select.h sys/socket.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" if eval test \"x\$"$as_ac_Header"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking types of arguments for select" >&5 $as_echo_n "checking types of arguments for select... " >&6; } if ${ac_cv_func_select_args+:} false; then : $as_echo_n "(cached) " >&6 else for ac_arg234 in 'fd_set *' 'int *' 'void *'; do for ac_arg1 in 'int' 'size_t' 'unsigned long int' 'unsigned int'; do for ac_arg5 in 'struct timeval *' 'const struct timeval *'; do cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $ac_includes_default #ifdef HAVE_SYS_SELECT_H # include #endif #ifdef HAVE_SYS_SOCKET_H # include #endif int main () { extern int select ($ac_arg1, $ac_arg234, $ac_arg234, $ac_arg234, $ac_arg5); ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_func_select_args="$ac_arg1,$ac_arg234,$ac_arg5"; break 3 fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext done done done # Provide a safe default value. : "${ac_cv_func_select_args=int,int *,struct timeval *}" fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_select_args" >&5 $as_echo "$ac_cv_func_select_args" >&6; } ac_save_IFS=$IFS; IFS=',' set dummy `echo "$ac_cv_func_select_args" | sed 's/\*/\*/g'` IFS=$ac_save_IFS shift cat >>confdefs.h <<_ACEOF #define SELECT_TYPE_ARG1 $1 _ACEOF cat >>confdefs.h <<_ACEOF #define SELECT_TYPE_ARG234 ($2) _ACEOF cat >>confdefs.h <<_ACEOF #define SELECT_TYPE_ARG5 ($3) _ACEOF rm -f conftest* for ac_func in strftime do : ac_fn_c_check_func "$LINENO" "strftime" "ac_cv_func_strftime" if test "x$ac_cv_func_strftime" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_STRFTIME 1 _ACEOF else # strftime is in -lintl on SCO UNIX. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for strftime in -lintl" >&5 $as_echo_n "checking for strftime in -lintl... " >&6; } if ${ac_cv_lib_intl_strftime+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lintl $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char strftime (); int main () { return strftime (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_intl_strftime=yes else ac_cv_lib_intl_strftime=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_intl_strftime" >&5 $as_echo "$ac_cv_lib_intl_strftime" >&6; } if test "x$ac_cv_lib_intl_strftime" = xyes; then : $as_echo "#define HAVE_STRFTIME 1" >>confdefs.h LIBS="-lintl $LIBS" fi fi done for ac_func in bzero gethostbyaddr gethostbyname gettimeofday inet_ntoa memset select setenv socket strchr strdup strstr do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" if eval test \"x\$"$as_ac_var"\" = x"yes"; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done case "$host" in *darwin*) $as_echo "#define BSD_IP_STACK 1" >>confdefs.h $as_echo "#define DARWIN 1" >>confdefs.h ;; *netbsd*) $as_echo "#define BSD_IP_STACK 1" >>confdefs.h $as_echo "#define NETBSD 1" >>confdefs.h ;; *openbsd*) $as_echo "#define OPENBSD 1" >>confdefs.h $as_echo "#define BSD_IP_STACK 1" >>confdefs.h ;; *bsd*) $as_echo "#define BSD_IP_STACK 1" >>confdefs.h ;; *linux*) $as_echo "#define _BSD_SOURCE 1" >>confdefs.h ;; *solaris*) case "$host" in *solaris2.4*) $as_echo "#define SOLARIS_LENGTH_IN_CHECKSUM 1" >>confdefs.h ;; *solaris2.5*) $as_echo "#define SOLARIS_LENGTH_IN_CHECKSUM 1" >>confdefs.h ;; esac ;; esac case "$host" in *cygwin*) : we do not require pcap, but we do require special win32 libraries. LIBS="-lws2_32 $LIBS" ;; *) # Check whether --enable-universal was given. if test "${enable_universal+set}" = set; then : enableval=$enable_universal; UNIVERSAL="$enableval" else UNIVERSAL="no" fi # Check whether --enable-gtod was given. if test "${enable_gtod+set}" = set; then : enableval=$enable_gtod; GTOD="$enableval" else GTOD="no" fi # Check whether --with-pcap was given. if test "${with_pcap+set}" = set; then : withval=$with_pcap; { $as_echo "$as_me:${as_lineno-$LINENO}: checking for --with-pcap option" >&5 $as_echo_n "checking for --with-pcap option... " >&6; } case "$withval" in yes|no) as_fn_error $? "please specify a PATH in --with-pcap option!" "$LINENO" 5 ;; *) if test '!' -d "$withval"; then as_fn_error $? "$withval does not exist!" "$LINENO" 5 else { $as_echo "$as_me:${as_lineno-$LINENO}: result: $withval" >&5 $as_echo "$withval" >&6; } if test -d "$withval/include"; then CFLAGS="$CFLAGS -I$withval/include" CPPFLAGS="$CPPFLAGS -I$withval/include" else CFLAGS="$CFLAGS -I$withval" CPPFLAGS="$CPPFLAGS -I$withval" fi if test -d "$withval/lib"; then LIBS="$LIBS -L$withval/lib" else LIBS="$LIBS -L$withval" fi fi ;; esac fi cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ # include # include int main () { u_int i = sizeof(((struct sockaddr *)0)->sa_len) ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : $as_echo "#define HAVE_SOCKADDR_SA_LEN 1" >>confdefs.h fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: checking for pcap_lookupdev in -lpcap" >&5 $as_echo_n "checking for pcap_lookupdev in -lpcap... " >&6; } if ${ac_cv_lib_pcap_pcap_lookupdev+:} false; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lpcap $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char pcap_lookupdev (); int main () { return pcap_lookupdev (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_pcap_pcap_lookupdev=yes else ac_cv_lib_pcap_pcap_lookupdev=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_pcap_pcap_lookupdev" >&5 $as_echo "$ac_cv_lib_pcap_pcap_lookupdev" >&6; } if test "x$ac_cv_lib_pcap_pcap_lookupdev" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBPCAP 1 _ACEOF LIBS="-lpcap $LIBS" else as_fn_error $? " Can't find the pcap developer library (libpcap); please install the pcap library or use --with-pcap to specify the path to it on your system" "$LINENO" 5 fi ac_fn_c_check_header_mongrel "$LINENO" "pcap.h" "ac_cv_header_pcap_h" "$ac_includes_default" if test "x$ac_cv_header_pcap_h" = xyes; then : else as_fn_error $? " Can't find pcap.h; install the pcap library (from ftp://ftp.ee.lbl.gov/libpcap.tar.Z ) and/or use --with-pcap to specify the path to it on your system When installing libpcap do both 'make install' and 'make install-incl'" "$LINENO" 5 fi esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we should build universal binaries" >&5 $as_echo_n "checking if we should build universal binaries... " >&6; } if test "$UNIVERSAL" = "yes"; then case $host_os in *darwin* ) CFLAGS="$CFLAGS -arch i386 -arch ppc" LDFLAGS="$LDFLAGS -arch i386 -arch ppc" $as_echo "#define UNIVERSAL 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } ;; esac else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking if we should gettimeofday for each packet" >&5 $as_echo_n "checking if we should gettimeofday for each packet... " >&6; } if test "$GTOD" = "yes"; then $as_echo "#define USE_GTOD 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi ac_config_files="$ac_config_files Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then if test "x$cache_file" != "x/dev/null"; then { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} if test ! -f "$cache_file" || test -h "$cache_file"; then cat confcache >"$cache_file" else case $cache_file in #( */* | ?:*) mv -f confcache "$cache_file"$$ && mv -f "$cache_file"$$ "$cache_file" ;; #( *) mv -f confcache "$cache_file" ;; esac fi fi else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= U= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : "${CONFIG_STATUS=./config.status}" ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. as_myself= case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error STATUS ERROR [LINENO LOG_FD] # ---------------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with STATUS, using 1 if that was 0. as_fn_error () { as_status=$1; test $as_status -eq 0 && as_status=1 if test "$4"; then as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 fi $as_echo "$as_me: error: $2" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -pR'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -pR' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -pR' fi else as_ln_s='cp -pR' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi # as_fn_executable_p FILE # ----------------------- # Test if FILE is an executable regular file. as_fn_executable_p () { test -f "$1" && test -x "$1" } # as_fn_executable_p as_test_x='test -x' as_executable_p=as_fn_executable_p # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by $as_me, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ config.status configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" Copyright (C) 2012 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=?*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; --*=) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg= ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; '') as_fn_error $? "missing file argument" ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error $? "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error $? "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config/acconfig.h") CONFIG_HEADERS="$CONFIG_HEADERS config/acconfig.h" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= ac_tmp= trap 'exit_status=$? : "${ac_tmp:=$tmp}" { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 ac_tmp=$tmp # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$ac_tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove sole $(srcdir), # ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ h s/// s/^/:/ s/[ ]*$/:/ s/:\$(srcdir):/:/g s/:\${srcdir}:/:/g s/:@srcdir@:/:/g s/^:*// s/:*$// x s/\(=[ ]*\).*/\1/ G s/\n// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$ac_tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_tt=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_tt"; then break elif $ac_last_try; then as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$ac_tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$ac_tmp/stdin" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 rm -f "$ac_tmp/stdin" case $ac_file in -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; esac \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" } >"$ac_tmp/config.h" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$ac_tmp/config.h" "$ac_file" \ || as_fn_error $? "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error $? "could not create -" "$LINENO" 5 fi ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit 1 fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi lft-3.8/lft_types.h000644 000766 000000 00000012426 12711662332 014263 0ustar00vicwheel000000 000000 /* * lft_types.h * Layer Four Traceroute * * This file is part of LFT. * * The LFT software provided in this Distribution is * Copyright 2007 VOSTROM Holdings, Inc. * * The full text of our legal notices is contained in the file called * COPYING, included with this Distribution. * */ #ifndef LFT_TYPES_H #define LFT_TYPES_H #if defined( __CYGWIN__ ) || defined( WIN32 ) || defined(_WIN32) #include "config/acconfig.win.h" #else #include "config/acconfig.h" #endif #include #ifndef __FAVOR_BSD # define __FAVOR_BSD 1 #endif #if defined( __CYGWIN__ ) || defined( WIN32 ) || defined(_WIN32) #define __USE_W32_SOCKETS #include #include #include #include #define LITTLE_ENDIAN 1 #define BYTE_ORDER 1 typedef signed long n_long; typedef signed short n_short; typedef signed long n_time; #include #include #include #include #ifdef __CYGWIN__ # include #else # include "include/win32/wingetopt.h" # if defined(WIN32) || defined(_WIN32) # define SIZEOF_CHAR 1 # define SIZEOF_SHORT 2 # define SIZEOF_LONG 4 # define SIZEOF_LONG_LONG 8 # include "include/libpcap/bittypes.h" # include "include/libpcap/Gnuc.h" # define bzero(buf,cnt) memset(buf,'\0',cnt); # endif #endif #include "include/net/if_arp.h" #include "include/netinet/if_ether.h" #include "include/netinet/ip.h" #include "include/netinet/ip_icmp.h" #include "include/netinet/tcp.h" #include "include/netinet/udp.h" #else #include #include #if TIME_WITH_SYS_TIME # include # include #else # if HAVE_SYS_TIME_H # include # else # include # endif #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef BSD #include #endif #ifdef BSD_IP_STACK #include #include #if !defined(DARWIN) && !defined(NETBSD) #define HAVE_SNPRINTF #define HAVE_VSNPRINTF #if !defined(OPENBSD) #include #endif #endif #endif #include #ifdef sun #include #include #endif #endif #include "lft_ifname.h" #include "lft_lsrr.h" #include "whois.h" #if defined(__FreeBSD__) #include #elif !defined(DARWIN) && !defined(NETBSD) #include "lft_queue.h" #endif #ifndef EXIT_FAILURE #define EXIT_FAILURE 1 #endif #ifndef EXIT_SUCCESS #define EXIT_SUCCESS 0 #endif #ifdef __cplusplus extern "C" { #endif /* holds the pseudo-header for generating checksums */ struct sumh { unsigned int src; unsigned int dst; unsigned char fill; unsigned char protocol; unsigned short len; }; /* The actual packet data */ struct trace_packet_s { struct ip ip_hdr; struct ip_lsrr lsrr; /* must go here for ip checksum to work */ struct tcphdr tcp_hdr; struct udphdr udp_hdr; int size; char *payload; int payload_len; }; /* RFC 1393 type trace IP option */ struct rfc1393_ip_option_s { u_char optcode; //=82 u_char optlength; //=12 u_short id; //number to identify icmp trace messages u_short ohc; //outbound hop count u_short rhc; //return hop count struct in_addr origip; //originator ip address } __attribute__((packed)); /* ICMP echo header */ struct icmp_echo_header_s { u_char type; u_char code; u_short checksum; u_short id; u_short sequence; } __attribute__((packed)); /* ICMP trace response header */ struct icmp_trace_reply_header_s { u_char type; u_char code; u_short checksum; u_short id; u_short unused; u_short ohc; //outbound hop count u_short rhc; //return hop count u_long ols; //output link speed u_long olmtu; //output link MTU } __attribute__((packed)); /* Trace packet for RFC 1393 type and ICMP base trace */ struct icmp_trace_packet_s { char * packet; int packet_len; struct ip * ip_hdr; struct rfc1393_ip_option_s * icmp_trace_opt; struct ip_lsrr * lsrr; struct icmp_echo_header_s * echo; char * payload; int payload_len; }; /* Packet container with additional info */ struct trace_packet_info_s { int icmp_type; /* ICMP_UNREACH code, -1 if RST reply */ int is_done; /* is this a final hop? */ short hopno; unsigned int seq; struct timeval sent; struct timeval recv; /* 0 if unreceived */ struct in_addr hopaddr; /* IP address of router */ /* copy of EvtPacketInfoParam */ int asnumber; char netname[512]; struct in_addr last_hop; /*----------------------------*/ union { struct trace_packet_s packet; struct icmp_trace_packet_s icmp_packet; } u; SLIST_ENTRY(trace_packet_info_s) next_by_hop; SLIST_ENTRY(trace_packet_info_s) next; }; /* hop information, by ttl */ struct hop_info_s { int num_sent; int all_sent, all_rcvd; struct timeval ts_last_sent; struct timeval ts_last_recv; struct trace_packet_info_s * done_packet; unsigned short state; unsigned short flags; SLIST_HEAD(hop_packets_s, trace_packet_info_s) packets; }; #ifdef __cplusplus } #endif #endif /*LFT_TYPES_H*/ lft-3.8/makefile.vc000644 000766 000000 00000007322 11053131665 014205 0ustar00vicwheel000000 000000 # ========================================================================= # This makefile was generated by # Bakefile 0.2.2 (http://bakefile.sourceforge.net) # Do not modify, all changes will be overwritten! # ========================================================================= # ------------------------------------------------------------------------- # These are configurable options: # ------------------------------------------------------------------------- # C compiler CC = cl # Standard flags for CC CFLAGS = # Standard preprocessor flags (common for CC and CXX) CPPFLAGS = # Standard linker flags LDFLAGS = # Set to 1 to build debug version [0,1] # 0 - Release # 1 - Debug DEBUG = 0 # ------------------------------------------------------------------------- # Do not modify the rest of this file! # ------------------------------------------------------------------------- ### Variables: ### LFT_CFLAGS = /MD$(____DEBUG_3) /DWIN32 $(____DEBUG) $(____DEBUG_0) \ $(____DEBUG_1) $(______DEBUG) /Fdlft.pdb /w $(CPPFLAGS) $(CFLAGS) LFT_OBJECTS = \ lft_lft.obj \ lft_lft_btcptrace.obj \ lft_lft_icmptrace.obj \ lft_lft_ifname.obj \ lft_lft_lib.obj \ lft_whois.obj \ lft_wingetopt.obj \ lft_wingettimeofday.obj \ lft_winlft_ifname.obj WHOB_CFLAGS = /MD$(____DEBUG_3) /DWIN32 $(____DEBUG) $(____DEBUG_0) \ $(____DEBUG_1) $(______DEBUG) /Fdwhob.pdb /DSTANDALONE $(CPPFLAGS) $(CFLAGS) WHOB_OBJECTS = \ whob_whois.obj \ whob_wingetopt.obj ### Conditionally set variables: ### !if "$(DEBUG)" == "0" ____DEBUG = /DNDEBUG !endif !if "$(DEBUG)" == "1" ____DEBUG = !endif !if "$(DEBUG)" == "0" ____DEBUG_0 = /O2 !endif !if "$(DEBUG)" == "1" ____DEBUG_0 = /Od !endif !if "$(DEBUG)" == "0" ____DEBUG_1 = !endif !if "$(DEBUG)" == "1" ____DEBUG_1 = /Zi !endif !if "$(DEBUG)" == "0" ____DEBUG_2 = !endif !if "$(DEBUG)" == "1" ____DEBUG_2 = /DEBUG !endif !if "$(DEBUG)" == "0" ______DEBUG = !endif !if "$(DEBUG)" == "1" ______DEBUG = /D_DEBUG !endif !if "$(DEBUG)" == "0" ____DEBUG_3 = !endif !if "$(DEBUG)" == "1" ____DEBUG_3 = d !endif ### Targets: ### all: lft.exe whob.exe clean: -if exist .\*.obj del .\*.obj -if exist .\*.res del .\*.res -if exist .\*.pch del .\*.pch -if exist lft.exe del lft.exe -if exist lft.ilk del lft.ilk -if exist lft.pdb del lft.pdb -if exist whob.exe del whob.exe -if exist whob.ilk del whob.ilk -if exist whob.pdb del whob.pdb lft.exe: $(LFT_OBJECTS) link /NOLOGO /OUT:$@ $(LDFLAGS) $(____DEBUG_2) @<< $(LFT_OBJECTS) ws2_32.lib Iphlpapi.lib imm32.lib winmm.lib advapi32.lib << whob.exe: $(WHOB_OBJECTS) link /NOLOGO /OUT:$@ $(LDFLAGS) $(____DEBUG_2) @<< $(WHOB_OBJECTS) ws2_32.lib << lft_lft.obj: .\lft.c $(CC) /c /nologo /TC /Fo$@ $(LFT_CFLAGS) $** lft_lft_btcptrace.obj: .\lft_btcptrace.c $(CC) /c /nologo /TC /Fo$@ $(LFT_CFLAGS) $** lft_lft_icmptrace.obj: .\lft_icmptrace.c $(CC) /c /nologo /TC /Fo$@ $(LFT_CFLAGS) $** lft_lft_ifname.obj: .\lft_ifname.c $(CC) /c /nologo /TC /Fo$@ $(LFT_CFLAGS) $** lft_lft_lib.obj: .\lft_lib.c $(CC) /c /nologo /TC /Fo$@ $(LFT_CFLAGS) $** lft_whois.obj: .\whois.c $(CC) /c /nologo /TC /Fo$@ $(LFT_CFLAGS) $** lft_wingetopt.obj: .\include\win32\wingetopt.c $(CC) /c /nologo /TC /Fo$@ $(LFT_CFLAGS) $** lft_wingettimeofday.obj: .\include\win32\wingettimeofday.c $(CC) /c /nologo /TC /Fo$@ $(LFT_CFLAGS) $** lft_winlft_ifname.obj: .\include\win32\winlft_ifname.c $(CC) /c /nologo /TC /Fo$@ $(LFT_CFLAGS) $** whob_whois.obj: .\whois.c $(CC) /c /nologo /TC /Fo$@ $(WHOB_CFLAGS) $** whob_wingetopt.obj: .\include\win32\wingetopt.c $(CC) /c /nologo /TC /Fo$@ $(WHOB_CFLAGS) $** lft-3.8/CHANGELOG000644 000766 000000 00000031035 13263006744 013312 0ustar00vicwheel000000 000000 LFT CHANGELOG lft 3.8 / WhoB 3.8 ---------------------- - Added support for DLT_NULL interfaces lft 3.79 / WhoB 3.79 ---------------------- - Improved feature: 'whob me' and 'whob whoami' to display your public IP lft 3.78 / WhoB 3.78 ---------------------- - Added feature: 'whob me' to display your current public IP address lft 3.77 / WhoB 3.77 ---------------------- - Added feature: 'whob -gA' to show all prefixes TRANSITING an ASN Very powerful, much-requested feature! Enjoy Many thanks to Prefix WhoIs team! lft 3.76 / WhoB 3.76 ---------------------- - Remove compiler warnings using more casts (Victor) - Autoremake ./configure script so everyone has a reasonable default lft 3.75 / WhoB 3.75 ---------------------- - Improved cross-compiling compatiblity (thanks to Gustavo Z.) lft 3.74 / WhoB 3.74 ---------------------- - Fixed source port randomizaiton with -z (thanks to Conor M.) - Fixed compilation on OpenBSD (thanks to Renaud A.) lft 3.71 / WhoB 3.71 ---------------------- - WhoB: Autodetect input from STDIN (pipe) without '-f -' - WhoB: Redirect some extraneous output to STDERR lft 3.7 / WhoB 3.7 ---------------------- - Added support for 4-byte ASNs - Added support for whob reading bulk input from stdin using '-f -' lft 3.6 / WhoB 3.6 ---------------------- - Added support for 4-byte ASNs lft 3.5 / WhoB 3.5 ---------------------- - Roy T. provided DNS speed-ups - Added GraphViz output option with -g lft 3.35 / WhoB 3.5 ---------------------- - Roy T. provided some clean-ups to avoid double free()s - Bug fixes only lft 3.33 / WhoB 3.5 ---------------------- - Fixed free(sess->hostname) bug (segfault on unresolvable hostname) - Improved error hanlding of pcap failures related to data link type - Kurt's FreeBSD fix for pcap snprintf - Bug fixes only lft 3.32 / WhoB 3.5 ---------------------- - Added support for several encapsulating protocols such as PPP - no other changes lft 3.31 / WhoB 3.5 ---------------------- - Added #define for AI_NUMERICSERV undeclared on some platforms/versions - No other changes lft 3.3 / WhoB 3.5 ---------------------- - Improved LFT target detection behind firewalls - Updated LFT for newer pcap version defaults - WhoB ignores comments [#,;] in input files - Added LFT option -f to specify fake source address - Applied many, many, many fixes from Juli M. of USA -- Thanks! - Applied many, many, many fixes from Markus Gothe of Sweden -- Thanks! lft 3.2 / WhoB 3.2 ---------------------- - Added support for 802.1q tagged VLANs - Manual page corrections (thanks to Brett) - WhoB will use Prefix WhoIs for bulk file resolution in Cymru-compatible format with '-c' but Cymru will be used with '-C' lft 3.1 / WhoB 3.1 ---------------------- - New configure options: --enable-gtod Forces LFT to use gettimeofday() on each packet instead of using the BPF timestamp. This is critical on platforms that have enabled 'fastts' or that do not have high-precision BPF timestamping. --enable-universal generates binaries including both PPC and Intel architecture (for users running Mac OS X/Darwin) - Improved compatibility with NetBSD and Darwin/Mac OS X - Added autoconf support for NetBSD - Improved compatibility with older compilers (thanks to Sean) - Updated autoconf bits and pieces - By popular request, reversed the -g option of WhoB WhoB now uses gigo mode by default unless -g is specified which turns ON its parser and enables the other various options lft 3.0 ---------------------- - Completely refactored and now a workable library - LFT has a new (-b) TCP Basic trace method that makes TCP traces NAT-friendly - LFT has a new (-p) ICMP trace method that uses echo requests to trace paths - Many memory issues fixed - Cleanup of several 2.6b5-3.0b features lft 2.6 / WhoB 2.0 ---------------------- - LFT prints 'open' in the target block if the target dest port is open - LFT indicates the reason it marked ports open/closed in verbose(2) output - LFT prints an asterisk when it retransmits a packet after a timeout - LFT uses Prefix WhoIs (bulk) or RISWHOIS (bulk) for netname resolution - LFT has a new (-u) traditional UDP-based tracing feature - LFT displays start and finish times/dates when using the (-T) option - LFT has a new (-U) feature to display all times in UTC/GMT0 - LFT only shows time spent tracing/resolving at verbosity level 1 or higher - LFT sets the ToS bit on outgoing IP datagrams when (-I) option is used - LFT gets timevals from packets instead of calling gettimeofday() - LFT won't be fooled into thinking there's a firewall on a gateway just because adaptive mode ups the state waiting for replies that never come - Improved LFT performance (removed gettimeofday() on each packet) - WhoB/library uses Prefix WhoIs to resolve OrgNames and NetNames - WhoB/library has improved support for RIPE NCC RIS and Prefix WhoIs - WhoB supports bulk resolution (-f option) from an input file - WhoB also supports one-per-line output (-cf option) from a bulk input file - WhoB will use putenv() on Solaris who is missing setenv() to set TZ - WhoB has a new (-g) feature to take input directly from the command line and print output directly from Prefix WhoIs (referred to as GIGO) - Added $DESTDIR support to Makefile (thanks Daniel) - Fixed an off-by-one bug in LFT related to ASN display encountered when a trace contains one or more neglected TTLs - Fixed an off-by-one bug in LFT's verbose output regarding TTLs - Fixed variable ordering in whois.c from 2.6b1 (thanks Erick) - Numerous platform-specific improvements - Reconfigured autoconf and segregated ./config/ - Updated autoconf components to v2.59 lft 2.5 / WhoB 1.5 ---------------------- - Inclusive of betas 2.32 to 2.4x - Added -z option to pseudo-randomize source port - Added behavior to automatically select the most appropriate interface based on routing (this was on the most wanted list) - Improved OpenBSD compatibility (IP length nonzero) - OpenBSD is now detected by autoconf (for configuring the above) - Darwin is now detected by autoconf and its definition disables some BSD features to make it compatible with MacOS X and Darwin - LFT now indicates it has reached the target by printing a 'T' character in the status display (if status is enabled) - Cleanups were made to the verbose output levels (-VVV) - Significantly revamped whois framework makes it easy to include whois functionality into other programs - Added -C and -R and -r options to force alternate ASN sources: - (r)IPE RIS - special thanks to Rene Wilhelm @ RIPE NCC - (C)ymru - (R)ADB - Default ASN source (-A) is now Prefix WhoIs (see pwhois.org) - LFT now queries for ASNs in bulk format after completing a trace if pwhois (default), RIPE NCC RIS, or Cymru is selected - Added dst/src port autoselection based on user-supplied hostname - Vastly improved standalone whois client "whob" see whob.8 (whob manpage) - Makefile now installs 'whob' no-frills whois client (try ./whob) - "Smart" mode is now referred to as "Adaptive" mode (-E) lft 2.31 -------------------- - Fixed time precision on FreeBSD 5.3 (Thanks to Kurt Jaeger) lft 2.3: -------------------- - added WSAIoctl() call to select proper IF on windows based on dest (thanks Graham!) - lowered max_retries to a default of 2 - cleaned up formatting related to -S option - cleaned up verbose output to be more friendly - cleaned up error messages - updated manpage - updated spec file lft 2.2: -------------------- - removed dependence on regex library - removed dependence on INT_MAX - fixed whois code to get the most specific netblock instead of the least specific netblock - can now specify interface by IP instead of by name lft 2.1: -------------------- - Added autoconf support - Ported to cygwin - Fixed the Solaris and BSD makefiles (manpage install errors) - Modified the whois code to resolve ASN and netname lookup problems with RIPE entries. (-A) and (-N) code... - Modified the whois code to support local-as - Vastly streamlined the (-V) verbose output to cover the important information (sequence, etc) of all packets sent and received lft 2.0 (and betas): -------------------- - (-E) and (-F) shouldn't be used at the same time, now LFT knows that - Implemented fixes that enable LFT to run under Solaris/SPARC (Jim McKim) - Changed name from FFT to LFT (layer four trace) - Added ICMP messages for codes 13-15 - Changed the (-P) option added in 1.99 to (-E) in order to force use of the new "smart" engine - Enhanced stateful firewall (packet filter) detection en route - Engine: "smart" mode now tries FIN, SYN, etc table to get packets through which dramatically improves its "find a way" capability - Engine: "smart" mode now detects the BSD bug properly - Engine: "smart" mode now detects firewalls in transit - Compilation: made lft_queue.h the default for all OSs - UI: lots of user interface changes lft 1.99-beta(s): -------------------- - Added Loose Source Routing feature (LSRR) [ <...>] - Added (-N) Netblock name lookup feature - Added (-A) ASN lookup feature - Added (-P) option to automatically send 3 probes for more stats - Added (-V) lots of verbose debugging information - Added (-F) feature to revert to sending FIN packets - Added (-T) option to show trace and resolution timings (LFT is fast) - Added BSD 4.[23] and derivative (bug) inappropriate TTL detection - Engine: Use sequence numbers as packet ID instead of destination port numbers. This achieves a number of goals: Return ICMP and TCP packets are more uniquely identified. It is now possible to check the route for specific destination port, which is important if route varies based on port (such as with transparent proxying using a load balancing switch on port 80) (thank you Ugen!) - Engine: Send SYN packets. Variety of firewalls and NAT devices won't pass through a single TCP packet that is not a part of established connection, unless it carries SYN flag only (initial packet). Pitfall: this may create useless PCB blocks on destination host, if it does not use SYN cookies or some other SYN flood protection. However it's better then not being able to use lft from behind firewalls. (thank you Ugen!) - Renamed (-H) max hops/ttl option - UI cleaned up in several areas, especially result list & RTT display - Detect local packet filter lft 1.91: --------------------- - Fixed Makefile.solaris (last time we'll see this before autoconf) - added for Solaris lft 1.9: -------------------- - Default source port is now 53/tcp (dns-xfer) - Configurable source port on command line through -p or host:port - Configurable initial destination port on command line using -d - Source and Destination ports use /etc/services for lookup - Fixed a bug that created a gethostbyaddr() call even when the user specified NOT to do reverse DNS lookups -- makes -n option way faster! - Changed the way lft auto-detects the IP address of the interface selected * now, we determine what address is assigned to the interface instead of just getting the hosts's primary/default address and using it * thanks, Aaron, for bringing this to our attention! * thanks, Lane, for coming up with a platform-independent way of making it work. lft 1.8: -------------------- - added option to suppress status indicator and only show trace (or errors) * people using lft from a web page wanted this - added option to select the network interface used as hop zero * string length of device is tested to avoid potential buffer overflows - modified the status bar to display: Send mode: ->( / ) Recv mode: <{ } Additional testing platforms for this release: - Aaron Bentley (Univ Toronto) tested lft successfully under Debian Woody Linux * Aaron also contributed a variation of net device selection -- thanks lft 1.7: -------------------- - added option to disable reverse DNS host lookups - made several areas slightly more user-friendly - modified the status bar to display: Send mode: ->( / ) Recv mode: <( ) - changed "source" port from tcp/80 to tcp/25 most firewalls today permit tcp_established implicitly, not traffic from tcp/80 explicitly, therefore we figured sending packets from tcp/25 would be more likely to get through. - modified initialization of 32-bit unsigned integer used to calculate checksum LFT now builds again under Solaris, but still miscalculates checksums - fixed round trip time calculation - several other minor tweaks - tested under RedHat Linux, Darwin 5.5 (MacOS X v10.1) lft 1.6 (nils): --------------- - Great idea. lft-3.8/config/000755 000766 000000 00000000000 13263007004 013331 5ustar00vicwheel000000 000000 lft-3.8/lft.c000644 000766 000000 00000034335 13263006600 013026 0ustar00vicwheel000000 000000 /* This file is part of LFT. The LFT software provided in this Distribution is Copyright 2007 VOSTROM Holdings, Inc. The full text of our legal notices is contained in the file called COPYING, included with this Distribution. Authors: - Victor Oppleman - Eugene Antsilevitch Other copyrights and former authors: - Portions copyright (c) Genuity, Inc. - Portions copyright (c) Markus Gothe - Portions copyright (c) Nils McCarthy */ #include "lft_lib.h" /* BEGIN Added by Roy T. to improve DNS speed/reliability */ #include extern struct __res_state _res; /* END Added by Roy T. to improve DNS speed/reliability */ #if 0 static char def_payload[] = "\0\0\0\0\0\0\0\0\0\0"; /* default payload for UDP packets */ #endif const char *version = "3.8"; /* set version string */ static const char *version_date = "(04/2018)"; /* date of this version */ static void usage(lft_session_params * sess, char *prog) { fprintf (stderr, "\nLayer Four Traceroute (LFT)\n\n" " - the alternative traceroute tool for network [reverse] engineers\n" " visit http://www.pwhois.org\n\n" "Usage: %s [] [ <...>] \n" "\nMainstream Options:\n" " -s Source port number\n" " -d Destination port number (same as using target:port as target)\n" " -z Pseudo-randomize the source port number\n" " -m Minimum number of probes to send per hop\n" " -M Maximum number of probes to send per hop\n" " -D Listen-on/use a device by name or address (\"en1\" or \"1.2.3.4\")\n" " -L Set the length of the probe packet in bytes\n" "\nAdvanced Tracing Options:\n" " -F Use TCP FIN packets exclusively (defaults are SYN)\n" " -f Send using a device by name or address (spoofing allowed)\n" " -e | -E Use LFT's stateful engine to detect firewalls and path anomalies\n" " -u Use traditional UDP (probes) for tracing instead of TCP\n" " -b Basic TCP trace\n" " -p Use traditional ICMP (probes) for tracing instead of TCP\n" /*" -P Use RFC1393 IP option for tracing instead of TCP\n" */ " -a Number of hops forward to query before pausing to wait for replies\n" " -c Minimum number of milliseconds between subsequent probes\n" " -t Maximum RTT to wait before assuming packet was dropped\n" " -l Minimum TTL to use on outgoing packets (skips close-proximity hops)\n" " -H Maximum number of hops to traverse (max TTL of packets)\n" " -q Set the initial sequence number (ISN) manually\n" " -I Set the ToS field in the IP packet to minimize-delay\n" " -i Disable \"stop on ICMP\" other than TTL expired\n" "\nResolution Options:\n" " -n Display hosts numerically; disable use of the DNS resolver\n" " -h Display hosts symbolically; suppress IP address display\n" " -N Display network or AS names where appropriate\n" " -A Display AS numbers resolved by Prefix WhoIs\n" "\nAdvanced Resolution Options:\n" " -r Use RIPE NCC's RIS to resolve ASNs instead of Prefix WhoIs\n" " -R Use the RADB to resolve ASNs instead of Prefix WhoIs\n" " -C Use Cymru to resolve ASNs instead of Prefix WhoIs\n" "\nVerbosity Options and Status:\n" " -T Use execution timers and summarize where LFT spent its time\n" " -U Display all times in UTC (GMT0). Activates -T option automatically\n" " -S Disable the status bar (only show the completed trace)\n" " -V Display verbose/debug output. Use more \'V\'s for additional detail\n" " -x XML output\n" " -g GraphViz output\n" " -G Enable GraphViz output and override path to icons\n" " -y Test destination upstream transition hop\n" " -v Display LFT's version information and exit\n" "\n" "Default is: %s -s %d -d %d -m %d -M %d -a %d -c %.0f -t %d -H %d \n\n", prog, prog, sess->sport, sess->dport, sess->retry_min, sess->retry_max, sess->ahead_limit, sess->scatter_ms, sess->timeout_ms, sess->ttl_limit); exit(EXIT_FAILURE); } static void show_version (void) { fprintf (stderr, "\n" "Layer Four Traceroute (LFT) - version %s %s\n\n - the alternative traceroute tool for network [reverse] engineers\n\n" " Compile-time options:\n\n" #if defined(DARWIN) " + Darwin (or MacOS)\n" #endif #if defined(UNIVERSAL) " + Universal binary\n" #endif #if defined(NETBSD) " + NetBSD\n" #endif #if defined(OPENBSD) " + OpenBSD\n" #endif #if defined(BSD_IP_STACK) " + BSD IP stack\n" #endif #if defined(BSD) " + BSD platform\n" #endif #if defined(linux) " + Linux platform\n" #endif #if defined(sun) " + SUN platform\n" #endif #if !defined(sun) && !defined(linux) && !defined(BSD_IP_STACK) && !defined(OPENBSD) " (unknown architecture)\n" #endif #if defined(SCREWED_IP_LEN) " + IP length big-endian\n" #else " + IP length little-endian\n" #endif #if defined(IP_HDRINCL) " + Full IP headers for raw sockets\n" #else " + Without IP header inclusion\n" #endif #if defined( __CYGWIN__ ) || defined( WIN32 ) || defined(_WIN32) || defined( USE_GTOD ) " + Calling gettimeofday() on each packet\n" #endif " + " HOST_SYSTEM_TYPE "\n" "\n", version, version_date); exit(EXIT_SUCCESS); } extern int main (int argc, char **argv) { lft_session_params * sess; int ch; char *cp = NULL; struct timeval tb; #if defined( __CYGWIN__ ) || defined( WIN32 ) || defined(_WIN32) WORD wVersionRequested; WSADATA wsaData; wVersionRequested = MAKEWORD( 2, 2 ); WSAStartup( wVersionRequested, &wsaData ); #endif /* BEGIN Added by Roy T. to improve DNS speed/reliability */ res_init(); _res.retrans = 1; _res.retry = 1; /* END Added by Roy T. to improve DNS speed/reliability */ sess = LFTSessionOpen(); setbuf(stdout, NULL); gettimeofday (&tb, NULL); /* eventually this might want to use /dev/urandom or * something on machines that have it. otherwise, * this does a fairly decent job of using the system * clock. * * multiply tv_usec (range 0-1000000) to be in range 0-2^31, * and xor to randomize the high bits of tv_sec that don't * change very much. */ srand(tb.tv_sec ^ (tb.tv_usec * 2147)); while ((ch = getopt(argc, argv, "Aa:bCc:D:d:EeFf:H:hIiL:l:M:m:NnPpq:RrSs:Tt:UuVvxw:zgG:y")) != EOF) switch (ch) { case 'f': LFTSetupSendDevice(sess, optarg); break; case 'F': LFTSetupFIN(sess); break; case 'h': LFTSetupDispSymbHost(sess); break; case 'u': LFTSetupUDPMode(sess); break; case 'r': LFTSetupRISLookup(sess); break; case 'R': LFTSetupRADBLookup(sess); break; case 'C': LFTSetupCYMRULookup(sess); break; case 'd': LFTSetupDestinationPort(sess, optarg); break; case 'L': LFTSetupLengthOfPacket(sess, (int)strtol(optarg, (char **)NULL, 10)); break; case 'q': sess->seq_start = strtol(optarg, (char **)NULL, 10); break; case 'w': sess->win_len = (int)strtol(optarg, (char **)NULL, 10); break; case 'm': sess->retry_min = (int)strtol(optarg, (char **)NULL, 10); break; case 'M': sess->retry_max = (int)strtol(optarg, (char **)NULL, 10); break; case 'N': sess->do_netlookup = 1; break; case 'A': sess->do_aslookup = 1; break; case 'n': LFTSetupDisableResolver(sess); break; case 'T': sess->timetrace = 1; break; case 's': LFTSetupSourcePort(sess, lft_resolve_port(sess,optarg)); break; case 'E': case 'e': LFTSetupAdaptiveMode(sess); break; case 'S': sess->nostatus = 1; break; case 'D': LFTSetupDevice(sess,optarg); break; case 'a': sess->ahead_limit = (int)strtol(optarg, (char **)NULL, 10); break; case 'c': sess->scatter_ms = (int)strtol(optarg, (char **)NULL, 10); if (sess->scatter_ms < 1) sess->scatter_ms = 1; if (sess->scatter_ms > 100) sess->scatter_ms = 100; break; case 't': sess->timeout_ms = (int)strtol(optarg, (char **)NULL, 10); break; case 'p': sess->protocol = 2; break; /*case 'P': //We comment this option. Hardly any routers support this. sess->protocol = 3; break;*/ case 'b': sess->protocol = 4; break; case 'H': if (strtol(optarg, (char **)NULL, 10) > 255) sess->ttl_limit = 255; else sess->ttl_limit = (int)strtol(optarg, (char **)NULL, 10); break; case 'l': sess->ttl_min = (int)strtol(optarg, (char **)NULL, 10); sess->hop_info_length = sess->ttl_min; if (sess->ttl_min > 0) sess->ttl_min--; break; case 'i': sess->break_on_icmp = 0; break; case 'I': sess->set_tos = 1; break; case 'v': show_version(); break; case 'U': /* show all times in UTC */ LFTSetupUTCTimes(sess); break; case 'V': sess->noisy++; sess->nostatus = 1; break; case 'z': sess->random_source = 1; /* Yes, this is a ridiculous randomizer, but it's adequate */ sess->sport = rand()%32525+32525; break; case 'x': setOutputStyle(1); break; case 'g': setOutputStyle(2); break; case 'G': setOutputStyle(2); sess->graphviz_icon_path=optarg; break; case 'y': sess->check_seam=1; break; default: usage(sess, argv[0]); } if((argc - optind) < 1) usage(sess, argv[0]); if (sess->noisy && !outputStyleIsXML() && !outputStyleIsGraphViz()) printf ("Layer Four Traceroute (LFT) version %s", version); if (sess->noisy > 1 && !outputStyleIsXML() && !outputStyleIsGraphViz()) printf (" ... (verbosity level %d)",sess->noisy); if (sess->noisy && !outputStyleIsXML() && !outputStyleIsGraphViz()) printf ("\n"); if(outputStyleIsXML()) { printf("\n",sess->noisy); } sess->hostname = argv[optind++]; sess->hostname_lsrr_size = 0; while (optind < argc) { sess->hostname_lsrr[sess->hostname_lsrr_size++] = argv[optind++]; if (sess->hostname_lsrr_size > IP_LSRR_DEST) { if(outputStyleIsXML()) { printf("Unknown host: Too many LSRR hosts - maximum is 8"); printf("\n"); } else { fprintf(stderr, "LFT: Too many LSRR hosts - maximum is 8\n"); } exit(EXIT_FAILURE); } } if (sess->hostname_lsrr_size > 0) { sess->hostname_lsrr[sess->hostname_lsrr_size++] = sess->hostname; sess->hostname = sess->hostname_lsrr[0]; } /* allow hostname:port if -d not specified and not using UDP */ if ((cp = strchr(sess->hostname, ':'))) { if (!sess->dflag) { *cp++ = '\0'; sess->dport = lft_resolve_port (sess,cp); if (sess->protocol==1) { sess->dport = (lft_resolve_port (sess,cp)) - 1; if (sess->dport > (65535 - sess->ttl_limit)) { sess->dport = (65535 - sess->ttl_limit) - 1; if(outputStyleIsXML()) printf("Starting UDP port %d is too high. Will start with %d instead.",sess->dport, (65535 - sess->ttl_limit)); else { fprintf (stderr, "LFT warning: Starting UDP port %d is too high. Will start with %d instead.\n", sess->dport, (65535 - sess->ttl_limit)); } } } sess->auto_ports = 0; } } LFTExecute(sess); LFTSessionClose(sess); #if defined( __CYGWIN__ ) || defined( WIN32 ) || defined(_WIN32) WSACleanup(); #endif if(outputStyleIsXML()) printf("\n"); //getch(); return 0; } lft-3.8/include/000755 000766 000000 00000000000 13263007004 013507 5ustar00vicwheel000000 000000 lft-3.8/lft_icmptrace.h000644 000766 000000 00000000567 11053131665 015067 0ustar00vicwheel000000 000000 #ifndef LFT_ICMPTRACE_H #define LFT_ICMPTRACE_H #include "lft_lib.h" #define ICMP_TRACE 30 int generateICMPPacket( lft_session_params * sess, LFT_CALLBACK err, LFT_CALLBACK evt, struct icmp_trace_packet_s * packet, u_char ttlval, u_short unique_id, u_short seq); void icmp_trace_main_loop(lft_session_params * sess, LFT_CALLBACK err, LFT_CALLBACK evt); #endif lft-3.8/lft.spec000644 000766 000000 00000006444 11053156744 013550 0ustar00vicwheel000000 000000 # If you don't like the prefix '/usr' you can override it like this: # rpm -ba|--rebuild --define 'prefix /usr/local' %{?!prefix:%define prefix %{prefixdef}} Name: lft Version: 3.2 Release: 1 Vendor: VOSTROM Packager: Victor Oppleman URL: http://pwhois.org/lft/ Source: %{name}-%{version}.tar.gz Group: Applications/Internet License: VOSTROM Public License Provides: lft whob Requires: libpcap BuildRoot: %{_tmppath}/root-%{name}-%{version} Prefix: %{_prefix} Summary: Alternative traceroute and whois tools for network (reverse) engineers BuildRequires: libpcap Obsoletes: fft %description LFT, short for Layer Four Traceroute, is a sort of 'traceroute' that often works much faster (than the commonly-used Van Jacobson method) and goes through many configurations of packet-filter based firewalls. LFT is the all-in-one traceroute tool because it can use many different trace methods and protocols such as ICMP, TCP, and UDP, as well as the RFC-1393 trace. More importantly, LFT implements numerous other features including AS number lookups based on global table prefix (not just the RIR), loose source routing, netblock name lookups, et al. Also inlcudes a nifty whois client named 'whob'. %prep %setup %build %configure %{__make} %{?_smp_mflags} %install %{__rm} -rf %{buildroot} %makeinstall DESTDIR="%{buildroot}%{_bindir}" MANDIR="%{buildroot}%{_mandir}/man8" %clean %{__rm} -rf %{buildroot} %files %defattr(-, root, root, 0755) %{_mandir}/man8/* %doc CHANGELOG COPYING README TODO %attr(4755, root, root) %{_bindir}/lft %attr(0755, root, root) %{_bindir}/whob %changelog * Mon Aug 22 2005 Victor Oppleman - Added -z option to pseudo-randomize source port - Added behavior to automatically select the most appropriate interface based on routing (this was on the most wanted list) - Improved OpenBSD compatibility (IP length nonzero) - OpenBSD is now detected by autoconf (for configuring the above) - Darwin is now detected by autoconf and its definition disables some BSD features to make it compatible with MacOS X and Darwin - LFT now indicates it has reached the target by printing a 'T' character in the status display (if status is enabled) - Cleanups were made to the verbose output levels (-VVV) - Significantly revamped whois framework makes it easy to include whois functionality into other programs - Added -C and -R and -r options to force alternate ASN sources: - (r)IPE RIS - (C)ymru - (R)ADB - Default ASN source (-A) is now Prefix WhoIs (see pwhois.org) - LFT now queries for ASNs in bulk format after completing a trace if pwhois (default), RIPE NCC RIS, or Cymru is selected - Added dst/src port autoselection based on user-supplied hostname - Vastly improved standalone whois client "whob" see whob.8 (whob manpage) - Makefile now installs 'whob' no-frills whois client (try ./whob) - "Smart" mode is now referred to as "Adaptive" mode (-E) * Fri Nov 26 2004 Victor Oppleman - Cleaned up various files, updated to support LFT 2.3 * Sun Apr 20 2003 Nils McCarthy - Incorporated changes from Dag Wieers cleaning up - a lot of the build process. * Thu Mar 06 2003 Nils McCarthy - revised to work with autoconf * Mon Oct 28 2002 Florin Andrei - first version - v2.0-1 lft-3.8/lft_ifname.h000644 000766 000000 00000001171 11053131665 014347 0ustar00vicwheel000000 000000 /* * lft_ifname.h * Layer Four Traceroute * * This file is part of LFT. * * The LFT software provided in this Distribution is * Copyright 2007 VOSTROM Holdings, Inc. * * The full text of our legal notices is contained in the file called * COPYING, included with this Distribution. * */ #ifndef LFT_IFNAME_H #define LFT_IFNAME_H #ifdef __cplusplus extern "C" { #endif #define STRNCPY(dst, src, len) { \ (dst)[(len)-1] = '\0'; \ strncpy((dst),(src),(len)-1); \ } extern u_long lft_getifaddr (const char *); extern char * lft_getifname (struct in_addr); #ifdef __cplusplus } #endif #endif /*LFT_IFNAME_H*/ lft-3.8/whob.8000644 000766 000000 00000011432 13071535402 013122 0ustar00vicwheel000000 000000 .Dd August 17, 2002 .Dt WHOB 8 .Os WHOB .Sh NAME .Nm whob .Nd display whois-type information of interest to Internet operators .Sh SYNOPSIS .Nm whob .Op Fl h Ar whois-server .Op Fl g .Op Fl AaCcfhNnOopRrstuVv .Ar query .Sh DESCRIPTION .Nm queries various sources of whois information for data of interest to network operators and their tracing and debugging tools. .Pp .Nm output is designed to be easily parsed, or better yet, its functionality can be added directly into your programs (see whois.h). .Pp The only mandatory parameter is the target host name or IP number. Options toggle the display of more interesting data or change the sources used to obtain that data. .Pp One key advantage of .Nm is its lookup of ASN information derived from the global Internet routing table itself, as opposed to relying solely on what has been registered in the RADB/IRR (see below). This data is, by default, sourced from the global pWhoIs service. See www.pwhois.org .Pp Other options are: .Bl -tag -width Ds .It Fl A Ar ASN Display all routing advertisements transiting the respective ASN. The ASN may be supplied as the target argument, or a hostname or IP address may be supplied and .Nm will resolve the ASN automatically. .It Fl a Ar ASN Display all routing advertisements made by the respective Origin-AS. The Origin-AS may be supplied as the target argument, or a hostname or IP address may be supplied and .Nm will resolve the ASN automatically. .It Fl P Ar prefix Display all routing advertisements related to the CIDR prefix supplied by the user. .It Fl N Ar ASN Display all networks registered to the ASN supplied by the user. .It Fl O Ar ASN Display all contact information on file for the ASN supplied by the user. .It Fl g Disable GIGO mode. By popular request, whob takes input directly from the command line and passes it without modification to pWhoIs or whatever whois server is requested (-h). The exact output is returned without any parsing. To enable parsing and the other useful switches, disable GIGO mode by passing this (-g) option. .It Fl R Display the Origin-AS on record at the RADB/IRR (Routing Arbiter Database/Internet Routing Registry) in addition the the Origin-AS provided by the prefix-based whois data source. .It Fl n Display the network name on record with the IP network allocation registry also such as ARIN, RIPE, or APNIC. .It Fl o Display the organization name on file at the registrar. .It Fl p Display the AS-Path from the perspective of the current pwhois server. The pwhois server may automatically exclude the initial, least specific ASN received from the operator of the network to which it is connected (unless that ASN is the only/origin ASN or unless it has multiple peers). Of course, this AS-Path is subjective. If you rely on this and want AS-Paths that correspond to *your* network infrastructure, you may want to install your own pwhois server. See the (-w) option and www.pwhois.org .It Fl t Display the date the route was last cached by the pWhoIs server. .It Fl u When possible, display dates in UTC/GMT instead of local time. .It Fl h/w Ar host Change the source of prefix-based whois data from the default (pWhoIs) to any whois-compatible server of your choice (like your own). .It Fl f Ar file Read from the specified file (or from stdin if the argument is '-') and submit its contents as bulk input to pwhois. The input will be buffered accordingly and subject to the constraints of the current pwhois server. Output is written to STDOUT (which may be redirected) and will not be parsed. Additional instructions to pwhois may be placed at the beginning of the file, however they will only apply to the first buffer of pwhois input. The first (left-most) field in each line of the file must be the IP address and lines may be up to 255 characters in length. .It Fl c Change the source of prefix-based whois data from the default (pWhoIs) to Cymru. See www.cymru.com for more details. When used with the -f option, this switch causes .Nm to use Cymru whois for bulk file resolution instead of pwhois. .It Fl r Display the Origin-AS and prefix according to RIPE NCC RIS (see www.ripe.net/projects/ris/). When used with the -f option, this switch causes .Nm to use RIPE NCC riswhois for bulk file resolution instead of pwhois. .It Fl s Show the status of the (respective) pWhoIs server and exit(0) .It Fl V Display verbose/debug output. Use multiple 'V's for additional verbosity. .It Fl v Display this client's version information and exit(1) .It Fl me|whoami Display this host's public IP address and exit(0) .El .Pp .Sh AUTHORS Victor Oppleman and Eugene Antsilevitch .Sh REPORTING BUGS To report bugs, send e-mail to .Sh SEE ALSO .Xr lft 8 , .Xr whois 1 .Sh HISTORY The .Nm command first appeared in 2004. This whois framework has been a component of LFT since 2002. lft-3.8/lft_btcptrace.h000644 000766 000000 00000000255 11053131665 015061 0ustar00vicwheel000000 000000 #ifndef LFT_BTCPTRACE_H #define LFT_BTCPTRACE_H #include "lft_lib.h" void tcp_base_trace_main_loop(lft_session_params * sess, LFT_CALLBACK err, LFT_CALLBACK evt); #endif lft-3.8/README000644 000766 000000 00000002017 11053131665 012752 0ustar00vicwheel000000 000000 # This file is part of LFT. # # The LFT software provided in this Distribution is # Copyright 2007 VOSTROM Holdings, Inc. # # The full text of our legal notices is contained in the file called # COPYING, included with this Distribution. 1) LFT stands for "Layer Four Traceroute" 2) We advise you to acquire the latest version of LFT before installing LFT's web site is located at http://pwhois.org/lft/ 3) Please read the "INSTALL" file for instructions on installing LFT 4) Please read the LFT manual page for instructions on using LFT (lft.8) 5) LFT also includes "whob" (a whois client for Internet operators) WhoB has its own manual page (whob.8). 6) The authors may be reached via e-mail at lft-bugs@oppleman.com We welcome your feedback. We also welcome your contributions. If you're interested in helping us make LFT better, please contact us. 7) Our road map for where we're taking the software may be found in the "TODO" file. 8) LFT's history of changes can be found in the "CHANGELOG" ENJOY! lft-3.8/TODO000644 000766 000000 00000000603 12041511452 012553 0ustar00vicwheel000000 000000 LFT TO-DO --------- Features to ADD (not in any particular order) - TCP-based tracing on windows doesn't work because of "security features" - IPv6 support, or AF-independent source - path MTU auto-discovery (RFC 1191) - display min/avg/max/stddev RTT instead of just the sample - asynchronus DNS queries - implement target fingerprinting using TCP timestamps option (RFC 1323) lft-3.8/lft_lib.h000644 000766 000000 00000040455 12323066364 013672 0ustar00vicwheel000000 000000 /* * lft_lib.h * Layer Four Traceroute * * This file is part of LFT. * * The LFT software provided in this Distribution is * Copyright 2007 VOSTROM Holdings, Inc. * * The full text of our legal notices is contained in the file called * COPYING, included with this Distribution. * */ #ifndef LFT_LIB_H #define LFT_LIB_H #include "lft_types.h" /* not available in earlier darwin systems */ #ifndef AI_NUMERICSERV #define AI_NUMERICSERV 0 #endif /* As the trace progresses, each hope will attempt to work through the states one by one until it receives an answer (2 attempts per state). Whatever state "works" - will be then set up on following hops to continue from. */ #define HS_SEND_FIN 0x00 #define HS_SEND_SYN 0x01 #define HS_SEND_SYN_FIN 0x02 #define HS_SEND_RST 0x04 #define HS_SEND_SYN_ACK 0x12 #define HS_SEND_ACK 0x16 #define HS_MAX (HS_SEND_SYN) #define HF_ENDPOINT 0x01 /* default timeout value */ #define DEFAULT_TIMEOUT_MS 250 /* Common EtherType values */ #ifndef ETHERTYPE_IP #define ETHERTYPE_IP 0x0800 /* IP protocol */ #endif #ifndef ETHERTYPE_ARP #define ETHERTYPE_ARP 0x0806 /* Addr. resolution protocol */ #endif #ifndef ETHERTYPE_REVARP #define ETHERTYPE_REVARP 0x8035 /* reverse Addr. resolution protocol */ #endif #ifndef ETHERTYPE_VLAN #define ETHERTYPE_VLAN 0x8100 /* IEEE 802.1Q VLAN tagging */ #endif #ifndef ETHERTYPE_IPV6 #define ETHERTYPE_IPV6 0x86dd /* IPv6 */ #endif /* Sometimes-missing BPF values */ #ifndef DLT_RAW #define DLT_RAW 101 /* Raw IP */ #endif #ifndef DLT_PPP_SERIAL #define DLT_PPP_SERIAL 50 /* PPP with HDLC encapsulation */ #endif #ifndef DLT_PPP_ETHER #define DLT_PPP_ETHER 51 /* PPP over Ethernet */ #endif #ifndef DLT_LINUX_SLL #define DLT_LINUX_SLL 113 /* Linux cooked capture */ #endif #ifndef DLT_PPP #define DLT_PPP 9 /* PPP over Ethernet */ #endif /* ToS (type of service) bits we can set on the IP datagram */ #define TOSMINDELAY 0x10 #define TOSMAXTHROUGH 0x08 #define TOSMAXRELIABLE 0x04 #define TOSMINCOST 0x02 /*Errors and warnings codes*/ #define WRN_CANT_SETUP_FIN -1 #define WRN_CANT_DISP_HOST_NAMES -2 #define WRN_ADAPTIVE_DISABLED_BY_UDP -3 #define WRN_FIN_DISABLED_BY_UDP -4 #define WRN_ONLY_ONE_ASN_LOOKUP -5 #define WRN_UDP_PORT_TOO_HIGH -6 #define WRN_PACKET_LENGTH_TOO_HIGH -7 #define WRN_PACKET_LENGTH_TOO_LOW -8 #define WRN_CANT_DISABLE_RESOLVER -9 #define WRN_ALREADY_RANDOM_SPORT -10 #define WRN_ADAPTIVE_DISABLED_BY_FIN -12 #define ERR_DEVNAME_TOO_LONG -13 #define WRN_UNABLE_SETUP_UTC -14 #define WRN_GETIFFORREMOTE_SOCKET -15 #define WRN_GETIFFORREMOTE_CONNECT -16 #define WRN_GETIFFORREMOTE_SOCKNAME -17 #define ERR_UNKNOWN_HOST -18 #define ERR_RAW_SOCKET -19 #define ERR_SOCKET_BIND -20 #define WRN_WSAIOCTL -21 #define ERR_IP_HDRINCL -22 #define ERR_NOT_ENOUGH_MEM -23 #define ERR_RAW_TCP_DISABLED -24 typedef struct _badhopstateparam { const struct hop_info_s *h; short nhop; }WrnBadHopStateParam; #define WRN_BAD_HOP_STATE -25 #define WRN_NS_LOOKUP_FAILED -26 #define ERR_WIN_SELECT -27 #define ERR_WIN_RECV -28 #define ERR_WIN_WSASTARTUP -29 #define ERR_PCAP_ERROR -30 #define ERR_DISCOVER_INTERFACE -31 #define ERR_UNKNOWN_INTERFACE -32 #define ERR_UNKNOWN_SEND_INTERFACE -32 #define ERR_PCAP_DEV_UNAVAILABLE -33 #define WRN_BIOCIMMEDIATE -34 #define ERR_PCAP_NONBLOCK_ERROR -35 /*Events codes and their params structures*/ #define EVT_AUTOCONFIGURED_TO_PORTS 1 #define EVT_ADDRESS_INITIALIZED 2 typedef struct _sentpacketparams { short nhop; unsigned int tseq; unsigned char flags; unsigned short tttl; }EvtSentPacketParam; #define EVT_SENT_PACKET 3 #define EVT_SHOW_PAYLOAD 4 #define EVT_SHOW_UDP_CHECKSUM 5 #define EVT_SHOW_TCP_CHECKSUM 6 #define EVT_SHOW_HOPS 7 #define EVT_SHOW_NUM_HOPS 8 #define EVT_TRACE_COMPLETED 9 #define EVT_ON_RESOLUTION 10 #define EVT_TRACE_REPORT_START 11 typedef struct _rptnoreplyparams { int hopno; int noreply; }EvtNoReplyParam; #define EVT_RPT_NO_REPLY 12 #define EVT_RPT_FRW_INSPECT_PACKS 13 #define EVT_RPT_FRW_STATE_FILTER 14 #define EVT_RPT_BSD_BUG 15 #define EVT_RPT_HOP_INFO_START 16 typedef struct _packetinfoevtparam { int asnumber; const char * netname; struct in_addr last_hop; int is_asseam; int is_netseam; int seam_traced; int is_open; int is_filtered; const struct trace_packet_info_s * tp; }EvtPacketInfoParam; #define EVT_RPT_PACKET_INFO 17 #define EVT_RPT_PACKET_LIST_END 18 #define EVT_RPT_NO_HOPS 19 #define EVT_RPT_TIME_TRACE 20 #define EVT_ON_EXIT 21 #define EVT_TTL_NO_REPLY 22 #define EVT_PROGRESS_NO_REPLY 23 #define EVT_TTL_TOUT_RESEND 24 #define EVT_TTL_TOUT_GIVINGUP 25 typedef struct _debugchkpoint1 { int last_return; int no_reply; int need_reply; }EvtDebugCheckpoint1Param; #define EVT_DBG_CHECKPOINT1 26 #define EVT_CANT_RELIABLY_RTRIP 27 #define EVT_HAVE_UNANSWERRED_HOPS 28 #define EVT_TOO_FAR_AHEAD 29 #define EVT_HAVE_GAPS 30 #define EVT_EITHER_RESP_OR_TOUT 31 #define EVT_LOOKFOR_UNINC_ACK 32 #define EVT_LOOKFOR_OFF_BY_LEN 33 #define EVT_LOOKFOR_LAST_RESORT 34 #define EVT_SKIP_PACKET 35 typedef struct _nonseqpack { struct in_addr ipaddr; const struct trace_packet_info_s * tp; }EvtNonSeqPacketParam; #define EVT_ACK_WAS_NOT_INC 36 #define EVT_RST_REL_TO_ISN 37 #define EVT_ACK_WAS_WAY_OFF 38 #define EVT_DUPLICATE_PACKET 39 #define EVT_PROGRESS_DUPLICATE 40 typedef struct _recvpacket { struct in_addr ipaddr; struct trace_packet_info_s * tp; unsigned int seq; }EvtRecvPacketParam; #define EVT_RECV_PACKET 41 #define EVT_PROGRESS_OK 42 #define EVT_TCP_PORT_CLOSED 43 #define EVT_TCP_PORT_OPEN 44 #define EVT_PROCESS_PACKET_START 45 #define EVT_UDP_NOT_FOR_US 46 typedef struct _incomudpicmp { const struct ip * ip; const struct ip * orig_ip; const struct udphdr *udp; const struct icmp *icmp; }EvtIncomingICMPUDPParam; #define EVT_INCOMING_ICMP_UDP 47 #define EVT_RCVD_ICMP_UDP 48 typedef struct _incomtcpicmp { const struct ip * ip; const struct ip * orig_ip; const struct tcphdr *tcp; const struct icmp *icmp; }EvtIncomingICMPTCPParam; #define EVT_INCOMING_ICMP_TCP 49 #define EVT_RCVD_ICMP_TCP 50 #define EVT_RCVD_TCP 51 #define EVT_RCVD_UNKNOWN 52 #define EVT_DEVICE_SELECTED 53 #define EVT_SHOW_INITIAL_SEQNUM 54 #define EVT_TRACE_START 55 #define EVT_DBG_CHECKPOINT2 56 #define EVT_DBG_LOG_MESSAGE 57 #define EVT_PROGRESS_SKIP_PACKET 58 #define EVT_OPEN_CHECK_RESULT 59 #define ERR_BTCP_PROBE_PORT_IS_BUSY 60 #define ERR_BTCP_WRONG_PORT_VALUE 61 #define EVT_OCHECK_START 62 #define WRN_OCHECK_OPEN_SOCK 63 #define WRN_OCHECK_IOCTL 64 #define WRN_OCHECK_SELECT 65 #define WRN_OCHECK_GETERROR 66 #define WRN_OCHECK_SOCKERROR 67 #define WRN_OCHECK_TIMEOUT 68 #define EVT_OCHECK_OPEN 69 #define WRN_OCHECK_FCNTLGET 70 #define WRN_OCHECK_FCNTLSET 71 #define WRN_OCHECK_CONNECTERR 72 typedef struct _incomechoreplyicmp { const struct ip * ip; const struct icmp_echo_header_s * echo; }EvtIncomingICMPEchoParam; #define EVT_INCOMING_ICMP_Echo 73 #define EVT_RCVD_ICMP_Echo 74 typedef struct _incomicmpicmp { const struct ip * ip; const struct icmp * icmp; const struct ip * orig_ip; const struct icmp_echo_header_s * echo; }EvtIncomingICMPICMPParam; #define EVT_INCOMING_ICMP_ICMP 75 #define EVT_RCVD_ICMP_ICMP 76 #if defined(BSD_IP_STACK) && !defined(OPENBSD) #define SCREWED_IP_LEN #endif typedef struct btcpmapentry { int nhop; int port; int sentcount; }BasicTCPMapEntry; #ifdef __cplusplus extern "C" { #endif typedef struct _btcp_debug_info { int type; int hop; int phop; int port; struct in_addr ip; }btcp_debug_info; /* Session parameters */ typedef struct _lft_session_params { struct timeval ts_last_sent; struct timeval now; double scatter_ms; /* milleseconds between sends */ int ttl_min; /* user may request to start at a higher TTL */ int hop_info_length; unsigned short ip_id; /*not used*/ unsigned char tcp_flags; int use_fins; int seq_start; /* generate ISN internally by default */ int dport; /* set default destination to tcp/80 HTTP */ int sport; /* set default source to tcp/53 dns-xfer */ int auto_ports; /* enable port autoselection by default */ int random_source; /* disable random source port by default */ int set_tos; /* disable set ToS bit by default */ int userlen; /* user-requested packet length */ int payloadlen; /* the final probe payloadlength */ int win_len; int timeout_ms; /* timeout between retries */ int retry_max; /* number of retries before giving up */ int retry_min; /* minimum number of checks per hop */ int ahead_limit; /* number of probes we can send * without replies if we don't know * the number of hops */ int dflag; int ttl_limit; /* max # hops to traverse (highest TTL) */ int break_on_icmp; /* break on icmp other than time exceeded */ int noisy; /* disable verbose debug by default */ int nostatus; /* print status bar by default */ int userdevsel; /* by default, we'll select the device */ int senddevsel; /* by default, we'll select the device */ int resolve_names; /* dns resolution enabled by default */ int hostnames_only; /* disable printing of IP addresses */ int timetrace; /* disable tracer timing by default */ int adaptive; /* disable state engine by default */ int protocol; /* 0 - TCP, 1 - UDP, 2 - ICMP base, 3 - ICMP RFC 1393, 4 - TCP basic */ int do_netlookup; /* disable netname lookup by default */ int do_aslookup; /* disable asn lookup by default */ int use_radb; /* use RADB instead of pwhois */ int use_cymru; /* use Cymru instead of pwhois */ int use_ris; /* use RIPE NCC RIS instead of pwhois */ char *payload; int send_sock; int skip_header_len; #if defined( __CYGWIN__ ) || defined( WIN32 ) || defined(_WIN32) int recv_sock; int wsastarted; #else pcap_t * pcapdescr; #endif int UseLocalTime; int num_hops; /*int num_sent;*/ int num_rcvd; int target_open; int target_filtered; int target_anomaly; char *hostname; char *hostname_lsrr[9]; int hostname_lsrr_size; struct in_addr local_address; struct in_addr remote_address; struct timeval begin_time, trace_done_time; /* The actual packet data (one of..)*/ struct trace_packet_s trace_packet; struct icmp_trace_packet_s icmp_packet; /* Packet container with additional info */ /* struct trace_packet_info_s * trace_packet_info;*/ /* indexed by dport - dport NOT USED*/ /* list of packet containers */ SLIST_HEAD(packets_s, trace_packet_info_s) trace_packets; int trace_packets_num; /* Map of ports for basic TCP trace */ BasicTCPMapEntry * btcpmap; int latestmapchoice; int btcpmapsize; int btcpdpucnt; int trg_probe_is_sent; /* btcp_debug_info debugmap[1000]; */ /* int debugmapidx; */ /* hop information, by ttl */ struct hop_info_s * hop_info; const char * pcap_dev; /* data link type as in pcap_datalink() */ int pcap_datalink; const char * pcap_send_dev; const char * userdev; const char * senddev; /*WHOIS parameters*/ whois_session_params * wsess; /*User's data*/ void * UsersDataCookie; /* GraphViz subquery. Disables any output. */ int is_graphviz_subquery; int check_seam; char * graphviz_icon_path; /*Exit status. When this field has value <0 lft will end work as soon as possible*/ int exit_state; }lft_session_params; extern const char * icmp_messages[]; extern const char *version; extern const char *appname; extern const int maxpacklen; /*--------------------------- Callbacks definition ---------------------------*/ /* Paramaters: lft_session_params * sess - session handle, int code - code of error or event, const void * param - additional parameters, depend on code */ typedef void (*LFT_CALLBACK)(lft_session_params *, int, const void *); /*----------------------------------------------------------------------------*/ void LFTInitializeCallbacks(LFT_CALLBACK error_handler, LFT_CALLBACK event_handler); lft_session_params * LFTSessionOpen(void); void LFTSessionClose(lft_session_params * sess); double timediff_ms (struct timeval prior, struct timeval latter); unsigned int get_address(lft_session_params * sess, const char *host); #ifndef SCREWED_IP_LEN u_int32_t ip_cksum (const struct ip *ip); #endif u_int32_t tcp_cksum (struct ip *ip, struct tcphdr *tcp, const char * payload, int payload_len); int hop_state_up (lft_session_params * sess, short nhop); int hop_state_copy(lft_session_params * sess, short nhop); unsigned int new_seq(lft_session_params * sess); /*----------------------------------------------------------------------------*/ /* Safe setting of parameters */ /*----------------------------------------------------------------------------*/ /*Use TCP FIN packets exclusively (defaults are SYN)*/ int LFTSetupFIN(lft_session_params * sess); /*Display hosts symbolically; suppress IP address display*/ int LFTSetupDispSymbHost(lft_session_params * sess); /*Use traditional UDP (probes) for tracing instead of TCP*/ int LFTSetupUDPMode(lft_session_params * sess); #define ASN_LOOKUP_RIS 0 #define ASN_LOOKUP_RADB 1 #define ASN_LOOKUP_CYMRU 2 /*Use RIPE NCC's RIS to resolve ASNs instead of Prefix WhoIs*/ int LFTSetupRISLookup(lft_session_params * sess); /*Use the RADB to resolve ASNs instead of Prefix WhoIs*/ int LFTSetupRADBLookup(lft_session_params * sess); /*Use Cymru to resolve ASNs instead of Prefix WhoIs*/ int LFTSetupCYMRULookup(lft_session_params * sess); /*Destination port number (same as using target:port as target)*/ int LFTSetupDestinationPort(lft_session_params * sess, char * userport); /*Set the length of the probe packet in bytes*/ int LFTSetupLengthOfPacket(lft_session_params * sess, int plen); /*Display hosts numerically; disable use of the DNS resolver*/ int LFTSetupDisableResolver(lft_session_params * sess); /*Source port number*/ int LFTSetupSourcePort(lft_session_params * sess, int port); /*Use LFT's stateful engine to detect firewalls and path anomalies*/ int LFTSetupAdaptiveMode(lft_session_params * sess); /*Use a specific device by name or IP address (\"en1\" or \"1.2.3.4\")*/ int LFTSetupDevice(lft_session_params * sess,char * udev); /*Use a specific device by name or IP address (\"en1\" or \"1.2.3.4\")*/ int LFTSetupSendDevice(lft_session_params * sess,char * sdev); /*Display all times in UTC (GMT0). Activates -T option automatically*/ int LFTSetupUTCTimes(lft_session_params * sess); /*----------------------------------------------------------------------------*/ int lft_resolve_port (lft_session_params * sess, const char *strport); void LFTExecute(lft_session_params * sess); void lft_printf(lft_session_params * sess, const char *templ, ...); /*----------------------------------------------------------------------------*/ void setOutputStyle(int nstyle); /* 0 - ordinary output, 1 - xml output */ int outputStyleIsXML(void); int outputStyleIsGraphViz(void); int getOutputStyle(void); /*----------------------------------------------------------------------------*/ #ifdef __cplusplus } #endif #endif /*LFT_LIB_H*/ lft-3.8/COPYING000644 000766 000000 00000006151 11053131665 013130 0ustar00vicwheel000000 000000 VOSTROM Public License for Open Source ---------- Copyright (c) 2007 VOSTROM Holdings, Inc. This VOSTROM Holdings, Inc. (VOSTROM) Distribution (code and documentation) is made available to the open source community as a public service by VOSTROM. Contact VOSTROM at license@vostrom.com for information on other licensing arrangements (e.g. for use in proprietary applications). Under this license, this Distribution may be modified and the original version and modified versions may be copied, distributed, publicly displayed and performed provided that the following conditions are met: 1. Modified versions are distributed with source code and documentation and with permission for others to use any code and documentation (whether in original or modified versions) as granted under this license; 2. if modified, the source code, documentation, and user run-time elements should be clearly labeled by placing an identifier of origin (such as a name, initial, or other tag) after the version number; 3. users, modifiers, distributors, and others coming into possession or using the Distribution in original or modified form accept the entire risk as to the possession, use, and performance of the Distribution; 4. this copyright management information (software identifier and version number, copyright notice and license) shall be retained in all versions of the Distribution; 5. VOSTROM may make modifications to the Distribution that are substantially similar to modified versions of the Distribution, and may make, use, sell, copy, distribute, publicly display, and perform such modifications, including making such modifications available under this or other licenses, without obligation or restriction; 6. modifications incorporating code, libraries, and/or documentation subject to any other open source license may be made, and the resulting work may be distributed under the terms of such open source license if required by that open source license, but doing so will not affect this Distribution, other modifications made under this license or modifications made under other VOSTROM licensing arrangements; 7. no permission is granted to distribute, publicly display, or publicly perform modifications to the Distribution made using proprietary materials that cannot be released in source format under conditions of this license; 8. the name of VOSTROM may not be used in advertising or publicity pertaining to Distribution of the software without specific, prior written permission. This software is made available "as is", and VOSTROM DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, WITH REGARD TO THIS SOFTWARE, INCLUDING WITHOUT LIMITATION ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, AND IN NO EVENT SHALL VOSTROM BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, TORT (INCLUDING NEGLIGENCE) OR STRICT LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. lft-3.8/icons/000755 000766 000000 00000000000 13263007003 013176 5ustar00vicwheel000000 000000 lft-3.8/whois.h000644 000766 000000 00000006756 12773061772 013425 0ustar00vicwheel000000 000000 /* * whois.h * Layer Four Traceroute * * This file is part of LFT. * * The LFT software provided in this Distribution is * Copyright 2007 VOSTROM Holdings, Inc. * * The full text of our legal notices is contained in the file called * COPYING, included with this Distribution. * */ #ifndef WHOIS_H #define WHOIS_H struct ip_list_array { struct in_addr ipaddr[1024]; int asn[1024]; char netName[1024][32]; char orgName[1024][100]; char application[1024]; int numItems; }; struct ext_ip_list_array { struct in_addr ipaddr[1024]; int asn[1024]; char prefix[1024][20]; char netName[1024][32]; char orgName[1024][100]; char application[1024]; double latitude[1024]; double longitude[1024]; char country[1024][50]; char state[1024][50]; char city[1024][50]; char asOrgNameSource[1024][100]; char orgNameSource[1024][100]; char netNameSource[1024][100]; int geoavailable; int numItems; }; #ifdef __cplusplus extern "C" { #endif typedef struct _whoissessionparams { int w_noisy; /* Don't show debug msgs by default */ char pw_serv[256]; /* User can specify his own pwhois server */ char consolidated_asn[256]; /* ASN returned from pwhois */ char consolidated_asp[256]; /* AS-PATH returned from pwhois */ char consolidated_route[256]; /* Prefix returned from pwhois */ char consolidated_orgname[256]; /* OrgName returned from pwhois */ char consolidated_netname[256]; /* NetName returned from pwhois */ char tbuf[128]; time_t tval; void * logprintfCookie; }whois_session_params; /* must be called BEFORE making any queries */ whois_session_params * w_init(void); whois_session_params * w_reinit(whois_session_params * wsess); void w_close(whois_session_params * wsess); /* return the origin-asn according to the RADB in "3356" format */ int w_lookup_as(whois_session_params * wsess, char *); /* return the origin-asn according to Cyrmu in "3356" format */ int w_lookup_as_cymru(whois_session_params * wsess, char *); /* return the origin-asn according to the RIPE RIS in "3356" format */ int w_lookup_as_riswhois(whois_session_params * wsess, char *); /* return the origin-asn according to pwhois in "3356" format */ int w_lookup_as_pwhois(whois_session_params * wsess, char *); /* return the network name from the registrar in a string */ char *w_lookup_netname(whois_session_params * wsess, char *); /* return the organization name from the registrar in a string */ char *w_lookup_orgname(whois_session_params * wsess, char *); /* return a pointer to an ip_list_array (see above) containing an 'asn' to each corresponding 'ipaddr' according to Cymru */ int w_lookup_as_cymru_bulk(whois_session_params * wsess, struct ip_list_array*); /* return a pointer to an ip_list_array (see above) containing all ip_list_array vars to each corresponding 'ipaddr' according to pwhois */ int w_lookup_all_pwhois_bulk(whois_session_params * wsess, struct ip_list_array*); int w_lookup_all_pwhois_bulk_ext(whois_session_params * wsess, struct ext_ip_list_array *iplist); /* return a pointer to an ip_list_array (see above) containing all ip_list_array vars to each corresponding 'ipaddr' according to RIS whois */ int w_lookup_all_riswhois_bulk(whois_session_params * wsess, struct ip_list_array*); int w_lookup_all_pwhois(whois_session_params * wsess, char *addr); int w_lookup_all_riswhois(whois_session_params * wsess, char *addr); #ifdef __cplusplus } #endif #endif lft-3.8/lft_icmptrace.c000644 000766 000000 00000101464 12323066364 015064 0ustar00vicwheel000000 000000 #include "lft_icmptrace.h" static LFT_CALLBACK LFTErrHandler = NULL; static LFT_CALLBACK LFTEvtHandler = NULL; unsigned int icmp_rfc_send_request(lft_session_params * sess, LFT_CALLBACK err, LFT_CALLBACK evt); unsigned int icmp_base_send_hop(lft_session_params * sess, LFT_CALLBACK err, LFT_CALLBACK evt, short nhop); static void icmp_finish(lft_session_params *sess); static u_short in_cksum(u_short *addr, int len) { register int nleft = len; register u_short *w = addr; register u_short answer; register int sum = 0; while(nleft > 1) { sum += *w++; nleft -= 2; } if(nleft == 1) { u_short u = 0; *(u_char *)(&u) = *(u_char *)w; sum += u; } sum = (sum >> 16) + (sum & 0xffff); sum += (sum >> 16); answer = ~sum; return answer; } /* struct icmp_trace_packet_s { char * packet; int packet_len; struct ip * ip_hdr; struct rfc1393_ip_option_s * icmp_trace_opt; struct ip_lsrr * lsrr; struct icmp_echo_header_s * echo;; char * payload; int payload_len; }; */ #ifndef IPDEFTTL #define IPDEFTTL 200 #endif static const char payload_fill[]="VOSTROM"; int generateICMPPacket( lft_session_params * sess, LFT_CALLBACK err, LFT_CALLBACK evt, struct icmp_trace_packet_s * packet, u_char ttlval, u_short unique_id, u_short seq) { char * currptr; int i,j; int userlen; (void)evt; if(packet->packet) free(packet->packet); //size of ip header packet->packet_len=20; //initial ip header if(sess->protocol==3) packet->packet_len+=12; //trace option if(sess->hostname_lsrr_size) packet->packet_len+=(sess->hostname_lsrr_size + 1)*4; //lsrr option //size of icmp header packet->packet_len+=sizeof(struct icmp_echo_header_s); //icmp header //size of payload userlen=sess->userlen; if(userlen) { userlen -= packet->packet_len; if(userlen<0) userlen = 0; if(userlen%4) userlen+=4-(userlen%4); } packet->packet_len+=userlen; if(!(packet->packet=malloc(packet->packet_len))) { err(sess, ERR_NOT_ENOUGH_MEM, NULL); return 0; } memset(packet->packet, 0,packet->packet_len); //initialize ip header currptr = packet->packet; packet->ip_hdr = (struct ip *)(void *)packet->packet; packet->ip_hdr->ip_v = 4; packet->ip_hdr->ip_hl = 5; if(sess->hostname_lsrr_size) packet->ip_hdr->ip_hl += sess->hostname_lsrr_size + 1; if(sess->protocol == 3) packet->ip_hdr->ip_hl += 3; packet->ip_hdr->ip_id = unique_id; if(sess->set_tos) packet->ip_hdr->ip_tos = TOSMINDELAY; else packet->ip_hdr->ip_tos = 0; packet->ip_hdr->ip_off = IP_DF; packet->ip_hdr->ip_len = packet->packet_len; #ifndef SCREWED_IP_LEN packet->ip_hdr->ip_off = htons(packet->ip_hdr->ip_off); packet->ip_hdr->ip_len = htons(packet->ip_hdr->ip_len); #endif packet->ip_hdr->ip_p = IPPROTO_ICMP; packet->ip_hdr->ip_src = sess->local_address; packet->ip_hdr->ip_dst = sess->remote_address; if(sess->protocol==3) packet->ip_hdr->ip_ttl = IPDEFTTL; else packet->ip_hdr->ip_ttl = ttlval; currptr += sizeof(struct ip); //initialize ip option for rfc1393 trace /* struct rfc1393_ip_option_s { u_char optcode; //=82 u_char optlength; //=12 u_short id; //number to identify icmp trace messages u_short ohc; //outbound hop count u_short rhc; //return hop count struct in_addr origip; //originator ip address }; */ if(sess->protocol == 3) { packet->icmp_trace_opt = (struct rfc1393_ip_option_s *)(void *)currptr; packet->icmp_trace_opt->optcode = 82; packet->icmp_trace_opt->optlength = 12; packet->icmp_trace_opt->id = seq; packet->icmp_trace_opt->ohc = 0; packet->icmp_trace_opt->rhc = 0xFFFF; packet->icmp_trace_opt->origip = sess->local_address; currptr+=sizeof(struct rfc1393_ip_option_s); } else packet->icmp_trace_opt = NULL; /* struct ip_lsrr { u_int8_t ipl_code; u_int8_t ipl_len; u_int8_t ipl_ptr; u_int32_t data[9]; char padding[1]; } __attribute__((packed)); */ if(sess->hostname_lsrr_size) { packet->lsrr=(struct ip_lsrr *)(void *)currptr; currptr+=(sess->hostname_lsrr_size + 1)*4; for(i = 0; i < sess->hostname_lsrr_size; i++) packet->lsrr->data[i] = get_address(sess, sess->hostname_lsrr[i]); packet->lsrr->ipl_code = IPOPT_LSRR; packet->lsrr->ipl_len = sess->hostname_lsrr_size * 4 + 3; packet->lsrr->ipl_ptr = 4; } packet->ip_hdr->ip_sum = 0; #ifndef SCREWED_IP_LEN packet->ip_hdr->ip_sum = ip_cksum(packet->ip_hdr); #endif /* struct icmp_echo_header_s { u_char type; u_char code; u_short checksum; u_short id; u_short sequence; }; */ packet->echo=(struct icmp_echo_header_s *)(void *)currptr; currptr+=sizeof(struct icmp_echo_header_s); packet->echo->type=ICMP_ECHO; packet->echo->code=0; packet->echo->checksum=0; packet->echo->id=unique_id; packet->echo->sequence=seq; if(userlen) { packet->payload=currptr; for(i=0,j=0;ipayload=NULL; packet->payload_len = userlen; sess->payload = NULL; sess->payloadlen = userlen; packet->echo->checksum=in_cksum((u_short *)(void *)packet->echo, sizeof(struct icmp_echo_header_s)+packet->payload_len); /*#ifndef SCREWED_IP_LEN packet->echo->checksum = htons(packet->echo->checksum); #endif*/ return packet->packet_len; } static int icmp_check_timeouts (lft_session_params * sess, LFT_CALLBACK err, LFT_CALLBACK evt) { int nhop; int need_reply = 0; int no_reply = 0; int last_return = 0; LFTErrHandler=err; LFTEvtHandler=evt; gettimeofday (&(sess->now), NULL); if (timediff_ms(sess->ts_last_sent, sess->now) < sess->scatter_ms) return 0; /* not ready to send another packet yet */ if(sess->protocol==2) { for(nhop = sess->ttl_min; nhop < sess->hop_info_length; nhop++) { if(!sess->hop_info[nhop].num_sent) { icmp_base_send_hop(sess, err, evt, nhop); return 0; } } for(nhop = sess->ttl_min; nhop < sess->hop_info_length; nhop++) { if(sess->hop_info[nhop].num_sent <= sess->retry_max && !sess->hop_info[nhop].ts_last_recv.tv_sec) { if(sess->noisy > 4) { evt(sess,EVT_TTL_NO_REPLY,&nhop); if(sess->exit_state<0) return 0; } if(timediff_ms(sess->hop_info[nhop].ts_last_sent, sess->now) >= sess->timeout_ms) { /* we timed out waiting for this hop -- retry if we have any * more tries */ if(sess->hop_info[nhop].num_sent < sess->retry_max) { if(!sess->noisy && !sess->nostatus) evt(sess,EVT_PROGRESS_NO_REPLY,NULL); if(sess->noisy > 2) evt(sess,EVT_TTL_TOUT_RESEND,&nhop); if(sess->exit_state<0) return 0; icmp_base_send_hop(sess, err, evt, nhop); return 0; } else { no_reply++; } } else need_reply++; /* we have to wait for this one to timeout */ } else /* have reply */ last_return = nhop; } } else { if(!sess->hop_info[255].num_sent) { icmp_rfc_send_request(sess, err, evt); return 0; } if(sess->hop_info[255].num_sent <= sess->retry_max && !sess->hop_info[255].ts_last_recv.tv_sec) { if(sess->noisy > 4) { evt(sess,EVT_TTL_NO_REPLY,&nhop); if(sess->exit_state<0) return 0; } if(timediff_ms(sess->hop_info[255].ts_last_sent, sess->now) >= sess->timeout_ms) { /* we timed out waiting for this hop -- retry if we have any * more tries */ if(sess->hop_info[255].num_sent < sess->retry_max) { if(!sess->noisy && !sess->nostatus) evt(sess,EVT_PROGRESS_NO_REPLY,NULL); if(sess->noisy > 2) evt(sess,EVT_TTL_TOUT_RESEND,&nhop); if(sess->exit_state<0) return 0; icmp_rfc_send_request(sess, err, evt); return 0; } else no_reply++; } else need_reply++; /* we have to wait for this one to timeout */ } else /* have reply */ last_return = 0; } if(sess->noisy > 4) { EvtDebugCheckpoint1Param edcp; edcp.last_return=last_return; edcp.need_reply=need_reply; edcp.no_reply=no_reply; evt(sess,EVT_DBG_CHECKPOINT1,&edcp); if(sess->exit_state<0) return 0; } if(no_reply >= sess->ahead_limit) { /* we timed out. */ if((last_return + 3) * 2 < sess->hop_info_length) { if((need_reply < 3) && (sess->num_rcvd < 2)) evt(sess,EVT_CANT_RELIABLY_RTRIP,NULL); if(sess->exit_state<0) return 0; icmp_finish(sess); return 1; } } if((!sess->num_hops || sess->hop_info_length < sess->num_hops || need_reply) && sess->hop_info_length < sess->ttl_limit) { if(sess->noisy > 4) evt(sess,EVT_HAVE_UNANSWERRED_HOPS,NULL); if(need_reply >= sess->ahead_limit){ if(sess->noisy > 4) evt(sess,EVT_TOO_FAR_AHEAD,NULL); return 0; /* wait for some replies before we go on */ } if(sess->exit_state<0) return 0; if(sess->num_hops > 0 && sess->hop_info_length >= sess->num_hops) { if(sess->noisy > 3) evt(sess,EVT_HAVE_GAPS,NULL); return 0; /* we know how long the path is - wait to fill in the blanks */ } nhop = sess->hop_info_length++; if(sess->protocol==2) icmp_base_send_hop(sess, err, evt, nhop); else { icmp_rfc_send_request(sess, err, evt); } } else { if (sess->noisy >= 4) { evt(sess, EVT_EITHER_RESP_OR_TOUT, NULL); if(sess->exit_state < 0) return 0; } if(sess->protocol == 2) { for(nhop = sess->ttl_min; nhop < sess->hop_info_length; nhop++) { if (sess->hop_info[nhop].num_sent < sess->retry_min && sess->hop_info[nhop].num_sent <= sess->retry_max) { icmp_base_send_hop(sess, err, evt, nhop); return 0; } } } else { if(sess->hop_info[255].num_sent < sess->retry_min && sess->hop_info[255].num_sent <= sess->retry_max) { icmp_rfc_send_request(sess, err, evt); return 0; } } icmp_finish(sess); return 1; } return 0; } unsigned int icmp_rfc_send_request(lft_session_params * sess, LFT_CALLBACK err, LFT_CALLBACK evt) { struct trace_packet_info_s *pinfo = NULL; struct sockaddr_in dest; u_short rfc_unique_seq; unsigned int nseq; dest.sin_family = AF_INET; dest.sin_addr = sess->remote_address; dest.sin_port = 0; if(!(pinfo = (struct trace_packet_info_s *)malloc(sizeof(struct trace_packet_info_s)))) { err(sess, ERR_NOT_ENOUGH_MEM, NULL); return 0; } memset(pinfo, 0, sizeof(struct trace_packet_info_s)); nseq = new_seq(sess); nseq &= 0xFFFF; rfc_unique_seq = nseq; generateICMPPacket(sess, err, evt, &pinfo->u.icmp_packet, 0, sess->icmp_packet.echo->id, rfc_unique_seq); /* Packet is ready, fire away */ if(sendto(sess->send_sock, pinfo->u.icmp_packet.packet, pinfo->u.icmp_packet.packet_len, 0, (const struct sockaddr *)(const void *)&dest, sizeof (dest)) < 0) { LFTErrHandler(sess, ERR_RAW_TCP_DISABLED, NULL); free(pinfo); return 0; } pinfo->hopno = 0; pinfo->seq = rfc_unique_seq; pinfo->sent = sess->now; SLIST_INSERT_HEAD(&(sess->trace_packets), pinfo, next); sess->trace_packets_num++; /* we use special hop_info #255 */ SLIST_INSERT_HEAD(&(sess->hop_info[255].packets), pinfo, next_by_hop); sess->hop_info[255].num_sent++; sess->hop_info[255].all_sent++; sess->hop_info[255].ts_last_sent = sess->now; return 1; } unsigned int icmp_base_send_hop(lft_session_params * sess, LFT_CALLBACK err, LFT_CALLBACK evt, short nhop) { struct trace_packet_info_s *pinfo = NULL; struct sockaddr_in dest; u_short base_unique_seq; unsigned int nseq; EvtSentPacketParam espparam; dest.sin_family = AF_INET; dest.sin_addr = sess->remote_address; dest.sin_port = 0; nseq = new_seq(sess); nseq &= 0xFFFF; base_unique_seq = nseq; sess->ts_last_sent = sess->now; if(!(pinfo = (struct trace_packet_info_s *)malloc(sizeof(struct trace_packet_info_s)))) { err(sess, ERR_NOT_ENOUGH_MEM, NULL); return 0; } memset(pinfo, 0, sizeof(struct trace_packet_info_s)); espparam.flags=0; espparam.nhop=nhop; espparam.tseq=base_unique_seq; espparam.tttl=nhop+1; if (sess->noisy > 1) { LFTEvtHandler(sess,EVT_SENT_PACKET, &espparam); if(sess->exit_state <0 ) { free(pinfo); return 0; } } generateICMPPacket(sess, err, evt, &pinfo->u.icmp_packet, nhop+1, sess->icmp_packet.echo->id, base_unique_seq); /* Packet is ready, fire away */ if(sendto(sess->send_sock, pinfo->u.icmp_packet.packet, pinfo->u.icmp_packet.packet_len, 0, (const struct sockaddr *)(const void *)&dest, sizeof (dest)) < 0) { /* printf("errno=%d\n",errno); */ LFTErrHandler(sess, ERR_RAW_TCP_DISABLED, NULL); free(pinfo); return 0; } pinfo->hopno = nhop; pinfo->seq = base_unique_seq; pinfo->sent = sess->now; SLIST_INSERT_HEAD(&(sess->trace_packets), pinfo, next); sess->trace_packets_num++; if(nhop != -1) { SLIST_INSERT_HEAD(&(sess->hop_info[nhop].packets), pinfo, next_by_hop); sess->hop_info[nhop].num_sent++; sess->hop_info[nhop].all_sent++; sess->hop_info[nhop].ts_last_sent = sess->now; } return 1; } static int icmp_recv_packet (lft_session_params * sess, unsigned int seq, struct in_addr ipaddr, int icmp_type, const void * pack, const struct pcap_pkthdr *hdr) { struct trace_packet_info_s *tp = NULL, *pinfo = NULL; const struct icmp_trace_reply_header_s *icmpheader = (const struct icmp_trace_reply_header_s *)pack; #if defined( __CYGWIN__ ) || defined( WIN32 ) || defined(_WIN32) gettimeofday (&(sess->now), NULL); #else sess->now.tv_sec = hdr->ts.tv_sec; sess->now.tv_usec = hdr->ts.tv_usec; #endif /* First, search every probe to find an exact sequence match */ SLIST_FOREACH(tp, &(sess->trace_packets), next) { if(tp->seq == seq) { break; } } if(!tp) { if (sess->noisy) LFTEvtHandler(sess,EVT_SKIP_PACKET,NULL); else if (!sess->nostatus) LFTEvtHandler(sess,EVT_PROGRESS_SKIP_PACKET,NULL); return 0; } if (tp->recv.tv_sec) { if (sess->noisy) LFTEvtHandler(sess,EVT_DUPLICATE_PACKET, NULL); else if (!sess->nostatus) LFTEvtHandler(sess,EVT_PROGRESS_DUPLICATE,NULL); return 0; } if (sess->noisy > 1) { EvtRecvPacketParam erpp; erpp.ipaddr=ipaddr; erpp.seq=seq; erpp.tp=tp; LFTEvtHandler(sess,EVT_RECV_PACKET,&erpp); } else { if (!sess->nostatus) { LFTEvtHandler(sess,EVT_PROGRESS_OK,NULL); } } if(sess->exit_state < 0) return 0; /* increment received packet counter */ sess->num_rcvd++; tp->recv = sess->now; if (tp->hopno != -1) { if(sess->protocol==3 && icmp_type == ICMP_TRACE) { tp->hopno=icmpheader->ohc; sess->hop_info[tp->hopno].num_sent = sess->hop_info[255].num_sent; sess->hop_info[tp->hopno].all_sent = sess->hop_info[255].all_sent; sess->hop_info[tp->hopno].ts_last_sent = sess->hop_info[255].ts_last_sent; sess->hop_info[tp->hopno].state = sess->hop_info[255].state; sess->hop_info[tp->hopno].flags = sess->hop_info[255].flags; } sess->hop_info[tp->hopno].ts_last_recv = sess->now; sess->hop_info[tp->hopno].all_rcvd++; /* indicate this hop has a sequence anomaly */ if(icmp_type==ICMP_UNREACH || icmp_type==ICMP_TIMXCEED) sess->hop_info[tp->hopno].flags |= HF_ENDPOINT; } tp->recv = sess->now; tp->hopaddr = ipaddr; if(icmp_type==ICMP_TIMXCEED) tp->icmp_type = -2; else if(icmp_type == ICMP_ECHOREPLY) tp->icmp_type = -1; else tp->icmp_type = icmp_type; if(icmp_type == ICMP_ECHOREPLY && ipaddr.s_addr == sess->remote_address.s_addr) { if(sess->protocol==3) { tp->hopno=sess->num_hops+1; sess->hop_info[tp->hopno].num_sent = sess->hop_info[255].num_sent; sess->hop_info[tp->hopno].all_sent = sess->hop_info[255].all_sent; sess->hop_info[tp->hopno].ts_last_sent = sess->hop_info[255].ts_last_sent; sess->hop_info[tp->hopno].state = sess->hop_info[255].state; sess->hop_info[tp->hopno].flags = sess->hop_info[255].flags; sess->hop_info[tp->hopno].ts_last_recv = sess->now; sess->hop_info[tp->hopno].all_rcvd++; } if(!sess->num_hops) { sess->num_hops = tp->hopno; if(!sess->num_hops) sess->num_hops=1; } tp->is_done = 1; } else { if(icmp_type == ICMP_UNREACH || icmp_type == ICMP_TIMXCEED) return 1; if(sess->protocol == 3 && icmp_type == ICMP_TRACE) { if(icmpheader->rhc == 0xFFFF) /* outbound packet */ { if(!(pinfo = (struct trace_packet_info_s *)malloc(sizeof(struct trace_packet_info_s)))) { LFTErrHandler(sess, ERR_NOT_ENOUGH_MEM, NULL); return 0; } memcpy(pinfo, tp, sizeof(struct trace_packet_info_s)); SLIST_INSERT_HEAD(&(sess->hop_info[tp->hopno].packets), pinfo, next_by_hop); } else return 1; //while ignore return packets } } return 1; } static void icmp_process_packet(lft_session_params * sess, LFT_CALLBACK err, LFT_CALLBACK evt, const u_char *packet, const struct pcap_pkthdr *hdr) { const struct ip *ip, *orig_ip; const struct icmp *icmp; const struct icmp_echo_header_s *orig_echo, *resp_echo; LFTErrHandler=err; LFTEvtHandler=evt; if(sess->noisy > 4) { LFTEvtHandler(sess,EVT_PROCESS_PACKET_START,NULL); if(sess->exit_state<0) return; } icmp_check_timeouts(sess, err, evt); if(sess->exit_state<0) return; packet += sess->skip_header_len; ip = (const void *) packet; packet += 4 * ip->ip_hl; switch(ip->ip_p){ case IPPROTO_ICMP: orig_ip = ip; icmp = (const void *) packet; if(icmp->icmp_type != ICMP_ECHOREPLY && icmp->icmp_type != ICMP_UNREACH && !(sess->protocol==2 && icmp->icmp_type == ICMP_TIMXCEED) && !(sess->protocol==3 && icmp->icmp_type == ICMP_TRACE)) return; if(icmp->icmp_type == ICMP_ECHOREPLY) { resp_echo=(const struct icmp_echo_header_s *)icmp; if(resp_echo->id != sess->icmp_packet.echo->id) return; if (sess->noisy > 2) { EvtIncomingICMPEchoParam echo; echo.ip=orig_ip; echo.echo=resp_echo; LFTEvtHandler(sess,EVT_INCOMING_ICMP_Echo,&echo); if(sess->exit_state<0) return; } if (sess->noisy > 1) { LFTEvtHandler(sess,EVT_RCVD_ICMP_Echo,resp_echo); if(sess->exit_state<0) return; } icmp_recv_packet(sess, resp_echo->sequence, orig_ip->ip_src, ICMP_ECHOREPLY, NULL, hdr); return; } if(icmp->icmp_type == ICMP_UNREACH || icmp->icmp_type == ICMP_TIMXCEED) { ip = &icmp->icmp_ip; if(ip->ip_p != IPPROTO_ICMP) return; packet = (const u_char *) ip; packet += 4 * ip->ip_hl; orig_echo = (const struct icmp_echo_header_s *)packet; if(orig_echo->type != ICMP_ECHO) return; if(sess->icmp_packet.echo->id != orig_echo->id) return; if (sess->noisy > 2) { EvtIncomingICMPICMPParam icmpicmp; icmpicmp.ip=orig_ip; icmpicmp.icmp=icmp; icmpicmp.orig_ip=ip; icmpicmp.echo=orig_echo; LFTEvtHandler(sess,EVT_INCOMING_ICMP_ICMP,&icmpicmp); if(sess->exit_state<0) return; } if (sess->noisy > 1) { LFTEvtHandler(sess,EVT_RCVD_ICMP_ICMP,icmp); if(sess->exit_state<0) return; } icmp_recv_packet(sess, orig_echo->sequence, orig_ip->ip_src, icmp->icmp_type, NULL, hdr); return; } if(icmp->icmp_type == ICMP_TRACE) { const struct icmp_trace_reply_header_s * itrh=(const struct icmp_trace_reply_header_s *)icmp; icmp_recv_packet(sess, itrh->id, orig_ip->ip_src, itrh->type, itrh, hdr); return; } default: if(sess->noisy > 3) LFTEvtHandler(sess,EVT_RCVD_UNKNOWN,ip); } } #if defined( __CYGWIN__ ) || defined( WIN32 ) || defined(_WIN32) void win_icmp_process(lft_session_params * sess) { fd_set fds; struct timeval tm; tm.tv_sec = 0; tm.tv_usec = 100000; FD_ZERO(&fds); FD_SET(sess->recv_sock, &fds); if (select(sess->recv_sock+1, &fds, 0, 0, &tm) < 0) { LFTErrHandler(sess, ERR_WIN_SELECT, NULL); return; } if (FD_ISSET(sess->recv_sock, &fds)) { /* read packet */ char packetbuf[2048]; int nread; memset(packetbuf, 0, sizeof(packetbuf)); nread = recv(sess->recv_sock, packetbuf, sizeof(packetbuf), 0); if (nread <= 0) { LFTErrHandler(sess, ERR_WIN_RECV, NULL); return; } icmp_process_packet(sess, LFTErrHandler, LFTEvtHandler, packetbuf, NULL); } } #else static void pcap_icmp_process_packet(u_char * user_data, const struct pcap_pkthdr *hdr, const u_char * packet) { lft_session_params * sess=(lft_session_params *)(void *)user_data; if(sess->exit_state<0) return; icmp_process_packet(sess, LFTErrHandler, LFTEvtHandler, packet, hdr); } #endif void icmp_trace_main_loop(lft_session_params * sess, LFT_CALLBACK err, LFT_CALLBACK evt) { LFTErrHandler=err; LFTEvtHandler=evt; #if defined( __CYGWIN__ ) || defined( WIN32 ) || defined(_WIN32) while(1) { win_icmp_process(sess); if(sess->exit_state < 0) break; if(icmp_check_timeouts(sess, err, evt)) break; if(sess->exit_state < 0) break; } #else while(pcap_dispatch(sess->pcapdescr, -1, pcap_icmp_process_packet, (u_char *)sess) >= 0) { if(sess->exit_state < 0) break; if(sess->noisy > 6) { LFTEvtHandler(sess, EVT_DBG_CHECKPOINT2, NULL); if(sess->exit_state < 0) break; } if(icmp_check_timeouts(sess,err,evt)) break; if(sess->exit_state<0) break; } #endif } static void icmp_finish(lft_session_params *sess) { int hopno; int maxhop; int reply, noreply; int as_for_hop = 0; struct trace_packet_info_s *tp; char *netname; /* int ocres; */ char *myApp = (char *)malloc((strlen(version) * sizeof(char)) + 1 + (strlen(appname) * sizeof(char))); struct ip_list_array *ipaslist = (struct ip_list_array *)malloc(sizeof(struct ip_list_array)); /* Variables for seam detection */ int icmpcode; int asseam_hopno=-1; struct in_addr asseam_hopaddr; int netseam_hopno=-1; struct in_addr netseam_hopaddr; struct in_addr classbmask; struct in_addr masked_target; int prevasn=-1; struct in_addr prevasn_hopaddr; int prevasn_hopno; int lastishole; int netreached=0; int isseam; /* ---------------------------- */ inet_aton("255.255.0.0", &classbmask); masked_target.s_addr=sess->remote_address.s_addr & classbmask.s_addr; EvtPacketInfoParam ehip; memset(ipaslist, 0, sizeof(struct ip_list_array)); gettimeofday (&(sess->trace_done_time), NULL); /* ocres=open_check(sess); LFTEvtHandler(sess,EVT_OPEN_CHECK_RESULT,&ocres); if(ocres==1) sess->target_open=1; else sess->target_open=0; */ if (sess->noisy > 3) { LFTEvtHandler(sess, EVT_SHOW_NUM_HOPS, NULL); if(sess->exit_state < 0) { free(ipaslist); free(myApp); return; } } if(sess->num_hops) { maxhop = sess->num_hops; /* display all packets we received from this host */ SLIST_FOREACH(tp, &(sess->trace_packets), next) { if (tp->is_done) { tp->hopno = maxhop; break; } } } else { maxhop = sess->hop_info_length - 1; } LFTEvtHandler(sess,EVT_TRACE_COMPLETED, NULL); if(sess->exit_state < 0) { free(ipaslist); free(myApp); return; } /* if user wants ASN resolution from pwhois/cymru/riswhois, do it in bulk */ if (sess->do_aslookup || sess->do_netlookup) { if(sess->noisy > 1) { LFTEvtHandler(sess,EVT_ON_RESOLUTION, NULL); if(sess->exit_state < 0) { free(ipaslist); free(myApp); return; } } if (!sess->use_radb) { /* populate bulk ip_addr_list structure */ for (hopno = sess->ttl_min; hopno <= maxhop; hopno++) { SLIST_FOREACH(tp, &(sess->hop_info[hopno].packets), next_by_hop) { if (tp->recv.tv_usec) { (*ipaslist).ipaddr[as_for_hop] = tp->hopaddr; as_for_hop++; (*ipaslist).numItems = (as_for_hop); break; } } } if (sess->use_cymru) { /* use cymru bulk service */ if (w_lookup_as_cymru_bulk(sess->wsess, &(*ipaslist)) != 0) if (sess->noisy) LFTErrHandler(sess, WRN_NS_LOOKUP_FAILED, NULL); } else if (sess->use_ris) { /* use RIPE NCC RIS service */ if (w_lookup_all_riswhois_bulk(sess->wsess, &(*ipaslist)) != 0) if (sess->noisy) LFTErrHandler(sess, WRN_NS_LOOKUP_FAILED, NULL); } else { /* use pwhois bulk service */ if ((strlen(version) * sizeof(char)) + 1 + (strlen(appname) * sizeof(char)) < 254) { *myApp = '\0'; strcat(myApp, appname); strcat(myApp, " "); strcat(myApp, version); strncpy((*ipaslist).application, myApp, 511); } if (w_lookup_all_pwhois_bulk(sess->wsess, &(*ipaslist)) != 0) if (sess->noisy) LFTErrHandler(sess, WRN_NS_LOOKUP_FAILED, NULL); } if(sess->exit_state < 0) { free(ipaslist); free(myApp); return; } } } free(myApp); LFTEvtHandler(sess,EVT_TRACE_REPORT_START, &maxhop); if(sess->exit_state < 0){ free(ipaslist); return; } /* seam detection */ as_for_hop=0; for(hopno = sess->ttl_min; hopno < sess->hop_info_length; hopno++) { struct in_addr last_hop; icmpcode=-100; last_hop.s_addr = 0; if(sess->hop_info[hopno].all_rcvd) { lastishole=0; SLIST_FOREACH(tp, &(sess->hop_info[hopno].packets), next_by_hop) { if(tp->recv.tv_sec) { if(hopno<=maxhop) icmpcode=tp->icmp_type; if(last_hop.s_addr != tp->hopaddr.s_addr) { if((tp->hopaddr.s_addr & classbmask.s_addr) == masked_target.s_addr) netreached=1; else { netseam_hopno=hopno; netseam_hopaddr=tp->hopaddr; } if(sess->do_aslookup || sess->do_netlookup) { if (sess->use_radb) { /* using RADB/IRR */ tp->asnumber = w_lookup_as(sess->wsess, inet_ntoa(tp->hopaddr)); } else { /* using pwhois by default */ tp->asnumber = (*ipaslist).asn[as_for_hop]; } if(prevasn==-1) { if(tp->asnumber) { prevasn=tp->asnumber; prevasn_hopno=hopno; prevasn_hopaddr=tp->hopaddr; } } else { if(tp->asnumber) { if(tp->asnumber!=prevasn) { asseam_hopno=prevasn_hopno; asseam_hopaddr=prevasn_hopaddr; } prevasn=tp->asnumber; prevasn_hopno=hopno; prevasn_hopaddr=tp->hopaddr; } } } last_hop=tp->hopaddr; } } } as_for_hop++; } else lastishole=1; if(icmpcode==-1) break; } if(!netreached) netseam_hopno=-1; if(lastishole) asseam_hopno=-1; /* -------------- */ noreply = 0; reply = 0; as_for_hop = 0; /* this correlates the hopno to the asn stored in ipaslist */ for (hopno = sess->ttl_min; hopno <= maxhop; hopno++) { struct in_addr last_hop; if (sess->hop_info[hopno].all_rcvd != 0) { if (noreply >= 1) { EvtNoReplyParam nrp; nrp.hopno=hopno; nrp.noreply=noreply; LFTEvtHandler(sess,EVT_RPT_NO_REPLY, &nrp); if(sess->exit_state < 0){ free(ipaslist); return; } } } last_hop.s_addr = 0; if ((sess->hop_info[hopno].state == HS_SEND_FIN) && (sess->hop_info[hopno+1].state == HS_SEND_SYN) && (sess->hop_info[hopno+1].ts_last_recv.tv_sec)) { LFTEvtHandler(sess,EVT_RPT_FRW_INSPECT_PACKS, NULL); if(sess->exit_state < 0){ free(ipaslist); return; } } if ((sess->hop_info[hopno].state != HS_SEND_SYN_ACK) && (sess->hop_info[hopno+1].state == HS_SEND_SYN_ACK) && (hopno == (sess->num_hops - 1))) { LFTEvtHandler(sess,EVT_RPT_FRW_STATE_FILTER, NULL); if(sess->exit_state < 0){ free(ipaslist); return; } } if ((sess->hop_info[hopno].flags & HF_ENDPOINT) && (noreply >= ((maxhop - sess->ttl_min)/2)) && sess->num_hops > 3) { LFTEvtHandler(sess,EVT_RPT_BSD_BUG, NULL); if(sess->exit_state < 0){ free(ipaslist); return; } } if (sess->hop_info[hopno].all_rcvd == 0) { reply = 0; } else { LFTEvtHandler(sess,EVT_RPT_HOP_INFO_START,&hopno); if(sess->exit_state < 0){ free(ipaslist); return; } //printf("hopno=%d all_rcvd=%d",hopno,sess->hop_info[hopno].all_rcvd); SLIST_FOREACH(tp, &(sess->hop_info[hopno].packets), next_by_hop) { if (tp->recv.tv_sec) { reply = 1; if (last_hop.s_addr != tp->hopaddr.s_addr) { ehip.asnumber = 0; /* init/clear the ASN */ if (sess->do_aslookup) { if (sess->use_radb) { /* using RADB/IRR */ ehip.asnumber = w_lookup_as(sess->wsess, inet_ntoa(tp->hopaddr)); } else { /* using pwhois by default */ ehip.asnumber = (*ipaslist).asn[as_for_hop]; } } tp->asnumber=ehip.asnumber; ehip.netname=NULL; if (sess->do_netlookup) { if (!sess->do_aslookup || (sess->do_aslookup && !sess->use_cymru && !sess->use_radb)) { netname = (*ipaslist).netName[as_for_hop]; } else { netname = w_lookup_netname(sess->wsess, inet_ntoa(tp->hopaddr)); } ehip.netname = netname; } if(ehip.netname) strncpy(tp->netname, ehip.netname, 511); else tp->netname[0]=0; } ehip.last_hop = last_hop; tp->last_hop=ehip.last_hop; last_hop = tp->hopaddr; } ehip.tp = tp; /* seam processing */ isseam=0; ehip.is_asseam=0; ehip.is_netseam=0; ehip.is_open=0; ehip.is_filtered=0; ehip.seam_traced=0; if(sess->check_seam && hopno==asseam_hopno && tp->hopaddr.s_addr==asseam_hopaddr.s_addr) { isseam=1; ehip.is_asseam=1; } if(sess->check_seam && hopno==netseam_hopno && tp->hopaddr.s_addr==netseam_hopaddr.s_addr) { isseam=1; ehip.is_netseam=1; } if(isseam) { if(sess->check_seam) { int curroutputstyle=getOutputStyle(); char hostname[100]; ehip.seam_traced=1; setOutputStyle(2); lft_session_params * subsess=LFTSessionOpen(); strncpy(hostname, inet_ntoa(tp->hopaddr),100); subsess->senddevsel = 1; subsess->senddev = sess->pcap_send_dev; subsess->userdevsel = 1; subsess->userdev = sess->pcap_dev; subsess->auto_ports=0; subsess->dport=179; subsess->seq_start=30; subsess->retry_min=1; subsess->retry_max=1; subsess->resolve_names=0; subsess->ahead_limit=1; subsess->break_on_icmp = 0; subsess->is_graphviz_subquery=1; subsess->hostname=hostname; subsess->hostname_lsrr_size = 0; LFTExecute(subsess); ehip.is_open=subsess->target_open; ehip.is_filtered=subsess->target_filtered; LFTSessionClose(subsess); setOutputStyle(curroutputstyle); } } /* --------------- */ LFTEvtHandler(sess,EVT_RPT_PACKET_INFO,&ehip); if(sess->exit_state < 0){ free(ipaslist); return; } } LFTEvtHandler(sess,EVT_RPT_PACKET_LIST_END,NULL); if(sess->exit_state < 0){ free(ipaslist); return; } } if (reply) { noreply = 0; as_for_hop++; } else noreply++; reply = 0; } /* for(...) */ if (!sess->num_hops) { LFTEvtHandler(sess,EVT_RPT_NO_HOPS,&maxhop); } if (sess->timetrace) { LFTEvtHandler(sess,EVT_RPT_TIME_TRACE,NULL); } LFTEvtHandler(sess,EVT_ON_EXIT,NULL); free(ipaslist); return; } lft-3.8/lft_lsrr.h000644 000766 000000 00000001265 11053131665 014076 0ustar00vicwheel000000 000000 /* * lft_lsrr.h * Layer Four Traceroute * * This file is part of LFT. * * The LFT software provided in this Distribution is * Copyright 2007 VOSTROM Holdings, Inc. * * The full text of our legal notices is contained in the file called * COPYING, included with this Distribution. * */ #ifndef LFT_LSRR_H #define LFT_LSRR_H #if defined(sun) typedef uint8_t u_int8_t; typedef uint32_t u_int32_t; #endif struct ip_lsrr { u_int8_t ipl_code; /* IPOPT_TS */ u_int8_t ipl_len; /* size of structure (variable) */ u_int8_t ipl_ptr; /* index of current entry */ u_int32_t data[9]; char padding[1]; } __attribute__((packed)); #define IP_LSRR_DEST 8 #endif lft-3.8/lft.8000644 000766 000000 00000040262 12051071703 012747 0ustar00vicwheel000000 000000 .Dd August 17, 2002 .Dt LFT 8 .Os LFT .Sh NAME .Nm lft .Nd display the route packets take to a network host/socket using one of several layer-4 protocols and methods; optionally show heuristic network information in transitu .Sh SYNOPSIS .Nm lft .Op Fl d Ar dport .Op Fl s Ar sport .Op Fl m Ar retry min .Op Fl M Ar retry max .Op Fl a Ar ahead .Op Fl c Ar scatter ms .Op Fl t Ar timeout ms .Op Fl l Ar min ttl .Op Fl H Ar max ttl .Op Fl L Ar length .Op Fl q Ar ISN .Op Fl D Ar device .Op Fl f Ar device .Op Fl G Ar icons path .Op Fl ACEINPRSTUVbeghinpruvxyz .Ar [ <...>] .Ar target:dport .Sh DESCRIPTION The Internet is a large and complex aggregation of network hardware, connected together by gateways. Tracking the route one's packets follow (or finding the miscreant gateway that's discarding your packets) can be difficult. (from traceroute(8)) .Pp .Nm was developed to automate a solution to the above, taking into account that modern networks contain many configurations of load balancers, proxies, and stateful firewalls. .Pp .Nm implements numerous network tracing methods and strategies. Generally, .Nm sends various types of layer-4 probes utilizing the IP protocol `time to live' field and attempts to elicit an .Tn ICMP `time exceeded in transit' response from each gateway along the path to some host. RFC 1393 Traceroute Using an IP Option is also available as one of several tracing methods. .Pp .Nm additionally listens for various messages along the way to assist network managers in ascertaining per-protocol heuristic routing information. .Nm can optionally retrieve various information about the networks it traverses using a variety of sources such as registries, routing arbiters, etc. .Pp The only mandatory parameter is the target host name or IP number. Options toggle the display of more interesting data or change the variables of the trace itself. The (-E/-e) adaptive option tries several combinations of TCP states (changing flags inside the probes it sends) in order to improve the chances of a successful trace and expose stateful packet filters. .Pp Other options are: .Bl -tag -width Ds .It Fl d Ar dport Set .Ar dport as the destination TCP port of the probes LFT generates. Default is 80. This option is useful to see if packets follow a different route based on protocol destination, a likely scenario when load balancers or proxies are involved. This option may also bypass less sophisticated packet filter configurations. .It Fl s Ar sport Set .Ar sport as the origin TCP port of the probes LFT generates. Default is 53. This option is useful to see if packets follow a different route based on protocol source. This option may also bypass less sophisticated packet filter configurations. .It Fl z Automatically select a pseudo-random source port. This option may be useful if your local packet filter or proxy doesn't allow you to use source ports outside of the dymanic range allocation. .It Fl m Ar min Set .Ar min as the minimum number of re-attempts to send per host. Default is 1 unless adaptive (-E) mode is used. .It Fl M Ar max Set .Ar max as the maximum number of re-attempts to send per host. Default is 3. .It Fl a Ar ahead Set .Ar ahead as the number of hops forward to query before waiting for a response. Default is 5. .It Fl c Ar scatter ms Set .Ar scatter ms as the minimum number of milliseconds to wait between sending probes. Default is 20. .It Fl t Ar timeout ms Set .Ar timeout ms as the maximum number of milliseconds to wait before assuming a probe was lost/discarded. Default is 1000. .It Fl l Ar min ttl Set .Ar min tll as the minimum TTL (time-to-live) on outgoing probes (essentially, the first hop in the line that you want to display). Default is 1. .It Fl q Ar ISN Set .Ar ISN as the ISN (initial sequence number) of the first probe. If unset, one will be automatically generated using a pseudo-random, time-seeded algorithm. .It Fl L Ar length Set .Ar length as the size of probe packets in bytes. This includes layer-3 and layer-4 headers, but does not include layer-2 headers. For example, setting the length to 1500 would create a 1500-byte probe packet which would result in a 1514-byte frame on an Ethernet network. .It Fl D Ar device Set .Ar device as the network device or address to receive traffic. (e.g., "en1" or "1.2.3.4") If unset, .Nm will attempt to determine and acquire the appropriate interface based on routing. .It Fl f Ar device Set .Ar device as the network device or address to transmit traffic. (e.g., "en1" or "1.2.3.4") If unset, .Nm will attempt to determine and acquire the appropriate interface based on routing. This serves to operate .Nm in a passive mode where you may transmit from a (potentially) spoofed IP address on one interface, yet receive on another. This allows you to trace from a different IP address whose traffic you can see in order to intercept replies. .It Fl H Ar ttl Set .Ar ttl as the maximum TTL, essentially the maximum route traversal distance in hops. Default is 30. .It Fl G Ar icons path Set .Ar icons path as the path to GraphViz icons in connection with GraphViz output. .It Fl I Set the ToS (Type of Serice) bit on outgoing IP datagrams. The ToS will be set to the differentiated services request minimize-delay. .It Fl i Disable "stop" on ICMP other than TTL expired. .It Fl n Print addresses numerically rather than symbolically and numerically. Disables use of the DNS resolver completely. .It Fl h Print addresses symbolically rather than symbolically and numerically. If the DNS resolver fails to resolve an address, the address is printed numerically. .It Fl E/e Enable use of the adaptive engine which tries several combinations of TCP states (changing flags inside the probes it sends) in order to improve the chances of a successful trace. The engine also displays other useful information such as stateful inspection firewalls or broken IP stacks encountered along the way. .It Fl F Enable use of TCP packets with the FIN flag set. This strategy fools unsophisticated packet filters that don't maintain a proper state table. Such devices will forward the packet to its destination rather than filter it, assuming a handshake has already taken place and the probes are part of an existing and valid TCP stream. .It Fl u Enable use of UDP-based probes instead of TCP-based probes. This strategy is similar to the traditional traceroute method, but many of LFT's other options (such as source and destination port selection) are still available. By default, LFT's UDP probes have a small payload (unlike LFT's TCP probes that carry no payload). .It Fl N Enable lookup and display of network or AS names (e.g., [GNTY-NETBLK-4]). This option queries Prefix WhoIs, RIPE NCC, or the RADB (as requested). In the case of Prefix WhoIs or RADB, the network name is displayed. In the case of RIPE NCC, the AS name is displayed. .It Fl P Enable RFC 1393 tracing method using ICMP and an IP option. While this strategy has been formalized in an RFC, few network equipment vendors support it. .It Fl p Enable use of ICMP-based probes instead of TCP-based probes. This strategy is sometimes the fastest, however firewalls commonly filter ICMP at network borders. ICMP probes are echo request (ping) packets. .It Fl b Enable TCP basic tracing method. Unlike the default method, the basic method generates TCP probes without relying upon sequence numbers being conveyed correctly. This makes LFT more comptabile with networks employing NAT, but is slower than the default method. TCP basic may also be used with adaptive mode (-E). .It Fl A Enable lookup and display of of AS (autonomous system) numbers (e.g., [1]). This option queries one of several whois servers (see options 'C' and 'r') in order to ascertain the origin ASN of the IP address in question. By default, LFT uses the pWhoIs service whose ASN data tends to be more accurate and more timely than using the RADB as it is derived from the Internet's global routing table. See www.pwhois.org .It Fl r Force use of the RIPE NCC RIS whois service to lookup ASNs. This is an alternative source of timely ASN-related information built using the Internet's global routing table. See www.ripe.net/projects/ris .It Fl C Force use of the Cymru whois service to lookup ASNs. This is an alternative source of timely ASN-related information built using the Internet's global routing table. See www.cymru.com .It Fl R Force use of the RADB whois service to lookup ASNs. This tends to be quick, but incomplete and usually inaccurate with regard to the 'actual' Internet routing table. See www.radb.net .It Fl T Enable display of LFT's execution timer. This option places timers on the trace itself and on lookups and name resolution to show where LFT is spending its time, waiting on resolvers, or processing trace packets. Use with -V (verbose) to display additional detail. .It Fl U Display all times in UTC/GMT0. This option also enables the -T option automatically. .It Fl S Suppress display of the real-time status bar. This option makes LFT show its completed trace output only, no-frills. .It Fl x Enable XML output and suppress all other output to stdout. .It Fl g Enable GraphViz output and suppress all other output to stdout. .It Fl y Enable network seam testing in connection with GraphViz output. .It Fl V Display verbose output. Use more V's for more info. .It Fl v Display version information, then exit(1). .El .Pp Any hosts listed after these options and before the final host/target will comprise the loose source route. Since network operators have security concerns regarding the use of source routing, don't expect the LSRR options to do anything for you in most public networks. .Sh EXAMPLES A sample use and output might be: .Bd -literal [edge.lax]$ lft -S 4.2.2.2 Hop LFT trace to vnsc-bak.sys.gtei.net (4.2.2.2):80/tcp 1 ln-gateway.centergate.com (206.117.161.1) 0.5ms 2 isi-acg.ln.net (130.152.136.1) 2.3ms 3 isi-1-lngw2-atm.ln.net (130.152.180.21) 2.5ms 4 gigabitethernet5-0.lsanca1-cr3.bbnplanet.net (4.24.4.249) 3.0ms 5 p6-0.lsanca1-cr6.bbnplanet.net (4.24.4.2) 3.4ms 6 p6-0.lsanca2-br1.bbnplanet.net (4.24.5.49) 3.3ms 7 p15-0.snjpca1-br1.bbnplanet.net (4.24.5.58) 10.9ms 8 so-3-0-0.mtvwca1-br1.bbnplanet.net (4.24.7.33) 11.1ms 9 p7-0.mtvwca1-dc-dbe1.bbnplanet.net (4.24.9.166) 11.0ms 10 vlan40.mtvwca1-dc1-dfa1-rc1.bbnplanet.net (128.11.193.67) 11.1ms ** [neglected] no reply packets received from TTLs 11 through 20 ** [4.2-3 BSD bug] the next gateway may errantly reply with reused TTLs 21 [target] vnsc-bak.sys.gtei.net (4.2.2.2) 11.2ms .Ed .Pp The (-S) option was used to suppress the real-time status bar for clean output. LFT's "**" notifiers in between hops 10 and 21 represent additional useful information: the first is a "[neglected]" indicator that lets us know that none of the probes sent with the TTLs indicated elicited responses. This could be for a variety of reasons, but the cause of this specific occurrence is described in the next informative message which indicates that this is likely the result of a bug in the 4.[23] .Tn BSD network code (and its derivatives): BSD 4.x (x < 3) sends an unreachable message using whatever TTL remains in the original datagram. Since, for gateways, the remaining TTL is zero, the .Tn ICMP "time exceeded" is guaranteed to not make it back to us. LFT does its best to identify this condition rather than print lots and lots of hops that don't exist (trying to reach a high enough TTL). .Pp Now, using the adaptive engine option: .Bd -literal [edge.lax]$ lft -E -S 4.2.2.1 Hop LFT trace to vnsc-pri.sys.gtei.net (4.2.2.1):80/tcp 1 ln-gateway.centergate.com (206.117.161.1) 0.5/0.5ms 2 isi-acg.ln.net (130.152.136.1) 2.1/2.3ms 3 isi-1-lngw2-atm.ln.net (130.152.180.21) 2.6/7.1ms 4 gigabitethernet5-0.lsanca1-cr3.bbnplanet.net (4.24.4.249) 6.1/3.9ms ** [firewall] the next gateway may statefully inspect packets 5 p0-0-0.lsanca1-csr1.bbnplanet.net (4.24.4.10) 155.4/3.7ms 6 [target] vnsc-pri.sys.gtei.net (4.2.2.1) 22.6/3.7/*/*/*/*/*ms .Ed .Pp In the scenario above, the adaptive engine was able to identify a stateful, packet-inspecting firewall in the path. Another example with more options: .Bd -literal [edge.lax]$ lft -S -A -T -m 2 -d 80 -s 53 www.yahoo.com Hop LFT trace to w9.scd.yahoo.com (66.218.71.88):80/tcp 1 [226] ln-gateway.centergate.com (206.117.161.1) 1 ms 2 [226] isi-acg.ln.net (130.152.136.1) 2 ms 3 [226] isi-1-lngw2-atm.ln.net (130.152.180.21) 3 ms 4 [1] gigether5-0.lsanca1-cr3.bbnplanet.net (4.24.4.249) 3 ms 5 [1] p6-0.lsanca1-cr6.bbnplanet.net (4.24.4.2) 5 ms 6 [1] p6-0.lsanca2-br1.bbnplanet.net (4.24.5.49) 3 ms 7 [1] p1-0.lsanca2-cr2.bbnplanet.net (4.25.112.1) 3 ms 8 [16852] pos4-0.core1.LosAngeles1.Level3.net (209.0.227.57) 3 ms 9 [3356] so-4-0-0.mp1.LosAngeles1.Level3.net (209.247.10.193) 3 ms 10 [3356] so-3-0-0.mp2.SanJose1.Level3.net (64.159.1.130) 11 ms 11 [3356] gige10-0.ipcolo4.SanJose1.Level3.net (64.159.2.42) 11 ms 12 [3356] cust-int.level3.net (64.152.81.62) 52 ms 13 [10310] vl17.bas2.scd.yahoo.com (66.218.64.150) 53 ms 14 [10310] w9.scd.yahoo.com (66.218.71.88) [target] 54 ms .Pp LFT's trace took 5.23 seconds. Resolution required 3.58 seconds. .Ed .Pp Note the -Ar above displays ASNs using the RADB as a whois source. A better option may have been to use the -A alone or perhaps -AC. .Pp And why not request netblock lookups? .Bd -literal [edge.lax]$ lft -S -N www.microsoft.com Hop LFT trace to www.us.microsoft.com (207.46.197.113):80/tcp 1 [LOS-NETTOS-BLK4] ln-gateway.centergate.com (206.117.161.1) 2 ms 2 [LOS-NETTOS] isi-acg.ln.net (130.152.136.1) 3 ms 3 [LOS-NETTOS] isi-1-lngw2-pos.ln.net (130.152.80.30) 5 ms 4 [GNTY-4-0] gigether5-0.lsanca1-cr3.bbnplanet.net (4.24.4.249) 4 ms 5 [GNTY-4-0] p6-0.lsanca1-cr6.bbnplanet.net (4.24.4.2) 3 ms 6 [GNTY-4-0] p6-0.lsanca2-br1.bbnplanet.net (4.24.5.49) 3 ms 7 [GNTY-4-0] p15-0.snjpca1-br1.bbnplanet.net (4.24.5.58) 10 ms 8 [GNTY-4-0] p9-0.snjpca1-br2.bbnplanet.net (4.24.9.130) 11 ms 9 [GNTY-4-0] so-1-0-0.sttlwa2-br1.bbnplanet.net (4.0.3.229) 27 ms 10 [GNTY-4-0] so-0-0-0.sttlwa1-hcr1.bbnplanet.net (4.24.11.202) 28 ms 11 [GNTY-4-0] so-7-0-0.sttlwa1-hcr2.bbnplanet.net (4.24.10.234) 28 ms 12 [GNTY-4-0] p1-0.sttlwa1-cr2.bbnplanet.net (4.24.10.241) 29 ms 13 [GNTY-4-0] p2-0.msseattle.bbnplanet.net (4.25.89.6) 32 ms 14 [MICROSOFT-GLOBAL-NET] 207.46.154.9 32 ms 15 [MICROSOFT-GLOBAL-NET] 207.46.155.17 33 ms 16 [MICROSOFT-GLOBAL-NET] 207.46.129.51 [prohibited] 35 ms .Ed .Pp .Sh TROUBLESHOOTING If traces don't appear to go anywhere, there are a number of things to try. If you are receiving an error related to permissions, be sure the .Nm executable is set-uid root so it may execute with root-level permissions required to utilize raw sockets on most operating systems. .Pp If you do not receive permissions-related errors, but traces still don't go anywhere, first activate verbose output by adding -VV to your command line options. Then, reading the verbose output, if you see trace probes going out, but no replies being detected (as indicated by "RCVD" tags), you may: Use the TCP basic (-b) method if you wish to use TCP probes and you fear NAT may be causing your trace to fail. Alternatively, select a different trace method and protocol such as UDP (-u) or ICMP (-p). .Pp If you are attempting to use RFC 1393 (-P) and your trace is failing, this is likely because network equipment somewhere in the path does not conform to RFC 1393. Your only option is to select an alternative tracing method or protocol. .Pp If you are attempting to utilize adaptive mode (-E/-e) and traces fail, first try enabling NAT compatibility using TCP basic (-b). If traces still fail, the most likely reason is a close-proximity stateful firewall in your network, which prevents this feature from working. .Pp .Sh AUTHORS Victor Oppleman, Eugene Antsilevitch, Sergey Kondryukov and other helpers around the world. .Sh REPORTING BUGS To report bugs, send e-mail to .Sh SEE ALSO .Xr traceroute 8 , .Xr netstat 1 , .Xr whois 1 , .Xr whob 8 .Sh HISTORY The .Nm command first appeared in 1998 as 'fft'. Renamed as a result of confusion with fast fourier transforms, .Nm stands for 'layer four traceroute.' Thanks also to Nils McCarthy for writing 'FFT', LFT's predecessor. lft-3.8/Makefile.in000644 000766 000000 00000003611 12716654514 014152 0ustar00vicwheel000000 000000 # # This file is part of LFT. # # The LFT software provided in this Distribution is # Copyright 2007 VOSTROM Holdings, Inc. # # The full text of our legal notices is contained in the file called # COPYING, included with this Distribution. # Directories where LFT will be installed: prefix=@prefix@ datarootdir = @datarootdir@ datadir = @datadir@ exec_prefix=@exec_prefix@ bindir=@bindir@ mandir=@mandir@ INSTALL=@INSTALL@ LN=@LN_S@ # Commands/References CC=@CC@ CFLAGS=@CFLAGS@ LIBS=@LIBS@ LDFLAGS=@LDFLAGS@ CAT=cat CD=cd MKDIR=mkdir -p BUILDTYPE=build RM=rm -rf SH=sh SYSTEM=unix TOOLS=tools TOUCH=touch STRIP ?= strip @SET_MAKE@ # Specifics OBJS=lft.o lft_ifname.o whois.o lft_lib.o lft_icmptrace.o lft_btcptrace.o all: lft whob lft: $(OBJS) $(CC) $(CFLAGS) -o lft $(OBJS) $(LDFLAGS) $(LIBS) whob: whois.o $(CC) $(CFLAGS) -o whob whois.c -DSTANDALONE $(LDFLAGS) $(LIBS) install: lft lft.8 whob whob.8 @echo "LFT and WhoB" @echo " \_Stripping binaries" @$(STRIP) lft whob @echo " \_Copying files to their intended destinations" @test -d $(DESTDIR)$(bindir)/. || $(MKDIR) $(DESTDIR)$(bindir) $(INSTALL) lft $(DESTDIR)$(bindir)/lft $(INSTALL) whob $(DESTDIR)$(bindir)/whob @ ( echo chown root $(DESTDIR)$(bindir)/lft && chown root $(DESTDIR)$(bindir)/lft && echo chmod u+s $(DESTDIR)$(bindir)/lft && chmod u+s $(DESTDIR)$(bindir)/lft ) || echo "***" WARNING: could not set $(bindir) suid to root @test -d $(DESTDIR)$(mandir)/man8/. || $(MKDIR) $(DESTDIR)$(mandir)/man8 @echo "Installing manual pages" $(INSTALL) lft.8 $(DESTDIR)$(mandir)/man8/lft.8 $(INSTALL) whob.8 $(DESTDIR)$(mandir)/man8/whob.8 clean: $(RM) *.o core* lft whob *~ *.dSYM distclean: $(RM) Makefile config.log config.status config/acconfig.h better: @echo "Sorry, this is the best I can do." work: @echo "Sorry, I didn't write this. I'm only a Makefile." love: @echo "What do you think I was doing before you bothered me?" lft-3.8/lft_btcptrace.c000644 000766 000000 00000076736 12323066364 015101 0ustar00vicwheel000000 000000 #include "lft_btcptrace.h" #include "lft_lib.h" static LFT_CALLBACK LFTErrHandler=0; static LFT_CALLBACK LFTEvtHandler=0; static int getFreePort(lft_session_params * sess, int startfrom) { int i; if(sess->btcpmap == NULL) { if(!(sess->btcpmap = malloc(sizeof(BasicTCPMapEntry) * (sess->ttl_limit * sess->retry_max + 1)))) { LFTErrHandler(sess, ERR_NOT_ENOUGH_MEM, NULL); return 0; } sess->btcpmapsize=sess->ttl_limit * sess->retry_max + 1; for(i=0;ibtcpmapsize;i++) { sess->btcpmap[i].nhop = -1; sess->btcpmap[i].port = sess->dport + i; sess->btcpmap[i].sentcount=0; } sess->latestmapchoice=0; /*sess->debugmapidx=0;*/ } for(i=(startfrom && sess->latestmapchoice>=startfrom)?sess->latestmapchoice+1:startfrom;ibtcpmapsize;i++) { if(sess->btcpmap[i].nhop==-1) { if(startfrom) sess->latestmapchoice=i; return sess->btcpmap[i].port; } } return sess->dport; } static int probeIsSent(lft_session_params * sess, int port, int nhop) { int i = port - sess->dport; if(i<0 || i>=sess->btcpmapsize) { LFTErrHandler(sess, ERR_BTCP_WRONG_PORT_VALUE, NULL); return 0; } if(sess->btcpmap[i].nhop!=-1 && sess->btcpmap[i].nhop!=nhop) { LFTErrHandler(sess, ERR_BTCP_PROBE_PORT_IS_BUSY, NULL); return 0; } sess->btcpmap[i].nhop=nhop; sess->btcpmap[i].sentcount++; return sess->btcpmap[i].sentcount; } static int probeIsRecvd(lft_session_params * sess, int port) { int nhop; int i = port - sess->dport; if(i<0 || i>=sess->btcpmapsize) { LFTErrHandler(sess, ERR_BTCP_WRONG_PORT_VALUE, NULL); return 0; } nhop=sess->btcpmap[i].nhop; sess->btcpmap[i].sentcount--; if(sess->btcpmap[i].sentcount<1) { sess->btcpmap[i].nhop=-1; sess->btcpmap[i].sentcount=0; } return nhop; } #if 0 static int hopByPort(lft_session_params * sess, int port) { int nhop; int i = port - sess->dport; if(i<0 || i>=sess->btcpmapsize) return -1; nhop=sess->btcpmap[i].nhop; if(sess->btcpmap[i].port != port || sess->btcpmap[i].sentcount<1) return -1; return nhop; } #endif static unsigned int tcp_base_send_hop(lft_session_params * sess, short nhop, int searchfrom) { struct sockaddr_in dest; unsigned int tseq=0; unsigned short tttl=0; char * buf; char* bptr = NULL; int blen = 0; int port; EvtSentPacketParam espparam; struct trace_packet_info_s *pinfo = NULL; struct trace_packet_s *packet = NULL; #if defined( __CYGWIN__ ) || defined( WIN32 ) || defined(_WIN32) buf=(char *)_alloca(maxpacklen+64); #else buf=(char *)alloca(maxpacklen+64); #endif if (!(pinfo = (struct trace_packet_info_s *)malloc(sizeof(struct trace_packet_info_s)))) { LFTErrHandler(sess, ERR_NOT_ENOUGH_MEM, NULL); return 0; } memset(pinfo, 0, sizeof(struct trace_packet_info_s)); packet = &(pinfo->u.packet); memcpy(packet, &(sess->trace_packet), sizeof(struct trace_packet_s)); bptr = buf; dest.sin_family = AF_INET; dest.sin_addr = sess->remote_address; port=getFreePort(sess, searchfrom); dest.sin_port = htons(port); tseq = new_seq(sess); tttl = nhop + 1; sess->ts_last_sent = sess->now; packet->ip_hdr.ip_ttl = tttl; packet->ip_hdr.ip_src = sess->local_address; packet->ip_hdr.ip_dst = sess->remote_address; espparam.flags=sess->tcp_flags; if(sess->adaptive) { struct hop_info_s *h = &(sess->hop_info[nhop]); if(h->state == HS_SEND_FIN) espparam.flags = TH_FIN; else if(h->state == HS_SEND_SYN) espparam.flags = TH_SYN; else if(h->state == HS_SEND_SYN_ACK) espparam.flags = HS_SEND_SYN_ACK; else { WrnBadHopStateParam wbhsp; wbhsp.h=h; wbhsp.nhop=nhop; LFTErrHandler(sess, WRN_BAD_HOP_STATE, &wbhsp); } } espparam.nhop=nhop; espparam.tseq=tseq; espparam.tttl=tttl; if (sess->noisy > 1) { LFTEvtHandler(sess,EVT_SENT_PACKET, &espparam); if(sess->exit_state<0) { free(pinfo); return 0; } } packet->ip_hdr.ip_sum = 0; #if !defined(SCREWED_IP_LEN) packet->ip_hdr.ip_sum = ip_cksum (&packet->ip_hdr); #endif memcpy(bptr, &(packet->ip_hdr), sizeof(struct ip)); bptr += sizeof(struct ip); if (packet->lsrr.ipl_len > 0) { memcpy(bptr, &(packet->lsrr), packet->lsrr.ipl_len + 1); bptr += (packet->lsrr.ipl_len + 1); /* PADDING !!! */ } /* Layer-4 preparation */ /* Construct TCP (no payload needed) */ if (sess->noisy > 5) { LFTEvtHandler(sess,EVT_SHOW_PAYLOAD, packet); if(sess->exit_state < 0) { free(pinfo); return 0; } } packet->tcp_hdr.th_dport = dest.sin_port; packet->tcp_hdr.th_seq = htonl (tseq); packet->tcp_hdr.th_sport = htons (sess->sport); packet->tcp_hdr.th_flags = espparam.flags; #if defined(SOLARIS_LENGTH_IN_CHECKSUM) packet->tcp_hdr.th_sum = htons (sizeof (struct tcphdr)) + packet->payload_len; #else packet->tcp_hdr.th_sum = 0; packet->tcp_hdr.th_sum = tcp_cksum (&packet->ip_hdr, &packet->tcp_hdr, packet->payload, packet->payload_len); #endif if (sess->noisy > 5) { LFTEvtHandler(sess,EVT_SHOW_TCP_CHECKSUM, packet); if(sess->exit_state<0) { free(pinfo); return 0; } } memcpy(bptr, &(packet->tcp_hdr), sizeof(struct tcphdr)); bptr += sizeof(packet->tcp_hdr); memcpy(bptr, packet->payload, packet->payload_len); blen = sizeof(struct ip) + packet->lsrr.ipl_len + sizeof(struct tcphdr) + packet->payload_len; /* Packet is ready, fire away */ if (sendto (sess->send_sock, buf, blen, 0, (const struct sockaddr *)(const void *)&dest, sizeof (dest)) < 0) { LFTErrHandler(sess, ERR_RAW_TCP_DISABLED, NULL); free(pinfo); return 0; } /*sess->debugmap[sess->debugmapidx].type=0; sess->debugmap[sess->debugmapidx].hop=nhop; sess->debugmap[sess->debugmapidx++].port=port;*/ probeIsSent(sess, port, nhop); pinfo->hopno = nhop; pinfo->seq = tseq; pinfo->sent = sess->now; SLIST_INSERT_HEAD(&(sess->trace_packets), pinfo, next); sess->trace_packets_num++; if (nhop != -1) { SLIST_INSERT_HEAD(&(sess->hop_info[nhop].packets), pinfo, next_by_hop); sess->hop_info[nhop].num_sent++; sess->hop_info[nhop].all_sent++; sess->hop_info[nhop].ts_last_sent = sess->now; } return tseq; } static void tcp_base_recv_packet (lft_session_params * sess, unsigned int seq, struct in_addr ipaddr, int icmp_type, const struct pcap_pkthdr *hdr) { double ms; struct trace_packet_info_s *tp = NULL; EvtNonSeqPacketParam ensp; /* Depending on the platform, we can use * the pcap header's timeval or we must call gettimeofday() for each packet */ #if defined( __CYGWIN__ ) || defined( WIN32 ) || defined(_WIN32) gettimeofday (&(sess->now), NULL); #else sess->now.tv_sec = hdr->ts.tv_sec; sess->now.tv_usec = hdr->ts.tv_usec; /* gettimeofday (&now, NULL); */ #endif /* First, search every probe to find an exact sequence match */ SLIST_FOREACH(tp, &(sess->trace_packets), next) { if(tp->seq == seq) break; } #if 0 if(tp == NULL) { /* Second, search every probe to find an exact port match */ SLIST_FOREACH(tp, &(sess->trace_packets), next) { if(hopByPort(sess, htons(tp->packet.tcp_hdr.th_dport)) == tp->hopno) break; } } #endif /* Last resort. Catch any response from the target */ if (tp == NULL) { if (sess->noisy > 3) { LFTEvtHandler(sess,EVT_LOOKFOR_LAST_RESORT,NULL); if(sess->exit_state < 0) return; } SLIST_FOREACH(tp, &(sess->trace_packets), next) { /* Special case: look for a response to our SYN_ACK */ if (tp->u.packet.tcp_hdr.th_flags == HS_SEND_SYN_ACK) { if (!tp->recv.tv_sec) { break; } } /* Truly the last resort: packet from the target with a wacky ACK sequence */ if ((ipaddr.s_addr == sess->remote_address.s_addr) && (tp->hopaddr.s_addr == 0) && (icmp_type == -1)) { sess->target_anomaly = 1; } } } /* This packet is not even close, drop it and move on */ if (!tp) { if (sess->noisy) LFTEvtHandler(sess, EVT_SKIP_PACKET, NULL); else if (!sess->nostatus) LFTEvtHandler(sess, EVT_PROGRESS_SKIP_PACKET, NULL); return; } if (tp->seq != seq) { ensp.ipaddr=ipaddr; ensp.tp=tp; if (((tp->seq) == (seq + 1)) && (icmp_type == -1)) { if (sess->noisy > 1) { LFTEvtHandler(sess,EVT_ACK_WAS_NOT_INC,&ensp); if(sess->exit_state<0) return; } /* return; */ } else if (((tp->seq) == (seq - sess->payloadlen)) && (icmp_type == -1)) { if (sess->noisy > 1) { LFTEvtHandler(sess,EVT_RST_REL_TO_ISN,&ensp); if(sess->exit_state<0) return; } /* return; */ } else if ((ipaddr.s_addr == sess->remote_address.s_addr) && (icmp_type == -1)) { if (sess->noisy > 1) { LFTEvtHandler(sess,EVT_ACK_WAS_WAY_OFF,&ensp); if(sess->exit_state<0) return; } /* return; */ } } if (tp->recv.tv_sec) { if (sess->noisy) LFTEvtHandler(sess,EVT_DUPLICATE_PACKET, NULL); else if (!sess->nostatus) LFTEvtHandler(sess,EVT_PROGRESS_DUPLICATE,NULL); return; } /*sess->debugmap[sess->debugmapidx].type=1; sess->debugmap[sess->debugmapidx].hop=tp->hopno; sess->debugmap[sess->debugmapidx].phop=hopByPort(sess, htons(tp->packet.tcp_hdr.th_dport)); sess->debugmap[sess->debugmapidx].port=htons(tp->packet.tcp_hdr.th_dport); sess->debugmap[sess->debugmapidx++].ip=ipaddr;*/ probeIsRecvd(sess, htons(tp->u.packet.tcp_hdr.th_dport)); if (sess->noisy > 1) { EvtRecvPacketParam erpp; erpp.ipaddr=ipaddr; erpp.seq=seq; erpp.tp=tp; LFTEvtHandler(sess,EVT_RECV_PACKET,&erpp); } else { if (!sess->nostatus) LFTEvtHandler(sess,EVT_PROGRESS_OK,NULL); } if(sess->exit_state<0) return; /* increment received packet counter */ sess->num_rcvd++; tp->recv = sess->now; if (tp->hopno != -1) { sess->hop_info[tp->hopno].ts_last_recv = sess->now; sess->hop_info[tp->hopno].all_rcvd++; hop_state_copy(sess, tp->hopno); /* indicate this hop has a sequence anomaly */ if (icmp_type == -1) sess->hop_info[tp->hopno].flags |= HF_ENDPOINT; } tp->hopaddr = ipaddr; tp->icmp_type = icmp_type; if (icmp_type != -2 && (!sess->num_hops || sess->num_hops > tp->hopno)) if (sess->break_on_icmp || (icmp_type == -1)) { if (tp->hopno != -1) { /* we set fake type -1 when we get actual * tcp packet in return - meaning destination */ sess->num_hops = tp->hopno; tp->is_done = 1; sess->hop_info[tp->hopno].done_packet = tp; if (sess->noisy > 1 && sess->target_open < 1) LFTEvtHandler(sess,EVT_TCP_PORT_CLOSED,NULL); else if (sess->noisy > 1 && sess->target_open > 0) LFTEvtHandler(sess,EVT_TCP_PORT_OPEN,NULL); if(sess->exit_state<0) return; } } /* adjust scatter if we have fast reply times */ ms = timediff_ms (tp->sent, tp->recv); sess->scatter_ms = (sess->scatter_ms * (sess->ahead_limit - 1) + ms) / sess->ahead_limit; } static void tcp_base_finish(lft_session_params * sess) { int hopno; int maxhop; int reply, noreply; int as_for_hop = 0; struct trace_packet_info_s *tp; char *netname; /*int ocres;*/ char *myApp = (char *)malloc((strlen(version) * sizeof(char)) + 1 + (strlen(appname) * sizeof(char))); struct ip_list_array *ipaslist = (struct ip_list_array *)malloc(sizeof(struct ip_list_array)); /* Variables for seam detection */ int icmpcode; int asseam_hopno=-1; struct in_addr asseam_hopaddr; int netseam_hopno=-1; struct in_addr netseam_hopaddr; struct in_addr classbmask; struct in_addr masked_target; int prevasn=-1; struct in_addr prevasn_hopaddr; int prevasn_hopno; int lastishole; int netreached=0; int isseam; /* ---------------------------- */ inet_aton("255.255.0.0", &classbmask); masked_target.s_addr=sess->remote_address.s_addr & classbmask.s_addr; EvtPacketInfoParam ehip; memset(ipaslist, '0', sizeof(struct ip_list_array)); gettimeofday (&(sess->trace_done_time), NULL); /*ocres=open_check(sess, LFTErrHandler, LFTEvtHandler); LFTEvtHandler(sess,EVT_OPEN_CHECK_RESULT,&ocres); if(ocres==1) { sess->target_open=1; sess->target_filtered=0; } else { sess->target_open=0; if(ocres<0) sess->target_filtered=0; else sess->target_filtered=1; }*/ if (sess->noisy > 3) { LFTEvtHandler(sess,EVT_SHOW_NUM_HOPS, NULL); if(sess->exit_state < 0) { free(ipaslist); free(myApp); return; } } if (sess->num_hops) { maxhop = sess->num_hops; /* display all packets we received from this host */ SLIST_FOREACH(tp, &(sess->trace_packets), next) { if (tp->is_done) { tp->hopno = maxhop; break; } } } else { maxhop = sess->hop_info_length - 1; } LFTEvtHandler(sess,EVT_TRACE_COMPLETED, NULL); if(sess->exit_state < 0) { free(ipaslist); free(myApp); return; } /* if user wants ASN resolution from pwhois/cymru/riswhois, do it in bulk */ if (sess->do_aslookup || sess->do_netlookup) { if(sess->noisy > 1) { LFTEvtHandler(sess,EVT_ON_RESOLUTION, NULL); if(sess->exit_state < 0) { free(ipaslist); free(myApp); return; } } if (!sess->use_radb) { /* populate bulk ip_addr_list structure */ for (hopno = sess->ttl_min; hopno <= maxhop; hopno++) { SLIST_FOREACH(tp, &(sess->hop_info[hopno].packets), next_by_hop) { if (tp->recv.tv_usec) { (*ipaslist).ipaddr[as_for_hop] = tp->hopaddr; as_for_hop++; (*ipaslist).numItems = (as_for_hop); break; } } } if (sess->use_cymru) { /* use cymru bulk service */ if (w_lookup_as_cymru_bulk(sess->wsess, &(*ipaslist)) != 0) if (sess->noisy) LFTErrHandler(sess, WRN_NS_LOOKUP_FAILED, NULL); } else if (sess->use_ris) { /* use RIPE NCC RIS service */ if (w_lookup_all_riswhois_bulk(sess->wsess, &(*ipaslist)) != 0) if (sess->noisy) LFTErrHandler(sess, WRN_NS_LOOKUP_FAILED, NULL); } else { /* use pwhois bulk service */ if ((strlen(version) * sizeof(char)) + 1 + (strlen(appname) * sizeof(char)) < 254) { *myApp = '\0'; strcat(myApp,appname); strcat(myApp," "); strcat(myApp,version); strncpy((*ipaslist).application, myApp, 511); } if (w_lookup_all_pwhois_bulk(sess->wsess, &(*ipaslist)) != 0) if(sess->noisy) LFTErrHandler(sess, WRN_NS_LOOKUP_FAILED, NULL); } if(sess->exit_state < 0) { free(ipaslist); free(myApp); return; } } } free(myApp); LFTEvtHandler(sess,EVT_TRACE_REPORT_START, &maxhop); if(sess->exit_state < 0){ free(ipaslist); return; } /* seam detection */ as_for_hop=0; for(hopno = sess->ttl_min; hopno < sess->hop_info_length; hopno++) { struct in_addr last_hop; icmpcode=-100; last_hop.s_addr = 0; if(sess->hop_info[hopno].all_rcvd) { lastishole=0; SLIST_FOREACH(tp, &(sess->hop_info[hopno].packets), next_by_hop) { if(tp->recv.tv_sec) { if(hopno<=maxhop) icmpcode=tp->icmp_type; if(last_hop.s_addr != tp->hopaddr.s_addr) { if((tp->hopaddr.s_addr & classbmask.s_addr) == masked_target.s_addr) netreached=1; else { netseam_hopno=hopno; netseam_hopaddr=tp->hopaddr; } if(sess->do_aslookup || sess->do_netlookup) { if (sess->use_radb) { /* using RADB/IRR */ tp->asnumber = w_lookup_as(sess->wsess, inet_ntoa(tp->hopaddr)); } else { /* using pwhois by default */ tp->asnumber = (*ipaslist).asn[as_for_hop]; } if(prevasn==-1) { if(tp->asnumber) { prevasn=tp->asnumber; prevasn_hopno=hopno; prevasn_hopaddr=tp->hopaddr; } } else { if(tp->asnumber) { if(tp->asnumber!=prevasn) { asseam_hopno=prevasn_hopno; asseam_hopaddr=prevasn_hopaddr; } prevasn=tp->asnumber; prevasn_hopno=hopno; prevasn_hopaddr=tp->hopaddr; } } } last_hop=tp->hopaddr; } } } as_for_hop++; } else lastishole=1; if(icmpcode==-1) break; } if(!netreached) netseam_hopno=-1; if(lastishole) asseam_hopno=-1; /* -------------- */ noreply = 0; reply = 0; as_for_hop = 0; /* this correlates the hopno to the asn stored in ipaslist */ for (hopno = sess->ttl_min; hopno <= maxhop; hopno++) { struct in_addr last_hop; if (sess->hop_info[hopno].all_rcvd != 0) { if (noreply >= 1) { EvtNoReplyParam nrp; nrp.hopno=hopno; nrp.noreply=noreply; LFTEvtHandler(sess,EVT_RPT_NO_REPLY, &nrp); if(sess->exit_state < 0){ free(ipaslist); return; } } } last_hop.s_addr = 0; if ((sess->hop_info[hopno].state == HS_SEND_FIN) && (sess->hop_info[hopno+1].state == HS_SEND_SYN) && (sess->hop_info[hopno+1].ts_last_recv.tv_sec)) { LFTEvtHandler(sess,EVT_RPT_FRW_INSPECT_PACKS, NULL); if(sess->exit_state < 0){ free(ipaslist); return; } } if ((sess->hop_info[hopno].state != HS_SEND_SYN_ACK) && (sess->hop_info[hopno+1].state == HS_SEND_SYN_ACK) && (hopno == (sess->num_hops - 1))) { LFTEvtHandler(sess,EVT_RPT_FRW_STATE_FILTER, NULL); if(sess->exit_state < 0){ free(ipaslist); return; } } if ((sess->hop_info[hopno].flags & HF_ENDPOINT) && (noreply >= ((maxhop - sess->ttl_min)/2)) && sess->num_hops > 3) { LFTEvtHandler(sess,EVT_RPT_BSD_BUG, NULL); if(sess->exit_state < 0){ free(ipaslist); return; } } if (sess->hop_info[hopno].all_rcvd == 0) { reply = 0; } else { LFTEvtHandler(sess,EVT_RPT_HOP_INFO_START,&hopno); if(sess->exit_state < 0){ free(ipaslist); return; } SLIST_FOREACH(tp, &(sess->hop_info[hopno].packets), next_by_hop) { if (tp->recv.tv_sec) { reply = 1; if (last_hop.s_addr != tp->hopaddr.s_addr) { ehip.asnumber = 0; /* init/clear the ASN */ if (sess->do_aslookup) { if (sess->use_radb) { /* using RADB/IRR */ ehip.asnumber = w_lookup_as(sess->wsess, inet_ntoa(tp->hopaddr)); } else { /* using pwhois by default */ ehip.asnumber = (*ipaslist).asn[as_for_hop]; } } tp->asnumber=ehip.asnumber; ehip.netname=NULL; if (sess->do_netlookup) { if (!sess->do_aslookup || (sess->do_aslookup && !sess->use_cymru && !sess->use_radb)) { netname = (*ipaslist).netName[as_for_hop]; } else { netname = w_lookup_netname(sess->wsess, inet_ntoa(tp->hopaddr)); } ehip.netname=netname; } if(ehip.netname) strncpy(tp->netname, ehip.netname, 511); else tp->netname[0]=0; } ehip.last_hop=last_hop; tp->last_hop=ehip.last_hop; last_hop = tp->hopaddr; } ehip.tp=tp; /* seam processing */ isseam=0; ehip.is_asseam=0; ehip.is_netseam=0; ehip.is_open=0; ehip.is_filtered=0; ehip.seam_traced=0; if(sess->check_seam && hopno==asseam_hopno && tp->hopaddr.s_addr==asseam_hopaddr.s_addr) { isseam=1; ehip.is_asseam=1; } if(sess->check_seam && hopno==netseam_hopno && tp->hopaddr.s_addr==netseam_hopaddr.s_addr) { isseam=1; ehip.is_netseam=1; } if(isseam) { if(sess->check_seam) { int curroutputstyle=getOutputStyle(); char hostname[100]; ehip.seam_traced=1; setOutputStyle(2); lft_session_params * subsess=LFTSessionOpen(); strncpy(hostname, inet_ntoa(tp->hopaddr),100); subsess->senddevsel = 1; subsess->senddev = sess->pcap_send_dev; subsess->userdevsel = 1; subsess->userdev = sess->pcap_dev; subsess->auto_ports=0; subsess->dport=179; subsess->seq_start=30; subsess->retry_min=1; subsess->retry_max=1; subsess->resolve_names=0; subsess->ahead_limit=1; subsess->break_on_icmp = 0; subsess->is_graphviz_subquery=1; subsess->hostname=hostname; subsess->hostname_lsrr_size = 0; LFTExecute(subsess); ehip.is_open=subsess->target_open; ehip.is_filtered=subsess->target_filtered; LFTSessionClose(subsess); setOutputStyle(curroutputstyle); } } /* --------------- */ LFTEvtHandler(sess,EVT_RPT_PACKET_INFO,&ehip); if(sess->exit_state < 0){ free(ipaslist); return; } } LFTEvtHandler(sess,EVT_RPT_PACKET_LIST_END,NULL); if(sess->exit_state < 0){ free(ipaslist); return; } } if (reply) { noreply = 0; as_for_hop++; } else noreply++; reply = 0; } if (!sess->num_hops) { LFTEvtHandler(sess,EVT_RPT_NO_HOPS,&maxhop); } if (sess->timetrace) { LFTEvtHandler(sess,EVT_RPT_TIME_TRACE,NULL); } LFTEvtHandler(sess,EVT_ON_EXIT,NULL); if(ipaslist != NULL) free(ipaslist); } static int tcp_base_check_timeouts(lft_session_params * sess) { int nhop; int need_reply = 0; int no_reply = 0; int last_return = 0; gettimeofday (&(sess->now), NULL); if (timediff_ms (sess->ts_last_sent, sess->now) < sess->scatter_ms) return 0; /* not ready to send another packet yet */ for (nhop = sess->ttl_min; nhop < sess->hop_info_length; nhop++) { if (!sess->hop_info[nhop].num_sent) { tcp_base_send_hop(sess, nhop, 1); return 0; } } for (nhop = sess->ttl_min; nhop < sess->hop_info_length; nhop++) { if (sess->hop_info[nhop].num_sent <= sess->retry_max && !sess->hop_info[nhop].ts_last_recv.tv_sec) { if (sess->noisy > 4) { LFTEvtHandler(sess,EVT_TTL_NO_REPLY,&nhop); if(sess->exit_state<0) return 0; } if (timediff_ms (sess->hop_info[nhop].ts_last_sent, sess->now) >= sess->timeout_ms) { /* we timed out waiting for this hop -- retry if we have any * more tries */ if (sess->hop_info[nhop].num_sent < sess->retry_max) { if (!sess->noisy && !sess->nostatus) LFTEvtHandler(sess,EVT_PROGRESS_NO_REPLY,NULL); if (sess->noisy > 2) LFTEvtHandler(sess,EVT_TTL_TOUT_RESEND,&nhop); if(sess->exit_state<0) return 0; if(sess->hop_info[nhop].num_sent < sess->retry_max - 1) tcp_base_send_hop(sess, nhop, 1); else { sess->btcpdpucnt++; if(sess->btcpdpucnt>4) { sess->btcpdpucnt=0; sess->btcpmap[0].nhop=-1; sess->btcpmap[0].sentcount=0; tcp_base_send_hop(sess, nhop, 0); } } return 0; } else { if (!sess->adaptive || hop_state_up(sess, nhop)) { if (sess->noisy > 3) LFTEvtHandler(sess,EVT_TTL_TOUT_GIVINGUP,&nhop); if(sess->exit_state<0) return 0; no_reply++; } } } else { need_reply++; /* we have to wait for this one to timeout */ } } else { /* have reply */ last_return = nhop; } } if (sess->noisy > 4) { EvtDebugCheckpoint1Param edcp; edcp.last_return=last_return; edcp.need_reply=need_reply; edcp.no_reply=no_reply; LFTEvtHandler(sess,EVT_DBG_CHECKPOINT1,&edcp); if(sess->exit_state<0) return 0; } if (no_reply >= sess->ahead_limit) { /* we timed out. */ if ((last_return + 3) * 2 < sess->hop_info_length) { if ((need_reply < 3) && (sess->num_rcvd < 2)) LFTEvtHandler(sess,EVT_CANT_RELIABLY_RTRIP,NULL); if(sess->exit_state < 0) return 0; tcp_base_finish(sess); return 1; } } if ((!sess->num_hops || sess->hop_info_length < sess->num_hops || need_reply) && sess->hop_info_length < sess->ttl_limit) { if (sess->noisy > 4) LFTEvtHandler(sess,EVT_HAVE_UNANSWERRED_HOPS,NULL); if (need_reply >= sess->ahead_limit) { if (sess->noisy > 4) LFTEvtHandler(sess,EVT_TOO_FAR_AHEAD,NULL); return 0; /* wait for some replies before we go on */ } if(sess->exit_state<0) return 0; if (sess->num_hops > 0 && sess->hop_info_length >= sess->num_hops) { if (sess->noisy > 3) LFTEvtHandler(sess,EVT_HAVE_GAPS,NULL); return 0; /* we know how long the path is -- * wait to fill in the blanks */ } nhop = sess->hop_info_length++; tcp_base_send_hop(sess, nhop, 1); } else { if (sess->noisy >= 4) { LFTEvtHandler(sess,EVT_EITHER_RESP_OR_TOUT,NULL); if(sess->exit_state<0) return 0; } for (nhop = sess->ttl_min; nhop < sess->hop_info_length; nhop++) { if (sess->hop_info[nhop].num_sent < sess->retry_min) { tcp_base_send_hop(sess, nhop, 1); return 0; } if(sess->hop_info[nhop].done_packet) { if(sess->trg_probe_is_sentretry_min || (sess->trg_probe_is_sentretry_max && ntohs(sess->hop_info[nhop].done_packet->u.packet.tcp_hdr.th_dport)!=sess->dport)) { sess->btcpdpucnt++; if(sess->btcpdpucnt>4) { sess->btcpdpucnt=0; sess->btcpmap[0].nhop=-1; sess->btcpmap[0].sentcount=0; sess->trg_probe_is_sent++; tcp_base_send_hop(sess, nhop, 0); } return 0; } } } tcp_base_finish(sess); return 1; } return 0; } static void tcp_base_process_packet(lft_session_params * sess, const u_char *packet, const struct pcap_pkthdr *hdr) { const struct ip *ip, *orig_ip; const struct tcphdr *tcp; const struct icmp *icmp; if (sess->noisy > 4) { LFTEvtHandler(sess,EVT_PROCESS_PACKET_START,NULL); if(sess->exit_state<0) return; } tcp_base_check_timeouts(sess); if(sess->exit_state<0) return; packet += sess->skip_header_len; ip = (const void *) packet; packet += 4 * ip->ip_hl; switch (ip->ip_p) { case IPPROTO_ICMP: orig_ip = ip; icmp = (const void *) packet; if (icmp->icmp_type != ICMP_UNREACH && icmp->icmp_type != ICMP_TIMXCEED) return; ip = &icmp->icmp_ip; if (ip->ip_p != IPPROTO_TCP) return; /* not a response to our tcp probe */ packet = (const u_char *) ip; packet += 4 * ip->ip_hl; tcp = (const void *) packet; if (ip->ip_src.s_addr != sess->local_address.s_addr || ip->ip_dst.s_addr != sess->remote_address.s_addr) return; /* not for us */ if (sess->noisy > 2) { EvtIncomingICMPTCPParam eiitp; eiitp.icmp=icmp; eiitp.ip=ip; eiitp.orig_ip=orig_ip; eiitp.tcp=tcp; LFTEvtHandler(sess,EVT_INCOMING_ICMP_TCP,&eiitp); if(sess->exit_state<0) return; } if (sess->noisy > 1) { LFTEvtHandler(sess,EVT_RCVD_ICMP_TCP,tcp); if(sess->exit_state<0) return; } tcp_base_recv_packet(sess, ntohl (tcp->th_seq) , orig_ip->ip_src, (icmp->icmp_type == ICMP_TIMXCEED) ? -2 : icmp->icmp_code, hdr); return; case IPPROTO_TCP: tcp = (const void *) packet; if (!(tcp->th_flags & TH_RST) && !(tcp->th_flags & TH_ACK) && !(tcp->th_flags & TH_SYN)) return; /* not what we're looking for */ if (ip->ip_src.s_addr != sess->remote_address.s_addr || ip->ip_dst.s_addr != sess->local_address.s_addr) { return; /* not the right connection */ } if (sess->noisy > 1) { LFTEvtHandler(sess,EVT_RCVD_TCP,tcp); if(sess->exit_state<0) return; } if(ntohs(tcp->th_sport)==sess->dport) { /* Check for SYN,ACK in response to determine if target is listening */ if ((tcp->th_flags & TH_ACK) && (tcp->th_flags & TH_SYN) && !(tcp->th_flags & TH_RST)) sess->target_open++; if ((tcp->th_flags & TH_ACK) && !(tcp->th_flags & TH_SYN) && (tcp->th_flags & TH_RST)) sess->target_open = 0; } tcp_base_recv_packet(sess, ntohl (tcp->th_ack) - 1, ip->ip_src, -1, hdr); return; default: if (sess->noisy > 3) LFTEvtHandler(sess,EVT_RCVD_UNKNOWN,ip); } } #if defined( __CYGWIN__ ) || defined( WIN32 ) || defined(_WIN32) void win_tcp_base_process(lft_session_params * sess) { fd_set fds; struct timeval tm; tm.tv_sec = 0; tm.tv_usec = 100000; FD_ZERO(&fds); FD_SET(sess->recv_sock, &fds); if (select(sess->recv_sock+1, &fds, 0, 0, &tm) < 0) { LFTErrHandler(sess, ERR_WIN_SELECT, NULL); return; } if (FD_ISSET(sess->recv_sock, &fds)) { /* read packet */ char packetbuf[2048]; int nread; memset(packetbuf, 0, sizeof(packetbuf)); nread = recv(sess->recv_sock, packetbuf, sizeof(packetbuf), 0); if (nread <= 0) { LFTErrHandler(sess, ERR_WIN_RECV, NULL); return; } tcp_base_process_packet(sess, packetbuf, NULL); } } #else static void pcap_tcp_base_process_packet(u_char * user_data, const struct pcap_pkthdr *hdr, const u_char * packet) { lft_session_params * sess=(lft_session_params *)(void *)user_data; if(sess->exit_state<0) return; tcp_base_process_packet(sess, packet, hdr); } #endif void tcp_base_trace_main_loop(lft_session_params * sess, LFT_CALLBACK err, LFT_CALLBACK evt) { LFTErrHandler=err; LFTEvtHandler=evt; #if defined( __CYGWIN__ ) || defined( WIN32 ) || defined(_WIN32) while(1) { win_tcp_base_process(sess); if(sess->exit_state<0) break; if(tcp_base_check_timeouts(sess)) break; if(sess->exit_state<0) break; } #else while(pcap_dispatch(sess->pcapdescr, -1, pcap_tcp_base_process_packet, (u_char *)sess) >= 0) { if(sess->exit_state<0) break; if(sess->noisy > 6) { LFTEvtHandler(sess,EVT_DBG_CHECKPOINT2,NULL); if(sess->exit_state<0) break; } if(tcp_base_check_timeouts(sess)) break; if(sess->exit_state<0) break; } #endif } lft-3.8/lft_ifname.c000644 000766 000000 00000005437 11711612447 014356 0ustar00vicwheel000000 000000 /* * lft_ifname.c * Layer Four Traceroute * * This file is part of LFT. * * The LFT software provided in this Distribution is * Copyright 2007 VOSTROM Holdings, Inc. * * The full text of our legal notices is contained in the file called * COPYING, included with this Distribution. * */ #if !defined(WIN32) && !defined(_WIN32) #include #include #include #include #if !defined(linux) && !defined(__CYGWIN__) #include #endif #include #include #include #include #include #include "lft_ifname.h" #if defined( __CYGWIN__ ) || defined( WIN32 ) || defined(_WIN32) #include "config/acconfig.win.h" #else #include "config/acconfig.h" #endif static int sock = -1; u_long lft_getifaddr (const char *ifname) { struct ifreq ifr; struct sockaddr_in addr; /* Only do this once of course */ if (sock < 0) { if ((sock = socket (AF_INET, SOCK_DGRAM, 0)) < 0) { perror ("socket"); return -1; } } STRNCPY(ifr.ifr_name, ifname, IFNAMSIZ); if (ioctl(sock, SIOCGIFADDR, &ifr) < 0) { perror("ioctl"); return -1; } if (ifr.ifr_addr.sa_family != AF_INET) { fprintf (stderr, "%s: Interface not configured with IPv4 address.\n", ifname); fflush (stderr); return -1; } memcpy(&addr, &ifr.ifr_addr, sizeof addr); return (addr.sin_addr.s_addr); } char * lft_getifname (struct in_addr addr) { struct ifconf ifc; char buffer[2048]; int i, skip; /* Only do this once of course */ if (sock < 0) { if ((sock = socket (AF_INET, SOCK_DGRAM, 0)) < 0) { perror ("socket"); return NULL; } } ifc.ifc_len = sizeof(buffer); ifc.ifc_buf = buffer; if (ioctl(sock, SIOCGIFCONF, &ifc) < 0) { perror("ioctl"); return NULL; } for (i = 0; i < ifc.ifc_len; i += skip) { struct ifreq ifr; struct in_addr thisaddr; memcpy(&ifr, ifc.ifc_buf + i, sizeof(struct ifreq)); skip = sizeof(struct ifreq); #ifdef HAVE_SOCKADDR_SA_LEN if (ifr.ifr_addr.sa_len > sizeof(struct sockaddr)) { skip = ifr.ifr_addr.sa_len + IFNAMSIZ; } #endif if (ifr.ifr_addr.sa_family != AF_INET) continue; thisaddr = ((const struct sockaddr_in *)(const void *)(&(ifr.ifr_addr)))->sin_addr; if (thisaddr.s_addr == addr.s_addr) return strdup(ifr.ifr_name); } /* not found */ return NULL; } #ifdef LFT_IFADDR_TESTING extern int main (int argc, char *argv[]) { struct in_addr in; char *addr; if (argc > 1) addr = strdup (argv[1]); else addr = strdup ("eth0"); in.s_addr = lft_getifaddr (addr); if (in.s_addr == -1) { fprintf (stderr, "%s: Error reading ifname\n", addr); fflush (stderr); free(addr); exit (-1); } fprintf (stdout, "%s: %s\n", addr, inet_ntoa (in)); fflush (stdout); free (addr); exit (0); } #endif /*LFT_IFNAME_TESTING*/ #endif lft-3.8/lft_queue.h000644 000766 000000 00000041345 11053131665 014243 0ustar00vicwheel000000 000000 /* * Copyright (c) 1991, 1993 * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * @(#)queue.h 8.5 (Berkeley) 8/20/94 * $FreeBSD: src/sys/sys/queue.h,v 1.32.2.4 2001/03/31 03:33:39 hsu Exp $ */ #ifndef _LFT_QUEUE_H_ #define _LFT_QUEUE_H_ #define __offsetof(type, field) ((size_t)(&((type *)0)->field)) /* * This file defines five types of data structures: singly-linked lists, * singly-linked tail queues, lists, tail queues, and circular queues. * * A singly-linked list is headed by a single forward pointer. The elements * are singly linked for minimum space and pointer manipulation overhead at * the expense of O(n) removal for arbitrary elements. New elements can be * added to the list after an existing element or at the head of the list. * Elements being removed from the head of the list should use the explicit * macro for this purpose for optimum efficiency. A singly-linked list may * only be traversed in the forward direction. Singly-linked lists are ideal * for applications with large datasets and few or no removals or for * implementing a LIFO queue. * * A singly-linked tail queue is headed by a pair of pointers, one to the * head of the list and the other to the tail of the list. The elements are * singly linked for minimum space and pointer manipulation overhead at the * expense of O(n) removal for arbitrary elements. New elements can be added * to the list after an existing element, at the head of the list, or at the * end of the list. Elements being removed from the head of the tail queue * should use the explicit macro for this purpose for optimum efficiency. * A singly-linked tail queue may only be traversed in the forward direction. * Singly-linked tail queues are ideal for applications with large datasets * and few or no removals or for implementing a FIFO queue. * * A list is headed by a single forward pointer (or an array of forward * pointers for a hash table header). The elements are doubly linked * so that an arbitrary element can be removed without a need to * traverse the list. New elements can be added to the list before * or after an existing element or at the head of the list. A list * may only be traversed in the forward direction. * * A tail queue is headed by a pair of pointers, one to the head of the * list and the other to the tail of the list. The elements are doubly * linked so that an arbitrary element can be removed without a need to * traverse the list. New elements can be added to the list before or * after an existing element, at the head of the list, or at the end of * the list. A tail queue may be traversed in either direction. * * A circle queue is headed by a pair of pointers, one to the head of the * list and the other to the tail of the list. The elements are doubly * linked so that an arbitrary element can be removed without a need to * traverse the list. New elements can be added to the list before or after * an existing element, at the head of the list, or at the end of the list. * A circle queue may be traversed in either direction, but has a more * complex end of list detection. * * For details on the use of these macros, see the queue(3) manual page. * * * SLIST LIST STAILQ TAILQ CIRCLEQ * _HEAD + + + + + * _ENTRY + + + + + * _INIT + + + + + * _EMPTY + + + + + * _FIRST + + + + + * _NEXT + + + + + * _PREV - - - + + * _LAST - - + + + * _FOREACH + + + + + * _FOREACH_REVERSE - - - + + * _INSERT_HEAD + + + + + * _INSERT_BEFORE - + - + + * _INSERT_AFTER + + + + + * _INSERT_TAIL - - + + + * _REMOVE_HEAD + - + - - * _REMOVE + + + + + * */ /* * Singly-linked List definitions. */ #define SLIST_HEAD(name, type) \ struct name { \ struct type *slh_first; /* first element */ \ } #define SLIST_HEAD_INITIALIZER(head) \ { NULL } #undef SLIST_ENTRY #define SLIST_ENTRY(type) \ struct { \ struct type *sle_next; /* next element */ \ } /* * Singly-linked List functions. */ #define SLIST_EMPTY(head) ((head)->slh_first == NULL) #define SLIST_FIRST(head) ((head)->slh_first) #define SLIST_FOREACH(var, head, field) \ for((var) = (head)->slh_first; (var); (var) = (var)->field.sle_next) #define SLIST_INIT(head) { \ (head)->slh_first = NULL; \ } #define SLIST_INSERT_AFTER(slistelm, elm, field) do { \ (elm)->field.sle_next = (slistelm)->field.sle_next; \ (slistelm)->field.sle_next = (elm); \ } while (0) #define SLIST_INSERT_HEAD(head, elm, field) do { \ (elm)->field.sle_next = (head)->slh_first; \ (head)->slh_first = (elm); \ } while (0) #define SLIST_NEXT(elm, field) ((elm)->field.sle_next) #define SLIST_REMOVE_HEAD(head, field) do { \ (head)->slh_first = (head)->slh_first->field.sle_next; \ } while (0) #define SLIST_REMOVE(head, elm, type, field) do { \ if ((head)->slh_first == (elm)) { \ SLIST_REMOVE_HEAD((head), field); \ } \ else { \ struct type *curelm = (head)->slh_first; \ while( curelm->field.sle_next != (elm) ) \ curelm = curelm->field.sle_next; \ curelm->field.sle_next = \ curelm->field.sle_next->field.sle_next; \ } \ } while (0) /* * Singly-linked Tail queue definitions. */ #define STAILQ_HEAD(name, type) \ struct name { \ struct type *stqh_first;/* first element */ \ struct type **stqh_last;/* addr of last next element */ \ } #define STAILQ_HEAD_INITIALIZER(head) \ { NULL, &(head).stqh_first } #define STAILQ_ENTRY(type) \ struct { \ struct type *stqe_next; /* next element */ \ } /* * Singly-linked Tail queue functions. */ #define STAILQ_EMPTY(head) ((head)->stqh_first == NULL) #define STAILQ_INIT(head) do { \ (head)->stqh_first = NULL; \ (head)->stqh_last = &(head)->stqh_first; \ } while (0) #define STAILQ_FIRST(head) ((head)->stqh_first) #ifndef STAILQ_LAST #define STAILQ_LAST(head, type, field) \ (STAILQ_EMPTY(head) ? \ NULL : \ ((struct type *) \ ((char *)((head)->stqh_last) - __offsetof(struct type, field)))) #endif #define STAILQ_FOREACH(var, head, field) \ for((var) = (head)->stqh_first; (var); (var) = (var)->field.stqe_next) #define STAILQ_INSERT_HEAD(head, elm, field) do { \ if (((elm)->field.stqe_next = (head)->stqh_first) == NULL) \ (head)->stqh_last = &(elm)->field.stqe_next; \ (head)->stqh_first = (elm); \ } while (0) #define STAILQ_INSERT_TAIL(head, elm, field) do { \ (elm)->field.stqe_next = NULL; \ *(head)->stqh_last = (elm); \ (head)->stqh_last = &(elm)->field.stqe_next; \ } while (0) #define STAILQ_INSERT_AFTER(head, tqelm, elm, field) do { \ if (((elm)->field.stqe_next = (tqelm)->field.stqe_next) == NULL)\ (head)->stqh_last = &(elm)->field.stqe_next; \ (tqelm)->field.stqe_next = (elm); \ } while (0) #define STAILQ_NEXT(elm, field) ((elm)->field.stqe_next) #define STAILQ_REMOVE_HEAD(head, field) do { \ if (((head)->stqh_first = \ (head)->stqh_first->field.stqe_next) == NULL) \ (head)->stqh_last = &(head)->stqh_first; \ } while (0) #define STAILQ_REMOVE_HEAD_UNTIL(head, elm, field) do { \ if (((head)->stqh_first = (elm)->field.stqe_next) == NULL) \ (head)->stqh_last = &(head)->stqh_first; \ } while (0) #define STAILQ_REMOVE(head, elm, type, field) do { \ if ((head)->stqh_first == (elm)) { \ STAILQ_REMOVE_HEAD(head, field); \ } \ else { \ struct type *curelm = (head)->stqh_first; \ while( curelm->field.stqe_next != (elm) ) \ curelm = curelm->field.stqe_next; \ if((curelm->field.stqe_next = \ curelm->field.stqe_next->field.stqe_next) == NULL) \ (head)->stqh_last = &(curelm)->field.stqe_next; \ } \ } while (0) /* * List definitions. */ #define LIST_HEAD(name, type) \ struct name { \ struct type *lh_first; /* first element */ \ } #define LIST_HEAD_INITIALIZER(head) \ { NULL } #define LIST_ENTRY(type) \ struct { \ struct type *le_next; /* next element */ \ struct type **le_prev; /* address of previous next element */ \ } /* * List functions. */ #define LIST_EMPTY(head) ((head)->lh_first == NULL) #define LIST_FIRST(head) ((head)->lh_first) #define LIST_FOREACH(var, head, field) \ for((var) = (head)->lh_first; (var); (var) = (var)->field.le_next) #define LIST_INIT(head) do { \ (head)->lh_first = NULL; \ } while (0) #define LIST_INSERT_AFTER(listelm, elm, field) do { \ if (((elm)->field.le_next = (listelm)->field.le_next) != NULL) \ (listelm)->field.le_next->field.le_prev = \ &(elm)->field.le_next; \ (listelm)->field.le_next = (elm); \ (elm)->field.le_prev = &(listelm)->field.le_next; \ } while (0) #define LIST_INSERT_BEFORE(listelm, elm, field) do { \ (elm)->field.le_prev = (listelm)->field.le_prev; \ (elm)->field.le_next = (listelm); \ *(listelm)->field.le_prev = (elm); \ (listelm)->field.le_prev = &(elm)->field.le_next; \ } while (0) #define LIST_INSERT_HEAD(head, elm, field) do { \ if (((elm)->field.le_next = (head)->lh_first) != NULL) \ (head)->lh_first->field.le_prev = &(elm)->field.le_next;\ (head)->lh_first = (elm); \ (elm)->field.le_prev = &(head)->lh_first; \ } while (0) #define LIST_NEXT(elm, field) ((elm)->field.le_next) #define LIST_REMOVE(elm, field) do { \ if ((elm)->field.le_next != NULL) \ (elm)->field.le_next->field.le_prev = \ (elm)->field.le_prev; \ *(elm)->field.le_prev = (elm)->field.le_next; \ } while (0) /* * Tail queue definitions. */ #define TAILQ_HEAD(name, type) \ struct name { \ struct type *tqh_first; /* first element */ \ struct type **tqh_last; /* addr of last next element */ \ } #define TAILQ_HEAD_INITIALIZER(head) \ { NULL, &(head).tqh_first } #define TAILQ_ENTRY(type) \ struct { \ struct type *tqe_next; /* next element */ \ struct type **tqe_prev; /* address of previous next element */ \ } /* * Tail queue functions. */ #define TAILQ_EMPTY(head) ((head)->tqh_first == NULL) #define TAILQ_FOREACH(var, head, field) \ for (var = TAILQ_FIRST(head); var; var = TAILQ_NEXT(var, field)) #ifndef TAILQ_FOREACH_REVERSE #define TAILQ_FOREACH_REVERSE(var, head, headname, field) \ for ((var) = TAILQ_LAST((head), headname); \ (var); \ (var) = TAILQ_PREV((var), headname, field)) #endif #define TAILQ_FIRST(head) ((head)->tqh_first) #define TAILQ_LAST(head, headname) \ (*(((struct headname *)((head)->tqh_last))->tqh_last)) #define TAILQ_NEXT(elm, field) ((elm)->field.tqe_next) #define TAILQ_PREV(elm, headname, field) \ (*(((struct headname *)((elm)->field.tqe_prev))->tqh_last)) #define TAILQ_INIT(head) do { \ (head)->tqh_first = NULL; \ (head)->tqh_last = &(head)->tqh_first; \ } while (0) #define TAILQ_INSERT_HEAD(head, elm, field) do { \ if (((elm)->field.tqe_next = (head)->tqh_first) != NULL) \ (head)->tqh_first->field.tqe_prev = \ &(elm)->field.tqe_next; \ else \ (head)->tqh_last = &(elm)->field.tqe_next; \ (head)->tqh_first = (elm); \ (elm)->field.tqe_prev = &(head)->tqh_first; \ } while (0) #define TAILQ_INSERT_TAIL(head, elm, field) do { \ (elm)->field.tqe_next = NULL; \ (elm)->field.tqe_prev = (head)->tqh_last; \ *(head)->tqh_last = (elm); \ (head)->tqh_last = &(elm)->field.tqe_next; \ } while (0) #define TAILQ_INSERT_AFTER(head, listelm, elm, field) do { \ if (((elm)->field.tqe_next = (listelm)->field.tqe_next) != NULL)\ (elm)->field.tqe_next->field.tqe_prev = \ &(elm)->field.tqe_next; \ else \ (head)->tqh_last = &(elm)->field.tqe_next; \ (listelm)->field.tqe_next = (elm); \ (elm)->field.tqe_prev = &(listelm)->field.tqe_next; \ } while (0) #define TAILQ_INSERT_BEFORE(listelm, elm, field) do { \ (elm)->field.tqe_prev = (listelm)->field.tqe_prev; \ (elm)->field.tqe_next = (listelm); \ *(listelm)->field.tqe_prev = (elm); \ (listelm)->field.tqe_prev = &(elm)->field.tqe_next; \ } while (0) #define TAILQ_REMOVE(head, elm, field) do { \ if (((elm)->field.tqe_next) != NULL) \ (elm)->field.tqe_next->field.tqe_prev = \ (elm)->field.tqe_prev; \ else \ (head)->tqh_last = (elm)->field.tqe_prev; \ *(elm)->field.tqe_prev = (elm)->field.tqe_next; \ } while (0) /* * Circular queue definitions. */ #define CIRCLEQ_HEAD(name, type) \ struct name { \ struct type *cqh_first; /* first element */ \ struct type *cqh_last; /* last element */ \ } #define CIRCLEQ_ENTRY(type) \ struct { \ struct type *cqe_next; /* next element */ \ struct type *cqe_prev; /* previous element */ \ } /* * Circular queue functions. */ #define CIRCLEQ_EMPTY(head) ((head)->cqh_first == (void *)(head)) #define CIRCLEQ_FIRST(head) ((head)->cqh_first) #define CIRCLEQ_FOREACH(var, head, field) \ for((var) = (head)->cqh_first; \ (var) != (void *)(head); \ (var) = (var)->field.cqe_next) #define CIRCLEQ_FOREACH_REVERSE(var, head, field) \ for((var) = (head)->cqh_last; \ (var) != (void *)(head); \ (var) = (var)->field.cqe_prev) #define CIRCLEQ_INIT(head) do { \ (head)->cqh_first = (void *)(head); \ (head)->cqh_last = (void *)(head); \ } while (0) #define CIRCLEQ_INSERT_AFTER(head, listelm, elm, field) do { \ (elm)->field.cqe_next = (listelm)->field.cqe_next; \ (elm)->field.cqe_prev = (listelm); \ if ((listelm)->field.cqe_next == (void *)(head)) \ (head)->cqh_last = (elm); \ else \ (listelm)->field.cqe_next->field.cqe_prev = (elm); \ (listelm)->field.cqe_next = (elm); \ } while (0) #define CIRCLEQ_INSERT_BEFORE(head, listelm, elm, field) do { \ (elm)->field.cqe_next = (listelm); \ (elm)->field.cqe_prev = (listelm)->field.cqe_prev; \ if ((listelm)->field.cqe_prev == (void *)(head)) \ (head)->cqh_first = (elm); \ else \ (listelm)->field.cqe_prev->field.cqe_next = (elm); \ (listelm)->field.cqe_prev = (elm); \ } while (0) #define CIRCLEQ_INSERT_HEAD(head, elm, field) do { \ (elm)->field.cqe_next = (head)->cqh_first; \ (elm)->field.cqe_prev = (void *)(head); \ if ((head)->cqh_last == (void *)(head)) \ (head)->cqh_last = (elm); \ else \ (head)->cqh_first->field.cqe_prev = (elm); \ (head)->cqh_first = (elm); \ } while (0) #define CIRCLEQ_INSERT_TAIL(head, elm, field) do { \ (elm)->field.cqe_next = (void *)(head); \ (elm)->field.cqe_prev = (head)->cqh_last; \ if ((head)->cqh_first == (void *)(head)) \ (head)->cqh_first = (elm); \ else \ (head)->cqh_last->field.cqe_next = (elm); \ (head)->cqh_last = (elm); \ } while (0) #define CIRCLEQ_LAST(head) ((head)->cqh_last) #define CIRCLEQ_NEXT(elm,field) ((elm)->field.cqe_next) #define CIRCLEQ_PREV(elm,field) ((elm)->field.cqe_prev) #define CIRCLEQ_REMOVE(head, elm, field) do { \ if ((elm)->field.cqe_next == (void *)(head)) \ (head)->cqh_last = (elm)->field.cqe_prev; \ else \ (elm)->field.cqe_next->field.cqe_prev = \ (elm)->field.cqe_prev; \ if ((elm)->field.cqe_prev == (void *)(head)) \ (head)->cqh_first = (elm)->field.cqe_next; \ else \ (elm)->field.cqe_prev->field.cqe_next = \ (elm)->field.cqe_next; \ } while (0) #endif /* !_LFT_QUEUE_H_ */ lft-3.8/icons/72x72/000755 000766 000000 00000000000 13263007004 013770 5ustar00vicwheel000000 000000 lft-3.8/icons/144x144/000755 000766 000000 00000000000 13263007004 014130 5ustar00vicwheel000000 000000 lft-3.8/icons/144x144/blank.png000644 000766 000000 00000006422 12062431750 015736 0ustar00vicwheel000000 000000 ‰PNG  IHDRçF⸠pHYs.#.#x¥?v OiCCPPhotoshop ICC profilexÚSgTSé=÷ÞôBKˆ€”KoR RB‹€‘&*! Jˆ!¡ÙQÁEEÈ ˆŽŽ€ŒQ, Š Øä!¢Žƒ£ˆŠÊûá{£kÖ¼÷æÍþµ×>ç¬ó³ÏÀ –H3Q5€ ©BàƒÇÄÆáä.@ $p³d!sý#ø~<<+"À¾xÓ ÀM›À0‡ÿêB™\€„Àt‘8K€@zŽB¦@F€˜&S `ËcbãP-`'æÓ€ø™{[”! ‘ eˆDh;¬ÏVŠEX0fKÄ9Ø-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+®ç*x™²<¹$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóýxήÎÎ6޶_-ê¿ÿ"bbãþåÏ«p@át~Ñþ,/³€;€mþ¢%îh^  u÷‹f²@µ éÚWópø~<ß5°j>{‘-¨]cöK'XtÀâ÷ò»oÁÔ(€hƒáÏwÿï?ýG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)¬‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(¼ AÈa!ÚˆbŠX#Ž™…ø!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fº‘;È2‚ü†¼G1”²Q=Ô µC¹¨7„F¢ Ðdt1š ›Ðr´=Œ6¡çЫhÚ>CÇ0Àè3Äl0.ÆÃB±8, “c˱"¬ «Æ°V¬»‰õcϱwEÀ 6wB aAHXLXNØH¨ $4Ú 7 „QÂ'"“¨K´&ºùÄb21‡XH,#Ö/{ˆCÄ7$‰C2'¹I±¤TÒÒFÒnR#é,©›4H#“ÉÚdk²9”, +È…ääÃä3ää!ò[ b@q¤øSâ(RÊjJåå4åe˜2AU£šRݨ¡T5ZB­¡¶R¯Q‡¨4uš9̓IK¥­¢•Óhh÷i¯ètºÝ•N—ÐWÒËéGè—èôw †ƒÇˆg(›gw¯˜L¦Ó‹ÇT071ë˜ç™™oUX*¶*|‘Ê •J•&•*/T©ª¦ªÞª UóUËT©^S}®FU3Sã© Ô–«UªPëSSg©;¨‡ªg¨oT?¤~Yý‰YÃLÃOC¤Q ±_ã¼Æ c³x,!k «†u5Ä&±ÍÙ|v*»˜ý»‹=ª©¡9C3J3W³Ró”f?ã˜qøœtN ç(§—ó~ŠÞï)â)¦4L¹1e\kª–—–X«H«Q«Gë½6®í§¦½E»YûAÇJ'\'GgÎçSÙSݧ §M=:õ®.ªk¥¡»Dw¿n§î˜ž¾^€žLo§Þy½çú}/ýTýmú§õG X³ $Û Î<Å5qo</ÇÛñQC]Ã@C¥a•a—á„‘¹Ñ<£ÕFFŒiÆ\ã$ãmÆmÆ£&&!&KMêMîšRM¹¦)¦;L;LÇÍÌÍ¢ÍÖ™5›=1×2ç›ç›×›ß·`ZxZ,¶¨¶¸eI²äZ¦Yî¶¼n…Z9Y¥XUZ]³F­­%Ö»­»§§¹N“N«žÖgðñ¶É¶©·°åØÛ®¶m¶}agbg·Å®Ã“}º}ý= ‡Ù«Z~s´r:V:ޚΜî?}Åô–é/gXÏÏØ3ã¶Ë)ÄiS›ÓGgg¹sƒóˆ‹‰K‚Ë.—>.›ÆÝȽäJtõq]ázÒõ›³›Âí¨Û¯î6îiî‡ÜŸÌ4Ÿ)žY3sÐÃÈCàQåÑ? Ÿ•0k߬~OCOgµç#/c/‘W­×°·¥wª÷aï>ö>rŸã>ã<7Þ2ÞY_Ì7À·È·ËOÃož_…ßC#ÿdÿzÿѧ€%g‰A[ûøz|!¿Ž?:Ûeö²ÙíAŒ ¹AA‚­‚åÁ­!hÈì­!÷ç˜Î‘Îi…P~èÖÐaæa‹Ã~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DÞ›g1O9¯-J5*>ª.j<Ú7º4º?Æ.fYÌÕXXIlK9.*®6nl¾ßüíó‡ââ ã{˜/È]py¡ÎÂô…§©.,:–@LˆN8”ðA*¨Œ%òw%Ž yÂÂg"/Ñ6шØC\*NòH*Mz’쑼5y$Å3¥,幄'©¼L LÝ›:žšv m2=:½1ƒ’‘qBª!M“¶gêgæfvˬe…²þÅn‹·/•Ék³¬Y- ¶B¦èTZ(×*²geWf¿Í‰Ê9–«ž+Íí̳ÊÛ7œïŸÿíÂá’¶¥†KW-X潬j9²‰Š®Û—Ø(Üxå‡oÊ¿™Ü”´©«Ä¹dÏfÒféæÞ-ž[–ª—æ—n ÙÚ´ ßV´íõöEÛ/—Í(Û»ƒ¶C¹£¿<¸¼e§ÉÎÍ;?T¤TôTúT6îÒݵa×ønÑî{¼ö4ìÕÛ[¼÷ý>ɾÛUUMÕfÕeûIû³÷?®‰ªéø–ûm]­NmqíÇÒý#¶×¹ÔÕÒ=TRÖ+ëGǾþïw- 6 UœÆâ#pDyäé÷ ß÷ :ÚvŒ{¬áÓvg/jBšòšF›Sšû[b[ºOÌ>ÑÖêÞzüGÛœ499â?rýéü§CÏdÏ&žþ¢þË®/~øÕë×Îјѡ—ò—“¿m|¥ýêÀë¯ÛÆÂƾÉx31^ôVûíÁwÜwï£ßOä| (ÿhù±õSЧû“““ÿ˜óüc3-Û cHRMz%€ƒùÿ€éu0ê`:˜o’_ÅF=IDATxÚìØ?KVa‡áû¼ Ñh`KTDDCmM-9Õ8}¬F]ú³÷lwsŠ\¬!2ŒF¡H´¡Sd¤é™¯ ð§÷{<ç¬ó³ÏÀ –H3Q5€ ©BàƒÇÄÆáä.@ $p³d!sý#ø~<<+"À¾xÓ ÀM›À0‡ÿêB™\€„Àt‘8K€@zŽB¦@F€˜&S `ËcbãP-`'æÓ€ø™{[”! ‘ eˆDh;¬ÏVŠEX0fKÄ9Ø-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+®ç*x™²<¹$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóýxήÎÎ6޶_-ê¿ÿ"bbãþåÏ«p@át~Ñþ,/³€;€mþ¢%îh^  u÷‹f²@µ éÚWópø~<ß5°j>{‘-¨]cöK'XtÀâ÷ò»oÁÔ(€hƒáÏwÿï?ýG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)¬‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(¼ AÈa!ÚˆbŠX#Ž™…ø!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fº‘;È2‚ü†¼G1”²Q=Ô µC¹¨7„F¢ Ðdt1š ›Ðr´=Œ6¡çЫhÚ>CÇ0Àè3Äl0.ÆÃB±8, “c˱"¬ «Æ°V¬»‰õcϱwEÀ 6wB aAHXLXNØH¨ $4Ú 7 „QÂ'"“¨K´&ºùÄb21‡XH,#Ö/{ˆCÄ7$‰C2'¹I±¤TÒÒFÒnR#é,©›4H#“ÉÚdk²9”, +È…ääÃä3ää!ò[ b@q¤øSâ(RÊjJåå4åe˜2AU£šRݨ¡T5ZB­¡¶R¯Q‡¨4uš9̓IK¥­¢•Óhh÷i¯ètºÝ•N—ÐWÒËéGè—èôw †ƒÇˆg(›gw¯˜L¦Ó‹ÇT071ë˜ç™™oUX*¶*|‘Ê •J•&•*/T©ª¦ªÞª UóUËT©^S}®FU3Sã© Ô–«UªPëSSg©;¨‡ªg¨oT?¤~Yý‰YÃLÃOC¤Q ±_ã¼Æ c³x,!k «†u5Ä&±ÍÙ|v*»˜ý»‹=ª©¡9C3J3W³Ró”f?ã˜qøœtN ç(§—ó~ŠÞï)â)¦4L¹1e\kª–—–X«H«Q«Gë½6®í§¦½E»YûAÇJ'\'GgÎçSÙSݧ §M=:õ®.ªk¥¡»Dw¿n§î˜ž¾^€žLo§Þy½çú}/ýTýmú§õG X³ $Û Î<Å5qo</ÇÛñQC]Ã@C¥a•a—á„‘¹Ñ<£ÕFFŒiÆ\ã$ãmÆmÆ£&&!&KMêMîšRM¹¦)¦;L;LÇÍÌÍ¢ÍÖ™5›=1×2ç›ç›×›ß·`ZxZ,¶¨¶¸eI²äZ¦Yî¶¼n…Z9Y¥XUZ]³F­­%Ö»­»§§¹N“N«žÖgðñ¶É¶©·°åØÛ®¶m¶}agbg·Å®Ã“}º}ý= ‡Ù«Z~s´r:V:ޚΜî?}Åô–é/gXÏÏØ3ã¶Ë)ÄiS›ÓGgg¹sƒóˆ‹‰K‚Ë.—>.›ÆÝȽäJtõq]ázÒõ›³›Âí¨Û¯î6îiî‡ÜŸÌ4Ÿ)žY3sÐÃÈCàQåÑ? Ÿ•0k߬~OCOgµç#/c/‘W­×°·¥wª÷aï>ö>rŸã>ã<7Þ2ÞY_Ì7À·È·ËOÃož_…ßC#ÿdÿzÿѧ€%g‰A[ûøz|!¿Ž?:Ûeö²ÙíAŒ ¹AA‚­‚åÁ­!hÈì­!÷ç˜Î‘Îi…P~èÖÐaæa‹Ã~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DÞ›g1O9¯-J5*>ª.j<Ú7º4º?Æ.fYÌÕXXIlK9.*®6nl¾ßüíó‡ââ ã{˜/È]py¡ÎÂô…§©.,:–@LˆN8”ðA*¨Œ%òw%Ž yÂÂg"/Ñ6шØC\*NòH*Mz’쑼5y$Å3¥,幄'©¼L LÝ›:žšv m2=:½1ƒ’‘qBª!M“¶gêgæfvˬe…²þÅn‹·/•Ék³¬Y- ¶B¦èTZ(×*²geWf¿Í‰Ê9–«ž+Íí̳ÊÛ7œïŸÿíÂá’¶¥†KW-X潬j9²‰Š®Û—Ø(Üxå‡oÊ¿™Ü”´©«Ä¹dÏfÒféæÞ-ž[–ª—æ—n ÙÚ´ ßV´íõöEÛ/—Í(Û»ƒ¶C¹£¿<¸¼e§ÉÎÍ;?T¤TôTúT6îÒݵa×ønÑî{¼ö4ìÕÛ[¼÷ý>ɾÛUUMÕfÕeûIû³÷?®‰ªéø–ûm]­NmqíÇÒý#¶×¹ÔÕÒ=TRÖ+ëGǾþïw- 6 UœÆâ#pDyäé÷ ß÷ :ÚvŒ{¬áÓvg/jBšòšF›Sšû[b[ºOÌ>ÑÖêÞzüGÛœ499â?rýéü§CÏdÏ&žþ¢þË®/~øÕë×Îјѡ—ò—“¿m|¥ýêÀë¯ÛÆÂƾÉx31^ôVûíÁwÜwï£ßOä| (ÿhù±õSЧû“““ÿ˜óüc3-Û cHRMz%€ƒùÿ€éu0ê`:˜o’_ÅF/IDATxÚìKl[×ÿ?|]¾ER¤D=-Ù²ìÈNbI®¨¸ ÷ÇPZÎ1Ëýþðœq_ 5)ï}£óß&àp°÷ÅФ“fà5C-È üØ |Ÿ†ZÔ%3pÔ¸†ZÔ” (`d˜ µ¦Š‰{ "C†Z’Ù¸† € 22ddÈ! C@† € 22ddÈÈ!C@† € u“‰^h«ÕÊÈÈcccŒŒŒ000ÀÐн½½ƒAz{{q:x½^N§“É„Éd"ŸÏS*•俹\Žl6Ëúúº<ÖÖÖX__çÎ;ܽ{—J¥òÈô…k(óù|œ9s†ééiNž<ÉÉ“'ÇjµJ(y¾×ÿïv^(¸uë·oßfff†Ï>ûŒO?ý”H$bÔæÙgŸåìÙ³œ9s†‰‰ Ìfó4 Ë^Úî¹F­¬¬ðá‡rùòeÞÿ}îܹct²X,œ={–‹/rñâE&''·…e'HZg¿Ö©ö|aa÷Þ{wß}—>øMÓ €:v‘&O<ñßúÖ·øêW¿JOOÏžaiå¹NX§Fçétšwß}—?þñ\¾|™jµjÔ…Ãa¾ùÍoòo|ƒ‘‘‘­Ì^`i‡eÚ € òù<áp—ËÕP ¼óÎ;¼óÎ;,--µ¢ÉÉI~ðƒðüóÏ×9¿­Í€´W˜¶{¼R©°¸¸È·nÝbyy™W^y…'Ÿ|‹Å²§!®Z­ò׿þ•·ß~›>øÀ¨=õÔS¼üòËœ9sf_Ðt ¦FvµZEUUfgg™eii‰H$‚¦iœ>}š_|‘ÑÑѾ{î>ùä~ÿûßó·¿ýͨ‘Ž?Î믿ÎO<Ñp:a•’É$ñxœ›7o233C6›%—ËQ©T˜žžæüùóŒS.—±Ûí8Ž}ûR}ô¿ùÍoøä“O €úûûyõÕW¹páf³ù@ài$ñZMÓXYYauu•¹¹9nß¾®ë˜L&ÆÇÇ9wî=öÃÃøÝ÷ÖéŠF£¨ªŠÇã‘Vh?‘^µZå/ù ¿ýíoY^^~42™L|ýë_ç•W^Án·88­d2™ØØØàïÿ;W¯^¥Z­‡¹pá?þ8x<l6f³™jµJ¹\&•J‰DP¯×Û¶H¯X,ò»ßýŽ·ß~ûP3ßP8æÍ7ßäĉò††õ©ýÛÍ‚T©TX[[caaP(Äôô4Øl6ùûjU©TÈç󬮮’Ëåƒu¯mG^êÊ•+¼õÖ[ÌÍÍN^ø÷ƒúc.\à¿øÁ`J¥B¥R¡Z­ÊóŽjµÚÖC|k÷ò»póóó¨ªÊ±cÇðz½ò÷4ºf“ÉD¹\&™L¢iŠ¢4¼–í®q·kâµ×^#™LríÚµ/¦²X,|÷»ßåùçŸ?´áª‡¦i\¿~+W®àóùxã7“!úÖaÚl6Ëç„5J&“Æv'5ÿô§?ñ«_ýŠB¡p`u¼ïõzyýõ×™˜˜çÃzÌÍÍqõêUâñ8/¼ð===ÒJl…Çb±`µZ±Z­r˜´Ûí”J%2™Œ´Ní*üôÒKŒñ“Ÿü„‡ß~ö³Ÿ …šN –?´Û‘Éd¸|ù2Ÿþ9çÎãÛßþ6¡PHÂQ÷­´Zq8(Š‚ªª¬®®bµZñx<‹Er¹œh/N}³0-,,ðꫯH@Ç üüç?Çï÷7•Ýí¹­ÇAƒöá‡òÙgŸáñxxã78vìXáËl6ãp8p8 ÖÖÖÈårr(oN'jz ¼öÚk¬¯¯?|õôôðÓŸþ”ÞÞÞ¶T°[ ¹k!ÛO¤'r?—/_&óãÿ˜ééi™Ü:tÙívÜn7º®³¾¾N*•ÚÕçéTMo~~žýèGD£Ñ‡Ç²Ùl¼úê«ø|>ÊårËíåuí:A¶¹¹ÉÕ«WI$¼ð LNNbµZ)—Ë ‡.ñ\*•"‘H ëz[®·•ìù‘#GøÃþÀøÃ޵‹´=Œ饗8zô(ÕjMÓH§Ód2J¥Õjµ.É&T&·’·+´¯=Òé47oÞdvv–#GŽð•¯|…@ Ð0lN²ÓéDUU"‘ªªv,Ñìëúûû …B¼ÿþûÝoΞ=Ëc=&-O2™dqq‘b±ˆËåÂn·cµZemÈn·£( ‹EQ°ÙlûîÚe4MãÎ;ܹs]×¹xñ"½½½uÀlºEA×u’É$™L¦ãQg³ïõ;ßù×®]ãÏþs÷äóùøò—¿,-KµZ%£ª*år‡ÃA4•oÊjµÖÁ#¢ÑÔ.ÎE”³5cÜ4MÓÐu—ËUçÿì5ÒdÆ9NséÒ%†‡‡¥UÝ*EQä5ollFÉçó]U’ùå/ÉG}ÄêêjwtéÒ%,‹´>ù|^~ ¿÷½ï100€ªª¤ÓiYÉŽÅblll°¹¹)?³ÙŒÍfÃåra³Ùðx<òÜn·c³Ù°X,˜Íæ:t]gyy™T*ÅÄÄ>Ÿo[Ð*•ÊŽ7>NsëÖ-¢Ñ('NœàĉØl6éÏlM’Š¡+›Í‰DH¥RóÓZHQ~ýë_óÖ[ou@ccc9rDÂS­VI¥R¨ªÊñãÇ"ÐÛÛKµZE×ut]§X,R,Éçó¨ªJ<'Feø)†5a™ìv»<\.€D"!K .— EQd¡v/N{±Xdvv–ÕÕU\.O=õ”L6º„õ) ܹsG:ÎÝXÓ;þ<çÎãÊ•+ÝÐÓO?]q•J%’É$…BññqéÔæJEAQ €p¬K¥…BA¦ý766äQ›I }Ùl–L&ÃØØ^¯—l6+‡Êf#½r¹ÌÚÚwïÞ%—Ëñµ¯}¾¾¾]‡.€X,F$‘÷á òWâ~îöwÅñæ›ov@ƒƒƒ„Ãáº7 ª*™L†@ @8–Ni3δ×ë% qôèQ4M£X,¢ªª%‘H‰DˆF£”J%Ün7O?ý4ǧT*‰DÈf³x<žý§ÚsaÅ2™ çÏŸgtt‹ÅÒpèÁ€Ëå"ŸÏ³¾¾.#Ín.Çœ:uŠÓ§OsãÆîèäÉ“ä{Òé4…BS§Nár¹öƒ°ÙlX­VÜn7}}}T*9 t]—~“¢( ŠÅ"›››är9i%v²B¥R‰ÕÕUÖ×׿äÉ“(ŠÒðÚÍf3v»¯×K¹\f}}h4*_Ûí5½_|±;²X,ŒÕYŸb±H:F×u†††0›ÍIbY,\.—œ†\›SR…P(D©T"NK_e;ˆ*• wïÞennŽ©©)ž{î9<•Jåk!»×ëEQ677YYYAUÕ‡¢¦g2™øÒ—¾„ÕjmhY p8ŒÙl®s.3™ ù|žÑÑQ¼^/º®7ÌÚvRÕj«ÕŠ×ë%“ÉN§ñz½ÛNo†{3\Ï;ÇÈȈìñÑ4R©D±X¤T*¡ë:f³Y:ï¹\Ž••677놮"½­e•ÃÍn·súôé¶ôí  þþþ:ë£ë:Ùl–b±È±cÇp¹\uYÓƒ†ÈápàõzY__'›Í>ÐRZk-ìv;ªªÊâ§ßïÇëõâv»)—Ëhš†¦iX­VÙ]°¼¼ÌúúúåŠíÎu]'¢( }}}X,–«é5ò… @ ­ß- Ï>û,ÓÓÓÒ•J%J¥årùCñawª‘-ã÷ûQUU&·úlµ>U*•bii ³ÙŒÇã! â÷ûq»Ý8y¾¶¶Æââ"ªªÖ o¬NµZ%“É077Çââ"Ï=÷œê jz[cÇŽ¾är¹ê> ‹ÅÂÑ£G™šš" âv»ëjL"ÿ#>DñÍ. °­-¤-µÜ7Ó@€þþ~ü~?år™ýë_,,,ÈöЬE¥R!•J‘ÍfY[[Ãåráv» Øl6VVVH§Ór¨Úîw•J%–––˜ŸŸ'‹ñÌ3ÏÐ×ׇ®ëDl逃ÁÃHQ”: $¢™ÅÅE’É$===ÒÑõx<¸Ýn™I¶ÛïíqW(ä!,„°Xº®S©Tê,×n3l6n·›ááa†††P…t:Íüü©¶á]U šÓ…ÅÖÏãñÐ××ÇÈÈÁ`B¡À•+WXXX “É iZ[Š´»A—N§YYYaqq‘L&C¹\fzzšÑÑQR©+++‹Ezzzä|1ǃ×ë¥T*a±Xp8u>R»»7E‚õPÚiÔ¾ÉR©$Ãúl6[÷-ЋE, @ŸÏ'¹\.Ùcã÷û±X,är9‰ñxMÓ¤³ÜßßÏ‘#G¤ƒ;??Ïõë×YYY©sô;Ž8×4ÕÕU™Œ,‹ŒŒŒpüøqz{{1›Íü••°Ùl8N, ‹E–kÜn7.—KZpŸÏ‡Õj­ûÂìVÓÛÉ'j—ß¹/€DX»ÛâJ[aa½(¬¯¯³±±! ¤¢²­iš\z®öFg2r¹v»P(ÄØØCCC8–––¸uëóóóäóù†Íë»ù?{=×uL&Ãòò2óóó躎ßïçôéÓôõõÉD¦˜æ<22‚Ïç“>–È® yl6•JEFl‡Ã!‡=Q¬­*ŠÒôð×®ÔʾÒ4­®‡§Ù©ÑcµÎh±X”Ï¥R)¢Ñ¨¬À ? Ñ^  ‰033ÃÍ›7e¬‘_’ÍfÙØØ R©àñxê>„݆ŒFµ³t:M$‘©]×9uꃃƒ8Ά ;›Í†ßï—]›"˜Ðu]ù|^‹‹‹u÷Îf³I_R¤*„ÅÖ[øŸ] (€¶Ï^,‚p¤Åc™L†`0Ä™3Ó˜Íf>þøcnܸA,ÛñïåóyæææØÜŒS©T°Ùl(Š‚ÛíÂï÷ …p»Ý¤ ·oωD0™L „="#µJ¥J©¤í1š±ZÍX­¶†…º®Ën…B!/óQbáÏD"ÉêêŠbÃl¶Ü/ù¸8uêãããÒ×l´|LW´Ôx=V.—Q…óçÿåå%®]»ÆÚښ̩l÷¡‹E"‘‰DM+1>>ŽÉd’s××ÖÖ€{óØ~¿_ö"‰ˆqëïu:ƒ½¸\Núúú$|PEÓJûþpL&°Ù¬X,nÜnWXÂréºN¡P —Ë‘Ïç1›Í„Ãa‡t¶»]áD׿^šf¿–J$øæææèüÛîgâñ8ëëë‹E{ì1úúú0›Í2XÛì¶´´D,c`` nmŸ­¿×jµ2<<,ƒá·ç¾SQ”èêN6@(bttTÂUk¹k¯½u°}$Âèý@³×çD‚o»Ù~6NËeVd­KdÎE´ eebb¿ß/ÁkñÔVæk[wk‡Üƒ”Ãá`xx˜`0H2™¤X,n{„Ù¨U0öÖN)„ÚÇ4M#‹‘H$PEÎUÛ®M# qöìY¸yó&±Xl×Z—°"×äp8dô $’ƒ¢Å¤X,î˜÷j×µuÜj¨vùOÕj•D"Áææ&Åb‘ÑÑQl6›ô¶~‡ññqÙØØ`ee…\.×Td&ò|>/¡ÿŠÉÂùÕ4­áœú}}V+===8ÙxWÙ6Š »&‘¸(:V£ÇÊå²l* …B8N*•Êæ[äU§P(0;;Ëæææ¶Nh£¿çt:)•Jd³YÜn7>ŸÑÑQFFF°Z­d2’É$Ùl–|>/ÃuÑW[hÞ«õ¹çÐeáVXŸR]ÐNNl« µú]×¥S,¢«z›C¡'OžÄn·3;;Ëòò²­ÙtƒÉd’ÓšUUezzš³gÏb6›I$8B¡ƒƒƒX,4MCUÕº£.MÓê Ì;ux<zzzÈårÒÛ ú®Âö:|Ôð&f…,//“ÏçSŽ·~óDTwüøqü~?«««rÑ̽ng –uq»Ý úûûq:|ú駬­­ÉL´(Oˆ‚j0”uÀÚ°|+Pb‹f³YÎíÄ»ÔU¨]µË©ªJ,#“Éàóùp»ÝÛ¶§z<ÆÆÆ%‘H033#穵šøÅÑx<ÎçŸÎíÛ·) u‹N‰Ìº˜"&RŠrE("ËhW$EÙCd©UU•T4ôÕ¾Ïí êº!L„‹µ+QXº®³¹¹I"‘Àf³É¶…Fy›ÍF8frr]×™ŸŸ—Å×ý$;ŹØP¥vŰ­Yõ\.'ë_µÎ¸¨ý‰É”¢Àêv»”ï5ŸÏãt:#‰Hj·këª!l»aä APU•T*E©T¢¿¿_& ù @€©©)zzz˜™™‘–b?ðÔ>–Édšª«ÕÞG1„ÕVÒÅP'Ò.ž×ë•‹W …]›Üºj«mìä@𦱱±A.—“­ Û…ì.—‹'N022B,cvv–t:ÝÑš^+?#†¯Ú a­Äº‰D‚¥¥%¹g³Ðv])ã @ÚÊx*•BÓ4zzz¶ºœN'ãããLMMQ,¹~ýú!{§kz­@Vk­Ä°\*•ê¦5û{»¦/ÞP- ;ùC­úJë Ç9R(p»Ý²[²ÑÐÕßßÏ“O>‰Ýn—ëÿ´3…ÐIKÕj?S×:Ñ[‡°½BÓ,H[Ë÷Ú ruxÑc³)Øl •J•JE dzyüñÇ ‡XX¸Ëõë×·Mv²¦×iKÕÌÐØ5¨ {…¦ËTûš\.G4­ûû÷šõªÕ ºÞ(d÷qúô)¦¦¦PÕ,·oß"™Lv4¡Ù)°öû|×ø@¡«­ú6‚¡ÙÇšµLUU)‹rõ§íÖ/ôz½ ‘Éd˜™™aii©å\ÖAÖô:YWSw²@;µË$Ÿ}ÙÛE\µ×ªª*Ÿþ9×®]#•J5ÕMÐ 5½NDz]å5köW3¹Ýné ‰ŸiôÍÖI×u–––Èf³²hkûj·Õô:e•º²£­ÂÕÌcbŒ˜ÙZ ³(x<Âá0LMMÑßßO6›åêիܽ{W&í¶‹ôsx뤥ê'ºÑc­µWß©6!˜ÍfQUUB#ÒýLNN266F(Âf³±°°Àòò²œ+_ûè¶š^'-UWX @ê$PµçV«—ËE.—£\.óÌ3Ïðøã399I(¢Z­’ÏçùÇ?þÁÍ›7I$$‰Z=÷›§zØÀêŠYÍÕ,,ÍúK[ák%NNNòý¾>YY¿sçsss°f3ç‡]Óët¤×5>P£úvƒj;(Zõ—Äb SSSÄb1þùϲ¸¸¸m˜Þjê°@êD¤×³2š…g/@íuÿööörûömfggå¦níˆôº¦wP‘^Wù@íöš±J[ÏËå2ñx|Û!ªÕHï jz‡5¼}¡:lǼÙDg;kz‡9Ìu@år¹mëÌts¤×ÉšÞaùOíZ9wß«s@‡éuª¦wX e2™Ã¨vïnö£Úéuª¦wX %‰ÃHUÕ¶-ÖxÐŽù^#½NÖô#Ò‹Åb‡X„[,ÒíÚo¤×©šÞAGz¹\Nöz–L&åü¥‡Mj¤'V<ë €Ää=± ÑìG!Ò“.Û¥¶lû­( £££mÏ1t£}ËåWv²Íœ·ã±FÔ7nÈ…Ö» ¸·gj__šö Q§áÚé¹¥¥%¹d×Ð××'—Z{TÕ. öW3Åb1¹Ê~×÷vði×2ú_4 öÑ~à‰Çãmuœ; QwÇY^^îÜûé@€\wÙÐáFÛq(@poúÀÀÀýµ“ T¤W.—eßwǯµ“Á½ }ýýý¸\.ƒŒpÌUU%‰tdŸÚCH¨§§‡`0hX£U.—ÙØØ •Jìµ@@ÝÖNBÒñ T­VI§ÓÄãñCYÜü@ªÖz{{å&¸†Z'“ÉÇÛÖ ÿÐ$d³Ùðù|ôôôÈY¥†vV¥R‘ëM”ŸÓµ ‰ej}>ŸÜÌP½4M#•JÉ~»Æë€¶†þbµGÝá®T*uËúv¥CßmÕFµ{¨>*0‰Õ×ÄÑÉm£¾ÐmUíF´v»ý ã|W«UŠÅ"ù|ž\.'—ªyhR  @[­“XÕ½v¿Ó‡ÅÂÔn²ò°ó…h»Ô€¢(r÷b± ÷aEwbk…R©${ÇK¥Ò¡†Ü@-Èb±ÈUÞPV«UîUQ{lÝ[K 1ÂBˆDØè¤vïR±órí¿‚¾ðêp Ƹ† € 22ddÈ! C@† € 22ddÈÈ!C@†:PѸ †ZTÅ ¬÷ÁP‹Ú4 Æ}0Ô¢þ× üq µ¨÷LÀ1à&]¼s¡®”œ4sÀ÷ÃÐõG`NL?讃Æ}1Ô„Ö€i *ò@Qà;€jÜC»H½ÏJꉗ€ˆq í`y.Ýge[õÿи7gÌ8ŒC¿ÏÄ[ì´BÁð2ð-àô}?ÉXNìÑPõþ5s?ÍóŸÀ|£þßûÀ$l„IEND®B`‚lft-3.8/icons/144x144/dest_closed.png000644 000766 000000 00000016751 12062431750 017145 0ustar00vicwheel000000 000000 ‰PNG  IHDRçF⸠pHYs.#.#x¥?v OiCCPPhotoshop ICC profilexÚSgTSé=÷ÞôBKˆ€”KoR RB‹€‘&*! Jˆ!¡ÙQÁEEÈ ˆŽŽ€ŒQ, Š Øä!¢Žƒ£ˆŠÊûá{£kÖ¼÷æÍþµ×>ç¬ó³ÏÀ –H3Q5€ ©BàƒÇÄÆáä.@ $p³d!sý#ø~<<+"À¾xÓ ÀM›À0‡ÿêB™\€„Àt‘8K€@zŽB¦@F€˜&S `ËcbãP-`'æÓ€ø™{[”! ‘ eˆDh;¬ÏVŠEX0fKÄ9Ø-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+®ç*x™²<¹$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóýxήÎÎ6޶_-ê¿ÿ"bbãþåÏ«p@át~Ñþ,/³€;€mþ¢%îh^  u÷‹f²@µ éÚWópø~<ß5°j>{‘-¨]cöK'XtÀâ÷ò»oÁÔ(€hƒáÏwÿï?ýG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)¬‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(¼ AÈa!ÚˆbŠX#Ž™…ø!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fº‘;È2‚ü†¼G1”²Q=Ô µC¹¨7„F¢ Ðdt1š ›Ðr´=Œ6¡çЫhÚ>CÇ0Àè3Äl0.ÆÃB±8, “c˱"¬ «Æ°V¬»‰õcϱwEÀ 6wB aAHXLXNØH¨ $4Ú 7 „QÂ'"“¨K´&ºùÄb21‡XH,#Ö/{ˆCÄ7$‰C2'¹I±¤TÒÒFÒnR#é,©›4H#“ÉÚdk²9”, +È…ääÃä3ää!ò[ b@q¤øSâ(RÊjJåå4åe˜2AU£šRݨ¡T5ZB­¡¶R¯Q‡¨4uš9̓IK¥­¢•Óhh÷i¯ètºÝ•N—ÐWÒËéGè—èôw †ƒÇˆg(›gw¯˜L¦Ó‹ÇT071ë˜ç™™oUX*¶*|‘Ê •J•&•*/T©ª¦ªÞª UóUËT©^S}®FU3Sã© Ô–«UªPëSSg©;¨‡ªg¨oT?¤~Yý‰YÃLÃOC¤Q ±_ã¼Æ c³x,!k «†u5Ä&±ÍÙ|v*»˜ý»‹=ª©¡9C3J3W³Ró”f?ã˜qøœtN ç(§—ó~ŠÞï)â)¦4L¹1e\kª–—–X«H«Q«Gë½6®í§¦½E»YûAÇJ'\'GgÎçSÙSݧ §M=:õ®.ªk¥¡»Dw¿n§î˜ž¾^€žLo§Þy½çú}/ýTýmú§õG X³ $Û Î<Å5qo</ÇÛñQC]Ã@C¥a•a—á„‘¹Ñ<£ÕFFŒiÆ\ã$ãmÆmÆ£&&!&KMêMîšRM¹¦)¦;L;LÇÍÌÍ¢ÍÖ™5›=1×2ç›ç›×›ß·`ZxZ,¶¨¶¸eI²äZ¦Yî¶¼n…Z9Y¥XUZ]³F­­%Ö»­»§§¹N“N«žÖgðñ¶É¶©·°åØÛ®¶m¶}agbg·Å®Ã“}º}ý= ‡Ù«Z~s´r:V:ޚΜî?}Åô–é/gXÏÏØ3ã¶Ë)ÄiS›ÓGgg¹sƒóˆ‹‰K‚Ë.—>.›ÆÝȽäJtõq]ázÒõ›³›Âí¨Û¯î6îiî‡ÜŸÌ4Ÿ)žY3sÐÃÈCàQåÑ? Ÿ•0k߬~OCOgµç#/c/‘W­×°·¥wª÷aï>ö>rŸã>ã<7Þ2ÞY_Ì7À·È·ËOÃož_…ßC#ÿdÿzÿѧ€%g‰A[ûøz|!¿Ž?:Ûeö²ÙíAŒ ¹AA‚­‚åÁ­!hÈì­!÷ç˜Î‘Îi…P~èÖÐaæa‹Ã~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DÞ›g1O9¯-J5*>ª.j<Ú7º4º?Æ.fYÌÕXXIlK9.*®6nl¾ßüíó‡ââ ã{˜/È]py¡ÎÂô…§©.,:–@LˆN8”ðA*¨Œ%òw%Ž yÂÂg"/Ñ6шØC\*NòH*Mz’쑼5y$Å3¥,幄'©¼L LÝ›:žšv m2=:½1ƒ’‘qBª!M“¶gêgæfvˬe…²þÅn‹·/•Ék³¬Y- ¶B¦èTZ(×*²geWf¿Í‰Ê9–«ž+Íí̳ÊÛ7œïŸÿíÂá’¶¥†KW-X潬j9²‰Š®Û—Ø(Üxå‡oÊ¿™Ü”´©«Ä¹dÏfÒféæÞ-ž[–ª—æ—n ÙÚ´ ßV´íõöEÛ/—Í(Û»ƒ¶C¹£¿<¸¼e§ÉÎÍ;?T¤TôTúT6îÒݵa×ønÑî{¼ö4ìÕÛ[¼÷ý>ɾÛUUMÕfÕeûIû³÷?®‰ªéø–ûm]­NmqíÇÒý#¶×¹ÔÕÒ=TRÖ+ëGǾþïw- 6 UœÆâ#pDyäé÷ ß÷ :ÚvŒ{¬áÓvg/jBšòšF›Sšû[b[ºOÌ>ÑÖêÞzüGÛœ499â?rýéü§CÏdÏ&žþ¢þË®/~øÕë×Îјѡ—ò—“¿m|¥ýêÀë¯ÛÆÂƾÉx31^ôVûíÁwÜwï£ßOä| (ÿhù±õSЧû“““ÿ˜óüc3-Û cHRMz%€ƒùÿ€éu0ê`:˜o’_ÅFIDATxÚìyPGûÇ¿»ì²Ê". x†ˆù‘‘”˜€¥`¨2‚·£‘D1X\â¢5""Ê!D#ÂcLRI¼KŽx QŒ$n¢}£JPÐÅ]v~p¼!rL/³Ëý©šfzf›îïöôót÷Ó€ *мÇàMË‚¢&>|Ãh9PÔd€ÔÃLQÍ" E-ø´(T@* 6¼ñÆØ»w/ÊËË¡R©À0ŒA*• •••8tè¼½½abb¢W"Ò‹¼9sæ0%%%L]]c¨Èd2æÖ­[LXXcjjª/¬ºA@ÀŒ3†ùã?cáþýûÌäÉ“¡P¨óÒùW˜……-Z„Q£FM¿ÂÎ΋/Æ Aº?¶­óCýúõÃÔ©SÁ0 x¼æÉååå())Á“'O è÷(LSSúõëŒ1¢í¼¯¯/ìììp÷î]* ž —ËaccÓî\^^âããQQQ‘H¿}  °²²BTT–/_ÞvÞÌÌ *•ÊpZ SSSØØØ@"‘@(¶µšÆÑÑñ…s¸sç@©Têý+ëþýûøë¯§=š·¢J¥µµµ¨ªª‚B¡àV@b±>>>øðÃáíí ±¸w'- …B­®V¾ÅúôéóÂù={öh-2™ ùùùøì³ÏðÃ?@&“q# ¡Pˆøøx,Z´ýû÷×ZËÓÝ7ÆP©ThjjêÕ<ˆÅbøùùÁÓÓ{÷îEll,«Ö½[+lÁ‚˜={6$‰Nˆ‡¢9x<$ fÏž °º§[-\¸´t,\¸›W˜››øüÿéìÆ8yò$jkk5nB+ ØÙÙaéÒ¥FY‘Ÿþ9¤R©Fûœ°´´ÄäÉ“1räÈæV…χ››7úwçî×_EBBjjj4>f£T*áì쬖€¼½½1a„^AAAòòòÔÐéÓ§ajjª±ü555ÁÒÒƒ jPGõÞc3¾•úúz<~ü¸íÃ5M}}½Z÷M™2½. µôüùs;"MòèÑ#ÖVqèߘ˜˜hÕy' {Tø½MOò¡-/»H$Rûmb°«1>|Øælìí|2+ íÛ·cûöíÔ¤Ò0tF"ŰTUUe´•Ój¬Å+,11/¿ü2çìíq·Þ$##ƒó>ÔŸþ‰˜˜ÝP```;?¥çxzzrþÌ›7or* Î^a†6Ài¨p]Oœµ@§NÒˆÙlff†ñãÇee_ºt ÕÕÕœ>óúõëº) eË–i¤% žT»‚’’ãèDk +++µî‹ŽŽÆªU«z=ÿ[¶lQ»Ï1`ÀjÆ÷š?Ò·|Pé©ùoènƒÊصkN:Õëùèh²<pûömܾ}›ÚíÆþ Ów¾¦PÇúÔÛÈÇÇG#Vƒ­­­Ñ (00/½ô§Ï¬®®Fnn®î (33³ÝÒ\Jω‹‹ÓÈ«KQrö 3æW>Áu=ѱ0#CgÇÂüýý5²z`èС8þ¼QVöìÙ³qáÂNŸÉµc“3ijî¯1¯†­¨¨@EE5ã{ÛõI†ˆ>„®1È¡ ‡””º–Ÿ H=æÏŸÈÈHÌŸ?ŸÖ0æææØ¼y3€æyÚæææ´–©€Ø ;;;Í^ìØØXZËT@ìprrBTTT»sQQQprr¢5MÔ=III/X."‘[·n¥5MÔ5¾¾¾ ìðZ@@|}}imSuŒ@ @ZZZ—iÒÒÒÔŽôA1p…††ÂÙÙ¹Ë4ÎÎÎøè£hSµÇÚÚëׯg•výúõ:±Ô‡ H‡øä“O ‘HX¥•H$Ø´i­u* f\]]ñÁÝ WWWZóÆ. ‡ôôtâÐl&&&HOO§ãdÆ. 3fÀËËK­{½¼¼0kÖ,ZûÆ* ¡PˆÄÄÄ=#)) fffTÆ( ±cÇbðàÁ=zÆàÁƒ9“C¤G¸»»sòœåË—÷XˆT@zú ゾ}û"99™ªÀXÍx.˜9s&&NœH•@¤>Û·o×»½Ú©€tWWW,^¼˜Ðÿøî»ïˆÒoܸ–––TT@@QQf̘¢¢"Ö÷ 8ü1U„¡ ˆ4x¹J¥BXXX»Ÿl …‹‹ U…! hÍš5DésrrP\\ (..ÆXß+’’BUa( Ä[o½Å:}]]V¯^Ýî\ll,êêêX?cÒ¤IN¥è‘€úôéC¼]Ó† PYYÙî\ee%6lØ@lÖó’jƒPdd$† Æ:}ii)222:¼–žžŽÒÒRÖÏ6lØ Ëƒ(z$ {{{âQQQP(^S*•Ä‚X³f ìíí©BôQ@¤K’Ož<‰'Nt™æÄ‰ݦù'æææØ²e Uˆ¾ ÈÃÃï¾û.ëôJ¥ÑÑѬÒ._¾J¥’õ³ƒ‚‚àááAU¢/âóùرcÑtÓôôtܸqƒUÚ7n ==õ³y<vìØ>ŸŽøè…€,X@4×§ªªŠØÂÚ°aþþûoÖéÝÝÝñþûïS¥èº€,,,@tO«'$$ ÃtyH¥R;¢µk×}ΦM›`aaAբˊ‹‹# *~åÊìß¿_­ÏÚ¿›·š ¶¶¶‰ÙLÄNNN #ºgÙ²emã\l"¯ßºu«íw•J…ˆˆ¢·ááá4LŒ® (%%…(Dðõë×QXXØ¡8:ãéÓ§íþ.,,Ä¡C‡X¦P(¤ãdº( wÞy~~~D÷pòÙ+W®Ä³gÏX§÷óó#Î+ …ضmñ}$•ÞÄÎÂääd&FWÞmXM“œœL´)œ³³3ÂÃérz[@666œZ6¿ÿþ{—×;Û.A.—ï8Mj1Ri]ò­|ÿý÷ÈÏÏgÞÂÂ7n¤êé-¹»»#88X§ "<<¬Ós¶B– ˆ‡ÔÔT_’J¥Ø½{7û‚ãói˜˜ÞÐܹs‰¦©ÖÔÔpb™±ÙhmýúõD²7sçÎ¥ÒæææHJJ"º‡­ó®»‡ß|óM·Ïxüø1Ö­[G”¿¤¤$£ÞNA«Z¹r%Ñ,?©TŠÃ‡kµ@öîÝ‹k×®±Nooo¯Õ01<¯ÃÃà4lØ0¬X±‚¸cÛÔÔ¤ÕñññAYYÑ=ÑÑÑDó·{"???|õÕW¸~ý:îÝ»‡ . <<\#;f³A ­Ú¶mÑJ‡¯¿þùùùœo{Ýýû÷Grr2¼½½1|øp¢{[WL:Ucù³²²jÛÂÊÑÑ±í¼ƒƒœ1~üx$$$àÊ•+†' ‰'®\.ǪU«ˆ>£+Gâ;wº¼×ÒÒ©©© ‚@ ÀåË—QXXˆÐÐPÖÃðööF^^çågjjŠéÓ§céÒ¥H$8{ö,Μ9™L†Ñ£GcÖ¬Y˜6mär9"""ðèÑ#Ã@ šFÚÚZ‘ /À“'O:½&“É:½&‹1eÊ”¶Íévî܉ƒâêÕ«¨««#êT§¥¥aôèÑDþ$6´F‘H$8yò$âããQRR‚ÆÆF <ååå E@@Î;‡={öNhÉ’%DëÍ Ž;¦µpttÄÂ… 4Ï+ŠÇÅ‹!—Ë‘˜˜ˆ{÷î±~–‹‹ BCC9Ïã˜1càææ†²²2$&&¢¸¸¸M¤÷îÝCZZ~üñGˆÅbN'Zˆ"‘¯½öšÖ ÀÞÞÉdرcG;¿S}}=±…‡ršÇÖHüUUUíæAµRUU…«W¯ d8Ú¸q#Qa¶:µiQ˜››C$¡¡¡R©ô«ïË/¿Ä¹s爾4\“ÉårÍ1;rƒˆD"XYYµ+C½‹‹ QÔ/•J…€Z}ˆÌÌÌN¯µ~;;¢©© ÀÇãÁÌÌìŸ Ã0' ³xñbN[Ñ»wºŽŽŽ˜7o„B!ø|>x<&L˜€I“&A¥Rá—_~1 ‘nCPXX+++<þü… 𤶶555‰D;vl‡{µ—”” ;;›õ3MLLššÊY‹ŠŠpäÈôëב‘‘ˆŽŽÆÐ¡CaeeÄÅÅÁÅÅ¥¥¥8xð þ ˆ4òi}}=aii‰S§Nuøž×åååÈËËCß¾}±lÙ²Nçùddd95'Nœˆ™3gr’ÇÊÊJìÛ·—/_†µµ5Ö®]‹ÜÜ\\¼x™™™xóÍ7Q[[‹ŒŒ ýoúôéCýôSÜ¿_?úq]NNNŒ\.§æ’–¸{÷.Æ˜šš²¶„zóè¶”””Äzæ…'Þ®]»´Im#€­O¡¨Ý¢Pº‚EMT|h9PÔä1ÀZ5ùƒ –EMry†¸ -Fl¥FòüÀç´<(„ðßÖ¡u%èx… ¸¨jõU˜ @FË†Ò ²­Tí‰?ðPIˈÒEËãÓ¢•N±°€z0˜G­-šxa rWÓ ‡˜àÿ×ÒO¢Ó¦åu£ÅÍónðÿ6ÙœÈìPó)IEND®B`‚lft-3.8/icons/144x144/firewall_smart.png000644 000766 000000 00000044673 12062431750 017674 0ustar00vicwheel000000 000000 ‰PNG  IHDRçF⸠pHYs.#.#x¥?v OiCCPPhotoshop ICC profilexÚSgTSé=÷ÞôBKˆ€”KoR RB‹€‘&*! Jˆ!¡ÙQÁEEÈ ˆŽŽ€ŒQ, Š Øä!¢Žƒ£ˆŠÊûá{£kÖ¼÷æÍþµ×>ç¬ó³ÏÀ –H3Q5€ ©BàƒÇÄÆáä.@ $p³d!sý#ø~<<+"À¾xÓ ÀM›À0‡ÿêB™\€„Àt‘8K€@zŽB¦@F€˜&S `ËcbãP-`'æÓ€ø™{[”! ‘ eˆDh;¬ÏVŠEX0fKÄ9Ø-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+®ç*x™²<¹$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóýxήÎÎ6޶_-ê¿ÿ"bbãþåÏ«p@át~Ñþ,/³€;€mþ¢%îh^  u÷‹f²@µ éÚWópø~<ß5°j>{‘-¨]cöK'XtÀâ÷ò»oÁÔ(€hƒáÏwÿï?ýG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)¬‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(¼ AÈa!ÚˆbŠX#Ž™…ø!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fº‘;È2‚ü†¼G1”²Q=Ô µC¹¨7„F¢ Ðdt1š ›Ðr´=Œ6¡çЫhÚ>CÇ0Àè3Äl0.ÆÃB±8, “c˱"¬ «Æ°V¬»‰õcϱwEÀ 6wB aAHXLXNØH¨ $4Ú 7 „QÂ'"“¨K´&ºùÄb21‡XH,#Ö/{ˆCÄ7$‰C2'¹I±¤TÒÒFÒnR#é,©›4H#“ÉÚdk²9”, +È…ääÃä3ää!ò[ b@q¤øSâ(RÊjJåå4åe˜2AU£šRݨ¡T5ZB­¡¶R¯Q‡¨4uš9̓IK¥­¢•Óhh÷i¯ètºÝ•N—ÐWÒËéGè—èôw †ƒÇˆg(›gw¯˜L¦Ó‹ÇT071ë˜ç™™oUX*¶*|‘Ê •J•&•*/T©ª¦ªÞª UóUËT©^S}®FU3Sã© Ô–«UªPëSSg©;¨‡ªg¨oT?¤~Yý‰YÃLÃOC¤Q ±_ã¼Æ c³x,!k «†u5Ä&±ÍÙ|v*»˜ý»‹=ª©¡9C3J3W³Ró”f?ã˜qøœtN ç(§—ó~ŠÞï)â)¦4L¹1e\kª–—–X«H«Q«Gë½6®í§¦½E»YûAÇJ'\'GgÎçSÙSݧ §M=:õ®.ªk¥¡»Dw¿n§î˜ž¾^€žLo§Þy½çú}/ýTýmú§õG X³ $Û Î<Å5qo</ÇÛñQC]Ã@C¥a•a—á„‘¹Ñ<£ÕFFŒiÆ\ã$ãmÆmÆ£&&!&KMêMîšRM¹¦)¦;L;LÇÍÌÍ¢ÍÖ™5›=1×2ç›ç›×›ß·`ZxZ,¶¨¶¸eI²äZ¦Yî¶¼n…Z9Y¥XUZ]³F­­%Ö»­»§§¹N“N«žÖgðñ¶É¶©·°åØÛ®¶m¶}agbg·Å®Ã“}º}ý= ‡Ù«Z~s´r:V:ޚΜî?}Åô–é/gXÏÏØ3ã¶Ë)ÄiS›ÓGgg¹sƒóˆ‹‰K‚Ë.—>.›ÆÝȽäJtõq]ázÒõ›³›Âí¨Û¯î6îiî‡ÜŸÌ4Ÿ)žY3sÐÃÈCàQåÑ? Ÿ•0k߬~OCOgµç#/c/‘W­×°·¥wª÷aï>ö>rŸã>ã<7Þ2ÞY_Ì7À·È·ËOÃož_…ßC#ÿdÿzÿѧ€%g‰A[ûøz|!¿Ž?:Ûeö²ÙíAŒ ¹AA‚­‚åÁ­!hÈì­!÷ç˜Î‘Îi…P~èÖÐaæa‹Ã~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DÞ›g1O9¯-J5*>ª.j<Ú7º4º?Æ.fYÌÕXXIlK9.*®6nl¾ßüíó‡ââ ã{˜/È]py¡ÎÂô…§©.,:–@LˆN8”ðA*¨Œ%òw%Ž yÂÂg"/Ñ6шØC\*NòH*Mz’쑼5y$Å3¥,幄'©¼L LÝ›:žšv m2=:½1ƒ’‘qBª!M“¶gêgæfvˬe…²þÅn‹·/•Ék³¬Y- ¶B¦èTZ(×*²geWf¿Í‰Ê9–«ž+Íí̳ÊÛ7œïŸÿíÂá’¶¥†KW-X潬j9²‰Š®Û—Ø(Üxå‡oÊ¿™Ü”´©«Ä¹dÏfÒféæÞ-ž[–ª—æ—n ÙÚ´ ßV´íõöEÛ/—Í(Û»ƒ¶C¹£¿<¸¼e§ÉÎÍ;?T¤TôTúT6îÒݵa×ønÑî{¼ö4ìÕÛ[¼÷ý>ɾÛUUMÕfÕeûIû³÷?®‰ªéø–ûm]­NmqíÇÒý#¶×¹ÔÕÒ=TRÖ+ëGǾþïw- 6 UœÆâ#pDyäé÷ ß÷ :ÚvŒ{¬áÓvg/jBšòšF›Sšû[b[ºOÌ>ÑÖêÞzüGÛœ499â?rýéü§CÏdÏ&žþ¢þË®/~øÕë×Îјѡ—ò—“¿m|¥ýêÀë¯ÛÆÂƾÉx31^ôVûíÁwÜwï£ßOä| (ÿhù±õSЧû“““ÿ˜óüc3-Û cHRMz%€ƒùÿ€éu0ê`:˜o’_ÅF>æIDATxÚì]uXTYÿMÁÀ C—(v¯k¢®ºêºvwv¬ Šb¡‚.vcb¯ñ©‹… Š…¢ˆ"Ý9ÔÌ3ó~³t[»¼ÏsžfÎ=÷Ü3¿{ÎÛ/¥“9€¡~`À€2jé¿@Yb„ðàž÷w…HÀa9¨¶Õ¶<,ÎÃF™Ô@tí‚Õ¶RZdFÄ(O¼Ú¼–Ê LÝ<- =¯Õ®O-U€b4ÀÊû`7›Úu©¥ ’ZÞ¦s… €@ìÚu©¥J@=&€Ñµà©¥*À8&€nµkQKU¤îL–µëPKU¤† Ôj˜k”tu´¡¯«…Äd!2ÅYÈÈÈø·>ªœ\Q-ÕñT¸˜>m*þXü LK‡Hœ…ĸh$ÄÆ :.)iûüñ±1ˆŒG²0 q1Q‰DK²!§ïç¨Õ°V³q••hÚ¤ñàïG•&¹œR“(<ø¼§c{ÿ$@ Æóüµ¨N=b(=æM5AwnݤS&Ò=;©[—εú7·_:w¢Û7¯×pÞú½¢¹³fМ™Ó)èc õûý·Zý[Û6­éâ¹ÓD²œj')!žœ68Òˆ!éÖÍk…¾ëÓ»g-€þM­žU:qôeKÄÕŽ\&¥“ÇŽÐÀ~}hÇvefëó£¨V]àó0yÚthjéT{¼gÞ°sçðøjpÙ¶uêZÿðkT»Ã”Ðôtuhíj{ŠŠ¨>':2œ–þ±€ôëC·ÿw£ÜþµGØÜ÷íE‰±Q5œœl Ø»›zõèF;ÿÜVâqõ#¨ö+Bzºº¦¤`ÅÊ•ÐÔÖ…›#}]XÔm-=¨ó¸ÐèAGß £Ì±îßýÎ[·ÀÄÄ{öîCºõþ•ÕZ`inŠÅ,Ä¡#)ÉFDðG$&Ä!&> ))xïq™™HMÏ€L&Ÿ¯©4ª\eô `l^j|Xšƒ¯¦Ž“'O">>‹þXŒn=zVz>,«@?éhkaÉ‹0uÚ4èèé+>¯ciQê5‰)‰qHI"1% Éɉ qùÒœ¿z0wöLœ8å«òKœžš‚¸¸ØZ&ú{nùºs³tÀú½ô¥Þ={ü[Öùß+K :°weID5œ§OÓèáChÚ¤ ôþ™}óäy«¸¥>!6šΛMJ65jØ€ºtêX  ï©ikjоÝ;Hž“U#À‰‰Š¤åKQ¿ßzÑÅ ç+t×Ý[€îÝþÇ\‘-Ñž’±¡>)+qh­ÃjÊÌH§í.Î?üšÿ«ô@ºÚšŒ†ƒÃjtaU¿ x|>4ÕxÐ×@[`“Yî8Òì,œt]ºõ¨ÒœV9n„ ›Uv+°`áBhëÏŒBr9Æ¿6uH2Ó LNFB²R™Á~˜3wâS3!ÿõûu,Ìi·ë6J¦Ô€Xž@.›7Ñü9³¨nݺT¯Ž9‘\Véq23ÒhóGÒÓP'.@Ç ¢—ÏŸ•yãšÕtÛãR™}ž?õ¦y3§ÓN×í4k¦m-]-&YKƒÖ®¶£¤„øjG"ʤý{vÑı£èÆõ\‘»g¯^ÔȺN¥™pËQ«¦M5kÔ€NŸ:A$——{]Y ùLKΣ©ÇÑËç¾DDäààPËDW…ÔxtõˆŠ@l|RÒ2òÂÄ8ddŠ@,eäädƒ)ÏŸÏƒŽ¾1TTùÐÖàÃÈP–u€¯®wïàÒ¥Ëhósدv_]£ÒàÉHKÁÅsîØæ²Ož=GÛŸÂÙ³gaÓå—LyÒ‘q…Æõ¸r Žk×âÕ+?´oßkÖ®E÷_+ï'Íf³ky üÖã—.tç‹-—Éä”&L¢ˆÐÏôòÅsºÿ>w?AGì¦uk쩎¥éèèФq£)*"¼ÊÇ^Ï^ÿ„Òt´iï®%F¢F„…:âæVæxïßúÑÀþ}cŽ=‚r²«hè•IÉvÆôZ¨eó&tæäq’K«[ðŽ–/YD»wüI-[¶¤c÷ViœðÐ`Z0{&©2@jÊšm;ÂCƒKퟠC‡—ø}B\ Ù-_Jj|Õ«kE‹æäjW­XV¥ù½|æCƒú÷%&“ùßu]+:´oID™ÕNlt$­Yµ’æÍ¶¥'¼ˆˆ¨k×®äVIeKÄt`ÏN2ÑÓÎÝ»v¦‡÷ï–{]i’ædÑq·Ãd¨/ ›E,œO©)ɑۭÃêJÍ/!.†VÙ-'®²Ò×H_O—¶mu¢”¤„j''KBG¤)ÇÓñ£G 666ä~âX…Çzpïo²i׆…±Ø·‡²*˜8!@‡Q|öØëuêÐŽPïž= ù^xûšÐÑc›Ÿ\–CgN s³ÿ®C™¦¦:Ù-_BQ¡5"–?¸û7Íœ6…VÛ¯¤è¨Èbß÷íÛ—îÝ»W¡ãjÆä‰Äˆ§Ä¡ysfQDXH¥æB ƒŽº¹Q€ÿš4n ±˜ ²03¥“ÇÜŠésòtüÄñrÇ~þ̇zõèþßõH䩪мٶø¾F€òù-Y4Ÿ¦LGÞ•Ú¯ÿþäååUê÷bQíÛ»‹Œ ýÞëWzõâyóúÄ‘2—K–f&¤©ªL,&“/Z@I q%öÿðöUn¬ØÉ“eËQ4w¶íQ3±XL5|½yõ¢F€#ÎÌ m[hPÿßé˜Ûa’—ãbÑ¿zøða‰ß]÷¸L?µjAl“Ôø<â°Ù\¥y¥ ShÕò%ÄÎ{õ,×m#@§Kõ‘ˆóÜ] È@ GçϸӚUvÿ- :ˆ^•³ˆ•¡kW.ѰÁhéâ…]±,%èÝ[?3j8 Ö­ZЯ´xî Rár)..®JQ£?5ËuÛhX׊Žu#¹LZîuù:wæt¡Ïÿ¾}“š5mL €ΟKqѹGóÖÍ›ÿ>ÑÚÚÚPUU…‰1¼ÝLJ€hêêCSMú]héÀSS§e>¾÷Çî]»Ÿ˜€E,A»+íN ɉ Ø»g76nr—ËÅ.×í˜2m:¸*ª¸xÖr’C.—Wx\¿—ظ~=N_¸6 K/Â’¥K¡«W9k¹ªª* (0ö«Váìù‹°éØ>Oáçö ¸ºÊþšèbÓ¦ ðGxd4DY9ˆò{èˆP¤eJ ¤ÂCFj ”ÙLhjëB[`žŠŒ 02³€†–.´5Õ¡ÄáàØ±cðòò¨ѣ1tøˆrM%')!‡öíÆºNˆÄÔÉagg‹:VŠ~29A™ÃR´º©)IصsþtqAJZ&F Š%Ë–¡e«Ÿ*gug±Àb2à÷êž(Þ¶êÐûwohâØQ4bØ`ò~ìUáë&ŒF;¶m)äÅ·`î,b³˜¤­©AΛ7ª†Ó¯O/Ú¾yCÅ£YŸ?UTɱ07§ãn‡~×/^¼ .]º««+EDDL&û.ÁSDùäääD†††Äãñ¾®oh ‡éÆ"E˜ ûµëÀRI84tõ¡¥­–: ``j Mtµ ¡©Žra†W˜’ çÍNxùê%† “§€Á¨œ\Îãñ eâØáƒØè´Ñ1;z$×ÁÒªxên9<$'Äaë–-Øwà Àj»˜=gFÈÉÉÁÙ³g! qúôi~Q‘½¦H.—çFÏæmY¶lLMMaooøøxdff~&Ú@ ‡5NÛþÑg‰‘”˜€˜øDˆÅ$D…âsp0ž¾ôƒÜ÷b#B)ƒËS›Ã‡IPRVÁ+??´lÙ§NŸ­R55uœ8y ÷íƒÏ«·hѬ)ÜÜŽ {Ù1””ËÚH†ãGÝà¸n=>‡„îÜúzôÌuñõõŲeË0mÚ4̘1ã‡NQ[&“Éd‚Á``ôèÑpww}=Éer@– °rõ&e›Á@aF(î $‰•“ƒ¤ØH„……#!% î§NÂØÈk7Ti¢>â‰Ï3¼ô{ muìØî‚ÉS¦‚§¦^Ž­äî‰×}88¬Á½‡±hþÈI—í®04ÊÝaÜÝÝñðáC:tæææ?pJ‹ÅBrr2¬­­qëÖ­ïÛ¦¢ª š°ªß8÷˜HNFTȧJ—­[±÷.ˆ¥„™Ó§âÅK`U¯‚µF‹Ø–"B?c³ÓfìÙ;´ƒ×ƒûhß±3¶;oÍݱØ,…¼k×.°Ùìo¢ãùëàĉ5ú2|5“®D"§ZáþÒì,¸Ü.:ÀÅu'4i†7¯cÏþƒþñ“gfÀeË&4kÞ/_ÁÁý{p÷^.x +; , ‹qýúuàôéÓø·\.Çï¿ÿŽ^½zÁÔÔôÇ p+èváyçèû[oLžn 9ؽÓ=BÏÞ}*©d#=MˆËÏãçŸÛ`ñ²•7n ž?÷Å”é3ÁQR.´ÕsØ,ÄÅ'àìÙ³8þcê¤ ¸ìq ÆÆ&8°wþþÛ³Lð€¾!–­°Ã¦M›põêUðùüb Ìb±Àf³--- ÿýw¹x¿§h„ hÕªÁ—ߘL¦B«ÖÄI^@$Çù³§áqå :w튽@E•—gkS³’¾Ù1öíÙ ›œ”„93m±Òξ‰ BÃ#0}út,_¾ryñØ1ƒ¸¸8x{{ƒÁ` --Mq$ôèÑ£Ð5›ù»Ø—¶—´‰• èèh˜˜˜ ** 111_@I)B\ºx&F055ƒ¦®>¸\eT6n E¼ížy?†ûÉàóùظy LÌ,ЍdPV®¸«êß·n`µÃx?õE×ΰyóüÜ®}…¯‹%0`öîÝ["xòwŸ>`ذa033C×®]ñöí[ 8Pñ²å?cIž…_8ï]D]fóC€nÞ¼‰¨¨(èééÍfWëø-@á‘ÑbD¥ò€Š –y•šK‹Z•Ëåhݺ5Ο?àà`,[¶ Э[·w‚?â—Ü}Šîvç‘ÿ]¾fšÍf#++ ~~~àr¹àóù …_ž‰&é™"¤g†#<<ž>/üv2™ÐÒTƒ¹™9¬ëÕ…ž¦Z®iC[õë˜!48×®y ðÃ{Øtî‚UkféµÑsr²ÁV*ÝyL’™Ž}ûöbíº ¦¦¡«MG\õ¸5 ͪñhB!?~‰D%%¥A$—ËÁçó1hÐ ØÙÙÃá@]]fffˆ…@ ø&~ÉåÝ‹Á`€ÅbA*•B.—£sçÎËåøóÏ?¡§§÷uTÉär$&§ÂÈHŽÍ›‰ØøDD‡áÎ;3ØX¾b%  &»üXy’˜¥ì浫X¼x "££±iãF¼yóY™iUOHÐGØÛ¯ÂeXYY!''ÊÊÊ¥?gÞQdooŒŒ ˆD"¬\¹õêÕƒ£££â¯ŠS}Mh›Ëãgår9š5k†fÍš!(({÷î‡Ã©V…µÎÚtl_#®ËÍ¥k× »Ž¼~ùœôý1Œrs-Y²„&ŒQÉô1éä´a©«ñIÏ#G‡Õ4bÄ’J¥òï!"Ú¾};±Ùl²´´¤¨¨Ü,"iiiôéÓ'JMMýê~Bòr ¼ÈåòB}£¢¢ÈØØ¸Zn5®ò{óýúõ…‰¾.ê×·†ž¡ Ú033‡¶Àêjü ù#3 …%=!6Û·¹`‹Ë64iÜW¯^Fß~ è7r Ä­¸¯ôµ+—`¿jü޾ÈaC°aýz09Êx÷îb«/‹×`0 Åž={```€­[·"++ Àƒ`kk«°Úm½¬]¨àŽ(“É`dd„_ýGý~‰iéð¼s‹-„ÀØñ1ðáƒä ²$b0eYPÓÒ… _¦ú:0³¨]c t¡ohž€«¬Œ¸è(ìr݆õ6!+;ë×bþ‚PÍëSpa*Â4¾÷dž pÂý Z6o†[7¯¡gïÜ8®óçÏ£[·ne;ùÒìÝ»Ÿ>}„ °qãF|üøvvvرctttJ•侯QVT"+*ý\KK )))ß@j|>l§OÁüù `\D,YN$DlD""Âàÿá#âïz"]˜ &W Òì,èëjâÉS_¬ßì‚™Æ ¦M›`U¯~ÉÚ`& :z‚2äd¸þù'¶nÛiއöïÁøISÀÉÛ SRRpûöm 6¬ÜÝ'Ÿìííqýúuœ;w7nÜ€M1)èkSI * < #7uLRR•ÁScRár1qÜ,X¸Ö ›”®öç(ÃÀÈF&hÚ´I1VL"É‚8]_ßg¸}÷¬­­áââŒ^¿ý^æýY,ttJò/’ãü™3pX³D@ïî]ñ)$S¦Ï,|¤]»VjrA)¦ C"‘@,cÈ!°±±——ÒÓÓ‹…¡C‡BSSó«ïDe©" ®Ù‰'píÚ54iÒþþþ߆‰¶ðéíë5æ'}íêe9l¹nw¡ôTa…®Yºd 9;;úì™ÏêÒ©ñUUhÁÜÙ”&L¡ÿ]½@5(æî¹~ýzJHH(ÕMµ(szñâE23û'oëÖ­iâĉԽ{wòð𠘘 …”ý]»¼fffÒàÁƒIUU•ÔÔÔ¾.­®¦†õëA›ÇÁÑãÇé!hkiÁÐÔ|55èiC_ßÚC¨ª¨@•§Z¦öúÕ _8oÙ ¾ºV¬\‰f-ZUjÛνc¢"°Îq-Ž?‰¶?·Áƒû÷Ð*¯þVZZÔT¸Åðx<Èåò’ø‰®]»büøñظq#ˆoÞ¼Á„ àææVì(ù)_±©ªª '''\¹rÆÆÆHOOÿzG˜™¹9žxû@’#C|T8bc¢Ÿ‘HŒÏïàý0Ùr€Íæ >&ÊJJÐÖ3„ -5UÀØÜ |5uxÞ¾ ??? 1*Y]¸**xç­Ná¼m;Ø,ì߇±ãÆJGD%&víÚAAA6.¦¥¥AUUU¡á]»v-æÎ«n‚‚‚`hh§àG¾'Ê7iÈd2Ô«W£F‚Ï×åär9˜,xl,ëZò®uiA¤$%"I˜†¬¬lD„|DXX8¢â’›7n€¯¦Ž+× \É4-ùã'%ÄcϾý€9³láàà]A‰ožJ â~³fÍàèèˆ6mÚ€Ãᔩôöö†­­­¢XXXäiÏspøða˜™™ÁÜÜü«k¤«ªÁ^³f ºwï%%%dgg¨Q£FŠ$HÕ¡niê„1UºÖç±õêÑXLõþµùú<)³ÿéãG¨ïî%~wï®' <˜Ž9BYYY ~H&“)šD"QdÄPVVV¬Å/¿üBžžžôøñcJH(¹¤Ã÷ÈI¥R?8cÆ ÒÑÑùñLI¥ÒJ%:€¸è(lݺ®»vAOWn‡bÜ„IŲ–¶}}þ:+VØ!C,Á‡0räH()))Tÿ2™ sæÌ¿¿?ÒÒÒ#¼~ý^^^˜?>455Š—/_"11b±FFF6lØwÇäï&L˜Ÿ*eóø¦;ÐÝ®4îì õ•fgÑ‘ƒûÉÌĄВE (!.¦Â÷:}ü îÛëŸ2J¾Oé·ž=r+õtÿ…|? ÆQHHáÚƒ)CBBŠåÞQRR"ŸÜâ*wîÜ!@Pl½6mڤ澗ݧ %&&RÛ¶m+ƒoÎÝ1ˆ`Y siôèÁ=ôïד§Í@‹Mñò™¶¸l/‘×)U÷‘÷Æ ÀÜY3ЮCGø¿ÃöáÖÿn¡N½†`0˜ÐÓÓ+U‰¸wïÞb†Ç6mÚ mÛ¶xýú5&Nœˆøøøb÷^±bÖ¯_‘HTáʃ £÷c~« %eQåbyf¯fʨô&—É*Ý:ôñN?·£Ç LÏÄkWñ[ó5³ÙlÜò|€›Mš"[N˜=k&–/_¡ðX\µjÌÍÍÁãñÁw!!!hÚ´)àÇØ‘—Lª uîÜÙÙÙ8þ<¢££annŽðððb ôêÕ«Úk33³2ÍL&L&oÞ¼«««ÂŠÞ±cGüüóϊ㿺ÊF"“ÉTäg¬ŠƒY•ްÆ׈âp¯«3¹ºº–˜cÛV'Z0g&=ó~LO¼P×.]ªt¹4'7_³E®òï×_ºÐ“G…ëj¤¥¥‘ºº:-[öOUAGGGb±X4tèPÊÌ̤Q£F)žêÔ©tñâE²¶¶¦uëÖѤI“ÈÚÚš7nLݺu+3s½zõèÀ &½$%Ÿ\.§åË—“’Rábsl6›ÆŽ«¨õQ1ú2™ŒD"ýüóϤ®®þuÒü6lØãc‰äÕãƒöü¹µ€¤99tþÌ)š=c*9u\‘ÜàÍÛ·Ô§g 7)¤‘ö~D½{t#dnjL÷í&YNv±~QQQ¤¤¤T¨`ËîÝ»ÏëììL¤¢¢BêêêôìYnqooo2dH±\…¨iÓ¦Ô«W¯R×pΜ9¥¦÷upp(sý[´hAÎÎÎ Myu”ŸÉÃÚÚºÐü¿(€X, ô¨EÓÆ4xð`Z0{íÝù']óð _o/Љ%±X\f¾"¢ÝÛ·Ðþýû‰ˆè‰×Z½r¹lÞHñ±Ñ…놾|ICö-w¼‚e1/œ—;WƒæÍžIÑò?«¿Hººº$ ovRRuïÞ]á/ãááA†††Ô¬Y³B׎7ŽÐäÉ“©}ûö€ éëëSË–-Ë\ÇGb¬‰ˆþüóÏRûëé鑾¾¾âÿ~ýúQZZZµv"¹\N"‘ˆš5kVi“F•y ™L†˜øÄÄ'àõÛw…™?|>zz˜ мE+hëèBOK Võ £g}]-›‚ÁdÁëÁ=ÄD„"++ ã&LBÃÆMJ8¯ ª*\”çÌ/—åàä±cX¹j¢¢cÑã—.ptt,–ÿ¹ ‰D"ØÚÚbÚ´iÐÐÐP(µµµÑ¾}{xzz¦NЏ¸8¤¦¦ÂÛÛíÛ·GXXbbb0wî\4hÐ@Ñ—ˆ‡¸¸¸R﫬¬¬¨£‘Ï£ÃÎήÔk´µµ±xñbp8L™2ÙÙÙHII¿y¶Ëú-UTT0sæLlß¾½R&/ÂD€ôŒL¤g„ 8$Ë–-‡††B‚ƒ…§ÞO˜¦’*B‚ƒ¡§§‹~ý(lV¥I ù‰8K£§Þ±|ÙrÜ÷z3c9´'NƒUöc~üøÏŸ?ÇöíÛ‹i;tø'y„P(„©©)¢¢¢àåå…öíÛ#>>ÎÎÎPSSCïÞ½–›åCSSŠÿf.***H$X¿~=ºwï^H7$‹ eÎ`³Ù…ß1mÚ4ôèÑfffÕb¨ Äb1¢££Áãñ¾®5¾¼Æa1éÓ{¿ ‰DL‰qÑ:’|}}ÉvòøRj˜†Òô)‰ËU&5>Ö­YE q±/É.“QïÞ½éÂ… ÅŽ“ÏŸ?SçÎI P¿~ýÈÇLJ¸\.ÙÛÛ+˜ïcÇŽ‘±X,b0Äd2éÂ… E}ûö%CCCZ´hyzzÒÓ§O)<<œž?N‘‘‘Åø©TJW¯^%²´´¤_ý•üüüˆÅbª_¿>=z”:vÌÍwݲeK‰DÅÆÉgÄ+ÊhËårZ½z5ijj~_U›9l&…||Wmi홯/ÙN™P€¢LÚ¶eéêh›É %‡öïßW5f~Ïrww/ |—777zþü9ݸqƒ¤R)ÍŸ?ŸâããÀž1c†‚ùœ?> <˜6lH«W¯¦û÷ïÓåË—iÛ¶m4kÖ,Z·nÍš5K!E•ÆÔæmñóË}ùnß¾MnnnûÏ‹1lØ0š2e eeebÄKò®€ÈÆÆæû2eHe„³ç¡‘µ ŒManaC=˜˜Y@S[jür˜‚NPùtýÊ_X³ÖÏ_ùaÌè‘Xm·ãÆŽ©p‡‚$LNÄ ß§ÅôKr¹ªªª …øôéFŽ ™L†-[¶(ò_7oÞ6l€’’LMM1pà@hhh cÇŽptt„‹‹K±dN;wî„@ (õØÉÿ\OOïß¿GûöíѨQ#ØØØ 66l6:::رc.^¼X¦çdQ |Y|ŽŽLL*—ù‹ˆˆpûŽ'?~‚©“'§ÄÆ«gO Ê‘C”š @ ¨«ña¤¯ ‹º  ¥­ #}=è ¡œ—Çã!''^÷þ†ÓæÍ¸qëo´lÞ7®]Áo¿÷ÿÇڮĩÔé}Öý$Ö®Y Ž sç/,QÙ6qâD899aàÀàp8…’§s8ÅYž?XZZbÁ‚8þ<,--±xñbÌš5«B<‹T*E§N`gg‡7oÞ -- |><O‘(aöìÙJ¥åZýËûžÉd‚ˆJÔ¢Si¨ó1ËvæÎC“ÂÅQ²%™HHL†P˜Š¨Ð „FDâå«WHˆ CJj8*<@š-mhèâÒ•k8àvj|>¶lÚ€¹ó惛K¹,&<å ÍëÕ _¬]³W®Ý€‰¡>š[*X.—[(@PCC‹/V,rI +ªQÖÐÐ@£Fœœ  ܽ{•fxûö틾}ûÚ-Šf®/Oʪùùù’ ¿)­ªªBsfN¯VýøÌŒtŠ ¢—Ï}iÕ²?ˆÐø1£èó§À’,­Ô±M º{ëF¹ùŸW.ýƒ˜ŒÜyj¨ó鯵«Ô¯_?:tèegg+Ü7ŠÝ"ÏJ¥P¨OA÷U….*6–‚ƒƒéâÅ‹ eiecÅd2eddÐÎ;)==½L†¸$ãvE•ŒDD&L¨t>éߘ † ˆvvhÞ²zõ#Ty|€3gÏà]@ ®\¹Œßû(Ce–Z–‰dRœ>u«×:"88v+—£U‹æXºd1î?x‰D‚ÐÐP¼ÿõë×·ˆãYÁ·ÅbáÓ§Oàóù ž¡`‚ƒƒÂÛÛÆÆÆ°··‡¥¥e±1*Zë4?1Ô¤I“Àáp*å _Y÷Wi‡²³Æ³X,ôëÓ ÷ïÞÁ™ U<pîôIôëÓ©ié8rìx™àÉýQP¢ûèÓ'^øå—.3a2êXZÂÇû ÖmØ„:VuÁb21aü8H¥R¬_¿‡VÔš(H‰‰‰ ›Í†\.G“&MÀf³áçç‡yóæA*•‚ÉdB"‘@$aðàÁ ÂÓ§O>E©²¡Ä\.·\ר| {¾Ïse}JªWöÕ´iÍ œ:q6]»W{¬—¾O1tP\¾|;wîº NÐÐÔªˆJ¬PRÍÈðPØN›Œv;#44G­Ûwi_$ ””•aia'''˜˜˜ Y³f%J"‰‰‰puuUì–––000ÀÍ›7qýúuÅ«¢¢‚ùóç#;;±±±ÐÒÒ*ÄÄæ»d¼|ùqqqö—®¨kl>X«â¸V÷E™è–Íã—Î%+ì e‚ÃC]]zF¦PUU…q^Ô©ž¡)Ôø#<2©"ìÚµ S&OÆ [Û*ÍãöÍkü„{|`ijŒ“Çbôè1å() äÖ=~öìú÷ÏÕ']ºt ]»vU?ïß¿‡’’”••1qâD<{öLÁo4nÜ.\€¡¡¡"„'Ÿ)ÈÊd2L˜0ׯ_ÇÒ¥K>Õå¢è÷%@”ï¸ oÃU±JÊÐÒÒ‚@_-‡büøñhÞ¬)4Õ+oQúˆS&¢WŸ~HOOÇÊåKáóôÆŒ›P¾†›rÙ&‰$ 4@ýúõqéÒ%p¹\ÄÇÇcöìÙ‹Å3f :uê„!C† {÷îxýú5D"˜L&¤R)êÕ«§È@[4Yþ²víZœ>};vÄæÍ›‘€ÀÀÀ2y ¹\ŽÈÈÈb?vI×ä'ÿ,ë, 4ÓvùxÝ+ñ»„ø8Z¿v9”=¸›ëÊ!Q‡6­H˜_é{½ô}Jƒö#ƒQèY ±ÙìBñ^Eûš‡‡G©þEDDsæÌ¡Aƒúñˆˆ^¿~M-Z´(6f‡ÈÏÏ:D‰‰‰…Æôòò¢ôôôR”﫬¬LÓ¦M#¡PXÌ¥(×lÙ²%5hÐàËU,,­Í³R#še;ƒž>º_ø‡æÐ ·C4rÈ:vøeg‰ Ø™b¨sûŸ)C˜\á{$ÆÅÒj»åįª}l6›f̘ADDÑÑÑäééYh‡xýú53†RRR»‘H$¢°°0:sæ Õ©S§¹»»{¹y‹H&“‘P(¤¦M›’µµ5ihh¶¶69Rqß²”?¯‡’••Õ×mŠÁË/ §£¾!”UxUˆQ8ìøÞß·qÚý¬¬ê`ûŽÝŲ͓L›­¨ÆS&“'—áÜw¬vpÄÇ  aúù|><==‘ [[[ ]»vèÓ§ÂÒ^4©U>Óœ/Md wíÚ…>@UU©©©ÐÑÑA`` ²²²*,UEDDT©LxµtÙã®\» ž*zzz066…‰!Ì-­`YÇ fFú°°ªMmhi¨­¬ZŠ- U¼ÃÑ#‡‘’œ„™³ç eë6%ûÊädÉb•WÿêÅ3¬Y³W¯Ý¨qÝIPPÞ½{‡víÚáêիذa,--wwwÄÅÅáÑ£G ‚ üýýѲeK8;;£OŸ>°µµ-ôÒ”žòõLÅï‚} þýâÅ DEE’’’ ªª GGGlذ¡\Mw¾©†[‰D¥5*Æ22ÅÈÈ GHh8ùžÃá@σž®6,,­`ei#Ìê6€¦¦ꘙ ..v«VÁʪ.zõþ =ËIk'“Jsõ¥è>âc¢áêºÛ]wB,ɪqµCZZLLL`oo¯Pýç{6nÜÏž=ƒ§§'ÜÜÜ0gΜ:u ^^^ˆÅÒ¥KѱcÇB )(^ç‹õ¥¦àgYYY TÑåÈ‘#PUUŲeËFà‚º$™L±XŒ­[·âãÇ ©ÚïÿµÛöÍëéú•Kt쨭_µœfLGÇ ¥«—.’¼?œ’(4èõèÖ¥˜øž“-¡£‡¹©ÉWy–zõê•øùÖ­[©GŠÿ544¾6äããC‰„¤R©"-_|—U` òù­‡200(qÔ«W/š´p᪄ò|ÛS --iiéˆˆŠ—OáÂ-l&êÐÀÄPu­¬`V§ÌŒôQ¯^]Œ-.LFPÐ'Œ=—¯z #S„oE!!!àr¹H$¥2©E‹°dggãÉ“'…úFFF"22ÚÚÚˆ‹‹CFF†Â#àòåËxõê €7n@WW7oÞ„D")Ñ®(ÅÄÄ &&~~~`0°²²‚ŸŸ‚‚‚ªUlå›ì@Õm\.—ºÚßÕœêׯ¯ÈÈ‘¿ËÝy*³CΚ5«¯ãááAÚÚÚ´`Á²¶¶¦€€²¶¶¦ºuë~ëgÿñô½¶|ír>XЦx)+å‹’’ñù|jР?ž"""Š¿|mÞ¼™TUUéÖ­[dccCà›ÛØ|¿iD0b0033CXXX1‹9ë´>þ|´k×***`³Ùˆ‹‹—Ë…••ø|>ôõõ®!Ñž>}ŠQ£FÁÆÆÁÁÁFbbb•²ª~ –¤¶ÕPkÚ´i¡#¬èÑ¿…y£¼’Lùf†wïÞ)Äl###211)s7«Ý~p266Fll¬"»kQ_---Œ1]»v………ÌÍÍÁd2¡¡¡¡È¸Ÿ_@.::½zõ‚¿¿?tuu~ØßÕî_ tÙ(ÈX—$â‘‘5nܘ–,Y¢°Ä¿|ù’4h@ÊÊÊT·nݪ¸ZÔî@?25hÐIIIHHH¨Ôu°°°€··7”••Áápª”¿ù«ð}µú²ÄåraaaÔÔT¤§§W*öÜÈÈ"‘¨ÚzšZýKˆÏçC]]úúúÈÎÎFRR233Áb± KUUU¡®®ŽÈÈÈ*UЩP-ý0ÄU» µTE’3ÄÔ®C-U‘’˜Bkס–ªHï™îÖ®C-U‘<êÄw¥ZK?IÔgp²v=j©’t @p¾òAà5ÃÚu©¥ P €âó]ùã Y»6µTeæa%(œÞå)€îbkר–ÊØyºça¥TÒp@j­êµ-·Ió0¡W,e¥ä40@óø$FíKøŸ Ê;¢>ä©yN(1êðÿ´IšÌ¶+IEND®B`‚lft-3.8/icons/144x144/cloud.png000644 000766 000000 00000012612 12062431750 015753 0ustar00vicwheel000000 000000 ‰PNG  IHDRçF⸠pHYs.#.#x¥?v OiCCPPhotoshop ICC profilexÚSgTSé=÷ÞôBKˆ€”KoR RB‹€‘&*! Jˆ!¡ÙQÁEEÈ ˆŽŽ€ŒQ, Š Øä!¢Žƒ£ˆŠÊûá{£kÖ¼÷æÍþµ×>ç¬ó³ÏÀ –H3Q5€ ©BàƒÇÄÆáä.@ $p³d!sý#ø~<<+"À¾xÓ ÀM›À0‡ÿêB™\€„Àt‘8K€@zŽB¦@F€˜&S `ËcbãP-`'æÓ€ø™{[”! ‘ eˆDh;¬ÏVŠEX0fKÄ9Ø-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+®ç*x™²<¹$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóýxήÎÎ6޶_-ê¿ÿ"bbãþåÏ«p@át~Ñþ,/³€;€mþ¢%îh^  u÷‹f²@µ éÚWópø~<ß5°j>{‘-¨]cöK'XtÀâ÷ò»oÁÔ(€hƒáÏwÿï?ýG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)¬‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(¼ AÈa!ÚˆbŠX#Ž™…ø!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fº‘;È2‚ü†¼G1”²Q=Ô µC¹¨7„F¢ Ðdt1š ›Ðr´=Œ6¡çЫhÚ>CÇ0Àè3Äl0.ÆÃB±8, “c˱"¬ «Æ°V¬»‰õcϱwEÀ 6wB aAHXLXNØH¨ $4Ú 7 „QÂ'"“¨K´&ºùÄb21‡XH,#Ö/{ˆCÄ7$‰C2'¹I±¤TÒÒFÒnR#é,©›4H#“ÉÚdk²9”, +È…ääÃä3ää!ò[ b@q¤øSâ(RÊjJåå4åe˜2AU£šRݨ¡T5ZB­¡¶R¯Q‡¨4uš9̓IK¥­¢•Óhh÷i¯ètºÝ•N—ÐWÒËéGè—èôw †ƒÇˆg(›gw¯˜L¦Ó‹ÇT071ë˜ç™™oUX*¶*|‘Ê •J•&•*/T©ª¦ªÞª UóUËT©^S}®FU3Sã© Ô–«UªPëSSg©;¨‡ªg¨oT?¤~Yý‰YÃLÃOC¤Q ±_ã¼Æ c³x,!k «†u5Ä&±ÍÙ|v*»˜ý»‹=ª©¡9C3J3W³Ró”f?ã˜qøœtN ç(§—ó~ŠÞï)â)¦4L¹1e\kª–—–X«H«Q«Gë½6®í§¦½E»YûAÇJ'\'GgÎçSÙSݧ §M=:õ®.ªk¥¡»Dw¿n§î˜ž¾^€žLo§Þy½çú}/ýTýmú§õG X³ $Û Î<Å5qo</ÇÛñQC]Ã@C¥a•a—á„‘¹Ñ<£ÕFFŒiÆ\ã$ãmÆmÆ£&&!&KMêMîšRM¹¦)¦;L;LÇÍÌÍ¢ÍÖ™5›=1×2ç›ç›×›ß·`ZxZ,¶¨¶¸eI²äZ¦Yî¶¼n…Z9Y¥XUZ]³F­­%Ö»­»§§¹N“N«žÖgðñ¶É¶©·°åØÛ®¶m¶}agbg·Å®Ã“}º}ý= ‡Ù«Z~s´r:V:ޚΜî?}Åô–é/gXÏÏØ3ã¶Ë)ÄiS›ÓGgg¹sƒóˆ‹‰K‚Ë.—>.›ÆÝȽäJtõq]ázÒõ›³›Âí¨Û¯î6îiî‡ÜŸÌ4Ÿ)žY3sÐÃÈCàQåÑ? Ÿ•0k߬~OCOgµç#/c/‘W­×°·¥wª÷aï>ö>rŸã>ã<7Þ2ÞY_Ì7À·È·ËOÃož_…ßC#ÿdÿzÿѧ€%g‰A[ûøz|!¿Ž?:Ûeö²ÙíAŒ ¹AA‚­‚åÁ­!hÈì­!÷ç˜Î‘Îi…P~èÖÐaæa‹Ã~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DÞ›g1O9¯-J5*>ª.j<Ú7º4º?Æ.fYÌÕXXIlK9.*®6nl¾ßüíó‡ââ ã{˜/È]py¡ÎÂô…§©.,:–@LˆN8”ðA*¨Œ%òw%Ž yÂÂg"/Ñ6шØC\*NòH*Mz’쑼5y$Å3¥,幄'©¼L LÝ›:žšv m2=:½1ƒ’‘qBª!M“¶gêgæfvˬe…²þÅn‹·/•Ék³¬Y- ¶B¦èTZ(×*²geWf¿Í‰Ê9–«ž+Íí̳ÊÛ7œïŸÿíÂá’¶¥†KW-X潬j9²‰Š®Û—Ø(Üxå‡oÊ¿™Ü”´©«Ä¹dÏfÒféæÞ-ž[–ª—æ—n ÙÚ´ ßV´íõöEÛ/—Í(Û»ƒ¶C¹£¿<¸¼e§ÉÎÍ;?T¤TôTúT6îÒݵa×ønÑî{¼ö4ìÕÛ[¼÷ý>ɾÛUUMÕfÕeûIû³÷?®‰ªéø–ûm]­NmqíÇÒý#¶×¹ÔÕÒ=TRÖ+ëGǾþïw- 6 UœÆâ#pDyäé÷ ß÷ :ÚvŒ{¬áÓvg/jBšòšF›Sšû[b[ºOÌ>ÑÖêÞzüGÛœ499â?rýéü§CÏdÏ&žþ¢þË®/~øÕë×Îјѡ—ò—“¿m|¥ýêÀë¯ÛÆÂƾÉx31^ôVûíÁwÜwï£ßOä| (ÿhù±õSЧû“““ÿ˜óüc3-Û cHRMz%€ƒùÿ€éu0ê`:˜o’_ÅF µIDATxÚìoPTåÇ¿gwaYX`…4!‚7C`Àˆ.e`^¦Ñ{ÉôΘCš‰é8ý™¦i§œ|á‹hš&Þdð¢™n6tÉÞX*͘MW@i$©MLºi*Va— v9¿û"t´RØåûçû™yf†sØó{>ûœs~Ï?·& Àÿ €$Ð à€¯ÔŒýà`ÕXGyˆlÐø;cAü¤X`ã@ü$Cà3ÌÄ?T¿'ˆñ C@(¡@„ D"ˆP B¡@„ D(!ˆP B"„ D(¡@„B"ˆ„\•Cc¢¢¢™™‰¢¢"äçç#==III0›Íù}°ªªèëëƒÝnGKK ÑØØˆžžž »^NmÖ‹Å‚µk×¢´´YYY0™Lˆˆˆ€Á`€N§ƒ¢(7ý½ªª…×ëÅÈÈz{{qøðaTWWãøñãAuí\>ƒz½:ÝÍí5‘®uhvuu¡¡¡Ÿ|ò êë롪*,X€Gy$`¯7//ñññ¸rå ;S'Sbcc套^’¦¦&q82<<ì×ÛÍÐÐôôôÈçŸ.+V¬;wJ süøq)((àküdÊÊ•+¥®®N._¾¬YÅx<ioo×¼“Tk‡¬_¿~Fã´·0£Ñˆ×^{ Ï<ó æÏŸ¯í}Ý`@jjjÀÇ`Ö¬YHIIá3¯ÜyçØµkžzê)ÄÇLJmŠAQÌ;—ùBRRÊËËQVVö§Q~áHTTó@åŽ;îÀöíÛ±iÓ&ÊsCk|÷ÝwÏX<ôvË7­¬¬ ¯¾új@d`)uaµZ‘••…ÔÔTÄÅÅÁëõb```zn£’Aõ=öÞ}÷]Üwß}´æ6üôÓOhllD}}=l6Ξ=‹‘‘‘ðÎY,Ù»w¯ß8vì˜<÷ÜsbµZE§Ó…ohëÖ­ÒÛÛK#ü¤®®N–/_.±±±á'Éd’}ûöÑ‚IrõêUÙ¹s§Ì™3GE ž|òI9wî Јêêj™7ožfük|aa!æÍãÎäZQZZŠŠŠ ÍbЉÄY³faÑ¢EÌùh™96PRRǃmÛ¶Án·ž@xà`µZ‘šš ‹Å½^EQ044„‹/âÌ™3°Ùlhnn†×ëýËódgg#))‰µ®1‘‘‘xâ‰'ÐÓÓƒW^y£££3/Prr2Ö¬YƒeË–ÁjµÂb±Àl6#::ƒáz+¢ª*®^½ŠÁÁA\¹r8rä<ˆ–––›Î™™™‰„„Öø%f7n܈öövTTTÌ\(..N¶mÛ& ~èïï—¦¦&yóÍ7%##ãú¹ËËËe``€O¾SÈ©S§dÉ’%3óVTT${÷î§Ó©ÉÅŒŒŒH}}½lܸQHEE…߃ÃÈÄÇ>}úé§“I4ú7ÑnýúõÒÜÜ<%e·Ûåå—_–/¾ø‚M—.]’’’’é(""B¶lÙ"Sžøúõ×_Åãñ°†§¡ª­­õ·ò퀧Ÿ~Zº»»õ£»»Û¯E­|J$.]ºo¼ñÆŒ‚#Úc6›±víZŸ›°@ (//GZZ£‚DGG£¨¨F£Q{t:¶oߎœœF:DÑétHOO‡ÕjÕ^ ´´4”––Âl63Ò!ž\\´h‘ömÞ¼‰‰‰Œpˆ£×ëµo, V­ZÅÖ'Lòu>ܸ=üðÃHIIax˜<Y,mòçÉœ'Š¢ø}Z[úûû¡ª*£·¯üÚ ÔÖÖ6©Qû$8ÄáÇ}~dW “'Oúœ ÁG__>ûì3ŸW †† â ãèÑ£hoo×^ o¾ù—.]b”C˜®®.¼ÿþû~;®@N§µµµp¹\Œt222‚¯¾ú ÍÍÍS#ˆ ªª N§“ÑANŸ>·ÞzËïtÍ„ú(Ο?ššŸûIHàߺÞ~ûmŸ³Ï> »wïÆÉ“'õÁår¡ªª û÷ïŸÔy&¼JëÀÀìv; }tD ·ÛÝ»wã½÷Þ›ôF->-ó{îÜ9 ¡  111¬‰ my*++QQQÞÞÞIŸÏçu¢m6†‡‡‘••…¸¸8ÖHÑÑÑÊÊJ¼óÎ;p8š×¯IõÏ>û¬´¶¶rNpàõzå»ï¾“M›6i½Àæä–wY¶l™:tHúúúXK*N[[›|øá‡’=%‹ Nz¥z³ÙŒ^x6lÀ]wÝ…¸¸8ATUÅàà úûûqâÄ |ôÑG¨­­²ÿ§ÙVsçÎźuë°råJdffÂh4"""âúv“œ¤=rön·gÏžE]]öíÛ‡ï¿ÿ~Ê?ƒæ{eDFF"++ 999X¼x1RSS‘˜˜“Étý¢É$+MQ ª*\.:::pêÔ)Øl6œ9sfZ¾A³Ù L8Ý‚P B"ˆ D(¡@„B"ˆP B(¡@„ D"ˆP B"„ D(¡@„P BH04Ì0?Quºâ'€6ÆøI«Àâ'_+æøw×%¾à°Pà<€â#ÿpþÚÊ—sü ‰q! @.€Ë×ò@—ü 7#ãáså2ps"± @1nOHn×ò¹rKfø7¦`es– ,Þ1'fÿQ–Û­þ` €È{NâjááŒÝ¢þ7–æ©ð—»ÒýižÑË^³IEND®B`‚lft-3.8/icons/144x144/firewall_stupid.png000644 000766 000000 00000051401 12062431750 020041 0ustar00vicwheel000000 000000 ‰PNG  IHDRçF⸠pHYs.#.#x¥?v OiCCPPhotoshop ICC profilexÚSgTSé=÷ÞôBKˆ€”KoR RB‹€‘&*! Jˆ!¡ÙQÁEEÈ ˆŽŽ€ŒQ, Š Øä!¢Žƒ£ˆŠÊûá{£kÖ¼÷æÍþµ×>ç¬ó³ÏÀ –H3Q5€ ©BàƒÇÄÆáä.@ $p³d!sý#ø~<<+"À¾xÓ ÀM›À0‡ÿêB™\€„Àt‘8K€@zŽB¦@F€˜&S `ËcbãP-`'æÓ€ø™{[”! ‘ eˆDh;¬ÏVŠEX0fKÄ9Ø-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+®ç*x™²<¹$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóýxήÎÎ6޶_-ê¿ÿ"bbãþåÏ«p@át~Ñþ,/³€;€mþ¢%îh^  u÷‹f²@µ éÚWópø~<ß5°j>{‘-¨]cöK'XtÀâ÷ò»oÁÔ(€hƒáÏwÿï?ýG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)¬‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(¼ AÈa!ÚˆbŠX#Ž™…ø!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fº‘;È2‚ü†¼G1”²Q=Ô µC¹¨7„F¢ Ðdt1š ›Ðr´=Œ6¡çЫhÚ>CÇ0Àè3Äl0.ÆÃB±8, “c˱"¬ «Æ°V¬»‰õcϱwEÀ 6wB aAHXLXNØH¨ $4Ú 7 „QÂ'"“¨K´&ºùÄb21‡XH,#Ö/{ˆCÄ7$‰C2'¹I±¤TÒÒFÒnR#é,©›4H#“ÉÚdk²9”, +È…ääÃä3ää!ò[ b@q¤øSâ(RÊjJåå4åe˜2AU£šRݨ¡T5ZB­¡¶R¯Q‡¨4uš9̓IK¥­¢•Óhh÷i¯ètºÝ•N—ÐWÒËéGè—èôw †ƒÇˆg(›gw¯˜L¦Ó‹ÇT071ë˜ç™™oUX*¶*|‘Ê •J•&•*/T©ª¦ªÞª UóUËT©^S}®FU3Sã© Ô–«UªPëSSg©;¨‡ªg¨oT?¤~Yý‰YÃLÃOC¤Q ±_ã¼Æ c³x,!k «†u5Ä&±ÍÙ|v*»˜ý»‹=ª©¡9C3J3W³Ró”f?ã˜qøœtN ç(§—ó~ŠÞï)â)¦4L¹1e\kª–—–X«H«Q«Gë½6®í§¦½E»YûAÇJ'\'GgÎçSÙSݧ §M=:õ®.ªk¥¡»Dw¿n§î˜ž¾^€žLo§Þy½çú}/ýTýmú§õG X³ $Û Î<Å5qo</ÇÛñQC]Ã@C¥a•a—á„‘¹Ñ<£ÕFFŒiÆ\ã$ãmÆmÆ£&&!&KMêMîšRM¹¦)¦;L;LÇÍÌÍ¢ÍÖ™5›=1×2ç›ç›×›ß·`ZxZ,¶¨¶¸eI²äZ¦Yî¶¼n…Z9Y¥XUZ]³F­­%Ö»­»§§¹N“N«žÖgðñ¶É¶©·°åØÛ®¶m¶}agbg·Å®Ã“}º}ý= ‡Ù«Z~s´r:V:ޚΜî?}Åô–é/gXÏÏØ3ã¶Ë)ÄiS›ÓGgg¹sƒóˆ‹‰K‚Ë.—>.›ÆÝȽäJtõq]ázÒõ›³›Âí¨Û¯î6îiî‡ÜŸÌ4Ÿ)žY3sÐÃÈCàQåÑ? Ÿ•0k߬~OCOgµç#/c/‘W­×°·¥wª÷aï>ö>rŸã>ã<7Þ2ÞY_Ì7À·È·ËOÃož_…ßC#ÿdÿzÿѧ€%g‰A[ûøz|!¿Ž?:Ûeö²ÙíAŒ ¹AA‚­‚åÁ­!hÈì­!÷ç˜Î‘Îi…P~èÖÐaæa‹Ã~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DÞ›g1O9¯-J5*>ª.j<Ú7º4º?Æ.fYÌÕXXIlK9.*®6nl¾ßüíó‡ââ ã{˜/È]py¡ÎÂô…§©.,:–@LˆN8”ðA*¨Œ%òw%Ž yÂÂg"/Ñ6шØC\*NòH*Mz’쑼5y$Å3¥,幄'©¼L LÝ›:žšv m2=:½1ƒ’‘qBª!M“¶gêgæfvˬe…²þÅn‹·/•Ék³¬Y- ¶B¦èTZ(×*²geWf¿Í‰Ê9–«ž+Íí̳ÊÛ7œïŸÿíÂá’¶¥†KW-X潬j9²‰Š®Û—Ø(Üxå‡oÊ¿™Ü”´©«Ä¹dÏfÒféæÞ-ž[–ª—æ—n ÙÚ´ ßV´íõöEÛ/—Í(Û»ƒ¶C¹£¿<¸¼e§ÉÎÍ;?T¤TôTúT6îÒݵa×ønÑî{¼ö4ìÕÛ[¼÷ý>ɾÛUUMÕfÕeûIû³÷?®‰ªéø–ûm]­NmqíÇÒý#¶×¹ÔÕÒ=TRÖ+ëGǾþïw- 6 UœÆâ#pDyäé÷ ß÷ :ÚvŒ{¬áÓvg/jBšòšF›Sšû[b[ºOÌ>ÑÖêÞzüGÛœ499â?rýéü§CÏdÏ&žþ¢þË®/~øÕë×Îјѡ—ò—“¿m|¥ýêÀë¯ÛÆÂƾÉx31^ôVûíÁwÜwï£ßOä| (ÿhù±õSЧû“““ÿ˜óüc3-Û cHRMz%€ƒùÿ€éu0ê`:˜o’_ÅFH,IDATxÚìuxTGÆ»›Ýl²q7BmpwJ¡x)E‹ VŠ(E /îPÜi)îZÜ„`Á„w]ïm)’@…~9Ï3Ï»÷Nfç¾wæÈ{ÎHÈY m€&€/à ˜R ÿ¢"€Pà°éÅ¿s%ŽÀJ@ ˆ‚VÐ^`aå l¼QªÏ &¬ åО½ÀˆQ$Ï1@U°‚È$ ¨\ü#€k€[ÁüH.$( ÄÈ^|°¨]0/’K±|±èì’>À]À¤`^ $¢ŠJŽà)|ˆ ð•ø¤`. $ŸR_ xÌCäSJJ€L <ÌïUìípv°%6>‘´ 5©©©ÿÕŸjå *÷ *3%½{õäÛaßâêâBbr éjb£žÁó¨’SyòðÑ‘<‹Œ&>1™¨ˆpÒÓÓÉÈÔ`Þã(ð°¾cSš*D¯î]DÈÍ`‘g1DR|Œxúè¾ ¹-Ö.™+d $’æ÷à]ZÇömÄåKçÅû#‡ˆ>þÝÄO‹ˆOêÖ)йիSK>°ï½çFpЯèÿuoñàÞ]!„Ÿ5kR ÿb«Z¹¢ØöËf!ôÚwN\L´˜69@´oÝR:°÷¥ïš6nX ÿR+êë#Ö¯Y%4™ï ƒ^'6¬]%Z~ÖTÌŸ3K¤§¥¾r͇ ô[ÄÍÕ…o¤G¯ÞØØÚ¿s—ΟaÁ‚ù¨,,™5{>EŠ}ðsT°Â¼¦9:Ø‹ ?Œ‘áaïEÏyþì©ñí`ñùgMÅáƒûßz}Áö·V͉ØÈð÷­&Sü´d‘hÔà±`îì×nW2€ ¶°?‰£ƒ‰ |?j6v(Ld¸9;àU¤¶öŽX©”8;9bïì†D"yc_'ŽeæŒñð(Äâ%Kñ)Rô?Q-À»p!†};„ÖmÚ“–©!ìÑ=bc¢ˆˆŽ'&!Û{v‘––JRJ*z½ Kt:-æJSœœ]p/샵¥ÞžîXXZ±aâ£cúí0>iÐ0Ïã‘ÉdúÄÞΖáߥg¯^Ø;:?÷ñöÊñžÌÌ b£HHH$6!™øøXÒcÙ¹ãW¶î>À€o¾fýÆMHdyŸâ”¤¢¢" ”èsS™›‰!¿¡ï¿MÇ V,[,¾<@L7Zbã¦Mùêiû/›Ei¿’Ò\þ¿Å­LEoÿnâÖõ ÷¢$ïÙ¹MtéØ^Ìœ6E¤$'‰k—Î @¬^³&OýÜ ¾*¾lÛêCœÓÿð|Ñ¢¹¸réÂ{ÎÍëAbà7}Eÿ¯{‹Û7¯??}ü°Ä–MsÕOb|¬˜8~¬P™›}¨óú·Ú¿ç½'!.V̘6Y´oÝRìÚ¾õ•ï³´wç¶·öµcëQ¬ˆÏ‡>¿ÿå¸U%±}ë¡×jÞ x6mX'¾ø¬©˜>e¢HNJzí5Ù:r gÀ_ 6ø¯Ìó8¾Þ^â§% …:3ý½çâ¹³¢c»Ö¢W÷®âö­›o¼6@ǽ©‰|.† üF(ä&⣒%DÝZ5 ôojv6Öbé¢ù U¿àD„?#‡Ÿ5i$¶ýº5W÷œ>~Hâ·Ã¿‡+4™ébñ‚¹ÂÝÕY˜*äb¸DZjŠ˜3kæ?çÿ)?ƒ OŸ=gܸpqrÀ·x)TØXªpvvÂÎÉ™TúÖ~t5Ö¯cËæÍÔ©[—Í¿ü‚ÊÂ*÷NÀ€#÷1~üÎ] ¤m›VŒõ=eËW =#½ÀýoêU«ðýwÃqws%44”ˆ˜x““8°gñññ¤¦g¹\^¯ÃÒÜ Oolì07•ãæâˆ_™òXÙØñèÁ=fÏž…““ -¢hñ’y›P¹‰<ÈÌ™³øyû.¼< ±uË&Ú´ïðÒµƒ¾½zàæêJØãG„>{N\B2q1Q$'%‘’–ŽÞ ôWIÉÅ9b8_vè„Bi@…ª5_{­&3ƒøØ(ââIHI#!&ŠˆgO‰áIØ3;‚ä”4¬­T¬\±’ºŸ4Èטbbc@ÀØ€)˜™H;ú{‚ý«•Q„ÁÀWÚS£ÞË¡ŽÌ´dã㉉OD§7ð($˜þ”†á_¨nßõñ*,Í›-RÞƒY#fMŸ*õï'Š)"Šú Ïs?i©Ébúäáhm%” ÚµþB\½|é÷ŒÿAÞ³ã×\¾x^ üº·X0oŽè÷uß%ú”d[k1á‡Ñ".&ú“™ž&–-^(ºuî öïË2¹6j$>*æ“g%|ÏÎí¢BéRe>*!6o\/„ÁðÖûÞ '¡ň!EÏn_‰«—…BŒ7®@‰ÎXªTôòïÆÀÁƒ)ì]äû;|`›7m¤Rå*Ì™¿[;Ôj5JS%“ÜMËÛ7 ˜0žÍ¿lÃFeΘQß1ôÛáØÚ培˜‘žÆªåK9yêmÛ}IÛvíA’¥økµÚ(O”©„n]¾bèС|Tºì;÷wçÖ –-]‚\aʰßá÷§>…(LM7[j©)I,˜79³f“˜Dë–Ÿ3~ÂJ•Éë_æÜ·›Ÿ–ýD¹ X¼ä'œœ ¬°üˆhѼ)#F §Fíß¹¿¤„xV®XÎ… èÔ¹3ŸÑ:GmÐD.c_;~ý™q¸qó6~%K°éç-4hØ8/ˆ‰ K+ Ü»ÃôiS1£ÇŽ¥b媔1ó¯ÚS?©[[Ú·[¼/Ùñë/¢uËâÇ©“ERBü¯­]§Ž¨S£Úk¿ ¼ Z~ÖLÂÕÙIbà×½ò=®ý{v‰ªeK‰†µkˆ/Û¶Îқěõ¦Q£F(Ñ9µ åʈƒ{ßp‚®ŠíZ‹~}z‰[7®çêžÚuêˆ:5_Päó,o4 œìŲŋÄã‡w…D"ƒû÷Íó¸î†Ü]:´€(äì$Æ-âbcruï¿@ÿš-ÌÇÛ›ÀÀ@nß ÆÅÍÌL¸89`ïè„…• r¹É+zß%:2‚Ù3gððÑ#:uîLËVmò¶§¿P 5ê V¯X΄‰“ˆˆŠ¡WnŒ?÷BžDF„#„@f¢Èu¿)I‰,^¸€éS§‘––N—N3vlž•:Ðu‰„/Z4gðàA88:Fdt Éi< =Cbl©ié™)Z­©A‹…… {gwÌÌ-°³¶ÀÍÕï"%°°²æäñ#ìØ±“ÊU*3æ‡qXXYç<©É lûe³gÍáÜ¥ËT­R‰Ÿþ™Úuëýêxa ¹¸¹çªß=»v0aAAÁT¯^ñ&PÿÓ¼ó¤MLL t ìÖ ^]qä`îrËõzƒHNŒaŠ«W.‹'Nˆ­›Ö‹5?-Ç>Þ^ÂÞÞ^tÿª£{šïm¯a£ßSiœìíÄ’…ó_›‰ö$TbÕêÕoìïö`ѲEscŸ_ul/´š|zõ:Ñ·Oï¨|ÙRbˆu {÷Üò»!·ÄÈáCÅ¢ùsEùòåÅÚåKòÕÏÓÇÄào¾æ„¥©\|Ó··xúøQŽ×ghÅÊ•¯ý>&*BŒ9BXZ¨DÑ"¾bhÿ,òØï¿Ë×ø®^º ¾hÑ\H¥Òÿ_+â+V,],2ÓÓÞ8‘ÏŸ‰ñcG‰ßôçΜBññÇ‹Õy&3Cü´xðp´ËZ?®#N8þÖûrN«ëV¯®ÎNBn"ß$’âETXÖõÆý§ñÅDEˆ±£G ¥©âÿ—äìè fϘ&âbÞ8Zu¦X³r¹ðïÖE¬[³ê¥í víÚbÓúµ¹îëäoGEíj• ¼ÜÝÄOK u. 'dhåªUÆÏΞ>)jÕ¨&Ѹaƒ—¸×wn\€X³6wã3èµbËÆõ«°çÿ/¡ÌÆÆJŒ9\„‡=~/fùÉãGÅ×½üÅcF‰çáÏ^ù¾yóæâ·ß~ËÕvÕ§G7aB¥‹ýû‰°'¡yKØ“P!‘HÄšÕ«EÈÍë¢ûW„L*^ž…Ƶ«_ñçdhÝúuoíûò¥ ¢Qƒúÿ¿ŒD•¹™øM_ñàîí÷œÐ‡÷Å𡃄·¯Äù³gr¼®E‹âôéÓ9~Ÿ‘ž*–.Y(Ü]] š5úT]¹œÏº>QÂT©ÞžÂÆÜTȤR1lè`õÚëïÜÊÊÛ°á Ûr¸ðMß1;ãýt$“IE‡v­Åõ +ï8i©böŒiâ‹ÍÄÚÕ+…á-‹-ZˆS§N½ö»}{vŠJÊ ™TXZ¨„ÜÄD< }”¯q%%&ˆ±#‡ “¿»y“†o¥mdhókR}23^Ð]Ý\„‹“£Øºe“?vôÿ€ÚµùB½eó"{wím[}.F ""žç®JÆëtëF°èÔ¡DÅ åĹÓ'Ű}„™R)¢¢¢ò•5Z©Lm£d_±nÍjaÐëÞz_6€~Ù²ù¥Ï> Ê”öC Qϳ¶æÓ§ÿp¢íìì077ÃËÃógNp'$gl,ÍqvrÀÖÞ •¥ò·(³åîí›,Z¸è؆~;œj5jæ™N Ã’Å‹˜2uJ¥’…óæàß«7J3s¶ý¼ ƒ0`0rÝïÍà«L™4‰Í¿îÀÌDƈaC>bŽy‹–›››ðàncÆŽåç­Û¨]³ΡJõš ºêÿ?<Ñ-[¶dêÔ)<¹ÉÓgÏIWk ¾Âó°Ç$§e¢0S‘𔀩‰;ìœ\Q™)pwqÂÍÓ k[ìl¬PÈå¬]»–Ó§OÓ¡cGÚ´kÿÖÅëÀÅŠ¥‹˜8eOÞѳG7Fƒ—¯ñ:½A`*—£È…W7)!Ž… æ3wÖ,’ÓèЮ ÿûŽò*å-ê.“!“JºÂ¹sg™7*+ZBž½|ŸlÑjµ”-U;ˆ‹‰"11™´Lõ @R©''gœœœ©ñ:·0MTL,©é™ÄE=çñÃûܼsŸ»Â ½OJr7CîR³fMV¯]•µu¾Æ’š’L—ŽIHM¥Z•ʬZ¹‚úŸ6z͘f¦ Š7ÿôí¿la؈„> ÃReÎî½»iÚì³üíE¥úÑãøÍ׌= gW×^ŸžžÎÐaÃèÒµ HMŒ#..„”42R“ˆŽ`ÃÆlÙ¾‰D‚ø‡‹“ç{ÿó÷÷g}G™):µo-Ö¯Y‘Ïõk¢ÕgM³¢Û®.bÞì"3#ç„Â_÷nÎ"-åõ™¥×®Ц>5RKªV,'ìííEJJJ¾Ši®_³Røz€hÒèSqþÌÉ·GÝG~'V,ÿ)G*îÌi“Eÿ¯{‰93¦þãÞié?½*LM1•›`yÛ²ãã;jÕ«VeÇžýôêÑ•3çÎ2pÈ0L_dhäôºH%’Wª‹=ö”¡ûS©JU._¹ÊªåË8öÛ Ê”.…^«A«Õäi|—/œ¥Y“F|ÕÍÞÀêåËØ·ÿÕjÖÉÃ{ýÒÒɆ5+h׿ dr93gϧ~ýúˆ<èrÿYF¢©Ò 7\Oì–M™4q"·îÜ£FÕÊL™:•ºõêçú±H$L^TSg¤³vÍ*ÆŸ@dt,ƒ|ÃÈ‘#ãÉÈÈÀÜL‰©dG¢Ïžï@½»%Μ=ûÚ¹Ö®… y…ÜDØÙZ‹~}ûäûï/]8Kà èÞ³EŠørâ·c¬X½–"EÿýUìßIÚ±c;‘Ïqrv¦Haw<¼|qvqÃÝÅWwOT–V(¹á KPš*}xŸ€€Ö¬Û@±">lÙ´ö:e=<­{3ežÆx`Ï.&Là• ¼<ÜøiÊdºû÷ÄDž{>³L*C£3°nÝ –-[JDD$¶¶¶¤¦¦bkk‹\.Go0Ÿˆ ÁÁÁÔ«WùóçS¶lYT*þþþÔ©S‡þýû£V«111!!.†iS¦0oábœY²p={õÁDñá ùNŠ‹gϾýøwû ·Â>ddª9wâQ11¤ 4)(årÝ<±±±¢« ^EK`em‹ƒ=Vv(•¦&äþ#"ž>"=#•µ*¥œ‹—Y»vIéš6nÈ´iÓ(ýZëE`ö"ž”£×79‰%‹2aâdÒÒ3¨W·6óæÍË¡¿ÜèîƒGÜ}ðˆråÊ!•JÑësŽU !ÐëõÈår .ŒN§ãÌ™3¸»»“œœÌýû÷±²²âÞ½{TªXKçÎP¾rµ|íyxø‡  Ï›7eÌèÑTªV#çMI*ÃÎÑ;ÇþÚ/›Ç™™™è4jn^»ÂÙÓ'qptfùôé´mÿåã`&o0§wmÿ•±?üÀ[!ôìÞ•  «4¨W'_àIŒcÖŒéü²m'vvvH¥RLLLÞž?IL&ÃÊÊ ©Tн½½qµ*Z´(—¯P¦l¹<-91žysç0{îüüÀ[iîßDê\‡#ö²sϾ7‚'7¢T*9wö43fÏ¡aó–\º|™¶í;¼=ˆ*yuÈ×®Ò¤aZ¶n‹R©äà¾=,_µ///ÈGœèçMë©\¹2“¦Í ~ýúH¥R .œ§þŸ¤×ëÑétÆ>222BpþÂÅ<õ·}ëjT¯Î&‘˜”ü¯@¹P·/[²jù2ê}Ú8Gk"·rûÝ¿êȪի>â;ÆÀÎÁ)wþƒ¹ñœ!¿¡rÕj\ ¼ÌÌéS8yê4š67ZLææª\ëÚ•K4kÒˆ/;uA§7°~ÍJ"£¢qpp0‚á}ˆÁ`ÀÞÞOOOš6ÿŒY³f½µï›ÁA´mõ9­ÛuàÖ{ŽíêâHï®IHLbÌ„‰H‘ ËLE.—cíàŒ­=N¶V¸¸¸àRÈ kkœl±¶±Enú²Â›˜ÏÌéÓ¸t•víÚÓµ‡?IÞìr•JEFzkW.gÊ´ {AçŽ_0oßWK¿(ߢ3ÄÇD1ãÇYúÓrðÃèïù¦¶íØÅÕ«W)T¨VVVƇ/“Ér½•½ierrrÂÒÒ’ &ÄìÙ³qrzùEJJˆcά™Ì™¿ä”ßùóo=7¾|™¸|Ëø­:ƒ¸Ø"¢cÉÈÈ$&ü1=":>ƒ^GdX(ié(UV˜ÈåÈ¥Y¥05#(8˜òåË3hðÐ|ÕÐз'7o‡™šÂ… ”+Sš™3~¤~Õ1Z4kLË–_УWŸž¢žuk²ÂCŸpäÐA4lDll,¾¾¾˜™™!—ËQ©T$%%áììLrr2¶¶¶ïeE’H$Èd2bccQ*•9rwwwÀÀÏ70aâ$BîÞÿpÍxƒÞz Ȳü&rS3\Ü=qqÏvÀ½ª e¤§£Öj‰‹|Æ“'O‰IHfÓÆ ¸»¹1>`r¾záì)Î]¸ÄÕà¸ØY1Î,zø÷Deiõ–ôúîÜéŒ7žßNbè Á„Ysæáêæšå¸wI“&qóæMvïÞM±bŸ{÷.÷îÝC«Õbccó~\¨B Óé°³³#55•¶mÛ2wæ ÆMÏÁÃGÿÛ~ œÄÌÜ3ÀÆÚßâ~YÛD|<á¡y“"ÂØ5cË-$C'øºwO¾6ßÜziÿDÛ{üéÓ¦³xÙrjÖ¨Æé“'¨^³sfÎÈrO˜dEé«W¯NõêÕ)Q¢}ô[¶l¡cÇŽxzzrâÄ 222P©TùR¬s’\.çöí[4hÜ7g'¼< ñøiØ¿@(33•Ê<××ë4jV/_FÝ5˜5o%J•aÿ},^¶<÷àáwžtFZV8£LÙòlÛ¹‹åËsü·,ð¨5jdPšš·‰DÂäɓٽ{7æææ,X°€%JвeK"""¾¨9-•JßzzáïFÀË×J¥Rc»ÿ>nnn 4€ÀË—©X¾Ì¿~úûe Ê\Ò.Ž9Hó&éÑ»/$,Z0SgÎаqÓ<:MHINdç¶­T©R™aß⫯:qùr þ½¿Fþ‡¹‰ SÓ—ÃmÚ´A¥RAe0X¾|9îîîDGG#—ˉ'==ݨœ’Z­–çÏŸGll,‰‰‰DGG“€N§C¯×óé§Ÿâß»/–ÖY[¤£½-*só\ô?±…½V—Òé03{3€îß aíª•8rœÛ·nѺe -Yг‹k¾þ¦\.çÛaÃÉTk©[§§OþF­:¿ñ!›ä@ÓjÔ|óM?,Xˆ K—.¥Y³fÄÆÆ’––†‰‰ eÊ”y…£œ ª§OŸâââB¿~ý(W®ÅŠ#00¡C‡‹ÅŠcÁ‚…¬]»ŽÁƒãäèÀÑCû±qp%9)‘èçaDDFOTd$QáO ˆ$61…èÈH"££ÿ»JNJÄÌÑ>ÏjkW¯äÊå@¾êÚ&Náûßâêä˜/ð< }H@@;÷ìųP!¾þ-Ýý{å*€*y#óôÉãÌ_°€¨¨h<=³Œ‡ÚµksîÜ9/^LDD'NœàÎ;XYYááá^¯G*•’™™Ihh(5kÖdéÒ¥øøøçéÓ§S½zuRSSyðàööö”)S†;wîŽÊÜš£¿bÀ !x. 9ñLŒcúäñìÞ„BÑh4€Þº…I¥R£öN+0¼êe¶nÙHÿ¯û`fnΒ嫨߰1 ……Âi¹šÌ æÏžIå*UYµv}{õäÌéÓôêûMî¢ïÉK:÷ÓЇôêÑ•F›¢2WB“&MèÞ½;;wfÙ²e”)S†;vðÅ_Pºtiãv(•JINNæöíÛ|ÿý÷ìÞ½›B… ‘’’BZZÌš5‹;w2þ|ìììG¡PP¤H¶nÝJÃF(S®ƒ "**êµC>´ƒ~C‰Rå9|äˆq»ý×(.!‘Û¶xþ4‘Ïž™™ù6×QNfÆKûø¥ógÜ¿ÁAAL™þ#=ûôÃì^cƒ^©iGíçãë2èÛá|ôQI.œ;ÇüEKr]E,ûe±¶²&-%‰¹³~¤Rå*^¾ÂÄ€jÔªÃæÍ› bÍš5lݺ•Û·ocjjJ||<óæÍ£E‹ÄÅÅ!‘HÐétœ!C†pîÜ9ãý7®ѯ·?ÇŽg|À$ºvï‰\ñÞ¬Â÷¶…=}öœVmÚ!,TæØÚ;àéêDñ%pv+„·‡ E‹ÇÁÅ'{ì‘Ê_峘Èd(LMyúä1kW­ üYþ½ûR¹jõ×[aZu®¸Î¡î1}út–­X…waO6mXG»öíóT¿0[_Ò L™2‰Õë7ÃÈïFP½Vmd2j×® ÀÅ‹ñ÷÷G¡PЭ[7ž={ÆíÛ·©Y³&¥J•ÂÍÍ µZMHH¤_¿~¤¦¦"þðeÿÛ`ÈÊ  nݺôìÙKKKôz=J¥KKK:tèÀéÓ§Y²d Ççè‘#ÈÐsãæMzöîMƒOw¢¾«w<ß.ˆ÷ÑdR©p°³Ë•Ú¶{uSƉE ˆ£ûw‰nÚ‹JåˈáCˆÝ;~â-9åúú‹U9TBˆŒÔd1gætacmõ‚‡\S$¿ÃÙßÿÖø[Ú¶n)BnÝ<?ÿü³Ðëõ"99Y¤¤¤µZ-DÇŽE¯^½DRR’ÈÌÌ©©©B!êÔ©#„‡‡‡ˆŠŠ"99ÙxvËþ,99Y qüøqˆ%J///!—Ë…µµµÄˆ#²(¾Z­èÑ£‡èðe{‘þžtxx¸ñ>Ôò.eJ•OݧO[ùEÌ›1E|7¤¿èÒ¹“øõ—Ü?Ù¿w±fõšk,T¼˜°²´‹Ì}zõÝ:¶ËOúþ]ѱ};!‘ ªV®(öìÜž•À—™)Ö¾(•’’"ÒÓÓEhh¨5j”h׮زe‹8}ú´xöì™HKKƒAüúë¯ÂÜÜ\Èd21fÌ!„x (9(%%Eèt:1`Àabb"är¹°´´«V­µjÕ666"::Z¨Õj¡ÑhD¿~ýÄܹsÿ›ª]³ú{!Ú7t€Ø»wïËY£W/‹Ï›7Ú·wC²j >\tíØ>åcRÄ´É…•¥…°´P‰)'ˆôÔäßÏ5 {öì†?š¢×ë…F£§Nžžž">>^¨Õj‘šš*„ŸŸŸ°¶¶ÎÎÎâÖ­[B­V¿œ?èÿV«ÕâÑ£GÂÑÑQxyyeü¼e‹HMMsæÌ‘‘‘"55U¤¥e­<}ûöË—/ÿÇôÞÍøàë7øì³æx8;P¼x1]=qu²ÃÓ³0vN®XYZäÊ"’J$ÆHzLdsfÏâÇY³)åçÇîÝ;iþÙç¿ëK:- eî¹Ò{wí`ÌØ±߸Eû¶­™5ufR½K[Ì,¬(äl§—.î¸:9àìꊙÊÈ )D=gá¼ÙLš<µFÃÄ€ <ó×üÑ‹œ¥ùîí›Lž<™õ›¶P¾lØKÃÆÍ^{m•*U˜~Œ”Äx¤JKt5Î6œ»Ȥé³Ðê ´mýS§N5¦ô¾âA–ʰwÌ™–EËŒÙsÐiu¬X¶˜.Ýý‘¿a%T*•üúë¯L˜0sssªV­JåÊ•³Ž„R*ùþûïQ«Õ( ‚ƒƒÙ°aÅŠãÙ³gøøø¼1¬‘£K£¡R¥J¬X±‚¤¤$d2YŽ+˜F£ÁÝÝéÓ§S¿~}.^¼ˆJ¥úÛCï@fJ%ݾêÄà!ƒ)V²TΡ¹).n¸¸yPºt©WŒÁÌL5)‰^âðñ“+VŒY³fÒ¨I³·Ä¼dØÛ¿ÎËm`ë–-Œ?! qý¹†ï¯s÷BXZÒ¼ysQ«ÕhµZ#0T*QQQx{{sôèQÒÓÓQ«Õh4ìììòçl5°¶¶&..ް°0Š-šãa‰„ÔÔT7nÌîÝ»2xE|}Œ¥d>˜`ª·“—.œeñO+Þž\¸³xÒ.²zÍ:ºvëÎ… Þ ž?Nþ%ðây>®]›þ=iÔ°!—.]¿G74Zužœm±±±*T­VkLáÉŽÔ‡¿ÈЏ{÷.BÂÃÃÑëõoù½i 377G&“ìEˆ·±¦OŸNе`֮߸Îtã¿m²²´¤Dñ¢Ø©ä¬Y·t+°³µÅµ7––¸8Úáìì‚“+æff˜«Ìya>èJ 3œŽ…•5ßE™rò4ñÙQôˆð0&L`ͺ T­R™“'~£Â‹ó·’“S±4Sæz{IOKeËæM´hÑÂ_ÊVdœœŒÕ1²Ã‹-âÑ£G¯Dôó²ÙØØðÑG‘–––«íH§ÓaiiɼyóhÓ¦ &&&+ˆò ÏÂ…9wþ™Z=ÑáO‰Œ'":Žôô Þ½ÅùSÑh Yi8Ña˜*Ø9ºb¦RakiŽ«« î…}±°´âØáÓ®ý—|žÇÓu”ff„ܺɌiS˜9{&2?-[J篺¼”Å!„Èubâá{=j4ÖöŽddd¼´èõzŠ/ÎÙ³g1 ,]º…BÁŠ+Ëå¨Õù+E—?»~ý:]»v}+€$ jµšëׯS»vm4hÀåË—¹wïÞ¿@ƒ©LŽÊDŽw‘bxÉä% $ÄÅ—˜ŒZ­!,ôOž<%<*ŽÐ'aØ¿ K+víÙûæÂP9.?âb¢Y¼týûõeܸq88¹¼v¥2{‹¹ÿàÞ~œ>å«ÖâhoOßæŸa00111Ò4´Z-NNN<|øÐ¨ƒiµZ6oÞÌüùós |¾=–+!==øøx¤R©Ñ ð&îµ™™k×®Åßߟ)S¦Ð¬Y3¤Réß{'%Ú`п}Ÿ–H±upÂöEÚŽŸßG/}]س'OœÈx.ž;øqã9zü8?mÀĉTÊ!¶–í1•åáONL`á‚yÌž;Ÿ¸øztëÂèÑ£qpr!""///ã6¦ÓéðòòÂÇLJˆˆ#Á¾lÙ²+VŒäääw¯¯/'Nœ xñ⸸¸ä¸%eÓ`›4iÂ’%KX°`Ÿþ9ááá$&&~Jô»ŠN§ËS¡€¨çá 2ˆZuërýæMV¯\ÎC‡Þž×9ð²aµ}ë*WªÄè&˜˜ˆ¯waV®^O‘b( nݺ…©©éKº\.§J•*ܹsç¥J¥’øøø|ÍE¶òìèèˆ\.g÷îÝÄÅŽQgËÌ̤^½z nß¾¿¿?ÅŠý}U=þqi5LÍrÇ•Ök5¬^ñUªVcÖÜù 8ëÁ×øª›ÿk3VszHFÅýò%š6jHëvðô*Ì…³'©R±ü‹¾$F@„‡‡³qãF‚ƒƒ`Q«Õ”*U ;;;t:˜J¥’gÏžåk ‘ËåkN^}(W®4W/]àÇYs^«ëäž„öG÷BЯÕjÔäæíÛ¬üi)‡¢j:èõ:< {¿d11hÐ FMpp0¦¦¦H$¬­­ù裌&¾N§£T©R$''ç[‘>vìU”¼~ýúXZZ¾@™™™T¯^ãÇ“œœŒµµ5–––f(#Ï[˜AT&£R»aÝZV¯YKbJû÷î¦I>ë5›˜˜pèØI”*Æ ø¦ß׌ùýK¤3!Ò?éulݺ•²eËb0Ðjµ¤§§cmmmJö ¤P(Œ¡¹\ž§äCNÇ£G¨V­Bš4iBLL æææoìG­­->>>œ8q—¿­ôK¾W ìŒÊw–~•?Kb|sfNgÑ‚ù4kþ[¶l¡BùòùÐëØ°vÃGŽ"5=ƒšµjqêä æÎ_ø*cQ€ÜDúÊòòòÂÚÚ.\¸À¨Q£xôè …©TŠ……&LàÒ¥K¸ºº“çùÉ®æqöìYÚ´iÃôéÓ:P¶ÿ)' éõz>ÿüs:„ŸŸßßFmÍ7€ q1Q Þ=Gü¥‰ÐéøõçMŒ5777fÌžKåj5°°±ÃÜTŽÈã9ÎÒ´qv½f=Ë—.âàá#T¯Y;GKíÏÇ 8::²mÛ6d2iii,X°€ÀÀ@?~Œ©©)*•ŠÅ‹sáÂ:vìˆT*åÉ“'yZ²ÍuFƒ¿¿? jÕªøúúæÊ1¨V«©^½:))).\˜äää|‡Tþ–-ìÞ½{”.Ugg'|ŠÇÓÕ‘â%JRÈËg<< aãàŒRiúF´勲uçÏœâàýX[[3nBŽÎ¿gdè´ZÌÍ•HréEŽŠg挙9g>2‰„ß|ÍÈQ£rU¡Lú'Kmذaü0v mÛ´!99™ÃGŽP¬X1´Z-»víbÓ¦M?~œsçÎakk‹÷îÝ£Aƒyz! … fçÎÌš5‹ºuë’žžþÒ\åä\B R©(S¦ üøãLš4)ßá_ ½^ODt Ñ1\»qëå· °°PáèèD!7'Ê–«€½޶–xùÅÞÑg[\Ý !‘Ê8}ò7"£V«ùªkwJú•zÍ ÌÍ”¼­~A¯eÃÚµŒ;–ðç‘4¨W—€€€Wê?çÖÔÏÌHgÍʟؼy3‰‰‰Œÿa Pk´YÚ“PÎ;Ç·ß~KÑ¢EBP¾|y‚‚‚òl§¤¤péÒ%J–,É'Ÿ|Brr²1îö&ðdKFFmÚ´aĈ¬ZµŠ 6””ô—‚è/Q¢’šFJj(BCùX[[úè¡Oùxþ±1QHæ„>z„££ŸµøÜ³Êq¥2}³ùâù³Œün$'NŸÁÓÃU+–Ñ­[$²ÜÿL!¦JS@ppß^¾5šk×oжUK&PÒ¯ôK×ß5Ïâ)Rä¥0ÇîÝ»Q«Õ¹> E.—3lØ0jÕªExx8>ÄÍÍÍH”ÏM\L¯×ãééI5¸ÿ>+V¬ N:xxxðìÙ³¿ D)åQ.“Šû·ƒ_pHf†ˆzž+ j`` èÛ£Kg˜>½ý» ¥ÒTXZ¨ÄÄñcELTd¾¨´µkT¥Kù‰M @”ú¨¤ØñëÏ9^rãšðòòmÚ´Z­V¤§§‹gÏž‰Š+ŠÐÐP‘‘‘ñZJë›V«›6m:uʪMÝ¡ƒØ¹s§Ðéto½÷u-))IÄÅÅeÜ2j”(T¨Ð|ØŠ„Z¦¦Jì\sò?WÚPg¤3gÆ4ÊW(ϪÕk1è Ìœ5‹1ãpprÎóPo\»JÄónܼűãÇ™8aç/\ eë7SF###ÉÌH'22333ÜÝÝqvvæÒ¥KoŒÌg[UR©”«W¯Ò¾}{233¹~ýz®êIþphŒ,,,033C¡P ÑhèÞ½;æ/s,þå~ ^Ðç›|TÌ÷BöòÅÃÕO/lì°¶´ÈõóG³x߮팟Àå `:uü’Fâ«Îr]À²ÎåJKKÃD ³gþÈÜ9óHWkéо £ÇŒÅ¯Tîªcdffb0صk...<{öŒèèh®]»öF¾röÃOKKcÔ¨Q˜™™R©$** “W£‰¹\ŽB¡@«Õ¢V«<¢˜˜V­ZÅ'Ÿ|BÅŠÑét)R???®^½ú—ÄÇþr !8|ägÏž£gî¨&]:GºÖ@zR<`ÀÚÞ+K Üœð*R[;;ÜœqprÅô9K¥R¡Õj9ýÛQ¦MŸÎþCG)_¶4û÷î¢É‹CH„˜)rg:_»v/¿ü’¨ÈHLd2’SS)Y¼ãǧe)%nnnœ=wŽýR¥JJ•*E\\—/_Î1¤ñG¥X"‘ùÕÔ®]› 6P´hQÜÝÝUb³õ©ÇsàÀ¶mÛFË–-0`OŸ>¥]»v\¼x‘©S§R­Z5ÒÓÓ9zô(×®]3:CBB^Êý×ÈÚÊ‚~}û0`À@\=^>V@“™FLl<‰‰I„?~Àã°g\ "&ü IÉÈÍT Scok‡µ£+;víå§Õë±´°àÇ©“0pÊìthƒ™TŠÊìíd®¤¤$†–-[X¿~=NNN\¼xõk× ²ÌÛ‰‰JSSTææ<þ€²eËÒ¬Y3jÕªÅÂ… yøð!žžž¯PSÿ¬g3¥R)ŽŽŽÌ;½^¥¥%666Ô®]›gÏžqùòeŽ;ftnž9s†† Ò¤IêÔ©CRR111 6Œ7’œœL§NP(lܸ"##‰‹‹ûwÈÜÜŒ]¿bðàÁø+ùÚkJî*Ü= áWêUÓ==-•ø˜(bâرu ññ téÔqãÇãógþ‘ÈdÒ·ÒIããèÕ»7£ÇŒ¡\¹rÆ eïÞ}ضc]ºtÉ›£òÊeIKOçùóçÆ´¥R‰··7‡¢ÿþ9r›ÿ¼*©ÕjFŽɹsçËå|öÙgܺu‹þýû“` ­LŸ>´´4–-[F«V­(]º4­[·&==E‹áççG©R¥ðöö¦hÑ¢L™2GGGnݺõïÞ¤ m[µäûÑ£)[¾â»Pe¶ü¼…[!wÙµk'ÍZ|þBŠ<‡ú>B¯cóÆõü0!€èèXfÍžc\>ÌöíÛ2d¶¶¶|öÙÛÃ%a01€óéÒ¥+ƒÑ£Gn¬äZ»vmsž?+ÖãǧuëÖ4iÒ„òåËÓ¾}{–.] d)·µµÅÊÊŠjÕª‘œœL›6mˆ§N:øøøP¢D ”J%r¹œ½{÷bjjÊýûï¿Xç{³Âd2Ÿ5mĉãGØòëöwÀ/›7ðYÓÆ$%§°jíº7‚'ÛH{wæâ¹ÓÔ«W—N]{àãí—·7)))!ðððàöíÛôêÕ‹Û·oÓ¾}{öïߟãßÐff0ÎL*W­ÆŽ]{±±±ÅËË‹k×®a0¸{÷.S§NeΜ9·mÛ†N§£U«Vèt:#{òÉ“'øúúi¸ÿ•/ãG½:µxöœáß&#= ¹Ä€••Žn…077ÇýEÖ©£k!,-TØÙXcfñjyÞèˆçL›6…7nòõ×}iÕö˼¹œ$¬­¬HMNbñÂ̘5›Ä¤$ø†ÑcƹC , k×®T¬X{{{¬¬¬prrB¯×ãååÅÑ£GÙ±c[¶l!$$„ˆçÏñpwaϾ ¿?p•JEbb"W¯^åèÑ£x{{“™™I¹r娲e ÑÑÑ´nÝšéÓ§Ó¥K—— ”?þkkk#·èu±1???V®\‰Z­ÆÔÔ???®_¿þÚ{är9±±±lÛ¶ €âÅ‹S¦LÔj5¾¾¾”-[–»wï¾Ö®Õj133Ë—uöΪ[«³,}áóÑ“šOLt4Ññ‰d¦§óäáBîÞåÊõ[¤¥¤Hqró@£Ñ`i¦ÀÝÝ^pöìYjÕªÅø€IX½(2™û=TŽÌÄ„3frñR w<â“ë0mÚ´Wj•,Y’ 0açΟ§dÉ’lÚ´ c*qçΑH$„……Ñ¢E Î]ÄãaaaÆUãþýûܸqƒíÛ·ãíímLêËÖyìííùùçŸñóócõêÕ 0€ÔÔT2339tèQQQøûûãääôJÄ]£ÑP´hQ4 ‰‰‰ØÛÛSµjUŽ?Ž··÷++—T*eß¾}Æÿïß¿ŸR/ ™LFÕªU ~éž%JP¬X1,--9xð ±JÚß æwÑD&ÃÆÞ{GŠføé§/;5jRÒÒÑj4„?yÈÓgÏIJMgáÂ…ø÷èAŸ¾}ó5ŽÃör÷>¿¹€w!w6¬[CÇŽrtRV­Z•”®9sö,cÆŒÁÂÂÂè”3 F0899qþüyLPP111 Ôj5ééé´mÛ–æÍ›¿RD*ÛAèææÆ´iÓ˜2e ]»vÅÜÜœ.]ºÄ7¨V­ŽŽŽ¯Ÿ ×ëqttÄÊÊŠ§OŸbooµµ5ãÇG.—¿¨÷• TröìY#›àæÍ›>þ%o·D"!33“S§NñÍ7ßpàÀFmäùXXX0mÚ4ôz½<®º‘––F·nݰ±±aíÚµ˜˜˜žžNll,ÞÞÞ\¿~Ó§O¿âB`ffFÅŠ¹sçŽÑ#­T¾œ™=ƃ?óòò¢E‹ÆjgÙ+”©©©1 \¥RáããôiÓˆŠŠ¢aÆ 6 ¼È÷s¢ÿ8aæÊÜgt¦§¥0ÎLªVªÄO«ÖÒ°~=Nœ8Áä©Óqr}{¥Šƒrïþ}<<üúËf9–«´žlqqq!%%…>}úн{wF——§N2|òàÁ.^¼h4ųõ¥R‰‹‹ Õªe4LXXƒqãÆñäÉîß¿Oxx8&&&dddP¯^=Š/ÎâÅ‹±´´ÄÓÓ —/_&33ó ¬‚R¥J‘€^¯7^öìYîß¿ŸU×ñÅçƒ bذaÆ "ÑÑÑFó=00¸¸88@|||˜çÏŸS¯^=*Uª„­­­Ñ*ûsAªl~Odd$>|˜I“&±xñb¢££«B¡ R¥JÆã8þùg,X`ìãØ±cL›6ÆÓ´iS*T¨À¨Q£²tÒ¿»uëÖ̘1ƒòåË«„|PÊ"é¿^g‰‰frÀÌœ>•;²tÅjæÌ‹›‹s¾ÈãA—/Ñú‹Ìš3G‘˜˜ÈÁƒ™1c-[¶ÄÑÑ‘ääd,,,øä“Oøøãyöì:­VK¥J•(_¾<–––¨Õj5jÄ“'O¸|ù2mÛ¶¥xñâ¬X±ÂzÈ.RU¬X14h@ÇŽ±°°àÎ;Æš>‡æ×_ÅÔÔÔèÖjµ|ôÑGØÛÛ3oÞË5[7111êRÛ¶m#**ŠèèhNœ8AçÎqttdñâÅ´hÑüüüP*•4lØN‡\.ÇÔÔ4×LÞyzÁÕ+W{üuFÚ;!èúíèaúöò'<üsæ/¢K^FðdŶôÈLLŒ§ñ¼QA7èùyÓzjÔ¬EÀäi/ 55•ŒŒ œœœ8räÍš5cäÈ‘?~Ng Œþ™–ý¾øâ Ž9B\\NNN´iÓ­V˘1c¨W¯{öì1ê$›7ofÙ²elÙ²Fƒ———ÑÂÚ¸q#¡¡¡FH$#9_*•òå—_âêêŠD"ÁÜÜ­V˽{÷æÔ©SüöÛoܼyóÅËmBLL U«VeêÔ©ìÝ»—ôôtÊ•+G÷îÝ4hnnn„‡‡³gÏ”J%›6mbîܹįÆþ=+ÐÎ=ûÙµ÷*s%ŽŽŽ¸»{àåáJao_¼}|ñtsÆË·(6vöØZ[bbjžƒm‚¹™wCn±fÕJâãøú›þ”¯Xùµ×ë´j¤2Ù[óꃮ\büø ìÞ›s|Ë`0˜˜hô½\¸p;;;Μ9C… ¨[·.uêÔ¡bÅŠx{{«Î«T*¶nÝj\©,,,ˆˆˆ0Æ£J–,ÉÕ«Wyøð!={öÄÏÏV­ZѦM/^Œ¿¿?>>>”-[…BAÍš5Ù½{7‰???ÒÒÒÐh4Ô­[¹\Ž••UªT12¿víçÎ#99Ú·o‹‹ ¤bÅŠT¬XÑh%vëÖ6mÚððáC,,,(T¨©©©8;;S«V-Ž;†Á`Àßß߸þm±0!©i¤¦=%ôñSμÆ]ni¡ÂÑÁ/o_|½ ãædg‘ØØØâãéATT$£ÇŽÅ×·7¡á[*“é_ä£Ks jFGqøða1oÞ<±mÛ61gÎa0DZZšˆÇ=zôãÆÇÉÉÉ/ýöl2±bÅļyóDTT”˜9s¦H$bÔ¨QÆj÷gΜ… AAA¢yóæ¢M›6¢Y³fJ¥òŸ-4ž›¶dÞL‘šš"„AŸïBä¡÷ïˆO>®óÒgÇukÕø[~ƒR©/^4>ƒÁ ´Z­HNNZ­V>|X”)S&w™+r¹P©T¢iÓ¦bòäÉbâĉâúõëâóÏ?qqq"##ÃX`üEÏÓÒÒ^ÊÆP«Õ"11Qlß¾]”*UJ)RDôéÓGxxxˆ[·n &딀1cƈիW‹¦M›Šúõë‹7n;;;ááá‘gý#Åú Æwc'`miW!w¼ŠÇÍÙ‘âE})äS ';<ÜܰqtF*•åhög»ÝïܺÎì9sX±jí{;Ûým’™™ÉÀY·nÅŠC¯×£Õj^âmÛ¶½d­½I´Z-Z­–C‡ñÛo¿Q£F üüüðòòbùò帺ºÒ¹sg233Bäx¨ŠF£A¡PðÅ_ðÉ'ŸÂæÍ›B`iiiÌþÆÓÓ“˜˜Ο?OïÞ½qvvF§Óå¹<ñ[ýþ'ÄD*ÁÚÚ G'<\)âë‹§OQ<Ýœ)Z´Nî^¤ÄEÒ·ÿ@|¼}ع{©iéû8-,,°µµ¥U«VtêÔ OOO’’’رckÖ¬áÞ½{y®$•J±´´ÄÖÖ–aÆñàÁÌÍÍéÝ»·±¬µµõ[û•J¥( $ ?ÆÁÁkkk~úé'Ž;ÆÓ§O™1cGŽaݺuÆlÚ'Ožäé%üWèm¢T*±²0':6þ‹\.ÇÞÞžèèhËå$''“žžþÎÇ/egeŒ3†J”(Á¹sçøá‡HIIÉuQñìÊ­ôéÓÇhÔªU >ýôS:vìH¡B…^ËúË­°¿[233s½=üÕ¢Õj‰ŒŒÌ²üÞó™¥ÑÑÑÄÄÄpíÚ5’’’¨P¡*•Š   Ê—/ÿÆ¢âR©ÔØÍ–{÷î±eË222hß¾=ß~û-•+W¦y󿏏¸ä<ÿ˜VÐò.— ™L&¬¬¬DÉ’%ÅÈ‘#E•*UDHHÈï'½P²³•d!„ˆˆˆW®\ .#FŒ­ZµNNN¢jÕªâСCÆë¦N*lll„B¡ÈŸeú!naÿ¯bjjŠ\.ÇÇLJ»wïÒ¡CÚ´iC… Ëå„„„Èýû÷‰ˆˆ0V‹ÕëõøúúR»vmÚ¶mk%,,ìƒà+Ð$r¹oooj×®ÍÉ“'‘J¥H¥R~þùg#{ñôéÓìÙ³µZ³³óK9øqqq<~ü™Lö^ Oè333ãv‹­­-J¥’˜˜#C@&“‘žžþZÇ`¶Óó}H€ äDZ0ò®RLCäS R ¢` $Ÿ'ÌCäSnKãóP ù”cÀ¸KS±@ò&: ¸xl(˜É£leJœ€k€kÁ¼H.$(Dgû¢/€´‚¹)·HÚ ¬DÃËŽÄ‹@} ²`Ž ä +OýXÉQU€–BWAËjº˜x¥æ›Hµ…6@SÀï…ž$)x ÿ/D¼Ø¢î¼pó¬B_wáÿ«ñFð@\¸IEND®B`‚lft-3.8/icons/144x144/router.png000644 000766 000000 00000025635 12062431750 016176 0ustar00vicwheel000000 000000 ‰PNG  IHDRçF⸠pHYs.#.#x¥?v OiCCPPhotoshop ICC profilexÚSgTSé=÷ÞôBKˆ€”KoR RB‹€‘&*! Jˆ!¡ÙQÁEEÈ ˆŽŽ€ŒQ, Š Øä!¢Žƒ£ˆŠÊûá{£kÖ¼÷æÍþµ×>ç¬ó³ÏÀ –H3Q5€ ©BàƒÇÄÆáä.@ $p³d!sý#ø~<<+"À¾xÓ ÀM›À0‡ÿêB™\€„Àt‘8K€@zŽB¦@F€˜&S `ËcbãP-`'æÓ€ø™{[”! ‘ eˆDh;¬ÏVŠEX0fKÄ9Ø-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+®ç*x™²<¹$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóýxήÎÎ6޶_-ê¿ÿ"bbãþåÏ«p@át~Ñþ,/³€;€mþ¢%îh^  u÷‹f²@µ éÚWópø~<ß5°j>{‘-¨]cöK'XtÀâ÷ò»oÁÔ(€hƒáÏwÿï?ýG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)¬‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(¼ AÈa!ÚˆbŠX#Ž™…ø!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fº‘;È2‚ü†¼G1”²Q=Ô µC¹¨7„F¢ Ðdt1š ›Ðr´=Œ6¡çЫhÚ>CÇ0Àè3Äl0.ÆÃB±8, “c˱"¬ «Æ°V¬»‰õcϱwEÀ 6wB aAHXLXNØH¨ $4Ú 7 „QÂ'"“¨K´&ºùÄb21‡XH,#Ö/{ˆCÄ7$‰C2'¹I±¤TÒÒFÒnR#é,©›4H#“ÉÚdk²9”, +È…ääÃä3ää!ò[ b@q¤øSâ(RÊjJåå4åe˜2AU£šRݨ¡T5ZB­¡¶R¯Q‡¨4uš9̓IK¥­¢•Óhh÷i¯ètºÝ•N—ÐWÒËéGè—èôw †ƒÇˆg(›gw¯˜L¦Ó‹ÇT071ë˜ç™™oUX*¶*|‘Ê •J•&•*/T©ª¦ªÞª UóUËT©^S}®FU3Sã© Ô–«UªPëSSg©;¨‡ªg¨oT?¤~Yý‰YÃLÃOC¤Q ±_ã¼Æ c³x,!k «†u5Ä&±ÍÙ|v*»˜ý»‹=ª©¡9C3J3W³Ró”f?ã˜qøœtN ç(§—ó~ŠÞï)â)¦4L¹1e\kª–—–X«H«Q«Gë½6®í§¦½E»YûAÇJ'\'GgÎçSÙSݧ §M=:õ®.ªk¥¡»Dw¿n§î˜ž¾^€žLo§Þy½çú}/ýTýmú§õG X³ $Û Î<Å5qo</ÇÛñQC]Ã@C¥a•a—á„‘¹Ñ<£ÕFFŒiÆ\ã$ãmÆmÆ£&&!&KMêMîšRM¹¦)¦;L;LÇÍÌÍ¢ÍÖ™5›=1×2ç›ç›×›ß·`ZxZ,¶¨¶¸eI²äZ¦Yî¶¼n…Z9Y¥XUZ]³F­­%Ö»­»§§¹N“N«žÖgðñ¶É¶©·°åØÛ®¶m¶}agbg·Å®Ã“}º}ý= ‡Ù«Z~s´r:V:ޚΜî?}Åô–é/gXÏÏØ3ã¶Ë)ÄiS›ÓGgg¹sƒóˆ‹‰K‚Ë.—>.›ÆÝȽäJtõq]ázÒõ›³›Âí¨Û¯î6îiî‡ÜŸÌ4Ÿ)žY3sÐÃÈCàQåÑ? Ÿ•0k߬~OCOgµç#/c/‘W­×°·¥wª÷aï>ö>rŸã>ã<7Þ2ÞY_Ì7À·È·ËOÃož_…ßC#ÿdÿzÿѧ€%g‰A[ûøz|!¿Ž?:Ûeö²ÙíAŒ ¹AA‚­‚åÁ­!hÈì­!÷ç˜Î‘Îi…P~èÖÐaæa‹Ã~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DÞ›g1O9¯-J5*>ª.j<Ú7º4º?Æ.fYÌÕXXIlK9.*®6nl¾ßüíó‡ââ ã{˜/È]py¡ÎÂô…§©.,:–@LˆN8”ðA*¨Œ%òw%Ž yÂÂg"/Ñ6шØC\*NòH*Mz’쑼5y$Å3¥,幄'©¼L LÝ›:žšv m2=:½1ƒ’‘qBª!M“¶gêgæfvˬe…²þÅn‹·/•Ék³¬Y- ¶B¦èTZ(×*²geWf¿Í‰Ê9–«ž+Íí̳ÊÛ7œïŸÿíÂá’¶¥†KW-X潬j9²‰Š®Û—Ø(Üxå‡oÊ¿™Ü”´©«Ä¹dÏfÒféæÞ-ž[–ª—æ—n ÙÚ´ ßV´íõöEÛ/—Í(Û»ƒ¶C¹£¿<¸¼e§ÉÎÍ;?T¤TôTúT6îÒݵa×ønÑî{¼ö4ìÕÛ[¼÷ý>ɾÛUUMÕfÕeûIû³÷?®‰ªéø–ûm]­NmqíÇÒý#¶×¹ÔÕÒ=TRÖ+ëGǾþïw- 6 UœÆâ#pDyäé÷ ß÷ :ÚvŒ{¬áÓvg/jBšòšF›Sšû[b[ºOÌ>ÑÖêÞzüGÛœ499â?rýéü§CÏdÏ&žþ¢þË®/~øÕë×Îјѡ—ò—“¿m|¥ýêÀë¯ÛÆÂƾÉx31^ôVûíÁwÜwï£ßOä| (ÿhù±õSЧû“““ÿ˜óüc3-Û cHRMz%€ƒùÿ€éu0ê`:˜o’_ÅF ÈIDATxÚìiPTgöÿ?½C7MCÓÝ€Ðl²¨îâBÔ@ÔHD3šÉ:13•Ìòj¦*•©š—ÿwSS555SS35f–”•_’JªÆ$Æ$ÆDwq\P }í½éåþ_Ä{KD”šÌýVÝR)éåy>÷<ç9Ï9ç*¸¿²g€mÀ| Ð!ëA  pG€wïþ}R²ÿ‚€ _òu—…ßecB•ò€É×}®Ž»ŒHR|ž#€A¶à²&¨ÎÞ ¸ Ì“ÇGÖ$Ô,úTwð7à1y\dMRÆ»Fçc4jy\d=„B@xQ†GÖ#H ¼¬*ä±õˆªT¹ò8ÈzD-T~䳬GSDÁ·"Y²IJydÉÉ’’%$KH–, Y2@²d€dÉÉ’%$KH– , Y²d€dÉÉŠ%ýOäB«T*’’’HII!)) “É„ÉdÂ`0 ×ë1 h4P*•ÄÅÅ1:: @0$ 1::J8&p¹\8NÜn7N§§ÓI?CCC‚ 4WOVVv»´´4ÒÒÒHII!!!äädL& Fâãã¥K¥R¡ÑhP(ètc4A Hùý~ü~?—Ë%Á444„Ë墯¯ÞÞ^z{{éì줣£—ËõƒhÎg$&''SPP@vv6YYYÌ›7ÔÔTÒÒÒ°Z­X­VRRRÐjµ3òy|>ƒƒƒôööÒ××GOO½½½ àp8p8455100 4+N›RINN , ¨¨ˆ¬¬,²³³±Ûídffb³ÙP*c˵ ‡ÃtwwÓÑÑA{{;ííítwwsëÖ-hii!ËMÛ‡T(ÈÎÎfùòå”––’™™I^^yyydff¢R©bö³ ‚€B¡øP’5ºsç ÔÖÖÒÚÚ:§|¨˜(99™+V°|ùrrssY´hÅÅŤ¤¤Äô  ‚ÀíÛ·q:dddœœ<¡Uìïïçúõë\½z‡ÃAmm-µµµ Ë=Š222ظq#Ë–-cÑ¢E”””™™ù½;9Ö‡¹téõõõ\¿~[·n±sçNvïÞÑhœxíííÒï×××SSSCKK‹ ÐdTTTÄÆ)))aéÒ¥,_¾½^³ƒ‰D…B súôi.^¼H[[.—‹ÄÄD4 «V­¢²²’ììì‡òÍ<uuu\ºt‰k×®qäÈnܸ!4ž233yê©§Xºt)k×®¥¸¸µZÓàtttÐÖÖÆ±cǨ¯¯—¬£^¯G©TRYYIaa! Ì›7'žxâ‘Þ+ QWWǹsç¸rå Ÿ}ömmmrÀl6³uëVÊÊÊX·nË–-‹ip<õõõ444PWWGSS&“‰øøx”J%K—.eåÊ•äååa2™…B8NZZZèììdÞ¼‡o¿¤V«Y¾|9K–,¡®®Ž… ræÌ>ÿüó˜ð‘fÅ) Ö¯_OUUk×®eíÚµß ÞÅšB¡ ¼û;wެ¬,t: .dÍš5äææb2™ˆ‹‹“¬Q(¢½½#GŽ`6›Ù¹sç”o@ À™3g8uê‡âĉ³ºkSÿo&ßÐb±ðÊ+¯°cÇž}öÙ˜_®î…>..¥R)í®~ñ‹_ðÄO››‹Ñh”"ÙâÿãÁÁA:;;ÉÊÊš”3ý ‹$ÆÁ’’’HMM¥µµ¯×ûÃhÕªU¼úê«ìܹ“ªª*æN¼C¡ >>³ÙŒÃá ­­²²2RSS¿ç‹ð(•JÔj5qqqܼy“ÎÎN Ðh4Sþ<ƒ’’l6éééx<:::~˜©T*ž~úiž{î9^xኊŠb~K~?è“O>áäÉ“„ÃaV¯^Õj½o S"‘V«•eË–qûöm Âh|…BAFF  D"‘Žm4y饗¨¬¬dÇŽ3v&5:{ö,Ÿþ9‘H„òòræÍ›÷À(¸ÛíæÎ;(•J-Z„Ïç#µÏ•ššÊË/¿,eìÛ··Û=÷JNNæµ×^cëÖ­TTTÌI«#ª³³“'Nà÷ûÉÏÏgûöí¤¤¤Ü7¶#Á`A(,,”NðµZí´œÕét:vïÞÙlF¯×óæ›o2222w2›Íüò—¿¤ººšµk×2×õÖ[oÑÐÐ@RRÏ<óÌ­O Àãñ`4Ñjµèt:)ßhºn$…BAEE…dÝöîÝ‹Óéœ{™L&~þóŸ³cÇÖ¬Y3§Áq¹\?~œK—.¡Ó騶m ,˜ÐŒŒŒ ÑhÆü¿™:ô]·n*• AxóÍ7§¢¨¤ÑhسgUUU<¡PhNlÕÇ[†š››ùàƒ$æ±Ç#!!á¾V$ãr¹ðz½Ì›7oÖ–í²²2>ŸüãÓ–.õYýñLee%6l`hhˆ7nà÷û±X,˜Ífl6›4ÐÑt$§žööv:D?iii<ýôÓX,– ý¯×‹Ëå"99yÖƒ£6l`ppîînþûßÿÆ>@kÖ¬áñÇgÛ¶mœ9s†¿þõ¯¨ÕjJKKQ©Tø|>l6999X­VÌf3 ¤¤¤˜˜3ŒŒðÑGqüøq’’’xöÙgÉËË›p …Bôõõ cæxÛ¶mô÷÷ÓÖÖÆùóçc ³ÙÌöíÛ©®®F«Õâ÷û©©©áÆÑÔÔ„ „Ãaêëë%ÿ “’’"å.Ûívòòò0›Í¤§§£Óé‡Ã¨Tª —ƒH$‚Ëåbdd›Í6%ë‰D8}ú4Ǿ €®X±bÌ1Åxr:x½^ÒÓÓc&\¡Ó騮®¦§§‡¦¦&†††b ;w²aÃRSS¸}û6µµµx½^RSS©ªª"%%…zzz¸yó&wîÜ! róæM._¾,íRôz=999èõzòòò((( 11›Í†ÙlF­V£V«ÇL’ßïçàÁƒÔ××óÌ3ÏPRRòHKˆ ܸqƒ÷Þ{‘‘rss©ªª"))iBxFGGq:ÒRKJMM¥¼¼œææfÞzë­Ø¨¨¨ˆÕ«WKN³ßïçܹs\¿~½^OEEÒ ñûý¸\.†‡‡ñx<ôôôÐØØH{{;ýýýRð­¥¥…`4ÉÎÎ&--Mª°ÈÎÎfþüù„B!.\¸Àþýûñz½¸Ýn^{í5–.]úÐߥ¿¿Ÿ÷Þ{öövl6?ùÉO°Ûí.]‚ àñxHJJšÐÁžM­[·Ž«W¯RSSí[·b  ÊÊJÖ®]+mY{zz8vì*•Š={ö°k×.¤ü`­V‹Á` %%E:IŽD"¼^/N§“ÁÁA)o¸½½ÚÛÛq8øý~t:z½‹Å‚Á` ­­ FƒÍfctt”ƒb2™ÈÍ|#~ŸÏlj'¸|ù2‹…]»v±dÉâãã'„bdd„rrrbv·©ÑhX·n ±x2\\\,ýìæÍ›466’——ÇöíÛ%‡r¼I¦R©ÐëõÄÇÇ“’’BNN¥¥¥ƒA|>.—‹ÞÞ^zzz ¹¹‡ÃÁ;wNÇâÅ‹©¬¬ÄáppäÈ>üðCöìÙƒÅb™Ôw¹~ý:}ôZ­–•+W²aÃŒFã}áw]½½½ètº˜´—””°xñb²²²¢–”6e€V¯^ÍÒ¥KÇÜyçÏŸ§¯¯òòr233*to:„V«c­²³³%G\„jxx˜ÑÑQâââ¤B»ÝŽ×ëåÔ©S;vŒÍ›7?p‡7<<Ì¥K—–6Uˆ¡·ÛJ¥÷T>Ö¤R©())¡¬¬,6R«Õ³dÉ’17ñÌhùòåQs( Åk¥ÕjILL$##c x‚  Ñh¨¨¨ §§‡S§Na·ÛY¹rå}'Øï÷óÙgŸñÍ7ß`µZY»v-Á`pB AÀï÷ãõz1›Í1ÓºW¥¥¥,^¼˜ýû÷G%¸8¥[&77—¬¬¬1ÎñÅ‹immÅf³±iÓ¦¨ä¾<ªï.†ôôt6n܈F£áàÁƒ®ûÇ#•E÷ööríÚ5úûûïû;~¿ŸÞÞ^´Z-&“iÒŸ9Ïj¡ÉdÂn·“““3û(''»Ý>Æ™¬­­% ²cÇ,X0ã~ø~:ŽE‹100ÀáÇ9zô(©©©$%%)ö£ÑHuu5 ÓÖÖ†ÃáàÀÌ›7OòˬV«Tùêt:‰D"¬ùºW^¯— . ‹/žµú¶¬¬,rssinnž]€233IOO—þ q:lذßüæ7(•J"‘ȸVbº$¡T*1›ÍìØ±ƒüü|Nž<ɉ'X¿~=ÉÉÉc€Ójµ¤¥¥I?[±báp˜žžš››iooçÎ;èõz-Z„ÕjÅï÷“––F||ü¤“‡ƒO?ý”dzbÅ òòòf «ÕJffæì[ ”””1>ŽÁ` ¼¼€«W¯bµZ‰G§ÓIi @¥R)-m‘H$ªÎçwAU(c0D„qËÇs8ÓÓÓ±Z­”””022ÂÈȈÔîEŒv?èu†‡‡ùòË/9vìíííÒÒ/\gCÑ vN £Ñ8&¯Y ööö"ÃÃà  R©$ÇW­V£Ñhˆ'..F#µVQ©T„ÃaÉ‚Dɉ\b$ûA1ï§ÑhHJJ"))é¡Þ;‰P[[Ë¡C‡hhh@§Ó‘‘‘!Ý0¥R)]3)ƒÁµsÇ)$ð]ç5--p8L$‘¢Îb“&ŸÏ‡×ë•þ‰Dp»Ýøý~ˆ‹‹“Ñu:–Z­F¡PLÊzˆý|Ün7ƒÁ€Z­ž±‰ºyó&_ý5gÏžÅçó¡×ëYµj«V­â“O>áâÅ‹tuu‘››‹Õj¾=n°Ûí¸\.Ôj5&“iÚNóu:]ÔÎê¦%lªP(¤¸Ç½ …”ê©Õj‰D"tww388ˆÏçÃét¢T*1 c@-–hÁÄßý®µ ƒ¸\.Âá0z½½^?cþ×ÐÐÇçÓO?Åçó¡R©HIIáùçŸgñâÅ‚ÀöíÛùꫯ¸yó&7nÜÎõ"‘Z­³ÙŒJ¥Âd2‘ššŠÕj%--‚‚´Z-Á`pÊ©0ÑôIÕS]"FGG'u§Ü;É÷Ò¯R©ÈÈÈ|‚p8,µ—Óh4x<i2B¡½½½twwãp8(//'//OGLX×h4$&&>ð?Zòù|455qèÐ!Nžg´$¦ +•JòòòÆ]J(**ŠZLlʯRZZÊåË—g´ ² ƒÔÔÔPWW‡B¡à©§ž¢°°ð¾>ŠJ¥B©Tâv»éëë“™“‰ì®\¹’ììl>L__߬|_1p›žž>nOI± AL¿‰ €ìv;ƒúúú˜( qåÊ Y³fÍ„†€ä”¦¦¦N:ܯP(HMM¥²²…BÁûï¿/UƒF"FGG¥®öâ2Úý¡p8ŒÝnwGZ__ORRÒ˜ðY ¼¼œS§N …b±ñegg':Ž-[¶LØ„\FFFèèèK6¿9++‹]»váv»ùú믥¸Íàà ´µµÑØØ(õ†îïïÇívG%?ÈívÓÔÔ„×ë׿åÔ©SQsž£z”‘››‹ÅbáÔ©SlذaÖá ‡ÃœÞQ())‰M›6qàÀ^~ùåY«ÌäÈ‘#´¶¶’””Ä‹/¾øÀº.¿ßÏðð0F£«Õ:åÝ“V«%??ǃÁ`óÞbZ”X ùùùRav»Ý ÓÑÑV«Åh4‡ÅbA§Ó¡R©X¹r%ÍÍÍtww“––6æõdÓ¦MÓR:ÕÓø%K–ÐÙÙÉçŸÎÎ;gÅú477ÓÚÚJ\\Û¶m{`OÂp8Ìàà :ŽÌĮ̀/æMÆ¿wÂÕj5ƒ›Í&mx½^ü~¿ô¨)¯×Kss3qqqØíviÉ[°`ÁHAàÓO?eÞ¼y”––N˘G=cË–-¼óÎ;?~|Æý¡ÞÞ^¾øâ FFFHMM¥¬¬lÜ`Ú½Kƒìv{L4D/H˜˜˜(!v>³Ä´^¯—,’¨#GŽàñx¨®®ž¶Ïõ +•JÅ~ô#®_¿ÎÙ³gglà}>µµµ´µµ¡T*Ù¾}ûkµ|>===Øl¶˜î{oõ‰R©D§ÓIIw"\bÃsQ'Ož¤µµ•Ý»wOkeÌ´¤èFž}öY.^¼ÈéÓ§§-h&:Ž‘H„ææf¾þúk‚Á K–,¡´´tÂT8–O™––6­ƒƒƒƒ„B¡‡ªu ‚ÀW_}E{{;Ï?ÿü—ï¨ÀËuètz<öïß^¯gûöíQÉóu¹\¼ûýöÛ’)((Àb±ð«_ýJjír?`Ýn7¤¤¤Äü³Çf.>þøc"‘;wî|`¹‘ÓéŒÊø´$ÆY:DOOÕÕÕãº%Ö³oß>)/11Qª·š(?Èï÷KŽ“éó<ÔÝÝÍÇL~~>?þø¤Jç@¢.^¼È‰'X·n+W®œÒ’æõzùàƒèïïç•W^ÁjµJG÷{ÝH$Bcc#ýýý,[¶lN=já~ßçÌ™3\¸pŠŠ /^<éß@3Z´|ùröìÙCcc#ï¾ûç’^¯gëÖ­( éNt&ïw¶$öh¾uë—.]ÂårÍÙg¼www³oß>n߾͞={ ž9áDOä\¿ôÒKœ?žwÞy‡eË–±fÍšG àÙl6233ijj¢µµ•üüü -|ê‡ÃŒŒŒH‘â¹ÔAßçóqæÌêêêxì±ÇX¾|ùìîgr ÏŒ;vŒÖÖVÊËËY²dÉC':uvvòÞ{ï‘‘‘Auuõ÷v‘HDz4¥Ëå" IããããçŒ …¨­­åìÙ³äææ²qãÆ)MÌIh"¾ùæ\.«W¯–ZOVäêÕ«üú׿–v‘HD ÿ{<%xæŠÕ ƒ444pæÌL&7n”z"ME^¯7*Ûü)äõz'Õb²jiiáܹs ²lÙ2JKKø%#‘­­­ÔÔÔ°gϩݯ˜¸‡Ñh”² çŠ</^äòåËØl6ÊÊÊ¢ÖÓGÜFcî¦Ëåš–LWWçΣ¹¹™¢¢"JKK'|ì·Ûí¦¦¦†„„òòòÆ<Üd.ù7‚ ÐÖÖFCC7oÞ¤°°U«VM9ì³KX´-Ðx_²¡¡††"‘ÅÅÅ,\¸ð{M3#‘Gê?WÚ͉êïïçêÕ«\»v …BAii)%%%Q«½ßMן@Á`pÆÚÚ¶··S__Ï­[·0 RYrff¦ôdš¹bmB¡´´´àp8ðz½²páBìvûŒ|H$• Ä”û5ϤÂá0íííܺu‹ÖÖVÜn7v»»ÝNffæ÷ªb˜îîn:;;¥çÍ›L&æÏŸO^^38ŽÊÍ?%€:;;£šáÿ(¢­­ŽŽÚÛÛñx<Øl6é;XLçRûÝiÿ˜Æ}}}$''Kå6999Óºy6gXýýýÂæÍ›§œéìv»pøðayVgH‡ìvûLÁ3ý‰KÚÏ~ö3ÙM³ÕyõÕWgbÉšy€Ä+%%Eøãÿ(x½^yÆ£$¿ß/üéO,ËLƒ3óÝ»¬ýóŸÿ‚Á LÀ#* ÿùÏ„¬¬¬Ùgö¯üü|á/ù‹àt:e"&)—Ë%üõ¯òóógœÙH¼L&“ðúë¯ ÍÍÍ2!÷‘ÃáÞxã !)))VÀ‰€îu¶{ì1aïÞ½ÂÀÀÀÿ<4CCC›o¾)lذa6œãÉÍY4Nã§C:Žªª*vìØAUUÕ´×Å¢†††øì³ÏøðÃ9xð @ ¦?oÌ4&e@©dÅŠlß¾-[¶°bÅŠ9ÝÓð^ƒAjkk9zô(_|ñEÌ=2âÐwÏêÕ«)//gݺu¬Y³&jpœ söìYjjj8yò$çΓš…ÎEÍI€ÆSFF‹/–Ê‚‹‹‹ÉÏÏŸ–îì“‘Ó餩©‰«W¯ÒÐÐ@]] tttü –Ü @÷“Åb!77—ŒŒ ²²²¤ç°[­VL&“TŠc0Ðjµ$$$ŒY½^¯ä‡ŒŒŒH%BbX__===ôööÒÖÖFgg'‡cÖž&$kNI), Y2@²d€dÉÉ’%$KH– , Y²d€dÉÉ’’%$K– ¬i( ƒ¬GTD tÉã ë5 Zåqõˆº¦ŽÊã ëuDäÌÂxeÍi…€"%ÐüŸ<²Rï-âCªlÀe ]Y“P°èã@½À<6² Ï]Vzal ñ,P tËc$kËSy—•ûÊ üƒÝ äkV®Ð]&¬ß…e¢ufÏU@ñ]?I!ß„ÿî.Q7î†yÞãýÇÿ?t—?Æ*k’IIEND®B`‚lft-3.8/icons/144x144/source.png000644 000766 000000 00000015511 12062431750 016146 0ustar00vicwheel000000 000000 ‰PNG  IHDRçF⸠pHYs.#.#x¥?v OiCCPPhotoshop ICC profilexÚSgTSé=÷ÞôBKˆ€”KoR RB‹€‘&*! Jˆ!¡ÙQÁEEÈ ˆŽŽ€ŒQ, Š Øä!¢Žƒ£ˆŠÊûá{£kÖ¼÷æÍþµ×>ç¬ó³ÏÀ –H3Q5€ ©BàƒÇÄÆáä.@ $p³d!sý#ø~<<+"À¾xÓ ÀM›À0‡ÿêB™\€„Àt‘8K€@zŽB¦@F€˜&S `ËcbãP-`'æÓ€ø™{[”! ‘ eˆDh;¬ÏVŠEX0fKÄ9Ø-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+®ç*x™²<¹$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóýxήÎÎ6޶_-ê¿ÿ"bbãþåÏ«p@át~Ñþ,/³€;€mþ¢%îh^  u÷‹f²@µ éÚWópø~<ß5°j>{‘-¨]cöK'XtÀâ÷ò»oÁÔ(€hƒáÏwÿï?ýG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)¬‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(¼ AÈa!ÚˆbŠX#Ž™…ø!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fº‘;È2‚ü†¼G1”²Q=Ô µC¹¨7„F¢ Ðdt1š ›Ðr´=Œ6¡çЫhÚ>CÇ0Àè3Äl0.ÆÃB±8, “c˱"¬ «Æ°V¬»‰õcϱwEÀ 6wB aAHXLXNØH¨ $4Ú 7 „QÂ'"“¨K´&ºùÄb21‡XH,#Ö/{ˆCÄ7$‰C2'¹I±¤TÒÒFÒnR#é,©›4H#“ÉÚdk²9”, +È…ääÃä3ää!ò[ b@q¤øSâ(RÊjJåå4åe˜2AU£šRݨ¡T5ZB­¡¶R¯Q‡¨4uš9̓IK¥­¢•Óhh÷i¯ètºÝ•N—ÐWÒËéGè—èôw †ƒÇˆg(›gw¯˜L¦Ó‹ÇT071ë˜ç™™oUX*¶*|‘Ê •J•&•*/T©ª¦ªÞª UóUËT©^S}®FU3Sã© Ô–«UªPëSSg©;¨‡ªg¨oT?¤~Yý‰YÃLÃOC¤Q ±_ã¼Æ c³x,!k «†u5Ä&±ÍÙ|v*»˜ý»‹=ª©¡9C3J3W³Ró”f?ã˜qøœtN ç(§—ó~ŠÞï)â)¦4L¹1e\kª–—–X«H«Q«Gë½6®í§¦½E»YûAÇJ'\'GgÎçSÙSݧ §M=:õ®.ªk¥¡»Dw¿n§î˜ž¾^€žLo§Þy½çú}/ýTýmú§õG X³ $Û Î<Å5qo</ÇÛñQC]Ã@C¥a•a—á„‘¹Ñ<£ÕFFŒiÆ\ã$ãmÆmÆ£&&!&KMêMîšRM¹¦)¦;L;LÇÍÌÍ¢ÍÖ™5›=1×2ç›ç›×›ß·`ZxZ,¶¨¶¸eI²äZ¦Yî¶¼n…Z9Y¥XUZ]³F­­%Ö»­»§§¹N“N«žÖgðñ¶É¶©·°åØÛ®¶m¶}agbg·Å®Ã“}º}ý= ‡Ù«Z~s´r:V:ޚΜî?}Åô–é/gXÏÏØ3ã¶Ë)ÄiS›ÓGgg¹sƒóˆ‹‰K‚Ë.—>.›ÆÝȽäJtõq]ázÒõ›³›Âí¨Û¯î6îiî‡ÜŸÌ4Ÿ)žY3sÐÃÈCàQåÑ? Ÿ•0k߬~OCOgµç#/c/‘W­×°·¥wª÷aï>ö>rŸã>ã<7Þ2ÞY_Ì7À·È·ËOÃož_…ßC#ÿdÿzÿѧ€%g‰A[ûøz|!¿Ž?:Ûeö²ÙíAŒ ¹AA‚­‚åÁ­!hÈì­!÷ç˜Î‘Îi…P~èÖÐaæa‹Ã~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DÞ›g1O9¯-J5*>ª.j<Ú7º4º?Æ.fYÌÕXXIlK9.*®6nl¾ßüíó‡ââ ã{˜/È]py¡ÎÂô…§©.,:–@LˆN8”ðA*¨Œ%òw%Ž yÂÂg"/Ñ6шØC\*NòH*Mz’쑼5y$Å3¥,幄'©¼L LÝ›:žšv m2=:½1ƒ’‘qBª!M“¶gêgæfvˬe…²þÅn‹·/•Ék³¬Y- ¶B¦èTZ(×*²geWf¿Í‰Ê9–«ž+Íí̳ÊÛ7œïŸÿíÂá’¶¥†KW-X潬j9²‰Š®Û—Ø(Üxå‡oÊ¿™Ü”´©«Ä¹dÏfÒféæÞ-ž[–ª—æ—n ÙÚ´ ßV´íõöEÛ/—Í(Û»ƒ¶C¹£¿<¸¼e§ÉÎÍ;?T¤TôTúT6îÒݵa×ønÑî{¼ö4ìÕÛ[¼÷ý>ɾÛUUMÕfÕeûIû³÷?®‰ªéø–ûm]­NmqíÇÒý#¶×¹ÔÕÒ=TRÖ+ëGǾþïw- 6 UœÆâ#pDyäé÷ ß÷ :ÚvŒ{¬áÓvg/jBšòšF›Sšû[b[ºOÌ>ÑÖêÞzüGÛœ499â?rýéü§CÏdÏ&žþ¢þË®/~øÕë×Îјѡ—ò—“¿m|¥ýêÀë¯ÛÆÂƾÉx31^ôVûíÁwÜwï£ßOä| (ÿhù±õSЧû“““ÿ˜óüc3-Û cHRMz%€ƒùÿ€éu0ê`:˜o’_ÅFtIDATxÚì]KÜTþüªgWZéÐdº¡I'a” “M²˜¬& Ä h¤«†%KøìØ2R6 óØ°šMȤH„Íh4=Ñtw Q§ªl—ß³H_ëÖm?®]v•]¹ŸduÙe»ËןÏùιç^KˆÇ:€×üÀi'4!ð(À°`À—þyð™ Ë>àÄ"–.||ÀDüÀÿDƒ‰%f¹sÀ‘Cž/t…H€à2€¯i-¸ àW¢}8°à€Ÿ•ƒ pQ´‹'zFç_€ ·¨¢]2ÀpVð'APüYð{Ñ9qYpJ´ƒ@NüF0‚È0 äƒ/áa‚H@ dÑ‚@‚@‚@‚@‚@‚@‚@‚@‚@‚@‚@‚@‚@£´RÖ••lnnâ駟ƽ{÷$I[’ö}QÇäEÑÿ+é|Qß9Žsh[‚‡Õ9KKKØÝÝÅÕ«W±µµU^; „z UUñÁ@–e|úé§ØÝÝ»Hö/ùµ!½OÜö¨¥o»NïGÖÉ~šªB’$8®yÙmIëô¹É_ö3ûP±Û%I‚,ËpƒÁ ’@ô±'NœÀ›o¾‰§žz ï¾û.úý~},Ðc=†õõu¼ÿþûØßßG·Û ozÒG,ß÷÷:–%K´¤îŽ.,¾Ã4!GXÌ(‚¤‘'ê³,Ë©û‘} ÃÀp8äºÛÛÛøðÃqõêUœ>}ß|óM}Ôh4`F£ºÝ.Eªªð}?$ý7IÖŠ>G”9'7ƒ|ÏkMÜ $ ½……±sð¸ß8òÄY¸ýdY­N¿ß‡ã8hµZ©ÿ×÷}ض ×u±··‡v»]/ ¤ª*‚ €ïûe’$AÓ´1â°äˆ"SÔ:K(gyÒÜþàÕ*iÓ(j‡‡‚Íf“ë÷:ŽÛ¶–eaaa¡^j6›p]®ëBQ”C¤¡?GY¤(«Ty’ÖãÈÀZ®¸cèó‘Ïid‹sƒ²,ömôû}X–’,é÷ƹjÓ4ÑívëE v» Çqày—Þ¡ÝCܾQ‘FRÃMbyòZ$w•dehâÀ`0­Ù–5¢#mYKµZ-¸®{È-%¹©8-D“ŠW Ç‘gš.+‹þ¡#¬ÀqœLZ+ŽÀ„@N§¾J Ûó'å™¶Þ‰ÅìvEQƒt]Ou}YsJ¦ibee¥~ˆ¸0Ö±º‡|ÏZ'Ö¥iœ¤Hk.+m‰°ˆÖ±m; 8&%ýLÓäß•$OÎ'JL×<¼'ÊòȲ|ÈêäÑ:<×UKÖl6Ã02*dJ²LaØ,tUÉÃC, ±:îA–»ˆn‘8w=êÆ[–Å­uØ„_’å‰"Ù´ó;YÜmu|ßÇp8„®ëÜ¿3yèü’išõK$¶ÛmX–+žã,GR¿XÔ¶Y‘'O„eÛ6ƒA¨uÊ@”"ˆ¸62M“«Ÿ+)¿S4yŠËÉÌ­3ë¢ö²uO–Ä"¯ëJŠäÊ,*+”@š¦!X–•iNA:ªRQ{Y–fZ®‹<˜Š¢À4ÍꈼŒž™#-Âò}¦iÎ…ÕÉëž²¸®¤È+N* TùÞxMÓàylÛ†¢(c"9)š'«“w4)¯ðÎ’P¤­™+±òˆÔÇõ]‘I(I¡WÝ‚eéž¼ußi!<=‹šçy…Ï]8\×…ã8‘!:©Ž#5Óó¨uxtOVוו±»®[xY«\4È%""ŽDXU­Mž¦hÎ2ª"mvXÞ ²<σïû…+Ô‘ŽTRFJHdYÖ˜Ö)zhIH“ö*Lž}’>çÙ­J$£3*K Ò‘Jæ&ö<?ÿüsä|‰óìºâsžmI‡GHÓ²,«ð Ç =[³ÙD§ÓA»ÝÆÎÎNâwæQ×ÅÓaçzØW‹ÓëQŸéßA’±,H^nqq±Új48vìÞyç|òÉ'ØÙÙ™;±œ5ŒÏ:–+Š˜,Y²NÀÐëõðÆoà‰'ž¨¶ k6›ð}.\À¹sçpÿþý¹#PÞ™E&µÀ“ìØ1t»ÝR^>W8H2±ÕjáñÇŸ{—U‡‡Ãó:÷Enêöö6vwwÛOOŠì¢þ&íÃZú;BZß÷Ãúò[‚ À/¿ü‚~ø¡p·[¸ˆ€;wîàÎ;•ÑËËË™fçŠ#¯»ô<ׯ_ÇÍ›7ç^˜«ó~+++8sæLèÆ¦•SZ__šœ8qO>ùäT~ADF£‚@5ijÏ>‹ÕÕÕ©ÿ_Ïó ªêÜ$ Y]¼xKKKSÿ¿GŽÁÆÆ¾ûn_yž/®×ëáùçŸçk^ô¢i^xááÂêŒË—/öí™D„’$áâÅ‹øì³ÏæÚÍ-šÍ&.]º„[·nͬǼ×ëauu·oߪÎ;×u±··7³ß ( ^~ùe|ôÑGs;7À\¨Ùlâõ×_‡¢(…O&Ï<ó Μ9ƒï¿ÿ~. TJWƬqåʼõÖ[á«f EQ°³³ƒ÷Þ{o.Ê}çÞu:lnnB–åÂgãʃ pþüy¼ôÒKøê«¯„ª:Þ~ûmlnnÂ0ŒÊü&EQ°¿¿W_}uì5ÂUíi$\ºt ‹‹‹8räÈ¡z˜8!µgÞ× A€¥¥%?~?ýô“ P•qíÚ5xž‡“'OâèÑ£èv»a=))¡opÜl²Qƒ éz¨º²8ŽÖæèºŽ{÷îakk ý~_¸°ªCÓ4¬®®âÔ©SX[[ÃÆÆÑëõÐétB‘MQ”ð3©]"¤Š"]oãºîØ_ò’]×aööö°½½Û·ockk º® ÕѭŹ ¤íYDrÜöyÍýç¬ó³ÏÀ –H3Q5€ ©BàƒÇÄÆáä.@ $p³d!sý#ø~<<+"À¾xÓ ÀM›À0‡ÿêB™\€„Àt‘8K€@zŽB¦@F€˜&S `ËcbãP-`'æÓ€ø™{[”! ‘ eˆDh;¬ÏVŠEX0fKÄ9Ø-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+®ç*x™²<¹$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóýxήÎÎ6޶_-ê¿ÿ"bbãþåÏ«p@át~Ñþ,/³€;€mþ¢%îh^  u÷‹f²@µ éÚWópø~<ß5°j>{‘-¨]cöK'XtÀâ÷ò»oÁÔ(€hƒáÏwÿï?ýG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)¬‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(¼ AÈa!ÚˆbŠX#Ž™…ø!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fº‘;È2‚ü†¼G1”²Q=Ô µC¹¨7„F¢ Ðdt1š ›Ðr´=Œ6¡çЫhÚ>CÇ0Àè3Äl0.ÆÃB±8, “c˱"¬ «Æ°V¬»‰õcϱwEÀ 6wB aAHXLXNØH¨ $4Ú 7 „QÂ'"“¨K´&ºùÄb21‡XH,#Ö/{ˆCÄ7$‰C2'¹I±¤TÒÒFÒnR#é,©›4H#“ÉÚdk²9”, +È…ääÃä3ää!ò[ b@q¤øSâ(RÊjJåå4åe˜2AU£šRݨ¡T5ZB­¡¶R¯Q‡¨4uš9̓IK¥­¢•Óhh÷i¯ètºÝ•N—ÐWÒËéGè—èôw †ƒÇˆg(›gw¯˜L¦Ó‹ÇT071ë˜ç™™oUX*¶*|‘Ê •J•&•*/T©ª¦ªÞª UóUËT©^S}®FU3Sã© Ô–«UªPëSSg©;¨‡ªg¨oT?¤~Yý‰YÃLÃOC¤Q ±_ã¼Æ c³x,!k «†u5Ä&±ÍÙ|v*»˜ý»‹=ª©¡9C3J3W³Ró”f?ã˜qøœtN ç(§—ó~ŠÞï)â)¦4L¹1e\kª–—–X«H«Q«Gë½6®í§¦½E»YûAÇJ'\'GgÎçSÙSݧ §M=:õ®.ªk¥¡»Dw¿n§î˜ž¾^€žLo§Þy½çú}/ýTýmú§õG X³ $Û Î<Å5qo</ÇÛñQC]Ã@C¥a•a—á„‘¹Ñ<£ÕFFŒiÆ\ã$ãmÆmÆ£&&!&KMêMîšRM¹¦)¦;L;LÇÍÌÍ¢ÍÖ™5›=1×2ç›ç›×›ß·`ZxZ,¶¨¶¸eI²äZ¦Yî¶¼n…Z9Y¥XUZ]³F­­%Ö»­»§§¹N“N«žÖgðñ¶É¶©·°åØÛ®¶m¶}agbg·Å®Ã“}º}ý= ‡Ù«Z~s´r:V:ޚΜî?}Åô–é/gXÏÏØ3ã¶Ë)ÄiS›ÓGgg¹sƒóˆ‹‰K‚Ë.—>.›ÆÝȽäJtõq]ázÒõ›³›Âí¨Û¯î6îiî‡ÜŸÌ4Ÿ)žY3sÐÃÈCàQåÑ? Ÿ•0k߬~OCOgµç#/c/‘W­×°·¥wª÷aï>ö>rŸã>ã<7Þ2ÞY_Ì7À·È·ËOÃož_…ßC#ÿdÿzÿѧ€%g‰A[ûøz|!¿Ž?:Ûeö²ÙíAŒ ¹AA‚­‚åÁ­!hÈì­!÷ç˜Î‘Îi…P~èÖÐaæa‹Ã~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DÞ›g1O9¯-J5*>ª.j<Ú7º4º?Æ.fYÌÕXXIlK9.*®6nl¾ßüíó‡ââ ã{˜/È]py¡ÎÂô…§©.,:–@LˆN8”ðA*¨Œ%òw%Ž yÂÂg"/Ñ6шØC\*NòH*Mz’쑼5y$Å3¥,幄'©¼L LÝ›:žšv m2=:½1ƒ’‘qBª!M“¶gêgæfvˬe…²þÅn‹·/•Ék³¬Y- ¶B¦èTZ(×*²geWf¿Í‰Ê9–«ž+Íí̳ÊÛ7œïŸÿíÂá’¶¥†KW-X潬j9²‰Š®Û—Ø(Üxå‡oÊ¿™Ü”´©«Ä¹dÏfÒféæÞ-ž[–ª—æ—n ÙÚ´ ßV´íõöEÛ/—Í(Û»ƒ¶C¹£¿<¸¼e§ÉÎÍ;?T¤TôTúT6îÒݵa×ønÑî{¼ö4ìÕÛ[¼÷ý>ɾÛUUMÕfÕeûIû³÷?®‰ªéø–ûm]­NmqíÇÒý#¶×¹ÔÕÒ=TRÖ+ëGǾþïw- 6 UœÆâ#pDyäé÷ ß÷ :ÚvŒ{¬áÓvg/jBšòšF›Sšû[b[ºOÌ>ÑÖêÞzüGÛœ499â?rýéü§CÏdÏ&žþ¢þË®/~øÕë×Îјѡ—ò—“¿m|¥ýêÀë¯ÛÆÂƾÉx31^ôVûíÁwÜwï£ßOä| (ÿhù±õSЧû“““ÿ˜óüc3-Û cHRMz%€ƒùÿ€éu0ê`:˜o’_ÅF@ÞIDATxÚì½ip\eš¦}srß3¥Lí«eɲ¼ /€± 6ƺ ªº)*ª«»¢»'*b&&&&b¢£ÍLϯéèøz¦#¦ˆè.ºº º 06`À6xÃû*˲­}K¥–Ü÷ÌsÎ÷#S‰…%aƒÎ;"ÖœÎå=÷yÞg½_¹Q¼l€ž"þ= x>àð›üßï nàW@P‹â#Ï…_å¹1/Ö£Å+>æx ç9R€ðòÌE ^Ä<ˆ[€Ó·È \*‹ëSÄ]À ,&¤ü/þ?`Cq]ЏKXóFçhnšâºqÈ EàGEòñ þD6×¢ˆ¯ˆ-"ÐP\‡"¾"Z I1Ã\ÄWƒ"KQÄW‚X\‚"Š*¢H "ŠúÎB`fQ°ˆ"Šø†PÌ@ç¡æï&£$aE´‚€¬ªÄ…„,£—¨H ùÈCž<uz=v†¨,ÓÓ—L¢¨ÅlG‘@_¶‚Àb“‰v‹«$ÌfI§ÉÉS$ÐÝ@ì Uz=ZA@ôBѽ.è Ñ– €$h¡Ixt: ©(h%‰„¢àÔh¨Õëɨ* «*U%«ªdPUµÐóùï1‚ýw󽵂€U’°JfI¦Ñ`E ù‡[«eÑH¥N‡Vˆ+ C©cé4IE!«ª$¥àX²YüÙ,Ál–„¢T”"¾o_ΦÑàÐhpi4”jµ”äž&’Aщ"zA(IºmÛR¬ª’Î(“¤…°,ãÏ“(œÍ2™ÉàËde³„eùßïô½#$E«$QªÕR­×S£×ãɓǦÑ`úIæ‹Î¦Gœç9qY&®(ø³Y†S)¼étÁr…e™Tž|E}P®ÓÑl4Ò`0P¥ÓQ¦Óa“$tyÒÌF„ŒªÊfɨ*&QÄ,Ih”¢0‘ÉPŒ¢ˆM£Á(Šhò>Ô‰¤¨*iU%*ËŒg2ô'“ô'“t'“xS©ïe.é{A ¨Öë©7Xd4Òh4âÊ[½8“2²ª–e‚Ù,¡l–¸¢ÈfK§Ñ ­&‹L&¬’„?›å³p˜[‰ZAÀ¥Ñ`ÉûOöü¶èÌo‡_´hYU%"ËLe2Œ¤Ó܈ǹ•L2šJ‘ùY£ï44‚€S£¡Ñ``©Ù̃*½ÃH“e@L‰ét¤ ²V+ŠÕŠd6£µÙP-ì öÞ^l½½HÑ(›©¶6UU¤3H&‘ äxœl(á0úX }2‰1“Á,Ëó¶HYU?'Q"AO2ÉD&ó½pº5ßUÖD‘½žå «,jôztù‹6í»(’DÆdBq»1”•ᨩÁ\U…¥´[Y&‡£ÑˆÑhD’$ˆÇÙ·‘©)âÑ(‡ƒ5Û·S¹miYF–eR©Éd’d"A4$<9IÔç#66FrxulŒØÔúHm6[HÔêõ”iµ,1›éˆÅ8r3‘øÎ—I¾“²i4¬4›yÄj¥ÑdÂ)IH·ÌdBWU…¥© ÷òå”·µa­¬Dg³!jµ’„ Iw¼nÊïgR«ýÜ¿QDEA'Š˜¬Ö9¼h%›EI§ÉÆã„FG™èéa¼£ƒpWé¡!˜š@/Š”ëtX5*õz®ÆbœDJ¥Šú& Ej ž¬ªb•ÙŒ+F¸ÍŸÐ•–âli¡tåJ­­Xëê0VT 1ïêõÕéך¶dŠ‚’É Èò<æP@ÔjµZ4f3·Ï’%4=ñÑÁAÂ==L]½ÊøÙ³$†‡A–±ˆ"m&õv; S){½tÆbÄæ{Ÿ"¾:DA ¥¾ž§.d™$aGˆÇs×OÑZ­Ø, dåJÊ֭õlÚ¹,Æ|[£ êtyJQ,ü|ׯ#IJK1”–R²bž5kp¶´à=z”ÐÍ›¤”ts&C»$±hÕ*®i4éíår?Ùïoô­&Ó餽½ÕK—²P–q £¤RŸWÐ=Ê{ŒÊ-[p´¶¢w8uº¯FT­I¯GÔä—E‘ ¤{|=UU SUU…½¢‚Ú;q´¶2þÙgŒ9BàúuPUPU¬Á ¹Ý,Ù¸‘ÞíÛ9ÑÕÅùóç ƒE}TUU±qãFV®\Ike%ž@€È‰z{Q²ÙÜ7q-[FùOP¶nÖ†$ƒák½¯’É §Ó…-KÍfIƒ$ý~ôªª"ét³úO²,sñâE®^½Êõë×¹uë{öìá…^Àj·S²|9Ʋ2¬Œ9ÂÄÙ³$|>”T ex °`íZyé%n<ó W¯^åøñãôöö t7hiiaãÆ,]º”Ë—Óâv3uü8ƒLèÆÂ–ep»){ôQªžzŠÒGAg³Ý½uP”t9™$ ‘ ÉÆã(™ ñ‘¦.]"çŒÑ(ã§N‘FÑ»\’„ÎáÀPZŠÎfCcµ" DR)N>Í… $‰`³ÙðxÂ== ªˆ îÕ«iüÁ¨zê)Ì••w¥ü~×®á=r„¡ƒ=|˜ñ3gˆ{½¤ÃaD­cy9öæfÜ«Wã\¼­ÕJ&EN$ÐY­xÖ­£rófœK–±Z™ˆFI¤R¹f3YƘÍb‹Ç©Ðj©2piµ$ ½Å‚ÎbAzzz˜šš¢¹¹ñ Ÿ[c4b©©Ag·“‰DHŽ£d³dc1R~?³sUZ“‰ŠŠ V¬XAyy9µµµd2™‡n¾q•––ò“Ÿü„Ý»wóƒü€¶¶64ù¨GN&ñ9B÷o~C´¯TÉ`À¹x1 ^z‰ÚíÛјL_êãÈñ8á¾>|'O2°oÃèè £µX°ÖÕåðõë©zê)ª¶l¡æ™gp-]Šª(DúûIùýèNêví¢ñ…ð¬]‹¥¹™ ÉDO4ŠèñP³x1:9‘ "xý:ñÑQädI¯Gc2…õz©­­Å:KzAÔh°ÖÕ¡1HŒ“ðùP…”ßO&Aïtbt»‘ 4 õõõ,Z´‡ÃAYYýýýÄóiï5V¯^ÍÏ~ö3öìÙóÏ>‹Åb™ñï“çÏÓÿÖ[:: þ€µ¶–?ü!7¢1¹|£ãûì3Þ~›¡÷Þ#ÐÙI&EkµR²l•›6QõÔSTnÚDÙ£âlmÅ\Y‰6o-¢ƒƒ::HMM¡µXr–©µÉ„ÅåÂUSÃuŸîh”Çöî¥våJLùde&%%ÒÛKbl (⬮¦gx˜ÑÑQ.\ˆV«½Ó*‹"¦òrPUbÃäüþ‚#Ÿ ‡1WWc®®.<ßl6³téR<Äb1†‡‡¿Ÿ>$IìÞ½›íÛ·³gÏ<Ï倸ÏÇèáÃLœ;‡’É䩪ŠÚ]»¨Ø¸½Ëõ¥ïÀûé§ å-Ž’É ³Ùp>ò%+WR²|9–º:ôN笉FA’rÙè¼=±M‡õñd’ƒ‡sñúuDQD¬¨ÀÓÐ@ÉòåƇ ^¿ÎÔÅ‹òVhøàA½½T¬_Ï6oæd?###455!Ìâ¿iÌf*7m"Òû»ß ‰0qîÆòrô.W.p¸ÍX³f uuu”––R__Ïïÿ{2ùõû^X «ÕÊ«¯¾Êž={øáˆm–;é÷3zø0Cï¿Obl¬°˜5Û¶ÑðG„¹r~íÏl"A°«‹Áýûé{ë-B7n éõØ[Z¨Þº•ºÝ»©Ü¼Ç¢Eèìv$ýìj6r2I¨« ÿÕ«¤4F#Î%K°77£1™8~ü8o¾ù&²,ó裲nÝ:lN'z‡KM Ž–,uuÜn”L†L8LblŒ@WŸŠúz2Z-N·»°mÏF"£ÛM:&>2RH1$''ÑZ,8ZZr‰ÍÛh±XhkkC’$JJJ¸~ý:étú»O §ÓÉŸýÙŸ±{÷nvìØ1û¢©*k×èë-B]]…D¡gÝ:ê÷îŹxñ¬wë혺t‰Þßþ–á?$áó¡³Û©zúiê÷ì¡æ™g°77#_ú:r:M¸»G)¿É` dÅ œ‹3ðÖ[o122BCC?þñ)//ÏUñoóe n7ö¦&,µµ¨@bb‚l8LÖçCˆÇq74`¯®F£Ÿ[’IÒéÐZ,Ɔˆ ä>["‘Kc”—c,+û<[>M<†ÖÖVŒF#N§“k×®‘úŠ´Œ@.—‹_üâìÙ³‡'žxb΋dèý÷;vŒt8Œ ŠXëëi|ñEÊ|Nk d³øNž¤÷7ð=J&ÆÚÐ@à /P»c%˖倢ø¥ä™¶@k×rw0ˆ ”,[†sñbþáÿý?®\¹‚Ýnç•W^™Ý—É×Î$ƒÁj§ky9J*•ókÆÆP£Q N'–šš93Ú¢FƒÞé$›H  ª"Çã’„­¡½Ó9ktÛÐЀÙlÆl6ÓÑÑñÀIô@d·Ûùó?ÿsöìÙã>:÷K¥ð~ú)o¿Mld¤PÛªy檟yCié¼{êâEz~û[F>þ%ƹx1 ôGÔíÚ…­±q^òÍõšÁë×ñ_¹R ³eñb.OLðÁáÃèõzvíÚźuë0ÎcÑR©áX “ÇCY[F·9‘(8×é`­Í–‹¬æøŒ¢V‹Îá@ŽÅˆôõ!çÛE2‘†ÒR,µµs–njjj°ÙlÆN¢ûN ­V[ˆ´üñœ’ÍÞ‘ÿP²YbƒƒŒ|ø!ã§Oç’y¢Hi{; /¼€µ¾þ3]Øõd™ÀµkôýÛ¿áýôSTEÁÝÞNÓLõSOÍK¼/«…ÅGG ÙiSe%rUÿvì)UeéÒ¥<÷Üs8Î;¾Ïíõ°P(D,£¤¤½Å‚mÁôN'™h”„×K¤¯L$‚±¬ CiéœÅ_ÝŽ ÑËå‡2²‰D!À0WUÍ™L­®®Æû/\¸ðy«Ê·@/½ô»víbÛ¶m.]ºDoo/Ñh”l6‹ÑhDQ’‘‹ñ~ú)ñÑQLååTnÚDÅÆhM¦9'62Âà¾} ¾÷ÙXŒ’eËXðòËxÖ­Ë™ö¯1M*Jz§ÛÂ…h[Z8;:JÇÐÎ’~úÓŸR[[;Ãï™éΩÄb1‚Á N§sFšÂPR‚Îá å÷ç2áSS¹–ŽÊJLs­%•"ÒßO:Ìå¹’IÌ••X,¸Ã¡¾uuu¤ÓiÒé4ׯ_ÿö‡ñëÖ­cÓ¦Mlß¾€S§Nñ÷ÿ÷h4–-[†$I$ µ´´ð /°{÷n$I"™LòÑGñæ›o¢×ëùéOÊÖ­[innfÑ¢ET †¾>ä±±ÜB88Ö®EßÚŠdµ’Íf ƒƒAúúú8zô(WΜ!zá\ºÉ$jYÚµkq-_N,•âĉüë¿þ+ÃÃà R[[Kyyù=—ÉÉI~õ«_ÑÑÑAii)ú§Jkk+:nNR¨ªJ$Á`0àp8æ%š èl6I">:J|t´Pï²TW£ýBygÚ2jÌf’„oÞDN¥P2D­k]¦ŠŠ/8«ªªãÖ­[øóe’o´eË}ôÑB^Äçóñé§Ÿ"I¯¼ò Ï?ÿ|á.PÒi²ã㹘lAqÔ׳pï^¶­ZEJU ‡Ãøý~†‡‡éëëchhu`ÝÐR"AFéI¥8qko/f³™ÁÁA´Z-‡t:Íþýû±Ûí44ܽ"‘àØ±c\ºt‰ÒÒRžþy–/_>oÈ …˜šš¢¾¾þ®¬ž¨ÓáZ¶Œª§ž">6F|t”Ñ#G°/\ˆ¾¤dÖèSg³áX´{s3“/æ|¡±1‚7nº¾,:~ì±ÇèèèàÖm~çC'Ðte¸­­­ð»›7orãÆ Ù¹sgÁ¡”ßOld„ää$ª,çªã Øjk±º\X€’’êëëY¶l™tšX(Dïo0úûß#bUúêjÉ$á‘TUE¯×³dɶlÙB__‡â­·Þâ•W^¡ô.ÃúëׯóöÛo£Óéxä‘Gxâ‰'°Z­óZžx<^ð»„{ˆþ´ î5k˜º|™øè(¡7ð_¹‚½¹cYÙ¬ÿÇT^ŽmÁ‚7n '“¹Dc?‰‰ ,uu_úžK—.eÉ’%ÔÖÖÞ·6¯M 5kÖ°bÅŠwÞÙ³g™˜˜`ýúõTWWÏșĽ^¢ÈygNïtb­«ËKo›9N‡F‘}>A …ÐZ­4oÛÆæÝ»I ƒAÒé4ƒ’’, 555ÄãqNž<ɧŸ~ÊÓO?=k î‹ðÅ‹ ƒ¸\.vîÜIIIÉœùžéœO4E’$ÊÊÊæ}îlŸ­±×Ò¥L]¼Hb|œ@g'îÁÁ9 ¤s:±66¢³ÛIùýÈÉ$q¯·p3ÎMµ—.]ÊÚµkï¾–J«F£¡­­åË—îÈîînŽ;F2™dÕªU¸n«¢Ë©Ñ¢CC….CSUöææ9M°œHà¿z•àõ먊‚½¹™²5kð45QUUE[[+W®dñâÅ”••a2™ðxùy½HUÉD£ÄFFHå'5QÌeTkjgé‘H::Hø|¹žžå˱æÍµ …Ç÷ûŠŠ 6n܈V«eÿþýóîû±XŒX,†Ñh¤¶¶–ññq:;;™œœœ—tãããèt:ìóä­f³Z·g…­õõ¸–,Akµ’'ØÕE|llÖaFQ§Ãàñ`©©É9ÛªJ:"îõú‡î¦ÌTSSC}}ýÃßÂêëë©©©™áLž?žL&ÃîÝ»Y´hQáâ*²L:"1>ž+ Z›­0á0[6U•ecc„{zÈ&“ذ55Íë0N¿Ÿ^¯gñâÅLMMñá‡røðaÊÊÊpäÇs¦Ÿ§ª*V«•]»v±yóf‚Á ƒƒƒôõõ±oß>*++1”””àv»ñx<ˆ¢H8FQ”yË_D<çܹs¨ªÊ’%Kr¥§[S¦Š B‘±‘bÃóVܧisU:‡ƒt(„œN“'`½Ë€¡¶¶–††zò)‡F êêj*nKÃg2Âá0O<ñ¿üå/EEQ%.LCÈ©TnzÓåÂX^ž«ùÌB l ££½^OUUŠ¢ Š"±X,×+ŠhŒFÌ55è].R½½9?1œstIc2¡Í'#UY&›H‰Fsº‹é\³Ùü¥Qé7B ƒÁ0£©jÚy-//G–eE!“ÉÌO]ze5߯+hµ`2N¥tw“L&±X,…ƒÁ@xhˆèèh®îS^ž+8Þ…¿1¶F£hµZÌf3æžÂ쯃›7oräÈNŸ>M"‘Àd2±zõjV¯^Í»ï¾Ë… ðz½444àv»Q³Y¬©› T•¨×Klbg&s‡u­ÕŠÎá@2ÈÆbd Òá0ÙDÙü¥#Oz½ÝWÔx ÕøÛ¿ät^H§Óå.`0Hð6B­Ñˆ«²’ªúz"’„ßï'‘H‡E³ÉD°·—h¾GZ°ÙÈÄâqtù˜ö¯n'F&“!‰ Ë2&“ “Étoáõ×@ àèÑ£8p€D"QèQ~饗X²d ªª²sçN>þøcnÞ¼IWWFƒ1eáÈ¥€t”ƒo½…udwu5ååå,\¸NG&›EÖé ÁG6Ï5š…ÃdãñYÃÿÙ®ÏýZ“¯E UUI§Óèï¦óO–‘ Ô|ÏóôÌ”V¯§ª¬¬àȲL:Î9„ ùn:­Å‚`4âõzóùèëëcýúõ466ˆ“H$H¥RhµZl6’$}#äI$twwóÁpâÄ l6z½žgžy†uëÖáñxÐjµ¨ªJ[[¥¥¥twwÓÝÝÍÀÀ>Ÿl*EDQp Ùd’ž®.ºûúõz-ZT˜)L:}` gÅÉuR&‚ÁœjI~Êv>¤R©û–úZÒëõÄb±Y[î ›¢ d³…¢¨Ó¡1› &zÚbi4š!U• òù³Ã«¬ Õl¦»§‡C‡ñøã£ª*Ñh”D"N§ÃétÎYÊd2tuuqèÐ!‚Á MMM444PSSCiié=ùGÓÛäµk×øì³Ïèêê*t!®^½š§Ÿ~º¥‰·é ™L&êêꨮ®æñÇ'™L‹ÅˆŒþÛ¿:xP×Ѐ`³áõûñz½Œ#Ë2‰DA¨H$h…(Éßœ·nÜ çÀ\--”––R[[‹Ç㙕(Ñhô®®Ù'ËåbjjꮪÞY”¼‰ÕÙl=ž¹›ÇòÊ_ª,#h4¹ç»\È‚@"‘@Qìv;Á`°ð÷ù,át(ýÿøô÷÷‡Ù¿?F£‘ššÖ®]ËæÍ›iii¹+ÿ “Épùòe~ýë_3::Jii)‹…^x•+WÎèšž/Ë&¹ïŸo¾×ªjÎZ––â±XkkIY,ȉ.YÂÎ H Œ 180ÀÄÄ‘H„P8Œ‰ äX€èø8=~Hè“OЖ”°fýzžÛ»§ÓyÇMá÷û¿QXUU>ŸoF!õŽ…ÎG]É|íF½Mõ"“œ˜@Òë‘Óéû· I$§¦ ½Ò™H„èСƒìÚ°øÈ³½N‡œÉ±XИL³šðÑÑQÞ}÷]ü~?n·›öövÂá0×®]£··—ëׯó¿ÿ÷ÿÆãñð裲zõjš››©¨¨(lA·_FƒÓ餴´›ÍÆž={hiiÁd2Ý1­‘ÅݼIèæM”L¦ Ñ8}sHz=J:MøÖ­œôL*E¤³­FƒÎåÂbM§Q¬V°Ù++‰èt„“IRÑ(¨*%€V–É ½žÁ[·H¥R³ZÔ±±1Ün÷Ã'P]]G÷9ã§O“M$ˆ *L&&&?uŠT €¤×“‰År‹›·>ª¢0yáJ:ªª®_gàwÈ+²Y ãã?úˆ@^àÒàñànoÇÑÚzG¢1Nsúôi._¾Œ$Ilݺ•­[·¢Óé‡Ãx½^z{{9qâŸ~ú)øÃ8~ü8ååå<÷Üs<ÿüówܱ‚ ÐÜÜÌøCöíÛÇØØ+W®œÕz¥C!|Ÿ}Æàþý¹$ª h4¹í\U QÓôÔ…"ËLœ;G ³3WâÉ yÞþÞr^㈼K ‰Å(I&A‰[,kj0ÌÒ º ‡Ã„B¡9ëA·^t @6™$×HŽã=z”‰sçDñsÿ(oâUY&#§Ó‚@°«‹èà ‚(¢* QE)X3U–1”–"éõ˜ªªî д¾@ccc!-Š"V«•ªª*ÚÛÛyöÙg9{ö,£££,]ºA0³æL¦ïìÖÖV¼^/ÇŽÃd2ͨÿM',åt:—a¾‡ ¸œL:îÊ'S”‚©F"4VVbžEK F¿R³Ý}'$I,\¸ëׯ³nݺÙ3±×¯¶± ”J!ßå¼’ªª¹|G,6ïfÂá‚(ôß355ÅáÇB¯×³sçNÊËËïÈ M“eãÆd³Y¼^/:ŽÒÒÒ/m[³f ‰D¢­]»vÉ$½Sy9檪ܖ¬ÑäúŸó[õô ”òûI‡B¹2O~ŠCÔér¹3QÌ©Áj4(™ )¿ŸÄÄJ: Šè].´.±HÙ墦¡aV‡ŽŽZZZî[Nìkç–-[ÆX³fͬʵt)‘¾¾ÜŒw6›óƒd97Ái4¢µXfŠXŠ"¢$!hµdÂáÂø‹ÖbA_R‚ÖjE•åÜ… 7ެd2Xëë1×ÔÌÈÄf2Ž?Ε+W;vÐÜÜ<ëÂNßÓQÊÄÄs>÷‹™ÝGy„ññq>üðCgø:»÷š5HF#J*•#‚N—Ó>ÒëµZÒ¡ÞO>aòÂ$½÷êÕ”¬X‘.L$ Ÿ±u:ädßÉ“x?ý””ߨÕâhmÅòÈ#ôy½XNj[[ïðdYæêÕ«ìÝ»÷¾¥0¾6jjj0›Í\½zµÐ4£ò»c©`ÄØ‘¾¾ÂÔ§¨Õæ„yKMMÁ‰žv0µ ŽF!20€©¢‚ª§žÂÞÒ‚*ËÈÉdîÎÍdr‰N'Ö††z‰Ùl–Ë—/ÐÜÜ̺uëæí0œî(ðz½”••Ýuº_ÊÊÊØ²e ÿüÏÿÌo¼Á+¯¼‚ÍfCQ}C¥’(¢¿M VEI"áóìì,®ô‘G¨xâ 4fsÁª ù¼–ª($|>|'OR"Ö†ìíí(T×Õa™¥ óêÕ«8***çu ¿™èõë×óÁÌ‹šFÅÆ¨ŠB2ï4G‡†H‡Ã ˜«ª(ß°gkkÁšÖe–ôz nw¡½AÐh°55Q¹y3äÀ§mAruZmÁ! ƒœ;wŽÑÑQôz=[·n-´b̵M†Ãa†‡‡ ÅÒ{ꨭ­åùçŸgß¾}9r„;w’L&‰D"¤Ói"ñxafÌl6£×ë1ä3õ Ÿ¯Ðf,/Ǿpᜇr*…*ËRÔjÁ``($®(TÔÖÞ‰¦ÓiNž<ÉŽ;îkõ¾¨¡¡ÒÒRNž<ÉO<13Ù˜^t6ÉÉÉ‚…˜vú4ÜÂQæêjl à;y’ää$ñ±±Üñ:ݼZв,sâÄ Þxã 7ðØÒÒ2ïv4=–FY´hÑÝe×gÁâÅ‹I&“œzzrs`.ŠNWh¹=²S²Y"ýýDúû ¾¥*It÷õ1’L²`É’;õ—€Ï>ûŒŠŠ êî¢wú¡Ôž~úiþéŸþ‰ÖÖÖYs Êm9¼‡KblŒ¸×‹sÉ’Ù}’¼*ªd4æô;:ˆc­¯Ÿ³`¨ª*W®\á£>"ÓÔÔÄ3Ï<ƒ}Žž£é­n||œ@ @uuõ×®T/Y²£ÑH$ÁétÎõ1™L…Bóô8?™d,?dˆVKXU9ßÑqrƒÁ€^¯/t>è%‰¸×›Ó—Îom²VKZ’PE‘ Ü‘Jðz½\¾|™W_}õ¾—qîO>ù$ûöíãOþäOîø‚(¢5› !¶"Ë$|>b££¹*²ÁpGë‚ÖbÁTQÞå"91AlhˆøÈæÊÊ9Ûü~?‡¢¿¿‡ÃÁ~ô#jjjæ­ý$“I‚Á V«uÞ¡À»…N§£©©‰X,†ÙlžñÞ’$ÍøÙ`0ÀГ“¨É$ÆŠ ªV¬@ßÒB8& Φ%‰ì¥KļÞBâÕQ]¶­ »Çs‡fQ*•bÿþý<ùä“÷­…ãUã—/_Îèè(ï¿ÿ>{öì™ño¢FƒÎáÀèñ  ÈÉ$É©)bCC$'&0WUݱo‹Z-¦ÊJl Dzzr=Ã7näF_f!ªªôôôÐßßÁ``ûöísjÞ¾Ýùý~ôz=ÕÕÕ÷­ÍaºèË ¤ÓD{zww£* ¶ÆFjÖ¬ÁÞÜŒ Õ¢( ñxœd2™“dlb‚d¾ZE4%%Xªª¨\¸pITUåÀTVV²lÙ²RH¾ï 2[·n% Ý‘¡$ ͆©¢¢ ¿"'“ÄÇÆHNL’`wl]®Ü%%$§¦vv’˜˜˜=ë=>ÎÁƒ …B”••±víÚY“i·#‰ q»Ýw"|ˆ èì$91¨ÑäÔÍjjt:$I*tx<ª++©p80e2ù$£ÆlÆ\VFECÃãׇ"‹±uëÖöùï;$IbïÞ½\¿~Ó§OÏ4w&¦ÊÊ‚™É‰ b££…Çw²Å‚kÙ²\N– vuÎ ðÅ–ŠóçÏ388ˆ(ŠìܹóKgµ‰>ŸÇs‡bì7U%tëk×P²Y,õõØ.Ì>ßö¹§ûw”tš¤×KÒëÍeèó GGm-%553ú³Oœ8A?/¼ðÂ]å²¾5‚\«ë~ð.\¸ÀgŸ}öù›étXjk1WW(>6–˜ššµJÔép´´P²b³™Øð0gÎîë+h#+ŠBOOGŽ!“ɰ|ùr–-[6o$%Ë2@UU)// ‹<yâ^/“çÎîéA$JW®ÄÙÚ:g?O* ÔÝMÂçË%!µZ,µµXjkszJy?~œ®®.^~ùånU˜Ì¯ÓéäG?úo¼ñÉd’'Ÿ|2W.(/Ï%üìvRÁ )¿Ÿð­[D‡‡1x.—k^ëã÷ûÉf³÷4;?‘‡™¼pÉ r‚Q55¸–/Ÿ¡=á·nòEZ‹Ûmù"UUùøã⥗^úÒíû[k¦a·ÛùñÌðð0øÃH¥Rè].,µµ˜**>—-&–?©fÎ×Z¸’+µZ^/Á+Wøè·¿åÕW^áÙgŸ¥«« I’øÙÏ~FCCüIÀh4J ($ó⣣øNž$Ò×—Sƒ]¾ûÂ…HsŒ Éé4±¡¡ÜŒ\^æNïra­¯Ï)Ÿ¥Rüîw¿cjjŠ—_~ù!ϵ@·×‰^~ùe>øà^ýuvíÚ…­¡{K ±áaÒ™ ɉ ¦._ƹxñ¬£,¦Š #ì ,`íÚµ…:Ô ©*J&CÂçÃå ¾S§tv’ îßãõ2øÞ{Œ:„*Ë8Z[©Þ¶ ×Ò¥sn]r*EèæM¦.]"9-J¡×3¢ª´lÞÌËüÇm+þƶ°;¶#A`ÝæÍT[,œý»¿Ë«®(…#šœmm8-š5œµZÜ«WN wwcêï§óõ×)u¹(kk›ñÿEAQ²Ù,‘H„l6Kyy9uuu3&&¦-D&aüÌ|ǓΫÀV=õÔœ¾ÙÝZžH_Ã2ðÎ;$§¦°55Ñð ”oØ0ï´mÜëÅûÉ'»ºrm¢ˆPQÁ†?ùš¶láaãáX(”/]Ê’gž¡klŒT¾»Îwù2ÎÓ§1¸Ýg©*O'$Ëׯ'‰Ðóæ›Dz{‘/^Ä{ð ½{S*L¥H¥RÄòŒ6› «Õ:§“­ª*™HÿåË }ðANx¼¹Gk+¥«V}¥\ª(DxçÞ}—„χ©²’šíÛ©~úéyEÑ•L†É+Wè?tˆtþtB­ÝÎÂíÛ©˜¥÷ê^ýÒ‡N y ›»æO¾¸ê\¼˜’¶6¼G¢Ê2™©)οñcÀêþpÎpTïrQ¹e éh”î7Þ =1ÁÐ;ï ‡Ã”>õº†ÈH—••!IÒÝE'ù~ìÛK+_µ¸ªd2ø;:#‹ü·ºÝ»1ߦ«t»¤££ƒîŽê|>ìSS¤óæêj*7m±hÑ=}§YóûtÔ×nªÿºÐÙlxÖ­Ë%Èâq>r<Ži`€'ÚÛ‰šL¼ÿþû(ŠB[[­­­3D3Í55,üá F?üXo/“ÇŽ‘&50@Å“OâX´(×{­×Ï{ ‚ø5DyZí.ïV9•"‰îéaüÔ)F!tó&‚$á\¼˜Ú;¨Þ¶íUúÉÉI®]»Fgg'‚ °¤©‰g-bèÒ%¦òr8’Á€{õj*6nœWÉÿ;eîWýÈPZJåæÍDruȉNž=KK[þô§ŒŒqõêUþå_þ³Ù\K®®®ÆTVFÓ޽ث«|÷]ÆO"Ò×GÂç#ÜÓCùúõ-Â/“‡Qeå¶-LU”“s’'™$xãgÎ0yþ|áÌ1÷#PÿÜs”­_.šóðð0½½½ôåkzÍÍÍìØ±ƒšêjü—/scß>B7o~½¶µQþøã3êˆ_÷«Föµ·°ûáŒiL&\K—R¹y3±áa½½¹y::èûm´6Õ+VPSSƒ,Ë qëÖ->üðC¢Ñ(555ÔÔÔPÞÜÌ‚ÿsUã§Oéïgüôi¢ƒƒØÎœ¡dÅ \K–`®©ÁT^~GSš Ihm¶Üïó–JÔjç,/dc1>Ñ¡!B·n去ìì,ÜÖúzÜ«WãÙ°¹ªŠ+==!t»Ý΂ ضmUUU…í9ÐÙIßþÀäùó…’…©¼œêmÛp¯^=ç F÷îß«Ÿ@~¿†ÄÝ×%Qùúõ$&&è}óM’dóèj­VDgþXÇúúú‚Hd `ppááa.^¼H,£Ìfþjf—‹ÌÀq¯—¸×‹ÿÊ•œXwK Ž–¬õõè].Äü Ó³ø_ôÓ¦YRòÓ ©@ ׎›×o ݸA¸··`qt%%hkjÈ65Ñi·óÉåË8©¨¨`áÂ…<ýôÓwˆ¨²LthˆÁwßeäãs:’€±¬Œª­[©xâ t÷1ß3•Ï)=TuuuÝ7˜*+©Ú²…DþÞ”ßO6cøàA4ù2K]Ý §Öétât: #E±XŒ1¯—±&ººˆ˜LÐÓƒ.  1~æ —.!9ÊË1”—ct»±/\ˆ±¬ !›%–zÒ‘þ®.Ò‚@br’ØÐPn{ôzÉLN"G"Ñ,Å` åñª«Ã²t)ž%Kh««£²²rÞ¢­ª(ÄGGéûm†,G2(]µŠÚ;ç=ê«àÆŸ@ü1›6mº¯_ÌÚÐ@ýsÏ‘Ç=|9™$2òñÇ ŠÔïÙSÐUž f³™MM,hjBÙ°äÔáÞ^|W®0ÕÑA´»›ôø8YŸ¨ÏG´£U§C1›Qôú\¡2CL&T•Ðà ßþU§CÌfs¿ŸVÙƒ}Uæº:Ü+VPÞÞŽ¥ª CIɼ“#·#ØÙÉàx?ý”Äøxá÷%+VP»cö¦¦¯u}ÇoËÜ­@øÊ›akk+ùa¸û]3š8{–îßü†±cÇ>/ ––R±q#5Û·çÌîÁL‡ÃƇ ݼI¤·—ÐÍ›Ä}¾œ²W^&n®®Èi9Q«Íˆk³¡w¹0•—çº,ÀZ_µ¾þžÎ,ËD"ø¯^epÿ~¼G´ž%½g[ ^z‰ÊM›æ{ú:xì±Çf4û=\ºtiÖ‰ÔûÑ#G¸õë_¸v-×D¥ªˆ:åë×S¿w/ž5kæ”s™œÓâܱáa>‰ñqcc¤ü~2Ñ(ñ±1RyiÉ`ÀZW‡µ±­Å‚ÎéÄTV†©ª SEF­ÕzO‘‘’Í’ššbâÜ9÷ïÇ÷Ùg…!Áiõú†½{©Ø´iƤíýBggç¼’<ßh)ãoÿöoùÍo~ó@TÚÞŽ’NÓ÷ûß3~æ J:’N3~êTŽ##TlÚ„e–¤Ü|‰BÝŽÖlÆZW—ËÝÄb(©Ùxœ”ßÏÐ0òñÇdãq %%TmÝJí³ÏææØ5šÂÉÌÓIÆ{ «#}} ðÞ£G‰ôöÈ#ˆ"îG¡áÅ)]µêžiïÿãüûöZ_û¼°k×®±mÛ¶û&\=ãÃéõ¹ƒi=žœjýø8r2Y¨˜ÇGFHæ%…uvû¬ÂÜs& %)'³g4¢³ÛÑ»\¹÷Ê x®]CN&sQÐæÍ¸×¬A›°ÒŸ“çn%ñò­ã§N1ðöÛŒ>œ#O>ˬw:©Ø¸‘†^Èýêp<}ÇsçÎñË_þòÛÆOçþìÏþŒ³gÏ>öP­Õš a­V´V+ãŸ}–›âH§ ÷ö ÜÛKå¦M¸–-+ø!_ÙéÌ‹?¬ÊôþWÍ•¥RdÂáB’qüôiü'\Ôé°ÔÔàY»–šgŸ¥tåʯuhð—•/~þóŸÏ{ðÌ7n 7å÷ûïûàþí0zaâܹ\%?¯&6<Ìä… Xêê°ä¥b¬gYg·#}Ñ!¾Ý„ÂÑ jþœ/5¯²&§ÓdÂá™§‰‰ ÂÝÝ„»»‰{½3F”IBc2a­¯ÇÑÚJù† ¸ÛÛïkib.üêW¿âç?ÿù}sš(¦Iô‹_ü‚[·nñ?ÿçÿ| “:› Ïš5˜««q¶µ1yñ"k׈ö÷¢9™$ÜÝMlx˜©+W0¸\<ž‚f¡±¬¬ÔZ­ (¤Ï«ñÙ,ÉñqB7o’M$HNN’'‰äÔE†‡s?çÏªÈÆã3êi£K]¥«VQÚÞŽcÑ" n7Ú<·%Ë2ÿí¿ý7þöoÿö‘ç¾$çÖ-[øío{ׇÞ~­#"6úˆŸýìg…³É¾óšNܽúê«ü¯ÿõ¿¼5Ê7²+Ù,™h”äø8±‘‘©úúrgqùý$''IƒsÊÊ|éw’$4Fc!i,+ÃR[‹µ¡KMMÎa·Ù>×m|À‡¾LMMñ_þËáµ×^{ [ÖC!Ð4JJJø¯ÿõ¿òñwuTä}á“¢ çdKNN’œ˜ %ž?ØMN&sÎq:](g¤C¡Â’z—+WóšÎD›Íèl6tv;·;÷p¹0”–¢Í—I„ohê5•Jñÿðü÷ÿþßç=$ø{A Û·µ¿þë¿æÕW_½oã%÷šNƒ$§¦ÈäG«•l¶5?s¦pü¤În§|ýzÊ{ ½Ó‰&O"­Ùœ#“Å2«<߃F6›å׿þ5ó7sß΀ÿÊ7éÃz455©÷w§†ÃaõaA‘eUÉfU%›UåTJM…BêÍú'õ½mÛÔ7/V÷oÞ¬Þxí55‰¨J6«>lD"õïÿþïÕ¦¦&õa^»é‡ø0™ÛÝÝÍ/ùKjjjøOÿé?ÑÛÛûÍ›à¼Ðw¡¸j2ôQU’dâq$½þÛ–fC?ÿù?ÿgjjjøÿá?ÐÝÝÍ·e ›ÏÙ^¿~=üÇÌ‹/¾xßδº×ímàwËîÝ»yöÙggÏ~œœJá¿r…Àõ먲ŒÖjŹx1ö––o$¼÷Þ{¼õÖ[ìß¿ŸÔ]HS$Ð<E‘öövvîÜÉÖ­[iooÿæ5 2™ çÏŸçðáÃ}šãÇsâÄ Îœ9S ý.â;I ÙPUUÅ’%KX¶lK—.¥­­¦¦¦¢Î~7‡ÃtwwsíÚ5:::¸rå  ó}Â÷†@s¡´´”††ªªª¨­­ÅívS^^ŽÛíÆn·ãp8°Ùl˜Íft:‹eÆöÇ ~H(BQ”Â)Á`‰‰ |>ããã 2::J__sˆ¡ßð½'PØ?-.AEQ$PEQ$PE TD‘@E TD‘@EQ$PEQ$PEQD‘@E<¥ŠËPÄW„"Þâ:ñ1%ýÅu(â+¢Sסˆ¯ˆCÐÜàaYÄwY Ez׋ëQÄ=â_€ÞiI p ¨(®Kw/°ŸÎ{XqmŠøÄò\‡™‰ÄÓÀ`¬¸FEÌcy¶ä¹2'ÜÀk@†oþLññ­xdóœp‘,óÉjÕ/Ïmy?I(Þ„ÿ. æ·¨®|šç×@ßlOüÿ7pœÚIEND®B`‚lft-3.8/icons/144x144/dest_prohibited.png000644 000766 000000 00000023430 12062431750 020015 0ustar00vicwheel000000 000000 ‰PNG  IHDRçF⸠pHYs.#.#x¥?v OiCCPPhotoshop ICC profilexÚSgTSé=÷ÞôBKˆ€”KoR RB‹€‘&*! Jˆ!¡ÙQÁEEÈ ˆŽŽ€ŒQ, Š Øä!¢Žƒ£ˆŠÊûá{£kÖ¼÷æÍþµ×>ç¬ó³ÏÀ –H3Q5€ ©BàƒÇÄÆáä.@ $p³d!sý#ø~<<+"À¾xÓ ÀM›À0‡ÿêB™\€„Àt‘8K€@zŽB¦@F€˜&S `ËcbãP-`'æÓ€ø™{[”! ‘ eˆDh;¬ÏVŠEX0fKÄ9Ø-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+®ç*x™²<¹$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóýxήÎÎ6޶_-ê¿ÿ"bbãþåÏ«p@át~Ñþ,/³€;€mþ¢%îh^  u÷‹f²@µ éÚWópø~<ß5°j>{‘-¨]cöK'XtÀâ÷ò»oÁÔ(€hƒáÏwÿï?ýG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)¬‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(¼ AÈa!ÚˆbŠX#Ž™…ø!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fº‘;È2‚ü†¼G1”²Q=Ô µC¹¨7„F¢ Ðdt1š ›Ðr´=Œ6¡çЫhÚ>CÇ0Àè3Äl0.ÆÃB±8, “c˱"¬ «Æ°V¬»‰õcϱwEÀ 6wB aAHXLXNØH¨ $4Ú 7 „QÂ'"“¨K´&ºùÄb21‡XH,#Ö/{ˆCÄ7$‰C2'¹I±¤TÒÒFÒnR#é,©›4H#“ÉÚdk²9”, +È…ääÃä3ää!ò[ b@q¤øSâ(RÊjJåå4åe˜2AU£šRݨ¡T5ZB­¡¶R¯Q‡¨4uš9̓IK¥­¢•Óhh÷i¯ètºÝ•N—ÐWÒËéGè—èôw †ƒÇˆg(›gw¯˜L¦Ó‹ÇT071ë˜ç™™oUX*¶*|‘Ê •J•&•*/T©ª¦ªÞª UóUËT©^S}®FU3Sã© Ô–«UªPëSSg©;¨‡ªg¨oT?¤~Yý‰YÃLÃOC¤Q ±_ã¼Æ c³x,!k «†u5Ä&±ÍÙ|v*»˜ý»‹=ª©¡9C3J3W³Ró”f?ã˜qøœtN ç(§—ó~ŠÞï)â)¦4L¹1e\kª–—–X«H«Q«Gë½6®í§¦½E»YûAÇJ'\'GgÎçSÙSݧ §M=:õ®.ªk¥¡»Dw¿n§î˜ž¾^€žLo§Þy½çú}/ýTýmú§õG X³ $Û Î<Å5qo</ÇÛñQC]Ã@C¥a•a—á„‘¹Ñ<£ÕFFŒiÆ\ã$ãmÆmÆ£&&!&KMêMîšRM¹¦)¦;L;LÇÍÌÍ¢ÍÖ™5›=1×2ç›ç›×›ß·`ZxZ,¶¨¶¸eI²äZ¦Yî¶¼n…Z9Y¥XUZ]³F­­%Ö»­»§§¹N“N«žÖgðñ¶É¶©·°åØÛ®¶m¶}agbg·Å®Ã“}º}ý= ‡Ù«Z~s´r:V:ޚΜî?}Åô–é/gXÏÏØ3ã¶Ë)ÄiS›ÓGgg¹sƒóˆ‹‰K‚Ë.—>.›ÆÝȽäJtõq]ázÒõ›³›Âí¨Û¯î6îiî‡ÜŸÌ4Ÿ)žY3sÐÃÈCàQåÑ? Ÿ•0k߬~OCOgµç#/c/‘W­×°·¥wª÷aï>ö>rŸã>ã<7Þ2ÞY_Ì7À·È·ËOÃož_…ßC#ÿdÿzÿѧ€%g‰A[ûøz|!¿Ž?:Ûeö²ÙíAŒ ¹AA‚­‚åÁ­!hÈì­!÷ç˜Î‘Îi…P~èÖÐaæa‹Ã~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DÞ›g1O9¯-J5*>ª.j<Ú7º4º?Æ.fYÌÕXXIlK9.*®6nl¾ßüíó‡ââ ã{˜/È]py¡ÎÂô…§©.,:–@LˆN8”ðA*¨Œ%òw%Ž yÂÂg"/Ñ6шØC\*NòH*Mz’쑼5y$Å3¥,幄'©¼L LÝ›:žšv m2=:½1ƒ’‘qBª!M“¶gêgæfvˬe…²þÅn‹·/•Ék³¬Y- ¶B¦èTZ(×*²geWf¿Í‰Ê9–«ž+Íí̳ÊÛ7œïŸÿíÂá’¶¥†KW-X潬j9²‰Š®Û—Ø(Üxå‡oÊ¿™Ü”´©«Ä¹dÏfÒféæÞ-ž[–ª—æ—n ÙÚ´ ßV´íõöEÛ/—Í(Û»ƒ¶C¹£¿<¸¼e§ÉÎÍ;?T¤TôTúT6îÒݵa×ønÑî{¼ö4ìÕÛ[¼÷ý>ɾÛUUMÕfÕeûIû³÷?®‰ªéø–ûm]­NmqíÇÒý#¶×¹ÔÕÒ=TRÖ+ëGǾþïw- 6 UœÆâ#pDyäé÷ ß÷ :ÚvŒ{¬áÓvg/jBšòšF›Sšû[b[ºOÌ>ÑÖêÞzüGÛœ499â?rýéü§CÏdÏ&žþ¢þË®/~øÕë×Îјѡ—ò—“¿m|¥ýêÀë¯ÛÆÂƾÉx31^ôVûíÁwÜwï£ßOä| (ÿhù±õSЧû“““ÿ˜óüc3-Û cHRMz%€ƒùÿ€éu0ê`:˜o’_ÅFCIDATxÚì}yTTGöÿ§»¡Ð ‹ _5þ b"Æ ‹Ê¢ ’¢q$˜è$%“Œ¦çQÐ8Š£â‚è˜hP‰¢ˆÅ A\€¨ãh4hÜÂ&´‚²ußßÑ>–÷^÷£iºûsN£tU½zUŸWuëÖ­{hNÆàÿ¼ @# u¸ ÀOÏþÍ ö~ЀŒÉ˜žqá‡gÜhï¸oì0cj!Ý}Æ!O: ã nD+¨àà싲p€£±Œ`(=ûC€!Æ~1‚%^y6éìx À &Æ~1‚ôøÀH#Ô€ €…üŒ}a„šð7àbHoÜ¥K¸ººÂÙÙNNNpvv†ƒƒ:wî ;;;X[[ÿ¹È¿ò LLLÐØØˆÇªªªP^^އ¢´´………(**Baa!òóóQRRbhúµÐS ³½½=<<<àé鉷ß~nnn°³³k³ç•——#77çÏŸGvv6rrrPVV¦ÏR ð§‚H/ ‘H0lØ0bĈèß¿»·)//iii8zô(Nž<‰ºº:½cQ‡ÖŽJ$ ¡íÛ·“\.']†\.§ÄÄD !‰D¢/ÚéŽÙpwwwZ»v-UTTPGDEE­]»–ÜÝÝÒVòð𠌌 ª««#}CUU%%%‘ŸŸ‰D"#øL:u¢„„ª¯¯'}†R©¤²²2’Éd$‹Ò4‰Åb’ÉdT^^N†…BA7n$ #ÔI€Â¨°° ÷îÝ£°°0:K ÛÆ»¹¹!>>žžž¼Ö+—ËQRR‚‡B.—C.—C¡Ph\¯H$‚T*…T*EçÎÑ¥KH¥R^ÛžˆˆäææêÜ^gdnnŽ @&“ÁÄDó£¹ëׯ#33gΜÁ™3gPQQ¡µw±µµ…··7¼½½áãヾ}ûj~rÙØˆ•+W"** Ož<éx‹Åppp€µµ5LMM!xk„««+¢££áä䤱Ò.)) ÉÉɸqã†Îtò믿ŽqãÆaâĉ+7‹‹‹1þ|äççó§$BCCär9JKK9+;×9 3f ýüóÏT]]­SrÂãÇiýúõFŸâîîNqqqôèÑ#êÇêêj:pà…„„pÞ[Ï`jjJ111TYYIJ¥Rg^¸¨¨ˆfÏžMÖÖÖRgmmM³gϦ¢¢"R#TVVRLL ™ššòC ©S§êÔK9r„ÌÍÍõâ(@,Ó§Ÿ~ªSªŠ¢¢"š:u*?ÊÊÊ"…B¡SЉ‰!½¹í  I&“é”*++‹UÛ·;„P(|iwsèÐ!Èårλ%???xyyqðøØu|¨²²²‘‘ÁywgccƒQ£Fáõ×_…B 8UyF˜™™½ôÿ+W®`É’%¨ªª‚H$b­+‰‹‹ãLž .`éҥؽ{7çÎôóóƒO»#33“ó >GAAz÷îÍ:¿—— ðÙgŸ±&¤B¡€ UjnÜÕ&Ð_ñäÉ•N…M#Åb1¶oߎÐÐPN_Å¢E‹°dÉtëÖM­Î3f fΜÙî²²²R›@Ó§OÇ!C0þ|Ö³ý”)S`ee…°°0Ô×׳*S^^ŽššµÚ(TGó*‘°3`455ÅŽ;8‘çöíÛðôôDtt4ajjªÖ‹=}úT'–&MÚ! OOOܾÍúj:BCC±cLjÅbVù% ëÕD㈠Ñ~úé'Nä)--…‡‡/¶Åeee(,,lwñaÒzþüy 8[¶lAHHk%&&bâĉ¼ÈWj+ÿŠ„„VÖtëׯWkpøðá—Lzõêe»°™3g6yO??¿&‡Ì ,à¤[¿~=+«Î„„„&eYµ½-9þ|DDD¨UväÈ‘HIIa=ýˆQQQ˜8q"jkkY•‰ˆˆÀÂ… Û¬M¼hÒ¤IˆŽŽÖ¨Ž   ìÚµ b±¥¥¥K˜–€wíÚ…Q£FáÑ£G¬êY°`>üðÃ6i#o2ÐÒ¥KñÎ;ï`È~®ØãöíÛ¸zõªÁhݺu­ÊP.\€——«ÙzË–-øøãqöìYÌ;W÷4nÜ8ôêÕ‹×ttt„££á: ñööæuSãããƒîÝ»óJ ^–0@€®]»…”€®]»òªÙçeúòË/aiiɘO©Tâ?þ0èY… Î;‡‡²Êkkk ww÷—Žšƒ¥¥%¾üòK¬\¹R7ôÆo`É’%¬v}ôñïÿ›×i´9ØÛÛÃÞÞ¾ÝIPVV¦¶.húôé¸|ù2ëüáááØ¶mã ³dÉ=z”7ùRm=H$¢³gϲÒG,[¶ì¥z—/_Þ¦§ñK—.Õ‰“í¥K—ò¦b“–-[ƪ]gÏžUõa»éd2̘ïÈ‘#˜7oÞK›3gV­Z¥Ös¿2¶ç@m m·cÞ¼y8räc¾ÁƒcöìÙí'DwëÖ ‘‘‘Œù2ЪU«g¥R‰>ø Ee aÖ¬Y011ÁgŸ}Æéù3fÌ@}}=fÍš…?gÛ—±~ýz>|¸Ý Äå”/”––"<<ééé­ Õ–––X±b…ÆJFÎ2¯¯/«u666–õEÂÿþ÷¿jÉ+W®4˜³0®)66–Uúúúª-©E ¬¬,ÆFݼy““u¿@  ~øA--_¾\/ ôÖ[oiT¯……0ö_VV–Ú⼄uïÞÕ­Ñ;wbôèÑœê>vì^{í5Ζ„_}õšê!!!k÷“’’ðÍ7ß´šÇÓÓ“õá¬ÆKXYY™ÎÞ%ŽŽÖ«H›hn\Ûdß–>5Åüùó±`Á£ [ ¨;®B}눅 2NÙFð^MZkjjàåå…òòr~gb‚„„ 6ŒS¹Å‹£¡¡111zpþþ÷¿#++‹·&++«MôRœd Ö°jÕ*Þåµ×u™LÖ¡e ///^Ÿ³jÕ*Nýmš´Ö××óvÂû"Ô½-+V¬Ð‰«=ê‚íí¶X¹r%ïG+¼(99wîÜѹAXµj>ÿüs£°àÎ;HNNÖMÅÇÇëd§ ¬Y³3fÌ02À† t@W¯^Å™3g´Ö EEEœI´~ýz|òÉ'O Ó§OójgÎ ¶oß®ÕNØ»w/N:Å™D›6mÂ?þñƒ'Ÿã¥1ˆIIIZ퀆†Œ3§OŸV‹D}ô‘AhÇŽÍZ0´ .]ºÔ.& 555 Bvv6ç]ÝæÍ›f°***ÂùóçÛž@l\‹8p Ý:âñãÇ=z4~ùåÎ$Ú¶m&L˜`°$:xð c6ãß*ØÜKjOú9r$ç/J$!11ãÇ7H:tˆ1›K¢BM*Ëåœn ´%‰pñâENåLLL˜˜ˆ±cÇ._¾ ¹\Þ¶zë­·Z-œ••Õæ®CØ¢ªª #FŒàLh±XŒ;wâ½÷Þ3() Æs6¦ño•@¦¦¦xã7Z-œ““£SòðáCp ‹‘œœŒQ£F‰˜6 ýúõctð%Ô¤0×%C(++ÃðáÃ9+ËÄb1öîÝ‹ÀÀ@ƒ!Ð¥K—ZýÝÔÔýúõS@}úôalÀ•+Wt²cÊÊÊàïï_ý•S9‰D‚””Œ1 Äfü^t¼É‰@...Œ‚ë½{÷t¶sJJJàïïÏ9f†¹¹9öíÛ___½'н{÷i&´H ×^{­Õ‚í¡<äŠÀßß7oÞäL¢ƒbèСzO¢ßÿ½mÄäA£#èùWæëë‹[·nq&Qjj*¯>ztLãÈă ÄäÙB——¯¿âîÝ»ðóóãìµÕÒÒ©©©ðððÐëe¬5888¨G [[ÛV j3€(..†¯¯/Š‹‹9•³²²ÂáÇY9‘èˆ`G&  °°~~~¸{÷.§rR©ÇŽƒ»»»‘@l Äd‹¬+žà¹âÖ­[ðõõå¼K¥R¤¥¥±ÒÎv$0ÝHeòxÖâ¯:ujµ .Åí䊛7oÂÏÏ<àTÎÆÆiii0`€ÞˆiÍÍÍÕ#¾;úþí·ßàïïÏ9¬‚­­-ÒÒÒàêê C€ÚGºâá«-ñ믿Âßߟ³C{{{ddd0ªùõ êˆIÆašÚ: ®^½ŠáÇ«E¢ôôt^Bz·'4UZ$“™Óƒ;rssÀÚ¥îstíÚéé霂Âu4)•Jõ¤éö®£áòåË1bªªª8•sttDFFï^úµMÕ5-ˆékÔ7š§Œ1‚ñ€ñ¯èÞ½;222Ï Š@LQrÔ E©ëøßÿþ‡‘#Gr&Q=‘‘''§õ¾LãÈă Ää&–é”¶#ã—_~ÁèÑ£ñøñcN圜œpâÄ ]çjLãÈă ¤é1GGvv6‚‚‚8£uqqAFFºwïÞ!ÞSS³ Ätr-•Jõv{ŽÓ§O#((ˆ³Ö½W¯^ÈÈÈÐù 2ŽŽŽJ¥mC 6–|ú¤Òo 'OžÄ˜1c8“¨wïÞHOO×é0Xo¾ù&c&´H k×®1j!õí`±%¤§§cìØ±œûöí‹ôôtF›šöÓø5440Ú• [+Ìt³¿h}Á±cÇÊùˆ§_¿~HOO׉ÐS\ÇïÚµkŒïÛêY=Óµ///\Ðu49rcÇŽåL"WWW¤¥¥é”‹d‘H///h2þŒbr%•JY­£ú„C‡a„ œI4`À;v 666:#ÿ0 ÐlÜç5­€k8}ÀþýûÆ(#6's¤¥¥1œ6ÀfÜ4&PAAccÆŒ!"%%áááœ}¸»»ãرcíN¢   Æ|H{öì!ww÷fŸ½{÷î6‹ÚÌ™@ééé¬^<  I]}ûö¥øøxºsçN“ü—/_¦Y³f‘•••Ö dccC ÔÐÐ@DDçΣ¨¨(š>}:EEEѹs爈¨¡¡ZýÚ[K .T‹D;wˆª¬¬TÍLß|ó Íš5‹èéÓ§DD”˜˜Hvvv/=3 €Õ3š×6!PBBeee16¨  €,,,^úÂãããU¿8p€–-[F›6m¢ÜÜ\""*))¡I“&‘©©©ÖdaaA“'OVÕ½nÝ:òðð 333@fffäááAëÖ­Så™>þ¥­»D"Q™ËVWWÃÎΉ‰‰ŒÞÅž}:Ö®] ¡Pøøø`øðáP*•¸té¶nÝÊêNÚ¢E‹8{®åU‘¸råJ\¸p1ߨQ£T& Æ kÖYeHHzôè§OŸªf"m@.—£ªª ‰ï¼óN‹±Ú% <<< ‘HPUUÅùÚs³ 8"üë_ÿÂÆ9—ýç?ÿ‰øøx¼÷Þ{ˆŒŒ„««+ ðÊ+¯° sáÂüç?ÿѾ"ñ¹ ôü÷þýûS]]ãZ«T*©¢¢‚)55•¼½½I(R·nÝhÚ´i*ýËž={ÈÅÅEk2‹‹ %''ѵk×ÈÙÙ¹Ù|ÎÎÎtíÚ5•Üðb5M"‘ˆrrrÔ’‰ž}ú”¾þúk277çU . iæÌ™¤ ØU:t¨É.NñbPFD˜2e .\¸ÀhÔ©S'ôèÑ«W¯F}}=êêêPTT„ÌÌLÎAQøÂ“'O°bÅ TWW#88C† App°ê÷ºº:¤§§cÿþýذa/4ßhIv{wïÞÅ”)Sx53áÍ"±´´¡¡¡8yò$£ß=+++„‡‡#00Pg‚Ö544`ݺuÈÌÌD@@\]]aee…G!??GåÄN—ðôéS„††2:Œj7Àùóç1}útlݺ•1¯Nœ8àà`dffêLGççç#??_'ÚrêÔ)ÞBN͘1ƒ·XñmfÛ¶mâE‹Xå}Èäý÷߇MñÝwßaïÞ½¼ÔÃæ£Ö @dd$âããYå533CRR"##y»«¤/hllÄĉqàÀµëˆÇ·ß~Ûfm¶UÅ_|ñ’““Y刊ŠBJJ ¬­­Ìyõõõ?~<ÒÒÒ8—MNNÆ_|Ѧík3) „‡‡#%%…u™\¼xƒ 22çôïߟ³3ó½{÷ªuíºÍ ¤P(X»6©¯¯GXX'¹¸¸ ;;‘‘‘011ióÐuDFF"''ÎÎΜÈ3qâDNã¤n?s&……§e¦¾¾&LÀæÍ›Y—155ETTrrr &*Nsˆ‹‹CTTcÄœ±yóf¼ÿþûœüYYY©}½šq_[[ 333Õÿß|óM|ýõ׸ÿ>§»qãNœ8Á)œö Aƒ°oß>ƒ%×@.™™™¸qã§ëD èÚµk‡©LèXèâÅ‹øÛßþ¦2ÁèÓ§FWU8O‘B¡A…W>>>ðññѸ¥RÉZÁË8:[¶lác´­áææ¦7ñÄb1>ùäºOw÷î]lÙ²…uþVËLMM)&&†*++Y™ h ÅÅÅ$“ÉÔ¾fÓÞI*•’L&£ÂÂBéS¥RI•••óÒÅhrg7BBBè矦ššÒ%M‘ŸŸO«W¯¦qãÆ5¹l×ÖÉÎÎŽBCCiõêÕMlŸÔECC-_¾œw[$MëH›ò† àááÁk½•••xðàÊËËQYY‰ªª*^””"‘ÖÖÖ°±±^}õUÞ}Açää`ÆŒ¼Î:|Bçä@@aaaTTTD†Œ{÷îQXXX³÷Àt(é®ÀiffF2™Lu­×P P(hãÆMü ¤fêÔ©%$$¨ òõJ¥’ÊÊÊH&“ñj´oðzž<==)##C/‰$—Ë)))‰üýý[¼^m$Ïú”µk×vØå­¢¢‚Ö®]ÛaôWzG ¼p%eìØ±”˜˜Hr¹\çg™ÄÄD mr}©£&€ZèÌÌÌ0tèPŒ9Ç×XiÇòòòpüøq9r§Nb}ÊÝA ¸ ÀYO¸íííáááOOO¼ýöÛpsskÓ oåååÈÍÍÅùó瑜œ”••é³A™À >0téÒ®®®pvv†““œáàà[[[ØÙÙ©Â0Y[[«ç¬ó³ÏÀ –H3Q5€ ©BàƒÇÄÆáä.@ $p³d!sý#ø~<<+"À¾xÓ ÀM›À0‡ÿêB™\€„Àt‘8K€@zŽB¦@F€˜&S `ËcbãP-`'æÓ€ø™{[”! ‘ eˆDh;¬ÏVŠEX0fKÄ9Ø-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+®ç*x™²<¹$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóýxήÎÎ6޶_-ê¿ÿ"bbãþåÏ«p@át~Ñþ,/³€;€mþ¢%îh^  u÷‹f²@µ éÚWópø~<ß5°j>{‘-¨]cöK'XtÀâ÷ò»oÁÔ(€hƒáÏwÿï?ýG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)¬‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(¼ AÈa!ÚˆbŠX#Ž™…ø!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fº‘;È2‚ü†¼G1”²Q=Ô µC¹¨7„F¢ Ðdt1š ›Ðr´=Œ6¡çЫhÚ>CÇ0Àè3Äl0.ÆÃB±8, “c˱"¬ «Æ°V¬»‰õcϱwEÀ 6wB aAHXLXNØH¨ $4Ú 7 „QÂ'"“¨K´&ºùÄb21‡XH,#Ö/{ˆCÄ7$‰C2'¹I±¤TÒÒFÒnR#é,©›4H#“ÉÚdk²9”, +È…ääÃä3ää!ò[ b@q¤øSâ(RÊjJåå4åe˜2AU£šRݨ¡T5ZB­¡¶R¯Q‡¨4uš9̓IK¥­¢•Óhh÷i¯ètºÝ•N—ÐWÒËéGè—èôw †ƒÇˆg(›gw¯˜L¦Ó‹ÇT071ë˜ç™™oUX*¶*|‘Ê •J•&•*/T©ª¦ªÞª UóUËT©^S}®FU3Sã© Ô–«UªPëSSg©;¨‡ªg¨oT?¤~Yý‰YÃLÃOC¤Q ±_ã¼Æ c³x,!k «†u5Ä&±ÍÙ|v*»˜ý»‹=ª©¡9C3J3W³Ró”f?ã˜qøœtN ç(§—ó~ŠÞï)â)¦4L¹1e\kª–—–X«H«Q«Gë½6®í§¦½E»YûAÇJ'\'GgÎçSÙSݧ §M=:õ®.ªk¥¡»Dw¿n§î˜ž¾^€žLo§Þy½çú}/ýTýmú§õG X³ $Û Î<Å5qo</ÇÛñQC]Ã@C¥a•a—á„‘¹Ñ<£ÕFFŒiÆ\ã$ãmÆmÆ£&&!&KMêMîšRM¹¦)¦;L;LÇÍÌÍ¢ÍÖ™5›=1×2ç›ç›×›ß·`ZxZ,¶¨¶¸eI²äZ¦Yî¶¼n…Z9Y¥XUZ]³F­­%Ö»­»§§¹N“N«žÖgðñ¶É¶©·°åØÛ®¶m¶}agbg·Å®Ã“}º}ý= ‡Ù«Z~s´r:V:ޚΜî?}Åô–é/gXÏÏØ3ã¶Ë)ÄiS›ÓGgg¹sƒóˆ‹‰K‚Ë.—>.›ÆÝȽäJtõq]ázÒõ›³›Âí¨Û¯î6îiî‡ÜŸÌ4Ÿ)žY3sÐÃÈCàQåÑ? Ÿ•0k߬~OCOgµç#/c/‘W­×°·¥wª÷aï>ö>rŸã>ã<7Þ2ÞY_Ì7À·È·ËOÃož_…ßC#ÿdÿzÿѧ€%g‰A[ûøz|!¿Ž?:Ûeö²ÙíAŒ ¹AA‚­‚åÁ­!hÈì­!÷ç˜Î‘Îi…P~èÖÐaæa‹Ã~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DÞ›g1O9¯-J5*>ª.j<Ú7º4º?Æ.fYÌÕXXIlK9.*®6nl¾ßüíó‡ââ ã{˜/È]py¡ÎÂô…§©.,:–@LˆN8”ðA*¨Œ%òw%Ž yÂÂg"/Ñ6шØC\*NòH*Mz’쑼5y$Å3¥,幄'©¼L LÝ›:žšv m2=:½1ƒ’‘qBª!M“¶gêgæfvˬe…²þÅn‹·/•Ék³¬Y- ¶B¦èTZ(×*²geWf¿Í‰Ê9–«ž+Íí̳ÊÛ7œïŸÿíÂá’¶¥†KW-X潬j9²‰Š®Û—Ø(Üxå‡oÊ¿™Ü”´©«Ä¹dÏfÒféæÞ-ž[–ª—æ—n ÙÚ´ ßV´íõöEÛ/—Í(Û»ƒ¶C¹£¿<¸¼e§ÉÎÍ;?T¤TôTúT6îÒݵa×ønÑî{¼ö4ìÕÛ[¼÷ý>ɾÛUUMÕfÕeûIû³÷?®‰ªéø–ûm]­NmqíÇÒý#¶×¹ÔÕÒ=TRÖ+ëGǾþïw- 6 UœÆâ#pDyäé÷ ß÷ :ÚvŒ{¬áÓvg/jBšòšF›Sšû[b[ºOÌ>ÑÖêÞzüGÛœ499â?rýéü§CÏdÏ&žþ¢þË®/~øÕë×Îјѡ—ò—“¿m|¥ýêÀë¯ÛÆÂƾÉx31^ôVûíÁwÜwï£ßOä| (ÿhù±õSЧû“““ÿ˜óüc3-Û cHRMz%€ƒùÿ€éu0ê`:˜o’_ÅF¾IDATxÚì{P”õ¿Çß,{V`¹·U4/ÔaÆD%1E[ˆ©T¿ Ðc“fc…¦M59rjF'sš$Ã!#æÔqH»8eD) ƒ–˜HDˆ)?aÁU`YXvÙýœ?„=!¨°î>»,Ÿ×ÌwFž}ž}¾ûy^û½]Üž)þ À}ÂÈÀLú´¸à(€ÿø÷¨°€ qâ4à¾7îÈCÔ0N·IÍŽXñ¸Ež£ä\‚3w@ À©  @LJ­f¸æ9pà#‹9.Ì(ñ(ty˜à<1Ç…ýfˆd±<Œ ˆü—€ŠcÁØH’ÀTŽc#÷{0€G˜Û°xàæÃØ„ˆCÀ°@ 4æÏŸ‚‚477Ãb±€ˆÜ"Y,´µµaÿþýP©TðôôW‹‰¼§Ÿ~šjjj¨««‹Ü½^O/^¤—_~™¤Réx™`uí ŠÅbš;w.Õ××ÓDA­VSjj*I$—Èå«0???¬Y³÷ßÿ„iW„‡‡cíÚµˆˆpý¹m—ŸÂðõõÅã?"‚‡ÇÍÅÍÍͨ©©Agg'Äâñ= c6›áëë‹ØØXÜwß}Öã)))ÇåË—Y {Á`0 44tȱ²²2äææ¢¥¥2Ùø5ÆÆ±yófëqX,÷)¤R)BCC¡P( ‘H¬¥£Q*•ÃŽµ´´àï¿ÿ˜L¦q_e©Õj\º4|Éñœ9sÐßßïø^L&t:4 úúúì+\.GRRžþy¨T*ÈåÎ]´(‘H ‹ ® ßb±^^^ÃŽççç –½^òòrìÛ·?ÿü3ôz½}’H$ÈÍÍÅš5kàïï/XÉs·oŒ;a±X`6›š¹\Ž´´4,Z´xë­·FUºßµ–ÌÌL( —‡qP(ÈÌÌDvvö¨®¹«@«W¯FTTGw…Õ«WÛ§ ‹‹‹ƒHôÿž544à‡~€N§sxº¯¯áááX¿~ý„|Ÿþ9êêêÚæìïïG@@RSS1kÖ¬›¥ŠH„¸¸8ûtkãî÷ßÇöíÛ¡Õj>gc2™c“@*• K—.uº(++³Y ÒÒRH¥R‡åÏl6# VFzî÷ܤ§§íííÖ›;šžž›®[¾|9rrrœ.ŸŸŸÍõöö¸9VäH®_¿>ê^טÛ@·âéé)èàD"¹§à;›{ɇP£ì2™ÌæÚÄmwc\»vÍ:Øèì|¸3n+Ю]»°k×.îR9^‘ȸ·@fÂ>œÁÎÊ„¨ÂÞ}÷]Ìœ9Óîtö¼›3ÉË˳{꯿þÂo¼áz¥§§G`îE‹Ùý=ÏŸ?oWìV…¹Û§»bïçd·¨¤¤Ä!Ýf$&&Nȇ]UU…ŽŽ»¾ç¹sç\S W_}Õ!AT(èììóu!!! qº×®]³¹ó / ¦¦fb4¢Epp°M×mÚ´ ¯¿þºÓó¿cÇ›ÛÜwŽž?où`Æi÷ß݇!Üv*cÏž=())qz>FZ,ÏÑØØÈýö‰^…‡á|GaKïsÜ–@IIIé5„……MXÒÓÓ1}út»¾gGGŽ=êzíÝ»wÈÖ\æÞÙºu«Cªv{Ji·*l"W5ã {?'ž ›`¸ì\زe˲{ ::•••òagffâĉv}O{lÚM G­ýÈ»a[ZZÐÒÒÂÝø{a´û“Ü‘ñð_×ðšh†bX †bX †aˆaˆaX †bX †bˆaˆa†bX †bX †bˆaˆa†bX †bX †aˆaˆaX †bX †bX †aˆaˆaX †bX Æýs†r§ß's…_e¼]þœ•7.n!%%¨­­Å•+WP[[‹‚‚¤¤¤¸„çŸ~Š®®.Aƒ€>øYYY‹Å8}ú4JJJ V«ÔÔTÌŸ?“'O†T*ÅÆÑÑÑ!Xþ¤R)ž|òI¬_¿ …ÇÇO?ý½^9sæ ##O<ñ rrrpýúuAãGwJ·RTTD2™ŒîvÝ­Éßߟ>þøcëû|÷Ýw´cÇ*(( ÚÚZ""ºzõ*­ZµŠ$‰õºéÓ§ËÃ{ï½Gb±xÌy)ÉårÊÎζ¾w^^%$$—— ///JHH ¼¼<ë9ÙÙÙ$—Ëír$‰(''gØçT©T€âããéÌ™3DDtøðaš7ožõóOž<™¶mÛFÔÝÝMëÖ­óýe2 »ÿ(¯F •+W’N§#½^O}ô͘1ƒÐ¤I“(99™*++‰ˆ¨²²’fÏž-˜@111TQQADDGŽ¡   Ï ¢#GŽQEEÅÄÄ&Ћ/¾HDDMMM´xñâaׇ††Òˆˆ¨¤¤DPkDgddÀÏÏåå娱c.\¸èîîÆ‘#G°mÛ6´¶¶âá‡F||¼`Åodd$,X½^Ý»wC«ÕŽxžV«ÅîÝ»¡×ë±`ÁDDD–G…BÐh4#¶5 Ξ= ‚æKÐ^Ø`ÃïÔ©Shjjözyy9ÚÚÚ@ÐŤI“ “É`4QWW³Ù<âyf³üñŒF#d2&Mš$X ÀÛÛ‘‘‘#vL‚ƒƒ­_H·¨¯¯ —Ë! ¿­ŸŸ<==ýýý‚Àl6ƒˆàááŸÛ޳üóu"‚Éd,—/_FGG”J%V­Z‰D‘HˆÅb,]ºÉÉɰX,¨®®vOΟ?X²d æÎ;ìõôôt(•JôööZK"!ÐétÐjµÉdx衇nû[í2™ ÉdÐjµ¸qã†`yüõ×_qèÐ!øúúbÆ Ø´i¢££ŒeË–aëÖ­ˆÅ… ðÅ_>Ä H#úÑG¥+W®P?>|˜-ZD"‘ˆ"##iÍš5ÔØØHDD_}õM:U°FôÔ©SéàÁƒDDT__OÑÑÑ#žMõõõDDtðàÁ!ytt#Z$ÑÂ… ©ªªŠˆˆº»»éÒ¥KtñâEÒh4DDÔÙÙI/½ôI¥R÷ì…y{{Ó–-[È`0QCCUTTPUU•5 ”’’Bžžž‚ $•J)--úûû‰ˆèرc”••EþþþÖá‡gžy†Ž;FDDf³™ÒÒÒlzP¶ 4˜Ï„„ÊÏϧööö!çýøã”‘‘A6Ýÿ^l ±··Ÿ|ò ººº°råJÄÇÇcÖ¬YÖöÑ×_ÂÂB?~ü¶ YG`4Q^^Ž-[¶ 77‰‰‰˜6m222ÐÑÑÀÀ@ÄÅÅA©TÂ`0àwÞAyy9ŒF£ Õ„ÑhÄ/¿ü‚+W®àûï¿GXX$ t:êêêP[[ëþSmmmøðÃQ]]… "88}}}¸|ù2***pñâE§¡§§ï¿ÿ>º»»±bÅ ,^¼+V¬Ò8zô(:„üü|AзÒÜÜŒææf¸ N™¯¬¬Dee%\ “É„¼¼>>NÙŸå<==!;wV©§§eee(,,Diié¨'ŒG•k½^’’üöÛoP(H$‚•J¥ß~ûíc7nÜpy¿¤½½½Ãޝ[·§OŸ¤ä1™LÐétÐh4ÖåÇv¸¹¤ÁK ZZZ† Gxx8Z[[ÝB ÀÀÀ!»a9{ö¬àkœíÞw6^^^Ðh4 ±–z*• {öìÁÕ«W>” Dé„9sæ «RFÚ|à’m'WN´wï^šh|óÍ74eÊrõçãò‰Åbš7ožuAûD@­VSjjê-Þ®š<ü·+‹jµííí˜1cärùm·ÞŒwzzzÐÔÔ„;wâÀN]:ë6UØ?S||<PKK Y,·*u®^½Jû÷理¤¤!»R\=y Öc cÓ .‡€¹Wú8 Œ­MT€VŽc#í"s©(ã806rÔÀ4çÁ› ™±Ñ`–À¿|Îñ`ÆÈþ=¸&#@ €pŽ 3 Z<@38¤ð8=dž¹ úW4ÀÐÄS’´qŒ˜;”ç¬ó³ÏÀ –H3Q5€ ©BàƒÇÄÆáä.@ $p³d!sý#ø~<<+"À¾xÓ ÀM›À0‡ÿêB™\€„Àt‘8K€@zŽB¦@F€˜&S `ËcbãP-`'æÓ€ø™{[”! ‘ eˆDh;¬ÏVŠEX0fKÄ9Ø-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+®ç*x™²<¹$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóýxήÎÎ6޶_-ê¿ÿ"bbãþåÏ«p@át~Ñþ,/³€;€mþ¢%îh^  u÷‹f²@µ éÚWópø~<ß5°j>{‘-¨]cöK'XtÀâ÷ò»oÁÔ(€hƒáÏwÿï?ýG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)¬‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(¼ AÈa!ÚˆbŠX#Ž™…ø!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fº‘;È2‚ü†¼G1”²Q=Ô µC¹¨7„F¢ Ðdt1š ›Ðr´=Œ6¡çЫhÚ>CÇ0Àè3Äl0.ÆÃB±8, “c˱"¬ «Æ°V¬»‰õcϱwEÀ 6wB aAHXLXNØH¨ $4Ú 7 „QÂ'"“¨K´&ºùÄb21‡XH,#Ö/{ˆCÄ7$‰C2'¹I±¤TÒÒFÒnR#é,©›4H#“ÉÚdk²9”, +È…ääÃä3ää!ò[ b@q¤øSâ(RÊjJåå4åe˜2AU£šRݨ¡T5ZB­¡¶R¯Q‡¨4uš9̓IK¥­¢•Óhh÷i¯ètºÝ•N—ÐWÒËéGè—èôw †ƒÇˆg(›gw¯˜L¦Ó‹ÇT071ë˜ç™™oUX*¶*|‘Ê •J•&•*/T©ª¦ªÞª UóUËT©^S}®FU3Sã© Ô–«UªPëSSg©;¨‡ªg¨oT?¤~Yý‰YÃLÃOC¤Q ±_ã¼Æ c³x,!k «†u5Ä&±ÍÙ|v*»˜ý»‹=ª©¡9C3J3W³Ró”f?ã˜qøœtN ç(§—ó~ŠÞï)â)¦4L¹1e\kª–—–X«H«Q«Gë½6®í§¦½E»YûAÇJ'\'GgÎçSÙSݧ §M=:õ®.ªk¥¡»Dw¿n§î˜ž¾^€žLo§Þy½çú}/ýTýmú§õG X³ $Û Î<Å5qo</ÇÛñQC]Ã@C¥a•a—á„‘¹Ñ<£ÕFFŒiÆ\ã$ãmÆmÆ£&&!&KMêMîšRM¹¦)¦;L;LÇÍÌÍ¢ÍÖ™5›=1×2ç›ç›×›ß·`ZxZ,¶¨¶¸eI²äZ¦Yî¶¼n…Z9Y¥XUZ]³F­­%Ö»­»§§¹N“N«žÖgðñ¶É¶©·°åØÛ®¶m¶}agbg·Å®Ã“}º}ý= ‡Ù«Z~s´r:V:ޚΜî?}Åô–é/gXÏÏØ3ã¶Ë)ÄiS›ÓGgg¹sƒóˆ‹‰K‚Ë.—>.›ÆÝȽäJtõq]ázÒõ›³›Âí¨Û¯î6îiî‡ÜŸÌ4Ÿ)žY3sÐÃÈCàQåÑ? Ÿ•0k߬~OCOgµç#/c/‘W­×°·¥wª÷aï>ö>rŸã>ã<7Þ2ÞY_Ì7À·È·ËOÃož_…ßC#ÿdÿzÿѧ€%g‰A[ûøz|!¿Ž?:Ûeö²ÙíAŒ ¹AA‚­‚åÁ­!hÈì­!÷ç˜Î‘Îi…P~èÖÐaæa‹Ã~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DÞ›g1O9¯-J5*>ª.j<Ú7º4º?Æ.fYÌÕXXIlK9.*®6nl¾ßüíó‡ââ ã{˜/È]py¡ÎÂô…§©.,:–@LˆN8”ðA*¨Œ%òw%Ž yÂÂg"/Ñ6шØC\*NòH*Mz’쑼5y$Å3¥,幄'©¼L LÝ›:žšv m2=:½1ƒ’‘qBª!M“¶gêgæfvˬe…²þÅn‹·/•Ék³¬Y- ¶B¦èTZ(×*²geWf¿Í‰Ê9–«ž+Íí̳ÊÛ7œïŸÿíÂá’¶¥†KW-X潬j9²‰Š®Û—Ø(Üxå‡oÊ¿™Ü”´©«Ä¹dÏfÒféæÞ-ž[–ª—æ—n ÙÚ´ ßV´íõöEÛ/—Í(Û»ƒ¶C¹£¿<¸¼e§ÉÎÍ;?T¤TôTúT6îÒݵa×ønÑî{¼ö4ìÕÛ[¼÷ý>ɾÛUUMÕfÕeûIû³÷?®‰ªéø–ûm]­NmqíÇÒý#¶×¹ÔÕÒ=TRÖ+ëGǾþïw- 6 UœÆâ#pDyäé÷ ß÷ :ÚvŒ{¬áÓvg/jBšòšF›Sšû[b[ºOÌ>ÑÖêÞzüGÛœ499â?rýéü§CÏdÏ&žþ¢þË®/~øÕë×Îјѡ—ò—“¿m|¥ýêÀë¯ÛÆÂƾÉx31^ôVûíÁwÜwï£ßOä| (ÿhù±õSЧû“““ÿ˜óüc3-Û cHRMz%€ƒùÿ€éu0ê`:˜o’_ÅF sIDATxÚì[S[Yz@—Î‘Ž ÝÅ͹cÀ6Оx:éq'5=ó0•ªIR•ÿ’?‘ÇÉK.oIeÒI{<žL÷´Ý¶§;vchcƒ X0dÝ¥<€©Æ@Bñ­ªSedtöYµ/ßþöÞÞOðKà ḩ$°Ì7€Ûù÷¡ð¿Ò@^.¹v\øÕŽû2¥Àäzϵ¸ãÈ.†7ä¹X¤ö!\îüP /ph‘òÁ0¬ª;/ü#ðc)áÔïT:¿6À#À(å"@8§'òE`þ^~"e!ÉUh—rФ×$³P9Û"A( EŠ@HHD AD AHHAJŒ¤²–UUq¸\457ãnðb³Ù¨­«Ãd2íæÍäóy’‰±­/×"¬,…X …ˆÇ㺻_É*šYÃßÙIGg‡Ë…jTQEQ0 oý~>Ÿß¾r9²¹‰xœàâ"Oϰº¼,¦ç\o®nêmõhfó;…9 ™L†D_EÔBU-¢(¨ªŠj4b|Ç¥ªê{§^÷}ššpº\wo¾¶Ö²Æ KÕN¦ÖY,x¼¸Ünlv;u+F£º³ÈçI&’Äb[lD£¬…#DÂaRÉäž÷°94Ÿ=S‘÷çmlÄíñžxl¨ª2™L´¶ûiõûñ66bÒ´ÝæÍZ&Ÿßås9rù<¯b1–—–x:;Ërp‰|>Íf£±©©bï×íõ¢i©TJ:ª8în:»ÎQo·c2™ìì ¥(¨€ÝáÀjµÒê÷³²¼Ì£©ïqyܘ4­bïÛévaw:Otö^÷ùÚÚèÂátRS[s´—шj4r¶µ·Çs¢1ŸÃ`³Û©·ÙD b‡×ƒ#ÃtvuQo³•¼óm±Z+¾ Ìf3ëÉnë­Kjkk½D{ €VÁMÌñ”ETPÕÕqalŒs=Ý O¶™ÕU¨¦¦†á!‘çÚø$›[ø½ôy=Ý ŽŒTÌ¿Ÿx<ÎÝ›·Ž4:+™@u mí4·œÁf·£™5Œ&F£qOà/ŸÏ“ÍfI§Ó¤S)b[[,½²ðü9/#‘7rVÔ „j뺺ØÚÜd껉“ȤitõöÐê÷cw8\#n0vSJkkk±Ùí¸=^Zým_¼àÉã¢/_îHiÅh2ÉÓ.&M#ÐÝÍêò +¡Ðñ ÔØÜLÏ@?gΞE;BM¡™5< ¸<›š˜™žföÑcT£Zñ99zÇîpÐ78ÀêòrQMYQ ÚúÏ–4>£(Êî¨KÓÌ2mqLý¡Æ–δúX|>_¸ ‰V…@wC—.•¤ÿ>²Ù,Ùlö­>”Pzr¹Á…En|þyÁµPÁO¦=ÐÉÈèhYåyÝÉÓv’â…ò×Bn¯WÛ‚žNSËöúpZWF“ “Õ‡Èl6sal¬¤ap¡‚2iji.xÐr( ÃÃ2'UÅ êm¶‚·9”@«•ö@'&‰ÉT5ªªb/pêèPuõö`–\œê¯…¥ô5fÖðùýRûœ’fÌZ`‚þ546a±X¥tO‰@šY+­@ÍͨªÄbN …îp nƒóN …®à8Ð «­¾è­ûý‘-0_ú@ÌG8ûAÐù|žD"QZ¤ù:]Í×ÖÆfi’}ìOW ´¾“ÌW2rùœ”ì)!J•^ T2Y–%±Bå5_ëk/ÙÚ,q¶µ¹)2é / þ»Z‹Dʺ»ƒP$qæçž•^ åà’Tåd³Y–—B7_‡hey™ø«WRÊULüÕ+?|XÔß(P2‘`ñù|Iwt*«ó\X,ú »CE §§¦H¡ôÁúÚ÷îÝM9”@›<™•Z¨Êx‹ñàþwEõ} àáää[k×Û3¦§¾gþÙ³#½Rˆ­÷¿ùöH¶ •3êzø`’Ç¿/xö½h^,,0qô‡ô\ó<|0ÉÔÄDIžcÁ{$®…#ä²Ynש?f@oͶ˜žœdò»ïH&’%yÏ¢wi=×ÓÃÀÐù‚—ÇO>Ÿg-azr’™éG%}ï#móÛt¦…Ááa<^¯,û©Pqb[[„‚A¦¾›àåÚZÉ?ãÈûD›L&ºûûéì:‡ÅbÁ¤i’ÁxÂÒdÒi’É$áÕUžYq”@w÷ý¿D<Λ·˜›Õ_óNœÓ™tš…gÏ ..ât9÷=UÐh2aw8xúxFwÉ{RG! º»¹0öîí7¢Q~óŸ¿&ë¯É–Ç{<Ãí™ééwÆc¶67¹ö_ŸêRèéé·wïH,ãÚ§Ÿ‹Åô;hG[~ζ¶2~åÊç¿ýô3676ô=ê”Ç[^œ.~|uÏH,•Lrí³Ïˆ®¯ë?l!¸|ÔÔÖòñ϶'í%•Jqý¿S5Ù"P™0\ýä§{vôÏd2ÜøŸÏY]Y©šûÊÄ•>ÂÛаûs.—ã÷×®±¼´TU÷)•‹ããø;;ö¼6?7GèE°êîU‰%¦³«‹ÿä£wþßF4Ê7·ï0?7' oc³ÛùÅßþÍçM„‚AîÞúšµcÈ×)72VB’É$‹óóØŽ}¥±Ö×ÓÕÛK½ÍF$&JI $쥵½‹ãcžº˜Íd˜š˜àÁ½û¤ÓiHøÁEQèêíexô5,:ˆ¿zÅÿÝý³éjC/èÐ̃Ã#ô  ÷?¦v-æî­¯ ƒ"°‹ÕÊÅÆéüÝù¹9¾þãW¿7“t¢‘t*Åó§s,ÎÏc³Û÷íhçòyNN‘¯ð3©N¸£}éƒñ·ÎèÊd2|úïÿA´À-wO¤Ÿ'ñ䘟›ã‹ë¿{+õÎW7u!tÂÔÔÖðõ—{Ž6:;ËÌô´~FšòO†íÙúO¨·Ùv_ÛÜØàë/ÿ¨¯P…<Êèx üùÇWßš­ÿâúït•N€ñ+Wðùý{^ûööÂEî”*"††èéïÛóZpq‘©‰ ]ÞtŒøü~.~0þÖ랆|mm"°?§ãë¿4Mãê'?edô’î¶Á‘@â1£ª*þÎzðü ýšÅùy¾¼qƒT2% ûãml¤w`gÇžXÐF4Êÿþöº.Vnˆ@@m]ÝîÊÕ×kç3™ 7ÿðEÅïØ!Udó6ˆ§Á ÀÔÄßÞ¾S±»vˆ@:hÞVB!þpýzEnð.é¤y;ãkåöW_®°E‰"Žš7Ÿ¿èz´¢:×"p$$(ˆ@ÂÉ ””bŠ$§KRB‘Dà™”ƒP$ß+À籠"¹a:€G€QÊC(€ ЭO‘ò ä_§¯³—€û@³”‹p–€a`åuhøk &e#@lÇ•ØH¼\BRFÂ>5ÏÕWÞ‹ø' Íö<™\revœð¾)Ë~ÜmÀ/Ÿý;ý$9øôtßi¢¦wÂ<ÿ ¼sgÐÿµûèÿÅÄŠÐIEND®B`‚lft-3.8/icons/144x144/client.png000644 000766 000000 00000010500 12062431750 016115 0ustar00vicwheel000000 000000 ‰PNG  IHDRçF⸠pHYs.#.#x¥?v OiCCPPhotoshop ICC profilexÚSgTSé=÷ÞôBKˆ€”KoR RB‹€‘&*! Jˆ!¡ÙQÁEEÈ ˆŽŽ€ŒQ, Š Øä!¢Žƒ£ˆŠÊûá{£kÖ¼÷æÍþµ×>ç¬ó³ÏÀ –H3Q5€ ©BàƒÇÄÆáä.@ $p³d!sý#ø~<<+"À¾xÓ ÀM›À0‡ÿêB™\€„Àt‘8K€@zŽB¦@F€˜&S `ËcbãP-`'æÓ€ø™{[”! ‘ eˆDh;¬ÏVŠEX0fKÄ9Ø-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+®ç*x™²<¹$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóýxήÎÎ6޶_-ê¿ÿ"bbãþåÏ«p@át~Ñþ,/³€;€mþ¢%îh^  u÷‹f²@µ éÚWópø~<ß5°j>{‘-¨]cöK'XtÀâ÷ò»oÁÔ(€hƒáÏwÿï?ýG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)¬‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(¼ AÈa!ÚˆbŠX#Ž™…ø!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fº‘;È2‚ü†¼G1”²Q=Ô µC¹¨7„F¢ Ðdt1š ›Ðr´=Œ6¡çЫhÚ>CÇ0Àè3Äl0.ÆÃB±8, “c˱"¬ «Æ°V¬»‰õcϱwEÀ 6wB aAHXLXNØH¨ $4Ú 7 „QÂ'"“¨K´&ºùÄb21‡XH,#Ö/{ˆCÄ7$‰C2'¹I±¤TÒÒFÒnR#é,©›4H#“ÉÚdk²9”, +È…ääÃä3ää!ò[ b@q¤øSâ(RÊjJåå4åe˜2AU£šRݨ¡T5ZB­¡¶R¯Q‡¨4uš9̓IK¥­¢•Óhh÷i¯ètºÝ•N—ÐWÒËéGè—èôw †ƒÇˆg(›gw¯˜L¦Ó‹ÇT071ë˜ç™™oUX*¶*|‘Ê •J•&•*/T©ª¦ªÞª UóUËT©^S}®FU3Sã© Ô–«UªPëSSg©;¨‡ªg¨oT?¤~Yý‰YÃLÃOC¤Q ±_ã¼Æ c³x,!k «†u5Ä&±ÍÙ|v*»˜ý»‹=ª©¡9C3J3W³Ró”f?ã˜qøœtN ç(§—ó~ŠÞï)â)¦4L¹1e\kª–—–X«H«Q«Gë½6®í§¦½E»YûAÇJ'\'GgÎçSÙSݧ §M=:õ®.ªk¥¡»Dw¿n§î˜ž¾^€žLo§Þy½çú}/ýTýmú§õG X³ $Û Î<Å5qo</ÇÛñQC]Ã@C¥a•a—á„‘¹Ñ<£ÕFFŒiÆ\ã$ãmÆmÆ£&&!&KMêMîšRM¹¦)¦;L;LÇÍÌÍ¢ÍÖ™5›=1×2ç›ç›×›ß·`ZxZ,¶¨¶¸eI²äZ¦Yî¶¼n…Z9Y¥XUZ]³F­­%Ö»­»§§¹N“N«žÖgðñ¶É¶©·°åØÛ®¶m¶}agbg·Å®Ã“}º}ý= ‡Ù«Z~s´r:V:ޚΜî?}Åô–é/gXÏÏØ3ã¶Ë)ÄiS›ÓGgg¹sƒóˆ‹‰K‚Ë.—>.›ÆÝȽäJtõq]ázÒõ›³›Âí¨Û¯î6îiî‡ÜŸÌ4Ÿ)žY3sÐÃÈCàQåÑ? Ÿ•0k߬~OCOgµç#/c/‘W­×°·¥wª÷aï>ö>rŸã>ã<7Þ2ÞY_Ì7À·È·ËOÃož_…ßC#ÿdÿzÿѧ€%g‰A[ûøz|!¿Ž?:Ûeö²ÙíAŒ ¹AA‚­‚åÁ­!hÈì­!÷ç˜Î‘Îi…P~èÖÐaæa‹Ã~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DÞ›g1O9¯-J5*>ª.j<Ú7º4º?Æ.fYÌÕXXIlK9.*®6nl¾ßüíó‡ââ ã{˜/È]py¡ÎÂô…§©.,:–@LˆN8”ðA*¨Œ%òw%Ž yÂÂg"/Ñ6шØC\*NòH*Mz’쑼5y$Å3¥,幄'©¼L LÝ›:žšv m2=:½1ƒ’‘qBª!M“¶gêgæfvˬe…²þÅn‹·/•Ék³¬Y- ¶B¦èTZ(×*²geWf¿Í‰Ê9–«ž+Íí̳ÊÛ7œïŸÿíÂá’¶¥†KW-X潬j9²‰Š®Û—Ø(Üxå‡oÊ¿™Ü”´©«Ä¹dÏfÒféæÞ-ž[–ª—æ—n ÙÚ´ ßV´íõöEÛ/—Í(Û»ƒ¶C¹£¿<¸¼e§ÉÎÍ;?T¤TôTúT6îÒݵa×ønÑî{¼ö4ìÕÛ[¼÷ý>ɾÛUUMÕfÕeûIû³÷?®‰ªéø–ûm]­NmqíÇÒý#¶×¹ÔÕÒ=TRÖ+ëGǾþïw- 6 UœÆâ#pDyäé÷ ß÷ :ÚvŒ{¬áÓvg/jBšòšF›Sšû[b[ºOÌ>ÑÖêÞzüGÛœ499â?rýéü§CÏdÏ&žþ¢þË®/~øÕë×Îјѡ—ò—“¿m|¥ýêÀë¯ÛÆÂƾÉx31^ôVûíÁwÜwï£ßOä| (ÿhù±õSЧû“““ÿ˜óüc3-Û cHRMz%€ƒùÿ€éu0ê`:˜o’_ÅFkIDATxÚìÍkSY‡I´Æ´~õË 2ã0âÄUW¥af£ƒ®æO7~¬ô/p!Â,„ùX\;Ä…Êt£¥ÔIm­¶1I“Yô¶sïÉGoÓÄœ4ÏrKIé{Ÿó¾çœ{ï¹U椤K’~ô¥¤Iûí@VRRÒ+I$ýå|öE¤{’r’Š4šãÂ=ǪŒHú—€Ñ*´9Ç‘-†<$EÈàP…´¤qIÏÜõHJH:N|ÀIIßIZìp~ð«¤ï‰ ø$ê$x@Ò)IÓ’BÄv@^ÒWAI?#Ô@HÒ/AIcÄjd<(é â5òM@ÒšXa†Ú(´±@PABMŠÕ•ååeuwwYˈÇãºpá(a@ ó9Ç+ôâÅ ¢Ü:;;uúôéÖheeE±XŒ³Ùb±˜&'')aÀ`OaňƒƒƒºvígÃÙlV7nÜ@ 7CCCºrå vøäÖ­[Êf³”°MŽ;†-/+êëëÊpü¸=ï…lèÎ;ŠÇã˜âpóæMY™¬¨§ÇûÌþ“'O4119çÏŸ÷dSƶ¢„ xŽ_¿~5Uâ@Û ggg±ÆÅÜÜ\ÕŒÝöõ÷÷{ŽS©Ö¸XZZªš±Û^ ÞÞÞ­ÏétZŸ>}Âoß¾e_‰ƒjÿþýƒ¥ˆæâÈ‘#Uƒ¥êèÑ£´É¡C‡ª ¤ÕÕUår¹Š1C ÚQêêêR @ I:|ø°çxyy[Ê`ÆÅŒÈáýû÷ØR3.¶”1ë2ùË@„@»Ê@”0J%¬˜;y ‘>ƒ@Ñh$éÀLã}°²²‚@~J§ÓØâ#E"’6.¦ºÉd2ØR3.fÇcí°ººŠ->êêêB I%×tÌZvO.¬{´y}}[|྇ª­²e6@-*PGG6ø`mm­Ÿq¬ˆYWkÓtòù P ³0[V¦›.yéÊc.¸š™›æÀ»ÆÊcÆ…V!#?(aæzùèÝ»w„@µ ÄBb…ž„@Djæ:%¬B lÚº„ Ô‚ÈÜp 6po*•Ïç™Æ#B¡g!Ñ–òee ³eÓ›°y¥¦ dîHF*ÅŒ‰MÛ 7] \.ç‘¶haaÜ,..V¬÷P*Л7o¨Z@lz‘ ˜;Ó»;!ж zŽ“É$UëQ'NœÀš*ʦ dÅûÂÌuýúu]¼xsFFF¬D[!Ù£†‡‡5<<Œ9>K~Û—0›zT+À Ú`~~+|²¾¾ÎÈ$‘HèìÙ³ØáS ›°B L&£D"-»s ì™i|ww·ŠÅ"Q&  ìù1Й3g ‰D‡‡õðáCõõõmýŽ-ï<ß+ŒŽŽêñãÇ[ÇOŸ>ÕåË—U,•Éd”Íf¶!UÝš-ù™­»¬ïU–––499I Æ@€@ MLLxŽÍíY¢ÑhÉS÷ïß'òu¤¿¿ßs|îÜ9MOO{ÞrX(J¶TÝõßHÚÕR1+Í­K=fÔ0@ há1›T*¥«W¯UK¹}û¶g§³zQÜMs333SÜí÷Ñ×fff<ç«ßI Æ@€@€@€@-Cˆ4F]T~þü¹îÞ½ûÙþ›ÔŃXHÆ@ÀÉ^x:… €@€@€@€@¥®6çr9MMMUKR8þÿä×áR ÏÆ·söàÙx` í=2À®Ê¨‘BPR’8@¤‚’fˆÔÈTPÒßÄjäQ@Ò)IÓâ{ØyI_%½”ôñ€ò§¤—›kÙ½’’ˆ ø ))&iashAÒO’ÒĶ!í¸² yŸI—4OŒ Jæw\©H¤ß$åÄ´–wœè1e©v=ÿ¤¤K’~”ô­3NâMqíAÑ)Qÿ8Ë<¿KzUîÿ2Ä ¡` IEND®B`‚lft-3.8/icons/72x72/blank.png000644 000766 000000 00000012150 12050507714 015572 0ustar00vicwheel000000 000000 ‰PNG  IHDRHHUí³G pHYs.#.#x¥?v OiCCPPhotoshop ICC profilexÚSgTSé=÷ÞôBKˆ€”KoR RB‹€‘&*! Jˆ!¡ÙQÁEEÈ ˆŽŽ€ŒQ, Š Øä!¢Žƒ£ˆŠÊûá{£kÖ¼÷æÍþµ×>ç¬ó³ÏÀ –H3Q5€ ©BàƒÇÄÆáä.@ $p³d!sý#ø~<<+"À¾xÓ ÀM›À0‡ÿêB™\€„Àt‘8K€@zŽB¦@F€˜&S `ËcbãP-`'æÓ€ø™{[”! ‘ eˆDh;¬ÏVŠEX0fKÄ9Ø-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+®ç*x™²<¹$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóýxήÎÎ6޶_-ê¿ÿ"bbãþåÏ«p@át~Ñþ,/³€;€mþ¢%îh^  u÷‹f²@µ éÚWópø~<ß5°j>{‘-¨]cöK'XtÀâ÷ò»oÁÔ(€hƒáÏwÿï?ýG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)¬‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(¼ AÈa!ÚˆbŠX#Ž™…ø!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fº‘;È2‚ü†¼G1”²Q=Ô µC¹¨7„F¢ Ðdt1š ›Ðr´=Œ6¡çЫhÚ>CÇ0Àè3Äl0.ÆÃB±8, “c˱"¬ «Æ°V¬»‰õcϱwEÀ 6wB aAHXLXNØH¨ $4Ú 7 „QÂ'"“¨K´&ºùÄb21‡XH,#Ö/{ˆCÄ7$‰C2'¹I±¤TÒÒFÒnR#é,©›4H#“ÉÚdk²9”, +È…ääÃä3ää!ò[ b@q¤øSâ(RÊjJåå4åe˜2AU£šRݨ¡T5ZB­¡¶R¯Q‡¨4uš9̓IK¥­¢•Óhh÷i¯ètºÝ•N—ÐWÒËéGè—èôw †ƒÇˆg(›gw¯˜L¦Ó‹ÇT071ë˜ç™™oUX*¶*|‘Ê •J•&•*/T©ª¦ªÞª UóUËT©^S}®FU3Sã© Ô–«UªPëSSg©;¨‡ªg¨oT?¤~Yý‰YÃLÃOC¤Q ±_ã¼Æ c³x,!k «†u5Ä&±ÍÙ|v*»˜ý»‹=ª©¡9C3J3W³Ró”f?ã˜qøœtN ç(§—ó~ŠÞï)â)¦4L¹1e\kª–—–X«H«Q«Gë½6®í§¦½E»YûAÇJ'\'GgÎçSÙSݧ §M=:õ®.ªk¥¡»Dw¿n§î˜ž¾^€žLo§Þy½çú}/ýTýmú§õG X³ $Û Î<Å5qo</ÇÛñQC]Ã@C¥a•a—á„‘¹Ñ<£ÕFFŒiÆ\ã$ãmÆmÆ£&&!&KMêMîšRM¹¦)¦;L;LÇÍÌÍ¢ÍÖ™5›=1×2ç›ç›×›ß·`ZxZ,¶¨¶¸eI²äZ¦Yî¶¼n…Z9Y¥XUZ]³F­­%Ö»­»§§¹N“N«žÖgðñ¶É¶©·°åØÛ®¶m¶}agbg·Å®Ã“}º}ý= ‡Ù«Z~s´r:V:ޚΜî?}Åô–é/gXÏÏØ3ã¶Ë)ÄiS›ÓGgg¹sƒóˆ‹‰K‚Ë.—>.›ÆÝȽäJtõq]ázÒõ›³›Âí¨Û¯î6îiî‡ÜŸÌ4Ÿ)žY3sÐÃÈCàQåÑ? Ÿ•0k߬~OCOgµç#/c/‘W­×°·¥wª÷aï>ö>rŸã>ã<7Þ2ÞY_Ì7À·È·ËOÃož_…ßC#ÿdÿzÿѧ€%g‰A[ûøz|!¿Ž?:Ûeö²ÙíAŒ ¹AA‚­‚åÁ­!hÈì­!÷ç˜Î‘Îi…P~èÖÐaæa‹Ã~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DÞ›g1O9¯-J5*>ª.j<Ú7º4º?Æ.fYÌÕXXIlK9.*®6nl¾ßüíó‡ââ ã{˜/È]py¡ÎÂô…§©.,:–@LˆN8”ðA*¨Œ%òw%Ž yÂÂg"/Ñ6шØC\*NòH*Mz’쑼5y$Å3¥,幄'©¼L LÝ›:žšv m2=:½1ƒ’‘qBª!M“¶gêgæfvˬe…²þÅn‹·/•Ék³¬Y- ¶B¦èTZ(×*²geWf¿Í‰Ê9–«ž+Íí̳ÊÛ7œïŸÿíÂá’¶¥†KW-X潬j9²‰Š®Û—Ø(Üxå‡oÊ¿™Ü”´©«Ä¹dÏfÒféæÞ-ž[–ª—æ—n ÙÚ´ ßV´íõöEÛ/—Í(Û»ƒ¶C¹£¿<¸¼e§ÉÎÍ;?T¤TôTúT6îÒݵa×ønÑî{¼ö4ìÕÛ[¼÷ý>ɾÛUUMÕfÕeûIû³÷?®‰ªéø–ûm]­NmqíÇÒý#¶×¹ÔÕÒ=TRÖ+ëGǾþïw- 6 UœÆâ#pDyäé÷ ß÷ :ÚvŒ{¬áÓvg/jBšòšF›Sšû[b[ºOÌ>ÑÖêÞzüGÛœ499â?rýéü§CÏdÏ&žþ¢þË®/~øÕë×Îјѡ—ò—“¿m|¥ýêÀë¯ÛÆÂƾÉx31^ôVûíÁwÜwï£ßOä| (ÿhù±õSЧû“““ÿ˜óüc3-Û cHRMz%€ƒùÿ€éu0ê`:˜o’_ÅF “IDATxÚäœM‹%WÇÏ9u»g&Î$&™„ˆDÑ…Hv"’½àBð3"d)*Š ¢((º£~ED! (¸ˆÌpA!æÅ™é¾·nçÅÅ9U·n÷51(S·šCÝU·ëüïóÿ?o§J""+ภ\iÇ'@b™[´á€Û6ú¶×6è8×€ëÀƒíذvì³^@Ú@iÆ1Çïþt+F€ÞÛŽÍ#>V,><ˆì.X˜ àAXÀß:‘º$¿‘SÀ¾þýŸÄW¿÷c$"n6z=´ôó½ú§#"!4`Y˜µÙxT¤Â½QbGÜûy“ÙAÌÔÈU#çľò­§_øåooåÇo>еÓߺۗ§ïô§]‡yàáH0Aµ„dF…¶Û³ó5=ú0?vó3”ò p¥ÿ>¨æ³Í–²RÌAÝqj†±<ý‘R¨;›õ†óõáîùú&9_N»æÊË`¾=Û íP7Ô*@ѧlq?ÈHA ªl6=ëõ†$™íP9=¬F ò¢æwÖ[®žj s'fD…‘ŒÞY¢ÔoÙlzDCQ!¥ BÕülÓã¾¢ØhANL®l<Üÿ$s¤P-ô›-›~@RFÕ‘ È(ÒsÎûŠV+)6‹ ªAÍ‚Š†~`Ó¤”Q÷Q¢v©ë~ ”¢¨æÍÆÒ$ºÚPÇ¢Ê0 l†”3jRÓÐ@f¬·]ÕÅ–çÀöQŠ@ÕØÊvPº\0·Y8(èã´S3T›H³ô-Т ÅŠ’³b¶Ó§ sg[ ƒf5ŠZé¤ÿfSµJ3srQÜv¹ù  `[”A¡ei–¿©¥Ô‘“cá—-(ÂÔ)fÍÍ涘ØçÞ¦†ºSÜéLk!—,¨"©ê¨Å 3ã65¯±9ª¾g@N± ÎtÁ‘PÌ,P‹šA䌇OÂ;45½êE‹(@¸×ã¹cšiP`X8æ•“AøXPT­tSöp PÌ«ŠÇqsçkXä½üŒb7Ç ¼YÓâŠê Ìhu°*Ar˜bM°Žˆbn7Íír€£‹c¹Õ¢ ×âUÚ©àD´:µ´$ý"Å<ñZ}ŽÀ[$½x€ -Ü>Ûp¾ÙBºÍ¯‡Âw{n\»FHIx¾P€D IBú2pvwÃ;çDs÷—4È=¸³Þò÷;k È"ä$H"ÚE ØRbjkõ¥°Þ¬7†MîäzÂ8¨ZnÆù¶PÌH"œ®:®¬:V9!RÁЏêÓ" "Ó½og[”~P¶j5æq'µt˽¶».iØT+µõE9ﺜ9é2§]Ýw9‘SkÚǬâ±×5øßºëú¿Çz|jÇ5#05¶Z÷jÞ(Vó‹¨^[ö „ÝLÌ[³Ð‰Åö!æÆy¯œ9 «œ9YeV9³j`¥ú[›ˆ½öлmm²kiM H’ÖëáJ±Z™K7æµH˜Æ{&6¸;ã!{­‰Å<°– ŽhšÏ¨$2UÅ”ómAšNu9Ñ¥jY]rJäöí¤òHãwÒW›1Ælµ§9¦FÞ’MŸzzÖR†zMT„]t¯ÕWã ©8cB·—“´8¨öºô-¶ž’E2}C"RE> Y)5Ái‡DÚYÂZ޹P]P£ùñæ­MÄÂ[îÓƒ‘6cQ^¦,a÷ `§W+ŠÖ.wÐjÐn¸×äÍßF.–¤ÞAxL˶(miIÌÄ’]ãîÒêš )@ƒiZe2:‡€‰^£· XÌ5ñ?‘¯Öf÷FÃ{P Ü70£ÒÍÞ\LÆ kq¸læ÷¾pC™_z‰®ïìf£ÍÛ½ʳrÐ~6ï5Õˆ&xÿWwÿʹߎçìÄ$Ò—4¨¦ûFàfvåŽj-µg\ð³_“n ª{«®qÁ”£Æ8X÷ «Efµ6´|€„ШóÒ¡’+±Sóh®>üH,Ȫ‹¿¼Ìg¯/æ86 –‡!G AÞ¢pC¢=r¨«a6Vöw¥×8†’b4ii+ÂZP ¬­ÞÿY>@m¦óµPj´ªÔ²@Õ͇sýHzfÛOÞ¿=&ª‡’ÕhjŽùŽ“v$ÔæJKXãP HáÚh5Ç@±:WÚ¸G6;±ò8:€öèu0’öhùTêð#¢#Å,ê`r Y%ô‚³£ñbãƒÆƒ4¢¸7ŽcõÂèÆ›“ŠÃqÐt‚ÙnÅðqÎrÀ‚Æ€)æã(Ö˜íh6>¢{)›w/àÚ†ÍÐ\:ÅÊlÎ~ ª¡™þè4×];Ü8¬n6«™[ÑQdZ)æmPƒÜÀ´ ´Hr2ÖIKT Ja¤P’)ÉD¤'½UÜ9\“öj5^öÅzЂž»¤AVç+®í9P;AÜêÞ G±’¼‰sŒó–L¤t;»pð±’ ¤°±ˆ3îs³™ýºµÜ%L‰, ²ŒTgjèЬ¨Tò ÉêRœ¿ø¶VIW" õ…8§ Œñ±pÜÔéרÐãeK¨‚ûž`Mñû ¿À„p’¡†è©Ë!d RG[ˆ±ê²rû-ú‡ ¨mYÚ¼O½°~òæ1Ʀ`[įt y¤ØðÚ«¯¾*g·)ë‡ bZô´ð:G-?{µàÄÎAN€¡{ñ¥—‡ïþàgüá/ýæÆÿ0J¿“YÊ+_î…OLUŒ0o^Û‰ÕÕ—¿ ¬…'?!¼þVÇž,ïÑ7¿Ù¿þEK«Z¶>†5¢6GÕT¶”Oü¢ÜxßÄŠé89ÉùÃ8àú&?úíSÕëÝùëŸ/Ÿ^J±`Œ¢:¢¼òrýñ_•ëOü\Ü:àM —üÔ3p q#$Ÿ"ÙºígÒpöI"Žú¢·¥qìÂ|äÌN¯ßò+7^× ì.ÈkÀ’Ÿz&QßBu•ú’·#u)gàTvo¨Z*@Ñò±,®ÜnÖs¸;ŠãÛàPq½&®WÜ~gËõõ8Pš7_çmßåŸ[}àà6Þ_IEND®B`‚lft-3.8/icons/72x72/router_cloaked.png000644 000766 000000 00000023346 12050507714 017516 0ustar00vicwheel000000 000000 ‰PNG  IHDRHHUí³G pHYs.#.#x¥?v OiCCPPhotoshop ICC profilexÚSgTSé=÷ÞôBKˆ€”KoR RB‹€‘&*! Jˆ!¡ÙQÁEEÈ ˆŽŽ€ŒQ, Š Øä!¢Žƒ£ˆŠÊûá{£kÖ¼÷æÍþµ×>ç¬ó³ÏÀ –H3Q5€ ©BàƒÇÄÆáä.@ $p³d!sý#ø~<<+"À¾xÓ ÀM›À0‡ÿêB™\€„Àt‘8K€@zŽB¦@F€˜&S `ËcbãP-`'æÓ€ø™{[”! ‘ eˆDh;¬ÏVŠEX0fKÄ9Ø-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+®ç*x™²<¹$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóýxήÎÎ6޶_-ê¿ÿ"bbãþåÏ«p@át~Ñþ,/³€;€mþ¢%îh^  u÷‹f²@µ éÚWópø~<ß5°j>{‘-¨]cöK'XtÀâ÷ò»oÁÔ(€hƒáÏwÿï?ýG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)¬‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(¼ AÈa!ÚˆbŠX#Ž™…ø!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fº‘;È2‚ü†¼G1”²Q=Ô µC¹¨7„F¢ Ðdt1š ›Ðr´=Œ6¡çЫhÚ>CÇ0Àè3Äl0.ÆÃB±8, “c˱"¬ «Æ°V¬»‰õcϱwEÀ 6wB aAHXLXNØH¨ $4Ú 7 „QÂ'"“¨K´&ºùÄb21‡XH,#Ö/{ˆCÄ7$‰C2'¹I±¤TÒÒFÒnR#é,©›4H#“ÉÚdk²9”, +È…ääÃä3ää!ò[ b@q¤øSâ(RÊjJåå4åe˜2AU£šRݨ¡T5ZB­¡¶R¯Q‡¨4uš9̓IK¥­¢•Óhh÷i¯ètºÝ•N—ÐWÒËéGè—èôw †ƒÇˆg(›gw¯˜L¦Ó‹ÇT071ë˜ç™™oUX*¶*|‘Ê •J•&•*/T©ª¦ªÞª UóUËT©^S}®FU3Sã© Ô–«UªPëSSg©;¨‡ªg¨oT?¤~Yý‰YÃLÃOC¤Q ±_ã¼Æ c³x,!k «†u5Ä&±ÍÙ|v*»˜ý»‹=ª©¡9C3J3W³Ró”f?ã˜qøœtN ç(§—ó~ŠÞï)â)¦4L¹1e\kª–—–X«H«Q«Gë½6®í§¦½E»YûAÇJ'\'GgÎçSÙSݧ §M=:õ®.ªk¥¡»Dw¿n§î˜ž¾^€žLo§Þy½çú}/ýTýmú§õG X³ $Û Î<Å5qo</ÇÛñQC]Ã@C¥a•a—á„‘¹Ñ<£ÕFFŒiÆ\ã$ãmÆmÆ£&&!&KMêMîšRM¹¦)¦;L;LÇÍÌÍ¢ÍÖ™5›=1×2ç›ç›×›ß·`ZxZ,¶¨¶¸eI²äZ¦Yî¶¼n…Z9Y¥XUZ]³F­­%Ö»­»§§¹N“N«žÖgðñ¶É¶©·°åØÛ®¶m¶}agbg·Å®Ã“}º}ý= ‡Ù«Z~s´r:V:ޚΜî?}Åô–é/gXÏÏØ3ã¶Ë)ÄiS›ÓGgg¹sƒóˆ‹‰K‚Ë.—>.›ÆÝȽäJtõq]ázÒõ›³›Âí¨Û¯î6îiî‡ÜŸÌ4Ÿ)žY3sÐÃÈCàQåÑ? Ÿ•0k߬~OCOgµç#/c/‘W­×°·¥wª÷aï>ö>rŸã>ã<7Þ2ÞY_Ì7À·È·ËOÃož_…ßC#ÿdÿzÿѧ€%g‰A[ûøz|!¿Ž?:Ûeö²ÙíAŒ ¹AA‚­‚åÁ­!hÈì­!÷ç˜Î‘Îi…P~èÖÐaæa‹Ã~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DÞ›g1O9¯-J5*>ª.j<Ú7º4º?Æ.fYÌÕXXIlK9.*®6nl¾ßüíó‡ââ ã{˜/È]py¡ÎÂô…§©.,:–@LˆN8”ðA*¨Œ%òw%Ž yÂÂg"/Ñ6шØC\*NòH*Mz’쑼5y$Å3¥,幄'©¼L LÝ›:žšv m2=:½1ƒ’‘qBª!M“¶gêgæfvˬe…²þÅn‹·/•Ék³¬Y- ¶B¦èTZ(×*²geWf¿Í‰Ê9–«ž+Íí̳ÊÛ7œïŸÿíÂá’¶¥†KW-X潬j9²‰Š®Û—Ø(Üxå‡oÊ¿™Ü”´©«Ä¹dÏfÒféæÞ-ž[–ª—æ—n ÙÚ´ ßV´íõöEÛ/—Í(Û»ƒ¶C¹£¿<¸¼e§ÉÎÍ;?T¤TôTúT6îÒݵa×ønÑî{¼ö4ìÕÛ[¼÷ý>ɾÛUUMÕfÕeûIû³÷?®‰ªéø–ûm]­NmqíÇÒý#¶×¹ÔÕÒ=TRÖ+ëGǾþïw- 6 UœÆâ#pDyäé÷ ß÷ :ÚvŒ{¬áÓvg/jBšòšF›Sšû[b[ºOÌ>ÑÖêÞzüGÛœ499â?rýéü§CÏdÏ&žþ¢þË®/~øÕë×Îјѡ—ò—“¿m|¥ýêÀë¯ÛÆÂƾÉx31^ôVûíÁwÜwï£ßOä| (ÿhù±õSЧû“““ÿ˜óüc3-Û cHRMz%€ƒùÿ€éu0ê`:˜o’_ÅFIDATxÚÜœÙdé™Öß÷%–\"3«r©ÊÊ̪r/UÝ»í» oà ‰ $þ$„4— $\!¸a.¸`„FC{›a<ŒÝöxénÛUîê®-³ªrÌŒõ¬ßÂÅw"2²*«ÝmYšé é(r‰ŒóÄû>ïó>ï{B8ç$1PjÕyHžÍ‡« h ¯Ž¬úª«ƒ §L³Õ¹ ÀTçv≟%€tJˆ*8FÀñÇ?xÇjsÕ¹±Î}¦4îu`qòÏX 9À:œq°ñÍ@Šÿ+„ˆóÏÿýqÿôßýg„sn8_¥W+)ôßÏ´ýÛÎ9‰ –g,€ª«q`GÊY[.ÌÔÿMÒOþñßýÆ7~÷wC6^ ¨¸&²AVþN7+þ–RY=a4ÂF<É5¾&‡œƒ 3'þÑ;w¶ÒoüÁ·þW®ÕT£n…snP…6_Ûî ÿ«ðÈ:°Õ3 w’¸Ÿä‡˜8qld­ JIþÁ?ùWo|ó÷ÿÏ;jé|3¨~ý¸Ÿ•oô²‚80ÖaƒäŒ¡zF©à€š´Ö¥¦( E©QJcÌ ?2Ö’—%…VÚPjS‘ôí˜)%R ²¢ é·éµwéìlÑoï0lïQ»(,Òâ0 Ùh7Ôæˆâ˜8Љâ%%Qy^Pš£ Ež“ç9y‘ûóî.é~F÷ŽÅ AD<3G}~‘ÙÅ‹Ì.­Ñ˜_¤ÞœAɧK¬Õ8ë>´MÒÚø43Uj¬9éÍ'r䥦І¢4”#’~²"ü™™^}í5._¹ÂÝ»w¹óÁû?ü;˜}åË´ž@EØ"÷aÖz°& Ó9LÅ;ÖU!Ç»<àÁÿû}Üî^}í3|é+_cee™ÃÃ#ö÷÷)K/Ë=ùžøúRJÀy¢{Ê£,5Â9¾øÆç¹pá"ÛÛÛ|÷»ßå¹O=ÇÚúÛÛÛ!°ÖR–ú#4žgëC­S’dHÅÌÍÍóÙ×?K½Ùdóîm²;Nצ_û ´Í0Ö`œ:eÀO¤˜ÃX@(’aÆî¿ûwxí7Þà«¿õ5&ïðÝN¥JIŒÑ§"Æ9¯§‚ ¨DªÅ‘hÎQ¥BL¿×c¿Ýf$,//±±±ÁüüEQÒív)Šü þ=‡%帲=æfŒÃáápÈÔÔ/¾ð<[wïPn½KÒh>÷y¬óÖ«¶OAâÉsJ+Ù¿õ²{ïríÚË|ñK_" ÞûÅMÒ4%C¬5XcªjäÆÕÅ ÁÝû›Xcxîê„ã~&ÙæØzôÈG‹.¹wï.½^ Pm°OÑ.E§Û%Í3æffQJ>UëQ¯×¸¼¾Îp0dïQ»÷#ÊÙe˜^D›„@â ¡è#Ý£ºïý€¥…9^ÿÜ„aÈÍ÷n‘¥a µ9“z ”b8Lxø` !«/¢*ýó4²¶²$¡^)ë$II†IÅkâŒpH!Qâ¨Ûã§7n275ÅÒ«çÈóü@“‘7:ïõĵ˜ Vèt:”ý6<ø)å _Q4Ú38ÈNJÒG·QÉ—?óYZ³³Öͧ¹¦=ȉÛÛÌ6b—V8ît8j’¥»;ÛDA€g­¯tΛûRz‚0D8¨×(%8n·É³Œ¥ÅEêõò±hðÍ·c~~ŽF½ÁÎî.ÃÁÀk'ñd„JFJŽŽ¹·µ‰+KVΟ#Ë2Þ¿s‡£N]Y5ZkŒÑ•H5E޳Žë/<Ïòâ"I2¤V¯£Â› QÃ#ŽDL>ȰgquŽNR Ú‡,$Cв ×ë2LÂ@ñ×>ÿ9.\¸HYäEQ Ô$I)Êk iš1è÷«pö®×é!V–)+[bôÏGB¯×íq|tŒuî$µÎàœc§ÝæÁ£mjJ2?7‡”’Ý]iF©5’(©ˆã˜f­FÇDaˆ ¦§¦¸páN‡d˜’å‡ÇÇÔtÊ’!Oæ€â ò~Œ"IRZkÄ$í[?qÑÌÎÎrõêpÎqïî]Úí²,¯|uíùh¢Qõ€af%ÇÝ.Bxþô:О¶rŸh5¬—uÎ.KzZGÞ³k%ãÈŠ g÷†*p”Rcx饗˜›kñýï¿Åææ&Î9¢(BH1z"=ÿeI $³3³"/rŒµ¨1@'„-„ , ívB§Ó¡Õj1Õl25=MQuŽI“‡Ã;æ¸Ñ8ÝG‰¡(-íãÉpÈìÔ”ï¬Ã8w2¨g4«¦êâg›M¦8<:¢ÛÁ8 O½§ÚPVùjŒ! Cîßßäæ›t»]âJH)ÇÇ諪MÉòm R ò,'K³1‘ü¢Që2é%i­y°õ€8ŠX][CJI÷¸KY–(¥NqÝH^HéV:ý>íãcÎ/,°ººJhÒñóçζ;Àb¬A%­V‹ùóçI’„Ò’$#Wù¸ÌŸiö (Š‚­û›XkQBk=žLˆÑ„C LuÎ9в$Šcöööè÷ûìîì ¥"P !=H#C4åõ#›Jž¤)½7TPM@ÚêÓÜUe­¥?LèôúL5ë|ñ _`0°yë!‹Îÿ­µæi)æM3k Ý^­5çæç8]úÃyQT4r¾ž0e«æËO+Î@ÒTºÔÚ|>±©1®v>ªÆFŽ™©)^¾v¿úÅ/¢Âˆ¯¿ù&?þá ã¸jrý²†wÇc±É^¬"¨Ç&ý^÷nÞ`ýê󬮮³pþ<»;ÛÒ¤”eNQ`-BøTHõ¡‹{> ,‡‡m/Мcuu•OúÓܸqƒ?ú£oSqS–å/e4}‘¬uÂ'¦LM7¹|iÏ|ö³¬_¾Ê½{÷ùΓ›[¨ ð=Ÿ«ÒË:¬3g Eªó%ÎÃUYšòþÏßåèpŸO=÷"Ͻø2«Ã{;;ì·ÛôC²¢@—%Úh\%d5ÍðM¹xlõò,g{{›W_{•Ïîól=ØâÛßþ6ý~Ÿz­Ny–›8AÚ¦z׫ANH?‰UŠÖÌ W6Ö¹vý:V/Ñïøú›oòów~Bš¦Äq ”ÆàFëxÆú•γ-× k¡ 5¨ ÀZËÞÇtÚm–W/±¶¶ÁåO=ÏÚå+¶9hÐéö&)i–z_»,É+ã]àÆ&¹¨Œ|ëy–Óš™¥Ûéð7¿ÎÁÁµ8¦¨¬‹“£z1ÕŒgQAˆB„”Ôâ˜é©‹çX_[gãòZssñ?ùïÝøGG‡AH½Ñð11“¹oŸRæ~`æœó]ócoœ”’0ŠÑZ³yû}mÞãüÒ —Ö×Y\\äÂ¥uŠ<£×9âø¸C¯ß§7$i5¹,ɳÔ7¤Bú­5£8~ðâµæÑÎ.J)ôˆpUp¢g¬EAPM`ã0¤^¯Ñš™aa~ž¥¥%V.\djzç,ÛÛÛ|ï{ßåîíÛôû=” ¨×g6Â#qlÁZ¿.8S(Ž”´Åœ1‰cB–XkÙyô€Ýí‡LOÏp~y…•åeZ çXº°ê›Ð,£HÃýÁ€,’‹ñ¬¬Ôš,óêyeuµšŠxAé-”€HÄqD½Ñ Y¯Ól6iµf™[ ^¯EY^r°·Ë»ï¾ËƒÍû´(ŠÔjõ³ý%çÉXHµÞr®té“TÍ,OU ñ”ÅŽÑ,J)åÅW¿O·ÓáÞ·¨5¦˜Ÿ›cváçÏ-0;;ËùÖ9VA(À ÑÖ`´Æj5Õ†GՌԶ’ÊGK„JI ÂÒ Ò~Nç˜nßfg›ÃÃCzEQxpÃZ½þ”ˆy<;NRlr x†'m+]2Úç¿tdÔB¸ À9G– y0èó`kÓO@£˜¸^gfzŠf³IXkRo4hÔkÄQD*ßÏUÀŒœ@m y’%Y^0 È=²<£?2èõȳÔ7¢•ÁGeÒá·f478gOûŒ¤tY–äæãÝÇ2¹(T€[k)òŒt®õÉ]ö>T®5µ8fíÒÖ¼×l­ñÉSTæ¤ó—IëóÄ”´ææ‰j5Š¢W™O:0Yž“•%a\ã…õUÖ®¿Êí¾ ­ÜpÂA'Lì,˜Œ2šâhñ¯†Ó‘dn~žZ£IQjв;Ÿ4`DU|’4à ¨5|êÒ¾úåßd;^á'·Éž½¼à￳¨¬O·¾Ìþòk\~@$(9O¿Vc0ðž¨ñœËý%Ž–‘ûXh ¢zf£Áå K|å‹_ ¿x?øþ=²ã#ïbX{*Å‚ÓFEXƒÍ{Ü‘ „ó ^hm3}¼Ç^P‹c’ÔoLeéû´JÃŒ¥Ü_ éŽt›Åùµ:c0Î!„$Œk4j5Î͵xùù+¼üÚgy.ó?pŸ½­‡ @‹3†É¡ÓeÞùeé4e’ñNQ§?w…W×y®¿Ça{Ÿv7bXI³‚<Ï(‹ÒÏë…ïá¤H%Ÿ¸Ýè׎É=r3éW; ÇzQ¯Å´¦§¸zé"×®_§¶r…ï¾õ³_08hCàüýpnâ]ñ„ÝaÁ–`5ÂZg0I‡;IÀþì4/Í_áÊÕ%“CzG‡öô‡)Ã,§(}oUÚÛ¥öq¢u-š ñÄgÝLQYâÔÝE£Jë=7–!vr7Š©+?ÈœnÔ97×âÒÊë—i,­q; ùÎw¹}Š"啳Ñ`ÍDЉ3Rlô Ö€3H,ÖdôÛ)ßïÕ¸ÓjríÜkW×8¯ûäÝ#º#ŽûCzCï÷–Úe)ºÉZ¿8àlež» EØÙäáÁ1¤‰Ç8Táü5úf œW]»3Oá k|¨™‰¯Î¾Ï³ÒÝÐ=PܨÅÌM7Y™©±ÖZefFr~¹`C9l‘‘}Cé7æ«¥‡ê(«©§©BÚÆCâdáçì~&GQR¯Õ¨×bÍ&Í颯2ªAX縔ûÝÃ$…¢ðZ"•@;q7gä4Öê³»yŸbº"êò$Í&š¸åALhqçJl^PdCöºGì9oŠ0"޽¥Ñˆ"šµˆz-¢…Äa@ "Â@…œô‰j¬¥Ô†Rä…&ÍK†yÁ0ÍH ¿¨nŠtõ®Ëêÿ ¤÷¸œ9kjð@£k׈QÚ=ÙÍÛñ/küWS~¤-€É©çƒ-²|@æ ‡óìú±îýée…&«ãè>ïÑhWäìF×-NJpŽàäUX°ÂT ™é Îþ /~’³Äc‰ÓwÍùlâÌw[œâ§EJžýmk=8NƒÑ8%$(1Š w²_TQTzz|¯ð/â¾L÷«½7 ÔãC;g±ÎGs%þqb †ñÂŽ5Ú’%˜"Ö9Nk?I˜Hüeí¼>&@öñY¸EƒÓ¡ r%2 úœœ0Pšî1Y«Y­¶Ù±ùä`ÇÓ–*Ö²ž½´É¶€P£+ö·¶¶Ä K™´Æm³ÿðúKX=ÖÐDf"Šà[ßûQñoÿÃãOßúÞάÌÿGWf'T#ž•|y>'Ï[Um‹ ë?Ø:Ö>'h¬¯•Súè_Ãö?42ôõÁ¹g>‚ü:ŽÅY,sÊ™•ÿUÎ\øO”xEJ]]c:Uçþu¬õt0lÿ=aK…(Å3Œ‘E¡B[N/ýïrzå¿ kàÈ„zékƒ›qBÅe‚¼÷5Y ¾Œsó•>}Örì±ëO¿ck3o «ÎôAì‡B½ô5‰ÿª:þCÞf „“J±8ù„ªg WõcJXmn=] ?Š£Oƒ€V7„Õu@Uß3Ïn­ÇeUÍ`X}Í€òÿ ޼ MIEND®B`‚lft-3.8/icons/72x72/dest_closed.png000644 000766 000000 00000023520 12050507714 016776 0ustar00vicwheel000000 000000 ‰PNG  IHDRHHUí³G pHYs.#.#x¥?v OiCCPPhotoshop ICC profilexÚSgTSé=÷ÞôBKˆ€”KoR RB‹€‘&*! Jˆ!¡ÙQÁEEÈ ˆŽŽ€ŒQ, Š Øä!¢Žƒ£ˆŠÊûá{£kÖ¼÷æÍþµ×>ç¬ó³ÏÀ –H3Q5€ ©BàƒÇÄÆáä.@ $p³d!sý#ø~<<+"À¾xÓ ÀM›À0‡ÿêB™\€„Àt‘8K€@zŽB¦@F€˜&S `ËcbãP-`'æÓ€ø™{[”! ‘ eˆDh;¬ÏVŠEX0fKÄ9Ø-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+®ç*x™²<¹$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóýxήÎÎ6޶_-ê¿ÿ"bbãþåÏ«p@át~Ñþ,/³€;€mþ¢%îh^  u÷‹f²@µ éÚWópø~<ß5°j>{‘-¨]cöK'XtÀâ÷ò»oÁÔ(€hƒáÏwÿï?ýG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)¬‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(¼ AÈa!ÚˆbŠX#Ž™…ø!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fº‘;È2‚ü†¼G1”²Q=Ô µC¹¨7„F¢ Ðdt1š ›Ðr´=Œ6¡çЫhÚ>CÇ0Àè3Äl0.ÆÃB±8, “c˱"¬ «Æ°V¬»‰õcϱwEÀ 6wB aAHXLXNØH¨ $4Ú 7 „QÂ'"“¨K´&ºùÄb21‡XH,#Ö/{ˆCÄ7$‰C2'¹I±¤TÒÒFÒnR#é,©›4H#“ÉÚdk²9”, +È…ääÃä3ää!ò[ b@q¤øSâ(RÊjJåå4åe˜2AU£šRݨ¡T5ZB­¡¶R¯Q‡¨4uš9̓IK¥­¢•Óhh÷i¯ètºÝ•N—ÐWÒËéGè—èôw †ƒÇˆg(›gw¯˜L¦Ó‹ÇT071ë˜ç™™oUX*¶*|‘Ê •J•&•*/T©ª¦ªÞª UóUËT©^S}®FU3Sã© Ô–«UªPëSSg©;¨‡ªg¨oT?¤~Yý‰YÃLÃOC¤Q ±_ã¼Æ c³x,!k «†u5Ä&±ÍÙ|v*»˜ý»‹=ª©¡9C3J3W³Ró”f?ã˜qøœtN ç(§—ó~ŠÞï)â)¦4L¹1e\kª–—–X«H«Q«Gë½6®í§¦½E»YûAÇJ'\'GgÎçSÙSݧ §M=:õ®.ªk¥¡»Dw¿n§î˜ž¾^€žLo§Þy½çú}/ýTýmú§õG X³ $Û Î<Å5qo</ÇÛñQC]Ã@C¥a•a—á„‘¹Ñ<£ÕFFŒiÆ\ã$ãmÆmÆ£&&!&KMêMîšRM¹¦)¦;L;LÇÍÌÍ¢ÍÖ™5›=1×2ç›ç›×›ß·`ZxZ,¶¨¶¸eI²äZ¦Yî¶¼n…Z9Y¥XUZ]³F­­%Ö»­»§§¹N“N«žÖgðñ¶É¶©·°åØÛ®¶m¶}agbg·Å®Ã“}º}ý= ‡Ù«Z~s´r:V:ޚΜî?}Åô–é/gXÏÏØ3ã¶Ë)ÄiS›ÓGgg¹sƒóˆ‹‰K‚Ë.—>.›ÆÝȽäJtõq]ázÒõ›³›Âí¨Û¯î6îiî‡ÜŸÌ4Ÿ)žY3sÐÃÈCàQåÑ? Ÿ•0k߬~OCOgµç#/c/‘W­×°·¥wª÷aï>ö>rŸã>ã<7Þ2ÞY_Ì7À·È·ËOÃož_…ßC#ÿdÿzÿѧ€%g‰A[ûøz|!¿Ž?:Ûeö²ÙíAŒ ¹AA‚­‚åÁ­!hÈì­!÷ç˜Î‘Îi…P~èÖÐaæa‹Ã~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DÞ›g1O9¯-J5*>ª.j<Ú7º4º?Æ.fYÌÕXXIlK9.*®6nl¾ßüíó‡ââ ã{˜/È]py¡ÎÂô…§©.,:–@LˆN8”ðA*¨Œ%òw%Ž yÂÂg"/Ñ6шØC\*NòH*Mz’쑼5y$Å3¥,幄'©¼L LÝ›:žšv m2=:½1ƒ’‘qBª!M“¶gêgæfvˬe…²þÅn‹·/•Ék³¬Y- ¶B¦èTZ(×*²geWf¿Í‰Ê9–«ž+Íí̳ÊÛ7œïŸÿíÂá’¶¥†KW-X潬j9²‰Š®Û—Ø(Üxå‡oÊ¿™Ü”´©«Ä¹dÏfÒféæÞ-ž[–ª—æ—n ÙÚ´ ßV´íõöEÛ/—Í(Û»ƒ¶C¹£¿<¸¼e§ÉÎÍ;?T¤TôTúT6îÒݵa×ønÑî{¼ö4ìÕÛ[¼÷ý>ɾÛUUMÕfÕeûIû³÷?®‰ªéø–ûm]­NmqíÇÒý#¶×¹ÔÕÒ=TRÖ+ëGǾþïw- 6 UœÆâ#pDyäé÷ ß÷ :ÚvŒ{¬áÓvg/jBšòšF›Sšû[b[ºOÌ>ÑÖêÞzüGÛœ499â?rýéü§CÏdÏ&žþ¢þË®/~øÕë×Îјѡ—ò—“¿m|¥ýêÀë¯ÛÆÂƾÉx31^ôVûíÁwÜwï£ßOä| (ÿhù±õSЧû“““ÿ˜óüc3-Û cHRMz%€ƒùÿ€éu0ê`:˜o’_ÅF{IDATxÚÜœY¬]×yßk­}ιï½¼¼œ)΢(S5Ù²$’b9®ë4NÚ M‚E›—¢E‹èCÑ- 4E‹Žh‚$n›ä!n‘4){ïµ¾¯kïsÎ%/%ÚUŠF$6îÁ9{X뿾áÿ kUµ@¨£ÀHñ¹ X>šÿ´8ð@Z½â¯/’œ1` 0U| BñY†nüQÈ d€)„£Ž~pDK€ÆµÅç ªçA¦0ƒ >b2¤€(®&Æ|;±æEcL ÿâ?þ¶þ³÷›U]¬/Ôkº“ù¿ÛóòeUµ `ùˆ P1ш”Šäë&GÿM§Ùù'õWÿ9Ï}å+vÞCRØšèµzù¯Ö{ÙÏ8g±Å ´Ä¨ÄÆ|”«?'Eh¥§æ9}¡ûÜמÿ—ì¾wÄŠQÕm€Ë|xæÊrû¿k0˜ˆ¬‚w4:PÜ?ÏÿÌвFxpÎò÷þé¿úä·ÿè›GÜÆõãIqúR³—²Ñ˨% AQ郤úP}D2Cª @šf´Ú6ÌΰqÃú¿BžF’ò÷Ì{×ê¦äOð"ˆh߃ù3Tɨ÷ªú^ÝG /B·Ó¥Ýé`Œ¡Ùî¬Ç¹1 –®<Ï‚¤­nFî¼|ˆ©jað–íN†äœ£R­aŒåý¼*ø,Ã{çÂcÌ Å{O·Û£Óéb#Ír‹³ã@¥” É}F'e´ð!DÐ!E½£Å28G2.^<Áâk`,Æ|ˆ¢¤ŠH`rz†]{÷Q±–àó;ö ¦ôÎ&¢ì½§ÛKév{cÉro°¶ $%@x¤Õí!R!¥Ia]IÞÏC8çêyãû/ñƒoý½úI%‰’ô¡á£¨j#£<ôÔ_౟þY¬ áMF ïszÝ”n/ÃX‡÷Á`ŒLi¤ÉƒÐîe€’û€÷ÅTª$Õ*`P•÷]%c Im„«Îqø…¯1MÎO?ÅÈHàǵ–Ü{NŸ:ʼnï~ƒ}r×ÁOÒ^^ø`)2 ¢äirP%÷9Y/£Û˰ÖáEJ5Èû@§—a ä¹'ˆ ÆÒXœciî*Á{Œ5hø’Z+çO³|õ2w?üOýÂßÀÔ&ÈÒ·P%©Ð¸ö»¿É¥ó§9qä‡Ì§Bsyû~ª¬ *ŒŒŽ³~ëvjÎ|FîY–ÑÍ2¬sø ø@!ÐI3kÈEÀX._8Çáïü1 gŽab]²‚3ÞNüÂÖ͛ذq3smÏR½‰O»8çâ=Ìi³ADàQU’J•,ËíÁVøÑwŸC^øæ <Ìy†,ªB­VcÇCOrà³_¢’$d¹'Í⑸œ AË‹‡RzY –x¼‚º §ßü!í3oó‰fӦ͈„[Ž›çª"T«UÖήG‚²´´Dƒ$KQ”`"úc{ëV=Ö\’“åñžm[6³ïc÷Quù/b­Å{ϙӧ¹~äe¶îº‡uû¡Ûj“ç,÷8ç a`ŸúÒ<'ó/DWßi256ÂýO<ÃÖƒOÒl,s³+[ !©Th-ÍóÞ÷¾IÈs6l½`ãªÌ_>Ë;ßý:>ía“äŽÁñiʺM[xàÙ¿L¥:Jž{2P…©ñQþ̳¸ »hÕ—ß×[V* `¸ð¿Cõúe&\@ÕÐËrÄ{² ¸Ü#a›¤¤Åƒó qW!±†¥vJ}®Åòr“äý&f •\=}…“?ø!÷ìÝÍcÉ|@†ㆠÛ6 ÆÝm@‘Fæ ŠžÌ{!¨’à $«²tã*ç_{Ÿ¦««ˆ‚¨& £µ&©‚{ðÆrv¡Ãéùök¥‘ dXc"‘•@â,)ŽWŸÿ]ùüª*æ³”µ6³ÿ™ŸWAQ¬1ˆ(¾ B‚÷²B²û³ò xÑ(AV‰4UHƒ¢XöN%lZ»1öÖ)w^;3Ã…+sä>Ç‹…<Ïñ™GD~¬¼‰ÆYUœk”<ÄEµI…»¦ÇÙ°v ]í«¢>gÝÆM„éINÏ·”8×Óf>¼‹RŽo ð*øí‘§ŒÁ ¢BÚí0:½=_þ;ÌNOF®°ÊJ'Õê7.Ñ8ñ[¬™'ˆpUs¹ò£Ⱥí~Ü!8!O™^¿™ŸúÔâEðAÈòœµžøâ/PÛõ¥ùUy5‘äž»ÑÀgiDÕŽŠŠ"! ߬bªJJP‰Œ9à‰(^”÷æ;œ¸Þº­‘vÕΦ97ÇÌÔÝEžEŠÉ:6NX¶ïÜFU àîÈeÌlØDkz‚ K=k 0Œ®,6¸.ש/^_ÝH›¨¢6¦Ç@‹‰I ˆ€^•DVf’aíð¢‰Aª/I_‘”ö Yž#> "«¯¾1ȼÇX¥¯H¨ ùè8ëSË–O“Üû 4–o!w«óƒáÊÕyò<…J ?H•ÒéõhwZtº’URÀXGÍ‚zacºÕKÀ‹‚DƒÔ­HÀ©XG‚BT7)ù’¶BkaއŸÇgÖ­îîC­â˜¬T0IB‚âèYKãä[ìþÚÿ`n©Éñ_ÚÄHcDîÄF£¢8g£ÊKˆYƒv0¼þâ7hy‡†°*Þ!ϘœÝĶ'ÿb’BÅ BT)AEÐr1…ÕÜ|T1¯Q•B‘M,ÒRdAîaëìF<öG¤Eîqzí ç¯Ì‘å9UU¼q,,\eýϳm4¡úö+\{÷Ó,í{˜ÑåèH‘Ä4(í§c\RaçÌ6ÍLÅ(•1rÖ­ßÄüÚINÌ5P•8)l(¦øœ8³ QÔ‚,–éVOLuu5K»Ô¦fÙø…_afí>È*®Úàª5Ú7.S?ñ;¬k© päeö^§ÞêÒî¦`oŠæ;YÎB³ÇäØŠʺ•Ò¸ÕüöîÙЀ3à’k YÆèá¸{énr™*jTkìyõë\½ûa:#T{-î4„5:(ùš’DjˆÙãÛÄ/Pã( ¼16l =èµ»4í¾»/%ÚKP£“r£Ña¾Ù¡ÝËQ IbŠ#hdØ:T·]ýˆç8ké%5Zï½Åžc¯3=2Ž/³Pª¤S¬»v–¯}“vmŒ åŠÞÙ‚öÁÐ2Ëøc“‚H:g±Ò,g¾Ñáúr‹¥v s^f5T¬Œ„@'ô:Bº°ÄT·÷•âÕUá ™½€q ‹.cÇ¿ÃÎN³fª_c‹4¤Sì=ô.îÿM»k-Ý‘•* ]´‘"‚xAÜ­BmŒ‰!ˆ(iæi6šŒ4pÍÍj†‚+´DDV¤Mì0%%P… L³ŒF½Îr³Å|«G½Ý£—y‚h”@WE4z½Pð(PÒJ…ÎÙSl={‚‰ñ |AÐT}ymŒñvýßÿ:™*¹q‘‡•÷»í!>SXÛâu¢¢ÈÉQz™§Þîq£Þa®Þf¹Þ$ëeý*‡ ƒ{£+|ÏÀHñ˜h±:F0Ö’$ ¢J'MYluh%–ŠsT+ŽŠsTœÅY)~)žÎÒNS¶^¼Èœ‹".‚ÍRlµŠ¸£Jor»Ž½ÆÙýŸà½³æÜ~:U9ª…Á˜htCPòƒÐ,ä!ÄEu AÖ9’¤“‰R‰€šc b¢qdÀ…´””B% † O;Í1Æà¬!q–Ä:g©Ž:š™gòÚUö¶ZŒŒŽ“ƒæ9ããLæÙstZÍ8`籆û^ÿWv<@^!Éz7Õ¯ –>¬dZŒÙ{zYÎržRov‹ìh!aM±…¸™½)Y•"¼R¬è ¨z+Qdˆ©jaíµÈû ÄÚ˜A|Cìå^ͱÖ"Á²|úŸ=yŠQN`-ôzìÚÿ'~ù0ÿÿžÝ^ ;=‹1†öÈ6Ÿ?ÆžCßæÍÇ¿ÌT·bŠÞ€hk¤?.E­¥›ztq‘ÉtZm–L—f;¥š¸hwÊ1.¾QÅö{a‚‚*Z†j«©XQ(”k‰Ø¡ƒ”ßßFü­‰yã¥v“-ï~Ÿ}E<—u:¤ÀÖÚç›ùZæ×}Œ_JŸ'¹~´Ž\„ßþ}^Ÿ½‡sSëëÔ‘~yyÈS)Ø$!Ï=Iž÷ëv¥†ŸKzØü©oÜ £,‚)$ÈÜTý³ 1Æ !=U0v³„"©´Ú!jh“àÞ;ÌÃWO1=Ôž6lúÌS¼±ç“œ?ò&—w>À›{e´ôˆ"t€™<ãWþ–©†˜ð¡ýbuM¿:‡o êì…÷ßʱF0cxU~O?P.ÿÙ››‰ƒÎŽÁ€žêNRˆm0ŽFã{Þ|žÝ8å±mý‹Oÿ//+éâã‡ÿ9n¸ Cv¦ <ý#¶Ÿ9Dc|4¦\n÷ÌÒ¨ Âó§¡ë(êòƒ9ÅŒƒÈ ¶ÒÍÃ}ÑRÅ¢u/O쫘„•‡0†¦Q&ßy…‡êש͘&>û,ÏÍîçÝËstFÇée=.o½›ïüU ¤.YÑæöØ÷ÿ|Fæ’[ŸWŒ#h(‚cÓ÷FaÕsW¿®¬Ë‹TJˆdÇÜRÕ(˜²‘¼!a³xU‚¬Ú!¤1–Ü:Òkçùø»¯°eHµîÚ¿—wy–£ð»ì:vˆJ%ÁªRY»…cÿ‹8{ˆ½Ks,KÑȽG¿Ëჟc¦~ýV·_,b¹Ð:Ä‘ìû•J†®³‘7ü)²û ŠÑ•D1YQ– ‚éÛ¢¾.ª"!«rKAÏÒÈ<[Þ~‘ƒyä…­w`?ÿežÛźC¿Æ—–Γm´#ã†_ß¾“ï<ø%v¾øªÅu%¸¿ñ NíxNe”‘´ƒ®h•4ˆ46^ ^VßJ€ â‹~'3ÀCˆÀhÉÎu„Æì\iU´H™‚‡þ÷ñˆ7ëš{á>w„µ0R¨ÍÖO|œÓžäÍó×ÉÆ§ú Ø£@¾k?#íeÎízˆ#›ö²fȵ»z-=ô-Úµ±ØéV¸áò +l‰ÜôûíQ¡4ŽHl¥éŸ£+«v¸.izè³i)oTÚ ’ika­¥Ým°÷èŸpƒ†jl˜œ öôç8ÒSÂÜ5’J_HIVTr%í^zäK,À• Ø;þ2¯œ¤12OeÅÊŽ¶dåï·?Jï£E3ƒ©hd +¢y-ÓwYʵK$—¨ˆZjï ]¸ÄØaÖ?þ8g×®åâù‹ J:6ÝïÖ®½Ú1Tš‹\ß¼Wï~œ1t˜VåÉ7¾NÀaor׃Œ'úÁ4¤È dV´pûÚwÿAX]‚ŠÓ‹¾áÒÕ ˜´ª0üK°ŽP¿ÎÇ_aÇ8lݱú½÷òöù øV¬E‹¸Ÿ>)²žJ·ÉkŸå|u”É¡Ú I§ÅÑýOñæÌ]L9’pOs‡Þ}‰¼6A(È\ÙkŠÁGcñ¦‚7I¬å‹òü>QT-¦U~?ˆõ¤ŸŸ¾É)Š)²FÑý!c¦"hˆÙ[Ÿ¦ì<ö ÷ –ŒyËX•îS_â[uCëÒEªÕj¤ ¢[íÓN3^ÅŒŒCž£Æ’§9þìQ8û&ÿ{ÇÃ4ŒëìrWÍÓï¼ÈèâUÒd :RV@#›¶„Fìô²‹ÇÉ2« Zž?|]®ø^Š¿CDqEÂLůÑ’QÆ@1 FÉŒÁ]:Êcs§˜’ž0󨓼¼ù>ŽŸ:C‚b¬"+ž^bɋЭÐ6UT<Òí ï½Êý·øÂøeÖLv9<µ®¿«tû›CΧÞ~’JQq)ܼq†ÞòuÆÎ½Â§ªxÊaÃõ#dY-Ê µ“=Ðb^ÿiXÝHK™ñcˆ””¼üÍX´½Ì“ßãî!Ãì»6¬£÷È#|÷Â,,Q­$ý8Ž¢[_†Œ3Qb/㉵=>ÿ‹¿ÂÔOý-Ö‹»îbž¸7‰!ƒýÄù7™½r_[Sk-ÝÜã.½ÅÓûÖóè_ÿ‡ø‡~–­á[ü¹©ö+»€ÒÍ›6kJÖÕmEùUK[J#]ÅbóÐØÙÃ<Öœ'h ¨~ö RÇškÇ0cC© Ô]_P€jâÈ*£ÐI™ÉæØ~à^l®ã¿¿ò‡Ƹ6»‹kwïîKÄ]nÀO½ýƦú!Ö¥ Ú µî%>óÄ®ìyŒçwŸão.\êÇi¾ëÙãÊé™]t“С2æÇ¶³qWÎ/ºFF7°öcóËBoiãL¡’¦ a(ççK1÷›˜b²²‰¸8!x4&î{Æá®žæñ¹ã¬e°W36>ðí'ŸeK7åܼçåwÏ#Ý6‰sEÙCÁ:fZ7øøñï€`ñîG9÷àNºu¡µëSȈLJÚh“ÁøBN[„ÝK×øåí›Ùµÿ^R·/ýd;MÑ·lþ `*zŠv™ÙQsãü‡ÎÍ唊»¹Qݬ²»Î-M±ä^J’:cÁ™R‚âÈCPòÕ´M²i ¯îzœLO‘gùOº³”$I¨$Iwñ‡ )6àx|T’„Ðj1~â ɱ%ºÍŽé•Ü(fRxTsâ qjå¶p$x!í’ø7|à½#G‘,ý¿˜XYdú³Ô±²“«Pš3Ôl¹¿öv›VoÞ#ØP0>›858£Ø2kA%qžúéq2¨…ðoÚ¿Eªÿ½ïÃF FïpHÙ.ÑþÆ4ÅÈHÆ•*–\¿pá‚iÕÉ;ÓUóçý-&wfTÁH”Ñ>ƒjhƒ©Yòü«odÿö?ýW^úþ«ß˜Ü<óŸ5ï ^”`>*¯|ùPä¢MÈcz¶2ú†AFŽaû' óK ;¶ç~ñ×’öü? ¶³Ñªy *ÙµŠÇæ)ùäæÿ™Onùur.&T«ÎíÙQSeM×Íþëš÷k’öüß6’;dÐûüÑÅH#svÉ×lü_ùšÍÿÍHH€E gÜg’X”ÐI5®†q!IÏØ¬õYTg”©áÊ¿›æcZ¡¶æˆŒL6â M0×ã‚F¨gE ]üíùÿ Q*bµ«¼IEND®B`‚lft-3.8/icons/72x72/firewall_smart.png000644 000766 000000 00000030172 12050507714 017522 0ustar00vicwheel000000 000000 ‰PNG  IHDRHHUí³G pHYs.#.#x¥?v OiCCPPhotoshop ICC profilexÚSgTSé=÷ÞôBKˆ€”KoR RB‹€‘&*! Jˆ!¡ÙQÁEEÈ ˆŽŽ€ŒQ, Š Øä!¢Žƒ£ˆŠÊûá{£kÖ¼÷æÍþµ×>ç¬ó³ÏÀ –H3Q5€ ©BàƒÇÄÆáä.@ $p³d!sý#ø~<<+"À¾xÓ ÀM›À0‡ÿêB™\€„Àt‘8K€@zŽB¦@F€˜&S `ËcbãP-`'æÓ€ø™{[”! ‘ eˆDh;¬ÏVŠEX0fKÄ9Ø-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+®ç*x™²<¹$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóýxήÎÎ6޶_-ê¿ÿ"bbãþåÏ«p@át~Ñþ,/³€;€mþ¢%îh^  u÷‹f²@µ éÚWópø~<ß5°j>{‘-¨]cöK'XtÀâ÷ò»oÁÔ(€hƒáÏwÿï?ýG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)¬‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(¼ AÈa!ÚˆbŠX#Ž™…ø!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fº‘;È2‚ü†¼G1”²Q=Ô µC¹¨7„F¢ Ðdt1š ›Ðr´=Œ6¡çЫhÚ>CÇ0Àè3Äl0.ÆÃB±8, “c˱"¬ «Æ°V¬»‰õcϱwEÀ 6wB aAHXLXNØH¨ $4Ú 7 „QÂ'"“¨K´&ºùÄb21‡XH,#Ö/{ˆCÄ7$‰C2'¹I±¤TÒÒFÒnR#é,©›4H#“ÉÚdk²9”, +È…ääÃä3ää!ò[ b@q¤øSâ(RÊjJåå4åe˜2AU£šRݨ¡T5ZB­¡¶R¯Q‡¨4uš9̓IK¥­¢•Óhh÷i¯ètºÝ•N—ÐWÒËéGè—èôw †ƒÇˆg(›gw¯˜L¦Ó‹ÇT071ë˜ç™™oUX*¶*|‘Ê •J•&•*/T©ª¦ªÞª UóUËT©^S}®FU3Sã© Ô–«UªPëSSg©;¨‡ªg¨oT?¤~Yý‰YÃLÃOC¤Q ±_ã¼Æ c³x,!k «†u5Ä&±ÍÙ|v*»˜ý»‹=ª©¡9C3J3W³Ró”f?ã˜qøœtN ç(§—ó~ŠÞï)â)¦4L¹1e\kª–—–X«H«Q«Gë½6®í§¦½E»YûAÇJ'\'GgÎçSÙSݧ §M=:õ®.ªk¥¡»Dw¿n§î˜ž¾^€žLo§Þy½çú}/ýTýmú§õG X³ $Û Î<Å5qo</ÇÛñQC]Ã@C¥a•a—á„‘¹Ñ<£ÕFFŒiÆ\ã$ãmÆmÆ£&&!&KMêMîšRM¹¦)¦;L;LÇÍÌÍ¢ÍÖ™5›=1×2ç›ç›×›ß·`ZxZ,¶¨¶¸eI²äZ¦Yî¶¼n…Z9Y¥XUZ]³F­­%Ö»­»§§¹N“N«žÖgðñ¶É¶©·°åØÛ®¶m¶}agbg·Å®Ã“}º}ý= ‡Ù«Z~s´r:V:ޚΜî?}Åô–é/gXÏÏØ3ã¶Ë)ÄiS›ÓGgg¹sƒóˆ‹‰K‚Ë.—>.›ÆÝȽäJtõq]ázÒõ›³›Âí¨Û¯î6îiî‡ÜŸÌ4Ÿ)žY3sÐÃÈCàQåÑ? Ÿ•0k߬~OCOgµç#/c/‘W­×°·¥wª÷aï>ö>rŸã>ã<7Þ2ÞY_Ì7À·È·ËOÃož_…ßC#ÿdÿzÿѧ€%g‰A[ûøz|!¿Ž?:Ûeö²ÙíAŒ ¹AA‚­‚åÁ­!hÈì­!÷ç˜Î‘Îi…P~èÖÐaæa‹Ã~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DÞ›g1O9¯-J5*>ª.j<Ú7º4º?Æ.fYÌÕXXIlK9.*®6nl¾ßüíó‡ââ ã{˜/È]py¡ÎÂô…§©.,:–@LˆN8”ðA*¨Œ%òw%Ž yÂÂg"/Ñ6шØC\*NòH*Mz’쑼5y$Å3¥,幄'©¼L LÝ›:žšv m2=:½1ƒ’‘qBª!M“¶gêgæfvˬe…²þÅn‹·/•Ék³¬Y- ¶B¦èTZ(×*²geWf¿Í‰Ê9–«ž+Íí̳ÊÛ7œïŸÿíÂá’¶¥†KW-X潬j9²‰Š®Û—Ø(Üxå‡oÊ¿™Ü”´©«Ä¹dÏfÒféæÞ-ž[–ª—æ—n ÙÚ´ ßV´íõöEÛ/—Í(Û»ƒ¶C¹£¿<¸¼e§ÉÎÍ;?T¤TôTúT6îÒݵa×ønÑî{¼ö4ìÕÛ[¼÷ý>ɾÛUUMÕfÕeûIû³÷?®‰ªéø–ûm]­NmqíÇÒý#¶×¹ÔÕÒ=TRÖ+ëGǾþïw- 6 UœÆâ#pDyäé÷ ß÷ :ÚvŒ{¬áÓvg/jBšòšF›Sšû[b[ºOÌ>ÑÖêÞzüGÛœ499â?rýéü§CÏdÏ&žþ¢þË®/~øÕë×Îјѡ—ò—“¿m|¥ýêÀë¯ÛÆÂƾÉx31^ôVûíÁwÜwï£ßOä| (ÿhù±õSЧû“““ÿ˜óüc3-Û cHRMz%€ƒùÿ€éu0ê`:˜o’_ÅF%¥IDATxÚÜœyœ\Wuç¿÷¾÷j¯êîê½µô"ÉZZ–,K¶e³xÅþdÁЄf ðÉ01† þÀ'C0äc 3žÌÁ &1[laŒñ"oò¢ÕÚ[K·º[½ÕúÖ{ïüñªKݶ¼²|xý)õ“Tõªî¯Îùs~çÜ'Œ1p€$Ró ùÍW›£2=ç¹! À3ãc¨Hsóç¿ÊæË^O¥TyÉ·g‘"Ò·îR«×BP©Õ;±¬ ´–JûU7 Œl"­ˆT 1¦Aø ÌþŸÅ› Ò²h)vEŠÿý÷yðGÿ“‡öÑÛ×Ëæ‹/ J+Òé4N"mÛÌNM17;K×ùçÓRh%2†©R™zÝ=·ñ±$ƒ!Š"\×£^w‘ÂÂB‰%³€3oA:Œ”.×}Ò E¤b€”Ö˜Žjþ™ŒHkE¡­H"ãñ‡䡟|Ÿãûž¡£½•M[¶ … £Di‘L%©V*LMŒPì袵µE¸~H¥æâÖý·žùè,˜@žëz! ÂH e°ç"Š”®ºZ;„jÞ‚4¦ÊÎ&¿N«±¤E[O‡>Ç=ߺу»(¶æÙ°q#Éd­H$“Ø–…繜:>‚纴´¶ÑÞÙI¤õz ÀõCª®çù/AAb!RDQˆçú¸^€Q¤BX€˜'iB¥©y`£ØŠæ]¬ Œùõ†ílKX;~€{¾þEæF°rõ,'ÉÄé1!$‰d¢ñmC½VEZ6ˇpÏóÃL:EÚ–ø¾OÕó ¼à¥(æ †…QHà¸^€”‘Öóu (RÔ½) #"¥PºͯÓˆ‡©\;•áÐþ½ìyàÇŒ|†¾žn6ozQàÇï†ç æf§™šgrªÄ…m¡§§›Z½Žëº!(¶äéjkAº ÛF¥RC‡áËtÂ("Ü @Z‘R â2ô,@JQ÷l)¢è¬‹ý,Ç4þL¦³8Ù§ŽáÀ#÷0¾o'ù”dݺµ8N¯VÃRJò--x®ËÌ™3X¶Ãêuë1Ï=‡l¸™VŠt:C[!KkkÝ>HÔ¶ iYÔª5„xYc#YŒ"…DøA„m…(­Ì¼.ÈàФ(E5HúŸj5Zc;Ùb7³ãüÇ0¾wi|Î[1H*“#ŠB¢(®DŒáôÉÔkur-:ºzPQ€Ð) ‘La[c'Ž¡–’¹à· R­ÔÑAýU¦û†(ŒBEFXV„Rgù© Ò? "‹ R„Q#7¿byÑ0½T®…à¡ü£Oÿ‚ CC+È·µ£µcp)c“ž™žffú Ž“ oÙ2’©4a…¶mÑR(Pšcÿ¾=$%˜|7)_RpÂNb%Òi¡ü:^µŒòe?©ØÍ”Æ #´:[›/Èà‡A¤BE8OÒ¿bt²I’¹Vff¦Øß÷9ýÄ?ÒÛ×K¡ØË\©Ì\©l;eI,ÇÆw=ÜzŽÎ.ZÛŠaˆç¹8N‚l>O¤4;?ˆè]ÒËšÕçqàÈ1žýîI·´!)Òù6BeÈuöÒ»b :Šæe ã‡%5ÊèZ1š Ò„J5¼Aiõ*sƒ´’…"µÒû{¦÷=B^¼öª7`Ù6ïEJ)¤´ð¼:3gÎ0rb”¾¾n.ؼßpÝ8ÑKg²‡÷íãÌÄ:»{XÁFrùÕºKRh އñ'ÑõˆéÃSÌž>Eûù¯§ch-F´R/ÁA "E¤5¡ÖØ*Š+ñ Š‘Œ"M¤ ¡R¨»ð9³`›d¾ Ïõyd;3û!áN3¸d)ùÖv”RD¾BÄ‹–‚¹™i|×e`h‘‘8hmð}D"I&fâô{wíAJÁE—]JgW®çQ­TRbÙ­]]hm831A¾­u«WµQ«º8ýÒ눔Žc¥‰"½È(ši£ U Nó/çb2$/¢„dd÷Lï~«4ƲÞ.Z†6 µ& ƒ8)´l ‡r©ÄôÔ–eÑÑÙI¾µµá! /P)—xä©§)ÍL3´bˆ¡óÎÃ(—Ë$Iì„CxŒˆ2“§OÇɲ$ Œ1DZãÕk$’i–-]Š”ßóH ¤³YNŒgbl e nÙL¥\áäÉ“Ôj5´Rd²9´RØ€±“'( lÜrétß÷¨Õ«­…,2e3*°¨—± GìÈìfõð€ Ò¥cŸ?o>×ÄÄåd hËaìè^J{Ä™=Îk‡hmï&” ‰"ÕŒ¬s3Sœ™>gÁ®‹r¹‘ ÙõÔNÆGÇè`åšµ ÕZd2…”’T*…[¯ñì3»¨»uÖ¯¦££rÕ¥^¯Žã`Û6m…ªm9O›*"C„¨— Ã&PJkLC‹)HœÛÅ"Ó ,³:–M"ßNyjŒ¹=?FŒí¡;cѹz%ÒI¢¢ ‰D¥#ÆNžÀs}ò-Ú;;ñü !C6•B8vô(‡"›IsÉk_KK[n½N†HË"“ÍH&س{73g&)vt°qÓ v=5Æ ¤E.ŸgfjŠ3'Gh_¹‘zç Êœ¨“ô+‘[”A78×¶ ˆs$Ц‘,ÎË­Ê”´Ð‘æä/~€øº3’¥C$s-_Ķm„´f¦§˜›™!™JÑ·|N"q6 v -yÎLLrèÀ!,K"¤dxã& ­*è”Îd°m‹çöìaäÈzº:Yµv mÅvjµZÌGZ‘J%±$ìÞµ‡‘c#tÒ”O’ê¯ÒÚVDÛy,ËÕJ8w}¦ãÔ"jPˆA4Šô绘6¡cõÙÄÉ•Hå)Ü‹Þó¬\Ö‹•+2[ªbæJ7q”²l|?–:»{(´´¾çá8ùB±±Ó<¹ãQªu—åýËY14ÄS;ŸÄ­×I%8‰éT’‰ñ Ž>Œ_¯±zxËúÂRiŽR©L.—¥îÕ9º÷#ÇF¨Õ]®Ó›ùƒ·üß¼ó;<üÓÿMØ·+•#B¢R-t­Ü˜E%Äâ²Þ 7 )U]j®òyÕ|=™®x2Œ $JÂ0`ÉÐ*–ö/Çõ}¢(N UE!BJfÎL¢"ÅÚ cÙÀuA2Ù,Íýû9ql„žÞ.Þz Ù\Žzµ‚ŠB;v“Òì OïÝËÌÔ4npÅ•W’Ëç¨V*ŒŽŽbY6×¾á:BPlkçêk~‹žž¶^z)[¶làš7\ÇÇþüƒÜsÏOHçsD³¤—­'Xµ˶ÐnµÉ-B€!À ª—r¹gÞçâ ­ åºÏ™r0XBàØ˶ÑÚøJ5òË‚D!ãê[ A­Z#jè*ÉD‚T&ÍØÉS<·w/v"Á%—m¥½£×u©”+HÉD’„ãp`ÿ~FŽ£³»›ÍmæèáÄa€çºÔë7nâ-où¶nÝÚ¤ñ‚dOaYõ7_àèØ$§GOÒ¿f#£UÍ¡½OÓÚ³”žžt½‚°$Z¼0¤îÔ]—Àõ@k,Ù(nÅ98HÐJQóCB¥pBI½T£E)’©$&ˆÎ6댎›IÂyqK …<¥Ù9žÞùåR™•+‡X¹­t3 N¥38¶¤R*³ãá‡È·´qþ¦ôõ-ajê *ŠH:6£cc,é[Æg?û¹sÈ8æ¬$ü<>ó™ÏP(´°oß>>ûÙϲ¶0ƒ4>Çg ~ªˆW©à‡ ?RñëµF6Ê-­ãv× 8cPó@ 17T”•äøØ8R(’™<éL†T*…í8!°¤…ÝÈ”mËbϳ»(Í•0F³bå «×¯gnf¥¶ãËf™›™á‰]»ðÃUkÖ008„Ò1€Q‘ht,Ž:Ì÷MÍ\Eký²5a†,_¾€Ë.»”üà.îþú—yÓþ<«nüÚCª)%B´!JÆ`ÄbÐ^@æqôÒ £"™'ƒB2:]Á‰jäZÚÐÚ`Û6N2A2‘$›Ï£•bjr’c‡!m‹Í_„W¯1;=E­g·ù|žÀ÷Ùõ̳ŒŽÒÞÙÁæK.&‘LQodÊ©L†\6ËéñÓœ;Í_|ôã¼ç=ïAkRê©„B¢(:»@;^âE×¼‘7¾þlÿáß’;ÿ Ú;;1^ cD ~ã#µ&κ˜6¨FEkRjs3Twÿˆüô6¬¤­½ …A@øøž‡ÒšÒÜ£'ŽS¯¹¬9ÿ|ú–Åäøi„drYÒQ’‘cG=5Æ\©ÄªU+Þ°Òܵj!%ù–¾ëñäãã†?~çä=ïyOÓu^‘„zN­'«wérî¾ë{üòÇwñ‘ÿñ=™[ ˜(Œ›£Úœí6š ‹]¬‘Él+3{crû7èKû,\f§Ï`Ù6ŽãÉähoï`ffš‰Óc´ÛY½¾Ëv%‘JQ®”IX’“ÇóÌSO#€^HŸ'ƒsssøžG:Áq,FŽã—ü’+¯¾šøÑ—èïïo.ðWgá†!Žãðúßù}îÝp>oøóÛ8Z[E.!@›³Cq3ù\.kÐJ&ˆF÷1ÜiÑ>tõz¿\Æ…ÖqgB ‰çz(£ééí£­½0ñ\˲ÈfsLŸæÑ'v’°º–,aíºµd²ö;‚ÐÚÞ‰’cG³gÏ^Œ|䦛ùË¿üø ¾ý_Ç1ïz¶m“Ìäðe‚@Ø ‚¿Å$ž×ý[àb •& ìTŽbÏZÛ;ȵDgMPÅí )‡¤§§›Ž®.ª• â,X öîz†£ÓÑÙÅðùô´¶Q©Vqë± žÏˆ¢§ŸÜI¹RaphˆS§ÆèîînòBþx5ôŠ S™`s_=û‘_ÚPA\ê8Q^ -®æµ1qÑjL,{ÖëÍ6ÿ°l›T2E[± Ï‹Õ?!Sã:tßóذy3Ëú—ãº.¥Ò ɶæÈd2ìß·y@’Íæ¹òª«Ÿœ@iêU+›‹˜çÔ©S´¶¶’Éd^6нåS)E®­¿ý/Ê3ïÿ |E¡Q^£1M’~Í—û¢€¬#ÈeR¸žGÅ!VZ”Š{™t†T*Íô™ ʳ³H;V 7n<ŸÖöJ¥F’©éTŠ‘#GØ»o?Žã°nx=]==T*e<7àþûïgÍš5Mp¾ñopÇwÐÚÚÊ÷¾÷½fHžм ±Ü²¬æóçAž,UiQe’""Ä Q -:NîÄ ºój%rH§ƒŽb;QàaéÈw™ñµÐà$lËÆuëŒÁsk´¶wÐÞÕ@†!µjKJ2¹,µJ‰GŸ~š3g¦X»v +W®ÄBÊ¥•J…uëÖ±f͚椔\tÑE¼÷½ïåòË/_d9¯œ…ÖO£) P ¥£{ð:³¤–­¿Ž2a^4QŒ9ˆÚÎÐvº5öÎ…¤„"戴?ò+ –ÊQ.Í!m›îî.:{z0BàÕkx~@:'ÈårøžÇþ}{8rø(ÙLšk¯{N"A¥ZE)…“HPÈç?}š™™ŠÅb“œ×®]ËwÜÁ­·ÞÊñãÇI&“tuu5ÊWãVó /ü·uçoàë·‰+nø8^ûI79Y\ËÈEÃKZcT„DàÛ&L†£Q§ý6žHmä°*TKžG[±Hÿà­íq]ˆF !_Ès|ä=ø °bÕ*ûI$’”Ke P(@+î¿ÿ.¾øbŠÅbsáó‹yòÉ'™˜˜`ûöí¸®K*•ú•‰y!¨óç¶¾žK_÷zÜé©xšN›q.É56--bŽ‘*$¡#°˜Lwn¯2ËœVôu$‰¢ˆ©‰ñ8ë–Ò²Éç³ÌÍÌrøð1¤¬\u«V¯äÐÁÔKeÂ0 “É"=|„ƒ’Éæø­ßùÝE9”’z½ÎÈÈ333tttày§N¢··÷W)îÃÉEn|lï3<½{‰ž ÑAŒB˜8éçêj(5¯ìk´#l|/ÀÛw/³{XÝÛÂ’K±,‹(Œ£Ð÷QQ„6†3ãcLNNÒÙÛǺuÃH!(•+aH:›%Ÿ/pôÈN8Áìì,©tšßûýßç’‹/n.d~™L†;w"¥l..“Éü“¢Ø|ŸOˆ¸¼hëYÂù™:÷Ý‹ì_… ¼¸M´À‚äâáÕ˜ŽT"‡9²ƒåG~̪‰´œí­œ8y’'Ÿ|²ùÁ¥”c¸çž{¨V«lÚ´‰mÛ¶ÑÛÛK±XŒ‹bÛ~U<ô|ž·¢ÖöNþû§oÁ¦š•½añÀÆb€ŒF…6 £5A¶l¦gÅ:2ÙéL¶™÷„aˆïy~n/¾ë2¸ò0€ï$‡„có¡ÿwÝuW3÷Bð×ý×LLL°gÏž}öYZ[[y衇رcŽãœ$Û¶cøe’Êù×®¾p+ïüw¿™>Óèâ¨E&$eÒºATª1¬4JX„Ê ¤$™N“oi¥­£ƒÎž^z—.eÙàÅbù|­"‚ÀÇq …c££üìÞŸ†>W^u7mBiC¥Z —Ï’pžxôQ{ì±E èëëk‚5<<ÌÛßþv^÷º×qÙe—ñÉO~² ÒóÁY˜û¼”¥ÍK:—¬€òL¬Ç7&{_ØÕÀ`âþG4p‘R„A@¨"DC‡n~CÚ€°Ð"iK¦Ò¸Õ2{wïbzzŽUç­dhÅA6³–Öñ vîÜÉW¾ò:;;›5ÖÉ“'yÿûßÏøø8×_=ûØÇpçEk:¥¶mS†(À 0J7'á^ ˜5œnº›]–äнíTêAA¨ Z+„%ãþU:MLž>M"a†Šáó‡`vv­5ÉdŠL&Íè©ìÚµ lXw½K–rÙ¥—199Á7ÞÈ%—\ÂÚµkÙ±c_ýêW¹ñÆY¶l“““´··366ÆÝwßÍÒ¥K9zô(K–,aÿþý\uÕUŒÇ“¯?þ8>ø ·Ür [·n}ÉÂ7!B˜xÈÁ¨«æMsÁèøÉÒxÅö;š>ÕJ:aYuJ§OQ­V°m‡\>‡ëºÔë§Èf3$S)ºû– ´@¢)7¦0Z yª• þâq¦§¦X¹z5Ãë‡9tø0›6m&ŸÏ‘Ïç¸ú꫹ï¾ûH&“ìÝ»—k®¹†·½ím|ó›ßdÅŠ9r„B¡@±XÄ÷ý¦›|ùË_n‚000À=÷ÜÃ\ÐÔ²_ììë+ĨÆLø93im›ƒt£üWÈ( *.ç‰ÐÀ ¤´sdGö²µÍÃ¤Š”æfR’N¥èìîÁrÂ0$ N†l6Gà»xîG&—Ïqå5WShi¡V¯ã¹uºº:›ãïx›6m¢P(P­V‰¢ˆ;3¾¾>^÷º×qùå—“J¥èëëã½ï}/mmmh­¹ùæ›Y»v-®ëòØcqíµ×òÓŸþ´™ÏGÈ…á~þX94@WkŽ ßGÛñxù93&Š#˜‰Cž6‚z,XñH¨vòÔs=T¼C´,¬l޶b;N"ÙhßjœdŠD2I6—eôäI<À\©ÄÀà .¾x så2sssHi‘Ïhooo~ŠË.»Œ­[·rÞyç022ÂøC^óš×pçw²}ûv¾öµ¯që­·6ÁQJÑ××ÇûÞ÷>}ôQŠÅ"ï|ç;¹á†8~üø"Eâù °bÝV¬^ÅÄ£‡0­™¸k{.jÈú‹Æ m^“ÌbÜ2ª\b¤:˪T#J³sql|ˆBK •J‰çöï!^?LäÕQBP©Ö²HŽ ÃÛ¶¹à‚ èéé!‰ýýýDQ´(‹ÖZ/Jv>ü öìØùAPዸqû#î䫯#­1©F 8¾‡–¹¬h•,¾ˆDcÀr^þ0Ú ¥dúÌ8“cc´‹¬ß°BK ûv=”BJZZ ÌLO³ûÙÝ)øümŸgÓ›¸êª«%t³³³;vŒááaöïßÏm·ÝÆ'>ñ ¶mÛ¶(\/ÌŽººº°m»IÌó×›þù9ÒÞ½{)9—¬Ïcá€Ðb 2 ü‹52KÛÁLŒÀñ'X™ñê_F¡k šø[“B ™t×s=EDlØr1mÅ"õzJ%Þy“Ïç°m‹§žx‚Ó§OÓ?4D>“!‘LÑÓ¨±Â0ä†nàOþäO¸âŠ+¸òÊ+¹í¶Ûظq#W_}uÓ5î»ï>*• ×_}c ÉäÙ$vÓØñbÇy«W#º:1~æ]ñ’Ö CÐQãg”&ŒÈO>ËÚÖ:™žAj¡¡|âD#Wñ„ªea”Ks¤Òi†V -«9P(Èf²9|”]»÷aÛ—^v]½=Ë…^ˆmÛm›šjµJ.—{; !˜™á£7ýAØ ;^÷¹ò xã¦j€È(”ÒÔ=)`; œF=6?ƒèz‰„ ó"ðk•2ûwïfltŒþÁAÖ­FHI¹\ŽL$èïéäÄÁÝüøÁÇ98åÒš€1Y¤|xŠ'žx’åƒÍ*||œO~ò“|ç;ßáÁdÛ¶m?~œ·¾õ­¸®KKK £££ÌÎÎrÍ5×`Y–eñÇo߯›ß|=ÿþ?¼ãâÿÜÔ$÷<ø _ N¢ŒjZ\¼¸AÌó­"ˆ"$)JÅrj„A@†Daˆçy÷æ©$ÃèñcÌMOS­TX¿a=›/Þ‚ïû”K%‚0¤½­•K†W“jëâgc‚_N¥7m<ç·P Íw²ji¶©ýô§?å]ïz6là}ï{CCCÜtÓM¼ûÝïFkM>Ÿçúë¯gmÃ]üZ…GöðŽ÷~”SG5ÝjþèdÛŸþ'(»ù1œcNZ˜˜ƒ¤QH!U„l´zнÅ2ÅN<Ï'ŒAᇚ@ʼnã8Ø–ÃÔø8åR¬õ,íÂI$BP*•q]—L:ÍyýKȶ´ñĉÛLá¹8i‰¸NÔutWGNñ¥Ï}š‡ŸÙÏ>ð®½öZººº¨T*lß¾›o¾™Õ«WÓßßϲeËš‹^²dIóü‘îçøLÉAþëmÿ“¯}ñobËo%$]=ÝP}QÈ€ŽçÖ¤u#¬‡gÉZ)„ÔÌfzùÙtÖ]²ŽE.™ÄÁbnún½‚´L9C­\&™ÉÐÙÝK:—CE!õZ ËI µaEÿR–ötsl6äÛãÔD6–#ãÈ¡Œµ$l޾þýs`ÿ>xà>ô¡ñ£ýß÷éèèàxY è‘'Ÿ‚j Î;;¶ï¢ð‘rˇßCk_ܹÝñðC|ý{Û¡«©ý³Cç/ȤMLÌBG­âß*ÄT"Ç¡™ˆC“Ó±SJÒ&=5Êo¯.ÒÒÙIg>C:_ ËQ«{xžG£éíìàÒ †™vßfŒ§ŽL‚™v°„nŽó-’.tHÅ.P÷’T*>õ©O-Š@Ÿþô§9xð Õj•b±È¶mÛ¸âŠ+øâ¿H"‘àÝï~7ߺë‡ÐµI€N§ù¾Åd©ÊÆ5«ð'3‘è 4ç#»3éxÝÂÂH Æ`ŸöР„j€¤¤Q –а$˜Dƒªˆõë ¥—=Q޾¨@¾­ƒ"ò5™t–|6G*aÓ]È`g[yèè,Ûw#¨ùˆLGÊØR_b3‘®Íî$WŸ`vblQøVJqóÍ7/zþå—_ÞÌ‘$†–¤ÅÉ:,YŠzñÈô†MÜyß³Üù¿+@¶vbõ´##LÌ»Æ,1oAæì<~а¢0æ¡ç÷ ž·»Î8Iœñ8púxc¦ –$“°È&, éÅ|–£ûŽrz¢I›TÖŽ£„~ùùå†z­JçyQ¨ßG¹Rmƒn¸eË–111A±XdÅŠ¼å-oàÚ«¯ä[_¿ƒ›¾ð5L¡›dP‹ PR+dÖÁd;QBbTHR{hGocBââ$%(æ·…£U¤ñê¨ÀC‡>&ŠËŒ…„Õgÿ.THÚŠc¡nìŠ6ZQvCæê†Ñi ú Ø’TÆBˆØJ_Ía…!eWRÚ@}÷¢ÆˆŠ”’mÛ¶±råÊEÏÿá¾Ïù‹›Ð¸™<©¤@˜`Ñ|šÝX‚3?V§4B)L¤QÒ¶ŒÀiÓ¸OŽc[¥Y¼Ö,akÒ²9éðòC ƒ§3?ã'ì9Ò¿Ú¤† D•Yª¹<Ýë6S9y˜ZiŽÛo¿Ûo¿\&C*bÛ¶·1¸l)yë¨w®$ÕÚN*ô±"õ"ûML3š›ùÄXE |„NÙ ¬ù÷&Oœ8!ª%Âz+ƒÿw1yqWSsSTÓ²ƒÃ$JSX*¤27Cµü„øÜî0¿ÜñÈ`RÔŽË9K5â_ó–//2ÀvdRItcâm>Ó6Ò&ô=äÁëå¶§›†Š¡•nHš ­ÿƒÆI?…VÓ‚å ¦fmú—‡¹hæ¿Ùµ©*éIJµù7x¿ ù]‚ ²ž×yŒ11-H±p«õËo¬5qWÙèú„…Þ»ÂBß—„ 5pÒ&‘°¬ýIcÈ»VÇg’Q”·kS7 ZèæM)þÍádk`þW¼É0,G‡ùîó½_ZÙÀ à kø*H‚)a%–²ýòU2¨^Ž1ES­à7ëxÞzDU%óÏèTái¡#ƒQ“À´°†¯’Äw¡Jßä­ÅH[˜¸XIгw¨úM¨1Y¥,¡# ”ÖS*ó‰âüÝà e„ŽÒ K\é7ÍŠæÁÑ@؈æu Öøíáÿ$ÉOó6FpxIEND®B`‚lft-3.8/icons/72x72/cloud.png000644 000766 000000 00000014362 12050507714 015620 0ustar00vicwheel000000 000000 ‰PNG  IHDRHHUí³G pHYs.#.#x¥?v OiCCPPhotoshop ICC profilexÚSgTSé=÷ÞôBKˆ€”KoR RB‹€‘&*! Jˆ!¡ÙQÁEEÈ ˆŽŽ€ŒQ, Š Øä!¢Žƒ£ˆŠÊûá{£kÖ¼÷æÍþµ×>ç¬ó³ÏÀ –H3Q5€ ©BàƒÇÄÆáä.@ $p³d!sý#ø~<<+"À¾xÓ ÀM›À0‡ÿêB™\€„Àt‘8K€@zŽB¦@F€˜&S `ËcbãP-`'æÓ€ø™{[”! ‘ eˆDh;¬ÏVŠEX0fKÄ9Ø-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+®ç*x™²<¹$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóýxήÎÎ6޶_-ê¿ÿ"bbãþåÏ«p@át~Ñþ,/³€;€mþ¢%îh^  u÷‹f²@µ éÚWópø~<ß5°j>{‘-¨]cöK'XtÀâ÷ò»oÁÔ(€hƒáÏwÿï?ýG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)¬‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(¼ AÈa!ÚˆbŠX#Ž™…ø!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fº‘;È2‚ü†¼G1”²Q=Ô µC¹¨7„F¢ Ðdt1š ›Ðr´=Œ6¡çЫhÚ>CÇ0Àè3Äl0.ÆÃB±8, “c˱"¬ «Æ°V¬»‰õcϱwEÀ 6wB aAHXLXNØH¨ $4Ú 7 „QÂ'"“¨K´&ºùÄb21‡XH,#Ö/{ˆCÄ7$‰C2'¹I±¤TÒÒFÒnR#é,©›4H#“ÉÚdk²9”, +È…ääÃä3ää!ò[ b@q¤øSâ(RÊjJåå4åe˜2AU£šRݨ¡T5ZB­¡¶R¯Q‡¨4uš9̓IK¥­¢•Óhh÷i¯ètºÝ•N—ÐWÒËéGè—èôw †ƒÇˆg(›gw¯˜L¦Ó‹ÇT071ë˜ç™™oUX*¶*|‘Ê •J•&•*/T©ª¦ªÞª UóUËT©^S}®FU3Sã© Ô–«UªPëSSg©;¨‡ªg¨oT?¤~Yý‰YÃLÃOC¤Q ±_ã¼Æ c³x,!k «†u5Ä&±ÍÙ|v*»˜ý»‹=ª©¡9C3J3W³Ró”f?ã˜qøœtN ç(§—ó~ŠÞï)â)¦4L¹1e\kª–—–X«H«Q«Gë½6®í§¦½E»YûAÇJ'\'GgÎçSÙSݧ §M=:õ®.ªk¥¡»Dw¿n§î˜ž¾^€žLo§Þy½çú}/ýTýmú§õG X³ $Û Î<Å5qo</ÇÛñQC]Ã@C¥a•a—á„‘¹Ñ<£ÕFFŒiÆ\ã$ãmÆmÆ£&&!&KMêMîšRM¹¦)¦;L;LÇÍÌÍ¢ÍÖ™5›=1×2ç›ç›×›ß·`ZxZ,¶¨¶¸eI²äZ¦Yî¶¼n…Z9Y¥XUZ]³F­­%Ö»­»§§¹N“N«žÖgðñ¶É¶©·°åØÛ®¶m¶}agbg·Å®Ã“}º}ý= ‡Ù«Z~s´r:V:ޚΜî?}Åô–é/gXÏÏØ3ã¶Ë)ÄiS›ÓGgg¹sƒóˆ‹‰K‚Ë.—>.›ÆÝȽäJtõq]ázÒõ›³›Âí¨Û¯î6îiî‡ÜŸÌ4Ÿ)žY3sÐÃÈCàQåÑ? Ÿ•0k߬~OCOgµç#/c/‘W­×°·¥wª÷aï>ö>rŸã>ã<7Þ2ÞY_Ì7À·È·ËOÃož_…ßC#ÿdÿzÿѧ€%g‰A[ûøz|!¿Ž?:Ûeö²ÙíAŒ ¹AA‚­‚åÁ­!hÈì­!÷ç˜Î‘Îi…P~èÖÐaæa‹Ã~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DÞ›g1O9¯-J5*>ª.j<Ú7º4º?Æ.fYÌÕXXIlK9.*®6nl¾ßüíó‡ââ ã{˜/È]py¡ÎÂô…§©.,:–@LˆN8”ðA*¨Œ%òw%Ž yÂÂg"/Ñ6шØC\*NòH*Mz’쑼5y$Å3¥,幄'©¼L LÝ›:žšv m2=:½1ƒ’‘qBª!M“¶gêgæfvˬe…²þÅn‹·/•Ék³¬Y- ¶B¦èTZ(×*²geWf¿Í‰Ê9–«ž+Íí̳ÊÛ7œïŸÿíÂá’¶¥†KW-X潬j9²‰Š®Û—Ø(Üxå‡oÊ¿™Ü”´©«Ä¹dÏfÒféæÞ-ž[–ª—æ—n ÙÚ´ ßV´íõöEÛ/—Í(Û»ƒ¶C¹£¿<¸¼e§ÉÎÍ;?T¤TôTúT6îÒݵa×ønÑî{¼ö4ìÕÛ[¼÷ý>ɾÛUUMÕfÕeûIû³÷?®‰ªéø–ûm]­NmqíÇÒý#¶×¹ÔÕÒ=TRÖ+ëGǾþïw- 6 UœÆâ#pDyäé÷ ß÷ :ÚvŒ{¬áÓvg/jBšòšF›Sšû[b[ºOÌ>ÑÖêÞzüGÛœ499â?rýéü§CÏdÏ&žþ¢þË®/~øÕë×Îјѡ—ò—“¿m|¥ýêÀë¯ÛÆÂƾÉx31^ôVûíÁwÜwï£ßOä| (ÿhù±õSЧû“““ÿ˜óüc3-Û cHRMz%€ƒùÿ€éu0ê`:˜o’_ÅFIDATxÚ䜌\ÕuÇ?÷Þ7;»³?ÙõbÖØŽÆ65 ¿¥M¨I ¢¢mÚ(D©h«TJÒ6R«Ò6TÒT%-J¤JU“ 4ªR"5¥”H$Ái~0‰ á‡íµÙµ×^¯÷×Ì›÷î=§Ü7?Ö»`P°‡»ºzO³ófö}÷œï9ç{Ï}FU-PÊ@Ð]œw–ÎZL

2Ðó÷Õùêïÿħxè‹_,±a3IÁ5 .¤ù'fÓìfç,¶øm`ÔÀÆt€s5ïI@ZJÕüÅ®½ãµ‡øößrÁÅÝ®Ò#FU×.óaûĉÅ/k0˜ˆ¬‚Ÿh´å¸gó0m'ÚÆFxpÎrÇ_~æšo}ã›»ÜêÑÞ¤xûÌ|š_3—f”“„ Ѝ4AR M¨:!Óæ Ôë ‹UÎ]5ÌêsGßGž? t'ßgÞ»…Z¼ä ^f¨Ç?¦…^„ZµÆbµŠ1†ùÅê(ÎU€rR„ò< R_¨eä>ÁKÀ‡ª„ßb6=›Ç˜% )Š÷žZ-¥Z­a£žåg{RÂ$÷Aæªuzº>D€‚Úæ¨Ú!FdÑÙР´N­–bŒ%˽ÁÚ. i„÷Aj)"%òа A›¡¬•<œýdÚ‘Âûœ´V§–fëð>Œq€i4yÓ Pr­¨ábM`´c(rPaA¹ÏÉÒŒZša­Ã‹4(ª÷jša ä¹Ç‡@"j§Qt´¡rïɲŒZ–aÇ&–¡-€B ZÏH¬!ó¾åbÀ–¢¤Š÷zæ©gžÄå ÚðÂ6€”4 ”OÞ$M§Åçž,d¹Ç9O-~jD¨ç9™wd>ûPt”§Þ‡èfAp¹GB«6oH©çžÌ²<7Hú ˆÉÖ:Œµy럷(*‚ª¼:€ò8‚Êr R2/ä!a^ ^¿ÜÇ€s ª†éãÇ™›™É0&´5µ ”º¤¯Òª ¢§ÉA|À‹‹+³Ì‚"’Þ ^”<B¯›Õ$¥.ffç˜ßG¯©±eí(­_Ëè9ƒ”’˜Y¨²wršçO05]ftd„J¹tÚ·ã x/KŒ¢ ¨‡Nó‚×ÁÅŒ18—0~p‚¹Ã{ضu=·\w—nÙL©«{9ņŒgöàÁGw³ãéIÊ}C Vá•»\Š+ç•&ñ¶^(Ü+^¤¿hpJ%ÆÂÛÏÇn¹–ßùõ÷`]饯q]\¼ñ".ÞxW<¾‹ÏÿÏãžV õ¾2´H‘xÞ˜Ú8H A *‰>TQymyåäB±½NJ%ŽL%=z€O~àn¾îúÓúøíW]ÆÐÀw~u3ó–¾îrQ œÂ‚4Fl¯JÒ¬–^” ‘Å篞¤ã¿Ã˜XÞ(‚ (kpÆ`¬a±ž1=¹Ÿ¼ëòÓ§1®Ø|½i‘Ï~ãºJcN£ˆ4î7Ô-àÛ\,"A¤°¦W 1ëêyΉãÇHæ0šÅTßZ°%$éf`h„…¹¶®äÖ›®Ußù×¼…‡w³kÿVõW^¾ÄÖ ‚Zè`‘‚ÌÊ.æµ ¬×ÀŬsˆZ&¢>3ɺsºØºiŒ kÎe ¯œX¬1>5îñ)^Ü·ŸÛ?xCC#¯Ú›ß{åf~üü™ØSX‘E ÎMœ‚Y!QÔ"YlÈ­A#qý<,­ª¸¤D5ó¼øÂó¬«Ôù­¯ä†_½š ëÎoÿÚF å™=ûÙ±s7×\ºõ5¡»Ë6œÇšáf«)=]IÃÓW@‡Žj¡S›¢H?ÙÅDQ#Q}VEŠLúçÈ&ŽZšqhïÓ¼ýÍý|ò#·²ùÂM/sE–Ù²qãkVõRé.qhzž®®R\¥Y)?2€Q,Pó9³ 5ku°'UóÕ,gz>e RAc ˆž.çX|€ƒ/<ǶCÜuÇï12|î/<×´Ö0ä2f'_ :;@e`˜¡>,Šˆ`LÌÆ4ÏX˜¯17·ˆá~‰(sÕ:G窀âŒÁÙ]T‹‹^AIJ.arb‚MÖ;ÿý¯ 8ñgïÛÆo=ŸŸì9ÄŸ`ÏÁFV2Ô×Ï=Õ<§ZϨÖjdµDpÖVµ ÅzN"¹•K Ý%GɹXÿjL›NTä *€%­¦èâ4ºyëÖnx]ëܵcc¬ãÆm01ù"_Ûñ8_þߟqäxC}jõ£^«|ŽhŒT=• •žºËôôQ.[{ïyÇUg”¤±fì|þø¶ó¹ä‚uüá??Èž¹EÖ7]*¨Æ¨m– „I™‹…‚6QT¬‹Uó‹SÓÌg8ɹpõc#ƒôt—ÉE92?ÍÄt€¾!u~ù—6300|Fj?ïþ•+¹o Ÿ[þî?˜šg¸¿iûA—fø-%j¢61Ž –‰öÒ›áƒW_ÄÍÛ®æ’M²jhˆr©DZϘ<6ÍÏìãk?ü;ž;Àê‘kÎhìê­›¸ûö›øÐ=÷SéîÂĩšë€ªËIš¶<(¨ ¼ÀçŸfë@Êß|üV~óÝ×YZ8ööÁÈÈ(—lÞÂMïxwÝû_T*Ýg¼Šøw^Á×ô÷?ö ë‡{£zZ¤5+Ë´„ˆ¢±Ü·‡K†r¾ò©séÖKOù¥«FFùÜŸüµ4=+¤Ö¾÷*Üù,i–ã ŠÔ®X6] $" X¦ŽgXOð¹;n{Eà´žîî³ wnÝÀ[ÖŸÇ\5#„X…f-v2@E3QP%óÂÜÑ nÛ~9×]ûk+Öw•—¾ù\jYŽH@µèGh«K’ö$/î5_­²n¨Äï^ÿv:}¬DUð0Ò(T›Ëb- ET™]XdËúÕ¼uÓP,d[êÅɉ¢m×E$D=(M3VRéèx€ªijPäÍlyY&M±¾¤R’йmÒ­qèØ QTYÞæ³d],¶Ü…‚Lǃ3[­³{ÿá¦ê!0“žF{‡mI®QÑA1¥ûŽ- ¾ÞÑ}ïÿöñÔ)¬11“.ä×v ²íQL‰ê~¥Ìc{³{ßDGtïwvRMë$®¥J(K6–¤‚è)YÒÙ÷<øXç‚óð|sç3X[”PTa‰ -ͤE‹ò_(÷ó¥å»?ÝÛqà|ÿ©}üÕW¢^«“Xm…j£³·Q¬ÚvÓ¸þ"”K ˆòÛŸ¾—Ýû';œ‡žxŽÛÿñ>¾xŒ$qq3HœRWJQEÅÇ $xʃf¦¦¹öO¿À¿=¼ó¬æðÌ<Ÿ¹ïa>|÷¿³gÿ¶äpF ·’æDÃKUóZô@G7ÓB8K{™žåÃw}…¯ÿà'Üú®+¸üµŒ ÷ã¬]’už)ب£Ï,ÔØä8ßûé^þûGO±óÙQ^-'8KѤPðKCÒ¥zG+Q-6ÅÞD)VYU×S&xÏßyœ~ð$ëÖŒrÞ9ý$Α½ÓQ1Væj)ãGO°0»"8l)ÁÂ’.2Ú¨EƒÆ`f…bõˆF&&š ùÖ¤· !pp|’ƒûÏ‚ÀγЕ`­•åKYš3ö ´8h‰hß@qÉ<9ä9‹ÚRó’3œ¸zSœ=dÅ!ÒãË2Å¥ÔxC­¹ æ¤ã9NçŸ×æbHãžÍ ¤!&LÚ>;¿Z.ÖÜ¢»¬šÉA|1Cš>š÷Úhe%’n¼A¤uÁ vÞ +/Æ›…Õ´[Ѡ꣋Iq\‘ƒ$@ðAû—$éŽHBË@X¡OÚhä ««+¬(<ÔXåX‚IìZ=ùi*Q°jN| NÙB ±- ^H«„,Eò:ê=ˆ,!¬fMs¶$'y‚ 6ÔŒÏÀ&N Î(6¡xNN)qžÙÒ¡^rТ-MéÔuÚŒæÚHŒƒ‡PÇHwÆ5\,˜7 ³äÕ!P=eóu§€¤ F¢õˆðt…E0]@–|û‘Ù?Üóe¾ÿè#Œ ^ó´E5¦SùòRøhSÅÐ EÔ´Ô³Ó =@Õ°þjñ™„7­Ïûüñ»’Åcl)ÊÖŸ$6:ÊÍëäcÿ™¬ù‚ ¹ººœ»ðMeUúknÕgËÞ÷'‹ÇþÈHîŠ 9ð¼…—·"£ ®$yÿêûóþ±{„8¤ÆmÝžeÐ5®Œq!©Ïm·ÙÂ6T‡5 ‰æc'ÝYåþ]Ò=ð¤¯h˜3L·u»%>…ª‡ø·Aµ‰QëP6­'Tu*@ZÔcΈ`¶°žY`¾‘(6žgoÄWŒøÀ¯…ÎõѼ ,ÇÈÿ‡D›³?˜BŽIEND®B`‚lft-3.8/icons/72x72/firewall_stupid.png000644 000766 000000 00000031444 12050507714 017707 0ustar00vicwheel000000 000000 ‰PNG  IHDRHHUí³G pHYs.#.#x¥?v OiCCPPhotoshop ICC profilexÚSgTSé=÷ÞôBKˆ€”KoR RB‹€‘&*! Jˆ!¡ÙQÁEEÈ ˆŽŽ€ŒQ, Š Øä!¢Žƒ£ˆŠÊûá{£kÖ¼÷æÍþµ×>ç¬ó³ÏÀ –H3Q5€ ©BàƒÇÄÆáä.@ $p³d!sý#ø~<<+"À¾xÓ ÀM›À0‡ÿêB™\€„Àt‘8K€@zŽB¦@F€˜&S `ËcbãP-`'æÓ€ø™{[”! ‘ eˆDh;¬ÏVŠEX0fKÄ9Ø-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+®ç*x™²<¹$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóýxήÎÎ6޶_-ê¿ÿ"bbãþåÏ«p@át~Ñþ,/³€;€mþ¢%îh^  u÷‹f²@µ éÚWópø~<ß5°j>{‘-¨]cöK'XtÀâ÷ò»oÁÔ(€hƒáÏwÿï?ýG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)¬‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(¼ AÈa!ÚˆbŠX#Ž™…ø!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fº‘;È2‚ü†¼G1”²Q=Ô µC¹¨7„F¢ Ðdt1š ›Ðr´=Œ6¡çЫhÚ>CÇ0Àè3Äl0.ÆÃB±8, “c˱"¬ «Æ°V¬»‰õcϱwEÀ 6wB aAHXLXNØH¨ $4Ú 7 „QÂ'"“¨K´&ºùÄb21‡XH,#Ö/{ˆCÄ7$‰C2'¹I±¤TÒÒFÒnR#é,©›4H#“ÉÚdk²9”, +È…ääÃä3ää!ò[ b@q¤øSâ(RÊjJåå4åe˜2AU£šRݨ¡T5ZB­¡¶R¯Q‡¨4uš9̓IK¥­¢•Óhh÷i¯ètºÝ•N—ÐWÒËéGè—èôw †ƒÇˆg(›gw¯˜L¦Ó‹ÇT071ë˜ç™™oUX*¶*|‘Ê •J•&•*/T©ª¦ªÞª UóUËT©^S}®FU3Sã© Ô–«UªPëSSg©;¨‡ªg¨oT?¤~Yý‰YÃLÃOC¤Q ±_ã¼Æ c³x,!k «†u5Ä&±ÍÙ|v*»˜ý»‹=ª©¡9C3J3W³Ró”f?ã˜qøœtN ç(§—ó~ŠÞï)â)¦4L¹1e\kª–—–X«H«Q«Gë½6®í§¦½E»YûAÇJ'\'GgÎçSÙSݧ §M=:õ®.ªk¥¡»Dw¿n§î˜ž¾^€žLo§Þy½çú}/ýTýmú§õG X³ $Û Î<Å5qo</ÇÛñQC]Ã@C¥a•a—á„‘¹Ñ<£ÕFFŒiÆ\ã$ãmÆmÆ£&&!&KMêMîšRM¹¦)¦;L;LÇÍÌÍ¢ÍÖ™5›=1×2ç›ç›×›ß·`ZxZ,¶¨¶¸eI²äZ¦Yî¶¼n…Z9Y¥XUZ]³F­­%Ö»­»§§¹N“N«žÖgðñ¶É¶©·°åØÛ®¶m¶}agbg·Å®Ã“}º}ý= ‡Ù«Z~s´r:V:ޚΜî?}Åô–é/gXÏÏØ3ã¶Ë)ÄiS›ÓGgg¹sƒóˆ‹‰K‚Ë.—>.›ÆÝȽäJtõq]ázÒõ›³›Âí¨Û¯î6îiî‡ÜŸÌ4Ÿ)žY3sÐÃÈCàQåÑ? Ÿ•0k߬~OCOgµç#/c/‘W­×°·¥wª÷aï>ö>rŸã>ã<7Þ2ÞY_Ì7À·È·ËOÃož_…ßC#ÿdÿzÿѧ€%g‰A[ûøz|!¿Ž?:Ûeö²ÙíAŒ ¹AA‚­‚åÁ­!hÈì­!÷ç˜Î‘Îi…P~èÖÐaæa‹Ã~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DÞ›g1O9¯-J5*>ª.j<Ú7º4º?Æ.fYÌÕXXIlK9.*®6nl¾ßüíó‡ââ ã{˜/È]py¡ÎÂô…§©.,:–@LˆN8”ðA*¨Œ%òw%Ž yÂÂg"/Ñ6шØC\*NòH*Mz’쑼5y$Å3¥,幄'©¼L LÝ›:žšv m2=:½1ƒ’‘qBª!M“¶gêgæfvˬe…²þÅn‹·/•Ék³¬Y- ¶B¦èTZ(×*²geWf¿Í‰Ê9–«ž+Íí̳ÊÛ7œïŸÿíÂá’¶¥†KW-X潬j9²‰Š®Û—Ø(Üxå‡oÊ¿™Ü”´©«Ä¹dÏfÒféæÞ-ž[–ª—æ—n ÙÚ´ ßV´íõöEÛ/—Í(Û»ƒ¶C¹£¿<¸¼e§ÉÎÍ;?T¤TôTúT6îÒݵa×ønÑî{¼ö4ìÕÛ[¼÷ý>ɾÛUUMÕfÕeûIû³÷?®‰ªéø–ûm]­NmqíÇÒý#¶×¹ÔÕÒ=TRÖ+ëGǾþïw- 6 UœÆâ#pDyäé÷ ß÷ :ÚvŒ{¬áÓvg/jBšòšF›Sšû[b[ºOÌ>ÑÖêÞzüGÛœ499â?rýéü§CÏdÏ&žþ¢þË®/~øÕë×Îјѡ—ò—“¿m|¥ýêÀë¯ÛÆÂƾÉx31^ôVûíÁwÜwï£ßOä| (ÿhù±õSЧû“““ÿ˜óüc3-Û cHRMz%€ƒùÿ€éu0ê`:˜o’_ÅF(OIDATxÚÜœy˜g}ç?o]}wÏôÜ#ͭúF¶dË’í`âÇ8€ λ,,°}p̵8°˜8aãåYžåIXŽŽõ:€ÙØÇ6¾H ¶%’u£ÑH#Í¡¹gº{º«ºªÞ÷Ý?ªg$Ù2Nv“ì³î~J]’jjª¾ýû}ßßñ–ÐZ€ Ä€¯í;€Áó¥k›B ZÛ¼ÚgXÛ°jà$ «í+Àdm_wâ7@a 5ãXŽ¿}aŸ^(Ô×ö¥ÒzK õå@qîÞ`6¤¥ÑRÃYKˆ'-Cü"È/þÅ_껾rBkÝ4ÕÜ«®â‡·y¡ú­µ ,o0ªÝ¥#¤´RAC6ñåJ©rç{?ù'<ñÝïÚt¯Åªqx‹^ðÉ‚çÿ¶iµè%Œ–°ÿîD≆J‚”¥$J)´Òÿðk;ÿ>´FZDÛžŸß7tÆ}âožº›Þuq3™PBk½0ýP^7¾Pþž0!«AÕÎ(ô9Çý—FkM2•&“¶Ÿ£²¸H*“&‘H‘HňÙ`Ö8@…ù ¾_Å0Ì‹žRœ·£Ïc#„¡Ä4 nÿ—¶?ùÐcûÌ–¦”U;|¾äÛ‹žO̲J£´ZI#X†JÿË0(ZáÄâä›ê˜™*ð?¾÷#~õÄà5¹úR™ ÉTšT&K]¾‘L6K,ždãe[Éf³Õ*¿!qž¹i ZõY,WhnÌÓÒÜô‚`/·–þßCsÑ­Ø!RA¨JéÈ ÿ‘ÑZcÙ6õMÍTËüèû÷ñôÃ?aâôIVt¬$Éà•(ÍNây.BÏôÄ82TüÇ¿ø.[¯z¥Bé×þ*q)B¥p+.åJ!¥r¥ ÓL1«f™/UuÑõ B‹PIB¤µ®þyfÿÏâMÃ4Éå CÉ£?}€gùkFÐÖÞÆÖmW€©$‰DÛq°,‹ù™æçiÞ´‰\¶ŽPkf E*÷âÆ#Ä i4aâº•Š‹!Lª~``)À^² „R+UŽ$”@R)ôyŽªÿ™ŒH)I¶>“Hóâ³ÏðìcpúÈ>ê¸ìòË1„ ÂDÃ$±X*139@¾±™ºº2 q«¥²‹[©¾¶õ,Eg!@×òª¸®‡~ ì%€C©]¥l¹dA ½ÊΉ‡J«1 “úÖvN?Æ÷}›±ãÈ×eèß¼™X,†R 8±–iây.£§‡ñ\—\]= MM„RR©”ÜjÀ¢[Å󪿆‚ÄùH†ž[Åõ|„a†R „ ˆ%’&вçš Œ¬hÉÅ–Ñÿ´a;•«ÓfÏs¿â‰|…±!V­½ÓŽ1yvF'æÔ¾m¨”1L‹Îž^lÛÆó<‚ ™ˆ“° ªÕ*‹^ßóET³  ð=×ó1 “P©%Š:PJ*ž! BB)‘ªõ? 6ºãé,V<ÉàÑÃúÕ£LßG{k [/»‰Ð¯F¿?jÇ æg™™œ`j¦À–+.§µµ…r¥‚ëºh!Èç24×ç0²Íª§T*£‚àuHz‚0Ä÷}\ßÇ0MB)ADiè9€¤¤Rõ± †ç\ìŸÀrtíÏX"…Ê2zzˆO0qd™¸Áúõë°í^¹Œ à “Ëá¹.sÓÓ˜–ÍÚõÑÇŽaÔÜLII"‘¤>›¢®.jè!¬ïÀ0MÊ‹e„ø¨ÆšX CIÕ©ú!– •ÔK^x@ϗĬ_J°FÒÿ·V£–m“Ê·0?9ÁñÇbâð.TYÓ×C<™& Â0ÊmÇ­9;r†J¹B:—¥±¹ú¥08±8–2~æreÉKߎ¯¿‚ò+ÿH¹¯ ƒ?øAˆi†HyŽŸ–’JQ üÐÄ%AX“ñúÿ0½¨™^r†PjR™ ù†FÜ0$ŒÊçÊ!¯ñ’RJe¦‰Òj™xÏB­%5÷Š~Hÿ:w2#w<ÌégÆ)ÒÞÚDó† Ã¥0 Ó²0M·RfdxŒ ¨Ëç©Ëç ÃjÕCkE"•ölöïÛËÂü®çӨ܆þ~æ ET`éLŠÅR‰/ïÁ¯z¬ìêbÅŠVlÛÁu+˜R#Íè úuÒ5€”F©hÿüÀdï&Rj¤VHù¤Ô­^}F!v*ŠN§^~Žñ_ý˜«JsgR›L=‰eCà8ZkB¥ð*eœX‚Ž•+1 ƒªçÏfI¤Rœ>Íäø8Rk¶\¾•R±ÄÈÈår%%ÉT%%G9C6›eóåWH$©V=Ê•E´†ºl #n1H°È×± EìPk¬åìáUA¨4RE,¾´¿|¬ŽˆËNfQ¦ÍøÉÃ?ƒ=šK×õR×ЂïûH†r9².ÌÍ0=5MÅóÙ¼¹ŸT6‹çº„A€eÛ$ ¦''>E„t÷®§³³ Ã2G#ˆÅâØŽÃè™ÎŽ16v–ö+¸êM¿ÁB¡H¥ Ìd"A{>K*“cV7¢1Â×çQ¥–îW"µyAþ<‹QR!%¨š5-dÅ“'ÉÌè ‡ŸÅœ¤-— iÝ0L*•r ƒt:A¥Ra~fòè[»Ž‰‰‰H».H§Ó„2àÀË{˜§«§›U—¬!X,—‰Åâ†A<Ç­”Ù¿ï·ÂÆhll ¸èR©T|Û¶±,‹úlYßÉ^ÝHI$qt€|½0¬£%•B×ê`‰‹»X¨k„¥"VÇ´p2 gÆY8ô(bü-I“¦µ«0ì2 ÑBà81¤ 9ƒçVÉä²445áUýZRñ8BÀ©“'918H*™àÊk®!W_[©†i’L%qb‡dnzŠ|c#›/»”l6Ë—g@k„a’Éd˜™™aúÌ)VoÆmêAjV"’þ‡”[¤FÕ8×25ˆ‹E]‹KåV©5Ò0Q¡bä—Q=±“–¤ÁÊî^béZE'±, a˜4s³3,ÌÍ‹ÇiïìÀvœs*Ø¶Éæ2LON180ˆiÃ`ÃæËÈÖe)Õ¢S"™Ä²LŽ:ÄðЭÍM¬^w õùÊårÄGZ‘L&°Lƒý{÷37;Ëê®6*~H¡´H.W²2˜¦2 ,ÐpñüLEÒ"¬QˆFÔ’ôWº˜Òh¡¢ê³ŽÄ•ˆg(ŒFzœUm˜é<ó…EôB¡öËD¥L‹j5*;4µ´’Íåð}ŸªçaÛ6™l–ññ³ìÞõ<‹—ήNúz{yyÏnÜJ…xÌÁvñ““ 8AµRfí†õttuS­V—Ã{"™ •Nq|`¹Ù9,Óä²Ë·¯¯gÏÞƒ,NÝO˜ÉaÆR¨xŽæUý€¾ …¸0­×€]ÊnŒWdó?`¶ä‘M&ÑÂa •&|Vô®feW'nµJFR†!a ƒ¹é)d(Y׿9*¸.A2•­8z”3§†imkeÛö+I¥ÓTKÈ0À¶LÒ™ …ù9ö>ÌÜÌ,Ïã-oý­(ï*ÃÛ¶‰ÇãŒ9ÉãCࣳƒö+¨ú>ó… ÇdeNc™%&ϧ8sÑЋ׽ËqÐÒ¿ ªh!À |K.Åb9RÞã ¥4ÅJ•ébИB`[ Ó²PJãW}¤¬éÓ'†0¢ìÛ‚òb™°VW‰9ñd‚ñ‘QŽ>Œå8\yÕv›p]—R±„! æÄpl›£G95t’l¿j;ƒÇ™œœbttŒ˜ãÉf0?vŒ¹Ù9úV÷ÑÕÓM(%¥R !±XŒD2‰°S‹‰4[v\K5ÑÈ@àƒa"´Æ0XnkyA@¥êSq]|×¥0Zr+.ÂABƒ’’r5 ;0¨Êä¤$¡ýð\³N«¨™¤!X*n A6›¡0¿ÀÞ=/S,Yµª—îU}(©–Ý$žHb[¥B‘]Ï=K:WÏåW^A,–`øôœDšb¡„Ö×­²Xª°¸XdddŒÞ¾ÒÙ¾ây.–m“N¦˜žšäÔÐIòù:ò ´·´KØ«>hjPMÕWTƒÏ©†2Ò`­©p¡‹Õt‘ªcîÐ L=u/í‰*=«Áüì4¦eaÛ6Édš††Fææf™<;N.ßÀÚí˜–ÍøØNù$×_}”èNÍP,VhÈ7ò÷?ÉßçY·#ž!‘H!cYd,‹¶Ërñ-ÊÇär.v‘l^i%­ZGeÏJ)%¢ÆöBLË"‹SŸ¯ˆ|Þ‰!„`fr‚ÁÁ!ªžGÿÖ­ttuâº.…Â`ªK“L&9z䯀A*•áê7½ Ûq8|`?ï~Ï¿á¹gŸã;÷ÜÃm·ÝÆg?ûY>ò‘pôèQyàظq#ßúÖ·øèG?ÊøC&§&y×»ÞÅæ ëùÜÿ3±Bʱh8±4ÒŠ¡bi2-‘u¼Â’´ŽÒ+­z™¤Å…K龆Ð'e ÒÉ8ŽmFéÇrL#eÔØ3M‹xøÁbYC'Np×]Ìÿêßð¥»>OÝä^ú­q.·ÆXµ°›úý?&vèQ‚0@ £¦åÎÛh¢&…ª‰ñª®ÆR‚ø„NÃn¤1ß@è{˜* ¬ºÌy’r ±Ë´pÝ c§‡ñÜ2u 44· P‘..bÉtŠr©Àó{÷2==úu—°jÕ*ª~@¡PÀó<òùFîùÎw¨¤ºiÓ&ÞùÎw.[Êõ×_ϦM›p]Ã0ÐZãy×\s 7Üp?ùÉOxÏ{ÞÃñ£|ò3Ÿ%Ð?þÑ}äëâhÓcÛöíFž«z85E}A¿7Ò8H­ú5…bÄA”°{/g[æðB@\H26 ‹T‡_ kú”ãiŠ… Ë¢¥¥™¦ÖV´x•2^Õ'‘¤ÓiªžÇÑ#‡:q’T2Á ¿õlÇ¡´¸ˆ”ÛvhÈ'9{ö,_ÿÚרºõrØÏž={¸óÎ;Ù·oäŽ;îˆæ‚Ã0Bàû>ñxœ[n¹…õë×s×]wÕZ8!wÜq‡àÉÇeûÕW“Í¥YXµ’ªÂPê‚lU‡-z©@x±’+:bs-C U+I!R ”Iï!)Ùè °¨Ïç©kh$žˆÈOeÛ$“I2Ù §‡Oqbðù|ž¾Õ«I8&Ž£P(`˜&Ùl–ªçñòž=ŒŽ2::ÆÛßþvÞÿþ÷³fÍJ¥_üâX±bŲZŽ.µl;™LÒÕÕ@¹\FJI6›åÏ¿ú5ÞñŽ!æææÈ8&a`£í(”_X£^géßõÅü®™–Ç2ÀQ!˜:™Á]˜Ä+ͳ $í‘ú™œˆT·ab˜™LŠ…¹yNœ8…aV­^Ã굫<~‚b¡Hø$“) 'O qêäI’©$WîØNoßjúúúÈd2ŒsðàA²Ùì«€y%¹æóy¦¦¦PµÖšR©DC¾ž»ÿìnþà~Ÿu=+È[Ê ‘JòÊB»FÕ&é$BG¢G\¬«!¥^6C%A ‹ªçãy’¦ùC¬m˱¢{¦i!AT«È0DiÍôÄ8SSS4µµ³~ý !(KøA@"•"“ÉrrhˆÑ3g˜ŸŸ'ߨÈ5¿ñŒŽŽáU½¨Jø¾O¥Rá?øÅb‘ééé׬V«ÕenZÒq¦¦&éêêâýï{“ÃÇp3í«V£V¯B‘Õ&ÂÏ· ãÂáY›ŽÞÒI£‡vÑ9ô(«s†é0rê$ÃC'=ÃÜô4ž[A˜‹‹% Ëfû5×°ys?¾_e±¼ˆešdÒi*å2/îÚÅÀÑ#¬èèäÒK7‘ˤ)-.¢µb±Tdzz €žžÇà¶Ûn£ú™B,ËâÀ¼øâ‹Äãq„H)Éd² à-×^Ã>ÝÁ£ Ë@èýÊ·>ÿó Ò ¥%JK´RøO\„ô_¾•Ö¾õ$SiÉÔ²î ‚€ªçqâØaª®KϪ5X–C±XBJE:Æ‚áSÜ8>ˆv\s ÝÝT=”Ä4Mš[š™8;Á‡>ô»üêW¿¢½½mÛ¶-—t—Ê$¯t/€jó@º6R—H$hmm¥0;McG/¸>‚0@ËWoDIºÖò².PÒ5¢Ò²6,R˜R3 b‰ñZÛxI8Æb1ß#‘Ì dˆïW±m›D"ÎÈ™Ž9J2•à7¯{3uõõ”+J‹‹d2i »_x‘CÃüáíȵ×^ËÎ;—Úµkù|þU\´´üøqš››imm]Í0¢I³5k/aèÐ^äèQ¨ ¤®Cè‹´–z)Q½X²ªklŽT‘O*…»‡Rø> µ:ôòÅ* ÂD‰h¤-Oà.9|ð³³ ¬^³ŠÞ¾^|?X¶„\]7âЃ;>D2aû•[™žœäÜ{/_ù¯_áË_þ2ǰ,‹T*EX–E†Ë½,€D"AKK Éd2*Üi½,2™ «.¡å©¿Ã jÀQÁ«»Å2â j «¾˜PDk´ kr[-»›\V¤mòm ”*~âkA 5JI„iDý«D‚0ð™:{DZɆMèîîf~~¥±Xœd2ÁØè8ÀÆ èîëevfŠGÿæaöØÏê5«ùâÿ˜ÞžUÜ÷WÅ=÷ÜÃèè(ËÅb1J¥{öìaëÖ­´µµQ*•.p¿0 i[ÙÅGoýâÁ§øÞ®a‚Ö6ÌWZQí~©m¯‘Íëåa„HH íáç»9j+Úe‰XˆiV(œeq±„eÙ¤3i\×¥R%•J‹Çii_TE±6…Q—ͰX*ñÌ/_dzzšµë.aýúõøaH¡P¤R®ÐØØÀ–-—159Éî—^¢¾>¿ Æàà ===Ë7‹Åxþùçéë룽½}Ùštm +Jtt¬¤£c%_î\Áÿzé)Ia„un(æ<÷º¨’Vº¶8(šMTJb„>a¾“— g<0, +Mjø0Ûë=tŸçMo¾–™Ù9ŽÒÜÜH:“%›Í⻞y–B±È¶+¶qêÔIn½õV&''¹é¦›ÎÚ‹‹‹lß¾îînîºë.6lØ@?B{ì1¤”Üpà ÜrË-|⟠.“ ×˜glæ Ùv”“„¥ñž%jQ -u´ìÕ3 :Œ"˜–µ Wƒ_‰j$fTOQv†Jº•’7H]ÖÄL¥©Ï7`;±Z©@aÇâ8±©tб‘N`¡P »§—5kWÓß¿…-[¶ò ÏsâÄq\·ÌÐà gÇ'éìêàªk®¦­½‡ú<ðú§ŠçyËÖ!¥\æš®®.’É$ôGÄŽ;xæ™g˜œœ¤½½|ÁÁAn»í6Z››è®s˜šq–”!bIi¹¼-‰Æ‹rЊlZ#jm^K¡Ý"²X`xqžÕñÚ°)Ì/DfZ‹lÙ\ŽR©À±£GAlظЫ`X6‡åÆoâ·ûŒŒŒpìØ1~ø1âŽÉÛn|+ÙúzJÅZÛß|{öìæðáÃÌÎÎò|€\­))„Àu]Çá3Ÿù ßüæ7ñ<_üâ|üãgÓ¦M=z”;3£GÒÝÖÄ×v>Z|B†òk÷Y»_©^ÃÅÐç²¶…‘ÙÅÓh%àô!r ôÕtn¸§6`¹TþÐ*2ÿÙé ¦ÆÇ©ÏçÙØßO6—ãȽXZÓÕÕÅ®];¹êª«Ø±ýJ®¾ú*6nÜȾ½{8vü8=Ý]¤R)öíÛÏæÍ—ñØcqòäI>÷¹ÏñýïŸO~ò“T«Ub±±X ×uééé!N“ÏçinnfzzšžžÖ®]Ë׿þu”R\ó©OÐdy0~.¹F`aµª?X_6Ž%$.bAK‚é<7Ó–ž†Ó/±*éÑÛÕA¶yŠH(B`ØÉD ×s™Å÷Cú/ßF}>O¥RYŽ.ÉTж¶Vžøù£<ýÔÓüêïÿžÎÎN6oÞŒRšÏ|æ?ð7ó0ù|ÅB‘/|á tt¬dÍš5lݺ•[o½•ßû½ßãÞ{ï¥P(ðùÏžJ¥I‡\Ž‘‘n¿ýv„”ËeŽ?Îý÷ßÀ¿~Ï{x뛯á'û å_¾ù7i)>ôÇÐÍ}hÖ4Rm‰®x¥’V T*¬mQR§ƒÌÔ~¶ÕUXÙÙE9Œž9ÃØ™aÎŽŒ016ÊôÙqÆFÎ0|b€îÞ>Ré4¥b†$“IRÉ'‡NòÔã37¿À7¾ƒ¹¹yæççÐZóâ‹/ð±}Œÿø~Nœ8ÅG?ö1::V.k§¦¦&nºé&zè!º»»ùéOÊÓO?M2™ ›Í211Á»Þõ.Ö­[‡RŠ|ÖÖVî¼óN’É$c“³03FÃôn¬ÒüýÛùïýM81°4æñ* 2.t1yÿÔ€ªº¤2Yz7l¥±uùæfòMMdëò$S)ìZÚ122B¾±‰žUkRRõ<,Û&—Ë19>Æþ‡™/”è[µŠ·¾í­<õ‹§øîwÿ’™™9„ìÞ½›?ù“?aË–-|ûÛßæ¦›~‡ýû÷óÜsÏñ©O}ŠB¡ÀÍ7ßÌàà Û¶mãºë®ã+_ùÊòÕ·´´099É7¾ñ ¾ÿýïãû>o{ÛÛøÒ—¾D}}='O"ßÞÉï¿ç:>ô›—Ñ¿ãZ>õ‰OÐ4æ€@Ö8X^Ð2ÎKµÉ©ó¬("¥¢â¹„aˆ,Û!™J‘­¯'ßÔDóŠ•477á8VT˜‚D2‰ï¹ì~áv=·‹ö+xËoÝÀŠŽ”R´¶4ñô/žæî/ÞÅÝÏóá÷oùô§>I±XâÝï~7¼üòËÈùìm$ Éw¾þüá§ïà¥Ý»©¯¯§¯¯ 6pðàA:::¸ë®»(‹lÙ²…Ûn»žžžxâ ž|òIVvtòï|‡¼ï½|ïÞñó]I!taÀE椅Ž8ÈÐC‡2ÄP%#KjËçHæ›ð¼*A(ñÃj ðeT"±mË´™™˜ X˜'žH°²«ÛqBP(q]—d"Á𮤲uì›ðŠ÷¢V´rÏC»¸ç‡±¦)Á7¿z7W_y%§†‡¹jÇ:ºVÐzŵüòÙ!®üàgX×ÝÆñ³%f§§¹ü²~^|ñEššš¸ï¾û¸ýöÛÙ¹s'7Üp+W®dhhˆÕ«WÓÛÛË#"(^P³¶.t±°FÔ5²–a(æ“m<=M—”m’ŽÅ°1Y˜Å­”0,‡™éiÊÅ"±d’¦–6é42 ¨”˘¶ƒR𾮕¬lmáÔ|ÀŸft²±fÒAÅëѺ‘ã““\ãïòÈÿÿí«_\l÷ógf ­Lƒ£ô]Åßù;:ÿŽë¯ì'ð*¼ÿCæg?ûÙiV¹\æþûïçŽ;îàï|'«V­â?øÙ\Ž3Rbæë‘މð|P!B…,¶» ÚBÉèSX€tÒ Î… NÍF¬e0,3c¼}mž\SM™$‰L–D:M¹âáyU Ã@iE[S#;.ÝÀ¬+y`ß8/ME#) S„è0¤VK„öÂTŒw|ânþýs{Y»ª—ÿùÓÇ©H3¦H0¢ëêZÙ58ÁáÓOqíÚƒ´55pùŽ«©ohBkM±X$›ÍróÍ7sóÍ7ðÈ#p÷Ýwóͯº¦â¹"e¯„XÚP!B˜hí±Î {(P>BÖ@’>†–h¦ 1 ÐNªˆê×~®Cašö0K¦¾$¬*’‰™Tš¸cÑ’Mb¥êxöä“âä‘“œ,@Ì"ž²¢(ñëÖO¨@KZ4 4ˆÀ»ø±~ˆ™0ðUOÉÁAÿÙC¼÷ƒ¢êû$bq” iilà‰ÇN&›ã–ßÿžÄîíÔ>J+„ Ñ: z NÌÉÒ²p” ^é{¨ Š£4ã‚&›¸ !f$T­]¢•¤è,T4c³ Ô4Xñ¤‰‘•þC^âó¸b¦:”’l¾t#ûóGhlkç–|˜ƒÇŽ(ÍÊÞÕ<ýw¿ä»÷þî:„ÝÓ…º †”èP"B ËÔSh ké99¶e†æñêRaT“6–'^EÝù‚°—füŒóÖ-‘ß?ãË® =¼ë*»’ÿùäNþ×ß>Ï鑳Pq!߇dŠXs VàÖ …5a,CU„Š[ Ì%ó¦Îœ9# •:Ð:šÂúÿðenEbš3A€ Bbuu˜ù|mÆÈÀ4"pYšˆ*²¥%„>8² Â|ñäs/‰ÿúÕïë¿ßµ³'&Ê'µiŸ£ñÿò‘/ÿBO©U1”T Ð ¿¾ëãÚN¼Œ’³‚Îm‚™y‹®Î Îýg«<ó9iØQÙZkÞØ¯¥‰2…V!FP%ȶ=dÛ¿.d € Ç1;®˜Öd\³ñ¿ÄÂ0c•gþ@¨ÀD-?”â ŒQTÄ´UiùYiûPÒæO˜®³€è¬f aJ«Z¼Îð¯Eë|mÄøæc¯¸±(c™}*žÝ+T¨Ñ²b ˜æ†ë ¢§P%ˆò–Ó†%´ašDÑÓyå°ç ]«™B… (Ô¬§”–„âÒÓà &… µ  jZI¼1Iµh^ʵOþ÷#C忚o¨£IEND®B`‚lft-3.8/icons/72x72/router.png000644 000766 000000 00000024025 12050507714 016027 0ustar00vicwheel000000 000000 ‰PNG  IHDRHHUí³G pHYs.#.#x¥?v OiCCPPhotoshop ICC profilexÚSgTSé=÷ÞôBKˆ€”KoR RB‹€‘&*! Jˆ!¡ÙQÁEEÈ ˆŽŽ€ŒQ, Š Øä!¢Žƒ£ˆŠÊûá{£kÖ¼÷æÍþµ×>ç¬ó³ÏÀ –H3Q5€ ©BàƒÇÄÆáä.@ $p³d!sý#ø~<<+"À¾xÓ ÀM›À0‡ÿêB™\€„Àt‘8K€@zŽB¦@F€˜&S `ËcbãP-`'æÓ€ø™{[”! ‘ eˆDh;¬ÏVŠEX0fKÄ9Ø-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+®ç*x™²<¹$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóýxήÎÎ6޶_-ê¿ÿ"bbãþåÏ«p@át~Ñþ,/³€;€mþ¢%îh^  u÷‹f²@µ éÚWópø~<ß5°j>{‘-¨]cöK'XtÀâ÷ò»oÁÔ(€hƒáÏwÿï?ýG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)¬‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(¼ AÈa!ÚˆbŠX#Ž™…ø!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fº‘;È2‚ü†¼G1”²Q=Ô µC¹¨7„F¢ Ðdt1š ›Ðr´=Œ6¡çЫhÚ>CÇ0Àè3Äl0.ÆÃB±8, “c˱"¬ «Æ°V¬»‰õcϱwEÀ 6wB aAHXLXNØH¨ $4Ú 7 „QÂ'"“¨K´&ºùÄb21‡XH,#Ö/{ˆCÄ7$‰C2'¹I±¤TÒÒFÒnR#é,©›4H#“ÉÚdk²9”, +È…ääÃä3ää!ò[ b@q¤øSâ(RÊjJåå4åe˜2AU£šRݨ¡T5ZB­¡¶R¯Q‡¨4uš9̓IK¥­¢•Óhh÷i¯ètºÝ•N—ÐWÒËéGè—èôw †ƒÇˆg(›gw¯˜L¦Ó‹ÇT071ë˜ç™™oUX*¶*|‘Ê •J•&•*/T©ª¦ªÞª UóUËT©^S}®FU3Sã© Ô–«UªPëSSg©;¨‡ªg¨oT?¤~Yý‰YÃLÃOC¤Q ±_ã¼Æ c³x,!k «†u5Ä&±ÍÙ|v*»˜ý»‹=ª©¡9C3J3W³Ró”f?ã˜qøœtN ç(§—ó~ŠÞï)â)¦4L¹1e\kª–—–X«H«Q«Gë½6®í§¦½E»YûAÇJ'\'GgÎçSÙSݧ §M=:õ®.ªk¥¡»Dw¿n§î˜ž¾^€žLo§Þy½çú}/ýTýmú§õG X³ $Û Î<Å5qo</ÇÛñQC]Ã@C¥a•a—á„‘¹Ñ<£ÕFFŒiÆ\ã$ãmÆmÆ£&&!&KMêMîšRM¹¦)¦;L;LÇÍÌÍ¢ÍÖ™5›=1×2ç›ç›×›ß·`ZxZ,¶¨¶¸eI²äZ¦Yî¶¼n…Z9Y¥XUZ]³F­­%Ö»­»§§¹N“N«žÖgðñ¶É¶©·°åØÛ®¶m¶}agbg·Å®Ã“}º}ý= ‡Ù«Z~s´r:V:ޚΜî?}Åô–é/gXÏÏØ3ã¶Ë)ÄiS›ÓGgg¹sƒóˆ‹‰K‚Ë.—>.›ÆÝȽäJtõq]ázÒõ›³›Âí¨Û¯î6îiî‡ÜŸÌ4Ÿ)žY3sÐÃÈCàQåÑ? Ÿ•0k߬~OCOgµç#/c/‘W­×°·¥wª÷aï>ö>rŸã>ã<7Þ2ÞY_Ì7À·È·ËOÃož_…ßC#ÿdÿzÿѧ€%g‰A[ûøz|!¿Ž?:Ûeö²ÙíAŒ ¹AA‚­‚åÁ­!hÈì­!÷ç˜Î‘Îi…P~èÖÐaæa‹Ã~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DÞ›g1O9¯-J5*>ª.j<Ú7º4º?Æ.fYÌÕXXIlK9.*®6nl¾ßüíó‡ââ ã{˜/È]py¡ÎÂô…§©.,:–@LˆN8”ðA*¨Œ%òw%Ž yÂÂg"/Ñ6шØC\*NòH*Mz’쑼5y$Å3¥,幄'©¼L LÝ›:žšv m2=:½1ƒ’‘qBª!M“¶gêgæfvˬe…²þÅn‹·/•Ék³¬Y- ¶B¦èTZ(×*²geWf¿Í‰Ê9–«ž+Íí̳ÊÛ7œïŸÿíÂá’¶¥†KW-X潬j9²‰Š®Û—Ø(Üxå‡oÊ¿™Ü”´©«Ä¹dÏfÒféæÞ-ž[–ª—æ—n ÙÚ´ ßV´íõöEÛ/—Í(Û»ƒ¶C¹£¿<¸¼e§ÉÎÍ;?T¤TôTúT6îÒݵa×ønÑî{¼ö4ìÕÛ[¼÷ý>ɾÛUUMÕfÕeûIû³÷?®‰ªéø–ûm]­NmqíÇÒý#¶×¹ÔÕÒ=TRÖ+ëGǾþïw- 6 UœÆâ#pDyäé÷ ß÷ :ÚvŒ{¬áÓvg/jBšòšF›Sšû[b[ºOÌ>ÑÖêÞzüGÛœ499â?rýéü§CÏdÏ&žþ¢þË®/~øÕë×Îјѡ—ò—“¿m|¥ýêÀë¯ÛÆÂƾÉx31^ôVûíÁwÜwï£ßOä| (ÿhù±õSЧû“““ÿ˜óüc3-Û cHRMz%€ƒùÿ€éu0ê`:˜o’_ÅF@IDATxÚäœy˜g}ç?o}÷Ü3º,itŒdɇdC°C,0ƒÛ0 !d³˜ÍÈCvÉòd“ÍfŸ%aC6›'Y6ðdIHÀ¶ÁwŒÀàK–d{tK¶F–f¦çê»»ªÞcÿ¨îžiDv³Ykßç©§êé÷[¿ß÷w¾%Œ1à>­c°¸8‡im@ÐÚš­½lm8-pR@È·Ž5ªu¬».|1$[ „€h G8žxv¿i”z[ÇJ³3Ræj X<á"“!hƒQ&!u,ñ!„¨ßþÂ7¿ùù?CcúÁ–zõÔCùñ¦Ô·c,-`¹È¨5ÚÄH­£þ\ò?Õ+õϾÿSÿžG¾ô%—uc8-®q€fµ}ªÔ o±m «uÓÆ¨¸”«3'ƒŒ…q›FüúþGxìwÝš°SI-Œ1«;”j×ÙbíK 1²tëŠÂ,*îëyˆ®ÓÅFRaÛŸüß{ã£÷à~{x0í´~¾PiFo,7C|ÇAiƒ6º’AÐê"AHt©‚‚ ¤Z«34ÐÇðÐàDÑ> á´¿¥´«€È•( Rk´6±š‹Ä"RH­iÔÔêu„TjõAl;øNË”G¡ÒAµI©RÅcZ„¿Èlæõ,DR†!0IJm¤R â0t ¥¨!Ž%¥\T±×z­§r.Z”RH ¤" ›È0DFZF(%[ª¬ÁÄ÷%„…%l,ÇÁñ\ÇÃñ|\ÏDz\ÇÆ¶ìØ1KÁûGeËY”R„’ ”8v„ÒÊ´ŸY@†f¨ðI¨R¶Hú5X˲b•­ QP¯–©•K4ª%j 3Ôf뢠j6Qa-#в#)ñ“X×r„ëáx /‰“L’Ìôí&ÙÓG"#•ë!‘NãØNK"4F«°×èZËHFŠ0’ضD©E~ꤴ&ˆ"BiJE$UëÉ.Ž °, Ëv‹FÒ¨-P]˜£T8M¥0I­8KXžCȃo R©=‰$‰¾ž×K2™ÄOøØ–çy8ŽCÈH¢”¢ÙlÒh4‚&AP%˜›¡rö8sÆB#°üÉž!’=ä†W‘\I*×G"™Â²P­Õ¢¡¹@˜$¥ŠÕLiìH¢ÕblÞ!ˆ$¡T„‘"j“ô¹RcYX–ƒ4†z©D±p–…ÓÇ)OMÐ,Î"‚iße¨§‡Më"ßÓCo_?™LÏóð|ÇqqÛ¶±,AIšaHÂó°-ѱù¤$ CÂ0$Êåóós”‹%ff ,,¨LŸdþ°…•Ì’!;²ŽžÕ£dûñ<ŒZêBEñf[eôùdŒ&”šH©–™7(­:*-,m»H :7ËìÄ1æO¤V8…5éÉfؼ~5ëÖ²æ’Kèï ›Íâz. 0-Cë˜Û”R„as‰%xfß~Ž9Â-︉¾Þ>Â0À²,\×Å÷ý1¿™–JÖk5Êå2…™§OâÌé fÎcúÔ!fÆ{H¯Ü@ﺭäW®#‘HaTˆV꜀”TH­‰´ÆQ2Ž Äy#)¥FjC¤J)€X•„C¹TbæäAfî#œ=MÆsؾv-[·]ÆÆM›"™Lv&†!µz)c•ÑZw&àÚÚq?q’ïîÞMu~ŽS[¶ÐÛÓG³&¶t/¶|¶mã8~"ÁÊl–ÕkÖpÅWR.—9{ö Çã䉣ÌÛCõ•—˜[±ÞÍW‘_5Šç8è(ŠB‡uì+”z ÏwÒF©œø…6 —@jæ^9Ìô‹OÑ8s”¾”ÏŽW°ãêkÛB:FJI½^gff†(Š:`´'fÛ6¶m/þ±mc;‡N¾ÌîÝ»ÑÍ}==¼øâ lÛL6›¡Ùl^ c:èHZ>ŸgppmÛ¶3==ÍÁñq¾ô…‰qÎNž¤I÷aÜ4R×q4 –q  ,A¹8OéØzo{û;Ù¾}3s³™lKteð „šmY¸žOµZááÄ÷<Þzà ¤gYÚ–Ìr]*åZ)zzzZVE!„Àqœ ž—ð}ÎÎ/ðW߸‡Œcó‹ûX`+Õ DÏ ”Á‚f¢á§o½•3¯¾ÊË_ }v¹ö ±¿ÖršÏW1ÀA½pJÓlÚ¾W_…ffçyîÀ0ÐÓ“'J“J%Iø~ì{©„OÒõH¦Rx¶Í·ï¿Z­Æ»ßu3¹l–z£qž !pm›Ë¶na°'ÏÊU«ÐZã8ÎyjÕ®ãàù>'Ïœåoïý;ž{òIÞóÓ·ÐßßOµVCFF´6h­‰”$ BAÆM&  úxË 70qòÎüΊ1ŠŠ %j¬s¢ùF ™©¤ç&IÙ‚c[ÈçóèVŒvß=÷`”$“ËaÛ¶ãà8.¶c“H&ɤÓä{û(ÎÏÑß߇1†¿ôªÕ wÜq¹Tš( —k›ÌßxíH&SÔ õ:®ë.«"¶eáù>‡_>ÅWÿæk¼|pœÕÃC‡OœàôäÅb‘F£ÑºVƒZ­J­V£X*QšŸç#ú oë[i4šlܸ‘áÕk˜;ó éê󪇠ÚD/ÇAÚŠˆÆô$‰J‘\¾ß÷©V«Œ p÷Ï}Çq:dµV¥\*S*•¨×ëÔŠ ,LO¡”Âó<„dÒ)v?þ8Qð/?òsd2™Žs×-I®ãÆž¶”DZm”1ü`ï>î¹÷^fNŸbÅÐŽëräè^:|˜ùb E` žçâ{>¾çâº.žmÑ›N’K§I$“4šM²Ù–ë1S˜&£ãlb§(–á ø3‹J¥L©TŒ3QD>—ã–[oŲ¬8ÂoÅS‘”ÈV²ÉC³Ùäký5öí߇뺤Óin¼qWíÜI*•ì8ÝR$¥¢°PĶmÒ¾‡kÛçY¢˜l\Ëfâåœ9~”¡ÁÁŽõêííeË–-ä²Y\×%›Í’ËåÈd3¤Si|ßÇ÷}\Ïömæçç±m‹FR®VÁ€ïº˜”Ô¢_ 6H­É%“Haqüøq‚ èX“R©Ô ڦ׶ã4E&“!•L2_.S¬Õh4lܸ‘]»vqÝuבÏç™››#Š¢Ø,·†ïy” ¾vÏ=Ìœ=Ë/}ü¹dõjjõú²Vϱ,>ò/>Àµ;wòðÃ3>>NEŒŒŒð»îbíºuT*„|z{k{åõz­5©T’©™—™šš"áûØ–…Ö uNút‰I¥q\‡d2Á¾}û8yò$W_}5…Ba‰KßöOb ãÉ©) …iÞrýõüÌÏþ,ëׯïÄg´}–sœJÛq˜›šbnj’t2‰çût Œ1$’)n¸á¶oßΣ>Ê·¾õ-&''™›cxd„jµº˜n Ú†!—É`—=Ï?ÏÔ«¯2¶zlÙI´-ëI”ÖËÂq\¦¦§øú׿Áe—_Noo/ÕjõGz³JkR¾Ï]wÞÉõ×_Ïðð0óóó„aØá¤nUBày¦VÃó<Ö®[G.—‹9é »‡Rй¹9òù<úЇ¸ôÒKùæ7¿I±Xì±T5%÷ê¹.©tŠï?€‡|6q·“Uí*ÄrÁªÒH)éééÁÍöñøã±fÝZ>ññOÐë¸ÔêµÎ ´ŸhÇ‹VоÞ^n¾ùfŒ1 …e'+Û¶I%¤S)JµõFþ\–t:M*™D«¸ªÒ}ýs=ãJ¥B£Ñ`ÇŽ¬\¹’z½N½^_â;{®çº¤R)^EFhí£ÌÒú_—³¡ÑZQ©TY¿~¿ò+¿ÂÀÀÿí¿þ1Ÿÿ¨Gýýý$|׳í}û8‘HEAt¾kG÷Îr]J%^8r”ãgÎ2S*S(Ì £Ø…´Fµ$­}^÷ÖæÁ¶µ«T*ô÷÷³bÅ Œ1{é¾7ÏsÉg2¤3ž?Äoþöo±ûÛßâ-?ù“|úÓŸ&›ÉR©Vâ2»VR1P*Nš-Ì—¹ãŽ;Bðo~áøÓ/~‘‰‰ >ùK¿ÄŽíÛ ‚ ˆË#Ë<©n'ïÜ„W2™d¾\á _ü#ÎLN²jÕjJ Lù¿ÿÈ™é;¶oãý·ß†í8H)ÿÁH>Š¢XBZ…nÕ÷\‡d2I¹pßÃòG_øC>÷,o~ã›øÜç>G¾¯ÏÿÞo‘Ú¶% JAW:¨ÛŠ-VªÕ*år™Ûo¿ øÝÏ}Žo~ãë;z”ŸûèÝÜúî›éï#l„a¸H„¯!%¡”bë¦M¼s×.~õ3Ÿ¡ðÊË pvjŠç¾øGär9®¿j=½½ÔϱfÿеÛ*ÜŽÓ|ßGÃã'øÊWÿН}å+4‹sÜúî[øÌ¯þ*c[¶ðø“OR«×éõõ©Oqç{ßK­ó]·ßt¡aµâ-×qp]Ëv¨5›üásÓ;Þ±L"ö•Ñh£–wÑÄõ ³|“B2™äî»ïæío;Ü?=ô Ï=ý~øý'Y½~=Û/¿’W]Í—_Æ¥›72<0@òœdšiY&m JJ.¹ä>ññóéÏ|†w¾óüüÏÿ<a @«;"oIÉ’ÄPmLL¼ÊK‡ñüóûÙ»wì§8S`x Ÿ»n¿›ßýnÞvãôöö.c[~1¥ã–ÎåS®1@º«Ô³ÜX·nŸøä'yïûÞÇîÝ»yìÑGxæ™gxøÞ¯óÈý÷Ñ;4Äè¦Í¬[?Êå—mcãÆô÷ö²zå †ðl±¤ùú}ï?–e±k×®ŽÄ$‰eÿ».%g&§935ÅôÌ áÐჼ|ì8¯œö<÷{÷ìa|ü%ï}–îþ{îOgð’)r==¬]¿ž‘‘Ò™ ¹|ù\žÞÞ<ýýô¬\ÍžCGiA'7ÅR™ù…"¥b‘b¹H¹Tâì«gxõôA­J¨0`¨¯—+6ŽrÅ•WpÕÕW³sçUlÙ²å5vºšV•ØŽóñ:n ËU5”ŠkB–e'ÎŽãpÍ5×pÍ5ׯ¼ò ããã¼|ò$ãããœ>=Aq¡ÈÑ}{ùa©DI,ÛÁv\×ËÂu½V©IvŒŽV%%FI„Ñ$“ úú¸¤¯—Í£ŒŽŽ²eËVF7làÒK/eåÊ•KJK¯eÔë ¤”7Gk–ÅŒêÄWêþǾï366ÆØØÕj•R©Äìì,§Nb~nŽr¹ÌÜÜ,¥b‰r¹L³Ù £N’ßqâz™ë¸d²r¹ù\޾¾~rù<ƒƒ¬^½šþþ~òùüÕñµǶ°[GÓêa¹¤}§u¤U"6ú¿¹>“ÉÉdXµjW\qÅ’ïÚµö¶{ÐþÑò¸Û…vÙùŸjø‰–í •Â 0F!.TöAŒ6q6îGÔ£þOŒvªöŸ{X–Eq‡+ ´6Ø]Áªµ¤/ßhÇ¢P(pðà8ÿ?ŒrµJ£QG†!V'Ý!Î VÑ ~"IÐhòøãуhÓ?x ¡5=¹,7_-Í›–éì ÙÞ~|à~þöÞ{/j€¾ô×ÍÃ÷݈Mc¤‡Vͳ¬ÉF~ ª-®øÍÏ~–¯~ýë0óµŸÿÒ_ðû·ðÆ®ý)N”4aµ²è>ž›0‹—¼Ûevp›­€âä¿ñk¿Æ‹/äî»?Ê誕¯k`4ðØSÏðå/™Ç¸Ÿ¡´Ç-w~€ o„Çöƒ ¶ÇŒçÅb;¨Qs{8;´“±LšÙWOñ•?ýžyêûÜõÁqË»ÞͪÁþ×0°÷ÅqþöÞ{yàž{(L¼ÌöÑu¼ýæwQ¾Œ‡ž:L£8Vì).¬sÑ ”xÕJâö\Ζü ýý/sìø~ç³¿Î½ßø7¼ím\ýõ\±};Yßû˜‰Â ?Ü·Ý»¿Ë÷žx‚‰cGêÉqëoeûµ×qÚæÞ§0=ql ¡"ŒRt79KÍ|+1 Y/r$LPﻄ훆¸zd …Ó'yù¥¼¸w/óÕ¯rÙ•Wòæë®c玌®[Ë@.ûÏ.)§ÏNqäÄ ž~öY~øôÓ‰ÒÌ ý¹»Þx —î¸oåFž*„|çÀ*³sà€0cº–èŠóÒtÜ·,´Æ6Y/sª^e>ŸgSÿÖo[ÁŠuJ…3œ=;É÷ú6O>þýÃ+غ};6mdㆠlݺ•Ár™ =éÔ?É"ŦT+*Õ gÎ2~è'Oœäè‘#;|ˆÊÜ,ŽÑ¬Z1Ì›n¸žµ›ÆHެçdÍæÏMpü•3†àÙ±ç¬$hÕ¥bbkÿ@+0 V’Êì4Ï—|NõåÙ4°žK¶®åòÂâ óÓg)fxæñGØýð·If² Ë÷084ÄúÑõ¬\½†t*E:¢¯·—\.K&!™Lâ´c˲:@¶×‰H%©Õj”+UJåÅR™z£ÎÂB‘‰S§˜˜ˆã»Òüç¬ó³ÏÀ –H3Q5€ ©BàƒÇÄÆáä.@ $p³d!sý#ø~<<+"À¾xÓ ÀM›À0‡ÿêB™\€„Àt‘8K€@zŽB¦@F€˜&S `ËcbãP-`'æÓ€ø™{[”! ‘ eˆDh;¬ÏVŠEX0fKÄ9Ø-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+®ç*x™²<¹$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóýxήÎÎ6޶_-ê¿ÿ"bbãþåÏ«p@át~Ñþ,/³€;€mþ¢%îh^  u÷‹f²@µ éÚWópø~<ß5°j>{‘-¨]cöK'XtÀâ÷ò»oÁÔ(€hƒáÏwÿï?ýG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)¬‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(¼ AÈa!ÚˆbŠX#Ž™…ø!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fº‘;È2‚ü†¼G1”²Q=Ô µC¹¨7„F¢ Ðdt1š ›Ðr´=Œ6¡çЫhÚ>CÇ0Àè3Äl0.ÆÃB±8, “c˱"¬ «Æ°V¬»‰õcϱwEÀ 6wB aAHXLXNØH¨ $4Ú 7 „QÂ'"“¨K´&ºùÄb21‡XH,#Ö/{ˆCÄ7$‰C2'¹I±¤TÒÒFÒnR#é,©›4H#“ÉÚdk²9”, +È…ääÃä3ää!ò[ b@q¤øSâ(RÊjJåå4åe˜2AU£šRݨ¡T5ZB­¡¶R¯Q‡¨4uš9̓IK¥­¢•Óhh÷i¯ètºÝ•N—ÐWÒËéGè—èôw †ƒÇˆg(›gw¯˜L¦Ó‹ÇT071ë˜ç™™oUX*¶*|‘Ê •J•&•*/T©ª¦ªÞª UóUËT©^S}®FU3Sã© Ô–«UªPëSSg©;¨‡ªg¨oT?¤~Yý‰YÃLÃOC¤Q ±_ã¼Æ c³x,!k «†u5Ä&±ÍÙ|v*»˜ý»‹=ª©¡9C3J3W³Ró”f?ã˜qøœtN ç(§—ó~ŠÞï)â)¦4L¹1e\kª–—–X«H«Q«Gë½6®í§¦½E»YûAÇJ'\'GgÎçSÙSݧ §M=:õ®.ªk¥¡»Dw¿n§î˜ž¾^€žLo§Þy½çú}/ýTýmú§õG X³ $Û Î<Å5qo</ÇÛñQC]Ã@C¥a•a—á„‘¹Ñ<£ÕFFŒiÆ\ã$ãmÆmÆ£&&!&KMêMîšRM¹¦)¦;L;LÇÍÌÍ¢ÍÖ™5›=1×2ç›ç›×›ß·`ZxZ,¶¨¶¸eI²äZ¦Yî¶¼n…Z9Y¥XUZ]³F­­%Ö»­»§§¹N“N«žÖgðñ¶É¶©·°åØÛ®¶m¶}agbg·Å®Ã“}º}ý= ‡Ù«Z~s´r:V:ޚΜî?}Åô–é/gXÏÏØ3ã¶Ë)ÄiS›ÓGgg¹sƒóˆ‹‰K‚Ë.—>.›ÆÝȽäJtõq]ázÒõ›³›Âí¨Û¯î6îiî‡ÜŸÌ4Ÿ)žY3sÐÃÈCàQåÑ? Ÿ•0k߬~OCOgµç#/c/‘W­×°·¥wª÷aï>ö>rŸã>ã<7Þ2ÞY_Ì7À·È·ËOÃož_…ßC#ÿdÿzÿѧ€%g‰A[ûøz|!¿Ž?:Ûeö²ÙíAŒ ¹AA‚­‚åÁ­!hÈì­!÷ç˜Î‘Îi…P~èÖÐaæa‹Ã~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DÞ›g1O9¯-J5*>ª.j<Ú7º4º?Æ.fYÌÕXXIlK9.*®6nl¾ßüíó‡ââ ã{˜/È]py¡ÎÂô…§©.,:–@LˆN8”ðA*¨Œ%òw%Ž yÂÂg"/Ñ6шØC\*NòH*Mz’쑼5y$Å3¥,幄'©¼L LÝ›:žšv m2=:½1ƒ’‘qBª!M“¶gêgæfvˬe…²þÅn‹·/•Ék³¬Y- ¶B¦èTZ(×*²geWf¿Í‰Ê9–«ž+Íí̳ÊÛ7œïŸÿíÂá’¶¥†KW-X潬j9²‰Š®Û—Ø(Üxå‡oÊ¿™Ü”´©«Ä¹dÏfÒféæÞ-ž[–ª—æ—n ÙÚ´ ßV´íõöEÛ/—Í(Û»ƒ¶C¹£¿<¸¼e§ÉÎÍ;?T¤TôTúT6îÒݵa×ønÑî{¼ö4ìÕÛ[¼÷ý>ɾÛUUMÕfÕeûIû³÷?®‰ªéø–ûm]­NmqíÇÒý#¶×¹ÔÕÒ=TRÖ+ëGǾþïw- 6 UœÆâ#pDyäé÷ ß÷ :ÚvŒ{¬áÓvg/jBšòšF›Sšû[b[ºOÌ>ÑÖêÞzüGÛœ499â?rýéü§CÏdÏ&žþ¢þË®/~øÕë×Îјѡ—ò—“¿m|¥ýêÀë¯ÛÆÂƾÉx31^ôVûíÁwÜwï£ßOä| (ÿhù±õSЧû“““ÿ˜óüc3-Û cHRMz%€ƒùÿ€éu0ê`:˜o’_ÅFIDATxÚÜœ[¨,ÙYÇk­ªî½÷™sÎÜÎÌ“ÌL¢L0šŒ1!' Jó (>ù"ˆ/¨(‚%‚QÁk4"¼`LÔLb4’HÂd’$C™ÉL8sn{ïî®êZëû>Öªêê>½÷œÛŒÎéMQÕ½««kýëÿý¿Ëúªœ™y ¦À.°S¶'€çö|YYHÀ²,mY§²Ppö€“Àé²­@HÙÖÑo'€R¥\!GŸú¯'­èpWÙ5{Kûà4nõ…ÛŒC¨abð|åÜã•wÿò›¿ÿöë¿÷g83»8SÌëÎE—~®Mú3ó8 °Üf*£1PËH™j¼çÔîï.¿úïý >þÁÖ<üzª¢5ÐÎÚøÞý¶ûÑ<¾ÀzŒzlÜm`\Ø LA°º5÷+O>}®ùø?}â·xÝw섽]uföj tI{îÊü/w8\FÖ@Ë­ ÷•ür£ ©‘) !x~þ×~ûíÿÃ??î?s¢*»_>lãÛÚŽiU!j¨é’á ºMr#S0`¹ì˜ÍÜwïÝÜß™'Æ/;Uÿÿ.¥0k–Ä:! IUË4´ÛOÜ )’*Í¢a¾Xàœãp¾8C{À´*®¬Ì{G»Œœ¿p‘ #‡3y÷˜]×Ñt>’¸œ†®a±ì¨¼£Kieb9g2™rº½À—þîÃ\ÚŸ1™Lp.G¢WÅÛ¶EÜËɸ‘¡Ž]­sŽà=¢ºöÙºvŒö/ñZ¼R…Š*Ú¶¡]fMQQb\òæïúnμáíœÛ_R;‚Å”„e—Xv‰*DDÅúSd´0­)‘¢ÁÙ3'yêcËÿä¹ç¾û03TQÉ`”ØÉÌPÍàbäuyõÛVrn5Hçu•¯žð¶äœÃy‡÷çòÚ»¼]Ojf‡3æó9jZ~ËÈçÿ(¿ðþ?%Üñ Íì ÞH1ÑE¡‹‰"+kU–1Ò¥@—„˜¤ˆ4Dst]ä`6çî3÷ñàï#¥4Ñ‹y¿¶ÂªIïûŽYÑï㼿ÊÌÆûö‹÷~XBTUÅr¹d_M¸ëÞ3kß[,ÄæË—/ÉװŒ ïVòS¢%Ä„Êꢎ2–1Ñ%¡‹BìEèÔ‘T³N·("ˆÈƒ×+3ÆF1‚snm¿5óÙˆ³ÖÌjPoZu]£ª\¹r…Ùl@aíØýw½¨ Ie‚w+€b^‚WÄôj™)]R¢HqóVÌ:S%¥4 \DÆÀl¾ß§×‹mì` s6—ž5UUBXc$„°õ8=h(±[æ1%¡ 9!“$$U¢*•¤œA¸«”‘LIIjÄ€¨SAR\3©1kœsGšØx°Û·ãÁéuÎBXcÍb±È©ªcà ¬HBb—Ç”¬0H4Æ¢¤¤kñpT5%JgøB1±(Y£b9øœ±Él²åÅÀ9êóžecÖ8ç˜L&„hÛ–ýý}RJDzf“¡I„ÔuçéTW.b$±üÿPÓÁ/‚dJŠyå/õ934% ƒÑ³k¬7›fvG™Õ6Æô"|½¬Ùt!D”å²a¯xm_b)#©¡š·mUãAŠbÙu'UÄ SH’ÅS$apSàãl¨ª*ªª¢m[®‰5G‰»ª’–-Žl%¡  –õ4™QéºTã .©!šU¼ß6ƒdÑD꺵¸u86D²þØ>ʤÆZ3™L‘5=`7òòÞã¼Gc—Ó 5‚_9™<^A,¬àG&–QQD@ ›0Hê1QRЏb·›‚|8ljqÈx©ëšMÓpxxHJ麀ټãßh›,ë«”`V4k¬•:X– ·ÝÄ’Á*&¦šФ„±.ÐÛùzÄxlRã¸fŸÅb1¸ôçªsðž—8S¢uÙUÅТ¹U0p[E+Áb_n[ —š‘޹^}“àlz©±Ö4MÃl6»nÖeVãó !b—C3¤Lh©fbä:µ+Iú¦‰©aNsõÙ í#is$æ,w#B= œ£<Õ6ÖôZs£¬9NçÆ _»W¬Eû„ÕhRdÖ0o–à7²ùE¹xØrjosœGMHf˜÷¨]·\+iôâõFÆýÕ¬ª ï=mÛÞ4kŽKI-ªi™M,æ<ÎA;f‡ óœtoÓ Uã`±ä…ƒ`çÞá|®¥`‰ãZPx#.|3>88 išf͵°wÍÄRÄ£¨eR,–‹¦¡kZP%x_XµEƒœŠ0_F¢Þ9êØ;9ũà ªƒ\ÞŒO´÷P=kTõ¦µæ(¯8˜VakUÕÄeËl¾àü•9SR®g©âKº¥ªCk ̨RŠlcb?-9á¦ì$.]¼@d2ˆêfzq\dܳ¦×šår9œüÍà¯6­^Ûz¶Çiš†K—/q~¯âu‹9‹(ÔUÉ!"Ú–Ó³­¹XÉÇÔëQ,¿íƒ'v-çÏ¿@ë&˜UUQ×5Óé”ÂÝn«ùô™wÛ¶¹¥zK€ÙÌòWáŠÐ4 ©”RSJ9Aí"˶Åi$„¬±®/ð•?Ì­UBW&¦†”µGSJâ| ”¯9çhÛò¤ÉdB]×h½yï™N§˜³ÙŒår9ÐÝ®qi›gGðãÚ”ˆRÊ2ý…êÙ;Nsº”"Î’ä|>ž­æÍ®iFqP^¢MïšIÀW~|ÿjÛvÚ€étJ]×\¼x‘¶m¨ëzþÇU·âúÔx=Þo›‰ÙåC ƄŎ¦¤N ÞÏ¥˜æäu{¹ƒRƒVAU†º±VéH Ó‘iŒõe|bu]ÓuÝN7y±„s³¶4PÇ%×Ím[n×_¼e×"]KviDpø,)…Ancöodb ¢¨€ÙÜDsYÀy,%°;òJ›ž#Ït8š¦a±X ªL§Ó«‚Êmƒ¿–ZÂfÆT"¼ÉÒªªèfKU¨H’c+ãV-ïuk¹£$¬Œf'J<¸2Û06­MÖ¤”˜Ïçt]7\±kÍ“nDœ*ꕇXŠ`©£®è«+cUÌDú* Ê龚`h13A,·u¯:™˜ž5óù|(N½´sëëçpÜìǦûOIÐ ;®Ô ÓBJ-Zé~ÖkÒÖgï%I-ž,‰âœ±lWÕ†«ª"¥Äb±XsT©ãVs”†mû|[Ñ_ ¤k`—R±pÙ¤Š÷vvd ˜5ÈÊ"²ª 9Ub»y2™Ð4 MÓÜ’¸æzMë¸íM¶éÍÚù w‡bêÁ’åq÷Ý,ÛJ®ƒš[qõÖÇ’hçsvwwQUf³1Æ­Zór³-c{­MB¸àY.f8•âµ]'w³Ígm^LÍPd,5AÍN¹téÏ=÷1ÆÿãþžQl³ÄQõÉðl)\~á<ÕÊö -t‚³ô¸m³"}eTzMyªä­<Âç>ó® ?h/CGÕ6·}”¾l[Æ!EÓ4Üsç)yó›øtйÿ øu“b^zD ˜Ã#)}ë?D8¸|‘wÿÔðÖ·¼™K‡/¹I]S¯Ï1ç¨ÿ¥”¸÷®Óœ¾ënþå¯?¥„Õu™î^õBG4˜•`&˜)HbRçÔ⡇âUæ^æWƽ6Vf³;µ‡”0ó`ÙÍ›–z†I÷Â,«ä”˜Ö§OÝA2ã—Ò¤úçZ&¯÷êŠS'O²3©!%Të|CBéèÍ-‡[’U#»:DW6)yÖp¯®ØÛÝ¥éøð²±g³lr+^“*°SWìÕ$Æl¹Z– ²-PÄ ÓTÂíÕ‚$&Áák/•K¹ýúVþ¦„iÅn@òxéÇ:loÍæm%Vj+€,Ïawm˼isâKÀ˜mø¸w«^÷ìz£ò–Mkfd^[#i-_U×˜Š‚“&‰fєێÎÄò$Ûö»‘¢Ùµô/¾XwšíULCöÐÚËJobbù0·%YÅÒš3˜V<ñÕgùêÓOs÷©;XD!”è¹ïw¸®Ntõù°v¹×h!^d€ë¥‘¼Þ Fp+7l£«m[ôkIi)Ü©<_ûÚEž|úy˜†<ÆÑÒ[5¨Gq¼¸ _{æ¿ø7Ÿæm¯½—„gº³ÃîÎnÎäûÂÕ1Ñlß8 æ8])ì‚:¿u†u¬9«AæbÞó­§IàÑ¡LÚ×Ïm£Wr¼ÝÅHÛ4tÝ’ÊO<{Àÿ<»ÄíNVcµ²=ÂÄrKj¡ÛP5ËtÛ©ùÊ7…¯<ÿ<¹ˆ 7ÔI>O¼åõ'ùé7ÝÅ…yºæ#LB¾íñ¾x‰Kç[عQOêšv*œ¦~Î}DaÜ ´Î >`²ñR†1tÃί#+múK~èßÏ?ú<{éðÚcï¸ïÔ >så“|òëOÀ‰;×SîkÀeµ¯ïp&#¢ŒÌ¬¿E÷ªl^4‚¦²ÈÍ#Nå:‹Kü]'xÏ»ÞÆÃßöN̹xyàþ{ø‘ï{O~ê PÁ,í»éˆ‡qK1·#*ŠÃª«/Ü ëÌ[ùöh¾ùu>úÕ§Ö:(®åuÇ΄{ÓŒÉÝ»tívê[g¬é®lŸ8Ì7nÖŒYt 2jåÑ×ìòå/™üuFǪÊCgNó®×žâñ/<ÓSܲû³TÀR61-ë­¤’Š@—õ­8‰+3~ðoàÇ}ç.ìs÷ óŽÝ)?sæ,O~cŸóøúÖÜtÔËIO¶ôI;ËäMð–ð’ð*7ÅJq®ã—~òݼóÑwðçÎz`¶®ýû¾7`ˆ\¹wÃ{ξê,O>s‘÷}àÃØ«ÏÞšGC z›PM¸í5éœweÁ‰õ ÀÊy‡¹ÄþüCü÷SOñàCqúÔiêºÂ9O]çÎ2Â`v}6Ÿ§‘%ßðÖ¶\¾r…gÎã_ÿã pêNÒ žÔ ’<^§i¥›WTvp*y-ñ¦oœ«¼Ç&;|äßžà#NžÄOê F\:?°dˆ~ÕÄû¾ì®ƒÃÜóÕ™3p«J¿Eœ­· ˜÷`Fµº Úᤀ$Þ$ 싹Íc¼ô½æÁÜþ_ZûVS+vôƒ/œ[53Õö<þž³TX.n’6£Ë”»³”3üà<×3¨Üo)Fê ‹bÖ¡蛺qÞ¹ü“UV7Rã1 æ óÆcŽ«Ÿ¶Q*©Nf1W™zúÛÂQIJ»@ºK,¥œ‹r7Ðÿ›{\Ýc Lñ"X\êÀWÁÁ¾¢<'§®Bbÿ2í'ˆI°Ò–f×Ò¿¢^6xsëcI KœîTàBobÀùsçιÙ>qqg.’¹Û”«A2§™=j©ƒ‰ÌÁM€®úÄg¿Ø½ÿÅ~î³;uöî?´Ø®¤ÆÝ.|9²”9T1L´xmÅêÝ/:tX8ü^Ç…Ë=ïH—ÞWÍ/ü²ø:—­Ín{åJ³bšðqIç¬ó³ÏÀ –H3Q5€ ©BàƒÇÄÆáä.@ $p³d!sý#ø~<<+"À¾xÓ ÀM›À0‡ÿêB™\€„Àt‘8K€@zŽB¦@F€˜&S `ËcbãP-`'æÓ€ø™{[”! ‘ eˆDh;¬ÏVŠEX0fKÄ9Ø-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+®ç*x™²<¹$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóýxήÎÎ6޶_-ê¿ÿ"bbãþåÏ«p@át~Ñþ,/³€;€mþ¢%îh^  u÷‹f²@µ éÚWópø~<ß5°j>{‘-¨]cöK'XtÀâ÷ò»oÁÔ(€hƒáÏwÿï?ýG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)¬‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(¼ AÈa!ÚˆbŠX#Ž™…ø!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fº‘;È2‚ü†¼G1”²Q=Ô µC¹¨7„F¢ Ðdt1š ›Ðr´=Œ6¡çЫhÚ>CÇ0Àè3Äl0.ÆÃB±8, “c˱"¬ «Æ°V¬»‰õcϱwEÀ 6wB aAHXLXNØH¨ $4Ú 7 „QÂ'"“¨K´&ºùÄb21‡XH,#Ö/{ˆCÄ7$‰C2'¹I±¤TÒÒFÒnR#é,©›4H#“ÉÚdk²9”, +È…ääÃä3ää!ò[ b@q¤øSâ(RÊjJåå4åe˜2AU£šRݨ¡T5ZB­¡¶R¯Q‡¨4uš9̓IK¥­¢•Óhh÷i¯ètºÝ•N—ÐWÒËéGè—èôw †ƒÇˆg(›gw¯˜L¦Ó‹ÇT071ë˜ç™™oUX*¶*|‘Ê •J•&•*/T©ª¦ªÞª UóUËT©^S}®FU3Sã© Ô–«UªPëSSg©;¨‡ªg¨oT?¤~Yý‰YÃLÃOC¤Q ±_ã¼Æ c³x,!k «†u5Ä&±ÍÙ|v*»˜ý»‹=ª©¡9C3J3W³Ró”f?ã˜qøœtN ç(§—ó~ŠÞï)â)¦4L¹1e\kª–—–X«H«Q«Gë½6®í§¦½E»YûAÇJ'\'GgÎçSÙSݧ §M=:õ®.ªk¥¡»Dw¿n§î˜ž¾^€žLo§Þy½çú}/ýTýmú§õG X³ $Û Î<Å5qo</ÇÛñQC]Ã@C¥a•a—á„‘¹Ñ<£ÕFFŒiÆ\ã$ãmÆmÆ£&&!&KMêMîšRM¹¦)¦;L;LÇÍÌÍ¢ÍÖ™5›=1×2ç›ç›×›ß·`ZxZ,¶¨¶¸eI²äZ¦Yî¶¼n…Z9Y¥XUZ]³F­­%Ö»­»§§¹N“N«žÖgðñ¶É¶©·°åØÛ®¶m¶}agbg·Å®Ã“}º}ý= ‡Ù«Z~s´r:V:ޚΜî?}Åô–é/gXÏÏØ3ã¶Ë)ÄiS›ÓGgg¹sƒóˆ‹‰K‚Ë.—>.›ÆÝȽäJtõq]ázÒõ›³›Âí¨Û¯î6îiî‡ÜŸÌ4Ÿ)žY3sÐÃÈCàQåÑ? Ÿ•0k߬~OCOgµç#/c/‘W­×°·¥wª÷aï>ö>rŸã>ã<7Þ2ÞY_Ì7À·È·ËOÃož_…ßC#ÿdÿzÿѧ€%g‰A[ûøz|!¿Ž?:Ûeö²ÙíAŒ ¹AA‚­‚åÁ­!hÈì­!÷ç˜Î‘Îi…P~èÖÐaæa‹Ã~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DÞ›g1O9¯-J5*>ª.j<Ú7º4º?Æ.fYÌÕXXIlK9.*®6nl¾ßüíó‡ââ ã{˜/È]py¡ÎÂô…§©.,:–@LˆN8”ðA*¨Œ%òw%Ž yÂÂg"/Ñ6шØC\*NòH*Mz’쑼5y$Å3¥,幄'©¼L LÝ›:žšv m2=:½1ƒ’‘qBª!M“¶gêgæfvˬe…²þÅn‹·/•Ék³¬Y- ¶B¦èTZ(×*²geWf¿Í‰Ê9–«ž+Íí̳ÊÛ7œïŸÿíÂá’¶¥†KW-X潬j9²‰Š®Û—Ø(Üxå‡oÊ¿™Ü”´©«Ä¹dÏfÒféæÞ-ž[–ª—æ—n ÙÚ´ ßV´íõöEÛ/—Í(Û»ƒ¶C¹£¿<¸¼e§ÉÎÍ;?T¤TôTúT6îÒݵa×ønÑî{¼ö4ìÕÛ[¼÷ý>ɾÛUUMÕfÕeûIû³÷?®‰ªéø–ûm]­NmqíÇÒý#¶×¹ÔÕÒ=TRÖ+ëGǾþïw- 6 UœÆâ#pDyäé÷ ß÷ :ÚvŒ{¬áÓvg/jBšòšF›Sšû[b[ºOÌ>ÑÖêÞzüGÛœ499â?rýéü§CÏdÏ&žþ¢þË®/~øÕë×Îјѡ—ò—“¿m|¥ýêÀë¯ÛÆÂƾÉx31^ôVûíÁwÜwï£ßOä| (ÿhù±õSЧû“““ÿ˜óüc3-Û cHRMz%€ƒùÿ€éu0ê`:˜o’_ÅF) IDATxÚܼyt×uçÿyUÕûŠ}#  ‚›¸ˆµK”,‰’lQ¶&ŠdIvCpj8EcSó¿þÖ_ÛðÔ‹{ øCVåí©LÑY“.Úø,«šI#˜J¸›$˜†‰iYHÙ\ŽD2ÁÈÉ>’§N2ÕßOnx7“FMM¢lo.KM0HIJ^ùη™jž…'#ÜØD|Îæ- ¦©™H$‚O˜(ÇA¹î¯Ç*qšÍg^o©d“Í婯­¦¡¾îvgà·¦_·]×ÌJ8©ÀU ¥t™†¿2eM1-6’Ñá1N9ÈÐþ=L>ˆs¢klo>·P ø|,ÃÀëñbEc(à´e#”ò–É”×Ï©XŒ#sÛñ/XHõ’ ˜uáE4Ìn%äñ€]Bºî¯Å&q)\¥(ä äòy„drù:L3ø¬Š+wl©JÙ‚ãZ¸JâÊ2@ZëŠàŸV¶ºC,W ††èÙµámocïÙA`p€h±@Ô4‰F£„ZçjlÂW]M ¡«®ž‘}ûzû-¢­sXpëzœD‚̉nJ©$™Ñ1²Û6“g3ƒ±8ƒ ºˆ^r-W_Gã‚.‚¦‰.äQJ}àõ•}Ž8 $Æu] …"ù|C˜”lÇÀ4B€gšAÊq¥JçK¼W–’J¡Ï0Ôb²¨°Fx}$RStïÚÎÐë/bìÙAlx9†Aum ñ –ëZDpá"t a`ú|Œe²tïØJêÅǩ޷›9ZÒ¼°“úË® |ù5¸óºÈøÃdmI¾P™L ¥­ÊqÇCÎqpÓS ¦‡|6OÚLâæså°À²°üq¼KÖà_´ŠèÚS„¶o&²ùM‡ÞõéãGéÙ}Uÿ$Õ³æbÙy”<6‰ŠUä¸vѦP´1 W©i‰: ëJòEC€ã¸¸R"UÅês%Ú0 ¯‡±Ä=o¾Ï?BûÐsj«™uõ5Doº•Ò‚eœ2ü¤²yŠãchש¸}å8H [›(©03By|Ø®Fº ­\´.¡ÓY†×‹·º…àGï·êRªÞxß«/ ýì#Lö'Ï[²Ÿí \çsÌàƒãºØ¶MÁ¶1LWJåí4@R’/ÙX†ÀvÝÓ&vfx< sjÃSD_yšŽÜswѸþvÔ5ëèóW1–œ¢˜@(…aˆ²N™&WƒSt°í.š¬ëà‹ÔiEÉUL%SNŸ«ðz<¥@¹h×EÙùL–IËÂk&ò‰Ïhï"þܯðØ‹ÿÀN¦~ø?ÿäï^}%>-ÑŽÍyíMk\WR²]J¶‹e:H%õô[ÏHS´%>ËÅ–×­ˆôû˜c mX  0ö¯¨ßø"óÑ´_÷â¿s‰ÎUôM™@(‰eY˜–m˜´&›É’NŒRÄF˜LbhEM&…''qð}?ü.éhO}3ÞÖvüuM„ãÕø<>L)Q®‹*9”ÆÆÈyýø/¸‚è¬üÏþ3æÆ—±Nõ2ùÿÿéLß•×ãÕ.¸Zˆsb×q±‰í¸˜¦‹”§õi ©%ÇÁvMlW⸲"Ò§§B¤×ÇxbœñçEó›Ï³À4h[w3¾{>ÏÑêVÆps,‰6=]I.“"•'Ù×{ì=B½G©žš Qkª‚"áh/ ü¼^“…=(ä L¹’”ÏÏd}3£ —aÍ_J¸¹•h$ŽÏ´B£J%Ò#£dc5„ïü#¢ñZBÏý31Nú?bÒãþèJ¼¶–ò"¹®,›™T˜Ž‹’§ç~g¤)9.¶+±‰3-Òg²Çã%](2¶iM[^¡Ã€Öµk1ïù<¢sìD•J¸ŽM~$I&9J*9Bz Oï1êû{Y¤$­-ÍT¯¾߬YÐØ„®¯'‘ÉzæiÂ}'©¾òJŒeË( œ¢®·y²Ì©ãŒÚÃHU-ƒôÎ_J°iñx-áX >‘JQ †È®»‹*-=û0"•€ÇÊD¼§­+›>Çí»®Äqʧi(¤Vç2Hk…í*)+n^#•œ‰}Lˤ #ûÞ%þö ´Ú%Z/¹ÿ'?ÇþÈŽî&;:ÀÔP¹Ñ~ÜüŽ›‡‘!fõõ²Dt]p³Ö^Kà‚ µµ”, Wk„×K~d„ìk¯a #¢—\B¶°3ŸÇS,¢úN2gÛV&vngxÇúŽ¿Ç@Û<ÆëšðúĪ›ˆµ´©mÆ®®Ã¾á.j²9¢/ý’Øpö³ÿÄĽŠ †1 ¹™l¤+q•ÂQ Kºå„8‡Ae$]Wá*#åÌ„P«=Œž<Žoã3´ Ѻd)‘»?ÇΪ6¶½¶ñƒïR>IØtihi‚`uè­'O±²k óׯ'|Ùe855äl›b6‹“Ïc–R ÷õ114L­e¡Ó¶ñk1ãqwwí¦ï§?¥sxˆË¾øE¢·ÝÆ„ë2yò$Ò¶1„Àçõ–ƒLËd,5É«ond¸¯Ù€(•0 ¯Ï‡]*ÍäŒt©Dnl +"xãÌž5 ñ“Ÿ0ö ‚!>òG_àâK/g÷¦·Ø»kãÏÝOúÂë1V^Í’ä(áä8õ›ž£§­ ÛëÇ´ å\Ô¸J£*ÏÏœ¥Xg¦=¥ÔH­ªl“ª’êH§’ø÷n¡99NÃ’eŒÎnåíwÞ 3êeý½_eÑâÅ8ÂàõmÛØþÝ¿béð0Wó›o¹…щ r˜€Çç›1YÇb2“ã• ¯rìÐAZ¢êëë¨ ·Qôû º.ËBœg¨m{j ÿ²e´Ýwúoÿ–ÇÅñX¬øÒ—¸í®»Y¾j5_•½{6p¸¡ªævZ‹â=ïß³™ÑËoÆ[,€ÒH]öØ®ÖX3³‡sWi¤*«¸«ÊÙ6[k쾃Ì:þ ±*ÔüN޳¬\ÔÉM×^G,'95ÅÎ#GÙuÿýÌëïçŠ/™È­ëI$'p¦¦ð{½ âŒÄ0L<¦Áª¥‹¹rÍEôtw£•"ºl'ÇÇ‘CCÌž3»TúÀ™¹LOáoo§ãk_£ô•¯0ö‹_ð^u5‹î½—ùÌš=›Ùo¾ÁË›Þæ ¥© Ç §ÆhØù:‰…«(†cX…\UvJR›g%àÓ&VGI…” ”F ƒ\.Kðèòi‚-³HÔÖйbÿiýmø|>†‡‡L¦8öÆ›TïÙÍÅÿ85wÜÁØd’R&C(Æãõ`YÖY'@<ãÆo䪫®Bšùp˜yW\ÁòË.£¾¾C”£o˲ðx<3‡`0H(ÄM& Ï›GÛ¿HÐçc⡇HíÝK°L“ÞºžßYÿq²‘ Ç}^\_ØèIjìÄ5L¤.;(©º’+K8 isuY{¤[=rŠêâ^NcuË—sù%—€Rä²Y<¡§z{)lx™¥´Þs:b|` on$‘œ$¯Âçõ΀ãñxðz½˜¦I>—£»·£ÝÝx¤Ä£ÑPˆX,0ÈÌç<¡SùÇûN"Ј\Žú+¯¤åÎ;q2ÆžxKk¤aP,¹áºë¸aÝMô|L™&†TÔ8€/—Á6<¸R£*š«•¡Îe®‹Ri¤ÖH-(ØÞ“G¨IáW\´˜E]D)Ÿgpl iYŒ¦3ôlØ@K&Í÷ÞKtÙ2,)‰„#ìݽ›Gù‰É)bUUx½Þs˜àñx0„@hE]]BJ¥J©³À±, ŸÏG4!],ñèÓÏðÆë¯Q]UMÄï' Òõ©OQ¿t)c60±u+ñæf<^/ù|ž›¯¿ž¶K/£P 2r’ðÈIÃDê21ÊyjQ™¤¿ßÍ+ª;i\N&EÍHqé`ÔÔR·r%uõõì|ç]~þË_!  MÍ;Û˜·ìN5·°ëíMø*‹Eé;Ñ̓?{€;ysçRÈçÊ‚'Nçdj«ù̧>ESSŽã`Yâ}še ÐÏ©±qyüI¶m|ƒu×]G$c,™$70ˆ`®]‹8p€>Æ! Ⱬºº¨¯®æ¢kÖòâ¦Í䆈¤SÔgtÖ|´!0€‚ë0•-+”Àxßl>o;LdŠDƒA’£Ä½>¬–ÂÍ͸¶ßç%è1I‹dá­ñ-[Æ›û÷±oß>L­ñùø,“æ–Nöôðãþ€{ï¹—U+–ãØ6ªâ)´Ö„Ã.»ôrù™L¯×{Fö¯\&Ò÷žäñ§žæèÞÝ´¶´0™Nó㸟þá!r™,¶!0²9VÔÕ:Þͦ‡$´t —¯\‰ÐšÙ--xçÎ%9{âégŸã¦k¯å²K/!ŸÏ£µ>mbBôûùäퟠ­¥‰mÛÞadd„ÎÎNþìK_bNk+…B¯Çƒ¯ºš-Ño¾ø"D‚…³fQ²,»ˆ…Ôepu¹˜|>S¸–'3Æ’·¥ &5Áøßÿ=‡««¹"ŸçT±È¾ïüwÒ4yäÿ˜Q¯¥†ßRŠU+VpÛW¾B ¾§P8Ëm Ã`vË,Rc£üäG?¦­½p À_~ë[J%¾ü¥/qùš‹Ig2åÚÖy*¢Úd>OI*¼>¯i˜¤m‡qQ–­[6“©©æo¿ÿ¿øèÇnåÏ=GÂv‘(:=Çc¡=>^©PâM l×Ea±8e~ÈËàx’œT4Çb´édË0è´, •<£5îáÃÔWs÷'¹çî»q¥<ííÎcf>ŸL¡È†_ü’÷ÞÚH¸ª3àÇVš¾©4Cïlc`L$¸nÝ:f54²qÓf^zæY´”T9(NŽŒ040@É‘˜ 4g¤ƒÎžÍ«\O4Êègï#™Ï`üü‡ÔåRÐÞNË'>ÁG/¸™Í¢”"71Á[ßý.ù±1j®¿Gbñ`ˆ ´^y9µÍM–…/©"+.TkŠ…±XŒ¯ýëÜ}÷Ýär9î¼óN¾úµ¯cYétÇ3#èÓ£ax, ×ïgxã› >ý4ñJ]È­Ó½„ÃÃ~ü#~ñýï!¥¢(]º<ª„A pö¿Ë…‡2¼òZŽ/¼ïÔD…AçhFH¼6HeG¸Ø`v.ÅD" q×-·œußÛ²…ä#°ôÆÙS,²yóf¼ŽMKS M™_|…ùóæ1§¥™úêªóv„®Y³†ÏîsìÝ»—¯}õ+3^.~`gÆd.Oÿè;dtlœeõõkjp*±È )•ˆÔ׃RÓi”’C!´”dŠEl Eh.w2ì¯ p<ÀI¸L7üœ“ÖªÜòéºä ì\iyЀ32LöÔ©s.ÔÛ1Ð01ÁùÆ7xcñb6¼ôÛvm§ÿ©'‘R¯©e~g'sÛÚ˜5k6] ;©©®&à ©¯«åöOÞÍÍëo# “Ìæp¥Äv²¹Ù\ŽL6Ojr’ã==œ8ÑÃÐàGf|x˜Öª×Ür u]]tΛǂÎÄ"QX¿žô¾}Üô½ïѰd ¹áa4ší;w±ý¡Âsä0‘Pè·¢›› Ôˆy*…­åŠ e9d*0½”Bqœñ“ŽK(Ÿ? Æ®.l ûõ×¹â[ßâ·ÜÂ'n¹…'N°wÏnvíÜÅ8qè=v¼ýJkü¡¦åÅ  … …CÔÖÕ‡I¦&±%¥R‰t:M.›¡Ïá–lœR CKjâqÚZçpÓåkXuÉ%,]¾‚ŽŽ¢•Œå{ƒì9ÑʹséúØÇ°X¼€_öðÆD‚kH$̉y«Øme²¯žÂÐò|)W4h¥ÐJ£¥D&“±ò•&Fo&ƒz_ãô¼‹.¢>¤w×.Ʀ®« €ŽŽ:::øÄíÿ‰\.G__Cƒƒœì룧·‡©É)’©$‰D‚Lf’þñW¢•Ä0MLÃÄëóÒon§¾¶ŽxUÍÍÍ´wtÐÜÜÌܹs©®©9o×Ë?{€ÉÉíëo-ƒsÆ1Öß=>Ž¡™»‡û‘•šéÍÉUßøÆ9 …X¼x1‹+wpú(‹är9òù<¶m—;Ä´®ô3š3YC @(úÐcÇyìqæ7Þxn„P(¯„0ºe¹@3™Å …BèrÐ#ÎWÕr:³/Z0m`"ZG<=FæÀ’Ç\¸ð¬¼ð…÷~Š=ÆŽøÖüÉŸà‹D>Ô@ü~?~¿Ÿšó°àßrl}é%öscWëÖõZÈ Q„,ÁÔ¬y )®].*¨Jƒö™ 2Îî¬. ”VC:äBqkg#€L&Kï[osAÜ´ŽK–pðÔ)ö<ôÐÿÕöù#ã ¶þèGÔ+?ûYüïó„ݧÛ¹“zÀßÐÀxU#cùZÚ•:æì†³Ò ¥% ÒÁ5-êÛÉUtè8§ÛÃc¬ýæ7Øð­o‘®Ì½~ÛGxîÁy÷VÌŸÏ’{î9ç=Ï>ñ$éÇh¬ÎÅ „ëÈds Ê+.´’h-Ï¢qf$­”®ˆtY¨-é0X?—Áx#UÀ±íÛy௾{ί¾ýv.»öZóâŸýÙÿ€6lÞÊÛßþ6mÀÚo›`míY¯?ºi O}ÿ{4‘éÎå¶- ÙÜ锳Ö3½çV5Ð嶸JkœV ö±1ŽÎ^Š4ÏÞw÷ýÝÿd4›=ë>~ÿý´ƒ¼üÐClùùÿÖàlW’ȯo¿î±d”G¾òeB™47~úÓ,ºãŽ™×’ùß{ø—|í _ÀÛ×Ã< ¸h)ÇjÚèO¤Á±Ë“TY³–ªœ;ÇÄ´®´º©™é€ëp¼y!C0Q CIžø«ïpǧ>Í/ž|ŠT%>ªnoçÿyøaÂÀ/~ïÓìxý=Àûöò×øþúwîàÐ˯üZàœ,”¸ÿk_crÛV>zÉnúÉOH—lžxõu>óù?à¿ýùWÇŽ²¨÷Yä–®f{Ñ$ŸJaŠrÓè̘µ<¿H+t¥ºbf•˜vž\¤–=sWaµÀåâ«_þSî½÷^¾ÿOÙßÓKÇm·ñ?þ ~)ùÇu7ò̃~(F$‡èyèg >÷,é=»?48{‡ùÎïÿ>½=È+VpÛ¯eP˜üïãSŸý_üÜgÙ±i#óXa4U+V²¿yG†&À±+Y²ëšÉ•Ÿ7’Vº²8¨Ü›¨*UV´£Äž¶U,<Äâô8É$k-c°¡–¾};ø»m[xàþ¿çÒ\ÏÚÖqñŸ|‘Ã?ø/üÞïqbûÖýù×éš5ëôûiôxˆ85mmÿG`’JóÂ˯ðÔ_|sÇvîºøbÚïû¯üðÍ<ú³è9t¨Ç`ÕŠ;º˜zõUêòyfÕÄH¬¹Ž·ÒšÒD¢œZÖjº´ J¡¥.¯癬¢]”.+y™Ae·/J9d0Êë ¯dÎŽ' iMt×.oû4óoû=ý‡ìëæµ~ Ï<Å‚å+èºæjfoÝʉŸü˜ï½ø"ó?÷y–ßxs[çR öûðL· ;6n%Uëœíš P²™ÊåœH°s÷n6=õ4#ü’ÅÀ%k×2yÍ5üåÏÎ{[ߦ)ãc×^Më’•ŒëØûì3Ì:üm@ðšëy%:‡£ûû@:Ë*§6´œ9u%çKÚO£xæ)¦)—Ï2ÐÜÉ[í«ù؉í4Ò =ÿ[nù,s[¯dÞœetääÇN11>Ì`€ö«¯dîÑ#¤{ûØù¯óÊß|wÉ2"Ô77QW]C0^Åð¶-(WÙ¶?/çòLŽŽ+˜œJ3::ÊðàSÇcï¦XôÓ~ûí .XÀÞÞãTi‡ß½ã“DZÚ˜´ªØ˜Èsð¥—Y²å9³×¬fß’Ëy«7 “SYcÙ…M»ñŠ“:Ÿ‰¡O¿AÊÓçtªSц`sçåÌÉ%¸p¤‡éa&Ÿÿ)/ú8ûj˜ªcvKõÓ- <ŠÜª‹™ÕÛMÛöw:ÞÇÑ-›8¾eû€R4F.'^*r#àóúxüÙgÙ89‰HOa ˰m€ € #Aº®¿ßGn /'12AtnÇ r¼Ç»3;„sh;«oàb`~Ç\F®ý8ÏLh’ýýåî;­N¯£<ÃÄPÓcça–h¦Mlú?“Ú©‹+M¯O¹¼}r‘DI‰.Ù夿Öe`ü&BhQY]Lc&úé<ÌÊÂó¶%]87‚G½ ¼´ãv"Q^ù¥Ýó¯ T²òZeìZ~€) Ò­´{–HŸ¯N§Æé Eøùü+X_Ý@×±]ÌOï¥-9Ⱦú6zëæ"ÃÕhÓ:½É <),@+âN³ÒŸ”›˜@%ŠPÌ•ÁŒòbàéeZI°3“£ÌïeÉä0@kÀKãW1|ÙGxbJ°iûnHO!<„–ÓEßó¤äi‚pž>鲪;ZbhCºJþËëAµF¥“ Û®šÇÚÕu¬éÝKSÏQ"%›Öá£ôŒõr¨v6ñFò¡j´·ÌšJ”Â’ÀëÃç5Ëÿ7†ªÒi¡µ;ÅÁL‚ÆÔ0óÓ£´³–®NÌ«®cgÓ|žíãèán(•0¼epÿ‚í½uQÊ=«qô}&æVë ±> ó`e*Ÿ&SÌñl,N_çe¬mi§­ÿá“ÔæK´ž`hô}¡*#µL„kÈûÃà €iâj‰ØÂd8o—™%K(W]@8EÅ,µé Ù-NÙ•ÉsýœYDV_ÌÐâU¼–lzç=ÒCÃåµ³–u~ÍçÑ Y¯˜~ÿ9‘´V3oJ–¥ó¡ÖòšånlÜÄ(ûrNU7°ú‚&V,HÒ8ØCÇÀIšÆ“tæRLäRŒÒͨ7È„/ÌD DU!ÆÉvvŠÄJy¼Ò!^ÈR]ÊPUÙý ¨ øˆ··á]|©¶N¶Š Ñs¢  …ièós^•ÅYO[˜hí±NóB²²’´1þ%»=r*—&™Ë°!fouŒEóWÓÕ±„Ù©QêÆF¨¦-™ `çÉÙyò™Ó;Œ™ä#™½¨ÊF"ÞÊv1  ãkiÁ;»gNCµM¼çv÷ŽÑsrn:0E¹}²Éˆ‘6gü[•“eB» ]´) 0Å4ƒôé~|»Â"§¬Cê};|ˆåá¦KƒÌ¤ˤõØÐV5‹¶ú¹ÌZ£¹¦ª˜§¡P@¥&Höõ1Y,˜‹âñ~¦?ˆˆÇqjê°«jÇ9¥=™Ýïõ0<2†›Ë!x- CˆöTïÛãìmNÊ™T¡\´v(oˆã3 lú²¬S®¢˜GÚE”SB»î鹨Y7áÿlsåe—e T!M:?žq‹CUáM±*ê«g ø)ŒŽ££X"°lÉÕ—PP`£) “Œ‚ñ’ÍX¦Àh/‰Ô$…|å8XÂÀoM×îݹ ƒxßV-åÆ)CJ´+® †ej)4†5ÍneºL¥(ÆC•U¥F„þWoØ!*"n¡Qn 5U$‘N1>bb˜fy9x¡ÀÅ™K€œ†çúGh»„íº8¶k;HÇ)ËW†aˆéžÁý&o®§cé‚,!”ßšvµV¥æÏX¿ÈNáäã u™®ÿއyF£––6ÚÖØ…,>Çf^K] Únm#Ó3ÀXož BL!ðT„´¨ðþßa B•Ù£´×¯Ìð¶õêÖöß}ÿg¼½më Ѧêh§xZjĿÖ/çaÕô·y•Â2 µuòó¹íds9r“p1…Yþy-þ=þÜýq*Y -UÅk+´'°S @^0ç"A"eÑ:Ç »ÉïX¹Ä×¥á)§­õoaÃ)¶ÛqA+–‰ešz#•ó^9ºœrÕÊÅpJ8Ѧ'hó…tpÊÂë5ÍŽVŸÖD fí_û\7bå ”c¢f6¥ø^¦Gk,­Ëû ¹-øíZ—‘éQN¤á'Òô PÒ’@Q˜‹×Z€tT Ó‡0¥UJ¯5ììUh]­Ë:ûÛ¼ä߯ñþôYé‹ìUþè¡\–cÀ„0¯5Þ“Å´a m˜&à§w¨ú ®ÌÇL¡\LUØ3d¦ÅéÝàà å…rç#*±Ò4Mƒ£*µ»Ò½—«<çöB3-h“€IEND®B`‚lft-3.8/icons/72x72/dest_prohibited.png000644 000766 000000 00000027476 12050507714 017674 0ustar00vicwheel000000 000000 ‰PNG  IHDRHHUí³G pHYs.#.#x¥?v OiCCPPhotoshop ICC profilexÚSgTSé=÷ÞôBKˆ€”KoR RB‹€‘&*! Jˆ!¡ÙQÁEEÈ ˆŽŽ€ŒQ, Š Øä!¢Žƒ£ˆŠÊûá{£kÖ¼÷æÍþµ×>ç¬ó³ÏÀ –H3Q5€ ©BàƒÇÄÆáä.@ $p³d!sý#ø~<<+"À¾xÓ ÀM›À0‡ÿêB™\€„Àt‘8K€@zŽB¦@F€˜&S `ËcbãP-`'æÓ€ø™{[”! ‘ eˆDh;¬ÏVŠEX0fKÄ9Ø-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+®ç*x™²<¹$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóýxήÎÎ6޶_-ê¿ÿ"bbãþåÏ«p@át~Ñþ,/³€;€mþ¢%îh^  u÷‹f²@µ éÚWópø~<ß5°j>{‘-¨]cöK'XtÀâ÷ò»oÁÔ(€hƒáÏwÿï?ýG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)¬‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(¼ AÈa!ÚˆbŠX#Ž™…ø!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fº‘;È2‚ü†¼G1”²Q=Ô µC¹¨7„F¢ Ðdt1š ›Ðr´=Œ6¡çЫhÚ>CÇ0Àè3Äl0.ÆÃB±8, “c˱"¬ «Æ°V¬»‰õcϱwEÀ 6wB aAHXLXNØH¨ $4Ú 7 „QÂ'"“¨K´&ºùÄb21‡XH,#Ö/{ˆCÄ7$‰C2'¹I±¤TÒÒFÒnR#é,©›4H#“ÉÚdk²9”, +È…ääÃä3ää!ò[ b@q¤øSâ(RÊjJåå4åe˜2AU£šRݨ¡T5ZB­¡¶R¯Q‡¨4uš9̓IK¥­¢•Óhh÷i¯ètºÝ•N—ÐWÒËéGè—èôw †ƒÇˆg(›gw¯˜L¦Ó‹ÇT071ë˜ç™™oUX*¶*|‘Ê •J•&•*/T©ª¦ªÞª UóUËT©^S}®FU3Sã© Ô–«UªPëSSg©;¨‡ªg¨oT?¤~Yý‰YÃLÃOC¤Q ±_ã¼Æ c³x,!k «†u5Ä&±ÍÙ|v*»˜ý»‹=ª©¡9C3J3W³Ró”f?ã˜qøœtN ç(§—ó~ŠÞï)â)¦4L¹1e\kª–—–X«H«Q«Gë½6®í§¦½E»YûAÇJ'\'GgÎçSÙSݧ §M=:õ®.ªk¥¡»Dw¿n§î˜ž¾^€žLo§Þy½çú}/ýTýmú§õG X³ $Û Î<Å5qo</ÇÛñQC]Ã@C¥a•a—á„‘¹Ñ<£ÕFFŒiÆ\ã$ãmÆmÆ£&&!&KMêMîšRM¹¦)¦;L;LÇÍÌÍ¢ÍÖ™5›=1×2ç›ç›×›ß·`ZxZ,¶¨¶¸eI²äZ¦Yî¶¼n…Z9Y¥XUZ]³F­­%Ö»­»§§¹N“N«žÖgðñ¶É¶©·°åØÛ®¶m¶}agbg·Å®Ã“}º}ý= ‡Ù«Z~s´r:V:ޚΜî?}Åô–é/gXÏÏØ3ã¶Ë)ÄiS›ÓGgg¹sƒóˆ‹‰K‚Ë.—>.›ÆÝȽäJtõq]ázÒõ›³›Âí¨Û¯î6îiî‡ÜŸÌ4Ÿ)žY3sÐÃÈCàQåÑ? Ÿ•0k߬~OCOgµç#/c/‘W­×°·¥wª÷aï>ö>rŸã>ã<7Þ2ÞY_Ì7À·È·ËOÃož_…ßC#ÿdÿzÿѧ€%g‰A[ûøz|!¿Ž?:Ûeö²ÙíAŒ ¹AA‚­‚åÁ­!hÈì­!÷ç˜Î‘Îi…P~èÖÐaæa‹Ã~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DÞ›g1O9¯-J5*>ª.j<Ú7º4º?Æ.fYÌÕXXIlK9.*®6nl¾ßüíó‡ââ ã{˜/È]py¡ÎÂô…§©.,:–@LˆN8”ðA*¨Œ%òw%Ž yÂÂg"/Ñ6шØC\*NòH*Mz’쑼5y$Å3¥,幄'©¼L LÝ›:žšv m2=:½1ƒ’‘qBª!M“¶gêgæfvˬe…²þÅn‹·/•Ék³¬Y- ¶B¦èTZ(×*²geWf¿Í‰Ê9–«ž+Íí̳ÊÛ7œïŸÿíÂá’¶¥†KW-X潬j9²‰Š®Û—Ø(Üxå‡oÊ¿™Ü”´©«Ä¹dÏfÒféæÞ-ž[–ª—æ—n ÙÚ´ ßV´íõöEÛ/—Í(Û»ƒ¶C¹£¿<¸¼e§ÉÎÍ;?T¤TôTúT6îÒݵa×ønÑî{¼ö4ìÕÛ[¼÷ý>ɾÛUUMÕfÕeûIû³÷?®‰ªéø–ûm]­NmqíÇÒý#¶×¹ÔÕÒ=TRÖ+ëGǾþïw- 6 UœÆâ#pDyäé÷ ß÷ :ÚvŒ{¬áÓvg/jBšòšF›Sšû[b[ºOÌ>ÑÖêÞzüGÛœ499â?rýéü§CÏdÏ&žþ¢þË®/~øÕë×Îјѡ—ò—“¿m|¥ýêÀë¯ÛÆÂƾÉx31^ôVûíÁwÜwï£ßOä| (ÿhù±õSЧû“““ÿ˜óüc3-Û cHRMz%€ƒùÿ€éu0ê`:˜o’_ÅF$iIDATxÚÜœg×uç÷v÷ËïMÌ A A€  Š2)R I–ly%Ûå’½k»÷›×ëÚ­ÝrØàÚÕÖ–?زlÉ’,Y‰4%RLbI‰`@$â`€ÌÌ›7/vºa?t¿  ûAƒº5¯ýnß{ú„ÿùŸs[Xk%àY äÒÏ@òÓùcÓa„éÒß*¸©p @èI? túÙ,šø§I@*JˆT9º‚ãG/î·]¾ô³6Ö^k{ЃXøÂO™YÀX¬¶0á ñ˜+ÅSBˆ, ÿËÿþ¢ýOþ—kí0”šWo'R¿(óqk­D –ˆEó‹E·±vá^Öþë)­µ`l")kLR8„Q,qdðºdb¥M£’Ïh”N¤YQ,? ‹‚Œçd2ŒäÀ~ÈìcQ>ü&â˜Þrw`Ø´R¥Èäóä r¥²TÂÉ宋E˜8Fû>¦Õ"ò}ß'R —Rÿ =R Ÿæ£1õÌL^wƒÿÖ|øvz¼,¶ÕB¿ƒÙÍGO!À¦ B|?@I+”Àí ¥´iùÆxĺ«A& ³v)xèš”#%n&Ë´¯8ðüœýî×éyõ'l5š¾JFJÂ0$  Å"ý«VQX½¹l˜¨\!Èxt,t´"2­ ÒÇ›ÜWÇ`-±Š‰‚?ˆÒAÓuQ RJÓ "¤€8Vhc0BÒ˜=OíüZ)„Lb£ãHŒë2Y¡ýÌ#,i/¼ ÙÁaü0DÃðªU 캎ѻîEnÙÆœôh´:„í™(f9‰@ˆd Ä"¸•FÏ.ˆ€ë¡‹E2™ #Ÿ®Süñ^ê?|ˆøí£4Z-”ëR]A±6Cí ÿ•ÓGrø–’“NÎG`c ¹|‘¡«É:ZEÄJE~!¥5 HKb" ­é„®ÄÆ€œ;ž' zâRX¤L"ùµNÀÈ™Sìî´YQéEív›ro£7Ý„»ëz•+8µö*ÎŒÕéÌÍá:×Ë$Nw‰²_auÿjt€šjb-d{z×”3³5ú‹9†NáŸ:Eìy¸} EŇ¿Í?yŠ—×o@¢ÕLîb ÙlŽ5;>ÈÖ߃çºD±"Œ’á:1ÚhÛU¸E²‘&ë*”ëxý%Ú'Þäúí×222‚#—åð‰ŒîÝ˵ÚÐ×Ó‡E`õ5W³îþûioÞÌ©ÚÓ'N Âm™`Ñ"Äû¾°t¤UH!¢˜0Ö8qŠR!ÏŸû+Þx™Ç~H«ÕDKú¹¾ÝbÙÙq‚=÷008ˆÛjkÍñãǙڿ—ë61°y'~«Mk¢Xá8 ­üÓ¼€´1„qL¤”! õ&=…Wï¾µ;n¡¼õÆk”|ͽŠÀÉ娰û&å7¨_½‹¯¼Ä¡çžÇÁ2²ò,ád˜9{’Ï|H×}ÏÂQaÈÀÈr¶Ýñ³x™<&°ŽŠÉuŠ[®Á½û³”6ï@~ñ tª³DÅ2^©Ìªó“D¯î£ôÆÀ²üZÓßù2™©³”µ‰ÀRDÚàÄ £"à"YÂX)M¬-Ú8ÇÕ‚ºóf]ñÚþ×Ð_þsvœ:Foo?mß'Û×Ǧ»î¢\.òê·¿É‘IC}n–ñ×÷³ñŠ+@H"¥14‚5EÁðÊa¬pxo¸Îbâ˜ÁeƒäÊ&š1®€X%n U¯1~rí®$¼a=£TþòÏèŒ$,”qûp_ù1ãòG¼ý{ŒÀ¡Öh’q]ÜL–P)b¥Ñ±&Ž5Ž4hk.Ö k ‘2Ä: ­E:ŒÑþ‡¿äº“‡èï¢íä{{ÙxÏ=d+>ü0í}û(¼yˆÓ·U('þL›DèO±wÍŸù]zËhýÞÓ)$ÆNMV‰ëeR¡[´Ñ´‚€Îùiæfg˜^µ‘þÏÿV}ùÏ‘cÇñ½,îÐC/?Ãäßýf~þ71„L挔"V ¤‰ÁÕ*É ÄE”D2¥ÁÄh¬µ¸®Ç¬ÒÌ>ù[¾Ìpï~ãår¬½ùƒdÉ¡`îÌr#ËXuø5ZõæÖ®Bå Xmˆ­QBr²ÚáøLû}§½FkÐRˆÈëHB^xü!|û&VX,vx”Ñe£ì;F)Žˆ²yœ!V<ý ëð+}&ÆXTªV'8L)³D³çd¬!Öel¢AÒ ,¨\žsoícxïã¬.–ˆ  5?z;½Ÿûc_ù ÁáƒxCXÇÅTzÙr~Gù4Ö­#ð²h?DYˆ£©4Åï1q$®µ8¤°Ä:y¨ÒõXÕ[d¸¯'Nš?ªõ›‘ב{à»ÄͺP$gYýØ·8~Õ¢BcIöªÚLirÌ"¼·H@ ¬AéÄi,Öq¨GŠå/?ÇÚV‘/ ük>°™Ü§™C#×0sïç)ž™ ûÚ øåŒˆR… 3U&^z‘Ú뉲ec™›<ÙˆŠB„ã¾'Y@Ç!½C£¬½ù^¬“GƒÒ†(Žés`÷ÝŸ&»nÚ R, ä¨ˆi*ÿê¿A&C\,ÓS¯²éÀ«»z :ÞJ'‚5´NSª MÌZ‹Öm Êh´°øBb'&X73G1Ÿ§ ö÷Ðûé_ä¹üj<öc¼þúùØdÿ”ò›/Ñ,TÐBâ”+Œ=Âø×þ‚éOÿ6¹L‹àÊ>åChä{g UDÿð­ÞcµWJ´ÑÂjÎÍ6˜2SÔg§p¤\  ½*캛 o½ÎÈ Ðé&ÈåY_«á×fi».Z' cPÖ⦠úE&f-(cÑZ£ DÂâwÚ¬žf™“%Ö†¬#YvëG9°~ûÃt:èÐg|`ˆæ§~—íæ ”¼NÓË¢§§/>Ah,§~ö·¨Œ®fݦ_g°·‚zŽ”£ ç&fˆã¼,j*¥´;-:~W.*Äø”øðÏ’?ö¥æ,A¾HVJÖŽ3£QJw`‡¯­³„€_db6I/ŒÅ"iF!¹™i6DN©@F¬¹r=g–¯à¿ùWÌ?N6—MÒ£Q½ƒŒ ñ3ùýmŸ _H„Ô7̆W~„‘cŸüMÖb8{Š÷Xcq08R$dž×qhkÁËOý€–r°Z/á¶»O¾ÝÓèëç¶Úy\Q6KÏùóDg'˜¾ £ Ölʃ%.H\ÚÄ”…Ikv’ÑÉ1Ü$»Ïg]œí×Qï©pmå,rÛ¤ãÌó–ÖZâž>äŽ_£òäãØCGð3p]ÜÞA6¾ô8Z¸œºï×(xYœ ó¾é[#V[vžŽq\µýeFú{’ÜÍ^\¼®KfûÝ42dN…rIé­W±›o&RÇ(mq â@Ѧ`Ñ>`ÇŽ²bæ,®—%ˆc†G–S»ú&jË73¸bg"œ ·h-º¯ŸC}ëü‹?¦8[¥#²(×ÃídËK?D;§ö|žb&‡ú)!Þ“³îî^X‹2‰“ô×}ô“Ø•WÓœ›EŠK‘y’F©Óc 6zY¬ ŠeòGöS{›je7ì¤<µ@›Kø Ä´ HI;Š):È@è£ 2ä¯ÞΡޕì?x Â`Á^´šIAÀª­Wqó¡·ÈÏTñ³¹DH•~®úÉ0ÒáÔ¿DÉËâ„ö}–“ °“B‚Qœ>_åD}ŒÖìL’L_B¼*{¹b C£klV 3y¼¹*ý'p憵ˆ† T1õ–OÛ!Ýßül(¦Ú ðµ@×g˜#ïeÑÆP.äi]¹“@ûm¤°`õѧVcBÇÿЇɬ\EÎoaEyœr?Û^xˆU9Ç#ô²h ê}ŽnÉWtA¤Õ {|©uYƒù}#œ[»tR¢½ CÇp;m¦Ûçkmêí³ÈÉÅÔôc&[>µ·QšÃñ<¤€âòÌ ¯a¶ÖH ­ Å¥dm–f¥ÂñÏývdE¿žÀy/ƒSîeÇó°úÉoÐp2Ä®—VQ’JÊ{ZÛy“³,âŽ.3ŒÑHÓ«6J8ZÑQçð~ôø)ªQ‚­„ìñX* n¹Æ·uò¢Þ Y%nµ£«˜Ê÷·[HÖ˜¤˜wáP \76)ºÕ)&×ðâ§þ=vp”RÐLØ ˆ”†Ô:ùޱ6¡XSN^K)êí€ê\“ñN)0*‰TÐßœÇIî‹]{–F1º]§Ð˜ÁM[ò@Ø?ÌùÐ0Ûhe]<Ç!ã9xŽƒçH)ˆ/VÚ´Ú‘hÜ©qޝG|â·ùÐw¾@±V¥+erd¬åÆg¿‰q$§n¸‡²5Ha­x‡ì>áÇ…H"Tb!’‚§Ö–X'Ihkb­ÑÆ"½,Q&Ë\Ï¢YE¦5¯R³JN´H³´ÌuA.&°6ùvcƹ… A¾€*m ÖŠv#„À‘"¡R¥“ü΂Všœ]PR)$¹é NŒlB~âw¸å{_@ÖçhåÊÄù"Y)øà³ßDK—±]wSñ›-¥eÅâZ¨ÀØ@æ‚྽ß`åOQ-TÐB,º¿AÛÄD·GÐjô»­-]‡Ðz¾H)›Í¡RV"a¸D@ÚhŒëgò êX)QïŠOlŠEÔW§4Ê’kº cÜógxîŠÝ<ú±ÏSq˜×¤N*¤ûŸýËß|†éBCBu(›©»CûÖÔÊjœ8¦«`Še"›p]4±2`•F¹yüBy!¸i­6F8•ø¨wC¹¶K†‰¤Z¢/pµ6X#±Â›çÙ+>Äc·ÿ2‘ø¡®ú€O<óU–|j®cd²eSÄž\|)}Ѻ´%Ž5^’Mïáq©—À ¬ÒIK§½„ÂZˆ*W¢Sì™W1 ¸Óç‘qR=5&q˜ï8=wºÎ˜´­ ŽqÏŸå©Mæ‰Û?K/ BjÀ§žþ ËŽ¾H5_ÁZ1o Ìû9ó.ë2h „>å ‰—Ο‚J?M#A©tý\*ŠŒ‰ÑžK£2ˆ^¤2gŽ“;!ÖѾÛX¸Câ ßùz+@ªgúOl¾•'oý9zÓÅw5iøô3_aøÄ«Ì*i3gÖ’{èw]“²Ñi0ЪÍgÙJžfÏ ‚Ô¿‘TÎ.FÒZ\¥™XE;&1P?I¾6MäæqÃÎ;ð[+ F/Ò kÑÚ ´Á¾1&" S“<ò;Zó‘g¿C5m}ïˬáçžþ2_—fG7ÓÓ݆%…æòG¤$4­ŸgXE lx„éòáÙVª™\Zƒ§qãÚà æÜLâÀ€l³Åð™#Ø|“FËý3Fc­^ÔikyOÿl"@'3“<¼õ£<ýÁûHÏEèÔÜ–Ígžþ…ñÔò%!Í¢/?7ÍÐÔ)†Òù2€]¹–3n‘¸ÝBˆ„4´\N@„ iU†8;´f^½b`Õ±×pu@,$ÖêËÌ$jIøNß±fap"[äÁ«?Ƴ7ÞÅ`º´€•*â3{ÿ޾ê8õ|™ò= Ò^4×üš,ZhM³fò…4¯8ÐX³™Ó˜(HQ¸^¢BK¢˜16É—Ó+6¥6ØVaÅä T¶˜DÓl`p0ÈôofIm{»Ø‹GwZ¸(á¡q°Bà…>¶:Íw·íaï®;J©‰®Ö«€=G_G6Û´²Ù´§[¢„‡n²®.¿d!@P8{” ¹yÿS^1ʹ‘õLÖšˆTÀÝÎÞ‹EËB/>§G7qÖÍ’]D{l;ø'éÒl’Ý€ ˆÑV‚a!Ì#Ákƒ½Ô0Éâ "?Jôö+„3D:iÁÏømlu†ïl»—®½áôuÁä*`Ç›‡ñ''éä èFèø~¢3‡‰"…A$Ñ Nîc4ÝOð¶]ÇÑü0Ñt™xûd]—ŠX‹5 ¬Á}:å>¯ÃK/jÛÇÞ âq®˜¶ÏFħߢçàCŒœ|Q?GdEBþ/rÒ fvÁ–Ðoc½À¶öÜ5ÜæÚæ+fް2A S›æ®¹‡oÿмTjú±æªï÷Ð 8ÓopKvœŸ‘ÇžÚOF!ˆ¤À;ó&ÛçÎá¥G{Êyü»9ÖŽ!åÙmÊa_ÒI›4´iF޶a.µÿ0=/uë&4‡pQgr=Ígï»Ý×læÊú›ˆN ³Èµ¥¡ü‘ÖÅíÙCìî ¸ã~•Ê¿FnãõlòQg‰q°¼ ™›åÛïçå«w3’<®ke³Ê}{¿Êî‘WüÊ¢¯ý8+ô4Ëõ±W„ú4ÛŽ¾ÀÚT¨.0´sC£œ›˜‘öƒ§ã’>(1ÚÔÌŒF†R‘•ü¼5€ëfƸòèO0n‘Öi¶lÛÁÉõw󌷤ÃÎ\éå[Nñ—á”M3ŸgõÖ<Õà›{ßâ…Ö¾[äÚbéåP±Jo§‰©Íòõí÷óÊÖëI×ÔÒ6`û›oñàÓ¯±÷dHU¹ìÉC6CéàsÜЙÃI¯êïƒ;y»Þ$h´ÒŒÁ¤\{J®\èƒA%aܬVxqĹWÒöÜy_d€=o=ެcGWsâôyàaª/î% :\¹n%ÙŒDi3Ÿjp©ÈeA±Tæøé3¼öÆ!:05†ßj°bÙ 9O`Uœp4¤ß@×k|uû}ìß¼“e)”Ð) 0<9ÎîoþÜ£±jå bÝUpâU>tö –¥×Á›vs8“azüLRþZñÔ’L`iª¡“.RbÉñlgw݈LU³ Œªˆû^ý³¥õD™ÉÀ™½pb?Ùñ¸iëâ¡„¹ôPWú¢ÓD7Z|eëZ³‘¡nH*€ëŒÏ¯Œý„‘-׳÷ô Û_zkSÓÒÀš­àÜæðúÛoc;\!’õÙîºÌs—hP÷ƒNÊ;ÅV““×ÞKË=Ûw²¢œç¤íçÙ×Oaü®ã¤e›Ãè‹KÌVÑÎTh­»™;Ä: ^~;f͵<õÆ9T³‰È¸©0ýt¨Àã¡u[ø%Ý o|’¹EçG7DðÀWþ–|p«ðÒ5¯ï)ßù ~P­ãœ>Iöª ÉÜ:=uÚ}˜‹„–pÒX Q›A°Â"UŒg Üx?Cÿx‚•‘ÏL ýïœ:Büøßóõ[>COFӘܸr^5»‘£±Î-„MŽ4K°â6^Qá°¼úâ1榦ž›¨ÿ…Y‰t°~‹V{–}Û·sSϽÒJ´S'Ù“ÂmƒFîÿ$_껂ןü[nô RŠ…È…™¯ƒ¹D6o ˜ŒJ?«ÄiK‡JئVìå;ï'ÎäèI] Ü=qˆý+êÇ`­„L¦Ë˜§y’NçÒ a ÂZL»Î¡ÃÇyð™}<ùìËÌMN‚#Rµ¿ø{]ót:ˆ:ì»ë3ŒàFŠÀ›À)`0š‚Ü"°yÏÝ<³ý£<¼ïmTs/ã%¾Æ¨EûÖiÐR'=ï+4(ƒEXÃälNã|a€¯^}n&K)µyÜ;7ÎÇ^ÿ>²z "‚Q'w×ßuÙ!0iˉ„›tŽ]þ;Ɇ„عÓÍ6_¼r7ö Ò®Ö¤Zž¶Þz+¯~ð^¾ôÒa8rW&'*EWØKü£¾tá09¸Ù}J1`pz”™Eö~C£ÍÌá£ÌI‡¹R Ú¤³P«ê êݶ8ê¥'‚,TõIVUO³­Uç k)/zmŠRžÍ?÷‚û>Íþ©*ÙžUl½}ŽLÊDÙ\žCs!Oï;ˆñ[H)s³ câ’aÞšD{LŒ°1ƒˆÛ 8Sm’ËfÚMÒn 18Èúë>Æ¥~ÖÙÇùvˆŸ¦&þOñÕרÍk äËŒ+4ól.‡+ž1Ȥ¼Th¢{¦>©jqÚ²vkŽ =všª²´Ó§0 hØÔèÐnth8U|×E‹¨lã¹!ÀD¬a€Ûéc*ÆPJ5¤Ë“·Ò-ï)³b×.¢>Ä#™^¾ÿòÎ> Æà•óˆ%° ÖoTâ׌I„“j’u„Lp‹¤µEE©ÅÉÙ¬î™Õ¥”µ¢8&&žãÅZ‘#ˆùà®°kË «NC>E­Ù¦“~ÓIÍ¢¢“«Ãp>ÇënC¦×9ég³()%­©¯Z¹œ¾k®!Ú¶“—ó}V% £p\d&ƒS(à”Êdz{CÃDƒCÌ•z8"\ÖšzíãgQF"˜Œ—4V]Rk.ÓXœFsÛÍ´"LÎMÁnJ°1566&ZuâN/X»p(äŸðãaÑ~ƒðt7Æ$ò ½=,ë)³|`%C+<ú¥ ×‘‰'DòöG¢„$DÒFP³–©NÀÄù&çžbnf† ÑDhMÆsÉy.BXÐÑ?í9–„VI_*‚ŒnƒÈ‘xìù—ÅÿüÂߨgüº¬hŸ°Ž·àjÄ?õ•/ö—'5«ä,X)‘žG&ŸÇëF±´•.É™5Z)Tu|â0­qDò†×u’(þyëê2¨¤M©è¬!ê[ó»ÖË¿†ÑUÁêë35—5«ã’šý·=óZz mý/ùîÑÕêî‘o3_é¶ð.`!‘6D%ÀNJ™4…vì¿Ø²lÚkd°F!ã¸2úݸ²üÿ àŒK&ã8Öd­¥ì;ƒÿ-«TÙmÏü†0±ƒ™)Å¿¨œÄ"S|dzàÿ_ÞDe“@äx&./{0.þ­0Úf@8[os“¤×V¬p²G»aã6µ>Œµý6‰´‚Ÿ®Ÿ ö#Z:[Þor•}"iai‚˜ªÂÙz›L³ƒ|Ê/õXé ›œVÉŠ…7Tý´ Ȧo.pDÒ<]Oµ§4»@±Ké @ £ ¨|j]^ü§M‹ºÂ1)8ÒÌ¥þ€øÿ "òZöf‰ IEND®B`‚lft-3.8/icons/72x72/dest.png000644 000766 000000 00000021215 12050507714 015444 0ustar00vicwheel000000 000000 ‰PNG  IHDRHHUí³G pHYs.#.#x¥?v OiCCPPhotoshop ICC profilexÚSgTSé=÷ÞôBKˆ€”KoR RB‹€‘&*! Jˆ!¡ÙQÁEEÈ ˆŽŽ€ŒQ, Š Øä!¢Žƒ£ˆŠÊûá{£kÖ¼÷æÍþµ×>ç¬ó³ÏÀ –H3Q5€ ©BàƒÇÄÆáä.@ $p³d!sý#ø~<<+"À¾xÓ ÀM›À0‡ÿêB™\€„Àt‘8K€@zŽB¦@F€˜&S `ËcbãP-`'æÓ€ø™{[”! ‘ eˆDh;¬ÏVŠEX0fKÄ9Ø-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+®ç*x™²<¹$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóýxήÎÎ6޶_-ê¿ÿ"bbãþåÏ«p@át~Ñþ,/³€;€mþ¢%îh^  u÷‹f²@µ éÚWópø~<ß5°j>{‘-¨]cöK'XtÀâ÷ò»oÁÔ(€hƒáÏwÿï?ýG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)¬‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(¼ AÈa!ÚˆbŠX#Ž™…ø!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fº‘;È2‚ü†¼G1”²Q=Ô µC¹¨7„F¢ Ðdt1š ›Ðr´=Œ6¡çЫhÚ>CÇ0Àè3Äl0.ÆÃB±8, “c˱"¬ «Æ°V¬»‰õcϱwEÀ 6wB aAHXLXNØH¨ $4Ú 7 „QÂ'"“¨K´&ºùÄb21‡XH,#Ö/{ˆCÄ7$‰C2'¹I±¤TÒÒFÒnR#é,©›4H#“ÉÚdk²9”, +È…ääÃä3ää!ò[ b@q¤øSâ(RÊjJåå4åe˜2AU£šRݨ¡T5ZB­¡¶R¯Q‡¨4uš9̓IK¥­¢•Óhh÷i¯ètºÝ•N—ÐWÒËéGè—èôw †ƒÇˆg(›gw¯˜L¦Ó‹ÇT071ë˜ç™™oUX*¶*|‘Ê •J•&•*/T©ª¦ªÞª UóUËT©^S}®FU3Sã© Ô–«UªPëSSg©;¨‡ªg¨oT?¤~Yý‰YÃLÃOC¤Q ±_ã¼Æ c³x,!k «†u5Ä&±ÍÙ|v*»˜ý»‹=ª©¡9C3J3W³Ró”f?ã˜qøœtN ç(§—ó~ŠÞï)â)¦4L¹1e\kª–—–X«H«Q«Gë½6®í§¦½E»YûAÇJ'\'GgÎçSÙSݧ §M=:õ®.ªk¥¡»Dw¿n§î˜ž¾^€žLo§Þy½çú}/ýTýmú§õG X³ $Û Î<Å5qo</ÇÛñQC]Ã@C¥a•a—á„‘¹Ñ<£ÕFFŒiÆ\ã$ãmÆmÆ£&&!&KMêMîšRM¹¦)¦;L;LÇÍÌÍ¢ÍÖ™5›=1×2ç›ç›×›ß·`ZxZ,¶¨¶¸eI²äZ¦Yî¶¼n…Z9Y¥XUZ]³F­­%Ö»­»§§¹N“N«žÖgðñ¶É¶©·°åØÛ®¶m¶}agbg·Å®Ã“}º}ý= ‡Ù«Z~s´r:V:ޚΜî?}Åô–é/gXÏÏØ3ã¶Ë)ÄiS›ÓGgg¹sƒóˆ‹‰K‚Ë.—>.›ÆÝȽäJtõq]ázÒõ›³›Âí¨Û¯î6îiî‡ÜŸÌ4Ÿ)žY3sÐÃÈCàQåÑ? Ÿ•0k߬~OCOgµç#/c/‘W­×°·¥wª÷aï>ö>rŸã>ã<7Þ2ÞY_Ì7À·È·ËOÃož_…ßC#ÿdÿzÿѧ€%g‰A[ûøz|!¿Ž?:Ûeö²ÙíAŒ ¹AA‚­‚åÁ­!hÈì­!÷ç˜Î‘Îi…P~èÖÐaæa‹Ã~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DÞ›g1O9¯-J5*>ª.j<Ú7º4º?Æ.fYÌÕXXIlK9.*®6nl¾ßüíó‡ââ ã{˜/È]py¡ÎÂô…§©.,:–@LˆN8”ðA*¨Œ%òw%Ž yÂÂg"/Ñ6шØC\*NòH*Mz’쑼5y$Å3¥,幄'©¼L LÝ›:žšv m2=:½1ƒ’‘qBª!M“¶gêgæfvˬe…²þÅn‹·/•Ék³¬Y- ¶B¦èTZ(×*²geWf¿Í‰Ê9–«ž+Íí̳ÊÛ7œïŸÿíÂá’¶¥†KW-X潬j9²‰Š®Û—Ø(Üxå‡oÊ¿™Ü”´©«Ä¹dÏfÒféæÞ-ž[–ª—æ—n ÙÚ´ ßV´íõöEÛ/—Í(Û»ƒ¶C¹£¿<¸¼e§ÉÎÍ;?T¤TôTúT6îÒݵa×ønÑî{¼ö4ìÕÛ[¼÷ý>ɾÛUUMÕfÕeûIû³÷?®‰ªéø–ûm]­NmqíÇÒý#¶×¹ÔÕÒ=TRÖ+ëGǾþïw- 6 UœÆâ#pDyäé÷ ß÷ :ÚvŒ{¬áÓvg/jBšòšF›Sšû[b[ºOÌ>ÑÖêÞzüGÛœ499â?rýéü§CÏdÏ&žþ¢þË®/~øÕë×Îјѡ—ò—“¿m|¥ýêÀë¯ÛÆÂƾÉx31^ôVûíÁwÜwï£ßOä| (ÿhù±õSЧû“““ÿ˜óüc3-Û cHRMz%€ƒùÿ€éu0ê`:˜o’_ÅF¸IDATxÚÜœ[Œ$×yßß9ÕÝ3œÝÙÙÙ»–âMäJ6-R¤]LÅ–+ÁVd â#’<Hâ  $@‚øÉI+y2` ÉeH¢¤ÐE‹´nË¥¸$w—{™ÙKÏô­ªÎù¾<œSÝ=³=3Ke$;‹Â zûTó¯ïòÿþß©3s@ èóÀ\þ» 8îÏˇ(ó1Ê¿C>(28GE`ˆù‹:u4'¾Ÿ S H6Ž8¾úW¬h8ž­&ªÙGƒÚ‡²EÙ@÷•(F4¸]8¾Rˆü)" þËÿŸíwþÝï!fv8•Ñ[Tá‚þºE¸oÌPK+UÕxbñ=èõþÙçÿÁ?ç«_øB›G.X‘­¦Ê^Yýãî¨þœw—!¶ûËà˜|/Ø?½¶º¿ñÒ+ÿ‚w¿§í,Xx`»ñÓw¶Ëωƒ3²ÙÄ&Žûÿ9.€¦¢‘›7×8yêôïüÏ}æ[¿ÿ»ÿåë,],ò×7¶Gõ‡·F%¢ ª¡¦c a Õ}‚L…ʲ¢×€Ñø,"_æŠñÿ‡àzÃ’ºˆ AUË~úÓ!#ÈÏ0„ `˜ÙO9zŒA•á`HÚîŽâýQ Sä”^WQËÞ°¢A#!&€’ŸÚŽÀv/SòÞÓjwq¾éIŽ!ªŠ½È #„Àp8b0âÄSÖÁáä ÕXÖ!êÖ d¾ 1U±)G½§›%PxO+®]»Äúí[ ‘C4%3T#‹KË<úøZÎC}Ï7MEÒ–• ‡#DUε¢ˆ¢ö†#T[Ô±± M&loµè—÷žh—þü|çOþQwƒ¢U$K:4| ÓHgnžg>ñ7øÈ_û›8‹ñCL#E5£aÉpT!ÎBD< M¦ŽJTF"! ¡hµ)Úm@0Ó}ï’ˆPtæ¸yõ-^þê³DÍSŸüssbˆ‡sŽ:.ÿä'\zþ‹\xòiÞýôGéo®lEªF]Žˆ±3êPS*†£ çý´ÚóÔu  38¶0ϳ¿ôiüéGéu7÷Í–­VÁ Wÿð ´W¯sÄGÌ„QU£!PEÅדÚ| £Ì®£Õ#¾Eá„~Iw¥Çææ6Å~ ¡Õ›—oðÚw^ä½?ÆiqT!¢áááôƒ§1ñ÷F0´®9yæ$sGàævM!PMåÁUÞºµFì<ÌÆí!Þ¹™™KM„2ë[}ÚEAÑîP†@"±ŽÔuÄ;%šÞmAfJ”:&€©Ô'ÔuEöé÷¶Qñã‹Íä@í96{}ðÎSGM †,,ä}ërbé(1Þ»‚âÄ¡ª¼ukj4ÄZí º5²Õï3\ß »Ù €8GË 1F,péœU lUjUŠR!wYPÊd!(ÑŒš4Ÿ‘ßfãöM®|ûË„²œí"&Ð. æ;¤h£RÐ âxsmÀå;ýw¥Ñ!V8‘Dd5RxG‰ç…¯ü1Cý4†™.ª’ã§Ïñ¾O}| Ãp"¨!…E%F%ÝaÙãUª)uT‚Z² §¨&5Í ÊhŽÇœ=~w÷ó™//sõÆ u¨ ªÔÔ ®jBPÕw¤3 ÞQ˜á81ê˜nª+Z¼{iÓÇa³Ø¾jNœ9K\Zäò>jɃ¢‘Ö ‹–€÷ÉCšùMÁ”S< 45˜ ¦”ÃóK§yÏçþ>'—W˜q§‹öÝÛo³ué?qôÈQ“d‡ï°µr•kßþ2¡!™2Ü 8±.Y:uŽG>þk˜Ÿ'¨¢RÕ5Ç=üâg~“Σϰµqg&r’Hî[··U9Ñ,¢aj¨&©ÇŒ»]Ì̈ш¦)ƒ§q }–ÞÒ®nŒ(œ#jDÄ"7Ö·XÕUºë«³ƒ´$uhC†pHH#QT fºS!(¦½#¨5©¡!}HR· ªºFCDUgß}$Dªç’õeé¤.‡Ì?ÉÿöÛœ:¾—îÅ_Ê›w¨ëZÂX T£ýAÁp@1 Äy:^ˆšýÂf€‚h øÑü~ÊÅ8•“»i× p-zk+Ü~ù+„ªÂùÙé^:-Ïb«…E:Ÿ¦iƨ\ºµÉ¯¯¿syT â]ryI5èGá»_û"½à±™Eƒb]±xò,>÷YTŠìb‚’ÕSULË7Ó”Yi>¹X°äJ1«‰Y–¢ŠJDø¹å9ΟòbTÖ4ÁlP¸½Ýçè|çæ=Þ;¼8L2úY Û÷'Z’feÚuùr‡fA:á39Ú&’kÈ>)R2ÇC„VQ€òfm«Ïh8  )œÃMq©b:~DS¶F#ª`Ä"À`ÈYÓ< -\MöIÓ^³pe Ò|ÇË‚²ÂØ´4Tgò Éí9q.»ª 6·û¬2 ;Q˜â¼4ý›AZ“K‰jF¯ ”›œÜáho@ßÅÌ.[Tã÷LÕ.hÓh”‰ßgS>¬-"’S³XŽ‘Íhâ]ˆÈ¸6 Q©Cd{X2Z[ga°N«¬Ðv>‡¦Tòºî"Šh–L7­Ø‰#ÆHo8äŽôÙîöYèt O«h\0ͦiS7;&ÆIÍl|a9DS—-ˆÌ³š²¤I1Dê)C¤ª#Ǩª)BHú¸K’GŒª)æ{ÈäF¡Æì.é&Î¥Дª©»!ལðŽvá)¼§åÓ÷œ8 ï'¾œûün— mãY=õ”æÃ{ǃ4’q`TBŒT!7?c æâ_8É j ûK&ɲ·‹‘²T„wUÅI’K³$€OUx]+Ué[56eï¾Ñn¿½MY–Iç®QÅ;7Ž SñBfñæqW×òüšRB%0ªjÜvíº‹n÷Y‰¶6z8'ã @Æ×´Å%¦zÐiJR–ëÏ”q>ÝþÛQj¨%þ“(·›»ì6Ñ gzWÀ$ÿ_ˆ†ZIÕÐîvÙÞÚbc{ÀJ·ÆÅŠÂ§ )"S`‰ìlÑ4œ&·iš¹5qÆÄS…@k³K_·)ÊŠÒR/ÏMµ¹'Zvyµ©’úò1¯MLóµdbvÅ Tî«5.6áª)åÏå Öa’3½÷@’‚F,ê]D×öu´ªwc ˆÔ"Î9 ßJ Í8©¥ö:¥àˆ–)p¾±jÓˆs€ŸdÇštfÊš+ù JAS³¤*?ZÄ™;°o®9 71I˜¹Ö—=úä÷R¬6ÑÁtG̲' ß'²å›‘31Ĩ©Ôó¼ç.v´e£bQDZhì‹6Ť«&I[™”/J ŠD…ÃÚáa‚†´@qÉÐ5èÁó3AC¦!2)ÀcÌ.Ö°óY’+–Ô9Í|(•¹½c†YLŸ@¥m—d9>—vh;`’kLÇÍizÿùekž’q‘yÇÈÝÛ|vôÅÔ ¥‘<’kMˆXœøø~´ËD{gŒ-Èr@“i©æ€ù™ŒÝ}RœgËÉ '|'}¿]$?f¿ŒŒ ÎF ‰Q¨§’‹iÜbr1;Dkº Q§ðƒÆ©Žc¸e¸‘›-ïŸiAùëyßpæ-#™ê°ÉçûH 1‹“¾½MÎux›ð&î,¼ùÙŸ¯çq6k\l¶¢8)Fc^䄾'ÿÔ‡ö”Ãí¸D§`ûM~6QÜ/¥¥E5×LÊ`"’º÷yŒœÒ+i­Y+×ÈîZc'“n´Er6ó…˜7uêî (âsTTrM#ë&ÀEgHŠMQè\ÚÌ€ ¦ˆ†4¡=]r—gyn8‚´ÃÓœíØ)¤c ˆ© ÍøóF#º»«aYØ¢¹Ô ÈŒVر7ÈùÔ¾-Gà­V Q&i—0nf Ä;êQE\»ÃmX:‡[:C+¾W,±¨cI8ɧޏÕ%n\‡vwêŠÂ'zÑÌzz\®@-SK’ dQÄ Óéödw«Œ%Í]Ÿ;Oáúk[ù…ÖÏû[¼]œ¡û½çyïk/r±\f8wœÂꙑêœcPüÛßç“Nñįþ=^ºx™óßþ#\XáFëa|&uj\#ÕNÀ™r¯)„Óy^“›iî°Ú¸­1Ñ•µ‰Ee`¹w…÷=õ o>öžo}œçƒs]\k.ňlyãqÓ‡*ZÕœ®WxèÉòµíüÁ7È ½S ‹ž]èãZs„¼ãk÷Aœäã Â¹VÉðÈYþû¶øÖ«Ü® >xªÅü|‡X×wk²óôºLŠ2S03°³ŽÅ¯ÆÅ1ËYL\ÁâÒqÞ¸rï^ùܺÊrkÀS>È^ë¦Æb.5Ò¸]YLijpä(—¯\ã{·.B5„î:ÃÞçÏœdnSè‡kw'9›dÚVËS~‚;?ùk?¼›·¹ð¾%Ž=ö$ö£uЀ¹ãšRÃÆëÊ¿Ñ]1(h%‰B #ù³|È${­,?ɹÑEžì¾@(J>ññsíØ£”›_+{ãó錬$ŽÕ¥ œì¾Ì‰r‹µ~Agø6{îýŒN] ¼ú“LwõnZ0¶ £+î<ðg­ùÛ~¹ùÓÿùñg×•ÑÆ:âóÆãt 1¦ù‘×uvšoÒ4Q!ˆ™‹7¢` dz?¨¶æX=ÿ~éåäòqÞ´e¾ñ—o¡ÃE–;2EO“Ø úíEz~œOËMb9âô»~}øY¾öý„ím¤]äëî² W°Hõ¸È)Ž<ò$Ë‹Gøæëë¼þÆCðéãq9º4E¤‘é B;-ÈbÞ\ ™ëäDÁf~Â’«>—WkVË%Ú7û¬¯_Ū…·Ætш¹„°ÜæÒö8ÿ4_äÕ üÅw^gsõ6Ò*Rr˜©}47+]É[d´q‡onndkQ(<â\&€»Ç5 å´k5˜Î¨æUAë„ðØ-,÷|VwsD‡ÅšíÕ[™39hÍÑ<("YƒIçŒw1æq#¤ßåâ«].¾Jº£BzÎÆöJó!-Ô{‡x?&œxÀ;?®ÓvÆ®éN²å¹ÕÞ“Ön{(Šã/h„ñ$äÖÚ&Ûkmö0·O9€ª„Á6e]%všªßlÚ²g¡aML(7î#6¦M ˜1ªu¿GÕ3èoCá÷.XÄA¨ë´“U4¦P’{l›U‹™Nb…Ö€â[-eàÖ¥—él•x­÷yj'›­8¬.éËþ¨D4ߥ°¯Ü!³îòž_öÉ-bäÍ•5ëϳP¾ÏjXÞ¬ê­dþ‘G™_Z„ëx›X»Å=bÆ CÀ…@oá,­Å£|Ø•Tå(í|8@sžRÚ,/Ÿ`ÕKÓ’8¼gê$Í5†š¢=ÇcÇ8¹ÐçÇÅô]Ïi`ãg5Ž.-óÞg>Â+½9BÿÍ ÌtF›±OZ,Å g±@+ŒI‹ëGå±ÇϰtdaÜc?°›+NøŠª |ûû+Ð]'3‚ôO ƒÑˆN»Í'?ö{棬”ªíÿ´àЙ›çâfÉ×_þ1:ìáœKîfÕ°£¿¿ËÅRÀ«q(R÷yõêˆkkÛÌuÚÜËÞ¹(WöyJnѶÈÖµ5æz} wxOéé$é84FÞÞüÁwßdÐݤÕ.vXŽÌhÔ‡ØêvѪĵZˆ…¼ö”fìQLewú‚ĈhÀYÀBEïvÞ;‘LU¸ô€ò¡“å='‰zb,ÝBI¶X:¾ÌÙ÷ü/\]áæk?N‹<ð!™œ¡¼OÕ¾…¤bhÒƒD">%#3Š Ø Z!±©ÂiÖh ü=‰ZIç…íöqªw½›':ƒóEÞqx&ä½£3?ÏWº¼øÃWA­ùÖ½¤©¬ò–¦Ôro,ɼ8ðÒXPZiŒF¨²ÕéÙ¬æ™Õ;)œ¿Ê^—oü ä{oÜÀ;¨‚kÓB¬CM·Û%ÖV ±xa`×£êÖ(ÉzÌjÒ q:"Ícáh Êh@¬Fh]b!Æ’äÞj¾V÷G¬v×øÙ½ ‘ØŽ÷`õ=^Fv½ª%I9.F,D$Tà o‚ÙÞÑ*| »Áhi:DLS‡Àvlþyg?-Vëgý "›ª¯Þá¸f¸f®Äѹ"ëÈ@°zõêUéu©KéY¹ßú²£Q¢ÉzÔ"„ Ú±Òªâ+/¼TýÛÿð_ùÆŸ¿ðÅÅsËÿÑêÑÔ®±ûü9MŸ9ëíëT·æ_t}X¸³QððCõ‘°þ¯Šþ]+‰[f÷½5ìÚ4àê’zñÜÕ‹ïú]‰µ× ÚmïßópÇŒ£CòßtB8Zôïü¶híQ½å÷ÿ¢‰ø–ÖGÏüÏúè¹ß°ŒÄ?ù©è€-šøâcQn}ÊU½_Æl9Kf÷›í–6{±sô[|Y4·AV5ñO~Ê‘ÞB5Ž™+Äœ÷@G&o¨º_Êû•£ t³õtí†(6oƒ ˆ†DÃ|¦Ï’¹’ÜŸAêœÍ@?ÿõÿŽer…ÎÚÃIEND®B`‚lft-3.8/icons/72x72/dark_cloud.png000644 000766 000000 00000016364 12050507714 016625 0ustar00vicwheel000000 000000 ‰PNG  IHDRHHUí³G pHYs.#.#x¥?v OiCCPPhotoshop ICC profilexÚSgTSé=÷ÞôBKˆ€”KoR RB‹€‘&*! Jˆ!¡ÙQÁEEÈ ˆŽŽ€ŒQ, Š Øä!¢Žƒ£ˆŠÊûá{£kÖ¼÷æÍþµ×>ç¬ó³ÏÀ –H3Q5€ ©BàƒÇÄÆáä.@ $p³d!sý#ø~<<+"À¾xÓ ÀM›À0‡ÿêB™\€„Àt‘8K€@zŽB¦@F€˜&S `ËcbãP-`'æÓ€ø™{[”! ‘ eˆDh;¬ÏVŠEX0fKÄ9Ø-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+®ç*x™²<¹$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóýxήÎÎ6޶_-ê¿ÿ"bbãþåÏ«p@át~Ñþ,/³€;€mþ¢%îh^  u÷‹f²@µ éÚWópø~<ß5°j>{‘-¨]cöK'XtÀâ÷ò»oÁÔ(€hƒáÏwÿï?ýG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)¬‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(¼ AÈa!ÚˆbŠX#Ž™…ø!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fº‘;È2‚ü†¼G1”²Q=Ô µC¹¨7„F¢ Ðdt1š ›Ðr´=Œ6¡çЫhÚ>CÇ0Àè3Äl0.ÆÃB±8, “c˱"¬ «Æ°V¬»‰õcϱwEÀ 6wB aAHXLXNØH¨ $4Ú 7 „QÂ'"“¨K´&ºùÄb21‡XH,#Ö/{ˆCÄ7$‰C2'¹I±¤TÒÒFÒnR#é,©›4H#“ÉÚdk²9”, +È…ääÃä3ää!ò[ b@q¤øSâ(RÊjJåå4åe˜2AU£šRݨ¡T5ZB­¡¶R¯Q‡¨4uš9̓IK¥­¢•Óhh÷i¯ètºÝ•N—ÐWÒËéGè—èôw †ƒÇˆg(›gw¯˜L¦Ó‹ÇT071ë˜ç™™oUX*¶*|‘Ê •J•&•*/T©ª¦ªÞª UóUËT©^S}®FU3Sã© Ô–«UªPëSSg©;¨‡ªg¨oT?¤~Yý‰YÃLÃOC¤Q ±_ã¼Æ c³x,!k «†u5Ä&±ÍÙ|v*»˜ý»‹=ª©¡9C3J3W³Ró”f?ã˜qøœtN ç(§—ó~ŠÞï)â)¦4L¹1e\kª–—–X«H«Q«Gë½6®í§¦½E»YûAÇJ'\'GgÎçSÙSݧ §M=:õ®.ªk¥¡»Dw¿n§î˜ž¾^€žLo§Þy½çú}/ýTýmú§õG X³ $Û Î<Å5qo</ÇÛñQC]Ã@C¥a•a—á„‘¹Ñ<£ÕFFŒiÆ\ã$ãmÆmÆ£&&!&KMêMîšRM¹¦)¦;L;LÇÍÌÍ¢ÍÖ™5›=1×2ç›ç›×›ß·`ZxZ,¶¨¶¸eI²äZ¦Yî¶¼n…Z9Y¥XUZ]³F­­%Ö»­»§§¹N“N«žÖgðñ¶É¶©·°åØÛ®¶m¶}agbg·Å®Ã“}º}ý= ‡Ù«Z~s´r:V:ޚΜî?}Åô–é/gXÏÏØ3ã¶Ë)ÄiS›ÓGgg¹sƒóˆ‹‰K‚Ë.—>.›ÆÝȽäJtõq]ázÒõ›³›Âí¨Û¯î6îiî‡ÜŸÌ4Ÿ)žY3sÐÃÈCàQåÑ? Ÿ•0k߬~OCOgµç#/c/‘W­×°·¥wª÷aï>ö>rŸã>ã<7Þ2ÞY_Ì7À·È·ËOÃož_…ßC#ÿdÿzÿѧ€%g‰A[ûøz|!¿Ž?:Ûeö²ÙíAŒ ¹AA‚­‚åÁ­!hÈì­!÷ç˜Î‘Îi…P~èÖÐaæa‹Ã~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DÞ›g1O9¯-J5*>ª.j<Ú7º4º?Æ.fYÌÕXXIlK9.*®6nl¾ßüíó‡ââ ã{˜/È]py¡ÎÂô…§©.,:–@LˆN8”ðA*¨Œ%òw%Ž yÂÂg"/Ñ6шØC\*NòH*Mz’쑼5y$Å3¥,幄'©¼L LÝ›:žšv m2=:½1ƒ’‘qBª!M“¶gêgæfvˬe…²þÅn‹·/•Ék³¬Y- ¶B¦èTZ(×*²geWf¿Í‰Ê9–«ž+Íí̳ÊÛ7œïŸÿíÂá’¶¥†KW-X潬j9²‰Š®Û—Ø(Üxå‡oÊ¿™Ü”´©«Ä¹dÏfÒféæÞ-ž[–ª—æ—n ÙÚ´ ßV´íõöEÛ/—Í(Û»ƒ¶C¹£¿<¸¼e§ÉÎÍ;?T¤TôTúT6îÒݵa×ønÑî{¼ö4ìÕÛ[¼÷ý>ɾÛUUMÕfÕeûIû³÷?®‰ªéø–ûm]­NmqíÇÒý#¶×¹ÔÕÒ=TRÖ+ëGǾþïw- 6 UœÆâ#pDyäé÷ ß÷ :ÚvŒ{¬áÓvg/jBšòšF›Sšû[b[ºOÌ>ÑÖêÞzüGÛœ499â?rýéü§CÏdÏ&žþ¢þË®/~øÕë×Îјѡ—ò—“¿m|¥ýêÀë¯ÛÆÂƾÉx31^ôVûíÁwÜwï£ßOä| (ÿhù±õSЧû“““ÿ˜óüc3-Û cHRMz%€ƒùÿ€éu0ê`:˜o’_ÅFIDATxÚÜœk¬WuÇ{ï™ó¸/_ûÚ¾±ãWâ$'HC( 8¨)EmU¤VB-¢j‹ZQT¤~ /µªDQ«VjE?µ…>è‡V<ª€ äARÄ$رóò+~Äׯ××÷ý8çÌ™Ù{­~˜9k_'¾Ø7w¤­éÎ3û?ký×­½fŒªZ Ê@¨Ç%À²:7-†h#)ö¾D8=@?°¦8 Bq,]^Mù”0…q´€ãñ§i  ^`mqDõ®,èÝÀLçV™ ) Š…ÑȘG"kž0Æ”ð—ÿ/úç÷OU6î5XOý'/VU‹¡–Uf@ÅlDs¤T$¨þM}¾þ§¿úé¿àá/|!fÇ.¢‚k" YH²OÏ&é/9g±Å´…Q ³ œ«='Ehœ¨ù“C'GãÑÏró[+®§*FU·.õáþó3µ/k0˜Y)®h´ã¸oæÍth à}À9˧þìs÷>ò?ß<ä†7ôFÅéÓóIvï\’RŽ"‚(¢ÒI1´¡Z%™.WP ÙLY¨ÕÙ¸~Ã7#i4i$)Æ:¼c`Z$M„Z’Jæs+j¹X½OÛ`#Šb\c­-<]‘àÉÒ”à}qŸW’é² Ìg¤IJ#I±ÖáEZÕÈû@=I±²ÌãC HõúP´sLj‡ÚÌ$óÓ“dÍUÁ¹ˆžA×o¤•ÉÒ„e˲¤2ïIÓ”FšbÇ&€B ÞL‰¬!õ¾ãbרr´ Ï(Žðb{åŽïÿ>gdf|”¬Ñ@%`£ˆÞµ ︕]ïº[Þ¹‡(ªÐl, z•z¶‹Þš©§™z"—$hë])I(Gž4¼/Hú:pD—HÒÀ‘gçÐÃ_aúìIP%.U°ÎaŒAšžéóg¸xê(Ç~ø·îy?ïù•³và $ó3\ž&]ù‘øÌ“f4ó8ç ¡ÃOm€‚Í,#õŽÔ2 ’¾Fé…æ÷äâI’rè‰oðÜ×ÿßlPĺè2SŽËª}dÍ/<úãgNòÀ'þ˜õ7n§17Ý"›×ܼ¹›Áe ܼ ¥™yRH³@Ö"é7.Îv2Æb³Ö‘8òÔczèß1(}ëÖ·Å•¶¸ÒÃà UÆ^~‘Gÿùs|ðSŸ¥ÒÓG³±°H1¿*@Y>œ‚Êå¤*¤^ÈB(¼$üÔ´±kƹ<‚ °ª ! *`N㥇¿ â© ¬»ºèTœ³fx3£G_àÀ׿Ľý}¼(ˆ¼Að/B&B|žA˜Ë,(GÒ{Á‹’…@á§b-ÎE`#Ò 4f&i,̲ kåÞ>z×n Rí%Íšœ|ú;Ô.ž£gÝÆå…îâ·z×®åÔӱ㞽 m¿æüìk[P\Á{Ydm€D…,äà´ÿá't1c,.ŠixÏĉÃ\8ò,sçOÓ\˜A²\”Å•ú6náÆ·¿›êºa¦^9FT®vbð2 ‡IÚÔeAšGl¯JÔÎ.¼(Aro/ï>°8ëX˜ãè·þƒ©£¨¬¸èU'm£Å—E¶×“šDqÌÄøEïûÕáíT×Sªö!YñžŽ’Ì–Hk¾ nQ¾ËÅr@$!€Ö´Ü{u‘!óž3?ü6ÓÇžÍÁ±ײà¢$áŇ¾@©ÚGߦl¼ãÝl¼}®T%$µN•BóDТ–SYÚż„µ”‹™œx±¦Eͨ¥4bzäã/ì+ÜåÚ‚Óª98ç°”IÉ#?bêåƒL=ÀŽü½ë7áësm£— HÁ¹‘S0KE-Äb«ÜT Qc-ÆÅ¨1¨(ZhcÖXTh®%&O$››¢Ô?Èõ,"á\„«ô YÊØ¡ÿ£vñ·=ø)únØŽ¯ÍæInyÚIú¥.&ŠɫϪH¡¤Á`mŒK23ɹ—©Ÿ%$5pÕz6ÜÈÀöÝôlØL:7Emô4ÆšË ù:®ïبDuÝ ÔFOrükŸg÷G?C©g ¾1F±@ÃgÌ.4¨5š`/ÉæëiÆä|Â@Oj,ŠÉ‹õ.¦™&L}†©¾O2qÉš…j ÖÅ”‡6³ñîèÝz¡™tw…­÷TÖ³pö8gÿ2;?ü{E$õ: ó ææjhî/ã e®Þd|®ª8k(UªdIó?xˆÉƒO !ÃUz‰«ý‹¤ºJ qñ #ßþ"·Þ…J+°Ôj0ÖÒ74ÌÄóOÒsÛ»ˆ·ÝÎìL,IPœ-øÕ,ÁAFAB ÞôxcÐù:ßû #ORí$® l/­`r_ûQŸ1âY\¹—X ElcL^•´!KS’$anvÝ÷0›‡wЍ/’‡|YJ¡J($ˆu°œßÿ !5ÊIF¥R!Š"¢(jk-"™qQ¾`¸nàt’§,ËH’„f³I’$8~š¨6 ®DÐFµÍâÂAÇÅŠ|LTQciÌL2{è;퓤A’4˜%ŽcÊå2¥R‰R©„sW²´öµ-Þ( ºiý¶ˆà‹jš¦4›M²+”bµ1«M`û·$ ¨Y´4Ñq1QB6f~äÙìÅ%/œeYûG1DQD©Tj[VEmÀZûn½µàºè¾FËr½÷‹F𦸫,â‹O‰CPrIÓõp/%éVÑ,¨"ÖŒŸ»Êª‹k¯DXÛÊ9‡µvÑè~òÝtØ"²h„¢ã½ï,M½ŽÍZK)²…H¬ K»X^ƒ ¨%×9¯[vh{Wk!K]ãÞª==T«}ˆÏ-ó’.  …H¼îúEºÁ¡ DC4ÆD@%Ê]å Nb«™¨•fظÌjß¶ÜòVÒòµZ-·-úè„l·Ò  ˆdÄC›W58›×TÙü¶=Œ'Bš&(98’‹v.n;E£Ür‚¾Ù ´u7¶Ò»jºç¾ûI7îbdôB;ÿ ­€Ð½ÒÒªä$„$Ál¤zÇÞU νoßÅM{äùÑfç±4ä‚„VZ±@*’'k!¦é}ÇÏQݲkU5K¿k÷-ìý?à¹Z/'O¿BìL‘ æ%½¤Hh»×ÅDsTŸÔ Á3ôÀo±íŽ»é“7oöFð¡½ïåçç3<›m`ßsG0*ù2¶æZJ4 ’·…›¥V5BhUöÁÎÍâ{Øø¾³û–;¨ù>ξÂ\Ý“®€ä3Ž#šäŠMÜeëÖôrë®·pçÏÞOùÖ=>Kâ=#§Nш;>òÛToد×Ú5ª˜T˜ªgœ?3ÊäôF•RŒ5Ñ.•¯%äeãKrÅJºETE[ºÖˆœ¬6Ϲù9ÎÓn0z£©I5__ï\˶·|7¾ÚcÿErê%nî74ëu¾wðeüüÆÙâ™i«Àƒ±†’³Ø8*ºv/yª­{+Q]*YUÍ×?:>'‚(Ùb!W¯aï…ÆÌÇj5¢ri’ßü/~à>nð“|óåüÈq"ç0]Ë0ƈ\þ•|~KmÅ\)¢¸v ÅE3_„¹î¡¯Fצ–l Q)FCJúäW`ô{﹋Ýù_?6Å‘ÃLjb‡3zy›éÕ´s¥WÈæµCVm= ×5™lׂQÂKOÂèîÛó3ìùØòsyñ0&Ž0†é.û7d±{-YrmŒBWí%¬€¬Ÿ^yNî£$[ÞÁopúø)ˆΰ¨+lÙ[‹ZDЯç,Q0SP߉`*ÅþzÁ öèãí·üžùê¿Áú'a×ÜÐVD„ôõ×Á5´‡BhIj¡¸h\g€´™`K½lû…ßdhîç_|šóÓ5˜x¦N#Û߉ÙþèŸ@ðË_°i…ñ"HéÒ:¨}BqÝ9Hc¸Ø··é6vl¿“ácOqæÅýL5òëcvËݼòôaðDn.–uÍY®`AyA¨‹üЍ­»¬A%cjä4œyšs¼ÿ}寮û>¾»ïH®¦Ëq~ÿËá év±¥r1-¸GÂb+Ziï@™â-¯³¸mÇVn~à£<üÒÓ#g ZZ8PÌÓç.&Å~I’Gе_QL\FÆNÁég›KøêwŸåb¦ì0–ßWÙ¢“–°DŸ´Ñœƒ¬¬zlðXY!$½ˆ.„J_;ß³—^_ãèÁý\|ä‹°õ°ãvLð˜-ã].€Ô#â1K7/Hn5’-&ën€VVYªÌßBo_Ìžw2{â§^<ÀÄìᦻp•r>—«M"¥5wi¹çeJZ¥}‚‘ïC¶âÞ倬>ËÈËÓŒÄ%††Ö³õ¶÷ò¶›ßÆÌñç8=~”™¾1=¸«ý`DAÎÚš·q¨µyczÇ.$ÍMT<&¤ØWõç뇜¬ñ “?>Ãäù³ ¬[ÇÖ÷p˦I¦§gˉ­>¹+»[Ѥ0ê!xÔ›WÀè(ŧ…e9]Ú°Â^wä¯%‹ µÉ ž¸@ßÀÖT¨H,Í–€Æ\þµ¢’jÄ£š‘§l!Ðz- ^Hê„4A²&ê}^ëȬ,€ºj5ç7ç§›g-K‹isɧZò¢½ õãS°‘Sƒ3Š(¾“GÎ3;M2ØKæóåÛ.a¿9Ö|LQõÌ{šÃk$­ÚŽæÚÆÁChb¤q-K.ŽŒŒ˜…Y²ú`Þ6kÞì_1¹º$OŒäÖ#À§P 50% }jú·ÿð¯<¹ï©ÿØ´îóš%ª1«å“/W®´ª¤ˆÚ‚ÆÕý©uö{ ÓÛ·e}~ꯢÚÄçܯºê-¨ýÖ£xlÖ$Øôµl`ó?š p6¢Trnçö²*ý ·þ¯ËÞ÷Gµ‰ß5’9¤ýQŠUŒ‘æÈÅ’õ?”õoú7#!¦€Ä¸Ûï€2è€WƸ5çî·éÂûP]§9ï­6»d>f!”ûIeà ¯h˜s˜4îöû-ùW¨ªäy[£62j#_Þ.qI³ç*H‹|ÌñÌÖ3 Ì·„bëkpðF|_-$†)´’Y$„YÍë@­Ø'@öÿÐêZìg¬:IEND®B`‚lft-3.8/icons/72x72/client.png000644 000766 000000 00000016526 12050507714 015774 0ustar00vicwheel000000 000000 ‰PNG  IHDRHHUí³G pHYs.#.#x¥?v OiCCPPhotoshop ICC profilexÚSgTSé=÷ÞôBKˆ€”KoR RB‹€‘&*! Jˆ!¡ÙQÁEEÈ ˆŽŽ€ŒQ, Š Øä!¢Žƒ£ˆŠÊûá{£kÖ¼÷æÍþµ×>ç¬ó³ÏÀ –H3Q5€ ©BàƒÇÄÆáä.@ $p³d!sý#ø~<<+"À¾xÓ ÀM›À0‡ÿêB™\€„Àt‘8K€@zŽB¦@F€˜&S `ËcbãP-`'æÓ€ø™{[”! ‘ eˆDh;¬ÏVŠEX0fKÄ9Ø-0IWfH°·ÀÎ ² 0Qˆ…){`È##x„™FòW<ñ+®ç*x™²<¹$9E[-qWW.(ÎI+6aaš@.Ây™24àóÌ ‘àƒóýxήÎÎ6޶_-ê¿ÿ"bbãþåÏ«p@át~Ñþ,/³€;€mþ¢%îh^  u÷‹f²@µ éÚWópø~<ß5°j>{‘-¨]cöK'XtÀâ÷ò»oÁÔ(€hƒáÏwÿï?ýG %€fI’q^D$.Tʳ?ÇD *°AôÁ,ÀÁÜÁ ü`6„B$ÄÂBB d€r`)¬‚B(†Í°*`/Ô@4ÀQh†“p.ÂU¸=púažÁ(¼ AÈa!ÚˆbŠX#Ž™…ø!ÁH‹$ ɈQ"K‘5H1RŠT UHò=r9‡\Fº‘;È2‚ü†¼G1”²Q=Ô µC¹¨7„F¢ Ðdt1š ›Ðr´=Œ6¡çЫhÚ>CÇ0Àè3Äl0.ÆÃB±8, “c˱"¬ «Æ°V¬»‰õcϱwEÀ 6wB aAHXLXNØH¨ $4Ú 7 „QÂ'"“¨K´&ºùÄb21‡XH,#Ö/{ˆCÄ7$‰C2'¹I±¤TÒÒFÒnR#é,©›4H#“ÉÚdk²9”, +È…ääÃä3ää!ò[ b@q¤øSâ(RÊjJåå4åe˜2AU£šRݨ¡T5ZB­¡¶R¯Q‡¨4uš9̓IK¥­¢•Óhh÷i¯ètºÝ•N—ÐWÒËéGè—èôw †ƒÇˆg(›gw¯˜L¦Ó‹ÇT071ë˜ç™™oUX*¶*|‘Ê •J•&•*/T©ª¦ªÞª UóUËT©^S}®FU3Sã© Ô–«UªPëSSg©;¨‡ªg¨oT?¤~Yý‰YÃLÃOC¤Q ±_ã¼Æ c³x,!k «†u5Ä&±ÍÙ|v*»˜ý»‹=ª©¡9C3J3W³Ró”f?ã˜qøœtN ç(§—ó~ŠÞï)â)¦4L¹1e\kª–—–X«H«Q«Gë½6®í§¦½E»YûAÇJ'\'GgÎçSÙSݧ §M=:õ®.ªk¥¡»Dw¿n§î˜ž¾^€žLo§Þy½çú}/ýTýmú§õG X³ $Û Î<Å5qo</ÇÛñQC]Ã@C¥a•a—á„‘¹Ñ<£ÕFFŒiÆ\ã$ãmÆmÆ£&&!&KMêMîšRM¹¦)¦;L;LÇÍÌÍ¢ÍÖ™5›=1×2ç›ç›×›ß·`ZxZ,¶¨¶¸eI²äZ¦Yî¶¼n…Z9Y¥XUZ]³F­­%Ö»­»§§¹N“N«žÖgðñ¶É¶©·°åØÛ®¶m¶}agbg·Å®Ã“}º}ý= ‡Ù«Z~s´r:V:ޚΜî?}Åô–é/gXÏÏØ3ã¶Ë)ÄiS›ÓGgg¹sƒóˆ‹‰K‚Ë.—>.›ÆÝȽäJtõq]ázÒõ›³›Âí¨Û¯î6îiî‡ÜŸÌ4Ÿ)žY3sÐÃÈCàQåÑ? Ÿ•0k߬~OCOgµç#/c/‘W­×°·¥wª÷aï>ö>rŸã>ã<7Þ2ÞY_Ì7À·È·ËOÃož_…ßC#ÿdÿzÿѧ€%g‰A[ûøz|!¿Ž?:Ûeö²ÙíAŒ ¹AA‚­‚åÁ­!hÈì­!÷ç˜Î‘Îi…P~èÖÐaæa‹Ã~ '…‡…W†?ŽpˆXÑ1—5wÑÜCsßDúD–DÞ›g1O9¯-J5*>ª.j<Ú7º4º?Æ.fYÌÕXXIlK9.*®6nl¾ßüíó‡ââ ã{˜/È]py¡ÎÂô…§©.,:–@LˆN8”ðA*¨Œ%òw%Ž yÂÂg"/Ñ6шØC\*NòH*Mz’쑼5y$Å3¥,幄'©¼L LÝ›:žšv m2=:½1ƒ’‘qBª!M“¶gêgæfvˬe…²þÅn‹·/•Ék³¬Y- ¶B¦èTZ(×*²geWf¿Í‰Ê9–«ž+Íí̳ÊÛ7œïŸÿíÂá’¶¥†KW-X潬j9²‰Š®Û—Ø(Üxå‡oÊ¿™Ü”´©«Ä¹dÏfÒféæÞ-ž[–ª—æ—n ÙÚ´ ßV´íõöEÛ/—Í(Û»ƒ¶C¹£¿<¸¼e§ÉÎÍ;?T¤TôTúT6îÒݵa×ønÑî{¼ö4ìÕÛ[¼÷ý>ɾÛUUMÕfÕeûIû³÷?®‰ªéø–ûm]­NmqíÇÒý#¶×¹ÔÕÒ=TRÖ+ëGǾþïw- 6 UœÆâ#pDyäé÷ ß÷ :ÚvŒ{¬áÓvg/jBšòšF›Sšû[b[ºOÌ>ÑÖêÞzüGÛœ499â?rýéü§CÏdÏ&žþ¢þË®/~øÕë×Îјѡ—ò—“¿m|¥ýêÀë¯ÛÆÂƾÉx31^ôVûíÁwÜwï£ßOä| (ÿhù±õSЧû“““ÿ˜óüc3-Û cHRMz%€ƒùÿ€éu0ê`:˜o’_ÅFIDATxÚÜœÛeÇUÆ«jŸsº§çæ¹ØØqlãÄ8! …<ÅBD!@ð7 !¤<"@ $@ @ð„¸=#BIP.(H ; $Š8äâ83ã¹w÷¹ì½«ÖZ‰Ä´íéÖÖ93}zwÕÚßúÖ·¾ª½ÅÝ0&À.°SßÀƒùåõ0 ]=ÚúšëASƒs 8œ«ï è­ïmíÄR€r JHÇ8>ù¯/ú =à¡ú^Íý“ú»€sÈê0 9`Ž«ÃÕFäãM‘  ¿ñê¿öû‚¸ûEàrM¯óó>ÿB›í'Ý= ÔÀò€¨ÎÆÁ¼DÊÍÒų»¿;?œÿÊÏ}ð×ùØŸýÙˆ§ž¥©\Óí´MÜoû1ê |ˆÑy’k9'Ç7P|Ôºüò‹ÿýòâcúÄoòôÛwâ©]wˆ}Öç®Üý¹AY«g_%îùKÖÞø³càõ·ßóñ¿ýûã#—÷šúñ;‡mzÏAÛ3iÔs[É–¡z@"$k©à@×õLgs¾tG¾ü3¤ô9`§~Þç§‹Ž4ʨA6ÃÌ ýÁãYEŠlÆb¾`6Ÿ#"Îæ—‰ñ0ij)O½Z7]ô¤ÜMÉZäî•ðKŒg2Ùa¼³[Hêu ¡ktíAD6‚ä89g‹–ù|AH×§@ {Àh@¥¬v0ïØ+YK€Ô¬Æ &ªâðÍW®póæu²Ú0†×e… ‹—.qéòÃP)C†ê,^Ôv,-">e!„1Ð "gµé¢ÅlDÒA†/K„͘?ó)>ÿɱ;pD^_‚ÛqÇÜI9ñCïû?ð³ÌgS0[#¢òšs¢]t,Ú ‘œU‰€ $MRcÖö€“rAÑbƒª Q¹ O>|÷þÈqñ‘7Ñu‹×[V1¹ríU>ÿü'yø¡óô)3wE÷Jå Š ”}Û³h{Bˆd³¢VÊY™·=A ¥LVEÍâ) WHY‰A8ûø3Œžz'íÝ[DÂFŽŸ|Z9&»tù%fÝGQ7æmϼK„A¶°Œ)gú¾gÑ÷„ɪP³b Uæ]O„>çUŠ­°¦ jpãÖmzùÓý;b3‚q·V”•X̰œšñ„W^þ&9%Ú>Óöi³û®b1g¥ë3]ŸibBM}þZ€œ¶W&M¦W%çJÒkç‹ÁQ d…ó‚&­rýêW¿Ì­W_ÁÜ7tÆ}çÊx.\~”Koþnb¸êN5§KJ›” ÇÏS¦OJŸ21fTWü´ šÑ¥DŸ#}VRÖJÒ+0„0ìÊD3£K™” Bõ—¾Àü«ŸåÌé3„ '"Á4³èù™ï#>õ ]R‚erÖšFNŸ3}Ê[Tè%åL¯FLÓUo¾ §K™>+}RÒ@ÒëC `b¨AjP³Òg#YOî¼ý-Oóîý)¤/á}?¿šfÄÃÿþÂ?pnwD#°Ÿ21BŸÜ OF—x¯¥rÄ`¨Ûq¹[™¨j-óŽšnhA މ VRHkŠ%5Ú¶Åû–‹§™}Š+3E­»ï¤ÝøˆýÐr«N-ȹ Ú¼H•¡IJZ³BŽrhV²ÉŒFsé ä‚J$s6²•ªê&˜ÝQÌ Ìœ¬FV£ëZ"FlÆ\¹y‹¯ß˜"– ÷9@ %tI±¬hêÈ&ŠšU x½èŠoCPƒª‘³m€b s#i ÎòަŽâ˜/ÖÜéÕéÍéûñL3Þ%Yá á¾óˆ Í#,·êcTlÅt/E(™o"h‡:Y½t1 GÙ¬Ôô*¿äGdxÕG‚Yùl6H)M ãÚúƒ8rŸ½ÈàN&àa„©â–Qv0ÕZM«·:ÌGŽ—ÁÌráU}£05ë"KÕQ7ÔJNª;nGR -êºVµ"(sŸ¹"͈¤†æçû]ÈÌ E ‚’á¹/ÞN•*T1¨Vd˶©—ŠÝi–Ýñ•(«Þo´ƒRôO”šFʉ‰+4czs’Ûêä÷3Åê˜<4¨fÐŒ_Ž÷’^Ydza¾ŠzÜ0à×R¬œÐÔP«hÚC€|©Ó+hÓDƒCÑg/R ÜIL& ª–q)j¿½Ø: hKŠYA˜W¬PlO±ì÷H±ìŽ™*ìNRÇR"JlÒ ñû¯E Ž1S0Eƒ”4wßä5¶•1S¯Ùi¢³NœÍºdWó¥Ýª^`º±RÅGÔ½ê¸UĈ¬ü¿œ€Ÿ&uÜ&ÕdöÂ%¹Ú"Õoö{ŒÉª\x©EèhŠ™ãR…•{©G$`5‡Ñ+ts%ˆ`.E…«a'€ D°¨R¼s7\ËaêË‹o~1IÉÓ,rbº`¶è éæç}âÖaËÙS§p ¡œôH€²UωáʔךÂHzbK ¥•0Õja$g™b‚!¼6¦Ám6õLÌðZîq™s0ï¸q0œ(B ‚„RÌj™wÇÍ‘Z> ”­ îŠa'–bPøÎ´tê.¡j_é aœƒ$¥Ð´)1ïzæ‹ý¢3â ne ‰—+1ëIKÊLF ;£†Q e¾fep®Žy(åÑ ÄN*ÅDêËÄ€f]RÄ`‹ ˜Óe£Ë™¶Ït¹j:+—W­”|Û¦ƒJÉ®ª%¼M™YÛÓÄȸ‰LÆ#Bqš ºê Mî‚kÆšBö'a.íš MÀ$.{ÅÁrɪ,Z®ïÏq+²¤¤˜T4­ ŽË&54kd^ m9iêIÔ”Y›™õ •†ñÝC¦Í!t=Éu…Р͈àJÃÅ—Wâÿ{uHdm 0€›QÆÍ ‘>%¦mÏôpÊù;·93r'´L»Ž&”Z‹Ö jê7.¬7X««é¢µD«,''eI:h×1ï§ØlεÅ.¹[ ³ŽËÓ–Ë‹):2²:„Pƒ¼tnÝ¿cî–åß_i¶²¦Y¸fžzdŸvoÁá¬çÚ]e¾h餾gh®´,MöõóUÞ‚vŒ¤YÓAå`3@€H1Å£Ml!«7¯MÜ:˜òÈÝ;Ü s^ÝŸ3‰Ð„@•ðEA ¼ +$ÉE_CžQñ0x­Q7TKjÏ“3¹{›~”hÕéúŒSìÖc±4êïn[ *•Ëð*k¶ÛTÚ³Ò¼Ù‘^ ©ÛEÌ!=äîˆ!6XlmÁ•.g4­šE‘jM°Z¸;¶»æH 0¨˜aiÎ×þT…QUF(“É3"f®Z:Ûò½.³/;„í)Vú•²jQôÌÐϬH=ªàšË•ÌÒÐ{$äĸi ŒCÄWCrŽïÆòï€s¶ØKF¸Î‰–‰£Óôɹè·A¯š°Åsõ:o³¾õE™nÞ¼bn5ÏýÁnjjN»U­ŠIC–Ý|ÊÍ;ûì.˜xºÿëÒ±a1›r1÷ÄÑ„…o*ÄfYhŠ¥QQ¶¯§•9[©Äøqà |Ù28VÓL ¨ˆ-w[A·$'*Fܾy•ô­°wp@ôû_ꈪœÞÍøÎ÷²HV¬b ¸éª%²âSÛK±À¢¶Vb ~6=éÚ šUwmÐG4JRÌpUGUI.„3—xûcçùí'œÀÊO¹Þ§÷ö˜<ú Ÿ¾¦$M#Å{Œ uç¸T‹eƒ}O¡X8hhôŠ|?ÎAn•tK„Jþf¥ÁI—Ÿå[o~„Ó{§Jt‚»cÅ9X$nᅧXU÷¶¶mgP÷Ç.™àÙ˼‡¢´Ír]žÄJ•Òúz4Å´ I!Æ!bÇÀ­>üŸ7^“}Cu#& ʨ Fßp ë|¶¬¬–àÔêŒo/ó^¡eè’°Ì?rÆÁÖuU®íϹq7Ó´‡ô!rÂÈ9ª(ceÍ.6被 êÀAÛûCÇêN:­ ¶-—Î7V5Tge½úº¥„²3D¸3s÷¿þ…Kû=ÒN !¾NvRFe¨_Ìð‹‡ÓŠKº•©j­*d§ußðæ÷š7I¶@ïðÄw=ÉÓâ|k4ã¡‹oââ¹3¸½ÆûÍk[sûî>×oÝåÂCñô›ezá2òõR™=Ämu~)z7eâÑÕ´*©¥UøšRÚä-ÜyÛãÜz圊ǿÿ½Ü>ÿ óÙáÖÍ'õC £áK/~šÇ'Ÿåéw¿ŸýóOñ«7iû«µbéµYÊ|‘›½Æ¦’ˆL7›·µ%H¼›smø«ç{¸õu~bïÏ}ý:¾ÞÃìÄ×p;žX„›ßà§ÏòÂW®ñ±ë‡pðj¹¸£6ŽÇû ‡Fu[³ê•ÍQÛðu—c3Aæ7xäú‹XêhSâTÚÝ=nÿǧ9uõ€¨ík¾_QNàðÔ.7¿ø§¯Þe7:gv'Ì~7&o¦Éí‘_*s¥6¬¾M(âŽ[®iµ~x=‡!©å­§Z¾÷é'9{î<6Þ#ä–÷½mŽˆ0ü6 ~h`ç Q;ÞÿÎŽë·ïÂü7¿ë!>z»¡o£7IÚ­Š¼{m^¨¹ç úg3@^{™ÉÎ=û.î>ô,óÙ·Œ „^'EL–Kâ1RóÒá‹|Oü"{{§ ·µÂu²¬êw™^[•´y½9ÈVÖÀZŠ nŒE¸rû}ù+ܹu›åµášoósª7^æ‰ 3‚fÔP+ëhk)Æbêu'ì–fÏG*˜®U± ,'úv ‹)Ú„“Hõ=âÿ-­1PgL*þ9à–KÕòÍ*6ƒhÜÊAC7Žå™ê¿«Ñ=*®w1ÆO=‹CìàV1®¶…ÁÐ9sö.TËWO§ÎM6Û¯óS»GŠá«¨®Žuéš5ü\üDƒc8=¿Á»&/3ÙÙ+‹Çvk(w„«ãù»crÎu}¬¬~”q³5Å0e}ƒÐ&‚ÁäëÇ ÍÕÇ+$O²1u@!œ¿ÌÛ~ðûyâ±GiSÚÒ;çwGü×¾ðü?¥n&­ËÒ¦ÇSŒUŠ-oÑ=ÖÍ›%°\]‹æ°¾2ô[¾ú¹ù S±]þúkÆÎ+¯nöŠëD%Âb>‡vÊ(®íäZŽ{rimÎv-'=@- ”W´‰i=q<ñ2žÚ97^9(ªð1ýiÄQ½ý`à ¾ÉA¶žbÛz1¯Ücº‰¢õ^Ìʾã&F\òJ;œ¸ó4‘ÿs []!¶aß³ëZ6›ð%…Ø@%Û8ÈtEbÃë€j÷ põÆMö¯Ì`qñ¤ôjsR7%Û„¸$é¼Y\†´–}Òâ…ƒ‚+Á3A3ÁV$¬âÏÌû¿ö5›Þë ùõýp†lÆ(1žb¹wFŽop#¨âY‘ÜCh¢ QœÐPŸ“3jbfÿíù=R.žIXZØoôvÜRÃFóAkíÛi» ¡<;‡ë/¿ü²L÷Ióóà~ßocz½ÉÄ zÌrcŒ¾ùÄ Ÿéïÿ‚úÔ 9ûè…?òÔ®nä•å‘/÷Š/] W«UÛðÑîgÛæÂïnÞixò‰t:ßþ­fvó—4Œê¦làTœfÃ-RG:ûèߤ³ý±h2à› ãqŒoyrâΙE¼ô;“œÏ4³›?/–"6<”â”{)DqdéÌ#—Î<ú—bÚ·Vâ;žk€ øY—8A¢6ÝÁs¡Ÿþ0îêOZ޽aª“3/ÚÎÙωeÇõä:pKâ;ž ”§PíRòvÎC#^v?Ndõ„ª5@uUB£X6`¿¢g8„âð48²X>%–wÈp›Ø[ëË­µšÏY}mô?‚ ±|’þnIEND®B`‚lft-3.8/include/net/000755 000766 000000 00000000000 13263007004 014275 5ustar00vicwheel000000 000000 lft-3.8/include/netinet/000755 000766 000000 00000000000 13263007004 015155 5ustar00vicwheel000000 000000 lft-3.8/include/sys/000755 000766 000000 00000000000 13263007004 014325 5ustar00vicwheel000000 000000 lft-3.8/include/win32/000755 000766 000000 00000000000 13263007004 014451 5ustar00vicwheel000000 000000 lft-3.8/include/libpcap/000755 000766 000000 00000000000 13263007004 015121 5ustar00vicwheel000000 000000 lft-3.8/include/libpcap/bittypes.h000755 000766 000000 00000007445 11053131665 017160 0ustar00vicwheel000000 000000 /* * Copyright (C) 1999 WIDE Project. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the project nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. */ #ifndef _BITTYPES_H #define _BITTYPES_H #ifndef HAVE_U_INT8_T #if SIZEOF_CHAR == 1 typedef unsigned char u_int8_t; typedef signed char int8_t; #elif SIZEOF_INT == 1 typedef unsigned int u_int8_t; typedef signed int int8_t; #else /* XXX */ #error "there's no appropriate type for u_int8_t" #endif #define HAVE_U_INT8_T 1 #define HAVE_INT8_T 1 #endif /* HAVE_U_INT8_T */ #ifndef HAVE_U_INT16_T #if SIZEOF_SHORT == 2 typedef unsigned short u_int16_t; typedef signed short int16_t; #elif SIZEOF_INT == 2 typedef unsigned int u_int16_t; typedef signed int int16_t; #elif SIZEOF_CHAR == 2 typedef unsigned char u_int16_t; typedef signed char int16_t; #else /* XXX */ #error "there's no appropriate type for u_int16_t" #endif #define HAVE_U_INT16_T 1 #define HAVE_INT16_T 1 #endif /* HAVE_U_INT16_T */ #ifndef HAVE_U_INT32_T #if SIZEOF_INT == 4 typedef unsigned int u_int32_t; typedef signed int int32_t; #elif SIZEOF_LONG == 4 typedef unsigned long u_int32_t; typedef signed long int32_t; #elif SIZEOF_SHORT == 4 typedef unsigned short u_int32_t; typedef signed short int32_t; #else /* XXX */ #error "there's no appropriate type for u_int32_t" #endif #define HAVE_U_INT32_T 1 #define HAVE_INT32_T 1 #endif /* HAVE_U_INT32_T */ #ifndef HAVE_U_INT64_T #if SIZEOF_LONG_LONG == 8 typedef unsigned long long u_int64_t; #elif defined(_MSC_EXTENSIONS) typedef unsigned _int64 u_int64_t; #elif SIZEOF_INT == 8 typedef unsigned int u_int64_t; #elif SIZEOF_LONG == 8 typedef unsigned long u_int64_t; #elif SIZEOF_SHORT == 8 typedef unsigned short u_int64_t; #else /* XXX */ #error "there's no appropriate type for u_int64_t" #endif #endif /* HAVE_U_INT64_T */ #ifndef PRId64 #ifdef _MSC_EXTENSIONS #define PRId64 "I64d" #else /* _MSC_EXTENSIONS */ #define PRId64 "lld" #endif /* _MSC_EXTENSIONS */ #endif /* PRId64 */ #ifndef PRIo64 #ifdef _MSC_EXTENSIONS #define PRIo64 "I64o" #else /* _MSC_EXTENSIONS */ #define PRIo64 "llo" #endif /* _MSC_EXTENSIONS */ #endif /* PRIo64 */ #ifndef PRIx64 #ifdef _MSC_EXTENSIONS #define PRIx64 "I64x" #else /* _MSC_EXTENSIONS */ #define PRIx64 "llx" #endif /* _MSC_EXTENSIONS */ #endif /* PRIx64 */ #ifndef PRIu64 #ifdef _MSC_EXTENSIONS #define PRIu64 "I64u" #else /* _MSC_EXTENSIONS */ #define PRIu64 "llu" #endif /* _MSC_EXTENSIONS */ #endif /* PRIu64 */ #endif /* _BITTYPES_H */ lft-3.8/include/libpcap/Gnuc.h000755 000766 000000 00000001417 11053131665 016202 0ustar00vicwheel000000 000000 /* @(#) $Header: /tcpdump/master/libpcap/Win32/Include/Gnuc.h,v 1.1 2002/08/01 08:33:05 risso Exp $ (LBL) */ /* Define __P() macro, if necessary */ #ifndef __P #if __STDC__ #define __P(protos) protos #else #define __P(protos) () #endif #endif /* inline foo */ #ifndef __cplusplus #ifdef __GNUC__ #define inline __inline #else #define inline #endif #endif /* * Handle new and old "dead" routine prototypes * * For example: * * __dead void foo(void) __attribute__((volatile)); * */ #ifdef __GNUC__ #ifndef __dead #define __dead volatile #endif #if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) #ifndef __attribute__ #define __attribute__(args) #endif #endif #else #ifndef __dead #define __dead #endif #ifndef __attribute__ #define __attribute__(args) #endif #endif lft-3.8/include/win32/wingettimeofday.c000755 000766 000000 00000004461 11053131665 020032 0ustar00vicwheel000000 000000 #if defined(WIN32) || defined(_WIN32) #include "wingettimeofday.h" #include #ifndef __GNUC__ #define EPOCHFILETIME (116444736000000000i64) #else #define EPOCHFILETIME (116444736000000000LL) #endif int __gettimeofday(struct timeval* tv, void * tz) { struct _timeb currSysTime; _ftime(&currSysTime); tv->tv_sec = currSysTime.time; tv->tv_usec = currSysTime.millitm * 1000; return 0; } LARGE_INTEGER getFILETIMEoffset() { SYSTEMTIME s; FILETIME f; LARGE_INTEGER t; s.wYear = 1970; s.wMonth = 1; s.wDay = 1; s.wHour = 0; s.wMinute = 0; s.wSecond = 0; s.wMilliseconds = 0; SystemTimeToFileTime(&s, &f); t.QuadPart = f.dwHighDateTime; t.QuadPart <<= 32; t.QuadPart |= f.dwLowDateTime; return (t); } int gettimeofday(struct timeval *tv, void * tz) { LARGE_INTEGER t; FILETIME f; double microseconds; static LARGE_INTEGER offset; static LARGE_INTEGER base; static double frequencyToMicroseconds; static int initialized = 0; static BOOL usePerformanceCounter = 0; if(!initialized) { LARGE_INTEGER performanceFrequency; initialized = 1; usePerformanceCounter = QueryPerformanceFrequency(&performanceFrequency); if(usePerformanceCounter) { LARGE_INTEGER tmpoffs; QueryPerformanceCounter(&offset); frequencyToMicroseconds = (double)performanceFrequency.QuadPart / 1000000.; tmpoffs = getFILETIMEoffset(); GetSystemTimeAsFileTime(&f); base.QuadPart = f.dwHighDateTime; base.QuadPart <<= 32; base.QuadPart |= f.dwLowDateTime; base.QuadPart -= tmpoffs.QuadPart; microseconds = (double)base.QuadPart / 10; base.QuadPart = microseconds; tv->tv_sec = base.QuadPart / 1000000; tv->tv_usec = base.QuadPart % 1000000; } else { offset = getFILETIMEoffset(); frequencyToMicroseconds = 10.; base.QuadPart=0i64; } } if(usePerformanceCounter) QueryPerformanceCounter(&t); else { GetSystemTimeAsFileTime(&f); t.QuadPart = f.dwHighDateTime; t.QuadPart <<= 32; t.QuadPart |= f.dwLowDateTime; } t.QuadPart -= offset.QuadPart; microseconds = (double)t.QuadPart / frequencyToMicroseconds; t.QuadPart = microseconds + base.QuadPart; tv->tv_sec = t.QuadPart / 1000000; tv->tv_usec = t.QuadPart % 1000000; return (0); } #endif lft-3.8/include/win32/wingetopt.h000755 000766 000000 00000000350 11053131665 016651 0ustar00vicwheel000000 000000 #ifndef WINGETOPT_H #define WINGETOPT_H #ifdef __cplusplus extern "C"{ #endif extern int optind, opterr; extern char *optarg; int getopt(int argc, char *argv[], char *optstring); #ifdef __cplusplus } #endif #endif lft-3.8/include/win32/wingettimeofday.h000755 000766 000000 00000000322 11053131665 020027 0ustar00vicwheel000000 000000 #ifndef WINGETTIMEOFDAY_H #define WINGETTIMEOFDAY_H #include #ifdef __cplusplus extern "C"{ #endif int gettimeofday(struct timeval* tp, void* tzp); #ifdef __cplusplus } #endif #endif lft-3.8/include/win32/wingetopt.c000755 000766 000000 00000002155 11053131665 016651 0ustar00vicwheel000000 000000 #if defined(WIN32) || defined(_WIN32) #include "wingetopt.h" #include char *optarg; // global argument pointer int optind = 0; // global argv index int getopt(int argc, char *argv[], char *optstring) { static char *next = NULL; char c, * cp; if (optind == 0) next = NULL; optarg = NULL; if (next == NULL || *next == '\0') { if (optind == 0) optind++; if (optind >= argc || argv[optind][0] != '-' || argv[optind][1] == '\0') { optarg = NULL; if (optind < argc) optarg = argv[optind]; return -1; } if (strcmp(argv[optind], "--") == 0) { optind++; optarg = NULL; if (optind < argc) optarg = argv[optind]; return -1; } next = argv[optind]; next++; // skip past - optind++; } c = *next++; cp = strchr(optstring, c); if (cp == NULL || c == ':') return '?'; cp++; if (*cp == ':') { if (*next != '\0') { optarg = next; next = NULL; } else if (optind < argc) { optarg = argv[optind]; optind++; } else { return '?'; } } return c; } #endif lft-3.8/include/win32/winlft_ifname.c000755 000766 000000 00000052302 11053131665 017452 0ustar00vicwheel000000 000000 #if defined(WIN32) || defined(_WIN32) #include #include #include #include #include #include #include #include #include "../../lft_ifname.h" typedef enum { KWV_UNKNOWN, //while unknown (before first call of this module) KWV_VISTA, //Vista KWV_2K, //98/ME, NTSP4, W2K and XP KWV_NT4, //NT4 with SP<4 KWV_95 //Win95 }KNOWN_WIN_VERSION; static KNOWN_WIN_VERSION VerifyWindowsVersion() { static KNOWN_WIN_VERSION WinVersion=KWV_UNKNOWN; OSVERSIONINFOEX osvi; BOOL bOsVersionInfoEx; if(WinVersion!=KWV_UNKNOWN) return WinVersion; // Try calling GetVersionEx using the OSVERSIONINFOEX structure. // If that fails, try using the OSVERSIONINFO structure. ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX)); osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); if(!(bOsVersionInfoEx = GetVersionEx((OSVERSIONINFO *) &osvi))) { osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); if(!GetVersionEx( (OSVERSIONINFO *) &osvi)) return KWV_UNKNOWN; } switch(osvi.dwPlatformId) { case VER_PLATFORM_WIN32_NT: //Test for the Windows NT product family if(osvi.dwMajorVersion<=4) //NT4 { if(osvi.wServicePackMajor<4) WinVersion=KWV_NT4; else WinVersion=KWV_2K; } else { if(osvi.dwMajorVersion>5) WinVersion=KWV_VISTA; else WinVersion=KWV_2K; //2K and XP } break; case VER_PLATFORM_WIN32_WINDOWS: //Test for the Windows Me/98/95 default: WinVersion=KWV_95; break; } return WinVersion; } static u_long lft_getifaddr_95(const char *argifname) { HKEY key; char ethname[5]="eth/"; char pppname[5]="ppp/"; int i; FILETIME update; LONG res; DWORD size; u_long ret; char ifname[256]; if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"Enum\\Network\\MSTCP", 0, KEY_READ, &key) != ERROR_SUCCESS) return -1; size = sizeof(ifname); for(i=0;(res = RegEnumKeyEx(key, i, (LPTSTR)ifname, &size, 0, 0, 0, &update))!=ERROR_NO_MORE_ITEMS;i++) { HKEY ifkey, subkey; DWORD dsize,ipsize,npsize,asize; char driver[256], classname[256], netname[256]; char adapter[256], ip[256], np[256]; if(res != ERROR_SUCCESS || RegOpenKeyEx(key, (LPCTSTR)ifname, 0, KEY_READ, &ifkey) != ERROR_SUCCESS) continue; dsize = sizeof(driver); if(RegQueryValueEx(ifkey, L"Driver", 0, NULL, (unsigned char *)driver, &dsize) != ERROR_SUCCESS) { RegCloseKey(ifkey); continue; } strcpy(classname, "System\\CurrentControlSet\\Services\\Class\\"); strcat(classname, driver); if((res = RegOpenKeyEx(HKEY_LOCAL_MACHINE, (LPCTSTR)classname, 0, KEY_READ, &subkey)) != ERROR_SUCCESS) { RegCloseKey(ifkey); continue; } ipsize=sizeof(ip); npsize=sizeof(np); if(RegQueryValueEx(subkey, L"IPAddress", 0, NULL, (unsigned char *) ip, &ipsize) == ERROR_SUCCESS) { ret=inet_addr(ip); RegCloseKey (subkey); strcpy(netname, "System\\CurrentControlSet\\Services\\Class\\Net\\"); strcat(netname, ifname); if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, (LPCTSTR)netname, 0, KEY_READ, &subkey) != ERROR_SUCCESS) { RegCloseKey(ifkey); continue; } asize=sizeof(adapter); if( RegQueryValueEx (subkey, L"AdapterName", 0, NULL, (unsigned char *) adapter, &asize) == ERROR_SUCCESS && !strcmp(adapter, "MS$PPP")) { pppname[3]++; } else { ethname[3]++; } RegCloseKey(subkey); RegCloseKey(ifkey); if(!strcmp(pppname,argifname) || !strcmp(ethname,argifname)) break; else ret=-1; } } RegCloseKey(key); return ret; } static char * lft_getifname_95(struct in_addr addr) { HKEY key; char ethname[5]="eth/"; char pppname[5]="ppp/"; int i; FILETIME update; LONG res; DWORD size; u_long ret; int isethaddr,isfound; char ifname[256]; if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"Enum\\Network\\MSTCP", 0, KEY_READ, &key) != ERROR_SUCCESS) return NULL; size = sizeof(ifname); for(i=0;(res = RegEnumKeyEx(key, i, (TCHAR *)ifname, &size, 0, 0, 0, &update))!=ERROR_NO_MORE_ITEMS;i++) { HKEY ifkey, subkey; DWORD dsize,ipsize,npsize,asize; char driver[256], classname[256], netname[256]; char adapter[256], ip[256], np[256]; if(res != ERROR_SUCCESS || RegOpenKeyEx(key, (LPCTSTR)ifname, 0, KEY_READ, &ifkey) != ERROR_SUCCESS) continue; dsize = sizeof(driver); if(RegQueryValueEx(ifkey, L"Driver", 0, NULL, (unsigned char *)driver, &dsize) != ERROR_SUCCESS) { RegCloseKey(ifkey); continue; } strcpy(classname, "System\\CurrentControlSet\\Services\\Class\\"); strcat(classname, driver); if((res = RegOpenKeyEx(HKEY_LOCAL_MACHINE, (LPCTSTR)classname, 0, KEY_READ, &subkey)) != ERROR_SUCCESS) { RegCloseKey(ifkey); continue; } ipsize=sizeof(ip); npsize=sizeof(np); if(RegQueryValueEx(subkey, L"IPAddress", 0, NULL, (unsigned char *) ip, &ipsize) == ERROR_SUCCESS) { ret=inet_addr(ip); RegCloseKey (subkey); strcpy(netname, "System\\CurrentControlSet\\Services\\Class\\Net\\"); strcat(netname, ifname); if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, (LPCTSTR)netname, 0, KEY_READ, &subkey) != ERROR_SUCCESS) { RegCloseKey(ifkey); continue; } asize=sizeof(adapter); if( RegQueryValueEx (subkey, L"AdapterName", 0, NULL, (unsigned char *) adapter, &asize) == ERROR_SUCCESS && !strcmp(adapter, "MS$PPP")) { pppname[3]++; isethaddr=0; } else { ethname[3]++; isethaddr=1; } RegCloseKey(subkey); RegCloseKey(ifkey); if(ret==addr.s_addr) { isfound=1; break; } else isfound=0; } } RegCloseKey(key); if(!isfound) return NULL; if(isethaddr) return strdup(ethname); return strdup(pppname); } static u_long lft_getifaddr_NT4(const char *ifname) { HKEY key; char devname[256]; struct sockaddr_in *sa = NULL; struct sockaddr *so = NULL; DWORD size; int cnt = 1,isfound; u_long ret; char *binding = (char *)0; if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Linkage", 0, KEY_READ, &key) == ERROR_SUCCESS) { if(RegQueryValueEx(key, L"Bind", NULL, NULL, NULL, &size) == ERROR_SUCCESS) { binding = (char *)_alloca(size); if(RegQueryValueEx (key, L"Bind", NULL, NULL, (unsigned char *)binding, &size) != ERROR_SUCCESS) binding = NULL; } RegCloseKey(key); } if(binding) { char *bp, eth[2] = "/"; int ipsize; char cardkey[256], ipaddress[256]; for(bp = binding; *bp; bp+=strlen(bp)+1) { bp += strlen("\\Device\\"); strcpy(cardkey, "SYSTEM\\CurrentControlSet\\Services\\"); strcat(cardkey, bp); strcat(cardkey, "\\Parameters\\Tcpip"); if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, (LPCTSTR)cardkey, 0, KEY_READ, &key) != ERROR_SUCCESS) continue; ipsize=256; if(RegQueryValueEx(key, L"IPAddress", NULL, NULL, (unsigned char *) ipaddress, &ipsize) == ERROR_SUCCESS) { char *ip; for(ip = ipaddress; *ip; ip += strlen(ip)+1) { if(!strncmp(bp, "NdisWan", 7)) { strcpy(devname, "ppp"); strcat(devname, bp + 7); } else { eth[0]++; strcpy(devname, "eth"); strcat(devname, eth); } ret=inet_addr(ipaddress); if(!ret) { ipsize=256; if(RegQueryValueEx (key, L"DhcpIPAddress", NULL, NULL, (unsigned char *) ipaddress, &ipsize) == ERROR_SUCCESS) { ret=inet_addr(ipaddress); } } if(!strcmp(devname,ifname)) { isfound=1; break; } else isfound=0; } } RegCloseKey(key); if(isfound) return ret; } } return -1; } static char * lft_getifname_NT4(struct in_addr addr) { HKEY key; char devname[256]; struct sockaddr_in *sa = NULL; struct sockaddr *so = NULL; DWORD size; int cnt = 1,isfound; u_long ret; char *binding = (char *)0; if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, L"SYSTEM\\CurrentControlSet\\Services\\Tcpip\\Linkage", 0, KEY_READ, &key) == ERROR_SUCCESS) { if(RegQueryValueEx(key, L"Bind", NULL, NULL, NULL, &size) == ERROR_SUCCESS) { binding = (char *)_alloca(size); if(RegQueryValueEx (key, L"Bind", NULL, NULL, (unsigned char *)binding, &size) != ERROR_SUCCESS) binding = NULL; } RegCloseKey(key); } if(binding) { char *bp, eth[2] = "/"; int ipsize; char cardkey[256]; char ipaddress[256]; for(bp = binding; *bp; bp+=strlen(bp)+1) { bp += strlen("\\Device\\"); strcpy(cardkey, "SYSTEM\\CurrentControlSet\\Services\\"); strcat(cardkey, bp); strcat(cardkey, "\\Parameters\\Tcpip"); if(RegOpenKeyEx(HKEY_LOCAL_MACHINE, (LPCTSTR)cardkey, 0, KEY_READ, &key) != ERROR_SUCCESS) continue; ipsize=256; if(RegQueryValueEx(key, L"IPAddress", NULL, NULL, (unsigned char *) ipaddress, &ipsize) == ERROR_SUCCESS) { char *ip; for(ip = ipaddress; *ip; ip += strlen(ip)+1) { if(!strncmp(bp, "NdisWan", 7)) { strcpy(devname, "ppp"); strcat(devname, bp + 7); } else { eth[0]++; strcpy(devname, "eth"); strcat(devname, eth); } ret=inet_addr(ipaddress); if(!ret) { ipsize=256; if(RegQueryValueEx (key, L"DhcpIPAddress", NULL, NULL, (unsigned char *) ipaddress, &ipsize) == ERROR_SUCCESS) { ret=inet_addr(ipaddress); } } if(addr.s_addr==ret) { isfound=1; break; } else isfound=0; } } RegCloseKey(key); if(isfound) return strdup(devname); } } return NULL; } static u_long lft_getifaddr_2K(const char *ifname) { int cnt = 0; int ethId = 0, pppId = 0, slpId = 0, tokId = 0; DWORD ip_cnt; DWORD siz_ip_table = 0; PMIB_IPADDRTABLE ipt; PMIB_IFROW ifrow; char devname[256]; typedef struct { DWORD ifIndex; size_t count; unsigned int enumerated; // for eth0:1 unsigned int classId; // for eth0, tok0 ... } ifcount_t; ifcount_t *iflist, *ifEntry; if(GetIpAddrTable (NULL, &siz_ip_table, TRUE) == ERROR_INSUFFICIENT_BUFFER) { ifrow = (PMIB_IFROW)_alloca(sizeof(MIB_IFROW)); ipt = (PMIB_IPADDRTABLE)_alloca(siz_ip_table); } if(GetIpAddrTable (ipt, &siz_ip_table, TRUE) != NO_ERROR) return -1; iflist = (ifcount_t *) alloca(sizeof(ifcount_t)*(ipt->dwNumEntries + 1)); memset(iflist, 0, sizeof (ifcount_t) * (ipt->dwNumEntries + 1)); for(ip_cnt = 0; ip_cnt < ipt->dwNumEntries; ++ip_cnt) { ifEntry = iflist; /* search for matching entry (and stop at first free entry) */ while(ifEntry->count != 0) { if(ifEntry->ifIndex == ipt->table[ip_cnt].dwIndex) break; ifEntry++; } if(ifEntry->count == 0) { ifEntry->count = 1; ifEntry->ifIndex = ipt->table[ip_cnt].dwIndex; } else { ifEntry->count++; } } // reset the last element. This is just the stopper for the loop. iflist[ipt->dwNumEntries].count = 0; for(ip_cnt = 0; ip_cnt < ipt->dwNumEntries; ip_cnt++) { ifcount_t *ifEntry = iflist; memset(ifrow, 0, sizeof(MIB_IFROW)); ifrow->dwIndex = ipt->table[ip_cnt].dwIndex; if(GetIfEntry(ifrow) != NO_ERROR) continue; /* search for matching entry (and stop at first free entry) */ while(ifEntry->count != 0) { if(ifEntry->ifIndex == ipt->table[ip_cnt].dwIndex) break; ifEntry++; } /* Setup the interface name */ switch(ifrow->dwType) { case MIB_IF_TYPE_TOKENRING: if(ifEntry->enumerated == 0) { ifEntry->classId = tokId++; sprintf(devname, "tok%u", ifEntry->classId); } else { sprintf(devname, "tok%u:%u", ifEntry->classId, ifEntry->enumerated - 1); } ifEntry->enumerated++; break; #ifdef IF_TYPE_IEEE80211 case IF_TYPE_IEEE80211: #endif case MIB_IF_TYPE_ETHERNET: if(ifEntry->enumerated == 0) { ifEntry->classId = ethId++; sprintf(devname, "eth%u", ifEntry->classId); } else { sprintf(devname, "eth%u:%u", ifEntry->classId, ifEntry->enumerated - 1); } ifEntry->enumerated++; break; case MIB_IF_TYPE_PPP: if(ifEntry->enumerated == 0) { ifEntry->classId = pppId++; sprintf(devname, "ppp%u", ifEntry->classId); } else { sprintf(devname, "ppp%u:%u", ifEntry->classId, ifEntry->enumerated - 1); } ifEntry->enumerated++; break; case MIB_IF_TYPE_SLIP: if(ifEntry->enumerated == 0) { ifEntry->classId = slpId++; sprintf(devname, "slp%u", ifEntry->classId); } else { sprintf(devname, "slp%u:%u", ifEntry->classId, ifEntry->enumerated - 1); } ifEntry->enumerated++; break; case MIB_IF_TYPE_LOOPBACK: strcpy(devname, "lo"); break; default: continue; } if(!strcmp(devname,ifname)) { return ipt->table[ip_cnt].dwAddr; } } return -1; } static char * lft_getifname_2K(struct in_addr addr) { int cnt = 0; int ethId = 0, pppId = 0, slpId = 0, tokId = 0; DWORD ip_cnt; DWORD siz_ip_table = 0; PMIB_IPADDRTABLE ipt; PMIB_IFROW ifrow; static char devname[256]; static struct in_addr savedaddr; static int FirstTime=1; typedef struct { DWORD ifIndex; size_t count; unsigned int enumerated; // for eth0:1 unsigned int classId; // for eth0, tok0 ... } ifcount_t; ifcount_t *iflist, *ifEntry; if(!FirstTime && savedaddr.s_addr==addr.s_addr) { return strdup(devname); } savedaddr.s_addr=addr.s_addr; if(GetIpAddrTable (NULL, &siz_ip_table, TRUE) == ERROR_INSUFFICIENT_BUFFER) { ifrow = (PMIB_IFROW)_alloca(sizeof(MIB_IFROW)); ipt = (PMIB_IPADDRTABLE)_alloca(siz_ip_table); } if(GetIpAddrTable (ipt, &siz_ip_table, TRUE) != NO_ERROR) return NULL; iflist = (ifcount_t *) alloca(sizeof(ifcount_t)*(ipt->dwNumEntries + 1)); memset(iflist, 0, sizeof (ifcount_t) * (ipt->dwNumEntries + 1)); for(ip_cnt = 0; ip_cnt < ipt->dwNumEntries; ++ip_cnt) { ifEntry = iflist; /* search for matching entry (and stop at first free entry) */ while(ifEntry->count != 0) { if(ifEntry->ifIndex == ipt->table[ip_cnt].dwIndex) break; ifEntry++; } if(ifEntry->count == 0) { ifEntry->count = 1; ifEntry->ifIndex = ipt->table[ip_cnt].dwIndex; } else { ifEntry->count++; } } // reset the last element. This is just the stopper for the loop. iflist[ipt->dwNumEntries].count = 0; for(ip_cnt = 0; ip_cnt < ipt->dwNumEntries; ip_cnt++) { ifcount_t *ifEntry = iflist; memset(ifrow, 0, sizeof(MIB_IFROW)); ifrow->dwIndex = ipt->table[ip_cnt].dwIndex; if(GetIfEntry(ifrow) != NO_ERROR) continue; /* search for matching entry (and stop at first free entry) */ while(ifEntry->count != 0) { if(ifEntry->ifIndex == ipt->table[ip_cnt].dwIndex) break; ifEntry++; } /* Setup the interface name */ switch(ifrow->dwType) { case MIB_IF_TYPE_TOKENRING: if(ifEntry->enumerated == 0) { ifEntry->classId = tokId++; sprintf(devname, "tok%u", ifEntry->classId); } else { sprintf(devname, "tok%u:%u", ifEntry->classId, ifEntry->enumerated - 1); } ifEntry->enumerated++; break; #ifdef IF_TYPE_IEEE80211 case IF_TYPE_IEEE80211: #endif case MIB_IF_TYPE_ETHERNET: if(ifEntry->enumerated == 0) { ifEntry->classId = ethId++; sprintf(devname, "eth%u", ifEntry->classId); } else { sprintf(devname, "eth%u:%u", ifEntry->classId, ifEntry->enumerated - 1); } ifEntry->enumerated++; break; case MIB_IF_TYPE_PPP: if(ifEntry->enumerated == 0) { ifEntry->classId = pppId++; sprintf(devname, "ppp%u", ifEntry->classId); } else { sprintf(devname, "ppp%u:%u", ifEntry->classId, ifEntry->enumerated - 1); } ifEntry->enumerated++; break; case MIB_IF_TYPE_SLIP: if(ifEntry->enumerated == 0) { ifEntry->classId = slpId++; sprintf(devname, "slp%u", ifEntry->classId); } else { sprintf(devname, "slp%u:%u", ifEntry->classId, ifEntry->enumerated - 1); } ifEntry->enumerated++; break; case MIB_IF_TYPE_LOOPBACK: strcpy(devname, "lo"); break; default: continue; } if(addr.s_addr==ipt->table[ip_cnt].dwAddr) { FirstTime=0; return strdup(devname); } } return NULL; } u_long lft_getifaddr (const char *ifname) { switch(VerifyWindowsVersion()) { case KWV_95: return lft_getifaddr_95(ifname); case KWV_2K: case KWV_VISTA: return lft_getifaddr_2K(ifname); case KWV_NT4: return lft_getifaddr_NT4(ifname); } return -1; } char * lft_getifname (struct in_addr addr) { static char ifname[256]; static struct in_addr savedaddr; static int FirstTime=1; char * ret; if(!FirstTime && savedaddr.s_addr==addr.s_addr) { return strdup(ifname); } switch(VerifyWindowsVersion()) { case KWV_95: ret=lft_getifname_95(addr); break; case KWV_2K: case KWV_VISTA: ret=lft_getifname_2K(addr); break; case KWV_NT4: ret=lft_getifname_NT4(addr); break; } savedaddr.s_addr=addr.s_addr; FirstTime=0; strncpy(ifname,ret,255); return ret; } #ifdef LFT_IFADDR_TESTING extern int main (int argc, char *argv[]) { struct in_addr in; char *addr; if (argc > 1) addr = strdup (argv[1]); else addr = strdup ("eth0"); in.s_addr = lft_getifaddr (addr); if (in.s_addr == -1) { fprintf (stderr, "%s: Error reading ifname\n", addr); fflush (stderr); free(addr); exit (-1); } fprintf (stdout, "%s: %s\n", addr, inet_ntoa (in)); fflush (stdout); free (addr); exit (0); } #endif /*LFT_IFNAME_TESTING*/ #endif lft-3.8/include/sys/mbuf.h000755 000766 000000 00000000105 11053131665 015434 0ustar00vicwheel000000 000000 #ifndef MLEN #define MLEN 128 /* needed for slcompress.h */ #endif lft-3.8/include/netinet/tcp.h000755 000766 000000 00000007154 11053131665 016134 0ustar00vicwheel000000 000000 /* * Copyright (c) 1982, 1986, 1993 * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * @(#)tcp.h 8.1 (Berkeley) 6/10/93 */ typedef u_long tcp_seq; /* * TCP header. * Per RFC 793, September, 1981. */ struct tcphdr { u_short th_sport; /* source port */ u_short th_dport; /* destination port */ tcp_seq th_seq; /* sequence number */ tcp_seq th_ack; /* acknowledgement number */ #if BYTE_ORDER == LITTLE_ENDIAN u_char th_x2:4, /* (unused) */ th_off:4; /* data offset */ #endif #if BYTE_ORDER == BIG_ENDIAN u_char th_off:4, /* data offset */ th_x2:4; /* (unused) */ #endif u_char th_flags; #define TH_FIN 0x01 #define TH_SYN 0x02 #define TH_RST 0x04 #define TH_PUSH 0x08 #define TH_ACK 0x10 #define TH_URG 0x20 u_short th_win; /* window */ u_short th_sum; /* checksum */ u_short th_urp; /* urgent pointer */ }; #define TCPOPT_EOL 0 #define TCPOPT_NOP 1 #define TCPOPT_MAXSEG 2 #define TCPOLEN_MAXSEG 4 #define TCPOPT_WINDOW 3 #define TCPOLEN_WINDOW 3 #define TCPOPT_SACK_PERMITTED 4 /* Experimental */ #define TCPOLEN_SACK_PERMITTED 2 #define TCPOPT_SACK 5 /* Experimental */ #define TCPOPT_TIMESTAMP 8 #define TCPOLEN_TIMESTAMP 10 #define TCPOLEN_TSTAMP_APPA (TCPOLEN_TIMESTAMP+2) /* appendix A */ #define TCPOPT_TSTAMP_HDR \ (TCPOPT_NOP<<24|TCPOPT_NOP<<16|TCPOPT_TIMESTAMP<<8|TCPOLEN_TIMESTAMP) /* * Default maximum segment size for TCP. * With an IP MSS of 576, this is 536, * but 512 is probably more convenient. * This should be defined as MIN(512, IP_MSS - sizeof (struct tcpiphdr)). */ #define TCP_MSS 512 #define TCP_MAXWIN 65535 /* largest value for (unscaled) window */ #define TCP_MAX_WINSHIFT 14 /* maximum window shift */ /* * User-settable options (used with setsockopt). */ #ifndef TCP_NODELAY #define TCP_NODELAY 0x01 /* don't delay send to coalesce packets */ #endif #ifndef TCP_MAXSEG #define TCP_MAXSEG 0x02 /* set maximum segment size */ #endif lft-3.8/include/netinet/ip_icmp.h000755 000766 000000 00000014530 11053131665 016762 0ustar00vicwheel000000 000000 /* * Copyright (c) 1982, 1986, 1993 * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * @(#)ip_icmp.h 8.1 (Berkeley) 6/10/93 */ /* * Interface Control Message Protocol Definitions. * Per RFC 792, September 1981. */ /* * Structure of an icmp header. */ struct icmp { u_char icmp_type; /* type of message, see below */ u_char icmp_code; /* type sub code */ u_short icmp_cksum; /* ones complement cksum of struct */ union { u_char ih_pptr; /* ICMP_PARAMPROB */ struct in_addr ih_gwaddr; /* ICMP_REDIRECT */ struct ih_idseq { n_short icd_id; n_short icd_seq; } ih_idseq; int ih_void; /* ICMP_UNREACH_NEEDFRAG -- Path MTU Discovery (RFC1191) */ struct ih_pmtu { n_short ipm_void; n_short ipm_nextmtu; } ih_pmtu; } icmp_hun; #define icmp_pptr icmp_hun.ih_pptr #define icmp_gwaddr icmp_hun.ih_gwaddr #define icmp_id icmp_hun.ih_idseq.icd_id #define icmp_seq icmp_hun.ih_idseq.icd_seq #define icmp_void icmp_hun.ih_void #define icmp_pmvoid icmp_hun.ih_pmtu.ipm_void #define icmp_nextmtu icmp_hun.ih_pmtu.ipm_nextmtu union { struct id_ts { n_time its_otime; n_time its_rtime; n_time its_ttime; } id_ts; struct id_ip { struct ip idi_ip; /* options and then 64 bits of data */ } id_ip; u_long id_mask; char id_data[1]; } icmp_dun; #define icmp_otime icmp_dun.id_ts.its_otime #define icmp_rtime icmp_dun.id_ts.its_rtime #define icmp_ttime icmp_dun.id_ts.its_ttime #define icmp_ip icmp_dun.id_ip.idi_ip #define icmp_mask icmp_dun.id_mask #define icmp_data icmp_dun.id_data }; /* * Lower bounds on packet lengths for various types. * For the error advice packets must first insure that the * packet is large enought to contain the returned ip header. * Only then can we do the check to see if 64 bits of packet * data have been returned, since we need to check the returned * ip header length. */ #define ICMP_MINLEN 8 /* abs minimum */ #define ICMP_TSLEN (8 + 3 * sizeof (n_time)) /* timestamp */ #define ICMP_MASKLEN 12 /* address mask */ #define ICMP_ADVLENMIN (8 + sizeof (struct ip) + 8) /* min */ #define ICMP_ADVLEN(p) (8 + ((p)->icmp_ip.ip_hl << 2) + 8) /* N.B.: must separately check that ip_hl >= 5 */ /* * Definition of type and code field values. */ #define ICMP_ECHOREPLY 0 /* echo reply */ #define ICMP_UNREACH 3 /* dest unreachable, codes: */ #define ICMP_UNREACH_NET 0 /* bad net */ #define ICMP_UNREACH_HOST 1 /* bad host */ #define ICMP_UNREACH_PROTOCOL 2 /* bad protocol */ #define ICMP_UNREACH_PORT 3 /* bad port */ #define ICMP_UNREACH_NEEDFRAG 4 /* IP_DF caused drop */ #define ICMP_UNREACH_SRCFAIL 5 /* src route failed */ #define ICMP_UNREACH_NET_UNKNOWN 6 /* unknown net */ #define ICMP_UNREACH_HOST_UNKNOWN 7 /* unknown host */ #define ICMP_UNREACH_ISOLATED 8 /* src host isolated */ #define ICMP_UNREACH_NET_PROHIB 9 /* prohibited access */ #define ICMP_UNREACH_HOST_PROHIB 10 /* ditto */ #define ICMP_UNREACH_TOSNET 11 /* bad tos for net */ #define ICMP_UNREACH_TOSHOST 12 /* bad tos for host */ #define ICMP_SOURCEQUENCH 4 /* packet lost, slow down */ #define ICMP_REDIRECT 5 /* shorter route, codes: */ #define ICMP_REDIRECT_NET 0 /* for network */ #define ICMP_REDIRECT_HOST 1 /* for host */ #define ICMP_REDIRECT_TOSNET 2 /* for tos and net */ #define ICMP_REDIRECT_TOSHOST 3 /* for tos and host */ #define ICMP_ECHO 8 /* echo service */ #define ICMP_ROUTERADVERT 9 /* router advertisement */ #define ICMP_ROUTERSOLICIT 10 /* router solicitation */ #define ICMP_TIMXCEED 11 /* time exceeded, code: */ #define ICMP_TIMXCEED_INTRANS 0 /* ttl==0 in transit */ #define ICMP_TIMXCEED_REASS 1 /* ttl==0 in reass */ #define ICMP_PARAMPROB 12 /* ip header bad */ #define ICMP_PARAMPROB_OPTABSENT 1 /* req. opt. absent */ #define ICMP_TSTAMP 13 /* timestamp request */ #define ICMP_TSTAMPREPLY 14 /* timestamp reply */ #define ICMP_IREQ 15 /* information request */ #define ICMP_IREQREPLY 16 /* information reply */ #define ICMP_MASKREQ 17 /* address mask request */ #define ICMP_MASKREPLY 18 /* address mask reply */ #define ICMP_MAXTYPE 18 #define ICMP_INFOTYPE(type) \ ((type) == ICMP_ECHOREPLY || (type) == ICMP_ECHO || \ (type) == ICMP_ROUTERADVERT || (type) == ICMP_ROUTERSOLICIT || \ (type) == ICMP_TSTAMP || (type) == ICMP_TSTAMPREPLY || \ (type) == ICMP_IREQ || (type) == ICMP_IREQREPLY || \ (type) == ICMP_MASKREQ || (type) == ICMP_MASKREPLY) #ifdef KERNEL void icmp_error __P((struct mbuf *, int, int, n_long, struct ifnet *)); void icmp_input __P((struct mbuf *, int)); void icmp_reflect __P((struct mbuf *)); void icmp_send __P((struct mbuf *, struct mbuf *)); int icmp_sysctl __P((int *, u_int, void *, size_t *, void *, size_t)); #endif lft-3.8/include/netinet/tcpip.h000755 000766 000000 00000004734 11053131665 016466 0ustar00vicwheel000000 000000 /* * Copyright (c) 1982, 1986, 1993 * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * @(#)tcpip.h 8.1 (Berkeley) 6/10/93 */ /* * Tcp+ip header, after ip options removed. */ struct tcpiphdr { struct ipovly ti_i; /* overlaid ip structure */ struct tcphdr ti_t; /* tcp header */ }; #define ti_next ti_i.ih_next #define ti_prev ti_i.ih_prev #define ti_x1 ti_i.ih_x1 #define ti_pr ti_i.ih_pr #define ti_len ti_i.ih_len #define ti_src ti_i.ih_src #define ti_dst ti_i.ih_dst #define ti_sport ti_t.th_sport #define ti_dport ti_t.th_dport #define ti_seq ti_t.th_seq #define ti_ack ti_t.th_ack #define ti_x2 ti_t.th_x2 #define ti_off ti_t.th_off #define ti_flags ti_t.th_flags #define ti_win ti_t.th_win #define ti_sum ti_t.th_sum #define ti_urp ti_t.th_urp lft-3.8/include/netinet/tcp_var.h000755 000766 000000 00000027663 11053131665 017013 0ustar00vicwheel000000 000000 /* * Copyright (c) 1982, 1986, 1993, 1994, 1995 * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * @(#)tcp_var.h 8.4 (Berkeley) 5/24/95 */ /* * Kernel variables for tcp. */ /* * Tcp control block, one per tcp; fields: */ struct tcpcb { struct tcpiphdr *seg_next; /* sequencing queue */ struct tcpiphdr *seg_prev; short t_state; /* state of this connection */ short t_timer[TCPT_NTIMERS]; /* tcp timers */ short t_rxtshift; /* log(2) of rexmt exp. backoff */ short t_rxtcur; /* current retransmit value */ short t_dupacks; /* consecutive dup acks recd */ u_short t_maxseg; /* maximum segment size */ char t_force; /* 1 if forcing out a byte */ u_short t_flags; #define TF_ACKNOW 0x0001 /* ack peer immediately */ #define TF_DELACK 0x0002 /* ack, but try to delay it */ #define TF_NODELAY 0x0004 /* don't delay packets to coalesce */ #define TF_NOOPT 0x0008 /* don't use tcp options */ #define TF_SENTFIN 0x0010 /* have sent FIN */ #define TF_REQ_SCALE 0x0020 /* have/will request window scaling */ #define TF_RCVD_SCALE 0x0040 /* other side has requested scaling */ #define TF_REQ_TSTMP 0x0080 /* have/will request timestamps */ #define TF_RCVD_TSTMP 0x0100 /* a timestamp was received in SYN */ #define TF_SACK_PERMIT 0x0200 /* other side said I could SACK */ struct tcpiphdr *t_template; /* skeletal packet for transmit */ struct inpcb *t_inpcb; /* back pointer to internet pcb */ /* * The following fields are used as in the protocol specification. * See RFC783, Dec. 1981, page 21. */ /* send sequence variables */ tcp_seq snd_una; /* send unacknowledged */ tcp_seq snd_nxt; /* send next */ tcp_seq snd_up; /* send urgent pointer */ tcp_seq snd_wl1; /* window update seg seq number */ tcp_seq snd_wl2; /* window update seg ack number */ tcp_seq iss; /* initial send sequence number */ u_long snd_wnd; /* send window */ /* receive sequence variables */ u_long rcv_wnd; /* receive window */ tcp_seq rcv_nxt; /* receive next */ tcp_seq rcv_up; /* receive urgent pointer */ tcp_seq irs; /* initial receive sequence number */ /* * Additional variables for this implementation. */ /* receive variables */ tcp_seq rcv_adv; /* advertised window */ /* retransmit variables */ tcp_seq snd_max; /* highest sequence number sent; * used to recognize retransmits */ /* congestion control (for slow start, source quench, retransmit after loss) */ u_long snd_cwnd; /* congestion-controlled window */ u_long snd_ssthresh; /* snd_cwnd size threshhold for * for slow start exponential to * linear switch */ /* * transmit timing stuff. See below for scale of srtt and rttvar. * "Variance" is actually smoothed difference. */ u_short t_idle; /* inactivity time */ short t_rtt; /* round trip time */ tcp_seq t_rtseq; /* sequence number being timed */ short t_srtt; /* smoothed round-trip time */ short t_rttvar; /* variance in round-trip time */ u_short t_rttmin; /* minimum rtt allowed */ u_long max_sndwnd; /* largest window peer has offered */ /* out-of-band data */ char t_oobflags; /* have some */ char t_iobc; /* input character */ #define TCPOOB_HAVEDATA 0x01 #define TCPOOB_HADDATA 0x02 short t_softerror; /* possible error not yet reported */ /* RFC 1323 variables */ u_char snd_scale; /* window scaling for send window */ u_char rcv_scale; /* window scaling for recv window */ u_char request_r_scale; /* pending window scaling */ u_char requested_s_scale; u_long ts_recent; /* timestamp echo data */ u_long ts_recent_age; /* when last updated */ tcp_seq last_ack_sent; /* TUBA stuff */ caddr_t t_tuba_pcb; /* next level down pcb for TCP over z */ }; #define intotcpcb(ip) ((struct tcpcb *)(ip)->inp_ppcb) #define sototcpcb(so) (intotcpcb(sotoinpcb(so))) /* * The smoothed round-trip time and estimated variance * are stored as fixed point numbers scaled by the values below. * For convenience, these scales are also used in smoothing the average * (smoothed = (1/scale)sample + ((scale-1)/scale)smoothed). * With these scales, srtt has 3 bits to the right of the binary point, * and thus an "ALPHA" of 0.875. rttvar has 2 bits to the right of the * binary point, and is smoothed with an ALPHA of 0.75. */ #define TCP_RTT_SCALE 8 /* multiplier for srtt; 3 bits frac. */ #define TCP_RTT_SHIFT 3 /* shift for srtt; 3 bits frac. */ #define TCP_RTTVAR_SCALE 4 /* multiplier for rttvar; 2 bits */ #define TCP_RTTVAR_SHIFT 2 /* multiplier for rttvar; 2 bits */ /* * The initial retransmission should happen at rtt + 4 * rttvar. * Because of the way we do the smoothing, srtt and rttvar * will each average +1/2 tick of bias. When we compute * the retransmit timer, we want 1/2 tick of rounding and * 1 extra tick because of +-1/2 tick uncertainty in the * firing of the timer. The bias will give us exactly the * 1.5 tick we need. But, because the bias is * statistical, we have to test that we don't drop below * the minimum feasible timer (which is 2 ticks). * This macro assumes that the value of TCP_RTTVAR_SCALE * is the same as the multiplier for rttvar. */ #define TCP_REXMTVAL(tp) \ (((tp)->t_srtt >> TCP_RTT_SHIFT) + (tp)->t_rttvar) /* XXX * We want to avoid doing m_pullup on incoming packets but that * means avoiding dtom on the tcp reassembly code. That in turn means * keeping an mbuf pointer in the reassembly queue (since we might * have a cluster). As a quick hack, the source & destination * port numbers (which are no longer needed once we've located the * tcpcb) are overlayed with an mbuf pointer. */ #define REASS_MBUF(ti) (*(struct mbuf **)&((ti)->ti_t)) /* * TCP statistics. * Many of these should be kept per connection, * but that's inconvenient at the moment. */ struct tcpstat { u_long tcps_connattempt; /* connections initiated */ u_long tcps_accepts; /* connections accepted */ u_long tcps_connects; /* connections established */ u_long tcps_drops; /* connections dropped */ u_long tcps_conndrops; /* embryonic connections dropped */ u_long tcps_closed; /* conn. closed (includes drops) */ u_long tcps_segstimed; /* segs where we tried to get rtt */ u_long tcps_rttupdated; /* times we succeeded */ u_long tcps_delack; /* delayed acks sent */ u_long tcps_timeoutdrop; /* conn. dropped in rxmt timeout */ u_long tcps_rexmttimeo; /* retransmit timeouts */ u_long tcps_persisttimeo; /* persist timeouts */ u_long tcps_keeptimeo; /* keepalive timeouts */ u_long tcps_keepprobe; /* keepalive probes sent */ u_long tcps_keepdrops; /* connections dropped in keepalive */ u_long tcps_sndtotal; /* total packets sent */ u_long tcps_sndpack; /* data packets sent */ u_long tcps_sndbyte; /* data bytes sent */ u_long tcps_sndrexmitpack; /* data packets retransmitted */ u_long tcps_sndrexmitbyte; /* data bytes retransmitted */ u_long tcps_sndacks; /* ack-only packets sent */ u_long tcps_sndprobe; /* window probes sent */ u_long tcps_sndurg; /* packets sent with URG only */ u_long tcps_sndwinup; /* window update-only packets sent */ u_long tcps_sndctrl; /* control (SYN|FIN|RST) packets sent */ u_long tcps_rcvtotal; /* total packets received */ u_long tcps_rcvpack; /* packets received in sequence */ u_long tcps_rcvbyte; /* bytes received in sequence */ u_long tcps_rcvbadsum; /* packets received with ccksum errs */ u_long tcps_rcvbadoff; /* packets received with bad offset */ u_long tcps_rcvshort; /* packets received too short */ u_long tcps_rcvduppack; /* duplicate-only packets received */ u_long tcps_rcvdupbyte; /* duplicate-only bytes received */ u_long tcps_rcvpartduppack; /* packets with some duplicate data */ u_long tcps_rcvpartdupbyte; /* dup. bytes in part-dup. packets */ u_long tcps_rcvoopack; /* out-of-order packets received */ u_long tcps_rcvoobyte; /* out-of-order bytes received */ u_long tcps_rcvpackafterwin; /* packets with data after window */ u_long tcps_rcvbyteafterwin; /* bytes rcvd after window */ u_long tcps_rcvafterclose; /* packets rcvd after "close" */ u_long tcps_rcvwinprobe; /* rcvd window probe packets */ u_long tcps_rcvdupack; /* rcvd duplicate acks */ u_long tcps_rcvacktoomuch; /* rcvd acks for unsent data */ u_long tcps_rcvackpack; /* rcvd ack packets */ u_long tcps_rcvackbyte; /* bytes acked by rcvd acks */ u_long tcps_rcvwinupd; /* rcvd window update packets */ u_long tcps_pawsdrop; /* segments dropped due to PAWS */ u_long tcps_predack; /* times hdr predict ok for acks */ u_long tcps_preddat; /* times hdr predict ok for data pkts */ u_long tcps_pcbcachemiss; u_long tcps_persistdrop; /* timeout in persist state */ u_long tcps_badsyn; /* bogus SYN, e.g. premature ACK */ }; #ifdef KERNEL struct inpcb tcb; /* head of queue of active tcpcb's */ struct tcpstat tcpstat; /* tcp statistics */ u_long tcp_now; /* for RFC 1323 timestamps */ int tcp_attach __P((struct socket *)); void tcp_canceltimers __P((struct tcpcb *)); struct tcpcb * tcp_close __P((struct tcpcb *)); void tcp_ctlinput __P((int, struct sockaddr *, struct ip *)); int tcp_ctloutput __P((int, struct socket *, int, int, struct mbuf **)); struct tcpcb * tcp_disconnect __P((struct tcpcb *)); struct tcpcb * tcp_drop __P((struct tcpcb *, int)); void tcp_dooptions __P((struct tcpcb *, u_char *, int, struct tcpiphdr *, int *, u_long *, u_long *)); void tcp_drain __P((void)); void tcp_fasttimo __P((void)); void tcp_init __P((void)); void tcp_input __P((struct mbuf *, int)); int tcp_mss __P((struct tcpcb *, u_int)); struct tcpcb * tcp_newtcpcb __P((struct inpcb *)); void tcp_notify __P((struct inpcb *, int)); int tcp_output __P((struct tcpcb *)); void tcp_pulloutofband __P((struct socket *, struct tcpiphdr *, struct mbuf *)); void tcp_quench __P((struct inpcb *, int)); int tcp_reass __P((struct tcpcb *, struct tcpiphdr *, struct mbuf *)); void tcp_respond __P((struct tcpcb *, struct tcpiphdr *, struct mbuf *, u_long, u_long, int)); void tcp_setpersist __P((struct tcpcb *)); void tcp_slowtimo __P((void)); struct tcpiphdr * tcp_template __P((struct tcpcb *)); struct tcpcb * tcp_timers __P((struct tcpcb *, int)); void tcp_trace __P((int, int, struct tcpcb *, struct tcpiphdr *, int)); struct tcpcb * tcp_usrclosed __P((struct tcpcb *)); int tcp_usrreq __P((struct socket *, int, struct mbuf *, struct mbuf *, struct mbuf *)); void tcp_xmit_timer __P((struct tcpcb *, int)); #endif lft-3.8/include/netinet/if_ether.h000755 000766 000000 00000006352 11053131665 017132 0ustar00vicwheel000000 000000 /* * Copyright (c) 1982, 1986, 1993 * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * @(#)if_ether.h 8.3 (Berkeley) 5/2/95 */ /* * Ethernet address - 6 octets */ struct ether_addr { u_char ether_addr_octet[6]; }; /* * Structure of a 10Mb/s Ethernet header. */ struct ether_header { u_char ether_dhost[6]; u_char ether_shost[6]; u_short ether_type; }; #define ETHERTYPE_PUP 0x0200 /* PUP protocol */ #define ETHERTYPE_IP 0x0800 /* IP protocol */ #define ETHERTYPE_ARP 0x0806 /* Addr. resolution protocol */ #define ETHERTYPE_REVARP 0x8035 /* reverse Addr. resolution protocol */ /* * The ETHERTYPE_NTRAILER packet types starting at ETHERTYPE_TRAIL have * (type-ETHERTYPE_TRAIL)*512 bytes of data followed * by an ETHER type (as given above) and then the (variable-length) header. */ #define ETHERTYPE_TRAIL 0x1000 /* Trailer packet */ #define ETHERTYPE_NTRAILER 16 #define ETHERMTU 1500 #define ETHERMIN (60-14) /* * Ethernet Address Resolution Protocol. * * See RFC 826 for protocol description. Structure below is adapted * to resolving internet addresses. Field names used correspond to * RFC 826. */ struct ether_arp { struct arphdr ea_hdr; /* fixed-size header */ u_char arp_sha[6]; /* sender hardware address */ u_char arp_spa[4]; /* sender protocol address */ u_char arp_tha[6]; /* target hardware address */ u_char arp_tpa[4]; /* target protocol address */ }; #define arp_hrd ea_hdr.ar_hrd #define arp_pro ea_hdr.ar_pro #define arp_hln ea_hdr.ar_hln #define arp_pln ea_hdr.ar_pln #define arp_op ea_hdr.ar_op lft-3.8/include/netinet/udp_var.h000755 000766 000000 00000006774 11053131665 017015 0ustar00vicwheel000000 000000 /* * Copyright (c) 1982, 1986, 1989, 1993 * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * @(#)udp_var.h 8.1 (Berkeley) 6/10/93 */ /* * UDP kernel structures and variables. */ struct udpiphdr { struct ipovly ui_i; /* overlaid ip structure */ struct udphdr ui_u; /* udp header */ }; #define ui_next ui_i.ih_next #define ui_prev ui_i.ih_prev #define ui_x1 ui_i.ih_x1 #define ui_pr ui_i.ih_pr #define ui_len ui_i.ih_len #define ui_src ui_i.ih_src #define ui_dst ui_i.ih_dst #define ui_sport ui_u.uh_sport #define ui_dport ui_u.uh_dport #define ui_ulen ui_u.uh_ulen #define ui_sum ui_u.uh_sum struct udpstat { /* input statistics: */ u_long udps_ipackets; /* total input packets */ u_long udps_hdrops; /* packet shorter than header */ u_long udps_badsum; /* checksum error */ u_long udps_badlen; /* data length larger than packet */ u_long udps_noport; /* no socket on port */ u_long udps_noportbcast; /* of above, arrived as broadcast */ u_long udps_fullsock; /* not delivered, input socket full */ u_long udpps_pcbcachemiss; /* input packets missing pcb cache */ /* output statistics: */ u_long udps_opackets; /* total output packets */ }; /* * Names for UDP sysctl objects */ #define UDPCTL_CHECKSUM 1 /* checksum UDP packets */ #define UDPCTL_MAXID 2 #define UDPCTL_NAMES { \ { 0, 0 }, \ { "checksum", CTLTYPE_INT }, \ } #ifdef KERNEL struct inpcb udb; struct udpstat udpstat; void udp_ctlinput __P((int, struct sockaddr *, struct ip *)); void udp_init __P((void)); void udp_input __P((struct mbuf *, int)); int udp_output __P((struct inpcb *, struct mbuf *, struct mbuf *, struct mbuf *)); int udp_sysctl __P((int *, u_int, void *, size_t *, void *, size_t)); int udp_usrreq __P((struct socket *, int, struct mbuf *, struct mbuf *, struct mbuf *)); #endif lft-3.8/include/netinet/ip.h000755 000766 000000 00000013215 11053131665 015751 0ustar00vicwheel000000 000000 /* * Copyright (c) 1982, 1986, 1993 * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * @(#)ip.h 8.2 (Berkeley) 6/1/94 */ /* * Definitions for internet protocol version 4. * Per RFC 791, September 1981. */ #define IPVERSION 4 /* * Structure of an internet header, naked of options. * * We declare ip_len and ip_off to be short, rather than u_short * pragmatically since otherwise unsigned comparisons can result * against negative integers quite easily, and fail in subtle ways. */ struct ip { #if BYTE_ORDER == LITTLE_ENDIAN u_char ip_hl:4, /* header length */ ip_v:4; /* version */ #endif #if BYTE_ORDER == BIG_ENDIAN u_char ip_v:4, /* version */ ip_hl:4; /* header length */ #endif u_char ip_tos; /* type of service */ short ip_len; /* total length */ u_short ip_id; /* identification */ short ip_off; /* fragment offset field */ #define IP_DF 0x4000 /* dont fragment flag */ #define IP_MF 0x2000 /* more fragments flag */ #define IP_OFFMASK 0x1fff /* mask for fragmenting bits */ u_char ip_ttl; /* time to live */ u_char ip_p; /* protocol */ u_short ip_sum; /* checksum */ struct in_addr ip_src,ip_dst; /* source and dest address */ }; #define IP_MAXPACKET 65535 /* maximum packet size */ /* * Definitions for IP type of service (ip_tos) */ #define IPTOS_LOWDELAY 0x10 #define IPTOS_THROUGHPUT 0x08 #define IPTOS_RELIABILITY 0x04 /* * Definitions for IP precedence (also in ip_tos) (hopefully unused) */ #define IPTOS_PREC_NETCONTROL 0xe0 #define IPTOS_PREC_INTERNETCONTROL 0xc0 #define IPTOS_PREC_CRITIC_ECP 0xa0 #define IPTOS_PREC_FLASHOVERRIDE 0x80 #define IPTOS_PREC_FLASH 0x60 #define IPTOS_PREC_IMMEDIATE 0x40 #define IPTOS_PREC_PRIORITY 0x20 #define IPTOS_PREC_ROUTINE 0x00 /* * Definitions for options. */ #define IPOPT_COPIED(o) ((o)&0x80) #define IPOPT_CLASS(o) ((o)&0x60) #define IPOPT_NUMBER(o) ((o)&0x1f) #define IPOPT_CONTROL 0x00 #define IPOPT_RESERVED1 0x20 #define IPOPT_DEBMEAS 0x40 #define IPOPT_RESERVED2 0x60 #define IPOPT_EOL 0 /* end of option list */ #define IPOPT_NOP 1 /* no operation */ #define IPOPT_RR 7 /* record packet route */ #define IPOPT_TS 68 /* timestamp */ #define IPOPT_SECURITY 130 /* provide s,c,h,tcc */ #define IPOPT_LSRR 131 /* loose source route */ #define IPOPT_SATID 136 /* satnet id */ #define IPOPT_SSRR 137 /* strict source route */ /* * Offsets to fields in options other than EOL and NOP. */ #define IPOPT_OPTVAL 0 /* option ID */ #define IPOPT_OLEN 1 /* option length */ #define IPOPT_OFFSET 2 /* offset within option */ #define IPOPT_MINOFF 4 /* min value of above */ /* * Time stamp option structure. */ struct ip_timestamp { u_char ipt_code; /* IPOPT_TS */ u_char ipt_len; /* size of structure (variable) */ u_char ipt_ptr; /* index of current entry */ #if BYTE_ORDER == LITTLE_ENDIAN u_char ipt_flg:4, /* flags, see below */ ipt_oflw:4; /* overflow counter */ #endif #if BYTE_ORDER == BIG_ENDIAN u_char ipt_oflw:4, /* overflow counter */ ipt_flg:4; /* flags, see below */ #endif union ipt_timestamp { n_long ipt_time[1]; struct ipt_ta { struct in_addr ipt_addr; n_long ipt_time; } ipt_ta[1]; } ipt_timestamp; }; /* flag bits for ipt_flg */ #define IPOPT_TS_TSONLY 0 /* timestamps only */ #define IPOPT_TS_TSANDADDR 1 /* timestamps and addresses */ #define IPOPT_TS_PRESPEC 3 /* specified modules only */ /* bits for security (not byte swapped) */ #define IPOPT_SECUR_UNCLASS 0x0000 #define IPOPT_SECUR_CONFID 0xf135 #define IPOPT_SECUR_EFTO 0x789a #define IPOPT_SECUR_MMMM 0xbc4d #define IPOPT_SECUR_RESTR 0xaf13 #define IPOPT_SECUR_SECRET 0xd788 #define IPOPT_SECUR_TOPSECRET 0x6bc5 /* * Internet implementation parameters. */ #define MAXTTL 255 /* maximum time to live (seconds) */ #define IPDEFTTL 64 /* default ttl, from RFC 1340 */ #define IPFRAGTTL 60 /* time to live for frags, slowhz */ #define IPTTLDEC 1 /* subtracted when forwarding */ #define IP_MSS 576 /* default maximum segment size */ lft-3.8/include/netinet/in_systm.h000755 000766 000000 00000004662 11053131665 017214 0ustar00vicwheel000000 000000 /* * Copyright (c) 1982, 1986, 1993 * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * @(#)in_systm.h 8.1 (Berkeley) 6/10/93 */ /* * Miscellaneous internetwork * definitions for kernel. */ /* * Network types. * * Internally the system keeps counters in the headers with the bytes * swapped so that VAX instructions will work on them. It reverses * the bytes before transmission at each protocol level. The n_ types * represent the types with the bytes in ``high-ender'' order. */ typedef u_short n_short; /* short as received from the net */ typedef u_long n_long; /* long as received from the net */ typedef u_long n_time; /* ms since 00:00 GMT, byte rev */ #ifdef KERNEL n_time iptime __P((void)); #endif lft-3.8/include/netinet/ip_var.h000755 000766 000000 00000015652 11053131665 016630 0ustar00vicwheel000000 000000 /* * Copyright (c) 1982, 1986, 1993 * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * @(#)ip_var.h 8.2 (Berkeley) 1/9/95 */ #include /* * Overlay for ip header used by other protocols (tcp, udp). */ struct ipovly { caddr_t ih_next, ih_prev; /* for protocol sequence q's */ u_char ih_x1; /* (unused) */ u_char ih_pr; /* protocol */ short ih_len; /* protocol length */ struct in_addr ih_src; /* source internet address */ struct in_addr ih_dst; /* destination internet address */ }; /* * Ip reassembly queue structure. Each fragment * being reassembled is attached to one of these structures. * They are timed out after ipq_ttl drops to 0, and may also * be reclaimed if memory becomes tight. */ struct ipq { struct ipq *next,*prev; /* to other reass headers */ u_char ipq_ttl; /* time for reass q to live */ u_char ipq_p; /* protocol of this fragment */ u_short ipq_id; /* sequence id for reassembly */ struct ipasfrag *ipq_next,*ipq_prev; /* to ip headers of fragments */ struct in_addr ipq_src,ipq_dst; }; /* * Ip header, when holding a fragment. * * Note: ipf_next must be at same offset as ipq_next above */ struct ipasfrag { #if BYTE_ORDER == LITTLE_ENDIAN u_char ip_hl:4, ip_v:4; #endif #if BYTE_ORDER == BIG_ENDIAN u_char ip_v:4, ip_hl:4; #endif u_char ipf_mff; /* XXX overlays ip_tos: use low bit * to avoid destroying tos; * copied from (ip_off&IP_MF) */ short ip_len; u_short ip_id; short ip_off; u_char ip_ttl; u_char ip_p; u_short ip_sum; struct ipasfrag *ipf_next; /* next fragment */ struct ipasfrag *ipf_prev; /* previous fragment */ }; /* * Structure stored in mbuf in inpcb.ip_options * and passed to ip_output when ip options are in use. * The actual length of the options (including ipopt_dst) * is in m_len. */ #define MAX_IPOPTLEN 40 struct ipoption { struct in_addr ipopt_dst; /* first-hop dst if source routed */ char ipopt_list[MAX_IPOPTLEN]; /* options proper */ }; struct ipstat { u_long ips_total; /* total packets received */ u_long ips_badsum; /* checksum bad */ u_long ips_tooshort; /* packet too short */ u_long ips_toosmall; /* not enough data */ u_long ips_badhlen; /* ip header length < data size */ u_long ips_badlen; /* ip length < ip header length */ u_long ips_fragments; /* fragments received */ u_long ips_fragdropped; /* frags dropped (dups, out of space) */ u_long ips_fragtimeout; /* fragments timed out */ u_long ips_forward; /* packets forwarded */ u_long ips_cantforward; /* packets rcvd for unreachable dest */ u_long ips_redirectsent; /* packets forwarded on same net */ u_long ips_noproto; /* unknown or unsupported protocol */ u_long ips_delivered; /* datagrams delivered to upper level*/ u_long ips_localout; /* total ip packets generated here */ u_long ips_odropped; /* lost packets due to nobufs, etc. */ u_long ips_reassembled; /* total packets reassembled ok */ u_long ips_fragmented; /* datagrams sucessfully fragmented */ u_long ips_ofragments; /* output fragments created */ u_long ips_cantfrag; /* don't fragment flag was set, etc. */ u_long ips_badoptions; /* error in option processing */ u_long ips_noroute; /* packets discarded due to no route */ u_long ips_badvers; /* ip version != 4 */ u_long ips_rawout; /* total raw ip packets generated */ }; #ifdef KERNEL /* flags passed to ip_output as last parameter */ #define IP_FORWARDING 0x1 /* most of ip header exists */ #define IP_RAWOUTPUT 0x2 /* raw ip header exists */ #define IP_ROUTETOIF SO_DONTROUTE /* bypass routing tables */ #define IP_ALLOWBROADCAST SO_BROADCAST /* can send broadcast packets */ struct ipstat ipstat; struct ipq ipq; /* ip reass. queue */ u_short ip_id; /* ip packet ctr, for ids */ int ip_defttl; /* default IP ttl */ int in_control __P((struct socket *, u_long, caddr_t, struct ifnet *)); int ip_ctloutput __P((int, struct socket *, int, int, struct mbuf **)); void ip_deq __P((struct ipasfrag *)); int ip_dooptions __P((struct mbuf *)); void ip_drain __P((void)); void ip_enq __P((struct ipasfrag *, struct ipasfrag *)); void ip_forward __P((struct mbuf *, int)); void ip_freef __P((struct ipq *)); void ip_freemoptions __P((struct ip_moptions *)); int ip_getmoptions __P((int, struct ip_moptions *, struct mbuf **)); void ip_init __P((void)); int ip_mforward __P((struct mbuf *, struct ifnet *)); int ip_optcopy __P((struct ip *, struct ip *)); int ip_output __P((struct mbuf *, struct mbuf *, struct route *, int, struct ip_moptions *)); int ip_pcbopts __P((struct mbuf **, struct mbuf *)); struct ip * ip_reass __P((struct ipasfrag *, struct ipq *)); struct in_ifaddr * ip_rtaddr __P((struct in_addr)); int ip_setmoptions __P((int, struct ip_moptions **, struct mbuf *)); void ip_slowtimo __P((void)); struct mbuf * ip_srcroute __P((void)); void ip_stripoptions __P((struct mbuf *, struct mbuf *)); int ip_sysctl __P((int *, u_int, void *, size_t *, void *, size_t)); void ipintr __P((void)); int rip_ctloutput __P((int, struct socket *, int, int, struct mbuf **)); void rip_init __P((void)); void rip_input __P((struct mbuf *)); int rip_output __P((struct mbuf *, struct socket *, u_long)); int rip_usrreq __P((struct socket *, int, struct mbuf *, struct mbuf *, struct mbuf *)); #endif lft-3.8/include/netinet/udp.h000755 000766 000000 00000004101 11053131665 016123 0ustar00vicwheel000000 000000 /* * Copyright (c) 1982, 1986, 1993 * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * This product includes software developed by the University of * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * @(#)udp.h 8.1 (Berkeley) 6/10/93 */ /* * Udp protocol header. * Per RFC 768, September, 1981. */ struct udphdr { u_short uh_sport; /* source port */ u_short uh_dport; /* destination port */ short uh_ulen; /* udp length */ u_short uh_sum; /* udp checksum */ }; lft-3.8/include/net/slip.h000755 000766 000000 00000002632 11053131665 015431 0ustar00vicwheel000000 000000 /* * Definitions that user level programs might need to know to interact * with serial line IP (slip) lines. * * Copyright (c) 1990 Regents of the University of California. * All rights reserved. * * Redistribution and use in source and binary forms are permitted * provided that the above copyright notice and this paragraph are * duplicated in all such forms and that any documentation, * advertising materials, and other materials related to such * distribution and use acknowledge that the software was developed * by the University of California, Berkeley. The name of the * University may not be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* * ioctl to get slip interface unit number (e.g., sl0, sl1, etc.) * assigned to some terminal line with a slip module pushed on it. */ #ifdef __STDC__ #define SLIOGUNIT _IOR('B', 1, int) #else #define SLIOGUNIT _IOR(B, 1, int) #endif /* * definitions of the pseudo- link-level header attached to slip * packets grabbed by the packet filter (bpf) traffic monitor. */ #define SLIP_HDRLEN 16 #define SLX_DIR 0 #define SLX_CHDR 1 #define CHDR_LEN 15 #define SLIPDIR_IN 0 #define SLIPDIR_OUT 1 lft-3.8/include/net/slcompress.h000755 000766 000000 00000013166 11053131665 016660 0ustar00vicwheel000000 000000 /* * Definitions for tcp compression routines. * * Copyright (c) 1989, 1990, 1992, 1993 Regents of the University of * California. All rights reserved. * * Redistribution and use in source and binary forms are permitted * provided that the above copyright notice and this paragraph are * duplicated in all such forms and that any documentation, * advertising materials, and other materials related to such * distribution and use acknowledge that the software was developed * by the University of California, Berkeley. The name of the * University may not be used to endorse or promote products derived * from this software without specific prior written permission. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. * * Van Jacobson (van@ee.lbl.gov), Dec 31, 1989: * - Initial distribution. */ #define MAX_STATES 16 /* must be > 2 and < 256 */ #define MAX_HDR MLEN /* XXX 4bsd-ism: should really be 128 */ /* * Compressed packet format: * * The first octet contains the packet type (top 3 bits), TCP * 'push' bit, and flags that indicate which of the 4 TCP sequence * numbers have changed (bottom 5 bits). The next octet is a * conversation number that associates a saved IP/TCP header with * the compressed packet. The next two octets are the TCP checksum * from the original datagram. The next 0 to 15 octets are * sequence number changes, one change per bit set in the header * (there may be no changes and there are two special cases where * the receiver implicitly knows what changed -- see below). * * There are 5 numbers which can change (they are always inserted * in the following order): TCP urgent pointer, window, * acknowlegement, sequence number and IP ID. (The urgent pointer * is different from the others in that its value is sent, not the * change in value.) Since typical use of SLIP links is biased * toward small packets (see comments on MTU/MSS below), changes * use a variable length coding with one octet for numbers in the * range 1 - 255 and 3 octets (0, MSB, LSB) for numbers in the * range 256 - 65535 or 0. (If the change in sequence number or * ack is more than 65535, an uncompressed packet is sent.) */ /* * Packet types (must not conflict with IP protocol version) * * The top nibble of the first octet is the packet type. There are * three possible types: IP (not proto TCP or tcp with one of the * control flags set); uncompressed TCP (a normal IP/TCP packet but * with the 8-bit protocol field replaced by an 8-bit connection id -- * this type of packet syncs the sender & receiver); and compressed * TCP (described above). * * LSB of 4-bit field is TCP "PUSH" bit (a worthless anachronism) and * is logically part of the 4-bit "changes" field that follows. Top * three bits are actual packet type. For backward compatibility * and in the interest of conserving bits, numbers are chosen so the * IP protocol version number (4) which normally appears in this nibble * means "IP packet". */ /* packet types */ #define TYPE_IP 0x40 #define TYPE_UNCOMPRESSED_TCP 0x70 #define TYPE_COMPRESSED_TCP 0x80 #define TYPE_ERROR 0x00 /* Bits in first octet of compressed packet */ #define NEW_C 0x40 /* flag bits for what changed in a packet */ #define NEW_I 0x20 #define NEW_S 0x08 #define NEW_A 0x04 #define NEW_W 0x02 #define NEW_U 0x01 /* reserved, special-case values of above */ #define SPECIAL_I (NEW_S|NEW_W|NEW_U) /* echoed interactive traffic */ #define SPECIAL_D (NEW_S|NEW_A|NEW_W|NEW_U) /* unidirectional data */ #define SPECIALS_MASK (NEW_S|NEW_A|NEW_W|NEW_U) #define TCP_PUSH_BIT 0x10 /* * "state" data for each active tcp conversation on the wire. This is * basically a copy of the entire IP/TCP header from the last packet * we saw from the conversation together with a small identifier * the transmit & receive ends of the line use to locate saved header. */ struct cstate { struct cstate *cs_next; /* next most recently used cstate (xmit only) */ u_short cs_hlen; /* size of hdr (receive only) */ u_char cs_id; /* connection # associated with this state */ u_char cs_filler; union { char csu_hdr[MAX_HDR]; struct ip csu_ip; /* ip/tcp hdr from most recent packet */ } slcs_u; }; #define cs_ip slcs_u.csu_ip #define cs_hdr slcs_u.csu_hdr /* * all the state data for one serial line (we need one of these * per line). */ struct slcompress { struct cstate *last_cs; /* most recently used tstate */ u_char last_recv; /* last rcvd conn. id */ u_char last_xmit; /* last sent conn. id */ u_short flags; #ifndef SL_NO_STATS u_int sls_packets; /* outbound packets */ u_int sls_compressed; /* outbound compressed packets */ u_int sls_searches; /* searches for connection state */ u_int sls_misses; /* times couldn't find conn. state */ u_int sls_uncompressedin;/* inbound uncompressed packets */ u_int sls_compressedin; /* inbound compressed packets */ u_int sls_errorin; /* inbound unknown type packets */ u_int sls_tossed; /* inbound packets tossed because of error */ #endif struct cstate tstate[MAX_STATES]; /* xmit connection states */ struct cstate rstate[MAX_STATES]; /* receive connection states */ }; /* flag values */ #define SLF_TOSS 1 /* tossing rcvd frames because of input err */ #ifdef KERNEL #ifdef __STDC__ extern void sl_compress_init(struct slcompress *); extern u_char sl_compress_tcp(struct mbuf *, struct ip *, struct slcompress *); extern int sl_uncompress_tcp(struct mbuf *, int, u_int, struct slcompress *); #else extern void sl_compress_init(); extern u_char sl_compress_tcp(); extern int sl_uncompress_tcp(); #endif #endif lft-3.8/include/net/if_arp.h000755 000766 000000 00000015037 11053131665 015725 0ustar00vicwheel000000 000000 /* Definitions for Address Resolution Protocol. Copyright (C) 1997, 1999, 2001 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 1997. The GNU C Library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. The GNU C Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the GNU C Library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ /* Based on the 4.4BSD and Linux version of this file. */ #ifndef _NET_IF_ARP_H #define _NET_IF_ARP_H 1 /* Some internals from deep down in the kernel. */ #define MAX_ADDR_LEN 7 /* This structure defines an ethernet arp header. */ /* ARP protocol opcodes. */ #define ARPOP_REQUEST 1 /* ARP request. */ #define ARPOP_REPLY 2 /* ARP reply. */ #define ARPOP_RREQUEST 3 /* RARP request. */ #define ARPOP_RREPLY 4 /* RARP reply. */ #define ARPOP_InREQUEST 8 /* InARP request. */ #define ARPOP_InREPLY 9 /* InARP reply. */ #define ARPOP_NAK 10 /* (ATM)ARP NAK. */ /* See RFC 826 for protocol description. ARP packets are variable in size; the arphdr structure defines the fixed-length portion. Protocol type values are the same as those for 10 Mb/s Ethernet. It is followed by the variable-sized fields ar_sha, arp_spa, arp_tha and arp_tpa in that order, according to the lengths specified. Field names used correspond to RFC 826. */ struct arphdr { unsigned short int ar_hrd; /* Format of hardware address. */ unsigned short int ar_pro; /* Format of protocol address. */ unsigned char ar_hln; /* Length of hardware address. */ unsigned char ar_pln; /* Length of protocol address. */ unsigned short int ar_op; /* ARP opcode (command). */ #if 0 /* Ethernet looks like this : This bit is variable sized however... */ unsigned char __ar_sha[ETH_ALEN]; /* Sender hardware address. */ unsigned char __ar_sip[4]; /* Sender IP address. */ unsigned char __ar_tha[ETH_ALEN]; /* Target hardware address. */ unsigned char __ar_tip[4]; /* Target IP address. */ #endif }; /* ARP protocol HARDWARE identifiers. */ #define ARPHRD_NETROM 0 /* From KA9Q: NET/ROM pseudo. */ #define ARPHRD_ETHER 1 /* Ethernet 10/100Mbps. */ #define ARPHRD_EETHER 2 /* Experimental Ethernet. */ #define ARPHRD_AX25 3 /* AX.25 Level 2. */ #define ARPHRD_PRONET 4 /* PROnet token ring. */ #define ARPHRD_CHAOS 5 /* Chaosnet. */ #define ARPHRD_IEEE802 6 /* IEEE 802.2 Ethernet/TR/TB. */ #define ARPHRD_ARCNET 7 /* ARCnet. */ #define ARPHRD_APPLETLK 8 /* APPLEtalk. */ #define ARPHRD_DLCI 15 /* Frame Relay DLCI. */ #define ARPHRD_ATM 19 /* ATM. */ #define ARPHRD_METRICOM 23 /* Metricom STRIP (new IANA id). */ /* Dummy types for non ARP hardware */ #define ARPHRD_SLIP 256 #define ARPHRD_CSLIP 257 #define ARPHRD_SLIP6 258 #define ARPHRD_CSLIP6 259 #define ARPHRD_RSRVD 260 /* Notional KISS type. */ #define ARPHRD_ADAPT 264 #define ARPHRD_ROSE 270 #define ARPHRD_X25 271 /* CCITT X.25. */ #define ARPHDR_HWX25 272 /* Boards with X.25 in firmware. */ #define ARPHRD_PPP 512 #define ARPHRD_CISCO 513 /* Cisco HDLC. */ #define ARPHRD_HDLC ARPHRD_CISCO #define ARPHRD_LAPB 516 /* LAPB. */ #define ARPHRD_DDCMP 517 /* Digital's DDCMP. */ #define ARPHRD_RAWHDLC 518 /* Raw HDLC. */ #define ARPHRD_TUNNEL 768 /* IPIP tunnel. */ #define ARPHRD_TUNNEL6 769 /* IPIP6 tunnel. */ #define ARPHRD_FRAD 770 /* Frame Relay Access Device. */ #define ARPHRD_SKIP 771 /* SKIP vif. */ #define ARPHRD_LOOPBACK 772 /* Loopback device. */ #define ARPHRD_LOCALTLK 773 /* Localtalk device. */ #define ARPHRD_FDDI 774 /* Fiber Distributed Data Interface. */ #define ARPHRD_BIF 775 /* AP1000 BIF. */ #define ARPHRD_SIT 776 /* sit0 device - IPv6-in-IPv4. */ #define ARPHRD_IPDDP 777 /* IP-in-DDP tunnel. */ #define ARPHRD_IPGRE 778 /* GRE over IP. */ #define ARPHRD_PIMREG 779 /* PIMSM register interface. */ #define ARPHRD_HIPPI 780 /* High Performance Parallel I'face. */ #define ARPHRD_ASH 781 /* (Nexus Electronics) Ash. */ #define ARPHRD_ECONET 782 /* Acorn Econet. */ #define ARPHRD_IRDA 783 /* Linux-IrDA. */ #define ARPHRD_FCPP 784 /* Point to point fibrechanel. */ #define ARPHRD_FCAL 785 /* Fibrechanel arbitrated loop. */ #define ARPHRD_FCPL 786 /* Fibrechanel public loop. */ #define ARPHRD_FCPFABRIC 787 /* Fibrechanel fabric. */ #define ARPHRD_IEEE802_TR 800 /* Magic type ident for TR. */ #define ARPHRD_IEEE80211 801 /* IEEE 802.11. */ /* ARP ioctl request. */ struct arpreq { struct sockaddr arp_pa; /* Protocol address. */ struct sockaddr arp_ha; /* Hardware address. */ int arp_flags; /* Flags. */ struct sockaddr arp_netmask; /* Netmask (only for proxy arps). */ char arp_dev[16]; }; struct arpreq_old { struct sockaddr arp_pa; /* Protocol address. */ struct sockaddr arp_ha; /* Hardware address. */ int arp_flags; /* Flags. */ struct sockaddr arp_netmask; /* Netmask (only for proxy arps). */ }; /* ARP Flag values. */ #define ATF_COM 0x02 /* Completed entry (ha valid). */ #define ATF_PERM 0x04 /* Permanent entry. */ #define ATF_PUBL 0x08 /* Publish entry. */ #define ATF_USETRAILERS 0x10 /* Has requested trailers. */ #define ATF_NETMASK 0x20 /* Want to use a netmask (only for proxy entries). */ #define ATF_DONTPUB 0x40 /* Don't answer this addresses. */ #define ATF_MAGIC 0x80 /* Automatically added entry. */ /* Support for the user space arp daemon, arpd. */ #define ARPD_UPDATE 0x01 #define ARPD_LOOKUP 0x02 #define ARPD_FLUSH 0x03 struct arpd_request { unsigned short int req; /* Request type. */ u_int32_t ip; /* IP address of entry. */ unsigned long int dev; /* Device entry is tied to. */ unsigned long int stamp; unsigned long int updated; unsigned char ha[MAX_ADDR_LEN]; /* Hardware address. */ }; #endif /* net/if_arp.h */ lft-3.8/config/acconfig.h.in000644 000766 000000 00000012116 11053131665 015667 0ustar00vicwheel000000 000000 /* acconfig.h.in. */ /* Host system type */ #undef HOST_SYSTEM_TYPE /* Define if using alloca.c. */ #undef C_ALLOCA /* Define to empty if the keyword does not work. */ #undef const /* Define to one of _getb67, GETB67, getb67 for Cray-2 and Cray-YMP systems. This function is required for alloca.c support on those systems. */ #undef CRAY_STACKSEG_END /* Define if you have alloca, as a function or macro. */ #undef HAVE_ALLOCA /* Define if you have and it should be used (not on Ultrix). */ #undef HAVE_ALLOCA_H /* Define to `unsigned' if doesn't define. */ #undef size_t /* If using the C implementation of alloca, define if you know the direction of stack growth for your system; otherwise it will be automatically deduced at run-time. STACK_DIRECTION > 0 => grows toward higher addresses STACK_DIRECTION < 0 => grows toward lower addresses STACK_DIRECTION = 0 => direction of growth unknown */ #undef STACK_DIRECTION /* Define if you have the ANSI C header files. */ #undef STDC_HEADERS /* Define if you can safely include both and . */ #undef TIME_WITH_SYS_TIME /* Define if using alloca.c. */ /* #undef C_ALLOCA */ /* Define to empty if the keyword does not work. */ /* #undef const */ /* Define to one of _getb67, GETB67, getb67 for Cray-2 and Cray-YMP systems. This function is required for alloca.c support on those systems. */ /* #undef CRAY_STACKSEG_END */ /* Define if you have alloca, as a function or macro. */ #define HAVE_ALLOCA 1 /* Define if you have and it should be used (not on Ultrix). */ #define HAVE_ALLOCA_H 1 /* Define to `unsigned' if doesn't define. */ /* #undef size_t */ /* If using the C implementation of alloca, define if you know the direction of stack growth for your system; otherwise it will be automatically deduced at run-time. STACK_DIRECTION > 0 => grows toward higher addresses STACK_DIRECTION < 0 => grows toward lower addresses STACK_DIRECTION = 0 => direction of growth unknown */ /* #undef STACK_DIRECTION */ /* Define if you have the ANSI C header files. */ #define STDC_HEADERS 1 /* Define if you can safely include both and . */ #define TIME_WITH_SYS_TIME 1 /* Define if using alloca.c. */ /* #undef C_ALLOCA */ /* Define to empty if the keyword does not work. */ /* #undef const */ /* Define to one of _getb67, GETB67, getb67 for Cray-2 and Cray-YMP systems. This function is required for alloca.c support on those systems. */ /* #undef CRAY_STACKSEG_END */ /* Define if you have alloca, as a function or macro. */ #define HAVE_ALLOCA 1 /* Define if you have and it should be used (not on Ultrix). */ #define HAVE_ALLOCA_H 1 /* Define to `unsigned' if doesn't define. */ /* #undef size_t */ /* If using the C implementation of alloca, define if you know the direction of stack growth for your system; otherwise it will be automatically deduced at run-time. STACK_DIRECTION > 0 => grows toward higher addresses STACK_DIRECTION < 0 => grows toward lower addresses STACK_DIRECTION = 0 => direction of growth unknown */ /* #undef STACK_DIRECTION */ /* Define if you have the ANSI C header files. */ #define STDC_HEADERS 1 /* Define if you can safely include both and . */ #define TIME_WITH_SYS_TIME 1 /* Linux requires this in order to have the right network structures. */ #ifndef _BSD_SOURCE #define _BSD_SOURCE #endif /* Define if you have the gettimeofday function. */ #undef HAVE_GETTIMEOFDAY /* Define if you have the select function. */ #undef HAVE_SELECT /* Define if you have the socket function. */ #undef HAVE_SOCKET /* Define if you have the strdup function. */ #undef HAVE_STRDUP /* Define if you have the strstr function. */ #undef HAVE_STRSTR /* Define if you have the header file. */ #undef HAVE_FCNTL_H /* Define if you have the header file. */ #undef HAVE_LIMITS_H /* Define if you have the header file. */ #undef HAVE_STRINGS_H /* Define if you have the header file. */ #undef HAVE_SYS_IOCTL_H /* Define if you have the header file. */ #undef HAVE_SYS_TIME_H /* Define if you have the header file. */ #undef HAVE_UNISTD_H /* Define if you have the m library (-lm). */ #undef HAVE_LIBM /* Define if you have the nsl library (-lnsl). */ #undef HAVE_LIBNSL /* Define if you have the pcap library (-lpcap). */ #undef HAVE_LIBPCAP /* Define if you have the socket library (-lsocket). */ #undef HAVE_LIBSOCKET /* Define if this is a BSD TCP/IP stack */ #undef BSD_IP_STACK /* Define if this is Darwin */ #undef DARWIN /* Define if this is NetBSD */ #undef NETBSD /* Define if user enabled gettimeofday (GTOD) */ #undef USE_GTOD /* Define if building universal binaries */ #undef UNIVERSAL /* Define if this is OpenBSD */ #undef OPENBSD /* Define if solaris munges the th_sum field in its own special way */ #undef SOLARIS_LENGTH_IN_CHECKSUM /* Define if your system has a sa_len member in struct sockaddr */ #undef HAVE_SOCKADDR_SA_LEN /* Define if an IPv6 network stack is detected */ #undef INET6 lft-3.8/config/install-sh000755 000766 000000 00000031600 11053131665 015343 0ustar00vicwheel000000 000000 #!/bin/sh # install - install a program, script, or datafile scriptversion=2006-10-14.15 # This originates from X11R5 (mit/util/scripts/install.sh), which was # later released in X11R6 (xc/config/util/install.sh) with the # following copyright and license. # # Copyright (C) 1994 X Consortium # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to # deal in the Software without restriction, including without limitation the # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or # sell copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN # AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- # TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. # # Except as contained in this notice, the name of the X Consortium shall not # be used in advertising or otherwise to promote the sale, use or other deal- # ings in this Software without prior written authorization from the X Consor- # tium. # # # FSF changes to this file are in the public domain. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. nl=' ' IFS=" "" $nl" # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit="${DOITPROG-}" if test -z "$doit"; then doit_exec=exec else doit_exec=$doit fi # Put in absolute file names if you don't have them in your path; # or use environment vars. mvprog="${MVPROG-mv}" cpprog="${CPPROG-cp}" chmodprog="${CHMODPROG-chmod}" chownprog="${CHOWNPROG-chown}" chgrpprog="${CHGRPPROG-chgrp}" stripprog="${STRIPPROG-strip}" rmprog="${RMPROG-rm}" mkdirprog="${MKDIRPROG-mkdir}" posix_glob= posix_mkdir= # Desired mode of installed file. mode=0755 chmodcmd=$chmodprog chowncmd= chgrpcmd= stripcmd= rmcmd="$rmprog -f" mvcmd="$mvprog" src= dst= dir_arg= dstarg= no_target_directory= usage="Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE or: $0 [OPTION]... SRCFILES... DIRECTORY or: $0 [OPTION]... -t DIRECTORY SRCFILES... or: $0 [OPTION]... -d DIRECTORIES... In the 1st form, copy SRCFILE to DSTFILE. In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. In the 4th, create DIRECTORIES. Options: -c (ignored) -d create directories instead of installing files. -g GROUP $chgrpprog installed files to GROUP. -m MODE $chmodprog installed files to MODE. -o USER $chownprog installed files to USER. -s $stripprog installed files. -t DIRECTORY install into DIRECTORY. -T report an error if DSTFILE is a directory. --help display this help and exit. --version display version info and exit. Environment variables override the default commands: CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG " while test $# -ne 0; do case $1 in -c) shift continue;; -d) dir_arg=true shift continue;; -g) chgrpcmd="$chgrpprog $2" shift shift continue;; --help) echo "$usage"; exit $?;; -m) mode=$2 shift shift case $mode in *' '* | *' '* | *' '* | *'*'* | *'?'* | *'['*) echo "$0: invalid mode: $mode" >&2 exit 1;; esac continue;; -o) chowncmd="$chownprog $2" shift shift continue;; -s) stripcmd=$stripprog shift continue;; -t) dstarg=$2 shift shift continue;; -T) no_target_directory=true shift continue;; --version) echo "$0 $scriptversion"; exit $?;; --) shift break;; -*) echo "$0: invalid option: $1" >&2 exit 1;; *) break;; esac done if test $# -ne 0 && test -z "$dir_arg$dstarg"; then # When -d is used, all remaining arguments are directories to create. # When -t is used, the destination is already specified. # Otherwise, the last argument is the destination. Remove it from $@. for arg do if test -n "$dstarg"; then # $@ is not empty: it contains at least $arg. set fnord "$@" "$dstarg" shift # fnord fi shift # arg dstarg=$arg done fi if test $# -eq 0; then if test -z "$dir_arg"; then echo "$0: no input file specified." >&2 exit 1 fi # It's OK to call `install-sh -d' without argument. # This can happen when creating conditional directories. exit 0 fi if test -z "$dir_arg"; then trap '(exit $?); exit' 1 2 13 15 # Set umask so as not to create temps with too-generous modes. # However, 'strip' requires both read and write access to temps. case $mode in # Optimize common cases. *644) cp_umask=133;; *755) cp_umask=22;; *[0-7]) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw='% 200' fi cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; *) if test -z "$stripcmd"; then u_plus_rw= else u_plus_rw=,u+rw fi cp_umask=$mode$u_plus_rw;; esac fi for src do # Protect names starting with `-'. case $src in -*) src=./$src ;; esac if test -n "$dir_arg"; then dst=$src dstdir=$dst test -d "$dstdir" dstdir_status=$? else # Waiting for this to be detected by the "$cpprog $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if test ! -f "$src" && test ! -d "$src"; then echo "$0: $src does not exist." >&2 exit 1 fi if test -z "$dstarg"; then echo "$0: no destination specified." >&2 exit 1 fi dst=$dstarg # Protect names starting with `-'. case $dst in -*) dst=./$dst ;; esac # If destination is a directory, append the input filename; won't work # if double slashes aren't ignored. if test -d "$dst"; then if test -n "$no_target_directory"; then echo "$0: $dstarg: Is a directory" >&2 exit 1 fi dstdir=$dst dst=$dstdir/`basename "$src"` dstdir_status=0 else # Prefer dirname, but fall back on a substitute if dirname fails. dstdir=` (dirname "$dst") 2>/dev/null || expr X"$dst" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$dst" : 'X\(//\)[^/]' \| \ X"$dst" : 'X\(//\)$' \| \ X"$dst" : 'X\(/\)' \| . 2>/dev/null || echo X"$dst" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q' ` test -d "$dstdir" dstdir_status=$? fi fi obsolete_mkdir_used=false if test $dstdir_status != 0; then case $posix_mkdir in '') # Create intermediate dirs using mode 755 as modified by the umask. # This is like FreeBSD 'install' as of 1997-10-28. umask=`umask` case $stripcmd.$umask in # Optimize common cases. *[2367][2367]) mkdir_umask=$umask;; .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; *[0-7]) mkdir_umask=`expr $umask + 22 \ - $umask % 100 % 40 + $umask % 20 \ - $umask % 10 % 4 + $umask % 2 `;; *) mkdir_umask=$umask,go-w;; esac # With -d, create the new directory with the user-specified mode. # Otherwise, rely on $mkdir_umask. if test -n "$dir_arg"; then mkdir_mode=-m$mode else mkdir_mode= fi posix_mkdir=false case $umask in *[123567][0-7][0-7]) # POSIX mkdir -p sets u+wx bits regardless of umask, which # is incompatible with FreeBSD 'install' when (umask & 300) != 0. ;; *) tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 if (umask $mkdir_umask && exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 then if test -z "$dir_arg" || { # Check for POSIX incompatibilities with -m. # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or # other-writeable bit of parent directory when it shouldn't. # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. ls_ld_tmpdir=`ls -ld "$tmpdir"` case $ls_ld_tmpdir in d????-?r-*) different_mode=700;; d????-?--*) different_mode=755;; *) false;; esac && $mkdirprog -m$different_mode -p -- "$tmpdir" && { ls_ld_tmpdir_1=`ls -ld "$tmpdir"` test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" } } then posix_mkdir=: fi rmdir "$tmpdir/d" "$tmpdir" else # Remove any dirs left behind by ancient mkdir implementations. rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null fi trap '' 0;; esac;; esac if $posix_mkdir && ( umask $mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" ) then : else # The umask is ridiculous, or mkdir does not conform to POSIX, # or it failed possibly due to a race condition. Create the # directory the slow way, step by step, checking for races as we go. case $dstdir in /*) prefix=/ ;; -*) prefix=./ ;; *) prefix= ;; esac case $posix_glob in '') if (set -f) 2>/dev/null; then posix_glob=true else posix_glob=false fi ;; esac oIFS=$IFS IFS=/ $posix_glob && set -f set fnord $dstdir shift $posix_glob && set +f IFS=$oIFS prefixes= for d do test -z "$d" && continue prefix=$prefix$d if test -d "$prefix"; then prefixes= else if $posix_mkdir; then (umask=$mkdir_umask && $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break # Don't fail if two instances are running concurrently. test -d "$prefix" || exit 1 else case $prefix in *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; *) qprefix=$prefix;; esac prefixes="$prefixes '$qprefix'" fi fi prefix=$prefix/ done if test -n "$prefixes"; then # Don't fail if two instances are running concurrently. (umask $mkdir_umask && eval "\$doit_exec \$mkdirprog $prefixes") || test -d "$dstdir" || exit 1 obsolete_mkdir_used=true fi fi fi if test -n "$dir_arg"; then { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 else # Make a couple of temp file names in the proper directory. dsttmp=$dstdir/_inst.$$_ rmtmp=$dstdir/_rm.$$_ # Trap to clean up those temp files at exit. trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 # Copy the file name to the temp name. (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && # and set any options; do chmod last to preserve setuid bits. # # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $cpprog $src $dsttmp" command. # { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \ && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \ && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \ && { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && # Now rename the file to the real destination. { $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null \ || { # The rename failed, perhaps because mv can't rename something else # to itself, or perhaps because mv is so ancient that it does not # support -f. # Now remove or move aside any old file at destination location. # We try this two ways since rm can't unlink itself on some # systems and the destination file might be busy for other # reasons. In this case, the final cleanup might fail but the new # file should still install successfully. { if test -f "$dst"; then $doit $rmcmd -f "$dst" 2>/dev/null \ || { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null \ && { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; }; }\ || { echo "$0: cannot unlink or rename $dst" >&2 (exit 1); exit 1 } else : fi } && # Now rename the file to the real destination. $doit $mvcmd "$dsttmp" "$dst" } } || exit 1 trap '' 0 fi done # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "scriptversion=" # time-stamp-format: "%:y-%02m-%02d.%02H" # time-stamp-end: "$" # End: lft-3.8/config/configure.ac000644 000766 000000 00000011413 12716654514 015637 0ustar00vicwheel000000 000000 dnl Process this file with autoconf to produce a configure script. AC_INIT AC_CONFIG_SRCDIR([lft_ifname.h]) AC_CONFIG_HEADER(config/acconfig.h) AC_CONFIG_AUX_DIR([config]) dnl This keeps configure quiet about the datarootdir setting AC_DEFUN([AC_DATAROOTDIR_CHECKED]) AC_DIAGNOSE([obsolete],[AC_CYGWIN is obsolete: use AC_CANONICAL_HOST and check if $host_os matches *cygwin*])dnl AC_CANONICAL_HOST case $host_os in *cygwin* ) CYGWIN=yes;; * ) CYGWIN=no;; esac AC_DEFINE_UNQUOTED(HOST_SYSTEM_TYPE, "$host") dnl Checks for programs. AC_PROG_CC AC_PROG_LN_S AC_PROG_MAKE_SET AC_PROG_INSTALL AC_CHECK_LIB(nsl, gethostbyname) AC_CHECK_LIB(socket, connect) AC_CHECK_LIB(resolv, inet_aton) AC_CHECK_LIB(m, sin) # Checks for header files and functions AC_HEADER_STDC AC_CHECK_HEADERS([arpa/inet.h fcntl.h limits.h netdb.h netinet/in.h stdlib.h string.h strings.h sys/ioctl.h sys/socket.h sys/time.h unistd.h]) dnl Checks for typedefs, structures, and compiler characteristics. AC_C_CONST AC_TYPE_SIZE_T AC_HEADER_TIME AC_STRUCT_TM dnl Checks for library functions. AC_PROG_GCC_TRADITIONAL AC_FUNC_ALLOCA AC_FUNC_MALLOC AC_FUNC_REALLOC AC_FUNC_SELECT_ARGTYPES AC_FUNC_STRFTIME AC_CHECK_FUNCS([bzero gethostbyaddr gethostbyname gettimeofday inet_ntoa memset select setenv socket strchr strdup strstr]) dnl OS specific checks case "$host" in *darwin*) AC_DEFINE(BSD_IP_STACK) dnl we need to define DARWIN to turn off dnl some BSD-type features like BIOC_IMMEDIATE AC_DEFINE(DARWIN) ;; *netbsd*) AC_DEFINE(BSD_IP_STACK) dnl we need to define NETBSD to turn off dnl some BSD-type features like BIOC_IMMEDIATE AC_DEFINE(NETBSD) ;; *openbsd*) AC_DEFINE(OPENBSD) AC_DEFINE(BSD_IP_STACK) ;; *bsd*) AC_DEFINE(BSD_IP_STACK) ;; *linux*) AC_DEFINE(_BSD_SOURCE) ;; *solaris*) dnl some versions of solaris need special treatment dnl for the th_sum field, and it varies dnl between versions... case "$host" in *solaris2.4*) AC_DEFINE(SOLARIS_LENGTH_IN_CHECKSUM) ;; *solaris2.5*) AC_DEFINE(SOLARIS_LENGTH_IN_CHECKSUM) ;; esac ;; esac case "$host" in *cygwin*) : we do not require pcap, but we do require special win32 libraries. LIBS="-lws2_32 $LIBS" ;; *) dnl Option to build universal binaries on Mac OS X AC_ARG_ENABLE(universal,[ --enable-universal whether to include intel and ppc arch for Mac OS X],[UNIVERSAL="$enableval"],[UNIVERSAL="no"]) dnl Option to enable gettimeofday checks in addition to pcap header timestamp AC_ARG_ENABLE(gtod,[ --enable-gtod use gettimeofday instead of pcap timestamps], [GTOD="$enableval"],[GTOD="no"]) dnl Make sure we have pcap AC_ARG_WITH(pcap, [ --with-pcap=PATH specify path to pcap library], [ AC_MSG_CHECKING(for --with-pcap option) case "$withval" in yes|no) AC_MSG_ERROR(please specify a PATH in --with-pcap option!) ;; *) if test '!' -d "$withval"; then AC_MSG_ERROR($withval does not exist!) else AC_MSG_RESULT($withval) if test -d "$withval/include"; then CFLAGS="$CFLAGS -I$withval/include" CPPFLAGS="$CPPFLAGS -I$withval/include" else CFLAGS="$CFLAGS -I$withval" CPPFLAGS="$CPPFLAGS -I$withval" fi if test -d "$withval/lib"; then LIBS="$LIBS -L$withval/lib" else LIBS="$LIBS -L$withval" fi fi ;; esac ] ) AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ # include # include ]], [[u_int i = sizeof(((struct sockaddr *)0)->sa_len)]])],[AC_DEFINE(HAVE_SOCKADDR_SA_LEN)],[]) AC_CHECK_LIB(pcap, pcap_lookupdev, , [ AC_MSG_ERROR([ Can't find the pcap developer library (libpcap); please install the pcap library or use --with-pcap to specify the path to it on your system]) ]) AC_CHECK_HEADER(pcap.h, , [ AC_MSG_ERROR([ Can't find pcap.h; install the pcap library (from ftp://ftp.ee.lbl.gov/libpcap.tar.Z ) and/or use --with-pcap to specify the path to it on your system When installing libpcap do both 'make install' and 'make install-incl']) ]) esac dnl Set universal binary options AC_MSG_CHECKING(if we should build universal binaries) if test "$UNIVERSAL" = "yes"; then case $host_os in *darwin* ) CFLAGS="$CFLAGS -arch i386 -arch ppc" LDFLAGS="$LDFLAGS -arch i386 -arch ppc" AC_DEFINE(UNIVERSAL) AC_MSG_RESULT([yes]) ;; esac else AC_MSG_RESULT([no]) fi dnl Use gettimeofday() on each packet AC_MSG_CHECKING(if we should gettimeofday for each packet) if test "$GTOD" = "yes"; then AC_DEFINE(USE_GTOD) AC_MSG_RESULT([yes]) else AC_MSG_RESULT([no]) fi AC_CONFIG_FILES([Makefile]) AC_OUTPUT lft-3.8/config/config/000755 000766 000000 00000000000 13263007003 014575 5ustar00vicwheel000000 000000 lft-3.8/config/acconfig.win.h000644 000766 000000 00000012235 11053131665 016060 0ustar00vicwheel000000 000000 /* config/acconfig.h. Generated by configure. */ /* acconfig.h.in. */ /* Host system type */ #define HOST_SYSTEM_TYPE "i686-pc-cygwin" /* Define if using alloca.c. */ /* #undef C_ALLOCA */ /* Define to empty if the keyword does not work. */ /* #undef const */ /* Define to one of _getb67, GETB67, getb67 for Cray-2 and Cray-YMP systems. This function is required for alloca.c support on those systems. */ /* #undef CRAY_STACKSEG_END */ /* Define if you have alloca, as a function or macro. */ #define HAVE_ALLOCA 1 /* Define if you have and it should be used (not on Ultrix). */ #define HAVE_ALLOCA_H 1 /* Define to `unsigned' if doesn't define. */ /* #undef size_t */ /* If using the C implementation of alloca, define if you know the direction of stack growth for your system; otherwise it will be automatically deduced at run-time. STACK_DIRECTION > 0 => grows toward higher addresses STACK_DIRECTION < 0 => grows toward lower addresses STACK_DIRECTION = 0 => direction of growth unknown */ /* #undef STACK_DIRECTION */ /* Define if you have the ANSI C header files. */ #define STDC_HEADERS 1 /* Define if you can safely include both and . */ #define TIME_WITH_SYS_TIME 1 /* Define if using alloca.c. */ /* #undef C_ALLOCA */ /* Define to empty if the keyword does not work. */ /* #undef const */ /* Define to one of _getb67, GETB67, getb67 for Cray-2 and Cray-YMP systems. This function is required for alloca.c support on those systems. */ /* #undef CRAY_STACKSEG_END */ /* Define if you have alloca, as a function or macro. */ #define HAVE_ALLOCA 1 /* Define if you have and it should be used (not on Ultrix). */ #define HAVE_ALLOCA_H 1 /* Define to `unsigned' if doesn't define. */ /* #undef size_t */ /* If using the C implementation of alloca, define if you know the direction of stack growth for your system; otherwise it will be automatically deduced at run-time. STACK_DIRECTION > 0 => grows toward higher addresses STACK_DIRECTION < 0 => grows toward lower addresses STACK_DIRECTION = 0 => direction of growth unknown */ /* #undef STACK_DIRECTION */ /* Define if you have the ANSI C header files. */ #define STDC_HEADERS 1 /* Define if you can safely include both and . */ #define TIME_WITH_SYS_TIME 1 /* Define if using alloca.c. */ /* #undef C_ALLOCA */ /* Define to empty if the keyword does not work. */ /* #undef const */ /* Define to one of _getb67, GETB67, getb67 for Cray-2 and Cray-YMP systems. This function is required for alloca.c support on those systems. */ /* #undef CRAY_STACKSEG_END */ /* Define if you have alloca, as a function or macro. */ #define HAVE_ALLOCA 1 /* Define if you have and it should be used (not on Ultrix). */ #define HAVE_ALLOCA_H 1 /* Define to `unsigned' if doesn't define. */ /* #undef size_t */ /* If using the C implementation of alloca, define if you know the direction of stack growth for your system; otherwise it will be automatically deduced at run-time. STACK_DIRECTION > 0 => grows toward higher addresses STACK_DIRECTION < 0 => grows toward lower addresses STACK_DIRECTION = 0 => direction of growth unknown */ /* #undef STACK_DIRECTION */ /* Define if you have the ANSI C header files. */ #define STDC_HEADERS 1 /* Define if you can safely include both and . */ #define TIME_WITH_SYS_TIME 1 /* Linux requires this in order to have the right network structures. */ #ifndef _BSD_SOURCE #define _BSD_SOURCE #endif /* Define if you have the gettimeofday function. */ #define HAVE_GETTIMEOFDAY 1 /* Define if you have the select function. */ #define HAVE_SELECT 1 /* Define if you have the socket function. */ #define HAVE_SOCKET 1 /* Define if you have the strdup function. */ #define HAVE_STRDUP 1 /* Define if you have the strstr function. */ #define HAVE_STRSTR 1 /* Define if you have the header file. */ #define HAVE_FCNTL_H 1 /* Define if you have the header file. */ #define HAVE_LIMITS_H 1 /* Define if you have the header file. */ #define HAVE_STRINGS_H 1 /* Define if you have the header file. */ #define HAVE_SYS_IOCTL_H 1 /* Define if you have the header file. */ #define HAVE_SYS_TIME_H 1 /* Define if you have the header file. */ #define HAVE_UNISTD_H 1 /* Define if you have the m library (-lm). */ #define HAVE_LIBM 1 /* Define if you have the nsl library (-lnsl). */ /* #undef HAVE_LIBNSL */ /* Define if you have the pcap library (-lpcap). */ /* #undef HAVE_LIBPCAP */ /* Define if you have the socket library (-lsocket). */ /* #undef HAVE_LIBSOCKET */ /* Define if this is a BSD TCP/IP stack */ /* #undef BSD_IP_STACK */ /* Define if this is Darwin */ /* #undef DARWIN */ /* Define if this is NETBSD */ /* #undef NETBSD */ /* Define if this is OpenBSD */ /* #undef OPENBSD */ /* Define if solaris munges the th_sum field in its own special way */ /* #undef SOLARIS_LENGTH_IN_CHECKSUM */ /* Define if your system has a sa_len member in struct sockaddr */ /* #undef HAVE_SOCKADDR_SA_LEN */ /* Define if an IPv6 network stack is detected */ /* #undef INET6 */ lft-3.8/config/config.guess000755 000766 000000 00000126260 11053131665 015666 0ustar00vicwheel000000 000000 #! /bin/sh # Attempt to guess a canonical system name. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, # Inc. timestamp='2006-07-02' # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA # 02110-1301, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Originally written by Per Bothner . # Please send patches to . Submit a context # diff and a properly formatted ChangeLog entry. # # This script attempts to guess a canonical system name similar to # config.sub. If it succeeds, it prints the system name on stdout, and # exits with 0. Otherwise, it exits with 1. # # The plan is that this can be called by configure scripts if you # don't specify an explicit build system type. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] Output the configuration name of the system \`$me' is run on. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.guess ($timestamp) Originally written by Per Bothner. Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" >&2 exit 1 ;; * ) break ;; esac done if test $# != 0; then echo "$me: too many arguments$help" >&2 exit 1 fi trap 'exit 1' 1 2 15 # CC_FOR_BUILD -- compiler used by this script. Note that the use of a # compiler to aid in system detection is discouraged as it requires # temporary files to be created and, as you can see below, it is a # headache to deal with in a portable fashion. # Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still # use `HOST_CC' if defined, but it is deprecated. # Portable tmp directory creation inspired by the Autoconf team. set_cc_for_build=' trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; : ${TMPDIR=/tmp} ; { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; dummy=$tmp/dummy ; tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; case $CC_FOR_BUILD,$HOST_CC,$CC in ,,) echo "int x;" > $dummy.c ; for c in cc gcc c89 c99 ; do if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then CC_FOR_BUILD="$c"; break ; fi ; done ; if test x"$CC_FOR_BUILD" = x ; then CC_FOR_BUILD=no_compiler_found ; fi ;; ,,*) CC_FOR_BUILD=$CC ;; ,*,*) CC_FOR_BUILD=$HOST_CC ;; esac ; set_cc_for_build= ;' # This is needed to find uname on a Pyramid OSx when run in the BSD universe. # (ghazi@noc.rutgers.edu 1994-08-24) if (test -f /.attbin/uname) >/dev/null 2>&1 ; then PATH=$PATH:/.attbin ; export PATH fi UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown # Note: order is significant - the case branches are not exclusive. case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in *:NetBSD:*:*) # NetBSD (nbsd) targets should (where applicable) match one or # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently # switched to ELF, *-*-netbsd* would select the old # object file format. This provides both forward # compatibility and a consistent mechanism for selecting the # object file format. # # Note: NetBSD doesn't particularly care about the vendor # portion of the name. We always set it to "unknown". sysctl="sysctl -n hw.machine_arch" UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ /usr/sbin/$sysctl 2>/dev/null || echo unknown)` case "${UNAME_MACHINE_ARCH}" in armeb) machine=armeb-unknown ;; arm*) machine=arm-unknown ;; sh3el) machine=shl-unknown ;; sh3eb) machine=sh-unknown ;; *) machine=${UNAME_MACHINE_ARCH}-unknown ;; esac # The Operating System including object format, if it has switched # to ELF recently, or will in the future. case "${UNAME_MACHINE_ARCH}" in arm*|i386|m68k|ns32k|sh3*|sparc|vax) eval $set_cc_for_build if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ | grep __ELF__ >/dev/null then # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). # Return netbsd for either. FIX? os=netbsd else os=netbsdelf fi ;; *) os=netbsd ;; esac # The OS release # Debian GNU/NetBSD machines have a different userland, and # thus, need a distinct triplet. However, they do not need # kernel version information, so it can be replaced with a # suitable tag, in the style of linux-gnu. case "${UNAME_VERSION}" in Debian*) release='-gnu' ;; *) release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` ;; esac # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: # contains redundant information, the shorter form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. echo "${machine}-${os}${release}" exit ;; *:OpenBSD:*:*) UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} exit ;; *:ekkoBSD:*:*) echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} exit ;; *:SolidBSD:*:*) echo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE} exit ;; macppc:MirBSD:*:*) echo powerpc-unknown-mirbsd${UNAME_RELEASE} exit ;; *:MirBSD:*:*) echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} exit ;; alpha:OSF1:*:*) case $UNAME_RELEASE in *4.0) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` ;; *5.*) UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` ;; esac # According to Compaq, /usr/sbin/psrinfo has been available on # OSF/1 and Tru64 systems produced since 1995. I hope that # covers most systems running today. This code pipes the CPU # types through head -n 1, so we only detect the type of CPU 0. ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` case "$ALPHA_CPU_TYPE" in "EV4 (21064)") UNAME_MACHINE="alpha" ;; "EV4.5 (21064)") UNAME_MACHINE="alpha" ;; "LCA4 (21066/21068)") UNAME_MACHINE="alpha" ;; "EV5 (21164)") UNAME_MACHINE="alphaev5" ;; "EV5.6 (21164A)") UNAME_MACHINE="alphaev56" ;; "EV5.6 (21164PC)") UNAME_MACHINE="alphapca56" ;; "EV5.7 (21164PC)") UNAME_MACHINE="alphapca57" ;; "EV6 (21264)") UNAME_MACHINE="alphaev6" ;; "EV6.7 (21264A)") UNAME_MACHINE="alphaev67" ;; "EV6.8CB (21264C)") UNAME_MACHINE="alphaev68" ;; "EV6.8AL (21264B)") UNAME_MACHINE="alphaev68" ;; "EV6.8CX (21264D)") UNAME_MACHINE="alphaev68" ;; "EV6.9A (21264/EV69A)") UNAME_MACHINE="alphaev69" ;; "EV7 (21364)") UNAME_MACHINE="alphaev7" ;; "EV7.9 (21364A)") UNAME_MACHINE="alphaev79" ;; esac # A Pn.n version is a patched version. # A Vn.n version is a released version. # A Tn.n version is a released field test version. # A Xn.n version is an unreleased experimental baselevel. # 1.2 uses "1.2" for uname -r. echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` exit ;; Alpha\ *:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # Should we change UNAME_MACHINE based on the output of uname instead # of the specific Alpha model? echo alpha-pc-interix exit ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit ;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit ;; *:OS/390:*:*) echo i370-ibm-openedition exit ;; *:z/VM:*:*) echo s390-ibm-zvmoe exit ;; *:OS400:*:*) echo powerpc-ibm-os400 exit ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit ;; arm:riscos:*:*|arm:RISCOS:*:*) echo arm-unknown-riscos exit ;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit ;; Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. if test "`(/bin/universe) 2>/dev/null`" = att ; then echo pyramid-pyramid-sysv3 else echo pyramid-pyramid-bsd fi exit ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit ;; DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7; exit ;; esac ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; i86pc:SunOS:5.*:*) echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:6*:*) # According to config.sub, this is the proper way to canonicalize # SunOS6. Hard to guess exactly what SunOS6 will be like, but # it's likely to be more like Solaris than SunOS4. echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; sun4*:SunOS:*:*) case "`/usr/bin/arch -k`" in Series*|S4*) UNAME_RELEASE=`uname -v` ;; esac # Japanese Language versions have a version number like `4.1.3-JL'. echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` exit ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit ;; sun*:*:4.2BSD:*) UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 case "`/bin/arch`" in sun3) echo m68k-sun-sunos${UNAME_RELEASE} ;; sun4) echo sparc-sun-sunos${UNAME_RELEASE} ;; esac exit ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit ;; # The situation for MiNT is a little confusing. The machine name # can be virtually everything (everything which is not # "atarist" or "atariste" at least should have a processor # > m68000). The system name ranges from "MiNT" over "FreeMiNT" # to the lowercase version "mint" (or "freemint"). Finally # the system name "TOS" denotes a system which is actually not # MiNT. But MiNT is downward compatible to TOS, so this should # be no problem. atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit ;; m68k:machten:*:*) echo m68k-apple-machten${UNAME_RELEASE} exit ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit ;; mips:*:*:UMIPS | mips:*:*:RISCos) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #ifdef __cplusplus #include /* for printf() prototype */ int main (int argc, char *argv[]) { #else int main (argc, argv) int argc; char *argv[]; { #endif #if defined (host_mips) && defined (MIPSEB) #if defined (SYSTYPE_SYSV) printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_SVR4) printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); #endif #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); #endif #endif exit (-1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && dummyarg=`echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` && SYSTEM_NAME=`$dummy $dummyarg` && { echo "$SYSTEM_NAME"; exit; } echo mips-mips-riscos${UNAME_RELEASE} exit ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit ;; AViiON:dgux:*:*) # DG/UX returns AViiON for all architectures UNAME_PROCESSOR=`/usr/bin/uname -p` if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] then if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ [ ${TARGET_BINARY_INTERFACE}x = x ] then echo m88k-dg-dgux${UNAME_RELEASE} else echo m88k-dg-dguxbcs${UNAME_RELEASE} fi else echo i586-dg-dgux${UNAME_RELEASE} fi exit ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit ;; ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit ;; ia64:AIX:*:*) if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} exit ;; *:AIX:2:3) if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include main() { if (!__power_pc()) exit(1); puts("powerpc-ibm-aix3.2.5"); exit(0); } EOF if $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` then echo "$SYSTEM_NAME" else echo rs6000-ibm-aix3.2.5 fi elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then echo rs6000-ibm-aix3.2.4 else echo rs6000-ibm-aix3.2 fi exit ;; *:AIX:*:[45]) IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then IBM_ARCH=rs6000 else IBM_ARCH=powerpc fi if [ -x /usr/bin/oslevel ] ; then IBM_REV=`/usr/bin/oslevel` else IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} fi echo ${IBM_ARCH}-ibm-aix${IBM_REV} exit ;; *:AIX:*:*) echo rs6000-ibm-aix exit ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit ;; 9000/[34678]??:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` case "${UNAME_MACHINE}" in 9000/31? ) HP_ARCH=m68000 ;; 9000/[34]?? ) HP_ARCH=m68k ;; 9000/[678][0-9][0-9]) if [ -x /usr/bin/getconf ]; then sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` case "${sc_cpu_version}" in 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 532) # CPU_PA_RISC2_0 case "${sc_kernel_bits}" in 32) HP_ARCH="hppa2.0n" ;; 64) HP_ARCH="hppa2.0w" ;; '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 esac ;; esac fi if [ "${HP_ARCH}" = "" ]; then eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #define _HPUX_SOURCE #include #include int main () { #if defined(_SC_KERNEL_BITS) long bits = sysconf(_SC_KERNEL_BITS); #endif long cpu = sysconf (_SC_CPU_VERSION); switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0"); break; case CPU_PA_RISC1_1: puts ("hppa1.1"); break; case CPU_PA_RISC2_0: #if defined(_SC_KERNEL_BITS) switch (bits) { case 64: puts ("hppa2.0w"); break; case 32: puts ("hppa2.0n"); break; default: puts ("hppa2.0"); break; } break; #else /* !defined(_SC_KERNEL_BITS) */ puts ("hppa2.0"); break; #endif default: puts ("hppa1.0"); break; } exit (0); } EOF (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` test -z "$HP_ARCH" && HP_ARCH=hppa fi ;; esac if [ ${HP_ARCH} = "hppa2.0w" ] then eval $set_cc_for_build # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler # generating 64-bit code. GNU and HP use different nomenclature: # # $ CC_FOR_BUILD=cc ./config.guess # => hppa2.0w-hp-hpux11.23 # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess # => hppa64-hp-hpux11.23 if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | grep __LP64__ >/dev/null then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit ;; 3050*:HI-UX:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include int main () { long cpu = sysconf (_SC_CPU_VERSION); /* The order matters, because CPU_IS_HP_MC68K erroneously returns true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct results, however. */ if (CPU_IS_PA_RISC (cpu)) { switch (cpu) { case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; default: puts ("hppa-hitachi-hiuxwe2"); break; } } else if (CPU_IS_HP_MC68K (cpu)) puts ("m68k-hitachi-hiuxwe2"); else puts ("unknown-hitachi-hiuxwe2"); exit (0); } EOF $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } echo unknown-hitachi-hiuxwe2 exit ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*[A-Z]90:*:*:*) echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ -e 's/\.[^.]*$/.X/' exit ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; *:UNICOS/mp:*:*) echo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit ;; F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; 5000:UNIX_System_V:4.*:*) FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" exit ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit ;; *:FreeBSD:*:*) case ${UNAME_MACHINE} in pc98) echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; amd64) echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; *) echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;; esac exit ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit ;; i*:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit ;; i*:windows32*:*) # uname -m includes "-pc" on this system. echo ${UNAME_MACHINE}-mingw32 exit ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit ;; x86:Interix*:[3456]*) echo i586-pc-interix${UNAME_RELEASE} exit ;; EM64T:Interix*:[3456]*) echo x86_64-unknown-interix${UNAME_RELEASE} exit ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit ;; i*:Windows_NT*:* | Pentium*:Windows_NT*:*) # How do we know it's Interix rather than the generic POSIX subsystem? # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we # UNAME_MACHINE based on the output of uname instead of i386? echo i586-pc-interix exit ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit ;; amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) echo x86_64-unknown-cygwin exit ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit ;; *:GNU/*:*:*) # other systems with GNU libc and userland echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu exit ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit ;; arm*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; avr32*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; cris:Linux:*:*) echo cris-axis-linux-gnu exit ;; crisv32:Linux:*:*) echo crisv32-axis-linux-gnu exit ;; frv:Linux:*:*) echo frv-unknown-linux-gnu exit ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m32r*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; mips:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips #undef mipsel #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mipsel #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips #else CPU= #endif #endif EOF eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' /^CPU/{ s: ::g p }'`" test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips64 #undef mips64el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mips64el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips64 #else CPU= #endif #endif EOF eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' /^CPU/{ s: ::g p }'`" test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; } ;; or32:Linux:*:*) echo or32-unknown-linux-gnu exit ;; ppc:Linux:*:*) echo powerpc-unknown-linux-gnu exit ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-gnu exit ;; alpha:Linux:*:*) case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in EV5) UNAME_MACHINE=alphaev5 ;; EV56) UNAME_MACHINE=alphaev56 ;; PCA56) UNAME_MACHINE=alphapca56 ;; PCA57) UNAME_MACHINE=alphapca56 ;; EV6) UNAME_MACHINE=alphaev6 ;; EV67) UNAME_MACHINE=alphaev67 ;; EV68*) UNAME_MACHINE=alphaev68 ;; esac objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} exit ;; parisc:Linux:*:* | hppa:Linux:*:*) # Look for CPU level case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in PA7*) echo hppa1.1-unknown-linux-gnu ;; PA8*) echo hppa2.0-unknown-linux-gnu ;; *) echo hppa-unknown-linux-gnu ;; esac exit ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-gnu exit ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux exit ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit ;; vax:Linux:*:*) echo ${UNAME_MACHINE}-dec-linux-gnu exit ;; x86_64:Linux:*:*) echo x86_64-unknown-linux-gnu exit ;; i*86:Linux:*:*) # The BFD linker knows what the default object file format is, so # first see if it will tell us. cd to the root directory to prevent # problems with other programs or directories called `ld' in the path. # Set LC_ALL=C to ensure ld outputs messages in English. ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ | sed -ne '/supported targets:/!d s/[ ][ ]*/ /g s/.*supported targets: *// s/ .*// p'` case "$ld_supported_targets" in elf32-i386) TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" ;; a.out-i386-linux) echo "${UNAME_MACHINE}-pc-linux-gnuaout" exit ;; coff-i386) echo "${UNAME_MACHINE}-pc-linux-gnucoff" exit ;; "") # Either a pre-BFD a.out linker (linux-gnuoldld) or # one that does not give us useful --help. echo "${UNAME_MACHINE}-pc-linux-gnuoldld" exit ;; esac # Determine whether the default compiler is a.out or elf eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include #ifdef __ELF__ # ifdef __GLIBC__ # if __GLIBC__ >= 2 LIBC=gnu # else LIBC=gnulibc1 # endif # else LIBC=gnulibc1 # endif #else #if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC) LIBC=gnu #else LIBC=gnuaout #endif #endif #ifdef __dietlibc__ LIBC=dietlibc #endif EOF eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n ' /^LIBC/{ s: ::g p }'`" test x"${LIBC}" != x && { echo "${UNAME_MACHINE}-pc-linux-${LIBC}" exit } test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; } ;; i*86:DYNIX/ptx:4*:*) # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. # earlier versions are messed up and put the nodename in both # sysname and nodename. echo i386-sequent-sysv4 exit ;; i*86:UNIX_SV:4.2MP:2.*) # Unixware is an offshoot of SVR4, but it has its own version # number series starting with 2... # I am not positive that other SVR4 systems won't match this, # I just have to hope. -- rms. # Use sysv4.2uw... so that sysv4* matches it. echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} exit ;; i*86:OS/2:*:*) # If we were able to find `uname', then EMX Unix compatibility # is probably installed. echo ${UNAME_MACHINE}-pc-os2-emx exit ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit ;; i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} else echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} fi exit ;; i*86:*:5:[678]*) # UnixWare 7.x, OpenUNIX and OpenServer 6. case `/bin/uname -X | grep "^Machine"` in *486*) UNAME_MACHINE=i486 ;; *Pentium) UNAME_MACHINE=i586 ;; *Pent*|*Celeron) UNAME_MACHINE=i686 ;; esac echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} exit ;; i*86:*:3.2:*) if test -f /usr/options/cb.name; then UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ && UNAME_MACHINE=i586 (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ && UNAME_MACHINE=i686 (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ && UNAME_MACHINE=i686 echo ${UNAME_MACHINE}-pc-sco$UNAME_REL else echo ${UNAME_MACHINE}-pc-sysv32 fi exit ;; pc:*:*:*) # Left here for compatibility: # uname -m prints for DJGPP always 'pc', but it prints nothing about # the processor, so we play safe by assuming i386. echo i386-pc-msdosdjgpp exit ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit ;; paragon:*:*:*) echo i860-intel-osf1 exit ;; i860:*:4.*:*) # i860-SVR4 if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 else # Add other i860-SVR4 vendors below as they are discovered. echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 fi exit ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit ;; M68*:*:R3V[5678]*:*) test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) OS_REL='' test -r /etc/.relid \ && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4.3${OS_REL}; exit; } /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && { echo i486-ncr-sysv4; exit; } ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit ;; *:SINIX-*:*:*) if uname -p 2>/dev/null >/dev/null ; then UNAME_MACHINE=`(uname -p) 2>/dev/null` echo ${UNAME_MACHINE}-sni-sysv4 else echo ns32k-sni-sysv fi exit ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit ;; i*86:VOS:*:*) # From Paul.Green@stratus.com. echo ${UNAME_MACHINE}-stratus-vos exit ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit ;; R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) if [ -d /usr/nec ]; then echo mips-nec-sysv${UNAME_RELEASE} else echo mips-unknown-sysv${UNAME_RELEASE} fi exit ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit ;; *:Darwin:*:*) UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown case $UNAME_PROCESSOR in unknown) UNAME_PROCESSOR=powerpc ;; esac echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit ;; *:procnto*:*:* | *:QNX:[0123456789]*:*) UNAME_PROCESSOR=`uname -p` if test "$UNAME_PROCESSOR" = "x86"; then UNAME_PROCESSOR=i386 UNAME_MACHINE=pc fi echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} exit ;; *:QNX:*:4*) echo i386-pc-qnx exit ;; NSE-?:NONSTOP_KERNEL:*:*) echo nse-tandem-nsk${UNAME_RELEASE} exit ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit ;; *:Plan9:*:*) # "uname -m" is not consistent, so use $cputype instead. 386 # is converted to i386 for consistency with other x86 # operating systems. if test "$cputype" = "386"; then UNAME_MACHINE=i386 else UNAME_MACHINE="$cputype" fi echo ${UNAME_MACHINE}-unknown-plan9 exit ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit ;; *:ITS:*:*) echo pdp10-unknown-its exit ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit ;; *:DragonFly:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` exit ;; *:*VMS:*:*) UNAME_MACHINE=`(uname -p) 2>/dev/null` case "${UNAME_MACHINE}" in A*) echo alpha-dec-vms ; exit ;; I*) echo ia64-dec-vms ; exit ;; V*) echo vax-dec-vms ; exit ;; esac ;; *:XENIX:*:SysV) echo i386-pc-xenix exit ;; i*86:skyos:*:*) echo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//' exit ;; i*86:rdos:*:*) echo ${UNAME_MACHINE}-pc-rdos exit ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 eval $set_cc_for_build cat >$dummy.c < # include #endif main () { #if defined (sony) #if defined (MIPSEB) /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, I don't know.... */ printf ("mips-sony-bsd\n"); exit (0); #else #include printf ("m68k-sony-newsos%s\n", #ifdef NEWSOS4 "4" #else "" #endif ); exit (0); #endif #endif #if defined (__arm) && defined (__acorn) && defined (__unix) printf ("arm-acorn-riscix\n"); exit (0); #endif #if defined (hp300) && !defined (hpux) printf ("m68k-hp-bsd\n"); exit (0); #endif #if defined (NeXT) #if !defined (__ARCHITECTURE__) #define __ARCHITECTURE__ "m68k" #endif int version; version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; if (version < 4) printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); else printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); exit (0); #endif #if defined (MULTIMAX) || defined (n16) #if defined (UMAXV) printf ("ns32k-encore-sysv\n"); exit (0); #else #if defined (CMU) printf ("ns32k-encore-mach\n"); exit (0); #else printf ("ns32k-encore-bsd\n"); exit (0); #endif #endif #endif #if defined (__386BSD__) printf ("i386-pc-bsd\n"); exit (0); #endif #if defined (sequent) #if defined (i386) printf ("i386-sequent-dynix\n"); exit (0); #endif #if defined (ns32000) printf ("ns32k-sequent-dynix\n"); exit (0); #endif #endif #if defined (_SEQUENT_) struct utsname un; uname(&un); if (strncmp(un.version, "V2", 2) == 0) { printf ("i386-sequent-ptx2\n"); exit (0); } if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ printf ("i386-sequent-ptx1\n"); exit (0); } printf ("i386-sequent-ptx\n"); exit (0); #endif #if defined (vax) # if !defined (ultrix) # include # if defined (BSD) # if BSD == 43 printf ("vax-dec-bsd4.3\n"); exit (0); # else # if BSD == 199006 printf ("vax-dec-bsd4.3reno\n"); exit (0); # else printf ("vax-dec-bsd\n"); exit (0); # endif # endif # else printf ("vax-dec-bsd\n"); exit (0); # endif # else printf ("vax-dec-ultrix\n"); exit (0); # endif #endif #if defined (alliant) && defined (i860) printf ("i860-alliant-bsd\n"); exit (0); #endif exit (1); } EOF $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` && { echo "$SYSTEM_NAME"; exit; } # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; } # Convex versions that predate uname can use getsysinfo(1) if [ -x /usr/convex/getsysinfo ] then case `getsysinfo -f cpu_type` in c1*) echo c1-convex-bsd exit ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit ;; c34*) echo c34-convex-bsd exit ;; c38*) echo c38-convex-bsd exit ;; c4*) echo c4-convex-bsd exit ;; esac fi cat >&2 < in order to provide the needed information to handle your system. config.guess timestamp = $timestamp uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` /bin/uname -X = `(/bin/uname -X) 2>/dev/null` hostinfo = `(hostinfo) 2>/dev/null` /bin/universe = `(/bin/universe) 2>/dev/null` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` /bin/arch = `(/bin/arch) 2>/dev/null` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` UNAME_MACHINE = ${UNAME_MACHINE} UNAME_RELEASE = ${UNAME_RELEASE} UNAME_SYSTEM = ${UNAME_SYSTEM} UNAME_VERSION = ${UNAME_VERSION} EOF exit 1 # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: lft-3.8/config/config.sub000755 000766 000000 00000077460 11053131665 015340 0ustar00vicwheel000000 000000 #! /bin/sh # Configuration validation subroutine script. # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, # 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free Software Foundation, # Inc. timestamp='2006-09-20' # This file is (in principle) common to ALL GNU software. # The presence of a machine in this file suggests that SOME GNU software # can handle that machine. It does not imply ALL GNU software can. # # This file is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA # 02110-1301, USA. # # As a special exception to the GNU General Public License, if you # distribute this file as part of a program that contains a # configuration script generated by Autoconf, you may include it under # the same distribution terms that you use for the rest of that program. # Please send patches to . Submit a context # diff and a properly formatted ChangeLog entry. # # Configuration subroutine to validate and canonicalize a configuration type. # Supply the specified configuration type as an argument. # If it is invalid, we print an error message on stderr and exit with code 1. # Otherwise, we print the canonical config type on stdout and succeed. # This file is supposed to be the same for all GNU packages # and recognize all the CPU types, system types and aliases # that are meaningful with *any* GNU software. # Each package is responsible for reporting which valid configurations # it does not support. The user should be able to distinguish # a failure to support a valid configuration from a meaningless # configuration. # The goal of this file is to map all the various variations of a given # machine specification into a single specification in the form: # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM # or in some cases, the newer four-part form: # CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM # It is wrong to echo any other type of specification. me=`echo "$0" | sed -e 's,.*/,,'` usage="\ Usage: $0 [OPTION] CPU-MFR-OPSYS $0 [OPTION] ALIAS Canonicalize a configuration name. Operation modes: -h, --help print this help, then exit -t, --time-stamp print date of last modification, then exit -v, --version print version number, then exit Report bugs and patches to ." version="\ GNU config.sub ($timestamp) Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." help=" Try \`$me --help' for more information." # Parse command line while test $# -gt 0 ; do case $1 in --time-stamp | --time* | -t ) echo "$timestamp" ; exit ;; --version | -v ) echo "$version" ; exit ;; --help | --h* | -h ) echo "$usage"; exit ;; -- ) # Stop option processing shift; break ;; - ) # Use stdin as input. break ;; -* ) echo "$me: invalid option $1$help" exit 1 ;; *local*) # First pass through any local machine types. echo $1 exit ;; * ) break ;; esac done case $# in 0) echo "$me: missing argument$help" >&2 exit 1;; 1) ;; *) echo "$me: too many arguments$help" >&2 exit 1;; esac # Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). # Here we must recognize all the valid KERNEL-OS combinations. maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` case $maybe_os in nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \ uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \ storm-chaos* | os2-emx* | rtmk-nova*) os=-$maybe_os basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` ;; *) basic_machine=`echo $1 | sed 's/-[^-]*$//'` if [ $basic_machine != $1 ] then os=`echo $1 | sed 's/.*-/-/'` else os=; fi ;; esac ### Let's recognize common machines as not being operating systems so ### that things like config.sub decstation-3100 work. We also ### recognize some manufacturers as not being operating systems, so we ### can provide default operating systems below. case $os in -sun*os*) # Prevent following clause from handling this invalid input. ;; -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ -apple | -axis | -knuth | -cray) os= basic_machine=$1 ;; -sim | -cisco | -oki | -wec | -winbond) os= basic_machine=$1 ;; -scout) ;; -wrs) os=-vxworks basic_machine=$1 ;; -chorusos*) os=-chorusos basic_machine=$1 ;; -chorusrdb) os=-chorusrdb basic_machine=$1 ;; -hiux*) os=-hiuxwe2 ;; -sco6) os=-sco5v6 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5) os=-sco3.2v5 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco4) os=-sco3.2v4 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2.[4-9]*) os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco3.2v[4-9]*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco5v6*) # Don't forget version if it is 3.2v4 or newer. basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -sco*) os=-sco3.2v2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -udk*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -isc) os=-isc2.2 basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -clix*) basic_machine=clipper-intergraph ;; -isc*) basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` ;; -lynx*) os=-lynxos ;; -ptx*) basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` ;; -windowsnt*) os=`echo $os | sed -e 's/windowsnt/winnt/'` ;; -psos*) os=-psos ;; -mint | -mint[0-9]*) basic_machine=m68k-atari os=-mint ;; esac # Decode aliases for certain CPU-COMPANY combinations. case $basic_machine in # Recognize the basic CPU types without company name. # Some are omitted here because they have special meanings below. 1750a | 580 \ | a29k \ | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ | am33_2.0 \ | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \ | bfin \ | c4x | clipper \ | d10v | d30v | dlx | dsp16xx \ | fr30 | frv \ | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ | i370 | i860 | i960 | ia64 \ | ip2k | iq2000 \ | m32c | m32r | m32rle | m68000 | m68k | m88k \ | maxq | mb | microblaze | mcore \ | mips | mipsbe | mipseb | mipsel | mipsle \ | mips16 \ | mips64 | mips64el \ | mips64vr | mips64vrel \ | mips64orion | mips64orionel \ | mips64vr4100 | mips64vr4100el \ | mips64vr4300 | mips64vr4300el \ | mips64vr5000 | mips64vr5000el \ | mips64vr5900 | mips64vr5900el \ | mipsisa32 | mipsisa32el \ | mipsisa32r2 | mipsisa32r2el \ | mipsisa64 | mipsisa64el \ | mipsisa64r2 | mipsisa64r2el \ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipstx39 | mipstx39el \ | mn10200 | mn10300 \ | mt \ | msp430 \ | nios | nios2 \ | ns16k | ns32k \ | or32 \ | pdp10 | pdp11 | pj | pjl \ | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ | pyramid \ | score \ | sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ | sh64 | sh64le \ | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ | spu | strongarm \ | tahoe | thumb | tic4x | tic80 | tron \ | v850 | v850e \ | we32k \ | x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \ | z8k) basic_machine=$basic_machine-unknown ;; m6811 | m68hc11 | m6812 | m68hc12) # Motorola 68HC11/12. basic_machine=$basic_machine-unknown os=-none ;; m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) ;; ms1) basic_machine=mt-unknown ;; # We use `pc' rather than `unknown' # because (1) that's what they normally are, and # (2) the word "unknown" tends to confuse beginning users. i*86 | x86_64) basic_machine=$basic_machine-pc ;; # Object if more than one company name word. *-*-*) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; # Recognize the basic CPU types with company name. 580-* \ | a29k-* \ | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ | avr-* | avr32-* \ | bfin-* | bs2000-* \ | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ | clipper-* | craynv-* | cydra-* \ | d10v-* | d30v-* | dlx-* \ | elxsi-* \ | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \ | h8300-* | h8500-* \ | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ | i*86-* | i860-* | i960-* | ia64-* \ | ip2k-* | iq2000-* \ | m32c-* | m32r-* | m32rle-* \ | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ | m88110-* | m88k-* | maxq-* | mcore-* \ | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ | mips16-* \ | mips64-* | mips64el-* \ | mips64vr-* | mips64vrel-* \ | mips64orion-* | mips64orionel-* \ | mips64vr4100-* | mips64vr4100el-* \ | mips64vr4300-* | mips64vr4300el-* \ | mips64vr5000-* | mips64vr5000el-* \ | mips64vr5900-* | mips64vr5900el-* \ | mipsisa32-* | mipsisa32el-* \ | mipsisa32r2-* | mipsisa32r2el-* \ | mipsisa64-* | mipsisa64el-* \ | mipsisa64r2-* | mipsisa64r2el-* \ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipstx39-* | mipstx39el-* \ | mmix-* \ | mt-* \ | msp430-* \ | nios-* | nios2-* \ | none-* | np1-* | ns16k-* | ns32k-* \ | orion-* \ | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ | pyramid-* \ | romp-* | rs6000-* \ | sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \ | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ | sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \ | sparclite-* \ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \ | tahoe-* | thumb-* \ | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ | tron-* \ | v850-* | v850e-* | vax-* \ | we32k-* \ | x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \ | xstormy16-* | xtensa-* \ | ymp-* \ | z8k-*) ;; # Recognize the various machine names and aliases which stand # for a CPU type and a company and sometimes even an OS. 386bsd) basic_machine=i386-unknown os=-bsd ;; 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) basic_machine=m68000-att ;; 3b*) basic_machine=we32k-att ;; a29khif) basic_machine=a29k-amd os=-udi ;; abacus) basic_machine=abacus-unknown ;; adobe68k) basic_machine=m68010-adobe os=-scout ;; alliant | fx80) basic_machine=fx80-alliant ;; altos | altos3068) basic_machine=m68k-altos ;; am29k) basic_machine=a29k-none os=-bsd ;; amd64) basic_machine=x86_64-pc ;; amd64-*) basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; amdahl) basic_machine=580-amdahl os=-sysv ;; amiga | amiga-*) basic_machine=m68k-unknown ;; amigaos | amigados) basic_machine=m68k-unknown os=-amigaos ;; amigaunix | amix) basic_machine=m68k-unknown os=-sysv4 ;; apollo68) basic_machine=m68k-apollo os=-sysv ;; apollo68bsd) basic_machine=m68k-apollo os=-bsd ;; aux) basic_machine=m68k-apple os=-aux ;; balance) basic_machine=ns32k-sequent os=-dynix ;; c90) basic_machine=c90-cray os=-unicos ;; convex-c1) basic_machine=c1-convex os=-bsd ;; convex-c2) basic_machine=c2-convex os=-bsd ;; convex-c32) basic_machine=c32-convex os=-bsd ;; convex-c34) basic_machine=c34-convex os=-bsd ;; convex-c38) basic_machine=c38-convex os=-bsd ;; cray | j90) basic_machine=j90-cray os=-unicos ;; craynv) basic_machine=craynv-cray os=-unicosmp ;; cr16c) basic_machine=cr16c-unknown os=-elf ;; crds | unos) basic_machine=m68k-crds ;; crisv32 | crisv32-* | etraxfs*) basic_machine=crisv32-axis ;; cris | cris-* | etrax*) basic_machine=cris-axis ;; crx) basic_machine=crx-unknown os=-elf ;; da30 | da30-*) basic_machine=m68k-da30 ;; decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) basic_machine=mips-dec ;; decsystem10* | dec10*) basic_machine=pdp10-dec os=-tops10 ;; decsystem20* | dec20*) basic_machine=pdp10-dec os=-tops20 ;; delta | 3300 | motorola-3300 | motorola-delta \ | 3300-motorola | delta-motorola) basic_machine=m68k-motorola ;; delta88) basic_machine=m88k-motorola os=-sysv3 ;; djgpp) basic_machine=i586-pc os=-msdosdjgpp ;; dpx20 | dpx20-*) basic_machine=rs6000-bull os=-bosx ;; dpx2* | dpx2*-bull) basic_machine=m68k-bull os=-sysv3 ;; ebmon29k) basic_machine=a29k-amd os=-ebmon ;; elxsi) basic_machine=elxsi-elxsi os=-bsd ;; encore | umax | mmax) basic_machine=ns32k-encore ;; es1800 | OSE68k | ose68k | ose | OSE) basic_machine=m68k-ericsson os=-ose ;; fx2800) basic_machine=i860-alliant ;; genix) basic_machine=ns32k-ns ;; gmicro) basic_machine=tron-gmicro os=-sysv ;; go32) basic_machine=i386-pc os=-go32 ;; h3050r* | hiux*) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; h8300hms) basic_machine=h8300-hitachi os=-hms ;; h8300xray) basic_machine=h8300-hitachi os=-xray ;; h8500hms) basic_machine=h8500-hitachi os=-hms ;; harris) basic_machine=m88k-harris os=-sysv3 ;; hp300-*) basic_machine=m68k-hp ;; hp300bsd) basic_machine=m68k-hp os=-bsd ;; hp300hpux) basic_machine=m68k-hp os=-hpux ;; hp3k9[0-9][0-9] | hp9[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k2[0-9][0-9] | hp9k31[0-9]) basic_machine=m68000-hp ;; hp9k3[2-9][0-9]) basic_machine=m68k-hp ;; hp9k6[0-9][0-9] | hp6[0-9][0-9]) basic_machine=hppa1.0-hp ;; hp9k7[0-79][0-9] | hp7[0-79][0-9]) basic_machine=hppa1.1-hp ;; hp9k78[0-9] | hp78[0-9]) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) # FIXME: really hppa2.0-hp basic_machine=hppa1.1-hp ;; hp9k8[0-9][13679] | hp8[0-9][13679]) basic_machine=hppa1.1-hp ;; hp9k8[0-9][0-9] | hp8[0-9][0-9]) basic_machine=hppa1.0-hp ;; hppa-next) os=-nextstep3 ;; hppaosf) basic_machine=hppa1.1-hp os=-osf ;; hppro) basic_machine=hppa1.1-hp os=-proelf ;; i370-ibm* | ibm*) basic_machine=i370-ibm ;; # I'm not sure what "Sysv32" means. Should this be sysv3.2? i*86v32) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv32 ;; i*86v4*) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv4 ;; i*86v) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-sysv ;; i*86sol2) basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` os=-solaris2 ;; i386mach) basic_machine=i386-mach os=-mach ;; i386-vsta | vsta) basic_machine=i386-unknown os=-vsta ;; iris | iris4d) basic_machine=mips-sgi case $os in -irix*) ;; *) os=-irix4 ;; esac ;; isi68 | isi) basic_machine=m68k-isi os=-sysv ;; m88k-omron*) basic_machine=m88k-omron ;; magnum | m3230) basic_machine=mips-mips os=-sysv ;; merlin) basic_machine=ns32k-utek os=-sysv ;; mingw32) basic_machine=i386-pc os=-mingw32 ;; miniframe) basic_machine=m68000-convergent ;; *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` ;; mips3*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown ;; monitor) basic_machine=m68k-rom68k os=-coff ;; morphos) basic_machine=powerpc-unknown os=-morphos ;; msdos) basic_machine=i386-pc os=-msdos ;; ms1-*) basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` ;; mvs) basic_machine=i370-ibm os=-mvs ;; ncr3000) basic_machine=i486-ncr os=-sysv4 ;; netbsd386) basic_machine=i386-unknown os=-netbsd ;; netwinder) basic_machine=armv4l-rebel os=-linux ;; news | news700 | news800 | news900) basic_machine=m68k-sony os=-newsos ;; news1000) basic_machine=m68030-sony os=-newsos ;; news-3600 | risc-news) basic_machine=mips-sony os=-newsos ;; necv70) basic_machine=v70-nec os=-sysv ;; next | m*-next ) basic_machine=m68k-next case $os in -nextstep* ) ;; -ns2*) os=-nextstep2 ;; *) os=-nextstep3 ;; esac ;; nh3000) basic_machine=m68k-harris os=-cxux ;; nh[45]000) basic_machine=m88k-harris os=-cxux ;; nindy960) basic_machine=i960-intel os=-nindy ;; mon960) basic_machine=i960-intel os=-mon960 ;; nonstopux) basic_machine=mips-compaq os=-nonstopux ;; np1) basic_machine=np1-gould ;; nsr-tandem) basic_machine=nsr-tandem ;; op50n-* | op60c-*) basic_machine=hppa1.1-oki os=-proelf ;; openrisc | openrisc-*) basic_machine=or32-unknown ;; os400) basic_machine=powerpc-ibm os=-os400 ;; OSE68000 | ose68000) basic_machine=m68000-ericsson os=-ose ;; os68k) basic_machine=m68k-none os=-os68k ;; pa-hitachi) basic_machine=hppa1.1-hitachi os=-hiuxwe2 ;; paragon) basic_machine=i860-intel os=-osf ;; pbd) basic_machine=sparc-tti ;; pbb) basic_machine=m68k-tti ;; pc532 | pc532-*) basic_machine=ns32k-pc532 ;; pc98) basic_machine=i386-pc ;; pc98-*) basic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium | p5 | k5 | k6 | nexgen | viac3) basic_machine=i586-pc ;; pentiumpro | p6 | 6x86 | athlon | athlon_*) basic_machine=i686-pc ;; pentiumii | pentium2 | pentiumiii | pentium3) basic_machine=i686-pc ;; pentium4) basic_machine=i786-pc ;; pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumpro-* | p6-* | 6x86-* | athlon-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pentium4-*) basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` ;; pn) basic_machine=pn-gould ;; power) basic_machine=power-ibm ;; ppc) basic_machine=powerpc-unknown ;; ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppcle | powerpclittle | ppc-le | powerpc-little) basic_machine=powerpcle-unknown ;; ppcle-* | powerpclittle-*) basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64) basic_machine=powerpc64-unknown ;; ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ppc64le | powerpc64little | ppc64-le | powerpc64-little) basic_machine=powerpc64le-unknown ;; ppc64le-* | powerpc64little-*) basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` ;; ps2) basic_machine=i386-ibm ;; pw32) basic_machine=i586-unknown os=-pw32 ;; rdos) basic_machine=i386-pc os=-rdos ;; rom68k) basic_machine=m68k-rom68k os=-coff ;; rm[46]00) basic_machine=mips-siemens ;; rtpc | rtpc-*) basic_machine=romp-ibm ;; s390 | s390-*) basic_machine=s390-ibm ;; s390x | s390x-*) basic_machine=s390x-ibm ;; sa29200) basic_machine=a29k-amd os=-udi ;; sb1) basic_machine=mipsisa64sb1-unknown ;; sb1el) basic_machine=mipsisa64sb1el-unknown ;; sde) basic_machine=mipsisa32-sde os=-elf ;; sei) basic_machine=mips-sei os=-seiux ;; sequent) basic_machine=i386-sequent ;; sh) basic_machine=sh-hitachi os=-hms ;; sh64) basic_machine=sh64-unknown ;; sparclite-wrs | simso-wrs) basic_machine=sparclite-wrs os=-vxworks ;; sps7) basic_machine=m68k-bull os=-sysv2 ;; spur) basic_machine=spur-unknown ;; st2000) basic_machine=m68k-tandem ;; stratus) basic_machine=i860-stratus os=-sysv4 ;; sun2) basic_machine=m68000-sun ;; sun2os3) basic_machine=m68000-sun os=-sunos3 ;; sun2os4) basic_machine=m68000-sun os=-sunos4 ;; sun3os3) basic_machine=m68k-sun os=-sunos3 ;; sun3os4) basic_machine=m68k-sun os=-sunos4 ;; sun4os3) basic_machine=sparc-sun os=-sunos3 ;; sun4os4) basic_machine=sparc-sun os=-sunos4 ;; sun4sol2) basic_machine=sparc-sun os=-solaris2 ;; sun3 | sun3-*) basic_machine=m68k-sun ;; sun4) basic_machine=sparc-sun ;; sun386 | sun386i | roadrunner) basic_machine=i386-sun ;; sv1) basic_machine=sv1-cray os=-unicos ;; symmetry) basic_machine=i386-sequent os=-dynix ;; t3e) basic_machine=alphaev5-cray os=-unicos ;; t90) basic_machine=t90-cray os=-unicos ;; tic54x | c54x*) basic_machine=tic54x-unknown os=-coff ;; tic55x | c55x*) basic_machine=tic55x-unknown os=-coff ;; tic6x | c6x*) basic_machine=tic6x-unknown os=-coff ;; tx39) basic_machine=mipstx39-unknown ;; tx39el) basic_machine=mipstx39el-unknown ;; toad1) basic_machine=pdp10-xkl os=-tops20 ;; tower | tower-32) basic_machine=m68k-ncr ;; tpf) basic_machine=s390x-ibm os=-tpf ;; udi29k) basic_machine=a29k-amd os=-udi ;; ultra3) basic_machine=a29k-nyu os=-sym1 ;; v810 | necv810) basic_machine=v810-nec os=-none ;; vaxv) basic_machine=vax-dec os=-sysv ;; vms) basic_machine=vax-dec os=-vms ;; vpp*|vx|vx-*) basic_machine=f301-fujitsu ;; vxworks960) basic_machine=i960-wrs os=-vxworks ;; vxworks68) basic_machine=m68k-wrs os=-vxworks ;; vxworks29k) basic_machine=a29k-wrs os=-vxworks ;; w65*) basic_machine=w65-wdc os=-none ;; w89k-*) basic_machine=hppa1.1-winbond os=-proelf ;; xbox) basic_machine=i686-pc os=-mingw32 ;; xps | xps100) basic_machine=xps100-honeywell ;; ymp) basic_machine=ymp-cray os=-unicos ;; z8k-*-coff) basic_machine=z8k-unknown os=-sim ;; none) basic_machine=none-none os=-none ;; # Here we handle the default manufacturer of certain CPU types. It is in # some cases the only manufacturer, in others, it is the most popular. w89k) basic_machine=hppa1.1-winbond ;; op50n) basic_machine=hppa1.1-oki ;; op60c) basic_machine=hppa1.1-oki ;; romp) basic_machine=romp-ibm ;; mmix) basic_machine=mmix-knuth ;; rs6000) basic_machine=rs6000-ibm ;; vax) basic_machine=vax-dec ;; pdp10) # there are many clones, so DEC is not a safe bet basic_machine=pdp10-unknown ;; pdp11) basic_machine=pdp11-dec ;; we32k) basic_machine=we32k-att ;; sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele) basic_machine=sh-unknown ;; sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v) basic_machine=sparc-sun ;; cydra) basic_machine=cydra-cydrome ;; orion) basic_machine=orion-highlevel ;; orion105) basic_machine=clipper-highlevel ;; mac | mpw | mac-mpw) basic_machine=m68k-apple ;; pmac | pmac-mpw) basic_machine=powerpc-apple ;; *-unknown) # Make sure to match an already-canonicalized machine name. ;; *) echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 exit 1 ;; esac # Here we canonicalize certain aliases for manufacturers. case $basic_machine in *-digital*) basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` ;; *-commodore*) basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` ;; *) ;; esac # Decode manufacturer-specific aliases for certain operating systems. if [ x"$os" != x"" ] then case $os in # First match some system type aliases # that might get confused with valid system types. # -solaris* is a basic system type, with this one exception. -solaris1 | -solaris1.*) os=`echo $os | sed -e 's|solaris1|sunos4|'` ;; -solaris) os=-solaris2 ;; -svr4*) os=-sysv4 ;; -unixware*) os=-sysv4.2uw ;; -gnu/linux*) os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` ;; # First accept the basic system types. # The portable systems comes first. # Each alternative MUST END IN A *, to match a version number. # -sysv* is not here because it comes later, after sysvr4. -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ | -aos* \ | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ | -openbsd* | -solidbsd* \ | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ | -chorusos* | -chorusrdb* \ | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ | -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \ | -uxpv* | -beos* | -mpeix* | -udk* \ | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ | -skyos* | -haiku* | -rdos* | -toppers*) # Remember, each alternative MUST END IN *, to match a version number. ;; -qnx*) case $basic_machine in x86-* | i*86-*) ;; *) os=-nto$os ;; esac ;; -nto-qnx*) ;; -nto*) os=`echo $os | sed -e 's|nto|nto-qnx|'` ;; -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \ | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) ;; -mac*) os=`echo $os | sed -e 's|mac|macos|'` ;; -linux-dietlibc) os=-linux-dietlibc ;; -linux*) os=`echo $os | sed -e 's|linux|linux-gnu|'` ;; -sunos5*) os=`echo $os | sed -e 's|sunos5|solaris2|'` ;; -sunos6*) os=`echo $os | sed -e 's|sunos6|solaris3|'` ;; -opened*) os=-openedition ;; -os400*) os=-os400 ;; -wince*) os=-wince ;; -osfrose*) os=-osfrose ;; -osf*) os=-osf ;; -utek*) os=-bsd ;; -dynix*) os=-bsd ;; -acis*) os=-aos ;; -atheos*) os=-atheos ;; -syllable*) os=-syllable ;; -386bsd) os=-bsd ;; -ctix* | -uts*) os=-sysv ;; -nova*) os=-rtmk-nova ;; -ns2 ) os=-nextstep2 ;; -nsk*) os=-nsk ;; # Preserve the version number of sinix5. -sinix5.*) os=`echo $os | sed -e 's|sinix|sysv|'` ;; -sinix*) os=-sysv4 ;; -tpf*) os=-tpf ;; -triton*) os=-sysv3 ;; -oss*) os=-sysv3 ;; -svr4) os=-sysv4 ;; -svr3) os=-sysv3 ;; -sysvr4) os=-sysv4 ;; # This must come after -sysvr4. -sysv*) ;; -ose*) os=-ose ;; -es1800*) os=-ose ;; -xenix) os=-xenix ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) os=-mint ;; -aros*) os=-aros ;; -kaos*) os=-kaos ;; -zvmoe) os=-zvmoe ;; -none) ;; *) # Get rid of the `-' at the beginning of $os. os=`echo $os | sed 's/[^-]*-//'` echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 exit 1 ;; esac else # Here we handle the default operating systems that come with various machines. # The value should be what the vendor currently ships out the door with their # machine or put another way, the most popular os provided with the machine. # Note that if you're going to try to match "-MANUFACTURER" here (say, # "-sun"), then you have to tell the case statement up towards the top # that MANUFACTURER isn't an operating system. Otherwise, code above # will signal an error saying that MANUFACTURER isn't an operating # system, and we'll never get to this point. case $basic_machine in score-*) os=-elf ;; spu-*) os=-elf ;; *-acorn) os=-riscix1.2 ;; arm*-rebel) os=-linux ;; arm*-semi) os=-aout ;; c4x-* | tic4x-*) os=-coff ;; # This must come before the *-dec entry. pdp10-*) os=-tops20 ;; pdp11-*) os=-none ;; *-dec | vax-*) os=-ultrix4.2 ;; m68*-apollo) os=-domain ;; i386-sun) os=-sunos4.0.2 ;; m68000-sun) os=-sunos3 # This also exists in the configure program, but was not the # default. # os=-sunos4 ;; m68*-cisco) os=-aout ;; mips*-cisco) os=-elf ;; mips*-*) os=-elf ;; or32-*) os=-coff ;; *-tti) # must be before sparc entry or we get the wrong os. os=-sysv3 ;; sparc-* | *-sun) os=-sunos4.1.1 ;; *-be) os=-beos ;; *-haiku) os=-haiku ;; *-ibm) os=-aix ;; *-knuth) os=-mmixware ;; *-wec) os=-proelf ;; *-winbond) os=-proelf ;; *-oki) os=-proelf ;; *-hp) os=-hpux ;; *-hitachi) os=-hiux ;; i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) os=-sysv ;; *-cbm) os=-amigaos ;; *-dg) os=-dgux ;; *-dolphin) os=-sysv3 ;; m68k-ccur) os=-rtu ;; m88k-omron*) os=-luna ;; *-next ) os=-nextstep ;; *-sequent) os=-ptx ;; *-crds) os=-unos ;; *-ns) os=-genix ;; i370-*) os=-mvs ;; *-next) os=-nextstep3 ;; *-gould) os=-sysv ;; *-highlevel) os=-bsd ;; *-encore) os=-bsd ;; *-sgi) os=-irix ;; *-siemens) os=-sysv4 ;; *-masscomp) os=-rtu ;; f30[01]-fujitsu | f700-fujitsu) os=-uxpv ;; *-rom68k) os=-coff ;; *-*bug) os=-coff ;; *-apple) os=-macos ;; *-atari*) os=-mint ;; *) os=-none ;; esac fi # Here we handle the case where we know the os, and the CPU type, but not the # manufacturer. We pick the logical manufacturer. vendor=unknown case $basic_machine in *-unknown) case $os in -riscix*) vendor=acorn ;; -sunos*) vendor=sun ;; -aix*) vendor=ibm ;; -beos*) vendor=be ;; -hpux*) vendor=hp ;; -mpeix*) vendor=hp ;; -hiux*) vendor=hitachi ;; -unos*) vendor=crds ;; -dgux*) vendor=dg ;; -luna*) vendor=omron ;; -genix*) vendor=ns ;; -mvs* | -opened*) vendor=ibm ;; -os400*) vendor=ibm ;; -ptx*) vendor=sequent ;; -tpf*) vendor=ibm ;; -vxsim* | -vxworks* | -windiss*) vendor=wrs ;; -aux*) vendor=apple ;; -hms*) vendor=hitachi ;; -mpw* | -macos*) vendor=apple ;; -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) vendor=atari ;; -vos*) vendor=stratus ;; esac basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` ;; esac echo $basic_machine$os exit # Local variables: # eval: (add-hook 'write-file-hooks 'time-stamp) # time-stamp-start: "timestamp='" # time-stamp-format: "%:y-%02m-%02d" # time-stamp-end: "'" # End: