changeset 25245:16b901793d7c

propagate from branch 'im.pidgin.pidgin' (head 932c83e821824239896f933e32349175efb85741) to branch 'im.pidgin.cpw.malu.xmpp.ibb_ft' (head eaa42a57f083078db328e6931d9bb4e0db8180c6)
author Marcus Lundblad <ml@update.uu.se>
date Mon, 15 Dec 2008 23:10:39 +0000
parents 694591875bc9 (diff) 841eb21e96fe (current diff)
children 3918ed48d7a8
files
diffstat 34 files changed, 1834 insertions(+), 1918 deletions(-) [+]
line wrap: on
line diff
--- a/COPYRIGHT	Sat Dec 13 10:52:10 2008 +0000
+++ b/COPYRIGHT	Mon Dec 15 23:10:39 2008 +0000
@@ -272,6 +272,7 @@
 David Mohr
 Andrew Molloy
 Michael Monreal
+Laurent Montaron
 Marco Monteiro
 Benjamin Moody
 John Moody
--- a/ChangeLog	Sat Dec 13 10:52:10 2008 +0000
+++ b/ChangeLog	Mon Dec 15 23:10:39 2008 +0000
@@ -1,18 +1,12 @@
 Pidgin and Finch: The Pimpin' Penguin IM Clients That're Good for the Soul
 
-version 2.5.3 (??/??/????):
+version 2.5.3 (12/??/2008):
 	libpurple:
-	* Fix an error with MSN offline messages by shipping the *new*
-	  "Microsoft Secure Server Authority" and the
-	  "Microsoft Internet Authority" certificates.  People that use
-	  --with-system-ssl-certs and GnuTLS need to include these in the
-	  system certs directory.
 	* Corrected maximum message lengths for Yahoo!
 	* The Buddy State Notification plugin no longer prints duplicate
 	  notifications when the same buddy is in multiple groups (Florian Quèze)
 	* The Buddy State Notification plugin no longer turns JID's, MSN Passport
 	  ID's, etc. into links (Florian Quèze)
-	* Fix a crash in SIMPLE when a malformed message is received.
 	* purple-remote now has a "getstatusmessage" command to retrieve the text
 	  of the current status message.
 	* Various fixes to the nullprpl (Paul Aurich)
@@ -20,14 +14,16 @@
 	  connected (Paul Aurich)
 	* Fix a crash in purple_accounts_delete that happens when this function is
 	  called before the buddy list is initialized (Florian Quèze)
-	* On MSN, the Games and Office media can now be set and displayed (in
-	  addition to the previous Music media). The Media status text now shows
-	  the album, if possible.
 	* Fix use of av_len in perl bindings to fix some off-by-one bugs (Paul
 	  Aurich)
 	* On ICQ, advertise the ICQ 6 typing capability.  This should fix the
 	  reports of typing notifications not working with third-party clients
 	  (Jaromír Karmazín)
+	* Many QQ fixes and improvements, including the ability to connect
+	  using QQ2008 protocol and sending/receiving of long messages.
+	* Fix a crash with DNS SRV lookups (Florian Quèze)
+	* Fix insanely long idle times for Sametime 7.5 buddies by assuming 0 idle
+	  time if the idle timestamp is in the future (Laurent Montaron)
 
 	Gadu-Gadu:
 	* Fix some problems with Gadu-Gadu buddy icons (Adam Strzelecki)
@@ -35,6 +31,26 @@
 	* Gadu-Gadu now does proper charset translations where needed (Adam
 	  Strzelecki)
 
+	MSN:
+	* Fix an error with offline messages by shipping the *new* "Microsoft
+	  Secure Server Authority" and the "Microsoft Internet Authority"
+	  certificates. These are now always installed even when using
+	  --with-system-ssl-certs because most systems don't ship those
+	  intermediate certificates.
+	* The Games and Office media can now be set and displayed (in addition
+	  to the previous Music media). The Media status text now shows the
+	  album, if possible.
+	* Messages sent from a mobile device while you were offline are now
+	  correctly received.
+	* Server transfers after you've been connected for a long time should 
+	  now be handled correctly.
+	* Many other fixes and code cleanup.
+
+	SIMPLE:
+	* Fix a crash when a malformed message is received.
+	* Don't allow connecting accounts if no server name has been specified
+	  (Florian Quèze)
+
 	XMPP:
 	* Fix the namespace URL we look for in PEP reply stanzas to match the URL
 	  used in the 'get' requests (Paul Aurich)
--- a/libpurple/certificate.c	Sat Dec 13 10:52:10 2008 +0000
+++ b/libpurple/certificate.c	Mon Dec 15 23:10:39 2008 +0000
@@ -748,9 +748,9 @@
 # ifdef SSL_CERTIFICATES_DIR
 		x509_ca_paths = g_list_append(NULL, g_strdup(SSL_CERTIFICATES_DIR));
 # else
-		x509_ca_paths = g_list_append(NULL, g_build_filename(DATADIR,
-						   "purple", "ca-certs", NULL));
 # endif
+		x509_ca_paths = g_list_append(x509_ca_paths,
+			g_build_filename(DATADIR, "purple", "ca-certs", NULL));
 #endif
 	}
 
--- a/libpurple/dnssrv.c	Sat Dec 13 10:52:10 2008 +0000
+++ b/libpurple/dnssrv.c	Mon Dec 15 23:10:39 2008 +0000
@@ -336,6 +336,12 @@
 	static gboolean initialized = FALSE;
 #endif
 
+	if (!protocol || !*protocol || !transport || !*transport || !domain || !*domain) {
+		purple_debug_error("dnssrv", "Wrong arguments\n");
+		cb(NULL, 0, extradata);
+		g_return_val_if_reached(NULL);
+	}
+
 	query = g_strdup_printf("_%s._%s.%s", protocol, transport, domain);
 	purple_debug_info("dnssrv","querying SRV record for %s\n", query);
 
--- a/libpurple/protocols/jabber/message.c	Sat Dec 13 10:52:10 2008 +0000
+++ b/libpurple/protocols/jabber/message.c	Mon Dec 15 23:10:39 2008 +0000
@@ -571,12 +571,39 @@
 
 	for(child = packet->child; child; child = child->next) {
 		const char *xmlns = xmlnode_get_namespace(child);
-		if(!xmlns)
-			xmlns = "";
 		if(child->type != XMLNODE_TYPE_TAG)
 			continue;
 
-		if(!strcmp(child->name, "subject") && !strcmp(xmlns,"jabber:client")) {
+		if(!strcmp(child->name, "error")) {
+			const char *code = xmlnode_get_attrib(child, "code");
+			char *code_txt = NULL;
+			char *text = xmlnode_get_data(child);
+			if (!text) {
+				xmlnode *enclosed_text_node;
+				
+				if ((enclosed_text_node = xmlnode_get_child(child, "text")))
+					text = xmlnode_get_data(enclosed_text_node);
+			}
+
+			if(code)
+				code_txt = g_strdup_printf(_("(Code %s)"), code);
+
+			if(!jm->error)
+				jm->error = g_strdup_printf("%s%s%s",
+						text ? text : "",
+						text && code_txt ? " " : "",
+						code_txt ? code_txt : "");
+
+			g_free(code_txt);
+			g_free(text);
+		} else if (xmlns == NULL) {
+			/* QuLogic: Not certain this is correct, but it would have happened
+			   with the previous code. */
+			if(!strcmp(child->name, "x"))
+				jm->etc = g_list_append(jm->etc, child);
+			/* The following tests expect xmlns != NULL */
+			continue;
+		} else if(!strcmp(child->name, "subject") && !strcmp(xmlns,"jabber:client")) {
 			if(!jm->subject)
 				jm->subject = xmlnode_get_data(child);
 		} else if(!strcmp(child->name, "thread") && !strcmp(xmlns,"jabber:client")) {
@@ -706,46 +733,24 @@
 				jm->eventitems = g_list_append(jm->eventitems, items);
 		} else if(!strcmp(child->name, "attention") && !strcmp(xmlns,"http://www.xmpp.org/extensions/xep-0224.html#ns")) {
 			jm->hasBuzz = TRUE;
-		} else if(!strcmp(child->name, "error")) {
-			const char *code = xmlnode_get_attrib(child, "code");
-			char *code_txt = NULL;
-			char *text = xmlnode_get_data(child);
-			if (!text) {
-				xmlnode *enclosed_text_node;
-				
-				if ((enclosed_text_node = xmlnode_get_child(child, "text")))
-					text = xmlnode_get_data(enclosed_text_node);
-			}
-
-			if(code)
-				code_txt = g_strdup_printf(_("(Code %s)"), code);
-
-			if(!jm->error)
-				jm->error = g_strdup_printf("%s%s%s",
-						text ? text : "",
-						text && code_txt ? " " : "",
-						code_txt ? code_txt : "");
-
-			g_free(code_txt);
-			g_free(text);
-		} else if(!strcmp(child->name, "delay") && xmlns && !strcmp(xmlns,"urn:xmpp:delay")) {
+		} else if(!strcmp(child->name, "delay") && !strcmp(xmlns,"urn:xmpp:delay")) {
 			const char *timestamp = xmlnode_get_attrib(child, "stamp");
 			jm->delayed = TRUE;
 			if(timestamp)
 				jm->sent = purple_str_to_time(timestamp, TRUE, NULL, NULL, NULL);
 		} else if(!strcmp(child->name, "x")) {
-			if(xmlns && !strcmp(xmlns, "jabber:x:event")) {
+			if(!strcmp(xmlns, "jabber:x:event")) {
 				if(xmlnode_get_child(child, "composing")) {
 					if(jm->chat_state == JM_STATE_ACTIVE)
 						jm->chat_state = JM_STATE_COMPOSING;
 					jm->typing_style |= JM_TS_JEP_0022;
 				}
-			} else if(xmlns && !strcmp(xmlns, "jabber:x:delay")) {
+			} else if(!strcmp(xmlns, "jabber:x:delay")) {
 				const char *timestamp = xmlnode_get_attrib(child, "stamp");
 				jm->delayed = TRUE;
 				if(timestamp)
 					jm->sent = purple_str_to_time(timestamp, TRUE, NULL, NULL, NULL);
-			} else if(xmlns && !strcmp(xmlns, "jabber:x:conference") &&
+			} else if(!strcmp(xmlns, "jabber:x:conference") &&
 					jm->type != JABBER_MESSAGE_GROUPCHAT_INVITE &&
 					jm->type != JABBER_MESSAGE_ERROR) {
 				const char *jid = xmlnode_get_attrib(child, "jid");
@@ -754,8 +759,7 @@
 					g_free(jm->to);
 					jm->to = g_strdup(jid);
 				}
-			} else if(xmlns && !strcmp(xmlns,
-						"http://jabber.org/protocol/muc#user") &&
+			} else if(!strcmp(xmlns, "http://jabber.org/protocol/muc#user") &&
 					jm->type != JABBER_MESSAGE_ERROR) {
 				xmlnode *invite = xmlnode_get_child(child, "invite");
 				if(invite) {
--- a/libpurple/protocols/jabber/presence.c	Sat Dec 13 10:52:10 2008 +0000
+++ b/libpurple/protocols/jabber/presence.c	Mon Dec 15 23:10:39 2008 +0000
@@ -502,17 +502,19 @@
 				priority = atoi(p);
 				g_free(p);
 			}
+		} else if(xmlns == NULL) {
+			/* The rest of the cases used to check xmlns individually. */
+			continue;
 		} else if(!strcmp(y->name, "delay") && !strcmp(xmlns, "urn:xmpp:delay")) {
 			/* XXX: compare the time.  jabber:x:delay can happen on presence packets that aren't really and truly delayed */
 			delayed = TRUE;
-		} else if(xmlns && !strcmp(y->name, "c") && !strcmp(xmlns, "http://jabber.org/protocol/caps")) {
+		} else if(!strcmp(y->name, "c") && !strcmp(xmlns, "http://jabber.org/protocol/caps")) {
 			caps = y; /* store for later, when creating buddy resource */
 		} else if(!strcmp(y->name, "x")) {
-			const char *xmlns = xmlnode_get_namespace(y);
-			if(xmlns && !strcmp(xmlns, "jabber:x:delay")) {
+			if(!strcmp(xmlns, "jabber:x:delay")) {
 				/* XXX: compare the time.  jabber:x:delay can happen on presence packets that aren't really and truly delayed */
 				delayed = TRUE;
-			} else if(xmlns && !strcmp(xmlns, "http://jabber.org/protocol/muc#user")) {
+			} else if(!strcmp(xmlns, "http://jabber.org/protocol/muc#user")) {
 				xmlnode *z;
 
 				muc = TRUE;
@@ -555,7 +557,7 @@
 							flags |= PURPLE_CBFLAGS_VOICE;
 					}
 				}
-			} else if(xmlns && !strcmp(xmlns, "vcard-temp:x:update")) {
+			} else if(!strcmp(xmlns, "vcard-temp:x:update")) {
 				xmlnode *photo = xmlnode_get_child(y, "photo");
 				if(photo) {
 					g_free(avatar_hash);
--- a/libpurple/protocols/msn/contact.c	Sat Dec 13 10:52:10 2008 +0000
+++ b/libpurple/protocols/msn/contact.c	Mon Dec 15 23:10:39 2008 +0000
@@ -224,19 +224,24 @@
 	char *member_id = xmlnode_get_data(xmlnode_get_child(member, "MembershipId"));
 	MsnUser *user = msn_userlist_find_add_user(session->userlist, passport, NULL);
 	xmlnode *annotation;
-	guint nid = MSN_NETWORK_PASSPORT;
+	guint nid = MSN_NETWORK_UNKNOWN;
 
-	for (annotation = xmlnode_get_child(member, "Annotations/Annotation");
-	     annotation;
-	     annotation = xmlnode_get_next_twin(annotation)) {
-		char *name = xmlnode_get_data(xmlnode_get_child(annotation, "Name"));
-		if (name && !strcmp(name, "MSN.IM.BuddyType")) {
-			char *value = xmlnode_get_data(xmlnode_get_child(annotation, "Value"));
-			if (value != NULL)
-				nid = strtoul(value, NULL, 10);
-			g_free(value);
+	/* For EmailMembers, the network must be found in the annotations. */
+	if (!strcmp(node, "PassportName")) {
+		nid = MSN_NETWORK_PASSPORT;
+	} else {
+		for (annotation = xmlnode_get_child(member, "Annotations/Annotation");
+		     annotation;
+		     annotation = xmlnode_get_next_twin(annotation)) {
+			char *name = xmlnode_get_data(xmlnode_get_child(annotation, "Name"));
+			if (name && !strcmp(name, "MSN.IM.BuddyType")) {
+				char *value = xmlnode_get_data(xmlnode_get_child(annotation, "Value"));
+				if (value != NULL)
+					nid = strtoul(value, NULL, 10);
+				g_free(value);
+			}
+			g_free(name);
 		}
-		g_free(name);
 	}
  
 	purple_debug_info("msn", "CL: %s name: %s, Type: %s, MembershipID: %s, NetworkID: %u\n",
--- a/libpurple/protocols/msn/msg.c	Sat Dec 13 10:52:10 2008 +0000
+++ b/libpurple/protocols/msn/msg.c	Mon Dec 15 23:10:39 2008 +0000
@@ -231,6 +231,25 @@
 	{
 		const char *key, *value;
 
+		/* If this line starts with whitespace, it's been folded from the
+		   previous line and won't have ':'. */
+		if ((**cur == ' ') || (**cur == '\t')) {
+			tokens = g_strsplit(g_strchug(*cur), "=\"", 2);
+			key = tokens[0];
+			value = tokens[1];
+
+			/* The only one I care about is 'boundary' (which is folded from
+			   the key 'Content-Type'), so only process that. */
+			if (!strcmp(key, "boundary")) {
+				char *end = strchr(value, '\"');
+				*end = '\0';
+				msn_message_set_attr(msg, key, value);
+			}
+
+			g_strfreev(tokens);
+			continue;
+		}
+
 		tokens = g_strsplit(*cur, ": ", 2);
 
 		key = tokens[0];
--- a/libpurple/protocols/msn/msn.c	Sat Dec 13 10:52:10 2008 +0000
+++ b/libpurple/protocols/msn/msn.c	Mon Dec 15 23:10:39 2008 +0000
@@ -1418,6 +1418,7 @@
 	MsnSession *session;
 	MsnUserList *userlist;
 	const char *who;
+	MsnUser *user;
 
 	session = gc->proto_data;
 	userlist = session->userlist;
@@ -1446,9 +1447,10 @@
 	/* XXX - Would group ever be NULL here?  I don't think so...
 	 * shx: Yes it should; MSN handles non-grouped buddies, and this is only
 	 * internal. */
-	if (msn_userlist_find_user(userlist, who) != NULL) {
-		/* We already know this buddy. This function takes care of users
-		   already in the list and stuff... */
+	user = msn_userlist_find_user(userlist, who);
+	if ((user != NULL) && (user->networkid != MSN_NETWORK_UNKNOWN)) {
+		/* We already know this buddy and their network. This function knows
+		   what to do with users already in the list and stuff... */
 		msn_userlist_add_buddy(userlist, who, group ? group->name : NULL);
 	} else {
 		/* We need to check the network for this buddy first */
--- a/libpurple/protocols/msn/notification.c	Sat Dec 13 10:52:10 2008 +0000
+++ b/libpurple/protocols/msn/notification.c	Mon Dec 15 23:10:39 2008 +0000
@@ -1958,7 +1958,7 @@
 
 void
 msn_notification_add_buddy_to_list(MsnNotification *notification, MsnListId list_id,
-							  const char *who)
+							  MsnUser *user)
 {
 	MsnCmdProc *cmdproc;
 	MsnListOp list_op = 1 << list_id;
@@ -1971,8 +1971,8 @@
 	adl_node = xmlnode_new("ml");
 	adl_node->child = NULL;
 
-	msn_add_contact_xml(notification->session, adl_node, who, list_op,
-						MSN_NETWORK_PASSPORT);
+	msn_add_contact_xml(notification->session, adl_node, user->passport,
+	                    list_op, user->networkid);
 
 	payload = xmlnode_to_str(adl_node,&payload_len);
 	xmlnode_free(adl_node);
@@ -1984,7 +1984,7 @@
 
 void
 msn_notification_rem_buddy_from_list(MsnNotification *notification, MsnListId list_id,
-						   const char *who)
+						   MsnUser *user)
 {
 	MsnCmdProc *cmdproc;
 	MsnTransaction *trans;
@@ -1998,7 +1998,8 @@
 	rml_node = xmlnode_new("ml");
 	rml_node->child = NULL;
 
-	msn_add_contact_xml(notification->session, rml_node, who, list_op, MSN_NETWORK_PASSPORT);
+	msn_add_contact_xml(notification->session, rml_node, user->passport,
+	                    list_op, user->networkid);
 
 	payload = xmlnode_to_str(rml_node, &payload_len);
 	xmlnode_free(rml_node);
--- a/libpurple/protocols/msn/notification.h	Sat Dec 13 10:52:10 2008 +0000
+++ b/libpurple/protocols/msn/notification.h	Mon Dec 15 23:10:39 2008 +0000
@@ -42,6 +42,7 @@
 #include "session.h"
 #include "servconn.h"
 #include "cmdproc.h"
+#include "user.h"
 
 struct _MsnNotification
 {
@@ -64,9 +65,9 @@
 void msn_notification_init(void);
 
 void msn_notification_add_buddy_to_list(MsnNotification *notification,
-					MsnListId list_id, const char *who);
+					MsnListId list_id, MsnUser *user);
 void msn_notification_rem_buddy_from_list(MsnNotification *notification,
-					  MsnListId list_id, const char *who);
+					  MsnListId list_id, MsnUser *user);
 
 void msn_notification_send_fqy(MsnSession *session, const char *passport);
 
--- a/libpurple/protocols/msn/oim.c	Sat Dec 13 10:52:10 2008 +0000
+++ b/libpurple/protocols/msn/oim.c	Mon Dec 15 23:10:39 2008 +0000
@@ -594,47 +594,91 @@
 msn_oim_report_to_user(MsnOimRecvData *rdata, const char *msg_str)
 {
 	MsnMessage *message;
-	char *date,*from,*decode_msg;
+	const char *date;
+	const char *from;
+	char *decode_msg = NULL;
 	gsize body_len;
 	char **tokens;
-	char *start,*end;
-	int has_nick = 0;
-	char *passport_str, *passport;
+	char *passport = NULL;
 	time_t stamp;
 
 	message = msn_message_new(MSN_MSG_UNKNOWN);
 
 	msn_message_parse_payload(message, msg_str, strlen(msg_str),
-							  MSG_OIM_LINE_DEM, MSG_OIM_BODY_DEM);
+	                          MSG_OIM_LINE_DEM, MSG_OIM_BODY_DEM);
 	purple_debug_info("msn", "oim body:{%s}\n", message->body);
-	decode_msg = (char *)purple_base64_decode(message->body,&body_len);
-	date =	(char *)g_hash_table_lookup(message->attr_table, "Date");
-	from =	(char *)g_hash_table_lookup(message->attr_table, "From");
-	if (strstr(from," ")) {
-		has_nick = 1;
-	}
-	if (has_nick) {
-		tokens = g_strsplit(from , " " , 2);
-		passport_str = g_strdup(tokens[1]);
-		purple_debug_info("msn", "oim Date:{%s},nickname:{%s},tokens[1]:{%s} passport{%s}\n",
-							date, tokens[0], tokens[1], passport_str);
+
+	if (!strcmp(msn_message_get_attr(message, "X-OIMProxy"), "MOSMS")) {
+		char *boundary;
+		char **part;
+
+		from = msn_message_get_attr(message, "X-OIM-originatingSource");
+
+		/* Match number to user's mobile number, FROM is a phone number
+		   if the other side pages you using your phone number */
+		if (!strncmp(from, "tel:+", 5)) {
+			MsnUser *user =	msn_userlist_find_user_with_mobile_phone(
+					rdata->oim->session->userlist, from + 4);
+
+			if (user && user->passport)
+				passport = g_strdup(user->passport);
+		}
+		if (passport == NULL)
+			passport = g_strdup(from);
+
+		boundary = g_strdup_printf("--%s" MSG_OIM_LINE_DEM,
+		                           msn_message_get_attr(message, "boundary"));
+		tokens = g_strsplit(message->body, boundary, 0);
+
+		/* tokens+1 to skip the "This is a multipart message..." text */
+		for (part = tokens+1; *part != NULL; part++) {
+			MsnMessage *multipart;
+			const char *type;
+			multipart = msn_message_new(MSN_MSG_UNKNOWN);
+			msn_message_parse_payload(multipart, *part, strlen(*part),
+			                          MSG_OIM_LINE_DEM, MSG_OIM_BODY_DEM);
+
+			type = msn_message_get_content_type(multipart);
+			if (type && !strcmp(type, "text/plain")) {
+				decode_msg = (char *)purple_base64_decode(multipart->body, &body_len);
+				msn_message_destroy(multipart);
+				break;
+			}
+			msn_message_destroy(multipart);
+		}
+
 		g_strfreev(tokens);
+		g_free(boundary);
+
+		if (decode_msg == NULL) {
+			purple_debug_error("msn", "Couldn't find text/plain OIM message.\n");
+			g_free(passport);
+			return;
+		}
 	} else {
-		passport_str = g_strdup(from);
-		purple_debug_info("msn", "oim Date:{%s},passport{%s}\n",
-					date, passport_str);
+		char *start, *end;
+
+		from = msn_message_get_attr(message, "From");
+		decode_msg = (char *)purple_base64_decode(message->body, &body_len);
+
+		tokens = g_strsplit(from, " ", 2);
+		if (tokens[1] != NULL)
+			from = (const char *)tokens[1];
+
+		start = strchr(from, '<') + 1;
+		end = strchr(from, '>');
+		passport = g_strndup(start, end - start);
+
+		g_strfreev(tokens);
 	}
-	start = strstr(passport_str,"<");
-	start += 1;
-	end = strstr(passport_str,">");
-	passport = g_strndup(start,end - start);
-	g_free(passport_str);
-	purple_debug_info("msn", "oim Date:{%s},passport{%s}\n", date, passport);
 
+	date = msn_message_get_attr(message, "Date");
 	stamp = msn_oim_parse_timestamp(date);
+	purple_debug_info("msn", "oim Date:{%s},passport{%s}\n",
+	                  date, passport);
 
 	serv_got_im(rdata->oim->session->account->gc, passport, decode_msg, 0,
-		stamp);
+	            stamp);
 
 	/*Now get the oim message ID from the oim_list.
 	 * and append to read list to prepare for deleting the Offline Message when sign out
--- a/libpurple/protocols/msn/session.c	Sat Dec 13 10:52:10 2008 +0000
+++ b/libpurple/protocols/msn/session.c	Mon Dec 15 23:10:39 2008 +0000
@@ -448,25 +448,23 @@
 	PurpleConnection *gc;
 	PurpleStoredImage *img;
 
-	if (session->logged_in)
-		return;
-
-	account = session->account;
-	gc = purple_account_get_connection(account);
+	if (!session->logged_in) {
+		account = session->account;
+		gc = purple_account_get_connection(account);
 
-	img = purple_buddy_icons_find_account_icon(session->account);
-	/* TODO: Do we really want to call this if img is NULL? */
-	msn_user_set_buddy_icon(session->user, img);
-	if (img != NULL)
-		purple_imgstore_unref(img);
+		img = purple_buddy_icons_find_account_icon(session->account);
+		/* TODO: Do we really want to call this if img is NULL? */
+		msn_user_set_buddy_icon(session->user, img);
+		if (img != NULL)
+			purple_imgstore_unref(img);
 
-	session->logged_in = TRUE;
+		session->logged_in = TRUE;
+		purple_connection_set_state(gc, PURPLE_CONNECTED);
+
+		/* Sync users */
+		msn_session_sync_users(session);
+	}
 
 	msn_change_status(session);
-
-	purple_connection_set_state(gc, PURPLE_CONNECTED);
-
-	/* Sync users */
-	msn_session_sync_users(session);
 }
 
--- a/libpurple/protocols/msn/soap.c	Sat Dec 13 10:52:10 2008 +0000
+++ b/libpurple/protocols/msn/soap.c	Mon Dec 15 23:10:39 2008 +0000
@@ -505,7 +505,7 @@
 		purple_debug_info("soap", "read: %s\n", g_strerror(perrno));
 
 #ifndef MSN_UNSAFE_DEBUG
-	if (conn->current_request->secure)
+	if (conn->current_request && conn->current_request->secure)
 		purple_debug_misc("soap", "Received secure request.\n");
 	else
 #endif
--- a/libpurple/protocols/msn/userlist.c	Sat Dec 13 10:52:10 2008 +0000
+++ b/libpurple/protocols/msn/userlist.c	Mon Dec 15 23:10:39 2008 +0000
@@ -668,7 +668,7 @@
 
 	msn_user_unset_op(user, list_op);
 
-	msn_notification_rem_buddy_from_list(userlist->session->notification, list_id, who);
+	msn_notification_rem_buddy_from_list(userlist->session->notification, list_id, user);
 }
 
 /*add buddy*/
@@ -775,6 +775,7 @@
                                /*MsnNetwork*/ int network)
 {
 	MsnUser *user = NULL;
+	MsnUser *user2;
 	GList *l;
 	char *group;
 
@@ -793,13 +794,18 @@
 		return;
 	}
 
-	/* Bit of a hack, but by adding to userlist now, the rest of the code
-	 * will know what network to use.
-	 */
+	group = msn_user_remove_pending_group(user);
+
+	user2 = msn_userlist_find_user(userlist, who);
+	if (user2 != NULL) {
+		/* User already in userlist, so just update it. */
+		msn_user_destroy(user);
+		user = user2;
+	} else {
+		msn_userlist_add_user(userlist, user);
+	}
+
 	msn_user_set_network(user, network);
-	msn_userlist_add_user(userlist, user);
-
-	group = msn_user_remove_pending_group(user);
 	msn_userlist_add_buddy(userlist, who, group);
 	g_free(group);
 }
@@ -829,7 +835,7 @@
 
 	msn_user_set_op(user, list_op);
 
-	msn_notification_add_buddy_to_list(userlist->session->notification, list_id, who);
+	msn_notification_add_buddy_to_list(userlist->session->notification, list_id, user);
 }
 
 gboolean
--- a/libpurple/protocols/myspace/markup.c	Sat Dec 13 10:52:10 2008 +0000
+++ b/libpurple/protocols/myspace/markup.c	Mon Dec 15 23:10:39 2008 +0000
@@ -81,7 +81,9 @@
  *                                 1    2  3    4     5      6       7 */
 static gdouble _font_scale[] = { .85, .95, 1, 1.2, 1.44, 1.728, 2.0736 };
 
-#define MAX_FONT_SIZE                   7       /* Purple maximum font size */
+/* Purple maximum font size.  Equivalent to sizeof(_font_scale) / sizeof(_font_scale[0]) */
+#define MAX_FONT_SIZE                   7
+
 #define POINTS_PER_INCH                 72      /* How many pt's in an inch */
 
 /* Text formatting bits for <f s=#> */
@@ -116,15 +118,11 @@
 msim_point_to_purple_size(MsimSession *session, guint point)
 {
 	guint size, this_point, base;
-	gdouble scale;
 
 	base = purple_account_get_int(session->account, "base_font_size", MSIM_BASE_FONT_POINT_SIZE);
 
-	for (size = 0;
-			size < sizeof(_font_scale) / sizeof(_font_scale[0]);
-			++size) {
-		scale = _font_scale[CLAMP(size, 1, MAX_FONT_SIZE) - 1];
-		this_point = (guint)msim_round(scale * base);
+	for (size = 0; size < MAX_FONT_SIZE; ++size) {
+		this_point = (guint)msim_round(base * _font_scale[size]);
 
 		if (this_point >= point) {
 			purple_debug_info("msim", "msim_point_to_purple_size: %d pt -> size=%d\n",
@@ -194,35 +192,38 @@
 	height_str = xmlnode_get_attrib(root, "h");
 	decor_str = xmlnode_get_attrib(root, "s");
 
-	if (height_str) {
-		height = atol(height_str);
+	/* Validate the font face, to avoid constructing invalid HTML later */
+	if (strchr(face, '\'') != NULL)
+		face = NULL;
+
+	height = height_str != NULL ? atol(height_str) : 12;
+	decor = decor_str != NULL ? atol(decor_str) : 0;
+
+	/*
+	 * The HTML we're constructing here is a bit redudant.  Ideally we
+	 * would use only the font-family and font-size CSS span, but Pidgin
+	 * doesn't support it (it's included for other UIs).  For Pidgin we
+	 * wrap the whole thing in an ugly font tag, and Pidgin will happily
+	 * ignore the <span>.
+	 */
+	gs_begin = g_string_new("");
+	if (height && !face) {
+		guint point_size = msim_height_to_point(session, height);
+		g_string_printf(gs_begin,
+				"<font size='%d'><span style='font-size: %dpt'>",
+				msim_point_to_purple_size(session, point_size),
+				point_size);
+	} else if (height && face) {
+		guint point_size = msim_height_to_point(session, height);
+		g_string_printf(gs_begin,
+				"<font face='%s' size='%d'><span style='font-family: %s; font-size: %dpt'>",
+				face, msim_point_to_purple_size(session, point_size),
+				face, point_size);
 	} else {
-		height = 12;
-	}
-
-	if (decor_str) {
-		decor = atol(decor_str);
-	} else {
-		decor = 0;
+		g_string_printf(gs_begin, "<font><span>");
 	}
 
-	gs_begin = g_string_new("");
-	/* TODO: get font size working */
-	if (height && !face) {
-		g_string_printf(gs_begin, "<font size='%d'>",
-				msim_point_to_purple_size(session, msim_height_to_point(session, height)));
-	} else if (height && face) {
-		g_string_printf(gs_begin, "<font face='%s' size='%d'>", face,
-				msim_point_to_purple_size(session, msim_height_to_point(session, height)));
-	} else {
-		g_string_printf(gs_begin, "<font>");
-	}
-
-	/* No support for font-size CSS? */
-	/* g_string_printf(gs_begin, "<span style='font-family: %s; font-size: %dpt'>", face,
-			msim_height_to_point(height)); */
-
-	gs_end = g_string_new("</font>");
+	gs_end = g_string_new("</span></font>");
 
 	if (decor & MSIM_TEXT_BOLD) {
 		g_string_append(gs_begin, "<b>");
@@ -239,7 +240,6 @@
 		g_string_append(gs_end, "</u>");
 	}
 
-
 	*begin = g_string_free(gs_begin, FALSE);
 	*end = g_string_free(gs_end, FALSE);
 }
--- a/libpurple/protocols/myspace/message.c	Sat Dec 13 10:52:10 2008 +0000
+++ b/libpurple/protocols/myspace/message.c	Mon Dec 15 23:10:39 2008 +0000
@@ -19,17 +19,15 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
  */
 
+#include "message.h"
 #include "myspace.h"
-#include "message.h"
 
-static void msim_msg_free_element(gpointer data, gpointer user_data);
 static void msim_msg_debug_string_element(gpointer data, gpointer user_data);
-static gchar *msim_msg_pack_using(MsimMessage *msg, GFunc gf, const gchar *sep, const gchar *begin, const gchar *end);
-static GList *msim_msg_get_node(MsimMessage *msg, const gchar *name);
-static MsimMessage *msim_msg_new_v(gchar *first_key, va_list argp);
 
-/* Escape codes and associated replacement text, used for protocol message
- * escaping and unescaping. */
+/**
+ * Escape codes and associated replacement text, used for protocol message
+ * escaping and unescaping.
+ */
 static struct MSIM_ESCAPE_REPLACEMENT {
 	gchar *code;
 	gchar text;
@@ -53,7 +51,7 @@
 	guint msg_len;
 
 	gs = g_string_new("");
-	msg_len = strlen(msg);	
+	msg_len = strlen(msg);
 
 	for (i = 0; i < msg_len; ++i) {
 		struct MSIM_ESCAPE_REPLACEMENT *replacement;
@@ -97,7 +95,7 @@
 	guint msg_len;
 
 	gs = g_string_new("");
-	msg_len = strlen(msg);	
+	msg_len = strlen(msg);
 
 	for (i = 0; i < msg_len; ++i) {
 		struct MSIM_ESCAPE_REPLACEMENT *replacement;
@@ -126,27 +124,8 @@
 	return g_string_free(gs, FALSE);
 }
 
-/** Create a new MsimMessage. 
- * 
- * @param first_key The first key in the sequence, or NULL for an empty message.
- * @param ... A sequence of gchar* key/type/value triplets, terminated with NULL. 
- *
- * See msim_msg_append() documentation for details on types.
- */
-MsimMessage *
-msim_msg_new(gchar *first_key, ...)
-{
-	va_list argp;
-
-	if (first_key) {
-	va_start(argp, first_key);
-		return msim_msg_new_v(first_key, argp);
-	} else {
-		return NULL;
-	}
-}
-
-/** Create a new message from va_list and its first argument.
+/**
+ * Create a new message from va_list and its first argument.
  *
  * @param first_key The first argument (a key), or NULL to take all arguments
  *    from argp.
@@ -189,11 +168,11 @@
 
 		/* Interpret variadic arguments. */
 		switch (type) {
-			case MSIM_TYPE_INTEGER: 
-			case MSIM_TYPE_BOOLEAN: 
+			case MSIM_TYPE_INTEGER:
+			case MSIM_TYPE_BOOLEAN:
 				msg = msim_msg_append(msg, key, type, GUINT_TO_POINTER(va_arg(argp, int)));
 				break;
-				
+
 			case MSIM_TYPE_STRING:
 				value = va_arg(argp, char *);
 
@@ -210,7 +189,7 @@
 				/* msim_msg_free() will free this GString the caller created. */
 				msg = msim_msg_append(msg, key, type, gs);
 				break;
-			
+
 			case MSIM_TYPE_LIST:
 				gl = va_arg(argp, GList *);
 
@@ -237,9 +216,310 @@
 	return msg;
 }
 
-/** Perform a deep copy on a GList * of gchar * strings. Free with msim_msg_list_free(). */
-GList *
-msim_msg_list_copy(GList *old)
+/**
+ * Create a new MsimMessage.
+ *
+ * @param first_key The first key in the sequence, or NULL for an empty message.
+ * @param ... A sequence of gchar* key/type/value triplets, terminated with NULL.
+ *
+ * See msim_msg_append() documentation for details on types.
+ */
+MsimMessage *
+msim_msg_new(gchar *first_key, ...)
+{
+	va_list argp;
+
+	if (first_key) {
+	va_start(argp, first_key);
+		return msim_msg_new_v(first_key, argp);
+	} else {
+		return NULL;
+	}
+}
+
+/**
+ * Pack a string using the given GFunc and seperator.
+ * Used by msim_msg_dump() and msim_msg_pack().
+ */
+static gchar *
+msim_msg_pack_using(MsimMessage *msg,
+		GFunc gf,
+		const gchar *sep,
+		const gchar *begin, const gchar *end)
+{
+	int num_items;
+	gchar **strings;
+	gchar **strings_tmp;
+	gchar *joined;
+	gchar *final;
+	int i;
+
+	g_return_val_if_fail(msg != NULL, NULL);
+
+	num_items = g_list_length(msg);
+
+	/* Add one for NULL terminator for g_strjoinv(). */
+	strings = (gchar **)g_new0(gchar *, num_items + 1);
+
+	strings_tmp = strings;
+	g_list_foreach(msg, gf, &strings_tmp);
+
+	joined = g_strjoinv(sep, strings);
+	final = g_strconcat(begin, joined, end, NULL);
+	g_free(joined);
+
+	/* Clean up. */
+	for (i = 0; i < num_items; ++i) {
+		g_free(strings[i]);
+	}
+
+	g_free(strings);
+
+	return final;
+}
+
+/**
+ * Return a human-readable string of the message.
+ *
+ * @return A new gchar *, must be g_free()'d.
+ */
+static gchar *
+msim_msg_dump_to_str(MsimMessage *msg)
+{
+	gchar *debug_str;
+
+	if (!msg) {
+		debug_str = g_strdup("<MsimMessage: empty>");
+	} else {
+		debug_str = msim_msg_pack_using(msg, msim_msg_debug_string_element,
+				"\n", "<MsimMessage: \n", "\n/MsimMessage>");
+	}
+
+	return debug_str;
+}
+
+/**
+ * Store a human-readable string describing the element.
+ *
+ * @param data Pointer to an MsimMessageElement.
+ * @param user_data
+ */
+static void
+msim_msg_debug_string_element(gpointer data, gpointer user_data)
+{
+	MsimMessageElement *elem;
+	gchar *string;
+	GString *gs;
+	gchar *binary;
+	gchar ***items;  /* wow, a pointer to a pointer to a pointer */
+
+	gchar *s;
+	GList *gl;
+	guint i;
+
+	elem = (MsimMessageElement *)data;
+	items = user_data;
+
+	switch (elem->type) {
+		case MSIM_TYPE_INTEGER:
+			string = g_strdup_printf("%s(integer): %d", elem->name,
+					GPOINTER_TO_UINT(elem->data));
+			break;
+
+		case MSIM_TYPE_RAW:
+			string = g_strdup_printf("%s(raw): %s", elem->name,
+					elem->data ? (gchar *)elem->data : "(NULL)");
+			break;
+
+		case MSIM_TYPE_STRING:
+			string = g_strdup_printf("%s(string): %s", elem->name,
+					elem->data ? (gchar *)elem->data : "(NULL)");
+			break;
+
+		case MSIM_TYPE_BINARY:
+			gs = (GString *)elem->data;
+			binary = purple_base64_encode((guchar*)gs->str, gs->len);
+			string = g_strdup_printf("%s(binary, %d bytes): %s", elem->name, (int)gs->len, binary);
+			g_free(binary);
+			break;
+
+		case MSIM_TYPE_BOOLEAN:
+			string = g_strdup_printf("%s(boolean): %s", elem->name,
+					elem->data ? "TRUE" : "FALSE");
+			break;
+
+		case MSIM_TYPE_DICTIONARY:
+			if (!elem->data) {
+				s = g_strdup("(NULL)");
+			} else {
+				s = msim_msg_dump_to_str((MsimMessage *)elem->data);
+			}
+
+			if (!s) {
+				s = g_strdup("(NULL, couldn't msim_msg_dump_to_str)");
+			}
+
+			string = g_strdup_printf("%s(dict): %s", elem->name, s);
+
+			g_free(s);
+			break;
+
+		case MSIM_TYPE_LIST:
+			gs = g_string_new("");
+			g_string_append_printf(gs, "%s(list): \n", elem->name);
+
+			i = 0;
+			for (gl = (GList *)elem->data; gl != NULL; gl = g_list_next(gl)) {
+				g_string_append_printf(gs, " %d. %s\n", i, (gchar *)(gl->data));
+				++i;
+			}
+
+			string = g_string_free(gs, FALSE);
+			break;
+
+		default:
+			string = g_strdup_printf("%s(unknown type %d",
+					elem->name ? elem->name : "(NULL)", elem->type);
+			break;
+	}
+
+	**items = string;
+	++(*items);
+}
+
+/**
+ * Search for and return the node in msg, matching name, or NULL.
+ *
+ * @param msg Message to search within.
+ * @param name Field name to search for.
+ *
+ * @return The GList * node for the MsimMessageElement with the given name, or NULL if not found or name is NULL.
+ *
+ * For internal use - users probably want to use msim_msg_get() to
+ * access the MsimMessageElement *, instead of the GList * container.
+ *
+ */
+static GList *
+msim_msg_get_node(MsimMessage *msg, const gchar *name)
+{
+	GList *node;
+
+	if (!name || !msg) {
+		return NULL;
+	}
+
+	/* Linear search for the given name. O(n) but n is small. */
+	for (node = msg; node != NULL; node = g_list_next(node)) {
+		MsimMessageElement *elem;
+
+		elem = (MsimMessageElement *)node->data;
+
+		g_return_val_if_fail(elem != NULL, NULL);
+		g_return_val_if_fail(elem->name != NULL, NULL);
+
+		if (strcmp(elem->name, name) == 0) {
+			return node;
+		}
+	}
+	return NULL;
+}
+
+/**
+ * Create a new MsimMessageElement * - must be g_free()'d.
+ *
+ * For internal use; users probably want msim_msg_append() or msim_msg_insert_before().
+ *
+ * @param dynamic_name Whether 'name' should be freed when the message is destroyed.
+ */
+static MsimMessageElement *
+msim_msg_element_new(const gchar *name, MsimMessageType type, gpointer data, gboolean dynamic_name)
+{
+	MsimMessageElement *elem;
+
+	elem = g_new0(MsimMessageElement, 1);
+
+	elem->name = name;
+	elem->dynamic_name = dynamic_name;
+	elem->type = type;
+	elem->data = data;
+
+	return elem;
+}
+
+/**
+ * Append a new element to a message.
+ *
+ * @param name Textual name of element (static string, neither copied nor freed).
+ * @param type An MSIM_TYPE_* code.
+ * @param data Pointer to data, see below.
+ *
+ * @return The new message - must be assigned to as with GList*. For example:
+ *
+ *     msg = msim_msg_append(msg, ...)
+ *
+ * The data parameter depends on the type given:
+ *
+ * * MSIM_TYPE_INTEGER: Use GUINT_TO_POINTER(x).
+ *
+ * * MSIM_TYPE_BINARY: Same as integer, non-zero is TRUE and zero is FALSE.
+ *
+ * * MSIM_TYPE_STRING: gchar *. The data WILL BE FREED - use g_strdup() if needed.
+ *
+ * * MSIM_TYPE_RAW: gchar *. The data WILL BE FREED - use g_strdup() if needed.
+ *
+ * * MSIM_TYPE_BINARY: g_string_new_len(data, length). The data AND GString will be freed.
+ *
+ * * MSIM_TYPE_DICTIONARY: An MsimMessage *. Freed when message is destroyed.
+ *
+ * * MSIM_TYPE_LIST: GList * of gchar *. Again, everything will be freed.
+ *
+ * */
+MsimMessage *
+msim_msg_append(MsimMessage *msg, const gchar *name,
+		MsimMessageType type, gpointer data)
+{
+	return g_list_append(msg, msim_msg_element_new(name, type, data, FALSE));
+}
+
+/**
+ * Append a new element, but with a dynamically-allocated name.
+ * Exactly the same as msim_msg_append(), except 'name' will be freed when
+ * the message is destroyed. Normally, it isn't, because a static string is given.
+ */
+static MsimMessage *
+msim_msg_append_dynamic_name(MsimMessage *msg, gchar *name,
+		MsimMessageType type, gpointer data)
+{
+	return g_list_append(msg, msim_msg_element_new(name, type, data, TRUE));
+}
+
+/**
+ * Insert a new element into a message, before the given element name.
+ *
+ * @param name_before Name of the element to insert the new element before. If
+ *                    could not be found or NULL, new element will be inserted at end.
+ *
+ * See msim_msg_append() for usage of other parameters, and an important note about return value.
+ */
+MsimMessage *
+msim_msg_insert_before(MsimMessage *msg, const gchar *name_before,
+		const gchar *name, MsimMessageType type, gpointer data)
+{
+	MsimMessageElement *new_elem;
+	GList *node_before;
+
+	new_elem = msim_msg_element_new(name, type, data, FALSE);
+
+	node_before = msim_msg_get_node(msg, name_before);
+
+	return g_list_insert_before(msg, node_before, new_elem);
+}
+
+/**
+ * Perform a deep copy on a GList * of gchar * strings. Free with msim_msg_list_free().
+ */
+static GList *
+msim_msg_list_copy(const GList *old)
 {
 	GList *new_list;
 
@@ -253,65 +533,13 @@
 	return new_list;
 }
 
-/** Free a GList * of MsimMessageElement *'s. */
-void
-msim_msg_list_free(GList *l)
-{
-
-	for (; l != NULL; l = g_list_next(l)) {
-		MsimMessageElement *elem;
-
-		elem = (MsimMessageElement *)l->data;
-
-		/* Note that name is almost never dynamically allocated elsewhere;
-		 * it is usually a static string, but not in lists. So cast it. */
-		g_free((gchar *)elem->name);
-		g_free(elem->data);
-		g_free(elem);
-	}
-	g_list_free(l);
-}
-
-/** Parse a |-separated string into a new GList. Free with msim_msg_list_free(). */
-GList *
-msim_msg_list_parse(const gchar *raw)
-{
-	gchar **array;
-	GList *list;
-	guint i;
-
-	array = g_strsplit(raw, "|", 0);
-	list = NULL;
-
-	/* TODO: escape/unescape /3 <-> | within list elements */
-	
-	for (i = 0; array[i] != NULL; ++i) {
-		MsimMessageElement *elem;
-
-		/* Freed in msim_msg_list_free() */
-		elem = g_new0(MsimMessageElement, 1);
-
-		/* Give the element a name for debugging purposes.
-		 * Not supposed to be looked up by this name; instead,
-		 * lookup the elements by indexing the array. */
-		elem->name = g_strdup_printf("(list item #%d)", i);
-		elem->type = MSIM_TYPE_RAW;
-		elem->data = g_strdup(array[i]);
-
-		list = g_list_append(list, elem);
-	}
-
-	g_strfreev(array);
-
-	return list;
-}
-
-/** Clone an individual element.
+/**
+ * Clone an individual element.
  *
  * @param data MsimMessageElement * to clone.
  * @param user_data Pointer to MsimMessage * to add cloned element to.
  */
-static void 
+static void
 msim_msg_clone_element(gpointer data, gpointer user_data)
 {
 	MsimMessageElement *elem;
@@ -357,10 +585,14 @@
 
 	/* Append cloned data. Note that the 'name' field is a static string, so it
 	 * never needs to be copied nor freed. */
-	*new = msim_msg_append(*new, elem->name, elem->type, new_data);
+	if (elem->dynamic_name)
+		*new = msim_msg_append_dynamic_name(*new, g_strdup(elem->name), elem->type, new_data);
+	else
+		*new = msim_msg_append(*new, elem->name, elem->type, new_data);
 }
 
-/** Clone an existing MsimMessage. 
+/**
+ * Clone an existing MsimMessage.
  *
  * @return Cloned message; caller should free with msim_msg_free().
  */
@@ -380,7 +612,8 @@
 	return new;
 }
 
-/** Free the data of a message element.
+/**
+ * Free the data of a message element.
  *
  * @param elem The MsimMessageElement *
  *
@@ -411,7 +644,7 @@
 		case MSIM_TYPE_DICTIONARY:
 			msim_msg_free((MsimMessage *)elem->data);
 			break;
-			
+
 		case MSIM_TYPE_LIST:
 			g_list_free((GList *)elem->data);
 			break;
@@ -423,7 +656,29 @@
 	}
 }
 
-/** Free an individual message element.
+/**
+ * Free a GList * of MsimMessageElement *'s.
+ */
+void
+msim_msg_list_free(GList *l)
+{
+
+	for (; l != NULL; l = g_list_next(l)) {
+		MsimMessageElement *elem;
+
+		elem = (MsimMessageElement *)l->data;
+
+		/* Note that name is almost never dynamically allocated elsewhere;
+		 * it is usually a static string, but not in lists. So cast it. */
+		g_free((gchar *)elem->name);
+		g_free(elem->data);
+		g_free(elem);
+	}
+	g_list_free(l);
+}
+
+/**
+ * Free an individual message element.
  *
  * @param data MsimMessageElement * to free.
  * @param user_data Not used; required to match g_list_foreach() callback prototype.
@@ -431,7 +686,7 @@
  * Frees both the element data and the element itself.
  * Also frees the name if dynamic_name is TRUE.
  */
-static void 
+static void
 msim_msg_free_element(gpointer data, gpointer user_data)
 {
 	MsimMessageElement *elem;
@@ -449,8 +704,10 @@
 	g_free(elem);
 }
 
-/** Free a complete message. */
-void 
+/**
+ * Free a complete message.
+ */
+void
 msim_msg_free(MsimMessage *msg)
 {
 	if (!msg) {
@@ -466,422 +723,8 @@
 	g_list_free(msg);
 }
 
-/** Send an existing MsimMessage. */
-gboolean 
-msim_msg_send(MsimSession *session, MsimMessage *msg)
-{
-	gchar *raw;
-	gboolean success;
-	
-	raw = msim_msg_pack(msg);
-	g_return_val_if_fail(raw != NULL, FALSE);
-	success = msim_send_raw(session, raw);
-	g_free(raw);
-
-	msim_msg_dump("msim_msg_send()ing %s\n", msg);
-	
-	return success;
-}
-
 /**
- *
- * Send a message to the server, whose contents is specified using 
- * variable arguments.
- *
- * @param session
- * @param ... A sequence of gchar* key/type/value triplets, terminated with NULL. 
- *
- * This function exists for coding convenience: it allows a message to be created
- * and sent in one line of code. Internally it calls msim_msg_send(). 
- *
- * IMPORTANT: See msim_msg_append() documentation for details on element types.
- *
- */
-gboolean 
-msim_send(MsimSession *session, ...)
-{
-	gboolean success;
-	MsimMessage *msg;
-	va_list argp;
-	
-	va_start(argp, session);
-	msg = msim_msg_new_v(NULL, argp);
-
-	/* Actually send the message. */
-	success = msim_msg_send(session, msg);
-
-	/* Cleanup. */
-	msim_msg_free(msg);
-
-	return success;
-}
-
-/** Create a new MsimMessageElement * - must be g_free()'d. 
- *
- * For internal use; users probably want msim_msg_append() or msim_msg_insert_before(). 
- *
- * @param dynamic_name Whether 'name' should be freed when the message is destroyed.
- */
-static MsimMessageElement *
-msim_msg_element_new(const gchar *name, MsimMessageType type, gpointer data, gboolean dynamic_name)
-{
-	MsimMessageElement *elem;
-
-	elem = g_new0(MsimMessageElement, 1);
-
-	elem->name = name;
-	elem->dynamic_name = dynamic_name;
-	elem->type = type;
-	elem->data = data;
-
-	return elem;
-}
-
-
-/** Append a new element to a message. 
- *
- * @param name Textual name of element (static string, neither copied nor freed).
- * @param type An MSIM_TYPE_* code.
- * @param data Pointer to data, see below.
- *
- * @return The new message - must be assigned to as with GList*. For example:
- *
- *     msg = msim_msg_append(msg, ...)
- *
- * The data parameter depends on the type given:
- *
- * * MSIM_TYPE_INTEGER: Use GUINT_TO_POINTER(x).
- *
- * * MSIM_TYPE_BINARY: Same as integer, non-zero is TRUE and zero is FALSE.
- *
- * * MSIM_TYPE_STRING: gchar *. The data WILL BE FREED - use g_strdup() if needed.
- *
- * * MSIM_TYPE_RAW: gchar *. The data WILL BE FREED - use g_strdup() if needed.
- *
- * * MSIM_TYPE_BINARY: g_string_new_len(data, length). The data AND GString will be freed.
- *
- * * MSIM_TYPE_DICTIONARY: An MsimMessage *. Freed when message is destroyed.
- *
- * * MSIM_TYPE_LIST: GList * of gchar *. Again, everything will be freed.
- *
- * */
-MsimMessage *
-msim_msg_append(MsimMessage *msg, const gchar *name, 
-		MsimMessageType type, gpointer data)
-{
-	return g_list_append(msg, msim_msg_element_new(name, type, data, FALSE));
-}
-
-/** Append a new element, but with a dynamically-allocated name.
- * Exactly the same as msim_msg_append(), except 'name' will be freed when
- * the message is destroyed. Normally, it isn't, because a static string is given.
- */
-static MsimMessage *
-msim_msg_append_dynamic_name(MsimMessage *msg, gchar *name,
-		MsimMessageType type, gpointer data)
-{
-	return g_list_append(msg, msim_msg_element_new(name, type, data, TRUE));
-}
-
-/** Insert a new element into a message, before the given element name.
- *
- * @param name_before Name of the element to insert the new element before. If 
- *                    could not be found or NULL, new element will be inserted at end.
- *
- * See msim_msg_append() for usage of other parameters, and an important note about return value.
- */
-MsimMessage *
-msim_msg_insert_before(MsimMessage *msg, const gchar *name_before, 
-		const gchar *name, MsimMessageType type, gpointer data)
-{
-	MsimMessageElement *new_elem;
-	GList *node_before;
-
-	new_elem = msim_msg_element_new(name, type, data, FALSE);
-
-	node_before = msim_msg_get_node(msg, name_before);
-
-	return g_list_insert_before(msg, node_before, new_elem);
-}
-
-/** Pack a string using the given GFunc and seperator.
- * Used by msim_msg_dump() and msim_msg_pack().
- */
-gchar *
-msim_msg_pack_using(MsimMessage *msg, 
-		GFunc gf, 
-		const gchar *sep, 
-		const gchar *begin, const gchar *end)
-{
-	int num_items;
-	gchar **strings;
-	gchar **strings_tmp;
-	gchar *joined;
-	gchar *final;
-	int i;
-
-	g_return_val_if_fail(msg != NULL, NULL);
-
-	num_items = g_list_length(msg);
-
-	/* Add one for NULL terminator for g_strjoinv(). */
-	strings = (gchar **)g_new0(gchar *, num_items + 1);
-
-	strings_tmp = strings;
-	g_list_foreach(msg, gf, &strings_tmp);
-
-	joined = g_strjoinv(sep, strings);
-	final = g_strconcat(begin, joined, end, NULL);
-	g_free(joined);
-
-	/* Clean up. */
-	for (i = 0; i < num_items; ++i) {
-		g_free(strings[i]);
-	}
-
-	g_free(strings);
-
-	return final;
-}
-/** Store a human-readable string describing the element.
- *
- * @param data Pointer to an MsimMessageElement.
- * @param user_data 
- */
-static void 
-msim_msg_debug_string_element(gpointer data, gpointer user_data)
-{
-	MsimMessageElement *elem;
-	gchar *string;
-	GString *gs;
-	gchar *binary;
-	gchar ***items;  /* wow, a pointer to a pointer to a pointer */
-	
-	gchar *s;
-	GList *gl;
-	guint i;
-
-	elem = (MsimMessageElement *)data;
-	items = user_data;
-
-	switch (elem->type) {
-		case MSIM_TYPE_INTEGER:
-			string = g_strdup_printf("%s(integer): %d", elem->name, 
-					GPOINTER_TO_UINT(elem->data));
-			break;
-
-		case MSIM_TYPE_RAW:
-			string = g_strdup_printf("%s(raw): %s", elem->name, 
-					elem->data ? (gchar *)elem->data : "(NULL)");
-			break;
-
-		case MSIM_TYPE_STRING:
-			string = g_strdup_printf("%s(string): %s", elem->name, 
-					elem->data ? (gchar *)elem->data : "(NULL)");
-			break;
-
-		case MSIM_TYPE_BINARY:
-			gs = (GString *)elem->data;
-			binary = purple_base64_encode((guchar*)gs->str, gs->len);
-			string = g_strdup_printf("%s(binary, %d bytes): %s", elem->name, (int)gs->len, binary);
-			g_free(binary);
-			break;
-
-		case MSIM_TYPE_BOOLEAN:
-			string = g_strdup_printf("%s(boolean): %s", elem->name,
-					elem->data ? "TRUE" : "FALSE");
-			break;
-
-		case MSIM_TYPE_DICTIONARY:
-			if (!elem->data) {
-				s = g_strdup("(NULL)");
-			} else {
-				s = msim_msg_dump_to_str((MsimMessage *)elem->data);
-			}
-
-			if (!s) {
-				s = g_strdup("(NULL, couldn't msim_msg_dump_to_str)");
-			}
-
-			string = g_strdup_printf("%s(dict): %s", elem->name, s);
-
-			g_free(s);
-			break;
-			
-		case MSIM_TYPE_LIST:
-			gs = g_string_new("");
-			g_string_append_printf(gs, "%s(list): \n", elem->name);
-
-			i = 0;
-			for (gl = (GList *)elem->data; gl != NULL; gl = g_list_next(gl)) {
-				g_string_append_printf(gs, " %d. %s\n", i, (gchar *)(gl->data));
-				++i;
-			}
-			
-			string = g_string_free(gs, FALSE);
-			break;
-
-		default:
-			string = g_strdup_printf("%s(unknown type %d", 
-					elem->name ? elem->name : "(NULL)", elem->type);
-			break;
-	}
-
-	**items = string;
-	++(*items);
-}
-
-/** Print a human-readable string of the message to Purple's debug log.
- *
- * @param fmt_string A static string, in which '%s' will be replaced.
- */
-void 
-msim_msg_dump(const gchar *fmt_string, MsimMessage *msg)
-{
-	gchar *debug_str;
-
-	g_return_if_fail(fmt_string != NULL);
-
-	debug_str = msim_msg_dump_to_str(msg);
-	
-	g_return_if_fail(debug_str != NULL);
-
-	purple_debug_info("msim", fmt_string, debug_str);
-
-	g_free(debug_str);
-}
-
-/** Return a human-readable string of the message.
- *
- * @return A new gchar *, must be g_free()'d.
- */
-gchar *
-msim_msg_dump_to_str(MsimMessage *msg)
-{
-	gchar *debug_str;
-
-	if (!msg) {
-		debug_str = g_strdup("<MsimMessage: empty>");
-	} else {
-		debug_str = msim_msg_pack_using(msg, msim_msg_debug_string_element, 
-				"\n", "<MsimMessage: \n", "\n/MsimMessage>");
-	}
-
-	return debug_str;
-}
-
-/** Return a message element data as a new string for a raw protocol message, converting from other types (integer, etc.) if necessary.
- *
- * @return const gchar * The data as a string, or NULL. Caller must g_free().
- *
- * Returns a string suitable for inclusion in a raw protocol message, not necessarily
- * optimal for human consumption. For example, strings are escaped. Use 
- * msim_msg_get_string() if you want a string, which in some cases is same as this.
- */
-gchar *
-msim_msg_pack_element_data(MsimMessageElement *elem)
-{
-	GString *gs;
-	GList *gl;
-
-	g_return_val_if_fail(elem != NULL, NULL);
-
-	switch (elem->type) {
-		case MSIM_TYPE_INTEGER:
-			return g_strdup_printf("%d", GPOINTER_TO_UINT(elem->data));
-
-		case MSIM_TYPE_RAW:
-			/* Not un-escaped - this is a raw element, already escaped if necessary. */
-			return (gchar *)g_strdup((gchar *)elem->data);
-
-		case MSIM_TYPE_STRING:
-			/* Strings get escaped. msim_escape() creates a new string. */
-			g_return_val_if_fail(elem->data != NULL, NULL);
-			return elem->data ? msim_escape((gchar *)elem->data) :
-				g_strdup("(NULL)");
-
-		case MSIM_TYPE_BINARY:
-			gs = (GString *)elem->data;
-			/* Do not escape! */
-			return purple_base64_encode((guchar *)gs->str, gs->len);
-
-		case MSIM_TYPE_BOOLEAN:
-			/* Not used by messages in the wire protocol * -- see msim_msg_pack_element.
-			 * Only used by dictionaries, see msim_msg_pack_element_dict. */
-			return elem->data ? g_strdup("On") : g_strdup("Off");
-
-		case MSIM_TYPE_DICTIONARY:
-			return msim_msg_pack_dict((MsimMessage *)elem->data);
-			
-		case MSIM_TYPE_LIST:
-			/* Pack using a|b|c|d|... */
-			gs = g_string_new("");
-
-			for (gl = (GList *)elem->data; gl != NULL; gl = g_list_next(gl)) {
-				g_string_append_printf(gs, "%s", (gchar*)(gl->data));
-				
-				/* All but last element is separated by a bar. */
-				if (g_list_next(gl)) 
-					g_string_append(gs, "|");
-			}
-			
-			return g_string_free(gs, FALSE);
-
-		default:
-			purple_debug_info("msim", "field %s, unknown type %d\n", 
-					elem->name ? elem->name : "(NULL)", 
-					elem->type);
-			return NULL;
-	}
-}
-
-/** Pack an element into its protcol representation inside a dictionary.
- *
- * See msim_msg_pack_element().
- */
-static void
-msim_msg_pack_element_dict(gpointer data, gpointer user_data)
-{
-	MsimMessageElement *elem;
-	gchar *string, *data_string, ***items;
-
-	elem = (MsimMessageElement *)data;
-	items = (gchar ***)user_data;
-
-	/* Exclude elements beginning with '_' from packed protocol messages. */
-	if (elem->name[0] == '_') {
-		return;
-	}
-
-	data_string = msim_msg_pack_element_data(elem);
-
-	g_return_if_fail(data_string != NULL);
-
-	switch (elem->type) {
-		/* These types are represented by key name/value pairs (converted above). */
-		case MSIM_TYPE_INTEGER:
-		case MSIM_TYPE_RAW:
-		case MSIM_TYPE_STRING:
-		case MSIM_TYPE_BINARY:
-		case MSIM_TYPE_DICTIONARY:
-		case MSIM_TYPE_LIST:
-		case MSIM_TYPE_BOOLEAN: /* Boolean is On or Off */
-			string = g_strconcat(elem->name, "=", data_string, NULL);
-			break;
-
-		default:
-			g_free(data_string);
-			g_return_if_fail(FALSE);
-			break;
-	}
-
-	g_free(data_string);
-
-	**items = string;
-	++(*items);
-}
-
-/** Pack an element into its protocol representation. 
+ * Pack an element into its protocol representation.
  *
  * @param data Pointer to an MsimMessageElement.
  * @param user_data Pointer to a gchar ** array of string items.
@@ -891,7 +734,7 @@
  * is responsible for creating array to correct dimensions, and
  * freeing each string element of the array added by this function.
  */
-static void 
+static void
 msim_msg_pack_element(gpointer data, gpointer user_data)
 {
 	MsimMessageElement *elem;
@@ -942,8 +785,55 @@
 	++(*items);
 }
 
+/**
+ * Pack an element into its protcol representation inside a dictionary.
+ *
+ * See msim_msg_pack_element().
+ */
+static void
+msim_msg_pack_element_dict(gpointer data, gpointer user_data)
+{
+	MsimMessageElement *elem;
+	gchar *string, *data_string, ***items;
 
-/** Return a packed string of a message suitable for sending over the wire.
+	elem = (MsimMessageElement *)data;
+	items = (gchar ***)user_data;
+
+	/* Exclude elements beginning with '_' from packed protocol messages. */
+	if (elem->name[0] == '_') {
+		return;
+	}
+
+	data_string = msim_msg_pack_element_data(elem);
+
+	g_return_if_fail(data_string != NULL);
+
+	switch (elem->type) {
+		/* These types are represented by key name/value pairs (converted above). */
+		case MSIM_TYPE_INTEGER:
+		case MSIM_TYPE_RAW:
+		case MSIM_TYPE_STRING:
+		case MSIM_TYPE_BINARY:
+		case MSIM_TYPE_DICTIONARY:
+		case MSIM_TYPE_LIST:
+		case MSIM_TYPE_BOOLEAN: /* Boolean is On or Off */
+			string = g_strconcat(elem->name, "=", data_string, NULL);
+			break;
+
+		default:
+			g_free(data_string);
+			g_return_if_fail(FALSE);
+			break;
+	}
+
+	g_free(data_string);
+
+	**items = string;
+	++(*items);
+}
+
+/**
+ * Return a packed string of a message suitable for sending over the wire.
  *
  * @return A string. Caller must g_free().
  */
@@ -955,11 +845,12 @@
 	return msim_msg_pack_using(msg, msim_msg_pack_element, "\\", "\\", "\\final\\");
 }
 
-/** Return a packed string of a dictionary, suitable for embedding in MSIM_TYPE_DICTIONARY.
+/**
+ * Return a packed string of a dictionary, suitable for embedding in MSIM_TYPE_DICTIONARY.
  *
  * @return A string; caller must g_free().
  */
-gchar *
+static gchar *
 msim_msg_pack_dict(MsimMessage *msg)
 {
 	g_return_val_if_fail(msg != NULL, NULL);
@@ -967,7 +858,146 @@
 	return msim_msg_pack_using(msg, msim_msg_pack_element_dict, "\034", "", "");
 }
 
-/** 
+/**
+ * Send an existing MsimMessage.
+ */
+gboolean
+msim_msg_send(MsimSession *session, MsimMessage *msg)
+{
+	gchar *raw;
+	gboolean success;
+
+	raw = msim_msg_pack(msg);
+	g_return_val_if_fail(raw != NULL, FALSE);
+	success = msim_send_raw(session, raw);
+	g_free(raw);
+
+	msim_msg_dump("msim_msg_send()ing %s\n", msg);
+
+	return success;
+}
+
+/**
+ * Return a message element data as a new string for a raw protocol message,
+ * converting from other types (integer, etc.) if necessary.
+ *
+ * @return const gchar * The data as a string, or NULL. Caller must g_free().
+ *
+ * Returns a string suitable for inclusion in a raw protocol message, not necessarily
+ * optimal for human consumption. For example, strings are escaped. Use
+ * msim_msg_get_string() if you want a string, which in some cases is same as this.
+ */
+gchar *
+msim_msg_pack_element_data(MsimMessageElement *elem)
+{
+	GString *gs;
+	GList *gl;
+
+	g_return_val_if_fail(elem != NULL, NULL);
+
+	switch (elem->type) {
+		case MSIM_TYPE_INTEGER:
+			return g_strdup_printf("%d", GPOINTER_TO_UINT(elem->data));
+
+		case MSIM_TYPE_RAW:
+			/* Not un-escaped - this is a raw element, already escaped if necessary. */
+			return (gchar *)g_strdup((gchar *)elem->data);
+
+		case MSIM_TYPE_STRING:
+			/* Strings get escaped. msim_escape() creates a new string. */
+			g_return_val_if_fail(elem->data != NULL, NULL);
+			return elem->data ? msim_escape((gchar *)elem->data) :
+				g_strdup("(NULL)");
+
+		case MSIM_TYPE_BINARY:
+			gs = (GString *)elem->data;
+			/* Do not escape! */
+			return purple_base64_encode((guchar *)gs->str, gs->len);
+
+		case MSIM_TYPE_BOOLEAN:
+			/* Not used by messages in the wire protocol * -- see msim_msg_pack_element.
+			 * Only used by dictionaries, see msim_msg_pack_element_dict. */
+			return elem->data ? g_strdup("On") : g_strdup("Off");
+
+		case MSIM_TYPE_DICTIONARY:
+			return msim_msg_pack_dict((MsimMessage *)elem->data);
+
+		case MSIM_TYPE_LIST:
+			/* Pack using a|b|c|d|... */
+			gs = g_string_new("");
+
+			for (gl = (GList *)elem->data; gl != NULL; gl = g_list_next(gl)) {
+				g_string_append_printf(gs, "%s", (gchar*)(gl->data));
+
+				/* All but last element is separated by a bar. */
+				if (g_list_next(gl))
+					g_string_append(gs, "|");
+			}
+
+			return g_string_free(gs, FALSE);
+
+		default:
+			purple_debug_info("msim", "field %s, unknown type %d\n",
+					elem->name ? elem->name : "(NULL)",
+					elem->type);
+			return NULL;
+	}
+}
+
+/**
+ * Send a message to the server, whose contents is specified using
+ * variable arguments.
+ *
+ * @param session
+ * @param ... A sequence of gchar* key/type/value triplets, terminated with NULL.
+ *
+ * This function exists for coding convenience: it allows a message to be created
+ * and sent in one line of code. Internally it calls msim_msg_send().
+ *
+ * IMPORTANT: See msim_msg_append() documentation for details on element types.
+ *
+ */
+gboolean
+msim_send(MsimSession *session, ...)
+{
+	gboolean success;
+	MsimMessage *msg;
+	va_list argp;
+
+	va_start(argp, session);
+	msg = msim_msg_new_v(NULL, argp);
+
+	/* Actually send the message. */
+	success = msim_msg_send(session, msg);
+
+	/* Cleanup. */
+	msim_msg_free(msg);
+
+	return success;
+}
+
+/**
+ * Print a human-readable string of the message to Purple's debug log.
+ *
+ * @param fmt_string A static string, in which '%s' will be replaced.
+ */
+void
+msim_msg_dump(const gchar *fmt_string, MsimMessage *msg)
+{
+	gchar *debug_str;
+
+	g_return_if_fail(fmt_string != NULL);
+
+	debug_str = msim_msg_dump_to_str(msg);
+
+	g_return_if_fail(debug_str != NULL);
+
+	purple_debug_info("msim", fmt_string, debug_str);
+
+	g_free(debug_str);
+}
+
+/**
  * Parse a raw protocol message string into a MsimMessage *.
  *
  * @param raw The raw message string to parse, will be g_free()'d.
@@ -1002,7 +1032,7 @@
 
 	msg = msim_msg_new(FALSE);
 
-	for (tokens = g_strsplit(raw + 1, "\\", 0), i = 0; 
+	for (tokens = g_strsplit(raw + 1, "\\", 0), i = 0;
 			(token = tokens[i]);
 			i++) {
 #ifdef MSIM_DEBUG_PARSE
@@ -1012,7 +1042,7 @@
 			/* Odd-numbered ordinal is a value. */
 
 			value = token;
-		
+
 			/* Incoming protocol messages get tagged as MSIM_TYPE_RAW, which
 			 * represents an untyped piece of data. msim_msg_get_* will
 			 * convert to appropriate types for caller, and handle unescaping if needed. */
@@ -1033,43 +1063,8 @@
 	return msg;
 }
 
-/** Search for and return the node in msg, matching name, or NULL. 
- *
- * @param msg Message to search within.
- * @param name Field name to search for.
- *
- * @return The GList * node for the MsimMessageElement with the given name, or NULL if not found or name is NULL.
- *
- * For internal use - users probably want to use msim_msg_get() to
- * access the MsimMessageElement *, instead of the GList * container.
- *
- */
-static GList *
-msim_msg_get_node(MsimMessage *msg, const gchar *name)
-{
-	GList *node;
-
-	if (!name || !msg) {
-		return NULL;
-	}
-
-	/* Linear search for the given name. O(n) but n is small. */
-	for (node = msg; node != NULL; node = g_list_next(node)) {
-		MsimMessageElement *elem;
-
-		elem = (MsimMessageElement *)node->data;
-
-		g_return_val_if_fail(elem != NULL, NULL);
-		g_return_val_if_fail(elem->name != NULL, NULL);
-
-		if (strcmp(elem->name, name) == 0) {
-			return node;
-		}
-	}
-	return NULL;
-}
-
-/** Return the first MsimMessageElement * with given name in the MsimMessage *. 
+/**
+ * Return the first MsimMessageElement * with given name in the MsimMessage *.
  *
  * @param name Name to search for.
  *
@@ -1092,30 +1087,6 @@
 	}
 }
 
-/** Return the data of an element of a given name, as a string.
- *
- * @param name Name of element.
- *
- * @return gchar * The data as a string, or NULL if not found. 
- *     Caller must g_free().
- *
- * Note that msim_msg_pack_element_data() is similar, but returns a string
- * for inclusion into a raw protocol string (escaped and everything).
- * This function unescapes the string for you, if needed.
- */
-gchar *
-msim_msg_get_string(MsimMessage *msg, const gchar *name)
-{
-	MsimMessageElement *elem;
-
-	elem = msim_msg_get(msg, name);
-	if (!elem) {
-		return NULL;
-	}
-
-	return msim_msg_get_string_from_element(elem);
-}
-
 gchar *
 msim_msg_get_string_from_element(MsimMessageElement *elem)
 {
@@ -1140,9 +1111,20 @@
 	}
 }
 
-/** Return an element as a new list. Caller frees with msim_msg_list_free(). */
-GList *
-msim_msg_get_list(MsimMessage *msg, const gchar *name)
+/**
+ * Return the data of an element of a given name, as a string.
+ *
+ * @param name Name of element.
+ *
+ * @return gchar * The data as a string, or NULL if not found.
+ *     Caller must g_free().
+ *
+ * Note that msim_msg_pack_element_data() is similar, but returns a string
+ * for inclusion into a raw protocol string (escaped and everything).
+ * This function unescapes the string for you, if needed.
+ */
+gchar *
+msim_msg_get_string(MsimMessage *msg, const gchar *name)
 {
 	MsimMessageElement *elem;
 
@@ -1151,10 +1133,46 @@
 		return NULL;
 	}
 
-	return msim_msg_get_list_from_element(elem);
+	return msim_msg_get_string_from_element(elem);
 }
 
-GList *
+/**
+ * Parse a |-separated string into a new GList. Free with msim_msg_list_free().
+ */
+static GList *
+msim_msg_list_parse(const gchar *raw)
+{
+	gchar **array;
+	GList *list;
+	guint i;
+
+	array = g_strsplit(raw, "|", 0);
+	list = NULL;
+
+	/* TODO: escape/unescape /3 <-> | within list elements */
+
+	for (i = 0; array[i] != NULL; ++i) {
+		MsimMessageElement *elem;
+
+		/* Freed in msim_msg_list_free() */
+		elem = g_new0(MsimMessageElement, 1);
+
+		/* Give the element a name for debugging purposes.
+		 * Not supposed to be looked up by this name; instead,
+		 * lookup the elements by indexing the array. */
+		elem->name = g_strdup_printf("(list item #%d)", i);
+		elem->type = MSIM_TYPE_RAW;
+		elem->data = g_strdup(array[i]);
+
+		list = g_list_append(list, elem);
+	}
+
+	g_strfreev(array);
+
+	return list;
+}
+
+static GList *
 msim_msg_get_list_from_element(MsimMessageElement *elem)
 {
 	g_return_val_if_fail(elem != NULL, NULL);
@@ -1173,6 +1191,22 @@
 }
 
 /**
+ * Return an element as a new list. Caller frees with msim_msg_list_free().
+ */
+GList *
+msim_msg_get_list(MsimMessage *msg, const gchar *name)
+{
+	MsimMessageElement *elem;
+
+	elem = msim_msg_get(msg, name);
+	if (!elem) {
+		return NULL;
+	}
+
+	return msim_msg_get_list_from_element(elem);
+}
+
+/**
  * Parse a \x1c-separated "dictionary" of key=value pairs into a hash table.
  *
  * @param raw The text of the dictionary to parse. Often the
@@ -1192,8 +1226,8 @@
 	g_return_val_if_fail(raw != NULL, NULL);
 
 	dict = msim_msg_new(NULL);
- 
-	for (items = g_strsplit(raw, "\x1c", 0), i = 0; 
+
+	for (items = g_strsplit(raw, "\x1c", 0), i = 0;
 		(item = items[i]);
 		i++) {
 		gchar *key, *value;
@@ -1202,7 +1236,7 @@
 
 		key = elements[0];
 		if (!key) {
-			purple_debug_info("msim", "msim_msg_parse_dictionary(%s): null key\n", 
+			purple_debug_info("msim", "msim_msg_dictionary_parse(%s): null key\n",
 					raw);
 			g_strfreev(elements);
 			break;
@@ -1210,14 +1244,14 @@
 
 		value = elements[1];
 		if (!value) {
-			purple_debug_info("msim", "msim_msg_parse_dictionary(%s): null value\n", 
+			purple_debug_info("msim", "msim_msg_dictionary_prase(%s): null value\n",
 					raw);
 			g_strfreev(elements);
 			break;
 		}
 
 #ifdef MSIM_DEBUG_PARSE
-		purple_debug_info("msim_msg_parse_dictionary","-- %s: %s\n", key ? key : "(NULL)", 
+		purple_debug_info("msim_msg_dictionary_parse","-- %s: %s\n", key ? key : "(NULL)",
 				value ? value : "(NULL)");
 #endif
 		/* Append with _dynamic_name since g_strdup(key) is dynamic, and
@@ -1232,7 +1266,27 @@
 	return dict;
 }
 
-/** Return an element as a new dictionary. Caller frees with msim_msg_free(). */
+static MsimMessage *
+msim_msg_get_dictionary_from_element(MsimMessageElement *elem)
+{
+	g_return_val_if_fail(elem != NULL, NULL);
+	switch (elem->type) {
+		case MSIM_TYPE_DICTIONARY:
+			return msim_msg_clone((MsimMessage *)elem->data);
+
+		case MSIM_TYPE_RAW:
+			return msim_msg_dictionary_parse((gchar *)elem->data);
+
+		default:
+			purple_debug_info("msim_msg_get_dictionary", "type %d unknown, name %s\n",
+					elem->type, elem->name ? elem->name : "(NULL)");
+			return NULL;
+	}
+}
+
+/**
+ * Return an element as a new dictionary. Caller frees with msim_msg_free().
+ */
 MsimMessage *
 msim_msg_get_dictionary(MsimMessage *msg, const gchar *name)
 {
@@ -1246,49 +1300,6 @@
 	return msim_msg_get_dictionary_from_element(elem);
 }
 
-MsimMessage *
-msim_msg_get_dictionary_from_element(MsimMessageElement *elem)
-{
-	g_return_val_if_fail(elem != NULL, NULL);
-	switch (elem->type) {
-		case MSIM_TYPE_DICTIONARY:
-			return msim_msg_clone((MsimMessage *)elem->data);
-		
-		case MSIM_TYPE_RAW:
-			return msim_msg_dictionary_parse((gchar *)elem->data);
-
-		default:
-			purple_debug_info("msim_msg_get_dictionary", "type %d unknown, name %s\n",
-					elem->type, elem->name ? elem->name : "(NULL)");
-			return NULL;
-	}
-}
-
-/** Return the data of an element of a given name, as an unsigned integer.
- *
- * @param name Name of element.
- *
- * @return guint Numeric representation of data, or 0 if could not be converted / not found.
- *
- * Useful to obtain an element's data if you know it should be an integer,
- * even if it is not stored as an MSIM_TYPE_INTEGER. MSIM_TYPE_STRING will
- * be converted handled correctly, for example.
- */
-guint 
-msim_msg_get_integer(MsimMessage *msg, const gchar *name)
-{
-	MsimMessageElement *elem;
-
-	elem = msim_msg_get(msg, name);
-
-	if (!elem) {
-		return 0;
-	}
-
-	return msim_msg_get_integer_from_element(elem);
-}
-
-
 guint
 msim_msg_get_integer_from_element(MsimMessageElement *elem)
 {
@@ -1307,29 +1318,32 @@
 	}
 }
 
-/** Return the data of an element of a given name, as a binary GString.
+/**
+ * Return the data of an element of a given name, as an unsigned integer.
  *
- * @param binary_data A pointer to a new pointer, which will be filled in with the binary data. CALLER MUST g_free().
+ * @param name Name of element.
  *
- * @param binary_length A pointer to an integer, which will be set to the binary data length.
+ * @return guint Numeric representation of data, or 0 if could not be converted / not found.
  *
- * @return TRUE if successful, FALSE if not.
+ * Useful to obtain an element's data if you know it should be an integer,
+ * even if it is not stored as an MSIM_TYPE_INTEGER. MSIM_TYPE_STRING will
+ * be converted handled correctly, for example.
  */
-gboolean 
-msim_msg_get_binary(MsimMessage *msg, const gchar *name, 
-		gchar **binary_data, gsize *binary_length)
+guint
+msim_msg_get_integer(MsimMessage *msg, const gchar *name)
 {
 	MsimMessageElement *elem;
-				
+
 	elem = msim_msg_get(msg, name);
+
 	if (!elem) {
-		return FALSE;
+		return 0;
 	}
 
-	return msim_msg_get_binary_from_element(elem, binary_data, binary_length);
+	return msim_msg_get_integer_from_element(elem);
 }
 
-gboolean
+static gboolean
 msim_msg_get_binary_from_element(MsimMessageElement *elem, gchar **binary_data, gsize *binary_length)
 {
 	GString *gs;
@@ -1344,7 +1358,7 @@
 			 * by msimprpl code for things like instant messages - stuff that should be
 			 * escaped if needed). DWIM.
 			 */
-	
+
 			/* Previously, incoming messages were stored as MSIM_TYPE_STRING.
 			 * This was fine for integers and strings, since they can easily be
 			 * converted in msim_get_*, as desirable. However, it does not work
@@ -1372,7 +1386,7 @@
 
 
 			/* Rejected because if it isn't already a GString, have to g_new0 it and
-			 * then caller has to ALSO free the GString! 
+			 * then caller has to ALSO free the GString!
 			 *
 			 * return (GString *)elem->data; */
 
@@ -1382,3 +1396,26 @@
 			return FALSE;
 	}
 }
+
+/**
+ * Return the data of an element of a given name, as a binary GString.
+ *
+ * @param binary_data A pointer to a new pointer, which will be filled in with the binary data. CALLER MUST g_free().
+ *
+ * @param binary_length A pointer to an integer, which will be set to the binary data length.
+ *
+ * @return TRUE if successful, FALSE if not.
+ */
+gboolean
+msim_msg_get_binary(MsimMessage *msg, const gchar *name,
+		gchar **binary_data, gsize *binary_length)
+{
+	MsimMessageElement *elem;
+
+	elem = msim_msg_get(msg, name);
+	if (!elem) {
+		return FALSE;
+	}
+
+	return msim_msg_get_binary_from_element(elem, binary_data, binary_length);
+}
--- a/libpurple/protocols/myspace/message.h	Sat Dec 13 10:52:10 2008 +0000
+++ b/libpurple/protocols/myspace/message.h	Mon Dec 15 23:10:39 2008 +0000
@@ -24,17 +24,20 @@
 
 #include <glib.h>
 
+#define MsimMessage GList               /* #define instead of typedef to avoid casting */
+typedef gchar MsimMessageType;
+typedef struct _MsimMessageElement MsimMessageElement;
+
+#include "session.h"
+
 /* Types */
-#define MsimMessage GList               /* #define instead of typedef to avoid casting */
-typedef struct _MsimMessageElement
+struct _MsimMessageElement
 {
 	const gchar *name;              /**< Textual name of element. */
 	gboolean dynamic_name;          /**< TRUE if 'name' is a dynamic string to be freed, not static. */
 	guint type;                     /**< MSIM_TYPE_* code. */
 	gpointer data;                  /**< Pointer to data, or GUINT_TO_POINTER for int/bool. */
-} MsimMessageElement;
-
-typedef gchar MsimMessageType;
+};
 
 #define msim_msg_get_next_element_node(msg)    ((MsimMessage *)(msg->next))
 
@@ -58,20 +61,13 @@
 void msim_msg_free(MsimMessage *msg);
 MsimMessage *msim_msg_append(MsimMessage *msg, const gchar *name, MsimMessageType type, gpointer data);
 MsimMessage *msim_msg_insert_before(MsimMessage *msg, const gchar *name_before, const gchar *name, MsimMessageType type, gpointer data);
-gchar *msim_msg_dump_to_str(MsimMessage *msg);
 gchar *msim_msg_pack_element_data(MsimMessageElement *elem);
 void msim_msg_dump(const char *fmt_string, MsimMessage *msg);
 gchar *msim_msg_pack(MsimMessage *msg);
-gchar *msim_msg_pack_dict(MsimMessage *msg);
 
-GList *msim_msg_list_copy(GList *old);
 void msim_msg_list_free(GList *l);
-GList *msim_msg_list_parse(const gchar *raw);
 
-/* Defined in myspace.h */
-struct _MsimSession;
-
-/* Based on http://permalink.gmane.org/gmane.comp.parsers.sparse/695 
+/* Based on http://permalink.gmane.org/gmane.comp.parsers.sparse/695
  * Define macros for useful gcc attributes. */
 #ifdef __GNUC__
 #define GCC_VERSION (__GNUC__ * 1000 + __GNUC_MINOR__)
@@ -87,7 +83,7 @@
 	#define FORMAT_ATTR(pos)
 	#define NORETURN_ATTR
 	#define SENTINEL_ATTR
-#endif 
+#endif
 
 /* Cause gcc to emit "a missing sentinel in function call" if forgot
  * to write NULL as last, terminating parameter. */
@@ -109,10 +105,6 @@
 
 /* Retrieve data by element (MsimMessageElement *), returned from msim_msg_get() */
 gchar *msim_msg_get_string_from_element(MsimMessageElement *elem);
-GList *msim_msg_get_list_from_element(MsimMessageElement *elem);
-MsimMessage *msim_msg_get_dictionary_from_element(MsimMessageElement *elem);
 guint msim_msg_get_integer_from_element(MsimMessageElement *elem);
-gboolean msim_msg_get_binary_from_element(MsimMessageElement *elem, 
-		gchar **binary_data, gsize *binary_length);
 
 #endif /* _MYSPACE_MESSAGE_H */
--- a/libpurple/protocols/myspace/session.h	Sat Dec 13 10:52:10 2008 +0000
+++ b/libpurple/protocols/myspace/session.h	Mon Dec 15 23:10:39 2008 +0000
@@ -20,6 +20,8 @@
 #ifndef _MYSPACE_SESSION_H
 #define _MYSPACE_SESSION_H
 
+#include "account.h"
+
 /* Random number in every MsimSession, to ensure it is valid. */
 #define MSIM_SESSION_STRUCT_MAGIC       0xe4a6752b
 
--- a/libpurple/protocols/myspace/user.c	Sat Dec 13 10:52:10 2008 +0000
+++ b/libpurple/protocols/myspace/user.c	Mon Dec 15 23:10:39 2008 +0000
@@ -174,8 +174,12 @@
 		/* TODO: link to username, if available */
 		char *profile;
 		purple_notify_user_info_add_section_break(user_info);
-		profile = g_strdup_printf("<a href=\"http://myspace.com/%d\">%s</a>",
-				user->id, _("View web profile"));
+		if (user->buddy != NULL)
+			profile = g_strdup_printf("<a href=\"http://myspace.com/%s\">%s</a>",
+					purple_buddy_get_name(user->buddy), _("View web profile"));
+		else
+			profile = g_strdup_printf("<a href=\"http://myspace.com/%d\">%s</a>",
+					user->id, _("View web profile"));
 		purple_notify_user_info_add_pair(user_info, NULL, profile);
 		g_free(profile);
 	}
--- a/libpurple/protocols/myspace/user.h	Sat Dec 13 10:52:10 2008 +0000
+++ b/libpurple/protocols/myspace/user.h	Mon Dec 15 23:10:39 2008 +0000
@@ -25,6 +25,7 @@
 typedef struct _MsimUser
 {
 	PurpleBuddy *buddy;
+	/* Note: id is also &buddy->node (set_blist_node_int), when buddy is non-NULL */
 	int id;
 	guint client_cv;
 	gchar *client_info;
@@ -34,7 +35,6 @@
 	guint total_friends;
 	gchar *headline;
 	gchar *display_name;
-	/* Note: uid is in &buddy->node (set_blist_node_int), since it never changes */
 	gchar *username;
 	gchar *band_name, *song_name;
 	gchar *image_url;
--- a/libpurple/protocols/oscar/family_auth.c	Sat Dec 13 10:52:10 2008 +0000
+++ b/libpurple/protocols/oscar/family_auth.c	Mon Dec 15 23:10:39 2008 +0000
@@ -597,18 +597,18 @@
 {
 	if (od->authinfo != NULL)
 	{
-		free(od->authinfo->sn);
-		free(od->authinfo->bosip);
-		free(od->authinfo->errorurl);
-		free(od->authinfo->email);
-		free(od->authinfo->chpassurl);
-		free(od->authinfo->latestrelease.name);
-		free(od->authinfo->latestrelease.url);
-		free(od->authinfo->latestrelease.info);
-		free(od->authinfo->latestbeta.name);
-		free(od->authinfo->latestbeta.url);
-		free(od->authinfo->latestbeta.info);
-		free(od->authinfo);
+		g_free(od->authinfo->sn);
+		g_free(od->authinfo->bosip);
+		g_free(od->authinfo->errorurl);
+		g_free(od->authinfo->email);
+		g_free(od->authinfo->chpassurl);
+		g_free(od->authinfo->latestrelease.name);
+		g_free(od->authinfo->latestrelease.url);
+		g_free(od->authinfo->latestrelease.info);
+		g_free(od->authinfo->latestbeta.name);
+		g_free(od->authinfo->latestbeta.url);
+		g_free(od->authinfo->latestbeta.info);
+		g_free(od->authinfo);
 	}
 }
 
--- a/libpurple/protocols/qq/group_im.c	Sat Dec 13 10:52:10 2008 +0000
+++ b/libpurple/protocols/qq/group_im.c	Mon Dec 15 23:10:39 2008 +0000
@@ -378,7 +378,7 @@
 	g_return_val_if_fail(id != 0 && what != NULL, -1);
 
 	qd = (qq_data *) gc->proto_data;
-	purple_debug_info("QQ", "Send chat IM to %u, len %d:\n%s\n", id, strlen(what), what);
+	purple_debug_info("QQ", "Send chat IM to %u, len %" G_GSIZE_FORMAT ":\n%s\n", id, strlen(what), what);
 
 	/* qq_show_packet("chat IM UTF8", (guint8 *)what, strlen(what)); */
 
--- a/libpurple/protocols/qq/im.c	Sat Dec 13 10:52:10 2008 +0000
+++ b/libpurple/protocols/qq/im.c	Mon Dec 15 23:10:39 2008 +0000
@@ -1258,7 +1258,7 @@
 	g_return_val_if_fail(who != NULL && what != NULL, -1);
 
 	qd = (qq_data *) gc->proto_data;
-	purple_debug_info("QQ", "Send IM to %s, len %d:\n%s\n", who, strlen(what), what);
+	purple_debug_info("QQ", "Send IM to %s, len %" G_GSIZE_FORMAT ":\n%s\n", who, strlen(what), what);
 
 	uid_to = purple_name_to_uid(who);
 	if (uid_to == qd->uid) {
--- a/libpurple/protocols/sametime/sametime.c	Sat Dec 13 10:52:10 2008 +0000
+++ b/libpurple/protocols/sametime/sametime.c	Mon Dec 15 23:10:39 2008 +0000
@@ -514,6 +514,11 @@
     idle_len = time(NULL) - idle;
     ugly_idle_len = ((time(NULL) * 1000) - idle) / 1000;
 
+	if(idle > ugly_idle_len)
+		ugly_idle_len = 0;
+	else
+		ugly_idle_len = (ugly_idle_len - idle) / 1000;
+
     /* 
        what's the deal here? Well, good clients are smart enough to
        publish their idle time by using an attribute to indicate that
--- a/libpurple/protocols/simple/simple.c	Sat Dec 13 10:52:10 2008 +0000
+++ b/libpurple/protocols/simple/simple.c	Mon Dec 15 23:10:39 2008 +0000
@@ -1939,6 +1939,13 @@
 		sip->txbuf = purple_circ_buffer_new(0);
 
 	userserver = g_strsplit(username, "@", 2);
+	if (userserver[1] == NULL || userserver[1][0] == '\0') {
+		purple_connection_error_reason(gc,
+			PURPLE_CONNECTION_ERROR_INVALID_SETTINGS,
+			_("SIP connect server not specified"));
+		return;
+	}
+
 	purple_connection_set_display_name(gc, userserver[0]);
 	sip->username = g_strdup(userserver[0]);
 	sip->servername = g_strdup(userserver[1]);
--- a/libpurple/protocols/yahoo/yahoo_picture.c	Sat Dec 13 10:52:10 2008 +0000
+++ b/libpurple/protocols/yahoo/yahoo_picture.c	Mon Dec 15 23:10:39 2008 +0000
@@ -408,8 +408,10 @@
 	if (ret < 0 && errno == EAGAIN)
 		return;
 	else if (ret <= 0) {
-		purple_debug_info("yahoo", "Buddy icon upload response (%d) bytes (> ~400 indicates failure):\n%.*s\n",
-			d->str->len, d->str->len, d->str->str);
+		/* There are other problems if d->str->len overflows, so shut up the
+		 * warning on 64-bit. */
+		purple_debug_info("yahoo", "Buddy icon upload response (%" G_GSIZE_FORMAT ") bytes (> ~400 indicates failure):\n%.*s\n",
+			d->str->len, (guint)d->str->len, d->str->str);
 
 		yahoo_buddy_icon_upload_data_free(d);
 		return;
@@ -517,7 +519,8 @@
 	g_string_prepend(d->str, header);
 	g_free(header);
 
-	purple_debug_info("yahoo", "Buddy icon upload data:\n%.*s\n", d->str->len, d->str->str);
+	/* There are other problems if we're uploading over 4GB of data */
+	purple_debug_info("yahoo", "Buddy icon upload data:\n%.*s\n", (guint)d->str->len, d->str->str);
 
 	d->fd = source;
 	d->watcher = purple_input_add(d->fd, PURPLE_INPUT_WRITE, yahoo_buddy_icon_upload_pending, d);
--- a/pidgin/gtkimhtml.c	Sat Dec 13 10:52:10 2008 +0000
+++ b/pidgin/gtkimhtml.c	Mon Dec 15 23:10:39 2008 +0000
@@ -3126,9 +3126,15 @@
 								font->size = 6;
 							else if (g_ascii_strcasecmp(size, "xx-large") == 0)
 								font->size = 7;
-							else
-								font->size = 3;
-						    gtk_imhtml_font_set_size(imhtml, font->size);
+
+							/*
+							 * TODO: Handle other values, like percentages, or
+							 * lengths specified as em, ex, px, in, cm, mm, pt
+							 * or pc.  Or even better, use an actual HTML
+							 * renderer like webkit.
+							 */
+							if (font->size > 0)
+							    gtk_imhtml_font_set_size(imhtml, font->size);
 						}
 						else if (oldfont)
 						{
--- a/pidgin/gtkutils.c	Sat Dec 13 10:52:10 2008 +0000
+++ b/pidgin/gtkutils.c	Mon Dec 15 23:10:39 2008 +0000
@@ -1502,16 +1502,16 @@
 
 		break;
 	}
-	free(data->filename);
-	free(data->who);
-	free(data);
+	g_free(data->filename);
+	g_free(data->who);
+	g_free(data);
 }
 
 static void dnd_image_cancel_callback(_DndData *data, int choice)
 {
-	free(data->filename);
-	free(data->who);
-	free(data);
+	g_free(data->filename);
+	g_free(data->who);
+	g_free(data);
 }
 
 static void dnd_set_icon_ok_cb(_DndData *data)
@@ -1521,9 +1521,9 @@
 
 static void dnd_set_icon_cancel_cb(_DndData *data)
 {
-	free(data->filename);
-	free(data->who);
-	free(data);
+	g_free(data->filename);
+	g_free(data->who);
+	g_free(data);
 }
 
 void
--- a/po/ca.po	Sat Dec 13 10:52:10 2008 +0000
+++ b/po/ca.po	Mon Dec 15 23:10:39 2008 +0000
@@ -3,7 +3,7 @@
 # Copyright (C) unknown, Robert Millan <zeratul2@wanadoo.es>
 # Copyright (C) December 2003 (from 2003-12-12 until 2003-12-18),
 #               January (2004-01-07,12), Xan <dxpublica@telefonica.net>
-# Copyright (c) 2004, 2005, 2006, 2007
+# Copyright (c) 2004, 2005, 2006, 2007, 2008
 #               Josep Puigdemont i Casamajó <josep.puigdemont@gmail.com>
 #
 # This file is distributed under the same license as the Pidgin package.
@@ -27,14 +27,14 @@
 #
 # NOTE: adjectives in catalan go [almost] always to the end, for instance:
 # NOTA: els adjectius en català acostumen a anar al final, per exemple:
-#   "New file" --> "Fitxer nou"
+#  "New file" --> "Fitxer nou"
 #
 msgid ""
 msgstr ""
 "Project-Id-Version: Pidgin\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-12-01 15:52-0800\n"
-"PO-Revision-Date: 2008-05-11 13:00+0200\n"
+"POT-Creation-Date: 2008-12-14 17:46+0100\n"
+"PO-Revision-Date: 2008-12-15 00:07+0100\n"
 "Last-Translator: Josep Puigdemont i Casamajó <josep.puigdemont@gmail.com>\n"
 "Language-Team: Catalan <tradgnome@softcatala.net>\n"
 "MIME-Version: 1.0\n"
@@ -96,7 +96,6 @@
 msgid "Remember password"
 msgstr "Recorda la contrasenya"
 
-#, fuzzy
 msgid "There are no protocol plugins installed."
 msgstr "No hi ha connectors de protocol instal·lats."
 
@@ -122,9 +121,8 @@
 msgstr "Àlies:"
 
 #. Register checkbox
-#, fuzzy
 msgid "Create this account on the server"
-msgstr "Crea aquest compte nou al servidor"
+msgstr "Crea aquest compte al servidor"
 
 #. Cancel button
 #. Cancel
@@ -434,9 +432,8 @@
 msgid "View Log..."
 msgstr "Mostra el registre..."
 
-#, fuzzy
 msgid "View All Logs"
-msgstr "Visualitza el registre"
+msgstr "Visualitza tots els registres"
 
 msgid "Show"
 msgstr "Mostra"
@@ -641,21 +638,18 @@
 msgid "Send To"
 msgstr "Envia a"
 
-# FIXME
-#, fuzzy
 msgid "Invite message"
-msgstr "Missatge de sortida"
+msgstr "Missatge d'invitació"
 
 msgid "Invite"
 msgstr "Convida"
 
-#, fuzzy
 msgid ""
 "Please enter the name of the user you wish to invite,\n"
 "along with an optional invite message."
 msgstr ""
-"Introduïu el nom de l'usuari que vulgueu convidar, així com un missatge "
-"d'invitació opcional."
+"Introduïu el nom de l'usuari que vulgueu convidar,\n"
+"així com un missatge d'invitació opcional."
 
 msgid "Conversation"
 msgstr "Conversa"
@@ -670,9 +664,8 @@
 msgid "Add Buddy Pounce..."
 msgstr "Afegeix un avís per a l'amic..."
 
-#, fuzzy
 msgid "Invite..."
-msgstr "Convida"
+msgstr "Convida..."
 
 msgid "Enable Logging"
 msgstr "Habilita el registre"
@@ -683,11 +676,11 @@
 msgid "<AUTO-REPLY> "
 msgstr "<RESPOSTA-AUTOMÀTICA> "
 
-#, fuzzy, c-format
+#, c-format
 msgid "List of %d user:\n"
 msgid_plural "List of %d users:\n"
-msgstr[0] "Llista d'usuaris:\n"
-msgstr[1] "Llista d'usuaris:\n"
+msgstr[0] "Llista d'%d usuari:\n"
+msgstr[1] "Llista de %d usuaris:\n"
 
 msgid "Supported debug options are:  version"
 msgstr "Les opcions de depuració disponibles són:  version"
@@ -707,10 +700,14 @@
 "%s is not a valid message class. See '/help msgcolor' for valid message "
 "classes."
 msgstr ""
+"%s no és una classe de missatge vàlida. Vegeu '/help msgcolor' per a llistar "
+"les classes de missatge vàlides."
 
 #, c-format
 msgid "%s is not a valid color. See '/help msgcolor' for valid colors."
 msgstr ""
+"%s no és un color vàlid. Vegei '/help msgcolor' per a llistar els colors "
+"vàlids."
 
 msgid ""
 "say &lt;message&gt;:  Send a message normally as if you weren't using a "
@@ -763,6 +760,13 @@
 "background&gt;: black, red, green, blue, white, gray, darkgray, magenta, "
 "cyan, default<br><br>EXAMPLE:<br>    msgcolor send cyan default"
 msgstr ""
+"msgcolor &lt;classe&gt; &lt;primer pla&gt; &lt;fons&gt;: estableix el color "
+"de les diferents classes de missatge en les finestres de conversa.<br>    "
+"&lt;classe&gt;: receive (rep), send (envia), highlight (ressalta), action "
+"(acció), timestamp (marca de temps)<br>    &lt;primer pla/fons&gt;: black "
+"(negre), red (vermell), green (verd), blue (blau), white (blanc), gray "
+"(gris), darkgray (gris fosc), magenta, cyan (cian), default (per defecte)"
+"<br><br>EXEMPLE:<br>    msgcolor send cyan default"
 
 msgid "Unable to open file."
 msgstr "No s'ha pogut obrir el fitxer."
@@ -783,10 +787,10 @@
 msgid "Pause"
 msgstr "Fes una pausa"
 
-#, fuzzy, c-format
+#, c-format
 msgid "File Transfers - %d%% of %d file"
 msgid_plural "File Transfers - %d%% of %d files"
-msgstr[0] "Transferència de fitxers - %d%% de %d fitxers"
+msgstr[0] "Transferència de fitxers - %d%% de %d fitxer"
 msgstr[1] "Transferència de fitxers - %d%% de %d fitxers"
 
 #. Create the window.
@@ -904,9 +908,8 @@
 msgid "Conversations with %s"
 msgstr "Converses amb %s"
 
-#, fuzzy
 msgid "All Conversations"
-msgstr "Converses"
+msgstr "Totes les converses"
 
 msgid "System Log"
 msgstr "Registre del sistema"
@@ -1542,10 +1545,10 @@
 msgstr "Sense agrupament"
 
 msgid "Nested Subgroup"
-msgstr ""
+msgstr "Subgrup imbricat"
 
 msgid "Nested Grouping (experimental)"
-msgstr ""
+msgstr "Subgrup imbricat (experimental)"
 
 msgid "Provides alternate buddylist grouping options."
 msgstr "Proporciona opcions alternatives per a l'agrupament d'amics."
@@ -1868,7 +1871,7 @@
 
 #, c-format
 msgid "Resolver process exited without answering our request"
-msgstr ""
+msgstr "El procés resoledor ha acabat sense respondre la nostra sol·licitud"
 
 #, c-format
 msgid "Thread creation failure: %s"
@@ -2177,10 +2180,11 @@
 msgid "ABI version mismatch %d.%d.x (need %d.%d.x)"
 msgstr "Hi ha un error de coincidència de l'ABI %d.%d.x (cal %d.%d.x)"
 
-#, fuzzy
 msgid ""
 "Plugin does not implement all required functions (list_icon, login and close)"
-msgstr "El connector no implementa totes les funcions requerides"
+msgstr ""
+"El connector no implementa totes les funcions requerides (list_icon, login i "
+"close)"
 
 #, c-format
 msgid ""
@@ -2266,9 +2270,8 @@
 "s'hagi transferit completament (només quan no hi ha conversa amb qui\n"
 "l'envia)"
 
-#, fuzzy
 msgid "Create a new directory for each user"
-msgstr "Seleccioneu quin directori d'usuari cercar"
+msgstr "Crea un directori nou per a cada usuari"
 
 msgid "Notes"
 msgstr "Notes"
@@ -2433,7 +2436,7 @@
 msgstr "Temps d'espera d'inactivitat del usuaris (en minuts)"
 
 msgid "Apply hiding rules to buddies"
-msgstr ""
+msgstr "Aplica les normes d'ocultació als amics"
 
 #. *< type
 #. *< ui_requirement
@@ -2846,14 +2849,13 @@
 "No s'ha pogut detectar la instal·lació d'ActiveTCL. Si voleu emprar "
 "connectors TCL, instal·leu l'ActiveTCL de http://www.activestate.com\n"
 
-#, fuzzy
 msgid ""
 "The Apple Bonjour For Windows toolkit wasn't found, see the FAQ at: http://d."
 "pidgin.im/BonjourWindows for more information."
 msgstr ""
 "No s'ha pogut trobar el joc d'eines per a Windows de l'Apple Bonjour, "
-"consulteu les preguntes més freqüents a http://developer.pidgin.im/wiki/Using"
-"%20Pidgin#CanIusePidginforBonjourLink-LocalMessaging per a més informació."
+"consulteu les preguntes més freqüents a http://developer.pidgin.im/"
+"BonjourWindows per a més informació."
 
 msgid "Unable to listen for incoming IM connections\n"
 msgstr "No es poden escoltar connexions entrants de MI\n"
@@ -3257,7 +3259,7 @@
 msgstr "Codificacions"
 
 msgid "Auto-detect incoming UTF-8"
-msgstr ""
+msgstr "Detecta UTF-8 entrant automàticament"
 
 msgid "Real name"
 msgstr "Nom real"
@@ -3272,9 +3274,9 @@
 msgid "Bad mode"
 msgstr "Mode dolent"
 
-#, fuzzy, c-format
+#, c-format
 msgid "Ban on %s by %s, set %s ago"
-msgstr "Bandejament a %s de %s, establert fa %ld segons"
+msgstr "Bandejament a %s de %s, establert fa %s"
 
 #, c-format
 msgid "Ban on %s"
@@ -3445,7 +3447,7 @@
 "missatge el treu."
 
 msgid "ctcp <nick> <msg>: sends ctcp msg to nick."
-msgstr ""
+msgstr "ctcp <sobrenom> <msg>: envia un missatge ctcp a sobrenom"
 
 msgid "chanserv: Send a command to chanserv"
 msgstr "chanserv: envia una ordre al chanserv"
@@ -3750,9 +3752,9 @@
 msgid "Service Discovery Items"
 msgstr "Elements del servei de descoberta"
 
-#, fuzzy
+# http://xmpp.org/extensions/xep-0033.html
 msgid "Extended Stanza Addressing"
-msgstr "Adreça (cont.)"
+msgstr "Bloc d'adressament estès"
 
 msgid "Multi-User Chat"
 msgstr "Xat multi-usuari"
@@ -3812,17 +3814,18 @@
 msgstr "Negociacions de la sessió xifrada"
 
 # Pot ser també música, cançó... (josep)
-#, fuzzy
+# Vegeu: http://xmpp.org/extensions/xep-0118.html
 msgid "User Tune"
 msgstr "Melodia de l'usuari"
 
-#, fuzzy
+# Nota: "Roster" en XMPP és la llista de contactes (josep)
 msgid "Roster Item Exchange"
-msgstr "MI amb intercanvi de clau"
-
-#, fuzzy
+msgstr "Intercanvi d'element de la llista de contactes"
+
+# Vegeu: http://xmpp.org/extensions/xep-0152.html (josep)
+# Nota: codi mort
 msgid "Reachability Address"
-msgstr "Adreça de correu"
+msgstr "Adreça de localització"
 
 msgid "User Profile"
 msgstr "Perfil de l'usuari"
@@ -3875,8 +3878,11 @@
 msgid "Ping"
 msgstr "Ping"
 
+# Vegeu: http://xmpp.org/extensions/xep-0200.html
+# Nota: Això es refereix a les capabilitats de l'altre interlocutor
+# No apareix a l'aplicació final, és codi mort dins un #if 0 ... #endif (josep)
 msgid "Stanza Encryption"
-msgstr "Xifratge de paràgrafs"
+msgstr "Blocs xifrats"
 
 msgid "Entity Time"
 msgstr "Hora de l'entitat"
@@ -3909,9 +3915,9 @@
 msgid "Resource"
 msgstr "Recurs"
 
-# FIXME
+# Segons la viquipèdia
 msgid "Middle Name"
-msgstr "Primer cognom"
+msgstr "Nom del mig"
 
 msgid "Address"
 msgstr "Adreça"
@@ -4421,8 +4427,9 @@
 msgid "Unsupported Encoding"
 msgstr "La codificació no està implementada"
 
+# FIXME
 msgid "Unsupported Stanza Type"
-msgstr "El tipus de permanència no està implementada"
+msgstr "Aquest tipus de bloc no està implementat"
 
 msgid "Unsupported Version"
 msgstr "Aquesta versió no està implementada"
@@ -4580,7 +4587,6 @@
 
 #. this should probably be part of global smiley theme settings later on,
 #. shared with MSN
-#, fuzzy
 msgid "Show Custom Smileys"
 msgstr "Mostra emoticones personalitzades"
 
@@ -4607,9 +4613,9 @@
 msgid "XMPP Message Error"
 msgstr "Missatge d'error de l'XMPP"
 
-#, fuzzy, c-format
+#, c-format
 msgid "(Code %s)"
-msgstr " (Codi %s)"
+msgstr "(Codi %s)"
 
 msgid "XML Parse error"
 msgstr "Error en l'anàlisi de l'XML"
@@ -4709,6 +4715,19 @@
 msgid "Unable to retrieve MSN Address Book"
 msgstr "No s'ha pogut obtenir la llibreta d'adreces MSN"
 
+#. only notify the user about problems adding to the friends list
+#. * maybe we should do something else for other lists, but it probably
+#. * won't cause too many problems if we just ignore it
+#, c-format
+msgid "Unable to add \"%s\"."
+msgstr "No s'ha pogut afegir «%s»."
+
+msgid "Buddy Add error"
+msgstr "Error en afegir un amic"
+
+msgid "The username specified does not exist."
+msgstr "El nom d'usuari especificat no existeix."
+
 #, c-format
 msgid "Buddy list synchronization issue in %s (%s)"
 msgstr "Problema de sincronització de la llista d'amics a %s (%s)"
@@ -4936,9 +4955,9 @@
 msgid "Passport account not yet verified"
 msgstr "El compte de passaport encara no està verificat"
 
-#, fuzzy, c-format
+#, c-format
 msgid "Passport account suspended"
-msgstr "El compte de passaport encara no està verificat"
+msgstr "El compte de passaport s'ha suspès"
 
 #, c-format
 msgid "Bad ticket"
@@ -4952,13 +4971,11 @@
 msgid "MSN Error: %s\n"
 msgstr "Error d'MSN: %s\n"
 
-#, fuzzy
 msgid "Other Contacts"
-msgstr "Contacte preferit"
-
-#, fuzzy
+msgstr "Altres contactes"
+
 msgid "Non-IM Contacts"
-msgstr "Suprimeix el contacte"
+msgstr "Contactes que no són de MI"
 
 msgid "Nudge"
 msgstr "Donar un cop de colze"
@@ -4971,9 +4988,8 @@
 msgid "Nudging %s..."
 msgstr "S'està donant un cop de colze a %s..."
 
-#, fuzzy
 msgid "Email Address..."
-msgstr "Adreça de correu electrònic"
+msgstr "Correu electrònic..."
 
 msgid "Your new MSN friendly name is too long."
 msgstr "El vostre nom amistós nou d'MSN és massa llarg."
@@ -5009,22 +5025,20 @@
 msgid "Disallow"
 msgstr "Denega"
 
-#, fuzzy, c-format
+#, c-format
 msgid "Blocked Text for %s"
-msgstr "Comentari sobre l'amic %s"
-
-#, fuzzy
+msgstr "Text blocat de %s"
+
 msgid "No text is blocked for this account."
-msgstr "Utilitza aquesta _icona d'amic per a aquest compte:"
+msgstr "No hi ha text blocat per aquest compte."
 
 #, c-format
 msgid ""
 "MSN servers are currently blocking the following regular expressions:<br/>%s"
-msgstr ""
-
-#, fuzzy
+msgstr "Actualment, sevidors MSN bloquen aquestes expressions regulars:<br/>%s"
+
 msgid "This account does not have email enabled."
-msgstr "Pot ser que aquest compte Hotmail no sigui actiu."
+msgstr "Aquest compte no té el correu habilitat."
 
 msgid "Send a mobile message."
 msgstr "Envia un missatge de mòbil."
@@ -5032,6 +5046,12 @@
 msgid "Page"
 msgstr "Pàgina"
 
+msgid "Playing a game"
+msgstr "Jugant a un joc"
+
+msgid "Working"
+msgstr "Treballant"
+
 msgid "Has you"
 msgstr "Us té"
 
@@ -5068,6 +5088,12 @@
 msgid "Album"
 msgstr "Àlbum"
 
+msgid "Game Title"
+msgstr "Títol del joc"
+
+msgid "Office Title"
+msgstr "Títol oficial"
+
 msgid "Set Friendly Name..."
 msgstr "Estableix el nom amistós..."
 
@@ -5087,7 +5113,7 @@
 msgstr "Permet/denega pàgines de mòbil..."
 
 msgid "View Blocked Text..."
-msgstr ""
+msgstr "Mostra el text blocat..."
 
 msgid "Open Hotmail Inbox"
 msgstr "Obre la safata d'entrada de Hotmail"
@@ -5259,8 +5285,8 @@
 "No s'ha pogut trobar informació del perfil de l'usuari. El més segur és que "
 "l'usuari no existeixi."
 
-msgid "Profile URL"
-msgstr "URL del perfil"
+msgid "View web profile"
+msgstr "Mostra el perfil web"
 
 #. *< type
 #. *< ui_requirement
@@ -5289,9 +5315,8 @@
 msgid "Windows Live ID authentication:Unable to connect"
 msgstr "Autenticació amb el Windows Live ID: no s'ha pogut connectar"
 
-#, fuzzy
 msgid "Windows Live ID authentication:Invalid response"
-msgstr "Autenticació amb el Windows Live ID: no s'ha pogut connectar"
+msgstr "Autenticació amb el Windows Live ID: la resposta no és vàlida"
 
 #, c-format
 msgid "%s is not a valid group."
@@ -5316,9 +5341,8 @@
 msgid "Unable to add user"
 msgstr "No s'ha pogut afegir l'usuari"
 
-#, fuzzy
 msgid "The following users are missing from your addressbook"
-msgstr "El que segueix són els resultats de la vostra cerca"
+msgstr "Manquen aquests usuaris a la vostra llista d'amics"
 
 #, c-format
 msgid "Unable to add user on %s (%s)"
@@ -5343,9 +5367,8 @@
 msgid "Service Temporarily Unavailable."
 msgstr "El servei no està disponible temporalment."
 
-#, fuzzy
 msgid "Mobile message was not sent because it was too long."
-msgstr "El missatge no s'ha enviat perquè no esteu connectat."
+msgstr "No s'ha enviat el missatge al mòbil perquè era massa llarg."
 
 msgid "Unable to rename group"
 msgstr "No s'ha pogut canviar el nom del grup"
@@ -5385,21 +5408,21 @@
 "Message was not sent because the system is unavailable. This normally "
 "happens when the user is blocked or does not exist."
 msgstr ""
-
-#, fuzzy
+"No s'ha pogut enviar el missatge perquè el sistema no està disponible. Això "
+"normalment passa quan l'usuari està blocat o no existeix."
+
 msgid "Message was not sent because messages are being sent too quickly."
 msgstr ""
-"El missatge no s'ha pogut enviar perquè s'està enviant massa de pressa:"
-
-#, fuzzy
+"No s'ha pogut enviar el missatge perquè se n'estan enviant massa depressa."
+
 msgid "Message was not sent because an unknown encoding error occurred."
 msgstr ""
-"No s'ha pogut enviar el missatge perquè s'ha produït un error desconegut:"
-
-#, fuzzy
+"No s'ha pogut enviar el missatge perquè s'ha produït un error desconegut en "
+"la codificació."
+
 msgid "Message was not sent because an unknown error occurred."
 msgstr ""
-"No s'ha pogut enviar el missatge perquè s'ha produït un error desconegut:"
+"No s'ha pogut enviar el missatge perquè s'ha produït un error desconegut."
 
 msgid "Unable to connect"
 msgstr "No s'ha pogut connectar"
@@ -5518,20 +5541,11 @@
 msgid "%s has removed you from his or her buddy list."
 msgstr "%s us ha suprimit de la seva llista d'amics."
 
-#, fuzzy
 msgid "Delete Buddy from Address Book?"
-msgstr "Afegeix a la llibreta d'adreces"
-
-#, fuzzy
+msgstr "Voleu suprimir l'amic de la llibreta d'adreces?"
+
 msgid "Do you want to delete this buddy from your address book as well?"
-msgstr "Voleu afegir aquest amic a la vostra llista d'amics?"
-
-#. only notify the user about problems adding to the friends list
-#. * maybe we should do something else for other lists, but it probably
-#. * won't cause too many problems if we just ignore it
-#, c-format
-msgid "Unable to add \"%s\"."
-msgstr "No s'ha pogut afegir «%s»."
+msgstr "Voleu suprimir aquest amic de la vostra llista d'amics també?"
 
 msgid "The username specified is invalid."
 msgstr "El nom d'usuari especificat no és vàlid."
@@ -5539,6 +5553,9 @@
 msgid "This Hotmail account may not be active."
 msgstr "Pot ser que aquest compte Hotmail no sigui actiu."
 
+msgid "Profile URL"
+msgstr "URL del perfil"
+
 #. *< type
 #. *< ui_requirement
 #. *< flags
@@ -5575,13 +5592,8 @@
 msgid "Logging in"
 msgstr "S'està entrant"
 
-#, fuzzy, c-format
-msgid "Connection to server lost (no data received within %d second)"
-msgid_plural "Connection to server lost (no data received within %d seconds)"
-msgstr[0] ""
-"S'ha perdut la connexió al servidor (fa %d segons que no s'hi reben dades)"
-msgstr[1] ""
-"S'ha perdut la connexió al servidor (fa %d segons que no s'hi reben dades)"
+msgid "Lost connection with server"
+msgstr "S'ha perdut la connexió amb el servidor"
 
 #. Can't write _()'d strings in array initializers. Workaround.
 msgid "New mail messages"
@@ -5676,7 +5688,7 @@
 msgid "IM Friends"
 msgstr "Amics de MI"
 
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "%d buddy was added or updated from the server (including buddies already on "
 "the server-side list)"
@@ -5684,8 +5696,8 @@
 "%d buddies were added or updated from the server (including buddies already "
 "on the server-side list)"
 msgstr[0] ""
-"S'han afegit o actualitzat %d amics al servidor (incloent els amics que ja "
-"són a la llista del servidor)"
+"S'ha afegit o actualitzat %d amic al servidor (incloent els amics que ja són "
+"a la llista del servidor)"
 msgstr[1] ""
 "S'han afegit o actualitzat %d amics al servidor (incloent els amics que ja "
 "són a la llista del servidor)"
@@ -5740,9 +5752,6 @@
 msgid "User"
 msgstr "Usuari"
 
-msgid "Profile"
-msgstr "Perfil"
-
 msgid "Headline"
 msgstr "Titular"
 
@@ -6237,9 +6246,8 @@
 msgid "AIM Protocol Plugin"
 msgstr "Connector per al protocol AIM"
 
-#, fuzzy
 msgid "ICQ UIN..."
-msgstr "ICQ UIN"
+msgstr "ICQ UIN..."
 
 #. *< type
 #. *< ui_requirement
@@ -6339,10 +6347,10 @@
 msgstr "En la llista de permès/denegat local"
 
 msgid "Warning level too high (sender)"
-msgstr ""
+msgstr "Nivell d'avís massa alt (remitent)"
 
 msgid "Warning level too high (receiver)"
-msgstr ""
+msgstr "Nivell d'avís massa alt (receptor)"
 
 msgid "User temporarily unavailable"
 msgstr "Usuari no disponible temporalment"
@@ -6446,9 +6454,8 @@
 msgid "Camera"
 msgstr "Càmera"
 
-#, fuzzy
 msgid "Screen Sharing"
-msgstr "Nom d'usuari"
+msgstr "Compartició de pantalla"
 
 #, c-format
 msgid "Free For Chat"
@@ -6697,27 +6704,30 @@
 msgstr[0] "S'ha perdut %hu missatge de %s perquè no era vàlid."
 msgstr[1] "S'han perdut %hu missatges de %s perquè no eren vàlids."
 
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "You missed %hu message from %s because his/her warning level is too high."
 msgid_plural ""
 "You missed %hu messages from %s because his/her warning level is too high."
-msgstr[0] "S'ha perdut %hu missatge de %s perquè ell/ella era massa dolent/a."
+msgstr[0] ""
+"Heu perdut %hu missatge de %s perquè el seu nivell d'avís és massa alt."
 msgstr[1] ""
-"S'han perdut %hu missatges de %s perquè ell/ella era massa dolent/a."
-
-#, fuzzy, c-format
+"Heu perdut %hu missatges de %s perquè el seu nivell d'avís és massa alt."
+
+#, c-format
 msgid "You missed %hu message from %s because your warning level is too high."
 msgid_plural ""
 "You missed %hu messages from %s because your warning level is too high."
-msgstr[0] "S'ha perdut %hu missatge de %s perquè sou massa dolent."
-msgstr[1] "S'han perdut %hu missatges de %s perquè sou massa dolent."
+msgstr[0] ""
+"Heu perdut %hu missatge de %s perquè el vostre nivell d'avís és massa alt."
+msgstr[1] ""
+"Heu perdut %hu missatges de %s perquè el vostre nivell d'avís és massa alt."
 
 #, c-format
 msgid "You missed %hu message from %s for an unknown reason."
 msgid_plural "You missed %hu messages from %s for an unknown reason."
-msgstr[0] "S'ha perdut %hu missatge de %s per motius desconeguts."
-msgstr[1] "S'han perdut %hu missatges de %s per motius desconeguts."
+msgstr[0] "Heu perdut %hu missatge de %s per motius desconeguts."
+msgstr[1] "Heu perdut %hu missatges de %s per motius desconeguts."
 
 #. Data is assumed to be the destination sn
 #, c-format
@@ -6741,6 +6751,9 @@
 msgid "Member Since"
 msgstr "Membre des de"
 
+msgid "Profile"
+msgstr "Perfil"
+
 msgid "Your AIM connection may be lost."
 msgstr "La vostra connexió d'AIM es pot perdre."
 
@@ -6928,11 +6941,9 @@
 "d'usuari han de ser adreces de correu vàlides, o començar amb una lletra i "
 "contenir només lletres, nombres i espais, o només nombres."
 
-#, fuzzy
 msgid "Unable to Add"
 msgstr "No s'ha pogut afegir"
 
-#, fuzzy
 msgid "Unable to Retrieve Buddy List"
 msgstr "No s'ha pogut obtenir la llista d'amics"
 
@@ -7126,8 +7137,9 @@
 "per a la transferència de fitxers\n"
 "(és més lent, però acostuma a funcionar)"
 
+# FIXME: entrades/registres?
 msgid "Allow multiple simultaneous logins"
-msgstr ""
+msgstr "Permet diverses entrades simultànies"
 
 #, c-format
 msgid "Asking %s to connect to us at %s:%hu for Direct IM."
@@ -7230,16 +7242,14 @@
 msgid "Other"
 msgstr "Altres"
 
-#, fuzzy
 msgid "Visible"
-msgstr "Invisible"
-
-msgid "Firend Only"
-msgstr ""
-
-#, fuzzy
+msgstr "Visible"
+
+msgid "Friend Only"
+msgstr "Només amic"
+
 msgid "Private"
-msgstr "Privadesa"
+msgstr "Privat"
 
 msgid "QQ Number"
 msgstr "Número QQ"
@@ -7256,9 +7266,8 @@
 msgid "Phone Number"
 msgstr "Número de telèfon"
 
-#, fuzzy
 msgid "Authorize adding"
-msgstr "Voleu autoritzar l'amic?"
+msgstr "Autoritzar que us afegeixin"
 
 msgid "Cellphone Number"
 msgstr "Número de mòbil"
@@ -7266,131 +7275,110 @@
 msgid "Personal Introduction"
 msgstr "Introducció personal"
 
-#, fuzzy
 msgid "City/Area"
-msgstr "Ciutat"
-
-#, fuzzy
+msgstr "Ciutat/Àrea"
+
 msgid "Publish Mobile"
-msgstr "Mòbil personal"
-
-#, fuzzy
+msgstr "Publica el mòbil"
+
 msgid "Publish Contact"
-msgstr "Posa un àlies al contacte"
+msgstr "Publica el contacte"
 
 msgid "College"
 msgstr "Col·legi"
 
-#, fuzzy
 msgid "Horoscope"
-msgstr "Signe de l'horòscop"
-
-#, fuzzy
+msgstr "Horòscop"
+
 msgid "Zodiac"
-msgstr "Signe del zodíac"
-
-#, fuzzy
+msgstr "Zodíac"
+
 msgid "Blood"
-msgstr "Blocat"
-
-#, fuzzy
+msgstr "Sang"
+
 msgid "True"
-msgstr "Taure"
-
-#, fuzzy
+msgstr "Cert"
+
 msgid "False"
-msgstr "Ha fallat"
-
-#, fuzzy
+msgstr "Fals"
+
 msgid "Modify Contact"
-msgstr "Modifica el compte"
-
-#, fuzzy
+msgstr "Modifica el contacte"
+
 msgid "Modify Address"
-msgstr "Adreça de casa"
-
-#, fuzzy
+msgstr "Modifica l'adreça"
+
 msgid "Modify Extended Information"
-msgstr "Modifica la meva informació"
-
-#, fuzzy
+msgstr "Modifica la informació estesa"
+
 msgid "Modify Information"
-msgstr "Modifica la meva informació"
+msgstr "Modifica la informació"
 
 msgid "Update"
 msgstr "Actualitza"
 
-#, fuzzy
 msgid "Could not change buddy information."
-msgstr "Introduïu informació sobre l'amic."
-
-#, c-format
-msgid "%d needs Q&A"
-msgstr ""
-
-#, fuzzy
-msgid "Add buddy Q&A"
-msgstr "Afegeix un amic"
-
-#, fuzzy
-msgid "Input answer here"
-msgstr "Introduïu la sol·licitud aquí"
+msgstr "No s'ha pogut canviar la informació l'amic."
+
+#, c-format
+msgid "%u requires verification"
+msgstr "Cal verificació per a %u"
+
+# Nota: títol de finestra
+msgid "Add buddy question"
+msgstr "Afegir una pregunta"
+
+msgid "Enter answer here"
+msgstr "Introduïu la resposta aquí"
 
 msgid "Send"
 msgstr "Envia"
 
-#, fuzzy
 msgid "Invalid answer."
-msgstr "La contrasenya no és vàlida"
+msgstr "La resposta no és vàlida"
 
 msgid "Authorization denied message:"
 msgstr "Missatge de denegació de l'autorització:"
 
-#, fuzzy
-msgid "Sorry, You are not my style."
-msgstr "Em sap greu, no sou el meu tipus..."
-
-#, fuzzy, c-format
-msgid "%d needs authentication"
-msgstr "L'usuari %d necessita autenticació"
-
-#, fuzzy
+msgid "Sorry, you're not my style."
+msgstr "Em sap greu, no sou el meu tipus."
+
+#, c-format
+msgid "%u needs authorization"
+msgstr "Cal autorització per a %u"
+
+# Nota: títol de finestra (josep)
 msgid "Add buddy authorize"
-msgstr "Voleu afegir l'amic a la llista?"
-
-msgid "Input request here"
+msgstr "Autorització per a afegir un amic"
+
+msgid "Enter request here"
 msgstr "Introduïu la sol·licitud aquí"
 
 msgid "Would you be my friend?"
 msgstr "Voleu ser el meu amic?"
 
-#, fuzzy
 msgid "QQ Buddy"
-msgstr "Amic"
-
-#, fuzzy
+msgstr "Amic QQ"
+
 msgid "Add buddy"
 msgstr "Afegeix un amic"
 
-#, fuzzy
 msgid "Invalid QQ Number"
-msgstr "El nom de la cara QQ no és vàlida"
-
-#, fuzzy
+msgstr "El nombre QQ no és vàlid"
+
 msgid "Failed sending authorize"
-msgstr "Autoritzeu-me, si us plau."
-
-#, fuzzy, c-format
-msgid "Failed removing buddy %d"
-msgstr "No s'ha pogut suprimir l'amic"
-
-#, fuzzy, c-format
+msgstr "No s'ha pogut enviar l'autorizació"
+
+#, c-format
+msgid "Failed removing buddy %u"
+msgstr "No s'ha pogut suprimir l'amic %u"
+
+#, c-format
 msgid "Failed removing me from %d's buddy list"
-msgstr "Suprimeix l'usuari de la llista d'amics"
-
-#, fuzzy
+msgstr "No us heu pogut suprimir de la llista d'amics de %d"
+
 msgid "No reason given"
-msgstr "No s'ha indicat cap motiu."
+msgstr "No s'ha indicat cap motiu"
 
 #. only need to get value
 #, c-format
@@ -7400,9 +7388,9 @@
 msgid "Would you like to add him?"
 msgstr "Voleu afegir-lo?"
 
-#, fuzzy, c-format
+#, c-format
 msgid "Rejected by %s"
-msgstr "S'ha connectat a %s"
+msgstr "Rebutjat per %s"
 
 #, c-format
 msgid "Message: %s"
@@ -7417,82 +7405,73 @@
 msgid "QQ Qun"
 msgstr "QQ Qun"
 
-#, fuzzy
 msgid "Please enter Qun number"
-msgstr "Introduïu un nou nom per a %s"
-
-#, fuzzy
+msgstr "Introduïu el número Qun"
+
 msgid "You can only search for permanent Qun\n"
-msgstr "Només podeu cercar grups QQ permanents\n"
-
-#, fuzzy
+msgstr "Només podeu cercar Quns permanents\n"
+
+msgid "(Invalid UTF-8 string)"
+msgstr "(No és una cadena UTF-8 vàlida)"
+
 msgid "Not member"
 msgstr "No en sóc membre"
 
-#, fuzzy
 msgid "Member"
-msgstr "Membre des de"
-
-#, fuzzy
+msgstr "Membre"
+
 msgid "Requesting"
-msgstr "Diàleg de sol·licitud"
-
-#, fuzzy
+msgstr "Demanant"
+
 msgid "Admin"
-msgstr "Alerta d'administració"
-
-#, fuzzy
+msgstr "Administrador"
+
 msgid "Notice"
-msgstr "Nota"
-
-#, fuzzy
+msgstr "Avís"
+
 msgid "Detail"
 msgstr "Detalls"
 
 msgid "Creator"
 msgstr "Creador"
 
-#, fuzzy
 msgid "About me"
-msgstr "Quant al %s"
-
-#, fuzzy
+msgstr "Quant a mi"
+
 msgid "Category"
-msgstr "Error en el xat"
-
-#, fuzzy
+msgstr "Categoria"
+
 msgid "The Qun does not allow others to join"
-msgstr "Aquest grup no permet que s'hi afegeixi ningú"
-
-#, fuzzy
+msgstr "Aquest Qun no permet que s'hi afegeixi ningú"
+
 msgid "Join QQ Qun"
-msgstr "Entra a un xat"
-
-#, c-format
-msgid "Successfully joined Qun %s (%d)"
-msgstr ""
-
-#, fuzzy
+msgstr "Entra al Qun QQ"
+
+msgid "Input request here"
+msgstr "Introduïu la sol·licitud aquí"
+
+#, c-format
+msgid "Successfully joined Qun %s (%u)"
+msgstr "S'ha entrat al Qun %s (%u)"
+
 msgid "Successfully joined Qun"
-msgstr "Heu modificat amb èxit el membre del Qun"
-
-#, c-format
-msgid "Qun %d denied to join"
-msgstr ""
+msgstr "S'ha entrat al Qun"
+
+#, c-format
+msgid "Qun %u denied from joining"
+msgstr "No se us ha permès entrar al Qun %u"
 
 msgid "QQ Qun Operation"
 msgstr "Operació Qun QQ"
 
-#, fuzzy
 msgid "Failed:"
-msgstr "Ha fallat"
-
-msgid "Join Qun, Unknow Reply"
-msgstr ""
-
-#, fuzzy
+msgstr "Ha fallat:"
+
+msgid "Join Qun, Unknown Reply"
+msgstr "Resposta desconeguda en entrar al Qun"
+
 msgid "Quit Qun"
-msgstr "QQ Qun"
+msgstr "Surt del Qun"
 
 msgid ""
 "Note, if you are the creator, \n"
@@ -7501,51 +7480,47 @@
 "Nota, si en sou el creador, \n"
 "aquesta operació suprimirà aquest Qun."
 
-#, fuzzy
-msgid "Sorry, you are not our style ..."
-msgstr "Em sap greu, no sou el meu tipus..."
-
-#, fuzzy
-msgid "Successfully changed Qun member"
-msgstr "Heu modificat amb èxit el membre del Qun"
-
-#, fuzzy
+msgid "Sorry, you are not our style"
+msgstr "Em sap greu, no sou el meu tipus"
+
+msgid "Successfully changed Qun members"
+msgstr "S'ha canviat els membres del Qun"
+
 msgid "Successfully changed Qun information"
-msgstr "Heu modificat amb èxit la informació del Qun"
+msgstr "S'ha canviat la iformació del Qun correctament"
 
 msgid "You have successfully created a Qun"
 msgstr "Heu creat un Qun"
 
-#, fuzzy
-msgid "Would you like to set detailed information now?"
-msgstr "Voleu establir-la els detalls del Qun ara?"
+msgid "Would you like to set up detailed information now?"
+msgstr "Voleu establir informació detallada ara?"
 
 msgid "Setup"
-msgstr "Instal·lació"
-
-#, fuzzy, c-format
-msgid "%d requested to join Qun %d for %s"
-msgstr "L'usuari %d ha sol·licitat unir-se al grup %d"
-
-#, fuzzy, c-format
-msgid "%d request to join Qun %d"
-msgstr "L'usuari %d ha sol·licitat unir-se al grup %d"
-
-#, fuzzy, c-format
-msgid "Failed to join Qun %d, operated by admin %d"
-msgstr "No s'ha pogut entrar al xat de l'amic."
-
-#, c-format
-msgid "<b>Joining Qun %d is approved by admin %d for %s</b>"
-msgstr ""
-
-#, fuzzy, c-format
-msgid "<b>Removed buddy %d.</b>"
-msgstr "Suprimeix l'amic"
-
-#, c-format
-msgid "<b>New buddy %d joined.</b>"
-msgstr ""
+msgstr "Configuració"
+
+#, c-format
+msgid "%u requested to join Qun %u for %s"
+msgstr "%u ha sol·licitat unir-se al Qun %u per %s"
+
+#, c-format
+msgid "%u request to join Qun %u"
+msgstr "%u ha sol·licitat unir-se al Qun %u"
+
+#, c-format
+msgid "Failed to join Qun %u, operated by admin %u"
+msgstr "No s'ha pogut entrar al Qun %u, administrat per %u"
+
+#, c-format
+msgid "<b>Joining Qun %u is approved by admin %u for %s</b>"
+msgstr "<b>L'administrador %2$u us ha permès unir-vos al Qun %1$u per %3$s</b>"
+
+#, c-format
+msgid "<b>Removed buddy %u.</b>"
+msgstr "<b>S'ha suprimit l'amic %u.</b>"
+
+#, c-format
+msgid "<b>New buddy %u joined.</b>"
+msgstr "<b>El nou amic %u ha entrat.</b>"
 
 #, c-format
 msgid "Unknown-%d"
@@ -7555,10 +7530,10 @@
 msgstr "Nivell"
 
 msgid " VIP"
-msgstr ""
+msgstr " VIP"
 
 msgid " TCP"
-msgstr ""
+msgstr " TCP"
 
 #, fuzzy
 msgid " FromMobile"
@@ -7568,128 +7543,122 @@
 msgid " BindMobile"
 msgstr "Mòbil"
 
-#, fuzzy
 msgid " Video"
-msgstr "Vídeo en directe"
-
-#, fuzzy
+msgstr " Vídeo"
+
 msgid " Zone"
-msgstr "Cap"
-
+msgstr " Zona"
+
+# Nota: només apareix si es defineix DEBUG
 msgid "Flag"
-msgstr ""
-
+msgstr "Bandera"
+
+# Nota: només apareix si es defineix DEBUG
 msgid "Ver"
-msgstr ""
+msgstr "Ver"
 
 msgid "Invalid name"
 msgstr "QQ: El nom d'usuari no és vàlid"
 
-#, fuzzy
 msgid "Select icon..."
-msgstr "Selecciona una carpeta..."
-
-#, fuzzy, c-format
+msgstr "Selecciona una icona..."
+
+#, c-format
 msgid "<b>Login time</b>: %d-%d-%d, %d:%d:%d<br>\n"
-msgstr "<b>Temps de connexió</b>: %s<br>\n"
-
-#, fuzzy, c-format
+msgstr "<b>Temps d'entrada</b>: %d-%d-%d, %d:%d:%d<br>\n"
+
+#, c-format
 msgid "<b>Total Online Buddies</b>: %d<br>\n"
-msgstr "<b>En línia ara</b>: %d<br>\n"
-
-#, fuzzy, c-format
+msgstr "<b>Amic en línia</b>: %d<br>\n"
+
+#, c-format
 msgid "<b>Last Refresh</b>: %d-%d-%d, %d:%d:%d<br>\n"
-msgstr "<b>Actualitzat per darrer cop</b>: %s<br>\n"
-
-#, fuzzy, c-format
+msgstr "<b>Actualitzat per darrer cop</b>: %d-%d-%d, %d:%d:%d<br>\n"
+
+#, c-format
 msgid "<b>Server</b>: %s<br>\n"
-msgstr "<b>ID del servidor:</b> %s: %d<br>\n"
-
-#, fuzzy, c-format
+msgstr "<b>Servidor</b>: %s<br>\n"
+
+#, c-format
 msgid "<b>Client Tag</b>: %s<br>\n"
-msgstr "<b>Temps de connexió</b>: %s<br>\n"
+msgstr "<b>Etiqueta del client</b>: %s<br>\n"
 
 #, c-format
 msgid "<b>Connection Mode</b>: %s<br>\n"
 msgstr "<b>Mode de connexió</b>: %s<br>\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "<b>My Internet IP</b>: %s:%d<br>\n"
-msgstr "<b>Adreça IP:</b> %s<br>"
-
-#, fuzzy, c-format
+msgstr "<b>La meva adreça IP</b>: %s:%d<br>\n"
+
+#, c-format
 msgid "<b>Sent</b>: %lu<br>\n"
-msgstr "<b>En línia ara</b>: %d<br>\n"
-
-#, fuzzy, c-format
+msgstr "<b>Enviats</b>: %lu<br>\n"
+
+#, c-format
 msgid "<b>Resend</b>: %lu<br>\n"
-msgstr "<b>Usuari:</b> %s<br>"
-
-#, fuzzy, c-format
+msgstr "<b>Reenviats</b>: %lu<br>\n"
+
+#, c-format
 msgid "<b>Lost</b>: %lu<br>\n"
-msgstr "<b>%s:</b> %s<br>"
-
-#, fuzzy, c-format
+msgstr "<b>Perduts</b>: %lu<br>\n"
+
+#, c-format
 msgid "<b>Received</b>: %lu<br>\n"
-msgstr "<b>Actualitzat per darrer cop</b>: %s<br>\n"
-
-#, fuzzy, c-format
+msgstr "<b>Rebuta</b>: %lu<br>\n"
+
+#, c-format
 msgid "<b>Received Duplicate</b>: %lu<br>\n"
-msgstr "<b>La meva IP pública:</b> %s<br>\n"
-
-#, fuzzy, c-format
+msgstr "<b>Rebuts duplicats</b>: %lu<br>\n"
+
+#, c-format
 msgid "<b>Time</b>: %d-%d-%d, %d:%d:%d<br>\n"
-msgstr "<b>Temps de connexió</b>: %s<br>\n"
-
-#, fuzzy, c-format
+msgstr "<b>Temps</b>: %d-%d-%d, %d:%d:%d<br>\n"
+
+#, c-format
 msgid "<b>IP</b>: %s<br>\n"
-msgstr "<b>ID del servidor:</b> %s: %d<br>\n"
+msgstr "<b>IP</b>: %s<br>\n"
 
 msgid "Login Information"
 msgstr "Informació de la connexió"
 
-#, fuzzy
 msgid "<p><b>Original Author</b>:<br>\n"
-msgstr "<b>Usuari extern</b><br>"
+msgstr "<p><b>Autor original</b>:<br>\n"
 
 msgid "<p><b>Code Contributors</b>:<br>\n"
-msgstr ""
-
-#, fuzzy
+msgstr "<p><b>Col·laboradors del codi</b>:<br>\n"
+
 msgid "<p><b>Lovely Patch Writers</b>:<br>\n"
-msgstr "<b>Actualitzat per darrer cop</b>: %s<br>\n"
-
-#, fuzzy
+msgstr "<p><b>Encantadors apedaçadors (de codi)</b>:<br>\n"
+
 msgid "<p><b>Acknowledgement</b>:<br>\n"
-msgstr "<b>En línia ara</b>: %d<br>\n"
-
+msgstr "<p><b>Reconeixement</b>:<br>\n"
+
+# FIXME: ush... traducció lliure... 
 msgid "<p><i>And, all the boys in the backroom...</i><br>\n"
-msgstr ""
+msgstr "<p><i>I tothom que ho ha fet possible...<i><br>\n"
 
 msgid "<i>Feel free to join us!</i> :)"
-msgstr ""
-
-#, fuzzy, c-format
-msgid "About OpenQ r%s"
-msgstr "Quant al %s"
-
-#, fuzzy
+msgstr "<i>No dubteu a col·laborar amb nosaltres!</i> :)"
+
+#, c-format
+msgid "About OpenQ %s"
+msgstr "Quant a l'OpenQ %s"
+
 msgid "Change Icon"
-msgstr "Desa la icona"
+msgstr "Canvia la icona"
 
 msgid "Change Password"
 msgstr "Canvia la contrasenya"
 
-#, fuzzy
 msgid "Account Information"
-msgstr "Informació de la connexió"
+msgstr "Informació del compte"
 
 msgid "Update all QQ Quns"
-msgstr ""
-
-#, fuzzy
+msgstr "Actualitza tots els Quns QQ"
+
 msgid "About OpenQ"
-msgstr "Quant al %s"
+msgstr "Quant a l'OpenQ"
 
 #. *< type
 #. *< ui_requirement
@@ -7701,116 +7670,102 @@
 #. *< version
 #. *  summary
 #. *  description
-#, fuzzy
 msgid "QQ Protocol Plugin"
 msgstr "Connector per al protocol QQ"
 
-#, fuzzy
 msgid "Auto"
-msgstr "Autor"
-
-#, fuzzy
+msgstr "Auto"
+
 msgid "Select Server"
-msgstr "Seleccioneu un usuari"
+msgstr "Seleccioneu un servidor"
 
 msgid "QQ2005"
-msgstr ""
+msgstr "QQ2005"
 
 msgid "QQ2007"
-msgstr ""
+msgstr "QQ2007"
 
 msgid "QQ2008"
-msgstr ""
-
-#. #endif
-#, fuzzy
+msgstr "QQ2008"
+
 msgid "Connect by TCP"
 msgstr "Connecta amb TCP"
 
-#, fuzzy
 msgid "Show server notice"
-msgstr "Mostra menys opcions"
-
-#, fuzzy
+msgstr "Mostra els avisos del servidor"
+
 msgid "Show server news"
-msgstr "Mostra menys opcions"
-
-#, fuzzy
+msgstr "Mostra les notícies del servidor"
+
+# FIXME: keep alive -> permanència
 msgid "Keep alive interval (seconds)"
-msgstr "Error de permanència"
-
-#, fuzzy
+msgstr "Interval de permanència (en segons)"
+
 msgid "Update interval (seconds)"
-msgstr "Error de permanència"
-
-#, fuzzy
-msgid "Can not decrypt server reply"
-msgstr "No s'ha pogut obtenir informació del servidor"
-
-#, fuzzy
-msgid "Can not decrypt get server reply"
-msgstr "No s'ha pogut obtenir informació del servidor"
+msgstr "Interval d'actualització (en segons)"
+
+msgid "Cannot decrypt server reply"
+msgstr "No es pot desxifrar la resposta del servidor"
 
 #, c-format
 msgid "Failed requesting token, 0x%02X"
-msgstr ""
-
-#, fuzzy, c-format
+msgstr "S'ha produït un error en sol·licitar el testimoni, 0x%02X"
+
+#, c-format
 msgid "Invalid token len, %d"
-msgstr "El títol no és vàlid"
+msgstr "La longiud del testimoni no és vàlida, %d"
 
 #. extend redirect used in QQ2006
 msgid "Redirect_EX is not currently supported"
-msgstr ""
+msgstr "Redirect_EX no està implementat"
 
 #. need activation
 #. need activation
 #. need activation
-#, fuzzy
 msgid "Activation required"
-msgstr "Cal registre"
-
-#, c-format
-msgid "Unknow reply code when login (0x%02X)"
-msgstr ""
-
-msgid "Keep alive error"
-msgstr "Error de permanència"
-
-#, fuzzy
-msgid "Requesting captcha ..."
-msgstr "S'està cridant l'atenció de %s..."
-
-msgid "Checking code of captcha ..."
-msgstr ""
-
-msgid "Failed captcha verify"
-msgstr ""
-
-#, fuzzy
+msgstr "Cal activació"
+
+#, c-format
+msgid "Unknown reply code when logging in (0x%02X)"
+msgstr "No s'ha reconegut el codi de resposta en entrar (0x%02X)"
+
+msgid "Could not decrypt server reply"
+msgstr "No s'ha pogut desxifrar la resposta del servidor"
+
+# FIXME: captcha
+msgid "Requesting captcha"
+msgstr "S'està sol·licitant un capcha"
+
+msgid "Checking captcha"
+msgstr "S'està comprovant el captcha"
+
+msgid "Failed captcha verification"
+msgstr "Ha fallat la verificació del captcha"
+
 msgid "Captcha Image"
-msgstr "Desa imatge"
-
-#, fuzzy
+msgstr "Imatge captcha"
+
 msgid "Enter code"
-msgstr "Introduïu la contrasenya"
-
-msgid "QQ Captcha Verifing"
-msgstr ""
-
-#, fuzzy
+msgstr "Introduïu el codi"
+
+msgid "QQ Captcha Verification"
+msgstr "Verificació del captcha QQ"
+
 msgid "Enter the text from the image"
-msgstr "Introduïu el nom del grup"
-
-#, c-format
-msgid "Unknow reply code when checking password (0x%02X)"
-msgstr ""
-
-#, c-format
-msgid ""
-"Unknow reply code when login (0x%02X):\n"
+msgstr "Introduïu el text de la imatge"
+
+#, c-format
+msgid "Unknown reply when checking password (0x%02X)"
+msgstr ""
+"No s'ha reconegut el codi de resposta en comprovar la contrasenya (0x%02X)"
+
+#, c-format
+msgid ""
+"Unknown reply code when logging in (0x%02X):\n"
 "%s"
 msgstr ""
+"No s'ha reconegut el codi de resposta en entrar (0x%02X):\n"
+"%s"
 
 #. we didn't successfully connect. tdt->toc_fd is valid here
 msgid "Unable to connect."
@@ -7819,14 +7774,6 @@
 msgid "Socket error"
 msgstr "Error del sòcol"
 
-#, fuzzy, c-format
-msgid ""
-"Lost connection with server:\n"
-"%d, %s"
-msgstr ""
-"S'ha perdut la connexió amb el servidor:\n"
-"%s"
-
 msgid "Unable to read from socket"
 msgstr "No s'ha pogut llegir el sòcol"
 
@@ -7836,77 +7783,74 @@
 msgid "Connection lost"
 msgstr "S'ha perdut la connexió"
 
-#, fuzzy
-msgid "Get server ..."
-msgstr "Estableix informació d'usuari..."
-
-#, fuzzy
-msgid "Request token"
-msgstr "Petició denegada"
+msgid "Getting server"
+msgstr "S'està obtenint el servidor"
+
+msgid "Requesting token"
+msgstr "S'està sol·licitant un testimoni"
 
 msgid "Couldn't resolve host"
 msgstr "No s'ha pogut obtenir l'adreça de l'ordinador"
 
-#, fuzzy
 msgid "Invalid server or port"
-msgstr "El nom d'usuari o la contrasenya no són vàlides"
-
-#, fuzzy
-msgid "Connecting server ..."
-msgstr "Servidor al qual connectar-se"
-
-#, fuzzy
+msgstr "El servidor o el port no són vàlids"
+
+msgid "Connecting to server"
+msgstr "S'està connectant al servidor"
+
 msgid "QQ Error"
-msgstr "Error del QQid"
-
-msgid "Failed to send IM."
-msgstr "No s'ha pogut enviar la MI."
-
-#, fuzzy, c-format
+msgstr "Error del QQ"
+
+#, c-format
 msgid ""
 "Server News:\n"
 "%s\n"
 "%s\n"
 "%s"
-msgstr "Servidor repetidor d'ICQ"
-
-#, fuzzy, c-format
+msgstr ""
+"Notícies del servidor:\n"
+"%s\n"
+"%s\n"
+"%s"
+
+#, c-format
+msgid "%s:%s"
+msgstr "%s:%s"
+
+#, c-format
 msgid "From %s:"
-msgstr "De"
-
-#, fuzzy, c-format
+msgstr "De %s:"
+
+#, c-format
 msgid ""
 "Server notice From %s: \n"
 "%s"
-msgstr "Instruccions del servidor: %s"
-
-msgid "Unknow SERVER CMD"
-msgstr ""
+msgstr ""
+"Avís del servidor de %s: \n"
+"%s"
+
+msgid "Unknown SERVER CMD"
+msgstr "Ordre del servidor desconeguda"
 
 #, c-format
 msgid ""
 "Error reply of %s(0x%02X)\n"
-"Room %d, reply 0x%02X"
-msgstr ""
-
-#, fuzzy
+"Room %u, reply 0x%02X"
+msgstr ""
+"Resposta d'error de %s(0x%02X)\n"
+"Sala %u, resposta 0x%02X"
+
 msgid "QQ Qun Command"
-msgstr "Ordre"
-
-#, c-format
-msgid "Not a member of room \"%s\"\n"
-msgstr ""
-
-msgid "Can not decrypt login reply"
-msgstr ""
-
-#, fuzzy
-msgid "Unknow LOGIN CMD"
-msgstr "Motiu desconegut"
-
-#, fuzzy
-msgid "Unknow CLIENT CMD"
-msgstr "Motiu desconegut"
+msgstr "Ordre QQ Qun"
+
+msgid "Could not decrypt login reply"
+msgstr "No s'ha pogut desxifrar la resposta d'entrada"
+
+msgid "Unknown LOGIN CMD"
+msgstr "Ordre d'entrada desconeguda"
+
+msgid "Unknown CLIENT CMD"
+msgstr "Ordre de client desconeguda"
 
 #, c-format
 msgid "%d has declined the file %s"
@@ -8931,9 +8875,9 @@
 msgid "Error loading SILC key pair"
 msgstr "S'ha produït un error en carregar el parell de claus claus SILC"
 
-#, fuzzy, c-format
+#, c-format
 msgid "Download %s: %s"
-msgstr "Usuaris a %s: %s"
+msgstr "Baixada %s: %s"
 
 msgid "Your Current Mood"
 msgstr "El vostre estat d'ànim actual"
@@ -9195,7 +9139,8 @@
 msgid "Private Key file"
 msgstr "Fitxer de la clau privada"
 
-# FIXME
+# El recull diu "xifra", però aquí no es refereix a una xifra sinó a un
+# mètode de xifratge
 msgid "Cipher"
 msgstr "Codi"
 
@@ -9779,9 +9724,8 @@
 msgid "doodle: Request user to start a Doodle session"
 msgstr "doodle: fa una petició a l'usuari per iniciar una sessió Doodle"
 
-#, fuzzy
 msgid "Yahoo ID..."
-msgstr "ID de Yahoo!"
+msgstr "ID de Yahoo..."
 
 #. *< type
 #. *< ui_requirement
@@ -9891,16 +9835,9 @@
 msgid "Last Update"
 msgstr "Darrera actualització"
 
-#, c-format
-msgid "User information for %s unavailable"
-msgstr "Dades de l'usuari %s no disponibles"
-
-msgid ""
-"Sorry, this profile seems to be in a language or format that is not "
-"supported at this time."
-msgstr ""
-"Disculpeu, aquest perfil deu estar en una llengua que actualment no està "
-"implementada."
+msgid ""
+"This profile is in a language or format that is not supported at this time."
+msgstr "Aquest perfil és en una llengua que actualment no està implementada."
 
 msgid ""
 "Could not retrieve the user's profile. This most likely is a temporary "
@@ -10153,11 +10090,11 @@
 
 #, c-format
 msgid "Requesting %s's attention..."
-msgstr "S'està cridant l'atenció de %s..."
+msgstr "S'està reclamant l'atenció de %s..."
 
 #, c-format
 msgid "%s has requested your attention!"
-msgstr "%s us ha cridat l'atenció!"
+msgstr "%s us ha demanat l'atenció!"
 
 #. *
 #. * A wrapper for purple_request_action() that uses @c Yes and @c No buttons.
@@ -10203,21 +10140,18 @@
 msgstr "Voleu acceptar la invitació al xat?"
 
 #. Shortcut
-#, fuzzy
 msgid "Shortcut"
-msgstr "Ordena"
-
-#, fuzzy
+msgstr "Drecera"
+
 msgid "The text-shortcut for the smiley"
-msgstr "Tema de la drecera de text de GTK+"
+msgstr "La drecera de text per a l'emoticona"
 
 #. Stored Image
-#, fuzzy
 msgid "Stored Image"
-msgstr "Desa imatge"
+msgstr "Imatge desada"
 
 msgid "Stored Image. (that'll have to do for now)"
-msgstr ""
+msgstr "Imatge desada. (de moment hem de passar amb això)"
 
 msgid "SSL Connection Failed"
 msgstr "No s'ha pogut connectar amb SSL"
@@ -10347,9 +10281,11 @@
 msgid "Unable to connect to %s"
 msgstr "No s'ha pogut connectar a %s"
 
-#, fuzzy, c-format
+#, c-format
 msgid "Error reading from %s: response too long (%d bytes limit)"
-msgstr "S'ha produït un error en llegir de %s: %s"
+msgstr ""
+"S'ha produït un error en llegir de %s: la resposta és massa llarga (%d bytes "
+"de límit)"
 
 #, c-format
 msgid ""
@@ -10400,9 +10336,9 @@
 msgstr "S'ha refusat la connexió."
 
 #. 10048
-#, fuzzy, c-format
+#, c-format
 msgid "Address already in use."
-msgstr "Aquest nom de xat ja existeix"
+msgstr "Aquesta adreça ja s'està fent servir"
 
 msgid "Internet Messenger"
 msgstr "Missatger d'Internet"
@@ -10511,9 +10447,8 @@
 msgid "_Basic"
 msgstr "_Bàsic"
 
-#, fuzzy
 msgid "Create _this new account on the server"
-msgstr "Crea aquest compte nou al servidor"
+msgstr "Crea _aquest compte nou al servidor"
 
 msgid "_Advanced"
 msgstr "_Avançat"
@@ -10524,7 +10459,7 @@
 msgid "Protocol"
 msgstr "Protocol"
 
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "<span size='larger' weight='bold'>Welcome to %s!</span>\n"
 "\n"
@@ -10539,12 +10474,12 @@
 "<span size='larger' weight='bold'>Benvingut al %s!</span>\n"
 "\n"
 "No teniu cap compte de MI configurat. Per a connectar-vos amb el %s premeu "
-"el botó <b>Afegeix</b> de sota, i configureu el vostre primer compte. Si "
-"voleu que el %s es connecti amb més comptes de MI, torneu a prémer "
-"<b>Afegeix</b> fins a configurar-los tots.\n"
+"el botó <b>Afegeix</b> d'aquí sota, i configureu el vostre primer compte. Si "
+"voleu que el %s es connecti amb més comptes de missatgeria instantània (MI), "
+"torneu a prémer <b>Afegeix</b> fins a configurar-los tots.\n"
 "\n"
 "Podeu tornar a aquesta finestra per afegir, editar o suprimir comptes, a "
-"partir del menú <b>Comptes->Afegeix/Edita</b> de la finestra de la llista "
+"partir del menú <b>Comptes->Gestiona els comptes</b> a finestra de la llista "
 "d'amics."
 
 #, c-format
@@ -10613,9 +10548,8 @@
 msgid "_Remove"
 msgstr "Sup_rimeix"
 
-#, fuzzy
 msgid "Set Custom Icon"
-msgstr "Estableix una icona personalitzada..."
+msgstr "Estableix una icona personalitzada"
 
 msgid "Remove Custom Icon"
 msgstr "Suprimeix la icona personalitzada"
@@ -10717,9 +10651,8 @@
 msgid "/_Accounts"
 msgstr "/_Comptes"
 
-#, fuzzy
 msgid "/Accounts/Manage Accounts"
-msgstr "/Comptes/Gestió"
+msgstr "/Comptes/Gestió de comptes"
 
 # Accelerador a la "n" com en la resta de programes
 #. Tools
@@ -10736,14 +10669,13 @@
 msgstr "/Eines/_Connectors"
 
 msgid "/Tools/Pr_eferences"
-msgstr "/Eines/Pr_eferències"
+msgstr "/Eines/Preferè_ncies"
 
 msgid "/Tools/Pr_ivacy"
 msgstr "/Eines/_Privadesa"
 
-#, fuzzy
 msgid "/Tools/Smile_y"
-msgstr "/Eines/_Absent"
+msgstr "/Eines/Em_oticona"
 
 msgid "/Tools/_File Transfers"
 msgstr "/Eines/Transferència de _fitxers"
@@ -10904,7 +10836,7 @@
 msgstr "/Comptes"
 
 #. Translators: Please maintain the use of -> and <- to refer to menu heirarchy
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "<span weight='bold' size='larger'>Welcome to %s!</span>\n"
 "\n"
@@ -10915,9 +10847,9 @@
 "<span weight='bold' size='larger'>Benvingut al %s!</span>\n"
 "\n"
 "No teniu cap compte habilitat. Podeu habilitar comptes de MI des del menú "
-"<b>Comptes->Gestió</b> de la finestra de <b>Comptes</b>. Quan hagueu "
-"habilitat algun compte, podreu connectar-vos, establir el vostre estat, i "
-"parlar amb amics."
+"<b>Comptes->Gestió de comptes</b> de la finestra de <b>Comptes</b>. Quan "
+"hagueu habilitat algun compte podreu connectar-vos-hi, establir el vostre "
+"estat, i parlar amb amics."
 
 #. set the Show Offline Buddies option. must be done
 #. * after the treeview or faceprint gets mad. -Robot101
@@ -10970,9 +10902,8 @@
 msgid "Auto_join when account becomes online."
 msgstr "Entra _automàticament quant el compte estigui connectat."
 
-#, fuzzy
 msgid "_Remain in chat after window is closed."
-msgstr "_Oculta el xat quan la finestra es tanqui."
+msgstr "_Continua al xat quan la finestra es tanqui."
 
 msgid "Please enter the name of the group to be added."
 msgstr "Introduïu el nom del grup que vulgueu afegir."
@@ -11348,23 +11279,22 @@
 msgid "Fatal Error"
 msgstr "Error fatal"
 
+# Fixme
 msgid "bug master"
-msgstr ""
-
-#, fuzzy
+msgstr "bug master"
+
 msgid "artist"
-msgstr "Artista"
+msgstr "artista"
 
 #. feel free to not translate this
 msgid "Ka-Hing Cheung"
-msgstr ""
+msgstr "Ka-Hing Cheung"
 
 msgid "support"
 msgstr "suport"
 
-#, fuzzy
 msgid "webmaster"
-msgstr "desenvolupador i mantenidor de la pàgina web"
+msgstr "administrador del web"
 
 msgid "Senior Contributor/QA"
 msgstr "Col·laborador veterà/CQ"
@@ -11387,7 +11317,7 @@
 msgstr "suport/CQ"
 
 msgid "XMPP"
-msgstr ""
+msgstr "XMPP"
 
 msgid "original author"
 msgstr "autor original"
@@ -11466,9 +11396,8 @@
 msgid "French"
 msgstr "Francès"
 
-#, fuzzy
 msgid "Irish"
-msgstr "Kurd"
+msgstr "Irlandès"
 
 msgid "Galician"
 msgstr "Gallec"
@@ -11537,7 +11466,7 @@
 msgstr "Noruec (Nynorsk)"
 
 msgid "Occitan"
-msgstr ""
+msgstr "Occità"
 
 msgid "Punjabi"
 msgstr "Punjabi"
@@ -11779,45 +11708,35 @@
 msgid "Right-click for more unread messages...\n"
 msgstr "Feu clic amb el botó principal per a més missatges per llegir...\n"
 
-#, fuzzy
 msgid "_Change Status"
-msgstr "Canvia d'estat"
-
-#, fuzzy
+msgstr "_Canvia d'estat"
+
 msgid "Show Buddy _List"
-msgstr "Mostra la llista d'amics"
-
-#, fuzzy
+msgstr "Mostra la _llista d'amics"
+
 msgid "_Unread Messages"
-msgstr "Missatges sense llegir"
-
-#, fuzzy
+msgstr "Missatges _sense llegir"
+
 msgid "New _Message..."
-msgstr "Missatge nou..."
-
-#, fuzzy
+msgstr "_Missatge nou..."
+
 msgid "_Accounts"
-msgstr "/_Comptes"
-
-#, fuzzy
+msgstr "_Comptes"
+
 msgid "Plu_gins"
-msgstr "Connectors"
-
-#, fuzzy
+msgstr "Co_nnectors"
+
 msgid "Pr_eferences"
-msgstr "Preferències"
-
-#, fuzzy
+msgstr "Pr_eferències"
+
 msgid "Mute _Sounds"
-msgstr "Inhabilita els sons"
-
-#, fuzzy
+msgstr "Inhabilita els _sons"
+
 msgid "_Blink on New Message"
-msgstr "Parpelleja si hi ha missatges nous"
-
-#, fuzzy
+msgstr "_Parpelleja si hi ha missatges nous"
+
 msgid "_Quit"
-msgstr "Surt"
+msgstr "_Surt"
 
 msgid "Not started"
 msgstr "No s'ha iniciat"
@@ -11900,14 +11819,13 @@
 msgid "Color to draw hyperlinks."
 msgstr "El color amb què pintar els enllaços."
 
-#, fuzzy
 msgid "Hyperlink visited color"
-msgstr "Color dels enllaços"
-
-#, fuzzy
+msgstr "Color dels enllaços visitats"
+
 msgid "Color to draw hyperlinks after it has been visited (or activated)."
 msgstr ""
-"El color amb què es pintaran els enllaços quan el ratolí hi estigui a sobre."
+"El color amb el qual es pintaran els enllaços que ja s'hagin visitat (o "
+"activat)."
 
 # FIXME: prelight? (josep)
 msgid "Hyperlink prelight color"
@@ -11943,13 +11861,11 @@
 msgid "Color to draw the name of an action message."
 msgstr "Color amb el qual es pintaran els missatges d'acció."
 
-#, fuzzy
 msgid "Action Message Name Color for Whispered Message"
-msgstr "Nom del color dels missatges d'acció"
-
-#, fuzzy
+msgstr "Color del nom del missatge d'acció per a missatges xiuxiuejats"
+
 msgid "Whisper Message Name Color"
-msgstr "Nom del color per als missatges enviats"
+msgstr "Color dels missatges xiuxiuejats enviats"
 
 msgid "Typing notification color"
 msgstr "Color per a les notificacions de quan s'escriu"
@@ -12025,9 +11941,9 @@
 msgid "_Save Image..."
 msgstr "_Desa la imatge..."
 
-#, fuzzy, c-format
+#, c-format
 msgid "_Add Custom Smiley..."
-msgstr "Mostra emoticones personalitzades"
+msgstr "_Afegeix una emoticones personalitzada..."
 
 msgid "Select Font"
 msgstr "Selecciona el tipus de lletra"
@@ -12072,13 +11988,15 @@
 "This smiley is disabled because a custom smiley exists for this shortcut:\n"
 " %s"
 msgstr ""
+"Aquesta emoticona està inhabilitada perquè hi ha una emoticona "
+"personalitzada per aquesta drecera:\n"
+" %s"
 
 msgid "Smile!"
 msgstr "Somrieu!"
 
-#, fuzzy
 msgid "_Manage custom smileys"
-msgstr "Mostra emoticones personalitzades"
+msgstr "_Gestiona les emoticones personalitzades"
 
 msgid "This theme has no available smileys."
 msgstr "Aquest tema no disposa d'emoticones."
@@ -12290,7 +12208,7 @@
 "  -v, --version       mostra la versió actual i surt\n"
 
 # FIXME: backtrace -> traça (bug-buddy) ?
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "%s %s has segfaulted and attempted to dump a core file.\n"
 "This is a bug in the software and has happened through\n"
@@ -12311,17 +12229,12 @@
 "\n"
 "Si podeu reproduir aquest error, feu-ho saber als desenvolupadors,\n"
 "enviant-los un error de programació a:\n"
-"%ssimpleticket\n"
+"%ssimpleticket/\n"
 "\n"
 "Assegureu-vos que indiqueu el que estàveu fent, i envieu una traça\n"
 "(backtrace) del fitxer core. Si no sabeu com obtenir una traça,\n"
 "llegiu les instruccions que hi ha a:\n"
 "%swiki/GetABacktrace\n"
-"\n"
-"Si necessiteu ajuda, envieu un missatge instantani a SeanEgn o\n"
-"bé a LSchiere (per AIM). La informació per a contactar en Sean o\n"
-"en Luke a través d'altres protocols és aquí:\n"
-"%swiki/DeveloperPages\n"
 
 #. Translators may want to transliterate the name.
 #. It is not to be translated.
@@ -12329,7 +12242,7 @@
 msgstr "Pidgin"
 
 msgid "Open All Messages"
-msgstr "Obre els _missatges"
+msgstr "Obre tots els missatges"
 
 msgid "<span weight=\"bold\" size=\"larger\">You have mail!</span>"
 msgstr "<span weight=\"bold\" size=\"larger\">Teniu correu electrònic.</span>"
@@ -12360,8 +12273,7 @@
 msgid ""
 "The 'Manual' browser command has been chosen, but no command has been set."
 msgstr ""
-"S'ha triat l'ordre per al navegador 'manualment', però no se n'ha indicat "
-"cap."
+"S'ha triat l'ordre per al navegador «manualment», però no se n'ha indicat cap."
 
 msgid "The following plugins will be unloaded."
 msgstr "Es descarregaran els connectors següents."
@@ -12794,31 +12706,26 @@
 "Ordre per al so\n"
 "(%s per al nom de fitxer)"
 
-#, fuzzy
 msgid "M_ute sounds"
-msgstr "Inhabilita els sons"
+msgstr "In_habilita els sons"
 
 msgid "Sounds when conversation has _focus"
 msgstr "Sons quan la conversa tingui el _focus"
 
-#, fuzzy
 msgid "_Enable sounds:"
-msgstr "Habilita els sons:"
-
-#, fuzzy
+msgstr "_Habilita els sons:"
+
 msgid "V_olume:"
-msgstr "Volum:"
+msgstr "V_olum:"
 
 msgid "Play"
 msgstr "Reprodueix"
 
-#, fuzzy
 msgid "_Browse..."
 msgstr "Nav_ega..."
 
-#, fuzzy
 msgid "_Reset"
-msgstr "Reinicia"
+msgstr "_Reinicia"
 
 msgid "_Report idle time:"
 msgstr "Informa del _temps d'inactivitat:"
@@ -12990,61 +12897,52 @@
 msgid "Status for %s"
 msgstr "Estat per a %s"
 
-#, fuzzy
 msgid "Custom Smiley"
-msgstr "Insereix una emoticona"
+msgstr "Emoticona personalitzada"
 
 msgid "More Data needed"
-msgstr ""
+msgstr "Calen més dades"
 
 msgid "Please provide a shortcut to associate with the smiley."
-msgstr ""
-
-#, fuzzy
+msgstr "Especifiqueu una drecera associada a l'emoticona."
+
 msgid "Duplicate Shortcut"
-msgstr "Duplicació de la correcció"
+msgstr "Drecera duplicada"
 
 msgid ""
 "A custom smiley for the selected shortcut already exists. Please specify a "
 "different shortcut."
 msgstr ""
-
-#, fuzzy
+"Hi ha una emoticona personalitzada per la drecera que heu seleccionat. "
+"Indiqueu-ne una de diferent."
+
 msgid "Please select an image for the smiley."
-msgstr "Seleccioneu l'estat d'ànim de la llista."
-
-#, fuzzy
+msgstr "Seleccioneu una imatge per a l'emoticona."
+
 msgid "Edit Smiley"
-msgstr "Insereix una emoticona"
-
-#, fuzzy
+msgstr "Edita l'emoticona"
+
 msgid "Add Smiley"
-msgstr "_Emoticona"
-
-#, fuzzy
+msgstr "Afegeix una emoticona"
+
 msgid "Smiley _Image"
-msgstr "Desa imatge"
+msgstr "_Imatge de l'emoticona"
 
 #. Smiley shortcut
-#, fuzzy
 msgid "Smiley S_hortcut"
-msgstr "Dreceres de teclat"
-
-#, fuzzy
+msgstr "_Dreceres de l'emoticona"
+
 msgid "Smiley"
-msgstr "_Emoticona"
-
-#, fuzzy
+msgstr "Emoticona"
+
 msgid "Custom Smiley Manager"
-msgstr "Gestor de certificats"
-
-#, fuzzy
+msgstr "Gestor d'emoticones personalitzades"
+
 msgid "Click to change your buddyicon for this account."
-msgstr "Utilitza aquesta _icona d'amic per a aquest compte:"
-
-#, fuzzy
+msgstr "Feu clic per canviar la icona d'amic d'aquest compte."
+
 msgid "Click to change your buddyicon for all accounts."
-msgstr "Utilitza aquesta _icona d'amic per a aquest compte:"
+msgstr "Feu clic per canviar la icona d'amic de tots els comptes."
 
 msgid "Waiting for network connection"
 msgstr "S'està esperant la connexió de xarxa"
@@ -13182,20 +13080,17 @@
 msgid "_Invite"
 msgstr "Conv_ida"
 
-#, fuzzy
 msgid "_Modify..."
-msgstr "_Modifica"
-
-#, fuzzy
+msgstr "_Modifica..."
+
 msgid "_Add..."
-msgstr "_Afegeix"
+msgstr "_Afegeix..."
 
 msgid "_Open Mail"
 msgstr "_Obre el correu"
 
-#, fuzzy
 msgid "_Edit"
-msgstr "Edita"
+msgstr "_Edita"
 
 msgid "Pidgin Tooltip"
 msgstr "Indicador de funció del Pidgin"
@@ -13214,12 +13109,11 @@
 msgid "none"
 msgstr "cap"
 
-#, fuzzy
 msgid "Small"
-msgstr "Correu electrònic"
+msgstr "Petites"
 
 msgid "Smaller versions of the default smilies"
-msgstr ""
+msgstr "Versions més petites de les emoticones per defecte"
 
 msgid "Response Probability:"
 msgstr "Probabilitat de resposta:"
@@ -13693,9 +13587,9 @@
 msgid "Set window manager \"_URGENT\" hint"
 msgstr "Aplica l'opció «_URGENT» del gestor de finestres"
 
-#, fuzzy
+# (gnome)
 msgid "_Flash window"
-msgstr "Finestres de _xat"
+msgstr "Finestres _flash"
 
 #. Raise window method button
 msgid "R_aise conversation window"
@@ -13783,9 +13677,8 @@
 msgid "Hyperlink Color"
 msgstr "Color dels hiperenllaços"
 
-#, fuzzy
 msgid "Visited Hyperlink Color"
-msgstr "Color dels hiperenllaços"
+msgstr "Color dels enllaços visitats"
 
 msgid "Highlighted Message Name Color"
 msgstr "Nom del color per als missatges ressaltats"
@@ -13880,18 +13773,16 @@
 
 #, c-format
 msgid "You can upgrade to %s %s today."
-msgstr ""
+msgstr "Podeu actualitzar-vos a %s %s avui."
 
 msgid "New Version Available"
 msgstr "Nova versió disponible"
 
-#, fuzzy
 msgid "Later"
-msgstr "Data"
-
-#, fuzzy
+msgstr "Més tard"
+
 msgid "Download Now"
-msgstr "Usuaris a %s: %s"
+msgstr "Baixa-la ara"
 
 #. *< type
 #. *< ui_requirement
@@ -14190,24 +14081,64 @@
 
 # FIXME: stanza -> estrofa (literal) (Josep)
 msgid "Insert an <iq/> stanza."
-msgstr "Insereix una estrofa <iq/>"
+msgstr "Insereix un bloc <iq/>."
 
 msgid "Insert a <presence/> stanza."
-msgstr "Insereix una estrofa <presence/>"
+msgstr "Insereix un bloc <presence/>."
 
 msgid "Insert a <message/> stanza."
-msgstr "Insereix una estrofa <message/>"
+msgstr "Insereix un bloc <message/>."
 
 #. *< name
 #. *< version
 #. *  summary
 msgid "Send and receive raw XMPP stanzas."
-msgstr "Envia i rep estrofes XMPP en brut."
+msgstr "Envia i rep blocs XMPP en brut."
 
 #. *  description
 msgid "This plugin is useful for debbuging XMPP servers or clients."
 msgstr "Aquest connector és útil per a depurar servidors i clients XMPP."
 
+#~ msgid "Connection to server lost (no data received within %d second)"
+#~ msgid_plural ""
+#~ "Connection to server lost (no data received within %d seconds)"
+#~ msgstr[0] ""
+#~ "S'ha perdut la connexió al servidor (fa %d segon que no s'hi reben dades)"
+#~ msgstr[1] ""
+#~ "S'ha perdut la connexió al servidor (fa %d segons que no s'hi reben dades)"
+
+#~ msgid "Keep alive error"
+#~ msgstr "Error de permanència"
+
+#~ msgid ""
+#~ "Lost connection with server:\n"
+#~ "%d, %s"
+#~ msgstr ""
+#~ "S'ha perdut la connexió amb el servidor:\n"
+#~ "%d, %s"
+
+#~ msgid "Connecting server ..."
+#~ msgstr "S'està connectant al servidor..."
+
+#~ msgid "Failed to send IM."
+#~ msgstr "No s'ha pogut enviar la MI."
+
+#~ msgid "Not a member of room \"%s\"\n"
+#~ msgstr "No sou un membre de la sala «%s»\n"
+
+#~ msgid "User information for %s unavailable"
+#~ msgstr "Dades de l'usuari %s no disponibles"
+
+#~ msgid ""
+#~ "You are using %s version %s.  The current version is %s.  You can get it "
+#~ "from <a href=\"%s\">%s</a><hr>"
+#~ msgstr ""
+#~ "Esteu emprant la versió %s del %s. La versió actual és %s, la podeu "
+#~ "obtenir de <a href=\"%s\">%s</a><hr>"
+
+#~ msgid "<b>ChangeLog:</b><br>%s"
+#~ msgstr "<b>Registre de canvis:</b><br>%s"
+
 #~ msgid "A group with the name already exists."
 #~ msgstr "Ja existeix un grup amb aquest nom."
 
@@ -14217,13 +14148,8 @@
 #~ msgid "Blood Type"
 #~ msgstr "Tipus de sang"
 
-#, fuzzy
 #~ msgid "Update information"
-#~ msgstr "Actualitza la meva informació"
-
-#, fuzzy
-#~ msgid "Successed:"
-#~ msgstr "Velocitat:"
+#~ msgstr "Actualitza la informació"
 
 #~ msgid ""
 #~ "Setting custom faces is not currently supported. Please choose an image "
@@ -14244,14 +14170,6 @@
 #~ msgid "Add buddy with auth request failed"
 #~ msgstr "Ha fallat la sol·licitut per afegir un amic amb autorització"
 
-#, fuzzy
-#~ msgid "Add into %d's buddy list"
-#~ msgstr "No s'ha pogut carregar la llista d'amics"
-
-#, fuzzy
-#~ msgid "QQ Number Error"
-#~ msgstr "Número QQ"
-
 #~ msgid "Group Description"
 #~ msgstr "Descripció del grup"
 
@@ -14261,26 +14179,12 @@
 #~ msgid "Approve"
 #~ msgstr "Aprova"
 
-#, fuzzy
-#~ msgid "Successed to join Qun %d, operated by admin %d"
-#~ msgstr ""
-#~ "L'administrador %2$d ha rebutjat la vostra sol·liciut per entrar al grup %"
-#~ "1$d"
-
-#, fuzzy
-#~ msgid "[%d] removed from Qun \"%d\""
-#~ msgstr "Vós [%d] heu sortit del grup «%d»"
-
-#, fuzzy
-#~ msgid "[%d] added to Qun \"%d\""
-#~ msgstr "Vós [%d] heu estat afegit al grup «%d»"
-
 #~ msgid "I am a member"
 #~ msgstr "En sóc membre"
 
-#, fuzzy
+# FIXME? (hi demano [entrar]?)
 #~ msgid "I am requesting"
-#~ msgstr "Sol·licitud incorrecta"
+#~ msgstr "Demano"
 
 #~ msgid "I am the admin"
 #~ msgstr "En sóc l'administrador"
@@ -14288,10 +14192,6 @@
 #~ msgid "Unknown status"
 #~ msgstr "Estat desconegut"
 
-#, fuzzy
-#~ msgid "Remove from Qun"
-#~ msgstr "Suprimeix el grup"
-
 #~ msgid "You entered a group ID outside the acceptable range"
 #~ msgstr "Heu entrat un identificador de grup fora del rang"
 
@@ -14301,24 +14201,6 @@
 #~ msgid "Do you want to approve the request?"
 #~ msgstr "Voleu aprovar aquesta sol·licitud?"
 
-#, fuzzy
-#~ msgid "Change Qun member"
-#~ msgstr "Número de telèfon"
-
-#, fuzzy
-#~ msgid "Change Qun information"
-#~ msgstr "Informació del canal"
-
-# Gnome_2.6_Extras [rhythmbox.HEAD.ca.po]
-#, fuzzy
-#~ msgid ""
-#~ "%s\n"
-#~ "\n"
-#~ "%s"
-#~ msgstr ""
-#~ "%s:\n"
-#~ "%s"
-
 #~ msgid "System Message"
 #~ msgstr "Missatge del sistema"
 
@@ -14331,64 +14213,47 @@
 #~ msgid "Set My Information"
 #~ msgstr "Estableix la meva informació"
 
-#, fuzzy
-#~ msgid "Leave the QQ Qun"
-#~ msgstr "Surt d'aquest Qun QQ"
-
 #~ msgid "Block this buddy"
 #~ msgstr "Bloca aquest usuari"
 
-#, fuzzy
 #~ msgid "Error password: %s"
-#~ msgstr "S'ha produït un error en canviar la contrasenya"
-
-#, fuzzy
+#~ msgstr "Error en la contrasenya: %s"
+
 #~ msgid "Failed to connect all servers"
-#~ msgstr "No s'ha pogut connectar al servidor."
-
-#, fuzzy
+#~ msgstr "No s'han pogut connectar tots els servidors"
+
 #~ msgid "Connecting server %s, retries %d"
-#~ msgstr ""
-#~ "S'ha produït un error de connexió del servidor %s:\n"
-#~ "%s"
-
-#, fuzzy
+#~ msgstr "S'està connectant al servidor %s, %d reintents"
+
 #~ msgid "Do you approve the requestion?"
 #~ msgstr "Voleu aprovar aquesta sol·licitud?"
 
-#, fuzzy
 #~ msgid "Do you add the buddy?"
 #~ msgstr "Voleu afegir aquest amic?"
 
-#, fuzzy
 #~ msgid "%s added you [%s] to buddy list"
 #~ msgstr "%s us ha afegit [%s] a la seva llista d'amics"
 
-#, fuzzy
 #~ msgid "QQ Budy"
-#~ msgstr "Amic"
+#~ msgstr "Amic QQ"
+
+#~ msgid "Requestion approved by %s"
+#~ msgstr "%s ha aprovat la sol.licitud"
 
 #~ msgid "%s wants to add you [%s] as a friend"
 #~ msgstr "%s us vol afegir [%s] com a amic"
 
-#, fuzzy
 #~ msgid "%s is not in buddy list"
 #~ msgstr "%s no és a la vostra llista d'amics"
 
-#, fuzzy
 #~ msgid "Would you add?"
 #~ msgstr "Voleu afegir-lo?"
 
 #~ msgid "%s"
 #~ msgstr "%s"
 
-#, fuzzy
-#~ msgid "QQ Server Notice"
-#~ msgstr "Port en el servidor"
-
-#, fuzzy
 #~ msgid "Network disconnected"
-#~ msgstr "El remot s'ha desconnectat"
+#~ msgstr "La xarxa s'ha desconnectat"
 
 #~ msgid "developer"
 #~ msgstr "desenvolupador"
@@ -14399,33 +14264,6 @@
 #~ msgid "Artists"
 #~ msgstr "Artistes"
 
-#~ msgid ""
-#~ "You are using %s version %s.  The current version is %s.  You can get it "
-#~ "from <a href=\"%s\">%s</a><hr>"
-#~ msgstr ""
-#~ "Esteu emprant la versió %s del %s. La versió actual és %s, la podeu "
-#~ "obtenir de <a href=\"%s\">%s</a><hr>"
-
-#~ msgid "<b>ChangeLog:</b><br>%s"
-#~ msgstr "<b>Registre de canvis:</b><br>%s"
-
-#~ msgid "EOF while reading from resolver process"
-#~ msgstr ""
-#~ "S'ha arribat al final del fitxer (EOF) en llegir del procés resoledor"
-
-#~ msgid "Error setting socket options"
-#~ msgstr "S'ha produït un error en establir les opcions del sòcol"
-
-#~ msgid ""
-#~ "Windows Live ID authentication: cannot find authenticate token in server "
-#~ "response"
-#~ msgstr ""
-#~ "Autenticació amb el Windows Live ID: no s'ha pogut trobar el testimoni "
-#~ "d'autenticació al servidor"
-
-#~ msgid "Windows Live ID authentication Failed"
-#~ msgstr "No s'ha pogut autenticar amb el Windows Live ID"
-
 #~ msgid "Too evil (sender)"
 #~ msgstr "Massa malvat (remitent)"
 
@@ -14441,86 +14279,6 @@
 #~ msgid "<i>(retrieving)</i>"
 #~ msgstr "<i>(s'està recuperant)</i>"
 
-#~ msgid "Your information has been updated"
-#~ msgstr "S'ha actualitzat la vostra informació"
-
-#~ msgid "Input your reason:"
-#~ msgstr "Indiqueu-ne el motiu:"
-
-#~ msgid "You have successfully removed a buddy"
-#~ msgstr "Heu suprimit amb èxit un amic"
-
-#~ msgid "You have successfully removed yourself from your friend's buddy list"
-#~ msgstr "Us heu suprimit amb èxit de la llista d'amics del vostre amic"
-
-#~ msgid "You have added %d to buddy list"
-#~ msgstr "Heu afegit %d a la llista d'amics"
-
-#~ msgid "Invalid QQid"
-#~ msgstr "QQid invàlid"
-
-#~ msgid "Please enter external group ID"
-#~ msgstr "Introduïu l'ID del grup extern"
-
-#~ msgid "Reason: %s"
-#~ msgstr "Motiu: %s"
-
-#~ msgid "Your request to join group %d has been approved by admin %d"
-#~ msgstr ""
-#~ "L'administrador %2$d ha aprovat la vostra sol·liciud per entrar al grup %1"
-#~ "$d"
-
-#~ msgid "This group has been added to your buddy list"
-#~ msgstr "S'ha afegit aquest grup a la vostra llista d'amics"
-
-#~ msgid "I am applying to join"
-#~ msgstr "Estic sol·licitant entrar-hi"
-
-#~ msgid "You have successfully left the group"
-#~ msgstr "Heu sortit del grup correctament"
-
-#~ msgid "QQ Group Auth"
-#~ msgstr "Autorització de grup QQ"
-
-#~ msgid "Your authorization request has been accepted by the QQ server"
-#~ msgstr "El servidor QQ ha acceptat la sol·licitud d'autorització"
-
-#~ msgid "Code [0x%02X]: %s"
-#~ msgstr "Codi [0x%02X]: %s"
-
-#~ msgid "Group Operation Error"
-#~ msgstr "S'ha produït un error d'orientació del grup"
-
-#~ msgid "Enter your reason:"
-#~ msgstr "Indiqueu-ne el motiu:"
-
-#~ msgid "Error requesting login token"
-#~ msgstr "S'ha produït un error en sol·licitar un testimoni d'entrada"
-
-#~ msgid "Unable to login. Check debug log."
-#~ msgstr "No s'ha pogut connectar, comproveu el registre de depuració."
-
-#~ msgid "Unable to login"
-#~ msgstr "No s'ha connectar"
-
-#~ msgid "TCP Address"
-#~ msgstr "Adreça TCP"
-
-#~ msgid "UDP Address"
-#~ msgstr "Adreça UDP"
-
-#~ msgid "Show Login Information"
-#~ msgstr "Mostra informació de la connexió"
-
-#~ msgid "Login failed, no reply"
-#~ msgstr "Ha fallat l'entrada, no s'ha obtingut resposta"
-
-#~ msgid "User %s rejected your request"
-#~ msgstr "L'usuari %s ha declinat la vostra sol·licitud"
-
-#~ msgid "User %s approved your request"
-#~ msgstr "L'usuari %s ha acceptat la vostra sol·licitud"
-
 #~ msgid "Screen name:"
 #~ msgstr "Nom d'usuari:"
 
@@ -15521,6 +15279,9 @@
 #~ msgid "Reject Call"
 #~ msgstr "Rebutja la trucada"
 
+#~ msgid "Connected to %s"
+#~ msgstr "S'ha connectat a %s"
+
 #~ msgid "_Mute"
 #~ msgstr "_Silencia"
 
@@ -15941,9 +15702,6 @@
 #~ msgid "Away title: "
 #~ msgstr "Motiu de l'absència: "
 
-#~ msgid "Buddy List Error"
-#~ msgstr "Error en la llista d'amics"
-
 #~ msgid ""
 #~ "\n"
 #~ "Mark all accounts as \"away\" with the default message.\n"
--- a/po/de.po	Sat Dec 13 10:52:10 2008 +0000
+++ b/po/de.po	Mon Dec 15 23:10:39 2008 +0000
@@ -12,8 +12,8 @@
 msgstr ""
 "Project-Id-Version: de\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2008-12-12 17:46+0100\n"
-"PO-Revision-Date: 2008-12-12 17:42+0100\n"
+"POT-Creation-Date: 2008-12-15 10:46+0100\n"
+"PO-Revision-Date: 2008-12-15 10:46+0100\n"
 "Last-Translator: Jochen Kemnade <jochenkemnade@web.de>\n"
 "Language-Team: German <de@li.org>\n"
 "MIME-Version: 1.0\n"
@@ -2907,10 +2907,10 @@
 msgstr "Hostname oder Portnummer ihres Proxys sind falsch angegeben."
 
 msgid "Token Error"
-msgstr "Kürzel-Fehler"
+msgstr "Token-Fehler"
 
 msgid "Unable to fetch the token.\n"
-msgstr "Kann das Kürzel nicht abholen.\n"
+msgstr "Kann das Token nicht abholen.\n"
 
 msgid "Save Buddylist..."
 msgstr "Buddy-Liste speichern..."
@@ -2962,10 +2962,10 @@
 msgstr "Passwort (nochmal)"
 
 msgid "Enter current token"
-msgstr "Geben Sie das aktuelle Kürzel ein"
+msgstr "Geben Sie das aktuelle Token ein"
 
 msgid "Current token"
-msgstr "Aktuelles Kürzel"
+msgstr "Aktuelles Token"
 
 msgid "Register New Gadu-Gadu Account"
 msgstr "Registrierung eines neuen Gadu-Gadu-Kontos"
@@ -4311,7 +4311,7 @@
 msgstr "Server überlastet"
 
 msgid "Service Unavailable"
-msgstr "Dienst nicht erreichbar"
+msgstr "Dienst nicht verfügbar"
 
 msgid "Subscription Required"
 msgstr "Abonnement erforderlich"
@@ -4691,7 +4691,7 @@
 msgstr "Kann „%s“ nicht hinzufügen."
 
 msgid "Buddy Add error"
-msgstr ""
+msgstr "Fehler beim Hinzufügen des Buddys"
 
 msgid "The username specified does not exist."
 msgstr "Der angegebene Benutzername existiert nicht."
@@ -4964,11 +4964,10 @@
 msgstr "Nachricht"
 
 msgid "Playing a game"
-msgstr ""
-
-#, fuzzy
+msgstr "Spielt ein Spiel"
+
 msgid "Working"
-msgstr "Geschäftlich"
+msgstr "Arbeitet"
 
 msgid "Has you"
 msgstr "Hat Sie"
@@ -5006,13 +5005,11 @@
 msgid "Album"
 msgstr "Album"
 
-#, fuzzy
 msgid "Game Title"
-msgstr "Titel anpassen"
-
-#, fuzzy
+msgstr "Spieltitel"
+
 msgid "Office Title"
-msgstr "Titel anpassen"
+msgstr "Dienststellenbezeichnung"
 
 msgid "Set Friendly Name..."
 msgstr "Setze Spitzname..."
@@ -7184,7 +7181,7 @@
 msgstr "Sichtbar"
 
 msgid "Friend Only"
-msgstr ""
+msgstr "Nur Freund"
 
 msgid "Private"
 msgstr "Privat"
@@ -7204,9 +7201,8 @@
 msgid "Phone Number"
 msgstr "Telefonnummer"
 
-#, fuzzy
 msgid "Authorize adding"
-msgstr "Buddy autorisieren?"
+msgstr "Hinzufügen autorisieren?"
 
 msgid "Cellphone Number"
 msgstr "Handy-Telefonnummer"
@@ -7221,9 +7217,8 @@
 msgid "Publish Mobile"
 msgstr "Handy (privat)"
 
-#, fuzzy
 msgid "Publish Contact"
-msgstr "Kontakt-Alias"
+msgstr "Kontakt veröffentlichen"
 
 msgid "College"
 msgstr "College"
@@ -7234,17 +7229,14 @@
 msgid "Zodiac"
 msgstr "Sternzeichen"
 
-#, fuzzy
 msgid "Blood"
-msgstr "Blockiert"
-
-#, fuzzy
+msgstr "Blutgruppe"
+
 msgid "True"
-msgstr "Stier"
-
-#, fuzzy
+msgstr "Wahr"
+
 msgid "False"
-msgstr "Gescheitert"
+msgstr "Falsch"
 
 msgid "Modify Contact"
 msgstr "Kontakt bearbeiten"
@@ -7268,9 +7260,8 @@
 msgid "%u requires verification"
 msgstr "%u erfordert Autorisierung"
 
-#, fuzzy
 msgid "Add buddy question"
-msgstr "Benutzer zu Ihrer Buddy-Liste hinzufügen?"
+msgstr "Buddy-Frage hinzufügen"
 
 msgid "Enter answer here"
 msgstr "Antwort hier eingeben"
@@ -7279,22 +7270,20 @@
 msgstr "Senden"
 
 msgid "Invalid answer."
-msgstr "Ungültige Antwort"
+msgstr "Ungültige Antwort."
 
 msgid "Authorization denied message:"
 msgstr "Nachricht für die Ablehnung der Autorisierung:"
 
-#, fuzzy
 msgid "Sorry, you're not my style."
-msgstr "Tut mir Leid, du bist nicht mein Typ..."
+msgstr "Tut mir Leid, du bist nicht mein Typ."
 
 #, c-format
 msgid "%u needs authorization"
 msgstr "%u benötigt Authorisierung"
 
-#, fuzzy
 msgid "Add buddy authorize"
-msgstr "Benutzer zu Ihrer Buddy-Liste hinzufügen?"
+msgstr "Buddy-Autorisierung hinzufügen"
 
 msgid "Enter request here"
 msgstr "Anfrage hier eingeben"
@@ -7311,9 +7300,8 @@
 msgid "Invalid QQ Number"
 msgstr "Ungültige QQ-Nummer"
 
-#, fuzzy
 msgid "Failed sending authorize"
-msgstr "Bitte autorisiere mich!"
+msgstr "Senden der Autorisierung fehlgeschlagen"
 
 #, c-format
 msgid "Failed removing buddy %u"
@@ -7360,24 +7348,20 @@
 msgid "(Invalid UTF-8 string)"
 msgstr "(Ungültige UTF8-Zeichenkette)"
 
-#, fuzzy
 msgid "Not member"
-msgstr "Ich bin kein Mitglied"
+msgstr "Kein Mitglied"
 
 msgid "Member"
 msgstr "Mitglied"
 
-#, fuzzy
 msgid "Requesting"
-msgstr "Anfrage-Dialog"
-
-#, fuzzy
+msgstr "Frage an"
+
 msgid "Admin"
-msgstr "Adium"
-
-#, fuzzy
+msgstr "Admin"
+
 msgid "Notice"
-msgstr "Bemerkung:"
+msgstr "Bemerkung"
 
 msgid "Detail"
 msgstr "Detail"
@@ -7430,9 +7414,8 @@
 "Beachten Sie, dass diese Operation den Qun entfernen könnte, \n"
 "wenn Sie der Ersteller sind."
 
-#, fuzzy
 msgid "Sorry, you are not our style"
-msgstr "Tut mir Leid, du bist nicht mein Typ..."
+msgstr "Tut mir Leid, du bist nicht unser Typ"
 
 msgid "Successfully changed Qun members"
 msgstr "Qun-Mitglieder erfolgreich geändert"
@@ -7469,9 +7452,9 @@
 msgid "<b>Removed buddy %u.</b>"
 msgstr "<b>Buddy %u entfernt</b>"
 
-#, fuzzy, c-format
+#, c-format
 msgid "<b>New buddy %u joined.</b>"
-msgstr "Buddy entfernen"
+msgstr "<b>Neuer Buddy %u ist beigetreten.</b>"
 
 #, c-format
 msgid "Unknown-%d"
@@ -7507,21 +7490,20 @@
 msgid "Invalid name"
 msgstr "QQ: Ungültiger Name"
 
-#, fuzzy
 msgid "Select icon..."
-msgstr "Ordner auswählen..."
-
-#, fuzzy, c-format
+msgstr "Icon wählen..."
+
+#, c-format
 msgid "<b>Login time</b>: %d-%d-%d, %d:%d:%d<br>\n"
-msgstr "<b>Anmeldezeit</b>: %s<br>\n"
-
-#, fuzzy, c-format
+msgstr "<b>Anmeldezeit</b>: %d-%d-%d, %d:%d:%d<br>\n"
+
+#, c-format
 msgid "<b>Total Online Buddies</b>: %d<br>\n"
-msgstr "<b>Aktuell online:</b> %d<br>\n"
-
-#, fuzzy, c-format
+msgstr "<b>Insgesamt online</b>: %d<br>\n"
+
+#, c-format
 msgid "<b>Last Refresh</b>: %d-%d-%d, %d:%d:%d<br>\n"
-msgstr "<b>Letzte Aktualisierung</b>: %s<br>\n"
+msgstr "<b>Letzte Aktualisierung</b>: %d-%d-%d, %d:%d:%d<br>\n"
 
 #, c-format
 msgid "<b>Server</b>: %s<br>\n"
@@ -7535,9 +7517,9 @@
 msgid "<b>Connection Mode</b>: %s<br>\n"
 msgstr "<b>Verbindungsmodus</b>: %s<br>\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "<b>My Internet IP</b>: %s:%d<br>\n"
-msgstr "<b>Meine Internet-Adresse</b>: %s<br>\n"
+msgstr "<b>Meine Internet-IP</b>: %s:%d<br>\n"
 
 #, c-format
 msgid "<b>Sent</b>: %lu<br>\n"
@@ -7559,9 +7541,9 @@
 msgid "<b>Received Duplicate</b>: %lu<br>\n"
 msgstr "<b>Duplikat empfangen</b>: %lu<br>\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid "<b>Time</b>: %d-%d-%d, %d:%d:%d<br>\n"
-msgstr "<b>Anmeldezeit</b>: %s<br>\n"
+msgstr "<b>Zeit</b>: %d-%d-%d, %d:%d:%d<br>\n"
 
 #, c-format
 msgid "<b>IP</b>: %s<br>\n"
@@ -7574,21 +7556,19 @@
 msgstr "<p><b>Original-Autor</b>:<br>\n"
 
 msgid "<p><b>Code Contributors</b>:<br>\n"
-msgstr ""
-
-#, fuzzy
+msgstr "<p><b>Code-Mitwirkende</b>:<br>\n"
+
 msgid "<p><b>Lovely Patch Writers</b>:<br>\n"
-msgstr "<b>Letzte Aktualisierung</b>: %s<br>\n"
-
-#, fuzzy
+msgstr "<p><b>Wunderbare Patch-Schreiber</b>:<br>\n"
+
 msgid "<p><b>Acknowledgement</b>:<br>\n"
-msgstr "<b>Gesendet</b>: %lu<br>\n"
+msgstr "<p><b>Bestätigung</b>:<br>\n"
 
 msgid "<p><i>And, all the boys in the backroom...</i><br>\n"
-msgstr ""
+msgstr "<p><i>Und all die Jungs im Hinterzimmer...</i><br>\n"
 
 msgid "<i>Feel free to join us!</i> :)"
-msgstr ""
+msgstr "<i>Treten Sie uns bei, wenn Sie mögen!</i> :)"
 
 #, c-format
 msgid "About OpenQ %s"
@@ -7657,7 +7637,7 @@
 
 #, c-format
 msgid "Failed requesting token, 0x%02X"
-msgstr ""
+msgstr "Fehler beim Anfordern des Tokens, 0x%02X"
 
 #, c-format
 msgid "Invalid token len, %d"
@@ -7665,7 +7645,7 @@
 
 #. extend redirect used in QQ2006
 msgid "Redirect_EX is not currently supported"
-msgstr ""
+msgstr "Redirect_EX wird im Moment nicht unterstützt"
 
 #. need activation
 #. need activation
@@ -7673,49 +7653,45 @@
 msgid "Activation required"
 msgstr "Aktivierung erforderlich"
 
-#, fuzzy, c-format
+#, c-format
 msgid "Unknown reply code when logging in (0x%02X)"
-msgstr "Anmeldung nicht möglich, unbekannter Antwort-Code 0x%02X"
+msgstr "Unbekannte Antwort bei der Anmeldung (0x%02X)"
 
 msgid "Could not decrypt server reply"
 msgstr "Konnte die Antwort des Servers nicht entschlüsseln"
 
-#, fuzzy
 msgid "Requesting captcha"
-msgstr "Bitte um %ss Aufmerksamkeit..."
-
-#, fuzzy
+msgstr "Captcha anfordern"
+
 msgid "Checking captcha"
-msgstr "Bitte um %ss Aufmerksamkeit..."
-
-#, fuzzy
+msgstr "Captcha überprüfen"
+
 msgid "Failed captcha verification"
-msgstr "Yahoo-Authentifizierung fehlgeschlagen"
-
-#, fuzzy
+msgstr "Captcha-Überprüfung fehlgeschlagen"
+
 msgid "Captcha Image"
-msgstr "Bild speichern"
-
-#, fuzzy
+msgstr "Captcha-Bild"
+
 msgid "Enter code"
-msgstr "Geben Sie ein Passwort ein"
-
-#, fuzzy
+msgstr "Geben Sie den Code ein"
+
 msgid "QQ Captcha Verification"
-msgstr "SSL-Zertifikatsüberprüfung"
+msgstr "QQ-Captcha-Überprüfung"
 
 msgid "Enter the text from the image"
 msgstr "Bitte geben Sie den Text aus dem Bild ein"
 
-#, fuzzy, c-format
+#, c-format
 msgid "Unknown reply when checking password (0x%02X)"
-msgstr "Anmeldung nicht möglich, unbekannter Antwort-Code 0x%02X"
-
-#, fuzzy, c-format
+msgstr "Unbekannte Antwort bei Überprüfungen des Passwortes (0x%02X)"
+
+#, c-format
 msgid ""
 "Unknown reply code when logging in (0x%02X):\n"
 "%s"
-msgstr "Anmeldung nicht möglich, unbekannter Antwort-Code 0x%02X"
+msgstr ""
+"Unbekannte Antwort bei der Anmeldung (0x%02X):\n"
+"%s"
 
 #. we didn't successfully connect. tdt->toc_fd is valid here
 msgid "Unable to connect."
@@ -7733,13 +7709,11 @@
 msgid "Connection lost"
 msgstr "Verbindung verloren"
 
-#, fuzzy
 msgid "Getting server"
-msgstr "Benutzer-Info setzen..."
-
-#, fuzzy
+msgstr "Hole server"
+
 msgid "Requesting token"
-msgstr "Anfragekürzel"
+msgstr "Fordere Token an"
 
 msgid "Couldn't resolve host"
 msgstr "Kann den Hostnamen nicht auflösen"
@@ -7773,22 +7747,24 @@
 msgid "From %s:"
 msgstr "Von %s:"
 
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "Server notice From %s: \n"
 "%s"
-msgstr "Anleitung vom Server: %s"
+msgstr ""
+"Servernotiz von %s: \n"
+"%s"
 
 msgid "Unknown SERVER CMD"
 msgstr "Unbekanntes SERVER-CMD"
 
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "Error reply of %s(0x%02X)\n"
 "Room %u, reply 0x%02X"
 msgstr ""
-"Fehlerantwort %s(0x%02X)\n"
-"Raum %d, Antwort 0x%02X"
+"Fehlerantwort von %s(0x%02X)\n"
+"Raum %u, Antwort 0x%02X"
 
 msgid "QQ Qun Command"
 msgstr "QQ-Qun-Kommando"
@@ -9288,6 +9264,9 @@
 msgid "SIP usernames may not contain whitespaces or @ symbols"
 msgstr "SIP-Benutzernamen dürfen keine Leerzeichen oder @-Symbole enthalten"
 
+msgid "SIP connect server not specified"
+msgstr "SIP-Verbindungsserver nicht angegeben"
+
 #. *< type
 #. *< ui_requirement
 #. *< flags
@@ -10393,7 +10372,7 @@
 msgid "Protocol"
 msgstr "Protokoll"
 
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "<span size='larger' weight='bold'>Welcome to %s!</span>\n"
 "\n"
@@ -10408,9 +10387,9 @@
 "<span size='larger' weight='bold'>Willkommen bei %s!</span>\n"
 "\n"
 "Sie haben keine IM-Konten konfiguriert. Um sich mit %s zu verbinden, drücken "
-"Sie unten auf den <b>Hinzufügen</b>-Button und konfigurieren Sie Ihr erstes "
-"Konto. Wenn Sie mehrere IM-Konten mit %s benutzen wollen, drücken Sie erneut "
-"auf <b>Hinzufügen</b> um sie einzurichten.\n"
+"Sie unten auf den <b>Hinzufügen...</b>-Button und konfigurieren Sie Ihr "
+"erstes Konto. Wenn Sie mehrere IM-Konten mit %s benutzen wollen, drücken Sie "
+"erneut auf <b>Hinzufügen...</b> um sie einzurichten.\n"
 "\n"
 "Sie können später über <b>Konten->Konten verwalten</b> im Buddy-"
 "Listenfenster zu diesem Dialog zurückkehren und Konten hinzufügen, "
--- a/share/ca-certs/Makefile.am	Sat Dec 13 10:52:10 2008 +0000
+++ b/share/ca-certs/Makefile.am	Mon Dec 15 23:10:39 2008 +0000
@@ -3,19 +3,27 @@
 		CAcert_Class3.pem \
 		Equifax_Secure_CA.pem \
 		GTE_CyberTrust_Global_Root.pem \
-		Microsoft_Internet_Authority.pem \
-		Microsoft_Secure_Server_Authority.pem \
 		StartCom_Free_SSL_CA.pem \
 		Verisign_RSA_Secure_Server_CA.pem \
 		Verisign_Class3_Primary_CA.pem \
 		VeriSign_Class_3_Public_Primary_Certification_Authority_-_G5.pem
 
-if INSTALL_SSL_CERTIFICATES
+EXTRA_CERTS = \
+		Microsoft_Internet_Authority.pem \
+		Microsoft_Secure_Server_Authority.pem
+
+
 cacertsdir =	$(datadir)/purple/ca-certs
-cacerts_DATA =	$(CERTIFICATES)
+
+if INSTALL_SSL_CERTIFICATES
+cacerts_DATA = \
+	$(CERTIFICATES) \
+	$(EXTRA_CERTS)
+else
+cacerts_DATA = $(EXTRA_CERTS)
 endif
 
 EXTRA_DIST =	\
 		Makefile.mingw \
-		$(CERTIFICATES)
-
+		$(CERTIFICATES) \
+		$(EXTRA_CERTS)
--- a/share/ca-certs/Microsoft_Internet_Authority.pem	Sat Dec 13 10:52:10 2008 +0000
+++ b/share/ca-certs/Microsoft_Internet_Authority.pem	Mon Dec 15 23:10:39 2008 +0000
@@ -1,24 +1,29 @@
------BEGIN CERTIFICATE-----
-MIIECzCCA3SgAwIBAgIEBAAD/jANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQGEwJV
-UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU
-cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds
-b2JhbCBSb290MB4XDTA2MDQxOTE0MzUwMFoXDTA5MDQxOTIzNTkwMFowJzElMCMG
-A1UEAxMcTWljcm9zb2Z0IEludGVybmV0IEF1dGhvcml0eTCCASIwDQYJKoZIhvcN
-AQEBBQADggEPADCCAQoCggEBALUIbk0YdsTXnGPswqx8d/Ntrsjy8Wau8cKHBGBu
-KZwAZe5qW+QOU4gRxiKbM/trspEu1lObU77PVtiZSqFQMkXOYNLhlq1a/eqh68RJ
-Jxxev9KWmfppQ388ONqhi8wziHoXc66RUCiqabp751dbmwnnTN6GfIR952Zg+ab1
-wmGL3o7B1efCMCI9LIMKsId16yHiXKbTBHuWnkAe4Qx2BMAgoJQQ21EbTBhyvCfd
-EiRdOdYo1OTe2xih4JUPmXf7xPNDjMCrpjEJ8woxgCnH12z7PNPqwrhnFe/6808t
-axy4iNgObXcZS3ERcZBA9RFT1z3onQ2E2plkaBPmZQPiZu0CAwEAAaOCAXAwggFs
-MEUGA1UdHwQ+MDwwOqA4oDaGNGh0dHA6Ly93d3cucHVibGljLXRydXN0LmNvbS9j
-Z2ktYmluL0NSTC8yMDE4L2NkcC5jcmwwHQYDVR0OBBYEFDNf3Q+3nFzO7ofdcHCL
-X33PIry5MFQGA1UdIARNMEswSQYKKoZIhvhjAQIBBTA7MDkGCCsGAQUFBwIBFi1o
-dHRwOi8vd3d3LnB1YmxpYy10cnVzdC5jb20vQ1BTL09tbmlSb290Lmh0bWwwgYkG
-A1UdIwSBgTB/oXmkdzB1MQswCQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBv
-cmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4x
-IzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEdsb2JhbCBSb290ggIBpTAOBgNVHQ8B
-Af8EBAMCAYYwEgYDVR0TAQH/BAgwBgEB/wIBAjANBgkqhkiG9w0BAQUFAAOBgQBj
-SQlU7cXbnngZAIOa4zci+1Z2XFTTyOFc/Tfc0qU/xVWPZPBJdx2UVk2yCwmIHFBY
-OJSQC+7Kn7GE5nE3rBAyBrnB0oymBcBeD8tT3B4B31jHfnFgsC9UYin9uJN144+e
-tbzOegUg4qaNApAaWGre3YY7ALn1y/6XgqIEIEZcCQ==
------END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIFCjCCBHOgAwIBAgIEBycWdTANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQGEwJV
+UzEYMBYGA1UEChMPR1RFIENvcnBvcmF0aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJU
+cnVzdCBTb2x1dGlvbnMsIEluYy4xIzAhBgNVBAMTGkdURSBDeWJlclRydXN0IEds
+b2JhbCBSb290MB4XDTA4MDIxOTE4MjcwMloXDTExMDIxOTE4MjQ1M1owJzElMCMG
+A1UEAxMcTWljcm9zb2Z0IEludGVybmV0IEF1dGhvcml0eTCCAiIwDQYJKoZIhvcN
+AQEBBQADggIPADCCAgoCggIBAKiloatvDehDG/rQriel2AC9qmSJdvjKb2fmJf30
+K7SaC3zQu8kGQxENUEFsHsH0jmBejJ9vvn9tHZ8hGL+kORvWUVBskdMzP65rC0V0
+VeVgUYzPZ7MvrLfhh9+v3yJ7qRuf1aNgmzJg5t1AA91X+aRrFT4lRzl9BFWhQ1VS
+XaD7l6qoiyhD8FbrdLRAe61swsRmzWeXoy6NJpOBsGXaCSG1Jooylro+zkWxt97c
+NkNf/wYqoYcIXo02YpFbwreveejW9a0Lh/1z9+e9aiMtC5QnPT57GTqNINt5R0rp
+Iz4g3GJhmjXVoVF/tev5DMJuhRgPoz0W0aA3UnSmTWh2RFvgqawLqSRrKUhVjySi
+/m5s62uG5xxIftO7/6ljzS061CFoV/RBl/I3WghYp04sr4cSXWa/rL449YhBT8BJ
+jltefWCYAOcT1nA4oFXwXbl1qCUIkZ0bqwju2FGW5vl2qh6vmzcQjc3XxD0m2UqC
+yJNFa9SUgVXtUCqeOI+KqgLW01tpqZteG10byWKmppTVAvdPwHoGE0bl6wBwXldE
+f7Pn4lqu6Yp4bedP3Qv1sfp2H7D98cxSwYRt3UcXN2kjTPv+pby2fEHm9GWf3iE/
+7OtzUI7LYhP7+rGyuCYTtZKH1jDWHrTZBpnAPmrAQQHCI8/4TjF9ZQ1mqRi6x9I9
+9XGfAgMBAAGjggFvMIIBazASBgNVHRMBAf8ECDAGAQH/AgEBMFMGA1UdIARMMEow
+SAYJKwYBBAGxPgEAMDswOQYIKwYBBQUHAgEWLWh0dHA6Ly9jeWJlcnRydXN0Lm9t
+bmlyb290LmNvbS9yZXBvc2l0b3J5LmNmbTAOBgNVHQ8BAf8EBAMCAYYwgYkGA1Ud
+IwSBgTB/oXmkdzB1MQswCQYDVQQGEwJVUzEYMBYGA1UEChMPR1RFIENvcnBvcmF0
+aW9uMScwJQYDVQQLEx5HVEUgQ3liZXJUcnVzdCBTb2x1dGlvbnMsIEluYy4xIzAh
+BgNVBAMTGkdURSBDeWJlclRydXN0IEdsb2JhbCBSb290ggIBpTBFBgNVHR8EPjA8
+MDqgOKA2hjRodHRwOi8vd3d3LnB1YmxpYy10cnVzdC5jb20vY2dpLWJpbi9DUkwv
+MjAxOC9jZHAuY3JsMB0GA1UdDgQWBBTG27vA2CAZkvFg/IjxWH+8G06PGjANBgkq
+hkiG9w0BAQUFAAOBgQBnSDXCyiqGmHTAEJOtZYVm/IbzGtzCY423NF6/yuccYZkm
+spJnDoh8nq3nx3P2KBEyPAqoQ1MEFC+ByQjV4AAQ9dMQALUGNRfHhFUhBeeIybYd
+bzvKOxSlIYSwO2T56+oXyDlkbQWKmHec5qzCE0lwGHslsRU/CHwhuFu2nH+CxQ==
+-----END CERTIFICATE-----
--- a/share/ca-certs/Microsoft_Secure_Server_Authority.pem	Sat Dec 13 10:52:10 2008 +0000
+++ b/share/ca-certs/Microsoft_Secure_Server_Authority.pem	Mon Dec 15 23:10:39 2008 +0000
@@ -1,30 +1,35 @@
 -----BEGIN CERTIFICATE-----
-MIIFEzCCA/ugAwIBAgIKYQVOAQADAAAAHDANBgkqhkiG9w0BAQUFADAnMSUwIwYD
-VQQDExxNaWNyb3NvZnQgSW50ZXJuZXQgQXV0aG9yaXR5MB4XDTA3MDkyODIyMDYz
-N1oXDTA5MDQxOTIzNTkwMFowgYsxEzARBgoJkiaJk/IsZAEZFgNjb20xGTAXBgoJ
+MIIGEzCCA/ugAwIBAgIKYRZtLwAEAAAAIDANBgkqhkiG9w0BAQUFADAnMSUwIwYD
+VQQDExxNaWNyb3NvZnQgSW50ZXJuZXQgQXV0aG9yaXR5MB4XDTA4MDQwOTIxMzc1
+NFoXDTExMDIxOTE4MjQ1M1owgYsxEzARBgoJkiaJk/IsZAEZFgNjb20xGTAXBgoJ
 kiaJk/IsZAEZFgltaWNyb3NvZnQxFDASBgoJkiaJk/IsZAEZFgRjb3JwMRcwFQYK
 CZImiZPyLGQBGRYHcmVkbW9uZDEqMCgGA1UEAxMhTWljcm9zb2Z0IFNlY3VyZSBT
 ZXJ2ZXIgQXV0aG9yaXR5MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
-xcCphW3RnMyuq1EAwlSsUghQUuCSQAaeFBTro1qbeCJEALHQGrXg8SMnY9Om64WG
-PnB9HhOb1LTOdkMVx6a3GU0mcv+LkefcW/CewIMfDXPoeGA4ULmY9wbraPwJY8Ba
-H3PAvOVSTJ0k9ZX6tXjE0D/214kn0+ZN+Y+ZwoqFC5/lgQyUxxgfVA0FsR/NDNF6
-keBsoNz2vPghAsruLhkON+5KGQo0o+T+XcJ7xNs7eJR7MWZn2rNCM1J+qrR0o2vG
-vz8QBSKogUXiPRXYVkNSkBEFZqGvEob1pDwC5fJEP71J6xEJHsSe0pcaa637RU04
-4BsjRHqJE3Rrlurb6Fc8vQIDAQABo4IB2jCCAdYwEgYDVR0TAQH/BAgwBgEB/wIB
-ATAdBgNVHQ4EFgQUmY+l9x6Bb/p5wvAWP7JUsQhoR1UwCwYDVR0PBAQDAgGGMBIG
-CSsGAQQBgjcVAQQFAgMEAAQwIwYJKwYBBAGCNxUCBBYEFBOB4Tms57aqAqhuDUms
-pmqjrALsMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMB8GA1UdIwQYMBaAFDNf
-3Q+3nFzO7ofdcHCLX33PIry5MIGjBgNVHR8EgZswgZgwgZWggZKggY+GNmh0dHA6
-Ly9tc2NybC5taWNyb3NvZnQuY29tL3BraS9tc2NvcnAvY3JsL21zd3d3KDMpLmNy
+kYTz6fKXvrdfIr5o3Ue4CRIzhTE+8JE4hrLTQki3emjYn/CfHRPb7hmMiOZmWBdE
+DUEymyXOyZ7Sy2tC6WaBC4onVYotPoSsaOZJv6EJeHPk64RiWTfX+XqufRndYOEC
+DUmotYQNPV/8InioIBf9+gOSsAMdmyGZF6C1PkJqvPZTRxNv6hxuMMb6uOQIPoFX
+/ceQvAOZcJx2qGsAVKsJHylYkC0GgVyFVhOI0vcZZBcP5T+NtOmyjVBWdxS413HL
+D+8w+3wG0bOP8EyOeRnuf0KLXGBangte0ZFIRd28GXpo5UrcA/r5000e2RTHmhC4
+8YPMIoi+q9XZoF5R0Z069QIDAQABo4IB2jCCAdYwEgYDVR0TAQH/BAgwBgEB/wIB
+ADAdBgNVHQ4EFgQUFFXEOeA9LtFVLkiWsNh+FCIGk7wwCwYDVR0PBAQDAgGGMBIG
+CSsGAQQBgjcVAQQFAgMFAAUwIwYJKwYBBAGCNxUCBBYEFM7FoL4P/nlmdZEP8PeS
+WzWYqBWzMBkGCSsGAQQBgjcUAgQMHgoAUwB1AGIAQwBBMB8GA1UdIwQYMBaAFMbb
+u8DYIBmS8WD8iPFYf7wbTo8aMIGjBgNVHR8EgZswgZgwgZWggZKggY+GNmh0dHA6
+Ly9tc2NybC5taWNyb3NvZnQuY29tL3BraS9tc2NvcnAvY3JsL21zd3d3KDQpLmNy
 bIY0aHR0cDovL2NybC5taWNyb3NvZnQuY29tL3BraS9tc2NvcnAvY3JsL21zd3d3
-KDMpLmNybIYfaHR0cDovL2NvcnBwa2kvY3JsL21zd3d3KDMpLmNybDB5BggrBgEF
+KDQpLmNybIYfaHR0cDovL2NvcnBwa2kvY3JsL21zd3d3KDQpLmNybDB5BggrBgEF
 BQcBAQRtMGswPAYIKwYBBQUHMAKGMGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9w
-a2kvbXNjb3JwL21zd3d3KDMpLmNydDArBggrBgEFBQcwAoYfaHR0cDovL2NvcnBw
-a2kvYWlhL21zd3d3KDMpLmNydDANBgkqhkiG9w0BAQUFAAOCAQEARSzU1qmSJczv
-IiFrscxgYtzXekBWgm2rYVIqN996H5ZfMDaso0tZXmhWo0zX0z0r0H+IIGtJ+4D9
-t6dMTpB26jV/5EtMbtQu48ryCkMHBKNtCn7pQ5Mq2gqjq84KrVUlBFfPT4z4+Hqp
-Q6gVghMggWNtiujdHh7w4ja3OqHkFZTX/wUSTb+BtH+GBZKYAGU6duakb3D0piFu
-W5W6gZ4j15R12ys3ZYTKThZjW5blolA0lzuCSghoSfJHRA4jChIzDNojkf7OxqJw
-yFl8+++iZwTiulCTgOucJxGCT1tEEwdfX2c+XKyJIS/d5Ndtk91WEWU+TzqX9ZT4
-SAMJpIZ1pg==
+a2kvbXNjb3JwL21zd3d3KDQpLmNydDArBggrBgEFBQcwAoYfaHR0cDovL2NvcnBw
+a2kvYWlhL21zd3d3KDQpLmNydDANBgkqhkiG9w0BAQUFAAOCAgEAempuzk/VLM4N
+H9TAbFtCjKc95iGmyx2bHbEk9m2cbGxXjBre+N4cJoIYYmhLrZ6L712ov1NjM73b
+m8fb2Fy8Yw8Cmwc8VtarPZT2yzGr8MhNUDVuZswaKfjCY3H7RYv/XKc7AOMd25WP
+/M0WTT4Bna6hl9dUaDGwv5SZFFIJ17FLo4FR2H7IkOOI/WcUPAHeDXUewp4qRPE/
+560xZrLSeNH2lKnOAwwXxwnXSo5WOF5AQXh1nRdbBV9Nu7yI6jH1QV6fKf6oFU2Y
+IOjpnJ0FihVB6XoZ0wNOUMzPEEQcTfIoVoc+t0iK02wcmTLgBgbYU703dHvvPTcn
+IfdI2mscx8l9MjUOdklIIve0FhCxRPqHpEeKjM95gllbXmWgQxAXiog+A62fEo5d
+M7nfeEyiweSlhj1cv+2dyhzyS5saKYkk3ocCnOMCyD0M+4gJx4n4b/zT3rcujyN+
+7m20PbBTjcdTT1+AxOs75rON2hhKUqqrk2MDCpnEJsNK4TuRyDUtm9r+AxaZ4XRK
+MT8InY1Xl9hzrIK6MVERYH46kxg6odwpzJ8Urn4dREBiMy6Gzq8mtyXvpYEcmeGL
+zz1aT7qNNbQ0qqbPb6RpOMHlUWOIhVWJC71T5WK1pynAc3P9zOm8BkUYvIyJvCbR
+bufCGVng4FAtVZ1advxSVRoa4GyuFZ8=
 -----END CERTIFICATE-----