changeset 31648:fa88dc1dcabb

merged from im.pidgin.pidgin
author Yoshiki Yazawa <yaz@honeyplanet.jp>
date Sat, 12 Feb 2011 04:17:09 +0900
parents c92bc01056ea (current diff) e3535392b624 (diff)
children 7281d151e492
files configure.ac libpurple/certificate.c libpurple/conversation.c libpurple/protocols/gg/lib/pubdir50.c libpurple/protocols/irc/irc.c libpurple/protocols/irc/parse.c libpurple/protocols/jabber/jabber.c libpurple/protocols/jabber/message.c libpurple/protocols/jabber/si.c libpurple/protocols/msn/msg.c libpurple/protocols/msn/msn.c libpurple/protocols/oscar/encoding.c libpurple/protocols/oscar/family_icbm.c libpurple/protocols/oscar/odc.c libpurple/protocols/oscar/oscar.c libpurple/protocols/yahoo/libymsg.c libpurple/protocols/yahoo/libymsg.h libpurple/protocols/yahoo/util.c libpurple/protocols/yahoo/yahoochat.c libpurple/util.c pidgin/gtkblist.c pidgin/gtkconv.c pidgin/gtkdocklet-gtk.c pidgin/gtkimhtml.c pidgin/gtkimhtmltoolbar.c pidgin/gtkprefs.c pidgin/gtkutils.c
diffstat 410 files changed, 6823 insertions(+), 6089 deletions(-) [+]
line wrap: on
line diff
--- a/COPYRIGHT	Tue Dec 21 21:05:26 2010 +0900
+++ b/COPYRIGHT	Sat Feb 12 04:17:09 2011 +0900
@@ -81,6 +81,7 @@
 Norbert Buchmuller
 Johannes Buchner
 Sean Burke
+Gabriel Burt
 Thomas Butter
 Trevor Caira
 Andrea Canciani
@@ -94,6 +95,7 @@
 Matěj Cepl
 Cerulean Studios, LLC
 Jonathan Champ
+Markos Chandras
 Matthew Chapman
 Christophe Chapuis
 Patrick Cheung
@@ -130,6 +132,7 @@
 Florian Delizy
 Jiri Denemark
 Vinicius Depizzol
+Marc Dequènes
 Philip Derrin
 Taso N. Devetzis
 Balwinder Singh Dheeman
@@ -162,6 +165,7 @@
 Gavan Fantom (gavan)
 Leonardo Fernandes
 David Fiander
+Ryan Flegel
 Rob Flynn <gaim@robflynn.com>
 Rob Foehl (rwf)
 Chris Foote
@@ -222,6 +226,7 @@
 Andrew Hoffman
 Iain Holmes
 Joshua Honeycutt
+Jeffrey Honig
 Nigel Horne
 Jensen Hornick
 Juanjo Molinero Horno
@@ -260,6 +265,7 @@
 F.W. Kong
 Konstantin Korikov
 Cole Kowalski
+Nikita Kozlov
 Matt Kramer
 Gary Kramlich
 Jan Kratochvil
@@ -275,6 +281,7 @@
 Joe LaPenna
 Steve Láposi
 Daniel Larsson
+Julia Lawall
 Peter Lawler
 Vadim Lebedev
 Ho-seok Lee
@@ -305,6 +312,7 @@
 Sulabh Mahajan
 Willian T. Mahan
 Jonathan Maltz
+Rok Mandeljc
 Tobias Markmann
 Kris Marsh
 Fidel Martinez
@@ -336,6 +344,7 @@
 John Moody
 Tim Mooney
 Sergio Moretto
+Nader Morshed
 Keith Moyer
 Andrei Mozzhuhin
 Christian Muise
@@ -358,6 +367,7 @@
 Gudmundur Bjarni Olafsson
 Bartosz Oler
 Oliver
+The openSUSE Project
 Jürgen Orschiedt
 Stefan Ott
 Shawn Outman
@@ -370,6 +380,7 @@
 Riley Patterson
 Havoc Pennington
 Ted Percival
+Hugo Pereira Da Costa
 Eduardo Pérez
 Matt Perry
 Ani Peter
@@ -404,6 +415,7 @@
 Etan Reisner
 David Reiss
 Luoh Ren-Shan
+Noa Resare
 Daniele Ricci
 Kristian Rietveld
 Pekka Riikonen
@@ -535,6 +547,7 @@
 Andrew Victor
 Jorge Villaseñor (Masca)
 Bjoern Voigt
+Peter Volkov
 Wan Hing Wah
 Philip Walford
 Nathan Walp
@@ -572,6 +585,7 @@
 Timmy Yee
 Li Yuan
 Yuriy Yevgrafov
+Jan Zachorowski
 Nickolai Zeldovich
 Tom Zickel
 Marco Ziech
--- a/ChangeLog	Tue Dec 21 21:05:26 2010 +0900
+++ b/ChangeLog	Sat Feb 12 04:17:09 2011 +0900
@@ -1,6 +1,83 @@
 Pidgin and Finch: The Pimpin' Penguin IM Clients That're Good for the Soul
 
-version 2.7.9 (??/??/????):
+version 2.7.11 (??/??/????):
+
+version 2.7.10 (02/06/2011):
+	General:
+	* Force video sources to all have the same capabilities.  This reduces the
+	  number of times video must be scaled down, saving CPU time. (Jakub Adam)
+	  (half of #13095)
+	* Starting multiple video calls and ending one no longer causes the other
+	  calls to stop sending audio and video. (Jakub Adam) (#12758, #13237)
+	* Perl bindings now respect LDFLAGS. (Peter Volkov, Markos Chandras)
+	  (#12638)
+	* Added AddTrust External Root CA.  (#11554)
+	* Resolve some issues validating X.509 certificates signed off the CAcert
+	  Class 3 intermediate cert when using the GnuTLS SSL/TLS plugin.
+
+	Gadu-Gadu:
+	* Don't drop whole messages when text is colored. (Jan Zachorowski)
+	  (#13259)
+
+	Groupwise:
+	* Don't show two windows when using "Get Info" on a buddy. (Gabriel Burt;
+	  Novell, Inc.) (#13108)
+
+	IRC:
+	* Don't send ISON messages longer than 512 bytes. (Jeffrey Honig) (#9692)
+
+	libpurple:
+	* Stop sending audio when placing a call on hold. (Jakub Adam) (#13032)
+	* Stop translating gpointers to ints in the dbus API.  This removes
+	  functions from the dbus API.  (The openSUSE Project) (#12507)
+	* Fix D-Bus introspection calls that omit the interface parameter.  (Tom
+	  Samstag) (#13073)
+	* Fixed bugs in purple_str_to_time() that caused the most recent 'make
+	  check' failures.  (Nader Morshed) (#13131)
+	* Correct an issue that caused some UIs other than Pidgin or Finch to
+	  leave a buddy in the "is typing" state.  (Jan Kaluza)
+	* Fix potential information disclosure issues in the Cipher code.  (Julia
+	  Lawall)
+
+	Pidgin:
+	* Support using the Page Up and Page Down keys on the numeric keypad in
+	  the conversation window.  (Ryan Flegel) (#13127)
+	* Fix a few memory leaks. (Nader Morshed) (#13162)
+	* Support rendering strikethrough when received as in-line CSS. (#13168)
+	* Editable comboboxes are now more friendly to some GTK+ themes. (Hugo
+	  Pereira Da Costa) (#13164).
+
+	Plugins:
+	* The Voice/Video Settings plugin no longer resets selected devices to
+	  defaults. (Jakub Adam) (#13044)
+	* The Voice/Video Settings plugin no longer crashes when a stored device
+	  name is not found in the list of available devices. (Jakub Adam)
+	  (#13238)
+	* The Autoaccept plugin now allows disabling filename escaping. (Rok
+	  Mandeljc) (half of #11459)
+	* The Autoaccept plugin now allows choosing Reject/Ask/Accept for
+	  non-buddies. (Rok Mandeljc) (half of #11459)
+
+	QQ:
+	* QQ2008 is now the default protocol version. (Michael Terry) (#11635)
+
+	XMPP:
+	* Don't crash when receiving an unexpected/invalid jingle transport type.
+	  (Nikita Kozlov) (#13136)
+	* Handle Connection: Close headers for BOSH, when the server does not
+	  terminate the connection itself. (#13008)
+	* Improved parsing for DIGEST-MD5, which should resolve issues
+	  connecting to some jabberd2 servers.  This corrects an issue parsing
+	  one-character or empty elements. (Noa Resare) (#a14514)
+
+	Yahoo!/Yahoo! JAPAN:
+	* Fix a crash when an account disconnects before a p2p session is
+	  completely set up. (Jan Kaluza) (#12432)
+
+version 2.7.9 (12/26/2010):
+	MSN:
+	* Fix CVE-2010-4528, a crash when receiving short packets related to
+	  P2Pv2 messages.
 
 version 2.7.8 (12/19/2010):
 	General:
@@ -877,7 +954,7 @@
 	  from you on MSN.
 	* Support sending an invite message to buddies when requesting
 	  authorization from them on MSN.
-	* Timeout switchboard connections aggressively (60 seconds).
+	* Timeout switchboard connections after 60 seconds (msn-pecan devs).
 
 	XMPP:
 	* Voice & Video support with Jingle (XEP-0166, 0167, 0176, & 0177),
--- a/ChangeLog.API	Tue Dec 21 21:05:26 2010 +0900
+++ b/ChangeLog.API	Sat Feb 12 04:17:09 2011 +0900
@@ -1,6 +1,11 @@
 Pidgin and Finch: The Pimpin' Penguin IM Clients That're Good for the Soul
 
-version 2.7.9 (??/??/????):
+version 2.7.11 (??/??/????):
+
+version 2.7.10 (02/06/2011):
+	* No changes
+
+version 2.7.9 (12/26/2010):
 	* No changes
 
 version 2.7.8 (12/19/2010):
--- a/NEWS	Tue Dec 21 21:05:26 2010 +0900
+++ b/NEWS	Sat Feb 12 04:17:09 2011 +0900
@@ -2,7 +2,18 @@
 
 Our development blog is available at: http://planet.pidgin.im
 
-2.7.9 (??/??/????):
+2.7.11 (??/??/????):
+
+2.7.10 (02/06/2011):
+	John: It's release time again.  This release contains a bunch of stuff
+	committed from Trac.  This is another "thank a patch writer" release.
+	Unfortunately, no one has fixed our wonderful MSN issues yet.  There is
+	a tiny security fix in this release, as well.
+
+2.7.9 (12/26/2010):
+	John: Just a quick release for a security fix here.  Elliott has not
+	yet had a chance to work on the MSN breakage that's been present in
+	the last couple releases, but we hope he can do it before 2.7.10!
 
 2.7.8 (12/19/2010):
 	Elliott: OK, so I know a few things broke with the last release, and
--- a/configure.ac	Tue Dec 21 21:05:26 2010 +0900
+++ b/configure.ac	Sat Feb 12 04:17:09 2011 +0900
@@ -46,7 +46,7 @@
 m4_define([purple_lt_current], [7])
 m4_define([purple_major_version], [2])
 m4_define([purple_minor_version], [7])
-m4_define([purple_micro_version], [9])
+m4_define([purple_micro_version], [11])
 m4_define([purple_version_suffix], [devel])
 m4_define([purple_version],
           [purple_major_version.purple_minor_version.purple_micro_version])
@@ -55,7 +55,7 @@
 m4_define([gnt_lt_current], [8])
 m4_define([gnt_major_version], [2])
 m4_define([gnt_minor_version], [8])
-m4_define([gnt_micro_version], [5])
+m4_define([gnt_micro_version], [7])
 m4_define([gnt_version_suffix], [devel])
 m4_define([gnt_version],
           [gnt_major_version.gnt_minor_version.gnt_micro_version])
@@ -2406,7 +2406,7 @@
 
 AC_MSG_CHECKING(for me pot o' gold)
 AC_MSG_RESULT(no)
-AC_CHECK_FUNCS(gethostid lrand48)
+AC_CHECK_FUNCS(gethostid lrand48 timegm)
 AC_CHECK_FUNCS(memcpy memmove random strchr strerror vprintf)
 AC_CHECK_HEADERS(malloc.h paths.h sgtty.h stdarg.h sys/cdefs.h)
 AC_CHECK_HEADERS(sys/file.h sys/filio.h sys/ioctl.h sys/msgbuf.h)
--- a/finch/finch.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/finch/finch.c	Sat Feb 12 04:17:09 2011 +0900
@@ -422,7 +422,7 @@
 	/* Initialize the libpurple stuff */
 	if (!init_libpurple(*argc, *argv))
 		return FALSE;
- 
+
 	purple_blist_show();
 	return TRUE;
 }
--- a/finch/getopt.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/finch/getopt.c	Sat Feb 12 04:17:09 2011 +0900
@@ -178,7 +178,7 @@
 {
   REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER
 } ordering;
-
+
 #ifdef	__GNU_LIBRARY__
 /* We want to avoid inclusion of string.h with non-GNU libraries
    because there are many ways it can cause trouble.
@@ -219,7 +219,7 @@
     to[i] = from[i];
 }
 #endif				/* GNU C library.  */
-
+
 /* Handle permutation of arguments.  */
 
 /* Describe the part of ARGV that contains non-options that have
@@ -259,7 +259,7 @@
   first_nonopt += (optind - last_nonopt);
   last_nonopt = optind;
 }
-
+
 /* Scan elements of ARGV (whose length is ARGC) for option characters
    given in OPTSTRING.
 
@@ -663,7 +663,7 @@
 }
 
 #endif	/* _LIBC or not __GNU_LIBRARY__.  */
-
+
 #ifdef TEST
 
 /* Compile with -DTEST to make an executable for use in testing
--- a/finch/getopt1.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/finch/getopt1.c	Sat Feb 12 04:17:09 2011 +0900
@@ -81,7 +81,7 @@
 
 
 #endif	/* _LIBC or not __GNU_LIBRARY__.  */
-
+
 #ifdef TEST
 
 #include <stdio.h>
--- a/finch/gntaccount.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/finch/gntaccount.c	Sat Feb 12 04:17:09 2011 +0900
@@ -308,7 +308,7 @@
 	if (!plugin)
 		return;
 	prplinfo = PURPLE_PLUGIN_PROTOCOL_INFO(plugin);
-	
+
 	username = dialog->account ? g_strdup(purple_account_get_username(dialog->account)) : NULL;
 
 	for (iter = prplinfo->user_splits; iter; iter = iter->next)
--- a/finch/gntblist.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/finch/gntblist.c	Sat Feb 12 04:17:09 2011 +0900
@@ -1807,7 +1807,7 @@
 			}
 		}
 	}
-	
+
 	tmp = purple_notify_user_info_get_text_with_newline(user_info, "<BR>");
 	purple_notify_user_info_destroy(user_info);
 
@@ -2066,7 +2066,7 @@
 		gnt_tree_set_compare_func(GNT_TREE(ggblist->tree),
 			(GCompareFunc)blist_node_compare_log);
 	}
-	
+
 	list = purple_get_blist();
 	node = purple_blist_get_root();
 	while (node)
--- a/finch/gntcertmgr.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/finch/gntcertmgr.c	Sat Feb 12 04:17:09 2011 +0900
@@ -193,7 +193,7 @@
 	subject = purple_certificate_get_subject_name(crt);
 
 	secondary = g_strdup_printf(_("Common name: %s\n\nSHA1 fingerprint:\n%s"), subject, fpr_sha1_asc);
-	
+
 	purple_notify_info(NULL,
 			   _("SSL Host Certificate"), primary, secondary);
 
--- a/finch/gntconn.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/finch/gntconn.c	Sat Feb 12 04:17:09 2011 +0900
@@ -159,7 +159,7 @@
 	return &handle;
 }
 
-static PurpleConnectionUiOps ops = 
+static PurpleConnectionUiOps ops =
 {
 	NULL, /* connect_progress */
 	NULL, /* connected */
--- a/finch/gntconv.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/finch/gntconv.c	Sat Feb 12 04:17:09 2011 +0900
@@ -1155,7 +1155,7 @@
 	return FALSE;
 }
 
-static PurpleConversationUiOps conv_ui_ops = 
+static PurpleConversationUiOps conv_ui_ops =
 {
 	finch_create_conversation,
 	finch_destroy_conversation,
--- a/finch/gntft.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/finch/gntft.c	Sat Feb 12 04:17:09 2011 +0900
@@ -356,7 +356,7 @@
 
 	if (xfer_dialog->num_transfers == 0 && !xfer_dialog->keep_open)
 		finch_xfer_dialog_destroy();
-	else 
+	else
 		update_title_progress();
 	purple_xfer_unref(xfer);
 }
--- a/finch/gntlog.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/finch/gntlog.h	Sat Feb 12 04:17:09 2011 +0900
@@ -8,7 +8,7 @@
  * Finch is the legal property of its developers, whose names are too numerous
  * to list here.  Please refer to the COPYRIGHT file distributed with this
  * source distribution.
- * 
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
--- a/finch/gntmedia.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/finch/gntmedia.c	Sat Feb 12 04:17:09 2011 +0900
@@ -252,7 +252,7 @@
 	} else if (state == PURPLE_MEDIA_STATE_CONNECTED) {
 		finch_media_connected_cb(media, gntmedia);
 	} else if (state == PURPLE_MEDIA_STATE_NEW &&
-			sid != NULL && name != NULL && 
+			sid != NULL && name != NULL &&
 			purple_media_is_initiator(media, sid, name) == FALSE) {
 		PurpleAccount *account;
 		PurpleBuddy *buddy;
@@ -360,7 +360,7 @@
 			g_value_set_object(value, media->priv->media);
 			break;
 		default:
-			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);	
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 			break;
 	}
 }
@@ -480,7 +480,7 @@
 			PURPLE_CMD_FLAG_IM, NULL,
 			call_cmd_cb, _("call: Make an audio call."), NULL);
 
-	purple_media_manager_set_ui_caps(manager, 
+	purple_media_manager_set_ui_caps(manager,
 			PURPLE_MEDIA_CAPS_AUDIO |
 			PURPLE_MEDIA_CAPS_AUDIO_SINGLE_DIRECTION);
 
--- a/finch/gntnotify.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/finch/gntnotify.c	Sat Feb 12 04:17:09 2011 +0900
@@ -130,7 +130,7 @@
 
 	while (widget->parent)
 		widget = widget->parent;
-	
+
 	if (type == PURPLE_NOTIFY_SEARCHRESULTS)
 		purple_notify_searchresults_free(g_object_get_data(handle, "notify-results"));
 #if 1
@@ -489,7 +489,7 @@
 	return finch_notify_message(PURPLE_NOTIFY_URI, _("URI"), url, NULL);
 }
 
-static PurpleNotifyUiOps ops = 
+static PurpleNotifyUiOps ops =
 {
 	finch_notify_message,
 	finch_notify_email,
--- a/finch/gntplugin.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/finch/gntplugin.c	Sat Feb 12 04:17:09 2011 +0900
@@ -64,7 +64,7 @@
 static void
 decide_conf_button(PurplePlugin *plugin)
 {
-	if (purple_plugin_is_loaded(plugin) && 
+	if (purple_plugin_is_loaded(plugin) &&
 		((PURPLE_IS_GNT_PLUGIN(plugin) &&
 			FINCH_PLUGIN_UI_INFO(plugin) != NULL) ||
 		(plugin->info->prefs_info &&
@@ -262,7 +262,7 @@
 	PurplePlugin *plugin;
 
 	g_return_if_fail(plugins.window);
-	
+
 	plugin = purple_plugin_probe(filename);
 	if (!plugin) {
 		purple_notify_error(handle, _("Error loading plugin"),
--- a/finch/gntprefs.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/finch/gntprefs.c	Sat Feb 12 04:17:09 2011 +0900
@@ -180,21 +180,21 @@
 	return field;
 }
 
-static Prefs blist[] = 
+static Prefs blist[] =
 {
 	{PURPLE_PREF_BOOLEAN, "/finch/blist/idletime", N_("Show Idle Time"), NULL},
 	{PURPLE_PREF_BOOLEAN, "/finch/blist/showoffline", N_("Show Offline Buddies"), NULL},
 	{PURPLE_PREF_NONE, NULL, NULL, NULL}
 };
 
-static Prefs convs[] = 
+static Prefs convs[] =
 {
 	{PURPLE_PREF_BOOLEAN, "/finch/conversations/timestamps", N_("Show Timestamps"), NULL},
 	{PURPLE_PREF_BOOLEAN, "/finch/conversations/notify_typing", N_("Notify buddies when you are typing"), NULL},
 	{PURPLE_PREF_NONE, NULL, NULL, NULL}
 };
 
-static Prefs logging[] = 
+static Prefs logging[] =
 {
 	{PURPLE_PREF_STRING, "/purple/logging/format", N_("Log format"), get_log_options},
 	{PURPLE_PREF_BOOLEAN, "/purple/logging/log_ims", N_("Log IMs"), NULL},
--- a/finch/gntrequest.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/finch/gntrequest.c	Sat Feb 12 04:17:09 2011 +0900
@@ -243,7 +243,7 @@
 
 	setup_default_callback(window, cancel_cb, user_data);
 	gnt_widget_show(window);
-	
+
 	return window;
 }
 
--- a/finch/gntsound.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/finch/gntsound.c	Sat Feb 12 04:17:09 2011 +0900
@@ -554,11 +554,11 @@
 	}
 
 	play = gst_element_factory_make("playbin", "play");
-	
+
 	if (play == NULL) {
 		return;
 	}
-	
+
 	uri = g_strdup_printf("file://%s", filename);
 
 	g_object_set(G_OBJECT(play), "uri", uri,
@@ -688,7 +688,7 @@
 
 	gnt_tree_change_text(GNT_TREE(pref_dialog->events), GINT_TO_POINTER(event->id), 1, file);
 	gnt_tree_set_choice(GNT_TREE(pref_dialog->events), GINT_TO_POINTER(event->id), TRUE);
-	
+
 	gnt_widget_destroy(GNT_WIDGET(w));
 }
 
@@ -731,7 +731,7 @@
 reset_cb(GntWidget *button, gpointer null)
 {
 	/* Don't dereference this pointer ! */
-	gpointer key = gnt_tree_get_selection_data(GNT_TREE(pref_dialog->events)); 
+	gpointer key = gnt_tree_get_selection_data(GNT_TREE(pref_dialog->events));
 
 	FinchSoundEvent * event = &sounds[GPOINTER_TO_INT(key)];
 	g_free(event->file);
@@ -881,7 +881,7 @@
 		gnt_entry_set_text(entry, "");
 		gnt_tree_set_selected(GNT_TREE(pref_dialog->profiles), key);
 		finch_sound_set_active_profile(key);
-	} else 
+	} else
 		reload_pref_window(profile);
 }
 
@@ -982,13 +982,13 @@
 	gnt_combo_box_add_data(GNT_COMBO_BOX(cmbox), "nosound", _("No Sound"));
 
 	label = gnt_label_new_with_format(_("Sound Method"), GNT_TEXT_FLAG_BOLD);
-	gnt_box_add_widget(GNT_BOX(box), label); 
+	gnt_box_add_widget(GNT_BOX(box), label);
 	tmpbox = gnt_hbox_new(TRUE);
 	gnt_box_set_fill(GNT_BOX(tmpbox), FALSE);
 	gnt_box_set_pad(GNT_BOX(tmpbox), 0);
 	gnt_box_add_widget(GNT_BOX(tmpbox), gnt_label_new(_("Method: ")));
 	gnt_box_add_widget(GNT_BOX(tmpbox), cmbox);
-	gnt_box_add_widget(GNT_BOX(box), tmpbox); 
+	gnt_box_add_widget(GNT_BOX(box), tmpbox);
 
 	tmpbox = gnt_hbox_new(TRUE);
 	gnt_box_set_pad(GNT_BOX(tmpbox), 0);
@@ -1001,7 +1001,7 @@
 	gnt_box_add_widget(GNT_BOX(box), gnt_line_new(FALSE));
 
 	/* Sound options */
-	gnt_box_add_widget(GNT_BOX(box), gnt_label_new_with_format(_("Sound Options"), GNT_TEXT_FLAG_BOLD)); 
+	gnt_box_add_widget(GNT_BOX(box), gnt_label_new_with_format(_("Sound Options"), GNT_TEXT_FLAG_BOLD));
 	pref_dialog->conv_focus = chkbox = gnt_check_box_new(_("Sounds when conversation has focus"));
 	gnt_box_add_widget(GNT_BOX(box), chkbox);
 
@@ -1038,7 +1038,7 @@
 	gnt_box_add_widget(GNT_BOX(win), gnt_hline_new());
 
 	/* Sound events */
-	gnt_box_add_widget(GNT_BOX(win), gnt_label_new_with_format(_("Sound Events"), GNT_TEXT_FLAG_BOLD)); 
+	gnt_box_add_widget(GNT_BOX(win), gnt_label_new_with_format(_("Sound Events"), GNT_TEXT_FLAG_BOLD));
 	pref_dialog->events = tree = gnt_tree_new_with_columns(2);
 	gnt_tree_set_column_titles(GNT_TREE(tree), _("Event"), _("File"));
 	gnt_tree_set_show_title(GNT_TREE(tree), TRUE);
--- a/finch/gntsound.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/finch/gntsound.h	Sat Feb 12 04:17:09 2011 +0900
@@ -44,7 +44,7 @@
 
 /**
  * Set the active profile.  If the profile doesn't exist, nothing is changed.
- * 
+ *
  * @param name  The name of the profile
  *
  * @since 2.1.0
--- a/finch/gntstatus.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/finch/gntstatus.c	Sat Feb 12 04:17:09 2011 +0900
@@ -314,7 +314,7 @@
 		gnt_box_give_focus_to_child(GNT_BOX(edit->window), edit->title);
 		return;
 	}
-	
+
 	if (edit->saved == NULL)
 	{
 		edit->saved = purple_savedstatus_new(title, prim);
@@ -409,7 +409,7 @@
 	gnt_tree_change_text(GNT_TREE(sub->parent->tree), row, 1,
 			purple_status_type_get_name(type));
 	gnt_tree_change_text(GNT_TREE(sub->parent->tree), row, 2, message);
-	
+
 	gnt_widget_destroy(sub->window);
 }
 
--- a/finch/gntui.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/finch/gntui.c	Sat Feb 12 04:17:09 2011 +0900
@@ -51,7 +51,7 @@
 #endif
 
 	purple_prefs_add_none("/purple/gnt");
-	
+
 	/* Accounts */
 	finch_accounts_init();
 	purple_accounts_set_ui_ops(finch_accounts_get_ui_ops());
--- a/finch/libgnt/gnt-skel.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/finch/libgnt/gnt-skel.h	Sat Feb 12 04:17:09 2011 +0900
@@ -61,14 +61,14 @@
 G_BEGIN_DECLS
 
 /**
- * 
+ *
  *
  * @return
  */
 GType gnt_skel_get_gtype(void);
 
 /**
- * 
+ *
  *
  * @return
  */
--- a/finch/libgnt/gntbindable.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/finch/libgnt/gntbindable.c	Sat Feb 12 04:17:09 2011 +0900
@@ -48,7 +48,7 @@
 	GList * params;       /* The list of paramaters */
 } rebind_info;
 
-static void 
+static void
 gnt_bindable_free_rebind_info(void)
 {
 	g_free(rebind_info.name);
@@ -92,7 +92,7 @@
 		if (!strcmp(text, GNT_KEY_CTRL_I) || !strcmp(text, GNT_KEY_ENTER)) {
 			return FALSE;
 		}
-		
+
 		tmp = gnt_key_lookup(text);
 		new_text = g_strdup_printf("KEY: \"%s\"", tmp);
 		gnt_text_view_clear(textview);
@@ -105,7 +105,7 @@
 		return TRUE;
 	}
 	return FALSE;
-} 
+}
 static void
 gnt_bindable_rebinding_activate(GntBindable *data, gpointer bindable)
 {
@@ -154,18 +154,18 @@
 	g_signal_connect(G_OBJECT(win), "key_pressed", G_CALLBACK(gnt_bindable_rebinding_grab_key), key_textview);
 
 	button_box = gnt_box_new(FALSE, FALSE);
-	
+
 	bind_button = gnt_button_new("BIND");
 	gnt_widget_set_name(bind_button, "bind");
 	gnt_box_add_widget(GNT_BOX(button_box), bind_button);
-	
+
 	cancel_button = gnt_button_new("Cancel");
 	gnt_widget_set_name(cancel_button, "cancel");
 	gnt_box_add_widget(GNT_BOX(button_box), cancel_button);
-	
+
 	g_signal_connect(G_OBJECT(bind_button), "activate", G_CALLBACK(gnt_bindable_rebinding_rebind), win);
 	g_signal_connect(G_OBJECT(cancel_button), "activate", G_CALLBACK(gnt_bindable_rebinding_cancel), win);
-	
+
 	gnt_box_add_widget(GNT_BOX(vbox), button_box);
 
 	gnt_box_add_widget(GNT_BOX(win), vbox);
@@ -320,7 +320,7 @@
 	while ((p = va_arg(args, void *)) != NULL)
 		list = g_list_append(list, p);
 	va_end(args);
-	
+
 	action = g_hash_table_lookup(klass->actions, name);
 	if (action && action->u.action) {
 		return action->u.action(bindable, list);
--- a/finch/libgnt/gntbindable.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/finch/libgnt/gntbindable.h	Sat Feb 12 04:17:09 2011 +0900
@@ -67,7 +67,7 @@
 G_BEGIN_DECLS
 
 /**
- * 
+ *
  *
  * @return
  */
--- a/finch/libgnt/gntbox.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/finch/libgnt/gntbox.c	Sat Feb 12 04:17:09 2011 +0900
@@ -64,7 +64,7 @@
 	GntWidget *widget = GNT_WIDGET(box);
 	int len;
 	char *end = (char*)gnt_util_onscreen_width_to_pointer(title, widget->priv.width - 4, &len);
-	
+
 	if (p)
 		*p = (widget->priv.width - len) / 2;
 	if (r)
--- a/finch/libgnt/gntcheckbox.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/finch/libgnt/gntcheckbox.c	Sat Feb 12 04:17:09 2011 +0900
@@ -100,7 +100,7 @@
 	wclass->key_pressed = gnt_check_box_key_pressed;
 	wclass->clicked = gnt_check_box_clicked;
 
-	signals[SIG_TOGGLED] = 
+	signals[SIG_TOGGLED] =
 		g_signal_new("toggled",
 					 G_TYPE_FROM_CLASS(klass),
 					 G_SIGNAL_RUN_LAST,
--- a/finch/libgnt/gntclipboard.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/finch/libgnt/gntclipboard.c	Sat Feb 12 04:17:09 2011 +0900
@@ -32,7 +32,7 @@
 static void
 gnt_clipboard_class_init(GntClipboardClass *klass)
 {
-	signals[SIG_CLIPBOARD] = 
+	signals[SIG_CLIPBOARD] =
 		g_signal_new("clipboard_changed",
 					 G_TYPE_FROM_CLASS(klass),
 					 G_SIGNAL_RUN_LAST,
--- a/finch/libgnt/gntcombobox.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/finch/libgnt/gntcombobox.h	Sat Feb 12 04:17:09 2011 +0900
@@ -91,7 +91,7 @@
 
 /**
  * Remove an entry
- * 
+ *
  * @param box The GntComboBox
  * @param key The data to be removed
  */
--- a/finch/libgnt/gntentry.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/finch/libgnt/gntentry.c	Sat Feb 12 04:17:09 2011 +0900
@@ -481,7 +481,7 @@
 	GntEntry *entry = GNT_ENTRY(bind);
 	GList *iter;
 	const char *current;
-	
+
 	if (entry->history->prev && entry->search->needle)
 		current = entry->search->needle;
 	else
--- a/finch/libgnt/gntfilesel.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/finch/libgnt/gntfilesel.c	Sat Feb 12 04:17:09 2011 +0900
@@ -245,7 +245,7 @@
 	GDir *dir;
 	GntFile *file;
 	const char *str;
-	
+
 	dir = g_dir_open(path, 0, error);
 	if (dir == NULL || (error && *error)) {
 		return FALSE;
@@ -315,7 +315,7 @@
 		success = sel->read_fn(sel->current, &files, err);
 	else
 		success = local_read_fn(sel->current, &files, err);
-	
+
 	if (!success || *err) {
 		gnt_warning("error opening location %s (%s)",
 			sel->current, *err ? (*err)->message : "reason unknown");
@@ -356,7 +356,7 @@
 
 		if (!str)
 			return TRUE;
-		
+
 		path = g_build_filename(sel->current, str, NULL);
 		dir = g_path_get_basename(sel->current);
 		if (!gnt_file_sel_set_current_location(sel, path)) {
@@ -597,7 +597,7 @@
 	orig_size_request = kl->size_request;
 	kl->size_request = gnt_file_sel_size_request;
 
-	signals[SIG_FILE_SELECTED] = 
+	signals[SIG_FILE_SELECTED] =
 		g_signal_new("file_selected",
 					 G_TYPE_FROM_CLASS(klass),
 					 G_SIGNAL_RUN_LAST,
--- a/finch/libgnt/gntkeys.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/finch/libgnt/gntkeys.h	Sat Feb 12 04:17:09 2011 +0900
@@ -158,7 +158,7 @@
  */
 int gnt_keys_find_combination(const char *key);
 
-/* A lot of commonly used variable names are defined in <term.h>. 
+/* A lot of commonly used variable names are defined in <term.h>.
  * #undef them to make life easier for everyone. */
 
 #undef columns
--- a/finch/libgnt/gntmain.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/finch/libgnt/gntmain.c	Sat Feb 12 04:17:09 2011 +0900
@@ -126,7 +126,7 @@
 
 	if (!wm->cws->ordered || buffer[0] != 27)
 		return FALSE;
-	
+
 	buffer++;
 	if (strlen(buffer) < 5)
 		return FALSE;
@@ -177,7 +177,7 @@
 
 	if (widget && gnt_wm_process_click(wm, event, x, y, widget))
 		return TRUE;
-	
+
 	if (event == GNT_LEFT_MOUSE_DOWN && widget && widget != wm->_list.window &&
 			!GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_TRANSIENT)) {
 		if (widget != wm->cws->ordered->data) {
@@ -438,7 +438,7 @@
 {
 	const char *name = gnt_style_get(GNT_STYLE_WM);
 	gpointer handle;
-	
+
 	if (name && *name) {
 		handle = g_module_open(name, G_MODULE_BIND_LAZY);
 		if (handle) {
@@ -459,7 +459,7 @@
 
 	if (channel)
 		return;
-	
+
 	locale = setlocale(LC_ALL, "");
 
 	setup_io();
@@ -554,7 +554,7 @@
 	GntWidget *w;
 	if (!widget)
 		return FALSE;
-	
+
 	if (GNT_IS_MENU(widget))
 		return TRUE;
 
--- a/finch/libgnt/gntmenu.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/finch/libgnt/gntmenu.h	Sat Feb 12 04:17:09 2011 +0900
@@ -63,7 +63,7 @@
 {
 	GntTree parent;
 	GntMenuType type;
-	
+
 	GList *list;
 	int selected;
 
--- a/finch/libgnt/gntprogressbar.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/finch/libgnt/gntprogressbar.c	Sat Feb 12 04:17:09 2011 +0900
@@ -168,7 +168,7 @@
 			0,                            /* n_preallocs */
 			gnt_progress_bar_init,        /* instance_init */
 			NULL                          /* value_table */
-		}; 
+		};
 
 		type = g_type_register_static (GNT_TYPE_WIDGET, "GntProgressBar", &info, 0);
 	}
--- a/finch/libgnt/gntslider.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/finch/libgnt/gntslider.h	Sat Feb 12 04:17:09 2011 +0900
@@ -109,7 +109,7 @@
 
 /**
  * Sets the amount of change at each step.
- * 
+ *
  * @param slider  The slider
  * @param step    The amount for each step
  *
@@ -119,7 +119,7 @@
 
 /**
  * Sets the amount of change a small step.
- * 
+ *
  * @param slider  The slider
  * @param step    The amount for a small step (for the slider)
  *
@@ -129,7 +129,7 @@
 
 /**
  * Sets the amount of change a large step.
- * 
+ *
  * @param slider  The slider
  * @param step    The amount for a large step (for the slider)
  *
--- a/finch/libgnt/gntstyle.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/finch/libgnt/gntstyle.c	Sat Feb 12 04:17:09 2011 +0900
@@ -105,7 +105,7 @@
 
 	if (bool_styles[style] != -1)
 		return bool_styles[style];
-	
+
 	str = gnt_style_get(style);
 
 	bool_styles[style] = str ? gnt_style_parse_bool(str) : def;
@@ -226,7 +226,7 @@
 	{
 		gsize len = 0;
 		char **keys;
-		
+
 		keys = g_key_file_get_keys(gkfile, name, &len, &error);
 		if (error)
 		{
@@ -280,7 +280,7 @@
 	{
 		gsize len = 0;
 		char **keys;
-		
+
 		keys = g_key_file_get_keys(gkfile, kname, &len, &error);
 		if (error)
 		{
@@ -331,14 +331,14 @@
 #if GLIB_CHECK_VERSION(2,6,0)
 	char *name;
 	GError *error = NULL;
-	
+
 	name = g_strdup_printf("%s::remap", g_type_name(type));
 
 	if (g_key_file_has_group(gkfile, name))
 	{
 		gsize len = 0;
 		char **keys;
-		
+
 		keys = g_key_file_get_keys(gkfile, name, &len, &error);
 		if (error)
 		{
--- a/finch/libgnt/gnttextview.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/finch/libgnt/gnttextview.c	Sat Feb 12 04:17:09 2011 +0900
@@ -165,7 +165,7 @@
 
 		if (showing + position > rows)
 			position = rows - showing;
-		
+
 		if (showing + position == rows && view->list && view->list->prev)
 			position = MAX(1, rows - 1 - showing);
 		else if (showing + position < rows && view->list && !view->list->prev)
@@ -456,7 +456,7 @@
 	GntTextView *view = GNT_TEXT_VIEW(widget);
 	GntTextLine *line = g_new0(GntTextLine, 1);
 
-	GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_NO_BORDER | GNT_WIDGET_NO_SHADOW | 
+	GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_NO_BORDER | GNT_WIDGET_NO_SHADOW |
             GNT_WIDGET_GROW_Y | GNT_WIDGET_GROW_X);
 	widget->priv.minw = 5;
 	widget->priv.minh = 2;
@@ -636,7 +636,7 @@
 			list = g_list_last(view->list);
 		view->list = list;
 	}
-		
+
 	gnt_widget_draw(GNT_WIDGET(view));
 }
 
@@ -644,7 +644,7 @@
 {
 	GntTextLine *line = g_new0(GntTextLine, 1);
 	GList *list = view->list;
-	
+
 	view->list = g_list_prepend(g_list_first(view->list), line);
 	view->list = list;
 	gnt_widget_draw(GNT_WIDGET(view));
--- a/finch/libgnt/gnttree.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/finch/libgnt/gnttree.c	Sat Feb 12 04:17:09 2011 +0900
@@ -275,7 +275,7 @@
 	return get_root_distance(get_prev(row)) + 1;
 }
 
-/* Returns the distance between a and b. 
+/* Returns the distance between a and b.
  * If a is 'above' b, then the distance is positive */
 static int
 get_distance(GntTreeRow *a, GntTreeRow *b)
@@ -627,7 +627,7 @@
 	GntTree *tree = GNT_TREE(widget);
 
 	redraw_tree(tree);
-	
+
 	GNTDEBUG;
 }
 
@@ -1066,7 +1066,7 @@
 			)
 		);
 
-	signals[SIG_SELECTION_CHANGED] = 
+	signals[SIG_SELECTION_CHANGED] =
 		g_signal_new("selection-changed",
 					 G_TYPE_FROM_CLASS(klass),
 					 G_SIGNAL_RUN_LAST,
@@ -1074,7 +1074,7 @@
 					 NULL, NULL,
 					 gnt_closure_marshal_VOID__POINTER_POINTER,
 					 G_TYPE_NONE, 2, G_TYPE_POINTER, G_TYPE_POINTER);
-	signals[SIG_SCROLLED] = 
+	signals[SIG_SCROLLED] =
 		g_signal_new("scrolled",
 					 G_TYPE_FROM_CLASS(klass),
 					 G_SIGNAL_RUN_LAST,
@@ -1082,7 +1082,7 @@
 					 NULL, NULL,
 					 g_cclosure_marshal_VOID__INT,
 					 G_TYPE_NONE, 1, G_TYPE_INT);
-	signals[SIG_TOGGLED] = 
+	signals[SIG_TOGGLED] =
 		g_signal_new("toggled",
 					 G_TYPE_FROM_CLASS(klass),
 					 G_SIGNAL_RUN_LAST,
@@ -1090,7 +1090,7 @@
 					 NULL, NULL,
 					 g_cclosure_marshal_VOID__POINTER,
 					 G_TYPE_NONE, 1, G_TYPE_POINTER);
-	signals[SIG_COLLAPSED] = 
+	signals[SIG_COLLAPSED] =
 		g_signal_new("collapse-toggled",
 					 G_TYPE_FROM_CLASS(klass),
 					 G_SIGNAL_RUN_LAST,
@@ -1384,7 +1384,7 @@
 			}
 		}
 
-		if (pr == NULL && parent)	
+		if (pr == NULL && parent)
 		{
 			pr = g_hash_table_lookup(tree->hash, parent);
 			if (pr)
@@ -1564,7 +1564,7 @@
 	GntTreeCol *col;
 
 	g_return_if_fail(colno < tree->ncol);
-	
+
 	row = g_hash_table_lookup(tree->hash, key);
 	if (row)
 	{
@@ -1601,7 +1601,7 @@
 				while (r->next)
 					r = r->next;
 				bigbro = r->key;
-			} 
+			}
 		}
 	}
 	row = gnt_tree_add_row_after(tree, key, row, parent, bigbro);
--- a/finch/libgnt/gnttree.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/finch/libgnt/gnttree.h	Sat Feb 12 04:17:09 2011 +0900
@@ -62,9 +62,9 @@
 
 	GntTreeRow *top;        /* The topmost visible item */
 	GntTreeRow *bottom;     /* The bottommost visible item */
-	
+
 	GntTreeRow *root;       /* The root of all evil */
-	
+
 	GList *list;            /* List of GntTreeRow s */
 	GHashTable *hash;       /* We need this for quickly referencing the rows */
 	guint (*hash_func)(gconstpointer);
@@ -216,7 +216,7 @@
  * @return A list of texts of a row. The list and its data should be
  *         freed by the caller. The caller should make sure that if
  *         any column of the tree contains binary data, it's not freed.
- * @see gnt_tree_get_selection_text_list 
+ * @see gnt_tree_get_selection_text_list
  * @see gnt_tree_get_selection_text
  */
 GList * gnt_tree_get_row_text_list(GntTree *tree, gpointer key);
@@ -482,7 +482,7 @@
  * @param func  The comparison function, which is used to compare
  *              the keys
  *
- * @see gnt_tree_sort_row 
+ * @see gnt_tree_sort_row
  */
 void gnt_tree_set_compare_func(GntTree *tree, GCompareFunc func);
 
@@ -535,7 +535,7 @@
  * Set whether a column is visible or not.
  * This can be useful when, for example, we want to store some data
  * which we don't want/need to display.
- * 
+ *
  * @param tree  The tree
  * @param col   The index of the column
  * @param vis   If @c FALSE, the column will not be displayed
@@ -545,7 +545,7 @@
 /**
  * Set whether a column can be resized to keep the same ratio when the
  * tree is resized.
- * 
+ *
  * @param tree  The tree
  * @param col   The index of the column
  * @param res   If @c FALSE, the column will not be resized when the
--- a/finch/libgnt/gntutils.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/finch/libgnt/gntutils.h	Sat Feb 12 04:17:09 2011 +0900
@@ -66,7 +66,7 @@
 const char *gnt_util_onscreen_width_to_pointer(const char *str, int len, int *w);
 
 /**
- * Inserts newlines in 'string' where necessary so that its onscreen width is 
+ * Inserts newlines in 'string' where necessary so that its onscreen width is
  * no more than 'maxw'.
  *
  * @param string  The string.
@@ -107,7 +107,7 @@
 
 /**
  * Get a helpful display about the bindings of a widget.
- * 
+ *
  * @param widget The widget to get bindings for.
  *
  * @return Returns a GntTree populated with "key" -> "binding" for the widget.
@@ -126,7 +126,7 @@
  *      </vwindow>",
  *   2, &win, &button);
  * @endcode
- * 
+ *
  * @param string  The XML string.
  * @param num     The number of widgets to return, followed by 'num' GntWidget **
  */
--- a/finch/libgnt/gntwidget.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/finch/libgnt/gntwidget.c	Sat Feb 12 04:17:09 2011 +0900
@@ -126,12 +126,12 @@
 	klass->lost_focus = gnt_widget_focus_change;
 	klass->gained_focus = gnt_widget_focus_change;
 	klass->confirm_size = gnt_widget_dummy_confirm_size;
-	
+
 	klass->key_pressed = NULL;
 	klass->activate = NULL;
 	klass->clicked = NULL;
-	
-	signals[SIG_DESTROY] = 
+
+	signals[SIG_DESTROY] =
 		g_signal_new("destroy",
 					 G_TYPE_FROM_CLASS(klass),
 					 G_SIGNAL_RUN_LAST,
@@ -139,7 +139,7 @@
 					 NULL, NULL,
 					 g_cclosure_marshal_VOID__VOID,
 					 G_TYPE_NONE, 0);
-	signals[SIG_GIVE_FOCUS] = 
+	signals[SIG_GIVE_FOCUS] =
 		g_signal_new("gained-focus",
 					 G_TYPE_FROM_CLASS(klass),
 					 G_SIGNAL_RUN_LAST,
@@ -147,7 +147,7 @@
 					 NULL, NULL,
 					 g_cclosure_marshal_VOID__VOID,
 					 G_TYPE_NONE, 0);
-	signals[SIG_LOST_FOCUS] = 
+	signals[SIG_LOST_FOCUS] =
 		g_signal_new("lost-focus",
 					 G_TYPE_FROM_CLASS(klass),
 					 G_SIGNAL_RUN_LAST,
@@ -155,7 +155,7 @@
 					 NULL, NULL,
 					 g_cclosure_marshal_VOID__VOID,
 					 G_TYPE_NONE, 0);
-	signals[SIG_ACTIVATE] = 
+	signals[SIG_ACTIVATE] =
 		g_signal_new("activate",
 					 G_TYPE_FROM_CLASS(klass),
 					 G_SIGNAL_RUN_LAST,
@@ -163,7 +163,7 @@
 					 NULL, NULL,
 					 g_cclosure_marshal_VOID__VOID,
 					 G_TYPE_NONE, 0);
-	signals[SIG_MAP] = 
+	signals[SIG_MAP] =
 		g_signal_new("map",
 					 G_TYPE_FROM_CLASS(klass),
 					 G_SIGNAL_RUN_LAST,
@@ -171,7 +171,7 @@
 					 NULL, NULL,
 					 g_cclosure_marshal_VOID__VOID,
 					 G_TYPE_NONE, 0);
-	signals[SIG_DRAW] = 
+	signals[SIG_DRAW] =
 		g_signal_new("draw",
 					 G_TYPE_FROM_CLASS(klass),
 					 G_SIGNAL_RUN_LAST,
@@ -179,7 +179,7 @@
 					 NULL, NULL,
 					 g_cclosure_marshal_VOID__VOID,
 					 G_TYPE_NONE, 0);
-	signals[SIG_HIDE] = 
+	signals[SIG_HIDE] =
 		g_signal_new("hide",
 					 G_TYPE_FROM_CLASS(klass),
 					 G_SIGNAL_RUN_LAST,
@@ -187,7 +187,7 @@
 					 NULL, NULL,
 					 g_cclosure_marshal_VOID__VOID,
 					 G_TYPE_NONE, 0);
-	signals[SIG_EXPOSE] = 
+	signals[SIG_EXPOSE] =
 		g_signal_new("expose",
 					 G_TYPE_FROM_CLASS(klass),
 					 G_SIGNAL_RUN_LAST,
@@ -195,7 +195,7 @@
 					 NULL, NULL,
 					 gnt_closure_marshal_VOID__INT_INT_INT_INT,
 					 G_TYPE_NONE, 4, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT);
-	signals[SIG_POSITION] = 
+	signals[SIG_POSITION] =
 		g_signal_new("position-set",
 					 G_TYPE_FROM_CLASS(klass),
 					 G_SIGNAL_RUN_LAST,
@@ -203,7 +203,7 @@
 					 NULL, NULL,
 					 gnt_closure_marshal_VOID__INT_INT,
 					 G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_INT);
-	signals[SIG_SIZE_REQUEST] = 
+	signals[SIG_SIZE_REQUEST] =
 		g_signal_new("size_request",
 					 G_TYPE_FROM_CLASS(klass),
 					 G_SIGNAL_RUN_LAST,
@@ -211,7 +211,7 @@
 					 NULL, NULL,
 					 g_cclosure_marshal_VOID__VOID,
 					 G_TYPE_NONE, 0);
-	signals[SIG_SIZE_CHANGED] = 
+	signals[SIG_SIZE_CHANGED] =
 		g_signal_new("size_changed",
 					 G_TYPE_FROM_CLASS(klass),
 					 G_SIGNAL_RUN_LAST,
@@ -219,7 +219,7 @@
 					 NULL, NULL,
 					 gnt_closure_marshal_VOID__INT_INT,
 					 G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_INT);
-	signals[SIG_CONFIRM_SIZE] = 
+	signals[SIG_CONFIRM_SIZE] =
 		g_signal_new("confirm_size",
 					 G_TYPE_FROM_CLASS(klass),
 					 G_SIGNAL_RUN_LAST,
@@ -227,7 +227,7 @@
 					 NULL, NULL,
 					 gnt_closure_marshal_BOOLEAN__INT_INT,
 					 G_TYPE_BOOLEAN, 2, G_TYPE_INT, G_TYPE_INT);
-	signals[SIG_KEY_PRESSED] = 
+	signals[SIG_KEY_PRESSED] =
 		g_signal_new("key_pressed",
 					 G_TYPE_FROM_CLASS(klass),
 					 G_SIGNAL_RUN_LAST,
@@ -236,7 +236,7 @@
 					 gnt_closure_marshal_BOOLEAN__STRING,
 					 G_TYPE_BOOLEAN, 1, G_TYPE_STRING);
 
-	signals[SIG_CLICKED] = 
+	signals[SIG_CLICKED] =
 		g_signal_new("clicked",
 					 G_TYPE_FROM_CLASS(klass),
 					 G_SIGNAL_RUN_LAST,
@@ -245,7 +245,7 @@
 					 gnt_closure_marshal_BOOLEAN__INT_INT_INT,
 					 G_TYPE_BOOLEAN, 3, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT);
 
-	signals[SIG_CONTEXT_MENU] = 
+	signals[SIG_CONTEXT_MENU] =
 		g_signal_new("context-menu",
 					 G_TYPE_FROM_CLASS(klass),
 					 G_SIGNAL_RUN_LAST,
--- a/finch/libgnt/gntwm.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/finch/libgnt/gntwm.c	Sat Feb 12 04:17:09 2011 +0900
@@ -151,7 +151,7 @@
 /**
  * The following is a workaround for a bug in most versions of ncursesw.
  * Read about it in: http://article.gmane.org/gmane.comp.lib.ncurses.bugs/2751
- * 
+ *
  * In short, if a panel hides one cell of a multi-cell character, then the rest
  * of the characters in that line get screwed. The workaround here is to erase
  * any such character preemptively.
@@ -665,7 +665,7 @@
 	tree = wm->windows->tree;
 
 	gnt_box_set_title(GNT_BOX(win), workspace ? "Workspace List" : "Window List");
-	
+
 	populate_window_list(wm, workspace);
 
 	if (wm->cws->ordered)
@@ -762,7 +762,7 @@
 				{  \
 					fprintf(file, "%s", end);  \
 				}  \
-			} while (0) 
+			} while (0)
 
 			CHECK(A_BOLD, "<b>", "</b>");
 			CHECK(A_UNDERLINE, "<u>", "</u>");
@@ -800,7 +800,7 @@
 				ADJUST(bg.r);
 				ADJUST(bg.b);
 				ADJUST(bg.g);
-				
+
 				if (x) fprintf(file, "</span>");
 				fprintf(file, "<span style=\"background:#%02x%02x%02x;color:#%02x%02x%02x\">",
 						bg.r, bg.g, bg.b, fg.r, fg.g, fg.b);
@@ -916,7 +916,7 @@
 shift_right(GntBindable *bindable, GList *null)
 {
 	GntWM *wm = GNT_WM(bindable);
-	
+
 	if (wm->_list.window)
 		return TRUE;
 
@@ -1032,7 +1032,7 @@
 
 	if (GNT_WIDGET_IS_FLAG_SET(win, GNT_WIDGET_NO_BORDER))
 		return;
-	
+
 	d = win->window;
 	gnt_widget_get_size(win, &w, &h);
 
@@ -1405,8 +1405,8 @@
 	klass->key_pressed  = NULL;
 	klass->mouse_clicked = NULL;
 	klass->give_focus = gnt_wm_give_focus;
-	
-	signals[SIG_NEW_WIN] = 
+
+	signals[SIG_NEW_WIN] =
 		g_signal_new("new_win",
 					 G_TYPE_FROM_CLASS(klass),
 					 G_SIGNAL_RUN_LAST,
@@ -1414,7 +1414,7 @@
 					 NULL, NULL,
 					 g_cclosure_marshal_VOID__POINTER,
 					 G_TYPE_NONE, 1, G_TYPE_POINTER);
-	signals[SIG_DECORATE_WIN] = 
+	signals[SIG_DECORATE_WIN] =
 		g_signal_new("decorate_win",
 					 G_TYPE_FROM_CLASS(klass),
 					 G_SIGNAL_RUN_LAST,
@@ -1422,7 +1422,7 @@
 					 NULL, NULL,
 					 g_cclosure_marshal_VOID__POINTER,
 					 G_TYPE_NONE, 1, G_TYPE_POINTER);
-	signals[SIG_CLOSE_WIN] = 
+	signals[SIG_CLOSE_WIN] =
 		g_signal_new("close_win",
 					 G_TYPE_FROM_CLASS(klass),
 					 G_SIGNAL_RUN_LAST,
@@ -1430,7 +1430,7 @@
 					 NULL, NULL,
 					 g_cclosure_marshal_VOID__POINTER,
 					 G_TYPE_NONE, 1, G_TYPE_POINTER);
-	signals[SIG_CONFIRM_RESIZE] = 
+	signals[SIG_CONFIRM_RESIZE] =
 		g_signal_new("confirm_resize",
 					 G_TYPE_FROM_CLASS(klass),
 					 G_SIGNAL_RUN_LAST,
@@ -1439,7 +1439,7 @@
 					 gnt_closure_marshal_BOOLEAN__POINTER_POINTER_POINTER,
 					 G_TYPE_BOOLEAN, 3, G_TYPE_POINTER, G_TYPE_POINTER, G_TYPE_POINTER);
 
-	signals[SIG_CONFIRM_MOVE] = 
+	signals[SIG_CONFIRM_MOVE] =
 		g_signal_new("confirm_move",
 					 G_TYPE_FROM_CLASS(klass),
 					 G_SIGNAL_RUN_LAST,
@@ -1448,7 +1448,7 @@
 					 gnt_closure_marshal_BOOLEAN__POINTER_POINTER_POINTER,
 					 G_TYPE_BOOLEAN, 3, G_TYPE_POINTER, G_TYPE_POINTER, G_TYPE_POINTER);
 
-	signals[SIG_RESIZED] = 
+	signals[SIG_RESIZED] =
 		g_signal_new("window_resized",
 					 G_TYPE_FROM_CLASS(klass),
 					 G_SIGNAL_RUN_LAST,
@@ -1456,7 +1456,7 @@
 					 NULL, NULL,
 					 g_cclosure_marshal_VOID__POINTER,
 					 G_TYPE_NONE, 1, G_TYPE_POINTER);
-	signals[SIG_MOVED] = 
+	signals[SIG_MOVED] =
 		g_signal_new("window_moved",
 					 G_TYPE_FROM_CLASS(klass),
 					 G_SIGNAL_RUN_LAST,
@@ -1464,7 +1464,7 @@
 					 NULL, NULL,
 					 g_cclosure_marshal_VOID__POINTER,
 					 G_TYPE_NONE, 1, G_TYPE_POINTER);
-	signals[SIG_UPDATE_WIN] = 
+	signals[SIG_UPDATE_WIN] =
 		g_signal_new("window_update",
 					 G_TYPE_FROM_CLASS(klass),
 					 G_SIGNAL_RUN_LAST,
@@ -1473,7 +1473,7 @@
 					 g_cclosure_marshal_VOID__POINTER,
 					 G_TYPE_NONE, 1, G_TYPE_POINTER);
 
-	signals[SIG_GIVE_FOCUS] = 
+	signals[SIG_GIVE_FOCUS] =
 		g_signal_new("give_focus",
 					 G_TYPE_FROM_CLASS(klass),
 					 G_SIGNAL_RUN_LAST,
@@ -1482,7 +1482,7 @@
 					 g_cclosure_marshal_VOID__POINTER,
 					 G_TYPE_NONE, 1, G_TYPE_POINTER);
 
-	signals[SIG_MOUSE_CLICK] = 
+	signals[SIG_MOUSE_CLICK] =
 		g_signal_new("mouse_clicked",
 					 G_TYPE_FROM_CLASS(klass),
 					 G_SIGNAL_RUN_LAST,
@@ -1491,7 +1491,7 @@
 					 gnt_closure_marshal_BOOLEAN__INT_INT_INT_POINTER,
 					 G_TYPE_BOOLEAN, 4, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_POINTER);
 
-	signals[SIG_TERMINAL_REFRESH] = 
+	signals[SIG_TERMINAL_REFRESH] =
 		g_signal_new("terminal-refresh",
 					 G_TYPE_FROM_CLASS(klass),
 					 G_SIGNAL_RUN_LAST,
--- a/finch/libgnt/gntws.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/finch/libgnt/gntws.h	Sat Feb 12 04:17:09 2011 +0900
@@ -46,7 +46,7 @@
 	GList *list;
 	GList *ordered;
 	gpointer ui_data;
-	
+
 	void *res1;
 	void *res2;
 	void *res3;
--- a/finch/libgnt/test/combo.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/finch/libgnt/test/combo.c	Sat Feb 12 04:17:09 2011 +0900
@@ -37,7 +37,7 @@
 	freopen(".error", "w", stderr);
 	gnt_init();
 #endif
-	
+
 	box = gnt_box_new(FALSE, TRUE);
 	gnt_widget_set_name(box, "box");
 	gnt_box_set_alignment(GNT_BOX(box), GNT_ALIGN_MID);
--- a/finch/libgnt/test/focus.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/finch/libgnt/test/focus.c	Sat Feb 12 04:17:09 2011 +0900
@@ -24,7 +24,7 @@
 	freopen(".error", "w", stderr);
 	gnt_init();
 #endif
-	
+
 	GntWidget *label = gnt_label_new("So wassup dudes and dudettes!!\u4e0a1\u6d772\u67003\u4f4e4\u67085\nSo this is, like,\nthe third line!! \\o/");
 	GntWidget *vbox, *hbox, *tree, *box, *button;
 	WINDOW *test;
@@ -78,7 +78,7 @@
 	gnt_box_add_widget(GNT_BOX(vbox), button);
 
 	gnt_box_add_widget(GNT_BOX(hbox), vbox);
-	
+
 	gnt_widget_show(hbox);
 
 #ifdef STANDALONE
--- a/finch/libgnt/test/tv.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/finch/libgnt/test/tv.c	Sat Feb 12 04:17:09 2011 +0900
@@ -45,7 +45,7 @@
 			return FALSE;
 		return TRUE;
 	}
-		
+
 	return FALSE;
 }
 
--- a/finch/libgnt/test/wm.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/finch/libgnt/test/wm.c	Sat Feb 12 04:17:09 2011 +0900
@@ -35,7 +35,7 @@
 			gnt_widget_show(widget);
 		}
 	}
-	
+
 	return TRUE;
 }
 
@@ -61,7 +61,7 @@
 	gnt_main();
 
 	gnt_quit();
-	
+
 	return 0;
 }
 
--- a/finch/libgnt/wms/s.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/finch/libgnt/wms/s.c	Sat Feb 12 04:17:09 2011 +0900
@@ -146,11 +146,11 @@
 	if (!widget)
 		return FALSE;
 		/* This might be a place to bring up a context menu */
-	
+
 	if (event != GNT_LEFT_MOUSE_DOWN ||
 			GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_NO_BORDER))
 		return FALSE;
-	
+
 	gnt_widget_get_position(widget, &x, &y);
 	gnt_widget_get_size(widget, &w, &h);
 
--- a/finch/plugins/gntgf.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/finch/plugins/gntgf.c	Sat Feb 12 04:17:09 2011 +0900
@@ -134,7 +134,7 @@
 	ids = getenv("WINDOWID");
 	if (ids == NULL)
 		return;
-	
+
 	id = atoi(ids);
 
 	dpy = XOpenDisplay(NULL);
@@ -255,7 +255,7 @@
 
 	if (flags & PURPLE_MESSAGE_WHISPER)
 		return;
-	
+
 	nick = PURPLE_CONV_CHAT(conv)->nick;
 
 	if (g_utf8_collate(sender, nick) == 0)
@@ -401,7 +401,7 @@
 {
 	purple_prefs_add_none("/plugins");
 	purple_prefs_add_none("/plugins/gnt");
-	
+
 	purple_prefs_add_none("/plugins/gnt/gntgf");
 	purple_prefs_add_none(PREFS_EVENT);
 
--- a/libpurple/certificate.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/certificate.c	Sat Feb 12 04:17:09 2011 +0900
@@ -314,7 +314,7 @@
 		uid = purple_certificate_get_unique_id(issuer);
 
 		ret = purple_certificate_get_times(issuer, &activation, &expiration);
-		if (!ret || now < activation || now > expiration) { 
+		if (!ret || now < activation || now > expiration) {
 			if (!ret)
 				purple_debug_error("certificate",
 						"...Failed to get validity times for certificate %s\n"
@@ -413,7 +413,7 @@
 	return (array1->len == array2->len) &&
 		(0 == memcmp(array1->data, array2->data, array1->len));
 }
-	
+
 GByteArray *
 purple_certificate_get_fingerprint_sha1(PurpleCertificate *crt)
 {
@@ -1602,7 +1602,7 @@
 	GSList *ca_crts, *cur;
 	GByteArray *last_fpr, *ca_fpr;
 	gboolean valid = FALSE;
-	gchar *ca_id;
+	gchar *ca_id, *ca2_id;
 
 	peer_crt = (PurpleCertificate *) chain->data;
 
@@ -1619,7 +1619,6 @@
 		return;
 	} /* if (self signed) */
 
-	/* Next, attempt to verify the last certificate against a CA */
 	ca = purple_certificate_find_pool(x509_tls_cached.scheme_name, "ca");
 
 	/* Next, check that the certificate chain is valid */
@@ -1669,6 +1668,9 @@
 		return;
 	} /* if (signature chain not good) */
 
+	/* Next, attempt to verify the last certificate is signed by a trusted
+	 * CA, or is a trusted CA (based on fingerprint).
+	 */
 	/* If, for whatever reason, there is no Certificate Authority pool
 	   loaded, we'll verify the subject name and then warn about thsi. */
 	if ( !ca ) {
@@ -1684,27 +1686,31 @@
 
 	end_crt = g_list_last(chain)->data;
 
-	/* Attempt to look up the last certificate's issuer */
-	ca_id = purple_certificate_get_issuer_unique_id(end_crt);
+	/* Attempt to look up the last certificate, and the last certificate's
+	 * issuer. 
+	 */
+	ca_id  = purple_certificate_get_issuer_unique_id(end_crt);
+	ca2_id = purple_certificate_get_unique_id(end_crt);
 	purple_debug_info("certificate/x509/tls_cached",
 			  "Checking for a CA with DN=%s\n",
 			  ca_id);
-	ca_crts = x509_ca_get_certs(ca_id);
+	purple_debug_info("certificate/x509/tls_cached",
+			  "Also checking for a CA with DN=%s\n",
+			  ca2_id);
+	ca_crts = g_slist_concat(x509_ca_get_certs(ca_id), x509_ca_get_certs(ca2_id));
+	g_free(ca_id);
+	g_free(ca2_id);
 	if ( NULL == ca_crts ) {
 		flags |= PURPLE_CERTIFICATE_CA_UNKNOWN;
 
 		purple_debug_warning("certificate/x509/tls_cached",
-				  "Certificate Authority with DN='%s' not "
-				  "found. I'll prompt the user, I guess.\n",
-				  ca_id);
-		g_free(ca_id);
+				  "No Certificate Authorities with either DN found "
+				  "found. I'll prompt the user, I guess.\n");
 
 		x509_tls_cached_check_subject_name(vrq, flags);
 		return;
 	}
 
-	g_free(ca_id);
-
 	/*
 	 * Check the fingerprints; if they match, then this certificate *is* one
 	 * of the designated "trusted roots", and we don't need to verify the
@@ -1714,10 +1720,6 @@
 	 *
 	 * If the fingerprints don't match, we'll fall back to checking the
 	 * signature.
-	 *
-	 * GnuTLS doesn't seem to include the final root in the verification
-	 * list, so this check will never succeed.  NSS *does* include it in
-	 * the list, so here we are.
 	 */
 	last_fpr = purple_certificate_get_fingerprint_sha1(end_crt);
 	for (cur = ca_crts; cur; cur = cur->next) {
--- a/libpurple/cipher.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/cipher.c	Sat Feb 12 04:17:09 2011 +0900
@@ -249,7 +249,7 @@
 	purple_cipher_context_reset(context, NULL);
 
 	md5_context = purple_cipher_context_get_data(context);
-	memset(md5_context, 0, sizeof(md5_context));
+	memset(md5_context, 0, sizeof(*md5_context));
 
 	g_free(md5_context);
 	md5_context = NULL;
@@ -705,7 +705,7 @@
 	purple_cipher_context_reset(context, NULL);
 
 	md4_context = purple_cipher_context_get_data(context);
-	memset(md4_context, 0, sizeof(md4_context));
+	memset(md4_context, 0, sizeof(*md4_context));
 
 	g_free(md4_context);
 	md4_context = NULL;
@@ -1356,7 +1356,7 @@
 	struct _des_ctx *des_context;
 
 	des_context = purple_cipher_context_get_data(context);
-	memset(des_context, 0, sizeof(des_context));
+	memset(des_context, 0, sizeof(*des_context));
 
 	g_free(des_context);
 	des_context = NULL;
@@ -1706,7 +1706,7 @@
 	struct _des3_ctx *des3_context;
 
 	des3_context = purple_cipher_context_get_data(context);
-	memset(des3_context, 0, sizeof(des3_context));
+	memset(des3_context, 0, sizeof(*des3_context));
 
 	g_free(des3_context);
 	des3_context = NULL;
@@ -2382,7 +2382,7 @@
 	struct RC4Context *rc4_ctx;
 
 	rc4_ctx = purple_cipher_context_get_data(context);
-	memset(rc4_ctx, 0, sizeof(rc4_ctx));
+	memset(rc4_ctx, 0, sizeof(*rc4_ctx));
 
 	g_free(rc4_ctx);
 	rc4_ctx = NULL;
@@ -2828,7 +2828,7 @@
 	if(cipher->ops && cipher->ops->uninit)
 		cipher->ops->uninit(context);
 
-	memset(context, 0, sizeof(context));
+	memset(context, 0, sizeof(*context));
 	g_free(context);
 	context = NULL;
 }
--- a/libpurple/conversation.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/conversation.c	Sat Feb 12 04:17:09 2011 +0900
@@ -1003,12 +1003,6 @@
 		}
 	}
 
-	if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) {
-		if ((flags & PURPLE_MESSAGE_RECV) == PURPLE_MESSAGE_RECV) {
-			purple_conv_im_set_typing_state(PURPLE_CONV_IM(conv), PURPLE_NOT_TYPING);
-		}
-	}
-
 	if (ops && ops->write_conv)
 		ops->write_conv(conv, who, alias, displayed, flags, mtime);
 
@@ -1243,6 +1237,10 @@
 		purple_conversation_write(c, who, tmpmessage, flags, mtime);
 
 	g_free(tmpmessage);
+
+	if ((flags & PURPLE_MESSAGE_RECV) == PURPLE_MESSAGE_RECV) {
+		purple_conv_im_set_typing_state(im, PURPLE_NOT_TYPING);
+	}
 }
 
 gboolean purple_conv_present_error(const char *who, PurpleAccount *account, const char *what)
@@ -2312,7 +2310,7 @@
 						 purple_value_new(PURPLE_TYPE_SUBTYPE,
 										PURPLE_SUBTYPE_CONVERSATION),
 						 purple_value_new(PURPLE_TYPE_UINT));
-	
+
 	purple_signal_register(handle, "sent-attention",
 						 purple_marshal_VOID__POINTER_POINTER_POINTER_UINT,
 						 NULL, 4,
@@ -2322,7 +2320,7 @@
 						 purple_value_new(PURPLE_TYPE_SUBTYPE,
 										PURPLE_SUBTYPE_CONVERSATION),
 						 purple_value_new(PURPLE_TYPE_UINT));
-	
+
 	purple_signal_register(handle, "got-attention",
 						 purple_marshal_VOID__POINTER_POINTER_POINTER_UINT,
 						 NULL, 4,
@@ -2332,7 +2330,7 @@
 						 purple_value_new(PURPLE_TYPE_SUBTYPE,
 										PURPLE_SUBTYPE_CONVERSATION),
 						 purple_value_new(PURPLE_TYPE_UINT));
-	
+
 	purple_signal_register(handle, "sending-im-msg",
 						 purple_marshal_VOID__POINTER_POINTER_POINTER,
 						 NULL, 3,
--- a/libpurple/core.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/core.h	Sat Feb 12 04:17:09 2011 +0900
@@ -201,7 +201,7 @@
  *   <dd>the type of UI. Possible values include 'pc', 'console', 'phone',
  *       'handheld', 'web', and 'bot'. These values are compared
  *       programmatically and should not be localized.</dd>
- *   
+ *
  * </dl>
  *
  * @return A GHashTable with strings for keys and values.  This
--- a/libpurple/dbus-analyze-functions.py	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/dbus-analyze-functions.py	Sat Feb 12 04:17:09 2011 +0900
@@ -3,7 +3,7 @@
 import sys
 
 # types translated into "int"
-simpletypes = ["int", "gint", "guint", "gboolean", "gpointer", "size_t", "gssize", "time_t"]
+simpletypes = ["int", "gint", "guint", "gboolean", "size_t", "gssize", "time_t"]
 
 # List "excluded" contains functions that shouldn't be exported via
 # DBus.  If you remove a function from this list, please make sure
--- a/libpurple/dbus-analyze-signals.py	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/dbus-analyze-signals.py	Sat Feb 12 04:17:09 2011 +0900
@@ -32,7 +32,7 @@
         continue
 
     signal = nameregex.sub(lambda x:x.group()[1].upper(), '-'+signal)
-    print "\"<signal name='%s'>\\n\""%signal
+    print "\"    <signal name='%s'>\\n\""%signal
 
     args = marshal.split('_')
     # ['purple', 'marshal', <return type>, '', args...]
@@ -52,9 +52,9 @@
                 type = 't'
             elif arg == "BOOLEAN":
                 type = 'b'
-            print "\"<arg type='%s'/>\\n\""%type
+            print "\"      <arg type='%s'/>\\n\""%type
 
-    print "\"</signal>\\n\""
+    print "\"    </signal>\\n\""
 
 print ";"
 
--- a/libpurple/dbus-server.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/dbus-server.c	Sat Feb 12 04:17:09 2011 +0900
@@ -501,7 +501,9 @@
 
 	g_string_append(str, "<!DOCTYPE node PUBLIC '-//freedesktop//DTD D-BUS Object Introspection 1.0//EN' 'http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd'>\n");
 	g_string_append_printf(str, "<node name='%s'>\n", DBUS_PATH_PURPLE);
-	g_string_append_printf(str, "<interface name='%s'>\n", DBUS_INTERFACE_PURPLE);
+	g_string_append(str, "  <interface name='org.freedesktop.DBus.Introspectable'>\n    <method name='Introspect'>\n      <arg name='data' direction='out' type='s'/>\n    </method>\n  </interface>\n\n");
+
+	g_string_append_printf(str, "  <interface name='%s'>\n", DBUS_INTERFACE_PURPLE);
 
 	bindings_list = NULL;
 	purple_signal_emit(purple_dbus_get_handle(), "dbus-introspect", &bindings_list);
@@ -517,7 +519,7 @@
 		{
 			const char *text;
 
-			g_string_append_printf(str, "<method name='%s'>\n", bindings[i].name);
+			g_string_append_printf(str, "    <method name='%s'>\n", bindings[i].name);
 
 			text = bindings[i].parameters;
 			while (*text)
@@ -529,10 +531,10 @@
 				name = dbus_gettext(&text);
 
 				g_string_append_printf(str,
-						"<arg name='%s' type='%s' direction='%s'/>\n",
+						"      <arg name='%s' type='%s' direction='%s'/>\n",
 						name, type, direction);
 			}
-			g_string_append(str, "</method>\n");
+			g_string_append(str, "    </method>\n");
 		}
 	}
 
@@ -549,7 +551,7 @@
 	}
 	g_string_append(str, signals);
 
-	g_string_append(str, "</interface>\n</node>\n");
+	g_string_append(str, "  </interface>\n</node>\n");
 
 	reply = dbus_message_new_method_return(message);
 	dbus_message_append_args(reply, DBUS_TYPE_STRING, &(str->str),
@@ -568,10 +570,8 @@
 			"dbus-method-called", connection, message))
 		return DBUS_HANDLER_RESULT_HANDLED;
 
-	if (dbus_message_get_type(message) == DBUS_MESSAGE_TYPE_METHOD_CALL &&
-			dbus_message_has_path(message, DBUS_PATH_PURPLE) &&
-			dbus_message_has_interface(message, DBUS_INTERFACE_INTROSPECTABLE) &&
-			dbus_message_has_member(message, "Introspect"))
+	if (dbus_message_is_method_call(message, DBUS_INTERFACE_INTROSPECTABLE, "Introspect") &&
+			dbus_message_has_path(message, DBUS_PATH_PURPLE))
 	{
 		DBusMessage *reply;
 		reply = purple_dbus_introspect(message);
--- a/libpurple/example/nullclient.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/example/nullclient.c	Sat Feb 12 04:17:09 2011 +0900
@@ -96,7 +96,7 @@
 	return closure->result;
 }
 
-static PurpleEventLoopUiOps glib_eventloops = 
+static PurpleEventLoopUiOps glib_eventloops =
 {
 	g_timeout_add,
 	g_source_remove,
@@ -134,7 +134,7 @@
 			name, message);
 }
 
-static PurpleConversationUiOps null_conv_uiops = 
+static PurpleConversationUiOps null_conv_uiops =
 {
 	NULL,                      /* create_conversation  */
 	NULL,                      /* destroy_conversation */
@@ -167,7 +167,7 @@
 	purple_conversations_set_ui_ops(&null_conv_uiops);
 }
 
-static PurpleCoreUiOps null_core_uiops = 
+static PurpleCoreUiOps null_core_uiops =
 {
 	NULL,
 	NULL,
--- a/libpurple/ft.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/ft.c	Sat Feb 12 04:17:09 2011 +0900
@@ -274,7 +274,7 @@
 	}
 }
 
-static void 
+static void
 purple_xfer_conversation_write_internal(PurpleXfer *xfer,
 	const char *message, gboolean is_error, gboolean print_thumbnail)
 {
@@ -302,12 +302,12 @@
 
 	if (print_thumbnail && thumbnail_data) {
 		gchar *message_with_img;
-		gpointer data = g_memdup(thumbnail_data, size); 
+		gpointer data = g_memdup(thumbnail_data, size);
 		int id = purple_imgstore_add_with_id(data, size, NULL);
 
-		message_with_img = 
+		message_with_img =
 			g_strdup_printf("<img id='%d'> %s", id, escaped);
-		purple_conversation_write(conv, NULL, message_with_img, flags, 
+		purple_conversation_write(conv, NULL, message_with_img, flags,
 			time(NULL));
 		purple_imgstore_unref_by_id(id);
 		g_free(message_with_img);
@@ -530,7 +530,7 @@
 				xfer, G_CALLBACK(purple_xfer_choose_file),
 				G_CALLBACK(cancel_recv_cb));
 		}
-			
+
 		g_free(buf);
 	} else
 		purple_xfer_choose_file(xfer);
--- a/libpurple/ft.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/ft.h	Sat Feb 12 04:17:09 2011 +0900
@@ -712,8 +712,8 @@
  * @since 2.7.0
  */
 const gchar *purple_xfer_get_thumbnail_mimetype(const PurpleXfer *xfer);
-	
-	
+
+
 /**
  * Sets the thumbnail data for a transfer
  *
--- a/libpurple/media.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/media.c	Sat Feb 12 04:17:09 2011 +0900
@@ -190,7 +190,7 @@
 {
 	GObjectClass *gobject_class = (GObjectClass*)klass;
 	parent_class = g_type_class_peek_parent(klass);
-	
+
 	gobject_class->dispose = purple_media_dispose;
 	gobject_class->finalize = purple_media_finalize;
 	gobject_class->set_property = purple_media_set_property;
@@ -416,7 +416,7 @@
 		case PROP_PRPL_DATA:
 			media->priv->prpl_data = g_value_get_pointer(value);
 			break;
-		default:	
+		default:
 			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 			break;
 	}
@@ -427,7 +427,7 @@
 {
 	PurpleMedia *media;
 	g_return_if_fail(PURPLE_IS_MEDIA(object));
-	
+
 	media = PURPLE_MEDIA(object);
 
 	switch (prop_id) {
@@ -450,8 +450,8 @@
 		case PROP_PRPL_DATA:
 			g_value_set_pointer(value, media->priv->prpl_data);
 			break;
-		default:	
-			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);	
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 			break;
 	}
 
@@ -490,7 +490,7 @@
 {
 	GList *streams;
 	GList *ret = NULL;
-	
+
 	g_return_val_if_fail(PURPLE_IS_MEDIA(media), NULL);
 
 	streams = media->priv->streams;
@@ -535,7 +535,7 @@
 		const gchar *name, gboolean initiator)
 {
 	PurpleMediaStream *media_stream;
-	
+
 	g_return_val_if_fail(session != NULL, NULL);
 
 	media_stream = g_new0(PurpleMediaStream, 1);
--- a/libpurple/media/backend-fs2.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/media/backend-fs2.c	Sat Feb 12 04:17:09 2011 +0900
@@ -126,6 +126,8 @@
 	GstElement *src;
 	GstElement *tee;
 
+	GstPad *srcpad;
+
 	PurpleMediaSessionType type;
 };
 
@@ -153,6 +155,44 @@
 {
 }
 
+static gboolean
+event_probe_cb(GstPad *srcpad, GstEvent *event, gboolean release_pad)
+{
+	if (GST_EVENT_TYPE(event) == GST_EVENT_CUSTOM_DOWNSTREAM
+		&& gst_event_has_name(event, "purple-unlink-tee")) {
+
+		const GstStructure *s = gst_event_get_structure(event);
+
+		gst_pad_unlink(srcpad, gst_pad_get_peer(srcpad));
+
+		gst_pad_remove_event_probe(srcpad,
+			g_value_get_uint(gst_structure_get_value(s, "handler-id")));
+
+		if (g_value_get_boolean(gst_structure_get_value(s, "release-pad")))
+			gst_element_release_request_pad(GST_ELEMENT_PARENT(srcpad), srcpad);
+
+		return FALSE;
+	}
+
+	return TRUE;
+}
+
+static void
+unlink_teepad_dynamic(GstPad *srcpad, gboolean release_pad)
+{
+	guint id = gst_pad_add_event_probe(srcpad, G_CALLBACK(event_probe_cb), NULL);
+
+	if (GST_IS_GHOST_PAD(srcpad))
+		srcpad = gst_ghost_pad_get_target(GST_GHOST_PAD(srcpad));
+
+	gst_element_send_event(gst_pad_get_parent_element(srcpad),
+		gst_event_new_custom(GST_EVENT_CUSTOM_DOWNSTREAM,
+			gst_structure_new("purple-unlink-tee",
+				"release-pad", G_TYPE_BOOLEAN, release_pad,
+				"handler-id", G_TYPE_UINT, id,
+				NULL)));
+}
+
 static void
 purple_media_backend_fs2_dispose(GObject *obj)
 {
@@ -168,6 +208,22 @@
 		pipeline = purple_media_manager_get_pipeline(
 				purple_media_get_manager(priv->media));
 
+		/* All connections to media sources should be blocked before confbin is
+		 * removed, to prevent freezing of any other simultaneously running
+		 * media calls. */
+		if (priv->sessions) {
+			GList *sessions = g_hash_table_get_values(priv->sessions);
+			for (; sessions; sessions =
+					g_list_delete_link(sessions, sessions)) {
+				PurpleMediaBackendFs2Session *session = sessions->data;
+				if (session->srcpad) {
+					unlink_teepad_dynamic(session->srcpad, FALSE);
+					gst_object_unref(session->srcpad);
+					session->srcpad = NULL;
+				}
+			}
+		}
+
 		gst_element_set_locked_state(priv->confbin, TRUE);
 		gst_element_set_state(GST_ELEMENT(priv->confbin),
 				GST_STATE_NULL);
@@ -305,7 +361,7 @@
 					G_CALLBACK(stream_info_cb),
 					PURPLE_MEDIA_BACKEND_FS2(object));
 			break;
-		default:	
+		default:
 			G_OBJECT_WARN_INVALID_PROPERTY_ID(
 					object, prop_id, pspec);
 			break;
@@ -318,7 +374,7 @@
 {
 	PurpleMediaBackendFs2Private *priv;
 	g_return_if_fail(PURPLE_IS_MEDIA_BACKEND_FS2(object));
-	
+
 	priv = PURPLE_MEDIA_BACKEND_FS2_GET_PRIVATE(object);
 
 	switch (prop_id) {
@@ -328,7 +384,7 @@
 		case PROP_MEDIA:
 			g_value_set_object(value, priv->media);
 			break;
-		default:	
+		default:
 			G_OBJECT_WARN_INVALID_PROPERTY_ID(
 					object, prop_id, pspec);
 			break;
@@ -1129,6 +1185,21 @@
 				g_object_set(volume, "mute", active, NULL);
 			}
 		}
+	} else if (local == TRUE && (type == PURPLE_MEDIA_INFO_HOLD ||
+			type == PURPLE_MEDIA_INFO_UNHOLD)) {
+		gboolean active = (type == PURPLE_MEDIA_INFO_HOLD);
+		GList *streams = get_streams(self, sid, name);
+		for (; streams; streams =
+				g_list_delete_link(streams, streams)) {
+			PurpleMediaBackendFs2Stream *stream = streams->data;
+			if (stream->session->type & PURPLE_MEDIA_SEND_AUDIO) {
+				g_object_set(stream->stream, "direction",
+						session_type_to_fs_stream_direction(
+						stream->session->type & ((active) ?
+						~PURPLE_MEDIA_SEND_AUDIO :
+						PURPLE_MEDIA_AUDIO)), NULL);
+			}
+		}
 	} else if (local == TRUE && (type == PURPLE_MEDIA_INFO_PAUSE ||
 			type == PURPLE_MEDIA_INFO_UNPAUSE)) {
 		gboolean active = (type == PURPLE_MEDIA_INFO_PAUSE);
@@ -1243,10 +1314,11 @@
 			session_type_to_fs_stream_direction(type);
 	GstElement *src;
 	GstPad *sinkpad, *srcpad;
+	GstPad *ghost = NULL;
 
 	if ((type_direction & FS_DIRECTION_SEND) == 0)
 		return TRUE;
- 
+
 	session_type = session_type_from_fs(
 			media_type, FS_DIRECTION_SEND);
 	src = purple_media_manager_get_element(
@@ -1282,7 +1354,7 @@
 	if (GST_ELEMENT_PARENT(priv->confbin)
 			== GST_ELEMENT_PARENT(session->src)) {
 		GstPad *pad = gst_element_get_static_pad(session->tee, "sink");
-		GstPad *ghost = gst_ghost_pad_new(NULL, pad);
+		ghost = gst_ghost_pad_new(NULL, pad);
 		gst_object_unref(pad);
 		gst_pad_set_active(ghost, TRUE);
 		gst_element_add_pad(priv->confbin, ghost);
@@ -1290,6 +1362,8 @@
 
 	gst_element_set_state(session->tee, GST_STATE_PLAYING);
 	gst_element_link(session->src, priv->confbin);
+	if (ghost)
+		session->srcpad = gst_pad_get_peer(ghost);
 
 	g_object_get(session->session, "sink-pad", &sinkpad, NULL);
 	if (session->type & PURPLE_MEDIA_SEND_AUDIO) {
@@ -1314,7 +1388,7 @@
 		srcpad = gst_element_get_request_pad(session->tee, "src%d");
 	}
 
-	purple_debug_info("backend-fs2", "connecting pad: %s\n", 
+	purple_debug_info("backend-fs2", "connecting pad: %s\n",
 			  gst_pad_link(srcpad, sinkpad) == GST_PAD_LINK_OK
 			  ? "success" : "failure");
 	gst_element_set_locked_state(session->src, FALSE);
@@ -1567,7 +1641,7 @@
 {
 	GValue value;
 	GstStructure *turn_setup = gst_structure_new("relay-info",
-				"ip", G_TYPE_STRING, ip, 
+				"ip", G_TYPE_STRING, ip,
 				"port", G_TYPE_UINT, port,
 				"username", G_TYPE_STRING, username,
 				"password", G_TYPE_STRING, password,
@@ -1584,7 +1658,7 @@
 
 	return relay_info;
 }
-                        
+
 static gboolean
 create_stream(PurpleMediaBackendFs2 *self,
 		const gchar *sess_id, const gchar *who,
@@ -1627,7 +1701,7 @@
 	++_num_params;
 
 	if (stun_ip) {
-		purple_debug_info("backend-fs2", 
+		purple_debug_info("backend-fs2",
 			"Setting stun-ip on new stream: %s\n", stun_ip);
 
 		_params[_num_params].name = "stun-ip";
@@ -1653,11 +1727,11 @@
 
 		/* should add TCP and perhaps TLS relaying options when these are
 		 supported by libnice using non-google mode */
-		
+
 		purple_debug_info("backend-fs2",
 			"Setting relay-info on new stream\n");
 		_params[_num_params].name = "relay-info";
-		g_value_init(&_params[_num_params].value, 
+		g_value_init(&_params[_num_params].value,
 			G_TYPE_VALUE_ARRAY);
 		g_value_set_boxed(&_params[_num_params].value,
 			relay_info);
--- a/libpurple/media/backend-iface.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/media/backend-iface.h	Sat Feb 12 04:17:09 2011 +0900
@@ -46,7 +46,7 @@
 
 struct _PurpleMediaBackendIface
 {
-	GTypeInterface parent_iface; /**< The parent iface class */ 
+	GTypeInterface parent_iface; /**< The parent iface class */
 
 	/** Implementable functions called with purple_media_backend_* */
 	gboolean (*add_stream) (PurpleMediaBackend *self,
--- a/libpurple/media/candidate.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/media/candidate.c	Sat Feb 12 04:17:09 2011 +0900
@@ -163,7 +163,7 @@
 		case PROP_TTL:
 			priv->ttl = g_value_get_uint(value);
 			break;
-		default:	
+		default:
 			G_OBJECT_WARN_INVALID_PROPERTY_ID(
 					object, prop_id, pspec);
 			break;
@@ -176,7 +176,7 @@
 {
 	PurpleMediaCandidatePrivate *priv;
 	g_return_if_fail(PURPLE_IS_MEDIA_CANDIDATE(object));
-	
+
 	priv = PURPLE_MEDIA_CANDIDATE_GET_PRIVATE(object);
 
 	switch (prop_id) {
@@ -227,7 +227,7 @@
 purple_media_candidate_class_init(PurpleMediaCandidateClass *klass)
 {
 	GObjectClass *gobject_class = (GObjectClass*)klass;
-	
+
 	gobject_class->finalize = purple_media_candidate_finalize;
 	gobject_class->set_property = purple_media_candidate_set_property;
 	gobject_class->get_property = purple_media_candidate_get_property;
--- a/libpurple/media/codec.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/media/codec.c	Sat Feb 12 04:17:09 2011 +0900
@@ -120,7 +120,7 @@
 		case PROP_OPTIONAL_PARAMS:
 			priv->optional_params = g_value_get_pointer(value);
 			break;
-		default:	
+		default:
 			G_OBJECT_WARN_INVALID_PROPERTY_ID(
 					object, prop_id, pspec);
 			break;
@@ -133,7 +133,7 @@
 {
 	PurpleMediaCodecPrivate *priv;
 	g_return_if_fail(PURPLE_IS_MEDIA_CODEC(object));
-	
+
 	priv = PURPLE_MEDIA_CODEC_GET_PRIVATE(object);
 
 	switch (prop_id) {
@@ -155,7 +155,7 @@
 		case PROP_OPTIONAL_PARAMS:
 			g_value_set_pointer(value, priv->optional_params);
 			break;
-		default:	
+		default:
 			G_OBJECT_WARN_INVALID_PROPERTY_ID(
 					object, prop_id, pspec);
 			break;
@@ -166,7 +166,7 @@
 purple_media_codec_class_init(PurpleMediaCodecClass *klass)
 {
 	GObjectClass *gobject_class = (GObjectClass*)klass;
-	
+
 	gobject_class->finalize = purple_media_codec_finalize;
 	gobject_class->set_property = purple_media_codec_set_property;
 	gobject_class->get_property = purple_media_codec_get_property;
--- a/libpurple/media/codec.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/media/codec.h	Sat Feb 12 04:17:09 2011 +0900
@@ -117,7 +117,7 @@
 /**
  * Gets a list of the optional parameters.
  *
- * The list consists of PurpleKeyValuePair's. 
+ * The list consists of PurpleKeyValuePair's.
  *
  * @param The codec to get the optional parameters from.
  *
--- a/libpurple/mediamanager.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/mediamanager.c	Sat Feb 12 04:17:09 2011 +0900
@@ -81,6 +81,7 @@
 	GList *output_windows;
 	gulong next_output_window_id;
 	GType backend_type;
+	GstCaps *video_caps;
 
 	PurpleMediaElementInfo *video_src;
 	PurpleMediaElementInfo *video_sink;
@@ -140,7 +141,7 @@
 {
 	GObjectClass *gobject_class = (GObjectClass*)klass;
 	parent_class = g_type_class_peek_parent(klass);
-	
+
 	gobject_class->finalize = purple_media_manager_finalize;
 
 	purple_media_manager_signals[INIT_MEDIA] = g_signal_new ("init-media",
@@ -191,6 +192,8 @@
 			g_list_delete_link(priv->elements, priv->elements)) {
 		g_object_unref(priv->elements->data);
 	}
+	if (priv->video_caps)
+		gst_caps_unref(priv->video_caps);
 	parent_class->finalize(media);
 }
 #endif
@@ -397,6 +400,7 @@
 	GstIteratorResult result;
 
 	gst_element_release_request_pad(GST_ELEMENT_PARENT(pad), pad);
+
 	iter = gst_element_iterate_src_pads(parent);
 
 	result = gst_iterator_next(iter, (gpointer)&remaining_pad);
@@ -414,6 +418,20 @@
 #endif
 
 #ifdef USE_GSTREAMER
+
+static GstCaps *
+purple_media_manager_get_video_caps(PurpleMediaManager *manager)
+{
+#ifdef USE_VV
+	if (manager->priv->video_caps == NULL)
+		manager->priv->video_caps = gst_caps_from_string("video/x-raw-yuv,"
+			"width=[250,352], height=[200,288], framerate=[1/1,20/1]");
+	return manager->priv->video_caps;
+#else
+	return NULL;
+#endif
+}
+
 GstElement *
 purple_media_manager_get_element(PurpleMediaManager *manager,
 		PurpleMediaSessionType type, PurpleMedia *media,
@@ -456,7 +474,21 @@
 			bin = gst_bin_new(id);
 			tee = gst_element_factory_make("tee", "tee");
 			gst_bin_add_many(GST_BIN(bin), ret, tee, NULL);
-			gst_element_link(ret, tee);
+
+			if (type & PURPLE_MEDIA_SEND_VIDEO) {
+				GstElement *videoscale;
+				GstElement *capsfilter;
+
+				videoscale = gst_element_factory_make("videoscale", NULL);
+				capsfilter = gst_element_factory_make("capsfilter", "prpl_video_caps");
+
+				g_object_set(G_OBJECT(capsfilter),
+					"caps", purple_media_manager_get_video_caps(manager), NULL);
+
+				gst_bin_add_many(GST_BIN(bin), videoscale, capsfilter, NULL);
+				gst_element_link_many(ret, videoscale, capsfilter, tee, NULL);
+			} else
+				gst_element_link(ret, tee);
 
 			/*
 			 * This shouldn't be necessary, but it stops it from
@@ -928,7 +960,7 @@
 
 GType
 purple_media_manager_get_backend_type(PurpleMediaManager *manager)
-{	
+{
 #ifdef USE_VV
 	g_return_val_if_fail(PURPLE_IS_MEDIA_MANAGER(manager),
 			PURPLE_MEDIA_CAPS_NONE);
@@ -1070,7 +1102,7 @@
 		case PROP_CREATE_CB:
 			priv->create = g_value_get_pointer(value);
 			break;
-		default:	
+		default:
 			G_OBJECT_WARN_INVALID_PROPERTY_ID(
 					object, prop_id, pspec);
 			break;
@@ -1083,7 +1115,7 @@
 {
 	PurpleMediaElementInfoPrivate *priv;
 	g_return_if_fail(PURPLE_IS_MEDIA_ELEMENT_INFO(object));
-	
+
 	priv = PURPLE_MEDIA_ELEMENT_INFO_GET_PRIVATE(object);
 
 	switch (prop_id) {
@@ -1099,7 +1131,7 @@
 		case PROP_CREATE_CB:
 			g_value_set_pointer(value, priv->create);
 			break;
-		default:	
+		default:
 			G_OBJECT_WARN_INVALID_PROPERTY_ID(
 					object, prop_id, pspec);
 			break;
@@ -1110,7 +1142,7 @@
 purple_media_element_info_class_init(PurpleMediaElementInfoClass *klass)
 {
 	GObjectClass *gobject_class = (GObjectClass*)klass;
-	
+
 	gobject_class->finalize = purple_media_element_info_finalize;
 	gobject_class->set_property = purple_media_element_info_set_property;
 	gobject_class->get_property = purple_media_element_info_get_property;
--- a/libpurple/network.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/network.c	Sat Feb 12 04:17:09 2011 +0900
@@ -271,7 +271,7 @@
 
 			inet_ntop(AF_INET, &sinptr->sin_addr, dst,
 				sizeof(dst));
-			purple_debug_info("network", 
+			purple_debug_info("network",
 				"found local i/f with address %s on IPv4\n", dst);
 			if (!purple_strequal(dst, "127.0.0.1")) {
 				result = g_list_append(result, g_strdup(dst));
@@ -873,7 +873,7 @@
 				purple_prefs_get_string("/purple/network/stun_server"));
 			purple_network_set_turn_server(
 				purple_prefs_get_string("/purple/network/turn_server"));
-			
+
 			if (ui_ops != NULL && ui_ops->network_connected != NULL)
 				ui_ops->network_connected();
 			break;
@@ -936,10 +936,10 @@
 #endif
 
 static void
-purple_network_ip_lookup_cb(GSList *hosts, gpointer data, 
+purple_network_ip_lookup_cb(GSList *hosts, gpointer data,
 	const char *error_message)
 {
-	const gchar **ip = (const gchar **) data; 
+	const gchar **ip = (const gchar **) data;
 
 	if (error_message) {
 		purple_debug_error("network", "lookup of IP address failed: %s\n",
@@ -949,14 +949,14 @@
 	}
 
 	if (hosts && g_slist_next(hosts)) {
-		struct sockaddr *addr = g_slist_next(hosts)->data; 
+		struct sockaddr *addr = g_slist_next(hosts)->data;
 		char dst[INET6_ADDRSTRLEN];
-		
+
 		if (addr->sa_family == AF_INET6) {
-			inet_ntop(addr->sa_family, &((struct sockaddr_in6 *) addr)->sin6_addr, 
+			inet_ntop(addr->sa_family, &((struct sockaddr_in6 *) addr)->sin6_addr,
 				dst, sizeof(dst));
 		} else {
-			inet_ntop(addr->sa_family, &((struct sockaddr_in *) addr)->sin_addr, 
+			inet_ntop(addr->sa_family, &((struct sockaddr_in *) addr)->sin_addr,
 				dst, sizeof(dst));
 		}
 
@@ -981,7 +981,7 @@
 			purple_dnsquery_a(stun_server, 3478, purple_network_ip_lookup_cb,
 				&stun_ip);
 		} else {
-			purple_debug_info("network", 
+			purple_debug_info("network",
 				"network is unavailable, don't try to update STUN IP");
 		}
 	} else if (stun_ip) {
@@ -996,11 +996,11 @@
 	if (turn_server && turn_server[0] != '\0') {
 		if (purple_network_is_available()) {
 			purple_debug_info("network", "running DNS query for TURN server\n");
-			purple_dnsquery_a(turn_server, 
-				purple_prefs_get_int("/purple/network/turn_port"), 
+			purple_dnsquery_a(turn_server,
+				purple_prefs_get_int("/purple/network/turn_port"),
 				purple_network_ip_lookup_cb, &turn_ip);
 		} else {
-			purple_debug_info("network", 
+			purple_debug_info("network",
 				"network is unavailable, don't try to update TURN IP");
 		}
 	} else if (turn_ip) {
--- a/libpurple/network.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/network.h	Sat Feb 12 04:17:09 2011 +0900
@@ -163,7 +163,7 @@
  * Libpurple does not currently do any port mapping (stateful firewall hole
  * poking) for IPv6-only listeners (if an IPv6 socket supports v4-mapped
  * addresses, a mapping is done).
- * 
+ *
  * @param socket_family The protocol family of the socket.  This should be
  *                      AF_INET for IPv4 or AF_INET6 for IPv6.  IPv6 sockets
  *                      may or may not be able to accept IPv4 connections
@@ -214,11 +214,11 @@
 
 /**
  * \copydoc purple_network_listen_range
- * 
+ *
  * Libpurple does not currently do any port mapping (stateful firewall hole
  * poking) for IPv6-only listeners (if an IPv6 socket supports v4-mapped
  * addresses, a mapping is done).
- * 
+ *
  * @param socket_family The protocol family of the socket.  This should be
  *                      AF_INET for IPv4 or AF_INET6 for IPv6.  IPv6 sockets
  *                      may or may not be able to accept IPv4 connections
--- a/libpurple/plugins/autoaccept.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/plugins/autoaccept.c	Sat Feb 12 04:17:09 2011 +0900
@@ -43,9 +43,12 @@
 
 #define PREF_PREFIX		"/plugins/core/" PLUGIN_ID
 #define PREF_PATH		PREF_PREFIX "/path"
-#define PREF_STRANGER	PREF_PREFIX "/reject_stranger"
+#define PREF_STRANGER	PREF_PREFIX "/stranger"
 #define PREF_NOTIFY		PREF_PREFIX "/notify"
 #define PREF_NEWDIR     PREF_PREFIX "/newdir"
+#define PREF_ESCAPE     PREF_PREFIX "/escape"
+
+#define PREF_STRANGER_OLD PREF_PREFIX "/reject_stranger"
 
 typedef enum
 {
@@ -88,25 +91,27 @@
 	char *filename;
 	char *dirname;
 
+    int accept_setting;
+
 	account = xfer->account;
 	node = PURPLE_BLIST_NODE(purple_find_buddy(account, xfer->who));
 
-	if (!node)
-	{
-		if (purple_prefs_get_bool(PREF_STRANGER))
-			xfer->status = PURPLE_XFER_STATUS_CANCEL_LOCAL;
-		return;
+	/* If person is on buddy list, use the buddy setting; otherwise, use the
+	   stranger setting. */
+	if (node) {
+		node = purple_blist_node_get_parent(node);
+		g_return_if_fail(PURPLE_BLIST_NODE_IS_CONTACT(node));
+		accept_setting = purple_blist_node_get_int(node, "autoaccept");
+	} else {
+		accept_setting = purple_prefs_get_int(PREF_STRANGER);
 	}
 
-	node = purple_blist_node_get_parent(node);
-	g_return_if_fail(PURPLE_BLIST_NODE_IS_CONTACT(node));
-
-	pref = purple_prefs_get_string(PREF_PATH);
-	switch (purple_blist_node_get_int(node, "autoaccept"))
+	switch (accept_setting)
 	{
 		case FT_ASK:
 			break;
 		case FT_ACCEPT:
+            pref = purple_prefs_get_string(PREF_PATH);
 			if (ensure_path_exists(pref))
 			{
 				int count = 1;
@@ -126,7 +131,12 @@
 					break;
 				}
 
-				escape = purple_escape_filename(xfer->filename);
+				/* Escape filename (if escaping is turned on) */
+				if (purple_prefs_get_bool(PREF_ESCAPE)) {
+					escape = purple_escape_filename(xfer->filename);
+				} else {
+					escape = xfer->filename;
+				}
 				filename = g_build_filename(dirname, escape, NULL);
 
 				/* Split at the first dot, to avoid uniquifying "foo.tar.gz" to "foo.tar-2.gz" */
@@ -187,7 +197,7 @@
 		node = purple_blist_node_get_parent(node);
 	g_return_if_fail(PURPLE_BLIST_NODE_IS_CONTACT(node));
 
-	message = g_strdup_printf(_("When a file-transfer request arrives from %s"), 
+	message = g_strdup_printf(_("When a file-transfer request arrives from %s"),
 					purple_contact_get_alias((PurpleContact *)node));
 	purple_request_choice(plugin, _("Set Autoaccept Setting"), message,
 						NULL, purple_blist_node_get_int(node, "autoaccept"),
@@ -220,6 +230,17 @@
 static gboolean
 plugin_load(PurplePlugin *plugin)
 {
+	/* migrate the old pref (we should only care if the plugin is actually *used*) */
+	/*
+	 * TODO: We should eventually call purple_prefs_remove(PREFS_STRANGER_OLD)
+	 *       to clean up after ourselves, but we don't want to do it yet
+	 *       so that we don't break users who share a .purple directory
+	 *       between old libpurple clients and new libpurple clients.
+	 *                                             --Mark Doliner, 2011-01-03
+	 */
+	if(purple_prefs_get_bool(PREF_STRANGER_OLD))
+		purple_prefs_set_int(PREF_STRANGER, FT_REJECT);
+
 	purple_signal_connect(purple_xfers_get_handle(), "file-recv-request", plugin,
 						PURPLE_CALLBACK(file_recv_request_cb), plugin);
 	purple_signal_connect(purple_blist_get_handle(), "blist-node-extended-menu", plugin,
@@ -247,7 +268,12 @@
 	purple_plugin_pref_frame_add(frame, pref);
 
 	pref = purple_plugin_pref_new_with_name_and_label(PREF_STRANGER,
-					_("Automatically reject from users not in buddy list"));
+					_("When a file-transfer request arrives from a user who is\n"
+                      "*not* on your buddy list:"));
+	purple_plugin_pref_set_type(pref, PURPLE_PLUGIN_PREF_CHOICE);
+	purple_plugin_pref_add_choice(pref, _("Ask"), GINT_TO_POINTER(FT_ASK));
+	purple_plugin_pref_add_choice(pref, _("Auto Accept"), GINT_TO_POINTER(FT_ACCEPT));
+	purple_plugin_pref_add_choice(pref, _("Auto Reject"), GINT_TO_POINTER(FT_REJECT));
 	purple_plugin_pref_frame_add(frame, pref);
 
 	pref = purple_plugin_pref_new_with_name_and_label(PREF_NOTIFY,
@@ -259,6 +285,10 @@
 			_("Create a new directory for each user"));
 	purple_plugin_pref_frame_add(frame, pref);
 
+	pref = purple_plugin_pref_new_with_name_and_label(PREF_ESCAPE,
+			_("Escape the filenames"));
+	purple_plugin_pref_frame_add(frame, pref);
+
 	return frame;
 }
 
@@ -315,9 +345,10 @@
 	dirname = g_build_filename(purple_user_dir(), "autoaccept", NULL);
 	purple_prefs_add_none(PREF_PREFIX);
 	purple_prefs_add_string(PREF_PATH, dirname);
-	purple_prefs_add_bool(PREF_STRANGER, TRUE);
+	purple_prefs_add_int(PREF_STRANGER, FT_ASK);
 	purple_prefs_add_bool(PREF_NOTIFY, TRUE);
 	purple_prefs_add_bool(PREF_NEWDIR, TRUE);
+	purple_prefs_add_bool(PREF_ESCAPE, TRUE);
 	g_free(dirname);
 }
 
--- a/libpurple/plugins/codeinline.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/plugins/codeinline.c	Sat Feb 12 04:17:09 2011 +0900
@@ -62,7 +62,7 @@
 {
      PURPLE_PLUGIN_MAGIC,
      PURPLE_MAJOR_VERSION,
-     PURPLE_MINOR_VERSION,     
+     PURPLE_MINOR_VERSION,
      PURPLE_PLUGIN_STANDARD,
      NULL,
      0,
--- a/libpurple/plugins/log_reader.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/plugins/log_reader.c	Sat Feb 12 04:17:09 2011 +0900
@@ -1587,7 +1587,7 @@
 
 					if (buddy != NULL)
 						alias = purple_buddy_get_alias(buddy);
-					
+
 					if (alias != NULL)
 						g_string_append(formatted, alias);
 					else
@@ -1824,7 +1824,7 @@
 				purple_str_has_prefix(c, QIP_LOG_OUT_MESSAGE)) {
 
 				char *tmp;
-				
+
 				new_line = c;
 
 				/* find EOL */
@@ -1886,7 +1886,7 @@
 			data->offset = offset;
 			offset += data->length;
 			purple_debug_info("QIP logger list",
-				"Creating log: path = (%s); length = (%d); offset = (%d)\n", 
+				"Creating log: path = (%s); length = (%d); offset = (%d)\n",
 				data->path, data->length, data->offset);
 
 			/* XXX: Look into this later... Should we pass in a struct tm? */
@@ -2323,7 +2323,7 @@
 
 	file = g_fopen(data->path, "rb");
 	g_return_val_if_fail(file != NULL, g_strdup(""));
-	
+
 	fseek(file, data->offset, SEEK_SET);
 	data->length = fread(contents, 1, data->length, file);
 	fclose(file);
@@ -2417,7 +2417,7 @@
 	g_return_val_if_fail(log != NULL, 0);
 
 	data = log->logger_data;
-	
+
 	if (purple_prefs_get_bool("/plugins/core/log_reader/fast_sizes")) {
 		return data ? data->length : 0;
 	}
--- a/libpurple/plugins/mono/loader/blist-glue.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/plugins/mono/loader/blist-glue.c	Sat Feb 12 04:17:09 2011 +0900
@@ -6,21 +6,21 @@
 MonoObject* purple_blist_get_handle_glue(void)
 {
 	void *handle = purple_blist_get_handle();
-	
+
 	return mono_value_box(ml_get_domain(), mono_get_intptr_class(), &handle);
 }
 
 MonoObject* purple_blist_build_buddy_object(void* data)
 {
 	MonoObject *obj = NULL;
-			
+
 	PurpleBuddy *buddy = (PurpleBuddy*)data;
-	
+
 	obj = ml_create_api_object("Buddy");
 	g_return_val_if_fail(obj != NULL, NULL);
-		
+
 	ml_set_prop_string(obj, "Name", (char*)purple_buddy_get_name(buddy));
 	ml_set_prop_string(obj, "Alias", (char*)purple_buddy_get_alias(buddy));
-	
+
 	return obj;
 }
--- a/libpurple/plugins/mono/loader/debug-glue.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/plugins/mono/loader/debug-glue.c	Sat Feb 12 04:17:09 2011 +0900
@@ -5,12 +5,12 @@
 {
 	char *ccat;
 	char *cstr;
-	
+
 	ccat = mono_string_to_utf8(cat);
 	cstr = mono_string_to_utf8(str);
-	
+
 	purple_debug(type, ccat, "%s", cstr);
-	
+
 	g_free(ccat);
 	g_free(cstr);
 }
--- a/libpurple/plugins/mono/loader/mono-helper.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/plugins/mono/loader/mono-helper.c	Sat Feb 12 04:17:09 2011 +0900
@@ -22,57 +22,57 @@
 gboolean ml_init()
 {
 	MonoDomain *d;
-	
+
 	g_return_val_if_fail(_runtime_active == FALSE, TRUE);
-	
+
 	d = mono_jit_init("purple");
-	
+
 	if (!d) {
 		ml_set_domain(NULL);
 		return FALSE;
 	}
-	
+
 	ml_set_domain(d);
-	
+
 	ml_init_internal_calls();
-	
+
 	_runtime_active = TRUE;
-	
+
 	return TRUE;
 }
 
 void ml_uninit()
 {
 	g_return_if_fail(_runtime_active == TRUE);
-	
+
 	mono_jit_cleanup(ml_get_domain());
-	
+
 	ml_set_domain(NULL);
-	
+
 	_runtime_active = FALSE;
 }
 
 MonoObject* ml_delegate_invoke(MonoObject *method, void **params)
 {
 	MonoObject *ret, *exception;
-	
+
 	ret = mono_runtime_delegate_invoke(method, params, &exception);
 	if (exception) {
 		purple_debug(PURPLE_DEBUG_ERROR, "mono", "caught exception: %s\n", mono_class_get_name(mono_object_get_class(exception)));
 	}
-	
+
 	return ret;
 }
 
 MonoObject* ml_invoke(MonoMethod *method, void *obj, void **params)
 {
 	MonoObject *ret, *exception;
-	
+
 	ret = mono_runtime_invoke(method, obj, params, &exception);
 	if (exception) {
 		purple_debug(PURPLE_DEBUG_ERROR, "mono", "caught exception: %s\n", mono_class_get_name(mono_object_get_class(exception)));
 	}
-	
+
 	return ret;
 }
 
@@ -84,15 +84,15 @@
 	total = mono_image_get_table_rows (image, MONO_TABLE_TYPEDEF);
 	for (i = 1; i <= total; ++i) {
 		klass = mono_class_get (image, MONO_TOKEN_TYPE_DEF | i);
-		
+
 		pklass = mono_class_get_parent(klass);
 		if (pklass) {
-		
+
 			if (strcmp("Plugin", mono_class_get_name(pklass)) == 0)
 				return klass;
 		}
 	}
-	
+
 	return NULL;
 }
 
@@ -102,15 +102,15 @@
 	MonoProperty *prop;
 	MonoString *str;
 	gpointer args[1];
-	
+
 	klass = mono_object_get_class(obj);
-	
+
 	prop = mono_class_get_property_from_name(klass, field);
-	
+
 	str = mono_string_new(ml_get_domain(), data);
-	
+
 	args[0] = str;
-	
+
 	mono_property_set_value(prop, obj, args, NULL);
 }
 
@@ -119,13 +119,13 @@
 	MonoClass *klass;
 	MonoProperty *prop;
 	MonoString *str;
-	
+
 	klass = mono_object_get_class(obj);
-	
+
 	prop = mono_class_get_property_from_name(klass, field);
-	
+
 	str = (MonoString*)mono_property_get_value(prop, obj, NULL, NULL);
-	
+
 	return mono_string_to_utf8(str);
 }
 
@@ -133,16 +133,16 @@
 {
 	MonoClass *klass;
 	MonoProperty *prop;
-	
+
 	klass = mono_class_get_parent(mono_object_get_class(obj));
-	
+
 	prop = mono_class_get_property_from_name(klass, "Info");
-	
+
 	return mono_property_get_value(prop, obj, NULL, NULL);
 }
 
 gboolean ml_is_api_dll(MonoImage *image)
-{	
+{
 	MonoClass *klass;
 	int i, total;
 
@@ -155,7 +155,7 @@
 				return TRUE;
 			}
 	}
-	
+
 	return FALSE;
 }
 
@@ -167,7 +167,7 @@
 MonoObject* ml_object_from_purple_subtype(PurpleSubType type, gpointer data)
 {
 	MonoObject *obj = NULL;
-	
+
 	switch (type) {
 		case PURPLE_SUBTYPE_BLIST_BUDDY:
 			obj = purple_blist_build_buddy_object(data);
@@ -178,7 +178,7 @@
 		default:
 		break;
 	}
-	
+
 	return obj;
 }
 
@@ -186,21 +186,21 @@
 {
 	MonoObject *obj = NULL;
 	MonoClass *klass = NULL;
-		
+
 	klass = mono_class_from_name(ml_get_api_image(), "Purple", class_name);
 	if (!klass) {
 		purple_debug(PURPLE_DEBUG_FATAL, "mono", "couldn't find the '%s' class\n", class_name);
 		return NULL;
 	}
-	
+
 	obj = mono_object_new(ml_get_domain(), klass);
 	if (!obj) {
 		purple_debug(PURPLE_DEBUG_FATAL, "mono", "couldn't create the object from class '%s'\n", class_name);
 		return NULL;
 	}
-	
+
 	mono_runtime_object_init(obj);
-	
+
 	return obj;
 }
 
@@ -241,7 +241,7 @@
 {
 	if (!plugins_hash)
 		plugins_hash = g_hash_table_new(NULL, NULL);
-		
+
 	g_hash_table_insert(plugins_hash, plugin->klass, plugin);
 }
 
--- a/libpurple/plugins/mono/loader/mono-helper.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/plugins/mono/loader/mono-helper.h	Sat Feb 12 04:17:09 2011 +0900
@@ -13,16 +13,16 @@
 
 typedef struct {
 	PurplePlugin *plugin;
-	
+
 	MonoAssembly *assm;
 	MonoClass *klass;
-	MonoObject *obj;	
-	
+	MonoObject *obj;
+
 	MonoMethod *init;
 	MonoMethod *load;
 	MonoMethod *unload;
 	MonoMethod *destroy;
-	
+
 	GList *signal_data;
 } PurpleMonoPlugin;
 
--- a/libpurple/plugins/mono/loader/signal-glue.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/plugins/mono/loader/signal-glue.c	Sat Feb 12 04:17:09 2011 +0900
@@ -22,13 +22,13 @@
 	int i;
 	gpointer meth_args[1];
 	gpointer purple_obj;
-	
+
 	va_list args;
-	
+
 	va_start(args, num_vals);
-	
+
 	array = mono_array_new(ml_get_domain(), mono_get_object_class(), num_vals);
-	
+
 	for (i = 0; i < num_vals; i++) {
 		if (purple_value_get_type(sig_data->values[i]) == PURPLE_TYPE_SUBTYPE) {
 			purple_obj = va_arg(args, gpointer);
@@ -40,22 +40,22 @@
 			mono_array_set(array, MonoObject*, i, obj);
 		}
 	}
-	
+
 	va_end(args);
-	
+
 	meth_args[0] = array;
-	
-	return ml_delegate_invoke(sig_data->func, meth_args);	
+
+	return ml_delegate_invoke(sig_data->func, meth_args);
 }
 
 static void cb_void__pointer(void *arg1, void *data)
 {
-	dispatch_callback((SignalData*)data, ((SignalData*)data)->num_vals, arg1);	
+	dispatch_callback((SignalData*)data, ((SignalData*)data)->num_vals, arg1);
 }
 
 static void cb_void__pointer_pointer_pointer(void *arg1, void *arg2, void *arg3, void *data)
 {
-	dispatch_callback((SignalData*)data, ((SignalData*)data)->num_vals, arg1, arg2, arg3);	
+	dispatch_callback((SignalData*)data, ((SignalData*)data)->num_vals, arg1, arg2, arg3);
 }
 
 
@@ -66,23 +66,23 @@
 	SignalData *sig_data;
 	PurpleMonoPlugin *mplug;
 	MonoClass *klass;
-		
+
 	sig = mono_string_to_utf8(signal);
 	purple_debug(PURPLE_DEBUG_INFO, "mono", "connecting signal: %s\n", sig);
-	
+
 	instance = (void*)mono_object_unbox(h);
-	
+
 	sig_data = g_new0(SignalData, 1);
-	
+
 	sig_data->func = func;
 	sig_data->signal = sig;
-	
+
 	purple_signal_get_values(*instance, sig, &sig_data->ret_value, &sig_data->num_vals, &sig_data->values);
-	
+
 	klass = mono_object_get_class(plugin);
-	
+
 	mplug = ml_find_plugin_by_class(klass);
-	
+
 	mplug->signal_data = g_list_append(mplug->signal_data, (gpointer)sig_data);
 
 	return purple_signal_connect(*instance, sig, (gpointer)klass, get_callback(sig_data), (gpointer)sig_data);
@@ -104,7 +104,7 @@
 	}
 }
 
-static gpointer callbacks[]= { 
+static gpointer callbacks[]= {
 										NULL,
 										cb_void__pointer,
 										NULL,
@@ -112,7 +112,7 @@
 									};
 
 static int callbacks_array_size = sizeof(callbacks) / sizeof(PurpleCallback);
-	
+
 
 static PurpleCallback get_callback(SignalData *sig_data)
 {
@@ -122,18 +122,18 @@
 		index = 0;
 	else
 		index = determine_index(purple_value_get_type(sig_data->ret_value));
-	
+
 	for (i = 0; i < sig_data->num_vals; i++) {
 		index += determine_index(purple_value_get_type(sig_data->values[i]));
 	}
-	
+
 	purple_debug(PURPLE_DEBUG_INFO, "mono", "get_callback index = %d\n", index);
-	
+
 	if (index >= callbacks_array_size || callbacks[index] == NULL) {
 		purple_debug(PURPLE_DEBUG_ERROR, "mono", "couldn't find a callback function for signal: %s\n", sig_data->signal);
 		return NULL;
 	}
-	
+
 	purple_debug(PURPLE_DEBUG_MISC, "mono", "using callback at index: %d\n", index);
 	return PURPLE_CALLBACK(callbacks[index]);
 }
--- a/libpurple/plugins/mono/loader/status-glue.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/plugins/mono/loader/status-glue.c	Sat Feb 12 04:17:09 2011 +0900
@@ -6,11 +6,11 @@
 {
 	MonoObject *obj = NULL;
 	PurpleStatus *status = (PurpleStatus*)data;
-	
+
 	obj = ml_create_api_object("Status");
 	g_return_val_if_fail(obj != NULL, NULL);
-		
+
 	ml_set_prop_string(obj, "Id", (char*)purple_status_get_id(status));
-	
+
 	return obj;
 }
--- a/libpurple/plugins/offlinemsg.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/plugins/offlinemsg.c	Sat Feb 12 04:17:09 2011 +0900
@@ -89,7 +89,7 @@
 
 	purple_pounce_action_set_enabled(pounce, "send-message", TRUE);
 	purple_pounce_action_set_attribute(pounce, "send-message", "message", offline->message);
- 
+
 	conv = offline->conv;
 	if (!purple_conversation_get_data(conv, "plugin_pack:offlinemsg"))
 		purple_conversation_write(conv, NULL, _("The rest of the messages will be saved "
@@ -156,7 +156,7 @@
 		ask = g_strdup_printf(_("\"%s\" is currently offline. Do you want to save the "
 						"rest of the messages in a pounce and automatically send them "
 						"when \"%s\" logs back in?"), who, who);
-	
+
 		purple_request_action(handle, _("Offline Message"), ask,
 					_("You can edit/delete the pounce from the `Buddy Pounces' dialog"),
 					0,
--- a/libpurple/plugins/perl/common/Makefile.PL.in	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/plugins/perl/common/Makefile.PL.in	Sat Feb 12 04:17:09 2011 +0900
@@ -10,6 +10,7 @@
       (ABSTRACT_FROM    => '@srcdir@/Purple.pm', # finds $ABSTRACT
        AUTHOR           => 'Purple <http://pidgin.im/>') : ()),
     'DEFINE'            => '@DEBUG_CFLAGS@',
+    'dynamic_lib'       => { 'OTHERLDFLAGS' => '@LDFLAGS@' },
     'INC'               => '-I. -I@srcdir@ -I@top_srcdir@ -I@top_srcdir@/libpurple @GLIB_CFLAGS@',
     'OBJECT'            => '$(O_FILES)', # link all the C files too
 #    'OPTIMIZE'          => '-g', # For debugging
--- a/libpurple/plugins/psychic.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/plugins/psychic.c	Sat Feb 12 04:17:09 2011 +0900
@@ -85,9 +85,9 @@
 
   PurplePluginPrefFrame *frame;
   PurplePluginPref *pref;
-  
+
   frame = purple_plugin_pref_frame_new();
-  
+
   pref = purple_plugin_pref_new_with_name(PREF_BUDDIES);
   purple_plugin_pref_set_label(pref, _("Only enable for users on"
 				     " the buddy list"));
@@ -118,7 +118,7 @@
 
   purple_signal_connect(convs_handle, "buddy-typing", plugin,
 		      PURPLE_CALLBACK(buddy_typing_cb), NULL);
-  
+
   return TRUE;
 }
 
@@ -127,7 +127,7 @@
   get_plugin_pref_frame,
   0,    /* page_num (Reserved) */
   NULL, /* frame (Reserved) */
-  
+
   /* padding */
   NULL,
   NULL,
@@ -145,7 +145,7 @@
   0,                      /**< flags */
   NULL,                   /**< dependencies */
   PURPLE_PRIORITY_DEFAULT,  /**< priority */
-  
+
   PLUGIN_ID,              /**< id */
   PLUGIN_NAME,            /**< name */
   DISPLAY_VERSION,        /**< version */
@@ -153,11 +153,11 @@
   PLUGIN_DESC,            /**< description */
   PLUGIN_AUTHOR,          /**< author */
   PURPLE_WEBSITE,           /**< homepage */
-  
+
   plugin_load,            /**< load */
   NULL,                   /**< unload */
   NULL,                   /**< destroy */
-  
+
   NULL,                   /**< ui_info */
   NULL,                   /**< extra_info */
   &prefs_info,            /**< prefs_info */
--- a/libpurple/plugins/ssl/ssl-nss.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/plugins/ssl/ssl-nss.c	Sat Feb 12 04:17:09 2011 +0900
@@ -289,13 +289,13 @@
 	GList * peer_certs = NULL;
 	int count;
 	int64 now = PR_Now();
-	
+
 	curcert = SSL_PeerCertificate(socket);
 	if (curcert == NULL) {
 		purple_debug_error("nss", "could not DupCertificate\n");
 		return NULL;
 	}
-	
+
 	for (count = 0 ; count < CERT_MAX_CERT_CHAIN ; count++) {
 		purple_debug_info("nss", "subject=%s issuer=%s\n", curcert->subjectName,
 						  curcert->issuerName  ? curcert->issuerName : "(null)");
@@ -530,7 +530,7 @@
 		CERT_DestroyCertificate(cert);
 #endif
 
-	
+
 
 	return NULL;
 }
@@ -587,7 +587,7 @@
 	crt = g_new0(PurpleCertificate, 1);
 	crt->scheme = &x509_nss;
 	crt->data = crt_dat;
-	
+
 	return crt;
 }
 
@@ -672,7 +672,7 @@
 
 	purple_debug_info("nss/x509",
 			  "Exporting certificate to %s\n", filename);
-	
+
 	/* First, use NSS voodoo to create a DER-formatted certificate */
 	dercrt = SEC_ASN1EncodeItem(NULL, NULL, crt_dat,
 				    SEC_ASN1_GET(SEC_SignedCertificateTemplate));
@@ -692,7 +692,7 @@
 	ret =  purple_util_write_data_to_file_absolute(filename, pemcrt, -1);
 
 	g_free(pemcrt);
-	
+
 	return ret;
 }
 
@@ -713,7 +713,7 @@
 	newcrt->scheme = &x509_nss;
 	/* NSS does refcounting automatically */
 	newcrt->data = CERT_DupCertificate(crt_dat);
-	
+
 	return newcrt;
 }
 
@@ -759,7 +759,7 @@
 	CERTCertificate *subjectCert;
 	CERTCertificate *issuerCert;
 	SECStatus st;
-	
+
 	issuerCert = X509_NSS_DATA(issuer);
 	g_return_val_if_fail(issuerCert, FALSE);
 
@@ -795,7 +795,7 @@
 	sha1sum = g_byte_array_sized_new(hashlen);
 	/* glib leaves the size as 0 by default */
 	sha1sum->len = hashlen;
-	
+
 	st = PK11_HashBuf(SEC_OID_SHA1, sha1sum->data,
 			  derCert->data, derCert->len);
 
@@ -814,7 +814,7 @@
 x509_dn (PurpleCertificate *crt)
 {
 	CERTCertificate *crt_dat;
-	
+
 	g_return_val_if_fail(crt, NULL);
 	g_return_val_if_fail(crt->scheme == &x509_nss, NULL);
 
@@ -828,7 +828,7 @@
 x509_issuer_dn (PurpleCertificate *crt)
 {
 	CERTCertificate *crt_dat;
-	
+
 	g_return_val_if_fail(crt, NULL);
 	g_return_val_if_fail(crt->scheme == &x509_nss, NULL);
 
@@ -844,7 +844,7 @@
 	CERTCertificate *crt_dat;
 	char *nss_cn;
 	gchar *ret_cn;
-	
+
 	g_return_val_if_fail(crt, NULL);
 	g_return_val_if_fail(crt->scheme == &x509_nss, NULL);
 
@@ -875,7 +875,7 @@
 {
 	CERTCertificate *crt_dat;
 	SECStatus st;
-	
+
 	g_return_val_if_fail(crt, FALSE);
 	g_return_val_if_fail(crt->scheme == &x509_nss, FALSE);
 
@@ -890,7 +890,7 @@
 	else if (st == SECFailure) {
 		return FALSE;
 	}
-	
+
 	/* If we get here...bad things! */
 	purple_debug_error("nss/x509",
 			   "x509_check_name fell through where it shouldn't "
@@ -903,7 +903,7 @@
 {
 	CERTCertificate *crt_dat;
 	PRTime nss_activ, nss_expir;
-	
+
 	g_return_val_if_fail(crt, FALSE);
 	g_return_val_if_fail(crt->scheme == &x509_nss, FALSE);
 
@@ -926,7 +926,7 @@
 	if (expiration) {
 		*expiration = nss_expir / 1000000;
 	}
-	
+
 	return TRUE;
 }
 
--- a/libpurple/plugins/tcl/tcl_cmds.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/plugins/tcl/tcl_cmds.c	Sat Feb 12 04:17:09 2011 +0900
@@ -4,7 +4,7 @@
  * purple
  *
  * Copyright (C) 2003 Ethan Blanton <eblanton@cs.purdue.edu>
- * 
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
@@ -184,7 +184,7 @@
 		if ((account = tcl_validate_account(objv[2], interp)) == NULL)
 			return TCL_ERROR;
 		if (objc == 3) {
-			Tcl_SetObjResult(interp, 
+			Tcl_SetObjResult(interp,
 					 Tcl_NewBooleanObj(
 						 purple_account_get_enabled(account,
 									    purple_core_get_ui())));
@@ -209,7 +209,7 @@
 			Tcl_WrongNumArgs(interp, 2, objv, "");
 			return TCL_ERROR;
 		}
-		Tcl_SetObjResult(interp, 
+		Tcl_SetObjResult(interp,
 				 purple_tcl_ref_new(PurpleTclRefHandle,
 						    purple_accounts_get_handle()));
 		break;
@@ -374,7 +374,7 @@
 		}
 		if ((account = tcl_validate_account(objv[2], interp)) == NULL)
 			return TCL_ERROR;
-		Tcl_SetObjResult(interp, 
+		Tcl_SetObjResult(interp,
 				 Tcl_NewStringObj((char *)purple_account_get_username(account), -1));
 		break;
 	}
@@ -865,7 +865,7 @@
 			return error;
 		from = Tcl_GetString(objv[4]);
 		what = Tcl_GetString(objv[5]);
-		
+
 		switch (style) {
 		case CMD_CONV_WRITE_SEND:
 			flags = PURPLE_MESSAGE_SEND;
@@ -1426,7 +1426,7 @@
 			Tcl_WrongNumArgs(interp, 2, objv, "");
 			return TCL_ERROR;
 		}
-		Tcl_SetObjResult(interp, 
+		Tcl_SetObjResult(interp,
 				 purple_tcl_ref_new(PurpleTclRefHandle,
 						    purple_savedstatuses_get_handle()));
 		break;
@@ -1809,7 +1809,7 @@
 		/* This isn't exactly OK, but heh.  What do you do? */
 		return TCL_OK;
 	}
-	/* We can't unload immediately, but we can unload at the first 
+	/* We can't unload immediately, but we can unload at the first
 	 * known safe opportunity. */
 	purple_timeout_add(0, unload_self, (gpointer)plugin);
 
--- a/libpurple/plugins/tcl/tcl_glib.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/plugins/tcl/tcl_glib.c	Sat Feb 12 04:17:09 2011 +0900
@@ -43,7 +43,7 @@
 
 /*
  * NOTES
- * 
+ *
  * This file was developed for the Purple project.  It inserts the Tcl
  * event loop into the glib2 event loop for the purposes of providing
  * Tcl bindings in a glib2 (e.g. Gtk2) program.  To use it, simply
@@ -51,9 +51,9 @@
  * function tcl_glib_init() before creating or using any Tcl
  * interpreters.  Then go ahead and use Tcl, Tk, whatever to your
  * heart's content.
- * 
+ *
  * BUGS
- * 
+ *
  * tcl_wait_for_event seems to have a bug that makes vwait not work so
  * well...  I'm not sure why, yet, but I haven't put much time into
  * it.  Hopefully I will figure it out soon.  In the meantime, this
@@ -159,7 +159,7 @@
 
 	if (g_hash_table_lookup(tcl_file_handlers, GINT_TO_POINTER(fd)))
             tcl_delete_file_handler(fd);
-	
+
 	if (mask & TCL_READABLE)
 		cond |= G_IO_IN;
 	if (mask & TCL_WRITABLE)
--- a/libpurple/plugins/tcl/tcl_glib.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/plugins/tcl/tcl_glib.h	Sat Feb 12 04:17:09 2011 +0900
@@ -2,7 +2,7 @@
  * Tcl/Glib glue
  *
  * Copyright (C) 2003 Ethan Blanton <eblanton@cs.purdue.edu>
- * 
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
--- a/libpurple/plugins/tcl/tcl_purple.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/plugins/tcl/tcl_purple.h	Sat Feb 12 04:17:09 2011 +0900
@@ -4,7 +4,7 @@
  * purple
  *
  * Copyright (C) 2003 Ethan Blanton <eblanton@cs.purdue.edu>
- * 
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
--- a/libpurple/plugins/tcl/tcl_ref.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/plugins/tcl/tcl_ref.c	Sat Feb 12 04:17:09 2011 +0900
@@ -4,7 +4,7 @@
  * purple
  *
  * Copyright (C) 2006 Ethan Blanton <eblanton@cs.purdue.edu>
- * 
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
--- a/libpurple/plugins/tcl/tcl_signals.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/plugins/tcl/tcl_signals.c	Sat Feb 12 04:17:09 2011 +0900
@@ -4,7 +4,7 @@
  * purple
  *
  * Copyright (C) 2003 Ethan Blanton <eblanton@cs.purdue.edu>
- * 
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
@@ -117,7 +117,7 @@
 
 	for (cur = tcl_callbacks; cur != NULL; cur = g_list_next(cur)) {
 		handler = cur->data;
-		if (handler->interp == interp && handler->instance == instance 
+		if (handler->interp == interp && handler->instance == instance
 		    && !strcmp(signal, Tcl_GetString(handler->signal))) {
 			purple_signal_disconnect(instance, signal, handler->interp,
 					       PURPLE_CALLBACK(tcl_signal_callback));
--- a/libpurple/protocols/gg/buddylist.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/gg/buddylist.c	Sat Feb 12 04:17:09 2011 +0900
@@ -82,7 +82,7 @@
 	gchar **users_tbl;
 	int i;
 	char *utf8buddylist = charset_convert(buddylist, "CP1250", "UTF-8");
-	
+
 	/* Don't limit the number of records in a buddylist. */
 	users_tbl = g_strsplit(utf8buddylist, "\r\n", -1);
 
@@ -95,7 +95,7 @@
 
 		data_tbl = g_strsplit(users_tbl[i], ";", 8);
 		if (ggp_array_size(data_tbl) < 8) {
-			purple_debug_warning("gg", 
+			purple_debug_warning("gg",
 				"Something is wrong on line %d of the buddylist. Skipping.\n",
 				i + 1);
 			continue;
--- a/libpurple/protocols/gg/buddylist.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/gg/buddylist.h	Sat Feb 12 04:17:09 2011 +0900
@@ -44,7 +44,7 @@
  * Get all the buddies in the current account.
  *
  * @param account Current account.
- * 
+ *
  * @return List of buddies.
  */
 char *
--- a/libpurple/protocols/gg/confer.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/gg/confer.h	Sat Feb 12 04:17:09 2011 +0900
@@ -39,7 +39,7 @@
 
 /**
  * Adds the specified UIN to the specified conversation.
- * 
+ *
  * @param gc        PurpleConnection.
  * @param chat_name Name of the conversation.
  */
@@ -61,7 +61,7 @@
 
 /**
  * Finds a conversation in which all the specified recipients participate.
- * 
+ *
  * TODO: This function should be rewritten to better handle situations when
  * somebody adds more people to the converation.
  *
@@ -81,7 +81,7 @@
  *
  * @param gc   PurpleConnection.
  * @param name Name of the conversation.
- * 
+ *
  * @return Name of the conversation.
  */
 const char*
--- a/libpurple/protocols/gg/gg.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/gg/gg.c	Sat Feb 12 04:17:09 2011 +0900
@@ -215,7 +215,7 @@
 	char *buddylist = ggp_buddylist_dump(purple_connection_get_account(gc));
 
 	purple_debug_info("gg", "Uploading...\n");
-	
+
 	if (buddylist == NULL)
 		return;
 
@@ -1464,6 +1464,10 @@
 				increased_len += 4;
 				under = FALSE;
 			}
+
+			if (actformat->font & GG_FONT_COLOR) {
+				cformats += sizeof(struct gg_msg_richtext_color);
+			}
 		}
 
 		msg = message->str;
@@ -1729,7 +1733,7 @@
 				gc->inpa = purple_input_add(info->session->fd,
 							  PURPLE_INPUT_READ,
 							  ggp_callback_recv, gc);
-				
+
 				ggp_buddylist_send(gc);
 				purple_connection_update_progress(gc, _("Connected"), 1, 2);
 				purple_connection_set_state(gc, PURPLE_CONNECTED);
@@ -1844,7 +1848,7 @@
 	types = g_list_append(types, type);
 
  	/*
-	 * New statuses for GG 8.0 like PoGGadaj ze mna (not yet because 
+	 * New statuses for GG 8.0 like PoGGadaj ze mna (not yet because
 	 * libpurple can't support Chatty status) and Nie przeszkadzac
 	 */
 	type = purple_status_type_new_with_attrs(
@@ -1852,7 +1856,7 @@
 			"message", _("Message"), purple_value_new(PURPLE_TYPE_STRING),
 			NULL);
 	types = g_list_append(types, type);
-	
+
 	/*
 	 * This status is necessary to display guys who are blocking *us*.
 	 */
@@ -1956,7 +1960,7 @@
 
 	glp->encoding = GG_ENCODING_UTF8;
 	glp->protocol_features = (GG_FEATURE_STATUS80|GG_FEATURE_DND_FFC);
-	
+
 	glp->async = 1;
 	glp->status = ggp_to_gg_status(status, &glp->status_descr);
 	glp->tls = 0;
@@ -1984,7 +1988,7 @@
 		purple_debug_info("gg", "Trying to retrieve address from gg appmsg service\n");
 
 	info->session = gg_login(glp);
-	purple_connection_update_progress(gc, _("Connecting"), 0, 2); 			
+	purple_connection_update_progress(gc, _("Connecting"), 0, 2);
 	if (info->session == NULL) {
 		purple_connection_error_reason (gc,
 			PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
@@ -2131,7 +2135,7 @@
 	tmp = charset_convert(plain, "UTF-8", "CP1250");
 	*/
 	tmp = g_strdup_printf("%s", plain);
-	
+
 	if (tmp && (format_length - sizeof(struct gg_msg_richtext))) {
 		if(gg_send_message_richtext(info->session, GG_CLASS_CHAT, ggp_str_to_uin(who), (unsigned char *)tmp, format, format_length) < 0) {
 			ret = -1;
--- a/libpurple/protocols/gg/lib/common.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/gg/lib/common.c	Sat Feb 12 04:17:09 2011 +0900
@@ -436,7 +436,7 @@
  * Zamienia znaki niedrukowalne, spoza ASCII i mające specjalne znaczenie
  * dla protokołu HTTP na encje postaci \c %XX, gdzie \c XX jest szesnastkową
  * wartością znaku.
- * 
+ *
  * \param str Ciąg znaków do zakodowania
  *
  * \return Zaalokowany bufor lub \c NULL w przypadku błędu.
@@ -825,22 +825,22 @@
  * \internal Tablica konwersji między CP1250 a UTF-8.
  */
 static const uint16_t table_cp1250[] = {
-	0x20ac, '?',    0x201a,    '?', 0x201e, 0x2026, 0x2020, 0x2021, 
-	   '?', 0x2030, 0x0160, 0x2039, 0x015a, 0x0164, 0x017d, 0x0179, 
-	   '?', 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014, 
-	   '?', 0x2122, 0x0161, 0x203a, 0x015b, 0x0165, 0x017e, 0x017a, 
-	0x00a0, 0x02c7, 0x02d8, 0x0141, 0x00a4, 0x0104, 0x00a6, 0x00a7, 
-	0x00a8, 0x00a9, 0x015e, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x017b, 
-	0x00b0, 0x00b1, 0x02db, 0x0142, 0x00b4, 0x00b5, 0x00b6, 0x00b7, 
-	0x00b8, 0x0105, 0x015f, 0x00bb, 0x013d, 0x02dd, 0x013e, 0x017c, 
-	0x0154, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x0139, 0x0106, 0x00c7, 
-	0x010c, 0x00c9, 0x0118, 0x00cb, 0x011a, 0x00cd, 0x00ce, 0x010e, 
-	0x0110, 0x0143, 0x0147, 0x00d3, 0x00d4, 0x0150, 0x00d6, 0x00d7, 
-	0x0158, 0x016e, 0x00da, 0x0170, 0x00dc, 0x00dd, 0x0162, 0x00df, 
-	0x0155, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x013a, 0x0107, 0x00e7, 
-	0x010d, 0x00e9, 0x0119, 0x00eb, 0x011b, 0x00ed, 0x00ee, 0x010f, 
-	0x0111, 0x0144, 0x0148, 0x00f3, 0x00f4, 0x0151, 0x00f6, 0x00f7, 
-	0x0159, 0x016f, 0x00fa, 0x0171, 0x00fc, 0x00fd, 0x0163, 0x02d9, 
+	0x20ac, '?',    0x201a,    '?', 0x201e, 0x2026, 0x2020, 0x2021,
+	   '?', 0x2030, 0x0160, 0x2039, 0x015a, 0x0164, 0x017d, 0x0179,
+	   '?', 0x2018, 0x2019, 0x201c, 0x201d, 0x2022, 0x2013, 0x2014,
+	   '?', 0x2122, 0x0161, 0x203a, 0x015b, 0x0165, 0x017e, 0x017a,
+	0x00a0, 0x02c7, 0x02d8, 0x0141, 0x00a4, 0x0104, 0x00a6, 0x00a7,
+	0x00a8, 0x00a9, 0x015e, 0x00ab, 0x00ac, 0x00ad, 0x00ae, 0x017b,
+	0x00b0, 0x00b1, 0x02db, 0x0142, 0x00b4, 0x00b5, 0x00b6, 0x00b7,
+	0x00b8, 0x0105, 0x015f, 0x00bb, 0x013d, 0x02dd, 0x013e, 0x017c,
+	0x0154, 0x00c1, 0x00c2, 0x0102, 0x00c4, 0x0139, 0x0106, 0x00c7,
+	0x010c, 0x00c9, 0x0118, 0x00cb, 0x011a, 0x00cd, 0x00ce, 0x010e,
+	0x0110, 0x0143, 0x0147, 0x00d3, 0x00d4, 0x0150, 0x00d6, 0x00d7,
+	0x0158, 0x016e, 0x00da, 0x0170, 0x00dc, 0x00dd, 0x0162, 0x00df,
+	0x0155, 0x00e1, 0x00e2, 0x0103, 0x00e4, 0x013a, 0x0107, 0x00e7,
+	0x010d, 0x00e9, 0x0119, 0x00eb, 0x011b, 0x00ed, 0x00ee, 0x010f,
+	0x0111, 0x0144, 0x0148, 0x00f3, 0x00f4, 0x0151, 0x00f6, 0x00f7,
+	0x0159, 0x016f, 0x00fa, 0x0171, 0x00fc, 0x00fd, 0x0163, 0x02d9,
 };
 
 /**
@@ -912,7 +912,7 @@
 		return 1;
 	}
 
-	if (c < 0xc2) 
+	if (c < 0xc2)
 		return -1;
 
 	if (c < 0xe0) {
@@ -922,8 +922,8 @@
 			return -1;
 		*ch = ((uint16_t) (c & 0x1f) << 6) | (uint16_t) (s[1] ^ 0x80);
 		return 2;
-	} 
-	
+	}
+
 	if (c < 0xf0) {
 		if (n < 3)
 			return -2;
@@ -956,7 +956,7 @@
 	for (i = 0; i < len; newlen++) {
 		uint16_t discard;
 		int ret;
-		
+
 		ret = gg_utf8_helper(&buf[i], len - i, &discard);
 
 		if (ret > 0)
--- a/libpurple/protocols/gg/lib/dcc7.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/gg/lib/dcc7.c	Sat Feb 12 04:17:09 2011 +0900
@@ -4,7 +4,7 @@
  *  (C) Copyright 2001-2008 Wojtek Kaniewski <wojtekka@irc.pl>
  *                          Tomasz Chiliński <chilek@chilan.com>
  *                          Adam Wysocki <gophi@ekg.chmurka.net>
- *  
+ *
  *  Thanks to Jakub Zawadzki <darkjames@darkjames.ath.cx>
  *
  *  This program is free software; you can redistribute it and/or modify
@@ -210,7 +210,7 @@
 	}
 
 	// XXX losować porty?
-	
+
 	if (!port)
 		port = GG_DEFAULT_DCC_PORT;
 
@@ -242,7 +242,7 @@
 
 	dcc->fd = fd;
 	dcc->local_port = port;
-	
+
 	dcc->state = GG_STATE_LISTENING;
 	dcc->check = GG_CHECK_READ;
 	dcc->timeout = GG_DCC7_TIMEOUT_FILE_ACK;
@@ -264,7 +264,7 @@
 	gg_debug_dcc(dcc, GG_DEBUG_FUNCTION, "** gg_dcc7_listen_and_send_info(%p)\n", dcc);
 
 	// XXX dać możliwość konfiguracji?
-	
+
 	dcc->local_addr = dcc->sess->client_addr;
 
 	if (gg_dcc7_listen(dcc, 0) == -1)
@@ -334,7 +334,7 @@
 		errno = EINVAL;
 		return -1;
 	}
-	
+
 	memset(&pkt, 0, sizeof(pkt));
 	pkt.type = gg_fix32(type);
 
@@ -595,7 +595,7 @@
 
 		if (tmp->state != GG_STATE_REQUESTING_ID || tmp->dcc_type != gg_fix32(p->type))
 			continue;
-		
+
 		tmp->cid = p->id;
 
 		switch (tmp->dcc_type) {
@@ -654,9 +654,9 @@
 		e->event.dcc7_error = GG_ERROR_DCC7_HANDSHAKE;
 		return 0;
 	}
-	
+
 	// XXX czy dla odwrotnego połączenia powinniśmy wywołać już zdarzenie GG_DCC7_ACCEPT?
-	
+
 	dcc->offset = gg_fix32(p->offset);
 	dcc->state = GG_STATE_WAITING_FOR_INFO;
 
@@ -685,7 +685,7 @@
 		gg_debug_session(sess, GG_DEBUG_MISC, "// gg_dcc7_handle_info() unknown dcc session\n");
 		return 0;
 	}
-	
+
 	if (p->type != GG_DCC7_TYPE_P2P) {
 		gg_debug_session(sess, GG_DEBUG_MISC, "// gg_dcc7_handle_info() unhandled transfer type (%d)\n", p->type);
 		e->type = GG_EVENT_DCC7_ERROR;
@@ -722,7 +722,7 @@
 		dcc->fd = -1;
 		dcc->reverse = 1;
 	}
-	
+
 	if (dcc->type == GG_SESSION_DCC7_SEND) {
 		e->type = GG_EVENT_DCC7_ACCEPT;
 		e->event.dcc7_accept.dcc7 = dcc;
@@ -766,7 +766,7 @@
 		gg_debug_session(sess, GG_DEBUG_MISC, "// gg_dcc7_handle_reject() unknown dcc session\n");
 		return 0;
 	}
-	
+
 	if (dcc->state != GG_STATE_WAITING_FOR_ACCEPT) {
 		gg_debug_session(sess, GG_DEBUG_MISC, "// gg_dcc7_handle_reject() invalid state\n");
 		e->type = GG_EVENT_DCC7_ERROR;
@@ -806,7 +806,7 @@
 				gg_debug_session(sess, GG_DEBUG_MISC, "// gg_dcc7_handle_new() not enough memory\n");
 				return -1;
 			}
-			
+
 			memset(dcc, 0, sizeof(struct gg_dcc7));
 			dcc->type = GG_SESSION_DCC7_GET;
 			dcc->dcc_type = GG_DCC7_TYPE_FILE;
@@ -838,7 +838,7 @@
 				gg_debug_session(sess, GG_DEBUG_MISC, "// gg_dcc7_handle_packet() not enough memory\n");
 				return -1;
 			}
-			
+
 			memset(dcc, 0, sizeof(struct gg_dcc7));
 
 			dcc->type = GG_SESSION_DCC7_VOICE;
@@ -873,7 +873,7 @@
 /**
  * \internal Ustawia odpowiednie stany wewnętrzne w zależności od rodzaju
  * połączenia.
- * 
+ *
  * \param dcc Struktura połączenia
  *
  * \return 0 jeśli się powiodło, -1 w przypadku błędu.
--- a/libpurple/protocols/gg/lib/events.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/gg/lib/events.c	Sat Feb 12 04:17:09 2011 +0900
@@ -254,7 +254,7 @@
 
 /**
  * \internal Analizuje informacje rozszerzone wiadomości.
- * 
+ *
  * \param sess Struktura sesji.
  * \param e Struktura zdarzenia.
  * \param sender Numer nadawcy.
@@ -567,7 +567,7 @@
 
 	if (dst != NULL)
 		dst[len] = 0;
-	
+
 	return len;
 }
 
@@ -893,7 +893,7 @@
 						e->event.notify60[i].descr = descr;
 
 						/* XXX czas */
-							
+
 						length -= sizeof(struct gg_notify_reply77) + descr_len + 1;
 						n = (void*) ((char*) n + sizeof(struct gg_notify_reply77) + descr_len + 1);
 					} else {
@@ -1026,7 +1026,7 @@
 						e->event.notify60[i].descr[descr_len] = 0;
 
 						/* XXX czas */
-							
+
 						length -= sizeof(struct gg_notify_reply60) + descr_len + 1;
 						n = (void*) ((char*) n + sizeof(struct gg_notify_reply60) + descr_len + 1);
 					} else {
@@ -2077,7 +2077,7 @@
 
 				uint32_t tmp_version_len	= gg_fix32(strlen(GG8_VERSION));
 				uint32_t tmp_descr_len		= gg_fix32((sess->initial_descr) ? strlen(sess->initial_descr) : 0);
-				
+
 				memset(&l, 0, sizeof(l));
 				l.uin           = gg_fix32(sess->uin);
 				memcpy(l.language, GG8_LANG, sizeof(l.language));
@@ -2090,8 +2090,8 @@
 				l.dunno2        = 0x64;
 
 				gg_debug_session(sess, GG_DEBUG_TRAFFIC, "// gg_watch_fd() sending GG_LOGIN80 packet\n");
-				ret = gg_send_packet(sess, GG_LOGIN80, 
-						&l, sizeof(l), 
+				ret = gg_send_packet(sess, GG_LOGIN80,
+						&l, sizeof(l),
 						&tmp_version_len, sizeof(uint32_t), GG8_VERSION, strlen(GG8_VERSION),
 						&tmp_descr_len, sizeof(uint32_t), sess->initial_descr, (sess->initial_descr) ? strlen(sess->initial_descr) : 0,
 						NULL);
--- a/libpurple/protocols/gg/lib/libgadu.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/gg/lib/libgadu.c	Sat Feb 12 04:17:09 2011 +0900
@@ -112,7 +112,7 @@
 
 /**
  * Port gniazda nasłuchującego dla połączeń bezpośrednich.
- * 
+ *
  * \ingroup ip
  */
 int gg_dcc_port = 0;
@@ -783,9 +783,9 @@
 			gg_debug(GG_DEBUG_MISC, "// gg_login() not enough memory for status\n");
 			goto fail;
 		}
-		
+
 		// XXX pamiętać, żeby nie ciąć w środku znaku utf-8
-		
+
 		if (strlen(sess->initial_descr) > max_length)
 			sess->initial_descr[max_length] = 0;
 	}
@@ -1298,7 +1298,7 @@
 
 /**
  * \internal Dodaje tekst na koniec bufora.
- * 
+ *
  * \param dst Wskaźnik na bufor roboczy
  * \param pos Wskaźnik na aktualne położenie w buforze roboczym
  * \param src Dodawany tekst
@@ -1420,9 +1420,9 @@
 				if (dst != NULL) {
 					sprintf(&dst[len], img_fmt,
 						format[format_idx + 9],
-						format[format_idx + 8], 
+						format[format_idx + 8],
 						format[format_idx + 7],
-						format[format_idx + 6], 
+						format[format_idx + 6],
 						format[format_idx + 5],
 						format[format_idx + 4],
 						format[format_idx + 3],
@@ -1510,7 +1510,7 @@
  * \param formatlen Długość informacji o formatowaniu
  *
  * \return Numer sekwencyjny wiadomości lub -1 w przypadku błędu.
- * 
+ *
  * \ingroup messages
  */
 int gg_send_message_confer_richtext(struct gg_session *sess, int msgclass, int recipients_count, uin_t *recipients, const unsigned char *message, const unsigned char *format, int formatlen)
@@ -1566,7 +1566,7 @@
 		s.seq = gg_fix32(seq_no);
 	} else {
 		int len;
-		
+
 		// Drobne odchylenie od protokołu. Jeśli wysyłamy kilka
 		// wiadomości w ciągu jednej sekundy, zwiększamy poprzednią
 		// wartość, żeby każda wiadomość miała unikalny numer.
--- a/libpurple/protocols/gg/lib/libgadu.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/gg/lib/libgadu.h	Sat Feb 12 04:17:09 2011 +0900
@@ -56,7 +56,7 @@
 #undef GG_CONFIG_HAVE_PTHREAD
 
 /* Defined if pthread resolver is the default one. */
-#undef GG_CONFIG_PTHREAD_DEFAULT 
+#undef GG_CONFIG_PTHREAD_DEFAULT
 
 /* Defined if this machine has C99-compiliant vsnprintf(). */
 #undef GG_CONFIG_HAVE_C99_VSNPRINTF
@@ -267,7 +267,7 @@
 	int send_left;		/**< Liczba bajtów do wysłania */
 
 	struct gg_dcc7 *dcc7_list;	/**< Lista połączeń bezpośrednich skojarzonych z sesją */
-	
+
 	int soft_timeout;	/**< Flaga mówiąca, że po przekroczeniu \c timeout należy wywołać \c gg_watch_fd() */
 
 	int protocol_flags;	/**< Flagi protokołu */
@@ -890,7 +890,7 @@
 };
 
 /**
- * Unia wszystkich zdarzeń zwracanych przez funkcje \c gg_watch_fd(), 
+ * Unia wszystkich zdarzeń zwracanych przez funkcje \c gg_watch_fd(),
  * \c gg_dcc_watch_fd() i \c gg_dcc7_watch_fd().
  *
  * \ingroup events
@@ -982,7 +982,7 @@
 
 #else
 
-/** 
+/**
  * \ingroup pubdir50
  *
  * Rodzaj pola zapytania.
@@ -1048,7 +1048,7 @@
 
 /**
  * Token autoryzacji niektórych operacji HTTP.
- * 
+ *
  * \ingroup token
  */
 struct gg_token {
@@ -1171,7 +1171,7 @@
 
 /**
  * \ingroup pubdir50
- * 
+ *
  * Rodzaj zapytania lub odpowiedzi katalogu publicznego.
  */
 enum {
@@ -1382,7 +1382,7 @@
 
 #else
 
-/** 
+/**
  * \ingroup login
  *
  * Flagi opcji protokołu.
--- a/libpurple/protocols/gg/lib/pubdir.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/gg/lib/pubdir.c	Sat Feb 12 04:17:09 2011 +0900
@@ -122,10 +122,10 @@
 
 	h->callback = gg_pubdir_watch_fd;
 	h->destroy = gg_pubdir_free;
-	
+
 	if (!async)
 		gg_pubdir_watch_fd(h);
-	
+
 	return h;
 }
 
@@ -193,7 +193,7 @@
 		errno = EFAULT;
 		return NULL;
 	}
-    
+
 	__pwd = gg_saprintf("%ld", random());
 	__fmpwd = gg_urlencode(password);
 	__tokenid = gg_urlencode(tokenid);
@@ -251,10 +251,10 @@
 
 	h->callback = gg_pubdir_watch_fd;
 	h->destroy = gg_pubdir_free;
-	
+
 	if (!async)
 		gg_pubdir_watch_fd(h);
-	
+
 	return h;
 }
 
@@ -324,7 +324,7 @@
 		errno = EFAULT;
 		return NULL;
 	}
-	
+
 	__fmpwd = gg_urlencode(passwd);
 	__pwd = gg_urlencode(newpasswd);
 	__email = gg_urlencode(email);
@@ -340,7 +340,7 @@
 		free(__tokenval);
 		return NULL;
 	}
-	
+
 	if (!(form = gg_saprintf("fmnumber=%d&fmpwd=%s&pwd=%s&email=%s&tokenid=%s&tokenval=%s&code=%u", uin, __fmpwd, __pwd, __email, __tokenid, __tokenval, gg_http_hash("ss", email, newpasswd)))) {
 		gg_debug(GG_DEBUG_MISC, "=> change, not enough memory for form fields\n");
 		free(__fmpwd);
@@ -351,13 +351,13 @@
 
 		return NULL;
 	}
-	
+
 	free(__fmpwd);
 	free(__pwd);
 	free(__email);
 	free(__tokenid);
 	free(__tokenval);
-	
+
 	gg_debug(GG_DEBUG_MISC, "=> change, %s\n", form);
 
 	query = gg_saprintf(
@@ -460,7 +460,7 @@
 		errno = EFAULT;
 		return NULL;
 	}
-	
+
 	__tokenid = gg_urlencode(tokenid);
 	__tokenval = gg_urlencode(tokenval);
 	__email = gg_urlencode(email);
@@ -484,7 +484,7 @@
 	free(__tokenid);
 	free(__tokenval);
 	free(__email);
-	
+
 	gg_debug(GG_DEBUG_MISC, "=> remind, %s\n", form);
 
 	query = gg_saprintf(
@@ -588,7 +588,7 @@
 		errno = EINVAL;
 		return -1;
 	}
-	
+
 	if (h->state != GG_STATE_PARSING) {
 		if (gg_http_watch_fd(h) == -1) {
 			gg_debug(GG_DEBUG_MISC, "=> pubdir, http failure\n");
@@ -599,9 +599,9 @@
 
 	if (h->state != GG_STATE_PARSING)
 		return 0;
-	
+
 	h->state = GG_STATE_DONE;
-	
+
 	if (!(h->data = p = malloc(sizeof(struct gg_pubdir)))) {
 		gg_debug(GG_DEBUG_MISC, "=> pubdir, not enough memory for results\n");
 		return -1;
@@ -609,7 +609,7 @@
 
 	p->success = 0;
 	p->uin = 0;
-	
+
 	gg_debug(GG_DEBUG_MISC, "=> pubdir, let's parse \"%s\"\n", h->body);
 
 	if ((tmp = strstr(h->body, "Tokens okregisterreply_packet.reg.dwUserId="))) {
@@ -636,7 +636,7 @@
 {
 	if (!h)
 		return;
-	
+
 	free(h->data);
 	gg_http_free(h);
 }
@@ -674,10 +674,10 @@
 
 	h->callback = gg_token_watch_fd;
 	h->destroy = gg_token_free;
-	
+
 	if (!async)
 		gg_token_watch_fd(h);
-	
+
 	return h;
 }
 
@@ -706,7 +706,7 @@
 		errno = EINVAL;
 		return -1;
 	}
-	
+
 	if (h->state != GG_STATE_PARSING) {
 		if (gg_http_watch_fd(h) == -1) {
 			gg_debug(GG_DEBUG_MISC, "=> token, http failure\n");
@@ -717,7 +717,7 @@
 
 	if (h->state != GG_STATE_PARSING)
 		return 0;
-	
+
 	/* jeśli h->data jest puste, to ściągaliśmy tokenid i url do niego,
 	 * ale jeśli coś tam jest, to znaczy, że mamy drugi etap polegający
 	 * na pobieraniu tokenu. */
@@ -735,7 +735,7 @@
 			free(url);
 			return -1;
 		}
-		
+
 		if (!h->body || sscanf(h->body, "%d %d %d\r\n%s\r\n%s", &width, &height, &length, tokenid, url) != 5) {
 			gg_debug(GG_DEBUG_MISC, "=> token, parsing failed\n");
 			free(url);
@@ -743,7 +743,7 @@
 			errno = EINVAL;
 			return -1;
 		}
-		
+
 		/* dostaliśmy tokenid i wszystkie niezbędne informacje,
 		 * więc pobierzmy obrazek z tokenem */
 
@@ -779,7 +779,7 @@
 			free(url);
 			free(tokenid);
 			return -1;
-		}			
+		}
 
 		if (!(h2 = gg_http_connect(host, GG_REGISTER_PORT, h->async, "GET", path, headers))) {
 			gg_debug(GG_DEBUG_MISC, "=> token, gg_http_connect() failed mysteriously\n");
@@ -803,7 +803,7 @@
 
 		h->callback = gg_token_watch_fd;
 		h->destroy = gg_token_free;
-	
+
 		if (!h->async)
 			gg_token_watch_fd(h);
 
@@ -821,7 +821,7 @@
 		/* obrazek mamy w h->body */
 		h->state = GG_STATE_DONE;
 	}
-	
+
 	return 0;
 }
 
@@ -841,7 +841,7 @@
 
 	if ((t = h->data))
 		free(t->tokenid);
-	
+
 	free(h->data);
 	gg_http_free(h);
 }
--- a/libpurple/protocols/gg/lib/pubdir50.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/gg/lib/pubdir50.c	Sat Feb 12 04:17:09 2011 +0900
@@ -93,7 +93,7 @@
 
 		return 0;
 	}
-		
+
 	if (!(dupfield = strdup(field))) {
 		gg_debug(GG_DEBUG_MISC, "// gg_pubdir50_add_n() out of memory\n");
 		free(dupvalue);
@@ -148,7 +148,7 @@
 int gg_pubdir50_seq_set(gg_pubdir50_t req, uint32_t seq)
 {
 	gg_debug(GG_DEBUG_FUNCTION, "** gg_pubdir50_seq_set(%p, %d);\n", req, seq);
-	
+
 	if (!req) {
 		gg_debug(GG_DEBUG_MISC, "// gg_pubdir50_seq_set() invalid arguments\n");
 		errno = EFAULT;
@@ -173,7 +173,7 @@
 
 	if (!s)
 		return;
-	
+
 	for (i = 0; i < s->entries_count; i++) {
 		free(s->entries[i].field);
 		free(s->entries[i].value);
@@ -201,7 +201,7 @@
 	struct gg_pubdir50_request *r;
 
 	gg_debug_session(sess, GG_DEBUG_FUNCTION, "** gg_pubdir50(%p, %p);\n", sess, req);
-	
+
 	if (!sess || !req) {
 		gg_debug_session(sess, GG_DEBUG_MISC, "// gg_pubdir50() invalid arguments\n");
 		errno = EFAULT;
@@ -218,7 +218,7 @@
 		/* wyszukiwanie bierze tylko pierwszy wpis */
 		if (req->entries[i].num)
 			continue;
-		
+
 		if (sess->encoding == GG_ENCODING_CP1250) {
 			size += strlen(req->entries[i].field) + 1;
 			size += strlen(req->entries[i].value) + 1;
@@ -321,7 +321,7 @@
 	struct gg_pubdir50_reply *r = (struct gg_pubdir50_reply*) packet;
 	gg_pubdir50_t res;
 	int num = 0;
-	
+
 	gg_debug(GG_DEBUG_FUNCTION, "** gg_pubdir50_handle_reply_sess(%p, %p, %p, %d);\n", sess, e, packet, length);
 
 	if (!sess || !e || !packet) {
@@ -378,7 +378,7 @@
 		}
 
 		value = NULL;
-		
+
 		for (p = field; p < end; p++) {
 			/* jeśli mamy koniec tekstu... */
 			if (!*p) {
@@ -393,7 +393,7 @@
 					break;
 			}
 		}
-		
+
 		/* sprawdźmy, czy pole nie wychodzi poza pakiet, żeby nie
 		 * mieć segfaultów, jeśli serwer przestanie zakańczać pakietów
 		 * przez \0 */
@@ -430,10 +430,10 @@
 				free(tmp);
 			}
 		}
-	}	
+	}
 
 	res->count = num + 1;
-	
+
 	return 0;
 
 failure:
--- a/libpurple/protocols/gg/lib/resolver.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/gg/lib/resolver.c	Sat Feb 12 04:17:09 2011 +0900
@@ -356,17 +356,17 @@
 	struct in_addr a;
 
 	gg_debug(GG_DEBUG_MISC, "// gg_resolve_win32thread_thread() host: %s, fd: %i called\n", d->hostname, d->fd);
-	
+
 	if ((a.s_addr = inet_addr(d->hostname)) == INADDR_NONE) {
 		/* W przypadku błędu gg_gethostbyname_real() zwróci -1
 					 * i nie zmieni &addr. Tam jest już INADDR_NONE,
 					 * więc nie musimy robić nic więcej. */
 		gg_gethostbyname_real(d->hostname, &a, 0);
 	}
-	
+
 	// if ((a.s_addr = inet_addr(d->hostname)) == INADDR_NONE) {
 		// struct in_addr *hn;
-		
+
 		// if (!(hn = gg_gethostbyname(d->hostname)))
 			// a.s_addr = INADDR_NONE;
 		// else {
@@ -384,7 +384,7 @@
 	free(d);
 
 	gg_debug(GG_DEBUG_MISC, "// gg_resolve_win32thread_thread() done\n");
-	
+
 	return 0;
 }
 
@@ -397,7 +397,7 @@
 	int pipes[2], new_errno;
 
 	gg_debug(GG_DEBUG_FUNCTION, "** gg_resolve_win32thread(%p, %p, \"%s\");\n", fd, resolver, hostname);
-	
+
 	if (!resolver || !fd || !hostname) {
 		gg_debug(GG_DEBUG_MISC, "// gg_resolve_win32thread() invalid arguments\n");
 		errno = EFAULT;
@@ -438,7 +438,7 @@
 	*fd = pipes[0];
 
 	gg_debug(GG_DEBUG_MISC, "// gg_resolve_win32thread() done\n");
-	
+
 	return 0;
 
 cleanup:
@@ -461,7 +461,7 @@
 	struct gg_resolve_win32thread_data *data;
 
 	gg_debug(GG_DEBUG_MISC, "// gg_resolve_win32thread_cleanup() force: %i called\n", force);
-	
+
 	if (priv_data == NULL || *priv_data == NULL)
 		gg_debug(GG_DEBUG_MISC, "// gg_resolve_win32thread_cleanup() priv_data: NULL\n");
 		return;
@@ -494,7 +494,7 @@
  *
  * Połączenia asynchroniczne nie mogą blokować procesu w trakcie rozwiązywania
  * nazwy serwera. W tym celu tworzony jest potok, nowy proces i dopiero w nim
- * przeprowadzane jest rozwiązywanie nazwy. Deskryptor strony do odczytu 
+ * przeprowadzane jest rozwiązywanie nazwy. Deskryptor strony do odczytu
  * zapisuje się w strukturze sieci i czeka na dane w postaci struktury
  * \c in_addr. Jeśli nie znaleziono nazwy, zwracana jest \c INADDR_NONE.
  *
@@ -673,7 +673,7 @@
 
 	if (write(data->wfd, &addr, sizeof(addr)) == sizeof(addr))
 		pthread_exit(NULL);
-	else 
+	else
 		pthread_exit((void*) -1);
 
 	return NULL;	/* żeby kompilator nie marudził */
@@ -989,15 +989,15 @@
 			gg_global_resolver_cleanup = gg_resolver_fork_cleanup;
 			return 0;
 #endif
-			
+
 #ifdef _WIN32
 		case GG_RESOLVER_WIN32:
 			gg_global_resolver_type = type;
 			gg_global_resolver_start = gg_resolve_win32thread;
 			gg_global_resolver_cleanup = gg_resolve_win32thread_cleanup;
 			return 0;
-#endif			
-		
+#endif
+
 #ifdef GG_CONFIG_HAVE_PTHREAD
 		case GG_RESOLVER_PTHREAD:
 			gg_global_resolver_type = type;
@@ -1038,7 +1038,7 @@
  *  - \c "int force" &mdash; flaga mówiąca o tym, że zasoby są zwalniane przed zakończeniem rozwiązywania nazwy, np. z powodu zamknięcia sesji.
  *
  * Własny kod rozwiązywania nazwy powinien stworzyć potok, parę gniazd lub
- * inny deskryptor pozwalający na co najmniej jednostronną komunikację i 
+ * inny deskryptor pozwalający na co najmniej jednostronną komunikację i
  * przekazać go w parametrze \c fd. Po zakończeniu rozwiązywania nazwy,
  * powinien wysłać otrzymany adres IP w postaci sieciowej (big-endian) do
  * deskryptora. Jeśli rozwiązywanie nazwy się nie powiedzie, należy wysłać
--- a/libpurple/protocols/gg/lib/sha1.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/gg/lib/sha1.c	Sat Feb 12 04:17:09 2011 +0900
@@ -228,12 +228,12 @@
 void gg_login_hash_sha1(const char *password, uint32_t seed, uint8_t *result)
 {
 	SHA_CTX ctx;
-	
+
 	SHA1_Init(&ctx);
 	SHA1_Update(&ctx, (const unsigned char*) password, strlen(password));
 	seed = gg_fix32(seed);
 	SHA1_Update(&ctx, (uint8_t*) &seed, 4);
-	
+
 	SHA1_Final(result, &ctx);
 }
 
--- a/libpurple/protocols/gg/search.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/gg/search.h	Sat Feb 12 04:17:09 2011 +0900
@@ -141,7 +141,7 @@
  * @param res    Public directory look-up result.
  * @param num    Id of the record.
  * @param fileld Name of the field.
- * 
+ *
  * @return UTF-8 encoded value of the field.
  */
 char *
--- a/libpurple/protocols/irc/cmds.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/irc/cmds.c	Sat Feb 12 04:17:09 2011 +0900
@@ -73,7 +73,7 @@
 	/* we have defined args as args[0] is target and args[1] is ctcp command */
 	char *buf;
 	GString *string;
-	
+
 	/* check if we have args */
 	if (!args || !args[0] || !args[1])
 		return 0;
@@ -89,7 +89,7 @@
 
 	irc_send(irc, buf);
 	g_free(buf);
-	
+
 	return 1;
 }
 
@@ -600,7 +600,7 @@
 		return 0;
 
 	buf = irc_format(irc, "vn", "WHOWAS", args[0]);
-	
+
 	irc->whois.nick = g_strdup(args[0]);
 	irc_send(irc, buf);
 	g_free(buf);
--- a/libpurple/protocols/irc/dcc_send.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/irc/dcc_send.c	Sat Feb 12 04:17:09 2011 +0900
@@ -129,14 +129,14 @@
 		purple_debug(PURPLE_DEBUG_INFO, "irc", "Receiving file (%s) from %s\n",
 			     filename->str, xd->ip);
 		purple_xfer_set_size(xfer, token[i+2] ? atoi(token[i+2]) : 0);
-		
+
 		purple_xfer_set_init_fnc(xfer, irc_dccsend_recv_init);
 		purple_xfer_set_ack_fnc(xfer, irc_dccsend_recv_ack);
-		
+
 		purple_xfer_set_end_fnc(xfer, irc_dccsend_recv_destroy);
 		purple_xfer_set_request_denied_fnc(xfer, irc_dccsend_recv_destroy);
 		purple_xfer_set_cancel_recv_fnc(xfer, irc_dccsend_recv_destroy);
-		
+
 		purple_xfer_request(xfer);
 	}
 	g_strfreev(token);
--- a/libpurple/protocols/irc/irc.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/irc/irc.c	Sat Feb 12 04:17:09 2011 +0900
@@ -39,7 +39,7 @@
 
 #define PING_TIMEOUT 60
 
-static void irc_buddy_append(char *name, struct irc_buddy *ib, GString *string);
+static void irc_ison_buddy_init(char *name, struct irc_buddy *ib, GList **list);
 
 static const char *irc_blist_icon(PurpleAccount *a, PurpleBuddy *b);
 static GList *irc_status_types(PurpleAccount *account);
@@ -186,43 +186,62 @@
 /* XXX I don't like messing directly with these buddies */
 gboolean irc_blist_timeout(struct irc_conn *irc)
 {
-	GString *string;
-	char *list, *buf;
-
-	if (irc->ison_outstanding)
-		return TRUE;
-
-	string = g_string_sized_new(512);
-
-	g_hash_table_foreach(irc->buddies, (GHFunc)irc_buddy_append, (gpointer)string);
-
-	list = g_string_free(string, FALSE);
-	if (!list || !strlen(list)) {
-		g_free(list);
+	if (irc->ison_outstanding) {
 		return TRUE;
 	}
 
-	buf = irc_format(irc, "vn", "ISON", list);
-	g_free(list);
-	irc_send(irc, buf);
-	g_free(buf);
+	g_hash_table_foreach(irc->buddies, (GHFunc)irc_ison_buddy_init,
+	                     (gpointer *)&irc->buddies_outstanding);
 
-	irc->ison_outstanding = TRUE;
+	irc_buddy_query(irc);
 
 	return TRUE;
 }
 
-static void irc_buddy_append(char *name, struct irc_buddy *ib, GString *string)
+void irc_buddy_query(struct irc_conn *irc)
 {
-	ib->flag = FALSE;
-	g_string_append_printf(string, "%s ", name);
+	GList *lp;
+	GString *string;
+	struct irc_buddy *ib;
+	char *buf;
+
+	string = g_string_sized_new(512);
+
+	while ((lp = g_list_first(irc->buddies_outstanding))) {
+		ib = (struct irc_buddy *)lp->data;
+		if (string->len + strlen(ib->name) + 1 > 450)
+			break;
+		g_string_append_printf(string, "%s ", ib->name);
+		ib->new_online_status = FALSE;
+		irc->buddies_outstanding = g_list_remove_link(irc->buddies_outstanding, lp);
+	}
+
+	if (string->len) {
+		buf = irc_format(irc, "vn", "ISON", string->str);
+		irc_send(irc, buf);
+		g_free(buf);
+		irc->ison_outstanding = TRUE;
+	} else
+		irc->ison_outstanding = FALSE;
+
+	g_string_free(string, TRUE);
+}
+
+static void irc_ison_buddy_init(char *name, struct irc_buddy *ib, GList **list)
+{
+	*list = g_list_append(*list, ib);
 }
 
 static void irc_ison_one(struct irc_conn *irc, struct irc_buddy *ib)
 {
 	char *buf;
 
-	ib->flag = FALSE;
+	if (irc->buddies_outstanding != NULL) {
+		irc->buddies_outstanding = g_list_append(irc->buddies_outstanding, ib);
+		return;
+	}
+
+	ib->new_online_status = FALSE;
 	buf = irc_format(irc, "vn", "ISON", ib->name);
 	irc_send(irc, buf);
 	g_free(buf);
--- a/libpurple/protocols/irc/irc.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/irc/irc.h	Sat Feb 12 04:17:09 2011 +0900
@@ -58,6 +58,7 @@
 	GHashTable *buddies;
 
 	gboolean ison_outstanding;
+	GList *buddies_outstanding;
 
 	char *inbuf;
 	int inbuflen;
@@ -97,6 +98,7 @@
 	char *name;
 	gboolean online;
 	gboolean flag;
+ 	gboolean new_online_status;
 	int ref;
 };
 
@@ -104,6 +106,7 @@
 
 int irc_send(struct irc_conn *irc, const char *buf);
 gboolean irc_blist_timeout(struct irc_conn *irc);
+void irc_buddy_query(struct irc_conn *irc);
 
 char *irc_escape_privmsg(const char *text, gssize length);
 
--- a/libpurple/protocols/irc/msgs.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/irc/msgs.c	Sat Feb 12 04:17:09 2011 +0900
@@ -334,12 +334,12 @@
 	PurpleNotifyUserInfo *user_info;
 
 	if (!irc->whois.nick) {
-		purple_debug(PURPLE_DEBUG_WARNING, "irc", "Unexpected End of %s for %s\n", !strcmp(name, "369") ? "WHOWAS" : "WHOIS" 
+		purple_debug(PURPLE_DEBUG_WARNING, "irc", "Unexpected End of %s for %s\n", !strcmp(name, "369") ? "WHOWAS" : "WHOIS"
 											     , args[1]);
 		return;
 	}
 	if (purple_utf8_strcasecmp(irc->whois.nick, args[1])) {
-		purple_debug(PURPLE_DEBUG_WARNING, "irc", "Received end of %s for %s, expecting %s\n", !strcmp(name, "369") ? "WHOWAS" : "WHOIS" 
+		purple_debug(PURPLE_DEBUG_WARNING, "irc", "Received end of %s for %s, expecting %s\n", !strcmp(name, "369") ? "WHOWAS" : "WHOIS"
 													 , args[1], irc->whois.nick);
 		return;
 	}
@@ -610,10 +610,10 @@
 	} else if (!strcmp(name, "422")) {
 		/* in case there is no 251, and no MOTD set, finalize the connection.
 		 * (and clear the motd for good measure). */
-		
+
 		if (irc->motd)
 			g_string_free(irc->motd, TRUE);
-		
+
 		irc_connected(irc, args[0]);
 		return;
 	}
@@ -761,18 +761,19 @@
 		return;
 
 	nicks = g_strsplit(args[1], " ", -1);
-
 	for (i = 0; nicks[i]; i++) {
 		if ((ib = g_hash_table_lookup(irc->buddies, (gconstpointer)nicks[i])) == NULL) {
 			continue;
 		}
-		ib->flag = TRUE;
+		ib->new_online_status = TRUE;
 	}
-
 	g_strfreev(nicks);
 
-	g_hash_table_foreach(irc->buddies, (GHFunc)irc_buddy_status, (gpointer)irc);
-	irc->ison_outstanding = FALSE;
+	if (irc->ison_outstanding)
+		irc_buddy_query(irc);
+
+	if (!irc->ison_outstanding)
+		g_hash_table_foreach(irc->buddies, (GHFunc)irc_buddy_status, (gpointer)irc);
 }
 
 static void irc_buddy_status(char *name, struct irc_buddy *ib, struct irc_conn *irc)
@@ -783,10 +784,10 @@
 	if (!gc || !buddy)
 		return;
 
-	if (ib->online && !ib->flag) {
+	if (ib->online && !ib->new_online_status) {
 		purple_prpl_got_user_status(irc->account, name, "offline", NULL);
 		ib->online = FALSE;
-	} else if (!ib->online && ib->flag) {
+	} else if (!ib->online && ib->new_online_status) {
 		purple_prpl_got_user_status(irc->account, name, "available", NULL);
 		ib->online = TRUE;
 	}
@@ -837,7 +838,7 @@
 	purple_conv_chat_add_user(PURPLE_CONV_CHAT(convo), nick, userhost, PURPLE_CBFLAGS_NONE, TRUE);
 
 	if ((ib = g_hash_table_lookup(irc->buddies, nick)) != NULL) {
-		ib->flag = TRUE;
+		ib->new_online_status = TRUE;
 		irc_buddy_status(nick, ib, irc);
 	}
 
@@ -1233,7 +1234,7 @@
 	g_slist_foreach(gc->buddy_chats, (GFunc)irc_chat_remove_buddy, data);
 
 	if ((ib = g_hash_table_lookup(irc->buddies, data[0])) != NULL) {
-		ib->flag = FALSE;
+		ib->new_online_status = FALSE;
 		irc_buddy_status(data[0], ib, irc);
 	}
 	g_free(data[0]);
--- a/libpurple/protocols/irc/parse.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/irc/parse.c	Sat Feb 12 04:17:09 2011 +0900
@@ -858,7 +858,7 @@
 	 * instead of a null terminated string.
 	 */
 	purple_signal_emit(_irc_plugin, "irc-receiving-text", gc, &input);
-	
+
 	if (!strncmp(input, "PING ", 5)) {
 		msg = irc_format(irc, "vv", "PONG", input + 5);
 		irc_send(irc, msg);
--- a/libpurple/protocols/jabber/Makefile.am	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/jabber/Makefile.am	Sat Feb 12 04:17:09 2011 +0900
@@ -11,6 +11,7 @@
 			  auth.c \
 			  auth.h \
 			  auth_digest_md5.c \
+			  auth_digest_md5.h \
 			  auth_plain.c \
 			  auth_scram.c \
 			  auth_scram.h \
--- a/libpurple/protocols/jabber/auth_cyrus.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/jabber/auth_cyrus.c	Sat Feb 12 04:17:09 2011 +0900
@@ -520,9 +520,12 @@
 		g_free(dec_in);
 
 		if (js->sasl_state != SASL_OK) {
-			/* This should never happen! */
+			/* This happens when the server sends back jibberish
+			 * in the "additional data with success" case.
+			 * Seen with Wildfire 3.0.1.
+			 */
 			*error = g_strdup(_("Invalid response from server"));
-			g_return_val_if_reached(JABBER_SASL_STATE_FAIL);
+			return JABBER_SASL_STATE_FAIL;
 		}
 	}
 
--- a/libpurple/protocols/jabber/auth_digest_md5.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/jabber/auth_digest_md5.c	Sat Feb 12 04:17:09 2011 +0900
@@ -27,6 +27,7 @@
 #include "util.h"
 #include "xmlnode.h"
 
+#include "auth_digest_md5.h"
 #include "auth.h"
 #include "jabber.h"
 
@@ -43,7 +44,7 @@
 }
 
 /* Parts of this algorithm are inspired by stuff in libgsasl */
-static GHashTable* parse_challenge(const char *challenge)
+GHashTable* jabber_auth_digest_md5_parse(const char *challenge)
 {
 	const char *token_start, *val_start, *val_end, *cur;
 	GHashTable *ret = g_hash_table_new_full(g_str_hash, g_str_equal,
@@ -77,12 +78,12 @@
 					val_start++;
 
 				val_end = cur;
-				while (val_end != val_start && (*val_end == ' ' || *val_end == ',' || *val_end == '\t'
+				while (val_end >= val_start && (*val_end == ' ' || *val_end == ',' || *val_end == '\t'
 						|| *val_end == '\r' || *val_end == '\n'
 						|| *val_end == '"'  || *val_end == '\0'))
 					val_end--;
 
-				if (val_start != val_end)
+				if (val_end - val_start + 1 >= 0)
 					value = g_strndup(val_start, val_end - val_start + 1);
 			}
 
@@ -186,7 +187,7 @@
 			dec_in != NULL ? strlen(dec_in) : 0,
 			dec_in != NULL  ? dec_in : "(null)");
 
-	parts = parse_challenge(dec_in);
+	parts = jabber_auth_digest_md5_parse(dec_in);
 
 	if (g_hash_table_lookup(parts, "rspauth")) {
 		char *rspauth = g_hash_table_lookup(parts, "rspauth");
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/jabber/auth_digest_md5.h	Sat Feb 12 04:17:09 2011 +0900
@@ -0,0 +1,39 @@
+/**
+ * @file auth_digest_md5.h Implementation of SASL DIGEST-MD5 authentication
+ *
+ * purple
+ *
+ * Purple is the legal property of its developers, whose names are too numerous
+ * to list here.  Please refer to the COPYRIGHT file distributed with this
+ * source distribution.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+ */
+#ifndef PURPLE_JABBER_AUTH_DIGEST_MD5_H_
+#define PURPLE_JABBER_AUTH_DIGEST_MD5_H_
+
+#include "internal.h"
+
+/*
+ * Every function in this file is ONLY exposed for tests.
+ * DO NOT USE ANYTHING HERE OR YOU WILL BE SENT TO THE PIT OF DESPAIR.
+ */
+
+/*
+ * Parse a DIGEST-MD5 challenge.
+ */
+GHashTable *jabber_auth_digest_md5_parse(const char *challenge);
+
+#endif /* PURPLE_JABBER_AUTH_DIGEST_MD5_H_ */
--- a/libpurple/protocols/jabber/bosh.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/jabber/bosh.c	Sat Feb 12 04:17:09 2011 +0900
@@ -108,8 +108,27 @@
 	int requests; /* number of outstanding HTTP requests */
 
 	gboolean headers_done;
+	gboolean close;
+};
 
-};
+static void
+debug_dump_http_connections(PurpleBOSHConnection *conn)
+{
+	int i;
+
+	g_return_if_fail(conn != NULL);
+
+	for (i = 0; i < NUM_HTTP_CONNECTIONS; ++i) {
+		PurpleHTTPConnection *httpconn = conn->connections[i];
+		if (httpconn == NULL)
+			purple_debug_misc("jabber", "BOSH %p->connections[%d] = (nil)\n",
+			                  conn, i);
+		else
+			purple_debug_misc("jabber", "BOSH %p->connections[%d] = %p, state = %d"
+			                  ", requests = %d\n", conn, i, httpconn,
+			                  httpconn->state, httpconn->requests);
+	}
+}
 
 static void http_connection_connect(PurpleHTTPConnection *conn);
 static void http_connection_send_request(PurpleHTTPConnection *conn,
@@ -263,18 +282,8 @@
 {
 	int i;
 
-	if (purple_debug_is_verbose()) {
-		for (i = 0; i < NUM_HTTP_CONNECTIONS; ++i) {
-			PurpleHTTPConnection *httpconn = conn->connections[i];
-			if (httpconn == NULL)
-				purple_debug_misc("jabber", "BOSH %p->connections[%d] = (nil)\n",
-				                  conn, i);
-			else
-				purple_debug_misc("jabber", "BOSH %p->connections[%d] = %p, state = %d"
-				                  ", requests = %d\n", conn, i, httpconn,
-				                  httpconn->state, httpconn->requests);
-		}
-	}
+	if (purple_debug_is_verbose())
+		debug_dump_http_connections(conn);
 
 	/* Easy solution: Does everyone involved support pipelining? Hooray! Just use
 	 * one TCP connection! */
@@ -297,11 +306,23 @@
 			return NULL;
 	}
 
-	/* Third loop, look for one that's NULL and create a new connection */
+	/* Third loop, is something offline that we can connect? */
+	for (i = 0; i < NUM_HTTP_CONNECTIONS; ++i) {
+		if (conn->connections[i] &&
+				conn->connections[i]->state == HTTP_CONN_OFFLINE) {
+			purple_debug_info("jabber", "bosh: Reconnecting httpconn "
+			                            "(%i, %p)\n", i, conn->connections[i]);
+			http_connection_connect(conn->connections[i]);
+			return NULL;
+		}
+	}
+
+	/* Fourth loop, look for one that's NULL and create a new connection */
 	for (i = 0; i < NUM_HTTP_CONNECTIONS; ++i) {
 		if (!conn->connections[i]) {
-			purple_debug_info("jabber", "bosh: Creating and connecting new httpconn\n");
 			conn->connections[i] = jabber_bosh_http_connection_init(conn);
+			purple_debug_info("jabber", "bosh: Creating and connecting new httpconn "
+			                            "(%i, %p)\n", i, conn->connections[i]);
 
 			http_connection_connect(conn->connections[i]);
 			return NULL;
@@ -344,6 +365,8 @@
 	chosen = find_available_http_connection(conn);
 
 	if (!chosen) {
+		if (type == PACKET_FLUSH)
+			return;
 		/*
 		 * For non-ordinary traffic, we can't 'buffer' it, so use the
 		 * first connection.
@@ -444,6 +467,27 @@
 	send_timer_cb(bosh);
 }
 
+static void
+jabber_bosh_disable_pipelining(PurpleBOSHConnection *bosh)
+{
+	/* Do nothing if it's already disabled */
+	if (!bosh->pipelining)
+		return;
+
+	purple_debug_info("jabber", "BOSH: Disabling pipelining on conn %p\n",
+	                            bosh);
+	bosh->pipelining = FALSE;
+	if (bosh->connections[1] == NULL) {
+		bosh->connections[1] = jabber_bosh_http_connection_init(bosh);
+		http_connection_connect(bosh->connections[1]);
+	} else {
+		/* Shouldn't happen; this should be the only place pipelining
+		 * is turned off.
+		 */
+		g_warn_if_reached();
+	}
+}
+
 static void jabber_bosh_connection_received(PurpleBOSHConnection *conn, xmlnode *node) {
 	xmlnode *child;
 	JabberStream *js = conn->js;
@@ -611,6 +655,8 @@
 static void
 connection_common_established_cb(PurpleHTTPConnection *conn)
 {
+	purple_debug_misc("jabber", "bosh: httpconn %p re-connected\n", conn);
+
 	/* Indicate we're ready and reset some variables */
 	conn->state = HTTP_CONN_CONNECTED;
 	if (conn->requests != 0)
@@ -622,9 +668,13 @@
 		g_string_free(conn->read_buf, TRUE);
 		conn->read_buf = NULL;
 	}
+	conn->close = FALSE;
 	conn->headers_done = FALSE;
 	conn->handled_len = conn->body_len = 0;
 
+	if (purple_debug_is_verbose())
+		debug_dump_http_connections(conn->bosh);
+
 	if (conn->bosh->js->reinit)
 		jabber_bosh_connection_send(conn->bosh, PACKET_NORMAL, NULL);
 	else if (conn->bosh->state == BOSH_CONN_ONLINE) {
@@ -639,6 +689,7 @@
 
 static void http_connection_disconnected(PurpleHTTPConnection *conn)
 {
+	gboolean had_requests = FALSE;
 	/*
 	 * Well, then. Fine! I never liked you anyway, server! I was cheating on you
 	 * with AIM!
@@ -662,7 +713,8 @@
 		conn->writeh = 0;
 	}
 
-	if (conn->requests > 0 && conn->read_buf->len == 0) {
+	had_requests = (conn->requests > 0);
+	if (had_requests && conn->read_buf->len == 0) {
 		purple_debug_error("jabber", "bosh: Adjusting BOSHconn requests (%d) to %d\n",
 		                   conn->bosh->requests, conn->bosh->requests - conn->requests);
 		conn->bosh->requests -= conn->requests;
@@ -671,13 +723,15 @@
 
 	if (conn->bosh->pipelining) {
 		/* Hmmmm, fall back to multiple connections */
-		conn->bosh->pipelining = FALSE;
-		if (conn->bosh->connections[1] == NULL) {
-			conn->bosh->connections[1] = jabber_bosh_http_connection_init(conn->bosh);
-			http_connection_connect(conn->bosh->connections[1]);
-		}
+		jabber_bosh_disable_pipelining(conn->bosh);
 	}
 
+	if (!had_requests)
+		/* If the server disconnected us without any requests, let's
+		 * just wait until we have something to send before we reconnect
+		 */
+		return;
+
 	if (++conn->bosh->failed_connections == MAX_FAILED_CONNECTIONS) {
 		purple_connection_error_reason(conn->bosh->js->gc,
 				PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
@@ -704,30 +758,49 @@
 
 	cursor = conn->read_buf->str + conn->handled_len;
 
+	if (purple_debug_is_verbose())
+		purple_debug_misc("jabber", "BOSH server sent: %s\n", cursor);
+
+	/* TODO: Chunked encoding and check response version :/ */
 	if (!conn->headers_done) {
-		const char *content_length = purple_strcasestr(cursor, "\r\nContent-Length");
+		const char *content_length = purple_strcasestr(cursor, "\r\nContent-Length:");
+		const char *connection = purple_strcasestr(cursor, "\r\nConnection:");
 		const char *end_of_headers = strstr(cursor, "\r\n\r\n");
 
 		/* Make sure Content-Length is in headers, not body */
 		if (content_length && (!end_of_headers || content_length < end_of_headers)) {
-			const char *sep;
 			int len;
 
-			if ((sep = strstr(content_length, ": ")) == NULL ||
-					strstr(sep, "\r\n") == NULL)
+			if (strstr(content_length, "\r\n") == NULL)
 				/*
 				 * The packet ends in the middle of the Content-Length line.
 				 * We'll try again later when we have more.
 				 */
 				return;
 
-			len = atoi(sep + 2);
+			len = atoi(content_length + strlen("\r\nContent-Length:"));
 			if (len == 0)
-				purple_debug_warning("jabber", "Found mangled Content-Length header.\n");
+				purple_debug_warning("jabber", "Found mangled Content-Length header, or server returned 0-length response.\n");
 
 			conn->body_len = len;
 		}
 
+		if (connection && (!end_of_headers || content_length < end_of_headers)) {
+			const char *tmp;
+			if (strstr(connection, "\r\n") == NULL)
+				return;
+
+
+			tmp = connection + strlen("\r\nConnection:");
+			while (*tmp && (*tmp == ' ' || *tmp == '\t'))
+				++tmp;
+
+			if (!g_ascii_strncasecmp(tmp, "close", strlen("close"))) {
+				conn->close = TRUE;
+				jabber_bosh_disable_pipelining(conn->bosh);
+			}
+		}
+
 		if (end_of_headers) {
 			conn->headers_done = TRUE;
 			conn->handled_len = end_of_headers - conn->read_buf->str + 4;
@@ -752,6 +825,14 @@
 	http_received_cb(conn->read_buf->str + conn->handled_len, conn->body_len,
 	                 conn->bosh);
 
+	/* Connection: Close? */
+	if (conn->close && conn->state == HTTP_CONN_CONNECTED) {
+		if (purple_debug_is_verbose())
+			purple_debug_misc("jabber", "bosh (%p), server sent Connection: "
+			                            "close\n", conn);
+		http_connection_disconnected(conn);
+	}
+
 	if (conn->bosh->state == BOSH_CONN_ONLINE &&
 			(conn->bosh->requests == 0 || conn->bosh->pending->bufused > 0)) {
 		purple_debug_misc("jabber", "BOSH: Sending an empty request\n");
@@ -791,10 +872,11 @@
 
 	if (cnt == 0 || (cnt < 0 && errno != EAGAIN)) {
 		if (cnt < 0)
-			purple_debug_info("jabber", "bosh read=%d, errno=%d, error=%s\n",
-			                  cnt, errno, g_strerror(errno));
+			purple_debug_info("jabber", "BOSH (%p) read=%d, errno=%d, error=%s\n",
+			                  conn, cnt, errno, g_strerror(errno));
 		else
-			purple_debug_info("jabber", "bosh server closed the connection\n");
+			purple_debug_info("jabber", "BOSH server closed the connection (%p)\n",
+			                  conn);
 
 		/*
 		 * If the socket is closed, the processing really needs to know about
@@ -911,6 +993,9 @@
 	else
 		ret = write(conn->fd, data, len);
 
+	if (purple_debug_is_verbose())
+		purple_debug_misc("jabber", "BOSH (%p): wrote %d bytes\n", conn, ret);
+
 	return ret;
 }
 
@@ -975,7 +1060,10 @@
 
 	if (purple_debug_is_unsafe() && purple_debug_is_verbose())
 		/* Will contain passwords for SASL PLAIN and is verbose */
-		purple_debug_misc("jabber", "BOSH: Sending %s\n", data);
+		purple_debug_misc("jabber", "BOSH (%p): Sending %s\n", conn, data);
+	else if (purple_debug_is_verbose())
+		purple_debug_misc("jabber", "BOSH (%p): Sending request of "
+		                            "%" G_GSIZE_FORMAT " bytes.\n", conn, len);
 
 	if (conn->writeh == 0)
 		ret = http_connection_do_send(conn, data, len);
--- a/libpurple/protocols/jabber/buddy.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/jabber/buddy.c	Sat Feb 12 04:17:09 2011 +0900
@@ -2305,17 +2305,17 @@
 	const gchar *category)
 {
 	const GList *iter = NULL;
-	
+
 	if (jbr->caps.info) {
 		for (iter = jbr->caps.info->identities ; iter ; iter = g_list_next(iter)) {
-			const JabberIdentity *identity = 
+			const JabberIdentity *identity =
 				(JabberIdentity *) iter->data;
-		
+
 			if (strcmp(identity->category, category) == 0) {
 				return identity->type;
 			}
 		}
 	}
-		
+
 	return NULL;
 }
--- a/libpurple/protocols/jabber/caps.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/jabber/caps.c	Sat Feb 12 04:17:09 2011 +0900
@@ -803,7 +803,7 @@
 	return fields;
 }
 
-static void 
+static void
 append_escaped_string(PurpleCipherContext *context, const gchar *str)
 {
 	if (str && *str) {
--- a/libpurple/protocols/jabber/data.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/jabber/data.c	Sat Feb 12 04:17:09 2011 +0900
@@ -283,7 +283,7 @@
 	gchar *alt = request_data->alt;
 	gboolean ephemeral = request_data->ephemeral;
 	JabberDataRequestCallback *cb = request_data->cb;
-	
+
 	xmlnode *data_element = xmlnode_get_child(packet, "data");
 	xmlnode *item_not_found = xmlnode_get_child(packet, "item-not-found");
 
@@ -308,7 +308,7 @@
 }
 
 void
-jabber_data_request(JabberStream *js, const gchar *cid, const gchar *who, 
+jabber_data_request(JabberStream *js, const gchar *cid, const gchar *who,
     gchar *alt, gboolean ephemeral, JabberDataRequestCallback cb,
     gpointer userdata)
 {
@@ -328,7 +328,7 @@
 	data->alt = alt;
 	data->ephemeral = ephemeral;
 	data->cb = cb;
-	
+
 	xmlnode_set_attrib(request->node, "to", who);
 	jabber_iq_set_callback(request, jabber_data_request_cb, data);
 	xmlnode_insert_child(request->node, data_request);
@@ -398,7 +398,7 @@
 
 	purple_debug_info("jabber", "associating remote BoB object with cid = %s\n",
 		cid);
-	
+
 	g_hash_table_insert(remote_data_by_cid, cid, data);
 }
 
--- a/libpurple/protocols/jabber/data.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/jabber/data.h	Sat Feb 12 04:17:09 2011 +0900
@@ -68,7 +68,7 @@
 /* returns an XHTML-IM "img" tag given a data instance */
 xmlnode *jabber_data_get_xhtml_im(const JabberData *data, const gchar *alt);
 
-void jabber_data_request(JabberStream *js, const gchar *cid, const gchar *who, 
+void jabber_data_request(JabberStream *js, const gchar *cid, const gchar *who,
     gchar *alt, gboolean ephemeral, JabberDataRequestCallback cb,
     gpointer userdata);
 
--- a/libpurple/protocols/jabber/disco.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/jabber/disco.c	Sat Feb 12 04:17:09 2011 +0900
@@ -480,10 +480,10 @@
 	js->srv_query_data = NULL;
 
 	if (results > 0) {
-		purple_debug_info("jabber", "looking up IP for %s:%d\n", 
+		purple_debug_info("jabber", "looking up IP for %s:%d\n",
 			resp[0].hostname, resp[0].port);
-		js->stun_query = 
-			purple_dnsquery_a(resp[0].hostname, resp[0].port, 
+		js->stun_query =
+			purple_dnsquery_a(resp[0].hostname, resp[0].port,
 				jabber_disco_stun_lookup_cb, js);
 	}
 }
@@ -547,7 +547,7 @@
 			}
 		} else if (purple_network_get_stun_ip() == NULL ||
 		    purple_strequal(purple_network_get_stun_ip(), "")) {
-			js->srv_query_data = 
+			js->srv_query_data =
 				purple_srv_resolve("stun", "udp", js->user->domain,
 					jabber_disco_stun_srv_resolve_cb, js);
 			/* TODO: add TURN support later... */
--- a/libpurple/protocols/jabber/google/google.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/jabber/google/google.c	Sat Feb 12 04:17:09 2011 +0900
@@ -159,7 +159,7 @@
 	g_return_if_fail(gc != NULL);
 	js = purple_connection_get_protocol_data(gc);
 
-	room = g_strdup_printf("private-chat-%s", uuid);	
+	room = g_strdup_printf("private-chat-%s", uuid);
 	chat = jabber_join_chat(js, room, GOOGLE_GROUPCHAT_SERVER, js->user->node,
 	                        NULL, NULL);
 	if (chat) {
--- a/libpurple/protocols/jabber/google/google_session.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/jabber/google/google_session.c	Sat Feb 12 04:17:09 2011 +0900
@@ -62,7 +62,7 @@
 
 	if (session->description)
 		xmlnode_free(session->description);
-	
+
 	g_free(session->session_data);
 	g_free(session);
 }
@@ -427,7 +427,7 @@
 	session->remote_jid = jid;
 	session_data = g_new0(GoogleAVSessionData, 1);
 	session->session_data = session_data;
-	
+
 	if (type & PURPLE_MEDIA_VIDEO)
 		session_data->video = TRUE;
 
@@ -440,7 +440,7 @@
 		jabber_google_relay_response_session_initiate_cb(session, NULL, 0, 0, 0,
 			NULL, NULL);
 	}
-	
+
 	/* we don't actually know yet wether it succeeded... maybe this is very
 	 wrong... */
 	return TRUE;
@@ -464,7 +464,7 @@
 		(GoogleAVSessionData *) session->session_data;
 
 	params =
-		jabber_google_session_get_params(js, relay_ip, relay_udp, relay_tcp, 
+		jabber_google_session_get_params(js, relay_ip, relay_udp, relay_tcp,
 	    	relay_ssltcp, relay_username, relay_password, &num_params);
 
 	if (purple_media_add_stream(session_data->media, "google-voice",
@@ -483,20 +483,20 @@
 
 		if (session_data->remote_audio_candidates) {
 			purple_media_add_remote_candidates(session_data->media,
-				"google-voice", session->remote_jid, 
+				"google-voice", session->remote_jid,
 			    session_data->remote_audio_candidates);
 			purple_media_candidate_list_free(session_data->remote_audio_candidates);
 			session_data->remote_audio_candidates = NULL;
 		}
 		if (session_data->remote_video_candidates) {
 			purple_media_add_remote_candidates(session_data->media,
-				"google-video", session->remote_jid, 
+				"google-video", session->remote_jid,
 			    session_data->remote_video_candidates);
 			purple_media_candidate_list_free(session_data->remote_video_candidates);
 			session_data->remote_video_candidates = NULL;
 		}
 	}
-		
+
 	g_free(params);
 
 	for (codec_element = xmlnode_get_child(session->description, "payload-type");
@@ -561,7 +561,7 @@
 	const gchar *xmlns;
 	GoogleAVSessionData *session_data =
 		(GoogleAVSessionData *) session->session_data;
-	
+
 	if (session->state != UNINIT) {
 		purple_debug_error("jabber", "Received initiate for active session.\n");
 		return FALSE;
@@ -598,9 +598,9 @@
 			G_CALLBACK(google_session_stream_info_cb), session);
 
 	session->iq_id = g_strdup(iq_id);
-	
+
 	if (js->google_relay_host && js->google_relay_token) {
-		jabber_google_do_relay_request(js, session, 
+		jabber_google_do_relay_request(js, session,
 			jabber_google_relay_response_session_handle_initiate_cb);
 	} else {
 		jabber_google_relay_response_session_handle_initiate_cb(session, NULL,
@@ -621,7 +621,7 @@
 	char n[4];
 	GoogleAVSessionData *session_data =
 		(GoogleAVSessionData *) session->session_data;
-	
+
 	for (cand = xmlnode_get_child(sess, "candidate"); cand;
 			cand = xmlnode_get_next_twin(cand)) {
 		PurpleMediaCandidate *info;
@@ -636,9 +636,9 @@
 		if (cname && type && address && port) {
 			PurpleMediaCandidateType candidate_type;
 			guint prio = preference ? g_ascii_strtod(preference, NULL) * 1000 : 0;
-			
+
 			g_snprintf(n, sizeof(n), "S%d", name++);
-			
+
 			if (g_str_equal(type, "local"))
 				candidate_type = PURPLE_MEDIA_CANDIDATE_TYPE_HOST;
 			else if (g_str_equal(type, "stun"))
@@ -713,7 +713,7 @@
 	gboolean video = (xmlns && !strcmp(xmlns, NS_GOOGLE_SESSION_VIDEO));
 	GoogleAVSessionData *session_data =
 		(GoogleAVSessionData *) session->session_data;
-	
+
 	for (; codec_element; codec_element = codec_element->next) {
 		const gchar *xmlns, *encoding_name, *id,
 				*clock_rate, *width, *height, *framerate;
--- a/libpurple/protocols/jabber/google/jingleinfo.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/jabber/google/jingleinfo.c	Sat Feb 12 04:17:09 2011 +0900
@@ -124,7 +124,7 @@
 	if (relay) {
 		xmlnode *token = xmlnode_get_child(relay, "token");
 		xmlnode *server = xmlnode_get_child(relay, "server");
-		
+
 		if (token) {
 			gchar *relay_token = xmlnode_get_data(token);
 
@@ -133,7 +133,7 @@
 		}
 
 		if (server) {
-			js->google_relay_host = 
+			js->google_relay_host =
 				g_strdup(xmlnode_get_attrib(server, "host"));
 		}
 	}
--- a/libpurple/protocols/jabber/google/relay.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/jabber/google/relay.c	Sat Feb 12 04:17:09 2011 +0900
@@ -38,7 +38,7 @@
 	for (; lines[i] ; i++) {
 		gchar *line = lines[i];
 		gchar **parts = g_strsplit(line, "=", 2);
-		
+
 		if (parts[0] && parts[1]) {
 			if (purple_strequal(parts[0], "relay.ip")) {
 				*ip = g_strdup(parts[1]);
@@ -61,7 +61,7 @@
 }
 
 static void
-jabber_google_relay_remove_url_data(JabberStream *js, 
+jabber_google_relay_remove_url_data(JabberStream *js,
 	PurpleUtilFetchUrlData *url_data)
 {
 	GList *iter = js->google_relay_requests;
@@ -76,8 +76,8 @@
 }
 
 static void
-jabber_google_relay_fetch_cb(PurpleUtilFetchUrlData *url_data, 
-	gpointer user_data, const gchar *url_text, gsize len, 
+jabber_google_relay_fetch_cb(PurpleUtilFetchUrlData *url_data,
+	gpointer user_data, const gchar *url_text, gsize len,
 	const gchar *error_message)
 {
 	JabberGoogleRelayCallbackData *data =
@@ -93,7 +93,7 @@
 	gchar *relay_password = NULL;
 
 	g_free(data);
-	
+
 	if (url_data) {
 		jabber_google_relay_remove_url_data(js, url_data);
 	}
@@ -128,15 +128,15 @@
 		g_strdup_printf("GET /create_session HTTP/1.0\r\n"
 			            "Host: %s\r\n"
 						"X-Talk-Google-Relay-Auth: %s\r\n"
-						"X-Google-Relay-Auth: %s\r\n\r\n", 
+						"X-Google-Relay-Auth: %s\r\n\r\n",
 			js->google_relay_host, js->google_relay_token, js->google_relay_token);
 	JabberGoogleRelayCallbackData *data = g_new0(JabberGoogleRelayCallbackData, 1);
 
 	data->session = session;
 	data->cb = cb;
-	purple_debug_info("jabber", 
-		"sending Google relay request %s to %s\n", request, url); 
-	url_data = 
+	purple_debug_info("jabber",
+		"sending Google relay request %s to %s\n", request, url);
+	url_data =
 		purple_util_fetch_url_request(url, FALSE, NULL, FALSE, request, FALSE,
 			jabber_google_relay_fetch_cb, data);
 	if (url_data) {
--- a/libpurple/protocols/jabber/ibb.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/jabber/ibb.h	Sat Feb 12 04:17:09 2011 +0900
@@ -110,8 +110,8 @@
 gsize jabber_ibb_session_get_block_size(const JabberIBBSession *sess);
 void jabber_ibb_session_set_block_size(JabberIBBSession *sess, gsize size);
 
-/* get maximum size data block to send (in bytes) 
- (before encoded to BASE64) */ 
+/* get maximum size data block to send (in bytes)
+ (before encoded to BASE64) */
 gsize jabber_ibb_session_get_max_data_size(const JabberIBBSession *sess);
 
 gpointer jabber_ibb_session_get_user_data(JabberIBBSession *sess);
--- a/libpurple/protocols/jabber/jabber.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/jabber/jabber.c	Sat Feb 12 04:17:09 2011 +0900
@@ -240,7 +240,7 @@
 		jabber_send_raw(js,
 				"<starttls xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>", -1);
 		return TRUE;
-	} else { 
+	} else {
 		purple_debug_warning("jabber", "No libpurple TLS/SSL support found.");
 	}
 #endif
@@ -1719,8 +1719,8 @@
 				(PurpleUtilFetchUrlData *) js->google_relay_requests->data;
 			purple_util_fetch_url_cancel(url_data);
 			g_free(url_data);
-			js->google_relay_requests = 
-				g_list_delete_link(js->google_relay_requests, 
+			js->google_relay_requests =
+				g_list_delete_link(js->google_relay_requests,
 					js->google_relay_requests);
 		}
 	}
@@ -2147,9 +2147,9 @@
 	if (jb) {
 		JabberBuddyResource *jbr = jabber_buddy_find_resource(jb, NULL);
 		if (jbr) {
-			const gchar *client_type = 
+			const gchar *client_type =
 				jabber_resource_get_identity_category_type(jbr, "client");
-		
+
 			if (client_type) {
 				if (strcmp(client_type, "phone") == 0) {
 					return "mobile";
@@ -2164,7 +2164,7 @@
 			}
 		}
 	}
-		
+
 	return NULL;
 }
 
@@ -2314,7 +2314,7 @@
 					purple_notify_user_info_add_pair(user_info, _("Mood"), moodplustext);
 					g_free(moodplustext);
 				} else
-					purple_notify_user_info_add_pair(user_info, _("Mood"), 
+					purple_notify_user_info_add_pair(user_info, _("Mood"),
 					    description ? _(description) : mood);
 			}
 			if (purple_presence_is_status_primitive_active(presence, PURPLE_STATUS_TUNE)) {
@@ -2379,7 +2379,7 @@
 			NULL);
 	types = g_list_prepend(types, type);
 
-	
+
 	type = purple_status_type_new_with_attrs(PURPLE_STATUS_MOOD,
 	    "mood", NULL, TRUE, TRUE, TRUE,
 			PURPLE_MOOD_NAME, _("Mood Name"), purple_value_new(PURPLE_TYPE_STRING),
@@ -3141,7 +3141,7 @@
 	gchar *description;
 	PurpleBuddy *buddy;
 	const char *alias;
-	PurpleAttentionType *attn = 
+	PurpleAttentionType *attn =
 		purple_get_attention_type_from_code(conv->account, 0);
 
 	if (!args || !args[0]) {
@@ -3160,10 +3160,10 @@
 		alias = purple_buddy_get_contact_alias(buddy);
 	else
 		alias = who;
-	
-	description = 
+
+	description =
 		g_strdup_printf(purple_attention_type_get_outgoing_desc(attn), alias);
-	purple_conversation_write(conv, NULL, description, 
+	purple_conversation_write(conv, NULL, description,
 		PURPLE_MESSAGE_NOTIFY | PURPLE_MESSAGE_SYSTEM, time(NULL));
 	g_free(description);
 	return _jabber_send_buzz(js, who, error)  ? PURPLE_CMD_RET_OK : PURPLE_CMD_RET_FAILED;
@@ -3521,7 +3521,7 @@
 		}
 
 		if (has_resources_without_caps) {
-			/* there is at least one resource which we don't have caps for, 
+			/* there is at least one resource which we don't have caps for,
 			 let's assume they can receive files... */
 			return TRUE;
 		} else {
--- a/libpurple/protocols/jabber/jingle/content.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/jabber/jingle/content.c	Sat Feb 12 04:17:09 2011 +0900
@@ -93,7 +93,7 @@
 {
 	GObjectClass *gobject_class = (GObjectClass*)klass;
 	parent_class = g_type_class_peek_parent(klass);
-	
+
 	gobject_class->finalize = jingle_content_finalize;
 	gobject_class->set_property = jingle_content_set_property;
 	gobject_class->get_property = jingle_content_get_property;
@@ -164,7 +164,7 @@
 {
 	JingleContentPrivate *priv = JINGLE_CONTENT_GET_PRIVATE(content);
 	purple_debug_info("jingle","jingle_content_finalize\n");
-	
+
 	g_free(priv->description_type);
 	g_free(priv->creator);
 	g_free(priv->disposition);
@@ -215,7 +215,7 @@
 				g_object_unref(content->priv->pending_transport);
 			content->priv->pending_transport = g_value_get_object(value);
 			break;
-		default:	
+		default:
 			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 			break;
 	}
@@ -226,7 +226,7 @@
 {
 	JingleContent *content;
 	g_return_if_fail(JINGLE_IS_CONTENT(object));
-	
+
 	content = JINGLE_CONTENT(object);
 
 	switch (prop_id) {
@@ -251,8 +251,8 @@
 		case PROP_PENDING_TRANSPORT:
 			g_value_set_object(value, content->priv->pending_transport);
 			break;
-		default:	
-			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);	
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 			break;
 	}
 }
@@ -262,7 +262,7 @@
 		const gchar *disposition, const gchar *name,
 		const gchar *senders, JingleTransport *transport)
 {
-	
+
 
 	JingleContent *content = g_object_new(jingle_get_type(type),
 			"creator", creator,
@@ -384,6 +384,8 @@
 	const gchar *name = xmlnode_get_attrib(content, "name");
 	JingleTransport *transport =
 			jingle_transport_parse(xmlnode_get_child(content, "transport"));
+	if (transport == NULL)
+		return NULL;
 
 	if (senders == NULL)
 		senders = "both";
--- a/libpurple/protocols/jabber/jingle/iceudp.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/jabber/jingle/iceudp.c	Sat Feb 12 04:17:09 2011 +0900
@@ -215,7 +215,7 @@
 			iceudp->priv->remote_candidates =
 					g_value_get_pointer(value);
 			break;
-		default:	
+		default:
 			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 			break;
 	}
@@ -226,7 +226,7 @@
 {
 	JingleIceUdp *iceudp;
 	g_return_if_fail(JINGLE_IS_ICEUDP(object));
-	
+
 	iceudp = JINGLE_ICEUDP(object);
 
 	switch (prop_id) {
@@ -236,8 +236,8 @@
 		case PROP_REMOTE_CANDIDATES:
 			g_value_set_pointer(value, iceudp->priv->remote_candidates);
 			break;
-		default:	
-			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);	
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 			break;
 	}
 }
--- a/libpurple/protocols/jabber/jingle/jingle.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/jabber/jingle/jingle.c	Sat Feb 12 04:17:09 2011 +0900
@@ -42,6 +42,9 @@
 GType
 jingle_get_type(const gchar *type)
 {
+	if (type == NULL)
+		return G_TYPE_NONE;
+
 	if (!strcmp(type, JINGLE_TRANSPORT_RAWUDP))
 		return JINGLE_TYPE_RAWUDP;
 	else if (!strcmp(type, JINGLE_TRANSPORT_ICEUDP))
@@ -170,7 +173,7 @@
 	jabber_iq_send(jingle_session_create_ack(session, jingle));
 
 	jingle_session_accept_session(session);
-	
+
 	for (; content; content = xmlnode_get_next_twin(content)) {
 		const gchar *name = xmlnode_get_attrib(content, "name");
 		const gchar *creator = xmlnode_get_attrib(content, "creator");
@@ -201,7 +204,7 @@
 	jabber_iq_send(jingle_session_create_ack(session, jingle));
 
 	jingle_session_accept_session(session);
-	
+
 	for (; content; content = xmlnode_get_next_twin(content)) {
 		const gchar *name = xmlnode_get_attrib(content, "name");
 		const gchar *creator = xmlnode_get_attrib(content, "creator");
@@ -263,7 +266,7 @@
 	xmlnode *content = xmlnode_get_child(jingle, "content");
 
 	jabber_iq_send(jingle_session_create_ack(session, jingle));
-	
+
 	for (; content; content = xmlnode_get_next_twin(content)) {
 		const gchar *name = xmlnode_get_attrib(content, "name");
 		const gchar *creator = xmlnode_get_attrib(content, "creator");
@@ -282,7 +285,7 @@
 	for (; content; content = xmlnode_get_next_twin(content)) {
 		const gchar *name = xmlnode_get_attrib(content, "name");
 		const gchar *creator = xmlnode_get_attrib(content, "creator");
-		JingleContent *parsed_content = 
+		JingleContent *parsed_content =
 				jingle_session_find_content(session, name, creator);
 		if (parsed_content == NULL) {
 			purple_debug_error("jingle", "Error parsing content\n");
@@ -301,7 +304,7 @@
 	xmlnode *content = xmlnode_get_child(jingle, "content");
 
 	jabber_iq_send(jingle_session_create_ack(session, jingle));
-	
+
 	for (; content; content = xmlnode_get_next_twin(content)) {
 		const gchar *name = xmlnode_get_attrib(content, "name");
 		const gchar *creator = xmlnode_get_attrib(content, "creator");
@@ -447,13 +450,13 @@
 {
 	GValue value;
 	GstStructure *turn_setup = gst_structure_new("relay-info",
-		"ip", G_TYPE_STRING, ip, 
+		"ip", G_TYPE_STRING, ip,
 		"port", G_TYPE_UINT, port,
 		"username", G_TYPE_STRING, username,
 		"password", G_TYPE_STRING, password,
 		"relay-type", G_TYPE_STRING, relay_type,
 		NULL);
-	purple_debug_info("jabber", "created gst_structure %" GST_PTR_FORMAT "\n", 
+	purple_debug_info("jabber", "created gst_structure %" GST_PTR_FORMAT "\n",
 		turn_setup);
 	if (turn_setup) {
 		memset(&value, 0, sizeof(GValue));
@@ -477,18 +480,18 @@
 		(relay_ip ? 3 : 2) : (relay_ip ? 1 : 0);
 	GParameter *params = NULL;
 	int next_index = 0;
-	
+
 	if (num_params > 0) {
 		params = g_new0(GParameter, num_params);
 
 		if (has_account_stun) {
-			purple_debug_info("jabber", 
+			purple_debug_info("jabber",
 				"setting param stun-ip for stream using Google auto-config: %s\n",
 				js->stun_ip);
 			params[next_index].name = "stun-ip";
 			g_value_init(&params[next_index].value, G_TYPE_STRING);
 			g_value_set_string(&params[next_index].value, js->stun_ip);
-			purple_debug_info("jabber", 
+			purple_debug_info("jabber",
 				"setting param stun-port for stream using Google auto-config: %d\n",
 				js->stun_port);
 			next_index++;
@@ -497,22 +500,22 @@
 			g_value_set_uint(&params[next_index].value, js->stun_port);
 			next_index++;
 		}
-	
+
 		if (relay_ip) {
 			GValueArray *relay_info = g_value_array_new(0);
 
 			if (relay_udp) {
-				relay_info = 
+				relay_info =
 					jingle_create_relay_info(relay_ip, relay_udp, relay_username,
 						relay_password, "udp", relay_info);
 			}
 			if (relay_tcp) {
-				relay_info = 
+				relay_info =
 					jingle_create_relay_info(relay_ip, relay_tcp, relay_username,
 						relay_password, "tcp", relay_info);
 			}
 			if (relay_ssltcp) {
-				relay_info = 
+				relay_info =
 					jingle_create_relay_info(relay_ip, relay_ssltcp, relay_username,
 						relay_password, "tls", relay_info);
 			}
--- a/libpurple/protocols/jabber/jingle/jingle.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/jabber/jingle/jingle.h	Sat Feb 12 04:17:09 2011 +0900
@@ -9,17 +9,17 @@
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
  * (at your option) any later version.
- * 
+ *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU Library General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor Boston, MA 02110-1301,  USA
  */
- 
+
 #ifndef PURPLE_JABBER_JINGLE_H
 #define PURPLE_JABBER_JINGLE_H
 
--- a/libpurple/protocols/jabber/jingle/rawudp.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/jabber/jingle/rawudp.c	Sat Feb 12 04:17:09 2011 +0900
@@ -187,7 +187,7 @@
 			rawudp->priv->remote_candidates =
 					g_value_get_pointer(value);
 			break;
-		default:	
+		default:
 			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 			break;
 	}
@@ -198,7 +198,7 @@
 {
 	JingleRawUdp *rawudp;
 	g_return_if_fail(JINGLE_IS_RAWUDP(object));
-	
+
 	rawudp = JINGLE_RAWUDP(object);
 
 	switch (prop_id) {
@@ -208,8 +208,8 @@
 		case PROP_REMOTE_CANDIDATES:
 			g_value_set_pointer(value, rawudp->priv->remote_candidates);
 			break;
-		default:	
-			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);	
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 			break;
 	}
 }
--- a/libpurple/protocols/jabber/jingle/rtp.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/jabber/jingle/rtp.c	Sat Feb 12 04:17:09 2011 +0900
@@ -160,7 +160,7 @@
 			g_free(rtp->priv->ssrc);
 			rtp->priv->ssrc = g_value_dup_string(value);
 			break;
-		default:	
+		default:
 			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 			break;
 	}
@@ -171,7 +171,7 @@
 {
 	JingleRtp *rtp;
 	g_return_if_fail(JINGLE_IS_RTP(object));
-	
+
 	rtp = JINGLE_RTP(object);
 
 	switch (prop_id) {
@@ -181,8 +181,8 @@
 		case PROP_SSRC:
 			g_value_set_string(value, rtp->priv->ssrc);
 			break;
-		default:	
-			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);	
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 			break;
 	}
 }
@@ -251,7 +251,7 @@
 	gchar *password = purple_media_candidate_get_password(candidate);
 	PurpleMediaCandidateType type =
 			purple_media_candidate_get_candidate_type(candidate);
-	
+
 	JingleIceUdpCandidate *iceudp_candidate = jingle_iceudp_candidate_new(
 			purple_media_candidate_get_component_id(candidate),
 			purple_media_candidate_get_foundation(candidate),
@@ -531,7 +531,7 @@
 	gchar *remote_jid = jingle_session_get_remote_jid(session);
 
 	PurpleMedia *media = purple_media_manager_create_media(
-			purple_media_manager_get(), 
+			purple_media_manager_get(),
 			purple_connection_get_account(js->gc),
 			"fsrtpconference", remote_jid,
 			jingle_session_is_initiator(session));
@@ -610,7 +610,7 @@
 		type = is_audio == TRUE ? PURPLE_MEDIA_RECV_AUDIO
 				: PURPLE_MEDIA_RECV_VIDEO;
 
-	params = 
+	params =
 		jingle_get_params(jingle_session_get_js(session), NULL, 0, 0, 0,
 			NULL, NULL, &num_params);
 
@@ -659,8 +659,8 @@
 		id = xmlnode_get_attrib(codec_element, "id");
 		clock_rate = xmlnode_get_attrib(codec_element, "clockrate");
 
-		codec = purple_media_codec_new(atoi(id), encoding_name, 
-				     type, 
+		codec = purple_media_codec_new(atoi(id), encoding_name,
+				     type,
 				     clock_rate ? atoi(clock_rate) : 0);
 
 		for (param = xmlnode_get_child(codec_element, "parameter");
@@ -702,7 +702,7 @@
 		gchar *id, *name, *clockrate, *channels;
 		gchar *codec_str;
 		xmlnode *payload = xmlnode_new_child(description, "payload-type");
-		
+
 		id = g_strdup_printf("%d",
 				purple_media_codec_get_id(codec));
 		name = purple_media_codec_get_encoding_name(codec);
@@ -897,7 +897,7 @@
 }
 
 gboolean
-jingle_rtp_initiate_media(JabberStream *js, const gchar *who, 
+jingle_rtp_initiate_media(JabberStream *js, const gchar *who,
 		      PurpleMediaSessionType type)
 {
 	/* create content negotiation */
@@ -907,7 +907,7 @@
 	JabberBuddy *jb;
 	JabberBuddyResource *jbr;
 	const gchar *transport_type;
-	
+
 	gchar *resource = NULL, *me = NULL, *sid = NULL;
 
 	/* construct JID to send to */
--- a/libpurple/protocols/jabber/jingle/session.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/jabber/jingle/session.c	Sat Feb 12 04:17:09 2011 +0900
@@ -93,7 +93,7 @@
 {
 	GObjectClass *gobject_class = (GObjectClass*)klass;
 	parent_class = g_type_class_peek_parent(klass);
-	
+
 	gobject_class->finalize = jingle_session_finalize;
 	gobject_class->set_property = jingle_session_set_property;
 	gobject_class->get_property = jingle_session_get_property;
@@ -221,7 +221,7 @@
 		case PROP_PENDING_CONTENTS:
 			session->priv->pending_contents = g_value_get_pointer(value);
 			break;
-		default:	
+		default:
 			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 			break;
 	}
@@ -232,7 +232,7 @@
 {
 	JingleSession *session;
 	g_return_if_fail(JINGLE_IS_SESSION(object));
-	
+
 	session = JINGLE_SESSION(object);
 
 	switch (prop_id) {
@@ -260,8 +260,8 @@
 		case PROP_PENDING_CONTENTS:
 			g_value_set_pointer(value, session->priv->pending_contents);
 			break;
-		default:	
-			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);	
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 			break;
 	}
 }
@@ -395,7 +395,7 @@
 {
 	return js->sessions != NULL ?
 			g_hash_table_find(js->sessions,
-			find_by_jid_ghr, (gpointer)jid) : NULL; 
+			find_by_jid_ghr, (gpointer)jid) : NULL;
 }
 
 static xmlnode *
@@ -427,7 +427,7 @@
 	g_free(remote_jid);
 
 	xmlnode_set_attrib(jingle, "sid", jingle_session_get_sid(session));
-	
+
 	return jingle;
 }
 
--- a/libpurple/protocols/jabber/jingle/transport.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/jabber/jingle/transport.c	Sat Feb 12 04:17:09 2011 +0900
@@ -111,7 +111,7 @@
 	g_return_if_fail(JINGLE_IS_TRANSPORT(object));
 
 	switch (prop_id) {
-		default:	
+		default:
 			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 			break;
 	}
@@ -123,8 +123,8 @@
 	g_return_if_fail(JINGLE_IS_TRANSPORT(object));
 
 	switch (prop_id) {
-		default:	
-			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);	
+		default:
+			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 			break;
 	}
 }
@@ -159,8 +159,12 @@
 JingleTransport *
 jingle_transport_parse(xmlnode *transport)
 {
-	const gchar *type = xmlnode_get_namespace(transport);
-	return JINGLE_TRANSPORT_CLASS(g_type_class_ref(jingle_get_type(type)))->parse(transport);
+	const gchar *type_name = xmlnode_get_namespace(transport);
+	GType type = jingle_get_type(type_name);
+	if (type == G_TYPE_NONE)
+		return NULL;
+	
+	return JINGLE_TRANSPORT_CLASS(g_type_class_ref(type))->parse(transport);
 }
 
 xmlnode *
--- a/libpurple/protocols/jabber/jutil.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/jabber/jutil.c	Sat Feb 12 04:17:09 2011 +0900
@@ -731,7 +731,7 @@
 }
 
 char *
-jabber_calculate_data_hash(gconstpointer data, size_t len, 
+jabber_calculate_data_hash(gconstpointer data, size_t len,
     const gchar *hash_algo)
 {
 	PurpleCipherContext *context;
--- a/libpurple/protocols/jabber/message.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/jabber/message.c	Sat Feb 12 04:17:09 2011 +0900
@@ -952,7 +952,7 @@
 			const GList *iterator;
 			GList *valid_smileys = NULL;
 			gboolean has_too_large_smiley = FALSE;
-			
+
 			for (iterator = found_smileys; iterator ;
 				iterator = g_list_next(iterator)) {
 				PurpleSmiley *smiley = (PurpleSmiley *) iterator->data;
@@ -983,7 +983,7 @@
 							"(too large, max is %d)\n",
 							purple_smiley_get_shortcut(smiley),
 							JABBER_DATA_MAX_SIZE);
-				}				
+				}
 			}
 
 			if (has_too_large_smiley) {
@@ -1251,7 +1251,7 @@
 	JabberMessage *jm;
 	JabberBuddy *jb;
 	JabberBuddyResource *jbr;
-	char *resource;	
+	char *resource;
 
 	js = purple_connection_get_protocol_data(gc);
 	jb = jabber_buddy_find(js, who, TRUE);
--- a/libpurple/protocols/jabber/parser.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/jabber/parser.c	Sat Feb 12 04:17:09 2011 +0900
@@ -109,7 +109,7 @@
 			js->stream_id = g_strdup("");
 			purple_debug_info("jabber", "Server failed to specify a stream "
 			                  "ID (underspecified in rfc3920, but intended "
-			                  "to be a MUST; digest legacy auth may fail.\n"); 
+			                  "to be a MUST; digest legacy auth may fail.\n");
 #endif
 		}
 	} else {
--- a/libpurple/protocols/jabber/si.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/jabber/si.c	Sat Feb 12 04:17:09 2011 +0900
@@ -1244,11 +1244,13 @@
 	/* yaz */
 	f1 = g_filename_display_basename(xfer->local_filename);
 	f2 = botch_utf(f1, strlen(f1), &dummy);
-	if(f2){
-		purple_xfer_set_filename(xfer, (char *)f2);
+	if(f2) {
+		xfer->filename = f2;
+		g_free(f1); f1 = NULL;
 	}
-	g_free(f1); f1 = NULL;
-	g_free(f2); f2 = NULL;
+    else {
+		xfer->filename = f1;
+    }
 
 	iq = jabber_iq_new(jsx->js, JABBER_IQ_SET);
 	xmlnode_set_attrib(iq->node, "to", xfer->who);
@@ -1516,7 +1518,7 @@
 		JabberBuddyResource *jbr = NULL;
 		char *resource;
 		GList *resources = NULL;
-		
+
 		if(NULL != (resource = jabber_get_resource(xfer->who))) {
 			/* they've specified a resource, no need to ask or
 			 * default or anything, just do it */
@@ -1542,7 +1544,7 @@
 				}
 			}
 		}
-		
+
 		if (!resources) {
 			/* no resources online, we're trying to send to someone
 			 * whose presence we're not subscribed to, or
@@ -1571,7 +1573,7 @@
 			PurpleRequestFields *fields = purple_request_fields_new();
 			PurpleRequestField *field = purple_request_field_choice_new("resource", _("Resource"), 0);
 			PurpleRequestFieldGroup *group = purple_request_field_group_new(NULL);
-			
+
 			for(l = resources; l; l = l->next) {
 				jbr = l->data;
 				purple_request_field_choice_add(field, jbr->name);
--- a/libpurple/protocols/jabber/usernick.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/jabber/usernick.c	Sat Feb 12 04:17:09 2011 +0900
@@ -68,7 +68,7 @@
 static void do_nick_got_own_nick_cb(JabberStream *js, const char *from, xmlnode *items) {
 	char *oldnickname = NULL;
 	xmlnode *item = NULL;
-	
+
 	if (items)
 		item = xmlnode_get_child(items,"item");
 
--- a/libpurple/protocols/jabber/win32/posix.uname.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/jabber/win32/posix.uname.c	Sat Feb 12 04:17:09 2011 +0900
@@ -1,10 +1,10 @@
 /*
    posix.uname.c - version 1.1
-   Copyright (C) 1999, 2000 
+   Copyright (C) 1999, 2000
 	     Earnie Boyd and assigns
 
    Fills the utsname structure with the appropriate values.
-  
+
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU Lesser General Public License as published
    by the Free Software Foundation; either version 2.1, or (at your option)
@@ -131,7 +131,7 @@
       strcpy( uts->machine, "unknown" );
       break;
   }
-  
+
   sLength = sizeof ( uts->nodename ) - 1;
   GetComputerNameA( uts->nodename, &sLength );
   return 1;
--- a/libpurple/protocols/msn/contact.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/msn/contact.c	Sat Feb 12 04:17:09 2011 +0900
@@ -1,5 +1,5 @@
 /**
- * @file contact.c 
+ * @file contact.c
  * 	get MSN contacts via SOAP request
  *	created by MaYuan<mayuan2006@gmail.com>
  *
@@ -339,7 +339,7 @@
 	g_return_if_fail(session != NULL);
 	g_return_if_fail(session->user != NULL);
 	g_return_if_fail(session->user->passport != NULL);
-	
+
 	purple_debug_info("msn", "Creating an Address Book.\n");
 
 	body = g_strdup_printf(MSN_ADD_ADDRESSBOOK_TEMPLATE,
@@ -1674,7 +1674,7 @@
 	msn_callback_state_set_who(state, passport);
 
 	user = msn_userlist_find_user(session->userlist, passport);
-	
+
 	if (list == MSN_LIST_PL) {
 		partner_scenario = MSN_PS_CONTACT_API;
 		if (user->networkid != MSN_NETWORK_PASSPORT)
@@ -1878,7 +1878,7 @@
 			} else if (state->action & MSN_MOVE_BUDDY) {
 				/* This will be freed when the add contact callback fires */
 				MsnCallbackState *new_state = msn_callback_state_dup(state);
-				msn_add_contact_to_group(session, new_state, state->who, guid); 
+				msn_add_contact_to_group(session, new_state, state->who, guid);
 				g_free(guid);
 				return;
 			}
--- a/libpurple/protocols/msn/directconn.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/msn/directconn.c	Sat Feb 12 04:17:09 2011 +0900
@@ -27,6 +27,7 @@
 #include "debug.h"
 
 #include "msn.h"
+#include "msnutils.h"
 #include "directconn.h"
 
 #include "slp.h"
@@ -442,48 +443,43 @@
 	msn_dc_enqueue_packet(dc, p);
 }
 
-static void
-msn_dc_send_handshake_with_nonce(MsnDirectConn *dc, MsnDirectConnPacket *p)
-{
-	const gchar *h;
-
-	h = msn_p2p_header_to_wire(&dc->header);
-
-	memcpy(p->data, h, P2P_PACKET_HEADER_SIZE);
-
-	memcpy(p->data + P2P_HEADER_ACK_ID_OFFSET, dc->nonce, 16);
-
-	msn_dc_enqueue_packet(dc, p);
-}
+#if 0 /* We don't actually need this */
+typedef struct {
+	guint32 null;
+	guint32 id;
+	guint32 null[5];
+	guint32 flags;
+	guint8  nonce[16];
+} MsnDirectConnNoncePacket;
+#endif
+#define DC_NONCE_PACKET_SIZE (8 * 4 + 16)
+#define DC_NONCE_PACKET_NONCE (8 * 4)
 
 static void
 msn_dc_send_handshake(MsnDirectConn *dc)
 {
 	MsnDirectConnPacket *p;
-
-	p = msn_dc_new_packet(P2P_PACKET_HEADER_SIZE);
+	gchar *h;
 
-	dc->header.session_id = 0;
-	dc->header.id = dc->slpcall->slplink->slp_seq_id++;
-	dc->header.offset = 0;
-	dc->header.total_size = 0;
-	dc->header.length = 0;
-	dc->header.flags = 0x100;
+	p = msn_dc_new_packet(DC_NONCE_PACKET_SIZE);
+	h = (gchar *)p->data;
+
+	msn_push32le(h, 0); /* NUL */
+
+	msn_push32le(h, dc->slpcall->slplink->slp_seq_id++);
 
-	msn_dc_send_handshake_with_nonce(dc, p);
-}
+	/* More NUL stuff */
+	msn_push64le(h, 0);
+	msn_push64le(h, 0);
+	msn_push32le(h, 0);
 
-static void
-msn_dc_send_handshake_reply(MsnDirectConn *dc)
-{
-	MsnDirectConnPacket *p;
+	/* Flags */
+	msn_push32le(h, P2P_DC_HANDSHAKE);
 
-	p = msn_dc_new_packet(P2P_PACKET_HEADER_SIZE);
+	/* The real Nonce, yay! */
+	memcpy(h, dc->nonce, 16);
 
-	dc->header.id = dc->slpcall->slplink->slp_seq_id++;
-	dc->header.length = 0;
-
-	msn_dc_send_handshake_with_nonce(dc, p);
+	msn_dc_enqueue_packet(dc, p);
 }
 
 static gboolean
@@ -492,10 +488,10 @@
 	guchar nonce[16];
 	gchar  nonce_hash[37];
 
-	if (packet_length != P2P_PACKET_HEADER_SIZE)
+	if (packet_length != DC_NONCE_PACKET_SIZE)
 		return FALSE;
 
-	memcpy(nonce, dc->in_buffer + 4 + P2P_HEADER_ACK_ID_OFFSET, 16);
+	memcpy(nonce, dc->in_buffer + 4 + DC_NONCE_PACKET_NONCE, 16);
 
 	if (dc->nonce_type == DC_NONCE_PLAIN) {
 		if (memcmp(dc->nonce, nonce, 16) == 0) {
@@ -543,13 +539,11 @@
 msn_dc_enqueue_part(MsnDirectConn *dc, MsnSlpMessagePart *part)
 {
 	MsnDirectConnPacket *p;
-	guint32 length;
+	size_t length;
 
-	length = part->size + P2P_PACKET_HEADER_SIZE;
-	p = msn_dc_new_packet(length);
-
-	memcpy(p->data, part->header, P2P_PACKET_HEADER_SIZE);
-	memcpy(p->data + P2P_PACKET_HEADER_SIZE, part->buffer, part->size);
+	p = msn_dc_new_packet(0);
+	p->data = (guchar *)msn_slpmsgpart_serialize(part, &length);
+	p->length = length - P2P_PACKET_FOOTER_SIZE; /* DC doesn't need footer? */
 
 	p->sent_cb = msn_dc_send_packet_cb;
 	p->part = msn_slpmsgpart_ref(part);
@@ -580,7 +574,7 @@
 		if (!msn_dc_verify_handshake(dc, packet_length))
 			return DC_PROCESS_FALLBACK;
 
-		msn_dc_send_handshake_reply(dc);
+		msn_dc_send_handshake(dc);
 		dc->state = DC_STATE_ESTABLISHED;
 
 		msn_slpcall_session_init(dc->slpcall);
@@ -598,11 +592,12 @@
 		break;
 
 	case DC_STATE_ESTABLISHED:
-
-		if (dc->header.length) {
-			part = msn_slpmsgpart_new_from_data(dc->in_buffer + 4, dc->header.length);
-			msn_slplink_process_msg(dc->slplink, part);
-			msn_slpmsgpart_unref(part);
+		if (packet_length) {
+			part = msn_slpmsgpart_new_from_data(dc->in_buffer + 4, packet_length);
+			if (part) {
+				msn_slplink_process_msg(dc->slplink, part);
+				msn_slpmsgpart_unref(part);
+			}
 		}
 
 		/*
@@ -674,15 +669,6 @@
 		if (dc->in_pos < 4 + packet_length)
 			return;
 
-		if (dc->state != DC_STATE_FOO) {
-			MsnP2PHeader *context;
-			
-			/* Skip packet size */
-			context = msn_p2p_header_from_wire(dc->in_buffer + 4);
-			memcpy(&dc->header, context, P2P_PACKET_HEADER_SIZE);
-			g_free(context);
-		}
-
 		switch (msn_dc_process_packet(dc, packet_length)) {
 		case DC_PROCESS_CLOSE:
 			return;
--- a/libpurple/protocols/msn/directconn.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/msn/directconn.h	Sat Feb 12 04:17:09 2011 +0900
@@ -103,8 +103,6 @@
 	GQueue  *out_queue; /**< The outgoing packet queue */
 	int     msg_pos;    /**< The position of next byte to be sent in the actual packet */
 
-	MsnP2PHeader    header; /**< SLP header for parsing / serializing */
-
 	/** The callback used for sending information to the peer about the opened socket */
 	void (*send_connection_info_msg_cb)(MsnDirectConn *);
 
--- a/libpurple/protocols/msn/error.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/msn/error.c	Sat Feb 12 04:17:09 2011 +0900
@@ -31,7 +31,7 @@
 
 typedef struct
 {
-	PurpleConnection *gc;
+	MsnSession *session;
 	char *who;
 	char *group;
 	gboolean add;
@@ -293,9 +293,9 @@
 		group = purple_find_group(data->group);
 
 	if (group != NULL)
-		buddy = purple_find_buddy_in_group(purple_connection_get_account(data->gc), data->who, group);
+		buddy = purple_find_buddy_in_group(data->session->account, data->who, group);
 	else
-		buddy = purple_find_buddy(purple_connection_get_account(data->gc), data->who);
+		buddy = purple_find_buddy(data->session->account, data->who);
 
 	if (buddy != NULL)
 		purple_blist_remove_buddy(buddy);
@@ -309,14 +309,9 @@
 	/* this *should* be necessary !! */
 	msn_complete_sync_issue(data);
 #endif
+	MsnUserList *userlist = data->session->userlist;
 
-	if (g_list_find(purple_connections_get_all(), data->gc) != NULL)
-	{
-		MsnSession *session = data->gc->proto_data;
-		MsnUserList *userlist = session->userlist;
-
-		msn_userlist_add_buddy(userlist, data->who, data->group);
-	}
+	msn_userlist_add_buddy(userlist, data->who, data->group);
 
 	g_free(data->group);
 	g_free(data->who);
@@ -326,18 +321,14 @@
 static void
 msn_rem_cb(MsnAddRemData *data)
 {
+	MsnUserList *userlist = data->session->userlist;
 	msn_complete_sync_issue(data);
 
-	if (g_list_find(purple_connections_get_all(), data->gc) != NULL)
-	{
-		MsnSession *session = data->gc->proto_data;
-		MsnUserList *userlist = session->userlist;
 
-		if (data->group == NULL) {
-			msn_userlist_rem_buddy_from_list(userlist, data->who, MSN_LIST_FL);
-		} else {
-			g_free(data->group);
-		}
+	if (data->group == NULL) {
+		msn_userlist_rem_buddy_from_list(userlist, data->who, MSN_LIST_FL);
+	} else {
+		g_free(data->group);
 	}
 
 	g_free(data->who);
@@ -356,17 +347,17 @@
 	account = session->account;
 	gc = purple_account_get_connection(account);
 
-	data        = g_new0(MsnAddRemData, 1);
-	data->who   = g_strdup(passport);
-	data->group = g_strdup(group_name);
-	data->gc    = gc;
+	data          = g_new0(MsnAddRemData, 1);
+	data->who     = g_strdup(passport);
+	data->group   = g_strdup(group_name);
+	data->session = session;
 
 	msg = g_strdup_printf(_("Buddy list synchronization issue in %s (%s)"),
 						  purple_account_get_username(account),
 						  purple_account_get_protocol_name(account));
 
 	if (group_name != NULL)
-	{ 
+	{
 		reason = g_strdup_printf(_("%s on the local list is "
 								   "inside the group \"%s\" but not on "
 								   "the server list. "
@@ -374,7 +365,7 @@
 								 passport, group_name);
 	}
 	else
-	{ 
+	{
 		reason = g_strdup_printf(_("%s is on the local list but "
 								   "not on the server list. "
 								   "Do you want this buddy to be added?"),
@@ -382,7 +373,7 @@
 	}
 
 	purple_request_action(gc, NULL, msg, reason, PURPLE_DEFAULT_ACTION_NONE,
-						purple_connection_get_account(gc), data->who, NULL,
+						account, data->who, NULL,
 						data, 2,
 						_("Yes"), G_CALLBACK(msn_add_cb),
 						_("No"), G_CALLBACK(msn_rem_cb));
@@ -390,3 +381,4 @@
 	g_free(reason);
 	g_free(msg);
 }
+
--- a/libpurple/protocols/msn/msg.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/msn/msg.c	Sat Feb 12 04:17:09 2011 +0900
@@ -350,7 +350,7 @@
 	{
 		size_t siz;
 		char *body;
-		
+
 		body = msn_slpmsgpart_serialize(msg->part, &siz);
 
 		memcpy(n, body, siz);
@@ -616,15 +616,7 @@
 
 	if (msg->msnslp_message)
 	{
-		g_string_append_printf(str, "Session ID: %u\r\n", msg->part->header->session_id);
-		g_string_append_printf(str, "ID:         %u\r\n", msg->part->header->id);
-		g_string_append_printf(str, "Offset:     %" G_GUINT64_FORMAT "\r\n", msg->part->header->offset);
-		g_string_append_printf(str, "Total size: %" G_GUINT64_FORMAT "\r\n", msg->part->header->total_size);
-		g_string_append_printf(str, "Length:     %u\r\n", msg->part->header->length);
-		g_string_append_printf(str, "Flags:      0x%x\r\n", msg->part->header->flags);
-		g_string_append_printf(str, "ACK ID:     %u\r\n", msg->part->header->ack_id);
-		g_string_append_printf(str, "SUB ID:     %u\r\n", msg->part->header->ack_sub_id);
-		g_string_append_printf(str, "ACK Size:   %" G_GUINT64_FORMAT "\r\n", msg->part->header->ack_size);
+		msn_slpmsgpart_to_string(msg->part, str);
 
 		if (purple_debug_is_verbose() && body != NULL)
 		{
@@ -641,27 +633,17 @@
 			else
 			{
 				int i;
-				int bin_len;
-				
-				if (msg->part->footer->value == P2P_APPID_SESSION)
-					bin_len = P2P_PACKET_HEADER_SIZE;
-				else
-					bin_len = body_len;
 
-				for (i = 0; i < bin_len; i++)
+				for (i = 0; i < body_len; i++)
 				{
 					g_string_append_printf(str, "%.2hhX ", body[i]);
 					if ((i % 16) == 15)
 						g_string_append(str, "\r\n");
 				}
 
-				if (bin_len == P2P_PACKET_HEADER_SIZE)
-					g_string_append_printf(str, "%s ", body + P2P_PACKET_HEADER_SIZE);
 				g_string_append(str, "\r\n");
 			}
 		}
-
-		g_string_append_printf(str, "Footer:     0x%08X\r\n", msg->part->footer->value);
 	}
 	else
 	{
@@ -836,7 +818,7 @@
 		chat = FALSE;
 
 	if (swboard->conv == NULL) {
-		if (chat) 
+		if (chat)
 			swboard->conv = purple_find_chat(account->gc, swboard->chat_id);
 		else {
 			swboard->conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM,
@@ -859,7 +841,7 @@
 }
 
 /* TODO: Make these not be such duplicates of each other */
-static void 
+static void
 got_wink_cb(MsnSlpCall *slpcall, const guchar *data, gsize size)
 {
 	FILE *f = NULL;
@@ -885,7 +867,7 @@
 	g_free(path);
 }
 
-static void 
+static void
 got_voiceclip_cb(MsnSlpCall *slpcall, const guchar *data, gsize size)
 {
 	FILE *f = NULL;
@@ -1147,7 +1129,7 @@
 				"Unable to parse invite msg body.\n");
 		return;
 	}
-	
+
 	/*
 	 * GUID is NOT always present but Invitation-Command and Invitation-Cookie
 	 * are mandatory.
@@ -1164,7 +1146,7 @@
 
 	} else if (!strcmp(command, "INVITE")) {
 		const gchar	*guid = g_hash_table_lookup(body, "Application-GUID");
-	
+
 		if (guid == NULL) {
 			purple_debug_warning("msn",
 			                     "Invite msg missing Application-GUID.\n");
@@ -1203,7 +1185,7 @@
 			purple_debug_warning("msn", "Unhandled invite msg with GUID %s: %s.\n",
 			                     guid, application ? application : "(null)");
 		}
-		
+
 		if (!accepted) {
 			MsnSwitchBoard *swboard = cmdproc->data;
 			char *text;
--- a/libpurple/protocols/msn/msg.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/msn/msg.h	Sat Feb 12 04:17:09 2011 +0900
@@ -79,7 +79,6 @@
 	MsnMsgType type;
 
 	gboolean msnslp_message;
-	MsnSlpMessage *slpmsg;
 	MsnSlpMessagePart *part;
 
 	char *remote_user;
@@ -99,7 +98,6 @@
 								  been ref'ed for using it in a callback. */
 
 	MsnCommand *cmd;
-	MsnTransaction *trans;
 
 	MsnMsgCb ack_cb; /**< The callback to call when we receive an ACK of this
 					   message. */
@@ -107,8 +105,6 @@
 					   message. */
 	void *ack_data; /**< The data used by callbacks. */
 
-	MsnMsgErrorType error; /**< The error of the message. */
-
 	guint32 retries;
 };
 
--- a/libpurple/protocols/msn/msn.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/msn/msn.c	Sat Feb 12 04:17:09 2011 +0900
@@ -200,7 +200,7 @@
 {
 	const char *type, *friendlyname;
 	struct public_alias_closure *closure;
-	
+
 	g_return_if_fail(cmd->param_count >= 3);
 	type = cmd->params[1];
 	g_return_if_fail(!strcmp(type, "MFN"));
@@ -764,7 +764,7 @@
 		char *blocked_text;
 		blocked_text = g_strdup_printf(_("MSN servers are currently blocking the following regular expressions:<br/>%s"),
 		                               session->blocked_text);
-		
+
 		purple_notify_formatted(pc, title, title, NULL, blocked_text, NULL, NULL);
 		g_free(blocked_text);
 	}
@@ -787,7 +787,7 @@
 		return;
 	}
 
-	/** apparently the correct value is 777, use 750 as a failsafe */ 
+	/** apparently the correct value is 777, use 750 as a failsafe */
 	if ((session->passport_info.mail_url == NULL)
 		|| (time (NULL) - session->passport_info.mail_timestamp >= 750)) {
 		MsnTransaction *trans;
@@ -1618,7 +1618,7 @@
 		swboard != NULL) {
 		/*User online or have a swboard open because it's invisible
 		 * and sent us a message,then send Online Instant Message*/
- 
+
 		if (msglen + strlen(msgformat) + strlen(VERSION) > 1564)
 		{
 			g_free(msgformat);
@@ -1882,7 +1882,7 @@
 {
 	/* Remove from local list */
 	purple_blist_remove_buddy(data->buddy);
-	
+
 	g_free(data);
 }
 
--- a/libpurple/protocols/msn/notification.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/msn/notification.c	Sat Feb 12 04:17:09 2011 +0900
@@ -2216,7 +2216,7 @@
 }
 
 /**************************************************************************
- * Dispatch server list management 
+ * Dispatch server list management
  **************************************************************************/
 typedef struct MsnAddRemoveListData {
 	MsnCmdProc *cmdproc;
--- a/libpurple/protocols/msn/oim.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/msn/oim.c	Sat Feb 12 04:17:09 2011 +0900
@@ -418,8 +418,8 @@
 						str_reason = _("Message was not sent because an unknown "
 						               "error occurred.");
 					}
-					
-					msn_session_report_user(oim->session, msg->to_member, 
+
+					msn_session_report_user(oim->session, msg->to_member,
 						str_reason, PURPLE_MESSAGE_ERROR);
 					msn_session_report_user(oim->session, msg->to_member,
 						msg->oim_msg, PURPLE_MESSAGE_RAW);
--- a/libpurple/protocols/msn/p2p.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/msn/p2p.c	Sat Feb 12 04:17:09 2011 +0900
@@ -27,12 +27,32 @@
 #include "p2p.h"
 #include "msnutils.h"
 
-MsnP2PHeader *
-msn_p2p_header_from_wire(const char *wire)
+MsnP2PInfo *
+msn_p2p_info_new(void)
+{
+	return g_new0(MsnP2PInfo, 1);
+}
+
+MsnP2PInfo *
+msn_p2p_info_dup(MsnP2PInfo *info)
+{
+	MsnP2PInfo *new_info = g_new0(MsnP2PInfo, 1);
+	*new_info = *info;
+	return new_info;
+}
+
+void
+msn_p2p_info_free(MsnP2PInfo *info)
+{
+	g_free(info);
+}
+
+size_t
+msn_p2p_header_from_wire(MsnP2PInfo *info, const char *wire)
 {
 	MsnP2PHeader *header;
 
-	header = g_new(MsnP2PHeader, 1);
+	header = &info->header;
 
 	header->session_id = msn_pop32le(wire);
 	header->id         = msn_pop32le(wire);
@@ -44,15 +64,17 @@
 	header->ack_sub_id = msn_pop32le(wire);
 	header->ack_size   = msn_pop64le(wire);
 
-	return header;
+	return P2P_PACKET_HEADER_SIZE;
 }
 
 char *
-msn_p2p_header_to_wire(MsnP2PHeader *header)
+msn_p2p_header_to_wire(MsnP2PInfo *info, size_t *len)
 {
+	MsnP2PHeader *header;
 	char *wire;
 	char *tmp;
-	
+
+	header = &info->header;
 	tmp = wire = g_new(char, P2P_PACKET_HEADER_SIZE);
 
 	msn_push32le(tmp, header->session_id);
@@ -65,35 +87,58 @@
 	msn_push32le(tmp, header->ack_sub_id);
 	msn_push64le(tmp, header->ack_size);
 
+	if (len)
+		*len = P2P_PACKET_HEADER_SIZE;
+
 	return wire;
 
 }
 
-MsnP2PFooter *
-msn_p2p_footer_from_wire(const char *wire)
+size_t
+msn_p2p_footer_from_wire(MsnP2PInfo *info, const char *wire)
 {
 	MsnP2PFooter *footer;
 
-	footer = g_new(MsnP2PFooter, 1);
+	footer = &info->footer;
 
 	footer->value = msn_pop32be(wire);
 
-	return footer;
+	return P2P_PACKET_FOOTER_SIZE;
 }
 
 char *
-msn_p2p_footer_to_wire(MsnP2PFooter *footer)
+msn_p2p_footer_to_wire(MsnP2PInfo *info, size_t *len)
 {
+	MsnP2PFooter *footer;
 	char *wire;
 	char *tmp;
 
+	footer = &info->footer;
 	tmp = wire = g_new(char, P2P_PACKET_FOOTER_SIZE);
 
 	msn_push32be(tmp, footer->value);
 
+	if (len)
+		*len = P2P_PACKET_FOOTER_SIZE;
+
 	return wire;
 }
 
+void
+msn_p2p_info_to_string(MsnP2PInfo *info, GString *str)
+{
+	g_string_append_printf(str, "Session ID: %u\r\n", info->header.session_id);
+	g_string_append_printf(str, "ID:         %u\r\n", info->header.id);
+	g_string_append_printf(str, "Offset:     %" G_GUINT64_FORMAT "\r\n", info->header.offset);
+	g_string_append_printf(str, "Total size: %" G_GUINT64_FORMAT "\r\n", info->header.total_size);
+	g_string_append_printf(str, "Length:     %u\r\n", info->header.length);
+	g_string_append_printf(str, "Flags:      0x%x\r\n", info->header.flags);
+	g_string_append_printf(str, "ACK ID:     %u\r\n", info->header.ack_id);
+	g_string_append_printf(str, "SUB ID:     %u\r\n", info->header.ack_sub_id);
+	g_string_append_printf(str, "ACK Size:   %" G_GUINT64_FORMAT "\r\n", info->header.ack_size);
+	g_string_append_printf(str, "Footer:     0x%08X\r\n", info->footer.value);
+}
+
 gboolean
 msn_p2p_msg_is_data(const MsnP2PHeaderFlag flags)
 {
@@ -102,3 +147,135 @@
 	        flags == P2P_FILE_DATA);
 }
 
+gboolean
+msn_p2p_info_is_valid(MsnP2PInfo *info)
+{
+	return info->header.total_size >= info->header.length;
+}
+
+gboolean
+msn_p2p_info_is_final(MsnP2PInfo *info)
+{
+	return info->header.offset + info->header.length >= info->header.total_size;
+}
+
+guint32
+msn_p2p_info_get_session_id(MsnP2PInfo *info)
+{
+	return info->header.session_id;
+}
+
+guint32
+msn_p2p_info_get_id(MsnP2PInfo *info)
+{
+	return info->header.id;
+}
+
+guint64
+msn_p2p_info_get_offset(MsnP2PInfo *info)
+{
+	return info->header.offset;
+}
+
+guint64
+msn_p2p_info_get_total_size(MsnP2PInfo *info)
+{
+	return info->header.total_size;
+}
+
+guint32
+msn_p2p_info_get_length(MsnP2PInfo *info)
+{
+	return info->header.length;
+}
+
+guint32
+msn_p2p_info_get_flags(MsnP2PInfo *info)
+{
+	return info->header.flags;
+}
+
+guint32
+msn_p2p_info_get_ack_id(MsnP2PInfo *info)
+{
+	return info->header.ack_id;
+}
+
+guint32
+msn_p2p_info_get_ack_sub_id(MsnP2PInfo *info)
+{
+	return info->header.ack_sub_id;
+}
+
+guint64
+msn_p2p_info_get_ack_size(MsnP2PInfo *info)
+{
+	return info->header.ack_size;
+}
+
+guint32
+msn_p2p_info_get_app_id(MsnP2PInfo *info)
+{
+	return info->footer.value;
+}
+
+void
+msn_p2p_info_set_session_id(MsnP2PInfo *info, guint32 session_id)
+{
+	info->header.session_id = session_id;
+}
+
+void
+msn_p2p_info_set_id(MsnP2PInfo *info, guint32 id)
+{
+	info->header.id = id;
+}
+
+void
+msn_p2p_info_set_offset(MsnP2PInfo *info, guint64 offset)
+{
+	info->header.offset = offset;
+}
+
+void
+msn_p2p_info_set_total_size(MsnP2PInfo *info, guint64 total_size)
+{
+	info->header.total_size = total_size;
+}
+
+void
+msn_p2p_info_set_length(MsnP2PInfo *info, guint32 length)
+{
+	info->header.length = length;
+}
+
+void
+msn_p2p_info_set_flags(MsnP2PInfo *info, guint32 flags)
+{
+	info->header.flags = flags;
+}
+
+void
+msn_p2p_info_set_ack_id(MsnP2PInfo *info, guint32 ack_id)
+{
+	info->header.ack_id = ack_id;
+}
+
+void
+msn_p2p_info_set_ack_sub_id(MsnP2PInfo *info, guint32 ack_sub_id)
+{
+	info->header.ack_sub_id = ack_sub_id;
+}
+
+void
+msn_p2p_info_set_ack_size(MsnP2PInfo *info, guint64 ack_size)
+{
+	info->header.ack_size = ack_size;
+}
+
+void
+msn_p2p_info_set_app_id(MsnP2PInfo *info, guint32 app_id)
+{
+	info->footer.value = app_id;
+}
+
--- a/libpurple/protocols/msn/p2p.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/msn/p2p.h	Sat Feb 12 04:17:09 2011 +0900
@@ -45,9 +45,6 @@
 } MsnP2PHeader;
 #define P2P_PACKET_HEADER_SIZE (6 * 4 + 3 * 8)
 
-/* Used for DCs to store nonces */
-#define P2P_HEADER_ACK_ID_OFFSET (2*4 + 2*8 + 2*4)
-
 typedef struct {
 	guint8  header_len;
 	guint8  opcode;
@@ -61,6 +58,11 @@
 } MsnP2PFooter;
 #define P2P_PACKET_FOOTER_SIZE (1 * 4)
 
+typedef struct {
+	MsnP2PHeader header;
+	MsnP2PFooter footer;
+} MsnP2PInfo;
+
 typedef enum
 {
 	P2P_NO_FLAG         = 0x0,        /**< No flags specified */
@@ -91,19 +93,98 @@
 	P2P_APPID_DISPLAY   = 0xC         /**< Display Image */
 } MsnP2PAppId;
 
-MsnP2PHeader *
-msn_p2p_header_from_wire(const char *wire);
+MsnP2PInfo *
+msn_p2p_info_new(void);
+
+MsnP2PInfo *
+msn_p2p_info_dup(MsnP2PInfo *info);
+
+void
+msn_p2p_info_free(MsnP2PInfo *info);
+
+size_t
+msn_p2p_header_from_wire(MsnP2PInfo *info, const char *wire);
 
 char *
-msn_p2p_header_to_wire(MsnP2PHeader *header);
+msn_p2p_header_to_wire(MsnP2PInfo *info, size_t *len);
 
-MsnP2PFooter *
-msn_p2p_footer_from_wire(const char *wire);
+size_t
+msn_p2p_footer_from_wire(MsnP2PInfo *info, const char *wire);
 
 char *
-msn_p2p_footer_to_wire(MsnP2PFooter *footer);
+msn_p2p_footer_to_wire(MsnP2PInfo *info, size_t *len);
+
+void
+msn_p2p_info_to_string(MsnP2PInfo *info, GString *str);
 
 gboolean
 msn_p2p_msg_is_data(const MsnP2PHeaderFlag flags);
 
+gboolean
+msn_p2p_info_is_valid(MsnP2PInfo *info);
+
+gboolean
+msn_p2p_info_is_final(MsnP2PInfo *info);
+
+guint32
+msn_p2p_info_get_session_id(MsnP2PInfo *info);
+
+guint32
+msn_p2p_info_get_id(MsnP2PInfo *info);
+
+guint64
+msn_p2p_info_get_offset(MsnP2PInfo *info);
+
+guint64
+msn_p2p_info_get_total_size(MsnP2PInfo *info);
+
+guint32
+msn_p2p_info_get_length(MsnP2PInfo *info);
+
+guint32
+msn_p2p_info_get_flags(MsnP2PInfo *info);
+
+guint32
+msn_p2p_info_get_ack_id(MsnP2PInfo *info);
+
+guint32
+msn_p2p_info_get_ack_sub_id(MsnP2PInfo *info);
+
+guint64
+msn_p2p_info_get_ack_size(MsnP2PInfo *info);
+
+guint32
+msn_p2p_info_get_app_id(MsnP2PInfo *info);
+
+void
+msn_p2p_info_set_session_id(MsnP2PInfo *info, guint32 session_id);
+
+void
+msn_p2p_info_set_id(MsnP2PInfo *info, guint32 id);
+
+void
+msn_p2p_info_set_offset(MsnP2PInfo *info, guint64 offset);
+
+void
+msn_p2p_info_set_total_size(MsnP2PInfo *info, guint64 total_size);
+
+void
+msn_p2p_info_set_length(MsnP2PInfo *info, guint32 length);
+
+void
+msn_p2p_info_set_flags(MsnP2PInfo *info, guint32 flags);
+
+void
+msn_p2p_info_set_ack_id(MsnP2PInfo *info, guint32 ack_id);
+
+void
+msn_p2p_info_set_ack_sub_id(MsnP2PInfo *info, guint32 ack_sub_id);
+
+void
+msn_p2p_info_set_ack_size(MsnP2PInfo *info, guint64 ack_size);
+
+void
+msn_p2p_info_set_app_id(MsnP2PInfo *info, guint32 app_id);
+
 #endif /* MSN_P2P_H */
+
--- a/libpurple/protocols/msn/sbconn.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/msn/sbconn.c	Sat Feb 12 04:17:09 2011 +0900
@@ -126,8 +126,6 @@
 	trans->payload = payload;
 	trans->payload_len = payload_len;
 
-	msg->trans = trans;
-
 	msn_cmdproc_send_trans(cmdproc, trans);
 }
 
--- a/libpurple/protocols/msn/slp.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/msn/slp.c	Sat Feb 12 04:17:09 2011 +0900
@@ -293,7 +293,7 @@
 gen_context(PurpleXfer *xfer, const char *file_name, const char *file_path)
 {
 	gsize size = 0;
-	MsnFileContext header;
+	MsnFileContext context;
 	gchar *u8 = NULL;
 	gchar *ret;
 	gunichar2 *uni = NULL;
@@ -323,28 +323,28 @@
 
 	preview = purple_xfer_get_thumbnail(xfer, &preview_len);
 
-	header.length = MSN_FILE_CONTEXT_SIZE;
-	header.version = 2; /* V.3 contains additional unnecessary data */
-	header.file_size = size;
+	context.length = MSN_FILE_CONTEXT_SIZE;
+	context.version = 2; /* V.3 contains additional unnecessary data */
+	context.file_size = size;
 	if (preview)
-		header.type = 0;
+		context.type = 0;
 	else
-		header.type = 1;
+		context.type = 1;
 
 	len = MIN(len, MAX_FILE_NAME_LEN);
 	for (currentChar = 0; currentChar < len; currentChar++) {
-		header.file_name[currentChar] = GUINT16_TO_LE(uni[currentChar]);
+		context.file_name[currentChar] = GUINT16_TO_LE(uni[currentChar]);
 	}
-	memset(&header.file_name[currentChar], 0x00, (MAX_FILE_NAME_LEN - currentChar) * 2);
+	memset(&context.file_name[currentChar], 0x00, (MAX_FILE_NAME_LEN - currentChar) * 2);
 
-	memset(&header.unknown1, 0, sizeof(header.unknown1));
-	header.unknown2 = 0xffffffff;
+	memset(&context.unknown1, 0, sizeof(context.unknown1));
+	context.unknown2 = 0xffffffff;
 
 	/* Mind the cast, as in, don't free it after! */
-	header.preview = (char *)preview;
-	header.preview_len = preview_len;
+	context.preview = (char *)preview;
+	context.preview_len = preview_len;
 
-	u8 = msn_file_context_to_wire(&header);
+	u8 = msn_file_context_to_wire(&context);
 	ret = purple_base64_encode((const guchar *)u8, MSN_FILE_CONTEXT_SIZE + preview_len);
 
 	g_free(uni);
--- a/libpurple/protocols/msn/slpcall.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/msn/slpcall.c	Sat Feb 12 04:17:09 2011 +0900
@@ -511,7 +511,7 @@
 		/* File Transfer */
 		PurpleAccount *account;
 		PurpleXfer *xfer;
-		MsnFileContext *header;
+		MsnFileContext *file_context;
 		char *buf;
 		gsize bin_len;
 		guint32 file_size;
@@ -528,12 +528,12 @@
 							 slpcall->slplink->remote_user);
 
 		buf = (char *)purple_base64_decode(context, &bin_len);
-		header = msn_file_context_from_wire(buf, bin_len);
+		file_context = msn_file_context_from_wire(buf, bin_len);
 
-		if (header != NULL) {
-			file_size = header->file_size;
+		if (file_context != NULL) {
+			file_size = file_context->file_size;
 
-			file_name = g_convert((const gchar *)&header->file_name,
+			file_name = g_convert((const gchar *)&file_context->file_name,
 			                      MAX_FILE_NAME_LEN * 2,
 			                      "UTF-8", "UTF-16LE",
 			                      NULL, NULL, NULL);
@@ -554,16 +554,16 @@
 
 			xfer->data = slpcall;
 
-			if (header->preview) {
-				purple_xfer_set_thumbnail(xfer, header->preview,
-				                          header->preview_len,
+			if (file_context->preview) {
+				purple_xfer_set_thumbnail(xfer, file_context->preview,
+				                          file_context->preview_len,
 				    					  "image/png");
-				g_free(header->preview);
+				g_free(file_context->preview);
 			}
 
 			purple_xfer_request(xfer);
 		}
-		g_free(header);
+		g_free(file_context);
 		g_free(buf);
 
 		accepted = TRUE;
@@ -1059,16 +1059,21 @@
 	MsnSlpCall *slpcall;
 	const guchar *body;
 	gsize body_len;
+	guint32 session_id;
+	guint32 flags;
 
 	slpcall = NULL;
 	body = slpmsg->buffer;
-	body_len = slpmsg->header->offset;
+	body_len = msn_p2p_info_get_offset(slpmsg->p2p_info);
 
-	if (slpmsg->header->flags == P2P_NO_FLAG || slpmsg->header->flags == P2P_WLM2009_COMP)
+	session_id = msn_p2p_info_get_session_id(slpmsg->p2p_info);
+	flags = msn_p2p_info_get_flags(slpmsg->p2p_info);
+
+	if (flags == P2P_NO_FLAG || flags == P2P_WLM2009_COMP)
 	{
 		char *body_str;
 
-		if (slpmsg->header->session_id == 64)
+		if (session_id == 64)
 		{
 			/* This is for handwritten messages (Ink) */
 			GError *error = NULL;
@@ -1125,9 +1130,9 @@
 		}
 		g_free(body_str);
 	}
-	 else if (msn_p2p_msg_is_data(slpmsg->header->flags))
+	 else if (msn_p2p_msg_is_data(flags))
 	{
-		slpcall = msn_slplink_find_slp_call_with_session_id(slplink, slpmsg->header->session_id);
+		slpcall = msn_slplink_find_slp_call_with_session_id(slplink, session_id);
 
 		if (slpcall != NULL)
 		{
@@ -1142,22 +1147,13 @@
 			slpcall->wasted = TRUE;
 		}
 	}
-#if 0
-	else if (slpmsg->header->flags == 0x100)
-	{
-		slpcall = slplink->directconn->initial_call;
-
-		if (slpcall != NULL)
-			msn_slpcall_session_init(slpcall);
-	}
-#endif
-	else if (slpmsg->header->flags == P2P_ACK)
+	else if (flags == P2P_ACK)
 	{
 		/* Acknowledgement of previous message. Don't do anything currently. */
 	}
 	else
 		purple_debug_warning("msn", "Unprocessed SLP message with flags 0x%04x\n",
-		                     slpmsg->header->flags);
+		                     flags);
 
 	return slpcall;
 }
--- a/libpurple/protocols/msn/slplink.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/msn/slplink.c	Sat Feb 12 04:17:09 2011 +0900
@@ -281,17 +281,21 @@
 msn_slplink_send_msgpart(MsnSlpLink *slplink, MsnSlpMessage *slpmsg)
 {
 	MsnSlpMessagePart *part;
+	MsnP2PInfo *info;
 	long long real_size;
 	size_t len = 0;
+	guint64 offset;
 
 	/* Maybe we will want to create a new msg for this slpmsg instead of
 	 * reusing the same one all the time. */
-	part = msn_slpmsgpart_new(slpmsg->header, slpmsg->footer);
+	info = slpmsg->p2p_info;
+	part = msn_slpmsgpart_new(info);
 	part->ack_data = slpmsg;
 
-	real_size = (slpmsg->header->flags == P2P_ACK) ? 0 : slpmsg->size;
+	real_size = (msn_p2p_info_get_flags(info) == P2P_ACK) ? 0 : slpmsg->size;
 
-	if (slpmsg->header->offset < real_size)
+	offset = msn_p2p_info_get_offset(info);
+	if (offset < real_size)
 	{
 		if (slpmsg->slpcall && slpmsg->slpcall->xfer && purple_xfer_get_type(slpmsg->slpcall->xfer) == PURPLE_XFER_SEND &&
 				purple_xfer_get_status(slpmsg->slpcall->xfer) == PURPLE_XFER_STATUS_STARTED)
@@ -301,15 +305,15 @@
 		}
 		else
 		{
-			len = slpmsg->size - slpmsg->header->offset;
+			len = slpmsg->size - offset;
 
 			if (len > MSN_SBCONN_MAX_SIZE)
 				len = MSN_SBCONN_MAX_SIZE;
 
-			msn_slpmsgpart_set_bin_data(part, slpmsg->buffer + slpmsg->header->offset, len);
+			msn_slpmsgpart_set_bin_data(part, slpmsg->buffer + offset, len);
 		}
 
-		slpmsg->header->length = len;
+		msn_p2p_info_set_length(slpmsg->p2p_info, len);
 	}
 
 #if 0
@@ -326,7 +330,7 @@
 	msn_slplink_send_part(slplink, part);
 
 
-	if (msn_p2p_msg_is_data(slpmsg->header->flags) &&
+	if (msn_p2p_msg_is_data(msn_p2p_info_get_flags(info)) &&
 		(slpmsg->slpcall != NULL))
 	{
 		slpmsg->slpcall->progress = TRUE;
@@ -334,7 +338,7 @@
 		if (slpmsg->slpcall->progress_cb != NULL)
 		{
 			slpmsg->slpcall->progress_cb(slpmsg->slpcall, slpmsg->size,
-										 len, slpmsg->header->offset);
+										 len, offset);
 		}
 	}
 
@@ -344,27 +348,30 @@
 static void
 msn_slplink_release_slpmsg(MsnSlpLink *slplink, MsnSlpMessage *slpmsg)
 {
-	slpmsg = slpmsg;
-	slpmsg->footer = g_new0(MsnP2PFooter, 1);
+	MsnP2PInfo *info;
+	guint32 flags;
+
+	info = slpmsg->p2p_info;
 
-	if (slpmsg->header->flags == P2P_NO_FLAG)
+	flags = msn_p2p_info_get_flags(info);
+	if (flags == P2P_NO_FLAG)
 	{
-		slpmsg->header->ack_id = rand() % 0xFFFFFF00;
+		msn_p2p_info_set_ack_id(info, rand() % 0xFFFFFF00);
 	}
-	else if (msn_p2p_msg_is_data(slpmsg->header->flags))
+	else if (msn_p2p_msg_is_data(flags))
 	{
 		MsnSlpCall *slpcall;
 		slpcall = slpmsg->slpcall;
 
 		g_return_if_fail(slpcall != NULL);
-		slpmsg->header->session_id = slpcall->session_id;
-		slpmsg->footer->value = slpcall->app_id;
-		slpmsg->header->ack_id = rand() % 0xFFFFFF00;
+		msn_p2p_info_set_session_id(info, slpcall->session_id);
+		msn_p2p_info_set_app_id(info, slpcall->app_id);
+		msn_p2p_info_set_ack_id(info, rand() % 0xFFFFFF00);
 	}
 
-	slpmsg->header->id = slpmsg->id;
+	msn_p2p_info_set_id(info, slpmsg->id);
 
-	slpmsg->header->total_size = slpmsg->size;
+	msn_p2p_info_set_total_size(info, slpmsg->size);
 
 	msn_slplink_send_msgpart(slplink, slpmsg);
 }
@@ -400,20 +407,20 @@
 }
 
 static MsnSlpMessage *
-msn_slplink_create_ack(MsnSlpLink *slplink, MsnP2PHeader *header)
+msn_slplink_create_ack(MsnSlpLink *slplink, MsnP2PInfo *info)
 {
 	MsnSlpMessage *slpmsg;
 
-	slpmsg = msn_slpmsg_ack_new(header);
+	slpmsg = msn_slpmsg_ack_new(info);
 	msn_slpmsg_set_slplink(slpmsg, slplink);
 
 	return slpmsg;
 }
 
 static void
-msn_slplink_send_ack(MsnSlpLink *slplink, MsnP2PHeader *header)
+msn_slplink_send_ack(MsnSlpLink *slplink, MsnP2PInfo *info)
 {
-	MsnSlpMessage *slpmsg = msn_slplink_create_ack(slplink, header);
+	MsnSlpMessage *slpmsg = msn_slplink_create_ack(slplink, info);
 
 	msn_slplink_send_slpmsg(slplink, slpmsg);
 	msn_slpmsg_destroy(slpmsg);
@@ -428,7 +435,7 @@
 	{
 		MsnSlpMessage *slpmsg = e->data;
 
-		if ((slpmsg->header->session_id == session_id) && (slpmsg->id == id))
+		if ((msn_p2p_info_get_session_id(slpmsg->p2p_info) == session_id) && (slpmsg->id == id))
 			return slpmsg;
 	}
 
@@ -436,22 +443,26 @@
 }
 
 static MsnSlpMessage *
-init_first_msg(MsnSlpLink *slplink, MsnP2PHeader *header)
+init_first_msg(MsnSlpLink *slplink, MsnP2PInfo *info)
 {
 	MsnSlpMessage *slpmsg;
+	guint32 session_id;
+	guint32 flags;
 
 	slpmsg = msn_slpmsg_new(slplink);
-	slpmsg->id = header->id;
-	slpmsg->header->session_id = header->session_id;
-	slpmsg->size = header->total_size;
-	slpmsg->header->flags = header->flags;
+	slpmsg->id = msn_p2p_info_get_id(info);
+	session_id = msn_p2p_info_get_session_id(info);
+	msn_p2p_info_set_session_id(slpmsg->p2p_info, session_id);
+	slpmsg->size = msn_p2p_info_get_total_size(info);
+	flags = msn_p2p_info_get_flags(info);
+	msn_p2p_info_set_flags(slpmsg->p2p_info, flags);
 
-	if (slpmsg->header->session_id)
+	if (session_id)
 	{
-		slpmsg->slpcall = msn_slplink_find_slp_call_with_session_id(slplink, slpmsg->header->session_id);
+		slpmsg->slpcall = msn_slplink_find_slp_call_with_session_id(slplink, session_id);
 		if (slpmsg->slpcall != NULL)
 		{
-			if (msn_p2p_msg_is_data(header->flags))
+			if (msn_p2p_msg_is_data(flags))
 			{
 				PurpleXfer *xfer = slpmsg->slpcall->xfer;
 				if (xfer != NULL)
@@ -488,9 +499,10 @@
 }
 
 static void
-process_complete_msg(MsnSlpLink *slplink, MsnSlpMessage *slpmsg, MsnP2PHeader *header)
+process_complete_msg(MsnSlpLink *slplink, MsnSlpMessage *slpmsg, MsnP2PInfo *info)
 {
 	MsnSlpCall *slpcall;
+	guint32 flags;
 
 	slpcall = msn_slp_process_msg(slplink, slpmsg);
 
@@ -501,18 +513,10 @@
 
 	purple_debug_info("msn", "msn_slplink_process_msg: slpmsg complete\n");
 
-	if (/* !slpcall->wasted && */ slpmsg->header->flags == P2P_DC_HANDSHAKE)
-	{
-#if 0
-		MsnDirectConn *directconn;
+	flags = msn_p2p_info_get_flags(slpmsg->p2p_info);
 
-		directconn = slplink->directconn;
-		if (!directconn->acked)
-			msn_directconn_send_handshake(directconn);
-#endif
-	}
-	else if (slpmsg->header->flags == P2P_NO_FLAG || slpmsg->header->flags == P2P_WLM2009_COMP ||
-			msn_p2p_msg_is_data(slpmsg->header->flags))
+	if (flags == P2P_NO_FLAG || flags == P2P_WLM2009_COMP ||
+	    msn_p2p_msg_is_data(flags))
 	{
 		/* Release all the messages and send the ACK */
 
@@ -525,11 +529,11 @@
 			 */
 			purple_debug_info("msn", "msn_slplink_process_msg: save ACK\n");
 
-			slpcall->slplink->dc->prev_ack = msn_slplink_create_ack(slplink, header);
+			slpcall->slplink->dc->prev_ack = msn_slplink_create_ack(slplink, info);
 		} else if (!slpcall->wasted) {
 			purple_debug_info("msn", "msn_slplink_process_msg: send ACK\n");
 
-			msn_slplink_send_ack(slplink, header);
+			msn_slplink_send_ack(slplink, info);
 			msn_slplink_send_queued_slpmsgs(slplink);
 		}
 	}
@@ -549,16 +553,17 @@
 		purple_xfer_prpl_ready(slpmsg->slpcall->xfer);
 	}
 	else if (slpmsg->size && slpmsg->buffer) {
-		if (G_MAXSIZE - part->size < part->header->offset
-				|| (part->header->offset + part->size) > slpmsg->size
-				|| slpmsg->header->offset != part->header->offset) {
+		guint64 offset = msn_p2p_info_get_offset(part->info);
+		if (G_MAXSIZE - part->size < offset
+				|| (offset + part->size) > slpmsg->size
+				|| msn_p2p_info_get_offset(slpmsg->p2p_info) != offset) {
 			purple_debug_error("msn",
 				"Oversized slpmsg - msgsize=%lld offset=%" G_GUINT64_FORMAT " len=%" G_GSIZE_FORMAT "\n",
-				slpmsg->size, part->header->offset, part->size);
+				slpmsg->size, offset, part->size);
 			g_return_if_reached();
 		} else {
-			memcpy(slpmsg->buffer + part->header->offset, part->buffer, part->size);
-			slpmsg->header->offset += part->size;
+			memcpy(slpmsg->buffer + offset, part->buffer, part->size);
+			msn_p2p_info_set_offset(slpmsg->p2p_info, offset + part->size);
 		}
 	}
 }
@@ -567,12 +572,12 @@
 msn_slplink_process_msg(MsnSlpLink *slplink, MsnSlpMessagePart *part)
 {
 	MsnSlpMessage *slpmsg;
-	MsnP2PHeader *header;
+	MsnP2PInfo *info;
 	guint64 offset;
 
-	header = part->header;
+	info = part->info;
 
-	if (header->total_size < header->length)
+	if (!msn_p2p_info_is_valid(info))
 	{
 		/* We seem to have received a bad header */
 		purple_debug_warning("msn", "Total size listed in SLP binary header "
@@ -581,12 +586,15 @@
 		return;
 	}
 
-	offset = header->offset;
+	offset = msn_p2p_info_get_offset(info);
 
 	if (offset == 0)
-		slpmsg = init_first_msg(slplink, header);
+		slpmsg = init_first_msg(slplink, info);
 	else {
-		slpmsg = msn_slplink_message_find(slplink, header->session_id, header->id);
+		guint32 session_id, id;
+		session_id = msn_p2p_info_get_session_id(info);
+		id = msn_p2p_info_get_id(info);
+		slpmsg = msn_slplink_message_find(slplink, session_id, id);
 		if (slpmsg == NULL)
 		{
 			/* Probably the transfer was cancelled */
@@ -597,8 +605,7 @@
 
 	slpmsg_add_part(slpmsg, part);
 
-
-	if (msn_p2p_msg_is_data(slpmsg->header->flags) &&
+	if (msn_p2p_msg_is_data(msn_p2p_info_get_flags(slpmsg->p2p_info)) &&
 		(slpmsg->slpcall != NULL))
 	{
 		slpmsg->slpcall->progress = TRUE;
@@ -616,8 +623,8 @@
 #endif
 
 	/* All the pieces of the slpmsg have been received */
-	if (header->offset + header->length >= header->total_size)
-		process_complete_msg(slplink, slpmsg, header);
+	if (msn_p2p_info_is_final(info))
+		process_complete_msg(slplink, slpmsg, info);
 
 	/* NOTE: The slpmsg will be destroyed in process_complete_msg or left in
 	   the slplink until fully received. Don't free it here!
--- a/libpurple/protocols/msn/slpmsg.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/msn/slpmsg.c	Sat Feb 12 04:17:09 2011 +0900
@@ -43,13 +43,12 @@
 	if (purple_debug_is_verbose())
 		purple_debug_info("msn", "slpmsg new (%p)\n", slpmsg);
 
-	if (slplink) 
+	if (slplink)
 		msn_slpmsg_set_slplink(slpmsg, slplink);
 	else
 		slpmsg->slplink = NULL;
 
-	slpmsg->header = g_new0(MsnP2PHeader, 1);
-	slpmsg->footer = NULL;
+	slpmsg->p2p_info = msn_p2p_info_new();
 
 	return slpmsg;
 }
@@ -90,8 +89,7 @@
 
 	slplink->slp_msgs = g_list_remove(slplink->slp_msgs, slpmsg);
 
-	g_free(slpmsg->header);
-	g_free(slpmsg->footer);
+	msn_p2p_info_free(slpmsg->p2p_info);
 
 	g_free(slpmsg);
 }
@@ -193,7 +191,6 @@
 	slpmsg = msn_slpmsg_new(slplink);
 	msn_slpmsg_set_body(slpmsg, body, body_len);
 
-	slpmsg->sip = TRUE;
 	slpmsg->slpcall = slpcall;
 
 	g_free(body);
@@ -201,18 +198,20 @@
 	return slpmsg;
 }
 
-MsnSlpMessage *msn_slpmsg_ack_new(MsnP2PHeader *header)
+MsnSlpMessage *msn_slpmsg_ack_new(MsnP2PInfo *ack_info)
 {
 	MsnSlpMessage *slpmsg;
+	MsnP2PInfo *new_info;
 
 	slpmsg = msn_slpmsg_new(NULL);
 
-	slpmsg->header->session_id = header->session_id;
-	slpmsg->size       = header->total_size;
-	slpmsg->header->flags      = P2P_ACK;
-	slpmsg->header->ack_id     = header->id;
-	slpmsg->header->ack_sub_id = header->ack_id;
-	slpmsg->header->ack_size   = header->total_size;
+	new_info = slpmsg->p2p_info;
+	msn_p2p_info_set_session_id(new_info, msn_p2p_info_get_session_id(ack_info));
+	slpmsg->size = msn_p2p_info_get_total_size(ack_info);
+	msn_p2p_info_set_flags(new_info, P2P_ACK);
+	msn_p2p_info_set_ack_id(new_info, msn_p2p_info_get_id(ack_info));
+	msn_p2p_info_set_ack_sub_id(new_info, msn_p2p_info_get_ack_id(ack_info));
+	msn_p2p_info_set_ack_size(new_info, msn_p2p_info_get_total_size(ack_info));
 	slpmsg->info = "SLP ACK";
 
 	return slpmsg;
@@ -224,7 +223,7 @@
 
 	slpmsg = msn_slpmsg_new(NULL);
 	slpmsg->slpcall = slpcall;
-	slpmsg->header->flags = P2P_MSN_OBJ_DATA;
+	msn_p2p_info_set_flags(slpmsg->p2p_info, P2P_MSN_OBJ_DATA);
 	slpmsg->info = "SLP DATA";
 
 	msn_slpmsg_set_image(slpmsg, img);
@@ -239,7 +238,7 @@
 	slpmsg = msn_slpmsg_new(NULL);
 
 	slpmsg->slpcall = slpcall;
-	slpmsg->header->session_id = slpcall->session_id;
+	msn_p2p_info_set_session_id(slpmsg->p2p_info, slpcall->session_id);
 	msn_slpmsg_set_body(slpmsg, NULL, 4);
 	slpmsg->info = "SLP DATA PREP";
 
@@ -254,7 +253,7 @@
 	slpmsg = msn_slpmsg_new(NULL);
 
 	slpmsg->slpcall = slpcall;
-	slpmsg->header->flags = P2P_FILE_DATA;
+	msn_p2p_info_set_flags(slpmsg->p2p_info, P2P_FILE_DATA);
 	slpmsg->info = "SLP FILE";
 	slpmsg->size = size;
 
@@ -267,27 +266,25 @@
 	char *footer;
 	char *base;
 	char *tmp;
-	size_t siz;
+	size_t header_size, footer_size;
 
-	base = g_malloc(P2P_PACKET_HEADER_SIZE + slpmsg->size + P2P_PACKET_FOOTER_SIZE);
+	header = msn_p2p_header_to_wire(slpmsg->p2p_info, &header_size);
+	footer = msn_p2p_footer_to_wire(slpmsg->p2p_info, &footer_size);
+
+	base = g_malloc(header_size + slpmsg->size + footer_size);
 	tmp = base;
 
-	header = msn_p2p_header_to_wire(slpmsg->header);
-	footer = msn_p2p_footer_to_wire(slpmsg->footer);
-
-	siz = P2P_PACKET_HEADER_SIZE;
 	/* Copy header */
-	memcpy(tmp, header, siz);
-	tmp += siz;
+	memcpy(tmp, header, header_size);
+	tmp += header_size;
 
 	/* Copy body */
 	memcpy(tmp, slpmsg->buffer, slpmsg->size);
 	tmp += slpmsg->size;
 
 	/* Copy footer */
-	siz = P2P_PACKET_FOOTER_SIZE;
-	memcpy(tmp, footer, siz);
-	tmp += siz;
+	memcpy(tmp, footer, footer_size);
+	tmp += footer_size;
 
 	*ret_size = tmp - base;
 
@@ -303,15 +300,7 @@
 
 	str = g_string_new(NULL);
 
-	g_string_append_printf(str, "Session ID: %u\r\n", slpmsg->header->session_id);
-	g_string_append_printf(str, "ID:         %u\r\n", slpmsg->header->id);
-	g_string_append_printf(str, "Offset:     %" G_GUINT64_FORMAT "\r\n", slpmsg->header->offset);
-	g_string_append_printf(str, "Total size: %" G_GUINT64_FORMAT "\r\n", slpmsg->header->total_size);
-	g_string_append_printf(str, "Length:     %u\r\n", slpmsg->header->length);
-	g_string_append_printf(str, "Flags:      0x%x\r\n", slpmsg->header->flags);
-	g_string_append_printf(str, "ACK ID:     %u\r\n", slpmsg->header->ack_id);
-	g_string_append_printf(str, "SUB ID:     %u\r\n", slpmsg->header->ack_sub_id);
-	g_string_append_printf(str, "ACK Size:   %" G_GUINT64_FORMAT "\r\n", slpmsg->header->ack_size);
+	msn_p2p_info_to_string(slpmsg->p2p_info, str);
 
 	if (purple_debug_is_verbose() && slpmsg->buffer != NULL) {
 		g_string_append_len(str, (gchar*)slpmsg->buffer, slpmsg->size);
@@ -324,7 +313,5 @@
 
 	}
 
-	g_string_append_printf(str, "Footer:     %u\r\n", slpmsg->footer->value);
-
 	purple_debug_info("msn", "SlpMessage %s:\n{%s}\n", slpmsg->info, str->str);
 }
--- a/libpurple/protocols/msn/slpmsg.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/msn/slpmsg.h	Sat Feb 12 04:17:09 2011 +0900
@@ -45,13 +45,10 @@
 	MsnSlpLink *slplink; /**< The slplink through which this slp message is being sent. */
 	MsnSession *session;
 
-	MsnP2PHeader *header;
-	MsnP2PFooter *footer;
+	MsnP2PInfo *p2p_info;
 
 	long id;
 
-	gboolean sip; /**< A flag that states if this is a SIP slp message. */
-
 	gboolean ft;
 	PurpleStoredImage *img;
 	guchar *buffer;
@@ -94,8 +91,6 @@
 void msn_slpmsg_set_body(MsnSlpMessage *slpmsg, const char *body,
 						 long long size);
 void msn_slpmsg_set_image(MsnSlpMessage *slpmsg, PurpleStoredImage *img);
-void msn_slpmsg_open_file(MsnSlpMessage *slpmsg,
-						  const char *file_name);
 MsnSlpMessage * msn_slpmsg_sip_new(MsnSlpCall *slpcall, int cseq,
 								   const char *header,
 								   const char *branch,
@@ -109,7 +104,7 @@
  *
  * @return A new SlpMessage with ACK headers
  */
-MsnSlpMessage *msn_slpmsg_ack_new(MsnP2PHeader *header);
+MsnSlpMessage *msn_slpmsg_ack_new(MsnP2PInfo *info);
 
 /**
  * Create a new SLP message for MsnObject data.
@@ -125,7 +120,7 @@
  * Create a new SLP message for data preparation.
  *
  * @param slpcall 	The slpcall that manages this message.
- * 
+ *
  * @return A new SlpMessage with data preparation info.
  */
 MsnSlpMessage *msn_slpmsg_dataprep_new(MsnSlpCall *slpcall);
--- a/libpurple/protocols/msn/slpmsg_part.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/msn/slpmsg_part.c	Sat Feb 12 04:17:09 2011 +0900
@@ -28,16 +28,14 @@
 #include "slpmsg.h"
 #include "slpmsg_part.h"
 
-MsnSlpMessagePart *msn_slpmsgpart_new(MsnP2PHeader *header, MsnP2PFooter *footer)
+MsnSlpMessagePart *msn_slpmsgpart_new(MsnP2PInfo *info)
 {
 	MsnSlpMessagePart *part;
 
 	part = g_new0(MsnSlpMessagePart, 1);
 
-	if (header)
-		part->header = g_memdup(header, P2P_PACKET_HEADER_SIZE);
-	if (footer)
-		part->footer = g_memdup(footer, P2P_PACKET_FOOTER_SIZE);
+	if (info)
+		part->info = msn_p2p_info_dup(info);
 
 	part->ack_cb = msn_slpmsgpart_ack;
 	part->nak_cb = msn_slpmsgpart_nak;
@@ -48,20 +46,22 @@
 MsnSlpMessagePart *msn_slpmsgpart_new_from_data(const char *data, size_t data_len)
 {
 	MsnSlpMessagePart *part;
+	size_t len;
 	int body_len;
 
 	if (data_len < P2P_PACKET_HEADER_SIZE) {
 		return NULL;
 	}
 
-	part = msn_slpmsgpart_new(NULL, NULL);
+	part = msn_slpmsgpart_new(NULL);
+	part->info = msn_p2p_info_new();
 
 	/* Extract the binary SLP header */
-	part->header = msn_p2p_header_from_wire(data);
-	data += P2P_PACKET_HEADER_SIZE;
+	len = msn_p2p_header_from_wire(part->info, data);
+	data += len;
 
 	/* Extract the body */
-	body_len = data_len - P2P_PACKET_HEADER_SIZE - P2P_PACKET_FOOTER_SIZE;
+	body_len = data_len - len - P2P_PACKET_FOOTER_SIZE;
 	/* msg->body_len = msg->msnslp_header.length; */
 
 	if (body_len > 0) {
@@ -72,16 +72,16 @@
 	}
 
 	/* Extract the footer */
-	if (body_len >= 0) 
-		part->footer = msn_p2p_footer_from_wire(data);
+	if (body_len >= 0)
+		msn_p2p_footer_from_wire(part->info, data);
 
 	return part;
 }
 
 static void msn_slpmsgpart_destroy(MsnSlpMessagePart *part)
 {
-	g_free(part->header);
-	g_free(part->footer);
+	g_free(part->info);
+	g_free(part->buffer);
 
 	g_free(part);
 
@@ -137,27 +137,25 @@
 	char *footer;
 	char *base;
 	char *tmp;
-	size_t siz;
+	size_t header_size, footer_size;
 
-	base = g_malloc(P2P_PACKET_HEADER_SIZE + part->size + P2P_PACKET_FOOTER_SIZE);
+	header = msn_p2p_header_to_wire(part->info, &header_size);
+	footer = msn_p2p_footer_to_wire(part->info, &footer_size);
+
+	base = g_malloc(header_size + part->size + footer_size);
 	tmp = base;
 
-	header = msn_p2p_header_to_wire(part->header);
-	footer = msn_p2p_footer_to_wire(part->footer);
-
-	siz = P2P_PACKET_HEADER_SIZE;
 	/* Copy header */
-	memcpy(tmp, header, siz);
-	tmp += siz;
+	memcpy(tmp, header, header_size);
+	tmp += header_size;
 
 	/* Copy body */
 	memcpy(tmp, part->buffer, part->size);
 	tmp += part->size;
 
 	/* Copy footer */
-	siz = P2P_PACKET_FOOTER_SIZE;
-	memcpy(tmp, footer, siz);
-	tmp += siz;
+	memcpy(tmp, footer, footer_size);
+	tmp += footer_size;
 
 	*ret_size = tmp - base;
 
@@ -166,23 +164,27 @@
 
 	return base;
 }
+
 /* We have received the message ack */
 void
 msn_slpmsgpart_ack(MsnSlpMessagePart *part, void *data)
 {
 	MsnSlpMessage *slpmsg;
+	guint64 offset;
 	long long real_size;
 
 	slpmsg = data;
 
-	real_size = (slpmsg->header->flags == P2P_ACK) ? 0 : slpmsg->size;
+	real_size = (msn_p2p_info_get_flags(slpmsg->p2p_info) == P2P_ACK) ? 0 : slpmsg->size;
 
-	slpmsg->header->offset += part->header->length;
+	offset = msn_p2p_info_get_offset(slpmsg->p2p_info);
+	offset += msn_p2p_info_get_length(part->info);
+	msn_p2p_info_set_offset(slpmsg->p2p_info, offset);
 
 	slpmsg->parts = g_list_remove(slpmsg->parts, part);
 	msn_slpmsgpart_unref(part);
 
-	if (slpmsg->header->offset < real_size)
+	if (offset < real_size)
 	{
 		if (slpmsg->slpcall->xfer && purple_xfer_get_status(slpmsg->slpcall->xfer) == PURPLE_XFER_STATUS_STARTED)
 		{
@@ -195,7 +197,7 @@
 	else
 	{
 		/* The whole message has been sent */
-		if (msn_p2p_msg_is_data(slpmsg->header->flags))
+		if (msn_p2p_msg_is_data(msn_p2p_info_get_flags(slpmsg->p2p_info)))
 		{
 			if (slpmsg->slpcall != NULL)
 			{
@@ -221,3 +223,9 @@
 	msn_slpmsgpart_unref(part);
 }
 
+void
+msn_slpmsgpart_to_string(MsnSlpMessagePart *part, GString *str)
+{
+	msn_p2p_info_to_string(part->info, str);
+}
+
--- a/libpurple/protocols/msn/slpmsg_part.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/msn/slpmsg_part.h	Sat Feb 12 04:17:09 2011 +0900
@@ -34,8 +34,7 @@
 {
 	guint ref_count;
 
-	MsnP2PHeader *header;
-	MsnP2PFooter *footer;
+	MsnP2PInfo *info;
 
 	MsnSlpPartCb ack_cb;
 	MsnSlpPartCb nak_cb;
@@ -45,7 +44,7 @@
 	size_t size;
 };
 
-MsnSlpMessagePart *msn_slpmsgpart_new(MsnP2PHeader *header, MsnP2PFooter *footer);
+MsnSlpMessagePart *msn_slpmsgpart_new(MsnP2PInfo *info);
 
 MsnSlpMessagePart *msn_slpmsgpart_new_from_data(const char *data, size_t data_len);
 
@@ -60,4 +59,8 @@
 void msn_slpmsgpart_ack(MsnSlpMessagePart *part, void *data);
 
 void msn_slpmsgpart_nak(MsnSlpMessagePart *part, void *data);
+
+void msn_slpmsgpart_to_string(MsnSlpMessagePart *part, GString *str);
+
 #endif /* MSN_SLPMSG_PART_H */
+
--- a/libpurple/protocols/msn/soap.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/msn/soap.c	Sat Feb 12 04:17:09 2011 +0900
@@ -141,8 +141,7 @@
 {
 	MsnSoapRequest *req = item;
 
-	if (req->cb)
-		req->cb(req->message, NULL, req->cb_data);
+	req->cb(req->message, NULL, req->cb_data);
 
 	msn_soap_request_destroy(req, FALSE);
 }
@@ -230,12 +229,6 @@
 	msn_soap_connection_sanitize(conn, FALSE);
 
 	conn->run_timer = purple_timeout_add(0, msn_soap_connection_run, conn);
-
-	if (conn->current_request) {
-		MsnSoapRequest *req = conn->current_request;
-		conn->current_request = NULL;
-		msn_soap_connection_destroy_foreach_cb(req, conn);
-	}
 }
 
 static void
@@ -269,6 +262,7 @@
 	MsnSoapCallback cb, gpointer cb_data)
 {
 	g_return_if_fail(message != NULL);
+	g_return_if_fail(cb != NULL);
 
 	msn_soap_message_send_internal(session, message, host, path, secure,
 		cb, cb_data, FALSE);
@@ -281,12 +275,13 @@
 	char *path;
 
 	if (purple_url_parse(url, &host, NULL, &path, NULL, NULL)) {
-		msn_soap_message_send_internal(conn->session, conn->current_request->message,
-			host, path, conn->current_request->secure,
-			conn->current_request->cb, conn->current_request->cb_data, TRUE);
+		MsnSoapRequest *req = conn->current_request;
+		conn->current_request = NULL;
 
-		msn_soap_request_destroy(conn->current_request, TRUE);
-		conn->current_request = NULL;
+		msn_soap_message_send_internal(conn->session, req->message, host, path,
+			req->secure, req->cb, req->cb_data, TRUE);
+
+		msn_soap_request_destroy(req, TRUE);
 
 		g_free(host);
 		g_free(path);
@@ -380,7 +375,6 @@
 					/* something horribly wrong */
 					purple_ssl_close(conn->ssl);
 					conn->ssl = NULL;
-					msn_soap_connection_handle_next(conn);
 					handled = TRUE;
 					break;
 				} else if (conn->response_code == 503 && conn->session->login_step < MSN_LOGIN_STEP_END) {
--- a/libpurple/protocols/msn/state.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/msn/state.c	Sat Feb 12 04:17:09 2011 +0900
@@ -223,7 +223,7 @@
 			} else if (strcmp(client_type, "bot") == 0) {
 				caps |= MSN_CLIENT_CAP_BOT;
 			}
-			/* MSN doesn't a "console" type... 
+			/* MSN doesn't a "console" type...
 			 What, they have no ncurses UI? :-) */
 		}
 	}
--- a/libpurple/protocols/msn/switchboard.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/msn/switchboard.c	Sat Feb 12 04:17:09 2011 +0900
@@ -270,7 +270,7 @@
 		g_free(passport);
 		return;
 	}
-	
+
 	if (!msnuser) {
 		purple_debug_info("msn","User %s is not on our list.\n", passport);
 		msnuser = msn_user_new(userlist, passport, NULL);
@@ -831,7 +831,7 @@
 
 	data += sizeof("base64:") - 1;
 	image_data = purple_base64_decode(data, &image_len);
-	if (!image_data || !image_len) 
+	if (!image_data || !image_len)
 	{
 		purple_debug_error("msn", "Unable to decode Ink from Base64 format.\n");
 		return;
--- a/libpurple/protocols/msn/tlv.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/msn/tlv.c	Sat Feb 12 04:17:09 2011 +0900
@@ -267,7 +267,7 @@
 	return msn_tlvlist_replace_raw(list, type, 1, v8);
 }
 
-int 
+int
 msn_tlvlist_replace_32(GSList **list, const guint16 type, const guint32 value)
 {
 	char v32[4];
--- a/libpurple/protocols/msn/user.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/msn/user.h	Sat Feb 12 04:17:09 2011 +0900
@@ -434,7 +434,7 @@
  *
  * @param user 		The user we are asking group membership.
  * @param group_id 	The group where the user may be in.
- * 
+ *
  * @return TRUE if user is part of the group. Otherwise, FALSE.
  */
 gboolean msn_user_is_in_group(MsnUser *user, const char * group_id);
--- a/libpurple/protocols/msn/xfer.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/msn/xfer.c	Sat Feb 12 04:17:09 2011 +0900
@@ -162,25 +162,25 @@
 }
 
 gchar *
-msn_file_context_to_wire(MsnFileContext *header)
+msn_file_context_to_wire(MsnFileContext *context)
 {
 	gchar *ret, *tmp;
 
-	tmp = ret = g_new(gchar, MSN_FILE_CONTEXT_SIZE + header->preview_len + 1);
+	tmp = ret = g_new(gchar, MSN_FILE_CONTEXT_SIZE + context->preview_len + 1);
 
-	msn_push32le(tmp, header->length);
-	msn_push32le(tmp, header->version);
-	msn_push64le(tmp, header->file_size);
-	msn_push32le(tmp, header->type);
-	memcpy(tmp, header->file_name, MAX_FILE_NAME_LEN * 2);
+	msn_push32le(tmp, context->length);
+	msn_push32le(tmp, context->version);
+	msn_push64le(tmp, context->file_size);
+	msn_push32le(tmp, context->type);
+	memcpy(tmp, context->file_name, MAX_FILE_NAME_LEN * 2);
 	tmp += MAX_FILE_NAME_LEN * 2;
-	memcpy(tmp, header->unknown1, sizeof(header->unknown1));
-	tmp += sizeof(header->unknown1);
-	msn_push32le(tmp, header->unknown2);
-	if (header->preview) {
-		memcpy(tmp, header->preview, header->preview_len);
+	memcpy(tmp, context->unknown1, sizeof(context->unknown1));
+	tmp += sizeof(context->unknown1);
+	msn_push32le(tmp, context->unknown2);
+	if (context->preview) {
+		memcpy(tmp, context->preview, context->preview_len);
 	}
-	tmp[header->preview_len] = '\0';
+	tmp[context->preview_len] = '\0';
 
 	return ret;
 }
@@ -188,48 +188,48 @@
 MsnFileContext *
 msn_file_context_from_wire(const char *buf, gsize len)
 {
-	MsnFileContext *header;
+	MsnFileContext *context;
 
 	if (!buf || len < MSN_FILE_CONTEXT_SIZE)
 		return NULL;
 
-	header = g_new(MsnFileContext, 1);
+	context = g_new(MsnFileContext, 1);
 
-	header->length = msn_pop32le(buf);
-	header->version = msn_pop32le(buf);
-	if (header->version == 2) {
+	context->length = msn_pop32le(buf);
+	context->version = msn_pop32le(buf);
+	if (context->version == 2) {
 		/* The length field is broken for this version. No check. */
-		header->length = MSN_FILE_CONTEXT_SIZE;
-	} else if (header->version == 3) {
-		if (header->length != MSN_FILE_CONTEXT_SIZE + 63) {
-			g_free(header);
+		context->length = MSN_FILE_CONTEXT_SIZE;
+	} else if (context->version == 3) {
+		if (context->length != MSN_FILE_CONTEXT_SIZE + 63) {
+			g_free(context);
 			return NULL;
 		} else if (len < MSN_FILE_CONTEXT_SIZE + 63) {
-			g_free(header);
+			g_free(context);
 			return NULL;
 		}
 	} else {
-		purple_debug_warning("msn", "Received MsnFileContext with unknown version: %d\n", header->version);
-		g_free(header);
+		purple_debug_warning("msn", "Received MsnFileContext with unknown version: %d\n", context->version);
+		g_free(context);
 		return NULL;
 	}
 
-	header->file_size = msn_pop64le(buf);
-	header->type = msn_pop32le(buf);
-	memcpy(header->file_name, buf, MAX_FILE_NAME_LEN * 2);
+	context->file_size = msn_pop64le(buf);
+	context->type = msn_pop32le(buf);
+	memcpy(context->file_name, buf, MAX_FILE_NAME_LEN * 2);
 	buf += MAX_FILE_NAME_LEN * 2;
-	memcpy(header->unknown1, buf, sizeof(header->unknown1));
-	buf += sizeof(header->unknown1);
-	header->unknown2 = msn_pop32le(buf);
+	memcpy(context->unknown1, buf, sizeof(context->unknown1));
+	buf += sizeof(context->unknown1);
+	context->unknown2 = msn_pop32le(buf);
 
-	if (header->type == 0 && len > header->length) {
-		header->preview_len = len - header->length;
-		header->preview = g_memdup(buf, header->preview_len);
+	if (context->type == 0 && len > context->length) {
+		context->preview_len = len - context->length;
+		context->preview = g_memdup(buf, context->preview_len);
 	} else {
-		header->preview_len = 0;
-		header->preview = NULL;
+		context->preview_len = 0;
+		context->preview = NULL;
 	}
 
-	return header;
+	return context;
 }
 
--- a/libpurple/protocols/msn/xfer.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/msn/xfer.h	Sat Feb 12 04:17:09 2011 +0900
@@ -22,6 +22,8 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
  */
 
+#ifndef MSN_XFER_H
+#define MSN_XFER_H
 
 #include "slpcall.h"
 
@@ -56,8 +58,10 @@
 void msn_xfer_end_cb(MsnSlpCall *slpcall, MsnSession *session);
 
 gchar *
-msn_file_context_to_wire(MsnFileContext *header);
+msn_file_context_to_wire(MsnFileContext *context);
 
 MsnFileContext *
 msn_file_context_from_wire(const char *buf, gsize len);
 
+#endif /* MSN_XFER_H */
+
--- a/libpurple/protocols/mxit/chunk.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/mxit/chunk.c	Sat Feb 12 04:17:09 2011 +0900
@@ -591,7 +591,7 @@
 			case CP_CHUNK_CLICK :			/* splash click */
 				{
 					struct splash_click_chunk* click = g_new0( struct splash_click_chunk, 1 );
-					
+
 					cr->resources = g_list_append( cr->resources, click );
 					break;
 				}
--- a/libpurple/protocols/mxit/login.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/mxit/login.c	Sat Feb 12 04:17:09 2011 +0900
@@ -111,7 +111,7 @@
 	/* encrypt the user password */
 	session->encpwd = mxit_encrypt_password( session );
 
-	state = purple_account_get_int( session->acc, MXIT_CONFIG_STATE, MXIT_STATE_LOGIN ); 
+	state = purple_account_get_int( session->acc, MXIT_CONFIG_STATE, MXIT_STATE_LOGIN );
 	if ( state == MXIT_STATE_LOGIN ) {
 		/* create and send login packet */
 		mxit_send_login( session );
--- a/libpurple/protocols/mxit/markup.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/mxit/markup.c	Sat Feb 12 04:17:09 2011 +0900
@@ -1011,7 +1011,7 @@
 {
 	PurpleStoredImage *image;
 	gconstpointer img_data;
-	gsize img_size;	
+	gsize img_size;
 	gchar* enc;
 
 	image = purple_imgstore_find_by_id( id );
@@ -1138,7 +1138,7 @@
 
 				/* skip to end of tag ('>') */
 				for ( i++; ( i < len ) && ( message[i] != '>' ) ; i++ );
-			
+
 				break;
 
 			case '*' :	/* MXit bold */
--- a/libpurple/protocols/mxit/multimx.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/mxit/multimx.c	Sat Feb 12 04:17:09 2011 +0900
@@ -73,7 +73,7 @@
  * Find a MultiMx session based on Alias
  *
  *  @param session		The MXit session object
- *  @param roomname		The UI room-name 
+ *  @param roomname		The UI room-name
  *  @return				The MultiMX room object (or NULL if not found)
  */
 static struct multimx* find_room_by_alias(struct MXitSession* session, const char* roomname)
@@ -647,7 +647,7 @@
 
 	/* Send packet to MXit */
 	mxit_send_message(session, multimx->roomid, message, TRUE, FALSE);
-	
+
 	/* Determine our nickname to display */
 	if (multimx->nickname)
 		nickname = multimx->nickname;
--- a/libpurple/protocols/mxit/mxit.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/mxit/mxit.c	Sat Feb 12 04:17:09 2011 +0900
@@ -555,7 +555,7 @@
  * Request profile information for another MXit contact.
  *
  *  @param gc		The connection object
- *  @param who		The username of the contact.		
+ *  @param who		The username of the contact.
  */
 static void mxit_get_info( PurpleConnection *gc, const char *who )
 {
--- a/libpurple/protocols/mxit/mxit.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/mxit/mxit.h	Sat Feb 12 04:17:09 2011 +0900
@@ -122,7 +122,7 @@
 
 
 /*
- * data structure containing all MXit session information 
+ * data structure containing all MXit session information
  */
 struct MXitSession {
 	/* socket connection */
--- a/libpurple/protocols/mxit/profile.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/mxit/profile.c	Sat Feb 12 04:17:09 2011 +0900
@@ -107,7 +107,7 @@
  * @return			Date & Time in a display'able format.
  */
 static const char* datetime( gint64 msecs )
-{  
+{
     time_t secs = msecs / 1000;
 
     struct tm t;
@@ -160,7 +160,7 @@
 			purple_notify_user_info_add_pair( info, _( "Last Online" ), ( profile->lastonline == 0 ) ? _( "Unknown" ) : datetime( profile->lastonline ) );
 
 		/* mood */
-		if ( contact->mood != MXIT_MOOD_NONE )   
+		if ( contact->mood != MXIT_MOOD_NONE )
 			purple_notify_user_info_add_pair( info, _( "Mood" ), mxit_convert_mood_to_name( contact->mood ) );
 		else
 			purple_notify_user_info_add_pair( info, _( "Mood" ), _( "None" ) );
--- a/libpurple/protocols/mxit/protocol.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/mxit/protocol.c	Sat Feb 12 04:17:09 2011 +0900
@@ -647,7 +647,7 @@
 								"%s%c%i%c%s%c%s%c"			/* dateOfBirth\1gender\1location\1capabilities\1 */
 								"%s%c%i%c%s%c%s",			/* dc\1features\1dialingcode\1locale */
 								session->encpwd, CP_FLD_TERM, MXIT_CP_VERSION, CP_FLD_TERM, CP_MAX_FILESIZE, CP_FLD_TERM, profile->nickname, CP_FLD_TERM,
-								profile->birthday, CP_FLD_TERM, ( profile->male ) ? 1 : 0, CP_FLD_TERM, MXIT_DEFAULT_LOC, CP_FLD_TERM, MXIT_CP_CAP, CP_FLD_TERM, 
+								profile->birthday, CP_FLD_TERM, ( profile->male ) ? 1 : 0, CP_FLD_TERM, MXIT_DEFAULT_LOC, CP_FLD_TERM, MXIT_CP_CAP, CP_FLD_TERM,
 								session->distcode, CP_FLD_TERM, MXIT_CP_FEATURES, CP_FLD_TERM, session->dialcode, CP_FLD_TERM, locale
 	);
 
--- a/libpurple/protocols/mxit/protocol.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/mxit/protocol.h	Sat Feb 12 04:17:09 2011 +0900
@@ -130,7 +130,7 @@
 #define		CP_CMD_MEDIA			0x001B					/* (27) get multimedia message */
 #define		CP_CMD_SPLASHCLICK		0x001F					/* (31) splash-screen clickthrough */
 #define		CP_CMD_STATUS			0x0020					/* (32) set shown presence & status */
-#define		CP_CMD_MSGEVENT			0x0023					/* (35) Raise message event */ 
+#define		CP_CMD_MSGEVENT			0x0023					/* (35) Raise message event */
 #define		CP_CMD_MOOD				0x0029					/* (41) set mood */
 #define		CP_CMD_KICK				0x002B					/* (43) login kick */
 #define		CP_CMD_GRPCHAT_CREATE	0x002C					/* (44) create new groupchat */
--- a/libpurple/protocols/mxit/roster.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/mxit/roster.c	Sat Feb 12 04:17:09 2011 +0900
@@ -238,7 +238,7 @@
 /*========================================================================================================================
  * Subscription Types
  */
- 
+
 /*------------------------------------------------------------------------
  * Returns a Contact subscription type as a string.
  *
@@ -468,7 +468,7 @@
 	if ( !contact )
 		return;
 
-	contact->presence = presence;	
+	contact->presence = presence;
 	contact->mood = mood;
 
 	/* validate mood */
--- a/libpurple/protocols/novell/novell.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/novell/novell.c	Sat Feb 12 04:17:09 2011 +0900
@@ -74,7 +74,7 @@
 _sync_privacy_lists(NMUser *user);
 
 static void
-_show_info(PurpleConnection * gc, NMUserRecord * user_record);
+_show_info(PurpleConnection * gc, NMUserRecord * user_record, char * name);
 
 const char *
 _get_conference_name(int id);
@@ -678,7 +678,7 @@
 				ur = nm_conference_get_participant(conference, i);
 				if (ur) {
 					name = nm_user_record_get_display_id(ur);
-					purple_conv_chat_add_user(PURPLE_CONV_CHAT(chat), name, NULL, 
+					purple_conv_chat_add_user(PURPLE_CONV_CHAT(chat), name, NULL,
 											PURPLE_CBFLAGS_NONE, TRUE);
 				}
 			}
@@ -705,7 +705,7 @@
 		user_record = (NMUserRecord *) resp_data;
 		if (user_record) {
 			_show_info(purple_account_get_connection(user->client_data),
-					   user_record);
+					   user_record, g_strdup(name));
 		}
 	} else {
 		gc = purple_account_get_connection(user->client_data);
@@ -1505,7 +1505,7 @@
 
 /* Display a dialog box showing the properties for the given user record */
 static void
-_show_info(PurpleConnection * gc, NMUserRecord * user_record)
+_show_info(PurpleConnection * gc, NMUserRecord * user_record, char * name)
 {
 	PurpleNotifyUserInfo *user_info =	purple_notify_user_info_new();
 	int count, i;
@@ -1544,9 +1544,10 @@
 		}
 	}
 
-	purple_notify_userinfo(gc, nm_user_record_get_userid(user_record), 
-						 user_info, NULL, NULL);
+	purple_notify_userinfo(gc, name, user_info, NULL, NULL);
 	purple_notify_user_info_destroy(user_info);
+
+	g_free(name);
 }
 
 /* Send a join conference, the first item in the parms list is the
@@ -1965,7 +1966,7 @@
 					nm_conference_set_data(conference, (gpointer) chat);
 
 					name = nm_user_record_get_display_id(ur);
-					purple_conv_chat_add_user(PURPLE_CONV_CHAT(chat), name, NULL, 
+					purple_conv_chat_add_user(PURPLE_CONV_CHAT(chat), name, NULL,
 											PURPLE_CBFLAGS_NONE, TRUE);
 
 				}
@@ -1977,7 +1978,7 @@
 			if (ur) {
 				name = nm_user_record_get_display_id(ur);
 				if (!purple_conv_chat_find_user(PURPLE_CONV_CHAT(chat), name)) {
-					purple_conv_chat_add_user(PURPLE_CONV_CHAT(chat), name, NULL, 
+					purple_conv_chat_add_user(PURPLE_CONV_CHAT(chat), name, NULL,
 											PURPLE_CBFLAGS_NONE, TRUE);
 				}
 			}
@@ -2860,7 +2861,7 @@
 			}
 
 			purple_notify_user_info_add_pair(user_info, _("Status"), status_str);
-			
+
 			if (text)
 				purple_notify_user_info_add_pair(user_info, _("Message"), text);
 		}
@@ -2912,11 +2913,9 @@
 
 		user_record = nm_find_user_record(user, name);
 		if (user_record) {
-
-			_show_info(gc, user_record);
+			_show_info(gc, user_record, g_strdup(name));
 
 		} else {
-
 			rc = nm_send_get_details(user, name,
 									 _get_details_resp_show_info, g_strdup(name));
 
--- a/libpurple/protocols/null/nullprpl.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/null/nullprpl.c	Sat Feb 12 04:17:09 2011 +0900
@@ -8,18 +8,18 @@
  * Nullprpl is a mock protocol plugin for Pidgin and libpurple. You can create
  * accounts with it, sign on and off, add buddies, and send and receive IMs,
  * all without connecting to a server!
- * 
+ *
  * Beyond that basic functionality, nullprpl supports presence and
  * away/available messages, offline messages, user info, typing notification,
  * privacy allow/block lists, chat rooms, whispering, room lists, and protocol
  * icons and emblems. Notable missing features are file transfer and account
  * registration and authentication.
- * 
+ *
  * Nullprpl is intended as an example of how to write a libpurple protocol
  * plugin. It doesn't contain networking code or an event loop, but it does
  * demonstrate how to use the libpurple API to do pretty much everything a prpl
  * might need to do.
- * 
+ *
  * Nullprpl is also a useful tool for hacking on Pidgin, Finch, and other
  * libpurple clients. It's a full-featured protocol plugin, but doesn't depend
  * on an external server, so it's a quick and easy way to exercise test new
@@ -191,7 +191,7 @@
 }
 
 
-/* 
+/*
  * UI callbacks
  */
 static void nullprpl_input_user_info(PurplePluginAction *action)
@@ -355,7 +355,7 @@
   defaults = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, g_free);
   g_hash_table_insert(defaults, "room", g_strdup("default"));
   return defaults;
-}  
+}
 
 static void nullprpl_login(PurpleAccount *acct)
 {
@@ -382,7 +382,7 @@
   /* fetch stored offline messages */
   purple_debug_info("nullprpl", "checking for offline messages for %s\n",
                     acct->username);
-  offline_messages = g_hash_table_lookup(goffline_messages, acct->username); 
+  offline_messages = g_hash_table_lookup(goffline_messages, acct->username);
   while (offline_messages) {
     GOfflineMessage *message = (GOfflineMessage *)offline_messages->data;
     purple_debug_info("nullprpl", "delivering offline message to %s: %s\n",
--- a/libpurple/protocols/oscar/authorization.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/oscar/authorization.c	Sat Feb 12 04:17:09 2011 +0900
@@ -89,7 +89,7 @@
 	OscarData *od = purple_connection_get_protocol_data(gc);
 
 	aim_ssi_sendauthreply(od, data->name, 0x00, msg ? msg : _("No reason given."));
-	
+
 	oscar_free_name_data(data);
 }
 
--- a/libpurple/protocols/oscar/family_feedbag.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/oscar/family_feedbag.c	Sat Feb 12 04:17:09 2011 +0900
@@ -44,10 +44,66 @@
  */
 
 #include "oscar.h"
+#include "debug.h"
 
 static int aim_ssi_addmoddel(OscarData *od);
 
 /**
+ * List types based on http://dev.aol.com/aim/oscar/#FEEDBAG (archive.org)
+ * and http://iserverd.khstu.ru/oscar/ssi_item.html
+ *
+ * @param type The type of a list item as integer number, as provided by an aim_ssi_item struct.
+ * @return Returns the name of the item type as a character string.
+ */
+static const gchar*
+aim_ssi_type_to_string(guint16 type)
+{
+	struct TypeStringPair
+	{
+		guint16 type;
+		const gchar *string;
+	};
+	static const struct TypeStringPair type_strings[] = {
+		{ 0x0000, "Buddy" },
+		{ 0x0001, "Group" },
+		{ 0x0002, "Permit/Visible" },
+		{ 0x0003, "Deny/Invisible" },
+		{ 0x0004, "PDInfo" },
+		{ 0x0005, "PresencePrefs" }, 
+		{ 0x0006, "Non-Buddy Info" },
+		{ 0x0009, "ClientPrefs" },
+		{ 0x000e, "ICQDeny/Ignore" },
+		{ 0x0014, "Buddy Icon" }, 
+		{ 0x0015, "Recent Buddies" },
+		{ 0x0019, "Non-Buddy" },
+		{ 0x001d, "Vanity Info" },
+		{ 0x0020, "ICQ-MDir" },
+		{ 0x0029, "Facebook" },
+	};
+	int i;
+	for (i = 0; i < G_N_ELEMENTS(type_strings); i++) {
+		if (type_strings[i].type == type) {
+			return type_strings[i].string;
+		}
+	}
+	return "unknown";
+}
+
+/** For debug log output: Appends a line containing information about a given list item to a string.
+ *
+ * @param str String to which the line will be appended.
+ * @param prefix A string which will be prepended to the line.
+ * @param item List item from which information is extracted.
+ */
+static void
+aim_ssi_item_debug_append(GString *str, char *prefix, struct aim_ssi_item *item)
+{
+	g_string_append_printf(str, 
+		"%s gid=0x%04hx, bid=0x%04hx, list_type=0x%04hx [%s], name=%s.\n",
+		prefix, item->gid, item->bid, item->type, aim_ssi_type_to_string(item->type), item->name);
+}
+
+/**
  * Locally rebuild the 0x00c8 TLV in the additional data of the given group.
  *
  * @param list A pointer to a pointer to the current list of items.
@@ -478,6 +534,7 @@
 	struct aim_ssi_item *cur1, *cur2;
 	struct aim_ssi_tmp *cur, *new;
 	int n = 0;
+	GString *debugstr = g_string_new("");
 
 	/*
 	 * The variable "n" is used to limit the number of addmoddel's that
@@ -517,6 +574,7 @@
 					cur->next = new;
 				} else
 					od->ssi.pending = new;
+			       	aim_ssi_item_debug_append(debugstr, "Deleting item ", cur1);
 			}
 		}
 	}
@@ -537,6 +595,7 @@
 					cur->next = new;
 				} else
 					od->ssi.pending = new;
+			       	aim_ssi_item_debug_append(debugstr, "Adding item ", cur1);
 			}
 		}
 	}
@@ -558,9 +617,21 @@
 					cur->next = new;
 				} else
 					od->ssi.pending = new;
+			       	aim_ssi_item_debug_append(debugstr, "Modifying item ", cur1);
 			}
 		}
 	}
+	if (debugstr->len > 0) {
+		purple_debug_info("oscar", "%s", debugstr->str);
+		if (purple_debug_is_verbose()) {
+	    		g_string_truncate(debugstr, 0);
+			for (cur1 = od->ssi.local; cur1; cur1 = cur1->next) 
+				aim_ssi_item_debug_append(debugstr, "\t", cur1);
+			purple_debug_misc("oscar", "Dumping item list of account %s:\n%s",
+				purple_connection_get_account(od->gc)->username, debugstr->str);
+		}
+	}
+	g_string_free(debugstr, TRUE);
 
 	/* We're out of stuff to do, so tell the AIM servers we're done and exit */
 	if (!od->ssi.pending) {
@@ -1165,6 +1236,7 @@
 	guint16 namelen, gid, bid, type;
 	char *name;
 	GSList *data;
+	GString *debugstr = g_string_new("");
 
 	fmtver = byte_stream_get8(bs); /* Version of ssi data.  Should be 0x00 */
 	od->ssi.numitems += byte_stream_get16(bs); /* # of items in this SSI SNAC */
@@ -1179,10 +1251,13 @@
 		bid = byte_stream_get16(bs);
 		type = byte_stream_get16(bs);
 		data = aim_tlvlist_readlen(bs, byte_stream_get16(bs));
-		aim_ssi_itemlist_add(&od->ssi.official, name, gid, bid, type, data);
+		aim_ssi_item_debug_append(debugstr, "\t", aim_ssi_itemlist_add(&od->ssi.official, name, gid, bid, type, data));
 		g_free(name);
 		aim_tlvlist_free(data);
 	}
+	purple_debug_misc("oscar", "Reading items from tlvlist for account %s:\n%s",
+		purple_connection_get_account(od->gc)->username, debugstr->str);
+	g_string_free(debugstr, TRUE);
 
 	/* Read in the timestamp */
 	od->ssi.timestamp = byte_stream_get32(bs);
--- a/libpurple/protocols/oscar/family_icbm.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/oscar/family_icbm.c	Sat Feb 12 04:17:09 2011 +0900
@@ -967,6 +967,7 @@
 
 			msg = byte_stream_getstr(message, msglen);
 			args->msg = oscar_decode_im(account, userinfo->bn, charset, msg, msglen);
+			g_free(msg);
 		} else {
 			byte_stream_advance(message, length);
 		}
--- a/libpurple/protocols/oscar/family_icq.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/oscar/family_icq.c	Sat Feb 12 04:17:09 2011 +0900
@@ -88,17 +88,17 @@
 		g_free(original_snac);
 		return 0;
 	}
-	
+
 	request_type = original_snac->data;
 	original_info_ptr = g_slist_find_custom(od->icq_info, &original_snac->id, compare_icq_infos);
 	original_info = original_info_ptr->data;
-	
+
 	if (!original_info_ptr) {
 		purple_debug_misc("oscar", "icq: the request info for the error packet was not found");
 		g_free(original_snac);
 		return 0;
 	}
-	
+
 	reason = byte_stream_get16(bs);
 	uin = g_strdup_printf("%u", original_info->uin);
 	switch (*request_type) {
--- a/libpurple/protocols/oscar/family_locate.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/oscar/family_locate.c	Sat Feb 12 04:17:09 2011 +0900
@@ -173,7 +173,7 @@
 
 	/* Support xtraz statuses */
 	{OSCAR_CAPABILITY_XTRAZ,
-	 {0x1a, 0x09, 0x3c, 0x6c, 0xd7, 0xFD, 0x4e, 0xc5, 
+	 {0x1a, 0x09, 0x3c, 0x6c, 0xd7, 0xFD, 0x4e, 0xc5,
 	  0x9d, 0x51, 0xa6, 0x47, 0x4e, 0x34, 0xf5, 0xa0}},
 
 	{OSCAR_CAPABILITY_SENDBUDDYLIST,
@@ -630,7 +630,7 @@
 
 		for (i = 0; icq_custom_icons[i].mood; i++) {
 			if (memcmp(&icq_custom_icons[i].data, cap, 0x10) == 0) {
-				purple_debug_misc("oscar", "Custom status icon: %s\n", icq_purple_moods[i].description);		
+				purple_debug_misc("oscar", "Custom status icon: %s\n", icq_purple_moods[i].description);
 				result = icq_custom_icons[i].mood;
 				break; /* should only match once... */
 			}
--- a/libpurple/protocols/oscar/odc.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/oscar/odc.c	Sat Feb 12 04:17:09 2011 +0900
@@ -115,7 +115,7 @@
 
 	byte_stream_put32(&bs, frame->payload.len);
 	byte_stream_put16(&bs, frame->encoding);
-	byte_stream_put16(&bs, 0x0000);	
+	byte_stream_put16(&bs, 0x0000);
 	byte_stream_put16(&bs, 0x0000);
 	byte_stream_put16(&bs, 0x0000);
 
--- a/libpurple/protocols/oscar/oscar.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/oscar/oscar.c	Sat Feb 12 04:17:09 2011 +0900
@@ -1026,7 +1026,7 @@
 	conn->cookie = g_memdup(cookie, cookielen);
 
 	/*
-	 * Use TLS only if the server provided us with a tls_certname. The server might not specify a tls_certname even if we requested to use TLS, 
+	 * Use TLS only if the server provided us with a tls_certname. The server might not specify a tls_certname even if we requested to use TLS,
 	 * and that is something we should be prepared to.
 	 */
 	if (tls_certname)
@@ -1293,7 +1293,7 @@
 				PURPLE_CONNECTION_ERROR_NO_SSL_SUPPORT,
 				_("You required encryption in your account settings, but one of the servers doesn't support it."));
 			return 0;
-		} 
+		}
 	}
 
 	/*
@@ -3211,7 +3211,7 @@
 	g_string_free(data, TRUE);
 
 	purple_debug_info("oscar", "sending direct IM %s using charset %i", msg->str, charset);
-	
+
 	peer_odc_send_im(conn, msg->str, msg->len, charset,
 			imflags & PURPLE_MESSAGE_AUTO_RESP);
 	g_string_free(msg, TRUE);
@@ -3582,7 +3582,7 @@
 		}
 
 		itmsurl = purple_status_get_attr_string(status, "itmsurl");
-		
+
 		aim_srv_setextrainfo(od, TRUE, oscar_get_extended_status(gc), TRUE, status_text, itmsurl);
 		g_free(status_text);
 	}
--- a/libpurple/protocols/oscar/peer_proxy.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/oscar/peer_proxy.c	Sat Feb 12 04:17:09 2011 +0900
@@ -83,6 +83,8 @@
 	byte_stream_putcaps(&frame.payload, conn->type); /* Value */
 
 	peer_proxy_send(conn, &frame);
+
+	byte_stream_destroy(&frame.payload);
 }
 
 /**
@@ -120,6 +122,8 @@
 	byte_stream_putcaps(&frame.payload, conn->type); /* Value */
 
 	peer_proxy_send(conn, &frame);
+
+	byte_stream_destroy(&frame.payload);
 }
 
 /**
--- a/libpurple/protocols/oscar/tlv.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/oscar/tlv.c	Sat Feb 12 04:17:09 2011 +0900
@@ -400,6 +400,7 @@
  */
 int aim_tlvlist_add_caps(GSList **list, const guint16 type, const guint64 caps, const char *mood)
 {
+	int len;
 	ByteStream bs;
 	guint32 bs_size;
 	guint8 *data;
@@ -417,7 +418,11 @@
 	if (data != NULL)
 		byte_stream_putraw(&bs, data, 16);
 
-	return aim_tlvlist_add_raw(list, type, byte_stream_curpos(&bs), bs.data);
+	len = aim_tlvlist_add_raw(list, type, byte_stream_curpos(&bs), bs.data);
+
+	byte_stream_destroy(&bs);
+
+	return len;
 }
 
 /**
--- a/libpurple/protocols/qq/ChangeLog	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/qq/ChangeLog	Sat Feb 12 04:17:09 2011 +0900
@@ -1,3 +1,12 @@
+2010.01.23 - flos <lonicerae(at)gmail.com>
+	* added an option to force incoming message in chat room to use a default font instead of the font in message itself
+
+2010.01.18 - flos <lonicerae(at)gmail.com>
+	* added type 'UPDCLS' and 'UID' for implementing business logic layer
+
+2010.01.13 - ccpaging <ccpaging(at)gmail.com>
+	* qq2009-1 patch from ccpaging
+
 2009.04.23 - flos <lonicerae(at)gmail.com>
 	* Fixed a bug of updating buddy who is not in user's buddy list
 
--- a/libpurple/protocols/qq/buddy_info.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/qq/buddy_info.c	Sat Feb 12 04:17:09 2011 +0900
@@ -26,6 +26,7 @@
 #include "debug.h"
 #include "notify.h"
 #include "request.h"
+#include "connection.h"
 
 #include "utils.h"
 #include "packet_parse.h"
@@ -221,8 +222,8 @@
 	g_strfreev(segments);
 }
 
-void qq_request_buddy_info(PurpleConnection *gc, guint32 uid,
-		guint32 update_class, int action)
+void qq_request_buddy_info(PurpleConnection *gc, UID uid,
+		UPDCLS update_class, int action)
 {
 	gchar raw_data[16] = {0};
 
@@ -620,7 +621,7 @@
 	PurpleBuddy *buddy = NULL;
 	qq_data *qd = NULL;
 	qq_buddy_data *bd = NULL;
-	guint32 uid;
+	UID uid;
 	gchar *who;
 	gchar *alias_utf8;
 
@@ -741,7 +742,7 @@
 	return;
 }
 
-void qq_request_get_level(PurpleConnection *gc, guint32 uid)
+void qq_request_get_level(PurpleConnection *gc, UID uid)
 {
 	qq_data *qd = (qq_data *) gc->proto_data;
 	guint8 buf[16] = {0};
@@ -756,7 +757,7 @@
 	qq_send_cmd(gc, QQ_CMD_GET_LEVEL, buf, bytes);
 }
 
-void qq_request_get_level_2007(PurpleConnection *gc, guint32 uid)
+void qq_request_get_level_2007(PurpleConnection *gc, UID uid)
 {
 	guint8 buf[16] = {0};
 	gint bytes = 0;
@@ -767,7 +768,7 @@
 	qq_send_cmd(gc, QQ_CMD_GET_LEVEL, buf, bytes);
 }
 
-void qq_request_get_buddies_level(PurpleConnection *gc, guint32 update_class)
+void qq_request_get_buddies_level(PurpleConnection *gc, UPDCLS update_class)
 {
 	qq_data *qd = (qq_data *) gc->proto_data;
 	PurpleBuddy *buddy;
@@ -797,7 +798,8 @@
 static void process_level(PurpleConnection *gc, guint8 *data, gint data_len)
 {
 	gint bytes = 0;
-	guint32 uid, onlineTime;
+	UID uid;
+	guint32 onlineTime;
 	guint16 level, timeRemainder;
 	qq_buddy_data *bd;
 
@@ -829,7 +831,8 @@
 static void process_level_2007(PurpleConnection *gc, guint8 *data, gint data_len)
 {
 	gint bytes;
-	guint32 uid, onlineTime;
+	UID uid;
+	guint32 onlineTime;
 	guint16 level, timeRemainder;
 	qq_buddy_data *bd;
 	guint16 str_len;
--- a/libpurple/protocols/qq/buddy_info.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/qq/buddy_info.h	Sat Feb 12 04:17:09 2011 +0900
@@ -78,15 +78,14 @@
 gchar *qq_get_icon_path(gchar *icon_name);
 void qq_change_icon_cb(PurpleConnection *gc, const char *filepath);
 
-void qq_request_buddy_info(PurpleConnection *gc, guint32 uid,
-		guint32 update_class, int action);
+void qq_request_buddy_info(PurpleConnection *gc, UID uid, UPDCLS update_class, int action);
 void qq_set_custom_icon(PurpleConnection *gc, PurpleStoredImage *img);
 void qq_process_change_info(PurpleConnection *gc, guint8 *data, gint data_len);
 void qq_process_get_buddy_info(guint8 *data, gint data_len, guint32 action, PurpleConnection *gc);
 
-void qq_request_get_level(PurpleConnection *gc, guint32 uid);
-void qq_request_get_level_2007(PurpleConnection *gc, guint32 uid);
-void qq_request_get_buddies_level(PurpleConnection *gc, guint32 update_class);
+void qq_request_get_level(PurpleConnection *gc, UID uid);
+void qq_request_get_level_2007(PurpleConnection *gc, UID uid);
+void qq_request_get_buddies_level(PurpleConnection *gc, UPDCLS update_class);
 void qq_process_get_level_reply(guint8 *buf, gint buf_len, PurpleConnection *gc);
 
 void qq_update_buddy_icon(PurpleAccount *account, const gchar *who, gint face);
--- a/libpurple/protocols/qq/buddy_list.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/qq/buddy_list.c	Sat Feb 12 04:17:09 2011 +0900
@@ -53,7 +53,7 @@
 } qq_buddy_online;
 
 /* get a list of online_buddies */
-void qq_request_get_buddies_online(PurpleConnection *gc, guint8 position, guint32 update_class)
+void qq_request_get_buddies_online(PurpleConnection *gc, guint8 position, UPDCLS update_class)
 {
 	guint8 *raw_data;
 	gint bytes = 0;
@@ -77,7 +77,7 @@
 
 /* position starts with 0x0000,
  * server may return a position tag if list is too long for one packet */
-void qq_request_get_buddies(PurpleConnection *gc, guint16 position, guint32 update_class)
+void qq_request_get_buddies(PurpleConnection *gc, guint16 position, UPDCLS update_class)
 {
 	qq_data *qd;
 	guint8 raw_data[16] = {0};
@@ -101,7 +101,7 @@
 }
 
 /* get all list, buddies & Quns with groupsid support */
-void qq_request_get_buddies_and_rooms(PurpleConnection *gc, guint32 position, guint32 update_class)
+void qq_request_get_buddies_and_rooms(PurpleConnection *gc, guint32 position, UPDCLS update_class)
 {
 	guint8 raw_data[16] = {0};
 	gint bytes = 0;
@@ -362,7 +362,7 @@
 	gint bytes;
 	guint8 sub_cmd, reply_code;
 	guint32 unknown, position;
-	guint32 uid;
+	UID uid;
 	guint8 type;
 	qq_room_data *rmd;
 
@@ -455,7 +455,7 @@
 }
 
 /* send a packet to change my online status */
-void qq_request_change_status(PurpleConnection *gc, guint32 update_class)
+void qq_request_change_status(PurpleConnection *gc, UPDCLS update_class)
 {
 	qq_data *qd;
 	guint8 raw_data[16] = {0};
@@ -525,7 +525,7 @@
 {
 	qq_data *qd;
 	gint bytes;
-	guint32 my_uid;
+	UID my_uid;
 	gchar *who;
 	PurpleBuddy *buddy;
 	qq_buddy_data *bd;
@@ -583,7 +583,7 @@
 }
 
 /*TODO: maybe this should be qq_update_buddy_status() ?*/
-void qq_update_buddy_status(PurpleConnection *gc, guint32 uid, guint8 status, guint8 flag)
+void qq_update_buddy_status(PurpleConnection *gc, UID uid, guint8 status, guint8 flag)
 {
 	gchar *who;
 	const gchar *status_id;
--- a/libpurple/protocols/qq/buddy_list.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/qq/buddy_list.h	Sat Feb 12 04:17:09 2011 +0900
@@ -30,7 +30,7 @@
 
 #include "qq.h"
 typedef struct _qq_buddy_status {
-	guint32 uid;
+	UID uid;
 	guint8 unknown1;
 	struct in_addr ip;
 	guint16 port;
@@ -40,20 +40,20 @@
 	guint8 unknown_key[QQ_KEY_LENGTH];
 } qq_buddy_status;
 
-void qq_request_get_buddies_online(PurpleConnection *gc, guint8 position, guint32 update_class);
+void qq_request_get_buddies_online(PurpleConnection *gc, guint8 position, UPDCLS update_class);
 guint8 qq_process_get_buddies_online(guint8 *data, gint data_len, PurpleConnection *gc);
 
-void qq_request_get_buddies(PurpleConnection *gc, guint16 position, guint32 update_class);
+void qq_request_get_buddies(PurpleConnection *gc, guint16 position, UPDCLS update_class);
 guint16 qq_process_get_buddies(guint8 *data, gint data_len, PurpleConnection *gc);
 
-void qq_request_get_buddies_and_rooms(PurpleConnection *gc, guint32 position, guint32 update_class);
+void qq_request_get_buddies_and_rooms(PurpleConnection *gc, guint32 position, UPDCLS update_class);
 guint32 qq_process_get_buddies_and_rooms(guint8 *data, gint data_len, PurpleConnection *gc);
 
-void qq_request_change_status(PurpleConnection *gc, guint32 update_class);
+void qq_request_change_status(PurpleConnection *gc, UPDCLS update_class);
 void qq_process_change_status(guint8 *data, gint data_len, PurpleConnection *gc);
 void qq_process_buddy_change_status(guint8 *data, gint data_len, PurpleConnection *gc);
 
 void qq_update_buddyies_status(PurpleConnection *gc);
-void qq_update_buddy_status(PurpleConnection *gc, guint32 uid, guint8 status, guint8 flag);
+void qq_update_buddy_status(PurpleConnection *gc, UID uid, guint8 status, guint8 flag);
 void qq_buddy_data_free_all(PurpleConnection *gc);
 #endif
--- a/libpurple/protocols/qq/buddy_memo.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/qq/buddy_memo.c	Sat Feb 12 04:17:09 2011 +0900
@@ -83,7 +83,7 @@
 
 typedef struct _modify_memo_request {
 	PurpleConnection *gc;
-	guint32 bd_uid;
+	UID bd_uid;
 	gchar **segments;
 } modify_memo_request;
 
@@ -107,7 +107,7 @@
 	purple_debug_info("QQ", "memo freed\n");
 }
 
-static void update_buddy_memo(PurpleConnection *gc, guint32 bd_uid, gchar *alias)
+static void update_buddy_memo(PurpleConnection *gc, UID bd_uid, gchar *alias)
 {
 	PurpleAccount *account;
 	PurpleBuddy *buddy;
@@ -127,7 +127,7 @@
 	purple_blist_alias_buddy(buddy, (const char*)alias);
 }
 
-static void request_change_memo(PurpleConnection *gc, guint32 bd_uid, gchar **segments)
+static void request_change_memo(PurpleConnection *gc, UID bd_uid, gchar **segments)
 {
 	gint bytes;
 	/* Attention, length of each segment must be guint8(0~255),
@@ -170,7 +170,7 @@
 static void memo_modify_ok_cb(modify_memo_request *memo_request, PurpleRequestFields *fields)
 {
 	PurpleConnection *gc;
-	guint32 bd_uid;
+	UID bd_uid;
 	gchar **segments;
 	const gchar *utf8_str;
 	gchar *value = NULL;
@@ -187,7 +187,7 @@
 		utf8_str = purple_request_fields_get_string(fields, memo_id[index]);
 		/* update alias */
 		if (QQ_MEMO_ALIAS == index) {
-			update_buddy_memo(gc, bd_uid, segments[QQ_MEMO_ALIAS]);
+			update_buddy_memo(gc, (UID)bd_uid, segments[QQ_MEMO_ALIAS]);
 		}
 		if (NULL == utf8_str) {
 			value = g_strdup("");
@@ -213,7 +213,7 @@
 }
 
 /* memo modify dialogue */
-static void memo_modify_dialogue(PurpleConnection *gc, guint32 bd_uid, gchar **segments, guint32 action)
+static void memo_modify_dialogue(PurpleConnection *gc, UID bd_uid, gchar **segments, guint32 action)
 {
 	modify_memo_request *memo_request;
 	PurpleRequestField *field;
@@ -272,7 +272,7 @@
 	}
 }
 
-static void qq_create_buddy_memo(PurpleConnection *gc, guint32 bd_uid, guint32 action)
+static void qq_create_buddy_memo(PurpleConnection *gc, UID bd_uid, guint32 action)
 {
 	gchar **segments;
 	gint index;
@@ -285,9 +285,11 @@
 	memo_modify_dialogue(gc, bd_uid, segments, action);
 }
 
-/* process reply to get_memo packet */
+/* process reply to get_memo packet
+ * here, update_class will be regarded as buddy's uid. because some 
+ * memo packages returned without uid, which will make us confused */
 void qq_process_get_buddy_memo(PurpleConnection *gc, guint8* data, gint data_len,
-		guint32 update_class, guint32 action)
+		UPDCLS update_class, guint32 action)
 {
 	gchar **segments;
 	gint bytes;
@@ -314,7 +316,9 @@
 	if (1 == data_len) { /* only one byte */
 		purple_debug_info("QQ", "memo packet contains no buddy uid and memo...\n");
 		if (QQ_BUDDY_MEMO_MODIFY == action) {
-			qq_create_buddy_memo(gc, (guint32)update_class, QQ_BUDDY_MEMO_MODIFY);
+			UID mod_uid;
+			mod_uid = (UID)update_class;
+			qq_create_buddy_memo(gc, mod_uid, QQ_BUDDY_MEMO_MODIFY);
 			return;
 		}
 		return;
@@ -354,9 +358,9 @@
 			}
 
 			/* common action, update buddy memo */
-			update_buddy_memo(gc, rcv_uid, segments[QQ_MEMO_ALIAS]);
+			update_buddy_memo(gc, (UID)rcv_uid, segments[QQ_MEMO_ALIAS]);
 
-			/* memo is thing that we regard our buddy as, so we need one more buddy_uid */
+			/* memo is a thing that we regard our buddy as, so we need one more buddy_uid */
 			memo_modify_dialogue(gc, rcv_uid, segments, action);
 			break;
 		default:
@@ -365,8 +369,12 @@
 	}
 }
 
-/* request buddy memo */
-void qq_request_buddy_memo(PurpleConnection *gc, guint32 bd_uid, guint32 update_class, guint32 action)
+/* request buddy memo
+ *
+ * param: gc, uid, update_class, action
+ * here, update_class will be set to buddy's uid. because some memo 
+ * packages returned without uid, which will make us confused */
+void qq_request_buddy_memo(PurpleConnection *gc, UID bd_uid, UPDCLS update_class, guint32 action)
 {
 	guint8 raw_data[16] = {0};
 	gint bytes;
--- a/libpurple/protocols/qq/buddy_memo.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/qq/buddy_memo.h	Sat Feb 12 04:17:09 2011 +0900
@@ -28,21 +28,22 @@
 #include <glib.h>
 #include "connection.h"
 #include "blist.h"
+#include "qq.h"
 
 #define QQ_BUDDY_MEMO_REQUEST_SUCCESS 0x00
 
 /* clan command for memo */
 enum
-{ 
+{
 	QQ_BUDDY_MEMO_MODIFY = 0x01,	/* upload memo */
 	QQ_BUDDY_MEMO_REMOVE,		/* remove memo */
 	QQ_BUDDY_MEMO_GET		/* get memo */
 };
 
 
-void qq_process_get_buddy_memo(PurpleConnection *gc, guint8* data, gint data_len, guint32 update_class, guint32 action);
+void qq_process_get_buddy_memo(PurpleConnection *gc, guint8* data, gint data_len, UPDCLS update_class, guint32 action);
 
-void qq_request_buddy_memo(PurpleConnection *gc, guint32 bd_uid, guint32 update_class, guint32 action);
+void qq_request_buddy_memo(PurpleConnection *gc, UID bd_uid, UPDCLS update_class, guint32 action);
 
 #endif
 
--- a/libpurple/protocols/qq/buddy_opt.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/qq/buddy_opt.c	Sat Feb 12 04:17:09 2011 +0900
@@ -51,12 +51,12 @@
 
 typedef struct _qq_buddy_req {
 	PurpleConnection *gc;
-	guint32 uid;
+	UID uid;
 	guint8 *auth;
 	guint8 auth_len;
 } qq_buddy_req;
 
-void add_buddy_authorize_input(PurpleConnection *gc, guint32 uid,
+void add_buddy_authorize_input(PurpleConnection *gc, UID uid,
 		guint8 *auth, guint8 auth_len);
 
 static void buddy_req_free(qq_buddy_req *add_req)
@@ -88,7 +88,7 @@
 	return g;
 }
 
-static qq_buddy_data *qq_buddy_data_new(guint32 uid)
+static qq_buddy_data *qq_buddy_data_new(UID uid)
 {
 	qq_buddy_data *bd = g_new0(qq_buddy_data, 1);
 	memset(bd, 0, sizeof(qq_buddy_data));
@@ -97,7 +97,7 @@
 	return bd;
 }
 
-qq_buddy_data *qq_buddy_data_find(PurpleConnection *gc, guint32 uid)
+qq_buddy_data *qq_buddy_data_find(PurpleConnection *gc, UID uid)
 {
 	gchar *who;
 	PurpleBuddy *buddy;
@@ -114,7 +114,7 @@
 		purple_debug_error("QQ", "Can not find purple buddy of %u\n", uid);
 		return NULL;
 	}
-	
+
 	if ((bd = purple_buddy_get_protocol_data(buddy)) == NULL) {
 		purple_debug_error("QQ", "Can not find buddy data of %u\n", uid);
 		return NULL;
@@ -131,7 +131,7 @@
 }
 
 /* create purple buddy without data and display with no-auth icon */
-PurpleBuddy *qq_buddy_new(PurpleConnection *gc, guint32 uid)
+PurpleBuddy *qq_buddy_new(PurpleConnection *gc, UID uid)
 {
 	PurpleBuddy *buddy;
 	PurpleGroup *group;
@@ -175,7 +175,7 @@
 	purple_blist_remove_buddy(buddy);
 }
 
-PurpleBuddy *qq_buddy_find(PurpleConnection *gc, guint32 uid)
+PurpleBuddy *qq_buddy_find(PurpleConnection *gc, UID uid)
 {
 	PurpleBuddy *buddy;
 	gchar *who;
@@ -188,7 +188,7 @@
 	return buddy;
 }
 
-PurpleBuddy *qq_buddy_find_or_new(PurpleConnection *gc, guint32 uid)
+PurpleBuddy *qq_buddy_find_or_new(PurpleConnection *gc, UID uid)
 {
 	PurpleBuddy *buddy;
 	qq_buddy_data *bd;
@@ -213,7 +213,7 @@
 }
 
 /* send packet to remove a buddy from my buddy list */
-static void request_remove_buddy(PurpleConnection *gc, guint32 uid)
+static void request_remove_buddy(PurpleConnection *gc, UID uid)
 {
 	gchar uid_str[11];
 	gint bytes;
@@ -226,7 +226,7 @@
 }
 
 static void request_remove_buddy_ex(PurpleConnection *gc,
-		guint32 uid, guint8 *auth, guint8 auth_len)
+		UID uid, guint8 *auth, guint8 auth_len)
 {
 	gint bytes;
 	guint8 *raw_data;
@@ -246,7 +246,7 @@
 	qq_send_cmd_mess(gc, QQ_CMD_REMOVE_BUDDY, raw_data, bytes, 0, uid);
 }
 
-void qq_request_auth_code(PurpleConnection *gc, guint8 cmd, guint16 sub_cmd, guint32 uid)
+void qq_request_auth_code(PurpleConnection *gc, guint8 cmd, guint16 sub_cmd, UID uid)
 {
 	guint8 raw_data[16];
 	gint bytes;
@@ -260,7 +260,7 @@
 	qq_send_cmd_mess(gc, QQ_CMD_AUTH_CODE, raw_data, bytes, 0, uid);
 }
 
-void qq_process_auth_code(PurpleConnection *gc, guint8 *data, gint data_len, guint32 uid)
+void qq_process_auth_code(PurpleConnection *gc, guint8 *data, gint data_len, UID uid)
 {
 	gint bytes;
 	guint8 cmd, reply;
@@ -308,7 +308,7 @@
 	buddy_req_free(add_req);
 }
 
-static void add_buddy_question_input(PurpleConnection *gc, guint32 uid, gchar *question)
+static void add_buddy_question_input(PurpleConnection *gc, UID uid, gchar *question)
 {
 	gchar *who, *msg;
 	qq_buddy_req *add_req;
@@ -336,7 +336,7 @@
 }
 
 void qq_request_question(PurpleConnection *gc,
-		guint8 cmd, guint32 uid, const gchar *question_utf8, const gchar *answer_utf8)
+		guint8 cmd, UID uid, const gchar *question_utf8, const gchar *answer_utf8)
 {
 	guint8 raw_data[MAX_PACKET_SIZE - 16];
 	gint bytes;
@@ -371,7 +371,7 @@
 	return;
 }
 
-static void request_add_buddy_by_question(PurpleConnection *gc, guint32 uid,
+static void request_add_buddy_by_question(PurpleConnection *gc, UID uid,
 	guint8 *code, guint16 code_len)
 {
 	guint8 raw_data[MAX_PACKET_SIZE - 16];
@@ -395,7 +395,7 @@
 	qq_send_cmd(gc, QQ_CMD_ADD_BUDDY_AUTH_EX, raw_data, bytes);
 }
 
-void qq_process_question(PurpleConnection *gc, guint8 *data, gint data_len, guint32 uid)
+void qq_process_question(PurpleConnection *gc, guint8 *data, gint data_len, UID uid)
 {
 	gint bytes;
 	guint8 cmd, reply;
@@ -461,7 +461,7 @@
 }
 
 /* try to remove myself from someone's buddy list */
-static void request_buddy_remove_me(PurpleConnection *gc, guint32 uid)
+static void request_buddy_remove_me(PurpleConnection *gc, UID uid)
 {
 	guint8 raw_data[16] = {0};
 	gint bytes = 0;
@@ -474,7 +474,7 @@
 }
 
 /* try to add a buddy without authentication */
-static void request_add_buddy_no_auth(PurpleConnection *gc, guint32 uid)
+static void request_add_buddy_no_auth(PurpleConnection *gc, UID uid)
 {
 	gchar uid_str[11];
 
@@ -486,7 +486,7 @@
 			(guint8 *) uid_str, strlen(uid_str), 0, uid);
 }
 
-static void request_add_buddy_no_auth_ex(PurpleConnection *gc, guint32 uid)
+static void request_add_buddy_no_auth_ex(PurpleConnection *gc, UID uid)
 {
 	guint bytes;
 	guint8 raw_data[16];
@@ -499,7 +499,7 @@
 }
 
 /* this buddy needs authentication, text conversion is done at lowest level */
-static void request_add_buddy_auth(PurpleConnection *gc, guint32 uid, const gchar response, const gchar *text)
+static void request_add_buddy_auth(PurpleConnection *gc, UID uid, const gchar response, const gchar *text)
 {
 	guint8 raw_data[MAX_PACKET_SIZE - 16];
 	gint bytes;
@@ -526,7 +526,7 @@
 	qq_send_cmd(gc, QQ_CMD_ADD_BUDDY_AUTH, raw_data, bytes);
 }
 
-static void request_add_buddy_auth_ex(PurpleConnection *gc, guint32 uid,
+static void request_add_buddy_auth_ex(PurpleConnection *gc, UID uid,
 	const gchar *text, guint8 *auth, guint8 auth_len)
 {
 	guint8 raw_data[MAX_PACKET_SIZE - 16];
@@ -643,7 +643,7 @@
 	buddy_req_free(add_req);
 }
 
-void add_buddy_authorize_input(PurpleConnection *gc, guint32 uid,
+void add_buddy_authorize_input(PurpleConnection *gc, UID uid,
 		guint8 *auth, guint8 auth_len)
 {
 	gchar *who, *msg;
@@ -683,7 +683,7 @@
 void qq_add_buddy(PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *group)
 {
 	qq_data *qd;
-	guint32 uid;
+	UID uid;
 
 	g_return_if_fail(NULL != gc && NULL != gc->proto_data);
 	g_return_if_fail(buddy != NULL);
@@ -733,7 +733,7 @@
 }
 
 /* process the server reply for my request to remove a buddy */
-void qq_process_remove_buddy(PurpleConnection *gc, guint8 *data, gint data_len, guint32 uid)
+void qq_process_remove_buddy(PurpleConnection *gc, guint8 *data, gint data_len, UID uid)
 {
 	PurpleBuddy *buddy = NULL;
 	gchar *msg;
@@ -756,7 +756,7 @@
 }
 
 /* process the server reply for my request to remove myself from a buddy */
-void qq_process_buddy_remove_me(PurpleConnection *gc, guint8 *data, gint data_len, guint32 uid)
+void qq_process_buddy_remove_me(PurpleConnection *gc, guint8 *data, gint data_len, UID uid)
 {
 	gchar *msg;
 
@@ -772,7 +772,7 @@
 }
 
 void qq_process_add_buddy_no_auth(PurpleConnection *gc,
-		guint8 *data, gint data_len, guint32 uid)
+		guint8 *data, gint data_len, UID uid)
 {
 	qq_data *qd;
 	gchar **segments;
@@ -834,11 +834,11 @@
 }
 
 void qq_process_add_buddy_no_auth_ex(PurpleConnection *gc,
-		guint8 *data, gint data_len, guint32 uid)
+		guint8 *data, gint data_len, UID uid)
 {
 	qq_data *qd;
 	gint bytes;
-	guint32 dest_uid;
+	UID dest_uid;
 	guint8 reply;
 	guint8 auth_type;
 
@@ -903,7 +903,7 @@
 {
 	qq_data *qd;
 	qq_buddy_data *bd;
-	guint32 uid;
+	UID uid;
 
 	g_return_if_fail(gc != NULL && gc->proto_data != NULL);
 	g_return_if_fail(buddy != NULL);
@@ -933,7 +933,7 @@
 	 * otherwise purple segmentation fault */
 }
 
-static void buddy_add_input(PurpleConnection *gc, guint32 uid, gchar *reason)
+static void buddy_add_input(PurpleConnection *gc, UID uid, gchar *reason)
 {
 	PurpleAccount *account = purple_connection_get_account(gc);
 	qq_buddy_req *add_req;
@@ -967,7 +967,7 @@
 static void server_buddy_add_request(PurpleConnection *gc, gchar *from, gchar *to,
 		guint8 *data, gint data_len)
 {
-	guint32 uid;
+	UID uid;
 	gchar *msg, *reason;
 
 	g_return_if_fail(from != NULL && to != NULL);
@@ -996,7 +996,7 @@
 	gint bytes;
 	guint8 cmd;
 	guint8 reply;
-	guint32 uid;
+	UID uid;
 	guint16 flag1, flag2;
 
 	g_return_if_fail(data != NULL && data_len >= 5);
@@ -1026,7 +1026,7 @@
 {
 	guint8 *raw_data;
 	gint bytes;
-	guint32 uid;
+	UID uid;
 
 	g_return_if_fail(code != NULL && code_len > 0 && from != NULL);
 
@@ -1073,7 +1073,7 @@
 		guint8 *data, gint data_len)
 {
 	gint bytes;
-	guint32 uid;
+	UID uid;
 	gchar *msg;
 	guint8 allow_reverse;
 
@@ -1103,7 +1103,7 @@
 {
 	PurpleAccount *account = purple_connection_get_account(gc);
 	PurpleBuddy *buddy;
-	guint32 uid;
+	UID uid;
 	qq_buddy_req *add_req;
 	gchar *who;
 	gchar *primary;
@@ -1177,7 +1177,7 @@
 {
 	PurpleAccount *account = purple_connection_get_account(gc);
 	qq_data *qd;
-	guint32 uid;
+	UID uid;
 
 	g_return_if_fail(from != NULL && to != NULL);
 
@@ -1204,7 +1204,7 @@
 static void server_buddy_rejected_me(PurpleConnection *gc, gchar *from, gchar *to,
 		guint8 *data, gint data_len)
 {
-	guint32 uid;
+	UID uid;
 	PurpleBuddy *buddy;
 	gchar *msg, *msg_utf8;
 	gint bytes;
--- a/libpurple/protocols/qq/buddy_opt.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/qq/buddy_opt.h	Sat Feb 12 04:17:09 2011 +0900
@@ -54,31 +54,31 @@
 void qq_remove_buddy_and_me(PurpleBlistNode * node);
 void qq_remove_buddy(PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *group);
 
-void qq_process_remove_buddy(PurpleConnection *gc, guint8 *data, gint data_len, guint32 uid);
-void qq_process_buddy_remove_me(PurpleConnection *gc, guint8 *data, gint data_len, guint32 uid);
+void qq_process_remove_buddy(PurpleConnection *gc, guint8 *data, gint data_len, UID uid);
+void qq_process_buddy_remove_me(PurpleConnection *gc, guint8 *data, gint data_len, UID uid);
 void qq_process_add_buddy_no_auth(PurpleConnection *gc,
-		guint8 *data, gint data_len, guint32 uid);
+		guint8 *data, gint data_len, UID uid);
 void qq_process_add_buddy_no_auth_ex(PurpleConnection *gc,
-		guint8 *data, gint data_len, guint32 uid);
+		guint8 *data, gint data_len, UID uid);
 void qq_process_add_buddy_auth(guint8 *data, gint data_len, PurpleConnection *gc);
 void qq_process_buddy_from_server(PurpleConnection *gc, int funct,
 		gchar *from, gchar *to, guint8 *data, gint data_len);
 
 void qq_process_buddy_check_code(PurpleConnection *gc, guint8 *data, gint data_len);
 
-void qq_request_auth_code(PurpleConnection *gc, guint8 cmd, guint16 sub_cmd, guint32 uid);
-void qq_process_auth_code(PurpleConnection *gc, guint8 *data, gint data_len, guint32 uid);
+void qq_request_auth_code(PurpleConnection *gc, guint8 cmd, guint16 sub_cmd, UID uid);
+void qq_process_auth_code(PurpleConnection *gc, guint8 *data, gint data_len, UID uid);
 void qq_request_question(PurpleConnection *gc,
-		guint8 cmd, guint32 uid, const gchar *question_utf8, const gchar *answer_utf8);
-void qq_process_question(PurpleConnection *gc, guint8 *data, gint data_len, guint32 uid);
+		guint8 cmd, UID uid, const gchar *question_utf8, const gchar *answer_utf8);
+void qq_process_question(PurpleConnection *gc, guint8 *data, gint data_len, UID uid);
 
 void qq_process_add_buddy_auth_ex(PurpleConnection *gc, guint8 *data, gint data_len, guint32 ship32);
 
-qq_buddy_data *qq_buddy_data_find(PurpleConnection *gc, guint32 uid);
+qq_buddy_data *qq_buddy_data_find(PurpleConnection *gc, UID uid);
 void qq_buddy_data_free(qq_buddy_data *bd);
 
-PurpleBuddy *qq_buddy_new(PurpleConnection *gc, guint32 uid);
-PurpleBuddy *qq_buddy_find_or_new(PurpleConnection *gc, guint32 uid);
-PurpleBuddy *qq_buddy_find(PurpleConnection *gc, guint32 uid);
+PurpleBuddy *qq_buddy_new(PurpleConnection *gc, UID uid);
+PurpleBuddy *qq_buddy_find_or_new(PurpleConnection *gc, UID uid);
+PurpleBuddy *qq_buddy_find(PurpleConnection *gc, UID uid);
 PurpleGroup *qq_group_find_or_new(const gchar *group_name);
 #endif
--- a/libpurple/protocols/qq/file_trans.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/qq/file_trans.c	Sat Feb 12 04:17:09 2011 +0900
@@ -38,14 +38,12 @@
 #include "send_file.h"
 #include "utils.h"
 
-struct _qq_file_header {
+typedef struct _qq_file_header {
 	guint16 client_ver;
 	guint8 file_key;
-	guint32 sender_uid;
-	guint32 receiver_uid;
-};
-
-typedef struct _qq_file_header qq_file_header;
+	UID sender_uid;
+	UID receiver_uid;
+} qq_file_header;
 
 static guint32 _get_file_key(guint8 seed)
 {
@@ -62,12 +60,12 @@
 	return _get_file_key(seed);
 }
 
-static guint32 _decrypt_qq_uid(guint32 uid, guint32 key)
+static guint32 _decrypt_qq_uid(UID uid, guint32 key)
 {
 	return ~(uid ^ key);
 }
 
-static guint32 _encrypt_qq_uid(guint32 uid, guint32 key)
+static guint32 _encrypt_qq_uid(UID uid, guint32 key)
 {
 	return (~uid) ^ key;
 }
@@ -232,7 +230,7 @@
 }
 #endif
 
-static gint _qq_send_file(PurpleConnection *gc, guint8 *data, gint len, guint16 packet_type, guint32 to_uid)
+static gint _qq_send_file(PurpleConnection *gc, guint8 *data, gint len, guint16 packet_type, UID to_uid)
 {
 	guint8 *raw_data;
 	gint bytes = 0;
@@ -259,7 +257,7 @@
 }
 
 /* send a file to udp channel with QQ_FILE_CONTROL_PACKET_TAG */
-void qq_send_file_ctl_packet(PurpleConnection *gc, guint16 packet_type, guint32 to_uid, guint8 hellobyte)
+void qq_send_file_ctl_packet(PurpleConnection *gc, guint16 packet_type, UID to_uid, guint8 hellobyte)
 {
 	qq_data *qd;
 	gint bytes, bytes_expected, encrypted_len;
--- a/libpurple/protocols/qq/file_trans.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/qq/file_trans.h	Sat Feb 12 04:17:09 2011 +0900
@@ -26,6 +26,7 @@
 #define _QQ_QQ_FILE_TRANS_H_
 
 #include "server.h"
+#include "qq.h"
 
 enum {
 	QQ_FILE_CMD_SENDER_SAY_HELLO = 0x31,
@@ -59,7 +60,7 @@
 #define QQ_FILE_AGENT_PACKET_TAG 0x04
 /* #define QQ_PACKET_TAIL          0x03 */   /* all QQ text packets end with it */
 
-void qq_send_file_ctl_packet(PurpleConnection *gc, guint16 packet_type, guint32 to_uid, guint8 hellobyte);
+void qq_send_file_ctl_packet(PurpleConnection *gc, guint16 packet_type, UID to_uid, guint8 hellobyte);
 void qq_process_recv_file(PurpleConnection *gc, guint8 *data, gint len);
 /* void qq_send_file_data_packet(PurpleConnection *gc, guint16 packet_type, guint8 sub_type, guint32 fragment_index, guint16 seq, guint8 *data, gint len); */
 void qq_xfer_close_file(PurpleXfer *xfer);
--- a/libpurple/protocols/qq/group.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/qq/group.h	Sat Feb 12 04:17:09 2011 +0900
@@ -40,14 +40,13 @@
 	QQ_ROOM_ROLE_ADMIN
 } qq_room_role;
 
-typedef struct _qq_room_data qq_room_data;
-struct _qq_room_data {
+typedef struct _qq_room_data {
 	/* all these will be saved when we exit Purple */
 	qq_room_role my_role;	/* my role for this room */
 	guint32 id;
 	guint32 ext_id;
 	guint8 type8;			/* permanent or temporory */
-	guint32 creator_uid;
+	UID creator_uid;
 	guint32 category;
 	guint8 auth_type;
 	gchar *title_utf8;
@@ -57,7 +56,7 @@
 
 	gboolean is_got_buddies;
 	GList *members;
-};
+} qq_room_data;
 
 GList *qq_chat_info(PurpleConnection *gc);
 GHashTable *qq_chat_info_defaults(PurpleConnection *gc, const gchar *chat_name);
--- a/libpurple/protocols/qq/group_im.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/qq/group_im.c	Sat Feb 12 04:17:09 2011 +0900
@@ -161,7 +161,7 @@
 }
 
 void qq_room_got_chat_in(PurpleConnection *gc,
-		guint32 room_id, guint32 uid_from, const gchar *msg, time_t in_time)
+		guint32 room_id, UID uid_from, const gchar *msg, time_t in_time)
 {
 	PurpleConversation *conv;
 	qq_data *qd;
@@ -207,10 +207,11 @@
 {
 	gchar *msg_smiley, *msg_fmt, *msg_utf8;
 	gint bytes, tail_len;
+	qq_data *qd;
 	struct {
 		guint32 ext_id;
 		guint8 type8;
-		guint32 member_uid;
+		UID member_uid;
 		guint16 unknown;
 		guint16 msg_seq;
 		time_t send_time;
@@ -222,11 +223,15 @@
 	guint16 content_type;
 	guint8 frag_count, frag_index;
 	guint16 msg_id;
+	guint32 use_default_font;
 	qq_im_format *fmt = NULL;
+	qd = (qq_data *) gc->proto_data;
 
 	/* at least include im_text.msg_len */
 	g_return_if_fail(data != NULL && data_len > 23);
 
+	use_default_font = (qd->custom) & QQ_CUSTOM_USE_DEFAULT_FONT;
+
 	/* qq_show_packet("ROOM_IM", data, data_len); */
 	memset(&im_text, 0, sizeof(im_text));
 	bytes = 0;
@@ -279,8 +284,14 @@
 	/* group im_group has no flag to indicate whether it has font_attr or not */
 	msg_smiley = qq_emoticon_to_purple(im_text.msg);
 	if (fmt != NULL) {
+		purple_debug_info("QQ", "going to use_default_font\n");
+		if (QQ_CUSTOM_USE_DEFAULT_FONT == use_default_font) {
+			qq_im_fmt_reset_font(fmt);
+			purple_debug_info("QQ", "use_default_font set\n");
+		}
 		msg_fmt = qq_im_fmt_to_purple(fmt, msg_smiley);
 		msg_utf8 =  qq_to_utf8(msg_fmt, QQ_CHARSET_DEFAULT);
+		purple_debug_info("QQ", "passed!\n");
 		g_free(msg_fmt);
 		qq_im_fmt_free(fmt);
 	} else {
--- a/libpurple/protocols/qq/group_im.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/qq/group_im.h	Sat Feb 12 04:17:09 2011 +0900
@@ -30,11 +30,16 @@
 #include "conversation.h"
 #include "group.h"
 
+enum {
+	QQ_CUSTOM_USE_DEFAULT_FONT = 0x00000001,
+	QQ_CUSTOM_NONE = 0x00000000
+};
+
 PurpleConversation *qq_room_conv_open(PurpleConnection *gc, qq_room_data *rmd);
 void qq_room_conv_set_onlines(PurpleConnection *gc, qq_room_data *rmd);
 
 void qq_room_got_chat_in(PurpleConnection *gc,
-		guint32 room_id, guint32 uid_from, const gchar *msg, time_t in_time);
+		guint32 room_id, UID uid_from, const gchar *msg, time_t in_time);
 
 int qq_chat_send(PurpleConnection *gc, int id, const char *message, PurpleMessageFlags flags);
 void qq_process_room_send_im(PurpleConnection *gc, guint8 *data, gint len);
@@ -43,3 +48,4 @@
 void qq_process_room_im(guint8 *data, gint data_len, guint32 id, PurpleConnection *gc, guint16 msg_type);
 
 #endif
+
--- a/libpurple/protocols/qq/group_info.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/qq/group_info.c	Sat Feb 12 04:17:09 2011 +0900
@@ -65,7 +65,7 @@
 }
 
 /* send packet to get info for each group member */
-gint qq_request_room_get_buddies(PurpleConnection *gc, guint32 room_id, guint32 update_class)
+gint qq_request_room_get_buddies(PurpleConnection *gc, guint32 room_id, UPDCLS update_class)
 {
 	guint8 *raw_data;
 	gint bytes, num;
@@ -177,7 +177,8 @@
 	PurpleConversation *conv;
 	guint8 organization, role;
 	guint16 unknown, max_members;
-	guint32 member_uid, id, ext_id;
+	UID member_uid;
+	guint32 id, ext_id;
 	guint32 unknown4;
 	guint8 unknown1;
 	gint bytes, num;
@@ -286,7 +287,8 @@
 
 void qq_process_room_cmd_get_onlines(guint8 *data, gint len, PurpleConnection *gc)
 {
-	guint32 room_id, member_uid;
+	guint32 room_id;
+	UID member_uid;
 	guint8 unknown;
 	gint bytes, num;
 	qq_room_data *rmd;
@@ -334,7 +336,8 @@
 {
 	gint bytes;
 	gint num;
-	guint32 id, member_uid;
+	guint32 id;
+	UID member_uid;
 	guint16 unknown;
 	qq_room_data *rmd;
 	qq_buddy_data *bd;
--- a/libpurple/protocols/qq/group_info.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/qq/group_info.h	Sat Feb 12 04:17:09 2011 +0900
@@ -34,7 +34,7 @@
 	QQ_ROOM_INFO_DISPLAY
 };
 
-gint qq_request_room_get_buddies(PurpleConnection *gc, guint32 room_id, guint32 update_class);
+gint qq_request_room_get_buddies(PurpleConnection *gc, guint32 room_id, UPDCLS update_class);
 
 void qq_process_room_cmd_get_info(guint8 *data, gint len, guint32 action, PurpleConnection *gc);
 void qq_process_room_cmd_get_onlines(guint8 *data, gint len, PurpleConnection *gc);
--- a/libpurple/protocols/qq/group_internal.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/qq/group_internal.c	Sat Feb 12 04:17:09 2011 +0900
@@ -207,7 +207,7 @@
 }
 
 /* find a qq_buddy_data by uid, called by im.c */
-qq_buddy_data *qq_room_buddy_find(qq_room_data *rmd, guint32 uid)
+qq_buddy_data *qq_room_buddy_find(qq_room_data *rmd, UID uid)
 {
 	GList *list;
 	qq_buddy_data *bd;
@@ -226,7 +226,7 @@
 }
 
 /* remove a qq_buddy_data by uid, called by qq_group_opt.c */
-void qq_room_buddy_remove(qq_room_data *rmd, guint32 uid)
+void qq_room_buddy_remove(qq_room_data *rmd, UID uid)
 {
 	GList *list;
 	qq_buddy_data *bd;
@@ -244,7 +244,7 @@
 	}
 }
 
-qq_buddy_data *qq_room_buddy_find_or_new(PurpleConnection *gc, qq_room_data *rmd, guint32 member_uid)
+qq_buddy_data *qq_room_buddy_find_or_new(PurpleConnection *gc, qq_room_data *rmd, UID member_uid)
 {
 	qq_buddy_data *member, *bd;
 	PurpleBuddy *buddy;
--- a/libpurple/protocols/qq/group_internal.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/qq/group_internal.h	Sat Feb 12 04:17:09 2011 +0900
@@ -36,9 +36,9 @@
 void qq_room_remove(PurpleConnection *gc, guint32 id);
 void qq_room_update_chat_info(PurpleChat *chat, qq_room_data *rmd);
 
-qq_buddy_data *qq_room_buddy_find(qq_room_data *rmd, guint32 uid);
-void qq_room_buddy_remove(qq_room_data *rmd, guint32 uid);
-qq_buddy_data *qq_room_buddy_find_or_new(PurpleConnection *gc, qq_room_data *rmd, guint32 member_uid);
+qq_buddy_data *qq_room_buddy_find(qq_room_data *rmd, UID uid);
+void qq_room_buddy_remove(qq_room_data *rmd, UID uid);
+qq_buddy_data *qq_room_buddy_find_or_new(PurpleConnection *gc, qq_room_data *rmd, UID member_uid);
 
 void qq_room_data_initial(PurpleConnection *gc);
 void qq_room_data_free_all(PurpleConnection *gc);
--- a/libpurple/protocols/qq/group_join.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/qq/group_join.c	Sat Feb 12 04:17:09 2011 +0900
@@ -155,7 +155,7 @@
 }
 
 void qq_send_cmd_group_auth(PurpleConnection *gc, qq_room_data *rmd,
-		guint8 opt, guint32 uid, const gchar *reason_utf8)
+		guint8 opt, UID uid, const gchar *reason_utf8)
 {
 	guint8 raw_data[MAX_PACKET_SIZE - 16];
 	gint bytes;
--- a/libpurple/protocols/qq/group_join.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/qq/group_join.h	Sat Feb 12 04:17:09 2011 +0900
@@ -49,7 +49,7 @@
 void qq_request_room_search(PurpleConnection *gc, guint32 ext_id, int action);
 void qq_process_room_search(PurpleConnection *gc, guint8 *data, gint len, guint32 ship32);
 
-void qq_send_cmd_group_auth(PurpleConnection *gc, qq_room_data *rmd, guint8 opt, guint32 uid, const gchar *reason_utf8);
+void qq_send_cmd_group_auth(PurpleConnection *gc, qq_room_data *rmd, guint8 opt, UID uid, const gchar *reason_utf8);
 void qq_group_join(PurpleConnection *gc, GHashTable *data);
 void qq_request_room_join(PurpleConnection *gc, qq_room_data *rmd);
 void qq_room_quit(PurpleConnection *gc, guint32 room_id);
@@ -57,3 +57,4 @@
 void qq_process_group_cmd_join_group_auth(guint8 *data, gint len, PurpleConnection *gc);
 void qq_process_group_cmd_join_group(guint8 *data, gint len, PurpleConnection *gc);
 #endif
+
--- a/libpurple/protocols/qq/im.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/qq/im.c	Sat Feb 12 04:17:09 2011 +0900
@@ -67,15 +67,14 @@
 	QQ_NORMAL_IM_FILE_EX_NOTIFY_IP = 0x87
 };
 
-typedef struct _qq_im_header qq_im_header;
-struct _qq_im_header {
+typedef struct _qq_im_header {
 	/* this is the common part of normal_text */
 	guint16 version_from;
-	guint32 uid_from;
-	guint32 uid_to;
+	UID uid_from;
+	UID uid_to;
 	guint8 session_md5[QQ_KEY_LENGTH];
 	guint16 im_type;
-};
+} qq_im_header;
 
 /* read the common parts of the normal_im,
  * returns the bytes read if succeed, or -1 if there is any error */
@@ -93,11 +92,10 @@
 	return bytes;
 }
 
-typedef struct _qq_emoticon qq_emoticon;
-struct _qq_emoticon {
+typedef struct _qq_emoticon {
 	guint8 symbol;
 	gchar *name;
-};
+} qq_emoticon;
 
 static gboolean emoticons_is_sorted = FALSE;
 /* Map for purple smiley convert to qq, need qsort */
@@ -528,7 +526,8 @@
 qq_im_format *qq_im_fmt_new(void)
 {
 	qq_im_format *fmt;
-	const gchar simsun[] = { 0xcb, 0xce, 0xcc, 0xe5, 0};	/* simsun in Chinese */
+	/* '0xcb, 0xce, 0xcc, 0xe5' means Chinese '宋体' in utf8 */
+	const gchar simsun[] = { 0xcb, 0xce, 0xcc, 0xe5, 0};
 
 	fmt = g_new0(qq_im_format, 1);
 	memset(fmt, 0, sizeof(qq_im_format));
@@ -541,6 +540,17 @@
 	return fmt;
 }
 
+void qq_im_fmt_reset_font(qq_im_format *fmt)
+{
+	const gchar simsun[] = {0xcb, 0xce, 0xcc, 0xe5, 0x00};
+	g_return_if_fail(NULL != fmt);
+
+	if (NULL != fmt->font) {
+		g_free(fmt->font);
+		fmt->font = g_strdup(simsun);
+	}
+}
+
 qq_im_format *qq_im_fmt_new_by_purple(const gchar *msg)
 {
 	qq_im_format *fmt;
@@ -1036,7 +1046,7 @@
 }
 
 /* send an IM to uid_to */
-static void request_send_im(PurpleConnection *gc, guint32 uid_to, gint type,
+static void request_send_im(PurpleConnection *gc, UID uid_to, gint type,
 	qq_im_format *fmt, gchar *msg, guint8 id, guint8 frag_count, guint8 frag_index)
 {
 	qq_data *qd;
@@ -1241,7 +1251,7 @@
 gint qq_send_im(PurpleConnection *gc, const gchar *who, const gchar *what, PurpleMessageFlags flags)
 {
 	qq_data *qd;
-	guint32 uid_to;
+	UID uid_to;
 	gint type;
 	qq_im_format *fmt;
 	gchar *msg_stripped, *tmp;
--- a/libpurple/protocols/qq/im.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/qq/im.h	Sat Feb 12 04:17:09 2011 +0900
@@ -49,6 +49,10 @@
 };
 
 typedef struct {
+	/* attr:
+		bit0-4 for font size, bit5 for bold,
+		bit6 for italic, bit7 for underline
+	*/
 	guint8 attr;
 	guint8 rgb[3];
 	guint16 charset;
@@ -61,6 +65,7 @@
 
 qq_im_format *qq_im_fmt_new(void);
 void qq_im_fmt_free(qq_im_format *fmt);
+void qq_im_fmt_reset_font(qq_im_format *fmt);
 qq_im_format *qq_im_fmt_new_by_purple(const gchar *msg);
 gchar *qq_im_fmt_to_purple(qq_im_format *fmt, gchar *text);
 gboolean qq_im_smiley_none(const gchar *msg);
--- a/libpurple/protocols/qq/packet_parse.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/qq/packet_parse.h	Sat Feb 12 04:17:09 2011 +0900
@@ -30,7 +30,7 @@
 
 /* According to "UNIX Network Programming", all TCP/IP implementations
  * must support a minimum IP datagram size of 576 bytes, regardless of the MTU.
- * Assuming a 20 byte IP header and 8 byte UDP header, this leaves 548 bytes 
+ * Assuming a 20 byte IP header and 8 byte UDP header, this leaves 548 bytes
  * as a safe maximum size for UDP messages.
  *
  * TCP allows packet 64K
--- a/libpurple/protocols/qq/qq.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/qq/qq.c	Sat Feb 12 04:17:09 2011 +0900
@@ -57,7 +57,7 @@
 #include "utils.h"
 #include "version.h"
 
-#define OPENQ_VERSION 		"0.3.2-p20" 
+#define OPENQ_VERSION 		"0.3.2-p20"
 
 static GList *server_list_build(gchar select)
 {
@@ -157,15 +157,15 @@
 	purple_debug_info("QQ", "Server list has %d\n", g_list_length(qd->servers));
 
 	version_str = purple_account_get_string(account, "client_version", NULL);
-	qd->client_tag = QQ_CLIENT_0D55;	/* set default as QQ2005 */
-	qd->client_version = 2005;
+	qd->client_tag = QQ_CLIENT_115B;	/* set default as QQ2008 */
+	qd->client_version = 2008;
 	if (version_str != NULL && strlen(version_str) != 0) {
-		if (strcmp(version_str, "qq2007") == 0) {
+		if (strcmp(version_str, "qq2005") == 0) {
+			qd->client_tag = QQ_CLIENT_0D55;
+			qd->client_version = 2005;
+		} else if (strcmp(version_str, "qq2007") == 0) {
 			qd->client_tag = QQ_CLIENT_111D;
 			qd->client_version = 2007;
-		} else if (strcmp(version_str, "qq2008") == 0) {
-			qd->client_tag = QQ_CLIENT_115B;
-			qd->client_version = 2008;
 		}
 	}
 
@@ -173,6 +173,13 @@
 	qd->is_show_news = purple_account_get_bool(account, "show_news", TRUE);
 	qd->is_show_chat = purple_account_get_bool(account, "show_chat", TRUE);
 
+	if (purple_account_get_bool(account, "default_font", FALSE)) {
+		qd->custom = QQ_CUSTOM_USE_DEFAULT_FONT;
+	}
+	else {
+		qd->custom = QQ_CUSTOM_NONE;
+	}
+
 	qd->resend_times = purple_prefs_get_int("/plugins/prpl/qq/resend_times");
 	if (qd->resend_times <= 1) qd->itv_config.resend = 4;
 
@@ -443,7 +450,7 @@
 /* send packet to get who's detailed information */
 static void qq_show_buddy_info(PurpleConnection *gc, const gchar *who)
 {
-	guint32 uid;
+	UID uid;
 	qq_data *qd;
 
 	qd = gc->proto_data;
@@ -823,7 +830,7 @@
 	PurpleBuddy *buddy;
 	qq_buddy_data *bd;
 	PurpleConnection *gc;
-	guint32 bd_uid;
+	UID bd_uid;
 
 	g_return_if_fail(PURPLE_BLIST_NODE_IS_BUDDY(node));
 
@@ -927,7 +934,7 @@
 {
 	qq_data *qd;
 	gchar *uid_str;
-	guint32 uid;
+	UID uid;
 
 	purple_debug_info("QQ", "Get chat buddy info of %s\n", who);
 	g_return_if_fail(who != NULL);
@@ -1113,8 +1120,8 @@
 	prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option);
 
 	kvp = g_new0(PurpleKeyValuePair, 1);
-	kvp->key = g_strdup(_("QQ2005"));
-	kvp->value = g_strdup("qq2005");
+	kvp->key = g_strdup(_("QQ2008"));
+	kvp->value = g_strdup("qq2008");
 	version_kv_list = g_list_append(version_kv_list, kvp);
 
 	kvp = g_new0(PurpleKeyValuePair, 1);
@@ -1123,8 +1130,8 @@
 	version_kv_list = g_list_append(version_kv_list, kvp);
 
 	kvp = g_new0(PurpleKeyValuePair, 1);
-	kvp->key = g_strdup(_("QQ2008"));
-	kvp->value = g_strdup("qq2008");
+	kvp->key = g_strdup(_("QQ2005"));
+	kvp->value = g_strdup("qq2005");
 	version_kv_list = g_list_append(version_kv_list, kvp);
 
 	option = purple_account_option_list_new(_("Client Version"), "client_version", version_kv_list);
@@ -1142,6 +1149,9 @@
 	option = purple_account_option_bool_new(_("Show chat room when msg comes"), "show_chat", TRUE);
 	prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option);
 
+	option = purple_account_option_bool_new(_("Use default font"), "default_font", FALSE);
+	prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option);
+
 	option = purple_account_option_int_new(_("Keep alive interval (seconds)"), "keep_alive_interval", 60);
 	prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option);
 
--- a/libpurple/protocols/qq/qq.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/qq/qq.h	Sat Feb 12 04:17:09 2011 +0900
@@ -39,22 +39,19 @@
 #define qq_strlen(s) ((s)!=NULL?strlen(s):0)
 #define qq_strcmp(s1,s2) ((s1)!=NULL && (s2)!=NULL?strcmp(s1,s2):0)
 
-typedef struct _qq_data qq_data;
-typedef struct _qq_buddy_data qq_buddy_data;
-typedef struct _qq_interval qq_interval;
-typedef struct _qq_net_stat qq_net_stat;
-typedef struct _qq_login_data qq_login_data;
-typedef struct _qq_captcha_data qq_captcha_data;
+/* business logic layer */
+typedef guint32 UPDCLS;
+typedef guint32 UID;
 
-struct _qq_captcha_data {
+typedef struct _qq_captcha_data {
 	guint8 *token;
 	guint16 token_len;
 	guint8 next_index;
 	guint8 *data;
 	guint16 data_len;
-};
+} qq_captcha_data;
 
-struct _qq_login_data {
+typedef struct _qq_login_data {
 	guint8 random_key[QQ_KEY_LENGTH];			/* first encrypt key generated by client */
 	guint8 *token;				/* get from server */
 	guint8 token_len;
@@ -67,24 +64,24 @@
 	guint8 *login_token;
 	guint16 login_token_len;
 	guint8 login_key[QQ_KEY_LENGTH];
-};
+} qq_login_data;
 
-struct _qq_interval {
+typedef struct _qq_interval {
 	gint resend;
 	gint keep_alive;
 	gint update;
-};
+} qq_interval;
 
-struct _qq_net_stat {
+typedef struct _qq_net_stat {
 	glong sent;
 	glong resend;
 	glong lost;
 	glong rcved;
 	glong rcved_dup;
-};
+} qq_net_stat;
 
-struct _qq_buddy_data {
-	guint32 uid;
+typedef struct _qq_buddy_data {
+	UID uid;
 	guint16 face;		/* index: 0 - 299 */
 	guint8 age;
 	guint8 gender;
@@ -104,7 +101,7 @@
 	gchar** memo;
 
 	gint8  role;		/* role in group, used only in group->members list */
-};
+} qq_buddy_data;
 
 typedef struct _qq_connection qq_connection;
 struct _qq_connection {
@@ -118,7 +115,7 @@
 	int tcp_rxlen;
 };
 
-struct _qq_data {
+typedef struct _qq_data {
 	PurpleConnection *gc;
 
 	GSList *openconns;
@@ -153,7 +150,7 @@
 
 	GList *transactions;	/* check ack packet and resend */
 
-	guint32 uid;			/* QQ number */
+	UID uid;			/* QQ number */
 
 	qq_login_data ld;
 	qq_captcha_data captcha;
@@ -187,8 +184,9 @@
 	gboolean is_show_notice;
 	gboolean is_show_news;
 	gboolean is_show_chat;
+	guint32 custom;
 
 	guint16 send_im_id;		/* send IM sequence number */
-};
+} qq_data;
 
 #endif
--- a/libpurple/protocols/qq/qq_base.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/qq/qq_base.c	Sat Feb 12 04:17:09 2011 +0900
@@ -42,7 +42,7 @@
 #include "utils.h"
 
 /* generate a md5 key using uid and session_key */
-static void get_session_md5(guint8 *session_md5, guint32 uid, guint8 *session_key)
+static void get_session_md5(guint8 *session_md5, UID uid, guint8 *session_key)
 {
 	guint8 src[QQ_KEY_LENGTH + QQ_KEY_LENGTH];
 	gint bytes = 0;
@@ -60,7 +60,7 @@
 	gint bytes;
 
 	guint8 ret;
-	guint32 uid;
+	UID uid;
 	struct in_addr ip;
 	guint16 port;
 	struct tm *tm_local;
@@ -151,7 +151,7 @@
 	gint bytes;
 	struct {
 		guint8 result;
-		guint32 uid;
+		UID uid;
 		struct in_addr new_server_ip;
 		guint16 new_server_port;
 	} packet;
@@ -1236,7 +1236,7 @@
 	qq_data *qd;
 	gint bytes;
 	guint8 ret;
-	guint32 uid;
+	UID uid;
 	gchar *error;
 	gchar *msg;
 	gchar *msg_utf8;
@@ -1427,7 +1427,7 @@
 	qq_data *qd;
 	gint bytes;
 	guint8 ret;
-	guint32 uid;
+	UID uid;
 	gchar *error;
 	gchar *msg;
 	gchar *msg_utf8;
--- a/libpurple/protocols/qq/qq_base.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/qq/qq_base.h	Sat Feb 12 04:17:09 2011 +0900
@@ -28,12 +28,12 @@
 #include <glib.h>
 #include "connection.h"
 
-#define QQ_LOGIN_REPLY_OK							0x00
+#define QQ_LOGIN_REPLY_OK				0x00
 #define QQ_LOGIN_REPLY_REDIRECT				0x01
 /* defined by myself */
 #define QQ_LOGIN_REPLY_CAPTCHA_DLG			0xfd
-#define QQ_LOGIN_REPLY_NEXT_TOKEN_EX		0xfe
-#define QQ_LOGIN_REPLY_ERR							0xff
+#define QQ_LOGIN_REPLY_NEXT_TOKEN_EX			0xfe
+#define QQ_LOGIN_REPLY_ERR				0xff
 
 #define QQ_LOGIN_MODE_NORMAL		0x0a
 #define QQ_LOGIN_MODE_AWAY	    	0x1e
@@ -76,3 +76,4 @@
 void qq_request_login_2008(PurpleConnection *gc);
 guint8 qq_process_login_2008( PurpleConnection *gc, guint8 *data, gint data_len);
 #endif
+
--- a/libpurple/protocols/qq/qq_crypt.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/qq/qq_crypt.c	Sat Feb 12 04:17:09 2011 +0900
@@ -24,7 +24,7 @@
  *
  * QQ encryption algorithm
  * Convert from ASM code provided by PerlOICQ
- * 
+ *
  * Puzzlebird, Nov-Dec 2002
  */
 
@@ -34,8 +34,8 @@
 OUT: 64  bits of data in w[0] - w[1].
 KEY: 128 bits of key  in k[0] - k[3].
 
-delta is chosen to be the real part of 
-the golden ratio: Sqrt(5/4) - 1/2 ~ 0.618034 multiplied by 2^32. 
+delta is chosen to be the real part of
+the golden ratio: Sqrt(5/4) - 1/2 ~ 0.618034 multiplied by 2^32.
 
 0x61C88647 is what we can track on the ASM codes.!!
 */
@@ -53,7 +53,7 @@
 	for (i = 0; i < bytes; i += 16) {
 		/* length label */
 		printf("%07x: ", i);
-		
+
 		/* dump hex value */
 		for (j = 0; j < 16; j++) {
 			if (j == 8) {
@@ -64,10 +64,10 @@
 			else
 				printf("   ");
 		}
-		
+
 		printf("  ");
-		
-		
+
+
 		/* dump ascii value */
 		for (j = 0; j < 16 && (i + j) < bytes; j++) {
 			ch = buffer[i + j] & 127;
@@ -87,21 +87,21 @@
 #endif
 
 /********************************************************************
- * encryption 
+ * encryption
  *******************************************************************/
 
 /* Tiny Encryption Algorithm (TEA) */
 static inline void qq_encipher(guint32 *const v, const guint32 *const k, guint32 *const w)
 {
 	register guint32
-		y = g_ntohl(v[0]), 
-		 z = g_ntohl(v[1]), 
-		 a = g_ntohl(k[0]), 
-		 b = g_ntohl(k[1]), 
-		 c = g_ntohl(k[2]), 
-		 d = g_ntohl(k[3]), 
-		 n = 0x10, 
-		 sum = 0, 
+		y = g_ntohl(v[0]),
+		 z = g_ntohl(v[1]),
+		 a = g_ntohl(k[0]),
+		 b = g_ntohl(k[1]),
+		 c = g_ntohl(k[2]),
+		 d = g_ntohl(k[3]),
+		 n = 0x10,
+		 sum = 0,
 		 delta = 0x9E3779B9;	/*  0x9E3779B9 - 0x100000000 = -0x61C88647 */
 
 	while (n-- > 0) {
@@ -117,8 +117,8 @@
 /* it can be the real random seed function */
 /* override with number, convenient for debug */
 #ifdef DEBUG
-static gint crypt_rand(void) {	
-	return 0xdead; 
+static gint crypt_rand(void) {
+	return 0xdead;
 }
 #else
 #include <stdlib.h>
@@ -126,7 +126,7 @@
 #endif
 
 /* 64-bit blocks and some kind of feedback mode of operation */
-static inline void encrypt_out(guint8 *crypted, const gint crypted_len, const guint8 *key) 
+static inline void encrypt_out(guint8 *crypted, const gint crypted_len, const guint8 *key)
 {
 	/* ships in encipher */
 	guint32 plain32[2];
@@ -134,34 +134,34 @@
 	guint32 key32[4];
 	guint32 crypted32[2];
 	guint32 c32_prev[2];
-	
+
 	guint8 *crypted_ptr;
 	gint count64;
-	
+
 	/* prepare at first */
 	crypted_ptr = crypted;
-	
+
 	memcpy(crypted32, crypted_ptr, sizeof(crypted32));
 	c32_prev[0] = crypted32[0]; c32_prev[1] = crypted32[1];
-	
+
 	p32_prev[0] = 0; p32_prev[1] = 0;
 	plain32[0] = crypted32[0] ^ p32_prev[0]; plain32[1] = crypted32[1] ^ p32_prev[1];
-	
+
 	g_memmove(key32, key, 16);
 	count64 = crypted_len / 8;
 	while (count64-- > 0){
 		/* encrypt it */
 		qq_encipher(plain32, key32, crypted32);
-		
+
 		crypted32[0] ^= p32_prev[0]; crypted32[1] ^= p32_prev[1];
-		
+
 		/* store curr 64 bits crypted */
 		g_memmove(crypted_ptr, crypted32, sizeof(crypted32));
-		
+
 		/* set prev */
 		p32_prev[0] = plain32[0]; p32_prev[1] = plain32[1];
 		c32_prev[0] = crypted32[0]; c32_prev[1] = crypted32[1];
-		
+
 		/* set next 64 bits want to crypt*/
 		if (count64 > 0) {
 			crypted_ptr += 8;
@@ -181,7 +181,7 @@
 {
 	guint8 *crypted_ptr = crypted;		/* current position of dest */
 	gint pos, padding;
-	
+
 	padding = (plain_len + 10) % 8;
 	if (padding) {
 		padding = 8 - padding;
@@ -223,20 +223,20 @@
 	return pos;
 }
 
-/******************************************************************** 
- * decryption 
+/********************************************************************
+ * decryption
  ********************************************************************/
 
 static inline void qq_decipher(guint32 *const v, const guint32 *const k, guint32 *const w)
 {
 	register guint32
-		y = g_ntohl(v[0]), 
-		z = g_ntohl(v[1]), 
-		a = g_ntohl(k[0]), 
-		b = g_ntohl(k[1]), 
-		c = g_ntohl(k[2]), 
-		d = g_ntohl(k[3]), 
-		n = 0x10, 
+		y = g_ntohl(v[0]),
+		z = g_ntohl(v[1]),
+		a = g_ntohl(k[0]),
+		b = g_ntohl(k[1]),
+		c = g_ntohl(k[2]),
+		d = g_ntohl(k[3]),
+		n = 0x10,
 		sum = 0xE3779B90,	/* why this ? must be related with n value */
 		delta = 0x9E3779B9;
 
@@ -251,7 +251,7 @@
 	w[1] = g_htonl(z);
 }
 
-static inline gint decrypt_out(guint8 *dest, gint crypted_len, const guint8* const key) 
+static inline gint decrypt_out(guint8 *dest, gint crypted_len, const guint8* const key)
 {
 	gint plain_len;
 	guint32 key32[4];
@@ -280,7 +280,7 @@
 	if( plain_len < 0 )	{
 		return -2;
 	}
-	
+
 	count64 = crypted_len / 8;
 	while (--count64 > 0){
 		c32_prev[0] = crypted32[0]; c32_prev[1] = crypted32[1];
@@ -290,7 +290,7 @@
 		p32_prev[0] ^= crypted32[0]; p32_prev[1] ^= crypted32[1];
 
 		qq_decipher(p32_prev, key32, p32_prev);
-		
+
 		plain32[0] = p32_prev[0] ^ c32_prev[0]; plain32[1] = p32_prev[1] ^ c32_prev[1];
 		memcpy(crypted_ptr, plain32, sizeof(plain32));
 	}
@@ -306,7 +306,7 @@
 	gint pos;
 
 	/* at least 16 bytes and %8 == 0 */
-	if ((crypted_len % 8) || (crypted_len < 16)) { 
+	if ((crypted_len % 8) || (crypted_len < 16)) {
 		return -1;
 	}
 
--- a/libpurple/protocols/qq/qq_crypt.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/qq/qq_crypt.h	Sat Feb 12 04:17:09 2011 +0900
@@ -28,6 +28,6 @@
 #include <glib.h>
 
 gint qq_encrypt(guint8* crypted, const guint8* const plain, const gint plain_len, const guint8* const key);
-		
+
 gint qq_decrypt(guint8 *plain, const guint8* const crypted, const gint crypted_len, const guint8* const key);
 #endif
--- a/libpurple/protocols/qq/qq_define.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/qq/qq_define.c	Sat Feb 12 04:17:09 2011 +0900
@@ -118,6 +118,8 @@
 		return "QQMac 1.0 preview1 build 670";
 	case QQ_CLIENT_1441:
 		return "QQ2009 preview2";
+	case QQ_CLIENT_1663:
+		return "QQ2009";
 	case QQ_SERVER_0100:
 		return "QQ Server 0100";
 	default:
--- a/libpurple/protocols/qq/qq_define.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/qq/qq_define.h	Sat Feb 12 04:17:09 2011 +0900
@@ -35,7 +35,9 @@
 
 #define QQ_CLIENT_0D55 0x0d55	/* QQ2005 used by openq before */
 #define QQ_CLIENT_111D 0x111D	/* QQ2007 */
-#define QQ_CLIENT_115B 0x115B	/* QQ2008 He Sui*/
+#define QQ_CLIENT_115B 0x115B	/* QQ2008 He Sui */
+#define QQ_CLIENT_1663 0x1663	/* QQ2009 Release */
+#define QQ_CLIENT_1801 0x1801	/* QQ2009 International Beta1 */
 
 const gchar *qq_get_ver_desc(gint source);
 
--- a/libpurple/protocols/qq/qq_network.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/qq/qq_network.c	Sat Feb 12 04:17:09 2011 +0900
@@ -42,11 +42,11 @@
 #define QQ_DEFAULT_PORT					8000
 
 /* set QQ_CONNECT_MAX to 1, when test reconnecting */
-#define QQ_CONNECT_MAX						3
+#define QQ_CONNECT_MAX				3
 #define QQ_CONNECT_INTERVAL			2
-#define QQ_CONNECT_CHECK					5
-#define QQ_KEEP_ALIVE_INTERVAL		60
-#define QQ_TRANS_INTERVAL				10
+#define QQ_CONNECT_CHECK			5
+#define QQ_KEEP_ALIVE_INTERVAL			60
+#define QQ_TRANS_INTERVAL			10
 
 gboolean connect_to_server(PurpleConnection *gc, gchar *server, gint port);
 
@@ -63,6 +63,7 @@
 
 static qq_connection *connection_create(qq_data *qd, int fd) {
 	qq_connection *ret = g_new0(qq_connection, 1);
+	g_return_val_if_fail(ret != NULL, NULL);
 	ret->fd = fd;
 	qd->openconns = g_slist_append(qd->openconns, ret);
 	return ret;
@@ -268,7 +269,7 @@
 	guint16 seq;		/* May be ack_seq or send_seq, depends on cmd */
 	guint8 room_cmd;
 	guint32 room_id;
-	guint32 update_class;
+	UPDCLS update_class;
 	guint32 ship32;
 	int ret;
 
@@ -772,9 +773,14 @@
 	}
 
 	/* _qq_show_socket("Got login socket", source); */
+	/* ok, already connected to the server */
 	qd->fd = source;
 	conn = connection_create(qd, source);
+	g_return_if_fail( conn != NULL );
+
 	if (qd->use_tcp) {
+		/* events which match "PURPLE_INPUT_READ" of
+		 * "source" would trigger the callback function */
 		conn->input_handler = purple_input_add(source, PURPLE_INPUT_READ, tcp_pending, gc);
 	} else {
 		conn->input_handler = purple_input_add(source, PURPLE_INPUT_READ, udp_pending, gc);
@@ -1131,7 +1137,7 @@
 /* Encrypt data with session_key, and send packet out */
 static gint send_cmd_detail(PurpleConnection *gc, guint16 cmd, guint16 seq,
 	guint8 *data, gint data_len, gboolean is_save2trans,
-        guint32 update_class, guint32 ship32)
+        UPDCLS update_class, guint32 ship32)
 {
 	qq_data *qd;
 	guint8 *encrypted;
@@ -1161,7 +1167,7 @@
 }
 
 gint qq_send_cmd_mess(PurpleConnection *gc, guint16 cmd, guint8 *data, gint data_len,
-		guint32 update_class, guint32 ship32)
+		UPDCLS update_class, guint32 ship32)
 {
 	qq_data *qd;
 	guint16 seq;
@@ -1235,7 +1241,7 @@
 }
 
 static gint send_room_cmd(PurpleConnection *gc, guint8 room_cmd, guint32 room_id,
-		guint8 *data, gint data_len, guint32 update_class, guint32 ship32)
+		guint8 *data, gint data_len, UPDCLS update_class, guint32 ship32)
 {
 	qq_data *qd;
 	guint8 *buf;
@@ -1289,7 +1295,7 @@
 }
 
 gint qq_send_room_cmd_mess(PurpleConnection *gc, guint8 room_cmd, guint32 room_id,
-		guint8 *data, gint data_len, guint32 update_class, guint32 ship32)
+		guint8 *data, gint data_len, UPDCLS update_class, guint32 ship32)
 {
 	g_return_val_if_fail(room_cmd > 0, -1);
 	return send_room_cmd(gc, room_cmd, room_id, data, data_len, update_class, ship32);
--- a/libpurple/protocols/qq/qq_network.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/qq/qq_network.h	Sat Feb 12 04:17:09 2011 +0900
@@ -39,7 +39,7 @@
 		guint8 *encrypted_data, gint encrypted_len, gboolean is_save2trans);
 gint qq_send_cmd(PurpleConnection *gc, guint16 cmd, guint8 *data, gint datalen);
 gint qq_send_cmd_mess(PurpleConnection *gc, guint16 cmd, guint8 *data, gint data_len,
-		guint32 update_class, guint32 ship32);
+		UPDCLS update_class, guint32 ship32);
 
 gint qq_send_server_reply(PurpleConnection *gc, guint16 cmd, guint16 seq,
 		guint8 *data, gint data_len);
@@ -47,7 +47,7 @@
 gint qq_send_room_cmd(PurpleConnection *gc, guint8 room_cmd, guint32 room_id,
 		guint8 *data, gint data_len);
 gint qq_send_room_cmd_mess(PurpleConnection *gc, guint8 room_cmd, guint32 room_id,
-		guint8 *data, gint data_len, guint32 update_class, guint32 ship32);
+		guint8 *data, gint data_len, UPDCLS update_class, guint32 ship32);
 gint qq_send_room_cmd_only(PurpleConnection *gc, guint8 room_cmd, guint32 room_id);
 gint qq_send_room_cmd_noid(PurpleConnection *gc, guint8 room_cmd,
 		guint8 *data, gint data_len);
--- a/libpurple/protocols/qq/qq_process.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/qq/qq_process.c	Sat Feb 12 04:17:09 2011 +0900
@@ -254,8 +254,8 @@
 	gint bytes;
 
 	struct {
-		guint32 uid_from;
-		guint32 uid_to;
+		UID uid_from;
+		UID uid_to;
 		guint32 seq;
 		struct in_addr ip_from;
 		guint16 port_from;
@@ -725,7 +725,7 @@
 
 void qq_proc_room_cmds(PurpleConnection *gc, guint16 seq,
 		guint8 room_cmd, guint32 room_id, guint8 *rcved, gint rcved_len,
-		guint32 update_class, guint32 ship32)
+		UPDCLS update_class, guint32 ship32)
 {
 	qq_data *qd;
 	guint8 *data;
@@ -861,7 +861,7 @@
 }
 
 guint8 qq_proc_login_cmds(PurpleConnection *gc,  guint16 cmd, guint16 seq,
-		guint8 *rcved, gint rcved_len, guint32 update_class, guint32 ship32)
+		guint8 *rcved, gint rcved_len, UPDCLS update_class, guint32 ship32)
 {
 	qq_data *qd;
 	guint8 *data = NULL;
@@ -1013,7 +1013,7 @@
 }
 
 void qq_proc_client_cmds(PurpleConnection *gc, guint16 cmd, guint16 seq,
-		guint8 *rcved, gint rcved_len, guint32 update_class, guint32 ship32)
+		guint8 *rcved, gint rcved_len, UPDCLS update_class, guint32 ship32)
 {
 	qq_data *qd;
 
--- a/libpurple/protocols/qq/qq_process.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/qq/qq_process.h	Sat Feb 12 04:17:09 2011 +0900
@@ -39,12 +39,12 @@
 };
 
 guint8 qq_proc_login_cmds(PurpleConnection *gc,  guint16 cmd, guint16 seq,
-		guint8 *rcved, gint rcved_len, guint32 update_class, guint32 ship32);
+		guint8 *rcved, gint rcved_len, UPDCLS update_class, guint32 ship32);
 void qq_proc_client_cmds(PurpleConnection *gc, guint16 cmd, guint16 seq,
-		guint8 *rcved, gint rcved_len, guint32 update_class, guint32 ship32);
+		guint8 *rcved, gint rcved_len, UPDCLS update_class, guint32 ship32);
 void qq_proc_room_cmds(PurpleConnection *gc, guint16 seq,
 		guint8 room_cmd, guint32 room_id, guint8 *rcved, gint rcved_len,
-		guint32 update_class, guint32 ship32);
+		UPDCLS update_class, guint32 ship32);
 
 void qq_proc_server_cmd(PurpleConnection *gc, guint16 cmd, guint16 seq, guint8 *rcved, gint rcved_len);
 
--- a/libpurple/protocols/qq/qq_trans.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/qq/qq_trans.c	Sat Feb 12 04:17:09 2011 +0900
@@ -42,25 +42,6 @@
 	QQ_TRANS_IS_REPLY = 0x08				/* server command before login*/
 };
 
-struct _qq_transaction {
-	guint8 flag;
-	guint16 seq;
-	guint16 cmd;
-
-	guint8 room_cmd;
-	guint32 room_id;
-
-	guint8 *data;
-	gint data_len;
-
-	gint fd;
-	gint send_retries;
-	gint rcved_times;
-	gint scan_times;
-
-	guint32 update_class;
-	guint32 ship32;
-};
 
 gboolean qq_trans_is_server(qq_transaction *trans)
 {
@@ -107,7 +88,7 @@
 }
 
 static qq_transaction *trans_create(PurpleConnection *gc, gint fd,
-	guint16 cmd, guint16 seq, guint8 *data, gint data_len, guint32 update_class, guint32 ship32)
+	guint16 cmd, guint16 seq, guint8 *data, gint data_len, UPDCLS update_class, guint32 ship32)
 {
 	qq_transaction *trans;
 
@@ -178,7 +159,7 @@
 }
 
 void qq_trans_add_client_cmd(PurpleConnection *gc,
-	guint16 cmd, guint16 seq, guint8 *data, gint data_len, guint32 update_class, guint32 ship32)
+	guint16 cmd, guint16 seq, guint8 *data, gint data_len, UPDCLS update_class, guint32 ship32)
 {
 	qq_data *qd = (qq_data *)gc->proto_data;
 	qq_transaction *trans = trans_create(gc, qd->fd, cmd, seq, data, data_len, update_class, ship32);
@@ -218,7 +199,7 @@
 
 void qq_trans_add_room_cmd(PurpleConnection *gc,
 		guint16 seq, guint8 room_cmd, guint32 room_id, guint8 *data, gint data_len,
-		guint32 update_class, guint32 ship32)
+		UPDCLS update_class, guint32 ship32)
 {
 	qq_data *qd = (qq_data *)gc->proto_data;
 	qq_transaction *trans = trans_create(gc, qd->fd, QQ_CMD_ROOM, seq, data, data_len,
--- a/libpurple/protocols/qq/qq_trans.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/qq/qq_trans.h	Sat Feb 12 04:17:09 2011 +0900
@@ -28,7 +28,25 @@
 #include <glib.h>
 #include "qq.h"
 
-typedef struct _qq_transaction qq_transaction;
+typedef struct _qq_transaction {
+	guint8 flag;
+	guint16 seq;
+	guint16 cmd;
+
+	guint8 room_cmd;
+	guint32 room_id;
+
+	guint8 *data;
+	gint data_len;
+
+	gint fd;
+	gint send_retries;
+	gint rcved_times;
+	gint scan_times;
+
+	UPDCLS update_class;
+	guint32 ship32;
+} qq_transaction;
 
 qq_transaction *qq_trans_find_rcved(PurpleConnection *gc, guint16 cmd, guint16 seq);
 gboolean qq_trans_is_server(qq_transaction *trans) ;
@@ -39,10 +57,10 @@
 guint32 qq_trans_get_ship(qq_transaction *trans);
 
 void qq_trans_add_client_cmd(PurpleConnection *gc, guint16 cmd, guint16 seq,
-		guint8 *data, gint data_len, guint32 update_class, guint32 ship32);
+		guint8 *data, gint data_len, UPDCLS update_class, guint32 ship32);
 void qq_trans_add_room_cmd(PurpleConnection *gc,
 		guint16 seq, guint8 room_cmd, guint32 room_id,
-		guint8 *data, gint data_len, guint32 update_class, guint32 ship32);
+		guint8 *data, gint data_len, UPDCLS update_class, guint32 ship32);
 void qq_trans_add_server_cmd(PurpleConnection *gc, guint16 cmd, guint16 seq,
 	guint8 *rcved, gint rcved_len);
 void qq_trans_add_server_reply(PurpleConnection *gc, guint16 cmd, guint16 seq,
--- a/libpurple/protocols/qq/send_file.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/qq/send_file.c	Sat Feb 12 04:17:09 2011 +0900
@@ -278,7 +278,7 @@
 
 /* fill in the common information of file transfer */
 static gint _qq_create_packet_file_header
-(guint8 *raw_data, guint32 to_uid, guint16 message_type, qq_data *qd, gboolean seq_ack)
+(guint8 *raw_data, UID to_uid, guint16 message_type, qq_data *qd, gboolean seq_ack)
 {
 	gint bytes;
 	time_t now;
@@ -430,7 +430,7 @@
 }
 
 /* create the QQ_FILE_TRANS_REQ packet with file infomations */
-static void _qq_send_packet_file_request (PurpleConnection *gc, guint32 to_uid, gchar *filename, gint filesize)
+static void _qq_send_packet_file_request (PurpleConnection *gc, UID to_uid, gchar *filename, gint filesize)
 {
 	qq_data *qd;
 	guint8 *raw_data;
@@ -482,7 +482,7 @@
 }
 
 /* tell the buddy we want to accept the file */
-static void _qq_send_packet_file_accept(PurpleConnection *gc, guint32 to_uid)
+static void _qq_send_packet_file_accept(PurpleConnection *gc, UID to_uid)
 {
 	qq_data *qd;
 	guint8 *raw_data;
@@ -520,7 +520,7 @@
 			    packet_len, bytes);
 }
 
-static void _qq_send_packet_file_notifyip(PurpleConnection *gc, guint32 to_uid)
+static void _qq_send_packet_file_notifyip(PurpleConnection *gc, UID to_uid)
 {
 	PurpleXfer *xfer;
 	ft_info *info;
@@ -552,7 +552,7 @@
 }
 
 /* tell the buddy we don't want the file */
-static void _qq_send_packet_file_reject (PurpleConnection *gc, guint32 to_uid)
+static void _qq_send_packet_file_reject (PurpleConnection *gc, UID to_uid)
 {
 	qq_data *qd;
 	guint8 *raw_data;
@@ -576,7 +576,7 @@
 }
 
 /* tell the buddy to cancel transfer */
-static void _qq_send_packet_file_cancel (PurpleConnection *gc, guint32 to_uid)
+static void _qq_send_packet_file_cancel (PurpleConnection *gc, UID to_uid)
 {
 	qq_data *qd;
 	guint8 *raw_data;
@@ -611,7 +611,7 @@
 {
 	PurpleConnection *gc;
 	PurpleAccount *account;
-	guint32 to_uid;
+	UID to_uid;
 	const gchar *filename;
 	gchar *base_filename;
 
@@ -678,7 +678,7 @@
 
 /* process reject im for file transfer request */
 void qq_process_recv_file_reject (guint8 *data, gint data_len,
-		guint32 sender_uid, PurpleConnection *gc)
+		UID sender_uid, PurpleConnection *gc)
 {
 	gchar *msg, *filename;
 	qq_data *qd;
@@ -708,7 +708,7 @@
 
 /* process cancel im for file transfer request */
 void qq_process_recv_file_cancel (guint8 *data, gint data_len,
-		guint32 sender_uid, PurpleConnection *gc)
+		UID sender_uid, PurpleConnection *gc)
 {
 	gchar *msg, *filename;
 	qq_data *qd;
@@ -738,7 +738,7 @@
 }
 
 /* process accept im for file transfer request */
-void qq_process_recv_file_accept(guint8 *data, gint data_len, guint32 sender_uid, PurpleConnection *gc)
+void qq_process_recv_file_accept(guint8 *data, gint data_len, UID sender_uid, PurpleConnection *gc)
 {
 	qq_data *qd;
 	gint bytes;
@@ -764,7 +764,7 @@
 }
 
 /* process request from buddy's im for file transfer request */
-void qq_process_recv_file_request(guint8 *data, gint data_len, guint32 sender_uid, PurpleConnection * gc)
+void qq_process_recv_file_request(guint8 *data, gint data_len, UID sender_uid, PurpleConnection * gc)
 {
 	qq_data *qd;
 	PurpleXfer *xfer;
@@ -874,7 +874,7 @@
 }
 
 void qq_process_recv_file_notify(guint8 *data, gint data_len,
-		guint32 sender_uid, PurpleConnection *gc)
+		UID sender_uid, PurpleConnection *gc)
 {
 	gint bytes;
 	qq_data *qd;
--- a/libpurple/protocols/qq/send_file.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/qq/send_file.h	Sat Feb 12 04:17:09 2011 +0900
@@ -29,7 +29,7 @@
 #include "qq.h"
 
 typedef struct _ft_info {
-	guint32 to_uid;
+	UID to_uid;
 	guint16 send_seq;
 	guint8 file_session_key[QQ_KEY_LENGTH];
 	guint8 conn_method;
@@ -67,11 +67,11 @@
 	gboolean use_major;
 } ft_info;
 
-void qq_process_recv_file_accept(guint8 *data, gint data_len, guint32 sender_uid, PurpleConnection *gc);
-void qq_process_recv_file_reject(guint8 *data, gint data_len, guint32 sender_uid, PurpleConnection *gc);
-void qq_process_recv_file_cancel(guint8 *data, gint data_len, guint32 sender_uid, PurpleConnection *gc);
-void qq_process_recv_file_request(guint8 *data, gint data_len, guint32 sender_uid, PurpleConnection *gc);
-void qq_process_recv_file_notify(guint8 *data, gint data_len, guint32 sender_uid, PurpleConnection *gc);
+void qq_process_recv_file_accept(guint8 *data, gint data_len, UID sender_uid, PurpleConnection *gc);
+void qq_process_recv_file_reject(guint8 *data, gint data_len, UID sender_uid, PurpleConnection *gc);
+void qq_process_recv_file_cancel(guint8 *data, gint data_len, UID sender_uid, PurpleConnection *gc);
+void qq_process_recv_file_request(guint8 *data, gint data_len, UID sender_uid, PurpleConnection *gc);
+void qq_process_recv_file_notify(guint8 *data, gint data_len, UID sender_uid, PurpleConnection *gc);
 gboolean qq_can_receive_file(PurpleConnection *gc, const char *who);
 void qq_send_file(PurpleConnection *gc, const char *who, const char *file);
 gint qq_get_conn_info(ft_info *info, guint8 *data);
--- a/libpurple/protocols/qq/utils.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/qq/utils.c	Sat Feb 12 04:17:09 2011 +0900
@@ -131,9 +131,9 @@
 }
 
 /* convert Purple name to original QQ UID */
-guint32 purple_name_to_uid(const gchar *const name)
+UID purple_name_to_uid(const gchar *const name)
 {
-	guint32 ret;
+	UID ret;
 	g_return_val_if_fail(name != NULL, 0);
 
 	ret = strtoul(name, NULL, 10);
@@ -168,7 +168,7 @@
 
 /* convert a QQ UID to a unique name of Purple
  * the return needs to be freed */
-gchar *uid_to_purple_name(guint32 uid)
+gchar *uid_to_purple_name(UID uid)
 {
 	return g_strdup_printf("%u", uid);
 }
--- a/libpurple/protocols/qq/utils.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/qq/utils.h	Sat Feb 12 04:17:09 2011 +0900
@@ -27,6 +27,7 @@
 
 #include <stdio.h>
 #include <glib.h>
+#include "qq.h"
 
 #include "debug.h"
 
@@ -40,8 +41,8 @@
 gchar *gen_ip_str(guint8 *ip);
 guint8 *str_ip_gen(gchar *str);
 
-guint32 purple_name_to_uid(const gchar *name);
-gchar *uid_to_purple_name(guint32 uid);
+UID purple_name_to_uid(const gchar *name);
+gchar *uid_to_purple_name(UID uid);
 
 gchar *try_dump_as_gbk(const guint8 *const data, gint len);
 
--- a/libpurple/protocols/sametime/sametime.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/sametime/sametime.c	Sat Feb 12 04:17:09 2011 +0900
@@ -317,12 +317,12 @@
 /** resolves a mwSession from a PurpleConnection */
 static struct mwSession *gc_to_session(PurpleConnection *gc) {
   struct mwPurplePluginData *pd;
-  
+
   g_return_val_if_fail(gc != NULL, NULL);
-  
+
   pd = gc->proto_data;
   g_return_val_if_fail(pd != NULL, NULL);
-  
+
   return pd->session;
 }
 
@@ -355,7 +355,7 @@
 
   while(avail) {
     ret = write(pd->socket, circ->outptr, avail);
-    
+
     if(ret <= 0)
       break;
 
@@ -438,7 +438,7 @@
   g_return_if_fail(pd != NULL);
 
   gc = pd->gc;
-  
+
   if(pd->outpa) {
     purple_input_remove(pd->outpa);
     pd->outpa = 0;
@@ -448,7 +448,7 @@
     close(pd->socket);
     pd->socket = 0;
   }
-  
+
   if(gc->inpa) {
     purple_input_remove(gc->inpa);
     gc->inpa = 0;
@@ -489,7 +489,7 @@
 
   PurpleConnection *gc;
   PurpleAccount *acct;
-    
+
   struct mwPurplePluginData *pd;
   guint32 idle;
   guint stat;
@@ -507,7 +507,7 @@
   if(idle) {
     guint32 idle_len;       /*< how long a client has been idle */
     guint32 ugly_idle_len;  /*< how long a broken client has been idle */
-    
+
     DEBUG_INFO("%s has idle value 0x%x\n", NSTR(id), idle);
 
     idle_len = time(NULL) - idle;
@@ -518,7 +518,7 @@
 	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
        they went idle at some time UTC, in seconds since epoch. Bad
@@ -554,16 +554,16 @@
   case mwStatus_IDLE:
     if(! idle) idle = -1;
     break;
-    
+
   case mwStatus_AWAY:
     status = MW_STATE_AWAY;
     break;
-    
+
   case mwStatus_BUSY:
     status = MW_STATE_BUSY;
     break;
   }
-  
+
   /* NAB group members */
   if(aware->group) {
     PurpleGroup *group;
@@ -593,7 +593,7 @@
 
     purple_blist_node_set_int(bnode, BUDDY_KEY_TYPE, mwSametimeUser_NORMAL);
   }
-  
+
   if(aware->online) {
     purple_prpl_got_user_status(acct, id, status, NULL);
     purple_prpl_got_user_idle(acct, id, !!idle, (time_t) idle);
@@ -628,17 +628,17 @@
     returns that list. */
 static struct mwAwareList *
 list_ensure(struct mwPurplePluginData *pd, PurpleGroup *group) {
-  
+
   struct mwAwareList *list;
-  
+
   g_return_val_if_fail(pd != NULL, NULL);
   g_return_val_if_fail(group != NULL, NULL);
-  
+
   list = g_hash_table_lookup(pd->group_list_map, group);
   if(! list) {
     list = mwAwareList_new(pd->srvc_aware, &mw_aware_list_handler);
     mwAwareList_setClientData(list, pd->gc, NULL);
-    
+
     mwAwareList_watchAttributes(list,
 				mwAttribute_AV_PREFS_SET,
 				mwAttribute_MICROPHONE,
@@ -650,7 +650,7 @@
     g_hash_table_replace(pd->group_list_map, group, list);
     g_hash_table_insert(pd->group_list_map, list, group);
   }
-  
+
   return list;
 }
 
@@ -689,7 +689,7 @@
     /* if it's a normal group with none of our people in it, skip it */
     if(gtype == mwSametimeGroup_NORMAL && !purple_group_on_account(grp, acct))
       continue;
-    
+
     /* if the group has an owner and we're not it, skip it */
     owner = purple_blist_node_get_string(gn, GROUP_KEY_OWNER);
     if(owner && strcmp(owner, purple_account_get_username(acct)))
@@ -740,7 +740,7 @@
 	}
       }
     }
-  }  
+  }
 }
 
 
@@ -842,7 +842,7 @@
 
   blist_schedule(pd);
 
-  g_list_free(add);  
+  g_list_free(add);
 }
 
 
@@ -866,11 +866,11 @@
   buddy = purple_find_buddy_in_group(acct, id, group);
   if(! buddy) {
     buddy = purple_buddy_new(acct, id, alias);
-  
+
     purple_blist_add_buddy(buddy, NULL, group, NULL);
     buddy_add(pd, buddy);
   }
-  
+
   purple_blist_alias_buddy(buddy, alias);
   purple_blist_server_alias_buddy(buddy, name);
   purple_blist_node_set_string((PurpleBlistNode *) buddy, BUDDY_KEY_NAME, name);
@@ -888,7 +888,7 @@
   struct mwAwareList *list;
   const char *n;
   GList *add;
-  
+
   n = purple_blist_node_get_string((PurpleBlistNode *) group, GROUP_KEY_NAME);
   if(! n) n = purple_group_get_name(group);
 
@@ -965,7 +965,7 @@
     purple_blist_node_set_string(gn, GROUP_KEY_OWNER, owner);
     group_add(gc->proto_data, group);
   }
-  
+
   return group;
 }
 
@@ -1025,7 +1025,7 @@
       PurpleBuddy *gb = (PurpleBuddy *) bn;
 
       if(! PURPLE_BLIST_NODE_IS_BUDDY(bn)) continue;
-      
+
       if(purple_buddy_get_account(gb) == acct) {
 	DEBUG_INFO("clearing %s from group\n", NSTR(purple_buddy_get_name(gb)));
 	prune = g_list_prepend(prune, gb);
@@ -1057,7 +1057,7 @@
 
   PurpleAccount *acct;
   PurpleBlistNode *gn, *cn, *bn;
-  
+
   GHashTable *stusers;
   GList *prune = NULL;
   GList *ul, *utl;
@@ -1070,7 +1070,7 @@
   g_return_if_fail(acct != NULL);
 
   stusers = g_hash_table_new(g_str_hash, g_str_equal);
-  
+
   /* build a hash table for quick lookup while pruning the group
      contents */
   utl = mwSametimeGroup_getUsers(stgroup);
@@ -1205,7 +1205,7 @@
 	 of our members in it, so don't fully delete it */
       del = FALSE;
     }
-    
+
     group_clear(g_prune->data, acct, del);
     g_prune = g_list_delete_link(g_prune, g_prune);
   }
@@ -1280,7 +1280,7 @@
   conv = mwServiceIm_getConversation(pd->srvc_im, &who);
 
   convo_features(conv);
-    
+
   if(mwConversation_isClosed(conv))
     mwConversation_open(conv);
 }
@@ -1391,7 +1391,7 @@
       }
     }
   }
-  
+
   if(add_buds) {
     purple_account_add_buddies(acct, add_buds);
     g_list_free(add_buds);
@@ -1412,7 +1412,7 @@
 
   /* grab the buddy list from the server */
   unit = mwStorageUnit_new(mwStore_AWARE_LIST);
-  mwServiceStorage_load(pd->srvc_store, unit, fetch_blist_cb, pd, NULL); 
+  mwServiceStorage_load(pd->srvc_store, unit, fetch_blist_cb, pd, NULL);
 
   /* find all the NAB groups and subscribe to them */
   for(l = purple_blist_get_root(); l;
@@ -1492,7 +1492,7 @@
   acct = purple_connection_get_account(pd->gc);
   status = purple_account_get_active_status(acct);
   mw_prpl_set_status(acct, status);
-  
+
   /* start watching for new conversations */
   purple_signal_connect(purple_conversations_get_handle(),
 		      "conversation-created", pd,
@@ -1502,7 +1502,7 @@
   purple_signal_connect(purple_blist_get_handle(),
 		      "blist-node-extended-menu", pd,
 		      PURPLE_CALLBACK(blist_node_menu_cb), pd);
-  
+
   /* use our services to do neat things */
   services_starting(pd);
 }
@@ -1733,7 +1733,7 @@
   int ret = 0, err = 0;
 
   g_return_if_fail(pd != NULL);
- 
+
   ret = read_recv(pd->session, pd->socket);
 
   /* normal operation ends here */
@@ -1826,7 +1826,7 @@
   PurpleBuddy *buddy;
   char *who = from->user_id;
   char *msg;
-  
+
   pd = mwSession_getClientData(s);
   acct = purple_connection_get_account(pd->gc);
   conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, who, acct);
@@ -1886,7 +1886,7 @@
 static void mw_conf_invited(struct mwConference *conf,
 			    struct mwLoginInfo *inviter,
 			    const char *invitation) {
-  
+
   struct mwServiceConference *srvc;
   struct mwSession *session;
   struct mwPurplePluginData *pd;
@@ -1943,7 +1943,7 @@
   struct mwServiceConference *srvc = pd->srvc_conf;
   struct mwConference *conf = NULL;
   GList *l, *ll;
-  
+
   ll = mwServiceConference_getConferences(srvc);
   for(l = ll; l; l = l->next) {
     struct mwConference *c = l->data;
@@ -1955,7 +1955,7 @@
     }
   }
   g_list_free(ll);
-  
+
   return conf;
 }
 
@@ -2042,7 +2042,7 @@
 
 static void mw_conf_peer_parted(struct mwConference *conf,
 				struct mwLoginInfo *peer) {
-  
+
   struct mwServiceConference *srvc;
   struct mwSession *session;
   struct mwPurplePluginData *pd;
@@ -2067,7 +2067,7 @@
 
 static void mw_conf_text(struct mwConference *conf,
 			 struct mwLoginInfo *who, const char *text) {
-  
+
   struct mwServiceConference *srvc;
   struct mwSession *session;
   struct mwPurplePluginData *pd;
@@ -2141,7 +2141,7 @@
 
 static void ft_incoming_init(PurpleXfer *xfer) {
   /* incoming transfer accepted */
-  
+
   /* - accept the mwFileTransfer
      - open/create the local FILE "wb"
      - stick the FILE's fp in xfer->dest_fp
@@ -2222,7 +2222,7 @@
 
   rem = mwFileTransfer_getRemaining(ft);
   if(rem < MW_FT_LEN) o.len = rem;
-  
+
   if(fread(buf, (size_t) o.len, 1, fp)) {
 
     /* calculate progress and display it */
@@ -2261,7 +2261,7 @@
   if(purple_xfer_get_type(xfer) == PURPLE_XFER_SEND) {
     xfer->dest_fp = g_fopen(xfer->local_filename, "rb");
     ft_send(ft, xfer->dest_fp);
-  }  
+  }
 }
 
 
@@ -2454,7 +2454,7 @@
     m->data = g_strdup(data);
     m->clear = g_free;
     break;
-    
+
   case mwImSend_TYPING:
   default:
     m->data = (gpointer) data;
@@ -2470,22 +2470,22 @@
   PurpleConversation *gconv;
   char *tmp, *text;
   struct mwIdBlock *idb;
-  
+
   idb = mwConversation_getTarget(conv);
-  
+
   tmp = mwError(err);
   text = g_strconcat(_("Unable to send message: "), tmp, NULL);
-  
+
   gconv = convo_get_gconv(conv);
   if(gconv && !purple_conv_present_error(idb->user, gconv->account, text)) {
-    
+
     g_free(text);
     text = g_strdup_printf(_("Unable to send message to %s:"),
 			   (idb->user)? idb->user: "(unknown)");
     purple_notify_error(purple_account_get_connection(gconv->account),
 		      NULL, text, tmp);
   }
-  
+
   g_free(tmp);
   g_free(text);
 }
@@ -2494,7 +2494,7 @@
 static void convo_queue_send(struct mwConversation *conv) {
   struct convo_data *cd;
   GList *l;
-  
+
   cd = mwConversation_getClientData(conv);
 
   for(l = cd->queue; l; l = g_list_delete_link(l, l)) {
@@ -2580,7 +2580,7 @@
   cd = mwConversation_getClientData(conv);
   if(cd) {
     convo_queue_send(conv);
-  
+
     if(! convo_get_gconv(conv)) {
       mwConversation_free(conv);
       return;
@@ -2594,7 +2594,7 @@
     PurpleBuddy *buddy;
     struct mwLoginInfo *info;
     info = mwConversation_getTargetInfo(conv);
-    
+
     buddy = purple_find_buddy(acct, info->user_id);
     if(buddy) {
       purple_blist_node_set_int((PurpleBlistNode *) buddy,
@@ -2741,7 +2741,7 @@
 
   /* don't want the contained string to ever be NULL */
   str = g_string_new("");
-  
+
   doc = purple_mime_document_parse(data);
 
   /* handle all the MIME parts */
@@ -2755,7 +2755,7 @@
 
     if(! type) {
       ; /* feh */
-      
+
     } else if(purple_str_has_prefix(type, "image")) {
       /* put images into the image store */
 
@@ -2766,7 +2766,7 @@
 
       /* obtain and unencode the data */
       purple_mime_part_get_data_decoded(part, &d_dat, &d_len);
-      
+
       /* look up the content id */
       cid = (char *) purple_mime_part_get_field(part, "Content-ID");
       cid = make_cid(cid);
@@ -2779,7 +2779,7 @@
 
       /* recall the image for dereferencing later */
       images = g_list_append(images, GINT_TO_POINTER(img));
-      
+
     } else if(purple_str_has_prefix(type, "text")) {
 
       /* concatenate all the text parts together */
@@ -2790,7 +2790,7 @@
       g_string_append(str, (const char *)data);
       g_free(data);
     }
-  }  
+  }
 
   purple_mime_document_free(doc);
 
@@ -2839,7 +2839,7 @@
   im_recv_html(conv, pd, str->str);
 
   g_string_free(str, TRUE);
-  
+
   /* clean up the cid table */
   g_hash_table_destroy(img_by_cid);
 
@@ -2905,7 +2905,7 @@
   pd = mwSession_getClientData(session);
 
   idb = mwConversation_getTarget(conv);
-  
+
   ht = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, g_free);
   g_hash_table_insert(ht, CHAT_KEY_CREATOR, g_strdup(idb->user));
   g_hash_table_insert(ht, CHAT_KEY_NAME, g_strdup(name));
@@ -3246,7 +3246,7 @@
 
 static const char* mw_prpl_list_emblem(PurpleBuddy *b)
 {
-  if(buddy_is_external(b)) 
+  if(buddy_is_external(b))
     return "external";
 
   return NULL;
@@ -3292,22 +3292,22 @@
 static char *user_supports_text(struct mwServiceAware *srvc, const char *who) {
   const char *feat[] = {NULL, NULL, NULL, NULL, NULL};
   const char **f = feat;
-  
+
   if(user_supports(srvc, who, mwAttribute_AV_PREFS_SET)) {
     gboolean mic, speak, video;
-    
+
     mic = user_supports(srvc, who, mwAttribute_MICROPHONE);
     speak = user_supports(srvc, who, mwAttribute_SPEAKERS);
     video = user_supports(srvc, who, mwAttribute_VIDEO_CAMERA);
-    
+
     if(mic) *f++ = _("Microphone");
     if(speak) *f++ = _("Speakers");
     if(video) *f++ = _("Video Camera");
   }
-  
+
   if(user_supports(srvc, who, mwAttribute_FILE_TRANSFER))
     *f++ = _("File Transfer");
-  
+
   return (*feat)? g_strjoinv(", ", (char **)feat): NULL;
   /* jenni loves siege */
 }
@@ -3431,7 +3431,7 @@
   const char *msgA;
   const char *msgB;
   char *msg1;
-  
+
   g_return_if_fail(buddy != NULL);
 
   acct = purple_buddy_get_account(buddy);
@@ -3439,18 +3439,18 @@
 
   gc = purple_account_get_connection(acct);
   g_return_if_fail(gc != NULL);
-  
+
   fields = purple_request_fields_new();
 
   g = purple_request_field_group_new(NULL);
   purple_request_fields_add_group(fields, g);
-  
+
   f = purple_request_field_string_new(CHAT_KEY_TOPIC, _("Topic"), NULL, FALSE);
   purple_request_field_group_add_field(g, f);
 
   f = purple_request_field_string_new(CHAT_KEY_INVITE, _("Message"), msg, FALSE);
   purple_request_field_group_add_field(g, f);
-  
+
   msgA = _("Create conference with user");
   msgB = _("Please enter a topic for the new conference, and an invitation"
 	   " message to be sent to %s");
@@ -3477,7 +3477,7 @@
   PurpleRequestField *f;
   GList *l;
   const char *msg;
-  
+
   f = purple_request_fields_get_field(fields, CHAT_KEY_INVITE);
   msg = purple_request_field_string_get_value(f);
 
@@ -3486,7 +3486,7 @@
 
   if(l) {
     gpointer d = purple_request_field_list_get_data(f, l->data);
-    
+
     if(GPOINTER_TO_INT(d) == 0x01) {
       blist_menu_conf_create(buddy, msg);
 
@@ -3500,7 +3500,7 @@
 
 static void blist_menu_conf_list(PurpleBuddy *buddy,
 				 GList *confs) {
-  
+
   PurpleRequestFields *fields;
   PurpleRequestFieldGroup *g;
   PurpleRequestField *f;
@@ -3519,7 +3519,7 @@
   g_return_if_fail(gc != NULL);
 
   fields = purple_request_fields_new();
-  
+
   g = purple_request_field_group_new(NULL);
   purple_request_fields_add_group(fields, g);
 
@@ -3532,10 +3532,10 @@
   purple_request_field_list_add_icon(f, _("Create New Conference..."),
 			      NULL, GINT_TO_POINTER(0x01));
   purple_request_field_group_add_field(g, f);
-  
+
   f = purple_request_field_string_new(CHAT_KEY_INVITE, "Message", NULL, FALSE);
   purple_request_field_group_add_field(g, f);
-  
+
   msgA = _("Invite user to a conference");
   msgB = _("Select a conference from the list below to send an invite to"
 	   " user %s. Select \"Create New Conference\" if you'd like to"
@@ -3655,12 +3655,12 @@
 static GList *mw_prpl_chat_info(PurpleConnection *gc) {
   GList *l = NULL;
   struct proto_chat_entry *pce;
-  
+
   pce = g_new0(struct proto_chat_entry, 1);
   pce->label = _("Topic:");
   pce->identifier = CHAT_KEY_TOPIC;
   l = g_list_append(l, pce);
-  
+
   return l;
 }
 
@@ -3708,13 +3708,13 @@
   PurpleAccount *acct;
   const char *msgA;
   char *msg;
-  
+
   acct = purple_connection_get_account(gc);
   msgA = _("No host or IP address has been configured for the"
 	  " Meanwhile account %s. Please enter one below to"
 	  " continue logging in.");
   msg = g_strdup_printf(msgA, NSTR(purple_account_get_username(acct)));
-  
+
   purple_request_input(gc, _("Meanwhile Connection Setup"),
 		     _("No Sametime Community Server Specified"), msg,
 		     MW_PLUGIN_DEFAULT_HOST, FALSE, FALSE, NULL,
@@ -3748,7 +3748,7 @@
     *host++ = '\0';
     purple_account_set_string(account, MW_KEY_HOST, host);
     purple_account_set_username(account, user);
-    
+
   } else {
     host = (char *) purple_account_get_string(account, MW_KEY_HOST,
 					    MW_PLUGIN_DEFAULT_HOST);
@@ -3787,10 +3787,10 @@
     DEBUG_INFO("client id: 0x%04x\n", client);
     DEBUG_INFO("client major: 0x%04x\n", major);
     DEBUG_INFO("client minor: 0x%04x\n", minor);
-  
+
     mwSession_setProperty(pd->session, mwSession_CLIENT_TYPE_ID,
 			  GUINT_TO_POINTER(client), NULL);
-    
+
     mwSession_setProperty(pd->session, mwSession_CLIENT_VER_MAJOR,
 			  GUINT_TO_POINTER(major), NULL);
 
@@ -3928,7 +3928,7 @@
 				     (const char **) &end, &attr)) {
     char *id;
     PurpleStoredImage *img = NULL;
-    
+
     gsize len = (start - tmp);
 
     /* append the in-between-tags text */
@@ -3971,7 +3971,7 @@
       /* append the modified tag */
       g_string_append_printf(str, "<img src=\"cid:%s\">", cid);
       g_free(cid);
-      
+
     } else {
       /* append the literal image tag, since we couldn't find a
 	 relative imgstore object */
@@ -4045,7 +4045,7 @@
       tmp = im_mime_convert(gc, conv, message);
       ret = mwConversation_send(conv, mwImSend_MIME, tmp);
       g_free(tmp);
-      
+
     } else if(mwConversation_supports(conv, mwImSend_HTML)) {
       /* send an HTML message */
 
@@ -4063,7 +4063,7 @@
       ret = mwConversation_send(conv, mwImSend_PLAIN, tmp);
       g_free(tmp);
     }
-    
+
     return !ret;
 
   } else {
@@ -4084,7 +4084,7 @@
 static unsigned int mw_prpl_send_typing(PurpleConnection *gc,
 					const char *name,
 					PurpleTypingState state) {
-  
+
   struct mwPurplePluginData *pd;
   struct mwIdBlock who = { (char *) name, NULL };
   struct mwConversation *conv;
@@ -4100,14 +4100,14 @@
 
   if(mwConversation_isOpen(conv)) {
     mwConversation_send(conv, mwImSend_TYPING, t);
-    
+
   } else if((state == PURPLE_TYPING) || (state == PURPLE_TYPED)) {
     /* only open a channel for sending typing notification, not for
        when typing has stopped. There's no point in re-opening a
        channel just to tell someone that this side isn't typing. */
-    
+
     convo_queue(conv, mwImSend_TYPING, t);
-    
+
     if(! mwConversation_isPending(conv)) {
       mwConversation_open(conv);
     }
@@ -4121,7 +4121,7 @@
   switch(type) {
   case mwLogin_LIB:
     return "Lotus Binary Library";
-    
+
   case mwLogin_JAVA_WEB:
     return "Lotus Java Client Applet";
 
@@ -4214,11 +4214,11 @@
 		tmp = g_strdup_printf(_("Unknown (0x%04x)<br>"), type);
 
 	  purple_notify_user_info_add_pair(user_info, _("Last Known Client"), tmp);
-		
+
 	  g_free(tmp);
     }
   }
-  
+
   tmp = user_supports_text(pd->srvc_aware, who);
   if(tmp) {
 	purple_notify_user_info_add_pair(user_info, _("Supports"), tmp);
@@ -4244,65 +4244,65 @@
   purple_notify_userinfo(gc, who, user_info, NULL, NULL);
   purple_notify_user_info_destroy(user_info);
 }
- 
- 
+
+
 static void mw_prpl_set_status(PurpleAccount *acct, PurpleStatus *status) {
   PurpleConnection *gc;
   const char *state;
   char *message = NULL;
   struct mwSession *session;
   struct mwUserStatus stat;
-  
+
   g_return_if_fail(acct != NULL);
   gc = purple_account_get_connection(acct);
-  
+
   state = purple_status_get_id(status);
-  
+
   DEBUG_INFO("Set status to %s\n", purple_status_get_name(status));
-  
+
   g_return_if_fail(gc != NULL);
-  
+
   session = gc_to_session(gc);
   g_return_if_fail(session != NULL);
-  
+
   /* get a working copy of the current status */
   mwUserStatus_clone(&stat, mwSession_getUserStatus(session));
-  
+
   /* determine the state */
   if(! strcmp(state, MW_STATE_ACTIVE)) {
     stat.status = mwStatus_ACTIVE;
-    
+
   } else if(! strcmp(state, MW_STATE_AWAY)) {
     stat.status = mwStatus_AWAY;
-    
+
   } else if(! strcmp(state, MW_STATE_BUSY)) {
     stat.status = mwStatus_BUSY;
   }
-  
+
   /* determine the message */
   message = (char *) purple_status_get_attr_string(status, MW_STATE_MESSAGE);
-  
+
   if(message) {
     /* all the possible non-NULL values of message up to this point
        are const, so we don't need to free them */
     message = purple_markup_strip_html(message);
   }
-  
+
   /* out with the old */
   g_free(stat.desc);
-  
+
   /* in with the new */
   stat.desc = (char *) message;
-  
+
   mwSession_setUserStatus(session, &stat);
   mwUserStatus_clear(&stat);
 }
 
- 
+
 static void mw_prpl_set_idle(PurpleConnection *gc, int t) {
   struct mwSession *session;
   struct mwUserStatus stat;
- 
+
 
   session = gc_to_session(gc);
   g_return_if_fail(session != NULL);
@@ -4347,7 +4347,7 @@
 static void notify_add(PurpleConnection *gc, GList *row, void *user_data) {
   BuddyAddData *data = user_data;
   const char *group_name = NULL;
-  
+
   if (data && data->group) {
     group_name = purple_group_get_name(data->group);
   }
@@ -4392,13 +4392,13 @@
   for(l = result->matches; l; l = l->next) {
     struct mwResolveMatch *match = l->data;
     GList *row = NULL;
-        
+
     DEBUG_INFO("multi resolve: %s, %s\n",
 	       NSTR(match->id), NSTR(match->name));
 
     if(!match->id || !match->name)
       continue;
-    
+
     row = g_list_append(row, g_strdup(match->name));
     row = g_list_append(row, g_strdup(match->id));
     purple_notify_searchresults_row_add(sres, row);
@@ -4440,7 +4440,7 @@
   if(!code && res && res->matches) {
     if(!res->matches->next) {
       struct mwResolveMatch *match = res->matches->data;
-      
+
       /* only one? that might be the right one! */
       if(strcmp(res->name, match->id)) {
 	/* uh oh, the single result isn't identical to the search
@@ -4448,7 +4448,7 @@
 	   the user meant to add */
 	purple_blist_remove_buddy(buddy);
 	multi_resolved_query(res, gc, data);
-	
+
       } else {
 
 	/* same person, set the server alias */
@@ -4463,13 +4463,13 @@
 
         g_free(data);
       }
-      
+
     } else {
       /* prompt user if more than one match was returned */
       purple_blist_remove_buddy(buddy);
       multi_resolved_query(res, gc, data);
     }
-    
+
     return;
   }
 
@@ -4628,7 +4628,7 @@
 
 static void privacy_fill(struct mwPrivacyInfo *priv,
 			 GSList *members) {
-  
+
   struct mwUserItem *u;
   guint count;
 
@@ -4690,7 +4690,7 @@
     DEBUG_INFO("PURPLE_PRIVACY_DENY_ALL\n");
     privacy.deny = FALSE;
     break;
-    
+
   default:
     DEBUG_INFO("acct->perm_deny is 0x%x\n", acct->perm_deny);
     return;
@@ -4745,12 +4745,12 @@
 
   struct mwPurplePluginData *pd;
   char *c, *t;
-  
+
   pd = gc->proto_data;
 
   c = g_hash_table_lookup(components, CHAT_KEY_NAME);
   t = g_hash_table_lookup(components, CHAT_KEY_TOPIC);
-  
+
   if(g_hash_table_lookup(components, CHAT_KEY_IS_PLACE)) {
     /* use place service */
     struct mwServicePlace *srvc;
@@ -4759,7 +4759,7 @@
     srvc = pd->srvc_place;
     place = mwPlace_new(srvc, c, t);
     mwPlace_open(place);
-     
+
   } else {
     /* use conference service */
     struct mwServiceConference *srvc;
@@ -4771,7 +4771,7 @@
     if(conf) {
       DEBUG_INFO("accepting conference invitation\n");
       mwConference_accept(conf);
-      
+
     } else {
       DEBUG_INFO("creating new conference\n");
       conf = mwConference_new(srvc, t);
@@ -4787,7 +4787,7 @@
   struct mwPurplePluginData *pd;
   struct mwServiceConference *srvc;
   char *c;
-  
+
   pd = gc->proto_data;
   srvc = pd->srvc_conf;
 
@@ -5046,7 +5046,7 @@
 
   srvc = pd->srvc_aware;
   g_return_val_if_fail(srvc != NULL, FALSE);
-  
+
   acct = purple_connection_get_account(gc);
   g_return_val_if_fail(acct != NULL, FALSE);
 
@@ -5097,7 +5097,7 @@
     char *tmp = strrchr(filename, G_DIR_SEPARATOR);
     if(tmp++) filename = tmp;
   }
-  
+
   ft = mwFileTransfer_new(srvc, &idb, NULL, filename, filesize);
 
   purple_xfer_ref(xfer);
@@ -5110,7 +5110,7 @@
 
 static void ft_outgoing_cancel(PurpleXfer *xfer) {
   struct mwFileTransfer *ft = xfer->data;
-  
+
   DEBUG_INFO("ft_outgoing_cancel called\n");
 
   if(ft) mwFileTransfer_cancel(ft);
@@ -5210,7 +5210,7 @@
   .offline_message           = NULL,
   .whiteboard_prpl_ops       = NULL,
   .send_raw                  = NULL,
-  .struct_size               = sizeof(PurplePluginProtocolInfo)		
+  .struct_size               = sizeof(PurplePluginProtocolInfo)
 };
 
 
@@ -5220,10 +5220,10 @@
   PurplePluginPref *pref;
 
   frame = purple_plugin_pref_frame_new();
-  
+
   pref = purple_plugin_pref_new_with_label(_("Remotely Stored Buddy List"));
   purple_plugin_pref_frame_add(frame, pref);
-  
+
 
   pref = purple_plugin_pref_new_with_name(MW_PRPL_OPT_BLIST_ACTION);
   purple_plugin_pref_set_label(pref, _("Buddy List Storage Mode"));
@@ -5344,7 +5344,7 @@
 
 static void remote_group_multi_cleanup(gpointer ignore,
 				       PurpleRequestFields *fields) {
-  
+
   PurpleRequestField *f;
   GList *l;
 
@@ -5376,7 +5376,7 @@
 
   gc = pd->gc;
   acct = purple_connection_get_account(gc);
-  
+
   /* collision checking */
   group = purple_find_group(name);
   if(group) {
@@ -5497,7 +5497,7 @@
 
   gc = pd->gc;
   g_return_if_fail(gc != NULL);
-  
+
   if(!code && results) {
     res = results->data;
 
@@ -5537,7 +5537,7 @@
 
   query = g_list_prepend(NULL, (char *) name);
   flags = mwResolveFlag_FIRST | mwResolveFlag_GROUPS;
-  
+
   req = mwServiceResolve_resolve(srvc, query, flags, remote_group_resolved,
 				 NULL, NULL);
   g_list_free(query);
@@ -5599,7 +5599,7 @@
 
     if(!match->id || !match->name)
       continue;
-    
+
     row = g_list_append(row, g_strdup(match->name));
     row = g_list_append(row, g_strdup(match->id));
     purple_notify_searchresults_row_add(sres, row);
@@ -5659,7 +5659,7 @@
 
   pd = gc->proto_data;
   srvc = pd->srvc_resolve;
-  
+
   query = g_list_prepend(NULL, (char *) name);
   flags = mwResolveFlag_FIRST | mwResolveFlag_USERS;
 
@@ -5837,7 +5837,7 @@
      get caught here */
   log_handler[0] = g_log_set_handler(G_LOG_DOMAIN, logflags,
 				     mw_log_handler, NULL);
-  
+
   /* redirect meanwhile's logging to purple's */
   log_handler[1] = g_log_set_handler("meanwhile", logflags,
 				     mw_log_handler, NULL);
--- a/libpurple/protocols/silc/silc.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/silc/silc.c	Sat Feb 12 04:17:09 2011 +0900
@@ -678,12 +678,12 @@
 	g_return_if_fail(sg != NULL);
 
 	ui_info = purple_core_get_ui_info();
-	
+
 	if(ui_info) {
 		ui_name = g_hash_table_lookup(ui_info, "name");
 		ui_website = g_hash_table_lookup(ui_info, "website");
 	}
-	
+
 	if(!ui_name || !ui_website) {
 		ui_name = "Pidgin";
 		ui_website = PURPLE_WEBSITE;
@@ -1845,7 +1845,7 @@
 	GHashTable *ui_info;
 	const char *ui_name = NULL, *ui_website = NULL;
 	char *quit_msg;
-								   
+
 	gc = purple_conversation_get_gc(conv);
 
 	if (gc == NULL)
@@ -1857,12 +1857,12 @@
 		return PURPLE_CMD_RET_FAILED;
 
 	ui_info = purple_core_get_ui_info();
-	
+
 	if(ui_info) {
 		ui_name = g_hash_table_lookup(ui_info, "name");
 		ui_website = g_hash_table_lookup(ui_info, "website");
 	}
-	
+
 	if(!ui_name || !ui_website) {
 		ui_name = "Pidgin";
 		ui_website = PURPLE_WEBSITE;
--- a/libpurple/protocols/silc10/buddy.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/silc10/buddy.c	Sat Feb 12 04:17:09 2011 +0900
@@ -93,7 +93,7 @@
 								NULL, NULL, key, a->responder);
 			silc_ske_free_key_material(key);
 
-			
+
 			/* Open IM window */
 			convo = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM,
 									client_entry->nickname, sg->account);
@@ -1739,7 +1739,7 @@
 
 	obj.mime = icon = silc_mime_encode(mime, &obj.mime_len);
 	if (obj.mime)
-		silc_client_attribute_add(client, conn, 
+		silc_client_attribute_add(client, conn,
 					  SILC_ATTRIBUTE_USER_ICON, &obj, sizeof(obj));
 
 	silc_free(icon);
--- a/libpurple/protocols/silc10/chat.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/silc10/chat.c	Sat Feb 12 04:17:09 2011 +0900
@@ -1065,7 +1065,7 @@
 char *silcpurple_get_chat_name(GHashTable *data)
 {
 	return g_strdup(g_hash_table_lookup(data, "channel"));
-}	
+}
 
 void silcpurple_chat_join(PurpleConnection *gc, GHashTable *data)
 {
--- a/libpurple/protocols/silc10/ops.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/silc10/ops.c	Sat Feb 12 04:17:09 2011 +0900
@@ -124,7 +124,7 @@
 
 		if (channel)
 			silc_channel_message(client, conn, sender, channel,
-					     payload, key, 
+					     payload, key,
 					     SILC_MESSAGE_FLAG_UTF8, data,
 					     data_len);
 		else
@@ -165,11 +165,11 @@
 		if (imgid) {
 			cflags |= PURPLE_MESSAGE_IMAGES | PURPLE_MESSAGE_RECV;
 			g_snprintf(tmp, sizeof(tmp), "<IMG ID=\"%d\">", imgid);
-		  
+
 			if (channel)
 				serv_got_chat_in(gc, purple_conv_chat_get_id(PURPLE_CONV_CHAT(convo)),
 				 		 sender->nickname ?
-				 		  sender->nickname : 
+				 		  sender->nickname :
 						 "<unknown>", cflags,
 						 tmp, time(NULL));
 			else
@@ -364,7 +364,7 @@
 		memset(enc, 0, sizeof(enc));
 
 		if (!silc_mime_parse(message, message_len, NULL, 0,
-		    type, sizeof(type) - 1, enc, sizeof(enc) - 1, &data, 
+		    type, sizeof(type) - 1, enc, sizeof(enc) - 1, &data,
 		    &data_len))
 			return;
 
--- a/libpurple/protocols/silc10/silc.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/silc10/silc.c	Sat Feb 12 04:17:09 2011 +0900
@@ -388,7 +388,7 @@
 	GHashTable *ui_info;
 	const char *ui_name = NULL, *ui_website = NULL;
 	char *quit_msg;
-	
+
 	g_return_if_fail(sg != NULL);
 
 	ui_info = purple_core_get_ui_info();
@@ -1557,7 +1557,7 @@
 	GHashTable *ui_info;
 	const char *ui_name = NULL, *ui_website = NULL;
 	char *quit_msg;
-	
+
 	gc = purple_conversation_get_gc(conv);
 
 	if (gc == NULL)
--- a/libpurple/protocols/silc10/util.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/silc10/util.c	Sat Feb 12 04:17:09 2011 +0900
@@ -635,13 +635,13 @@
 		return strdup("image/gif");
 	else if (!g_ascii_strcasecmp(".tiff", ct))
 		return strdup("image/tiff");
-	
+
 	return NULL;
 }
 
-/* Checks if message has images, and assembles MIME message if it has. 
-   If only one image is present, creates simple MIME image message.  If 
-   there are multiple images and/or text with images multipart MIME 
+/* Checks if message has images, and assembles MIME message if it has.
+   If only one image is present, creates simple MIME image message.  If
+   there are multiple images and/or text with images multipart MIME
    message is created. */
 
 SilcDList silcpurple_image_message(const char *msg, SilcUInt32 *mflags)
@@ -747,7 +747,7 @@
 		silc_mime_add_field(mime, "MIME-Version", "1.0");
 		g_snprintf(b, sizeof(b), "b%4X%4X",
 			   (unsigned int)time(NULL),
-			   silc_dlist_count(parts)); 
+			   silc_dlist_count(parts));
 		silc_mime_set_multipart(mime, "mixed", b);
 		silc_dlist_start(parts);
 		while ((p = silc_dlist_get(parts)) != SILC_LIST_END)
--- a/libpurple/protocols/silc10/wb.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/silc10/wb.c	Sat Feb 12 04:17:09 2011 +0900
@@ -30,7 +30,7 @@
   2 bytes	height
   4 bytes	brush color
   2 bytes	brush size
-  n bytes	data 
+  n bytes	data
 
   Data:
 
@@ -253,8 +253,8 @@
 }
 
 static void
-silcpurple_wb_request(SilcClient client, const unsigned char *message, 
-		    SilcUInt32 message_len, SilcClientEntry sender, 
+silcpurple_wb_request(SilcClient client, const unsigned char *message,
+		    SilcUInt32 message_len, SilcClientEntry sender,
 		    SilcChannelEntry channel)
 {
 	char tmp[128];
@@ -409,8 +409,8 @@
 	/* Send the message */
 	if (wbs->type == 0) {
 		/* Private message */
-		silc_client_send_private_message(sg->client, sg->conn, 
-						 wbs->u.client, 
+		silc_client_send_private_message(sg->client, sg->conn,
+						 wbs->u.client,
 						 SILC_MESSAGE_FLAG_DATA,
 						 packet->head, len, TRUE);
 	} else if (wbs->type == 1) {
@@ -504,8 +504,8 @@
 	/* Send the message */
 	if (wbs->type == 0) {
 		/* Private message */
-		silc_client_send_private_message(sg->client, sg->conn, 
-						 wbs->u.client, 
+		silc_client_send_private_message(sg->client, sg->conn,
+						 wbs->u.client,
 						 SILC_MESSAGE_FLAG_DATA,
 						 packet->head, len, TRUE);
 	} else if (wbs->type == 1) {
--- a/libpurple/protocols/simple/simple.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/simple/simple.c	Sat Feb 12 04:17:09 2011 +0900
@@ -395,7 +395,7 @@
 		g_strfreev(parts);
 		purple_debug(PURPLE_DEBUG_MISC, "simple", "nonce: %s realm: %s\n",
 					 auth->nonce ? auth->nonce : "(null)",
-					 auth->realm ? auth->realm : "(null)"); 
+					 auth->realm ? auth->realm : "(null)");
 
 		if(auth->realm) {
 			auth->digest_session_key = purple_cipher_http_digest_calculate_session_key(
@@ -796,11 +796,11 @@
 				b->dialog->theirtag = g_strdup(theirtag);
 				b->dialog->callid = g_strdup(callid);
 
-				purple_debug_info("simple", "ourtag: %s\n", 
+				purple_debug_info("simple", "ourtag: %s\n",
 					ourtag);
-				purple_debug_info("simple", "theirtag: %s\n", 
+				purple_debug_info("simple", "theirtag: %s\n",
 					theirtag);
-				purple_debug_info("simple", "callid: %s\n", 
+				purple_debug_info("simple", "callid: %s\n",
 					callid);
 				g_free(theirtag);
 				g_free(ourtag);
@@ -982,7 +982,7 @@
 	}
 
 	/* publish status again if our last update is about to expire. */
-	if (sip->republish != -1 && 
+	if (sip->republish != -1 &&
 		sip->republish < curtime &&
 		purple_account_get_bool(sip->account, "dopublish", TRUE))
 	{
@@ -1272,9 +1272,9 @@
 		isonline = TRUE;
 
 
-	if(isonline) 
+	if(isonline)
 		purple_prpl_got_user_status(sip->account, from, "available", NULL);
-	else 
+	else
 		purple_prpl_got_user_status(sip->account, from, "offline", NULL);
 
 	xmlnode_free(pidf);
--- a/libpurple/protocols/simple/sipmsg.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/simple/sipmsg.h	Sat Feb 12 04:17:09 2011 +0900
@@ -1,10 +1,10 @@
 /**
  * @file sipmsg.h
- * 
+ *
  * purple
  *
  * Copyright (C) 2005, Thomas Butter <butter@uni-mannheim.de>
- * 
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
--- a/libpurple/protocols/yahoo/libymsg.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/yahoo/libymsg.c	Sat Feb 12 04:17:09 2011 +0900
@@ -849,7 +849,7 @@
 
 		if (fed_from != from)
 			g_free(fed_from);
-	
+
 	} else if (!g_ascii_strncasecmp(msg, "GAME", strlen("GAME"))) {
 		PurpleBuddy *bud = purple_find_buddy(account, from);
 
@@ -1012,7 +1012,7 @@
 						break;
 				}
 				purple_debug_info("yahoo", "Message from federated (%d) buddy %s.\n", im->fed, im->fed_from);
-					
+
 			}
 			/* peer session id */
 			if (im && (pair->key == 11)) {
@@ -1217,7 +1217,7 @@
 						  13, 1,
 						  334, 0);
 	}
-		
+
 	yahoo_packet_send_and_free(pkt, yd);
 
 	g_free(add_req->id);
@@ -1314,7 +1314,7 @@
 	PurpleAccount *account;
 	GSList *l = pkt->hash;
 	const char *msg = NULL;
-	
+
 	account = purple_connection_get_account(gc);
 
 	/* Buddy authorized/declined our addition */
@@ -1730,7 +1730,7 @@
 
 	purple_debug_info("yahoo", "yahoo status: %d\n", yd->current_status);
 	pkt = yahoo_packet_new(YAHOO_SERVICE_AUTHRESP, yd->current_status, yd->session_id);
-	
+
 	if(yd->cookie_b) { /* send B cookie if we have it */
 		yahoo_packet_hash(pkt, "ssssssssss",
 					1, name,
@@ -1801,7 +1801,7 @@
 	purple_debug_info("yahoo","Authentication: In yahoo_auth16_stage2\n");
 
 	yd->url_datas = g_slist_remove(yd->url_datas, url_data);
-	
+
 	if (error_message != NULL) {
 		purple_debug_error("yahoo", "Login Failed, unable to retrieve stage 2 url: %s\n", error_message);
 		purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, error_message);
@@ -1815,7 +1815,7 @@
 		int response_no = -1;
 		char *crumb = NULL;
 		char *crypt = NULL;
-		
+
 		if(g_strv_length(splits) > 1) {
 			yd->cookie_b = yahoo_auth16_get_cookie_b(splits[0]);
 			split_data = g_strsplit(splits[1], "\r\n", -1);
@@ -2679,14 +2679,15 @@
 	if(!(p2p_data = data))
 		return ;
 
+	yd = p2p_data->gc->proto_data;
+	yd->listen_data = NULL;
+
 	if(listenfd == -1) {
 		purple_debug_warning("yahoo","p2p: error starting p2p server\n");
 		yahoo_p2p_disconnect_destroy_data(data);
 		return;
 	}
 
-	yd = p2p_data->gc->proto_data;
-
 	/* Add an Input Read event to the file descriptor */
 	yd->yahoo_local_p2p_server_fd = listenfd;
 	yd->yahoo_p2p_server_watcher = purple_input_add(listenfd, PURPLE_INPUT_READ, yahoo_p2p_server_send_connected_cb,data);
@@ -2765,8 +2766,15 @@
 	p2p_data->connection_type = YAHOO_P2P_WE_ARE_SERVER;
 	p2p_data->source = -1;
 
-	/* FIXME: Shouldn't this deal with the PurpleNetworkListenData* */
-	purple_network_listen(YAHOO_PAGER_PORT_P2P, SOCK_STREAM, yahoo_p2p_server_listen_cb, p2p_data);
+	/* FIXME: If the port is already used, purple_network_listener returns NULL and old listener won't be canceled
+	 * in yahoo_close function. */
+	if (yd->listen_data)
+		purple_debug_warning("yahoo","p2p: Failed to create p2p server - server already exists\n");
+	else {
+		yd->listen_data = purple_network_listen(YAHOO_PAGER_PORT_P2P, SOCK_STREAM, yahoo_p2p_server_listen_cb, p2p_data);
+		if (yd->listen_data == NULL)
+			purple_debug_warning("yahoo","p2p: Failed to created p2p server\n");
+	}
 
 	g_free(base64_ip);
 }
@@ -3790,6 +3798,8 @@
 		yahoo_buddy_icon_upload_data_free(yd->picture_upload_todo);
 	if (yd->ycht)
 		ycht_connection_close(yd->ycht);
+	if (yd->listen_data != NULL)
+		purple_network_listen_cancel(yd->listen_data);
 
 	g_free(yd->pending_chat_room);
 	g_free(yd->pending_chat_id);
@@ -4697,7 +4707,7 @@
 			default:
 				break;
 		}
-		
+
 		yahoo_packet_hash(pkt, "ssssss", 49, "TYPING", 1, purple_connection_get_display_name(gc),
                   14, " ", 13, state == PURPLE_TYPING ? "1" : "0",
                   5, fed_who, 1002, "1");
@@ -5103,7 +5113,7 @@
 		yahoo_packet_hash(pkt, "ssis", 1, purple_connection_get_display_name(gc), 7, who+4, 241, fed, 13, "2");
 	else
 		yahoo_packet_hash(pkt, "sss", 1, purple_connection_get_display_name(gc), 7, who, 13, "2");
-	
+
 	yahoo_packet_send_and_free(pkt, yd);
 }
 
--- a/libpurple/protocols/yahoo/libymsg.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/yahoo/libymsg.h	Sat Feb 12 04:17:09 2011 +0900
@@ -28,6 +28,7 @@
 #include "circbuffer.h"
 #include "cmds.h"
 #include "prpl.h"
+#include "network.h"
 
 #define YAHOO_PAGER_HOST_REQ_URL "http://vcs1.msg.yahoo.com/capacity"
 #define YAHOO_PAGER_HOST_FALLBACK "scsa.msg.yahoo.com"
@@ -243,6 +244,7 @@
 	GSList *url_datas;
 	GHashTable *xfer_peer_idstring_map;/* Hey, i dont know, but putting this HashTable next to friends gives a run time fault... */
 	GSList *cookies;/* contains all cookies, including _y and _t */
+	PurpleNetworkListenData *listen_data;
 
 	/**
 	 * We may receive a list15 in multiple packets with no prior warning as to how many we'll be getting;
--- a/libpurple/protocols/yahoo/util.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/yahoo/util.c	Sat Feb 12 04:17:09 2011 +0900
@@ -40,7 +40,7 @@
 	PurpleProxyInfo *ppi = NULL;
 	PurpleProxyType type = PURPLE_PROXY_NONE;
 	gboolean proxy_ssl = purple_account_get_bool(account, "proxy_ssl", FALSE);
-	
+
 	if(proxy_ssl)
 		ppi = purple_proxy_get_setup(account);
 	else
--- a/libpurple/protocols/yahoo/yahoo_aliases.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/yahoo/yahoo_aliases.c	Sat Feb 12 04:17:09 2011 +0900
@@ -151,7 +151,7 @@
 						purple_debug_info("yahoo", "Sent updated alias '%s'\n", buddy_alias);
 					}
 				}
-				
+
 				if (f != NULL)
 					ypd = &f->ypd;
 				else {
--- a/libpurple/protocols/yahoo/yahoo_friend.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/yahoo/yahoo_friend.c	Sat Feb 12 04:17:09 2011 +0900
@@ -152,7 +152,7 @@
 	char *who = NULL;
 	int value = 0;
 	YahooFederation fed = YAHOO_FEDERATION_NONE;
-	
+
 	while (l) {
 		struct yahoo_pair *pair = l->data;
 
@@ -175,7 +175,7 @@
 		purple_debug_error("yahoo", "Received unknown value for presence key: %d\n", value);
 		return;
 	}
-	
+
 	switch (fed) {
 		case YAHOO_FEDERATION_MSN:
 			who = g_strconcat("msn/", temp, NULL);
@@ -238,12 +238,12 @@
 	f = yahoo_friend_find(gc, name);
 	if (!f)
 		return;
-	
+
 	if(f->fed != YAHOO_FEDERATION_NONE)
 		temp = name+4;
 	else
 		temp = name;
-    
+
 	/* No need to change the value if it is already correct */
 	if (f->presence == presence) {
 		purple_debug_info("yahoo", "Not setting presence because there are no changes.\n");
--- a/libpurple/protocols/yahoo/yahoo_friend.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/yahoo/yahoo_friend.h	Sat Feb 12 04:17:09 2011 +0900
@@ -55,7 +55,7 @@
 	gchar *ip;
 	gboolean bicon_sent_request;
 	YahooPresenceVisibility presence;
-	YahooFederation fed; 
+	YahooFederation fed;
 	long int version_id;
 	YahooPersonalDetails ypd;
 	YahooP2PStatus p2p_status;
--- a/libpurple/protocols/yahoo/yahoochat.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/yahoo/yahoochat.c	Sat Feb 12 04:17:09 2011 +0900
@@ -253,7 +253,7 @@
 
 			tmp = g_strdup_printf(_("%s has declined to join."), who);
 			purple_conversation_write(c, NULL, tmp, PURPLE_MESSAGE_SYSTEM | PURPLE_MESSAGE_NO_LINKIFY, time(NULL));
-			
+
 			g_free(tmp);
 		}
 
--- a/libpurple/protocols/zephyr/ZAsyncLocate.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/zephyr/ZAsyncLocate.c	Sat Feb 12 04:17:09 2011 +0900
@@ -5,7 +5,7 @@
  *
  *	Copyright (c) 1990,1991 by the Massachusetts Institute of Technology.
  *	For copying and distribution information, see the file
- *	"mit-copyright.h". 
+ *	"mit-copyright.h".
  */
 
 #include "internal.h"
@@ -85,7 +85,7 @@
     end = notice->z_message+notice->z_message_len;
 
     __locate_num = 0;
-	
+
     for (ptr=notice->z_message;ptr<end;ptr++)
       if (!*ptr)
 	__locate_num++;
--- a/libpurple/protocols/zephyr/ZCkAuth.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/zephyr/ZCkAuth.c	Sat Feb 12 04:17:09 2011 +0900
@@ -5,7 +5,7 @@
  *
  *	Copyright (c) 1987,1991 by the Massachusetts Institute of Technology.
  *	For copying and distribution information, see the file
- *	"mit-copyright.h". 
+ *	"mit-copyright.h".
  */
 
 #include "internal.h"
@@ -21,7 +21,7 @@
 Code_t ZCheckAuthentication(notice, from)
     ZNotice_t *notice;
     struct sockaddr_in *from;
-{	
+{
 #ifdef ZEPHYR_USES_KERBEROS
     int result;
     ZChecksum_t our_checksum;
@@ -33,15 +33,15 @@
 
     if (!notice->z_auth)
 	return (ZAUTH_NO);
-	
-    if ((result = krb_get_cred(SERVER_SERVICE, SERVER_INSTANCE, 
+
+    if ((result = krb_get_cred(SERVER_SERVICE, SERVER_INSTANCE,
 			       __Zephyr_realm, &cred)) != 0)
 	return (ZAUTH_NO);
 
 #ifdef NOENCRYPTION
     our_checksum = 0;
 #else
-    our_checksum = des_quad_cksum(notice->z_packet, NULL, 
+    our_checksum = des_quad_cksum(notice->z_packet, NULL,
 				  notice->z_default_format+
 				  strlen(notice->z_default_format)+1-
 				  notice->z_packet, 0, (C_Block *)cred.session);
@@ -52,4 +52,4 @@
 #else
     return (notice->z_auth ? ZAUTH_YES : ZAUTH_NO);
 #endif
-} 
+}
--- a/libpurple/protocols/zephyr/ZCkIfNot.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/zephyr/ZCkIfNot.c	Sat Feb 12 04:17:09 2011 +0900
@@ -5,7 +5,7 @@
  *
  *	Copyright (c) 1987,1988 by the Massachusetts Institute of Technology.
  *	For copying and distribution information, see the file
- *	"mit-copyright.h". 
+ *	"mit-copyright.h".
  */
 
 #include "internal.h"
@@ -23,11 +23,11 @@
 
     if ((retval = Z_ReadEnqueue()) != ZERR_NONE)
 	return (retval);
-	
+
     qptr = Z_GetFirstComplete();
-    
+
     while (qptr) {
-	if ((retval = ZParseNotice(qptr->packet, qptr->packet_len, 
+	if ((retval = ZParseNotice(qptr->packet, qptr->packet_len,
 				   &tmpnotice)) != ZERR_NONE)
 	    return (retval);
 	if ((*predicate)(&tmpnotice, args)) {
@@ -36,14 +36,14 @@
 	    (void) memcpy(buffer, qptr->packet, qptr->packet_len);
 	    if (from)
 		*from = qptr->from;
-	    if ((retval = ZParseNotice(buffer, qptr->packet_len, 
+	    if ((retval = ZParseNotice(buffer, qptr->packet_len,
 				       notice)) != ZERR_NONE) {
 		free(buffer);
 		return (retval);
 	    }
 	    Z_RemQueue(qptr);
 	    return (ZERR_NONE);
-	} 
+	}
 	qptr = Z_GetNextComplete(qptr);
     }
 
--- a/libpurple/protocols/zephyr/ZClosePort.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/zephyr/ZClosePort.c	Sat Feb 12 04:17:09 2011 +0900
@@ -5,7 +5,7 @@
  *
  *	Copyright (c) 1987 by the Massachusetts Institute of Technology.
  *	For copying and distribution information, see the file
- *	"mit-copyright.h". 
+ *	"mit-copyright.h".
  */
 
 #include "internal.h"
@@ -17,6 +17,6 @@
 
     __Zephyr_fd = -1;
     __Zephyr_open = 0;
-	
+
     return (ZERR_NONE);
 }
--- a/libpurple/protocols/zephyr/ZCmpUID.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/zephyr/ZCmpUID.c	Sat Feb 12 04:17:09 2011 +0900
@@ -5,7 +5,7 @@
  *
  *	Copyright (c) 1987 by the Massachusetts Institute of Technology.
  *	For copying and distribution information, see the file
- *	"mit-copyright.h". 
+ *	"mit-copyright.h".
  */
 
 #include "internal.h"
--- a/libpurple/protocols/zephyr/ZCmpUIDP.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/zephyr/ZCmpUIDP.c	Sat Feb 12 04:17:09 2011 +0900
@@ -5,7 +5,7 @@
  *
  *	Copyright (c) 1987 by the Massachusetts Institute of Technology.
  *	For copying and distribution information, see the file
- *	"mit-copyright.h". 
+ *	"mit-copyright.h".
  */
 
 #include "internal.h"
--- a/libpurple/protocols/zephyr/ZFlsLocs.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/zephyr/ZFlsLocs.c	Sat Feb 12 04:17:09 2011 +0900
@@ -5,7 +5,7 @@
  *
  *	Copyright (c) 1987 by the Massachusetts Institute of Technology.
  *	For copying and distribution information, see the file
- *	"mit-copyright.h". 
+ *	"mit-copyright.h".
  */
 
 #include "internal.h"
@@ -13,7 +13,7 @@
 Code_t ZFlushLocations()
 {
 	int i;
-	
+
 	if (!__locate_list)
 		return (ZERR_NONE);
 
@@ -22,7 +22,7 @@
 		free(__locate_list[i].time);
 		free(__locate_list[i].tty);
 	}
-	
+
 	free((char *)__locate_list);
 
 	__locate_list = 0;
--- a/libpurple/protocols/zephyr/ZFlsSubs.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/zephyr/ZFlsSubs.c	Sat Feb 12 04:17:09 2011 +0900
@@ -5,7 +5,7 @@
  *
  *	Copyright (c) 1987 by the Massachusetts Institute of Technology.
  *	For copying and distribution information, see the file
- *	"mit-copyright.h". 
+ *	"mit-copyright.h".
  */
 
 #include "internal.h"
@@ -13,7 +13,7 @@
 Code_t ZFlushSubscriptions()
 {
 	register int i;
-	
+
 	if (!__subscriptions_list)
 		return (ZERR_NONE);
 
@@ -22,7 +22,7 @@
 		free(__subscriptions_list[i].zsub_classinst);
 		free(__subscriptions_list[i].zsub_recipient);
 	}
-	
+
 	free((char *)__subscriptions_list);
 
 	__subscriptions_list = 0;
--- a/libpurple/protocols/zephyr/ZFmtAuth.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/zephyr/ZFmtAuth.c	Sat Feb 12 04:17:09 2011 +0900
@@ -5,7 +5,7 @@
 
  *	Copyright (c) 1987,1988 by the Massachusetts Institute of Technology.
  *	For copying and distribution information, see the file
- *	"mit-copyright.h". 
+ *	"mit-copyright.h".
  */
 
 #include "internal.h"
--- a/libpurple/protocols/zephyr/ZFmtList.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/zephyr/ZFmtList.c	Sat Feb 12 04:17:09 2011 +0900
@@ -5,12 +5,12 @@
  *
  *	Copyright (c) 1987,1991 by the Massachusetts Institute of Technology.
  *	For copying and distribution information, see the file
- *	"mit-copyright.h". 
+ *	"mit-copyright.h".
  */
 
 #include "internal.h"
 
-Code_t ZFormatNoticeList(notice, list, nitems, buffer, ret_len, 
+Code_t ZFormatNoticeList(notice, list, nitems, buffer, ret_len,
 			 cert_routine)
     ZNotice_t *notice;
     register char **list;
--- a/libpurple/protocols/zephyr/ZFmtNotice.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/zephyr/ZFmtNotice.c	Sat Feb 12 04:17:09 2011 +0900
@@ -5,7 +5,7 @@
  *
  *	Copyright (c) 1987,1988 by the Massachusetts Institute of Technology.
  *	For copying and distribution information, see the file
- *	"mit-copyright.h". 
+ *	"mit-copyright.h".
  */
 
 #include "internal.h"
@@ -20,7 +20,7 @@
     int hdrlen;
     Code_t retval;
 
-    if ((retval = Z_FormatHeader(notice, header, sizeof(header), &hdrlen, 
+    if ((retval = Z_FormatHeader(notice, header, sizeof(header), &hdrlen,
 				 cert_routine)) != ZERR_NONE)
 	return (retval);
 
--- a/libpurple/protocols/zephyr/ZFmtRaw.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/zephyr/ZFmtRaw.c	Sat Feb 12 04:17:09 2011 +0900
@@ -5,7 +5,7 @@
  *
  *	Copyright (c) 1987 by the Massachusetts Institute of Technology.
  *	For copying and distribution information, see the file
- *	"mit-copyright.h". 
+ *	"mit-copyright.h".
  */
 
 #include "internal.h"
--- a/libpurple/protocols/zephyr/ZFmtRawLst.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/zephyr/ZFmtRawLst.c	Sat Feb 12 04:17:09 2011 +0900
@@ -5,7 +5,7 @@
  *
  *	Copyright (c) 1987 by the Massachusetts Institute of Technology.
  *	For copying and distribution information, see the file
- *	"mit-copyright.h". 
+ *	"mit-copyright.h".
  */
 
 #include "internal.h"
@@ -31,12 +31,12 @@
 	size += strlen(list[i])+1;
 
     *ret_len = hdrlen+size;
-    
+
     if (!(*buffer = (char *) malloc((unsigned) *ret_len)))
 	return (ENOMEM);
 
     (void) memcpy(*buffer, header, hdrlen);
-    
+
     ptr = *buffer+hdrlen;
 
     for (;nitems;nitems--, list++) {
--- a/libpurple/protocols/zephyr/ZFmtSmRLst.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/zephyr/ZFmtSmRLst.c	Sat Feb 12 04:17:09 2011 +0900
@@ -5,7 +5,7 @@
  *
  *	Copyright (c) 1988 by the Massachusetts Institute of Technology.
  *	For copying and distribution information, see the file
- *	"mit-copyright.h". 
+ *	"mit-copyright.h".
  */
 
 #include "internal.h"
--- a/libpurple/protocols/zephyr/ZFmtSmRaw.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/zephyr/ZFmtSmRaw.c	Sat Feb 12 04:17:09 2011 +0900
@@ -5,7 +5,7 @@
  *
  *	Copyright (c) 1987 by the Massachusetts Institute of Technology.
  *	For copying and distribution information, see the file
- *	"mit-copyright.h". 
+ *	"mit-copyright.h".
  */
 
 #include "internal.h"
@@ -17,7 +17,7 @@
 {
     Code_t retval;
     int hdrlen;
-    
+
     if ((retval = Z_FormatRawHeader(notice, buffer, Z_MAXHEADERLEN,
 				    &hdrlen, NULL, NULL)) != ZERR_NONE)
 	return (retval);
--- a/libpurple/protocols/zephyr/ZFreeNot.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/zephyr/ZFreeNot.c	Sat Feb 12 04:17:09 2011 +0900
@@ -5,7 +5,7 @@
  *
  *	Copyright (c) 1987 by the Massachusetts Institute of Technology.
  *	For copying and distribution information, see the file
- *	"mit-copyright.h". 
+ *	"mit-copyright.h".
  */
 
 #include "internal.h"
--- a/libpurple/protocols/zephyr/ZGetLocs.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/zephyr/ZGetLocs.c	Sat Feb 12 04:17:09 2011 +0900
@@ -5,7 +5,7 @@
  *
  *	Copyright (c) 1987 by the Massachusetts Institute of Technology.
  *	For copying and distribution information, see the file
- *	"mit-copyright.h". 
+ *	"mit-copyright.h".
  */
 
 #include "internal.h"
@@ -18,13 +18,13 @@
 Code_t ZGetLocations(ZLocations_t *location, int *numlocs)
 {
     int i;
-	
+
     if (!__locate_list)
 	return (ZERR_NOLOCATIONS);
 
     if (__locate_next == __locate_num)
 	return (ZERR_NOMORELOCS);
-	
+
     for (i=0;i<min(*numlocs, __locate_num-__locate_next);i++)
 	location[i] = __locate_list[i+__locate_next];
 
@@ -32,6 +32,6 @@
 	*numlocs = __locate_num-__locate_next;
 
     __locate_next += *numlocs;
-	
+
     return (ZERR_NONE);
 }
--- a/libpurple/protocols/zephyr/ZGetSender.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/zephyr/ZGetSender.c	Sat Feb 12 04:17:09 2011 +0900
@@ -5,7 +5,7 @@
  *
  *	Copyright (c) 1987, 1991 by the Massachusetts Institute of Technology.
  *	For copying and distribution information, see the file
- *	"mit-copyright.h". 
+ *	"mit-copyright.h".
  */
 
 #include "internal.h"
--- a/libpurple/protocols/zephyr/ZGetSubs.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/zephyr/ZGetSubs.c	Sat Feb 12 04:17:09 2011 +0900
@@ -5,7 +5,7 @@
  *
  *	Copyright (c) 1987 by the Massachusetts Institute of Technology.
  *	For copying and distribution information, see the file
- *	"mit-copyright.h". 
+ *	"mit-copyright.h".
  */
 
 #include "internal.h"
@@ -18,13 +18,13 @@
 Code_t ZGetSubscriptions(ZSubscription_t *subscription, int *numsubs)
 {
     int i;
-	
+
     if (!__subscriptions_list)
 	return (ZERR_NOSUBSCRIPTIONS);
 
     if (__subscriptions_next == __subscriptions_num)
 	return (ZERR_NOMORESUBSCRIPTIONS);
-	
+
     for (i=0;i<min(*numsubs, __subscriptions_num-__subscriptions_next);i++)
 	subscription[i] = __subscriptions_list[i+__subscriptions_next];
 
@@ -32,6 +32,6 @@
 	*numsubs = __subscriptions_num-__subscriptions_next;
 
     __subscriptions_next += *numsubs;
-	
+
     return (ZERR_NONE);
 }
--- a/libpurple/protocols/zephyr/ZGetWGPort.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/zephyr/ZGetWGPort.c	Sat Feb 12 04:17:09 2011 +0900
@@ -5,7 +5,7 @@
  *
  *	Copyright (c) 1987 by the Massachusetts Institute of Technology.
  *	For copying and distribution information, see the file
- *	"mit-copyright.h". 
+ *	"mit-copyright.h".
  */
 
 #include "internal.h"
@@ -18,7 +18,7 @@
 #ifdef WIN32
     long int buffsize= 128;
     char tempdir[buffsize];
-#endif	
+#endif
     envptr = getenv("WGFILE");
     if (!envptr) {
 #ifdef WIN32
@@ -28,7 +28,7 @@
 	(void) sprintf(name, "/tmp/wg.%d", getuid());
 #endif
 	envptr = name;
-    } 
+    }
     if (!(fp = fopen(envptr, "r")))
 	return (-1);
 
--- a/libpurple/protocols/zephyr/ZIfNotice.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/zephyr/ZIfNotice.c	Sat Feb 12 04:17:09 2011 +0900
@@ -5,7 +5,7 @@
  *
  *	Copyright (c) 1987,1988 by the Massachusetts Institute of Technology.
  *	For copying and distribution information, see the file
- *	"mit-copyright.h". 
+ *	"mit-copyright.h".
  */
 
 #include "internal.h"
@@ -23,12 +23,12 @@
 
     if ((retval = Z_WaitForComplete()) != ZERR_NONE)
 	return (retval);
-	
+
     qptr = Z_GetFirstComplete();
-    
+
     for (;;) {
 	while (qptr) {
-	    if ((retval = ZParseNotice(qptr->packet, qptr->packet_len, 
+	    if ((retval = ZParseNotice(qptr->packet, qptr->packet_len,
 				       &tmpnotice)) != ZERR_NONE)
 		return (retval);
 	    if ((*predicate)(&tmpnotice, args)) {
@@ -37,7 +37,7 @@
 		(void) memcpy(buffer, qptr->packet, qptr->packet_len);
 		if (from)
 		    *from = qptr->from;
-		if ((retval = ZParseNotice(buffer, qptr->packet_len, 
+		if ((retval = ZParseNotice(buffer, qptr->packet_len,
 					   notice)) != ZERR_NONE) {
 		    free(buffer);
 		    return (retval);
--- a/libpurple/protocols/zephyr/ZInit.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/zephyr/ZInit.c	Sat Feb 12 04:17:09 2011 +0900
@@ -5,7 +5,7 @@
  *
  *	Copyright (c) 1987, 1991 by the Massachusetts Institute of Technology.
  *	For copying and distribution information, see the file
- *	"mit-copyright.h". 
+ *	"mit-copyright.h".
  */
 
 #ifdef ZEPHYR_USES_KERBEROS
@@ -49,7 +49,7 @@
 #endif
 
     initialize_zeph_error_table();
-    
+
     (void) memset((char *)&__HM_addr, 0, sizeof(__HM_addr));
 
     __HM_addr.sin_family = AF_INET;
@@ -70,7 +70,7 @@
     /* Initialize the input queue */
     __Q_Tail = NULL;
     __Q_Head = NULL;
-    
+
     /* if the application is a server, there might not be a zhm.  The
        code will fall back to something which might not be "right",
        but this is is ok, since none of the servers call krb_rd_req. */
--- a/libpurple/protocols/zephyr/ZLocations.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/zephyr/ZLocations.c	Sat Feb 12 04:17:09 2011 +0900
@@ -6,7 +6,7 @@
  *
  *	Copyright (c) 1987,1988,1991 by the Massachusetts Institute of Technology.
  *	For copying and distribution information, see the file
- *	"mit-copyright.h". 
+ *	"mit-copyright.h".
  */
 
 #include "internal.h"
@@ -21,13 +21,13 @@
 Code_t ZSetLocation(exposure)
     char *exposure;
 {
-    return (Z_SendLocation(LOGIN_CLASS, exposure, ZAUTH, 
+    return (Z_SendLocation(LOGIN_CLASS, exposure, ZAUTH,
 			   "$sender logged in to $1 on $3 at $2"));
 }
 
 Code_t ZUnsetLocation()
 {
-    return (Z_SendLocation(LOGIN_CLASS, LOGIN_USER_LOGOUT, ZNOAUTH, 
+    return (Z_SendLocation(LOGIN_CLASS, LOGIN_USER_LOGOUT, ZNOAUTH,
 			   "$sender logged out of $1 on $3 at $2"));
 }
 
@@ -137,8 +137,8 @@
 	}
 	ZFreeNotice(&retnotice);
 	return (ZERR_SERVNAK);
-    } 
-	
+    }
+
     if (retnotice.z_kind != SERVACK) {
 	ZFreeNotice(&retnotice);
 	return (ZERR_INTERNAL);
@@ -156,6 +156,6 @@
     }
 
     ZFreeNotice(&retnotice);
-	
+
     return (ZERR_NONE);
 }
--- a/libpurple/protocols/zephyr/ZMakeAscii.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/zephyr/ZMakeAscii.c	Sat Feb 12 04:17:09 2011 +0900
@@ -5,7 +5,7 @@
  *
  *	Copyright (c) 1987 by the Massachusetts Institute of Technology.
  *	For copying and distribution information, see the file
- *	"mit-copyright.h". 
+ *	"mit-copyright.h".
  */
 
 #include "internal.h"
@@ -33,7 +33,7 @@
 	    *ptr++ = '0';
 	    *ptr++ = 'x';
 	    len -= 2;
-	} 
+	}
 	if (len < 3)
 	    return ZERR_FIELDLEN;
 	*ptr++ = itox_chars[(int) (field[i] >> 4)];
--- a/libpurple/protocols/zephyr/ZMkAuth.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/zephyr/ZMkAuth.c	Sat Feb 12 04:17:09 2011 +0900
@@ -5,7 +5,7 @@
  *
  *	Copyright (c) 1987 by the Massachusetts Institute of Technology.
  *	For copying and distribution information, see the file
- *	"mit-copyright.h". 
+ *	"mit-copyright.h".
  */
 
 #include "internal.h"
@@ -50,7 +50,7 @@
 
     now = time(0);
     if (last_authent_time == 0 || (now - last_authent_time > 120)) {
-	result = krb_mk_req(&authent, SERVER_SERVICE, 
+	result = krb_mk_req(&authent, SERVER_SERVICE,
 			    SERVER_INSTANCE, __Zephyr_realm, 0);
 	if (result != MK_AP_OK) {
 	    last_authent_time = 0;
@@ -68,9 +68,9 @@
     /* zero length authent is an error, so malloc(0) is not a problem */
     if (!notice->z_ascii_authent)
 	return (ENOMEM);
-    if ((result = ZMakeAscii(notice->z_ascii_authent, 
-			     authent.length*3, 
-			     authent.dat, 
+    if ((result = ZMakeAscii(notice->z_ascii_authent,
+			     authent.length*3,
+			     authent.dat,
 			     authent.length)) != ZERR_NONE) {
 	free(notice->z_ascii_authent);
 	return (result);
@@ -83,7 +83,7 @@
 	return(result);
 
     /* Compute a checksum over the header and message. */
-    if ((result = krb_get_cred(SERVER_SERVICE, SERVER_INSTANCE, 
+    if ((result = krb_get_cred(SERVER_SERVICE, SERVER_INSTANCE,
 			      __Zephyr_realm, &cred)) != 0)
 	return result;
     checksum = des_quad_cksum(buffer, NULL, cstart - buffer, 0, (C_Block *)cred.session);
--- a/libpurple/protocols/zephyr/ZNewLocU.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/zephyr/ZNewLocU.c	Sat Feb 12 04:17:09 2011 +0900
@@ -5,7 +5,7 @@
  *
  *	Copyright (c) 1987,1988,1991 by the Massachusetts Institute of Technology.
  *	For copying and distribution information, see the file
- *	"mit-copyright.h". 
+ *	"mit-copyright.h".
  */
 
 #include "internal.h"
--- a/libpurple/protocols/zephyr/ZOpenPort.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/zephyr/ZOpenPort.c	Sat Feb 12 04:17:09 2011 +0900
@@ -5,7 +5,7 @@
  *
  *	Copyright (c) 1987 by the Massachusetts Institute of Technology.
  *	For copying and distribution information, see the file
- *	"mit-copyright.h". 
+ *	"mit-copyright.h".
  */
 
 #include "internal.h"
@@ -20,7 +20,7 @@
 {
     struct sockaddr_in bindin;
     socklen_t len;
-    
+
     (void) ZClosePort();
 
     if ((__Zephyr_fd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
@@ -32,7 +32,7 @@
     {
       int on = 1;
 
-      setsockopt(__Zephyr_fd, SOL_SOCKET, SO_BSDCOMPAT, (char *)&on, 
+      setsockopt(__Zephyr_fd, SOL_SOCKET, SO_BSDCOMPAT, (char *)&on,
 		 sizeof(on));
     }
 #endif
@@ -58,7 +58,7 @@
 	if (getsockname(__Zephyr_fd, (struct sockaddr *)&bindin, &len))
 	    return (errno);
     }
-    
+
     __Zephyr_port = bindin.sin_port;
     __Zephyr_open = 1;
 
--- a/libpurple/protocols/zephyr/ZParseNot.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/zephyr/ZParseNot.c	Sat Feb 12 04:17:09 2011 +0900
@@ -5,7 +5,7 @@
  *
  *	Copyright (c) 1987,1991 by the Massachusetts Institute of Technology.
  *	For copying and distribution information, see the file
- *	"mit-copyright.h". 
+ *	"mit-copyright.h".
  */
 
 #include "internal.h"
@@ -84,12 +84,12 @@
 #endif
 
     (void) memset((char *)notice, 0, sizeof(ZNotice_t));
-	
+
     ptr = buffer;
     end = buffer+len;
 
     notice->z_packet = buffer;
-    
+
     notice->z_version = ptr;
     if (strncmp(ptr, ZVERSIONHDR, sizeof(ZVERSIONHDR) - 1))
 	return (ZERR_VERS);
@@ -141,7 +141,7 @@
     }
     else
 	BAD_PACKET;
-	
+
     if (numfields) {
 	if (ZReadAscii(ptr, end-ptr, (unsigned char *)&notice->z_uid,
 		       sizeof(ZUnique_Id_t)) == ZERR_BADFIELD)
@@ -153,7 +153,7 @@
     }
     else
 	BAD_PACKET;
-	
+
     if (numfields) {
 	if (ZReadAscii16(ptr, end-ptr, &notice->z_port) == ZERR_BADFIELD)
 	    BAD_PACKET;
@@ -174,7 +174,7 @@
     else
 	BAD_PACKET;
     notice->z_checked_auth = ZAUTH_UNSET;
-	
+
     if (numfields) {
 	if (ZReadAscii32(ptr, end-ptr, &temp) == ZERR_BADFIELD)
 	    BAD_PACKET;
@@ -200,7 +200,7 @@
     }
     else
 	notice->z_class = "";
-	
+
     if (numfields) {
 	notice->z_class_inst = ptr;
 	numfields--;
@@ -240,7 +240,7 @@
     }
     else
 	notice->z_default_format = "";
-	
+
 /*XXX*/
     if (ZReadAscii32(ptr, end-ptr, &temp) == ZERR_BADFIELD)
 	BAD_PACKET;
@@ -273,10 +273,10 @@
 	next_field (ptr);
     }
     notice->z_num_other_fields = i;
-    
+
     for (i=0;i<numfields;i++)
 	next_field (ptr);
-	
+
     notice->z_message = (void *)ptr;
     notice->z_message_len = len-(ptr-buffer);
 
--- a/libpurple/protocols/zephyr/ZPeekIfNot.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/zephyr/ZPeekIfNot.c	Sat Feb 12 04:17:09 2011 +0900
@@ -5,7 +5,7 @@
  *
  *	Copyright (c) 1987,1988 by the Massachusetts Institute of Technology.
  *	For copying and distribution information, see the file
- *	"mit-copyright.h". 
+ *	"mit-copyright.h".
  */
 
 #include "internal.h"
@@ -24,11 +24,11 @@
 
     if ((retval = Z_WaitForComplete()) != ZERR_NONE)
 	return (retval);
-    
+
     for (;;) {
 	qptr = Z_GetFirstComplete();
 	while (qptr) {
-	    if ((retval = ZParseNotice(qptr->packet, qptr->packet_len, 
+	    if ((retval = ZParseNotice(qptr->packet, qptr->packet_len,
 				       &tmpnotice)) != ZERR_NONE)
 		return (retval);
 	    if ((*predicate)(&tmpnotice, args)) {
@@ -37,7 +37,7 @@
 		(void) memcpy(buffer, qptr->packet, qptr->packet_len);
 		if (from)
 		    *from = qptr->from;
-		if ((retval = ZParseNotice(buffer, qptr->packet_len, 
+		if ((retval = ZParseNotice(buffer, qptr->packet_len,
 					   notice)) != ZERR_NONE) {
 		    free(buffer);
 		    return (retval);
--- a/libpurple/protocols/zephyr/ZPeekNot.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/zephyr/ZPeekNot.c	Sat Feb 12 04:17:09 2011 +0900
@@ -5,7 +5,7 @@
  *
  *	Copyright (c) 1987 by the Massachusetts Institute of Technology.
  *	For copying and distribution information, see the file
- *	"mit-copyright.h". 
+ *	"mit-copyright.h".
  */
 
 #include "internal.h"
@@ -17,7 +17,7 @@
     char *buffer;
     int len;
     Code_t retval;
-	
+
     if ((retval = ZPeekPacket(&buffer, &len, from)) != ZERR_NONE)
 	return (retval);
 
--- a/libpurple/protocols/zephyr/ZPeekPkt.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/zephyr/ZPeekPkt.c	Sat Feb 12 04:17:09 2011 +0900
@@ -5,7 +5,7 @@
  *
  *	Copyright (c) 1987 by the Massachusetts Institute of Technology.
  *	For copying and distribution information, see the file
- *	"mit-copyright.h". 
+ *	"mit-copyright.h".
  */
 
 #include "internal.h"
@@ -17,14 +17,14 @@
 {
     Code_t retval;
     struct _Z_InputQ *nextq;
-    
+
     if ((retval = Z_WaitForComplete()) != ZERR_NONE)
 	return (retval);
 
     nextq =Z_GetFirstComplete();
 
     *ret_len = nextq->packet_len;
-    
+
     if (!(*buffer = (char *) malloc((unsigned) *ret_len)))
 	return (ENOMEM);
 
@@ -32,6 +32,6 @@
 
     if (from)
 	*from = nextq->from;
-	
+
     return (ZERR_NONE);
 }
--- a/libpurple/protocols/zephyr/ZPending.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/zephyr/ZPending.c	Sat Feb 12 04:17:09 2011 +0900
@@ -5,7 +5,7 @@
  *
  *	Copyright (c) 1987 by the Massachusetts Institute of Technology.
  *	For copying and distribution information, see the file
- *	"mit-copyright.h". 
+ *	"mit-copyright.h".
  */
 
 #include "internal.h"
@@ -13,16 +13,16 @@
 int ZPending()
 {
 	int retval;
-	
+
 	if (ZGetFD() < 0) {
 		errno = ZERR_NOPORT;
 		return (-1);
 	}
-	
+
 	if ((retval = Z_ReadEnqueue()) != ZERR_NONE) {
 		errno = retval;
 		return (-1);
-	} 
-	
+	}
+
 	return(ZQLength());
 }
--- a/libpurple/protocols/zephyr/ZReadAscii.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/zephyr/ZReadAscii.c	Sat Feb 12 04:17:09 2011 +0900
@@ -5,7 +5,7 @@
  *
  *	Copyright (c) 1987, 1990 by the Massachusetts Institute of Technology.
  *	For copying and distribution information, see the file
- *	"mit-copyright.h". 
+ *	"mit-copyright.h".
  */
 
 #include "internal.h"
@@ -28,13 +28,13 @@
 	    ptr++;
 	    if (--len < 0)
 		return ZERR_BADFIELD;
-	} 
+	}
 	if (ptr[0] == '0' && ptr[1] == 'x') {
 	    ptr += 2;
 	    len -= 2;
 	    if (len < 0)
 		return ZERR_BADFIELD;
-	} 
+	}
 	c1 = Z_cnvt_xtoi(ptr[0]);
 	if (c1 < 0)
 		return ZERR_BADFIELD;
--- a/libpurple/protocols/zephyr/ZRecvNot.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/zephyr/ZRecvNot.c	Sat Feb 12 04:17:09 2011 +0900
@@ -5,7 +5,7 @@
  *
  *	Copyright (c) 1987,1988 by the Massachusetts Institute of Technology.
  *	For copying and distribution information, see the file
- *	"mit-copyright.h". 
+ *	"mit-copyright.h".
  */
 
 #include "internal.h"
@@ -28,18 +28,18 @@
 	    return (ENOMEM);
 
     len = nextq->packet_len;
-    
+
     if (!(buffer = (char *) malloc((unsigned) len)))
 	return (ENOMEM);
 
     if (from)
 	*from = nextq->from;
-    
+
     (void) memcpy(buffer, nextq->packet, len);
 
     auth = nextq->auth;
     Z_RemQueue(nextq);
-    
+
     if ((retval = ZParseNotice(buffer, len, notice)) != ZERR_NONE)
 	return (retval);
     notice->z_checked_auth = auth;
--- a/libpurple/protocols/zephyr/ZRecvPkt.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/zephyr/ZRecvPkt.c	Sat Feb 12 04:17:09 2011 +0900
@@ -5,7 +5,7 @@
  *
  *	Copyright (c) 1987,1988 by the Massachusetts Institute of Technology.
  *	For copying and distribution information, see the file
- *	"mit-copyright.h". 
+ *	"mit-copyright.h".
  */
 
 #include "internal.h"
@@ -17,7 +17,7 @@
 {
     Code_t retval;
     struct _Z_InputQ *nextq;
-    
+
     if ((retval = Z_WaitForComplete()) != ZERR_NONE)
 	return (retval);
 
@@ -26,12 +26,12 @@
     *ret_len = nextq->packet_len;
     if (*ret_len > Z_MAXPKTLEN)
 	return (ZERR_PKTLEN);
-    
+
     (void) memcpy(buffer, nextq->packet, *ret_len);
 
     if (from)
 	*from = nextq->from;
-	
+
     Z_RemQueue(nextq);
 
     return (ZERR_NONE);
--- a/libpurple/protocols/zephyr/ZRetSubs.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/zephyr/ZRetSubs.c	Sat Feb 12 04:17:09 2011 +0900
@@ -6,7 +6,7 @@
  *
  *	Copyright (c) 1987,1988,1991 by the Massachusetts Institute of Technology.
  *	For copying and distribution information, see the file
- *	"mit-copyright.h". 
+ *	"mit-copyright.h".
  */
 
 #include "internal.h"
@@ -25,7 +25,7 @@
 	int retval;
 	ZNotice_t notice;
 	char asciiport[50];
-	
+
 	if (!port)			/* use default port */
 	    port = __Zephyr_port;
 
@@ -102,7 +102,7 @@
 		if (retnotice.z_kind == SERVNAK) {
 			ZFreeNotice(&retnotice);
 			return (ZERR_SERVNAK);
-		}	
+		}
 		/* non-matching protocol version numbers means the
 		   server is probably an older version--must punt */
 		if (strcmp(notice->z_version,retnotice.z_version)) {
@@ -114,7 +114,7 @@
 			ZFreeNotice(&retnotice);
 			gimmeack = 1;
 			continue;
-		} 
+		}
 
 		if (retnotice.z_kind != ACKED) {
 			ZFreeNotice(&retnotice);
--- a/libpurple/protocols/zephyr/ZSendList.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/zephyr/ZSendList.c	Sat Feb 12 04:17:09 2011 +0900
@@ -5,7 +5,7 @@
  *
  *	Copyright (c) 1987 by the Massachusetts Institute of Technology.
  *	For copying and distribution information, see the file
- *	"mit-copyright.h". 
+ *	"mit-copyright.h".
  */
 
 #include "internal.h"
@@ -31,13 +31,13 @@
     char *buffer;
     int len;
 
-    if ((retval = ZFormatNoticeList(notice, list, nitems, &buffer, 
+    if ((retval = ZFormatNoticeList(notice, list, nitems, &buffer,
 				    &len, cert_routine)) != ZERR_NONE)
 	return (retval);
 
     if ((retval = ZParseNotice(buffer, len, &newnotice)) != ZERR_NONE)
 	return (retval);
-    
+
     retval = Z_SendFragmentedNotice(&newnotice, len, cert_routine,
 				    send_routine);
 
--- a/libpurple/protocols/zephyr/ZSendNot.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/zephyr/ZSendNot.c	Sat Feb 12 04:17:09 2011 +0900
@@ -5,7 +5,7 @@
  *
  *	Copyright (c) 1987 by the Massachusetts Institute of Technology.
  *	For copying and distribution information, see the file
- *	"mit-copyright.h". 
+ *	"mit-copyright.h".
  */
 
 #include "internal.h"
@@ -21,19 +21,19 @@
     ZNotice_t *notice;
     Z_AuthProc cert_routine;
     Code_t (*send_routine)();
-{    
+{
     Code_t retval;
     ZNotice_t newnotice;
     char *buffer;
     int len;
 
-    if ((retval = ZFormatNotice(notice, &buffer, &len, 
+    if ((retval = ZFormatNotice(notice, &buffer, &len,
 				cert_routine)) != ZERR_NONE)
 	return (retval);
 
     if ((retval = ZParseNotice(buffer, len, &newnotice)) != ZERR_NONE)
 	return (retval);
-    
+
     retval = Z_SendFragmentedNotice(&newnotice, len, cert_routine,
 				    send_routine);
 
--- a/libpurple/protocols/zephyr/ZSendPkt.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/zephyr/ZSendPkt.c	Sat Feb 12 04:17:09 2011 +0900
@@ -5,7 +5,7 @@
  *
  *	Copyright (c) 1987,1991 by the Massachusetts Institute of Technology.
  *	For copying and distribution information, see the file
- *	"mit-copyright.h". 
+ *	"mit-copyright.h".
  */
 
 #include "internal.h"
@@ -25,19 +25,19 @@
     Code_t retval;
     struct sockaddr_in dest;
     ZNotice_t notice, acknotice;
-	
+
     if (!packet || len < 0)
 	return (ZERR_ILLVAL);
 
     if (len > Z_MAXPKTLEN)
 	return (ZERR_PKTLEN);
-    
+
     if (ZGetFD() < 0)
 	if ((retval = ZOpenPort((unsigned short *)0)) != ZERR_NONE)
 	    return (retval);
 
     dest = ZGetDestAddr();
-	
+
     if (sendto(ZGetFD(), packet, len, 0, (struct sockaddr *)&dest,
 	       sizeof(dest)) < 0)
 	return (errno);
@@ -47,7 +47,7 @@
 
     if ((retval = ZParseNotice(packet, len, &notice)) != ZERR_NONE)
 	return (retval);
-    
+
     retval = Z_WaitForNotice (&acknotice, wait_for_hmack, &notice.z_uid,
 			      HM_TIMEOUT);
     if (retval == ETIMEDOUT)
--- a/libpurple/protocols/zephyr/ZSendRLst.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/zephyr/ZSendRLst.c	Sat Feb 12 04:17:09 2011 +0900
@@ -5,7 +5,7 @@
  *
  *	Copyright (c) 1988 by the Massachusetts Institute of Technology.
  *	For copying and distribution information, see the file
- *	"mit-copyright.h". 
+ *	"mit-copyright.h".
  */
 
 #include "internal.h"
@@ -30,13 +30,13 @@
     char *buffer;
     int len;
 
-    if ((retval = ZFormatRawNoticeList(notice, list, nitems, &buffer, 
+    if ((retval = ZFormatRawNoticeList(notice, list, nitems, &buffer,
 				       &len)) != ZERR_NONE)
 	return (retval);
 
     if ((retval = ZParseNotice(buffer, len, &newnotice)) != ZERR_NONE)
 	return (retval);
-    
+
     retval = Z_SendFragmentedNotice(&newnotice, len, NULL, send_routine);
 
     free(buffer);
--- a/libpurple/protocols/zephyr/ZSendRaw.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/zephyr/ZSendRaw.c	Sat Feb 12 04:17:09 2011 +0900
@@ -5,7 +5,7 @@
  *
  *	Copyright (c) 1987 by the Massachusetts Institute of Technology.
  *	For copying and distribution information, see the file
- *	"mit-copyright.h". 
+ *	"mit-copyright.h".
  */
 
 #include "internal.h"
@@ -25,7 +25,7 @@
 
     if ((retval = ZParseNotice(buffer, len, &newnotice)) != ZERR_NONE)
 	return (retval);
-    
+
     retval = Z_SendFragmentedNotice(&newnotice, len, NULL, Z_XmitFragment);
 
     free(buffer);
--- a/libpurple/protocols/zephyr/ZSetDest.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/zephyr/ZSetDest.c	Sat Feb 12 04:17:09 2011 +0900
@@ -5,7 +5,7 @@
  *
  *	Copyright (c) 1987 by the Massachusetts Institute of Technology.
  *	For copying and distribution information, see the file
- *	"mit-copyright.h". 
+ *	"mit-copyright.h".
  */
 
 #include "internal.h"
@@ -16,6 +16,6 @@
 	__HM_addr = *addr;
 
 	__HM_set = 1;
-	
+
 	return (ZERR_NONE);
 }
--- a/libpurple/protocols/zephyr/ZSetFD.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/zephyr/ZSetFD.c	Sat Feb 12 04:17:09 2011 +0900
@@ -5,7 +5,7 @@
  *
  *	Copyright (c) 1987 by the Massachusetts Institute of Technology.
  *	For copying and distribution information, see the file
- *	"mit-copyright.h". 
+ *	"mit-copyright.h".
  */
 
 #include "internal.h"
@@ -17,6 +17,6 @@
 
 	__Zephyr_fd = fd;
 	__Zephyr_open = 0;
-	
+
 	return (ZERR_NONE);
 }
--- a/libpurple/protocols/zephyr/ZSetSrv.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/zephyr/ZSetSrv.c	Sat Feb 12 04:17:09 2011 +0900
@@ -5,7 +5,7 @@
  *
  *	Copyright (c) 1987 by the Massachusetts Institute of Technology.
  *	For copying and distribution information, see the file
- *	"mit-copyright.h". 
+ *	"mit-copyright.h".
  */
 
 #include "internal.h"
@@ -14,6 +14,6 @@
 	int	state;
 {
 	__Zephyr_server = state;
-	
+
 	return (ZERR_NONE);
 }
--- a/libpurple/protocols/zephyr/ZSubs.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/zephyr/ZSubs.c	Sat Feb 12 04:17:09 2011 +0900
@@ -6,7 +6,7 @@
  *
  *	Copyright (c) 1987,1988 by the Massachusetts Institute of Technology.
  *	For copying and distribution information, see the file
- *	"mit-copyright.h". 
+ *	"mit-copyright.h".
  */
 
 #include "internal.h"
@@ -76,7 +76,7 @@
 
     /* nitems = 0 means cancel all subscriptions; still need to allocate a */
     /* array for one item so we can cancel, however. */
-  
+
     list = (char **)malloc((unsigned)((nitems==0)?1:nitems)*3*sizeof(char *));
     if (!list)
         return (ENOMEM);
@@ -173,10 +173,10 @@
     retval = ZSendList(notice, lyst, num*3, ZAUTH);
     if (retval != ZERR_NONE && !authit)
 	retval = ZSendList(notice, lyst, num*3, ZNOAUTH);
-	
+
     if (retval != ZERR_NONE)
 	return (retval);
-    if ((retval = ZIfNotice(&retnotice, (struct sockaddr_in *)0, 
+    if ((retval = ZIfNotice(&retnotice, (struct sockaddr_in *)0,
 				ZCompareUIDPred, (char *)&notice->z_uid)) !=
 	ZERR_NONE)
 	return (retval);
--- a/libpurple/protocols/zephyr/ZVariables.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/zephyr/ZVariables.c	Sat Feb 12 04:17:09 2011 +0900
@@ -6,7 +6,7 @@
  *
  *	Copyright (c) 1987 by the Massachusetts Institute of Technology.
  *	For copying and distribution information, see the file
- *	"mit-copyright.h". 
+ *	"mit-copyright.h".
  */
 
 #include "libpurple/internal.h"
@@ -55,12 +55,12 @@
     char *varfile, *varfilebackup, varbfr[512];
 
     written = 0;
-	
+
     if ((varfile = get_localvarfile()) == NULL)
 	return (ZERR_INTERNAL);
 
     varfilebackup = g_strconcat(varfile, ".backup", NULL);
-	
+
     if (!(fpout = fopen(varfilebackup, "w"))) {
 	g_free(varfile);
 	g_free(varfilebackup);
@@ -78,7 +78,7 @@
 		fprintf(fpout, "%s\n", varbfr);
 	}
 	(void) fclose(fpin);		/* don't care about errs on input */
-    } 
+    }
     if (!written)
 	fprintf(fpout, "%s = %s\n", var, value);
     if (fclose(fpout) == EOF) {
@@ -94,7 +94,7 @@
     g_free(varfilebackup);
     g_free(varfile);
     return (ZERR_NONE);
-}	
+}
 
 Code_t ZUnsetVariable(var)
     char *var;
@@ -106,7 +106,7 @@
 	return (ZERR_INTERNAL);
 
     varfilebackup = g_strconcat(varfile, ".backup", NULL);
-	
+
     if (!(fpout = fopen(varfilebackup, "w"))) {
 	g_free(varfile);
 	g_free(varfilebackup);
@@ -120,7 +120,7 @@
 		fprintf(fpout, "%s\n", varbfr);
 	}
 	(void) fclose(fpin);		/* don't care about read close errs */
-    } 
+    }
     if (fclose(fpout) == EOF) {
 	g_free(varfilebackup);
 	g_free(varfile);
@@ -134,7 +134,7 @@
     g_free(varfilebackup);
     g_free(varfile);
     return (ZERR_NONE);
-}	
+}
 
 static char *get_localvarfile(void)
 {
@@ -146,7 +146,7 @@
     base = getenv("HOME");
     if (!base)
         base = getenv("HOMEPATH");
-    if (!base) 
+    if (!base)
         base = "C:\\";
 #endif
     if (!base) {
@@ -160,8 +160,8 @@
     }
 
     return g_strconcat(base, "/.zephyr.vars", NULL);
-} 
-	
+}
+
 static char *get_varval(fn, var)
     char *fn;
     char *var;
@@ -169,7 +169,7 @@
     FILE *fp;
     static char varbfr[512];
     int i;
-	
+
     fp = fopen(fn, "r");
     if (!fp)
 	return ((char *)0);
@@ -193,11 +193,11 @@
     char *var;
 {
     register char *cp;
-	
+
 
     if (!bfr[0] || bfr[0] == '#')	/* comment or null line */
 	return (0);
-	
+
     cp = bfr;
     while (*cp && !isspace(*cp) && (*cp != '='))
 	cp++;
--- a/libpurple/protocols/zephyr/ZWait4Not.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/zephyr/ZWait4Not.c	Sat Feb 12 04:17:09 2011 +0900
@@ -4,7 +4,7 @@
  *
  *	Copyright (c) 1991 by the Massachusetts Institute of Technology.
  *	For copying and distribution information, see the file
- *	"mit-copyright.h". 
+ *	"mit-copyright.h".
  */
 
 #include "internal.h"
--- a/libpurple/protocols/zephyr/ZhmStat.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/zephyr/ZhmStat.c	Sat Feb 12 04:17:09 2011 +0900
@@ -5,7 +5,7 @@
  *
  *      Copyright (c) 1996 by the Massachusetts Institute of Technology.
  *      For copying and distribution information, see the file
- *      "mit-copyright.h". 
+ *      "mit-copyright.h".
  */
 
 #include "internal.h"
@@ -53,7 +53,7 @@
     req.z_recipient = "";
     req.z_default_format = "";
     req.z_message_len = 0;
-	
+
     if ((code = ZSetDestAddr(&sin)) != ZERR_NONE)
 	return(code);
 
--- a/libpurple/protocols/zephyr/Zinternal.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/zephyr/Zinternal.c	Sat Feb 12 04:17:09 2011 +0900
@@ -6,7 +6,7 @@
  *	Copyright (c) 1987,1988,1991 by the Massachusetts Institute of
  *	Technology.
  *	For copying and distribution information, see the file
- *	"mit-copyright.h". 
+ *	"mit-copyright.h".
  */
 
 #include "internal.h"
@@ -25,12 +25,11 @@
      p->tv_sec= (long)((_now.ns100-(116444736000000000LL))/10000000LL);
      return 0;
    }
-#endif 
+#endif
 
 #else
 #include <arpa/inet.h>
 #include <sys/socket.h>
-#include <utmp.h>
 #endif
 
 int __Zephyr_fd = -1;
@@ -151,7 +150,7 @@
     FD_ZERO(&read);
     FD_SET(ZGetFD(), &read);
     return (select(ZGetFD() + 1, &read, NULL, NULL, &tv));
-} 
+}
 
 
 /* Wait for a complete notice to become available */
@@ -179,7 +178,7 @@
 
     if (ZGetFD() < 0)
 	return (ZERR_NOPORT);
-    
+
     while (Z_PacketWaiting())
 	if ((retval = Z_ReadWait()) != ZERR_NONE)
 	    return (retval);
@@ -238,7 +237,7 @@
 
     if (ZGetFD() < 0)
 	return (ZERR_NOPORT);
-	
+
     FD_ZERO(&fds);
     FD_SET(ZGetFD(), &fds);
     tv.tv_sec = 60;
@@ -251,7 +250,7 @@
 
     from_len = sizeof(struct sockaddr_in);
 
-    packet_len = recvfrom(ZGetFD(), packet, sizeof(packet), 0, 
+    packet_len = recvfrom(ZGetFD(), packet, sizeof(packet), 0,
 			  (struct sockaddr *)&from, &from_len);
 
     if (packet_len < 0)
@@ -265,7 +264,7 @@
     if (packet_len < zvlen || memcmp(packet, ZVERSIONHDR, zvlen) != 0) {
 	Z_discarded_packets++;
 	return (ZERR_NONE);
-    }	
+    }
 
     /* Parse the notice */
     if ((retval = ZParseNotice(packet, packet_len, &notice)) != ZERR_NONE)
@@ -393,13 +392,13 @@
     if (!__Q_Head)
 	__Q_Head = qptr;
 
-    
+
     /* Copy the from field, multiuid, kind, and checked authentication. */
     qptr->from = from;
     qptr->uid = notice.z_multiuid;
     qptr->kind = notice.z_kind;
     qptr->auth = notice.z_checked_auth;
-    
+
     /*
      * If this is the first part of the notice, we take the header
      * from it.  We only take it if this is the first fragment so that
@@ -486,7 +485,7 @@
 
     (void) gettimeofday(&tv, (struct timezone *)0);
     qptr->timep = tv.tv_sec;
-    
+
     last = part+notice->z_message_len-1;
 
     hole = qptr->holelist;
@@ -578,7 +577,7 @@
 	(void) memcpy(qptr->packet+qptr->header_len, qptr->msg,
 		       qptr->msg_len);
     }
-    
+
     return (ZERR_NONE);
 }
 
@@ -610,11 +609,11 @@
     }
 
     notice->z_multinotice = "";
-    
+
     (void) gettimeofday(&notice->z_uid.tv, (struct timezone *)0);
     notice->z_uid.tv.tv_sec = htonl((unsigned long) notice->z_uid.tv.tv_sec);
     notice->z_uid.tv.tv_usec = htonl((unsigned long) notice->z_uid.tv.tv_usec);
-    
+
     (void) memcpy(&notice->z_uid.zuid_addr, &__My_addr, sizeof(__My_addr));
 
     notice->z_multiuid = notice->z_uid;
@@ -642,10 +641,10 @@
 	return (Z_FormatRawHeader(notice, buffer, buffer_len,
 				  len, NULL, NULL));
     }
-    
+
     return ((*cert_routine)(notice, buffer, buffer_len, len));
-} 
-	
+}
+
 Code_t Z_FormatRawHeader(notice, buffer, buffer_len, len, cstart, cend)
     ZNotice_t *notice;
     char *buffer;
@@ -690,7 +689,7 @@
 	return (ZERR_HEADERLEN);
     ptr += strlen(ptr)+1;
 
-    if (ZMakeAscii(ptr, end-ptr, (unsigned char *)&notice->z_uid, 
+    if (ZMakeAscii(ptr, end-ptr, (unsigned char *)&notice->z_uid,
 		   sizeof(ZUnique_Id_t)) == ZERR_FIELDLEN)
 	return (ZERR_HEADERLEN);
     ptr += strlen(ptr)+1;
@@ -728,7 +727,7 @@
 	(void) sprintf(newrecip, "%s@%s", notice->z_recipient, __Zephyr_realm);
 	if (Z_AddField(&ptr, newrecip, end))
 	    return (ZERR_HEADERLEN);
-    }		
+    }
     if (Z_AddField(&ptr, notice->z_default_format, end))
 	return (ZERR_HEADERLEN);
 
@@ -744,17 +743,17 @@
     if (Z_AddField(&ptr, notice->z_multinotice, end))
 	return (ZERR_HEADERLEN);
 
-    if (ZMakeAscii(ptr, end-ptr, (unsigned char *)&notice->z_multiuid, 
+    if (ZMakeAscii(ptr, end-ptr, (unsigned char *)&notice->z_multiuid,
 		   sizeof(ZUnique_Id_t)) == ZERR_FIELDLEN)
 	return (ZERR_HEADERLEN);
     ptr += strlen(ptr)+1;
-	
+
     for (i=0;i<notice->z_num_other_fields;i++)
 	if (Z_AddField(&ptr, notice->z_other_fields[i], end))
 	    return (ZERR_HEADERLEN);
-    
+
     *len = ptr-buffer;
-	
+
     return (ZERR_NONE);
 }
 
@@ -808,39 +807,39 @@
     struct _Z_InputQ *qptr;
 {
     struct _Z_Hole *hole, *nexthole;
-    
+
     if (qptr->complete)
 	__Q_CompleteLength--;
 
     __Q_Size -= qptr->msg_len;
-    
+
     if (qptr->header)
 	free(qptr->header);
     if (qptr->msg)
 	free(qptr->msg);
     if (qptr->packet)
 	free(qptr->packet);
-    
+
     hole = qptr->holelist;
     while (hole) {
 	nexthole = hole->next;
 	free((char *)hole);
 	hole = nexthole;
     }
-    
+
     if (qptr == __Q_Head && __Q_Head == __Q_Tail) {
 	free ((char *)qptr);
 	__Q_Head = (struct _Z_InputQ *)0;
 	__Q_Tail = (struct _Z_InputQ *)0;
 	return;
     }
-    
+
     if (qptr == __Q_Head) {
 	__Q_Head = qptr->next;
 	__Q_Head->prev = (struct _Z_InputQ *)0;
 	free ((char *)qptr);
 	return;
-    } 
+    }
     if (qptr == __Q_Tail) {
 	__Q_Tail = qptr->prev;
 	__Q_Tail->next = (struct _Z_InputQ *)0;
@@ -864,15 +863,15 @@
     char multi[64];
     int offset, hdrsize, fragsize, ret_len, message_len, waitforack;
     Code_t retval;
-    
+
     hdrsize = len-notice->z_message_len;
     fragsize = Z_MAXPKTLEN-hdrsize-Z_FRAGFUDGE;
-    
+
     offset = 0;
 
     waitforack = ((notice->z_kind == UNACKED || notice->z_kind == ACKED)
 		  && !__Zephyr_server);
-    
+
     partnotice = *notice;
 
     while (offset < notice->z_message_len || !notice->z_message_len) {
@@ -885,7 +884,7 @@
 		htonl((unsigned long) partnotice.z_uid.tv.tv_sec);
 	    partnotice.z_uid.tv.tv_usec =
 		htonl((unsigned long) partnotice.z_uid.tv.tv_usec);
-	    (void) memcpy((char *)&partnotice.z_uid.zuid_addr, &__My_addr, 
+	    (void) memcpy((char *)&partnotice.z_uid.zuid_addr, &__My_addr,
 			  sizeof(__My_addr));
 	}
 	message_len = min(notice->z_message_len-offset, fragsize);
--- a/libpurple/protocols/zephyr/sysdep.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/zephyr/sysdep.h	Sat Feb 12 04:17:09 2011 +0900
@@ -5,7 +5,7 @@
  *
  *	Copyright (c) 1988,1991 by the Massachusetts Institute of Technology.
  *	For copying and distribution information, see the file
- *	"mit-copyright.h". 
+ *	"mit-copyright.h".
  */
 
 #ifndef __SYSDEP_H__
--- a/libpurple/protocols/zephyr/zephyr.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/protocols/zephyr/zephyr.c	Sat Feb 12 04:17:09 2011 +0900
@@ -9,7 +9,7 @@
  *
  * Some code borrowed from kzephyr, by
  * Chris Colohan <colohan+@cs.cmu.edu>
- * 
+ *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
  * the Free Software Foundation; either version 2 of the License, or
@@ -98,9 +98,9 @@
 	int num_children;
 };
 
-parse_tree null_parse_tree = { 
-	"", 
-	{NULL}, 
+parse_tree null_parse_tree = {
+	"",
+	{NULL},
 	0,
 };
 
@@ -175,7 +175,7 @@
 			ZSubscription_t sub;
 			sub.zsub_class = class;
 			sub.zsub_classinst = instance;
-			sub.zsub_recipient = recipient; 
+			sub.zsub_recipient = recipient;
 			ret_val = ZSubscribeTo(&sub,1,0);
 		}
 	}
@@ -188,7 +188,7 @@
 
 static char *zephyr_strip_local_realm(zephyr_account* zephyr,const char* user){
 	/*
-	  Takes in a username of the form username or username@realm 
+	  Takes in a username of the form username or username@realm
 	  and returns:
 	  username, if there is no realm, or the realm is the local realm
 	  or:
@@ -255,9 +255,9 @@
 /* returns true if zt1 is a subset of zt2.  This function is used to
    determine whether a zephyr sent to zt1 should be placed in the chat
    with triple zt2
- 
-   zt1 is a subset of zt2 
-   iff. the classnames are identical ignoring case 
+
+   zt1 is a subset of zt2
+   iff. the classnames are identical ignoring case
    AND. the instance names are identical (ignoring case), or zt2->instance is *.
    AND. the recipient names are identical
 */
@@ -266,7 +266,7 @@
 {
 
 	if (!zt2) {
-		purple_debug_error("zephyr","zt2 doesn't exist\n"); 
+		purple_debug_error("zephyr","zt2 doesn't exist\n");
 		return FALSE;
 	}
 	if (!zt1) {
@@ -339,7 +339,7 @@
 	return NULL;
 }
 
-/* 
+/*
    Converts strings to utf-8 if necessary using user specified encoding
 */
 
@@ -362,7 +362,7 @@
 	}
 }
 
-/* This parses HTML formatting (put out by one of the gtkimhtml widgets 
+/* This parses HTML formatting (put out by one of the gtkimhtml widgets
    And converts it to zephyr formatting.
    It currently deals properly with <b>, <br>, <i>, <font face=...>, <font color=...>,
    It ignores <font back=...>
@@ -801,19 +801,19 @@
 				}
 				for (; nlocs > 0; nlocs--) {
 					/* XXX add real error reporting */
-					
+
 					ZGetLocations(&locs, &one);
-					tmp = g_strdup_printf(_("<br>At %s since %s"), locs.host, locs.time);	
+					tmp = g_strdup_printf(_("<br>At %s since %s"), locs.host, locs.time);
 					purple_notify_user_info_add_pair(user_info, _("Location"), tmp);
 					g_free(tmp);
 				}
-				purple_notify_userinfo(gc, (b ? bname : user), 
+				purple_notify_userinfo(gc, (b ? bname : user),
 						     user_info, NULL, NULL);
 				purple_notify_user_info_destroy(user_info);
 			} else {
-				if (nlocs>0) 
+				if (nlocs>0)
 					purple_prpl_got_user_status(gc->account, b ? bname : user, "available", NULL);
-				else 
+				else
 					purple_prpl_got_user_status(gc->account, b ? bname : user, "offline", NULL);
 			}
 
@@ -825,7 +825,7 @@
 		PurpleConversation *gconv1;
 		PurpleConvChat *gcc;
 		char *ptr = (char *) notice.z_message + (strlen(notice.z_message) + 1);
-		int len; 
+		int len;
 		char *stripped_sender;
 		int signature_length = strlen(notice.z_message);
 		int message_has_no_body = 0;
@@ -839,7 +839,7 @@
 			len = 0;
 			purple_debug_info("zephyr","message_size %d %d %d\n",len,notice.z_message_len,signature_length);
 			buf3 = g_strdup("");
-						
+
 		} else {
 			len =  notice.z_message_len - ( signature_length +1);
 			purple_debug_info("zephyr","message_size %d %d %d\n",len,notice.z_message_len,signature_length);
@@ -856,11 +856,11 @@
 
 		stripped_sender = zephyr_strip_local_realm(zephyr,notice.z_sender);
 
-		if (!g_ascii_strcasecmp(notice.z_class, "MESSAGE") && !g_ascii_strcasecmp(notice.z_class_inst, "PERSONAL") 
+		if (!g_ascii_strcasecmp(notice.z_class, "MESSAGE") && !g_ascii_strcasecmp(notice.z_class_inst, "PERSONAL")
 		    && !g_ascii_strcasecmp(notice.z_recipient,zephyr->username)) {
 			if (!g_ascii_strcasecmp(notice.z_message, "Automated reply:"))
 				flags |= PURPLE_MESSAGE_AUTO_RESP;
-			
+
 			if (!g_ascii_strcasecmp(notice.z_opcode,"PING"))
 				serv_got_typing(gc,stripped_sender,ZEPHYR_TYPING_RECV_TIMEOUT, PURPLE_TYPING);
 			else
@@ -870,14 +870,14 @@
 			zephyr_triple *zt1, *zt2;
 			gchar *send_inst_utf8;
 			zephyr_account *zephyr = gc->proto_data;
-			zt1 = new_triple(gc->proto_data,notice.z_class, notice.z_class_inst, notice.z_recipient);
-			zt2 = find_sub_by_triple(gc->proto_data,zt1);
+			zt1 = new_triple(zephyr,notice.z_class, notice.z_class_inst, notice.z_recipient);
+			zt2 = find_sub_by_triple(zephyr,zt1);
 			if (!zt2) {
 				/* This is a server supplied subscription */
 				zephyr->subscrips = g_slist_append(zephyr->subscrips, new_triple(zephyr,zt1->class,zt1->instance,zt1->recipient));
-				zt2 = find_sub_by_triple(gc->proto_data,zt1);
-			} 
-					
+				zt2 = find_sub_by_triple(zephyr,zt1);
+			}
+
 			if (!zt2->open) {
 				zt2->open = TRUE;
 				serv_got_joined_chat(gc, zt2->id, zt2->name);
@@ -936,7 +936,7 @@
 			}
 		}
 		if ((tree != &null_parse_tree) && (tree->contents != NULL))
-			g_free(tree->contents);	  
+			g_free(tree->contents);
 
 	}
 	return 0;
@@ -954,7 +954,7 @@
 {
 	gchar* tc;
 
-	if (!ptree || ! key) 
+	if (!ptree || ! key)
 		return &null_parse_tree;
 
 	tc = tree_child(ptree,0)->contents;
@@ -976,7 +976,7 @@
 }
 
 static parse_tree *parse_buffer(gchar* source, gboolean do_parse) {
-	
+
 	parse_tree *ptree = g_new0(parse_tree,1);
 	ptree->contents = NULL;
 	ptree->num_children=0;
@@ -991,7 +991,7 @@
 				p++;
 				continue;
 			}
-			
+
 			/* Skip comments */
 			if(source[p] == ';') {
 				while(source[p] != '\n' && p < strlen(source)) {
@@ -999,7 +999,7 @@
 				}
 				continue;
 			}
-			
+
 			if(source[p] == '(') {
 				int nesting = 0;
 				gboolean in_quote = FALSE;
@@ -1036,12 +1036,12 @@
 					p++;
 				} else {
 					end_char = ' ';
-				}					      
+				}
 				do_parse = FALSE;
 
 				end = p;
 				while(source[end] != end_char && end < strlen(source)) {
-					if(source[end] == '\\') 
+					if(source[end] == '\\')
 						end++;
 					end++;
 				}
@@ -1136,16 +1136,16 @@
 				/*				  g_free(zsig); */
 				g_free(buf);
 				/* free_parse_tree(msgnode);
-				   free_parse_tree(bodynode); 
+				   free_parse_tree(bodynode);
 				   g_free(msg);
 				   g_free(zsig);
-				   g_free(buf); 
+				   g_free(buf);
 				*/
 			}
 			else if (!g_ascii_strncasecmp(spewtype,"zlocation",9)) {
 				/* check_loc or zephyr_zloc respectively */
 				/* XXX fix */
-				char *user; 
+				char *user;
 				PurpleBuddy *b;
 				const char *bname;
 				int nlocs = 0;
@@ -1166,7 +1166,7 @@
 				} else {
 					nlocs = 1;
 				}
-	
+
 				bname = b ? purple_buddy_get_name(b) : NULL;
 				if ((b && pending_zloc(zephyr,bname)) || pending_zloc(zephyr,user) || pending_zloc(zephyr,local_zephyr_normalize(zephyr,user))){
 					PurpleNotifyUserInfo *user_info = purple_notify_user_info_new();
@@ -1193,9 +1193,9 @@
 							     user_info, NULL, NULL);
 					purple_notify_user_info_destroy(user_info);
 				} else {
-					if (nlocs>0) 
+					if (nlocs>0)
 						purple_prpl_got_user_status(gc->account, b ? bname : user, "available", NULL);
-					else 
+					else
 						purple_prpl_got_user_status(gc->account, b ? bname : user, "offline", NULL);
 				}
 			}
@@ -1210,7 +1210,7 @@
 		}
 	} else {
 	}
-	
+
 	free_parse_tree(newparsetree);
 	return TRUE;
 }
@@ -1319,9 +1319,9 @@
 				int i;
 				for(i=0;i<numlocs;i++) {
 					ZGetLocations(&locations,&one);
-					if (nlocs>0) 
+					if (nlocs>0)
 						purple_prpl_got_user_status(account,name,"available",NULL);
-					else 
+					else
 						purple_prpl_got_user_status(account,name,"offline",NULL);
 				}
 			}
@@ -1330,7 +1330,7 @@
 			g_free(ald.user);
 			g_free(ald.version);
 #endif /* WIN32 */
-		} else 
+		} else
 			if (use_tzc(zephyr)) {
 				gchar *zlocstr = g_strdup_printf("((tzcfodder . zlocate) \"%s\")\n",chk);
 				size_t len = strlen(zlocstr);
@@ -1381,14 +1381,14 @@
 {
 	/* XXX This code may not be Win32 clean */
 	struct hostent *hent;
-	
+
 	if (gethostname(zephyr->ourhost, sizeof(zephyr->ourhost)) == -1) {
 		purple_debug_error("zephyr", "unable to retrieve hostname, %%host%% and %%canon%% will be wrong in subscriptions and have been set to unknown\n");
 		g_strlcpy(zephyr->ourhost, "unknown", sizeof(zephyr->ourhost));
 		g_strlcpy(zephyr->ourhostcanon, "unknown", sizeof(zephyr->ourhostcanon));
 		return;
 	}
-	
+
 	if (!(hent = gethostbyname(zephyr->ourhost))) {
 		purple_debug_error("zephyr", "unable to resolve hostname, %%canon%% will be wrong in subscriptions.and has been set to the value of %%host%%, %s\n",zephyr->ourhost);
 		g_strlcpy(zephyr->ourhostcanon, zephyr->ourhost, sizeof(zephyr->ourhostcanon));
@@ -1402,7 +1402,7 @@
 
 static void process_zsubs(zephyr_account *zephyr)
 {
-	/* Loads zephyr chats "(subscriptions) from ~/.zephyr.subs, and 
+	/* Loads zephyr chats "(subscriptions) from ~/.zephyr.subs, and
 	   registers (subscribes to) them on the server */
 
 	/* XXX deal with unsubscriptions */
@@ -1467,7 +1467,7 @@
 					} else {
 						z_class = g_strdup(triple[0]);
 					}
-					
+
 					if (!g_ascii_strcasecmp(triple[1],"%host%")) {
 						z_instance = g_strdup(zephyr->ourhost);
 					} else if (!g_ascii_strcasecmp(triple[1],"%canon%")) {
@@ -1499,6 +1499,7 @@
 
 static void process_anyone(PurpleConnection *gc)
 {
+	zephyr_account *zephyr = purple_connection_get_protocol_data(gc);
 	FILE *fd;
 	gchar buff[BUFSIZ], *filename;
 	PurpleGroup *g;
@@ -1515,12 +1516,12 @@
 			strip_comments(buff);
 			if (buff[0]) {
 				if (!(b = purple_find_buddy(gc->account, buff))) {
-					char *stripped_user = zephyr_strip_local_realm(gc->proto_data,buff);
+					char *stripped_user = zephyr_strip_local_realm(zephyr,buff);
 					purple_debug_info("zephyr","stripped_user %s\n",stripped_user);
 					if (!(b = purple_find_buddy(gc->account,stripped_user))){
 						b = purple_buddy_new(gc->account, stripped_user, NULL);
 						purple_blist_add_buddy(b, NULL, g, NULL);
-					} 
+					}
 					g_free(stripped_user);
 				}
 			}
@@ -1552,20 +1553,20 @@
 {
 	PurpleConnection *gc;
 	zephyr_account *zephyr;
-	gboolean read_anyone; 
-	gboolean read_zsubs; 
+	gboolean read_anyone;
+	gboolean read_zsubs;
 	gchar *exposure;
 
 	gc = purple_account_get_connection(account);
 	read_anyone = purple_account_get_bool(gc->account,"read_anyone",TRUE);
 	read_zsubs = purple_account_get_bool(gc->account,"read_zsubs",TRUE);
-	exposure = (gchar *)purple_account_get_string(gc->account, "exposure_level", EXPOSE_REALMVIS); 
+	exposure = (gchar *)purple_account_get_string(gc->account, "exposure_level", EXPOSE_REALMVIS);
 
 #ifdef WIN32
 	username = purple_account_get_username(account);
 #endif
 	gc->flags |= PURPLE_CONNECTION_AUTO_RESP | PURPLE_CONNECTION_HTML | PURPLE_CONNECTION_NO_BGCOLOR | PURPLE_CONNECTION_NO_URLDESC;
-	gc->proto_data = zephyr=g_new0(zephyr_account,1); 
+	gc->proto_data = zephyr=g_new0(zephyr_account,1);
 
 	zephyr->account = account;
 
@@ -1589,9 +1590,9 @@
 			purple_debug_error("zephyr", "pipe creation failed. killing\n");
 			exit(-1);
 		}
-		
+
 		pid = fork();
-		
+
 		if (pid == -1) {
 			purple_debug_error("zephyr", "forking failed\n");
 			exit(-1);
@@ -1618,10 +1619,10 @@
 			if (close(zephyr->totzc[0]) == -1) {
 				exit(-1);
 			}
-			/* tzc_command should really be of the form 
+			/* tzc_command should really be of the form
 			   path/to/tzc -e %s
 			   or
-			   ssh username@hostname pathtotzc -e %s 
+			   ssh username@hostname pathtotzc -e %s
 			   -- this should not require a password, and ideally should be kerberized ssh --
 			   or
 			   fsh username@hostname pathtotzc -e %s
@@ -1631,7 +1632,7 @@
 					/*					fprintf(stderr,"replacing %%s with %s\n",zephyr->exposure); */
 					tzc_cmd_array[i] = g_strdup(zephyr->exposure);
 					found_ps = TRUE;
-					
+
 				} else {
 					/*					fprintf(stderr,"keeping %s\n",tzc_cmd_array[i]); */
 				}
@@ -1712,24 +1713,24 @@
 
 			while(ptr < bufcur) {
 				if (*ptr == '(') {
-					parenlevel++; 
+					parenlevel++;
 				}
 				else if (*ptr == ')') {
 					parenlevel--;
 				}
 				purple_debug_info("zephyr","tzc parenlevel is %d\n",parenlevel);
 				switch (parenlevel) {
-				case 0: 
+				case 0:
 					break;
 				case 1:
 					/* Search for next beginning (, or for the ending */
 					ptr++;
-					while((*ptr != '(') && (*ptr != ')') && (ptr <bufcur)) 
+					while((*ptr != '(') && (*ptr != ')') && (ptr <bufcur))
 						ptr++;
-					if (ptr >= bufcur) 
+					if (ptr >= bufcur)
 						purple_debug_error("zephyr","tzc parsing error\n");
 					break;
-				case 2: 
+				case 2:
 					/* You are probably at
 					   (foo . bar ) or (foo . "bar") or (foo . chars) or (foo . numbers) or (foo . () )
 					   Parse all the data between the first and last f, and move past )
@@ -1749,9 +1750,9 @@
 						}
 					}
 					purple_debug_info("zephyr","tempstr parsed\n");
-					/* tempstr should now be a tempstridx length string containing all characters 
+					/* tempstr should now be a tempstridx length string containing all characters
 					   from that after the first ( to the one before the last paren ). */
-					/* We should have the following possible lisp strings but we don't care 
+					/* We should have the following possible lisp strings but we don't care
 					   (tzcspew . start) (version . "something") (pid . number)*/
 					/* We care about 'zephyrid . "username@REALM.NAME"' and 'exposure . "SOMETHING"' */
 					tempstridx=0;
@@ -1766,9 +1767,9 @@
 						tempstridx++;
 						while(tempstr[tempstridx] !='"' && tempstridx < 20000)
 							username[username_idx++]=tempstr[tempstridx++];
-							
+
 						zephyr->username = g_strdup_printf("%s",username);
-						if ((realm = strchr(username,'@'))) 
+						if ((realm = strchr(username,'@')))
 							zephyr->realm = g_strdup_printf("%s",realm+1);
 						else {
 							realm = (gchar *)purple_account_get_string(gc->account,"realm","");
@@ -1781,12 +1782,12 @@
 						/* else {
 						   zephyr->realm = g_strdup("local-realm");
 						   }*/
-							
+
 						g_free(username);
 					}  else {
 						purple_debug_info("zephyr", "something that's not zephyr id found %s\n",tempstr);
 					}
-					
+
 					/* We don't care about anything else yet */
 					g_free(tempstr);
 					break;
@@ -1850,8 +1851,8 @@
 		zephyr->nottimer = purple_timeout_add(100, check_notify_zeph02, gc);
 	} else if (use_tzc(zephyr)) {
 		zephyr->nottimer = purple_timeout_add(100, check_notify_tzc, gc);
-	} 
-	zephyr->loctimer = purple_timeout_add_seconds(20, check_loc, gc); 
+	}
+	zephyr->loctimer = purple_timeout_add_seconds(20, check_loc, gc);
 
 }
 
@@ -1881,7 +1882,7 @@
 		char *zclass, *zinst, *zrecip;
 		zt = s->data;
 		triple = g_strsplit(zt->name, ",", 3);
-		
+
 		/* deal with classes */
 		if (!g_ascii_strcasecmp(triple[0],zephyr->ourhost)) {
 			zclass = g_strdup("%host%");
@@ -1913,7 +1914,7 @@
 		}
 
 		fprintf(fd, "%s,%s,%s\n",zclass,zinst,zrecip);
-		 
+
 		g_free(zclass);
 		g_free(zinst);
 		g_free(zrecip);
@@ -1924,13 +1925,12 @@
 	fclose(fd);
 }
 
-static void write_anyone(PurpleConnection *gc)
+static void write_anyone(zephyr_account *zephyr)
 {
 	GSList *buddies;
 	char *fname;
 	FILE *fd;
 	PurpleAccount *account;
-	zephyr_account* zephyr = gc->proto_data;
 	fname = g_strdup_printf("%s/.anyone", purple_home_dir());
 	fd = g_fopen(fname, "w");
 	if (!fd) {
@@ -1938,7 +1938,7 @@
 		return;
 	}
 
-	account = purple_connection_get_account(gc);
+	account = zephyr->account;
 	for (buddies = purple_find_buddies(account, NULL); buddies;
 			buddies = g_slist_delete_link(buddies, buddies)) {
 		PurpleBuddy *b = buddies->data;
@@ -1966,10 +1966,10 @@
 	g_list_free(zephyr->pending_zloc_names);
 
 	if (purple_account_get_bool(gc->account, "write_anyone", FALSE))
-		write_anyone(gc);
+		write_anyone(zephyr);
 
 	if (purple_account_get_bool(gc->account, "write_zsubs", FALSE))
-		write_zsubs(gc->proto_data);
+		write_zsubs(zephyr);
 
 	s = zephyr->subscrips;
 	while (s) {
@@ -1995,7 +1995,7 @@
 			int err=errno;
 			if (err==EINVAL) {
 				purple_debug_error("zephyr","An invalid signal was specified when killing tzc\n");
-			} 
+			}
 			else if (err==ESRCH) {
 				purple_debug_error("zephyr","Tzc's pid didn't exist while killing tzc\n");
 			}
@@ -2009,7 +2009,7 @@
 	}
 }
 
-static int zephyr_send_message(zephyr_account *zephyr,char* zclass, char* instance, char* recipient, const char *im, 
+static int zephyr_send_message(zephyr_account *zephyr,char* zclass, char* instance, char* recipient, const char *im,
 			       const char *sig, char *opcode) ;
 
 static const char * zephyr_get_signature(void)
@@ -2032,7 +2032,7 @@
 	char *recipient;
 	zephyr_account *zephyr = gc->proto_data;
 
-	zt = find_sub_by_id(gc->proto_data,id);
+	zt = find_sub_by_id(zephyr,id);
 	if (!zt)
 		/* this should never happen. */
 		return -EINVAL;
@@ -2067,7 +2067,7 @@
 	}
 	zephyr_send_message(zephyr,"MESSAGE","PERSONAL",local_zephyr_normalize(zephyr,who),im,sig,"");
 
-	return 1; 
+	return 1;
 }
 
 /* Munge the outgoing zephyr so that any quotes or backslashes are
@@ -2091,7 +2091,7 @@
 				newmsg[pos2]='\\';
 				newmsg[pos2+1]='"';
 				pos2+=2;
-			} 
+			}
 			else {
 				newmsg[pos2] = message[pos];
 				pos2++;
@@ -2128,13 +2128,13 @@
 	return newmsg;
 }
 
-static int zephyr_send_message(zephyr_account *zephyr,char* zclass, char* instance, char* recipient, const char *im, 
-			       const char *sig, char *opcode) 
+static int zephyr_send_message(zephyr_account *zephyr,char* zclass, char* instance, char* recipient, const char *im,
+			       const char *sig, char *opcode)
 {
 
-	/* (From the tzc source) 
+	/* (From the tzc source)
 	 * emacs sends something of the form:
-	 * ((class . "MESSAGE") 
+	 * ((class . "MESSAGE")
 	 *  (auth . t)
 	 *  (recipients ("PERSONAL" . "bovik") ("test" . ""))
 	 *  (sender . "bovik")
@@ -2169,7 +2169,7 @@
 		ZNotice_t notice;
 		char *buf = g_strdup_printf("%s%c%s", sig, '\0', html_buf2);
 		memset((char *)&notice, 0, sizeof(notice));
-		
+
 		notice.z_kind = ACKED;
 		notice.z_port = 0;
 		notice.z_opcode = "";
@@ -2201,11 +2201,11 @@
 
 char *local_zephyr_normalize(zephyr_account *zephyr,const char *orig)
 {
-	/* 
-	   Basically the inverse of zephyr_strip_local_realm 
-	*/	
+	/*
+	   Basically the inverse of zephyr_strip_local_realm
+	*/
 	char* buf;
-	
+
 	if (!g_ascii_strcasecmp(orig, "")) {
 		return g_strdup("");
 	}
@@ -2214,7 +2214,7 @@
 		buf = g_strdup_printf("%s",orig);
 	} else {
 		buf = g_strdup_printf("%s@%s",orig,zephyr->realm);
-	} 
+	}
 	return buf;
 }
 
@@ -2281,7 +2281,7 @@
 
 	if (primitive == PURPLE_STATUS_AWAY) {
 		zephyr->away = g_strdup(purple_status_get_attr_string(status,"message"));
-	} 
+	}
 	else if (primitive == PURPLE_STATUS_AVAILABLE) {
 		if (use_zeph02(zephyr)) {
 			ZSetLocation(zephyr->exposure);
@@ -2295,7 +2295,7 @@
 			}
 			g_free(zexpstr);
 		}
-	} 
+	}
 	else if (primitive == PURPLE_STATUS_INVISIBLE) {
 		/* XXX handle errors */
 		if (use_zeph02(zephyr)) {
@@ -2312,12 +2312,12 @@
 	}
 }
 
-static GList *zephyr_status_types(PurpleAccount *account) 
+static GList *zephyr_status_types(PurpleAccount *account)
 {
 	PurpleStatusType *type;
 	GList *types = NULL;
 
-	/* zephyr has several exposures 
+	/* zephyr has several exposures
 	   NONE (where you are hidden, and zephyrs to you are in practice silently dropped -- yes this is wrong)
 	   OPSTAFF "hidden"
 	   REALM-VISIBLE visible to people in local realm
@@ -2410,13 +2410,13 @@
 	instname = g_hash_table_lookup(data, "instance");
 	recip = g_hash_table_lookup(data, "recipient");
 
-		
+
 	if (!classname)
 		return;
 
 	if (!g_ascii_strcasecmp(classname,"%host%"))
 		classname = g_strdup(zephyr->ourhost);
-	if (!g_ascii_strcasecmp(classname,"%canon%")) 
+	if (!g_ascii_strcasecmp(classname,"%canon%"))
 		classname = g_strdup(zephyr->ourhostcanon);
 
 	if (!instname || !strlen(instname))
@@ -2424,7 +2424,7 @@
 
 	if (!g_ascii_strcasecmp(instname,"%host%"))
 		instname = g_strdup(zephyr->ourhost);
-	if (!g_ascii_strcasecmp(instname,"%canon%")) 
+	if (!g_ascii_strcasecmp(instname,"%canon%"))
 		instname = g_strdup(zephyr->ourhostcanon);
 
 	if (!recip || (*recip == '*'))
@@ -2432,20 +2432,20 @@
 	if (!g_ascii_strcasecmp(recip, "%me%"))
 		recip = zephyr->username;
 
-	zt1 = new_triple(gc->proto_data,classname, instname, recip);
-	zt2 = find_sub_by_triple(gc->proto_data,zt1);
+	zt1 = new_triple(zephyr,classname, instname, recip);
+	zt2 = find_sub_by_triple(zephyr,zt1);
 	if (zt2) {
 		free_triple(zt1);
 		if (!zt2->open) {
-			if (!g_ascii_strcasecmp(instname,"*")) 
+			if (!g_ascii_strcasecmp(instname,"*"))
 				instname = "PERSONAL";
 			serv_got_joined_chat(gc, zt2->id, zt2->name);
 			zephyr_chat_set_topic(gc,zt2->id,instname);
 			zt2->open = TRUE;
-		}	
+		}
 		return;
 	}
-	
+
 	/*	sub.zsub_class = zt1->class;
 		sub.zsub_classinst = zt1->instance;
 		sub.zsub_recipient = zt1->recipient; */
@@ -2460,7 +2460,7 @@
 	zephyr->subscrips = g_slist_append(zephyr->subscrips, zt1);
 	zt1->open = TRUE;
 	serv_got_joined_chat(gc, zt1->id, zt1->name);
-	if (!g_ascii_strcasecmp(instname,"*")) 
+	if (!g_ascii_strcasecmp(instname,"*"))
 		instname = "PERSONAL";
 	zephyr_chat_set_topic(gc,zt1->id,instname);
 }
@@ -2519,7 +2519,7 @@
 static unsigned int zephyr_send_typing(PurpleConnection *gc, const char *who, PurpleTypingState state) {
 	gchar *recipient;
 	zephyr_account *zephyr = gc->proto_data;
-	if (use_tzc(zephyr)) 
+	if (use_tzc(zephyr))
 		return 0;
 
 	if (state == PURPLE_NOT_TYPING)
@@ -2563,9 +2563,9 @@
 	zephyr_account* zephyr = gc->proto_data;
 	char *sender = (char *)zephyr->username;
 
-	zt = find_sub_by_id(gc->proto_data,id);
+	zt = find_sub_by_id(zephyr,id);
 	/* find_sub_by_id can return NULL */
-	if (!zt) 
+	if (!zt)
 		return;
 	gconv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_CHAT, zt->name,
 												gc->account);
@@ -2586,7 +2586,7 @@
 	zephyr_account *zephyr = purple_conversation_get_gc(conv)->proto_data;
 	if (!g_ascii_strcasecmp(args[0],"*"))
 		return PURPLE_CMD_RET_FAILED;  /* "*" is not a valid argument */
-	else 
+	else
 		recipient = local_zephyr_normalize(zephyr,args[0]);
 
 	if (strlen(recipient) < 1)
@@ -2594,7 +2594,7 @@
 
 	if (zephyr_send_message(zephyr,"MESSAGE","PERSONAL",recipient,args[1],zephyr_get_signature(),""))
 		return PURPLE_CMD_RET_OK;
-	else 
+	else
 		return PURPLE_CMD_RET_FAILED;
 }
 
@@ -2638,7 +2638,7 @@
 	zephyr_account *zephyr = purple_conversation_get_gc(conv)->proto_data;
 	if ( zephyr_send_message(zephyr,"message",args[0],"",args[1],zephyr_get_signature(),""))
 		return PURPLE_CMD_RET_OK;
-	else 
+	else
 		return PURPLE_CMD_RET_FAILED;
 }
 
@@ -2649,7 +2649,7 @@
 	zephyr_account *zephyr = purple_conversation_get_gc(conv)->proto_data;
 	if ( zephyr_send_message(zephyr,args[0],args[1],"",args[2],zephyr_get_signature(),""))
 		return PURPLE_CMD_RET_OK;
-	else 
+	else
 		return PURPLE_CMD_RET_FAILED;
 }
 
@@ -2658,7 +2658,7 @@
 {
 	/* args = class, instance, recipient, message */
 	zephyr_account *zephyr = purple_conversation_get_gc(conv)->proto_data;
-	if ( zephyr_send_message(zephyr,args[0],args[1],args[2],args[3],zephyr_get_signature(),"")) 
+	if ( zephyr_send_message(zephyr,args[0],args[1],args[2],args[3],zephyr_get_signature(),""))
 		return PURPLE_CMD_RET_OK;
 	else
 		return PURPLE_CMD_RET_FAILED;
@@ -2669,7 +2669,7 @@
 {
 	/* args = instance, recipient, message */
 	zephyr_account *zephyr = purple_conversation_get_gc(conv)->proto_data;
-	if ( zephyr_send_message(zephyr,"message",args[0],args[1],args[2],zephyr_get_signature(),"")) 
+	if ( zephyr_send_message(zephyr,"message",args[0],args[1],args[2],zephyr_get_signature(),""))
 		return PURPLE_CMD_RET_OK;
 	else
 		return PURPLE_CMD_RET_FAILED;
@@ -2680,7 +2680,7 @@
 {
 	/* args = class, message */
 	zephyr_account *zephyr = purple_conversation_get_gc(conv)->proto_data;
-	if ( zephyr_send_message(zephyr,args[0],"PERSONAL","",args[1],zephyr_get_signature(),"")) 
+	if ( zephyr_send_message(zephyr,args[0],"PERSONAL","",args[1],zephyr_get_signature(),""))
 		return PURPLE_CMD_RET_OK;
 	else
 		return PURPLE_CMD_RET_FAILED;
@@ -2791,13 +2791,13 @@
 	ZSubscription_t subs;
 	if (use_zeph02(zephyr)) {
 		GString* subout = g_string_new("Subscription list<br>");
-		
+
 		title = g_strdup_printf("Server subscriptions for %s", zephyr->username);
-		
+
 		if (zephyr->port == 0) {
 			purple_debug_error("zephyr", "error while retrieving port\n");
 			return;
-		} 
+		}
 		if ((retval = ZRetrieveSubscriptions(zephyr->port,&nsubs)) != ZERR_NONE) {
 			/* XXX better error handling */
 			purple_debug_error("zephyr", "error while retrieving subscriptions from server\n");
@@ -2969,13 +2969,13 @@
 
 	option = purple_account_option_bool_new(_("Import from .anyone"), "read_anyone", TRUE);
 	prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option);
- 
+
 	option = purple_account_option_bool_new(_("Import from .zephyr.subs"), "read_zsubs", TRUE);
 	prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option);
- 
+
 	option = purple_account_option_string_new(_("Realm"), "realm", "");
 	prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option);
-	
+
 	option = purple_account_option_string_new(_("Exposure"), "exposure_level", tmp?tmp: EXPOSE_REALMVIS);
 	prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option);
 
--- a/libpurple/prpl.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/prpl.c	Sat Feb 12 04:17:09 2011 +0900
@@ -520,7 +520,7 @@
 	PurpleAccount *account = purple_connection_get_account(gc);
 
 	got_attention(gc, -1, who, type_code);
-	conv = 
+	conv =
 		purple_find_conversation_with_account(PURPLE_CONV_TYPE_ANY, who, account);
 	if (conv)
 		purple_prpl_attention(conv, who, type_code, PURPLE_MESSAGE_RECV,
@@ -565,14 +565,14 @@
 	PurpleConnection *gc = NULL;
 	PurplePlugin *prpl = NULL;
 	PurplePluginProtocolInfo *prpl_info = NULL;
-	
+
 	if (account)
 		gc = purple_account_get_connection(account);
 	if (gc)
 		prpl = purple_connection_get_prpl(gc);
 	if (prpl)
 		prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(prpl);
-	
+
 	if (prpl_info && PURPLE_PROTOCOL_PLUGIN_HAS_FUNC(prpl_info,
 			get_media_caps)) {
 		return prpl_info->get_media_caps(account, who);
@@ -600,7 +600,7 @@
 		const gchar *bname = purple_buddy_get_name(buddy);
 		list = g_slist_delete_link(list, list);
 
-		
+
 		newcaps = purple_prpl_get_media_caps(account, bname);
 		purple_buddy_set_media_caps(buddy, newcaps);
 
--- a/libpurple/prpl.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/prpl.h	Sat Feb 12 04:17:09 2011 +0900
@@ -274,7 +274,7 @@
 
 	/**
 	 * Returns a hashtable which maps #proto_chat_entry struct identifiers
-	 * to default options as strings based on chat_name. The resulting 
+	 * to default options as strings based on chat_name. The resulting
 	 * hashtable should be created with g_hash_table_new_full(g_str_hash,
 	 * g_str_equal, NULL, g_free);. Use #get_chat_name if you instead need
 	 * to extract a chat name from a hashtable.
@@ -366,7 +366,7 @@
 
 	/**
 	 * Returns a chat name based on the information in components. Use
-	 * #chat_info_defaults if you instead need to generate a hashtable 
+	 * #chat_info_defaults if you instead need to generate a hashtable
 	 * from a chat name.
 	 *
 	 * @param components A hashtable containing information about the chat.
@@ -377,7 +377,7 @@
 	 * Invite a user to join a chat.
 	 *
 	 * @param id      The id of the chat to invite the user to.
-	 * @param message A message displayed to the user when the invitation 
+	 * @param message A message displayed to the user when the invitation
 	 *                is received.
 	 * @param who     The name of the user to send the invation to.
 	 */
--- a/libpurple/request.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/request.c	Sat Feb 12 04:17:09 2011 +0900
@@ -1317,10 +1317,10 @@
 }
 
 void *
-purple_request_action_with_icon(void *handle, const char *title, 
+purple_request_action_with_icon(void *handle, const char *title,
 					const char *primary,
 					const char *secondary, int default_action,
-					PurpleAccount *account, const char *who, 
+					PurpleAccount *account, const char *who,
 					PurpleConversation *conv, gconstpointer icon_data,
 					gsize icon_size, void *user_data, size_t action_count, ...)
 {
@@ -1330,7 +1330,7 @@
 	g_return_val_if_fail(action_count > 0, NULL);
 
 	va_start(args, action_count);
-	ui_handle = purple_request_action_with_icon_varg(handle, title, primary, 
+	ui_handle = purple_request_action_with_icon_varg(handle, title, primary,
 		secondary, default_action, account, who, conv, icon_data, icon_size,
 		user_data, action_count, args);
 	va_end(args);
@@ -1374,7 +1374,7 @@
 purple_request_action_with_icon_varg(void *handle, const char *title,
 						 const char *primary, const char *secondary,
 						 int default_action,
-						 PurpleAccount *account, const char *who, 
+						 PurpleAccount *account, const char *who,
 						 PurpleConversation *conv, gconstpointer icon_data,
 						 gsize icon_size,
 						 void *user_data, size_t action_count, va_list actions)
--- a/libpurple/request.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/request.h	Sat Feb 12 04:17:09 2011 +0900
@@ -241,7 +241,7 @@
 	void *(*request_action_with_icon)(const char *title, const char *primary,
 	                        const char *secondary, int default_action,
 	                        PurpleAccount *account, const char *who,
-	                        PurpleConversation *conv, 
+	                        PurpleConversation *conv,
 	                        gconstpointer icon_data, gsize icon_size,
 	                        void *user_data,
 	                        size_t action_count, va_list actions);
@@ -1401,18 +1401,18 @@
 	void *user_data, size_t action_count, va_list actions);
 
 /**
- * Version of purple_request_action() supplying an image for the UI to 
+ * Version of purple_request_action() supplying an image for the UI to
  * optionally display as an icon in the dialog; see its documentation
  * @since 2.7.0
  */
-void *purple_request_action_with_icon(void *handle, const char *title, 
-	const char *primary, const char *secondary, int default_action, 
-	PurpleAccount *account, const char *who, PurpleConversation *conv, 
-	gconstpointer icon_data, gsize icon_size, void *user_data, 
+void *purple_request_action_with_icon(void *handle, const char *title,
+	const char *primary, const char *secondary, int default_action,
+	PurpleAccount *account, const char *who, PurpleConversation *conv,
+	gconstpointer icon_data, gsize icon_size, void *user_data,
 	size_t action_count, ...);
 
 /**
- * <tt>va_list</tt> version of purple_request_action_with_icon(); 
+ * <tt>va_list</tt> version of purple_request_action_with_icon();
  * see its documentation.
  * @since 2.7.0
  */
@@ -1508,7 +1508,7 @@
 						_("_Accept"), (accept_cb), _("_Cancel"), (cancel_cb))
 
 /**
- * A wrapper for purple_request_action_with_icon() that uses Accept and Cancel 
+ * A wrapper for purple_request_action_with_icon() that uses Accept and Cancel
  * buttons.
  */
 #define purple_request_accept_cancel_with_icon(handle, title, primary, secondary, \
--- a/libpurple/server.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/server.h	Sat Feb 12 04:17:09 2011 +0900
@@ -171,7 +171,7 @@
 /**
  * Called by a prpl when an account has joined a chat.
  *
- * @param gc   The connection on which the chat was joined. 
+ * @param gc   The connection on which the chat was joined.
  * @param id   The id of the chat, assigned by the prpl.
  * @param name The name of the chat.
  * @return     The resulting conversation
--- a/libpurple/tests/Makefile.am	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/tests/Makefile.am	Sat Feb 12 04:17:09 2011 +0900
@@ -11,6 +11,7 @@
 	    tests.h \
 		test_cipher.c \
 		test_jabber_caps.c \
+		test_jabber_digest_md5.c \
 		test_jabber_jutil.c \
 		test_jabber_scram.c \
 		test_qq.c \
--- a/libpurple/tests/check_libpurple.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/tests/check_libpurple.c	Sat Feb 12 04:17:09 2011 +0900
@@ -85,6 +85,7 @@
 
 	srunner_add_suite(sr, cipher_suite());
 	srunner_add_suite(sr, jabber_caps_suite());
+	srunner_add_suite(sr, jabber_digest_md5_suite());
 	srunner_add_suite(sr, jabber_jutil_suite());
 	srunner_add_suite(sr, jabber_scram_suite());
 	srunner_add_suite(sr, qq_suite());
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/tests/test_jabber_digest_md5.c	Sat Feb 12 04:17:09 2011 +0900
@@ -0,0 +1,59 @@
+#include <string.h>
+
+#include "tests.h"
+#include "../util.h"
+#include "../protocols/jabber/auth_digest_md5.h"
+#include "../protocols/jabber/jutil.h"
+
+START_TEST(test_parsing)
+{
+	GHashTable *table;
+
+	table = jabber_auth_digest_md5_parse("r=\"realm\",token=   \"   asdf\"");
+	fail_if(g_hash_table_lookup(table, "r") == NULL);
+	assert_string_equal("realm", g_hash_table_lookup(table, "r"));
+	fail_if(g_hash_table_lookup(table, "token") == NULL);
+	assert_string_equal("asdf", g_hash_table_lookup(table, "token"));
+	g_hash_table_destroy(table);
+
+	table = jabber_auth_digest_md5_parse("r=\"a\", token=   \"   asdf\"");
+	fail_if(g_hash_table_lookup(table, "r") == NULL);
+	assert_string_equal("a", g_hash_table_lookup(table, "r"));
+	fail_if(g_hash_table_lookup(table, "token") == NULL);
+	assert_string_equal("asdf", g_hash_table_lookup(table, "token"));
+	g_hash_table_destroy(table);
+
+	table = jabber_auth_digest_md5_parse("r=\"\", token=   \"   asdf\"");
+	fail_if(g_hash_table_lookup(table, "r") == NULL);
+	assert_string_equal("", g_hash_table_lookup(table, "r"));
+	fail_if(g_hash_table_lookup(table, "token") == NULL);
+	assert_string_equal("asdf", g_hash_table_lookup(table, "token"));
+	g_hash_table_destroy(table);
+
+	table = jabber_auth_digest_md5_parse("realm=\"somerealm\",nonce=\"OA6MG9tEQGm2hh\",qop=\"auth\",charset=utf-8,algorithm=md5-sess");
+	fail_if(g_hash_table_lookup(table, "realm") == NULL);
+	assert_string_equal("somerealm", g_hash_table_lookup(table, "realm"));
+	fail_if(g_hash_table_lookup(table, "nonce") == NULL);
+	assert_string_equal("OA6MG9tEQGm2hh", g_hash_table_lookup(table, "nonce"));
+	fail_if(g_hash_table_lookup(table, "qop") == NULL);
+	assert_string_equal("auth", g_hash_table_lookup(table, "qop"));
+	fail_if(g_hash_table_lookup(table, "charset") == NULL);
+	assert_string_equal("utf-8", g_hash_table_lookup(table, "charset"));
+	fail_if(g_hash_table_lookup(table, "algorithm") == NULL);
+	assert_string_equal("md5-sess", g_hash_table_lookup(table, "algorithm"));
+
+	g_hash_table_destroy(table);
+
+}
+END_TEST
+
+Suite *
+jabber_digest_md5_suite(void)
+{
+	Suite *s = suite_create("Jabber SASL DIGEST-MD5 functions");
+
+	TCase *tc = tcase_create("Parsing Functionality");
+	tcase_add_test(tc, test_parsing);
+	suite_add_tcase(s, tc);
+	return s;
+}
--- a/libpurple/tests/tests.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/tests/tests.h	Sat Feb 12 04:17:09 2011 +0900
@@ -10,6 +10,7 @@
 Suite * master_suite(void);
 Suite * cipher_suite(void);
 Suite * jabber_caps_suite(void);
+Suite * jabber_digest_md5_suite(void);
 Suite * jabber_jutil_suite(void);
 Suite * jabber_scram_suite(void);
 Suite * qq_suite(void);
--- a/libpurple/theme-manager.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/theme-manager.c	Sat Feb 12 04:17:09 2011 +0900
@@ -295,7 +295,7 @@
 PurpleTheme *
 purple_theme_manager_load_theme(const gchar *theme_dir, const gchar *type)
 {
-	PurpleThemeLoader *loader;	
+	PurpleThemeLoader *loader;
 
 	g_return_val_if_fail(theme_dir != NULL && type != NULL, NULL);
 
--- a/libpurple/upnp.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/upnp.c	Sat Feb 12 04:17:09 2011 +0900
@@ -142,6 +142,7 @@
 	gboolean add;
 	PurpleUPnPCallback cb;
 	gpointer cb_data;
+	gboolean success;
 	guint tima; /* purple_timeout_add handle */
 	PurpleUtilFetchUrlData *gfud;
 };
@@ -156,6 +157,19 @@
 static void lookup_public_ip(void);
 static void lookup_internal_ip(void);
 
+static gboolean
+fire_ar_cb_async_and_free(gpointer data)
+{
+	UPnPMappingAddRemove *ar = data;
+	if (ar) {
+		if (ar->cb)
+			ar->cb(ar->success, ar->cb_data);
+		g_free(ar);
+	}
+
+	return FALSE;
+}
+
 static void
 fire_discovery_callbacks(gboolean success)
 {
@@ -863,9 +877,8 @@
 	} else
 		purple_debug_info("upnp", "Successfully completed port mapping operation\n");
 
-	if (ar->cb)
-		ar->cb(success, ar->cb_data);
-	g_free(ar);
+	ar->success = success;
+	ar->tima = purple_timeout_add(0, fire_ar_cb_async_and_free, ar);
 }
 
 static void
@@ -882,10 +895,8 @@
 			if(!(internal_ip = purple_upnp_get_internal_ip())) {
 				purple_debug_error("upnp",
 					"purple_upnp_set_port_mapping(): couldn't get local ip\n");
-				/* UGLY */
-				if (ar->cb)
-					ar->cb(FALSE, ar->cb_data);
-				g_free(ar);
+				ar->success = FALSE;
+				ar->tima = purple_timeout_add(0, fire_ar_cb_async_and_free, ar);
 				return;
 			}
 			strncpy(action_name, "AddPortMapping",
@@ -908,15 +919,16 @@
 		return;
 	}
 
-
-	if (ar->cb)
-		ar->cb(FALSE, ar->cb_data);
-	g_free(ar);
+	ar->success = FALSE;
+	ar->tima = purple_timeout_add(0, fire_ar_cb_async_and_free, ar);
 }
 
 static gboolean
 fire_port_mapping_failure_cb(gpointer data)
 {
+	UPnPMappingAddRemove *ar = data;
+
+	ar->tima = 0;
 	do_port_mapping_cb(FALSE, data);
 	return FALSE;
 }
--- a/libpurple/util.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/util.c	Sat Feb 12 04:17:09 2011 +0900
@@ -664,159 +664,192 @@
 	return mktime(&tm);
 }
 
+/* originally taken from GLib trunk 1-6-11 */
+/* originally licensed as LGPL 2+ */
+static time_t
+mktime_utc(struct tm *tm)
+{
+	time_t retval;
+
+#ifndef HAVE_TIMEGM
+	static const gint days_before[] =
+	{
+		0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334
+	};
+#endif
+
+#ifndef HAVE_TIMEGM
+	if (tm->tm_mon < 0 || tm->tm_mon > 11)
+		return (time_t) -1;
+
+	retval = (tm->tm_year - 70) * 365;
+	retval += (tm->tm_year - 68) / 4;
+	retval += days_before[tm->tm_mon] + tm->tm_mday - 1;
+
+	if (tm->tm_year % 4 == 0 && tm->tm_mon < 2)
+		retval -= 1;
+
+	retval = ((((retval * 24) + tm->tm_hour) * 60) + tm->tm_min) * 60 + tm->tm_sec;
+#else
+	retval = timegm (tm);
+#endif /* !HAVE_TIMEGM */
+
+	return retval;
+}
+
 time_t
 purple_str_to_time(const char *timestamp, gboolean utc,
-                 struct tm *tm, long *tz_off, const char **rest)
+	struct tm *tm, long *tz_off, const char **rest)
 {
-	time_t retval = 0;
-	static struct tm t;
-	const char *c = timestamp;
-	int year = 0;
+	struct tm t;
+	const gchar *str;
+	gint year = 0;
 	long tzoff = PURPLE_NO_TZ_OFF;
-
-	time(&retval);
-	localtime_r(&retval, &t);
+	time_t retval;
+	gboolean mktime_with_utc = TRUE;
 
 	if (rest != NULL)
 		*rest = NULL;
 
+	g_return_val_if_fail(timestamp != NULL, 0);
+
+	str = timestamp;
+
+	/* Strip leading whitespace */
+	while (g_ascii_isspace(*str))
+		str++;
+
+	if (*str == '\0') {
+		if (rest != NULL && *str != '\0')
+			*rest = str;
+
+		return 0;
+	}
+
+	if (!g_ascii_isdigit(*str) && *str != '-' && *str != '+') {
+		if (rest != NULL && *str != '\0')
+			*rest = str;
+
+		return 0;
+	}
+
 	/* 4 digit year */
-	if (sscanf(c, "%04d", &year) && year > 1900)
-	{
-		c += 4;
-		if (*c == '-')
-			c++;
+	if (sscanf(str, "%04d", &year) && year >= 1900) {
+		str += 4;
+
+		if (*str == '-' || *str == '/')
+			str++;
+
 		t.tm_year = year - 1900;
 	}
 
 	/* 2 digit month */
-	if (!sscanf(c, "%02d", &t.tm_mon))
-	{
-		if (rest != NULL && *c != '\0')
-			*rest = c;
+	if (!sscanf(str, "%02d", &t.tm_mon)) {
+		if (rest != NULL && *str != '\0')
+			*rest = str;
+
 		return 0;
 	}
-	c += 2;
-	if (*c == '-' || *c == '/')
-		c++;
+
+	str += 2;
 	t.tm_mon -= 1;
 
+	if (*str == '-' || *str == '/')
+		str++;
+
 	/* 2 digit day */
-	if (!sscanf(c, "%02d", &t.tm_mday))
-	{
-		if (rest != NULL && *c != '\0')
-			*rest = c;
+	if (!sscanf(str, "%02d", &t.tm_mday)) {
+		if (rest != NULL && *str != '\0')
+			*rest = str;
+
 		return 0;
 	}
-	c += 2;
-	if (*c == '/')
-	{
-		c++;
-
-		if (!sscanf(c, "%04d", &t.tm_year))
-		{
-			if (rest != NULL && *c != '\0')
-				*rest = c;
+
+	str += 2;
+
+	/* Grab the year off the end if there's still stuff */
+	if (*str == '/' || *str == '-') {
+		/* But make sure we don't read the year twice */
+		if (year >= 1900) {
+			if (rest != NULL && *str != '\0')
+				*rest = str;
+
+			return 0;
+		}
+
+		str++;
+
+		if (!sscanf(str, "%04d", &t.tm_year)) {
+			if (rest != NULL && *str != '\0')
+				*rest = str;
+
 			return 0;
 		}
+
 		t.tm_year -= 1900;
-	}
-	else if (*c == 'T' || *c == '.')
-	{
-		c++;
-		/* we have more than a date, keep going */
-
-		/* 2 digit hour */
-		if ((sscanf(c, "%02d:%02d:%02d", &t.tm_hour, &t.tm_min, &t.tm_sec) == 3 && (c = c + 8)) ||
-		    (sscanf(c, "%02d%02d%02d", &t.tm_hour, &t.tm_min, &t.tm_sec) == 3 && (c = c + 6)))
+	} else if (*str == 'T' || *str == '.') {
+		str++;
+
+		/* Continue grabbing the hours/minutes/seconds */
+		if ((sscanf(str, "%02d:%02d:%02d", &t.tm_hour, &t.tm_min, &t.tm_sec) == 3 &&
+				(str += 8)) ||
+		    (sscanf(str, "%02d%02d%02d", &t.tm_hour, &t.tm_min, &t.tm_sec) == 3 &&
+				(str += 6)))
 		{
-			gboolean offset_positive = FALSE;
-			int tzhrs;
-			int tzmins;
-
-			t.tm_isdst = -1;
-
-			if (*c == '.') {
+			gint sign, tzhrs, tzmins;
+
+			if (*str == '.') {
+				/* Cut off those pesky micro-seconds */
 				do {
-					c++;
-				} while (*c >= '0' && *c <= '9'); /* dealing with precision we don't care about */
-			}
-			if (*c == '+')
-				offset_positive = TRUE;
-			if (((*c == '+' || *c == '-') && (c = c + 1)) &&
-			    ((sscanf(c, "%02d:%02d", &tzhrs, &tzmins) == 2 && (c = c + 5)) ||
-			     (sscanf(c, "%02d%02d", &tzhrs, &tzmins) == 2 && (c = c + 4))))
-			{
-				tzoff = tzhrs*60*60 + tzmins*60;
-				if (offset_positive)
-					tzoff *= -1;
-			}
-			else if ((*c == 'Z') && (c = c + 1))
-			{
-				/* 'Z' = Zulu = UTC */
-				tzoff = 0;
+					str++;
+				} while (*str >= '0' && *str <= '9');
 			}
-			else if (utc)
-			{
-				static struct tm tmptm;
-				time_t tmp;
-				tmp = mktime(&t);
-				/* we care about whether it *was* dst, and the offset, here on this
-				 * date, not whether we are currently observing dst locally *now*.
-				 * This isn't perfect, because we would need to know in advance the
-				 * offset we are trying to work out in advance to be sure this
-				 * works for times around dst transitions but it'll have to do. */
-				localtime_r(&tmp, &tmptm);
-				t.tm_isdst = tmptm.tm_isdst;
-#ifdef HAVE_TM_GMTOFF
-				t.tm_gmtoff = tmptm.tm_gmtoff;
-#endif
-			}
-
-			if (rest != NULL && *c != '\0')
-			{
-				if (*c == ' ')
-					c++;
-				if (*c != '\0')
-					*rest = c;
+
+			sign = (*str == '+') ? -1 : 1;
+
+			/* Process the timezone */
+			if (*str == '+' || *str == '-') {
+				str++;
+
+				if (((sscanf(str, "%02d:%02d", &tzhrs, &tzmins) == 2 && (str += 5)) ||
+					(sscanf(str, "%02d%02d", &tzhrs, &tzmins) == 2 && (str += 4))))
+				{
+					tzoff = tzhrs * 60 * 60 + tzmins * 60;
+					tzoff *= sign;
+				} else {
+					if (rest != NULL && *str != '\0')
+						*rest = str;
+
+					return 0;
+				}
+			} else if (*str == 'Z') {
+				/* 'Z' = Zulu = UTC */
+				str++;
+				utc = TRUE;
+			} else if (!utc) {
+				/* Local Time */
+				t.tm_isdst = -1;
+				mktime_with_utc = FALSE;
 			}
 
-			if (tzoff != PURPLE_NO_TZ_OFF || utc)
-			{
-#if defined(_WIN32)
-				long sys_tzoff;
-#endif
-
-#if defined(_WIN32) || defined(HAVE_TM_GMTOFF) || defined (HAVE_TIMEZONE)
-				if (tzoff == PURPLE_NO_TZ_OFF)
-					tzoff = 0;
-#endif
-
-#ifdef _WIN32
-				if ((sys_tzoff = wpurple_get_tz_offset()) == -1)
-					tzoff = PURPLE_NO_TZ_OFF;
-				else
-					tzoff += sys_tzoff;
-#else
-#ifdef HAVE_TM_GMTOFF
-				tzoff += t.tm_gmtoff;
-#else
-#	ifdef HAVE_TIMEZONE
-				tzset();    /* making sure */
-				tzoff -= timezone;
-#	endif
-#endif
-#endif /* _WIN32 */
-			}
-		}
-		else
-		{
-			if (rest != NULL && *c != '\0')
-				*rest = c;
+			if (utc)
+				tzoff = 0;
 		}
 	}
 
-	retval = mktime(&t);
+	if (rest != NULL && *str != '\0') {
+		/* Strip trailing whitespace */
+		while (g_ascii_isspace(*str))
+			str++;
+
+		if (*str != '\0')
+			*rest = str;
+	}
+
+	if (mktime_with_utc)
+		retval = mktime_utc(&t);
+	else
+		retval = mktime(&t);
 
 	if (tm != NULL)
 		*tm = t;
@@ -3977,27 +4010,27 @@
 			/* This chunk of code was copied from proxy.c http_start_connect_tunneling()
 			 * This is really a temporary hack - we need a more complete proxy handling solution,
 			 * so I didn't think it was worthwhile to refactor for reuse
-			 */ 
+			 */
 			char *t1, *t2, *ntlm_type1;
 			char hostname[256];
 			int ret;
-	
+
 			ret = gethostname(hostname, sizeof(hostname));
 			hostname[sizeof(hostname) - 1] = '\0';
 			if (ret < 0 || hostname[0] == '\0') {
 				purple_debug_warning("util", "proxy - gethostname() failed -- is your hostname set?");
 				strcpy(hostname, "localhost");
 			}
-	
+
 			t1 = g_strdup_printf("%s:%s",
 				purple_proxy_info_get_username(gpi),
 				purple_proxy_info_get_password(gpi) ?
 					purple_proxy_info_get_password(gpi) : "");
 			t2 = purple_base64_encode((const guchar *)t1, strlen(t1));
 			g_free(t1);
-	
+
 			ntlm_type1 = purple_ntlm_gen_type1(hostname, "");
-	
+
 			g_string_append_printf(request_str,
 				"Proxy-Authorization: Basic %s\r\n"
 				"Proxy-Authorization: NTLM %s\r\n"
--- a/libpurple/win32/giowin32.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/libpurple/win32/giowin32.c	Sat Feb 12 04:17:09 2011 +0900
@@ -72,14 +72,14 @@
 				 * as provided by WinSock.
 				 */
   GIOWin32ChannelType type;
-  
+
   gboolean debug;
 
   CRITICAL_SECTION mutex;
 
   /* This is used by G_IO_WIN32_WINDOWS_MESSAGES channels */
   HWND hwnd;			/* handle of window, or NULL */
-  
+
   /* Following fields are used by both fd and socket channels. */
   gboolean running;		/* Is reader thread running. FALSE if
 				 * EOF has been reached.
@@ -94,7 +94,7 @@
   gushort revents;
 
   /* Following fields used by fd channels for input */
-  
+
   /* Data is kept in a circular buffer. To be able to distinguish between
    * empty and full buffer, we cannot fill it completely, but have to
    * leave a one character gap.
@@ -154,7 +154,7 @@
   else
     return FALSE;
 #endif
-}  
+}
 
 static void
 g_io_channel_win32_init (GIOWin32Channel *channel)
@@ -178,7 +178,7 @@
 create_events (GIOWin32Channel *channel)
 {
   SECURITY_ATTRIBUTES sec_attrs;
-  
+
   sec_attrs.nLength = sizeof (SECURITY_ATTRIBUTES);
   sec_attrs.lpSecurityDescriptor = NULL;
   sec_attrs.bInheritHandle = FALSE;
@@ -254,7 +254,7 @@
       g_warning (G_STRLOC ": Error binding to reset_recv socket: %s\n",
 		 g_win32_error_message (WSAGetLastError ()));
     }
-  
+
   len = sizeof (local2);
   if (getsockname (channel->reset_recv, (struct sockaddr *)&local2, &len) == SOCKET_ERROR)
     {
@@ -292,12 +292,12 @@
 	     channel->fd,
 	     (guint) channel->data_avail_event,
 	     (guint) channel->data_avail_noticed_event);
-  
+
   channel->rdp = channel->wrp = 0;
   channel->running = TRUE;
 
   SetEvent (channel->space_avail_event);
-  
+
   while (channel->running)
     {
       FD_ZERO (&read_fds);
@@ -317,7 +317,7 @@
 	    FD_SET (channel->fd, &write_fds);
 	  if (watch->condition & G_IO_ERR)
 	    FD_SET (channel->fd, &except_fds);
-	  
+
 	  tmp = tmp->next;
 	}
       UNLOCK (channel->mutex);
@@ -328,9 +328,9 @@
 		 (FD_ISSET (channel->fd, &read_fds) ? " IN" : ""),
 		 (FD_ISSET (channel->fd, &write_fds) ? " OUT" : ""),
 		 (FD_ISSET (channel->fd, &except_fds) ? " ERR" : ""));
-      
+
       n = select (1, &read_fds, &write_fds, &except_fds, NULL);
-      
+
       LOCK (channel->mutex);
       if (channel->needs_close)
 	{
@@ -362,7 +362,7 @@
 	       (FD_ISSET (channel->fd, &read_fds) ? " IN" : ""),
 	       (FD_ISSET (channel->fd, &write_fds) ? " OUT" : ""),
 	       (FD_ISSET (channel->fd, &except_fds) ? " ERR" : ""));
-    
+
     if (FD_ISSET (channel->fd, &read_fds))
       channel->revents |= G_IO_IN;
     if (FD_ISSET (channel->fd, &write_fds))
@@ -418,9 +418,9 @@
   GIOWin32Watch *watch = (GIOWin32Watch *)source;
   GIOCondition buffer_condition = g_io_channel_get_buffer_condition (watch->channel);
   GIOWin32Channel *channel = (GIOWin32Channel *)watch->channel;
-  
+
   *timeout = -1;
-  
+
   if (channel->debug)
     g_print ("g_io_win32_prepare: for thread %#x buffer_condition:%#x\n"
 	     "  watch->pollfd.events:%#x watch->pollfd.revents:%#x channel->revents:%#x\n",
@@ -478,7 +478,7 @@
     {
       return (PeekMessage (&msg, channel->hwnd, 0, 0, PM_NOREMOVE));
     }
-  
+
   if (channel->type == G_IO_WIN32_SOCKET)
     {
       LOCK (channel->mutex);
@@ -503,14 +503,14 @@
   GIOFunc func = (GIOFunc)callback;
   GIOWin32Watch *watch = (GIOWin32Watch *)source;
   GIOCondition buffer_condition = g_io_channel_get_buffer_condition (watch->channel);
-  
+
   if (!func)
     {
       g_warning (G_STRLOC ": GIOWin32Watch dispatched without callback\n"
 		 "You must call g_source_connect().");
       return FALSE;
     }
-  
+
   return (*func) (watch->channel,
 		  (watch->pollfd.revents | buffer_condition) & watch->condition,
 		  user_data);
@@ -522,7 +522,7 @@
   GIOWin32Watch *watch = (GIOWin32Watch *)source;
   GIOWin32Channel *channel = (GIOWin32Channel *)watch->channel;
   char send_buffer[] = "f";
-  
+
   LOCK (channel->mutex);
   if (channel->debug)
     g_print ("g_io_win32_finalize: channel with thread %#x\n",
@@ -563,18 +563,18 @@
 
   source = g_source_new (&wp_g_io_watch_funcs, sizeof (GIOWin32Watch));
   watch = (GIOWin32Watch *)source;
-  
+
   watch->channel = channel;
   g_io_channel_ref (channel);
-  
+
   watch->condition = condition;
-  
+
   if (win32_channel->data_avail_event == NULL)
     create_events (win32_channel);
 
   watch->pollfd.fd = (gint) win32_channel->data_avail_event;
   watch->pollfd.events = condition;
-  
+
   if (win32_channel->debug)
     g_print ("g_io_win32_create_watch: fd:%d condition:%#x handle:%#x\n",
 	     win32_channel->fd, condition, watch->pollfd.fd);
@@ -597,7 +597,7 @@
 g_io_win32_free (GIOChannel *channel)
 {
   GIOWin32Channel *win32_channel = (GIOWin32Channel *)channel;
-  
+
   if (win32_channel->debug)
     g_print ("thread %#x: freeing channel, fd: %d\n",
 	     win32_channel->thread_id,
@@ -643,7 +643,7 @@
 
   if (win32_channel->debug)
     g_print ("g_io_win32_sock_read: recv:%d\n", result);
-  
+
   if (result == SOCKET_ERROR)
     {
       *bytes_read = 0;
@@ -674,7 +674,7 @@
 	internal_status = G_IO_STATUS_EOF;
     }
 
-  if ((internal_status == G_IO_STATUS_EOF) || 
+  if ((internal_status == G_IO_STATUS_EOF) ||
       (internal_status == G_IO_STATUS_ERROR))
     {
       LOCK (win32_channel->mutex);
@@ -697,7 +697,7 @@
   gint result;
   GIOChannelError error = G_IO_STATUS_NORMAL;
   char send_buffer[] = "sw";
-  
+
   if (win32_channel->debug)
     g_print ("g_io_win32_sock_write: sockfd:%d count:%d\n",
 	     win32_channel->fd, count);
@@ -705,10 +705,10 @@
 repeat:
 #endif
   result = send (win32_channel->fd, buf, count, 0);
-  
+
   if (win32_channel->debug)
     g_print ("g_io_win32_sock_write: send:%d\n", result);
-  
+
   if (result == SOCKET_ERROR)
     {
       *bytes_written = 0;
@@ -767,7 +767,7 @@
 	g_print ("thread %#x: closing socket %d\n",
 		 win32_channel->thread_id,
 		 win32_channel->fd);
-      
+
       closesocket (win32_channel->fd);
       win32_channel->fd = -1;
     }
--- a/pidgin/gtkaccount.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/pidgin/gtkaccount.c	Sat Feb 12 04:17:09 2011 +0900
@@ -2500,7 +2500,7 @@
 
 
 	prpl_icon = pidgin_create_prpl_icon(account, PIDGIN_PRPL_ICON_SMALL);
-	
+
 	aa = g_new0(struct auth_request, 1);
 	aa->auth_cb = auth_cb;
 	aa->deny_cb = deny_cb;
@@ -2509,14 +2509,14 @@
 	aa->alias = g_strdup(alias);
 	aa->account = account;
 	aa->add_buddy_after_auth = !on_list;
-	
+
 	alert = pidgin_make_mini_dialog_with_custom_icon(
 		gc, prpl_icon,
 		_("Authorize buddy?"), buffer, aa,
 		_("Authorize"), authorize_and_add_cb,
 		_("Deny"), deny_no_add_cb,
 		NULL);
-	
+
 	g_signal_connect_swapped(G_OBJECT(alert), "destroy", G_CALLBACK(free_auth_request), aa);
 	g_signal_connect(G_OBJECT(alert), "destroy", G_CALLBACK(purple_account_request_close), NULL);
 	pidgin_blist_add_alert(alert);
--- a/pidgin/gtkblist-theme-loader.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/pidgin/gtkblist-theme-loader.c	Sat Feb 12 04:17:09 2011 +0900
@@ -136,7 +136,7 @@
 	if (success) {
 		if ((success = (sub_node = xmlnode_get_child(root_node, "blist")) != NULL))
 			bgcolor = parse_color(sub_node, "color");
-		else 
+		else
 			purple_debug_warning("gtkblist-theme-loader", "Missing or problem with tags: <blist>.\n");
 	}
 
--- a/pidgin/gtkblist.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/pidgin/gtkblist.c	Sat Feb 12 04:17:09 2011 +0900
@@ -423,16 +423,13 @@
 {
 	GtkTreeIter iter;
 	GtkTreePath *path = NULL;
-	GValue val;
 	PurpleBlistNode *node;
 	const char *text = NULL;
 
 	path = gtk_tree_path_new_from_string (path_str);
 	gtk_tree_model_get_iter (GTK_TREE_MODEL(gtkblist->treemodel), &iter, path);
 	gtk_tree_path_free (path);
-	val.g_type = 0;
-	gtk_tree_model_get_value (GTK_TREE_MODEL(gtkblist->treemodel), &iter, NODE_COLUMN, &val);
-	node = g_value_get_pointer(&val);
+	gtk_tree_model_get(GTK_TREE_MODEL(gtkblist->treemodel), &iter, NODE_COLUMN, &node, -1);
 
 	switch (purple_blist_node_get_type(node)) {
 	case PURPLE_BLIST_CONTACT_NODE:
@@ -578,7 +575,6 @@
 {
 	GtkTreeIter iter;
 	GtkTreePath *path;
-	GValue val;
 	PurpleBlistNode *node;
 	PurpleGroup *dest;
 
@@ -586,9 +582,7 @@
 	path = gtk_tree_path_new_from_string (arg1);
 	gtk_tree_model_get_iter (GTK_TREE_MODEL(gtkblist->treemodel), &iter, path);
 	gtk_tree_path_free (path);
-	val.g_type = 0;
-	gtk_tree_model_get_value (GTK_TREE_MODEL(gtkblist->treemodel), &iter, NODE_COLUMN, &val);
-	node = g_value_get_pointer(&val);
+	gtk_tree_model_get(GTK_TREE_MODEL(gtkblist->treemodel), &iter, NODE_COLUMN, &node, -1);
 	gtk_tree_view_set_enable_search (GTK_TREE_VIEW(gtkblist->treeview), TRUE);
 	g_object_set(G_OBJECT(gtkblist->text_rend), "editable", FALSE, NULL);
 
@@ -973,7 +967,7 @@
 
 static GtkWidget *
 make_blist_request_dialog(PidginBlistRequestData *data, PurpleAccount *account,
-	const char *title, const char *window_role, const char *label_text, 
+	const char *title, const char *window_role, const char *label_text,
 	GCallback callback_func, PurpleFilterAccountFunc filter_func,
 	GCallback response_cb)
 {
@@ -1165,12 +1159,8 @@
 static void gtk_blist_row_expanded_cb(GtkTreeView *tv, GtkTreeIter *iter, GtkTreePath *path, gpointer user_data)
 {
 	PurpleBlistNode *node;
-	GValue val;
-
-	val.g_type = 0;
-	gtk_tree_model_get_value(GTK_TREE_MODEL(gtkblist->treemodel), iter, NODE_COLUMN, &val);
-
-	node = g_value_get_pointer(&val);
+
+	gtk_tree_model_get(GTK_TREE_MODEL(gtkblist->treemodel), iter, NODE_COLUMN, &node, -1);
 
 	if (PURPLE_BLIST_NODE_IS_GROUP(node)) {
 		char *title;
@@ -1191,12 +1181,8 @@
 static void gtk_blist_row_collapsed_cb(GtkTreeView *tv, GtkTreeIter *iter, GtkTreePath *path, gpointer user_data)
 {
 	PurpleBlistNode *node;
-	GValue val;
-
-	val.g_type = 0;
-	gtk_tree_model_get_value(GTK_TREE_MODEL(gtkblist->treemodel), iter, NODE_COLUMN, &val);
-
-	node = g_value_get_pointer(&val);
+
+	gtk_tree_model_get(GTK_TREE_MODEL(gtkblist->treemodel), iter, NODE_COLUMN, &node, -1);
 
 	if (PURPLE_BLIST_NODE_IS_GROUP(node)) {
 		char *title;
@@ -1231,13 +1217,9 @@
 static void gtk_blist_row_activated_cb(GtkTreeView *tv, GtkTreePath *path, GtkTreeViewColumn *col, gpointer data) {
 	PurpleBlistNode *node;
 	GtkTreeIter iter;
-	GValue val;
 
 	gtk_tree_model_get_iter(GTK_TREE_MODEL(gtkblist->treemodel), &iter, path);
-
-	val.g_type = 0;
-	gtk_tree_model_get_value (GTK_TREE_MODEL(gtkblist->treemodel), &iter, NODE_COLUMN, &val);
-	node = g_value_get_pointer(&val);
+	gtk_tree_model_get(GTK_TREE_MODEL(gtkblist->treemodel), &iter, NODE_COLUMN, &node, -1);
 
 	if(PURPLE_BLIST_NODE_IS_CONTACT(node) || PURPLE_BLIST_NODE_IS_BUDDY(node)) {
 		PurpleBuddy *buddy;
@@ -1515,7 +1497,7 @@
 	}
 	pidgin_new_item_from_stock(menu, _("I_M"), PIDGIN_STOCK_TOOLBAR_MESSAGE_NEW,
 			G_CALLBACK(gtk_blist_menu_im_cb), buddy, 0, 0, NULL);
-	
+
 #ifdef USE_VV
 	if (prpl_info && prpl_info->get_media_caps) {
 		PurpleAccount *account = purple_buddy_get_account(buddy);
@@ -1536,9 +1518,9 @@
 				G_CALLBACK(gtk_blist_menu_video_call_cb), buddy, 0, 0, NULL);
 		}
 	}
-	
+
 #endif
-	
+
 	if (prpl_info && prpl_info->send_file) {
 		if (!prpl_info->can_receive_file ||
 			prpl_info->can_receive_file(buddy->account->gc, buddy->name))
@@ -1600,7 +1582,6 @@
 gtk_blist_key_press_cb(GtkWidget *tv, GdkEventKey *event, gpointer data)
 {
 	PurpleBlistNode *node;
-	GValue val;
 	GtkTreeIter iter, parent;
 	GtkTreeSelection *sel;
 	GtkTreePath *path;
@@ -1609,10 +1590,7 @@
 	if(!gtk_tree_selection_get_selected(sel, NULL, &iter))
 		return FALSE;
 
-	val.g_type = 0;
-	gtk_tree_model_get_value(GTK_TREE_MODEL(gtkblist->treemodel), &iter,
-			NODE_COLUMN, &val);
-	node = g_value_get_pointer(&val);
+	gtk_tree_model_get(GTK_TREE_MODEL(gtkblist->treemodel), &iter, NODE_COLUMN, &node, -1);
 
 	if(event->state & GDK_CONTROL_MASK &&
 			(event->keyval == 'o' || event->keyval == 'O')) {
@@ -1953,7 +1931,6 @@
 {
 	GtkTreePath *path;
 	PurpleBlistNode *node;
-	GValue val;
 	GtkTreeIter iter;
 	GtkTreeSelection *sel;
 	PurplePlugin *prpl = NULL;
@@ -1965,9 +1942,7 @@
 	if (!gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(tv), event->x, event->y, &path, NULL, NULL, NULL))
 		return FALSE;
 	gtk_tree_model_get_iter(GTK_TREE_MODEL(gtkblist->treemodel), &iter, path);
-	val.g_type = 0;
-	gtk_tree_model_get_value(GTK_TREE_MODEL(gtkblist->treemodel), &iter, NODE_COLUMN, &val);
-	node = g_value_get_pointer(&val);
+	gtk_tree_model_get(GTK_TREE_MODEL(gtkblist->treemodel), &iter, NODE_COLUMN, &node, -1);
 	gtknode = (struct _pidgin_blist_node *)node->ui_data;
 
 	/* Right click draws a context menu */
@@ -2026,7 +2001,6 @@
 pidgin_blist_popup_menu_cb(GtkWidget *tv, void *user_data)
 {
 	PurpleBlistNode *node;
-	GValue val;
 	GtkTreeIter iter;
 	GtkTreeSelection *sel;
 	gboolean handled = FALSE;
@@ -2035,10 +2009,7 @@
 	if (!gtk_tree_selection_get_selected(sel, NULL, &iter))
 		return FALSE;
 
-	val.g_type = 0;
-	gtk_tree_model_get_value(GTK_TREE_MODEL(gtkblist->treemodel),
-							 &iter, NODE_COLUMN, &val);
-	node = g_value_get_pointer(&val);
+	gtk_tree_model_get(GTK_TREE_MODEL(gtkblist->treemodel), &iter, NODE_COLUMN, &node, -1);
 
 	/* Shift+F10 draws a context menu */
 	handled = pidgin_blist_show_context_menu(node, pidgin_treeview_popup_menu_position_func, tv, 0, GDK_CURRENT_TIME);
@@ -2279,13 +2250,10 @@
 		GtkTreePath *sourcerow = gtk_tree_row_reference_get_path(ref);
 		GtkTreeIter iter;
 		PurpleBlistNode *node = NULL;
-		GValue val;
 		if(!sourcerow)
 			return;
 		gtk_tree_model_get_iter(GTK_TREE_MODEL(gtkblist->treemodel), &iter, sourcerow);
-		val.g_type = 0;
-		gtk_tree_model_get_value (GTK_TREE_MODEL(gtkblist->treemodel), &iter, NODE_COLUMN, &val);
-		node = g_value_get_pointer(&val);
+		gtk_tree_model_get(GTK_TREE_MODEL(gtkblist->treemodel), &iter, NODE_COLUMN, &node, -1);
 		gtk_selection_data_set (data,
 					gdk_atom_intern ("PURPLE_BLIST_NODE", FALSE),
 					8, /* bits */
@@ -2302,7 +2270,6 @@
 		PurpleBlistNode *node = NULL;
 		PurpleBuddy *buddy;
 		PurpleConnection *gc;
-		GValue val;
 		GString *str;
 		const char *protocol;
 
@@ -2314,11 +2281,7 @@
 
 		gtk_tree_model_get_iter(GTK_TREE_MODEL(gtkblist->treemodel), &iter,
 								sourcerow);
-		val.g_type = 0;
-		gtk_tree_model_get_value(GTK_TREE_MODEL(gtkblist->treemodel), &iter,
-								 NODE_COLUMN, &val);
-
-		node = g_value_get_pointer(&val);
+		gtk_tree_model_get(GTK_TREE_MODEL(gtkblist->treemodel), &iter, NODE_COLUMN, &node, -1);
 
 		if (PURPLE_BLIST_NODE_IS_CONTACT(node))
 		{
@@ -2392,15 +2355,12 @@
 			/* if we're here, I think it means the drop is ok */
 			GtkTreeIter iter;
 			PurpleBlistNode *node;
-			GValue val;
 			struct _pidgin_blist_node *gtknode;
 
 			gtk_tree_model_get_iter(GTK_TREE_MODEL(gtkblist->treemodel),
 					&iter, path);
-			val.g_type = 0;
-			gtk_tree_model_get_value (GTK_TREE_MODEL(gtkblist->treemodel),
-					&iter, NODE_COLUMN, &val);
-			node = g_value_get_pointer(&val);
+			gtk_tree_model_get(GTK_TREE_MODEL(gtkblist->treemodel),
+					&iter, NODE_COLUMN, &node, -1);
 			gtknode = node->ui_data;
 
 			if (PURPLE_BLIST_NODE_IS_CONTACT(n)) {
@@ -2545,14 +2505,11 @@
 		{
 			GtkTreeIter iter;
 			PurpleBlistNode *node;
-			GValue val;
 
 			gtk_tree_model_get_iter(GTK_TREE_MODEL(gtkblist->treemodel),
 									&iter, path);
-			val.g_type = 0;
-			gtk_tree_model_get_value (GTK_TREE_MODEL(gtkblist->treemodel),
-									  &iter, NODE_COLUMN, &val);
-			node = g_value_get_pointer(&val);
+			gtk_tree_model_get(GTK_TREE_MODEL(gtkblist->treemodel),
+				&iter, NODE_COLUMN, &node, -1);
 
 			if (PURPLE_BLIST_NODE_IS_BUDDY(node))
 			{
@@ -2607,14 +2564,11 @@
 		{
 			GtkTreeIter iter;
 			PurpleBlistNode *node;
-			GValue val;
 
 			gtk_tree_model_get_iter(GTK_TREE_MODEL(gtkblist->treemodel),
 									&iter, path);
-			val.g_type = 0;
-			gtk_tree_model_get_value (GTK_TREE_MODEL(gtkblist->treemodel),
-									  &iter, NODE_COLUMN, &val);
-			node = g_value_get_pointer(&val);
+			gtk_tree_model_get(GTK_TREE_MODEL(gtkblist->treemodel),
+				&iter, NODE_COLUMN, &node, -1);
 
 			if (PURPLE_BLIST_NODE_IS_BUDDY(node))
 			{
@@ -2643,14 +2597,11 @@
 			{
 				GtkTreeIter iter;
 				PurpleBlistNode *node;
-				GValue val;
 
 				gtk_tree_model_get_iter(GTK_TREE_MODEL(gtkblist->treemodel),
 							&iter, path);
-				val.g_type = 0;
-				gtk_tree_model_get_value (GTK_TREE_MODEL(gtkblist->treemodel),
-							  &iter, NODE_COLUMN, &val);
-				node = g_value_get_pointer(&val);
+				gtk_tree_model_get(GTK_TREE_MODEL(gtkblist->treemodel),
+					&iter, NODE_COLUMN, &node, -1);
 
 				if (PURPLE_BLIST_NODE_IS_BUDDY(node) || PURPLE_BLIST_NODE_IS_CONTACT(node)) {
 					PurpleBuddy *b = PURPLE_BLIST_NODE_IS_BUDDY(node) ? PURPLE_BUDDY(node) : purple_contact_get_priority_buddy(PURPLE_CONTACT(node));
@@ -3215,16 +3166,13 @@
 	GtkTreePath *path;
 	GtkTreeIter iter;
 	PurpleBlistNode *node;
-	GValue val;
 	struct _pidgin_blist_node *gtknode;
 
 	if (!gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(tv), gtkblist->tip_rect.x, gtkblist->tip_rect.y + (gtkblist->tip_rect.height/2),
 		&path, NULL, NULL, NULL))
 		return FALSE;
 	gtk_tree_model_get_iter(GTK_TREE_MODEL(gtkblist->treemodel), &iter, path);
-	val.g_type = 0;
-	gtk_tree_model_get_value (GTK_TREE_MODEL(gtkblist->treemodel), &iter, NODE_COLUMN, &val);
-	node = g_value_get_pointer(&val);
+	gtk_tree_model_get(GTK_TREE_MODEL(gtkblist->treemodel), &iter, NODE_COLUMN, &node, -1);
 
 	if(!PURPLE_BLIST_NODE_IS_CONTACT(node)) {
 		gtk_tree_path_free(path);
@@ -3328,7 +3276,6 @@
 {
 	GtkTreeIter iter;
 	PurpleBlistNode *node;
-	GValue val;
 	gboolean editable = FALSE;
 
 	/* If we're editing a cell (e.g. alias editing), don't show the tooltip */
@@ -3342,9 +3289,8 @@
 	}
 
 	gtk_tree_model_get_iter(GTK_TREE_MODEL(gtkblist->treemodel), &iter, path);
-	val.g_type = 0;
-	gtk_tree_model_get_value (GTK_TREE_MODEL(gtkblist->treemodel), &iter, NODE_COLUMN, &val);
-	node = g_value_get_pointer(&val);
+	gtk_tree_model_get(GTK_TREE_MODEL(gtkblist->treemodel), &iter, NODE_COLUMN, &node, -1);
+
 	return pidgin_blist_create_tooltip_for_node(widget, node, w, h);
 }
 
@@ -3466,13 +3412,13 @@
 		}
 	}
 }
-	
+
 static void
 global_moods_for_each(gpointer key, gpointer value, gpointer user_data)
 {
 	GList **out_moods = (GList **) user_data;
 	PurpleMood *mood = (PurpleMood *) value;
-	
+
 	*out_moods = g_list_append(*out_moods, mood);
 }
 
@@ -3488,7 +3434,7 @@
 	GList *out_moods = NULL;
 	int i = 0;
 	int num_accounts = 0;
-	
+
 	for (; accounts ; accounts = g_list_delete_link(accounts, accounts)) {
 		PurpleAccount *account = (PurpleAccount *) accounts->data;
 		if (purple_account_is_connected(account)) {
@@ -3524,7 +3470,7 @@
 
 	while (out_moods) {
 		PurpleMood *mood = (PurpleMood *) out_moods->data;
-		int in_num_accounts = 
+		int in_num_accounts =
 			GPOINTER_TO_INT(g_hash_table_lookup(mood_counts, mood->mood));
 
 		if (in_num_accounts == num_accounts) {
@@ -3549,7 +3495,7 @@
 {
 	GList *accounts = purple_accounts_get_all_active();
 	const gchar *found_mood = NULL;
-	
+
 	for (; accounts ; accounts = g_list_delete_link(accounts, accounts)) {
 		PurpleAccount *account = (PurpleAccount *) accounts->data;
 
@@ -3584,7 +3530,7 @@
 	PurplePluginProtocolInfo *prpl_info = NULL;
 	PurpleMood *mood;
 	PurpleMood *global_moods = get_global_moods();
-	
+
 	if (account) {
 		PurplePresence *presence = purple_account_get_presence(account);
 		PurpleStatus *status = purple_presence_get_status(presence, "mood");
@@ -3658,7 +3604,7 @@
  ***************************************************/
 static GtkItemFactoryEntry blist_menu[] =
 {
-/* NOTE: Do not set any accelerator to Control+O. It is mapped by 
+/* NOTE: Do not set any accelerator to Control+O. It is mapped by
    gtk_blist_key_press_cb to "Get User Info" on the selected buddy. */
 
 	/* Buddies menu */
@@ -4115,7 +4061,7 @@
 
 		status = purple_presence_get_status(p, "mood");
 		name = purple_status_get_attr_string(status, PURPLE_MOOD_NAME);
-		
+
 		if (!(name && *name))
 			return NULL;
 
@@ -4425,7 +4371,7 @@
 		}
 	} else {
 		if (name_color) {
-			text = g_strdup_printf("<span font_desc='%s' color='%s'>%s</span>", 
+			text = g_strdup_printf("<span font_desc='%s' color='%s'>%s</span>",
 				name_font, name_color, nametext);
 		} else {
 			text = g_strdup_printf("<span font_desc='%s'>%s</span>", name_font,
@@ -6610,7 +6556,7 @@
 					ihrs, imin);
 			} else {
 				idle = g_strdup_printf("<span font_desc='%s'>%d:%02d</span>",
-					theme_font_get_face_default(pair, ""), 
+					theme_font_get_face_default(pair, ""),
 					ihrs, imin);
 			}
 		}
@@ -6715,7 +6661,7 @@
 				tmp = g_strdup_printf("<span font_desc='%s' color='%s'>%s</span>",
 						font, fg_color, mark);
 			} else {
-				tmp = g_strdup_printf("<span font_desc='%s'>%s</span>", font, 
+				tmp = g_strdup_printf("<span font_desc='%s'>%s</span>", font,
 					mark);
 			}
 			g_free(mark);
@@ -7750,14 +7696,11 @@
 	}
 
 	do {
-		GValue val;
 		PurpleBlistNode *n;
 		const char *this_name;
 		int cmp;
 
-		val.g_type = 0;
-		gtk_tree_model_get_value (GTK_TREE_MODEL(gtkblist->treemodel), &more_z, NODE_COLUMN, &val);
-		n = g_value_get_pointer(&val);
+		gtk_tree_model_get(GTK_TREE_MODEL(gtkblist->treemodel), &more_z, NODE_COLUMN, &n, -1);
 
 		if(PURPLE_BLIST_NODE_IS_CONTACT(n)) {
 			this_name = purple_contact_get_alias((PurpleContact*)n);
@@ -7780,7 +7723,6 @@
 				return;
 			}
 		}
-		g_value_unset(&val);
 	} while (gtk_tree_model_iter_next (GTK_TREE_MODEL(gtkblist->treemodel), &more_z));
 
 	if(cur) {
@@ -7821,14 +7763,11 @@
 	}
 
 	do {
-		GValue val;
 		PurpleBlistNode *n;
 		gint name_cmp;
 		gint presence_cmp;
 
-		val.g_type = 0;
-		gtk_tree_model_get_value (GTK_TREE_MODEL(gtkblist->treemodel), &more_z, NODE_COLUMN, &val);
-		n = g_value_get_pointer(&val);
+		gtk_tree_model_get(GTK_TREE_MODEL(gtkblist->treemodel), &more_z, NODE_COLUMN, &n, -1);
 
 		if(PURPLE_BLIST_NODE_IS_CONTACT(n)) {
 			this_buddy = purple_contact_get_priority_buddy((PurpleContact*)n);
@@ -7864,8 +7803,6 @@
 				return;
 			}
 		}
-
-		g_value_unset(&val);
 	}
 	while (gtk_tree_model_iter_next(GTK_TREE_MODEL(gtkblist->treemodel),
 									&more_z));
@@ -7922,15 +7859,12 @@
 	}
 
 	do {
-		GValue val;
 		PurpleBlistNode *n;
 		PurpleBlistNode *n2;
 		PurpleBuddy *buddy;
 		int cmp;
 
-		val.g_type = 0;
-		gtk_tree_model_get_value (GTK_TREE_MODEL(gtkblist->treemodel), &more_z, NODE_COLUMN, &val);
-		n = g_value_get_pointer(&val);
+		gtk_tree_model_get(GTK_TREE_MODEL(gtkblist->treemodel), &more_z, NODE_COLUMN, &n, -1);
 		this_log_activity_score = 0;
 
 		if(PURPLE_BLIST_NODE_IS_CONTACT(n)) {
@@ -7958,7 +7892,6 @@
 				return;
 			}
 		}
-		g_value_unset(&val);
 	} while (gtk_tree_model_iter_next (GTK_TREE_MODEL(gtkblist->treemodel), &more_z));
 
 	if (cur != NULL) {
@@ -8161,7 +8094,7 @@
 		gc = purple_account_get_connection(account);
 		plugin = gc && PURPLE_CONNECTION_IS_CONNECTED(gc) ? gc->prpl : NULL;
 		prpl_info = plugin ? PURPLE_PLUGIN_PROTOCOL_INFO(plugin) : NULL;
-		
+
 		if (prpl_info &&
 		    (PURPLE_PROTOCOL_PLUGIN_HAS_FUNC(prpl_info, get_moods) ||
 			 PURPLE_PLUGIN_HAS_ACTIONS(plugin))) {
--- a/pidgin/gtkblist.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/pidgin/gtkblist.h	Sat Feb 12 04:17:09 2011 +0900
@@ -119,7 +119,7 @@
 	GtkWidget *headline_hbox;       /**< Hbox for headline notification */
 	GtkWidget *headline_label;	/**< Label for headline notifications */
 	GtkWidget *headline_image;      /**< Image for headline notifications */
-	GdkPixbuf *headline_close;      /**< @deprecated: Close image for closing the headline without triggering the callback */ 
+	GdkPixbuf *headline_close;      /**< @deprecated: Close image for closing the headline without triggering the callback */
 	GCallback headline_callback;    /**< Callback for headline notifications */
 	gpointer headline_data;         /**< User data for headline notifications */
 	GDestroyNotify headline_destroy; /**< Callback to use for destroying the headline-data */
--- a/pidgin/gtkconv.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/pidgin/gtkconv.c	Sat Feb 12 04:17:09 2011 +0900
@@ -1184,7 +1184,7 @@
 }
 
 #ifdef USE_VV
-static void 
+static void
 menu_initiate_media_call_cb(gpointer data, guint action, GtkWidget *widget)
 {
 	PidginWindow *win = (PidginWindow *)data;
@@ -1219,7 +1219,7 @@
 	PurpleConversation *conv = pidgin_conv_window_get_active_conversation(win);
 
 	if (purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM) {
-		purple_prpl_send_attention(purple_conversation_get_gc(conv), 
+		purple_prpl_send_attention(purple_conversation_get_gc(conv),
 			purple_conversation_get_name(conv), 0);
 	}
 }
@@ -1975,6 +1975,7 @@
 	if (event->state & GDK_CONTROL_MASK) {
 		switch (event->keyval) {
 			case GDK_Page_Down:
+ 			case GDK_KP_Page_Down:
 			case ']':
 				if (!pidgin_conv_window_get_gtkconv_at_index(win, curconv + 1))
 					gtk_notebook_set_current_page(GTK_NOTEBOOK(win->notebook), 0);
@@ -1984,6 +1985,7 @@
 				break;
 
 			case GDK_Page_Up:
+ 			case GDK_KP_Page_Up:
 			case '[':
 				if (!pidgin_conv_window_get_gtkconv_at_index(win, curconv - 1))
 					gtk_notebook_set_current_page(GTK_NOTEBOOK(win->notebook), -1);
@@ -2184,11 +2186,13 @@
 			break;
 
 		case GDK_Page_Up:
+ 		case GDK_KP_Page_Up:
 			gtk_imhtml_page_up(GTK_IMHTML(gtkconv->imhtml));
 			return TRUE;
 			break;
 
 		case GDK_Page_Down:
+ 		case GDK_KP_Page_Down:
 			gtk_imhtml_page_down(GTK_IMHTML(gtkconv->imhtml));
 			return TRUE;
 			break;
@@ -2244,7 +2248,9 @@
 		(event->keyval == GDK_Left) ||
 		(event->keyval == GDK_Right) ||
 		(event->keyval == GDK_Page_Up) ||
+ 		(event->keyval == GDK_KP_Page_Up) ||
 		(event->keyval == GDK_Page_Down) ||
+ 		(event->keyval == GDK_KP_Page_Down) ||
 		(event->keyval == GDK_Home) ||
 		(event->keyval == GDK_End) ||
 		(event->keyval == GDK_Tab) ||
@@ -2282,7 +2288,7 @@
 
 	purple_debug_info("gtkconv", "setting active conversation on toolbar %p\n",
 		conv);
-	gtk_imhtmltoolbar_switch_active_conversation(GTK_IMHTMLTOOLBAR(gtkconv->toolbar), 
+	gtk_imhtmltoolbar_switch_active_conversation(GTK_IMHTMLTOOLBAR(gtkconv->toolbar),
 		conv);
 
 	if (old_conv == conv)
@@ -3360,7 +3366,7 @@
 		gtk_widget_set_sensitive(win->video_call,
 				caps & PURPLE_MEDIA_CAPS_VIDEO
 				? TRUE : FALSE);
-		gtk_widget_set_sensitive(win->audio_video_call, 
+		gtk_widget_set_sensitive(win->audio_video_call,
 				caps & PURPLE_MEDIA_CAPS_AUDIO_VIDEO
 				? TRUE : FALSE);
 	} else if (purple_conversation_get_type(conv)
@@ -3373,7 +3379,7 @@
 		gtk_widget_set_sensitive(win->audio_call, FALSE);
 		gtk_widget_set_sensitive(win->video_call, FALSE);
 		gtk_widget_set_sensitive(win->audio_video_call, FALSE);
-	}							
+	}
 #endif
 }
 
@@ -3530,7 +3536,7 @@
 		gtk_item_factory_get_widget(win->menu.item_factory,
 					    N_("/Conversation/Media/Audio\\/Video Call"));
 #endif
-	
+
 	/* --- */
 
 	win->menu.send_file =
@@ -6648,7 +6654,7 @@
 			buttons |= GTK_IMHTML_CUSTOM_SMILEY;
 		else
 			buttons &= ~GTK_IMHTML_CUSTOM_SMILEY;
-		
+
 		gtk_imhtml_set_format_functions(GTK_IMHTML(gtkconv->entry), buttons);
 		if (account != NULL)
 			gtk_imhtmltoolbar_associate_smileys(GTK_IMHTMLTOOLBAR(gtkconv->toolbar), purple_account_get_protocol_id(account));
--- a/pidgin/gtkdebug.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/pidgin/gtkdebug.c	Sat Feb 12 04:17:09 2011 +0900
@@ -385,20 +385,20 @@
 			gint m;
 			gint start_pos, end_pos;
 			GtkTextIter ms, me;
-			
+
 			if (!g_match_info_matches(match_info))
 				break;
-			
+
 			for (m = 0; m < g_match_info_get_match_count(match_info); m++)
 			{
 				if (m == 1)
 					continue;
-				
+
 				g_match_info_fetch_pos(match_info, m, &start_pos, &end_pos);
-				
+
 				if (end_pos == -1)
 					break;
-				
+
 				gtk_text_buffer_get_iter_at_offset(imhtml->text_buffer, &ms,
 													i + start_pos);
 				gtk_text_buffer_get_iter_at_offset(imhtml->text_buffer, &me,
@@ -407,7 +407,7 @@
 												  &ms, &me);
 				offset = end_pos;
 			}
-			
+
 			g_match_info_free(match_info);
 			p += offset;
 			i += offset;
--- a/pidgin/gtkdialogs.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/pidgin/gtkdialogs.c	Sat Feb 12 04:17:09 2011 +0900
@@ -73,7 +73,7 @@
 static const struct developer developers[] = {
 	{"Daniel 'datallah' Atallah",          NULL,                  NULL},
 	{"Paul 'darkrain42' Aurich",           NULL,                  NULL},
-	{"John 'rekkanoryo' Bailey",           N_("bug master"),      NULL},
+	{"John 'rekkanoryo' Bailey",           NULL,                  NULL},
 	{"Ethan 'Paco-Paco' Blanton",          NULL,                  NULL},
 	{"Hylke Bons",                         N_("artist"),          "hylkebons@gmail.com"},
 	/* feel free to not translate this */
@@ -199,7 +199,7 @@
 	{N_("Kurdish"),             "ku", "Rizoyê Xerzî", "rizoxerzi@hotmail.com"},
 	{N_("Lao"),                 "lo", "Anousak Souphavah", "anousak@gmail.com"},
 	{N_("Maithili"),            "mai", "Sangeeta Kumari", "sangeeta_0975@yahoo.com"},
-	{"Meadow Mari",             "mhr", "David Preece", "davidpreece1@gmail.com"},
+	{N_("Meadow Mari"),         "mhr", "David Preece", "davidpreece1@gmail.com"},
 	{N_("Macedonian"),          "mk", "Arangel Angov ", "arangel@linux.net.mk"},
 	{N_("Macedonian"),          "mk", "Ivana Kirkovska", "ivana.kirkovska@gmail.com"},
 	{N_("Macedonian"),          "mk", "Jovan Naumovski", "jovan@lugola.net"},
--- a/pidgin/gtkdocklet-gtk.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/pidgin/gtkdocklet-gtk.c	Sat Feb 12 04:17:09 2011 +0900
@@ -2,7 +2,7 @@
  * System tray icon (aka docklet) plugin for Purple
  *
  * Copyright (C) 2007 Anders Hasselqvist
- * 
+ *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License as
  * published by the Free Software Foundation; either version 2 of the
@@ -12,7 +12,7 @@
  * WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  * General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
@@ -54,6 +54,7 @@
 	 */
 	purple_debug_info("docklet", "failed to embed within timeout\n");
 	pidgin_docklet_remove();
+	purple_prefs_set_bool(PIDGIN_PREFS_ROOT "/docklet/gtk/embedded", FALSE);
 
 	embed_timeout = 0;
 	return FALSE;
@@ -98,7 +99,7 @@
 static void
 docklet_gtk_status_activated_cb(GtkStatusIcon *status_icon, gpointer user_data)
 {
-	pidgin_docklet_clicked(1); 
+	pidgin_docklet_clicked(1);
 }
 
 static void
@@ -255,6 +256,16 @@
 docklet_ui_init(void)
 {
 	pidgin_docklet_set_ui_ops(&ui_ops);
+
+	purple_prefs_add_none(PIDGIN_PREFS_ROOT "/docklet/gtk");
+	if (purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/docklet/x11/embedded")) {
+		purple_prefs_add_bool(PIDGIN_PREFS_ROOT "/docklet/gtk/embedded", TRUE);
+		purple_prefs_remove(PIDGIN_PREFS_ROOT "/docklet/x11/embedded");
+	} else {
+		purple_prefs_add_bool(PIDGIN_PREFS_ROOT "/docklet/gtk/embedded", FALSE);
+	}
+
 	gtk_icon_theme_append_search_path(gtk_icon_theme_get_default(),
 		DATADIR G_DIR_SEPARATOR_S "pixmaps" G_DIR_SEPARATOR_S "pidgin" G_DIR_SEPARATOR_S "tray");
 }
+
--- a/pidgin/gtkft.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/pidgin/gtkft.c	Sat Feb 12 04:17:09 2011 +0900
@@ -1156,11 +1156,11 @@
 
 static void
 pidgin_xfer_add_thumbnail(PurpleXfer *xfer, const gchar *formats)
-{	
+{
 	purple_debug_info("ft", "creating thumbnail for transfer\n");
 
 	if (purple_xfer_get_size(xfer) <= PIDGIN_XFER_MAX_SIZE_IMAGE_THUMBNAIL) {
-		GdkPixbuf *thumbnail = 
+		GdkPixbuf *thumbnail =
 			gdk_pixbuf_new_from_file_at_size(
 				purple_xfer_get_local_filename(xfer), 128, 128, NULL);
 
@@ -1172,7 +1172,7 @@
 			char *option_values[2] = {NULL, NULL};
 			int i;
 			gchar *format = NULL;
-			
+
 			for (i = 0; formats_split[i]; i++) {
 				if (purple_strequal(formats_split[i], "jpeg")) {
 					purple_debug_info("ft", "creating JPEG thumbnail\n");
@@ -1197,11 +1197,11 @@
 				format = formats_split[0];
 			}
 
-			gdk_pixbuf_save_to_bufferv(thumbnail, &buffer, &size, format, 
+			gdk_pixbuf_save_to_bufferv(thumbnail, &buffer, &size, format,
 				option_keys, option_values, NULL);
 
 			if (buffer) {
-				gchar *mimetype = g_strdup_printf("image/%s", format);				
+				gchar *mimetype = g_strdup_printf("image/%s", format);
 				purple_debug_info("ft",
 				                  "created thumbnail of %" G_GSIZE_FORMAT " bytes\n",
 					size);
--- a/pidgin/gtkimhtml.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/pidgin/gtkimhtml.c	Sat Feb 12 04:17:09 2011 +0900
@@ -99,6 +99,18 @@
 	gboolean (*context_menu)(GtkIMHtml *imhtml, GtkIMHtmlLink *link, GtkWidget *menu);
 } GtkIMHtmlProtocol;
 
+typedef struct _GtkIMHtmlFontDetail {
+	gushort size;
+	gchar *face;
+	gchar *fore;
+	gchar *back;
+	gchar *bg;
+	gchar *sml;
+	gboolean underline;
+	gboolean strike;
+	gshort bold;
+} GtkIMHtmlFontDetail;
+
 static gboolean
 gtk_text_view_drag_motion (GtkWidget        *widget,
                            GdkDragContext   *context,
@@ -3206,6 +3218,19 @@
 						    gtk_imhtml_toggle_underline(imhtml);
 						    font->underline = 1;
 						}
+
+						if (oldfont)
+						{
+						    font->strike = oldfont->strike;
+						}
+						if (textdec && font->strike != 1
+							&& g_ascii_strcasecmp(textdec, "line-through") == 0
+							&& (imhtml->format_functions & GTK_IMHTML_STRIKE)
+							&& !(options & GTK_IMHTML_NO_FORMATTING))
+						{
+						    gtk_imhtml_toggle_strike(imhtml);
+						    font->strike = 1;
+						}
 						g_free(textdec);
 
 						if (oldfont)
@@ -3258,6 +3283,8 @@
 							gtk_imhtml_font_set_size(imhtml, 3);
 							if (font->underline && !(options & GTK_IMHTML_NO_FORMATTING))
 							    gtk_imhtml_toggle_underline(imhtml);
+							if (font->strike && !(options & GTK_IMHTML_NO_FORMATTING))
+							    gtk_imhtml_toggle_strike(imhtml);
 							if (font->bold && !(options & GTK_IMHTML_NO_FORMATTING))
 								gtk_imhtml_toggle_bold(imhtml);
 							if (!(options & GTK_IMHTML_NO_FONTS))
@@ -3270,14 +3297,17 @@
 						else
 						{
 
-						    if ((font->size != oldfont->size) && !(options & GTK_IMHTML_NO_SIZES))
+							if ((font->size != oldfont->size) && !(options & GTK_IMHTML_NO_SIZES))
 							    gtk_imhtml_font_set_size(imhtml, oldfont->size);
 
 							if ((font->underline != oldfont->underline) && !(options & GTK_IMHTML_NO_FORMATTING))
 							    gtk_imhtml_toggle_underline(imhtml);
 
+							if ((font->strike != oldfont->strike) && !(options & GTK_IMHTML_NO_FORMATTING))
+							    gtk_imhtml_toggle_strike(imhtml);
+
 							if (((font->bold && !oldfont->bold) || (oldfont->bold && !font->bold)) && !(options & GTK_IMHTML_NO_FORMATTING))
-								gtk_imhtml_toggle_bold(imhtml);
+							    gtk_imhtml_toggle_bold(imhtml);
 
 							if (font->face && (!oldfont->face || strcmp(font->face, oldfont->face) != 0) && !(options & GTK_IMHTML_NO_FONTS))
 							    gtk_imhtml_toggle_fontface(imhtml, oldfont->face);
@@ -3286,7 +3316,7 @@
 							    gtk_imhtml_toggle_forecolor(imhtml, oldfont->fore);
 
 							if (font->back && (!oldfont->back || strcmp(font->back, oldfont->back) != 0) && !(options & GTK_IMHTML_NO_COLOURS))
-						      gtk_imhtml_toggle_backcolor(imhtml, oldfont->back);
+							    gtk_imhtml_toggle_backcolor(imhtml, oldfont->back);
 						}
 
 						g_free (font->face);
@@ -3845,7 +3875,7 @@
 gtk_imhtml_custom_smiley_save(GtkWidget *w, GtkIMHtmlImageSave *save)
 {
 	GtkIMHtmlImage *image = (GtkIMHtmlImage *)save->image;
-	
+
 	/* Create an add dialog */
 	PidginSmiley *editor = pidgin_smiley_edit(NULL, NULL);
 	pidgin_smiley_editor_set_shortcut(editor, image->filename);
--- a/pidgin/gtkimhtml.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/pidgin/gtkimhtml.h	Sat Feb 12 04:17:09 2011 +0900
@@ -50,7 +50,9 @@
 
 typedef struct _GtkIMHtml			GtkIMHtml;
 typedef struct _GtkIMHtmlClass		GtkIMHtmlClass;
+#if !(defined PIDGIN_DISABLE_DEPRECATED) && !(defined _PIDGIN_GTKIMHTML_C_)
 typedef struct _GtkIMHtmlFontDetail	GtkIMHtmlFontDetail;	/* The five elements contained in a FONT tag */
+#endif
 typedef struct _GtkSmileyTree		GtkSmileyTree;
 typedef struct _GtkIMHtmlSmiley		GtkIMHtmlSmiley;
 typedef struct _GtkIMHtmlScalable	GtkIMHtmlScalable;
@@ -162,6 +164,8 @@
 	GList *protocols; /* List of GtkIMHtmlProtocol's */
 };
 
+#if !(defined PIDGIN_DISABLE_DEPRECATED) && !(defined _PIDGIN_GTKIMHTML_C_)
+/** @deprecated as of 2.7.10 */
 struct _GtkIMHtmlFontDetail {
 	gushort size;
 	gchar *face;
@@ -172,6 +176,7 @@
 	gboolean underline;
 	gshort bold;
 };
+#endif
 
 struct _GtkSmileyTree {
 	GString *values;
--- a/pidgin/gtkimhtmltoolbar.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/pidgin/gtkimhtmltoolbar.c	Sat Feb 12 04:17:09 2011 +0900
@@ -1251,7 +1251,7 @@
 	for (iter = 0; buttons[iter].stock; iter++) {
 		if (buttons[iter].stock[0]) {
 			button = pidgin_pixbuf_toolbar_button_from_stock(buttons[iter].stock);
-			g_signal_connect(G_OBJECT(button), "button-press-event", G_CALLBACK(button_activate_on_click), toolbar);
+			g_signal_connect(G_OBJECT(button), "button-press-event", G_CALLBACK(gtk_imhtmltoolbar_popup_menu), toolbar);
 			g_signal_connect(G_OBJECT(button), "clicked",
 					 G_CALLBACK(buttons[iter].callback), toolbar);
 			*(buttons[iter].button) = button;
@@ -1262,7 +1262,7 @@
 	}
 	/* create the attention button (this is a bit hacky to not break ABI) */
 	button = pidgin_pixbuf_toolbar_button_from_stock(PIDGIN_STOCK_TOOLBAR_SEND_ATTENTION);
-	g_signal_connect(G_OBJECT(button), "button-press-event", G_CALLBACK(button_activate_on_click), toolbar);
+	g_signal_connect(G_OBJECT(button), "button-press-event", G_CALLBACK(gtk_imhtmltoolbar_popup_menu), toolbar);
 	g_signal_connect(G_OBJECT(button), "clicked",
 		G_CALLBACK(send_attention_cb), toolbar);
 	g_object_set_data(G_OBJECT(toolbar), "attention", button);
@@ -1471,7 +1471,7 @@
 	label = gtk_label_new_with_mnemonic(_("Smile!"));
 	gtk_box_pack_start(GTK_BOX(bbox), label, FALSE, FALSE, 0);
 	gtk_box_pack_start(GTK_BOX(box), smiley_button, FALSE, FALSE, 0);
-	g_signal_connect(G_OBJECT(smiley_button), "button-press-event", G_CALLBACK(button_activate_on_click), toolbar);
+	g_signal_connect(G_OBJECT(smiley_button), "button-press-event", G_CALLBACK(gtk_imhtmltoolbar_popup_menu), toolbar);
 	g_signal_connect_swapped(G_OBJECT(smiley_button), "clicked", G_CALLBACK(gtk_button_clicked), toolbar->smiley);
 	gtk_widget_show_all(smiley_button);
 
@@ -1590,11 +1590,11 @@
 		g_object_get_data(G_OBJECT(toolbar), "attention");
 
 	g_object_set_data(G_OBJECT(toolbar), "active_conv", conv);
-	
+
 	/* gray out attention button on protocols that don't support it
 	 for the time being it is always disabled for chats */
 	gtk_widget_set_sensitive(attention,
-		conv && prpl && purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM && 
+		conv && prpl && purple_conversation_get_type(conv) == PURPLE_CONV_TYPE_IM &&
 		PURPLE_PLUGIN_PROTOCOL_INFO(prpl)->send_attention != NULL);
 }
 
--- a/pidgin/gtkmedia.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/pidgin/gtkmedia.c	Sat Feb 12 04:17:09 2011 +0900
@@ -373,7 +373,7 @@
 	PurpleMediaManager *manager = purple_media_get_manager(media);
 	GstElement *element = purple_media_manager_get_pipeline(manager);
 	gulong handler_id = g_signal_handler_find(G_OBJECT(gst_pipeline_get_bus(GST_PIPELINE(element))),
-						  G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA, 0, 0, 
+						  G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_DATA, 0, 0,
 						  NULL, G_CALLBACK(level_message_cb), gtkmedia);
 	if (handler_id)
 		g_signal_handler_disconnect(G_OBJECT(gst_pipeline_get_bus(GST_PIPELINE(element))),
@@ -638,7 +638,7 @@
 	if (gtkmedia->priv->recv_widget == NULL
 			&& type & (PURPLE_MEDIA_RECV_VIDEO |
 			PURPLE_MEDIA_RECV_AUDIO)) {
-		recv_widget = gtk_vbox_new(FALSE, PIDGIN_HIG_BOX_SPACE);	
+		recv_widget = gtk_vbox_new(FALSE, PIDGIN_HIG_BOX_SPACE);
 		gtk_box_pack_start(GTK_BOX(gtkmedia->priv->display),
 				recv_widget, TRUE, TRUE, 0);
 		gtk_widget_show(recv_widget);
@@ -794,7 +794,7 @@
 		gtk_window_set_icon(GTK_WINDOW(gtkmedia), icon);
 		g_object_unref(icon);
 	}
-	
+
 	gtk_widget_show(gtkmedia->priv->display);
 }
 
@@ -918,8 +918,8 @@
 	PidginMedia *gtkmedia = PIDGIN_MEDIA(
 			pidgin_media_new(media, screenname));
 	PurpleBuddy *buddy = purple_find_buddy(account, screenname);
-	const gchar *alias = buddy ? 
-			purple_buddy_get_contact_alias(buddy) : screenname; 
+	const gchar *alias = buddy ?
+			purple_buddy_get_contact_alias(buddy) : screenname;
 	gtk_window_set_title(GTK_WINDOW(gtkmedia), alias);
 
 	if (purple_media_is_initiator(media, NULL, NULL) == TRUE)
@@ -932,10 +932,9 @@
 create_default_video_src(PurpleMedia *media,
 		const gchar *session_id, const gchar *participant)
 {
-	GstElement *sendbin, *src, *videoscale, *capsfilter;
+	GstElement *sendbin, *src;
 	GstPad *pad;
 	GstPad *ghost;
-	GstCaps *caps;
 
 #ifdef _WIN32
 	/* autovideosrc doesn't pick ksvideosrc for some reason */
@@ -960,19 +959,10 @@
 	}
 
 	sendbin = gst_bin_new("pidgindefaultvideosrc");
-	videoscale = gst_element_factory_make("videoscale", NULL);
-	capsfilter = gst_element_factory_make("capsfilter", NULL);
 
-	/* It was recommended to set the size <= 352x288 and framerate <= 20 */
-	caps = gst_caps_from_string("video/x-raw-yuv , width=[250,352] , "
-			"height=[200,288] , framerate=[1/1,20/1]");
-	g_object_set(G_OBJECT(capsfilter), "caps", caps, NULL);
+	gst_bin_add(GST_BIN(sendbin), src);
 
-	gst_bin_add_many(GST_BIN(sendbin), src,
-			videoscale, capsfilter, NULL);
-	gst_element_link_many(src, videoscale, capsfilter, NULL);
-
-	pad = gst_element_get_static_pad(capsfilter, "src");
+	pad = gst_element_get_static_pad(src, "src");
 	ghost = gst_ghost_pad_new("ghostsrc", pad);
 	gst_object_unref(pad);
 	gst_element_add_pad(sendbin, ghost);
@@ -1076,7 +1066,7 @@
 	g_signal_connect(G_OBJECT(manager), "init-media",
 			 G_CALLBACK(pidgin_media_new_cb), NULL);
 
-	purple_media_manager_set_ui_caps(manager, 
+	purple_media_manager_set_ui_caps(manager,
 			PURPLE_MEDIA_CAPS_AUDIO |
 			PURPLE_MEDIA_CAPS_AUDIO_SINGLE_DIRECTION |
 			PURPLE_MEDIA_CAPS_VIDEO |
--- a/pidgin/gtkprefs.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/pidgin/gtkprefs.c	Sat Feb 12 04:17:09 2011 +0900
@@ -1045,7 +1045,7 @@
 add_theme_prefs_combo(GtkWidget *vbox,
                       GtkSizeGroup *combo_sg, GtkSizeGroup *label_sg,
                       GtkListStore *theme_store,
-                      GCallback combo_box_cb, gpointer combo_box_cb_user_data, 
+                      GCallback combo_box_cb, gpointer combo_box_cb_user_data,
                       const char *label_str, const char *prefs_path,
                       const char *theme_type)
 {
@@ -1098,7 +1098,7 @@
 	/* Buddy List Themes */
 	prefs_blist_themes_combo_box = add_theme_prefs_combo(
 		vbox, combo_sg, label_sg, prefs_blist_themes,
-		(GCallback)prefs_set_blist_theme_cb, NULL, 
+		(GCallback)prefs_set_blist_theme_cb, NULL,
 		_("Buddy List Theme:"), PIDGIN_PREFS_ROOT "/blist/theme", "blist");
 
 	/* Status Icon Themes */
@@ -1793,7 +1793,7 @@
 
 	hbox = pidgin_add_widget_to_vbox(GTK_BOX(vbox), _("_TURN server:"),
 			sg, entry, TRUE, NULL);
-	
+
 	pidgin_prefs_labeled_spin_button(hbox, _("_UDP Port:"),
 		"/purple/network/turn_port", 0, 65535, NULL);
 
@@ -1941,7 +1941,7 @@
 		gtk_widget_show_all(ret);
 	} else {
 		sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
-	
+
 		browsers = get_available_browsers();
 		if (browsers != NULL) {
 			label = pidgin_prefs_dropdown_from_list(vbox,_("_Browser:"), PURPLE_PREF_STRING,
@@ -1950,7 +1950,7 @@
 			g_list_free(browsers);
 			gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
 			gtk_size_group_add_widget(sg, label);
-	
+
 			hbox = gtk_hbox_new(FALSE, 0);
 			label = pidgin_prefs_dropdown(hbox, _("_Open link in:"), PURPLE_PREF_INT,
 				PIDGIN_PREFS_ROOT "/browsers/place",
@@ -1962,7 +1962,7 @@
 			gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
 			gtk_size_group_add_widget(sg, label);
 			gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
-	
+
 			if (!strcmp(purple_prefs_get_string(PIDGIN_PREFS_ROOT "/browsers/browser"), "custom"))
 				gtk_widget_set_sensitive(hbox, FALSE);
 			purple_prefs_connect_callback(prefs, PIDGIN_PREFS_ROOT "/browsers/browser",
@@ -1979,7 +1979,7 @@
 			gtk_widget_set_sensitive(hbox, FALSE);
 		purple_prefs_connect_callback(prefs, PIDGIN_PREFS_ROOT "/browsers/browser",
 				browser_changed2_cb, hbox);
-	
+
 		gtk_widget_show_all(ret);
 		g_object_unref(sg);
 	}
--- a/pidgin/gtkrequest.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/pidgin/gtkrequest.c	Sat Feb 12 04:17:09 2011 +0900
@@ -595,7 +595,7 @@
 static void *
 pidgin_request_action_with_icon(const char *title, const char *primary,
 						const char *secondary, int default_action,
-					    PurpleAccount *account, const char *who, 
+					    PurpleAccount *account, const char *who,
 						PurpleConversation *conv, gconstpointer icon_data,
 						gsize icon_size,
 						void *user_data, size_t action_count, va_list actions)
@@ -693,7 +693,7 @@
 		gdk_pixbuf_loader_close(loader, NULL);
 		g_object_unref(loader);
 	}
-	
+
 	if (!img) {
 		img = gtk_image_new_from_stock(PIDGIN_STOCK_DIALOG_QUESTION,
 				       gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_HUGE));
--- a/pidgin/gtkscrollbook.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/pidgin/gtkscrollbook.c	Sat Feb 12 04:17:09 2011 +0900
@@ -141,7 +141,7 @@
 static gboolean
 scroll_close_cb(PidginScrollBook *scroll_book, GdkEventButton *event)
 {
-	if (event->type == GDK_BUTTON_PRESS)	
+	if (event->type == GDK_BUTTON_PRESS)
 		gtk_widget_destroy(gtk_notebook_get_nth_page(GTK_NOTEBOOK(scroll_book->notebook), gtk_notebook_get_current_page(GTK_NOTEBOOK(scroll_book->notebook))));
 	return FALSE;
 }
--- a/pidgin/gtksound.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/pidgin/gtksound.c	Sat Feb 12 04:17:09 2011 +0900
@@ -221,7 +221,7 @@
 }
 
 static void
-got_attention_cb(PurpleAccount *account, const char *who, 
+got_attention_cb(PurpleAccount *account, const char *who,
 	PurpleConversation *conv, guint type, PurpleSoundEventID event)
 {
 	play_conv_event(conv, event);
@@ -362,7 +362,7 @@
 						  GINT_TO_POINTER(PURPLE_SOUND_GOT_ATTENTION));
 	/* for the time being, don't handle sent-attention here, since playing a
 	 sound would result induplicate sounds. And fixing that would require changing the
-	 conversation signal for msg-recv */	
+	 conversation signal for msg-recv */
 }
 
 static void
--- a/pidgin/gtksourceiter.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/pidgin/gtksourceiter.c	Sat Feb 12 04:17:09 2011 +0900
@@ -154,7 +154,7 @@
 	p = g_utf8_offset_to_pointer (caseless_haystack, i);
 	needle_len = strlen (needle);
 
-	while (p >= caseless_haystack)
+	while (1)
 	{
 		if (strncmp (p, needle, needle_len) == 0)
 		{
@@ -162,7 +162,11 @@
 			goto finally_1;
 		}
 
-		p = g_utf8_prev_char (p);
+		if (p > caseless_haystack)
+			p = g_utf8_prev_char (p);
+		else
+			goto finally_1;
+
 		i--;
 	}
 
--- a/pidgin/gtksourceundomanager.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/pidgin/gtksourceundomanager.c	Sat Feb 12 04:17:09 2011 +0900
@@ -683,8 +683,10 @@
 		g_free (action->action.delete.text);
 	else if (action->action_type == GTK_SOURCE_UNDO_ACTION_INSERT_ANCHOR)
 		g_object_unref(action->action.insert_anchor.anchor);
-	else
+	else {
+		g_free (action);
 		g_return_if_reached ();
+	}
 
 	g_free (action);
 }
--- a/pidgin/gtkthemes.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/pidgin/gtkthemes.c	Sat Feb 12 04:17:09 2011 +0900
@@ -270,7 +270,7 @@
 			if (len == 0)
 				continue;
 		}
-		
+
 		i = buf;
 		while (isspace(*i))
 			i++;
--- a/pidgin/gtkutils.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/pidgin/gtkutils.c	Sat Feb 12 04:17:09 2011 +0900
@@ -1463,6 +1463,7 @@
 
 static void dnd_image_ok_callback(_DndData *data, int choice)
 {
+	const gchar *shortname;
 	gchar *filedata;
 	size_t size;
 	struct stat st;
@@ -1517,7 +1518,9 @@
 
 			break;
 		}
-		id = purple_imgstore_add_with_id(filedata, size, data->filename);
+		shortname = strrchr(data->filename, G_DIR_SEPARATOR);
+		shortname = shortname ? shortname + 1 : data->filename;
+		id = purple_imgstore_add_with_id(filedata, size, shortname);
 
 		gtk_text_buffer_get_iter_at_mark(GTK_IMHTML(gtkconv->entry)->text_buffer, &iter,
 						 gtk_text_buffer_get_insert(GTK_IMHTML(gtkconv->entry)->text_buffer));
@@ -2921,7 +2924,7 @@
 	GtkComboBox *ret = NULL;
 	GtkWidget *the_entry = NULL;
 
-	ret = GTK_COMBO_BOX(gtk_combo_box_new_text());
+	ret = GTK_COMBO_BOX(gtk_combo_box_entry_new_text());
 	the_entry = gtk_entry_new();
 	gtk_container_add(GTK_CONTAINER(ret), the_entry);
 
--- a/pidgin/minidialog.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/pidgin/minidialog.c	Sat Feb 12 04:17:09 2011 +0900
@@ -383,7 +383,7 @@
 		G_PARAM_STATIC_NAME | G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB |
 		G_PARAM_READWRITE);
 	g_object_class_install_property (object_class, PROP_ICON_NAME, param_spec);
-	
+
 	param_spec = g_param_spec_object("custom-icon", "custom-icon",
 		"Pixbuf to use as the dialog's icon",
 		GDK_TYPE_PIXBUF,
--- a/pidgin/pidgintooltip.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/pidgin/pidgintooltip.c	Sat Feb 12 04:17:09 2011 +0900
@@ -138,7 +138,7 @@
 	GdkScreen *screen = NULL;
 	GdkRectangle mon_size;
 	GtkWidget *tipwindow = pidgin_tooltip.tipwindow;
-	
+
 	gdk_display_get_pointer(gdk_display_get_default(), &screen, &x, &y, NULL);
 	mon_num = gdk_screen_get_monitor_at_point(screen, x, y);
 	gdk_screen_get_monitor_geometry(screen, mon_num, &mon_size);
--- a/pidgin/plugins/cap/cap.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/pidgin/plugins/cap/cap.c	Sat Feb 12 04:17:09 2011 +0900
@@ -93,7 +93,7 @@
 	}
 	sqlite3_free(sql);
 
-	
+
 	if(strcmp(purple_status_get_id(get_status_for(buddy)), "offline") == 0) {
 		/* This is kind of stupid, change it. */
 		if(prediction == 1.0f)
@@ -152,7 +152,7 @@
 	purple_debug_info("cap", "%s\n", sql_select);
 
 	sqlite3_prepare(_db, sql_select, -1, &stmt, &tail);
-	
+
 	rc = sqlite3_step(stmt);
 
 	if(rc == SQLITE_DONE) {
@@ -189,7 +189,7 @@
 	purple_debug_info("cap", "%s\n", sql_select);
 
 	sqlite3_prepare(_db, sql_select, -1, &stmt, &tail);
-	
+
 	rc = sqlite3_step(stmt);
 
 	if(rc == SQLITE_DONE) {
@@ -226,7 +226,7 @@
 	purple_debug_info("cap", "%s\n", sql_select);
 
 	sqlite3_prepare(_db, sql_select, -1, &stmt, &tail);
-	
+
 	rc = sqlite3_step(stmt);
 
 	if(rc == SQLITE_DONE) {
@@ -263,7 +263,7 @@
 	purple_debug_info("cap", "%s\n", sql_select);
 
 	sqlite3_prepare(_db, sql_select, -1, &stmt, &tail);
-	
+
 	rc = sqlite3_step(stmt);
 
 	if(rc == SQLITE_DONE) {
@@ -296,7 +296,7 @@
 		purple_status_get_id(get_status_for(stats->buddy));
 	struct tm *current_time;
 	int minute;
-	
+
 	if(stats->last_message == -1) {
 		time_t now = time(NULL);
 		current_time = localtime(&now);
@@ -306,7 +306,7 @@
 	minute = current_time->tm_min + current_time->tm_hour * 60;
 
 	insert_cap_msg_count_success(buddy_name, account_id, protocol_id, minute);
-	
+
 	insert_cap_status_count_success(buddy_name, account_id, protocol_id, status_id);
 
 	stats->last_message = -1;
@@ -324,9 +324,9 @@
 	int minute = current_time->tm_min + current_time->tm_hour * 60;
 
 	insert_cap_msg_count_failed(buddy_name, account_id, protocol_id, minute);
-	
+
 	insert_cap_status_count_failed(buddy_name, account_id, protocol_id, status_id);
-	
+
 	stats->last_message = -1;
 	stats->last_message_status_id = NULL;
 }
@@ -384,7 +384,7 @@
 	stats = get_stats_for(buddy);
 
 	/* insert_word_count(sender, buddy_name, words); */
-	
+
 	/* If we are waiting for a response from a prior message
 	 * then cancel the timeout callback. */
 	if(stats->timeout_source_id != 0) {
@@ -581,7 +581,7 @@
 	g_free(path);
 	if(rc != SQLITE_OK)
 		return FALSE;
-	
+
 	/* Add tables here */
 	create_tables();
 	purple_debug_info("cap", "Database connection successfully made.\n");
@@ -652,7 +652,7 @@
 	 * and the keys are a buddies account id (PurpleBuddy.name).
 	 * keys/values are automatically deleted */
 	_buddy_stats = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, destroy_stats);
-	
+
 	/* ? - Can't remember at the moment
 	 */
 	_my_offline_times = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
@@ -668,7 +668,7 @@
 		return;
 
 	purple_debug_info("cap", "Adding plugin functionality.\n");
-	
+
 	/* Connect all the signals */
 	purple_signal_connect(purple_conversations_get_handle(), "sent-im-msg", plugin,
 			PURPLE_CALLBACK(sent_im_msg), NULL);
@@ -690,7 +690,7 @@
 
 	purple_signal_connect(purple_connections_get_handle(), "signed-on", plugin,
 			PURPLE_CALLBACK(signed_on), NULL);
-	
+
 	purple_signal_connect(purple_connections_get_handle(), "signed-off", plugin,
 			PURPLE_CALLBACK(signed_off), NULL);
 
@@ -713,7 +713,7 @@
 
 	/* If there are any timeouts waiting to be processed then cancel them */
 	g_hash_table_foreach(_buddy_stats, cancel_conversation_timeouts, NULL);
-	
+
 	/* Connect all the signals */
 	purple_signal_disconnect(purple_conversations_get_handle(), "sent-im-msg", plugin,
 			PURPLE_CALLBACK(sent_im_msg));
@@ -735,7 +735,7 @@
 
 	purple_signal_disconnect(purple_connections_get_handle(), "signed-on", plugin,
 			PURPLE_CALLBACK(signed_on));
-	
+
 	purple_signal_disconnect(purple_connections_get_handle(), "signed-off", plugin,
 			PURPLE_CALLBACK(signed_off));
 
@@ -751,13 +751,13 @@
 
 static gboolean plugin_unload(PurplePlugin *plugin) {
 	purple_debug_info("cap", "CAP plugin unloading\n");
-	
+
 	/* clean up memory allocations */
 	if(_buddy_stats) {
 		g_hash_table_foreach(_buddy_stats, write_stats_on_unload, NULL);
 		g_hash_table_destroy(_buddy_stats);
 	}
-	 
+
 	 /* close database connection */
 	 destroy_database_connection();
 
@@ -856,13 +856,13 @@
 
 	g_signal_connect(G_OBJECT(ui->msg_difference_input), "value-changed",
 		G_CALLBACK(numeric_spinner_prefs_cb), "/plugins/gtk/cap/max_msg_difference");
-	
+
 	g_signal_connect(G_OBJECT(ui->last_seen_input), "value-changed",
 		G_CALLBACK(numeric_spinner_prefs_cb), "/plugins/gtk/cap/max_seen_difference");
-	
+
 	g_signal_connect(G_OBJECT(ui->threshold_input), "value-changed",
 		G_CALLBACK(numeric_spinner_prefs_cb), "/plugins/gtk/cap/threshold");
-	
+
 	return ui;
 }
 
--- a/pidgin/plugins/cap/cap.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/pidgin/plugins/cap/cap.h	Sat Feb 12 04:17:09 2011 +0900
@@ -58,7 +58,7 @@
 /* Prefs UI */
 typedef struct _CapPrefsUI CapPrefsUI;
 
-struct _CapPrefsUI { 
+struct _CapPrefsUI {
 	GtkWidget *ret;
 	GtkWidget *cap_vbox;
 	GtkWidget *table_layout;
--- a/pidgin/plugins/convcolors.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/pidgin/plugins/convcolors.c	Sat Feb 12 04:17:09 2011 +0900
@@ -82,7 +82,7 @@
 	PurpleMessageFlags flag;
 	char *prefix;
 	const char *text;
-} formats[] = 
+} formats[] =
 {
 	{PURPLE_MESSAGE_ERROR, PREF_ERROR, N_("Error Messages")},
 	{PURPLE_MESSAGE_NICK, PREF_NICK, N_("Highlighted Messages")},
@@ -393,7 +393,7 @@
 	return ret;
 }
 
-static PidginPluginUiInfo ui_info = 
+static PidginPluginUiInfo ui_info =
 {
 	get_config_frame,
 	0,
--- a/pidgin/plugins/crazychat/QTUtilities.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/pidgin/plugins/crazychat/QTUtilities.c	Sat Feb 12 04:17:09 2011 +0900
@@ -1,10 +1,10 @@
 /*
 	File:		QTUtilities.c
-	
+
 	Description: Miscellaneous QuickTime utility routines.
 
 	Copyright: 	© Copyright 2003 Apple Computer, Inc. All rights reserved.
-	
+
 	Disclaimer:	IMPORTANT:  This Apple software is supplied to you by Apple Computer, Inc.
 				("Apple") in consideration of your agreement to the following terms, and your
 				use, installation, modification or redistribution of this Apple software
@@ -39,7 +39,7 @@
 				OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT
 				(INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN
 				ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-				
+
 	Change History (most recent first):
 
 */
@@ -62,21 +62,21 @@
     OSErr	result;
 
     *theMovie = NULL;
-    
+
 	result = OpenMovieFile(fsspecPtr, &resRefNum, 0);
 	if (result == noErr)
     {
         short actualResId = DoTheRightThing;
-        
-        result = NewMovieFromFile(theMovie, 
-                                resRefNum, 
-                                &actualResId, 
+
+        result = NewMovieFromFile(theMovie,
+                                resRefNum,
+                                &actualResId,
                                 (unsigned char *) 0,
                                 0,
                                 (Boolean *) 0);
         CloseMovieFile(resRefNum);
     }
-    
+
     return result;
 }
 
@@ -95,13 +95,13 @@
     OSErr	result = noErr;
 
     *theMovie = nil;
-    
+
     result = GetOneFileWithPreview(2, myTypeList, &theFSSpec, NULL);
     if (result != userCanceledErr)
-    {            
+    {
         result = GetMovieFromFile(&theFSSpec, theMovie);
     }
-    
+
     return result;
 }
 
@@ -114,7 +114,7 @@
 void NormalizeMovieRect(Movie theMovie)
 {
     Rect movieBounds;
-    
+
 	GetMovieBox(theMovie, &movieBounds);
 	OffsetRect(&movieBounds, -movieBounds.left, -movieBounds.top);
 	movieBounds.right = movieBounds.left + 640;
@@ -138,13 +138,13 @@
 
     LockPixels(pixMap);
 	rows = pRect->bottom - pRect->top;
-    
+
     rowBaseAddr = GetPixBaseAddr(pixMap) + (GetPixRowBytes(pixMap) & 0x3fff) * pRect->top + pRect->left * GetPixDepth(pixMap) / 8;
 	do
 	{
 		long	cols;
 		UInt32	*baseAddr;
-		
+
 		cols = pRect->right - pRect->left;
 		baseAddr = (UInt32*)rowBaseAddr;
 		rowBaseAddr += (**pixMap).rowBytes & 0x3fff;
@@ -169,7 +169,7 @@
 OSErr CreateDecompSeqForSGChannelData(SGChannel sgChannel, Rect *srcBounds, GWorldPtr imageDestination, ImageSequence *imageSeqID)
 {
 	OSErr err = noErr;
-	
+
 	ImageDescriptionHandle	imageDesc = (ImageDescriptionHandle)NewHandle(sizeof(ImageDescription));
 	if (imageDesc)
 	{
@@ -178,7 +178,7 @@
 		// The original version of this code had a bug - it passed in a Crop Rect to DecompressSequenceBegin instead of a scaling matrix
 		// This only worked because of another bug inside QT that reated the crop Rect as a destination rect for DV
 		// the following code does the right thing in all cases.
-		
+
 		if (err == noErr)
 		{
 			MatrixRecord 	mr;
@@ -189,17 +189,17 @@
 			fromR.right = (**imageDesc).width;
 			fromR.bottom = (**imageDesc).height;
 			RectMatrix(&mr, &fromR, srcBounds);
-			
+
 			err = DecompressSequenceBegin(imageSeqID, imageDesc, imageDestination, 0, nil, &mr,srcCopy,nil,0, codecNormalQuality, bestSpeedCodec);
 		}
-		
+
 		DisposeHandle((Handle)imageDesc);
 	}
 	else
 	{
 		err = MemError();
 	}
-	
+
 	return err;
 }
 
@@ -214,21 +214,21 @@
 OSErr CreateDecompSeqForGWorldData(GWorldPtr srcGWorld, Rect *srcBounds, MatrixRecordPtr mr, GWorldPtr imageDestination, ImageSequence *imageSeqID)
 {
     OSErr err;
-    
+
     ImageDescriptionHandle imageDesc = (ImageDescriptionHandle)NewHandle(sizeof(ImageDescription));
     if (imageDesc)
     {
         err = MakeImageDescriptionForPixMap (GetGWorldPixMap(srcGWorld), &imageDesc);
-        err = DecompressSequenceBegin(	imageSeqID, 
-                                        imageDesc, 
-                                        imageDestination, 
-                                        0, 
-                                        srcBounds, 
-                                        mr, 
-                                        srcCopy, 
-                                        nil, 
-                                        0, 
-                                        codecNormalQuality, 
+        err = DecompressSequenceBegin(	imageSeqID,
+                                        imageDesc,
+                                        imageDestination,
+                                        0,
+                                        srcBounds,
+                                        mr,
+                                        srcCopy,
+                                        nil,
+                                        0,
+                                        codecNormalQuality,
                                         bestSpeedCodec);
         DisposeHandle((Handle)imageDesc);
     }
@@ -236,7 +236,7 @@
     {
         err = MemError();
     }
-    
+
     return err;
 }
 
@@ -254,7 +254,7 @@
 OSErr CreateNewSGChannelForRecording(ComponentInstance seqGrab, SGDataUPP dataProc, CGrafPtr drawPort, Rect *theRect, SGChannel *sgChannel, long refCon)
 {
 	OSErr err = noErr;
-	
+
 	BailErr((err = SGInitialize(seqGrab)));
 
 	// tell it we're not making a movie
@@ -262,13 +262,13 @@
 	// It wants a port, even if its not drawing to it
 	BailErr((err = SGSetGWorld(seqGrab, drawPort, GetMainDevice())));
 	BailErr((err = SGNewChannel(seqGrab, VideoMediaType, sgChannel)));
-	
+
 	// let the user configure the video channel
 	//BailErr((err = SGSettingsDialog(seqGrab, *sgChannel, 0, nil, 0, nil, 0)));    // ************************
-// ************************************************************	
-	
-	
-	
+// ************************************************************
+
+
+
 	BailErr((err = SGSetChannelBounds(*sgChannel, theRect)));
 	// set usage for new video channel to avoid playthrough
 	BailErr((err = SGSetChannelUsage(*sgChannel, seqGrabRecord ))); //note we don't set seqGrabPlayDuringRecord
@@ -282,14 +282,14 @@
 //////////
 //
 // DoCloseSG
-// Terminate recording for our SG channel - dispose of the channel and 
+// Terminate recording for our SG channel - dispose of the channel and
 // the associated SG component instance
 //
 //////////
 
 void DoCloseSG(ComponentInstance seqGrab, SGChannel sgChannel, SGDataUPP dataProc)
 {
-	if(seqGrab) 
+	if(seqGrab)
     {
 		SGStop(seqGrab);
         SGSetDataProc(seqGrab, NULL ,NULL);
--- a/pidgin/plugins/crazychat/QTUtilities.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/pidgin/plugins/crazychat/QTUtilities.h	Sat Feb 12 04:17:09 2011 +0900
@@ -1,10 +1,10 @@
 /*
 	File:		QTUtilities.h
-	
+
 	Description: Interface file for QTUtilities.c source code.
 
 	Copyright: 	© Copyright 2003 Apple Computer, Inc. All rights reserved.
-	
+
 	Disclaimer:	IMPORTANT:  This Apple software is supplied to you by Apple Computer, Inc.
 				("Apple") in consideration of your agreement to the following terms, and your
 				use, installation, modification or redistribution of this Apple software
@@ -39,7 +39,7 @@
 				OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT
 				(INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN
 				ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-				
+
 	Change History (most recent first):
 
 */
--- a/pidgin/plugins/crazychat/Utilities.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/pidgin/plugins/crazychat/Utilities.c	Sat Feb 12 04:17:09 2011 +0900
@@ -1,10 +1,10 @@
 /*
 	File:		Utilities.c
-	
+
 	Description: Miscellaneous Utility routines.
 
 	Copyright: 	© Copyright 2003 Apple Computer, Inc. All rights reserved.
-	
+
 	Disclaimer:	IMPORTANT:  This Apple software is supplied to you by Apple Computer, Inc.
 				("Apple") in consideration of your agreement to the following terms, and your
 				use, installation, modification or redistribution of this Apple software
@@ -39,7 +39,7 @@
 				OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT
 				(INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN
 				ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-				
+
 	Change History (most recent first):
 
 */
@@ -60,9 +60,9 @@
 //
 // Note that both StandardGetFilePreview and NavGetFile use the function specified by theFilterProc as a
 // file filter. This framework always passes NULL in the theFilterProc parameter. If you use this function
-// in your own code, keep in mind that on Windows the function specifier must be of type FileFilterUPP and 
+// in your own code, keep in mind that on Windows the function specifier must be of type FileFilterUPP and
 // on Macintosh it must be of type NavObjectFilterUPP. (You can use the QTFrame_GetFileFilterUPP to create
-// a function specifier of the appropriate type.) Also keep in mind that Navigation Services expects a file 
+// a function specifier of the appropriate type.) Also keep in mind that Navigation Services expects a file
 // filter function to return true if a file is to be displayed, while the Standard File Package expects the
 // filter to return false if a file is to be displayed.
 //
@@ -70,7 +70,7 @@
 
 OSErr GetOneFileWithPreview (short theNumTypes, TypeListPtr theTypeList, FSSpecPtr theFSSpecPtr, void *theFilterProc)
 {
-	
+
 #if TARGET_OS_WIN32
 	StandardFileReply	myReply;
 #endif
@@ -81,7 +81,7 @@
 	NavEventUPP		myEventUPP = NewNavEventUPP(HandleNavEvent);
 #endif
 	OSErr				myErr = noErr;
-	
+
 	if (theFSSpecPtr == NULL)
 		return(paramErr);
 
@@ -90,7 +90,7 @@
 	StandardGetFilePreview((FileFilterUPP)theFilterProc, theNumTypes, (ConstSFTypeListPtr)theTypeList, &myReply);
 	if (!myReply.sfGood)
 		return(userCanceledErr);
-	
+
 	// make an FSSpec record
 	myErr = FSMakeFSSpec(myReply.sfFile.vRefNum, myReply.sfFile.parID, myReply.sfFile.name, theFSSpecPtr);
 #endif
@@ -101,34 +101,34 @@
 	myDialogOptions.dialogOptionFlags -= kNavNoTypePopup;
 	myDialogOptions.dialogOptionFlags -= kNavAllowMultipleFiles;
 	BlockMoveData(kApplicationName, myDialogOptions.clientName, kApplicationName[0] + 1);
-	
+
 	// create a handle to an 'open' resource
 	myOpenList = (NavTypeListHandle)CreateOpenHandle(kApplicationSignature, theNumTypes, theTypeList);
 	if (myOpenList != NULL)
 		HLock((Handle)myOpenList);
-	
+
 	// prompt the user for a file
 	myErr = NavGetFile(NULL, &myReply, &myDialogOptions, myEventUPP, NULL, (NavObjectFilterUPP)theFilterProc, myOpenList, NULL);
 	if ((myErr == noErr) && myReply.validRecord) {
 		AEKeyword		myKeyword;
 		DescType		myActualType;
 		Size			myActualSize = 0;
-		
+
 		// get the FSSpec for the selected file
 		if (theFSSpecPtr != NULL)
 			myErr = AEGetNthPtr(&(myReply.selection), 1, typeFSS, &myKeyword, &myActualType, theFSSpecPtr, sizeof(FSSpec), &myActualSize);
 
 		NavDisposeReply(&myReply);
 	}
-	
+
 	if (myOpenList != NULL) {
 		HUnlock((Handle)myOpenList);
 		DisposeHandle((Handle)myOpenList);
 	}
-	
+
 	DisposeNavEventUPP(myEventUPP);
 #endif
- 
+
 	return(myErr);
 }
 
@@ -142,7 +142,7 @@
 Handle CreateOpenHandle (OSType theApplicationSignature, short theNumTypes, TypeListPtr theTypeList)
 {
 	Handle			myHandle = NULL;
-	
+
 	// see if we have an 'open' resource...
 	myHandle = Get1Resource('open', 128);
 	if ( myHandle != NULL && ResError() == noErr ) {
@@ -151,22 +151,22 @@
 	} else {
 		myHandle = NULL;
 	}
-	
+
 	// nope, use the passed in types and dynamically create the NavTypeList
 	if (theTypeList == NULL)
 		return myHandle;
-	
+
 	if (theNumTypes > 0) {
 		myHandle = NewHandle(sizeof(NavTypeList) + (theNumTypes * sizeof(OSType)));
 		if (myHandle != NULL) {
 			NavTypeListHandle 	myOpenResHandle	= (NavTypeListHandle)myHandle;
-			
+
 			(*myOpenResHandle)->componentSignature = theApplicationSignature;
 			(*myOpenResHandle)->osTypeCount = theNumTypes;
 			BlockMoveData(theTypeList, (*myOpenResHandle)->osType, theNumTypes * sizeof(OSType));
 		}
 	}
-	
+
 	return myHandle;
 }
 
@@ -180,7 +180,7 @@
 PASCAL_RTN void HandleNavEvent(NavEventCallbackMessage theCallBackSelector, NavCBRecPtr theCallBackParms, void *theCallBackUD)
 {
 #pragma unused(theCallBackUD)
-	
+
 	if (theCallBackSelector == kNavCBEvent) {
 		switch (theCallBackParms->eventData.eventDataParms.event->what) {
 			case updateEvt:
@@ -212,27 +212,27 @@
 
 	if ((theFSSpecPtr == NULL) || (theIsSelected == NULL) || (theIsReplacing == NULL))
 		return(paramErr);
-	
+
 	// assume we are not replacing an existing file
 	*theIsReplacing = false;
-	
+
         *theIsSelected = false;
-        
+
 	// specify the options for the dialog box
 	NavGetDefaultDialogOptions(&myDialogOptions);
 	myDialogOptions.dialogOptionFlags += kNavNoTypePopup;
 	myDialogOptions.dialogOptionFlags += kNavDontAutoTranslate;
 	BlockMoveData(theFileName, myDialogOptions.savedFileName, theFileName[0] + 1);
 	BlockMoveData(thePrompt, myDialogOptions.message, thePrompt[0] + 1);
-	
+
 	// prompt the user for a file
 	myErr = NavPutFile(NULL, &myReply, &myDialogOptions, myEventUPP, MovieFileType, sigMoviePlayer, NULL);
-	if ((myErr == noErr) && myReply.validRecord) 
+	if ((myErr == noErr) && myReply.validRecord)
     {
 		AEKeyword		myKeyword;
 		DescType		myActualType;
 		Size			myActualSize = 0;
-		
+
 		// get the FSSpec for the selected file
 		if (theFSSpecPtr != NULL)
 			myErr = AEGetNthPtr(&(myReply.selection), 1, typeFSS, &myKeyword, &myActualType, theFSSpecPtr, sizeof(FSSpec), &myActualSize);
@@ -245,7 +245,7 @@
 
 		NavDisposeReply(&myReply);
 	}
-		
+
 
 	DisposeNavEventUPP(myEventUPP);
 
@@ -268,7 +268,7 @@
         CGrafPtr	oldPort;
         GDHandle	oldDevice;
         Rect		frame = (**pict).picFrame;
-        
+
         GetGWorld(&oldPort, &oldDevice);
         SetGWorld(destGWorld, nil);
         // normalize coordinates
--- a/pidgin/plugins/crazychat/Utilities.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/pidgin/plugins/crazychat/Utilities.h	Sat Feb 12 04:17:09 2011 +0900
@@ -1,10 +1,10 @@
 /*
 	File:		Utilities.h
-	
+
 	Description: Interface file for Utilities.c source code.
 
 	Copyright: 	© Copyright 2003 Apple Computer, Inc. All rights reserved.
-	
+
 	Disclaimer:	IMPORTANT:  This Apple software is supplied to you by Apple Computer, Inc.
 				("Apple") in consideration of your agreement to the following terms, and your
 				use, installation, modification or redistribution of this Apple software
@@ -39,7 +39,7 @@
 				OF THE APPLE SOFTWARE, HOWEVER CAUSED AND WHETHER UNDER THEORY OF CONTRACT, TORT
 				(INCLUDING NEGLIGENCE), STRICT LIABILITY OR OTHERWISE, EVEN IF APPLE HAS BEEN
 				ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-				
+
 	Change History (most recent first):
 
 */
@@ -62,7 +62,7 @@
 	#define     sigMoviePlayer        FOUR_CHAR_CODE('TVOD')
 #else
     #include <FileTypesAndCreators.h>
-#endif    
+#endif
 
 
 //
--- a/pidgin/plugins/crazychat/camdata.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/pidgin/plugins/crazychat/camdata.c	Sat Feb 12 04:17:09 2011 +0900
@@ -23,7 +23,7 @@
 long		mWorlds[20];
 UInt32		mRedCount[256], mGreenCound[256], mBlueCount[256];
 
-static void DecompressSequencePreflight(GWorldPtr srcGWorld, 
+static void DecompressSequencePreflight(GWorldPtr srcGWorld,
                                         ImageSequence *imageSeq,
                                         GWorldPtr destGWorld,
                                         Rect *srcRect);
@@ -38,25 +38,25 @@
 OSErr InitializeMungData(Rect bounds)
 {
 	OSErr err = noErr;
-    
-	if(myMungData) 
+
+	if(myMungData)
     {
         DisposeMungData();
 	}
-    
+
 	myMungData = (mungDataPtr)NewPtrClear(sizeof(mungDataRecord));
-	if (myMungData == nil) 
+	if (myMungData == nil)
     {
         err = MemError();
         goto bail;
     }
 
 	myMungData->effect = 0; // always
-    
+
 
 	BailErr(QTNewGWorld(&(myMungData->gw),bitdepth,&bounds,0,0,0));
 	LockPixels(GetGWorldPixMap(myMungData->gw));
-    
+
     SetMungDataColorDefaults();
 
 
@@ -66,8 +66,8 @@
 
 	SetCurrentClamp(-1);
 
-            
-	
+
+
 	myMungData->bounds = bounds;
 
 	SetRect(&bounds, 0, 0, 256*2+4, 128*3 + 20);
@@ -81,32 +81,32 @@
 OSErr DisposeMungData(void)
 {  // check this out
     OSErr err = noErr;
-    
-    if(myMungData) 
+
+    if(myMungData)
     {
-        //if(myMungData->drawSeq) 
+        //if(myMungData->drawSeq)
         //{
         //    CDSequenceEnd(myMungData->drawSeq);
         //}
-        
-        if(myMungData->gw) 
+
+        if(myMungData->gw)
         {
-            DisposeGWorld(myMungData->gw); 
+            DisposeGWorld(myMungData->gw);
             myMungData->gw = nil;
         }
-        
-        if(myMungData->overlay) 
+
+        if(myMungData->overlay)
         {
-            DisposeGWorld(myMungData->overlay); 
+            DisposeGWorld(myMungData->overlay);
             myMungData->overlay = nil;
         }
-        
-        if(myMungData->histoWorld) 
+
+        if(myMungData->histoWorld)
         {
-            DisposeGWorld(myMungData->histoWorld); 
+            DisposeGWorld(myMungData->histoWorld);
             myMungData->histoWorld = nil;
         }
-    
+
         if (myMungData->effectTimeBase)
         {
             DisposeTimeBase(myMungData->effectTimeBase);
@@ -126,28 +126,28 @@
     return err;
 }
 
-static void DecompressSequencePreflight(GWorldPtr srcGWorld, 
+static void DecompressSequencePreflight(GWorldPtr srcGWorld,
                                         ImageSequence *imageSeq,
                                         GWorldPtr destGWorld,
                                         Rect *srcRect)
 // might not need this one
-										
+
 {
     ImageDescriptionHandle imageDesc = nil;
-    
+
     BailErr(MakeImageDescriptionForPixMap (GetGWorldPixMap(srcGWorld), &imageDesc));
-    
+
     // use our built-in decompressor to draw
    // (**imageDesc).cType = kCustomDecompressorType;
-	
+
 // *********** MIGHT BE MAKING A BIG MISTAKE ******************
     // pass a compressed sample so a codec can perform preflighting before the first DecompressSequenceFrameWhen call
 
-    BailErr(DecompressSequenceBegin(imageSeq, 
-                                    imageDesc, 
+    BailErr(DecompressSequenceBegin(imageSeq,
+                                    imageDesc,
                                     destGWorld,
                                     0,
-                                    srcRect, 
+                                    srcRect,
                                     nil,
                                     srcCopy,
                                     nil,
@@ -169,7 +169,7 @@
 
 void SetMungDataColorDefaults()
 {
-	if(myMungData) 
+	if(myMungData)
     {
         myMungData->redMin = 2;
         myMungData->redMax = 254;
@@ -183,15 +183,15 @@
 void GetMungDataBoundsRect(Rect *boundsRect)
 // might not need this one
 {
-	MacSetRect (boundsRect, 
-			myMungData->bounds.left, 
-			myMungData->bounds.top, 
-			myMungData->bounds.right, 
+	MacSetRect (boundsRect,
+			myMungData->bounds.left,
+			myMungData->bounds.top,
+			myMungData->bounds.right,
 			myMungData->bounds.bottom
 	);
 }
 
-void SetCurrentClamp(short index)     // :crazy:20040426 
+void SetCurrentClamp(short index)     // :crazy:20040426
 {
     myMungData->selectedIndex = index;
 }
--- a/pidgin/plugins/crazychat/camdata.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/pidgin/plugins/crazychat/camdata.h	Sat Feb 12 04:17:09 2011 +0900
@@ -6,7 +6,7 @@
  *  Copyright (c) 2004 __MyCompanyName__. All rights reserved.
  *
  */
- 
+
 #pragma once
 
 #ifdef __APPLE_CC__
@@ -17,12 +17,12 @@
 	#include <QuickTime.h>
 #endif
 
-typedef struct 
+typedef struct
 {
 	GWorldPtr 				gw;
 	GWorldPtr 				overlay;
 	GWorldPtr 				histoWorld;
-	
+
 	Rect 					bounds;
 	WindowPtr				window;
 	ImageSequence 			drawSeq;
--- a/pidgin/plugins/crazychat/camproc.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/pidgin/plugins/crazychat/camproc.c	Sat Feb 12 04:17:09 2011 +0900
@@ -116,19 +116,19 @@
 {
 	OSStatus error;
 	OSErr err = noErr;
-	
-	BailErr(err = InitializeMungData(mMungRect)); 
-	
+
+	BailErr(err = InitializeMungData(mMungRect));
+
 	bank = f;
-	
+
 	instance=inst;
 	mMyDataProcPtr 	= NewSGDataUPP(MiniMungDataProc);
 	mSeqGrab 		= OpenDefaultComponent(SeqGrabComponentType, 0);
-    BailErr((err = CreateNewSGChannelForRecording(	mSeqGrab, 
-                                    mMyDataProcPtr, 
+    BailErr((err = CreateNewSGChannelForRecording(	mSeqGrab,
+                                    mMyDataProcPtr,
                                     GetMungDataOffscreen(), // drawing destination
-                                    &mMungRect, 
-                                    &mSGChanVideo, 
+                                    &mMungRect,
+                                    &mSGChanVideo,
                                     NULL)));
 
 bail:
@@ -148,7 +148,7 @@
     {
         SGIdle(mSeqGrab);
     }
-    
+
     // Reschedule the event loop timer
     SetEventLoopTimerNextFireTime(inTimer, kMinimumIdleDurationInMillis);
 }
@@ -161,40 +161,40 @@
 	ComponentResult err = noErr;
 	CodecFlags 		ignore;
     GWorldPtr 		gWorld;
-    
+
 
 
 
 	if (!myMungData) goto bail;
-    
+
     gWorld = GetMungDataOffscreen();
 	if(gWorld)
 	{
 		if (mDecomSeq == 0)	// init a decompression sequence
 		{
 			Rect bounds;
-			
+
 			GetMungDataBoundsRect(&bounds);
-                    
+
             BailErr( CreateDecompSeqForSGChannelData(c, &bounds, gWorld, &mDecomSeq));
-    
+
 			if(1)
             //if ((!mUseOverlay) && (GetCurrentClamp() == -1) && (!mUseEffect))
             {
 				ImageSequence drawSeq;
-				
-                err = CreateDecompSeqForGWorldData(	gWorld, 
-                                                    &bounds, 
-                                                    nil, 
+
+                err = CreateDecompSeqForGWorldData(	gWorld,
+                                                    &bounds,
+                                                    nil,
                                                     GetMungDataWindowPort(),
                                                     &drawSeq);
 				SetMungDataDrawSeq(drawSeq);
             }
 		}
-        
+
         // decompress data to our offscreen gworld
 		BailErr(DecompressSequenceFrameS(mDecomSeq,p,len,0,&ignore,nil));
-		
+
 		// image is now in the GWorld - manipulate it at will!
 		//if ((mUseOverlay) || (GetCurrentClamp() != -1) || (mUseEffect))
         //{
@@ -208,9 +208,9 @@
 			// search for lobsters in our image data
             DetectLobster(gWorld);
         //}
-		
+
 	}
-	
+
 bail:
 	return err;
 }
@@ -221,7 +221,7 @@
        // mSGTimerRef = nil;
       //  DisposeEventLoopTimerUPP(mSGTimerUPP);
        	DoCloseSG(mSeqGrab, mSGChanVideo, mMyDataProcPtr);
-	
+
 }
 
 
@@ -232,7 +232,7 @@
 */
 extern unsigned int (*colorBuf)[644];
 extern struct input_instance input_data;
-	
+
 static void DetectLobster(GWorldPtr mungDataOffscreen)
 {
     CGrafPtr	oldPort;
@@ -253,19 +253,19 @@
     long R_total=0;
 	long G_total=0;
 	long B_total=0;
-	
 
 
-	//fprintf(stderr, "Starting to find some lobsters...\n");	
+
+	//fprintf(stderr, "Starting to find some lobsters...\n");
 
 
     GetPortBounds(mungDataOffscreen, &bounds);
     OffsetRect(&bounds, -bounds.left, -bounds.top);
-    
-	
+
+
 	UInt32			color;
 
-			
+
 	int sum_x,sum_y=0;
 	int count=0;
 	int k,j;
@@ -279,11 +279,11 @@
 	colorBuf = GetPixBaseAddr(pix);
 
 	switch (detection_mode) {
-	
+
 	case PRE_CALIBRATE_MODE:
 		//drawbox(CALIB_TOP, CALIB_BOTTOM, CALIB_LEFT, CALIB_RIGHT);
 		break;
-	
+
 	case CALIBRATE_MODE:
 		SkinStats(pix, y_click-CALIB_RADIUS, y_click+CALIB_RADIUS, x_click-CALIB_RADIUS, x_click+CALIB_RADIUS);
 		scan_region_left=x_click-CALIB_RADIUS;//10;
@@ -295,7 +295,7 @@
 		//fprintf(stderr, "scan left: %d scan right: %d \n",scan_region_left,scan_region_right);
 		head_size_old=50;
 		break;
-		
+
 	case SCAN_MODE:
 		ScanSkin(pix);
 		drawbox(face_top, face_bottom, face_left, face_right,1);
@@ -310,14 +310,14 @@
 		break;
 	}
 
-	//fprintf(stderr, "Lobsters found...\n");	
+	//fprintf(stderr, "Lobsters found...\n");
 
 
 }
-	
-	
-			
-	
+
+
+
+
 void ScanSkin(PixMapHandle p)
 {
 	int y,x,j,k;
@@ -336,13 +336,13 @@
 	sum_x=sum_y=count=0;
 	int horz_count[480];
 	int vert_count[640];
-	
+
 
-	
+
 	memset(horz_count,0,480*sizeof(int));
 	memset(vert_count,0,640*sizeof(int));
-	
-	if (eye_search_frame_count<NUM_FRAMES_EYE_SEARCH) eye_search_frame_count++;  
+
+	if (eye_search_frame_count<NUM_FRAMES_EYE_SEARCH) eye_search_frame_count++;
 	else if (eye_search_frame_count==NUM_FRAMES_EYE_SEARCH && bozo_bit==0)
 	{
 	bozo_bit=1;
@@ -388,7 +388,7 @@
 					right_eye_pt_count++;
 					//colorBuf[y][x]=0x0000FF00;
 					}
-				}   
+				}
 			}
 
 			if(SkinDetect(Y,E,S))
@@ -396,27 +396,27 @@
 				sum_x+=x;
 				sum_y+=y;
 				count++;
-		
+
 				++horz_count[y];
 				++vert_count[x];
-				
+
 				if (horz_count[y]>max_horz) max_horz=horz_count[y];
 				if (vert_count[x]>max_vert) max_vert=vert_count[x];
-				
+
 				//colorBuf[y][x]=0x00FF0000;
 			}
 
 		}
 	}
-	
-	
+
+
 	left_eye_x=left_eye_x_sum/left_eye_pt_count;
 	left_eye_y=left_eye_y_sum/left_eye_pt_count;
 	right_eye_x=right_eye_x_sum/right_eye_pt_count;
 	right_eye_y=right_eye_y_sum/right_eye_pt_count;
 
 
-					
+
 	int width=right_eye_x-left_eye_x;
 	int height=right_eye_y-left_eye_y;
 	double face_ang;
@@ -424,9 +424,9 @@
 	else face_ang=0;
 	face_ang=face_ang*180/pi;
 	//fprintf(stderr,"face angle: %f \n",face_ang);
-			
-	if ((left_eye_pt_count<5 || right_eye_pt_count<5 || width==0 || face_ang > 30 || face_ang < -30 
-		|| left_eye_y < (face_top+.15*(face_bottom-face_top)) 
+
+	if ((left_eye_pt_count<5 || right_eye_pt_count<5 || width==0 || face_ang > 30 || face_ang < -30
+		|| left_eye_y < (face_top+.15*(face_bottom-face_top))
 		|| right_eye_y < (face_top+.15*(face_bottom-face_top)))
 		&& bozo_bit==1){
 		eye_unconfidence++;
@@ -449,17 +449,17 @@
 		eye_search_frame_count=0;
 		//fprintf(stderr, "Recalibrating eyes\n");
 	}
-	
+
 	if ((last_eye_count_left-left_eye_pt_count> BLINK_THRESHOLD) && eye_unconfidence==0)
 	{
-	left_eye_blink_count=BLINK_LENGTH;	
+	left_eye_blink_count=BLINK_LENGTH;
 	}
 	if (left_eye_blink_count>0){
 		instance->face.left_eye_open=0;
 		left_eye_blink_count--;
 	}
-	else instance->face.left_eye_open=1;	
-	
+	else instance->face.left_eye_open=1;
+
 	if ((last_eye_count_right-right_eye_pt_count> BLINK_THRESHOLD) && eye_unconfidence==0)
 	{
 	right_eye_blink_count=BLINK_LENGTH;
@@ -472,15 +472,15 @@
 
 	if (instance->face.right_eye_open==0) instance->face.left_eye_open=0;
 	if (instance->face.left_eye_open==0) instance->face.right_eye_open=0;
-	
+
 	last_eye_count_left=left_eye_pt_count;
 	last_eye_count_right=right_eye_pt_count;
 
 	float x_shift=0;
 	if (width!=0) x_shift= (float)height/(float)width; // --> note dependence on earlier data here
 
-	
-if (bozo_bit==1){	
+
+if (bozo_bit==1){
 	int mouth_search_start_y=face_top+(.6*(face_bottom-face_top));
 	int mouth_search_end_y=face_bottom;
 	int mouth_search_start_x=(left_eye_x+right_eye_x)/2 + (-x_shift*(mouth_search_start_y-((right_eye_y+left_eye_y)/2))) ;
@@ -495,14 +495,14 @@
 	G = (color & 0x0000FF00) >> 8;
 	B = (color & 0x000000FF) >> 0;
 	lum=R+G+B;
-	
+
 	if (lum<min_lum_mouth) {
 		min_lum_mouth=lum;
 		mouth_ctr_x=x;
 		mouth_ctr_y=y;
 	}
 }
-	
+
 	mouth_size=(face_right-face_left)*100/640;
 	mouth_left=mouth_ctr_x-mouth_size;
 	if (mouth_left < face_left) mouth_left=face_left;
@@ -512,7 +512,7 @@
 	if (mouth_top < face_top) mouth_top=face_top;
 	mouth_bottom=mouth_ctr_y+mouth_size;
 	if (mouth_bottom > face_bottom) mouth_bottom=face_bottom;
-	
+
 	white_count=0;
 
 	for (y=mouth_top; y< mouth_bottom; y++){
@@ -529,12 +529,12 @@
 			}
 		}
 	}
-	
+
 	}
 else white_count=10;
 
 // This next section finds the face region and sets the face_* parameters.
-	
+
 	int scan;
 	float thresh=.3;
 	scan=scan_region_left+1;
@@ -546,10 +546,10 @@
 			{
 				face_left=scan;
 				break;
-			}	
+			}
 		scan++;
 	}
-	
+
 	scan=scan_region_right-1;
 	if (scan>=640) scan=639;
 	while(1)
@@ -558,10 +558,10 @@
 			{
 				face_right=scan;
 				break;
-			}	
+			}
 		scan--;
 	}
-	
+
 	scan=scan_region_top+1;
 	if (scan<0) scan=0;
 	while(1)
@@ -570,11 +570,11 @@
 			{
 				face_top=scan;
 				break;
-			}	
+			}
 		scan++;
 	}
-	
-	
+
+
 	scan=scan_region_bottom-1;
 	if (scan>=480) scan=479;
 	while(1)
@@ -583,10 +583,10 @@
 			{
 				face_bottom=scan;
 				break;
-			}	
+			}
 		scan--;
 	}
-	
+
 	// Base scan region on face region here
 	scan_region_left=face_left-10;
 	if (scan_region_left <= 0) scan_region_left=1;
@@ -596,10 +596,10 @@
 	if (scan_region_top <= 0) scan_region_top=1;
 	scan_region_bottom=face_bottom+10;
 	if (scan_region_bottom >= 480) scan_region_bottom=479;
-	
-	
+
+
 	// Calculate some stats
-	
+
 	// face size
 	width=face_right-face_left;
 	guint8 temp=width*100/640;
@@ -610,7 +610,7 @@
 	instance->face.x=temp;
 	temp=((double)100/(double)480)*(double)(face_top+face_bottom)/2;
 	instance->face.y=temp;
-	
+
 	// face angle-Z
 	instance->face.head_z_rot=face_ang+50;
 
@@ -628,23 +628,23 @@
 	if (right_eye_strad > left_eye_strad) y_ang=-y_ang;
 	temp = (guint8) 50 + y_ang;
 	instance->face.head_y_rot=temp;
-	
+
 	if (abs (temp-50) > 15) instance->face.head_size=head_size_old;
 	else head_size_old=instance->face.head_size;
 
 	temp = (guint8) 100 * white_count / WHITE_COUNT_MAX;
 	if (temp > 100) temp=100;
 	instance->face.mouth_open = temp;
-	
+
 }
-	
+
 
 
 
 
 
  // draw bounding box for either calibration or face
-	
+
 
 void SetEyeSearchRegions(void)
 {
@@ -654,25 +654,25 @@
 				left_eye_bottom=face_top+(.6*(face_bottom-face_top));
 				left_eye_right=((face_left+face_right)/2);
 				left_eye_left=face_left+.15*(face_right-face_left);
-			
+
 				right_eye_top=face_top+(.25*(face_bottom-face_top));
 				right_eye_bottom=face_top+(.6*(face_bottom-face_top));
 				right_eye_right=face_right-.15*(face_right-face_left);
 				right_eye_left=((face_left+face_right)/2);
 			}
-			
+
 			if (bozo_bit==1)
 			{
 				left_eye_top=left_eye_y-20;
 				left_eye_bottom=left_eye_y+20;
 				left_eye_left=left_eye_x-20;
 				left_eye_right=left_eye_x+20;
-				
+
 				right_eye_top=right_eye_y-20;
 				right_eye_bottom=right_eye_y+20;
 				right_eye_left=right_eye_x-20;
 				right_eye_right=right_eye_x+20;
-			}	
+			}
 }
 
 
@@ -681,7 +681,7 @@
 	int y, x, j;
 
 	unsigned int col;
-	
+
 
 	if (color==1)
 		col=0x00FFFF00;
@@ -696,27 +696,27 @@
 	if (left>=640) left=639;
 	if (right<0) right =0;
 	if (right>=640) right=639;
-	
+
 	if (color==1){
 
 	for (y=top; y<bottom; y++)
 	{
-		for (j=0;j<5;j++){	
+		for (j=0;j<5;j++){
 			colorBuf[y][left+j] =  col;
 			colorBuf[y][right-j] = col;
 		}
 
 	}
-	
+
 	for (x=left; x<right; x++)
 	{
 
 	for (j=0;j<5;j++){
-		
+
 		colorBuf[bottom-j][x] = col;
 		colorBuf[top+j][x] = col;
 
-		}	
+		}
 
 	}
 
@@ -727,7 +727,7 @@
 
 	for (y=top; y<bottom; y++)
 	{
-		for (x=left;x<right;x++){	
+		for (x=left;x<right;x++){
 			colorBuf[y][x] =  col;
 			colorBuf[y][x] = col;
 		}
@@ -757,25 +757,25 @@
 				{
 				count++;
 				color=baseAddr[x];
-					
+
 				R = (color & 0x00FF0000) >> 16;
 				G = (color & 0x0000FF00) >> 8;
 				B = (color & 0x000000FF) >> 0;
 				Y=.253*R+.684*G+.063*B;
 				E=.5*R-.5*G;
-				S=.25*R+.25*G-.5*B; 
+				S=.25*R+.25*G-.5*B;
 				Y_sum+=Y;
 				E_sum+=E;
 				S_sum+=S;
 				}
 			}
-				
+
 		Y_mean=Y_sum/count;
 		E_mean=E_sum/count;
 		S_mean=S_sum/count;
-				
+
 		Y_sum=E_sum=S_sum=0;
-				
+
 		for (y=top; y<bottom; y++)
 			{
 			baseAddr = (UInt32*)(GetPixBaseAddr(p) + y * GetPixRowBytes(p));
@@ -787,20 +787,20 @@
 				B = (color & 0x000000FF) >> 0;
 				Y=.253*R+.684*G+.063*B;
 				E=.5*R-.5*G;
-				S=.25*R+.25*G-.5*B; 
-					
+				S=.25*R+.25*G-.5*B;
+
 				Y_sum+=(Y-Y_mean)*(Y-Y_mean);
 				E_sum+=(E-E_mean)*(E-E_mean);
 				S_sum+=(S-S_mean)*(S-S_mean);
 
 				}
 			}
-				
+
 		Y_dev=sqrt(Y_sum/(count-1));
 		E_dev=sqrt(E_sum/(count-1));
 		S_dev=sqrt(S_sum/(count-1));
-				
-		//fprintf(stderr,"Y: %f, %f\n E: %f, %f\nS: %f, %f\n",Y_mean,E_mean,S_mean,Y_dev,E_dev,S_dev);			
+
+		//fprintf(stderr,"Y: %f, %f\n E: %f, %f\nS: %f, %f\n",Y_mean,E_mean,S_mean,Y_dev,E_dev,S_dev);
 
 }
 
--- a/pidgin/plugins/crazychat/cc_features.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/pidgin/plugins/crazychat/cc_features.c	Sat Feb 12 04:17:09 2011 +0900
@@ -116,7 +116,7 @@
 
   /*pthread_t userinput_t; // should we put this in a nicer wrapper?*/
 	struct draw_info *info;
-	struct input_instance *instance; 
+	struct input_instance *instance;
 	info = (struct draw_info*)malloc(sizeof(*info));
 	assert(info);
 	memset(info, 0, sizeof(*info));
@@ -196,7 +196,7 @@
 	hbox = gtk_hbox_new(TRUE, 0);
 	gtk_box_pack_start(GTK_BOX(ret.vbox), hbox, FALSE, FALSE, 0);
 	gtk_widget_show(hbox);
-	
+
 	glist = NULL;
 	glist = g_list_append(glist, "Red");
 	glist = g_list_append(glist, "Dark Brown");
@@ -306,7 +306,7 @@
 	/*** OpenGL BEGIN ***/
 	if (!gdk_gl_drawable_gl_begin(gldrawable, glcontext))
 		return FALSE;
-	
+
 
 /* Undo all of the Model lighting here*/
 
@@ -329,8 +329,8 @@
 	glLoadIdentity();
 
 
-	
-	
+
+
 	gdk_gl_drawable_gl_end(gldrawable);
 	/*** OpenGL END ***/
 
@@ -352,7 +352,7 @@
 	} else if (!strcmp(string, "Shark")) {
 		features->kind = 1;
 	}
-	
+
 	material_set(GTK_ENTRY(GTK_COMBO(instance->head)->entry),
 			&features->head_color);
 	material_set(GTK_ENTRY(GTK_COMBO(instance->appendage)->entry),
@@ -369,7 +369,7 @@
 	} else {
 		instance->face.mode = 0;
 	}
-	
+
 	if (mode_change>0){
 		mode_change--;
 		config_wrapper(widget, event, data);
@@ -392,7 +392,7 @@
 	//	fprintf(stderr, "We're fucked this time.\n");
 		return FALSE;
 	}
-	
+
 	glClearColor(0.0, 0.0, 0.0, 0.0);
 	glClear(GL_COLOR_BUFFER_BIT);
 
@@ -402,11 +402,11 @@
 		gdk_gl_drawable_swap_buffers(gldrawable);
 	else
 		glFlush();
-	
+
 	gdk_gl_drawable_gl_end(gldrawable);
-	
+
 	/*** OpenGL END ***/
-	
+
 	return TRUE;
 }
 
--- a/pidgin/plugins/crazychat/cc_gtk_gl.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/pidgin/plugins/crazychat/cc_gtk_gl.c	Sat Feb 12 04:17:09 2011 +0900
@@ -137,7 +137,7 @@
 	GtkWidget *drawing_area;
 
 	assert(data);
-	
+
 	drawing_area = gtk_drawing_area_new();
 	assert(drawing_area);
 
@@ -183,7 +183,7 @@
 	GLfloat aspect;
 
 //	Debug("configuring\n");
-	
+
 	/*** OpenGL BEGIN ***/
 	if (!gdk_gl_drawable_gl_begin(gldrawable, glcontext))
 		return FALSE;
@@ -212,7 +212,7 @@
 {
 	struct draw_info *info = (struct draw_info*)data;
 	Debug("map\n");
-	
+
 	if (info->timeout) {
 		widget_draw_timer_add(widget, info);
 	}
@@ -223,7 +223,7 @@
 {
 	struct draw_info *info = (struct draw_info*)data;
 	Debug("unmap\n");
-	
+
 	if (info->timeout) {
 		widget_draw_timer_remove(widget, info);
 	}
@@ -235,7 +235,7 @@
 {
 	struct draw_info *info = (struct draw_info*)data;
 	Debug("visibility\n");
-	
+
 	if (event->state == GDK_VISIBILITY_FULLY_OBSCURED) {
 		Debug("obscured\n");
 		if (info->timeout) {
@@ -280,7 +280,7 @@
 static void destroy_event(GtkWidget *widget, struct draw_info *data)
 {
 	Debug("destroying widget\n");
-	
+
 	if (data) {
 		widget_draw_timer_remove(widget, data);
 		free(data);
--- a/pidgin/plugins/crazychat/cc_network.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/pidgin/plugins/crazychat/cc_network.c	Sat Feb 12 04:17:09 2011 +0900
@@ -69,7 +69,7 @@
 		struct cc_session *session);
 
 /**
- * Handles checking the network for new feature data and sending out the 
+ * Handles checking the network for new feature data and sending out the
  * latest features.
  * @param session		the session we're checking for network traffic
  */
@@ -99,7 +99,7 @@
 	PurpleConversation *conv;
 	PurpleConvIm *im;
 	char buf[BUFSIZ];
-	
+
 	session = cc_find_session(cc, name);
 	if (session) return; /* already have a session with this guy */
 	session = cc_add_session(cc, name);
@@ -158,7 +158,7 @@
 
 		g_signal_connect(GTK_OBJECT(dialog), "response",
 				G_CALLBACK(invite_handler), args);
-		
+
 		gtk_widget_show_all(dialog);
 	}
 }
@@ -184,7 +184,7 @@
 static void cc_net_send_ready(PurpleAccount *account, struct cc_session *session)
 {
 	struct sock_accept_args *args;
-	
+
 	assert(session);
 	Debug("Initializing the server socket and sending ready message\n");
 	/* create the server socket */
@@ -261,7 +261,7 @@
 	char buf[BUFSIZ];
 	PurpleConversation *conv;
 	PurpleConvIm *im;
-	
+
 	if (response == GTK_RESPONSE_ACCEPT) {
 		assert(args);
 		session = cc_find_session(args->cc, args->name);
@@ -319,7 +319,7 @@
 		sock = accept(session->tcp_sock,
 				(struct sockaddr*)&client_addr, &sin_size);
 		assert(sock != -1);
-		
+
 		/* check if it's a match */
 		if (client_addr.sin_addr.s_addr == session->peer_ip) {
 			/* cool, we're set */
@@ -354,9 +354,9 @@
 	struct sockaddr_in my_addr;
 	struct sockaddr_in peer_addr;
 	int reuse;
-	
+
 	/* send/obtain the udp port information */
-	
+
 	assert(__send(session->tcp_sock, (char*)&session->cc->udp_port,
 			sizeof(session->cc->udp_port)) ==
 			sizeof(session->cc->udp_port));
@@ -365,14 +365,14 @@
 			sizeof(session->peer_port));
 
 	Debug("Established a CrazyChat session with %s!\n", session->name);
-	
+
 	/* connect the udp sockets */
-	
+
 	session->udp_sock = socket(AF_INET, SOCK_DGRAM, 0);
 
 	assert(!setsockopt(session->udp_sock, SOL_SOCKET, SO_REUSEADDR,
 			&reuse, sizeof(reuse)));
-	
+
 	my_addr.sin_family = AF_INET;
 	my_addr.sin_port = htons(session->cc->udp_port);
 	assert(inet_aton(purple_network_get_my_ip(-1),
@@ -387,7 +387,7 @@
 
 	Debug("Bound udp sock to port %d, connecting to port %d\n",
 		session->cc->udp_port, session->peer_port);
-	
+
 	memset(&session->features, 0, sizeof(session->features));
 
 	session->output = init_output(&session->features, session);
@@ -452,7 +452,7 @@
 	assert(ret != -1);
 
 	features = &session->features;
-		
+
 	while (ret) { /* have data, let's copy it for output */
 		struct sockaddr_in from;
 		int fromlen;
--- a/pidgin/plugins/crazychat/cc_output.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/pidgin/plugins/crazychat/cc_output.c	Sat Feb 12 04:17:09 2011 +0900
@@ -60,20 +60,20 @@
 	curr_mode = NORMAL;
 	return;
 */
-	
+
 	//find z plane from percentage of face
 	if(instance->features->head_size==0){
 		z = 5;
-	}	
+	}
 
 	temp = (GLfloat)instance->features->head_size/40.0;
 	//printf("head size %d\n", instance->features->head_size);
-	
+
 	minZ = ROOT_3;
 	z = ROOT_3*(PERSONS_HEAD/temp);
 	if(z < minZ)
 		z = minZ;
-	 	
+
 	//these calculations are based on a 90 degree viewing angle
 	rangeX = z*(TAN_30)*2;
 	rangeY = window_aspect*rangeX;
@@ -87,7 +87,7 @@
 		x = 0 + temp*rangeX/1.0;
 	}
 
-	temp = (GLfloat)instance->features->y;	
+	temp = (GLfloat)instance->features->y;
 
 	if(temp>50){
 		temp = (temp-50.0)/50.0;
@@ -113,14 +113,14 @@
 
 	mouth_open = (float)instance->features->mouth_open/105;
 	count++;
-	//mouth_open = (count%10)/(10);	
+	//mouth_open = (count%10)/(10);
 
 	if(instance->features->left_eye_open==0){
 		left_open = FALSE;
 	}
 	else{
 		left_open = TRUE;
-	}	
+	}
 
 	if(instance->features->right_eye_open==0)
 		right_open = FALSE;
@@ -141,7 +141,7 @@
 		which_face=DOG;
 	else
 		which_face=SHARK;
-	
+
 }
 
 
@@ -151,7 +151,7 @@
 {
 	GdkGLContext *glcontext = gtk_widget_get_gl_context(widget);
 	GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable(widget);
-	
+
 	GLfloat w = widget->allocation.width;
 	GLfloat h = widget->allocation.height;
 	GLfloat aspect;
@@ -174,7 +174,7 @@
 		window_aspect = h / w;
 	}
 
-	//glOrtho(-10, 10, -10,10, 0.0001, 1000); 
+	//glOrtho(-10, 10, -10,10, 0.0001, 1000);
 	gluPerspective(90.0, window_aspect, 0.0001, 1000.0);
 
 	glMatrixMode(GL_MODELVIEW);
@@ -194,7 +194,7 @@
 		fprintf(stderr,"null\n");
 	}
 	assert(instance);
-	Interpolate(instance);	
+	Interpolate(instance);
 
 	GdkGLContext *glcontext = gtk_widget_get_gl_context (widget);
 	GdkGLDrawable *gldrawable = gtk_widget_get_gl_drawable (widget);
@@ -212,11 +212,11 @@
 	glClearColor(1.0, 1.0, 1.0, 0.0);
 	//glDisable(GL_CULL_FACE);
 
-	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);	
+	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 	glColor3f(1.0, 1.0, 1.0);
 	glMatrixMode(GL_MODELVIEW);
 	glLoadIdentity();
-	
+
 	glTranslatef(x, y, -z);
 	if(instance->my_output==LOCAL){
 		if(which_face==DOG){
@@ -226,7 +226,7 @@
 		else {
 			change_materials(local_shark_face, curr_materials, DOG_SHARK_CHANGE);
 			draw_face(local_shark_face, zrot, yrot, left_open, right_open, mouth_open, dir, curr_mode);
-		}	
+		}
 	}
 	else{
 		if(which_face==DOG){
@@ -245,7 +245,7 @@
 	return TRUE;
 }
 
-void init (GtkWidget *widget, void *data) 
+void init (GtkWidget *widget, void *data)
 {
 	setupDrawlists(REMOTE);
 	setupLighting(widget);
@@ -282,14 +282,14 @@
         //glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
         glMaterialfv(GL_FRONT, GL_DIFFUSE, diffuse);
         glMateriali(GL_FRONT, GL_SHININESS, 128);
-        
+
         //glEnable(GL_CULL_FACE);
-        
+
         glClear(GL_COLOR_BUFFER_BIT);
 	glMatrixMode(GL_PROJECTION);
 	glLoadIdentity();
 	//glOrtho(-2, 2, -2, 2, 0.0001, 1000);
-	
+
 	if (w > h) {
 		window_aspect = w / h;
 	} else {
--- a/pidgin/plugins/crazychat/cc_pidgin_plugin.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/pidgin/plugins/crazychat/cc_pidgin_plugin.c	Sat Feb 12 04:17:09 2011 +0900
@@ -169,7 +169,7 @@
 static void cc_init(struct crazychat *cc)
 {
 	/* initialize main crazychat thread */
-	
+
 	assert(cc);
 	memset(cc, 0, sizeof(*cc));
 
@@ -243,7 +243,7 @@
 		cc_net_recv_ready(account, cc, *sender);
 		return TRUE;
 	}
-	
+
 	return FALSE;
 }
 
@@ -345,7 +345,7 @@
 	button1 = gtk_radio_button_new_with_label(NULL, _("Enabled"));
 	gtk_box_pack_start(GTK_BOX(vbox), button1, TRUE, TRUE, 0);
 	gtk_widget_show(button1);
-	
+
 	group = gtk_radio_button_get_group(GTK_RADIO_BUTTON(button1));
 	button2 = gtk_radio_button_new_with_label(group, _("Disabled"));
 	gtk_box_pack_start(GTK_BOX(vbox), button2, TRUE, TRUE, 0);
@@ -367,9 +367,9 @@
 	button = gtk_button_new_with_label("Calibrate");
 	gtk_box_pack_start(GTK_BOX(vbox), button, TRUE, FALSE, 0);
 	gtk_widget_show(button);
-	
+
 	gtk_widget_show(ret);
-	
+
 	return ret;
 }
 
@@ -451,7 +451,7 @@
 	}
 
 	Debug("CrazyChat plugin loaded.\n");
-	
+
 	return TRUE;
 }
 
--- a/pidgin/plugins/crazychat/crazychat.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/pidgin/plugins/crazychat/crazychat.c	Sat Feb 12 04:17:09 2011 +0900
@@ -65,7 +65,7 @@
 void cc_remove_session(struct crazychat *cc, struct cc_session *session)
 {
 	struct cc_session_node *curr, *prev;
-	
+
 	assert(cc);
 	assert(session);
 
--- a/pidgin/plugins/crazychat/dog_lids.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/pidgin/plugins/crazychat/dog_lids.c	Sat Feb 12 04:17:09 2011 +0900
@@ -17,7 +17,7 @@
 void initLids(){
 	GLint test;
 	int i;
-	
+
 	GLint[0]=Gen3DObjectListLid1();
 	GLint[1]=Gen3DObjectListLid2();
 	GLint[2]=Gen3DObjectListLid3();
--- a/pidgin/plugins/crazychat/doggy.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/pidgin/plugins/crazychat/doggy.c	Sat Feb 12 04:17:09 2011 +0900
@@ -21,7 +21,7 @@
 #define IRIS_Y 1.67*SCALE//.015
 #define IRIS_Z 7*SCALE//.08
 #define PUP_X 0*SCALE
-#define PUP_Y 0*SCALE 
+#define PUP_Y 0*SCALE
 #define PUP_Z 1.2*SCALE //.028
 #define IRIS_SCALE .12*SCALE
 #define PUP_SCALE .11*SCALE
@@ -113,7 +113,7 @@
 	glTranslatef(0, 0, EYES_Y);
 	glTranslatef(0, -EYES_Z,0);
 	draw_left_eye(f, left_open, max_eye);
-	draw_right_eye(f, right_open, max_eye);	
+	draw_right_eye(f, right_open, max_eye);
 	glPopMatrix();
 }
 
@@ -156,8 +156,8 @@
 }
 
 void draw_dog(FACE f, GLfloat angle, GLfloat yangle, BOOL left_open, BOOL right_open, GLfloat open, DIRECTION dir, OUTPUT_MODE mode){
-	int next_face; 
-	struct doggy_struct* dog;	
+	int next_face;
+	struct doggy_struct* dog;
 	f->crazy_count--;
 	if(f->crazy_count==0){
 		f->my_mode = mode;
@@ -178,7 +178,7 @@
 	glRotatef(-90, 1.0, 0.0, 0.0);
 	glRotatef(-yangle, 0.0, 0.0, -1.0);
 	glRotatef(-angle, 0, 1, 0);
-	dog_eyes(f, angle, yangle, left_open, right_open, dir);	
+	dog_eyes(f, angle, yangle, left_open, right_open, dir);
 	dog_ears(f, dir);
 	glmSetMat(f->materials, f->mat_indeces[HEAD]);
 	glCallList(dog->faces[dog->curr_face]);
@@ -201,10 +201,10 @@
 	f->name = strdup("dog");
 	f->draw_func = draw_dog;
 	dog = (struct doggy_struct*)f->char_struct;
-	
+
 	printf("\nReading models: ");
 	fflush(0);
-	
+
 	//initialize the draw lists
 	init_lists(&dog->faces, &dog->m_faces, NUM_DOGS, f->name, DOG_SCALE);
 	init_lists(&dog->lids, &dog->m_lids, NUM_DOG_LIDS, "lid", LID_SCALE);
@@ -215,7 +215,7 @@
 
 	printf("\n");
 	fflush(0);
-		
+
 	dog->curr_face = 0;
 	dog->curr_ear = 1;
 	dog->curr_left_lid = 9;
--- a/pidgin/plugins/crazychat/draw.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/pidgin/plugins/crazychat/draw.c	Sat Feb 12 04:17:09 2011 +0900
@@ -40,35 +40,35 @@
     ctrlpoints[0][0][0]=points[0][0];
     ctrlpoints[0][0][1]=points[0][1];
     ctrlpoints[0][0][2]=points[0][2];
-    
+
     ctrlpoints[0][1][0]=points[1][0];
     ctrlpoints[0][1][1]=points[1][1];
     ctrlpoints[0][1][2]=points[1][2];
-    
+
     ctrlpoints[0][2][0]=points[2][0];
     ctrlpoints[0][2][1]=points[2][1];
     ctrlpoints[0][2][2]=points[2][2];
-    
+
     ctrlpoints[1][0][0]=points[0][0];
     ctrlpoints[1][0][1]=points[0][1];
     ctrlpoints[1][0][2]=points[0][2];
-    
+
     ctrlpoints[1][1][0]=0;
     ctrlpoints[1][1][1]=0;
     ctrlpoints[1][1][2]=back;
-    
+
     ctrlpoints[1][2][0]=points[2][0];
     ctrlpoints[1][2][1]=points[2][1];
     ctrlpoints[1][2][2]=points[2][2];
-    
+
     ctrlpoints[2][0][0]=points[0][0];
     ctrlpoints[2][0][1]=points[0][1];
     ctrlpoints[2][0][2]=points[0][2];
-    
+
     ctrlpoints[2][1][0]=points[3][0];
     ctrlpoints[2][1][1]=points[3][1];
     ctrlpoints[2][1][2]=points[3][2];
-    
+
     ctrlpoints[2][2][0]=points[2][0];
     ctrlpoints[2][2][1]=points[2][1];
     ctrlpoints[2][2][2]=points[2][2];
@@ -78,7 +78,7 @@
 {
     GLshort[4][3][3] ctrlpoints;
     CalculateMouthPoints(ctrlpoints, p);
-    
+
     glMap2f(GL_MAP2_VERTEX_3, 0, 10, 3, 3, 0.0, 10.0, 9, 3, &ctrlpoints[0][0][0]);
     glEnable(GL_MAP2_VERTEX_3);
     glMapGrid2f(10, 0, 10, 10, 0, 10);
@@ -87,7 +87,7 @@
 }
 
 void initEyes(){
-	
+
 
 void drawEyes(struct Packet* p){
     GLshort eye[3][3][3];
@@ -95,12 +95,12 @@
     glMap2f(GL_MAP2_VERTEX_3, 0, 10, 3, 3, 0.0, 10.0, 9, 3, &eyep[0][0][0]);
     glMapGrid2f(10, 0, 10, 10, 0, 10);
     glEvalMesh2(GL_FILL, 0, 10, 0, 10);
-    
+
     CalculateEyePoints(eye, p, RIGHT);
     glMap2f(GL_MAP2_VERTEX_3, 0, 10, 3, 3, 0.0, 10.0, 9, 3, &eyep[0][0][0]);
     glMapGrid2f(10, 0, 10, 10, 0, 10);
     glEvalMesh2(GL_FILL, 0, 10, 0, 10);
-    
+
 }
 
 void drawHead(struct Packet* p){
--- a/pidgin/plugins/crazychat/eye.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/pidgin/plugins/crazychat/eye.c	Sat Feb 12 04:17:09 2011 +0900
@@ -1,18 +1,18 @@
 /*
-This file was produced by Deep Exploration Plugin: CPP Export filter. 
+This file was produced by Deep Exploration Plugin: CPP Export filter.
 
-Deep Exploration 
+Deep Exploration
 
-Copyright (c) 1999-2003 Right Hemisphere, Inc 
+Copyright (c) 1999-2003 Right Hemisphere, Inc
 
-WWW http://www.righthemisphere.com/dexp.htm 
+WWW http://www.righthemisphere.com/dexp.htm
 eMail support@righthemisphere.com
 */
 //#include <windows.h>
 #include <GL/gl.h>
 #include <GL/glu.h>
 
-#include <math.h> 
+#include <math.h>
 
 typedef struct sample_MATERIAL{
  GLfloat ambient[3];
--- a/pidgin/plugins/crazychat/eyes.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/pidgin/plugins/crazychat/eyes.c	Sat Feb 12 04:17:09 2011 +0900
@@ -1,11 +1,11 @@
 /*
-This file was produced by Deep Exploration Plugin: CPP Export filter. 
+This file was produced by Deep Exploration Plugin: CPP Export filter.
 
-Deep Exploration 
+Deep Exploration
 
-Copyright (c) 1999-2003 Right Hemisphere, Inc 
+Copyright (c) 1999-2003 Right Hemisphere, Inc
 
-WWW http://www.righthemisphere.com/dexp.htm 
+WWW http://www.righthemisphere.com/dexp.htm
 eMail support@righthemisphere.com
 */
 //#include <windows.h>
--- a/pidgin/plugins/crazychat/face.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/pidgin/plugins/crazychat/face.c	Sat Feb 12 04:17:09 2011 +0900
@@ -10,7 +10,7 @@
 
 	switch(kind){
 		case DOG:
-			init_dog(face);			
+			init_dog(face);
 			break;
 		case SHARK:
 			init_shark(face);
@@ -19,8 +19,8 @@
 			printf("default face\n");
 			init_dog(face);
 			break;
-	}			
-	return face;	
+	}
+	return face;
 }
 
 void draw_face(FACE face, GLfloat zrot, GLfloat yrot, BOOL left_eye, BOOL right_eye, GLfloat mouth_open, DIRECTION dir, OUTPUT_MODE mode){
--- a/pidgin/plugins/crazychat/face.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/pidgin/plugins/crazychat/face.h	Sat Feb 12 04:17:09 2011 +0900
@@ -25,7 +25,7 @@
 	GLint* mat_indeces;
 	GLMmat_str* materials;
 	OUTPUT_MODE my_mode;
-	int eye_count, crazy_count;	
+	int eye_count, crazy_count;
 	void (*draw_func)(struct face_struct*, GLfloat, GLfloat, BOOL, BOOL, GLfloat, DIRECTION, OUTPUT_MODE);
 	float curr_z_angle, curr_eye_pop;
 };
@@ -39,6 +39,6 @@
 
 void draw_face(FACE face, GLfloat zrot, GLfloat yrot, BOOL left_eye, BOOL right_eye, GLfloat mouth_open, DIRECTION dir, OUTPUT_MODE mode);
 
-void change_materials(FACE face, int* mats, int num_change); 
+void change_materials(FACE face, int* mats, int num_change);
 
 #endif
--- a/pidgin/plugins/crazychat/filter.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/pidgin/plugins/crazychat/filter.c	Sat Feb 12 04:17:09 2011 +0900
@@ -39,9 +39,9 @@
 features->head_size=(guint8) ( (coef_0*(f->head_size[0]+f->head_size[9]))+(coef_1*(f->head_size[1]+f->head_size[8])) +
 			(coef_2*(f->head_size[2]+f->head_size[7])) + (coef_3*(f->head_size[3]+f->head_size[6]))
 				+ (coef_4*(f->head_size[4]+f->head_size[5])));
-				
+
 
-				
+
 f->head_z_rot[9]=f->head_z_rot[8];
 f->head_z_rot[8]=f->head_z_rot[7];
 f->head_z_rot[7]=f->head_z_rot[6];
@@ -57,7 +57,7 @@
 			(coef_2*(f->head_z_rot[2]+f->head_z_rot[7])) + (coef_3*(f->head_z_rot[3]+f->head_z_rot[6]))
 				+ (coef_4*(f->head_z_rot[4]+f->head_z_rot[5])));
 
-				
+
 f->head_y_rot[9]=f->head_y_rot[8];
 f->head_y_rot[8]=f->head_y_rot[7];
 f->head_y_rot[7]=f->head_y_rot[6];
@@ -71,8 +71,8 @@
 
 features->head_y_rot=(guint8) ( (coef_0*(f->head_y_rot[0]+f->head_y_rot[9]))+(coef_1*(f->head_y_rot[1]+f->head_y_rot[8])) +
 			(coef_2*(f->head_y_rot[2]+f->head_y_rot[7])) + (coef_3*(f->head_y_rot[3]+f->head_y_rot[6]))
-				+ (coef_4*(f->head_y_rot[4]+f->head_y_rot[5])));				
- 
+				+ (coef_4*(f->head_y_rot[4]+f->head_y_rot[5])));
+
 
 f->xfilt[9]=f->xfilt[8];
 f->xfilt[8]=f->xfilt[7];
@@ -88,8 +88,8 @@
 features->x=(guint8) ( (coef_0*(f->xfilt[0]+f->xfilt[9]))+(coef_1*(f->xfilt[1]+f->xfilt[8])) +
 			(coef_2*(f->xfilt[2]+f->xfilt[7])) + (coef_3*(f->xfilt[3]+f->xfilt[6]))
 				+ (coef_4*(f->xfilt[4]+f->xfilt[5])));
-				
-				
+
+
 f->yfilt[9]=f->yfilt[8];
 f->yfilt[8]=f->yfilt[7];
 f->yfilt[7]=f->yfilt[6];
@@ -104,8 +104,8 @@
 features->y=(guint8) ( (coef_0*(f->yfilt[0]+f->yfilt[9]))+(coef_1*(f->yfilt[1]+f->yfilt[8])) +
 			(coef_2*(f->yfilt[2]+f->yfilt[7])) + (coef_3*(f->yfilt[3]+f->yfilt[6]))
 				+ (coef_4*(f->yfilt[4]+f->yfilt[5])));
-				
-				
+
+
 f->mouth_open[9]=f->mouth_open[8];
 f->mouth_open[8]=f->mouth_open[7];
 f->mouth_open[7]=f->mouth_open[6];
@@ -119,6 +119,6 @@
 
 features->mouth_open=(guint8) ( (coef_0*(f->mouth_open[0]+f->mouth_open[9]))+(coef_1*(f->mouth_open[1]+f->mouth_open[8])) +
 			(coef_2*(f->mouth_open[2]+f->mouth_open[7])) + (coef_3*(f->mouth_open[3]+f->mouth_open[6]))
-				+ (coef_4*(f->mouth_open[4]+f->mouth_open[5])));				
-				
+				+ (coef_4*(f->mouth_open[4]+f->mouth_open[5])));
+
 }
--- a/pidgin/plugins/crazychat/filter.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/pidgin/plugins/crazychat/filter.h	Sat Feb 12 04:17:09 2011 +0900
@@ -10,7 +10,7 @@
 	float mouth_open[10];
 	float xfilt[10];
 	float yfilt[10];
-} filter_bank;	
+} filter_bank;
 
 filter_bank* Filter_Initialize (void);
 void Filter_Destroy (filter_bank *f);
--- a/pidgin/plugins/crazychat/glm.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/pidgin/plugins/crazychat/glm.c	Sat Feb 12 04:17:09 2011 +0900
@@ -1,4 +1,4 @@
-/*    
+/*
       glm.c
  */
 
@@ -25,7 +25,7 @@
 
 /* glmMax: returns the maximum of two floats */
 static GLfloat
-glmMax(GLfloat a, GLfloat b) 
+glmMax(GLfloat a, GLfloat b)
 {
   if (b > a)
     return b;
@@ -92,14 +92,14 @@
  * that works fairly well is 0.000001.
  *
  * u - array of 3 GLfloats (GLfloat u[3])
- * v - array of 3 GLfloats (GLfloat v[3]) 
+ * v - array of 3 GLfloats (GLfloat v[3])
  */
 static GLboolean
 glmEqual(GLfloat* u, GLfloat* v, GLfloat epsilon)
 {
   if (glmAbs(u[0] - v[0]) < epsilon &&
       glmAbs(u[1] - v[1]) < epsilon &&
-      glmAbs(u[2] - v[2]) < epsilon) 
+      glmAbs(u[2] - v[2]) < epsilon)
   {
     return GL_TRUE;
   }
@@ -111,7 +111,7 @@
  *
  * vectors    - array of GLfloat[3]'s to be welded
  * numvectors - number of GLfloat[3]'s in vectors
- * epsilon    - maximum difference between vectors 
+ * epsilon    - maximum difference between vectors
  *
  */
 GLfloat*
@@ -534,11 +534,11 @@
   for (i = 0; i < model->nummaterials; i++) {
     material = &model->materials[i];
     fprintf(file, "newmtl %s\n", material->name);
-    fprintf(file, "Ka %f %f %f\n", 
+    fprintf(file, "Ka %f %f %f\n",
 	    material->ambient[0], material->ambient[1], material->ambient[2]);
-    fprintf(file, "Kd %f %f %f\n", 
+    fprintf(file, "Kd %f %f %f\n",
 	    material->diffuse[0], material->diffuse[1], material->diffuse[2]);
-    fprintf(file, "Ks %f %f %f\n", 
+    fprintf(file, "Ks %f %f %f\n",
 	    material->specular[0],material->specular[1],material->specular[2]);
     fprintf(file, "Ns %f\n", material->shininess / 128.0 * 1000.0);
     fprintf(file, "\n");
@@ -552,10 +552,10 @@
  * statistics of the model (such as #vertices, #normals, etc)
  *
  * model - properly initialized GLMmodel structure
- * file  - (fopen'd) file descriptor 
+ * file  - (fopen'd) file descriptor
  */
 static GLvoid
-glmFirstPass(GLMmodel* model, FILE* file) 
+glmFirstPass(GLMmodel* model, FILE* file)
 {
   GLuint    numvertices;		/* number of vertices in model */
   GLuint    numnormals;			/* number of normals in model */
@@ -692,10 +692,10 @@
  * the data.
  *
  * model - properly initialized GLMmodel structure
- * file  - (fopen'd) file descriptor 
+ * file  - (fopen'd) file descriptor
  */
 static GLvoid
-glmSecondPass(GLMmodel* model, FILE* file) 
+glmSecondPass(GLMmodel* model, FILE* file)
 {
   GLuint    numvertices;		/* number of vertices in model */
   GLuint    numnormals;			/* number of normals in model */
@@ -729,21 +729,21 @@
     case 'v':				/* v, vn, vt */
       switch(buf[1]) {
       case '\0':			/* vertex */
-	fscanf(file, "%f %f %f", 
-	       &vertices[3 * numvertices + 0], 
-	       &vertices[3 * numvertices + 1], 
+	fscanf(file, "%f %f %f",
+	       &vertices[3 * numvertices + 0],
+	       &vertices[3 * numvertices + 1],
 	       &vertices[3 * numvertices + 2]);
 	numvertices++;
 	break;
       case 'n':				/* normal */
-	fscanf(file, "%f %f %f", 
+	fscanf(file, "%f %f %f",
 	       &normals[3 * numnormals + 0],
-	       &normals[3 * numnormals + 1], 
+	       &normals[3 * numnormals + 1],
 	       &normals[3 * numnormals + 2]);
 	numnormals++;
 	break;
       case 't':				/* texcoord */
-	fscanf(file, "%f %f", 
+	fscanf(file, "%f %f",
 	       &texcoords[2 * numtexcoords + 0],
 	       &texcoords[2 * numtexcoords + 1]);
 	numtexcoords++;
@@ -888,7 +888,7 @@
  * scaling it to fit in a unit cube around the origin.  Modelurns the
  * scalefactor used.
  *
- * model - properly initialized GLMmodel structure 
+ * model - properly initialized GLMmodel structure
  */
 GLfloat
 glmUnitize(GLMmodel* model)
@@ -945,7 +945,7 @@
     model->vertices[3 * i + 0] *= scale;
     model->vertices[3 * i + 1] *= scale;
     model->vertices[3 * i + 2] *= scale;
-*/  
+*/
   }
 
   return scale;
@@ -995,7 +995,7 @@
 }
 
 /* glmScale: Scales a model by a given amount.
- * 
+ *
  * model - properly initialized GLMmodel structure
  * scale - scalefactor (0.5 = half as large, 2.0 = twice as large)
  */
@@ -1014,8 +1014,8 @@
 /* glmReverseWinding: Reverse the polygon winding for all polygons in
  * this model.  Default winding is counter-clockwise.  Also changes
  * the direction of the normals.
- * 
- * model - properly initialized GLMmodel structure 
+ *
+ * model - properly initialized GLMmodel structure
  */
 GLvoid
 glmReverseWinding(GLMmodel* model)
@@ -1069,7 +1069,7 @@
   GLuint  i;
   GLfloat u[3];
   GLfloat v[3];
-  
+
   assert(model);
   assert(model->vertices);
 
@@ -1151,7 +1151,7 @@
   members = (GLMnode**)malloc(sizeof(GLMnode*) * (model->numvertices + 1));
   for (i = 1; i <= model->numvertices; i++)
     members[i] = NULL;
-  
+
   /* for every triangle, create a node for each vertex in it */
   for (i = 0; i < model->numtriangles; i++) {
     node = (GLMnode*)malloc(sizeof(GLMnode));
@@ -1224,11 +1224,11 @@
 	  T(node->index).nindices[2] = avg;
       } else {
 	/* if this node wasn't averaged, use the facet normal */
-	model->normals[3 * numnormals + 0] = 
+	model->normals[3 * numnormals + 0] =
 	  model->facetnorms[3 * T(node->index).findex + 0];
-	model->normals[3 * numnormals + 1] = 
+	model->normals[3 * numnormals + 1] =
 	  model->facetnorms[3 * T(node->index).findex + 1];
-	model->normals[3 * numnormals + 2] = 
+	model->normals[3 * numnormals + 2] =
 	  model->facetnorms[3 * T(node->index).findex + 2];
 	if (T(node->index).vindices[0] == i)
 	  T(node->index).nindices[0] = numnormals;
@@ -1241,7 +1241,7 @@
       node = node->next;
     }
   }
-  
+
   model->numnormals = numnormals - 1;
 
   /* free the member information */
@@ -1283,16 +1283,16 @@
   GLfloat dimensions[3];
   GLfloat x, y, scalefactor;
   GLuint i;
-  
+
   assert(model);
 
   if (model->texcoords)
     free(model->texcoords);
   model->numtexcoords = model->numvertices;
   model->texcoords=(GLfloat*)malloc(sizeof(GLfloat)*2*(model->numtexcoords+1));
-  
+
   glmDimensions(model, dimensions);
-  scalefactor = 2.0 / 
+  scalefactor = 2.0 /
     glmAbs(glmMax(glmMax(dimensions[0], dimensions[1]), dimensions[2]));
 
   /* do the calculations */
@@ -1302,7 +1302,7 @@
     model->texcoords[2 * i + 0] = (x + 1.0) / 2.0;
     model->texcoords[2 * i + 1] = (y + 1.0) / 2.0;
   }
-  
+
   /* go through and put texture coordinate indices in all the triangles */
   group = model->groups;
   while(group) {
@@ -1310,7 +1310,7 @@
       T(group->triangles[i]).tindices[0] = T(group->triangles[i]).vindices[0];
       T(group->triangles[i]).tindices[1] = T(group->triangles[i]).vindices[1];
       T(group->triangles[i]).tindices[2] = T(group->triangles[i]).vindices[2];
-    }    
+    }
     group = group->next;
   }
 
@@ -1337,7 +1337,7 @@
   GLMgroup* group;
   GLfloat theta, phi, rho, x, y, z, r;
   GLuint i;
-  
+
   assert(model);
   assert(model->normals);
 
@@ -1345,14 +1345,14 @@
     free(model->texcoords);
   model->numtexcoords = model->numnormals;
   model->texcoords=(GLfloat*)malloc(sizeof(GLfloat)*2*(model->numtexcoords+1));
-     
+
   for (i = 1; i <= model->numnormals; i++) {
     z = model->normals[3 * i + 0];	/* re-arrange for pole distortion */
     y = model->normals[3 * i + 1];
     x = model->normals[3 * i + 2];
     r = sqrt((x * x) + (y * y));
     rho = sqrt((r * r) + (z * z));
-      
+
     if(r == 0.0) {
 	theta = 0.0;
 	phi = 0.0;
@@ -1367,11 +1367,11 @@
       else
 	theta = asin(y / r) + (3.14159265 / 2.0);
     }
-    
+
     model->texcoords[2 * i + 0] = theta / 3.14159265;
     model->texcoords[2 * i + 1] = phi / 3.14159265;
   }
-  
+
   /* go through and put texcoord indices in all the triangles */
   group = model->groups;
   while(group) {
@@ -1423,9 +1423,9 @@
  * Modelurns a pointer to the created object which should be free'd with
  * glmDelete().
  *
- * filename - name of the file containing the Wavefront .OBJ format data.  
+ * filename - name of the file containing the Wavefront .OBJ format data.
  */
-GLMmodel* 
+GLMmodel*
 glmReadOBJ(char* filename)
 {
   GLMmodel* model;
@@ -1504,8 +1504,8 @@
  *            GLM_TEXTURE  -  render with texture coords
  *            GLM_COLOR    -  render with colors (color material)
  *            GLM_MATERIAL -  render with materials
- *            GLM_COLOR and GLM_MATERIAL should not both be specified.  
- *            GLM_FLAT and GLM_SMOOTH should not both be specified.  
+ *            GLM_COLOR and GLM_MATERIAL should not both be specified.
+ *            GLM_FLAT and GLM_SMOOTH should not both be specified.
  */
 GLvoid
 glmWriteOBJ(GLMmodel* model, char* filename, GLuint mode)
@@ -1581,7 +1581,7 @@
   fprintf(file, "\n");
   fprintf(file, "# %d vertices\n", model->numvertices);
   for (i = 1; i <= model->numvertices; i++) {
-    fprintf(file, "v %f %f %f\n", 
+    fprintf(file, "v %f %f %f\n",
 	    model->vertices[3 * i + 0],
 	    model->vertices[3 * i + 1],
 	    model->vertices[3 * i + 2]);
@@ -1592,7 +1592,7 @@
     fprintf(file, "\n");
     fprintf(file, "# %d normals\n", model->numnormals);
     for (i = 1; i <= model->numnormals; i++) {
-      fprintf(file, "vn %f %f %f\n", 
+      fprintf(file, "vn %f %f %f\n",
 	      model->normals[3 * i + 0],
 	      model->normals[3 * i + 1],
 	      model->normals[3 * i + 2]);
@@ -1601,7 +1601,7 @@
     fprintf(file, "\n");
     fprintf(file, "# %d normals\n", model->numfacetnorms);
     for (i = 1; i <= model->numnormals; i++) {
-      fprintf(file, "vn %f %f %f\n", 
+      fprintf(file, "vn %f %f %f\n",
 	      model->facetnorms[3 * i + 0],
 	      model->facetnorms[3 * i + 1],
 	      model->facetnorms[3 * i + 2]);
@@ -1613,7 +1613,7 @@
     fprintf(file, "\n");
     fprintf(file, "# %d texcoords\n", model->texcoords);
     for (i = 1; i <= model->numtexcoords; i++) {
-      fprintf(file, "vt %f %f\n", 
+      fprintf(file, "vt %f %f\n",
 	      model->texcoords[2 * i + 0],
 	      model->texcoords[2 * i + 1]);
     }
@@ -1632,8 +1632,8 @@
     for (i = 0; i < group->numtriangles; i++) {
       if (mode & GLM_SMOOTH && mode & GLM_TEXTURE) {
 	fprintf(file, "f %d/%d/%d %d/%d/%d %d/%d/%d\n",
-		T(group->triangles[i]).vindices[0], 
-		T(group->triangles[i]).nindices[0], 
+		T(group->triangles[i]).vindices[0],
+		T(group->triangles[i]).nindices[0],
 		T(group->triangles[i]).tindices[0],
 		T(group->triangles[i]).vindices[1],
 		T(group->triangles[i]).nindices[1],
@@ -1663,11 +1663,11 @@
 		T(group->triangles[i]).nindices[0],
 		T(group->triangles[i]).vindices[1],
 		T(group->triangles[i]).nindices[1],
-		T(group->triangles[i]).vindices[2], 
+		T(group->triangles[i]).vindices[2],
 		T(group->triangles[i]).nindices[2]);
       } else if (mode & GLM_FLAT) {
 	fprintf(file, "f %d//%d %d//%d %d//%d\n",
-		T(group->triangles[i]).vindices[0], 
+		T(group->triangles[i]).vindices[0],
 		T(group->triangles[i]).findex,
 		T(group->triangles[i]).vindices[1],
 		T(group->triangles[i]).findex,
@@ -1698,8 +1698,8 @@
  *            GLM_TEXTURE  -  render with texture coords
  *            GLM_COLOR    -  render with colors (color material)
  *            GLM_MATERIAL -  render with materials
- *            GLM_COLOR and GLM_MATERIAL should not both be specified.  
- *            GLM_FLAT and GLM_SMOOTH should not both be specified.  
+ *            GLM_COLOR and GLM_MATERIAL should not both be specified.
+ *            GLM_FLAT and GLM_SMOOTH should not both be specified.
  */
 GLvoid
 glmDraw(GLMmodel* model, GLuint mode)
@@ -1778,25 +1778,25 @@
 
       if (mode & GLM_FLAT)
 	glNormal3fv(&model->facetnorms[3 * triangle->findex]);
-      
+
       if (mode & GLM_SMOOTH)
 	glNormal3fv(&model->normals[3 * triangle->nindices[0]]);
       if (mode & GLM_TEXTURE)
 	glTexCoord2fv(&model->texcoords[2 * triangle->tindices[0]]);
       glVertex3fv(&model->vertices[3 * triangle->vindices[0]]);
-      
+
       if (mode & GLM_SMOOTH)
 	glNormal3fv(&model->normals[3 * triangle->nindices[1]]);
       if (mode & GLM_TEXTURE)
 	glTexCoord2fv(&model->texcoords[2 * triangle->tindices[1]]);
       glVertex3fv(&model->vertices[3 * triangle->vindices[1]]);
-      
+
       if (mode & GLM_SMOOTH)
 	glNormal3fv(&model->normals[3 * triangle->nindices[2]]);
       if (mode & GLM_TEXTURE)
 	glTexCoord2fv(&model->texcoords[2 * triangle->tindices[2]]);
       glVertex3fv(&model->vertices[3 * triangle->vindices[2]]);
-      
+
     }
     glEnd();
 
@@ -1815,7 +1815,7 @@
  *            GLM_TEXTURE  -  render with texture coords
  *            GLM_COLOR    -  render with colors (color material)
  *            GLM_MATERIAL -  render with materials
- *            GLM_COLOR and GLM_MATERIAL should not both be specified.  
+ *            GLM_COLOR and GLM_MATERIAL should not both be specified.
  * GLM_FLAT and GLM_SMOOTH should not both be specified.  */
 GLuint
 glmList(GLMmodel* model, GLuint mode)
@@ -1852,7 +1852,7 @@
   copies = glmWeldVectors(vectors, &numvectors, epsilon);
 
 #if 0
-  printf("glmWeld(): %d redundant vertices.\n", 
+  printf("glmWeld(): %d redundant vertices.\n",
 	 model->numvertices - numvectors - 1);
 #endif
 
@@ -1867,7 +1867,7 @@
 
   /* allocate space for the new vertices */
   model->numvertices = numvectors;
-  model->vertices = (GLfloat*)malloc(sizeof(GLfloat) * 
+  model->vertices = (GLfloat*)malloc(sizeof(GLfloat) *
 				     3 * (model->numvertices + 1));
 
   /* copy the optimized vertices into the actual vertex list */
@@ -1888,7 +1888,7 @@
   vectors    = model->normals;
   copies = glmOptimizeVectors(vectors, &numvectors);
 
-  printf("glmOptimize(): %d redundant normals.\n", 
+  printf("glmOptimize(): %d redundant normals.\n",
 	 model->numnormals - numvectors);
 
   for (i = 0; i < model->numtriangles; i++) {
@@ -1902,7 +1902,7 @@
 
   /* allocate space for the new normals */
   model->numnormals = numvectors;
-  model->normals = (GLfloat*)malloc(sizeof(GLfloat) * 
+  model->normals = (GLfloat*)malloc(sizeof(GLfloat) *
 				    3 * (model->numnormals + 1));
 
   /* copy the optimized vertices into the actual vertex list */
@@ -1921,7 +1921,7 @@
   vectors    = model->texcoords;
   copies = glmOptimizeVectors(vectors, &numvectors);
 
-  printf("glmOptimize(): %d redundant texcoords.\n", 
+  printf("glmOptimize(): %d redundant texcoords.\n",
 	 model->numtexcoords - numvectors);
 
   for (i = 0; i < model->numtriangles; i++) {
@@ -1935,7 +1935,7 @@
 
   /* allocate space for the new texcoords */
   model->numtexcoords = numvectors;
-  model->texcoords = (GLfloat*)malloc(sizeof(GLfloat) * 
+  model->texcoords = (GLfloat*)malloc(sizeof(GLfloat) *
 				      2 * (model->numtexcoords + 1));
 
   /* copy the optimized vertices into the actual vertex list */
@@ -1955,8 +1955,8 @@
   /* look for unused texcoords */
   for (i = 1; i <= model->numvertices; i++) {
     for (j = 0; j < model->numtriangles; i++) {
-      if (T(j).vindices[0] == i || 
-	  T(j).vindices[1] == i || 
+      if (T(j).vindices[0] == i ||
+	  T(j).vindices[1] == i ||
 	  T(j).vindices[1] == i)
 	break;
     }
--- a/pidgin/plugins/crazychat/glm.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/pidgin/plugins/crazychat/glm.h	Sat Feb 12 04:17:09 2011 +0900
@@ -1,7 +1,7 @@
 #ifndef __GLM__H__
 #define __GLM__H__
 
-/*    
+/*
       glm.h
 
  */
@@ -27,7 +27,7 @@
 #define GLM_MATERIAL (1 << 4)		/* render with materials */
 
 
-/* GLMmaterial: Structure that defines a material in a model. 
+/* GLMmaterial: Structure that defines a material in a model.
  */
 typedef struct _GLMmaterial
 {
@@ -103,7 +103,7 @@
  * scaling it to fit in a unit cube around the origin.  Returns the
  * scalefactor used.
  *
- * model - properly initialized GLMmodel structure 
+ * model - properly initialized GLMmodel structure
  */
 GLfloat
 glmUnitize(GLMmodel* model);
@@ -118,7 +118,7 @@
 glmDimensions(GLMmodel* model, GLfloat* dimensions);
 
 /* glmScale: Scales a model by a given amount.
- * 
+ *
  * model - properly initialized GLMmodel structure
  * scale - scalefactor (0.5 = half as large, 2.0 = twice as large)
  */
@@ -128,8 +128,8 @@
 /* glmReverseWinding: Reverse the polygon winding for all polygons in
  * this model.  Default winding is counter-clockwise.  Also changes
  * the direction of the normals.
- * 
- * model - properly initialized GLMmodel structure 
+ *
+ * model - properly initialized GLMmodel structure
  */
 GLvoid
 glmReverseWinding(GLMmodel* model);
@@ -196,9 +196,9 @@
  * Returns a pointer to the created object which should be free'd with
  * glmDelete().
  *
- * filename - name of the file containing the Wavefront .OBJ format data.  
+ * filename - name of the file containing the Wavefront .OBJ format data.
  */
-GLMmodel* 
+GLMmodel*
 glmReadOBJ(char* filename);
 
 /* glmWriteOBJ: Writes a model description in Wavefront .OBJ format to
@@ -239,7 +239,7 @@
  *            GLM_FLAT    -  render with facet normals
  *            GLM_SMOOTH  -  render with vertex normals
  *            GLM_TEXTURE -  render with texture coords
- *            GLM_FLAT and GLM_SMOOTH should not both be specified.  
+ *            GLM_FLAT and GLM_SMOOTH should not both be specified.
  */
 GLuint
 glmList(GLMmodel* model, GLuint mode);
@@ -255,10 +255,10 @@
 GLvoid
 glmWeld(GLMmodel* model, GLfloat epsilon);
 
-GLMmat_str* 
+GLMmat_str*
 glmMTL(char* name);
 
-void 
+void
 glmSetMat(GLMmat_str* mats, GLint index);
 
 #  ifdef __cplusplus
--- a/pidgin/plugins/crazychat/main.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/pidgin/plugins/crazychat/main.c	Sat Feb 12 04:17:09 2011 +0900
@@ -16,7 +16,7 @@
 
 
 int main(void)
-{	
+{
     EnterMovies();
     CamProc(); // change this prototype-> no windows
     fprintf(stderr, "you have just murdered 1000 people.");
--- a/pidgin/plugins/crazychat/models.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/pidgin/plugins/crazychat/models.c	Sat Feb 12 04:17:09 2011 +0900
@@ -11,9 +11,9 @@
 	GLint* temp_lists;
 	GLMmodel** temp_models;
 	char* temp = (char*)malloc(sizeof(char) * (strlen(name) + strlen(".obj" + 3)));
-	GLMmodel* model;	
+	GLMmodel* model;
 	float dum;
-	temp_lists = (GLint*)malloc(sizeof(GLint) * num_lists);	
+	temp_lists = (GLint*)malloc(sizeof(GLint) * num_lists);
 	temp_models = (GLMmodel**)malloc(sizeof(GLMmodel*) * num_lists);
 
 	for(i=0;i<num_lists;i++) {
@@ -38,7 +38,7 @@
 
 	*lists = temp_lists;
 	*models = temp_models;
-	free(temp);	
+	free(temp);
 }
 
 int compute_lid(BOOL open, int curr_lid, int max){
@@ -51,7 +51,7 @@
 	}
 	else {
 		if(curr_lid >=2){
-			curr_lid-=2;	
+			curr_lid-=2;
 		}
 		else if(curr_lid==1){
 			curr_lid--;
--- a/pidgin/plugins/crazychat/sharky.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/pidgin/plugins/crazychat/sharky.c	Sat Feb 12 04:17:09 2011 +0900
@@ -21,7 +21,7 @@
 #define SHARK_IRIS_Y 1.67*SHARK_SCALE//.015
 #define SHARK_IRIS_Z 5.0*SHARK_SCALE//.08
 #define SHARK_PUP_X 0*SHARK_SCALE
-#define SHARK_PUP_Y 0*SHARK_SCALE 
+#define SHARK_PUP_Y 0*SHARK_SCALE
 #define SHARK_PUP_Z 2.5*SHARK_SCALE //.028
 #define SHARK_IRIS_SCALE .10*SHARK_SCALE
 #define SHARK_PUP_SCALE .08*SHARK_SCALE
@@ -120,7 +120,7 @@
 	glTranslatef(0, 0, SHARK_EYES_Y);
 	glTranslatef(0, -SHARK_EYES_Z,0);
 	draw_shark_left_eye(f, left_open, max_eye);
-	draw_shark_right_eye(f, right_open, max_eye);	
+	draw_shark_right_eye(f, right_open, max_eye);
 	glPopMatrix();
 }
 
@@ -171,12 +171,12 @@
 	glmSetMat(f->materials, f->mat_indeces[APPENDAGE]);
 	glCallList(shark->fins[2]);
 	glPopMatrix();
-	
+
 }
 
 void draw_shark(FACE f, GLfloat angle, GLfloat yangle, BOOL left_open, BOOL right_open, GLfloat open, DIRECTION dir, OUTPUT_MODE mode){
-	int next_face; 
-	struct shark_struct* shark;	
+	int next_face;
+	struct shark_struct* shark;
 
 	f->crazy_count--;
 	if(f->crazy_count==0){
@@ -198,7 +198,7 @@
 	glRotatef(-90, 1.0, 0.0, 0.0);
 	glRotatef(-yangle, 0.0, 0.0, -1.0);
 	glRotatef(-angle, 0, 1, 0);
-	shark_eyes(f, angle, yangle, left_open, right_open, dir);	
+	shark_eyes(f, angle, yangle, left_open, right_open, dir);
 	shark_fins(f, dir);
 	//draw_back_fins(f);
 	glmSetMat(f->materials, f->mat_indeces[HEAD]);
@@ -223,10 +223,10 @@
 	f->name = strdup("sharky");
 	f->draw_func = draw_shark;
 	shark = (struct shark_struct*)f->char_struct;
-	
+
 	printf("\nReading models: ");
 	fflush(0);
-	
+
 	//initialize the draw lists
 	init_lists(&shark->faces, &shark->m_faces, NUM_SHARKS, f->name, SHARK_HEAD_SCALE);
 	init_lists(&shark->lids, &shark->m_lids, NUM_SHARK_LIDS, "sharkylid", SHARK_LID_SCALE);
@@ -237,7 +237,7 @@
 
 	printf("\n");
 	fflush(0);
-		
+
 	shark->curr_face = 0;
 	shark->curr_fin = 1;
 	shark->curr_left_lid = 0;
--- a/pidgin/plugins/gestures/stroke-draw.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/pidgin/plugins/gestures/stroke-draw.c	Sat Feb 12 04:17:09 2011 +0900
@@ -111,7 +111,7 @@
 	return TRUE;
 }
 
-static void gstroke_cancel(GdkEvent *event) 
+static void gstroke_cancel(GdkEvent *event)
 {
 	last_mouse_position.invalid = TRUE;
 
@@ -145,7 +145,7 @@
 			 * clicked after the middle button is clicked (but possibly
 			 * not released)
 			 */
-			gstroke_cancel(event);	
+			gstroke_cancel(event);
 			original_widget = NULL;
 			break;
 		}
@@ -299,7 +299,7 @@
 #if 0
   purple_debug(PURPLE_DEBUG_MISC, "gestures", "gstroke %s\n", name);
 #endif
-  
+
   if (hash_table)
     {
       struct gstroke_func_and_data *fd =
--- a/pidgin/plugins/gevolution/eds-utils.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/pidgin/plugins/gevolution/eds-utils.c	Sat Feb 12 04:17:09 2011 +0900
@@ -113,7 +113,7 @@
 	g_object_unref(addressbooks);
 }
 
-static EContact * 
+static EContact *
 gevo_run_query_in_uri(const gchar *uri, EBookQuery *query)
 {
 	EBook *book;
@@ -169,7 +169,7 @@
  *              so callers must e_book_query_ref() it in advance (to obtain a
  *              second reference) if they want to reuse @a query.
  */
-EContact * 
+EContact *
 gevo_search_buddy_in_contacts(PurpleBuddy *buddy, EBookQuery *query)
 {
 	ESourceList *addressbooks;
--- a/pidgin/plugins/markerline.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/pidgin/plugins/markerline.c	Sat Feb 12 04:17:09 2011 +0900
@@ -66,7 +66,7 @@
 
 		gtk_text_view_get_iter_location(GTK_TEXT_VIEW(widget), &iter, &buf);
 		last_y = buf.y + buf.height;
-		pad = (gtk_text_view_get_pixels_below_lines(GTK_TEXT_VIEW(widget)) + 
+		pad = (gtk_text_view_get_pixels_below_lines(GTK_TEXT_VIEW(widget)) +
 				gtk_text_view_get_pixels_above_lines(GTK_TEXT_VIEW(widget))) / 2;
 		last_y += pad;
 	}
@@ -132,7 +132,7 @@
 	GList *list;
 
 	list = pidgin_conv_window_get_gtkconvs(win);
-	
+
 	for (; list; list = list->next)
 		update_marker_for_gtkconv(list->data);
 
--- a/pidgin/plugins/musicmessaging/musicmessaging.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/pidgin/plugins/musicmessaging/musicmessaging.c	Sat Feb 12 04:17:09 2011 +0900
@@ -49,11 +49,11 @@
 	GtkWidget *seperator; /* seperator in the conversation */
 	GtkWidget *button; /* button in the conversation */
 	GPid pid; /* the pid of the score editor */
-	
+
 	gboolean started; /* session has started and editor run */
 	gboolean originator; /* started the mm session */
 	gboolean requested; /* received a request to start a session */
-	
+
 } MMConversation;
 
 static gboolean start_session(MMConversation *mmconv);
@@ -97,9 +97,9 @@
 /* Exported functions */
 void music_messaging_change_request(const int session, const char *command, const char *parameters)
 {
-	
+
 	MMConversation *mmconv = (MMConversation *)g_list_nth_data(conversations, session);
-	
+
 	if (mmconv->started)
 	{
 		if (mmconv->originator)
@@ -110,50 +110,50 @@
 		{
 			GString *to_send = g_string_new("");
 			g_string_append_printf(to_send, "##MM## request %s %s##MM##", command, parameters);
-			
+
 			purple_conv_im_send(PURPLE_CONV_IM(mmconv->conv), to_send->str);
-			
+
 			purple_debug_misc("musicmessaging", "Sent request: %s\n", to_send->str);
 		}
 	}
-			
+
 }
 
 void music_messaging_change_confirmed(const int session, const char *command, const char *parameters)
 {
-	
+
 	MMConversation *mmconv = (MMConversation *)g_list_nth_data(conversations, session);
-	
+
 	if (mmconv->started)
 	{
 		if (mmconv->originator)
 		{
 			GString *to_send = g_string_new("");
 			g_string_append_printf(to_send, "##MM## confirm %s %s##MM##", command, parameters);
-			
+
 			purple_conv_im_send(PURPLE_CONV_IM(mmconv->conv), to_send->str);
 		} else
 		{
 			/* Do nothing. If they aren't the originator, then they can't confirm. */
 		}
 	}
-	
+
 }
 
 void music_messaging_change_failed(const int session, const char *id, const char *command, const char *parameters)
 {
 	MMConversation *mmconv = (MMConversation *)g_list_nth_data(conversations, session);
-	
+
 	purple_notify_message(plugin_pointer, PURPLE_NOTIFY_MSG_INFO, command,
                         parameters, NULL, NULL, NULL);
-	
+
 	if (mmconv->started)
 	{
 		if (mmconv->originator)
 		{
 			GString *to_send = g_string_new("");
 			g_string_append_printf(to_send, "##MM## failed %s %s %s##MM##", id, command, parameters);
-			
+
 			purple_conv_im_send(PURPLE_CONV_IM(mmconv->conv), to_send->str);
 		} else
 		{
@@ -165,10 +165,10 @@
 void music_messaging_done_session(const int session)
 {
 	MMConversation *mmconv = (MMConversation *)g_list_nth_data(conversations, session);
-	
+
 	purple_notify_message(plugin_pointer, PURPLE_NOTIFY_MSG_INFO, "Session",
 						"Session Complete", NULL, NULL, NULL);
-	
+
 	session_end(mmconv);
 }
 
@@ -181,10 +181,10 @@
 static gboolean send_change_request (const int session, const char *id, const char *command, const char *parameters)
 {
 	DBusMessage *message;
-	
+
 	/* Create the signal we need */
 	message = dbus_message_new_signal (DBUS_PATH_PURPLE, DBUS_INTERFACE_PURPLE, "GscoreChangeRequest");
-	
+
 	/* Append the string "Ping!" to the signal */
 	dbus_message_append_args (message,
 							DBUS_TYPE_INT32, &session,
@@ -192,42 +192,42 @@
 							DBUS_TYPE_STRING, &command,
 							DBUS_TYPE_STRING, &parameters,
 							DBUS_TYPE_INVALID);
-	
+
 	/* Send the signal */
 	dbus_connection_send (purple_dbus_get_connection(), message, NULL);
-	
+
 	/* Free the signal now we have finished with it */
 	dbus_message_unref (message);
-	
+
 	/* Tell the user we sent a signal */
 	g_printerr("Sent change request signal: %d %s %s %s\n", session, id, command, parameters);
-	
+
 	return TRUE;
 }
 
 static gboolean send_change_confirmed (const int session, const char *command, const char *parameters)
 {
 	DBusMessage *message;
-	
+
 	/* Create the signal we need */
 	message = dbus_message_new_signal (DBUS_PATH_PURPLE, DBUS_INTERFACE_PURPLE, "GscoreChangeConfirmed");
-	
+
 	/* Append the string "Ping!" to the signal */
 	dbus_message_append_args (message,
 							DBUS_TYPE_INT32, &session,
 							DBUS_TYPE_STRING, &command,
 							DBUS_TYPE_STRING, &parameters,
 							DBUS_TYPE_INVALID);
-	
+
 	/* Send the signal */
 	dbus_connection_send (purple_dbus_get_connection(), message, NULL);
-	
+
 	/* Free the signal now we have finished with it */
 	dbus_message_unref (message);
-	
+
 	/* Tell the user we sent a signal */
 	g_printerr("Sent change confirmed signal.\n");
-	
+
 	return TRUE;
 }
 
@@ -238,7 +238,7 @@
 	GList *l;
 	MMConversation *mmconv_current = NULL;
 	guint i;
-	
+
 	i = 0;
 	for (l = conversations; l != NULL; l = l->next)
 	{
@@ -268,36 +268,36 @@
        main purple dbus loop.  Without this statement, the purple dbus
        code wouldn't know about our functions. */
     PURPLE_DBUS_REGISTER_BINDINGS(plugin);
-	
+
 	/* Keep the plugin for reference (needed for notify's) */
 	plugin_pointer = plugin;
-	
+
 	/* Add the button to all the current conversations */
 	purple_conversation_foreach (init_conversation);
-	
+
 	/* Listen for any new conversations */
 	conv_list_handle = purple_conversations_get_handle();
-	
-	purple_signal_connect(conv_list_handle, "conversation-created", 
+
+	purple_signal_connect(conv_list_handle, "conversation-created",
 					plugin, PURPLE_CALLBACK(init_conversation), NULL);
-	
+
 	/* Listen for conversations that are ending */
 	purple_signal_connect(conv_list_handle, "deleting-conversation",
 					plugin, PURPLE_CALLBACK(conv_destroyed), NULL);
-					
+
 	/* Listen for sending/receiving messages to replace tags */
 	purple_signal_connect(conv_list_handle, "sending-im-msg",
 					plugin, PURPLE_CALLBACK(intercept_sent), NULL);
 	purple_signal_connect(conv_list_handle, "receiving-im-msg",
 					plugin, PURPLE_CALLBACK(intercept_received), NULL);
-	
+
 	return TRUE;
 }
 
 static gboolean
 plugin_unload(PurplePlugin *plugin) {
 	MMConversation *mmconv = NULL;
-	
+
 	while (conversations != NULL)
 	{
 		mmconv = conversations->data;
@@ -353,7 +353,7 @@
 intercept_received(PurpleAccount *account, char **sender, char **message, PurpleConversation *conv, int *flags)
 {
 	MMConversation *mmconv;
-	
+
 	if (conv == NULL) {
 		/* XXX: This is just to avoid a crash (#2726).
 		 *      We may want to create the conversation instead of returning from here
@@ -362,13 +362,13 @@
 	}
 
 	mmconv = mmconv_from_conv(conv);
-	
+
 	purple_debug_misc("purple-musicmessaging", "Intercepted: %s\n", *message);
 	if (strstr(*message, MUSICMESSAGING_PREFIX))
 	{
 		char *parsed_message = strtok(strstr(*message, MUSICMESSAGING_PREFIX), "<");
 		purple_debug_misc("purple-musicmessaging", "Received an MM Message: %s\n", parsed_message);
-				
+
 		if (mmconv->started)
 		{
 			if (strstr(parsed_message, "request"))
@@ -379,18 +379,18 @@
 					char *id = (mmconv->conv)->name;
 					char *command;
 					char *parameters;
-					
+
 					purple_debug_misc("purple-musicmessaging", "Sending request to gscore.\n");
-					
+
 					/* Get past the first two terms - '##MM##' and 'request' */
 					strtok(parsed_message, " "); /* '##MM##' */
 					strtok(NULL, " "); /* 'request' */
-					
+
 					command = strtok(NULL, " ");
 					parameters = strtok(NULL, "#");
-					
+
 					send_change_request (session, id, command, parameters);
-					
+
 				}
 			} else if (strstr(parsed_message, "confirm"))
 			{
@@ -399,40 +399,40 @@
 					int session = mmconv_from_conv_loc(conv);
 					char *command;
 					char *parameters;
-					
+
 					purple_debug_misc("purple-musicmessaging", "Sending confirmation to gscore.\n");
-					
+
 					/* Get past the first two terms - '##MM##' and 'confirm' */
 					strtok(parsed_message, " "); /* '##MM##' */
 					strtok(NULL, " "); /* 'confirm' */
-					
+
 					command = strtok(NULL, " ");
 					parameters = strtok(NULL, "#");
-					
+
 					send_change_confirmed (session, command, parameters);
 				}
 			} else if (strstr(parsed_message, "failed"))
 			{
 				char *id;
 				char *command;
-				
+
 				/* Get past the first two terms - '##MM##' and 'confirm' */
 				strtok(parsed_message, " "); /* '##MM##' */
 				strtok(NULL, " "); /* 'failed' */
-				
+
 				id = strtok(NULL, " ");
 				command = strtok(NULL, " ");
 				/* char *parameters = strtok(NULL, "#"); DONT NEED PARAMETERS */
-				
+
 				if ((mmconv->conv)->name == id)
 				{
-					purple_notify_message(plugin_pointer, PURPLE_NOTIFY_MSG_ERROR, 
+					purple_notify_message(plugin_pointer, PURPLE_NOTIFY_MSG_ERROR,
 							    _("Music Messaging"),
 							    _("There was a conflict in running the command:"), command, NULL, NULL);
 				}
 			}
 		}
-		
+
 		message = 0;
 	}
 	else if (strstr(*message, MUSICMESSAGING_START_MSG))
@@ -443,12 +443,12 @@
 			mmconv->requested = TRUE;
 			return FALSE;
 		}
-		
+
 	}
 	else if (strstr(*message, MUSICMESSAGING_CONFIRM_MSG))
 	{
 		purple_debug_misc("purple-musicmessagin", "Received MM confirm.\n");
-		
+
 		if (mmconv->originator)
 		{
 			start_session(mmconv);
@@ -476,11 +476,11 @@
 	const char *convName = purple_conversation_get_name(mmconv->conv);
 	serv_send_im(connection, convName, MUSICMESSAGING_CONFIRM_MSG, PURPLE_MESSAGE_SEND);
 }
-	
+
 
 static gboolean
 start_session(MMConversation *mmconv)
-{	
+{
 	run_editor(mmconv);
 	return TRUE;
 }
@@ -496,7 +496,7 @@
 static void music_button_toggled (GtkWidget *widget, gpointer data)
 {
 	MMConversation *mmconv = mmconv_from_conv(((MMConversation *) data)->conv);
-	if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget))) 
+	if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)))
     {
 		if (((MMConversation *) data)->requested)
 		{
@@ -517,7 +517,7 @@
 {
 	const char * path = gtk_entry_get_text((GtkEntry*)text_field);
 	purple_prefs_set_string("/plugins/gtk/musicmessaging/editor_path", path);
-	
+
 }
 
 static void run_editor (MMConversation *mmconv)
@@ -526,14 +526,14 @@
 	GString *session_id;
 	gchar * args[4];
 	args[0] = (gchar *)purple_prefs_get_string("/plugins/gtk/musicmessaging/editor_path");
-	
+
 	args[1] = "-session_id";
 	session_id = g_string_new("");
 	g_string_append_printf(session_id, "%d", mmconv_from_conv_loc(mmconv->conv));
 	args[2] = session_id->str;
-	
+
 	args[3] = NULL;
-	
+
 	if (!(g_spawn_async (".", args, NULL, 4, NULL, NULL, &(mmconv->pid), &spawn_error)))
 	{
 		purple_notify_error(plugin_pointer, _("Error Running Editor"),
@@ -559,21 +559,21 @@
 {
 	MMConversation *mmconv;
 	mmconv = g_malloc(sizeof(MMConversation));
-	
+
 	mmconv->conv = conv;
 	mmconv->started = FALSE;
 	mmconv->originator = FALSE;
 	mmconv->requested = FALSE;
-	
+
 	add_button(mmconv);
-	
+
 	conversations = g_list_append(conversations, mmconv);
 }
 
 static void conv_destroyed (PurpleConversation *conv)
 {
 	MMConversation *mmconv = mmconv_from_conv(conv);
-	
+
 	remove_widget(mmconv->button);
 	remove_widget(mmconv->seperator);
 	if (mmconv->started)
@@ -586,7 +586,7 @@
 static void add_button (MMConversation *mmconv)
 {
 	PurpleConversation *conv = mmconv->conv;
-	
+
 	GtkWidget *button, *image, *sep;
 	gchar *file_path;
 
@@ -601,16 +601,16 @@
 	g_free(file_path);
 
 	gtk_container_add((GtkContainer *)button, image);
-	
+
 	sep = gtk_vseparator_new();
-	
+
 	mmconv->seperator = sep;
 	mmconv->button = button;
-	
+
 	gtk_widget_show(sep);
 	gtk_widget_show(image);
 	gtk_widget_show(button);
-	
+
 	gtk_box_pack_start(GTK_BOX(PIDGIN_CONVERSATION(conv)->toolbar), sep, FALSE, FALSE, 0);
 	gtk_box_pack_start(GTK_BOX(PIDGIN_CONVERSATION(conv)->toolbar), button, FALSE, FALSE, 0);
 }
@@ -618,7 +618,7 @@
 static void remove_widget (GtkWidget *button)
 {
 	gtk_widget_hide(button);
-	gtk_widget_destroy(button);		
+	gtk_widget_destroy(button);
 }
 
 static GtkWidget *
@@ -626,32 +626,32 @@
 {
 	GtkWidget *ret;
 	GtkWidget *vbox;
-	
+
 	GtkWidget *editor_path;
 	GtkWidget *editor_path_label;
 	GtkWidget *editor_path_button;
-	
+
 	/* Outside container */
 	ret = gtk_vbox_new(FALSE, 18);
 	gtk_container_set_border_width(GTK_CONTAINER(ret), 10);
 
 	/* Configuration frame */
 	vbox = pidgin_make_frame(ret, _("Music Messaging Configuration"));
-	
+
 	/* Path to the score editor */
 	editor_path = gtk_entry_new();
 	editor_path_label = gtk_label_new(_("Score Editor Path"));
 	editor_path_button = gtk_button_new_with_mnemonic(_("_Apply"));
-	
+
 	gtk_entry_set_text((GtkEntry*)editor_path, "/usr/local/bin/gscore");
-	
+
 	g_signal_connect(G_OBJECT(editor_path_button), "clicked",
 					 G_CALLBACK(set_editor_path), editor_path);
-					 
+
 	gtk_box_pack_start(GTK_BOX(vbox), editor_path_label, FALSE, FALSE, 0);
 	gtk_box_pack_start(GTK_BOX(vbox), editor_path, FALSE, FALSE, 0);
 	gtk_box_pack_start(GTK_BOX(vbox), editor_path_button, FALSE, FALSE, 0);
-	
+
 	gtk_widget_show_all(ret);
 
 	return ret;
--- a/pidgin/plugins/perl/common/Makefile.PL.in	Tue Dec 21 21:05:26 2010 +0900
+++ b/pidgin/plugins/perl/common/Makefile.PL.in	Sat Feb 12 04:17:09 2011 +0900
@@ -9,6 +9,7 @@
       ('ABSTRACT_FROM' => '@srcdir@/Pidgin.pm', # finds $ABSTRACT
        'AUTHOR'        => 'Pidgin <http://pidgin.im/>') :  ()),
     'DEFINE'        => '@DEBUG_CFLAGS@',
+    'dynamic_lib'       => { 'OTHERLDFLAGS' => '@LDFLAGS@' },
     'INC'           => '-I. -I@srcdir@ -I@top_srcdir@ -I@top_srcdir@/libpurple -I@top_srcdir@/pidgin @GTK_CFLAGS@',
     'OBJECT'        => '$(O_FILES)', # link all the C files too
     'TYPEMAPS'      => ["@top_srcdir@/libpurple/plugins/perl/common/typemap"],
--- a/pidgin/plugins/relnot.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/pidgin/plugins/relnot.c	Sat Feb 12 04:17:09 2011 +0900
@@ -133,7 +133,7 @@
 	if(!last_check || time(NULL) - last_check > MIN_CHECK_INTERVAL) {
 		gchar *url, *request;
 		const char *host = "pidgin.im";
-		
+
 		url = g_strdup_printf("http://%s/version.php?version=%s&build=%s",
 				host,
 				purple_core_get_version(),
--- a/pidgin/plugins/sendbutton.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/pidgin/plugins/sendbutton.c	Sat Feb 12 04:17:09 2011 +0900
@@ -74,7 +74,7 @@
 		                  GINT_TO_POINTER(signal_id));
 		input_buffer_changed(buf, send_button);
 	}
- 
+
 	g_object_set_data(G_OBJECT(gtkconv->lower_hbox), "send_button",
 	                  send_button);
 }
@@ -128,7 +128,7 @@
 	 */
 
 	while (convs) {
-		
+
 		PurpleConversation *conv = (PurpleConversation *)convs->data;
 
 		/* Setup Send button */
--- a/pidgin/plugins/ticker/gtkticker.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/pidgin/plugins/ticker/gtkticker.h	Sat Feb 12 04:17:09 2011 +0900
@@ -18,7 +18,7 @@
  */
 
 /*
- * Copyright 2000 Syd Logan 
+ * Copyright 2000 Syd Logan
  */
 
 #ifndef __GTK_TICKER_H__
--- a/pidgin/plugins/ticker/ticker.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/pidgin/plugins/ticker/ticker.c	Sat Feb 12 04:17:09 2011 +0900
@@ -1,6 +1,6 @@
 /*
  * Purple Ticker Plugin
- * The line below doesn't apply at all, does it?  It should be Syd, Sean, and 
+ * The line below doesn't apply at all, does it?  It should be Syd, Sean, and
  * maybe Nathan, I believe.
  * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
  *
--- a/pidgin/plugins/vvconfig.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/pidgin/plugins/vvconfig.c	Sat Feb 12 04:17:09 2011 +0900
@@ -82,20 +82,11 @@
 	GstPropertyProbe *probe;
 	const GParamSpec *pspec;
 
-	if (!strcmp(element_name, "<custom>")) {
-		ret = g_list_prepend(ret, NULL);
-		ret = g_list_prepend(ret, (gpointer)_("Default"));
-		ret = g_list_prepend(ret, "");
-		return ret;
-	}
-
 	ret = g_list_prepend(ret, (gpointer)_("Default"));
 	ret = g_list_prepend(ret, "");
 
-	if (*element_name == '\0') {
-		ret = g_list_prepend(ret, NULL);
-		ret = g_list_reverse(ret);
-		return ret;
+	if (!strcmp(element_name, "<custom>") || (*element_name == '\0')) {
+		return g_list_reverse(ret);
 	}
 
 	element = gst_element_factory_make(element_name, "test");
@@ -120,11 +111,9 @@
 		array = gst_property_probe_probe_and_get_values (probe, pspec);
 		if (array == NULL) {
 			purple_debug_info("vvconfig", "'%s' has no devices\n", element_name);
-			ret = g_list_prepend(ret, NULL);
-			ret = g_list_reverse(ret);
-			return ret;
+			return g_list_reverse(ret);
 		}
-			
+
 		for (n=0; n < array->n_values; ++n) {
 			GValue *device;
 			const gchar *name;
@@ -152,11 +141,8 @@
 		}
 	}
 	gst_object_unref(element);
-	
-	ret = g_list_prepend(ret, NULL);
-	ret = g_list_reverse(ret);
 
-	return ret;
+	return g_list_reverse(ret);
 }
 
 static GList *
@@ -173,7 +159,6 @@
 			ret = g_list_prepend(ret, (gpointer)plugins[0]);
 		}
 	}
-	ret = g_list_prepend(ret, NULL);
 	ret = g_list_reverse(ret);
 	return ret;
 }
@@ -236,7 +221,8 @@
 	pref = g_strdup(name);
 	strcpy(pref + strlen(pref) - strlen("plugin"), "device");
 	devices = get_element_devices(value);
-	if (g_list_find(devices, purple_prefs_get_string(pref)) == NULL)
+	if (g_list_find_custom(devices, purple_prefs_get_string(pref),
+			(GCompareFunc)strcmp) == NULL)
 		purple_prefs_set_string(pref, g_list_next(devices)->data);
 	widget = pidgin_prefs_dropdown_from_list(parent,
 			label, PURPLE_PREF_STRING,
@@ -273,7 +259,8 @@
 
 	/* Setup device preference */
 	devices = get_element_devices(purple_prefs_get_string(plugin_pref));
-	if (g_list_find(devices, purple_prefs_get_string(device_pref)) == NULL)
+	if (g_list_find_custom(devices, purple_prefs_get_string(device_pref),
+			(GCompareFunc) strcmp) == NULL)
 		purple_prefs_set_string(device_pref, g_list_next(devices)->data);
 	widget = pidgin_prefs_dropdown_from_list(vbox, device_label,
 			PURPLE_PREF_STRING, device_pref, devices);
@@ -526,12 +513,12 @@
 		GtkWidget *hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BORDER);
 		GtkWidget *config_frame = get_plugin_config_frame(NULL);
 		GtkWidget *close = gtk_button_new_from_stock(GTK_STOCK_CLOSE);
-		
+
 		gtk_container_add(GTK_CONTAINER(vbox), config_frame);
 		gtk_container_add(GTK_CONTAINER(vbox), hbox);
 		window = pidgin_create_window(_("Voice/Video Settings"),
 			PIDGIN_HIG_BORDER, NULL, TRUE);
-		g_signal_connect(G_OBJECT(window), "destroy", 
+		g_signal_connect(G_OBJECT(window), "destroy",
 			G_CALLBACK(config_destroy), NULL);
 		g_signal_connect(G_OBJECT(close), "clicked",
 		    G_CALLBACK(config_close), NULL);
--- a/pidgin/plugins/win32/winprefs/gtkappbar.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/pidgin/plugins/win32/winprefs/gtkappbar.c	Sat Feb 12 04:17:09 2011 +0900
@@ -167,7 +167,7 @@
         SetWindowLong(hwnd, GWL_EXSTYLE, style);
 	SetWindowPos(hwnd, 0, 0, 0, 0, 0,
 		SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);
-	
+
 /*	This really should be the following, but SWP_FRAMECHANGED strangely causes initermittent problems "Show Desktop" done more than once.
  *	Not having SWP_FRAMECHANGED *should* cause the Style not to be applied, but i haven't noticed any problems
  *			SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED);
--- a/pidgin/plugins/win32/winprefs/gtkappbar.h	Tue Dec 21 21:05:26 2010 +0900
+++ b/pidgin/plugins/win32/winprefs/gtkappbar.h	Sat Feb 12 04:17:09 2011 +0900
@@ -4,7 +4,7 @@
  * File: gtkappbar.h
  * Date: August 2, 2003
  * Description: Appbar functionality for Windows GTK+ applications
- * 
+ *
  * Copyright (C) 2003, Herman Bloggs <hermanator12002@yahoo.com>
  *
  * This program is free software; you can redistribute it and/or modify
--- a/pidgin/win32/gtkdocklet-win32.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/pidgin/win32/gtkdocklet-win32.c	Sat Feb 12 04:17:09 2011 +0900
@@ -539,7 +539,7 @@
 			icon_name = PIDGIN_STOCK_TRAY_PENDING;
 		if (connecting)
 			icon_name = PIDGIN_STOCK_TRAY_CONNECT;
-	
+
 		g_return_if_fail(icon_name != NULL);
 
 		cached_icons[icon_index] = load_hicon_from_stock(icon_name);
@@ -558,7 +558,7 @@
 	wchar_t *w;
 	if (value == NULL) {
 		value = PIDGIN_NAME;
-	}	
+	}
 	w = g_utf8_to_utf16(value, -1, NULL, NULL, NULL);
 	wcsncpy(_nicon_data.szTip, w, sizeof(_nicon_data.szTip) / sizeof(wchar_t));
 	g_free(w);
--- a/pidgin/win32/nsis/pidgin-installer.nsi	Tue Dec 21 21:05:26 2010 +0900
+++ b/pidgin/win32/nsis/pidgin-installer.nsi	Sat Feb 12 04:17:09 2011 +0900
@@ -530,6 +530,7 @@
     Push "xmpp"
     Call un.UnregisterURIHandler
 
+    Delete "$INSTDIR\ca-certs\AddTrust_External_Root.pem"
     Delete "$INSTDIR\ca-certs\America_Online_Root_Certification_Authority_1.pem"
     Delete "$INSTDIR\ca-certs\AOL_Member_CA.pem"
     Delete "$INSTDIR\ca-certs\CAcert_Class3.pem"
--- a/pidgin/win32/winpidgin.c	Tue Dec 21 21:05:26 2010 +0900
+++ b/pidgin/win32/winpidgin.c	Sat Feb 12 04:17:09 2011 +0900
@@ -632,11 +632,11 @@
 			} else {
 				if (strchr(__argv[i], 'd'))
 					debug = TRUE;
-				else if (strchr(__argv[i], 'h'))
+				if (strchr(__argv[i], 'h'))
 					help = TRUE;
-				else if (strchr(__argv[i], 'v'))
+				if (strchr(__argv[i], 'v'))
 					version = TRUE;
-				else if (strchr(__argv[i], 'm'))
+				if (strchr(__argv[i], 'm'))
 					multiple = TRUE;
 			}
 		}
--- a/po/ChangeLog	Tue Dec 21 21:05:26 2010 +0900
+++ b/po/ChangeLog	Sat Feb 12 04:17:09 2011 +0900
@@ -1,5 +1,27 @@
 Pidgin and Finch: The Pimpin' Penguin IM Clients That're Good for the Soul
 
+version 2.7.10
+	* Bengali translation updated (Jamil Ahmed)
+	* Chinese (Hong Kong) translation updated (Ambrose C. Li, Paladin R.
+	  Liu)
+	* Chinese (Traditional) translation updated (Ambrose C. Li, Paladin R.
+	  Liu)
+	* Czech translation updated (David Vachulka)
+	* Dutch translation updated (Gideon van Melle)
+	* Hebrew translation updated (Shalom Craimer)
+	* Norwegian Nynorsk translation updated (Yngve Spjeld Landro)
+	* Occitan translation updated (Yannig Marchegay)
+	* Polish translation updated (Piotr Drąg)
+	* Romanian translation updated (Mişu Moldovan)
+	* Russian translation updated (Антон Самохвалов)
+	* Spanish translation updated (Javier Fernández-Sanguino Peña)
+	* Ukrainian translation updated (Oleksandr Kovalenko)
+
+version 2.7.9
+	* Czech translation updated (David Vachulka)
+	* English (Great Britain) updated (Phil Hannent)
+	* Ukrainian translation updated (Oleksandr Kovalenko)
+
 version 2.7.8
 	* Meadow Mari translation added (David Preece)
 	* Albanian translation updated (Besnik Bleta)
--- a/po/POTFILES.in	Tue Dec 21 21:05:26 2010 +0900
+++ b/po/POTFILES.in	Sat Feb 12 04:17:09 2011 +0900
@@ -124,8 +124,8 @@
 libpurple/protocols/mxit/filexfer.c
 libpurple/protocols/mxit/http.c
 libpurple/protocols/mxit/login.c
+libpurple/protocols/mxit/multimx.c
 libpurple/protocols/mxit/mxit.c
-libpurple/protocols/mxit/multimx.c
 libpurple/protocols/mxit/profile.c
 libpurple/protocols/mxit/protocol.c
 libpurple/protocols/mxit/roster.c
@@ -148,8 +148,8 @@
 libpurple/protocols/oscar/oft.c
 libpurple/protocols/oscar/oscar.c
 libpurple/protocols/oscar/peer.c
+libpurple/protocols/oscar/userinfo.c
 libpurple/protocols/oscar/util.c
-libpurple/protocols/oscar/userinfo.c
 libpurple/protocols/oscar/visibility.c
 libpurple/protocols/qq/buddy_info.c
 libpurple/protocols/qq/buddy_list.c
--- a/po/ar.po	Tue Dec 21 21:05:26 2010 +0900
+++ b/po/ar.po	Sat Feb 12 04:17:09 2011 +0900
@@ -747,9 +747,9 @@
 #, c-format
 msgid "File Transfers - %d%% of %d file"
 msgid_plural "File Transfers - %d%% of %d files"
-msgstr[0] "نقل الملفات - %d%% من %0.sصفر ملفات"
-msgstr[1] "نقل الملفات - %d%% من %0.sملف واحد"
-msgstr[2] "نقل الملفات - %d%% من %0.sملفين"
+msgstr[0] "نقل الملفات - %d%% من صفر ملفات"
+msgstr[1] "نقل الملفات - %d%% من ملف واحد"
+msgstr[2] "نقل الملفات - %d%% من ملفين"
 msgstr[3] "نقل الملفات - %d%% من %d ملفات"
 msgstr[4] "نقل الملفات - %d%% من %d ملفا"
 msgstr[5] "نقل الملفات - %d%% من %d ملف"
@@ -921,9 +921,9 @@
 #, c-format
 msgid "%s (%s) has %d new message."
 msgid_plural "%s (%s) has %d new messages."
-msgstr[0] "لا رسائل%0.s جديدة لـ ‏%s (%s)."
-msgstr[1] "‏%s (%s) لديه %0.sرسالة واحدة جديدة"
-msgstr[2] "‏%s (%s) لديه %0.sرسالتان جديدتان."
+msgstr[0] "لا رسائل جديدة لـ ‏%s ‏(%s)."
+msgstr[1] "‏%s (%s) لديه رسالة واحدة جديدة"
+msgstr[2] "‏%s (%s) لديه رسالتان جديدتان."
 msgstr[3] "‏%s (%s) لديه %d رسائل جديدة."
 msgstr[4] "‏%s (%s) لديه %d رسالة جديدة."
 msgstr[5] "‏%s (%s) لديه %d رسالة جديدة."
@@ -11231,9 +11231,9 @@
 #, c-format
 msgid "%s, %d hour"
 msgid_plural "%s, %d hours"
-msgstr[0] "%s، %0.sلا ساعات"
-msgstr[1] "‏%s، %0.sساعة واحدة"
-msgstr[2] "‏%s، %0.sساعتين"
+msgstr[0] "%s، لا ساعات"
+msgstr[1] "‏%s، ساعة واحدة"
+msgstr[2] "‏%s، ساعتين"
 msgstr[3] "‏%s، %d ساعات"
 msgstr[4] "‏%s، %d ساعة"
 msgstr[5] "‏%s، %d ساعة"
@@ -11251,9 +11251,9 @@
 #, c-format
 msgid "%s, %d minute"
 msgid_plural "%s, %d minutes"
-msgstr[0] "‏%s، %0.sلا دقائق"
-msgstr[1] "‏%s، %0.sدقيقة واحدة"
-msgstr[2] "‏%s، %0.sدقيقتين"
+msgstr[0] "‏%s، لا دقائق"
+msgstr[1] "‏%s، دقيقة واحدة"
+msgstr[2] "‏%s، دقيقتين"
 msgstr[3] "%s، %d دقائق"
 msgstr[4] "%s، %d دقيقة"
 msgstr[5] "%s، %d دقيقة"
@@ -11604,13 +11604,12 @@
 msgid "The text information for a buddy's status"
 msgstr "غيّر معلومات المستخدم لأجل %s"
 
-#, c-format
 msgid "You have %d contact named %s. Would you like to merge them?"
 msgid_plural ""
 "You currently have %d contacts named %s. Would you like to merge them?"
-msgstr[0] "لا مراسلين%0.s لديك باسم %s. أتريد دمجهم؟"
-msgstr[1] "لديك مراسل واحد%0.s باسم %s. أتريد دمجه؟"
-msgstr[2] "لديك مراسليْن%0.s باسم %s. أتريد دمجهما؟"
+msgstr[0] "%0.sلا مراسلين لديك باسم %s. أتريد دمجهم؟"
+msgstr[1] "%0.sلديك مراسل واحد باسم %s. أتريد دمجه؟"
+msgstr[2] "%0.sلديك مراسليْن باسم %s. أتريد دمجهما؟"
 msgstr[3] "لديك %d مراسلين باسم %s. أتريد دمجهم؟"
 msgstr[4] "لديك %d مراسلا باسم %s. أتريد دمجهم؟"
 msgstr[5] "لديك %d مراسل باسم %s. أتريد دمجهم؟"
@@ -11948,12 +11947,11 @@
 msgid "/Tools/Room List"
 msgstr "/الأدوات/قائمة الغرف"
 
-#, c-format
 msgid "%d unread message from %s\n"
 msgid_plural "%d unread messages from %s\n"
-msgstr[0] "لا رسائل%0.s غير مقروءة من %s\n"
-msgstr[1] "رسالة واحدة%0.s غير مقروءة من %s\n"
-msgstr[2] "رسالتان%0.s غير مقروءتان من %s\n"
+msgstr[0] "%0.sلا رسائل غير مقروءة من %s\n"
+msgstr[1] "%0.sرسالة واحدة غير مقروءة من %s\n"
+msgstr[2] "%0.sرسالتان غير مقروءتان من %s\n"
 msgstr[3] "%d رسائل غير مقروءة من %s\n"
 msgstr[4] "%d رسالة غير مقروءة من %s\n"
 msgstr[5] "%d رسالة غير مقروءة من %s\n"
@@ -12932,13 +12930,13 @@
 "You are about to remove the contact containing %s and %d other buddies from "
 "your buddy list.  Do you want to continue?"
 msgstr[0] ""
-"أنت بصدد إزالة مراسل يحتوي %s و %0.sلا أصدقاء من قائمة أصدقائك.  هل تريد "
+"أنت بصدد إزالة مراسل يحتوي %s ولا أصدقاء من قائمة أصدقائك.  هل تريد "
 "الاستمرار؟"
 msgstr[1] ""
-"أنت بصدد إزالة مراسل يحتوي %s و %0.sصديق آخر من قائمة أصدقائك.  هل تريد "
+"أنت بصدد إزالة مراسل يحتوي %s وصديق آخر من قائمة أصدقائك.  هل تريد "
 "الاستمرار؟"
 msgstr[2] ""
-"أنت بصدد إزالة مراسل يحتوي %s و %0.sصديقين آخرين من قائمة أصدقائك.  هل تريد "
+"أنت بصدد إزالة مراسل يحتوي %s وصديقين آخرين من قائمة أصدقائك.  هل تريد "
 "الاستمرار؟"
 msgstr[3] ""
 "أنت بصدد إزالة مراسل يحتوي %s و %d أصدقاء آخرين من قائمة أصدقائك.  هل تريد "
@@ -13504,12 +13502,12 @@
 #, c-format
 msgid "%s has %d new message."
 msgid_plural "%s has %d new messages."
-msgstr[0] "لا رسائل%0.s جديدة ل %s."
-msgstr[1] "رسالة%0.s جديدة ل %s."
-msgstr[2] "رسالتان%0.s جديدتان ل %s."
-msgstr[3] "%Id رسائل جديدة ل %s."
-msgstr[4] "%Id رسالة جديدة ل %s."
-msgstr[5] "%Id رسالة جديدة ل %s."
+msgstr[0] "لا رسائل جديدة ل‍ %s."
+msgstr[1] "رسالة جديدة ل‍ %s."
+msgstr[2] "رسالتان جديدتان ل‍ %s."
+msgstr[3] "%2$d رسائل جديدة ل‍ %1$s."
+msgstr[4] "%2$d رسالة جديدة ل‍ %1$s."
+msgstr[5] "%2$d رسالة جديدة ل‍ %1$s."
 
 #, c-format
 msgid "<b>%d new email.</b>"
--- a/po/az.po	Tue Dec 21 21:05:26 2010 +0900
+++ b/po/az.po	Sat Feb 12 04:17:09 2011 +0900
@@ -15,7 +15,7 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
 "X-Generator: KBabel 1.3\n"
 
 #. Translators may want to transliterate the name.
--- a/po/bn.po	Tue Dec 21 21:05:26 2010 +0900
+++ b/po/bn.po	Sat Feb 12 04:17:09 2011 +0900
@@ -13,7 +13,7 @@
 msgstr ""
 "Project-Id-Version: bn\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-12-19 20:34-0500\n"
+"POT-Creation-Date: 2011-02-02 23:34-0500\n"
 "PO-Revision-Date: 2010-12-19 13:37+0600\n"
 "Last-Translator: israt <israt@ankur.org.bd>\n"
 "Language-Team: Bengali <ankur-bd-l10n@googlegroups.com>\n"
@@ -2466,8 +2466,12 @@
 "ফাইল সংরক্ষণের ‍‍পাথ\n"
 "(অনুগ্রহ করে সম্পূর্ণ পাথ প্রদান করুন)"
 
-msgid "Automatically reject from users not in buddy list"
-msgstr "বন্ধু তালিকার বহির্ভূত ব্যবহারকারী থেকে স্বয়ংক্রিয় ভাবে বাতিল করা হবে"
+msgid ""
+"When a file-transfer request arrives from a user who is\n"
+"*not* on your buddy list:"
+msgstr ""
+"যখন একজন ব্যবহারকারী থেকে ফাইল স্থানান্তরের অনুরোধ আসে\n"
+" যা আপনার বন্ধু তালিকায় *নেই*:"
 
 # tithi
 msgid ""
@@ -2480,6 +2484,10 @@
 msgid "Create a new directory for each user"
 msgstr "প্রত্যেক ব্যবহারকারীর জন্য একটি নতুন ডিরেক্টরি তৈরি করা হবে"
 
+# Translated by sadia
+msgid "Escape the filenames"
+msgstr "ফাইলনাম এড়িয়ে যাওয়া"
+
 msgid "Notes"
 msgstr "নোট"
 
@@ -3993,7 +4001,10 @@
 msgid "Server requires plaintext authentication over an unencrypted stream"
 msgstr "একটি এনক্রিপশনবিহীন স্ট্রীমে সার্ভারের সরল-টেক্সট প্রমাণীকরণ প্রয়োজন"
 
-#. This should never happen!
+#. This happens when the server sends back jibberish
+#. * in the "additional data with success" case.
+#. * Seen with Wildfire 3.0.1.
+#.
 msgid "Invalid response from server"
 msgstr "সার্ভার থেকে অকার্যকর উত্তর"
 
@@ -6605,6 +6616,22 @@
 msgid "Retrieving User Information..."
 msgstr "ব্যবহারকারীর তথ্য খুঁজে আনা হচ্ছে..."
 
+# Kick =  তিরস্কার
+# OR  পদাঘাত
+#. you were kicked
+msgid "You have been kicked from this MultiMX."
+msgstr "MultiMX হতে আপনাকে তিরস্কার করা হয়েছে।"
+
+msgid "was kicked"
+msgstr "তিরস্কার করা হয়েছে"
+
+msgid "_Room Name:"
+msgstr "আসরের নাম (_R):"
+
+#. Display system message in chat window
+msgid "You have invited"
+msgstr "আপনাকে আমন্ত্রণ জানানো হয়েছে"
+
 # Translated by sadia
 msgid "Loading menu..."
 msgstr "মেনু লোড করা হচ্ছে..."
@@ -6640,22 +6667,6 @@
 msgid "Enable splash-screen popup"
 msgstr "স্প্ল্যাশ স্ক্রীন পপ আপ সক্রিয় করা হবে"
 
-# Kick =  তিরস্কার
-# OR  পদাঘাত
-#. you were kicked
-msgid "You have been kicked from this MultiMX."
-msgstr "MultiMX হতে আপনাকে তিরস্কার করা হয়েছে।"
-
-msgid "was kicked"
-msgstr "তিরস্কার করা হয়েছে"
-
-msgid "_Room Name:"
-msgstr "আসরের নাম (_R):"
-
-#. Display system message in chat window
-msgid "You have invited"
-msgstr "আপনাকে আমন্ত্রণ জানানো হয়েছে"
-
 msgid "Last Online"
 msgstr "শেষ যখন অনলাইনে"
 
@@ -8546,91 +8557,6 @@
 "এটির জন্য দুটি কম্পিউটারের মধ্যে সরাসরি সংযোগ প্রয়োজন যা কিনা IM এর ছবির জন্য "
 "আবশ্যক। যেহেতু আপনার IP ঠিকানা প্রকাশিত হবে, তাই এতে গোপনীয়তায় ঝুঁকি থাকতে পারে।"
 
-msgid "Invalid SNAC"
-msgstr "অকার্যকর SNAC"
-
-msgid "Server rate limit exceeded"
-msgstr "সার্ভার হারের সীমা পেরিয়ে গেছে"
-
-msgid "Client rate limit exceeded"
-msgstr "ক্লায়েন্ট হারের সীমা পেরিয়ে গেছে"
-
-msgid "Service unavailable"
-msgstr "সার্ভিস বিদ্যমান নয়"
-
-# tithi
-msgid "Service not defined"
-msgstr "সেবা নির্ধারিত নয়"
-
-# tithi
-msgid "Obsolete SNAC"
-msgstr "অপ্রচলিত SNAC"
-
-# tithi
-msgid "Not supported by host"
-msgstr "হোস্ট দ্বারা সমর্থিত নয়"
-
-# tithi
-msgid "Not supported by client"
-msgstr "ক্লায়েন্ট দ্বারা সমর্থিত নয়"
-
-# tithi
-msgid "Refused by client"
-msgstr "ক্লায়েন্ট দ্বারা প্রত্যাখ্যাত"
-
-# tithi
-msgid "Reply too big"
-msgstr "অতিরিক্ত বড় উত্তর"
-
-# tithi
-msgid "Responses lost"
-msgstr "প্রতিক্রিয়া হারিয়ে গেছে"
-
-msgid "Request denied"
-msgstr "অনুরোধ প্রত্যাখ্যাত"
-
-# tithi
-msgid "Busted SNAC payload"
-msgstr "ব্যর্থ SNAC পেলোড"
-
-# tithi
-msgid "Insufficient rights"
-msgstr "অপর্যাপ্ত অধিকার"
-
-# tithi
-msgid "In local permit/deny"
-msgstr "স্থানীয় অনুমতি/অস্বীকারে"
-
-# tithi
-msgid "Warning level too high (sender)"
-msgstr "সতর্কতা স্তর খুব উচ্চ (প্রেরক)"
-
-# tithi
-msgid "Warning level too high (receiver)"
-msgstr "সতর্কতা স্তর খুব উচ্চ (গ্রাহক)"
-
-# tithi
-msgid "User temporarily unavailable"
-msgstr "ব্যবহারকারীকে সাময়িকভাবে পাওয়া যায়না"
-
-# tithi
-msgid "No match"
-msgstr "কোনো মিল নেই"
-
-# tithi
-msgid "List overflow"
-msgstr "লিস্ট ওভার‌ফ্লো"
-
-msgid "Request ambiguous"
-msgstr "অনুরোধ অস্পষ্ট"
-
-# tithi
-msgid "Queue full"
-msgstr "কিউ পরিপূর্ণ"
-
-msgid "Not while on AOL"
-msgstr "AOL এ থাকা অবস্থায় নয়"
-
 #. Label
 msgid "Buddy Icon"
 msgstr "বন্ধু আইকন"
@@ -8767,6 +8693,91 @@
 msgid "Capabilities"
 msgstr "ক্ষমতা"
 
+msgid "Invalid SNAC"
+msgstr "অকার্যকর SNAC"
+
+msgid "Server rate limit exceeded"
+msgstr "সার্ভার হারের সীমা পেরিয়ে গেছে"
+
+msgid "Client rate limit exceeded"
+msgstr "ক্লায়েন্ট হারের সীমা পেরিয়ে গেছে"
+
+msgid "Service unavailable"
+msgstr "সার্ভিস বিদ্যমান নয়"
+
+# tithi
+msgid "Service not defined"
+msgstr "সেবা নির্ধারিত নয়"
+
+# tithi
+msgid "Obsolete SNAC"
+msgstr "অপ্রচলিত SNAC"
+
+# tithi
+msgid "Not supported by host"
+msgstr "হোস্ট দ্বারা সমর্থিত নয়"
+
+# tithi
+msgid "Not supported by client"
+msgstr "ক্লায়েন্ট দ্বারা সমর্থিত নয়"
+
+# tithi
+msgid "Refused by client"
+msgstr "ক্লায়েন্ট দ্বারা প্রত্যাখ্যাত"
+
+# tithi
+msgid "Reply too big"
+msgstr "অতিরিক্ত বড় উত্তর"
+
+# tithi
+msgid "Responses lost"
+msgstr "প্রতিক্রিয়া হারিয়ে গেছে"
+
+msgid "Request denied"
+msgstr "অনুরোধ প্রত্যাখ্যাত"
+
+# tithi
+msgid "Busted SNAC payload"
+msgstr "ব্যর্থ SNAC পেলোড"
+
+# tithi
+msgid "Insufficient rights"
+msgstr "অপর্যাপ্ত অধিকার"
+
+# tithi
+msgid "In local permit/deny"
+msgstr "স্থানীয় অনুমতি/অস্বীকারে"
+
+# tithi
+msgid "Warning level too high (sender)"
+msgstr "সতর্কতা স্তর খুব উচ্চ (প্রেরক)"
+
+# tithi
+msgid "Warning level too high (receiver)"
+msgstr "সতর্কতা স্তর খুব উচ্চ (গ্রাহক)"
+
+# tithi
+msgid "User temporarily unavailable"
+msgstr "ব্যবহারকারীকে সাময়িকভাবে পাওয়া যায়না"
+
+# tithi
+msgid "No match"
+msgstr "কোনো মিল নেই"
+
+# tithi
+msgid "List overflow"
+msgstr "লিস্ট ওভার‌ফ্লো"
+
+msgid "Request ambiguous"
+msgstr "অনুরোধ অস্পষ্ট"
+
+# tithi
+msgid "Queue full"
+msgstr "কিউ পরিপূর্ণ"
+
+msgid "Not while on AOL"
+msgstr "AOL এ থাকা অবস্থায় নয়"
+
 # tithi
 #. Translators: This string is a menu option that, if selected, will cause
 #. you to appear online to the chosen user even when your status is set to
@@ -9420,16 +9431,16 @@
 msgstr "সার্ভার নির্বাচন"
 
 # tithi
-msgid "QQ2005"
-msgstr "QQ2005"
+msgid "QQ2008"
+msgstr "QQ2008"
 
 # tithi
 msgid "QQ2007"
 msgstr "QQ2007"
 
 # tithi
-msgid "QQ2008"
-msgstr "QQ2008"
+msgid "QQ2005"
+msgstr "QQ2005"
 
 msgid "Connect by TCP"
 msgstr "TCP দ্বারা সংযোগ করা হবে"
@@ -13272,10 +13283,6 @@
 msgid "Fatal Error"
 msgstr "মারাত্মক ত্রুটি"
 
-# tithi
-msgid "bug master"
-msgstr "বাগ মাস্টার"
-
 msgid "artist"
 msgstr "শিল্পী"
 
@@ -13472,6 +13479,9 @@
 msgid "Maithili"
 msgstr "মৈথিলি"
 
+msgid "Meadow Mari"
+msgstr "মিইডো মারি"
+
 msgid "Macedonian"
 msgstr "ম্যাসেডনিয়"
 
@@ -16808,6 +16818,13 @@
 msgid "You do not have permission to uninstall this application."
 msgstr "আপনার এই অ্যাপ্লিকেশনটি আনইন্সটল করার অনুমতি নেই।"
 
+#~ msgid "Automatically reject from users not in buddy list"
+#~ msgstr "বন্ধু তালিকার বহির্ভূত ব্যবহারকারী থেকে স্বয়ংক্রিয় ভাবে বাতিল করা হবে"
+
+# tithi
+#~ msgid "bug master"
+#~ msgstr "বাগ মাস্টার"
+
 #~ msgid "An error occurred on the in-band bytestream transfer\n"
 #~ msgstr "ইন-ব্যান্ড বাইটস্ট্রিম বিনিময়ে ত্রুটি হয়েছে\n"
 
--- a/po/ca.po	Tue Dec 21 21:05:26 2010 +0900
+++ b/po/ca.po	Sat Feb 12 04:17:09 2011 +0900
@@ -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, 2008, 2009, 2010
+# Copyright (c) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011
 #               Josep Puigdemont i Casamajó <josep.puigdemont@gmail.com>
 #
 # This file is distributed under the same license as the Pidgin package.
@@ -33,8 +33,8 @@
 msgstr ""
 "Project-Id-Version: Pidgin\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-12-19 13:33-0500\n"
-"PO-Revision-Date: 2010-11-20 10:19+0100\n"
+"POT-Creation-Date: 2011-01-30 11:04+0100\n"
+"PO-Revision-Date: 2011-01-30 11:11+0100\n"
 "Last-Translator: Josep Puigdemont i Casamajó <josep.puigdemont@gmail.com>\n"
 "Language-Team: Catalan <tradgnome@softcatala.net>\n"
 "Language: ca\n"
@@ -2387,9 +2387,12 @@
 "Camí on desar els fitxers\n"
 "(introduïu tot el camí)"
 
-msgid "Automatically reject from users not in buddy list"
-msgstr ""
-"Rebutja automàticament dels usuaris que no estiguin a la llista d'amics"
+msgid ""
+"When a file-transfer request arrives from a user who is\n"
+"*not* on your buddy list:"
+msgstr ""
+"Quan arribi una sol·licitud de transferència d'un fitxer d'un\n"
+"usuari que *no* és a la vostra llista d'amics:"
 
 msgid ""
 "Notify with a popup when an autoaccepted file transfer is complete\n"
@@ -2402,6 +2405,10 @@
 msgid "Create a new directory for each user"
 msgstr "Crea un directori nou per a cada usuari"
 
+#, fuzzy
+msgid "Escape the filenames"
+msgstr "%s ha cancel·lat la transferència del fitxer"
+
 msgid "Notes"
 msgstr "Notes"
 
@@ -3859,7 +3866,10 @@
 msgid "Server requires plaintext authentication over an unencrypted stream"
 msgstr "El servidor requereix autenticació de text sobre un flux no xifrat"
 
-#. This should never happen!
+#. This happens when the server sends back jibberish
+#. * in the "additional data with success" case.
+#. * Seen with Wildfire 3.0.1.
+#.
 msgid "Invalid response from server"
 msgstr "La resposta del servidor no és vàlida"
 
@@ -5479,19 +5489,17 @@
 #. a separate purple_request_field_label_new_without_colon function,
 #. or by never automatically adding the colon and requiring that
 #. callers add the colon themselves.
-#, fuzzy
 msgid "You are not signed in from any other locations."
-msgstr "Us heu connectat des d'un altre lloc"
-
-# FIXME: entrades/registres?
-#, fuzzy
+msgstr "No esteu connectat des de cap altra ubicació."
+
 msgid "Allow multiple logins?"
-msgstr "Permet diverses instàncies"
+msgstr "Voleu permetre connexions múltiples?"
 
 msgid ""
 "Do you want to allow or disallow connecting from multiple locations "
 "simultaneously?"
 msgstr ""
+"Voleu permetre connectar-vos des de diferents ubicacions simultàniament?"
 
 msgid "Allow"
 msgstr "Permet"
@@ -5594,9 +5602,9 @@
 msgid "Enable/Disable Mobile Devices..."
 msgstr "Habilita/inhabilita dispositius mòbils..."
 
-#, fuzzy
+# FIXME
 msgid "Allow/Disallow Multiple Logins..."
-msgstr "Permet/denega pàgines de mòbil..."
+msgstr "Permet/denega múltiples connexions..."
 
 msgid "Allow/Disallow Mobile Pages..."
 msgstr "Permet/denega pàgines de mòbil..."
@@ -5816,7 +5824,7 @@
 msgstr "Permet connexions directes"
 
 msgid "Allow connecting from multiple locations"
-msgstr ""
+msgstr "Permet connectar des de diferents ubicacions"
 
 msgid "nudge: nudge a user to get their attention"
 msgstr "nudge: doneu un cop de colze a un usuari perquè us pari atenció"
@@ -6203,6 +6211,20 @@
 msgid "Retrieving User Information..."
 msgstr "S'està obtenint informació de l'usuari..."
 
+#. you were kicked
+msgid "You have been kicked from this MultiMX."
+msgstr "Us han fet fora d'aquest MultiMX."
+
+msgid "was kicked"
+msgstr "ha estat fet fora"
+
+msgid "_Room Name:"
+msgstr "Nom de la _Sala:"
+
+#. Display system message in chat window
+msgid "You have invited"
+msgstr "Heu convidat"
+
 msgid "Loading menu..."
 msgstr "S'està carregant el menú..."
 
@@ -6231,20 +6253,6 @@
 msgid "Enable splash-screen popup"
 msgstr "Habilita la pantalla de presentació emergent"
 
-#. you were kicked
-msgid "You have been kicked from this MultiMX."
-msgstr "Us han fet fora d'aquest MultiMX."
-
-msgid "was kicked"
-msgstr "ha estat fet fora"
-
-msgid "_Room Name:"
-msgstr "Nom de la _Sala:"
-
-#. Display system message in chat window
-msgid "You have invited"
-msgstr "Heu convidat"
-
 msgid "Last Online"
 msgstr "Darrer cop en línia"
 
@@ -7034,9 +7042,8 @@
 msgid "Error requesting %s: %s"
 msgstr "S'ha produït un error en sol·licitar %s: %s"
 
-#, fuzzy
 msgid "The server returned an empty response"
-msgstr "No s'ha pogut connectar: el servidor ha retornat una resposta buida."
+msgstr "El servidor ha retornat una resposta buida"
 
 msgid ""
 "Server requested that you fill out a CAPTCHA in order to sign in, but this "
@@ -7920,75 +7927,6 @@
 "necessari per poder enviar imatges instantànies. Atès que es revelarà la "
 "vostra adreça IP, això es pot considerar un risc de privadesa."
 
-msgid "Invalid SNAC"
-msgstr "SNAC invàlid"
-
-msgid "Server rate limit exceeded"
-msgstr "S'ha excedit el límit de velocitat del servidor"
-
-msgid "Client rate limit exceeded"
-msgstr "S'ha excedit el límit de velocitat del client"
-
-msgid "Service unavailable"
-msgstr "Servei no disponible"
-
-msgid "Service not defined"
-msgstr "Servei no definit"
-
-msgid "Obsolete SNAC"
-msgstr "SNAC obsolet"
-
-msgid "Not supported by host"
-msgstr "El servidor no ho permet"
-
-msgid "Not supported by client"
-msgstr "El client no ho permet"
-
-msgid "Refused by client"
-msgstr "Rebutjat pel client"
-
-msgid "Reply too big"
-msgstr "Resposta massa gran"
-
-msgid "Responses lost"
-msgstr "S'han perdut respostes"
-
-msgid "Request denied"
-msgstr "Petició denegada"
-
-msgid "Busted SNAC payload"
-msgstr "Càrrega SNAC malmesa"
-
-msgid "Insufficient rights"
-msgstr "Drets insuficients"
-
-msgid "In local permit/deny"
-msgstr "En la llista de permès/denegat local"
-
-msgid "Warning level too high (sender)"
-msgstr "Nivell d'avís massa alt (remitent)"
-
-msgid "Warning level too high (receiver)"
-msgstr "Nivell d'avís massa alt (receptor)"
-
-msgid "User temporarily unavailable"
-msgstr "Usuari no disponible temporalment"
-
-msgid "No match"
-msgstr "Cap coincidència"
-
-msgid "List overflow"
-msgstr "Sobreeiximent de la llista"
-
-msgid "Request ambiguous"
-msgstr "Petició ambigua"
-
-msgid "Queue full"
-msgstr "Cua plena"
-
-msgid "Not while on AOL"
-msgstr "No es pot fer mentre estigui a AOL"
-
 #. Label
 msgid "Buddy Icon"
 msgstr "Icona de l'amic"
@@ -8107,6 +8045,75 @@
 msgid "Capabilities"
 msgstr "Capacitats"
 
+msgid "Invalid SNAC"
+msgstr "SNAC invàlid"
+
+msgid "Server rate limit exceeded"
+msgstr "S'ha excedit el límit de velocitat del servidor"
+
+msgid "Client rate limit exceeded"
+msgstr "S'ha excedit el límit de velocitat del client"
+
+msgid "Service unavailable"
+msgstr "Servei no disponible"
+
+msgid "Service not defined"
+msgstr "Servei no definit"
+
+msgid "Obsolete SNAC"
+msgstr "SNAC obsolet"
+
+msgid "Not supported by host"
+msgstr "El servidor no ho permet"
+
+msgid "Not supported by client"
+msgstr "El client no ho permet"
+
+msgid "Refused by client"
+msgstr "Rebutjat pel client"
+
+msgid "Reply too big"
+msgstr "Resposta massa gran"
+
+msgid "Responses lost"
+msgstr "S'han perdut respostes"
+
+msgid "Request denied"
+msgstr "Petició denegada"
+
+msgid "Busted SNAC payload"
+msgstr "Càrrega SNAC malmesa"
+
+msgid "Insufficient rights"
+msgstr "Drets insuficients"
+
+msgid "In local permit/deny"
+msgstr "En la llista de permès/denegat local"
+
+msgid "Warning level too high (sender)"
+msgstr "Nivell d'avís massa alt (remitent)"
+
+msgid "Warning level too high (receiver)"
+msgstr "Nivell d'avís massa alt (receptor)"
+
+msgid "User temporarily unavailable"
+msgstr "Usuari no disponible temporalment"
+
+msgid "No match"
+msgstr "Cap coincidència"
+
+msgid "List overflow"
+msgstr "Sobreeiximent de la llista"
+
+msgid "Request ambiguous"
+msgstr "Petició ambigua"
+
+msgid "Queue full"
+msgstr "Cua plena"
+
+msgid "Not while on AOL"
+msgstr "No es pot fer mentre estigui a AOL"
+
 #. Translators: This string is a menu option that, if selected, will cause
 #. you to appear online to the chosen user even when your status is set to
 #. Invisible.
@@ -8706,14 +8713,14 @@
 msgid "Select Server"
 msgstr "Seleccioneu un servidor"
 
-msgid "QQ2005"
-msgstr "QQ2005"
+msgid "QQ2008"
+msgstr "QQ2008"
 
 msgid "QQ2007"
 msgstr "QQ2007"
 
-msgid "QQ2008"
-msgstr "QQ2008"
+msgid "QQ2005"
+msgstr "QQ2005"
 
 msgid "Connect by TCP"
 msgstr "Connecta amb TCP"
@@ -12287,10 +12294,6 @@
 msgid "Fatal Error"
 msgstr "Error fatal"
 
-# Fixme
-msgid "bug master"
-msgstr "bug master"
-
 msgid "artist"
 msgstr "artista"
 
@@ -12472,6 +12475,9 @@
 msgid "Maithili"
 msgstr "Maithili"
 
+msgid "Meadow Mari"
+msgstr "Txeremís oriental"
+
 msgid "Macedonian"
 msgstr "Macedoni"
 
@@ -14136,7 +14142,7 @@
 msgstr "Google Talk"
 
 msgid "Facebook (XMPP)"
-msgstr ""
+msgstr "Facebook (XMPP)"
 
 #, c-format
 msgid "The following error has occurred loading %s: %s"
@@ -15629,6 +15635,14 @@
 msgid "You do not have permission to uninstall this application."
 msgstr "No tens permís per desinstal.lar aquesta aplicació."
 
+#~ msgid "Automatically reject from users not in buddy list"
+#~ msgstr ""
+#~ "Rebutja automàticament dels usuaris que no estiguin a la llista d'amics"
+
+# Fixme
+#~ msgid "bug master"
+#~ msgstr "bug master"
+
 #~ msgid "Error requesting %s"
 #~ msgstr "S'ha produït un error en sol·licitar %s"
 
--- a/po/cs.po	Tue Dec 21 21:05:26 2010 +0900
+++ b/po/cs.po	Sat Feb 12 04:17:09 2011 +0900
@@ -9,8 +9,8 @@
 msgstr ""
 "Project-Id-Version: pidgin VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-12-19 13:33-0500\n"
-"PO-Revision-Date: 2010-11-21 11:47+0100\n"
+"POT-Creation-Date: 2011-02-02 23:34-0500\n"
+"PO-Revision-Date: 2011-02-01 21:09+0100\n"
 "Last-Translator: David Vachulka <david@konstrukce-cad.com>\n"
 "Language-Team: Czech <cs@li.org>\n"
 "Language: cs\n"
@@ -2328,8 +2328,12 @@
 "Cesta, kam ukládat soubory\n"
 "(Zadejte prosím plnou cestu)"
 
-msgid "Automatically reject from users not in buddy list"
-msgstr "Automaticky odmítat od uživatelů, kteří nejsou na seznamu kamarádů"
+msgid ""
+"When a file-transfer request arrives from a user who is\n"
+"*not* on your buddy list:"
+msgstr ""
+"Když přijde požadavek na přenos souboru od někoho,\n"
+"kdo není v seznamu kamarádů:"
 
 msgid ""
 "Notify with a popup when an autoaccepted file transfer is complete\n"
@@ -2342,6 +2346,9 @@
 msgid "Create a new directory for each user"
 msgstr "Vytvořit nový adresář pro každého uživatele"
 
+msgid "Escape the filenames"
+msgstr "Upravit jména souborů"
+
 msgid "Notes"
 msgstr "Poznámky"
 
@@ -3793,7 +3800,10 @@
 msgid "Server requires plaintext authentication over an unencrypted stream"
 msgstr "Server vyžaduje textovou autentizaci v nešifrovaném proudu"
 
-#. This should never happen!
+#. This happens when the server sends back jibberish
+#. * in the "additional data with success" case.
+#. * Seen with Wildfire 3.0.1.
+#.
 msgid "Invalid response from server"
 msgstr "Neplatná odpověď od serveru"
 
@@ -5379,18 +5389,16 @@
 #. a separate purple_request_field_label_new_without_colon function,
 #. or by never automatically adding the colon and requiring that
 #. callers add the colon themselves.
-#, fuzzy
 msgid "You are not signed in from any other locations."
-msgstr "Přihlásili jste se z jiného umístění"
-
-#, fuzzy
+msgstr "Nejste přihlášen z jiného místa"
+
 msgid "Allow multiple logins?"
-msgstr "Povolit několikanásobné současné spuštění"
+msgstr "Povolit přihlášení z více míst?"
 
 msgid ""
 "Do you want to allow or disallow connecting from multiple locations "
 "simultaneously?"
-msgstr ""
+msgstr "Chcete povolit nebo zakázat přihlášení z několika míst současně?"
 
 msgid "Allow"
 msgstr "Povolit"
@@ -5492,9 +5500,8 @@
 msgid "Enable/Disable Mobile Devices..."
 msgstr "Povolit/zakázat mobilní zařízení..."
 
-#, fuzzy
 msgid "Allow/Disallow Multiple Logins..."
-msgstr "Povolit/zakázat mobilní stránky..."
+msgstr "Povolit/zakázat přihlášení z více míst..."
 
 msgid "Allow/Disallow Mobile Pages..."
 msgstr "Povolit/zakázat mobilní stránky..."
@@ -5715,7 +5722,7 @@
 msgstr "Povolit přímé připojení"
 
 msgid "Allow connecting from multiple locations"
-msgstr ""
+msgstr "Povolí připojení z několika míst"
 
 msgid "nudge: nudge a user to get their attention"
 msgstr "nudge: získat pozornost uživatele šťouchnutím"
@@ -6077,6 +6084,20 @@
 msgid "Retrieving User Information..."
 msgstr "Získávám informace o uživateli..."
 
+#. you were kicked
+msgid "You have been kicked from this MultiMX."
+msgstr "Byl jste vykopnut z MultiMX."
+
+msgid "was kicked"
+msgstr "byl vykopnut"
+
+msgid "_Room Name:"
+msgstr "_Místnost:"
+
+#. Display system message in chat window
+msgid "You have invited"
+msgstr "Přišlo vám pozvání"
+
 msgid "Loading menu..."
 msgstr "Načítám menu..."
 
@@ -6104,20 +6125,6 @@
 msgid "Enable splash-screen popup"
 msgstr "Povolit zobrazení spouštěcí obrazovky"
 
-#. you were kicked
-msgid "You have been kicked from this MultiMX."
-msgstr "Byl jste vykopnut z MultiMX."
-
-msgid "was kicked"
-msgstr "byl vykopnut"
-
-msgid "_Room Name:"
-msgstr "_Místnost:"
-
-#. Display system message in chat window
-msgid "You have invited"
-msgstr "Přišlo vám pozvání"
-
 msgid "Last Online"
 msgstr "Naposledy připojen"
 
@@ -6885,9 +6892,8 @@
 msgid "Error requesting %s: %s"
 msgstr "Chyba žádosti %s: %s"
 
-#, fuzzy
 msgid "The server returned an empty response"
-msgstr "Nemohu se připojit: server vrací prázdnou odpověď"
+msgstr "Server vrátil prázdnou odpověď"
 
 msgid ""
 "Server requested that you fill out a CAPTCHA in order to sign in, but this "
@@ -7780,75 +7786,6 @@
 "Images. Protože bude odkryta vaše IP adresa, dá se to považovat za riziko "
 "pro soukromí."
 
-msgid "Invalid SNAC"
-msgstr "Neplatné SNAC"
-
-msgid "Server rate limit exceeded"
-msgstr "Překročen limit poměru serveru"
-
-msgid "Client rate limit exceeded"
-msgstr "Překročen limit poměru klienta"
-
-msgid "Service unavailable"
-msgstr "Služba nedostupná"
-
-msgid "Service not defined"
-msgstr "Služba nedefinována"
-
-msgid "Obsolete SNAC"
-msgstr "Zastaralé SNAC"
-
-msgid "Not supported by host"
-msgstr "Nepodporováno hostitelem"
-
-msgid "Not supported by client"
-msgstr "Nepodporováno klientem"
-
-msgid "Refused by client"
-msgstr "Odmítnuto klientem"
-
-msgid "Reply too big"
-msgstr "Odpověď příliš velká"
-
-msgid "Responses lost"
-msgstr "Odpovědi ztraceny"
-
-msgid "Request denied"
-msgstr "Požadavek zamítnut"
-
-msgid "Busted SNAC payload"
-msgstr "Poškozená data SNAC"
-
-msgid "Insufficient rights"
-msgstr "Nedostatečná oprávnění"
-
-msgid "In local permit/deny"
-msgstr "V místním povolit/zakázat"
-
-msgid "Warning level too high (sender)"
-msgstr "Hladina varování příliš vysoká (odeslání)"
-
-msgid "Warning level too high (receiver)"
-msgstr "Hladina varování příliš vysoká (příjem)"
-
-msgid "User temporarily unavailable"
-msgstr "Uživatel dočasně nedostupný"
-
-msgid "No match"
-msgstr "Žádná shoda"
-
-msgid "List overflow"
-msgstr "Přetečení seznamu"
-
-msgid "Request ambiguous"
-msgstr "Požadavek nejednoznačný"
-
-msgid "Queue full"
-msgstr "Fronta plná"
-
-msgid "Not while on AOL"
-msgstr "Ne když na AOL"
-
 #. Label
 msgid "Buddy Icon"
 msgstr "Ikona kamaráda"
@@ -7967,6 +7904,75 @@
 msgid "Capabilities"
 msgstr "Schopnosti"
 
+msgid "Invalid SNAC"
+msgstr "Neplatné SNAC"
+
+msgid "Server rate limit exceeded"
+msgstr "Překročen limit poměru serveru"
+
+msgid "Client rate limit exceeded"
+msgstr "Překročen limit poměru klienta"
+
+msgid "Service unavailable"
+msgstr "Služba nedostupná"
+
+msgid "Service not defined"
+msgstr "Služba nedefinována"
+
+msgid "Obsolete SNAC"
+msgstr "Zastaralé SNAC"
+
+msgid "Not supported by host"
+msgstr "Nepodporováno hostitelem"
+
+msgid "Not supported by client"
+msgstr "Nepodporováno klientem"
+
+msgid "Refused by client"
+msgstr "Odmítnuto klientem"
+
+msgid "Reply too big"
+msgstr "Odpověď příliš velká"
+
+msgid "Responses lost"
+msgstr "Odpovědi ztraceny"
+
+msgid "Request denied"
+msgstr "Požadavek zamítnut"
+
+msgid "Busted SNAC payload"
+msgstr "Poškozená data SNAC"
+
+msgid "Insufficient rights"
+msgstr "Nedostatečná oprávnění"
+
+msgid "In local permit/deny"
+msgstr "V místním povolit/zakázat"
+
+msgid "Warning level too high (sender)"
+msgstr "Hladina varování příliš vysoká (odeslání)"
+
+msgid "Warning level too high (receiver)"
+msgstr "Hladina varování příliš vysoká (příjem)"
+
+msgid "User temporarily unavailable"
+msgstr "Uživatel dočasně nedostupný"
+
+msgid "No match"
+msgstr "Žádná shoda"
+
+msgid "List overflow"
+msgstr "Přetečení seznamu"
+
+msgid "Request ambiguous"
+msgstr "Požadavek nejednoznačný"
+
+msgid "Queue full"
+msgstr "Fronta plná"
+
+msgid "Not while on AOL"
+msgstr "Ne když na AOL"
+
 #. Translators: This string is a menu option that, if selected, will cause
 #. you to appear online to the chosen user even when your status is set to
 #. Invisible.
@@ -8556,14 +8562,14 @@
 msgid "Select Server"
 msgstr "Vyberte server"
 
-msgid "QQ2005"
-msgstr "QQ2005"
+msgid "QQ2008"
+msgstr "QQ2008"
 
 msgid "QQ2007"
 msgstr "QQ2007"
 
-msgid "QQ2008"
-msgstr "QQ2008"
+msgid "QQ2005"
+msgstr "QQ2005"
 
 msgid "Connect by TCP"
 msgstr "Připojit se pomocí TCP"
@@ -12092,9 +12098,6 @@
 msgid "Fatal Error"
 msgstr "Fatální chyba"
 
-msgid "bug master"
-msgstr "lovec chyb"
-
 msgid "artist"
 msgstr "umělec"
 
@@ -12274,6 +12277,9 @@
 msgid "Maithili"
 msgstr "Maithili"
 
+msgid "Meadow Mari"
+msgstr "Meadow Mari"
+
 msgid "Macedonian"
 msgstr "Makedonština"
 
@@ -13898,7 +13904,7 @@
 msgstr "Google Talk"
 
 msgid "Facebook (XMPP)"
-msgstr ""
+msgstr "Facebook (XMPP)"
 
 #, c-format
 msgid "The following error has occurred loading %s: %s"
@@ -15354,6 +15360,12 @@
 msgid "You do not have permission to uninstall this application."
 msgstr "Nemáte oprávnění k odinstalaci této aplikace."
 
+#~ msgid "Automatically reject from users not in buddy list"
+#~ msgstr "Automaticky odmítat od uživatelů, kteří nejsou na seznamu kamarádů"
+
+#~ msgid "bug master"
+#~ msgstr "lovec chyb"
+
 #~ msgid "Error requesting %s"
 #~ msgstr "Chyba žádosti %s"
 
--- a/po/de.po	Tue Dec 21 21:05:26 2010 +0900
+++ b/po/de.po	Sat Feb 12 04:17:09 2011 +0900
@@ -2,7 +2,7 @@
 # Pidgin German translation
 # Copyright (C) 2001, Daniel Seifert <Pidgin-translation@dseifert.de>
 # Copyright (C) 2002, Karsten Weiss <knweiss@gmx.de>
-# Copyright (C) 2002-2010, Björn Voigt <bjoern@cs.tu-berlin.de>,
+# Copyright (C) 2002-2011, Björn Voigt <bjoern@cs.tu-berlin.de>,
 #                     Jochen Kemnade <jochenkemnade@web.de>
 #
 # This file is distributed under the same license as the Pidgin package.
@@ -11,8 +11,8 @@
 msgstr ""
 "Project-Id-Version: de\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-12-19 13:33-0500\n"
-"PO-Revision-Date: 2010-12-12 12:28+0100\n"
+"POT-Creation-Date: 2011-02-06 14:22+0100\n"
+"PO-Revision-Date: 2011-02-06 14:22+0100\n"
 "Last-Translator: Jochen Kemnade <jochenkemnade@web.de>\n"
 "Language-Team: German <de@li.org>\n"
 "Language: de\n"
@@ -401,7 +401,7 @@
 msgstr "Chat betreten"
 
 msgid "Please enter the name of the chat you want to join."
-msgstr "Bitte geben Sie die den Namen des Chats an, den Sie betreten möchten."
+msgstr "Bitte geben Sie den Namen des Chats an, den Sie betreten möchten."
 
 msgid "Join"
 msgstr "Betreten"
@@ -568,7 +568,7 @@
 msgstr "Konten reaktivieren"
 
 msgid "No such command."
-msgstr "Es gibt kein solches Kommando."
+msgstr "Unbekanntes Kommando."
 
 msgid "Syntax Error:  You typed the wrong number of arguments to that command."
 msgstr ""
@@ -581,7 +581,8 @@
 msgstr "Dieses Kommando funktioniert nur in Chats, nicht bei IMs."
 
 msgid "That command only works in IMs, not chats."
-msgstr "Dieses Kommando funktioniert nur bei IMs, nicht bei Chats."
+msgstr ""
+"Dieses Kommando funktioniert nur bei Sofortnachrichten, nicht bei Chats."
 
 msgid "That command doesn't work on this protocol."
 msgstr "Dieses Kommando funktioniert nicht in diesem Protokoll."
@@ -646,7 +647,7 @@
 msgstr "Einladen..."
 
 msgid "Enable Logging"
-msgstr "Mitschnitt einschalten"
+msgstr "Mitschnitt aktivieren"
 
 msgid "Enable Sounds"
 msgstr "Klänge aktivieren"
@@ -801,7 +802,7 @@
 msgstr "Status"
 
 msgid "Close this window when all transfers finish"
-msgstr "Schließe dieses Fenster, wenn alle Übertragungen abgeschlossen sind"
+msgstr "Fenster schließen, wenn alle Übertragungen abgeschlossen sind"
 
 msgid "Clear finished transfers"
 msgstr "Entferne komplette Übertragungen"
@@ -816,7 +817,7 @@
 msgstr "Abgebrochen"
 
 msgid "Failed"
-msgstr "Gescheitert"
+msgstr "Fehlgeschlagen"
 
 #, c-format
 msgid "%.2f KiB/s"
@@ -884,11 +885,11 @@
 
 #, c-format
 msgid "Conversations in %s"
-msgstr "Unterhaltung in %s"
+msgstr "Unterhaltungen in %s"
 
 #, c-format
 msgid "Conversations with %s"
-msgstr "Unterhaltung mit %s"
+msgstr "Unterhaltungen mit %s"
 
 msgid "All Conversations"
 msgstr "Alle Unterhaltungen"
@@ -910,7 +911,7 @@
 msgstr "Ablehnen"
 
 msgid "Call in progress."
-msgstr "Anruf läuft."
+msgstr "Verbindungsaufbau."
 
 msgid "The call has been terminated."
 msgstr "Der Anruf wurde beendet."
@@ -926,7 +927,7 @@
 "starten."
 
 msgid "You have rejected the call."
-msgstr "Sie haben den Anruf abgelehnt."
+msgstr "Sie haben den Anruf abgewiesen."
 
 msgid "call: Make an audio call."
 msgstr "call: Einen Audio-Anruf tätigen."
@@ -1009,7 +1010,7 @@
 msgstr "Keine Einstellungsoptionen für dieses Plugin."
 
 msgid "Error loading plugin"
-msgstr "Beim Laden des Plugins traten Fehler auf"
+msgstr "Beim Laden des Plugins ist ein Fehler aufgetreten"
 
 msgid "The selected file is not a valid plugin."
 msgstr "Die gewählte Datei ist kein gültiges Plugin."
@@ -1021,7 +1022,7 @@
 "genaue Fehlermeldung zu sehen."
 
 msgid "Select plugin to install"
-msgstr "Wählen Sie ein Plugin zum Installieren"
+msgstr "Zu installierendes Plugin auswählen"
 
 msgid "You can (un)load plugins from the following list."
 msgstr "Die können Plugins von der folgenden Liste laden bzw. entladen."
@@ -1064,10 +1065,10 @@
 msgstr "Alarm, wenn Buddy..."
 
 msgid "Signs on"
-msgstr "sich angemeldet"
+msgstr "sich anmeldet"
 
 msgid "Signs off"
-msgstr "sich abgemeldet"
+msgstr "sich abmeldet"
 
 msgid "Goes away"
 msgstr "hinausgeht"
@@ -1085,7 +1086,7 @@
 msgstr "zu tippen beginnt"
 
 msgid "Pauses while typing"
-msgstr "beim Tippen anhält"
+msgstr "das Tippen unterbricht"
 
 msgid "Stops typing"
 msgstr "aufhört zu tippen"
@@ -1119,13 +1120,13 @@
 msgstr "Wiederkehrend"
 
 msgid "Cannot create pounce"
-msgstr "Kann Alarm nicht erzeugen"
+msgstr "Alarm konnte nicht erstellt werden"
 
 msgid "You do not have any accounts."
 msgstr "Sie haben keine Kontos."
 
 msgid "You must create an account first before you can create a pounce."
-msgstr "Sie müssen ein Konto anlegen, bevor Sie einen Alarm erzeugen können."
+msgstr "Sie müssen ein Konto anlegen, bevor Sie einen Alarm einrichten können."
 
 #, c-format
 msgid "Are you sure you want to delete the pounce on %s for %s?"
@@ -1164,7 +1165,7 @@
 
 #, c-format
 msgid "%s has become idle (%s)"
-msgstr "%s wurde untätig (%s)"
+msgstr "%s ist nun untätig (%s)"
 
 #, c-format
 msgid "%s has gone away. (%s)"
@@ -1178,7 +1179,7 @@
 msgstr "Unbekanntes Alarm-Ereignis. Bitte berichten Sie dieses Problem!"
 
 msgid "Based on keyboard use"
-msgstr "Abhängig von Tastaturbenutzung"
+msgstr "Abhängig von der Tastaturbenutzung"
 
 msgid "From last sent message"
 msgstr "Von letzter gesendeter Nachricht"
@@ -1199,7 +1200,7 @@
 msgstr "Mitschnitt-Format"
 
 msgid "Log IMs"
-msgstr "IMs mitschneiden"
+msgstr "Sofortnachrichten mitschneiden"
 
 msgid "Log chats"
 msgstr "Chats mitschneiden"
@@ -1247,7 +1248,7 @@
 msgstr "Drücken Sie 'Enter', um mehr Räume dieser Kategorie zu finden."
 
 msgid "Get"
-msgstr "Holen"
+msgstr "Abrufen"
 
 #. Create the window.
 msgid "Room List"
@@ -1441,7 +1442,7 @@
 msgstr "Statusmeldungen"
 
 msgid "Error loading the plugin."
-msgstr "Beim Laden des Plugins traten Fehler auf."
+msgstr "Beim Laden des Plugins ist ein Fehler aufgetreten."
 
 msgid "Couldn't find X display"
 msgstr "Konnte X-Display nicht finden"
@@ -1519,7 +1520,7 @@
 msgstr "<b>Unterhaltung mit %s am %s:</b><br>"
 
 msgid "History Plugin Requires Logging"
-msgstr "Das Verlaufs-Plugin erfordert das Mitschneiden"
+msgstr "Für das Verlaufs-Plugin muss das Mitschneiden aktiviert sein"
 
 msgid ""
 "Logging can be enabled from Tools -> Preferences -> Logging.\n"
@@ -1543,7 +1544,7 @@
 "When a new conversation is opened this plugin will insert the last "
 "conversation into the current conversation."
 msgstr ""
-"Wenn eine neue Unterhaltung eröffnet wird, fügt dieses Plugin die letzte "
+"Wenn eine neue Unterhaltung begonnen wird, fügt dieses Plugin die letzte "
 "Unterhaltung in die aktuelle Unterhaltung ein."
 
 #, c-format
@@ -1607,7 +1608,7 @@
 msgstr "Verschachtelte Gruppen (experimentell)"
 
 msgid "Provides alternate buddylist grouping options."
-msgstr "Bietet alternative Einstellungen für die Kontaktlisten-Gruppierung."
+msgstr "Bietet alternative Einstellungen für die Gruppierung der Kontaktliste."
 
 msgid "Lastlog"
 msgstr "Verlauf"
@@ -1900,11 +1901,11 @@
 
 #, c-format
 msgid "Failed to get name: %s"
-msgstr "Kann den Namen nicht bekommen: %s"
+msgstr "Name konnte nicht abgerufen werden: %s"
 
 #, c-format
 msgid "Failed to get serv name: %s"
-msgstr "Kann den Serv-Namen nicht bekommen: %s"
+msgstr "Serv-Name konnte nicht abgerufen werden: %s"
 
 msgid "Purple's D-BUS server is not running for the reason listed below"
 msgstr "Purple's D-Bus-Server läuft aus dem folgenden Grund nicht"
@@ -2041,7 +2042,7 @@
 msgstr "Übertragung der Datei %s ist komplett"
 
 msgid "File transfer complete"
-msgstr "Dateiübertragung ist komplett"
+msgstr "Dateiübertragung abgeschlossen"
 
 #, c-format
 msgid "You cancelled the transfer of %s"
@@ -2368,8 +2369,12 @@
 "Pfad in denen die Dateien gespeichert werden sollen\n"
 "(Bitte geben Sie den vollständigen Pfad an)"
 
-msgid "Automatically reject from users not in buddy list"
-msgstr "Automatisch von Benutzern ablehnen, die nicht in der Buddy-Liste sind"
+msgid ""
+"When a file-transfer request arrives from a user who is\n"
+"*not* on your buddy list:"
+msgstr ""
+"Wenn eine Dateitransferanfrage von einem Benutzer ankommt, \n"
+"der *nicht* in Ihrer Buddy-Liste ist:"
 
 msgid ""
 "Notify with a popup when an autoaccepted file transfer is complete\n"
@@ -2382,6 +2387,9 @@
 msgid "Create a new directory for each user"
 msgstr "Für jeden Benutzer ein neues Verzeichnis anlegen"
 
+msgid "Escape the filenames"
+msgstr "Sonderzeichen in Dateinamen ersetzen"
+
 msgid "Notes"
 msgstr "Notizen"
 
@@ -3850,7 +3858,10 @@
 "Der Server erfordert eine Klartext-Authentifizierung über einen "
 "unverschlüsselten Kanal"
 
-#. This should never happen!
+#. This happens when the server sends back jibberish
+#. * in the "additional data with success" case.
+#. * Seen with Wildfire 3.0.1.
+#.
 msgid "Invalid response from server"
 msgstr "Ungültige Serverantwort"
 
@@ -4172,7 +4183,7 @@
 msgstr "_Raum:"
 
 msgid "_Server:"
-msgstr "_Server:"
+msgstr "Ser_ver:"
 
 msgid "_Handle:"
 msgstr "_Kürzel:"
@@ -8730,14 +8741,14 @@
 msgid "Select Server"
 msgstr "Server wählen"
 
-msgid "QQ2005"
-msgstr "QQ2005"
+msgid "QQ2008"
+msgstr "QQ2008"
 
 msgid "QQ2007"
 msgstr "QQ2007"
 
-msgid "QQ2008"
-msgstr "QQ2008"
+msgid "QQ2005"
+msgstr "QQ2005"
 
 msgid "Connect by TCP"
 msgstr "Über TCP verbinden"
@@ -8751,6 +8762,9 @@
 msgid "Show chat room when msg comes"
 msgstr "Chatraum zeigen, wenn Nachricht empfangen wird"
 
+msgid "Use default font"
+msgstr "Standardschriftart benutzen"
+
 msgid "Keep alive interval (seconds)"
 msgstr "Intervall zum Aufrechterhalten der Verbindung (Sekunden)"
 
@@ -11214,7 +11228,7 @@
 msgstr "Anmeldeoptionen"
 
 msgid "Pro_tocol:"
-msgstr "Pro_tokoll:"
+msgstr "Pr_otokoll:"
 
 msgid "_Username:"
 msgstr "_Benutzer:"
@@ -11227,7 +11241,7 @@
 msgstr "Benutzereinstellungen"
 
 msgid "_Local alias:"
-msgstr "Lokaler _Alias:"
+msgstr "_Lokaler Alias:"
 
 msgid "New _mail notifications"
 msgstr "Benachrichtigung über neue _Mails"
@@ -11273,7 +11287,7 @@
 msgstr "Sie können den Schmetterlingen beim Paaren zusehen"
 
 msgid "Proxy _type:"
-msgstr "Proxy-_Typ:"
+msgstr "_Proxy-Typ:"
 
 msgid "_Host:"
 msgstr "_Host:"
@@ -11300,7 +11314,7 @@
 msgstr "Dieses _neue Konto auf dem Server anlegen"
 
 msgid "P_roxy"
-msgstr "P_roxy"
+msgstr "Prox_y"
 
 # Aktiv
 msgid "Enabled"
@@ -11533,7 +11547,7 @@
 msgstr "_Alias..."
 
 msgid "_Remove"
-msgstr "_Entfernen"
+msgstr "E_ntfernen"
 
 msgid "Set Custom Icon"
 msgstr "Setze benutzerdefiniertes Icon"
@@ -11677,7 +11691,7 @@
 msgstr "/Werkzeuge/Pri_vatsphäre"
 
 msgid "/Tools/Set _Mood"
-msgstr "/Werkzeuge/Setze _Stimmung"
+msgstr "/Werkzeuge/Setze Sti_mmung"
 
 msgid "/Tools/_File Transfers"
 msgstr "/Werkzeuge/_Dateiübertragungen"
@@ -11708,10 +11722,10 @@
 msgstr "/Hilfe/_Entwickler-Informationen"
 
 msgid "/Help/_Translator Information"
-msgstr "/Hilfe/Ü_bersetzer-Informationen"
+msgstr "/Hilfe/Über_setzer-Informationen"
 
 msgid "/Help/_About"
-msgstr "/Hilfe/Ü_ber"
+msgstr "/Hilfe/Übe_r"
 
 #, c-format
 msgid "<b>Account:</b> %s"
@@ -12328,9 +12342,6 @@
 msgid "Fatal Error"
 msgstr "Schwerer Fehler"
 
-msgid "bug master"
-msgstr "Bug-Master"
-
 msgid "artist"
 msgstr "Künstler"
 
@@ -12510,6 +12521,9 @@
 msgid "Maithili"
 msgstr "Maithili"
 
+msgid "Meadow Mari"
+msgstr "Wiesen-Mari"
+
 msgid "Macedonian"
 msgstr "Makedonisch"
 
@@ -12911,7 +12925,7 @@
 msgstr "Verbleibende Zeit:"
 
 msgid "Close this window when all transfers _finish"
-msgstr "S_chließe dieses Fenster, wenn alle Übertragungen abgeschlossen sind"
+msgstr "Sc_hließe dieses Fenster, wenn alle Übertragungen abgeschlossen sind"
 
 msgid "C_lear finished transfers"
 msgstr "_Entferne komplette Übertragungen"
@@ -13448,10 +13462,10 @@
 msgstr "Budd_y-Name:"
 
 msgid "Si_gns on"
-msgstr "si_ch angemeldet"
+msgstr "si_ch anmeldet"
 
 msgid "Signs o_ff"
-msgstr "sich abgemel_det"
+msgstr "sich abmel_det"
 
 msgid "Goes a_way"
 msgstr "hinausgeh_t"
@@ -15662,15 +15676,3 @@
 
 msgid "You do not have permission to uninstall this application."
 msgstr "Sie haben keine Berechtigung, diese Anwendung zu deinstallieren."
-
-#~ msgid "Error requesting %s"
-#~ msgstr "Fehler beim Anfordern von %s"
-
-#~ msgid "An error occurred on the in-band bytestream transfer\n"
-#~ msgstr "Bei der In-Band-Bytestrom-Übertragung trat ein Fehler auf\n"
-
-#~ msgid "Transfer was closed."
-#~ msgstr "Übertragung wurde geschlossen."
-
-#~ msgid "Failed to open in-band bytestream"
-#~ msgstr "Öffnen des In-Band-Bytestroms fehlgeschlagen"
--- a/po/el.po	Tue Dec 21 21:05:26 2010 +0900
+++ b/po/el.po	Sat Feb 12 04:17:09 2011 +0900
@@ -18,7 +18,7 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: Plural-Forms:  nplurals=2; plural=(n != 1)\n"
+"Plural-Forms: nplurals=2; plural=(n != 1)\n"
 "X-Generator: Lokalize 0.3\n"
 
 #. Translators may want to transliterate the name.
--- a/po/en_AU.po	Tue Dec 21 21:05:26 2010 +0900
+++ b/po/en_AU.po	Sat Feb 12 04:17:09 2011 +0900
@@ -16,7 +16,7 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=n>1;\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 #. Translators may want to transliterate the name.
 #. It is not to be translated.
--- a/po/en_GB.po	Tue Dec 21 21:05:26 2010 +0900
+++ b/po/en_GB.po	Sat Feb 12 04:17:09 2011 +0900
@@ -7,15 +7,15 @@
 msgstr ""
 "Project-Id-Version: Pidgin 2.0\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-12-19 13:33-0500\n"
-"PO-Revision-Date: 2010-11-29 13:51-0000\n"
+"POT-Creation-Date: 2010-12-26 22:11-0500\n"
+"PO-Revision-Date: 2010-12-22 08:56-0000\n"
 "Last-Translator: Philip Hannent <phil@hannent.co.uk>\n"
 "Language-Team:  <en_GB@li.org>\n"
 "Language: \n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=n>1;\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 #. Translators may want to transliterate the name.
 #. It is not to be translated.
@@ -5387,14 +5387,15 @@
 msgid "You are not signed in from any other locations."
 msgstr "You are not signed in from any other locations."
 
-#, fuzzy
 msgid "Allow multiple logins?"
-msgstr "Allow multiple instances"
+msgstr "Allow multiple logins?"
 
 msgid ""
 "Do you want to allow or disallow connecting from multiple locations "
 "simultaneously?"
 msgstr ""
+"Do you want to allow or disallow connecting from multiple locations "
+"simultaneously?"
 
 msgid "Allow"
 msgstr "Allow"
@@ -5497,9 +5498,8 @@
 msgid "Enable/Disable Mobile Devices..."
 msgstr "Enable/Disable Mobile Devices..."
 
-#, fuzzy
 msgid "Allow/Disallow Multiple Logins..."
-msgstr "Allow/Disallow Mobile Pages..."
+msgstr "Allow/Disallow Multiple Logins..."
 
 msgid "Allow/Disallow Mobile Pages..."
 msgstr "Allow/Disallow Mobile Pages..."
@@ -5719,7 +5719,7 @@
 msgstr "Allow direct connections"
 
 msgid "Allow connecting from multiple locations"
-msgstr ""
+msgstr "Allow connecting from multiple locations"
 
 msgid "nudge: nudge a user to get their attention"
 msgstr "nudge: nudge a user to get their attention"
@@ -13884,7 +13884,7 @@
 msgstr "Google Talk"
 
 msgid "Facebook (XMPP)"
-msgstr ""
+msgstr "Facebook (XMPP)"
 
 #, c-format
 msgid "The following error has occurred loading %s: %s"
--- a/po/es.po	Tue Dec 21 21:05:26 2010 +0900
+++ b/po/es.po	Sat Feb 12 04:17:09 2011 +0900
@@ -7,7 +7,7 @@
 #               <franciscojavier.fernandez.serrador@hispalinux.es>, 2003.
 # Copyright (C) February 2010, Francisco Javier F. Serrador <fserrador@gmail.com>
 # Copyright (C) June 2002, April 2003, January 2004, March 2004, September 2004,
-# 	      January 2005, 2006-2008, July 2009, July 2010, August 2010
+# 	      January 2005, 2006-2008, July 2009, July 2010, August 2010, January 2011
 # 		Javier Fernández-Sanguino Peña  <jfs@debian.org>
 #
 # Agradecemos la ayuda de revisión realizada por:
@@ -53,8 +53,8 @@
 msgstr ""
 "Project-Id-Version: Pidgin\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-12-19 13:33-0500\n"
-"PO-Revision-Date: 2010-12-15 03:32+0100\n"
+"POT-Creation-Date: 2011-02-02 23:34-0500\n"
+"PO-Revision-Date: 2011-01-30 21:28+0100\n"
 "Last-Translator: Javier Fernández-Sanguino <jfs@debian.org>\n"
 "Language-Team:  Spanish team <es@li.org>\n"
 "Language: \n"
@@ -2475,10 +2475,12 @@
 "Ruta donde se guardarán los archivos\n"
 "(Debe dar la ruta completa)"
 
-msgid "Automatically reject from users not in buddy list"
-msgstr ""
-"Rechazar automáticamente las transferencias de usuarios que no están en mi "
-"lista de amigos"
+msgid ""
+"When a file-transfer request arrives from a user who is\n"
+"*not* on your buddy list:"
+msgstr ""
+"Cuando llega una solicitud de transferencia de un usuario que\n"
+"*no* está en su lista de amigos:"
 
 msgid ""
 "Notify with a popup when an autoaccepted file transfer is complete\n"
@@ -2491,6 +2493,9 @@
 msgid "Create a new directory for each user"
 msgstr "Crear un directorio para cada usuario"
 
+msgid "Escape the filenames"
+msgstr "Indentar los nombres de fichero"
+
 msgid "Notes"
 msgstr "Notas"
 
@@ -3954,7 +3959,10 @@
 msgid "Server requires plaintext authentication over an unencrypted stream"
 msgstr "El servidor solicita autenticación en claro sobre un canal no cifrado"
 
-#. This should never happen!
+#. This happens when the server sends back jibberish
+#. * in the "additional data with success" case.
+#. * Seen with Wildfire 3.0.1.
+#.
 msgid "Invalid response from server"
 msgstr "Respuesta inválida del servidor"
 
@@ -6298,6 +6306,20 @@
 msgid "Retrieving User Information..."
 msgstr "Obteniendo la información del usuario..."
 
+#. you were kicked
+msgid "You have been kicked from this MultiMX."
+msgstr "Ha sido expulsado de este MultiMX."
+
+msgid "was kicked"
+msgstr "fue expulsado"
+
+msgid "_Room Name:"
+msgstr "Nombre de _Sala:"
+
+#. Display system message in chat window
+msgid "You have invited"
+msgstr "Ha sido invitado"
+
 msgid "Loading menu..."
 msgstr "Cargando el menú..."
 
@@ -6325,20 +6347,6 @@
 msgid "Enable splash-screen popup"
 msgstr "Activar la pantalla de bienvenida"
 
-#. you were kicked
-msgid "You have been kicked from this MultiMX."
-msgstr "Ha sido expulsado de este MultiMX."
-
-msgid "was kicked"
-msgstr "fue expulsado"
-
-msgid "_Room Name:"
-msgstr "Nombre de _Sala:"
-
-#. Display system message in chat window
-msgid "You have invited"
-msgstr "Ha sido invitado"
-
 msgid "Last Online"
 msgstr "Última conexión"
 
@@ -8007,75 +8015,6 @@
 "para Imágenes de MI.  Como su dirección IP será revelada, puede considerarse "
 "esto como un riesgo a su privacidad."
 
-msgid "Invalid SNAC"
-msgstr "SNAC inválido"
-
-msgid "Server rate limit exceeded"
-msgstr "Se excedió el límite de tasa del servidor"
-
-msgid "Client rate limit exceeded"
-msgstr "Se excedió el límite de tasa del cliente"
-
-msgid "Service unavailable"
-msgstr "Servicio no disponible"
-
-msgid "Service not defined"
-msgstr "Servicio no definido"
-
-msgid "Obsolete SNAC"
-msgstr "SNAC obsoleto"
-
-msgid "Not supported by host"
-msgstr "No soportado por el servidor"
-
-msgid "Not supported by client"
-msgstr "No soportado por el cliente"
-
-msgid "Refused by client"
-msgstr "Rechazado por el cliente"
-
-msgid "Reply too big"
-msgstr "Respuesta demasiado grande"
-
-msgid "Responses lost"
-msgstr "Respuestas perdidas"
-
-msgid "Request denied"
-msgstr "Solicitud denegada"
-
-msgid "Busted SNAC payload"
-msgstr "Carga de SNAC destrozada"
-
-msgid "Insufficient rights"
-msgstr "Derechos insuficientes"
-
-msgid "In local permit/deny"
-msgstr "En la lista local de autorizar/negar"
-
-msgid "Warning level too high (sender)"
-msgstr "Nivel de aviso demasiado alto (emisor)"
-
-msgid "Warning level too high (receiver)"
-msgstr "Nivel de aviso demasiado alto (receptor)"
-
-msgid "User temporarily unavailable"
-msgstr "Usuario temporalmente no disponible"
-
-msgid "No match"
-msgstr "No hubo coincidencia"
-
-msgid "List overflow"
-msgstr "Desbordamiento de la lista"
-
-msgid "Request ambiguous"
-msgstr "Solicitud ambigua"
-
-msgid "Queue full"
-msgstr "Cola llena"
-
-msgid "Not while on AOL"
-msgstr "No mientras esté en AOL"
-
 #. Label
 msgid "Buddy Icon"
 msgstr "Icono de amigo"
@@ -8194,6 +8133,75 @@
 msgid "Capabilities"
 msgstr "Capacidades"
 
+msgid "Invalid SNAC"
+msgstr "SNAC inválido"
+
+msgid "Server rate limit exceeded"
+msgstr "Se excedió el límite de tasa del servidor"
+
+msgid "Client rate limit exceeded"
+msgstr "Se excedió el límite de tasa del cliente"
+
+msgid "Service unavailable"
+msgstr "Servicio no disponible"
+
+msgid "Service not defined"
+msgstr "Servicio no definido"
+
+msgid "Obsolete SNAC"
+msgstr "SNAC obsoleto"
+
+msgid "Not supported by host"
+msgstr "No soportado por el servidor"
+
+msgid "Not supported by client"
+msgstr "No soportado por el cliente"
+
+msgid "Refused by client"
+msgstr "Rechazado por el cliente"
+
+msgid "Reply too big"
+msgstr "Respuesta demasiado grande"
+
+msgid "Responses lost"
+msgstr "Respuestas perdidas"
+
+msgid "Request denied"
+msgstr "Solicitud denegada"
+
+msgid "Busted SNAC payload"
+msgstr "Carga de SNAC destrozada"
+
+msgid "Insufficient rights"
+msgstr "Derechos insuficientes"
+
+msgid "In local permit/deny"
+msgstr "En la lista local de autorizar/negar"
+
+msgid "Warning level too high (sender)"
+msgstr "Nivel de aviso demasiado alto (emisor)"
+
+msgid "Warning level too high (receiver)"
+msgstr "Nivel de aviso demasiado alto (receptor)"
+
+msgid "User temporarily unavailable"
+msgstr "Usuario temporalmente no disponible"
+
+msgid "No match"
+msgstr "No hubo coincidencia"
+
+msgid "List overflow"
+msgstr "Desbordamiento de la lista"
+
+msgid "Request ambiguous"
+msgstr "Solicitud ambigua"
+
+msgid "Queue full"
+msgstr "Cola llena"
+
+msgid "Not while on AOL"
+msgstr "No mientras esté en AOL"
+
 #. Translators: This string is a menu option that, if selected, will cause
 #. you to appear online to the chosen user even when your status is set to
 #. Invisible.
@@ -8786,14 +8794,14 @@
 msgid "Select Server"
 msgstr "Seleccionar servidor"
 
-msgid "QQ2005"
-msgstr "QQ2005"
+msgid "QQ2008"
+msgstr "QQ2008"
 
 msgid "QQ2007"
 msgstr "QQ2007"
 
-msgid "QQ2008"
-msgstr "QQ2008"
+msgid "QQ2005"
+msgstr "QQ2005"
 
 msgid "Connect by TCP"
 msgstr "Conectar por TCP"
@@ -12353,9 +12361,6 @@
 msgid "Fatal Error"
 msgstr "Error fatal"
 
-msgid "bug master"
-msgstr "maestro de las erratas"
-
 msgid "artist"
 msgstr "artista"
 
@@ -12536,6 +12541,9 @@
 msgid "Maithili"
 msgstr "Maithili"
 
+msgid "Meadow Mari"
+msgstr "Mari"
+
 msgid "Macedonian"
 msgstr "Macedonio"
 
@@ -15685,6 +15693,14 @@
 msgid "You do not have permission to uninstall this application."
 msgstr "No tiene permisos para desinstalar esta aplicación."
 
+#~ msgid "Automatically reject from users not in buddy list"
+#~ msgstr ""
+#~ "Rechazar automáticamente las transferencias de usuarios que no están en "
+#~ "mi lista de amigos"
+
+#~ msgid "bug master"
+#~ msgstr "maestro de las erratas"
+
 #~ msgid "Error requesting %s"
 #~ msgstr "Error al solicitar %s"
 
@@ -15757,20 +15773,20 @@
 #~ msgstr "Album"
 
 #~ msgid "Current Mood"
-#~ msgstr "Luna actual"
+#~ msgstr "Estado de ánimo actual"
 
 #~ msgid "New Mood"
-#~ msgstr "Luna nueva"
+#~ msgstr "Nuevo estado de ánimo"
 
 #~ msgid "Change your Mood"
-#~ msgstr "Cambiar su luna"
+#~ msgstr "Cambiar su estado de ánimo"
 
 #~ msgid "How do you feel right now?"
 #~ msgstr "¿Cómo se encuentra justo ahora?"
 
 #, fuzzy
 #~ msgid "Change Mood..."
-#~ msgstr "Cambiar su contraseña..."
+#~ msgstr "Cambiar su estado de ánimo..."
 
 #~ msgid "Pager server"
 #~ msgstr "Servidor buscapersonas"
--- a/po/eu.po	Tue Dec 21 21:05:26 2010 +0900
+++ b/po/eu.po	Sat Feb 12 04:17:09 2011 +0900
@@ -16,7 +16,7 @@
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "X-Generator: KBabel 1.9.1\n"
-"Plural-Forms: Plural-Forms: Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
 
 #. Translators may want to transliterate the name.
 #. It is not to be translated.
--- a/po/fr.po	Tue Dec 21 21:05:26 2010 +0900
+++ b/po/fr.po	Sat Feb 12 04:17:09 2011 +0900
@@ -4,7 +4,7 @@
 # Copyright (C) 2002, Stéphane Pontier <stephane.pontier@free.fr>
 # Copyright (C) 2002, Stéphane Wirtel <stephane.wirtel@belgacom.net>
 # Copyright (C) 2002, Loïc Jeannin <loic.jeannin@free.fr>
-# Copyright (C) 2002-2010, Éric Boumaour <zongo_fr@users.sourceforge.net>
+# Copyright (C) 2002-2011, Éric Boumaour <zongo_fr@users.sourceforge.net>
 #
 # This file is distributed under the same license as the Pidgin package.
 #
@@ -21,14 +21,14 @@
 msgstr ""
 "Project-Id-Version: Pidgin\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-12-19 13:33-0500\n"
-"PO-Revision-Date: 2010-12-16 23:25+0100\n"
+"POT-Creation-Date: 2011-01-30 21:28+0100\n"
+"PO-Revision-Date: 2011-01-30 21:14+0100\n"
 "Last-Translator: Éric Boumaour <zongo_fr@users.sourceforge.net>\n"
 "Language-Team: fr <fr@li.org>\n"
-"Language: \n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"Language: \n"
 "Plural-Forms: nplurals=2; plural=n>1;\n"
 
 #. Translators may want to transliterate the name.
@@ -864,8 +864,8 @@
 "System events will only be logged if the \"Log all status changes to system "
 "log\" preference is enabled."
 msgstr ""
-"Les événements système ne seront archivés que si l'option « Archiver tous "
-"les changements d'état dans les archives système » est activée."
+"Les événements système ne seront archivés que si l'option « Archiver tous les "
+"changements d'état dans les archives système » est activée."
 
 msgid ""
 "Instant messages will only be logged if the \"Log all instant messages\" "
@@ -2372,9 +2372,12 @@
 "Dossier où placer les fichiers\n"
 "(Veuillez fournir le chemin complet)"
 
-msgid "Automatically reject from users not in buddy list"
-msgstr ""
-"Refuser automatiquement si l'utilisateur n'est pas dans ma liste de contacts"
+msgid ""
+"When a file-transfer request arrives from a user who is\n"
+"*not* on your buddy list:"
+msgstr ""
+"Quand une demande de transfert arrive de quelqu'un qui\n"
+"n'est *pas* dans la liste de contacts :"
 
 msgid ""
 "Notify with a popup when an autoaccepted file transfer is complete\n"
@@ -2387,6 +2390,9 @@
 msgid "Create a new directory for each user"
 msgstr "Créer un nouveau dossier pour chaque contact"
 
+msgid "Escape the filenames"
+msgstr "Encoder les noms des fichiers"
+
 msgid "Notes"
 msgstr "Notes"
 
@@ -2767,8 +2773,7 @@
 msgstr "Message déconnecté"
 
 msgid "You can edit/delete the pounce from the `Buddy Pounces' dialog"
-msgstr ""
-"Vous pouvez modifier ou supprimer l'alerte dans la fenêtre « Alertes »."
+msgstr "Vous pouvez modifier ou supprimer l'alerte dans la fenêtre « Alertes »."
 
 msgid "Yes"
 msgstr "Oui"
@@ -3859,7 +3864,10 @@
 "Le serveur demande une authentification en texte non chiffré au travers d'un "
 "flux crypté."
 
-#. This should never happen!
+#. This happens when the server sends back jibberish
+#. * in the "additional data with success" case.
+#. * Seen with Wildfire 3.0.1.
+#.
 msgid "Invalid response from server"
 msgstr "Réponse non valide du serveur"
 
@@ -6197,6 +6205,20 @@
 msgid "Retrieving User Information..."
 msgstr "Récupération des informations de l'utilisateur..."
 
+#. you were kicked
+msgid "You have been kicked from this MultiMX."
+msgstr "Vous avez été expulsé de ce MultiMX."
+
+msgid "was kicked"
+msgstr "a été expulsé"
+
+msgid "_Room Name:"
+msgstr "_Salon :"
+
+#. Display system message in chat window
+msgid "You have invited"
+msgstr "Vous avez été invité"
+
 msgid "Loading menu..."
 msgstr "Chargement du menu..."
 
@@ -6224,20 +6246,6 @@
 msgid "Enable splash-screen popup"
 msgstr "Activer l'affichage de la bannière"
 
-#. you were kicked
-msgid "You have been kicked from this MultiMX."
-msgstr "Vous avez été expulsé de ce MultiMX."
-
-msgid "was kicked"
-msgstr "a été expulsé"
-
-msgid "_Room Name:"
-msgstr "_Salon :"
-
-#. Display system message in chat window
-msgid "You have invited"
-msgstr "Vous avez été invité"
-
 msgid "Last Online"
 msgstr "En ligne dernièrement"
 
@@ -7908,75 +7916,6 @@
 "d'images. Votre adresse IP sera révélée et ceci peut être considéré comme "
 "une faille de sécurité."
 
-msgid "Invalid SNAC"
-msgstr "SNAC non valide"
-
-msgid "Server rate limit exceeded"
-msgstr "Vitesse du serveur dépassée"
-
-msgid "Client rate limit exceeded"
-msgstr "Vitesse du client dépassée"
-
-msgid "Service unavailable"
-msgstr "Service non disponible"
-
-msgid "Service not defined"
-msgstr "Service non défini"
-
-msgid "Obsolete SNAC"
-msgstr "SNAC obsolète"
-
-msgid "Not supported by host"
-msgstr "Non supporté par l'hôte"
-
-msgid "Not supported by client"
-msgstr "Non supporté par le client"
-
-msgid "Refused by client"
-msgstr "Refusé par le client"
-
-msgid "Reply too big"
-msgstr "Réponse trop grosse"
-
-msgid "Responses lost"
-msgstr "Réponses perdues"
-
-msgid "Request denied"
-msgstr "Requête refusée"
-
-msgid "Busted SNAC payload"
-msgstr "Charge SNAC incorrecte"
-
-msgid "Insufficient rights"
-msgstr "Droits insuffisants"
-
-msgid "In local permit/deny"
-msgstr "Dans l'autorisation/interdiction locale"
-
-msgid "Warning level too high (sender)"
-msgstr "Niveau d'avertissement trop élevé (émission)"
-
-msgid "Warning level too high (receiver)"
-msgstr "Niveau d'avertissement trop élevé (réception)"
-
-msgid "User temporarily unavailable"
-msgstr "L'utilisateur est temporairement indisponible."
-
-msgid "No match"
-msgstr "Aucun résultat"
-
-msgid "List overflow"
-msgstr "Dépassement de liste"
-
-msgid "Request ambiguous"
-msgstr "Requête ambiguë"
-
-msgid "Queue full"
-msgstr "File d'attente pleine"
-
-msgid "Not while on AOL"
-msgstr "Impossible sur AOL"
-
 #. Label
 msgid "Buddy Icon"
 msgstr "Icône du contact"
@@ -8095,6 +8034,75 @@
 msgid "Capabilities"
 msgstr "Possibilités"
 
+msgid "Invalid SNAC"
+msgstr "SNAC non valide"
+
+msgid "Server rate limit exceeded"
+msgstr "Vitesse du serveur dépassée"
+
+msgid "Client rate limit exceeded"
+msgstr "Vitesse du client dépassée"
+
+msgid "Service unavailable"
+msgstr "Service non disponible"
+
+msgid "Service not defined"
+msgstr "Service non défini"
+
+msgid "Obsolete SNAC"
+msgstr "SNAC obsolète"
+
+msgid "Not supported by host"
+msgstr "Non supporté par l'hôte"
+
+msgid "Not supported by client"
+msgstr "Non supporté par le client"
+
+msgid "Refused by client"
+msgstr "Refusé par le client"
+
+msgid "Reply too big"
+msgstr "Réponse trop grosse"
+
+msgid "Responses lost"
+msgstr "Réponses perdues"
+
+msgid "Request denied"
+msgstr "Requête refusée"
+
+msgid "Busted SNAC payload"
+msgstr "Charge SNAC incorrecte"
+
+msgid "Insufficient rights"
+msgstr "Droits insuffisants"
+
+msgid "In local permit/deny"
+msgstr "Dans l'autorisation/interdiction locale"
+
+msgid "Warning level too high (sender)"
+msgstr "Niveau d'avertissement trop élevé (émission)"
+
+msgid "Warning level too high (receiver)"
+msgstr "Niveau d'avertissement trop élevé (réception)"
+
+msgid "User temporarily unavailable"
+msgstr "L'utilisateur est temporairement indisponible."
+
+msgid "No match"
+msgstr "Aucun résultat"
+
+msgid "List overflow"
+msgstr "Dépassement de liste"
+
+msgid "Request ambiguous"
+msgstr "Requête ambiguë"
+
+msgid "Queue full"
+msgstr "File d'attente pleine"
+
+msgid "Not while on AOL"
+msgstr "Impossible sur AOL"
+
 #. Translators: This string is a menu option that, if selected, will cause
 #. you to appear online to the chosen user even when your status is set to
 #. Invisible.
@@ -8686,14 +8694,14 @@
 msgid "Select Server"
 msgstr "Choisir le serveur"
 
-msgid "QQ2005"
-msgstr "QQ2005"
+msgid "QQ2008"
+msgstr "QQ2008"
 
 msgid "QQ2007"
 msgstr "QQ2007"
 
-msgid "QQ2008"
-msgstr "QQ2008"
+msgid "QQ2005"
+msgstr "QQ2005"
 
 msgid "Connect by TCP"
 msgstr "Connexion par TCP"
@@ -10445,8 +10453,8 @@
 msgstr ""
 "Le serveur Yahoo! a demandé une méthode d'authentification non reconnue. "
 "Cette version de l'application n'arrivera probablement pas à se connecter au "
-"service Yahoo!. Vous pouvez vérifier qu'une mise à jour est disponible sur "
-"%s."
+"service Yahoo!. Vous pouvez vérifier qu'une mise à jour est disponible sur %"
+"s."
 
 msgid "Failed Yahoo! Authentication"
 msgstr "Échec de l'authentification Yahoo!"
@@ -12257,9 +12265,6 @@
 msgid "Fatal Error"
 msgstr "Erreur critique"
 
-msgid "bug master"
-msgstr "maitre des bogues"
-
 msgid "artist"
 msgstr "artiste"
 
@@ -12439,6 +12444,9 @@
 msgid "Maithili"
 msgstr "Maïhili"
 
+msgid "Meadow Mari"
+msgstr "Mari des prairies"
+
 msgid "Macedonian"
 msgstr "Macédonien"
 
@@ -12559,8 +12567,8 @@
 "to multiple messaging services at once.  %s is written in C using GTK+.  %s "
 "is released, and may be modified and redistributed,  under the terms of the "
 "GPL version 2 (or later).  A copy of the GPL is distributed with %s.  %s is "
-"copyrighted by its contributors, a list of whom is also distributed with "
-"%s.  There is no warranty for %s.<BR><BR>"
+"copyrighted by its contributors, a list of whom is also distributed with %"
+"s.  There is no warranty for %s.<BR><BR>"
 msgstr ""
 "%s est un client de messagerie basé sur libpurple capable de se connecter à "
 "de multiples services de messageries instantanées. %s est écrit en C et "
@@ -13115,16 +13123,16 @@
 
 #, c-format
 msgid ""
-"Are you sure you want to permanently delete the log of the conversation in "
-"%s which started at %s?"
+"Are you sure you want to permanently delete the log of the conversation in %"
+"s which started at %s?"
 msgstr ""
 "Êtes-vous sûr de vouloir supprimer les archives de la conversation dans %s "
 "datée du %s ?"
 
 #, c-format
 msgid ""
-"Are you sure you want to permanently delete the system log which started at "
-"%s?"
+"Are you sure you want to permanently delete the system log which started at %"
+"s?"
 msgstr "Êtes-vous sûr de vouloir supprimer les archives système datées du %s ?"
 
 msgid "Delete Log?"
@@ -14956,8 +14964,8 @@
 "'Enter' in the entry box to send. Watch the debug window."
 msgstr ""
 "Permet d'envoyer des données brutes aux protocoles en mode texte (XMPP, MSN, "
-"IRC, TOC). Tapez « Entrée » dans la boîte de saisie pour envoyer. Observez "
-"le résultat dans la fenêtre de debug."
+"IRC, TOC). Tapez « Entrée » dans la boîte de saisie pour envoyer. Observez le "
+"résultat dans la fenêtre de debug."
 
 #, c-format
 msgid "You can upgrade to %s %s today."
@@ -15485,13 +15493,13 @@
 #, no-c-format
 msgid ""
 "Error Installing Spellchecking ($R3).$\\rIf retrying fails, manual "
-"installation instructions are at: http://developer.pidgin.im/wiki/Installing"
-"%20Pidgin#manual_win32_spellcheck_installation"
+"installation instructions are at: http://developer.pidgin.im/wiki/Installing%"
+"20Pidgin#manual_win32_spellcheck_installation"
 msgstr ""
 "Erreur lors de l'installation du correcteur orthographique ($R3).$\\rSi une "
 "nouvelle tentative échoue, veuillez suivre les instructions sur http://"
-"developer.pidgin.im/wiki/Installing"
-"%20Pidgin#manual_win32_spellcheck_installation"
+"developer.pidgin.im/wiki/Installing%"
+"20Pidgin#manual_win32_spellcheck_installation"
 
 #. Installer Subsection Text
 msgid "GTK+ Runtime (required if not present)"
@@ -15570,6 +15578,14 @@
 msgid "You do not have permission to uninstall this application."
 msgstr "Vous n'avez pas les permissions pour supprimer cette application."
 
+#~ msgid "Automatically reject from users not in buddy list"
+#~ msgstr ""
+#~ "Refuser automatiquement si l'utilisateur n'est pas dans ma liste de "
+#~ "contacts"
+
+#~ msgid "bug master"
+#~ msgstr "maitre des bogues"
+
 #~ msgid "An error occurred on the in-band bytestream transfer\n"
 #~ msgstr "Erreur lors du transfert dans le flux de données in-band.\n"
 
--- a/po/gl.po	Tue Dec 21 21:05:26 2010 +0900
+++ b/po/gl.po	Sat Feb 12 04:17:09 2011 +0900
@@ -18,7 +18,7 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
 "X-Generator: KBabel 1.11.4\n"
 
 #. Translators may want to transliterate the name.
--- a/po/he.po	Tue Dec 21 21:05:26 2010 +0900
+++ b/po/he.po	Sat Feb 12 04:17:09 2011 +0900
@@ -8,8 +8,8 @@
 msgstr ""
 "Project-Id-Version: he\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-12-19 13:33-0500\n"
-"PO-Revision-Date: 2010-12-16 16:39+0200\n"
+"POT-Creation-Date: 2011-02-02 23:34-0500\n"
+"PO-Revision-Date: 2011-01-26 08:34+0200\n"
 "Last-Translator: Shalom Craimer <scraimer at g mail dot com>\n"
 "Language-Team: Hebrew <he@li.org>\n"
 "Language: he\n"
@@ -2278,8 +2278,12 @@
 "נתיב לשמור בו את הקבצים\n"
 "(יש לספק נתיב מלא)"
 
-msgid "Automatically reject from users not in buddy list"
-msgstr "דחה אוטומטית ממשתמשים שאינם ברשימת החברים שלי"
+msgid ""
+"When a file-transfer request arrives from a user who is\n"
+"*not* on your buddy list:"
+msgstr ""
+"כאשר מגיעה בקשה להעברת-קובץ ממשתמש\n"
+"אשר *אינו* ברשימת החברים שלך:"
 
 msgid ""
 "Notify with a popup when an autoaccepted file transfer is complete\n"
@@ -2291,6 +2295,9 @@
 msgid "Create a new directory for each user"
 msgstr "צור ספרייה חדשה עבור כל משתמש"
 
+msgid "Escape the filenames"
+msgstr "קדד אותיות בעייתיות בשמות הקבצים"
+
 msgid "Notes"
 msgstr "הערות"
 
@@ -3724,7 +3731,10 @@
 msgid "Server requires plaintext authentication over an unencrypted stream"
 msgstr "השרת דורש אימות לא מוצפן מעל תקשורת לא מוצפנת"
 
-#. This should never happen!
+#. This happens when the server sends back jibberish
+#. * in the "additional data with success" case.
+#. * Seen with Wildfire 3.0.1.
+#.
 msgid "Invalid response from server"
 msgstr "תגובה לא תקפה מהשרת"
 
@@ -5980,6 +5990,20 @@
 msgid "Retrieving User Information..."
 msgstr "שולף מידע משתמש..."
 
+#. you were kicked
+msgid "You have been kicked from this MultiMX."
+msgstr "נבעטת מתוך MultiMX זה."
+
+msgid "was kicked"
+msgstr "נבעט/ה"
+
+msgid "_Room Name:"
+msgstr "שם _חדר:"
+
+#. Display system message in chat window
+msgid "You have invited"
+msgstr "הוזמנת"
+
 msgid "Loading menu..."
 msgstr "טוען תפריט..."
 
@@ -6007,20 +6031,6 @@
 msgid "Enable splash-screen popup"
 msgstr "אפשר פתיחת חלון-הקדמה"
 
-#. you were kicked
-msgid "You have been kicked from this MultiMX."
-msgstr "נבעטת מתוך MultiMX זה."
-
-msgid "was kicked"
-msgstr "נבעט/ה"
-
-msgid "_Room Name:"
-msgstr "שם _חדר:"
-
-#. Display system message in chat window
-msgid "You have invited"
-msgstr "הוזמנת"
-
 msgid "Last Online"
 msgstr "חיבור אחרון"
 
@@ -7620,75 +7630,6 @@
 "זה דורש חיבור ישיר בין שני המחשבים, ונחוץ עבור תמונות בהודעות. מכיוון שכתובת "
 "ה-IP שלך תיחשף, ייתכן וזה ייחשב כסיכון לפרטיותך."
 
-msgid "Invalid SNAC"
-msgstr "SNAC לא תקף"
-
-msgid "Server rate limit exceeded"
-msgstr "הפרזת מעבר למגבלת השרת"
-
-msgid "Client rate limit exceeded"
-msgstr "הפרזת מעבר למגבלת הלקוח"
-
-msgid "Service unavailable"
-msgstr "השירות אינו זמין"
-
-msgid "Service not defined"
-msgstr "שירות אינו מוגדר"
-
-msgid "Obsolete SNAC"
-msgstr "SNAC מיושן"
-
-msgid "Not supported by host"
-msgstr "לא נתמך על-ידי השרת"
-
-msgid "Not supported by client"
-msgstr "לא נתמך על-ידי הלקוח"
-
-msgid "Refused by client"
-msgstr "החיבור נדחה על ידי הלקוח."
-
-msgid "Reply too big"
-msgstr "המענה גדול מדיי"
-
-msgid "Responses lost"
-msgstr "אבדו המשובים"
-
-msgid "Request denied"
-msgstr "הבקשה נדחית"
-
-msgid "Busted SNAC payload"
-msgstr "מידע פגום ב-SNAC"
-
-msgid "Insufficient rights"
-msgstr "אין די הרשאות"
-
-msgid "In local permit/deny"
-msgstr "באישור/שלילה מקומיים"
-
-msgid "Warning level too high (sender)"
-msgstr "רמת אזהרה גבוהה מדי (שולח("
-
-msgid "Warning level too high (receiver)"
-msgstr "רמת אזהרה גבוהה מדי (מקבל)"
-
-msgid "User temporarily unavailable"
-msgstr "המשתמש אינו זמין כרגע"
-
-msgid "No match"
-msgstr "אין התאמה"
-
-msgid "List overflow"
-msgstr "גלישת מגבולות הרשימה"
-
-msgid "Request ambiguous"
-msgstr "בקשה לא ברורה"
-
-msgid "Queue full"
-msgstr "התור מלא"
-
-msgid "Not while on AOL"
-msgstr "לא בזמן שהות ב-AOL"
-
 #. Label
 msgid "Buddy Icon"
 msgstr "סמל איש הקשר"
@@ -7807,6 +7748,75 @@
 msgid "Capabilities"
 msgstr "יכולות"
 
+msgid "Invalid SNAC"
+msgstr "SNAC לא תקף"
+
+msgid "Server rate limit exceeded"
+msgstr "הפרזת מעבר למגבלת השרת"
+
+msgid "Client rate limit exceeded"
+msgstr "הפרזת מעבר למגבלת הלקוח"
+
+msgid "Service unavailable"
+msgstr "השירות אינו זמין"
+
+msgid "Service not defined"
+msgstr "שירות אינו מוגדר"
+
+msgid "Obsolete SNAC"
+msgstr "SNAC מיושן"
+
+msgid "Not supported by host"
+msgstr "לא נתמך על-ידי השרת"
+
+msgid "Not supported by client"
+msgstr "לא נתמך על-ידי הלקוח"
+
+msgid "Refused by client"
+msgstr "החיבור נדחה על ידי הלקוח."
+
+msgid "Reply too big"
+msgstr "המענה גדול מדיי"
+
+msgid "Responses lost"
+msgstr "אבדו המשובים"
+
+msgid "Request denied"
+msgstr "הבקשה נדחית"
+
+msgid "Busted SNAC payload"
+msgstr "מידע פגום ב-SNAC"
+
+msgid "Insufficient rights"
+msgstr "אין די הרשאות"
+
+msgid "In local permit/deny"
+msgstr "באישור/שלילה מקומיים"
+
+msgid "Warning level too high (sender)"
+msgstr "רמת אזהרה גבוהה מדי (שולח("
+
+msgid "Warning level too high (receiver)"
+msgstr "רמת אזהרה גבוהה מדי (מקבל)"
+
+msgid "User temporarily unavailable"
+msgstr "המשתמש אינו זמין כרגע"
+
+msgid "No match"
+msgstr "אין התאמה"
+
+msgid "List overflow"
+msgstr "גלישת מגבולות הרשימה"
+
+msgid "Request ambiguous"
+msgstr "בקשה לא ברורה"
+
+msgid "Queue full"
+msgstr "התור מלא"
+
+msgid "Not while on AOL"
+msgstr "לא בזמן שהות ב-AOL"
+
 #. Translators: This string is a menu option that, if selected, will cause
 #. you to appear online to the chosen user even when your status is set to
 #. Invisible.
@@ -8398,14 +8408,14 @@
 msgid "Select Server"
 msgstr "בחר שרת"
 
-msgid "QQ2005"
-msgstr "QQ2005"
+msgid "QQ2008"
+msgstr "QQ2008"
 
 msgid "QQ2007"
 msgstr "QQ2007"
 
-msgid "QQ2008"
-msgstr "QQ2008"
+msgid "QQ2005"
+msgstr "QQ2005"
 
 msgid "Connect by TCP"
 msgstr "התחבר בעזרת TCP"
@@ -11881,9 +11891,6 @@
 msgid "Fatal Error"
 msgstr "שגיאה קטלנית"
 
-msgid "bug master"
-msgstr "שר-הבאגים"
-
 msgid "artist"
 msgstr "אמן"
 
@@ -12063,6 +12070,9 @@
 msgid "Maithili"
 msgstr "מאת'ילי"
 
+msgid "Meadow Mari"
+msgstr "Meadow Mari"
+
 msgid "Macedonian"
 msgstr "מקדונית"
 
@@ -15107,6 +15117,12 @@
 msgid "You do not have permission to uninstall this application."
 msgstr ".אין לך זכות למחוק תוכנה זאת"
 
+#~ msgid "Automatically reject from users not in buddy list"
+#~ msgstr "דחה אוטומטית ממשתמשים שאינם ברשימת החברים שלי"
+
+#~ msgid "bug master"
+#~ msgstr "שר-הבאגים"
+
 #~ msgid "An error occurred on the in-band bytestream transfer\n"
 #~ msgstr "ארעה שגיאה בעת ההעברה בזרם בתווך\n"
 
--- a/po/hu.po	Tue Dec 21 21:05:26 2010 +0900
+++ b/po/hu.po	Sat Feb 12 04:17:09 2011 +0900
@@ -1,22 +1,22 @@
 # Hungarian translation of pidgin.
-# Copyright (C) 2003, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+# Copyright (C) 2003, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
 # This file is distributed under the same license as the Pidgin package.
 # The Hungarian translation of Pidgin was sponsored by Novell Hungary, many thanks for it!
 #
 # Zoltan Sutto <suttozoltan@chello.hu>, 2003.
-# Gabor Kelemen <kelemeng at gnome dot hu>, 2005, 2006, 2007, 2008, 2009, 2010.
-msgid ""
-msgstr ""
-"Project-Id-Version: pidgin 2.7\n"
+# Gabor Kelemen <kelemeng at gnome dot hu>, 2005, 2006, 2007, 2008, 2009, 2010, 2011.
+msgid ""
+msgstr ""
+"Project-Id-Version: pidgin 2.7.10\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-12-19 13:33-0500\n"
-"PO-Revision-Date: 2010-11-21 03:10+0100\n"
+"POT-Creation-Date: 2011-01-25 15:12+0100\n"
+"PO-Revision-Date: 2011-01-25 15:12+0100\n"
 "Last-Translator: Gabor Kelemen <kelemeng at gnome dot hu>\n"
 "Language-Team: Hungarian <gnome at fsf dot hu>\n"
-"Language: \n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"Language: \n"
 "Plural-Forms:  nplurals=2; plural=(n != 1);\n"
 "X-Generator: KBabel 1.11.4\n"
 
@@ -2350,9 +2350,12 @@
 "A fájlok mentési útvonala\n"
 "(Teljes elérési utat adjon meg)"
 
-msgid "Automatically reject from users not in buddy list"
-msgstr ""
-"Automatikus visszautasítás a partnerlistán nem szereplő felhasználóktól"
+msgid ""
+"When a file-transfer request arrives from a user who is\n"
+"*not* on your buddy list:"
+msgstr ""
+"Ha fájlküldési kérés érkezik egy a partnerlistán NEM szereplő\n"
+"felhasználótól:"
 
 msgid ""
 "Notify with a popup when an autoaccepted file transfer is complete\n"
@@ -2365,6 +2368,9 @@
 msgid "Create a new directory for each user"
 msgstr "Új könyvtár létrehozása minden felhasználóhoz"
 
+msgid "Escape the filenames"
+msgstr "Fájlnevek escape-elése."
+
 msgid "Notes"
 msgstr "Megjegyzések"
 
@@ -3828,7 +3834,10 @@
 msgstr ""
 "A kiszolgáló szöveges hitelesítést követel meg egy nem titkosított csatornán"
 
-#. This should never happen!
+#. This happens when the server sends back jibberish
+#. * in the "additional data with success" case.
+#. * Seen with Wildfire 3.0.1.
+#.
 msgid "Invalid response from server"
 msgstr "Érvénytelen válasz a kiszolgálótól"
 
@@ -5438,18 +5447,16 @@
 #. a separate purple_request_field_label_new_without_colon function,
 #. or by never automatically adding the colon and requiring that
 #. callers add the colon themselves.
-#, fuzzy
 msgid "You are not signed in from any other locations."
-msgstr "Bejelentkezett egy másik helyről"
-
-#, fuzzy
+msgstr "Nincs bejelentkezve másik helyről."
+
 msgid "Allow multiple logins?"
-msgstr "Több példány engedélyezése"
+msgstr "Engedélyezi a többszörös bejelentkezést?"
 
 msgid ""
 "Do you want to allow or disallow connecting from multiple locations "
 "simultaneously?"
-msgstr ""
+msgstr "Engedélyezi a több helyről egyszerre történő kapcsolódást?"
 
 msgid "Allow"
 msgstr "Engedélyezés"
@@ -5554,9 +5561,8 @@
 msgid "Enable/Disable Mobile Devices..."
 msgstr "Mobileszközök engedélyezése/tiltása…"
 
-#, fuzzy
 msgid "Allow/Disallow Multiple Logins..."
-msgstr "Mobiloldalak engedélyezése/tiltása…"
+msgstr "Többszörös bejelentkezés engedélyezése/tiltása…"
 
 msgid "Allow/Disallow Mobile Pages..."
 msgstr "Mobiloldalak engedélyezése/tiltása…"
@@ -5778,7 +5784,7 @@
 msgstr "Közvetlen kapcsolatok engedélyezése"
 
 msgid "Allow connecting from multiple locations"
-msgstr ""
+msgstr "Több helyről való kapcsolódás engedélyezése"
 
 msgid "nudge: nudge a user to get their attention"
 msgstr "nudge: felhasználó megbökése figyelemfelhívási céllal"
@@ -6760,8 +6766,8 @@
 #, c-format
 msgid "Unable to send message. Could not get details for user (%s)."
 msgstr ""
-"Az üzenetet nem lehet elküldeni. A felhasználó részletei nem kérhetőek le "
-"(%s)."
+"Az üzenetet nem lehet elküldeni. A felhasználó részletei nem kérhetőek le (%"
+"s)."
 
 #, c-format
 msgid "Unable to add %s to your buddy list (%s)."
@@ -6957,9 +6963,8 @@
 msgid "Error requesting %s: %s"
 msgstr "Hiba %s lekérésekor: %s"
 
-#, fuzzy
 msgid "The server returned an empty response"
-msgstr "Nem lehet kapcsolódni: a kiszolgáló üres választ adott vissza."
+msgstr "A kiszolgáló üres választ adott vissza"
 
 msgid ""
 "Server requested that you fill out a CAPTCHA in order to sign in, but this "
@@ -7195,8 +7200,8 @@
 "%s tried to send you a %s file, but we only allow files up to %s over Direct "
 "IM.  Try using file transfer instead.\n"
 msgstr ""
-"%s egy %s fájlt próbált küldeni, de közvetlen kapcsolatban legfeljebb csak "
-"%s méretű fájl küldhető. Próbálkozzon inkább a fájlátvitellel.\n"
+"%s egy %s fájlt próbált küldeni, de közvetlen kapcsolatban legfeljebb csak %"
+"s méretű fájl küldhető. Próbálkozzon inkább a fájlátvitellel.\n"
 
 #, c-format
 msgid "File %s is %s, which is larger than the maximum size of %s."
@@ -8632,14 +8637,14 @@
 msgid "Select Server"
 msgstr "Válassza ki a kiszolgálót"
 
-msgid "QQ2005"
-msgstr "QQ2005"
+msgid "QQ2008"
+msgstr "QQ2008"
 
 msgid "QQ2007"
 msgstr "QQ2007"
 
-msgid "QQ2008"
-msgstr "QQ2008"
+msgid "QQ2005"
+msgstr "QQ2005"
 
 msgid "Connect by TCP"
 msgstr "Kapcsolódás TCP segítségével"
@@ -10835,8 +10840,8 @@
 #, c-format
 msgid "Access denied: HTTP proxy server forbids port %d tunneling"
 msgstr ""
-"Hozzáférés megtagadva: a HTTP proxy kiszolgáló tiltja az alagutazást a(z) "
-"%d. porton"
+"Hozzáférés megtagadva: a HTTP proxy kiszolgáló tiltja az alagutazást a(z) %"
+"d. porton"
 
 #, c-format
 msgid "Error resolving %s"
@@ -11084,8 +11089,8 @@
 "An error was encountered reading your %s.  The file has not been loaded, and "
 "the old file has been renamed to %s~."
 msgstr ""
-"Hiba történt a(z) %s olvasásakor. Ez a fájl nem lett betöltve, a régi fájl "
-"%s~ néven lett elmentve."
+"Hiba történt a(z) %s olvasásakor. Ez a fájl nem lett betöltve, a régi fájl %"
+"s~ néven lett elmentve."
 
 msgid ""
 "Chat over IM.  Supports AIM, Google Talk, Jabber/XMPP, MSN, Yahoo and more"
@@ -12211,10 +12216,6 @@
 msgid "Fatal Error"
 msgstr "Végzetes hiba"
 
-# fixme: jobb ötlet?
-msgid "bug master"
-msgstr "hibaritkító"
-
 msgid "artist"
 msgstr "grafikus"
 
@@ -12394,6 +12395,9 @@
 msgid "Maithili"
 msgstr "Maithili"
 
+msgid "Meadow Mari"
+msgstr "Mari"
+
 msgid "Macedonian"
 msgstr "macedón"
 
@@ -12514,8 +12518,8 @@
 "to multiple messaging services at once.  %s is written in C using GTK+.  %s "
 "is released, and may be modified and redistributed,  under the terms of the "
 "GPL version 2 (or later).  A copy of the GPL is distributed with %s.  %s is "
-"copyrighted by its contributors, a list of whom is also distributed with "
-"%s.  There is no warranty for %s.<BR><BR>"
+"copyrighted by its contributors, a list of whom is also distributed with %"
+"s.  There is no warranty for %s.<BR><BR>"
 msgstr ""
 "A %s egy libpurple alapú moduláris üzenetküldő kliens, amely egyszerre több "
 "üzenetküldő szolgáltatáshoz is képes csatlakozni. A %s GTK+ használatával, C "
@@ -13065,16 +13069,16 @@
 
 #, c-format
 msgid ""
-"Are you sure you want to permanently delete the log of the conversation in "
-"%s which started at %s?"
+"Are you sure you want to permanently delete the log of the conversation in %"
+"s which started at %s?"
 msgstr ""
 "Biztos, hogy törölni akarja a(z) %s csatornán folytatott, %s időpontban "
 "kezdődött beszélgetés naplóját?"
 
 #, c-format
 msgid ""
-"Are you sure you want to permanently delete the system log which started at "
-"%s?"
+"Are you sure you want to permanently delete the system log which started at %"
+"s?"
 msgstr ""
 "Biztos, hogy törölni akarja a(z) %s időpontban kezdődött rendszernaplót?"
 
@@ -14025,7 +14029,7 @@
 msgstr "Google Talk"
 
 msgid "Facebook (XMPP)"
-msgstr ""
+msgstr "Facebook (XMPP)"
 
 #, c-format
 msgid "The following error has occurred loading %s: %s"
@@ -15425,8 +15429,8 @@
 #, no-c-format
 msgid ""
 "Error Installing Spellchecking ($R3).$\\rIf retrying fails, manual "
-"installation instructions are at: http://developer.pidgin.im/wiki/Installing"
-"%20Pidgin#manual_win32_spellcheck_installation"
+"installation instructions are at: http://developer.pidgin.im/wiki/Installing%"
+"20Pidgin#manual_win32_spellcheck_installation"
 msgstr ""
 "Hiba a helyesírás-ellenőrző telepítésekor. ($R3).$\\rHa az újrapróbálkozás "
 "meghiúsul, akkor saját kezűleg is telepítheti a http://developer.pidgin.im/"
@@ -15508,6 +15512,3 @@
 
 msgid "You do not have permission to uninstall this application."
 msgstr "Nincs jogosultsága az alkalmazás eltávolításához."
-
-#~ msgid "Error requesting %s"
-#~ msgstr "Hiba %s lekérésekor"
--- a/po/hy.po	Tue Dec 21 21:05:26 2010 +0900
+++ b/po/hy.po	Sat Feb 12 04:17:09 2011 +0900
@@ -3,7 +3,6 @@
 # This file is distributed under the same license as the PACKAGE package.
 # David Avsharyan <avsharyan@gmail.com>, 2009.
 #
-#, fuzzy
 msgid ""
 msgstr ""
 "Project-Id-Version: am\n"
@@ -16,7 +15,7 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
 
 #. Translators may want to transliterate the name.
 #. It is not to be translated.
--- a/po/mn.po	Tue Dec 21 21:05:26 2010 +0900
+++ b/po/mn.po	Sat Feb 12 04:17:09 2011 +0900
@@ -15,7 +15,7 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
 
 #. Translators may want to transliterate the name.
 #. It is not to be translated.
--- a/po/ms_MY.po	Tue Dec 21 21:05:26 2010 +0900
+++ b/po/ms_MY.po	Sat Feb 12 04:17:09 2011 +0900
@@ -15,7 +15,7 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
 "X-Generator: KBabel 1.11.4\n"
 
 #. Translators may want to transliterate the name.
--- a/po/nl.po	Tue Dec 21 21:05:26 2010 +0900
+++ b/po/nl.po	Sat Feb 12 04:17:09 2011 +0900
@@ -8,9 +8,9 @@
 msgstr ""
 "Project-Id-Version: pidgin 2.7.3\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-12-19 13:34-0500\n"
-"PO-Revision-Date: 2010-12-14 10:45+0100\n"
-"Last-Translator: Dingoe <translations@gvmelle.com>\n"
+"POT-Creation-Date: 2011-02-02 23:34-0500\n"
+"PO-Revision-Date: 2011-01-25 10:45+0100\n"
+"Last-Translator: Gideon van Melle <translations@gvmelle.com>\n"
 "Language-Team: Dutch <translations@gvmelle.com>\n"
 "Language: nl\n"
 "MIME-Version: 1.0\n"
@@ -156,7 +156,7 @@
 
 #, c-format
 msgid "%s%s%s%s has made %s his or her buddy%s%s"
-msgstr "%s%s%s%s heeft %s in zijn/haar vriendt gemaakt%s%s"
+msgstr "%s%s%s%s heeft %s in zijn/haar vriend gemaakt%s%s"
 
 msgid "Add buddy to your list?"
 msgstr "Vriend toevoegen aan uw lijst?"
@@ -2365,8 +2365,12 @@
 "Pad voor opslaan bestanden\n"
 "(Geef spv het volledige pad)"
 
-msgid "Automatically reject from users not in buddy list"
-msgstr "Automatisch verwerpen van gebruikers die niet in vriendenlijst staan"
+msgid ""
+"When a file-transfer request arrives from a user who is\n"
+"*not* on your buddy list:"
+msgstr ""
+"Als een bestandsoverdracht aanvraag komt van gebruiker die\n"
+"*niet\" op uw vriendenlijst staat:"
 
 msgid ""
 "Notify with a popup when an autoaccepted file transfer is complete\n"
@@ -2379,6 +2383,9 @@
 msgid "Create a new directory for each user"
 msgstr "Een nieuwe map voor elke gebruiker aanmaken"
 
+msgid "Escape the filenames"
+msgstr "*Escape* de bestandsnamen"
+
 msgid "Notes"
 msgstr "Notities"
 
@@ -3862,7 +3869,10 @@
 "Server vereist een waarmerking via tekstaanmelding via een ongecodeerde "
 "datastroom"
 
-#. This should never happen!
+#. This happens when the server sends back jibberish
+#. * in the "additional data with success" case.
+#. * Seen with Wildfire 3.0.1.
+#.
 msgid "Invalid response from server"
 msgstr "Ongeldig antwoord van server"
 
@@ -6178,6 +6188,20 @@
 msgid "Retrieving User Information..."
 msgstr "Ophalen Gebruikersinformatie..."
 
+#. you were kicked
+msgid "You have been kicked from this MultiMX."
+msgstr "U bent uit deze MultiMX gegooid."
+
+msgid "was kicked"
+msgstr "eruit gegooid"
+
+msgid "_Room Name:"
+msgstr "_Ruimtenaam:"
+
+#. Display system message in chat window
+msgid "You have invited"
+msgstr "U heeft uitgenodigd"
+
 msgid "Loading menu..."
 msgstr "Menu aan 't laden..."
 
@@ -6205,20 +6229,6 @@
 msgid "Enable splash-screen popup"
 msgstr "inschakelen splashscreen pop-up"
 
-#. you were kicked
-msgid "You have been kicked from this MultiMX."
-msgstr "U bent uit deze MultiMX gegooid."
-
-msgid "was kicked"
-msgstr "eruit gegooid"
-
-msgid "_Room Name:"
-msgstr "_Ruimtenaam:"
-
-#. Display system message in chat window
-msgid "You have invited"
-msgstr "U heeft uitgenodigd"
-
 msgid "Last Online"
 msgstr "Laatste Online"
 
@@ -7892,75 +7902,6 @@
 "afbeeldingen via chatberichten). Dit zou als een inbreuk op de privacy "
 "beschouwd kunnen worden omdat de ander dan uw IP-adres te weten komt."
 
-msgid "Invalid SNAC"
-msgstr "Ongeldige SNAC"
-
-msgid "Server rate limit exceeded"
-msgstr "Server snelheidslimiet overschreden"
-
-msgid "Client rate limit exceeded"
-msgstr "Cliënt snelheidslimiet overschreden"
-
-msgid "Service unavailable"
-msgstr "Service niet beschikbaar"
-
-msgid "Service not defined"
-msgstr "Service niet gedefinieerd"
-
-msgid "Obsolete SNAC"
-msgstr "Verouderde SNAC"
-
-msgid "Not supported by host"
-msgstr "Niet ondersteund door computer"
-
-msgid "Not supported by client"
-msgstr "Niet ondersteund door cliënt"
-
-msgid "Refused by client"
-msgstr "Gewegerd door cliënt"
-
-msgid "Reply too big"
-msgstr "Antwoord te groot"
-
-msgid "Responses lost"
-msgstr "Reacties verloren"
-
-msgid "Request denied"
-msgstr "Aanvraag geweigerd"
-
-msgid "Busted SNAC payload"
-msgstr "SNAC bagage kapot"
-
-msgid "Insufficient rights"
-msgstr "Niet genoeg rechten"
-
-msgid "In local permit/deny"
-msgstr "In lokale toestaan/weigeren"
-
-msgid "Warning level too high (sender)"
-msgstr "Waarschuwingsniveau te hoog (verzender)"
-
-msgid "Warning level too high (receiver)"
-msgstr "Waarschuwingsniveau te hoog (ontvanger)"
-
-msgid "User temporarily unavailable"
-msgstr "Gebruiker tijdelijk niet beschikbaar"
-
-msgid "No match"
-msgstr "Geen overeenkomstige resultaten"
-
-msgid "List overflow"
-msgstr "Te grote lijst"
-
-msgid "Request ambiguous"
-msgstr "Dubieuze aanvraag"
-
-msgid "Queue full"
-msgstr "Wachtrij vol"
-
-msgid "Not while on AOL"
-msgstr "Niet tijdens AOL"
-
 # msgstr ""
 # "(Er is een fout opgetreden bij het ontvangen van het bericht. Of jij en %s "
 # "hebben verschillende coderingen geselecteerd of de andere persoon gebruikt "
@@ -8083,6 +8024,75 @@
 msgid "Capabilities"
 msgstr "Mogelijkheden"
 
+msgid "Invalid SNAC"
+msgstr "Ongeldige SNAC"
+
+msgid "Server rate limit exceeded"
+msgstr "Server snelheidslimiet overschreden"
+
+msgid "Client rate limit exceeded"
+msgstr "Cliënt snelheidslimiet overschreden"
+
+msgid "Service unavailable"
+msgstr "Service niet beschikbaar"
+
+msgid "Service not defined"
+msgstr "Service niet gedefinieerd"
+
+msgid "Obsolete SNAC"
+msgstr "Verouderde SNAC"
+
+msgid "Not supported by host"
+msgstr "Niet ondersteund door computer"
+
+msgid "Not supported by client"
+msgstr "Niet ondersteund door cliënt"
+
+msgid "Refused by client"
+msgstr "Gewegerd door cliënt"
+
+msgid "Reply too big"
+msgstr "Antwoord te groot"
+
+msgid "Responses lost"
+msgstr "Reacties verloren"
+
+msgid "Request denied"
+msgstr "Aanvraag geweigerd"
+
+msgid "Busted SNAC payload"
+msgstr "SNAC bagage kapot"
+
+msgid "Insufficient rights"
+msgstr "Niet genoeg rechten"
+
+msgid "In local permit/deny"
+msgstr "In lokale toestaan/weigeren"
+
+msgid "Warning level too high (sender)"
+msgstr "Waarschuwingsniveau te hoog (verzender)"
+
+msgid "Warning level too high (receiver)"
+msgstr "Waarschuwingsniveau te hoog (ontvanger)"
+
+msgid "User temporarily unavailable"
+msgstr "Gebruiker tijdelijk niet beschikbaar"
+
+msgid "No match"
+msgstr "Geen overeenkomstige resultaten"
+
+msgid "List overflow"
+msgstr "Te grote lijst"
+
+msgid "Request ambiguous"
+msgstr "Dubieuze aanvraag"
+
+msgid "Queue full"
+msgstr "Wachtrij vol"
+
+msgid "Not while on AOL"
+msgstr "Niet tijdens AOL"
+
 #. Translators: This string is a menu option that, if selected, will cause
 #. you to appear online to the chosen user even when your status is set to
 #. Invisible.
@@ -8677,14 +8687,14 @@
 msgid "Select Server"
 msgstr "Selecteer Server"
 
-msgid "QQ2005"
-msgstr "QQ2005"
+msgid "QQ2008"
+msgstr "QQ2008"
 
 msgid "QQ2007"
 msgstr "QQ2007"
 
-msgid "QQ2008"
-msgstr "QQ2008"
+msgid "QQ2005"
+msgstr "QQ2005"
 
 msgid "Connect by TCP"
 msgstr "Verbinden via TCP"
@@ -12256,9 +12266,6 @@
 msgid "Fatal Error"
 msgstr "Fatale fout"
 
-msgid "bug master"
-msgstr "bug master"
-
 msgid "artist"
 msgstr "artiest"
 
@@ -12438,6 +12445,9 @@
 msgid "Maithili"
 msgstr "Maithili"
 
+msgid "Meadow Mari"
+msgstr "Meadow Mari"
+
 msgid "Macedonian"
 msgstr "Macedonisch"
 
@@ -15584,6 +15594,13 @@
 msgid "You do not have permission to uninstall this application."
 msgstr "U mag dit programma niet verwijderen."
 
+#~ msgid "Automatically reject from users not in buddy list"
+#~ msgstr ""
+#~ "Automatisch verwerpen van gebruikers die niet in vriendenlijst staan"
+
+#~ msgid "bug master"
+#~ msgstr "bug master"
+
 #~ msgid "Error requesting %s"
 #~ msgstr "Fout opvragen  %s"
 
--- a/po/nn.po	Tue Dec 21 21:05:26 2010 +0900
+++ b/po/nn.po	Sat Feb 12 04:17:09 2011 +0900
@@ -1,19 +1,19 @@
 #
-# Yngve Spjeld Landro <l10n@landro.net>, 2010.
+# Yngve Spjeld Landro <l10n@landro.net>, 2010, 2011.
 #
 msgid ""
 msgstr ""
 "Project-Id-Version: gtranslator\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-12-19 13:34-0500\n"
-"PO-Revision-Date: 2010-12-14 04:02+0100\n"
+"POT-Creation-Date: 2011-02-02 23:34-0500\n"
+"PO-Revision-Date: 2011-01-20 05:01+0100\n"
 "Last-Translator: Yngve Spjeld Landro <l10n@landro.net>\n"
 "Language-Team: Norwegian Nynorsk <l10n@landro.net>\n"
 "Language: nn\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\\n\n"
 
 #. Translators may want to transliterate the name.
 #. It is not to be translated.
@@ -2357,9 +2357,12 @@
 "Fillagringsbane\n"
 "(før opp heile filbana)"
 
-# var: Automatisk avvising frå brukarar utanfor vennelista
-msgid "Automatically reject from users not in buddy list"
-msgstr "Automatisk avvising av brukarar utanfor vennelista"
+msgid ""
+"When a file-transfer request arrives from a user who is\n"
+"*not* on your buddy list:"
+msgstr ""
+"Når ein filoverføringsførespurnad kjem frå ein brukar som\n"
+"*ikkje* er i vennelista di:"
 
 msgid ""
 "Notify with a popup when an autoaccepted file transfer is complete\n"
@@ -2372,6 +2375,9 @@
 msgid "Create a new directory for each user"
 msgstr "Lag ein ny katalog for kvar brukar"
 
+msgid "Escape the filenames"
+msgstr "Vern filnamna (esc.-sekv.)"
+
 msgid "Notes"
 msgstr "Notat"
 
@@ -3822,7 +3828,10 @@
 msgid "Server requires plaintext authentication over an unencrypted stream"
 msgstr "Tenaren krev autentisering i klartekst over eit ukryptert samband"
 
-#. This should never happen!
+#. This happens when the server sends back jibberish
+#. * in the "additional data with success" case.
+#. * Seen with Wildfire 3.0.1.
+#.
 msgid "Invalid response from server"
 msgstr "Ugyldig svar frå tenaren"
 
@@ -6123,6 +6132,20 @@
 msgid "Retrieving User Information..."
 msgstr "Hentar brukaropplysningar…"
 
+#. you were kicked
+msgid "You have been kicked from this MultiMX."
+msgstr "Du er blitt sparka ut frå denne MultiMX-en."
+
+msgid "was kicked"
+msgstr "blei sparka ut"
+
+msgid "_Room Name:"
+msgstr "Rom_namn:"
+
+#. Display system message in chat window
+msgid "You have invited"
+msgstr "Du har invitert "
+
 msgid "Loading menu..."
 msgstr "Lastar menyen…"
 
@@ -6151,20 +6174,6 @@
 msgid "Enable splash-screen popup"
 msgstr "Bruk oppstartsvindauge"
 
-#. you were kicked
-msgid "You have been kicked from this MultiMX."
-msgstr "Du er blitt sparka ut frå denne MultiMX-en."
-
-msgid "was kicked"
-msgstr "blei sparka ut"
-
-msgid "_Room Name:"
-msgstr "Rom_namn:"
-
-#. Display system message in chat window
-msgid "You have invited"
-msgstr "Du har invitert "
-
 msgid "Last Online"
 msgstr "Sist tilkopla"
 
@@ -7809,75 +7818,6 @@
 "for lynmeldingsbilete. Fordi IP-adressa vil bli avslørt, blir dette sett på "
 "som ein tryggleiksrisiko."
 
-msgid "Invalid SNAC"
-msgstr "Ugyldig SNAC"
-
-msgid "Server rate limit exceeded"
-msgstr "Overskriden tenargrense"
-
-msgid "Client rate limit exceeded"
-msgstr "Overskriden klientgrense"
-
-msgid "Service unavailable"
-msgstr "Tenesta er utilgjengeleg"
-
-msgid "Service not defined"
-msgstr "Tenesta er ikkje definert"
-
-msgid "Obsolete SNAC"
-msgstr "Forelda SNAC"
-
-msgid "Not supported by host"
-msgstr "Ikkje støtta av verten"
-
-msgid "Not supported by client"
-msgstr "Ikkje støtta av klienten"
-
-msgid "Refused by client"
-msgstr "Avvist av klienten"
-
-msgid "Reply too big"
-msgstr "Svaret er for stort"
-
-msgid "Responses lost"
-msgstr "Tapte svar"
-
-msgid "Request denied"
-msgstr "Førsepurnad avvist"
-
-msgid "Busted SNAC payload"
-msgstr "Ødelagt SNAC-pakkeinnhald"
-
-msgid "Insufficient rights"
-msgstr "Ikkje nok rettar"
-
-msgid "In local permit/deny"
-msgstr "I lokal tilgangs-/forbodsliste"
-
-msgid "Warning level too high (sender)"
-msgstr "For høgt åtvaringsnivå (sendar)"
-
-msgid "Warning level too high (receiver)"
-msgstr "For høgt åtvaringsnivå (mottakar)"
-
-msgid "User temporarily unavailable"
-msgstr "Brukaren er mellombels utilgjengeleg"
-
-msgid "No match"
-msgstr "Ikkje noko samsvar"
-
-msgid "List overflow"
-msgstr "Lista er full"
-
-msgid "Request ambiguous"
-msgstr "Uklar førespurnad"
-
-msgid "Queue full"
-msgstr "Køen er full"
-
-msgid "Not while on AOL"
-msgstr "Ikkje når pålogga AOL"
-
 #. Label
 msgid "Buddy Icon"
 msgstr "Venneikon"
@@ -7997,6 +7937,75 @@
 msgid "Capabilities"
 msgstr "Evner"
 
+msgid "Invalid SNAC"
+msgstr "Ugyldig SNAC"
+
+msgid "Server rate limit exceeded"
+msgstr "Overskriden tenargrense"
+
+msgid "Client rate limit exceeded"
+msgstr "Overskriden klientgrense"
+
+msgid "Service unavailable"
+msgstr "Tenesta er utilgjengeleg"
+
+msgid "Service not defined"
+msgstr "Tenesta er ikkje definert"
+
+msgid "Obsolete SNAC"
+msgstr "Forelda SNAC"
+
+msgid "Not supported by host"
+msgstr "Ikkje støtta av verten"
+
+msgid "Not supported by client"
+msgstr "Ikkje støtta av klienten"
+
+msgid "Refused by client"
+msgstr "Avvist av klienten"
+
+msgid "Reply too big"
+msgstr "Svaret er for stort"
+
+msgid "Responses lost"
+msgstr "Tapte svar"
+
+msgid "Request denied"
+msgstr "Førsepurnad avvist"
+
+msgid "Busted SNAC payload"
+msgstr "Ødelagt SNAC-pakkeinnhald"
+
+msgid "Insufficient rights"
+msgstr "Ikkje nok rettar"
+
+msgid "In local permit/deny"
+msgstr "I lokal tilgangs-/forbodsliste"
+
+msgid "Warning level too high (sender)"
+msgstr "For høgt åtvaringsnivå (sendar)"
+
+msgid "Warning level too high (receiver)"
+msgstr "For høgt åtvaringsnivå (mottakar)"
+
+msgid "User temporarily unavailable"
+msgstr "Brukaren er mellombels utilgjengeleg"
+
+msgid "No match"
+msgstr "Ikkje noko samsvar"
+
+msgid "List overflow"
+msgstr "Lista er full"
+
+msgid "Request ambiguous"
+msgstr "Uklar førespurnad"
+
+msgid "Queue full"
+msgstr "Køen er full"
+
+msgid "Not while on AOL"
+msgstr "Ikkje når pålogga AOL"
+
 #. Translators: This string is a menu option that, if selected, will cause
 #. you to appear online to the chosen user even when your status is set to
 #. Invisible.
@@ -8589,14 +8598,14 @@
 msgid "Select Server"
 msgstr "Vel tenar"
 
-msgid "QQ2005"
-msgstr "QQ2005"
+msgid "QQ2008"
+msgstr "QQ2008"
 
 msgid "QQ2007"
 msgstr "QQ2007"
 
-msgid "QQ2008"
-msgstr "QQ2008"
+msgid "QQ2005"
+msgstr "QQ2005"
 
 msgid "Connect by TCP"
 msgstr "Kopla til med TCP"
@@ -11352,19 +11361,19 @@
 msgstr "Skjul når du er fråkopla"
 
 msgid "Show When Offline"
-msgstr "Vis når du er fråkopla"
+msgstr "Vis når du er fr_åkopla"
 
 msgid "_Alias..."
-msgstr "Ka_llenamn…"
+msgstr "_Kallenamn …"
 
 msgid "_Remove"
 msgstr "_Fjern"
 
 msgid "Set Custom Icon"
-msgstr "Tilpassa ikon"
+msgstr "_Tilpassa ikon"
 
 msgid "Remove Custom Icon"
-msgstr "Fjern eige ikon"
+msgstr "Fjern tilpa_ssa ikon"
 
 msgid "Add _Buddy..."
 msgstr "Legg til _venn…"
@@ -11383,16 +11392,16 @@
 msgstr "_Bli med"
 
 msgid "Auto-Join"
-msgstr "Automatisk pålogging"
+msgstr "Bli med auto_matisk"
 
 msgid "Persistent"
-msgstr "Varig"
+msgstr "_Varig"
 
 msgid "_Edit Settings..."
-msgstr "Endra _innstillingar…"
+msgstr "Endra _innstillingar …"
 
 msgid "_Collapse"
-msgstr "_Slå saman"
+msgstr "Sl_å saman"
 
 msgid "_Expand"
 msgstr "_Utvid"
@@ -12149,9 +12158,6 @@
 msgid "Fatal Error"
 msgstr "Alvorleg feil"
 
-msgid "bug master"
-msgstr "feilrettingsansvarleg"
-
 msgid "artist"
 msgstr "kunstnar"
 
@@ -12332,6 +12338,10 @@
 msgid "Maithili"
 msgstr "Maithili"
 
+#, fuzzy
+msgid "Meadow Mari"
+msgstr "Ny e-post"
+
 msgid "Macedonian"
 msgstr "Makedonsk"
 
@@ -12625,7 +12635,7 @@
 msgstr "Fjern venn"
 
 msgid "_Remove Buddy"
-msgstr "_Fjern venn"
+msgstr "Fje_rn venn"
 
 #, c-format
 msgid ""
@@ -13534,13 +13544,13 @@
 msgstr "Slå på automatisk port_vidaresending"
 
 msgid "_Manually specify range of ports to listen on:"
-msgstr "Før opp _portrekkje det skal lyttast til:"
+msgstr "Før opp portr_ekkje det skal lyttast til:"
 
 msgid "_Start:"
-msgstr "_Start:"
+msgstr "_start:"
 
 msgid "_End:"
-msgstr "_Slutt:"
+msgstr "s_lutt:"
 
 #. TURN server
 msgid "Relay Server (TURN)"
@@ -15441,6 +15451,13 @@
 msgid "You do not have permission to uninstall this application."
 msgstr "Du har ikkje rettar til å avinstallera dette programmet."
 
+#~ msgid "bug master"
+#~ msgstr "feilrettingsansvarleg"
+
+# var: Automatisk avvising frå brukarar utanfor vennelista
+#~ msgid "Automatically reject from users not in buddy list"
+#~ msgstr "Automatisk avvising av brukarar utanfor vennelista"
+
 #~ msgid "An error occurred on the in-band bytestream transfer\n"
 #~ msgstr "Overføringa av samtidsdatastraumen feila\n"
 
--- a/po/oc.po	Tue Dec 21 21:05:26 2010 +0900
+++ b/po/oc.po	Sat Feb 12 04:17:09 2011 +0900
@@ -12,13 +12,14 @@
 # D'autres documents utiles peuvent être consultés sur lo projet de
 # traduction de GNOME.
 # http://wiki.traduc.org/gnomefr/
+# Éric Boumaour <zongo_fr@users.sourceforge.net>, 2011.
 #
 msgid ""
 msgstr ""
 "Project-Id-Version: Pidgin\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-12-19 13:34-0500\n"
-"PO-Revision-Date: 2008-05-09 01:31+0200\n"
+"POT-Creation-Date: 2011-02-02 23:34-0500\n"
+"PO-Revision-Date: 2011-01-09 00:11+0100\n"
 "Last-Translator: Éric Boumaour <zongo_fr@users.sourceforge.net>\n"
 "Language-Team: fr <fr@li.org>\n"
 "Language: \n"
@@ -63,7 +64,7 @@
 msgstr ""
 
 msgid "Account was not added"
-msgstr ""
+msgstr "Compte pas apondut"
 
 msgid "Username of an account must be non-empty."
 msgstr ""
@@ -89,17 +90,16 @@
 msgstr ""
 
 msgid "Modify Account"
-msgstr ""
+msgstr "Modificar lo compte"
 
 msgid "New Account"
-msgstr ""
+msgstr "Compte novèl"
 
 msgid "Protocol:"
 msgstr "Protocòl :"
 
-#, fuzzy
 msgid "Username:"
-msgstr "_Nom d'utilizaire :"
+msgstr "Nom d'utilizaire :"
 
 msgid "Password:"
 msgstr "Mot de pas :"
@@ -126,7 +126,7 @@
 msgstr ""
 
 msgid "Delete Account"
-msgstr ""
+msgstr "Suprimir lo compte"
 
 #. Delete button
 msgid "Delete"
@@ -207,7 +207,7 @@
 msgstr ""
 
 msgid "Add in group"
-msgstr ""
+msgstr "Apondre al grop"
 
 msgid "Account"
 msgstr "Compte"
@@ -219,7 +219,7 @@
 msgstr ""
 
 msgid "Chats"
-msgstr ""
+msgstr "Charradissas"
 
 #. Extract their Name and put it in
 msgid "Name"
@@ -259,7 +259,7 @@
 msgstr ""
 
 msgid "Edit"
-msgstr "Edicion"
+msgstr "Modificar"
 
 msgid "Edit Settings"
 msgstr ""
@@ -277,10 +277,10 @@
 msgstr ""
 
 msgid "Send File"
-msgstr "_Enviar un fichièr"
+msgstr "Mandar un fichièr"
 
 msgid "Blocked"
-msgstr ""
+msgstr "Blocat"
 
 msgid "Show when offline"
 msgstr ""
@@ -344,19 +344,19 @@
 msgstr "Novèl..."
 
 msgid "Saved..."
-msgstr ""
+msgstr "Enregistrats..."
 
 msgid "Plugins"
 msgstr "Ajustons"
 
 msgid "Block/Unblock"
-msgstr ""
+msgstr "Blocar/desblocar"
 
 msgid "Block"
-msgstr ""
+msgstr "Blocar"
 
 msgid "Unblock"
-msgstr ""
+msgstr "Desblocar"
 
 msgid ""
 "Please enter the username or alias of the person you would like to Block/"
@@ -385,7 +385,7 @@
 msgstr ""
 
 msgid "Join"
-msgstr ""
+msgstr "Jónher"
 
 msgid ""
 "Please enter the username or alias of the person whose log you would like to "
@@ -400,7 +400,7 @@
 msgstr ""
 
 msgid "Block/Unblock..."
-msgstr ""
+msgstr "Blocar/desblocar..."
 
 msgid "Join Chat..."
 msgstr ""
@@ -418,7 +418,7 @@
 msgstr ""
 
 msgid "Offline buddies"
-msgstr ""
+msgstr "Los contactes desconnectats"
 
 msgid "Sort"
 msgstr "Ordenar"
@@ -436,7 +436,7 @@
 msgstr ""
 
 msgid "Chat"
-msgstr "Chad"
+msgstr "Charradissa"
 
 msgid "Grouping"
 msgstr ""
@@ -590,7 +590,7 @@
 msgstr ""
 
 msgid "Conversation"
-msgstr ""
+msgstr "Charradissa"
 
 msgid "Clear Scrollback"
 msgstr ""
@@ -601,9 +601,8 @@
 msgid "Add Buddy Pounce..."
 msgstr ""
 
-#, fuzzy
 msgid "Invite..."
-msgstr "Convidar"
+msgstr "Convidar..."
 
 msgid "Enable Logging"
 msgstr ""
@@ -711,15 +710,15 @@
 msgid "Pause"
 msgstr "Pausa"
 
-#, fuzzy, c-format
+#, c-format
 msgid "File Transfers - %d%% of %d file"
 msgid_plural "File Transfers - %d%% of %d files"
-msgstr[0] "Transferriment de fichièrs"
-msgstr[1] "Transferriment de fichièrs"
+msgstr[0] ""
+msgstr[1] ""
 
 #. Create the window.
 msgid "File Transfers"
-msgstr "Transferriment de fichièrs"
+msgstr "Transferiment de fichièrs"
 
 msgid "Progress"
 msgstr "Avançament"
@@ -763,9 +762,8 @@
 msgid "%.2f KiB/s"
 msgstr "%.2f ko/s"
 
-#, fuzzy
 msgid "Sent"
-msgstr "Definir"
+msgstr "Mandat"
 
 msgid "Received"
 msgstr ""
@@ -777,9 +775,8 @@
 msgid "The file was saved as %s."
 msgstr ""
 
-#, fuzzy
 msgid "Sending"
-msgstr "Segondas"
+msgstr "A mandar"
 
 msgid "Receiving"
 msgstr ""
@@ -828,14 +825,13 @@
 msgstr ""
 
 msgid "All Conversations"
-msgstr ""
+msgstr "Totas las charradissas"
 
 msgid "System Log"
 msgstr ""
 
-#, fuzzy
 msgid "Calling..."
-msgstr "A calcular..."
+msgstr ""
 
 msgid "Hangup"
 msgstr ""
@@ -910,9 +906,8 @@
 #. XXX: The following expects that finch_notify_message gets called. This
 #. * may not always happen, e.g. when another plugin sets its own
 #. * notify_message. So tread carefully.
-#, fuzzy
 msgid "URI"
-msgstr "URL"
+msgstr "URI"
 
 msgid "ERROR"
 msgstr "ERROR"
@@ -1033,7 +1028,7 @@
 msgstr ""
 
 msgid "Send a message"
-msgstr ""
+msgstr "Mandar un messatge"
 
 msgid "Execute a command"
 msgstr ""
@@ -1167,7 +1162,7 @@
 msgstr ""
 
 msgid "Open File..."
-msgstr ""
+msgstr "Dobrir un fichièr..."
 
 msgid "Choose Location..."
 msgstr ""
@@ -1212,9 +1207,8 @@
 msgid "Someone says your username in chat"
 msgstr ""
 
-#, fuzzy
 msgid "Attention received"
-msgstr "L'autentificacion a abocat"
+msgstr ""
 
 msgid "GStreamer Failure"
 msgstr ""
@@ -1311,7 +1305,7 @@
 msgstr "Títol"
 
 msgid "Type"
-msgstr "Tipe"
+msgstr "Mena"
 
 #. Statuses are almost all the same. Define a macro to reduce code repetition.
 #. PurpleStatusPrimitive
@@ -1482,9 +1476,8 @@
 msgid "TinyURL (or other) address prefix"
 msgstr ""
 
-#, fuzzy
 msgid "TinyURL"
-msgstr "URL"
+msgstr "TinyURL"
 
 msgid "TinyURL plugin"
 msgstr ""
@@ -1503,7 +1496,7 @@
 msgstr ""
 
 msgid "Offline Buddies"
-msgstr ""
+msgstr "Contactes desconnectats"
 
 msgid "Online/Offline"
 msgstr ""
@@ -1598,7 +1591,7 @@
 msgstr "Desconegut"
 
 msgid "Buddies"
-msgstr ""
+msgstr "Contactes"
 
 msgid "buddy list"
 msgstr ""
@@ -1745,10 +1738,10 @@
 msgstr ""
 
 msgid "Send Message"
-msgstr "Enviar un messatge"
+msgstr "Mandar un messatge"
 
 msgid "_Send Message"
-msgstr "_Enviar un messatge"
+msgstr "_Mandar un messatge"
 
 #, c-format
 msgid "%s entered the room."
@@ -1774,9 +1767,8 @@
 msgid "%s left the room (%s)."
 msgstr ""
 
-#, fuzzy
 msgid "Invite to chat"
-msgstr "Convidar"
+msgstr "Convidar a una charradissa"
 
 #. Put our happy label in it.
 msgid ""
@@ -1837,7 +1829,7 @@
 msgstr ""
 
 msgid "Unknown reason"
-msgstr "Rason desconeguda"
+msgstr ""
 
 #, c-format
 msgid ""
@@ -1926,9 +1918,9 @@
 msgid "File transfer cancelled"
 msgstr ""
 
-#, fuzzy, c-format
+#, c-format
 msgid "%s cancelled the transfer of %s"
-msgstr "%s a changé son état de %s en %s."
+msgstr ""
 
 #, c-format
 msgid "%s cancelled the file transfer"
@@ -2121,9 +2113,8 @@
 msgid "Error with your webcam"
 msgstr ""
 
-#, fuzzy
 msgid "Conference error"
-msgstr "Error de connexion"
+msgstr ""
 
 #, c-format
 msgid "Error creating session: %s"
@@ -2189,13 +2180,13 @@
 msgstr ""
 
 msgid "_Save"
-msgstr "_Enregistrar"
+msgstr "Enregi_strar"
 
 msgid "_Cancel"
 msgstr "_Anullar"
 
 msgid "Ask"
-msgstr ""
+msgstr "Demandar"
 
 msgid "Auto Accept"
 msgstr ""
@@ -2212,7 +2203,9 @@
 "(Please provide the full path)"
 msgstr ""
 
-msgid "Automatically reject from users not in buddy list"
+msgid ""
+"When a file-transfer request arrives from a user who is\n"
+"*not* on your buddy list:"
 msgstr ""
 
 msgid ""
@@ -2223,6 +2216,9 @@
 msgid "Create a new directory for each user"
 msgstr ""
 
+msgid "Escape the filenames"
+msgstr ""
+
 msgid "Notes"
 msgstr "Nòtas"
 
@@ -2462,7 +2458,7 @@
 #. translators who wanted to transliterate them.  Many translators
 #. choose to leave them alone.  Choose what's best for your language.
 msgid "QIP"
-msgstr ""
+msgstr "QIP"
 
 #. The names of IM clients are marked for translation at the request of
 #. translators who wanted to transliterate them.  Many translators
@@ -2474,13 +2470,13 @@
 #. translators who wanted to transliterate them.  Many translators
 #. choose to leave them alone.  Choose what's best for your language.
 msgid "Trillian"
-msgstr ""
+msgstr "Trillian"
 
 #. The names of IM clients are marked for translation at the request of
 #. translators who wanted to transliterate them.  Many translators
 #. choose to leave them alone.  Choose what's best for your language.
 msgid "aMSN"
-msgstr ""
+msgstr "aMSN"
 
 #. Add general preferences.
 msgid "General Log Reading Configuration"
@@ -2573,7 +2569,7 @@
 msgstr ""
 
 msgid "Offline Message"
-msgstr ""
+msgstr "Messatge desconnectat"
 
 msgid "You can edit/delete the pounce from the `Buddy Pounces' dialog"
 msgstr ""
@@ -2590,9 +2586,8 @@
 msgid "Do not ask. Always save in pounce."
 msgstr ""
 
-#, fuzzy
 msgid "One Time Password"
-msgstr "Picatz lo mot de pas"
+msgstr ""
 
 #. *< type
 #. *< ui_requirement
@@ -2700,7 +2695,7 @@
 #. *< priority
 #. *< id
 msgid "GNUTLS"
-msgstr ""
+msgstr "GNUTLS"
 
 #. *< name
 #. *< version
@@ -2716,7 +2711,7 @@
 #. *< priority
 #. *< id
 msgid "NSS"
-msgstr ""
+msgstr "NSS"
 
 #. *< name
 #. *< version
@@ -2851,7 +2846,7 @@
 msgstr ""
 
 msgid "Bonjour"
-msgstr ""
+msgstr "Bonjour"
 
 #, c-format
 msgid "%s has closed the conversation."
@@ -2908,9 +2903,8 @@
 msgid "You must fill in all registration fields"
 msgstr ""
 
-#, fuzzy
 msgid "Passwords do not match"
-msgstr "Los mots de pas son pas los meteisses."
+msgstr "Los mots de pas son pas los meteisses"
 
 msgid "Unable to register new account.  An unknown error occurred."
 msgstr ""
@@ -2930,9 +2924,8 @@
 msgid "Enter captcha text"
 msgstr ""
 
-#, fuzzy
 msgid "Captcha"
-msgstr "Enregistrar l'imatge"
+msgstr "Captcha"
 
 msgid "Register New Gadu-Gadu Account"
 msgstr ""
@@ -3031,7 +3024,7 @@
 msgstr "Absent(a)"
 
 msgid "UIN"
-msgstr ""
+msgstr "UIN"
 
 #. first name
 #. purple_notify_user_info_add_pair( info, _( "Hidden Number" ), profile->hidden ? _( "Yes" ) : _( "No" ) );
@@ -3088,9 +3081,9 @@
 msgid "Chat _name:"
 msgstr ""
 
-#, fuzzy, c-format
+#, c-format
 msgid "Unable to resolve hostname '%s': %s"
-msgstr "Impossible de dobrir le fichièr '%s' : %s"
+msgstr ""
 
 #. 1. connect to server
 #. connect to the server
@@ -3103,9 +3096,8 @@
 msgid "This chat name is already in use"
 msgstr ""
 
-#, fuzzy
 msgid "Not connected to the server"
-msgstr "Connectat"
+msgstr "Sètz pas connectat al servidor"
 
 msgid "Find buddies..."
 msgstr ""
@@ -3146,9 +3138,8 @@
 msgid "Gadu-Gadu User"
 msgstr ""
 
-#, fuzzy
 msgid "GG server"
-msgstr "Connectat"
+msgstr "Servidor GG"
 
 #, c-format
 msgid "Unknown command: %s"
@@ -3187,9 +3178,9 @@
 #.
 #. TODO: what to do here - do we really have to disconnect?
 #. TODO: do we really want to disconnect on a failure to write?
-#, fuzzy, c-format
+#, c-format
 msgid "Lost connection with server: %s"
-msgstr "Connectat"
+msgstr ""
 
 msgid "View MOTD"
 msgstr ""
@@ -3270,9 +3261,9 @@
 msgid "Ban on %s by %s, set %s ago"
 msgstr ""
 
-#, fuzzy, c-format
+#, c-format
 msgid "Ban on %s"
-msgstr "Rason : %s"
+msgstr ""
 
 msgid "End of ban list"
 msgstr ""
@@ -3289,10 +3280,10 @@
 msgstr ""
 
 msgid " <i>(ircop)</i>"
-msgstr ""
+msgstr " <i>(ircop)</i>"
 
 msgid " <i>(identified)</i>"
-msgstr ""
+msgstr " <i>(identificat)</i>"
 
 msgid "Nick"
 msgstr "Escais"
@@ -3400,9 +3391,8 @@
 msgid "The nickname \"%s\" is already being used."
 msgstr ""
 
-#, fuzzy
 msgid "Nickname in use"
-msgstr "Escais"
+msgstr ""
 
 msgid "Cannot change nick"
 msgstr ""
@@ -3585,7 +3575,7 @@
 msgstr ""
 
 msgid "PONG"
-msgstr ""
+msgstr "PONG"
 
 msgid "CTCP PING reply"
 msgstr ""
@@ -3605,7 +3595,10 @@
 msgid "Server requires plaintext authentication over an unencrypted stream"
 msgstr ""
 
-#. This should never happen!
+#. This happens when the server sends back jibberish
+#. * in the "additional data with success" case.
+#. * Seen with Wildfire 3.0.1.
+#.
 msgid "Invalid response from server"
 msgstr ""
 
@@ -3639,17 +3632,15 @@
 "Allow this and continue authentication?"
 msgstr ""
 
-#, fuzzy
 msgid "SASL authentication failed"
-msgstr "L'autentificacion a abocat"
+msgstr ""
 
 #, c-format
 msgid "SASL error: %s"
 msgstr ""
 
-#, fuzzy
 msgid "Invalid Encoding"
-msgstr "L'expression es pas valida"
+msgstr ""
 
 msgid "Unsupported Extension"
 msgstr ""
@@ -3673,16 +3664,14 @@
 msgid "User not found"
 msgstr "Utilizaire pas trobat"
 
-#, fuzzy
 msgid "Invalid Username Encoding"
-msgstr "L'expression es pas valida"
+msgstr ""
 
 msgid "Resource Constraint"
 msgstr ""
 
-#, fuzzy
 msgid "Unable to canonicalize username"
-msgstr "Activat"
+msgstr ""
 
 msgid "Unable to canonicalize password"
 msgstr ""
@@ -3705,9 +3694,9 @@
 msgid "Unable to establish a connection with the server"
 msgstr ""
 
-#, fuzzy, c-format
+#, c-format
 msgid "Unable to establish a connection with the server: %s"
-msgstr "Connectat"
+msgstr ""
 
 msgid "Unable to establish SSL connection"
 msgstr ""
@@ -3746,7 +3735,7 @@
 
 #. purple_notify_user_info_add_pair( info, _( "Email" ), profile->email );
 msgid "Country"
-msgstr "País"
+msgstr "Païs"
 
 #. lots of clients (including purple) do this, but it's
 #. * out of spec
@@ -3782,14 +3771,13 @@
 msgstr ""
 
 msgid "Client"
-msgstr ""
+msgstr "Client"
 
 msgid "Operating System"
 msgstr "Sistèma d'explotacion"
 
-#, fuzzy
 msgid "Local Time"
-msgstr "Fichièr local :"
+msgstr "Ora locala"
 
 msgid "Priority"
 msgstr "Prioritat"
@@ -3797,16 +3785,15 @@
 msgid "Resource"
 msgstr "Ressorga"
 
-#, fuzzy
 msgid "Uptime"
-msgstr "Data"
+msgstr ""
 
 msgid "Logged Off"
 msgstr ""
 
 #, c-format
 msgid "%s ago"
-msgstr ""
+msgstr "%s i a"
 
 msgid "Middle Name"
 msgstr ""
@@ -3850,7 +3837,7 @@
 msgstr ""
 
 msgid "Log In"
-msgstr ""
+msgstr "Connexion"
 
 msgid "Log Out"
 msgstr "Desconnectar"
@@ -3860,7 +3847,7 @@
 
 #. last name
 msgid "Last Name"
-msgstr "Nom"
+msgstr ""
 
 msgid "The following are the results of your search"
 msgstr ""
@@ -3971,17 +3958,14 @@
 msgid "Find Rooms"
 msgstr ""
 
-#, fuzzy
 msgid "Affiliations:"
-msgstr "Aliàs :"
-
-#, fuzzy
+msgstr ""
+
 msgid "No users found"
-msgstr "Utilizaire pas trobat"
-
-#, fuzzy
+msgstr ""
+
 msgid "Roles:"
-msgstr "Ròtle"
+msgstr "Ròtles :"
 
 msgid "Server requires TLS/SSL, but no TLS/SSL support was found."
 msgstr ""
@@ -3989,9 +3973,8 @@
 msgid "You require encryption, but no TLS/SSL support was found."
 msgstr ""
 
-#, fuzzy
 msgid "Ping timed out"
-msgstr "Connectat"
+msgstr ""
 
 msgid "Invalid XMPP ID"
 msgstr ""
@@ -4030,7 +4013,7 @@
 msgstr ""
 
 msgid "State"
-msgstr "Estat"
+msgstr ""
 
 msgid "Postal code"
 msgstr ""
@@ -4058,7 +4041,7 @@
 msgstr ""
 
 msgid "Register"
-msgstr "Enregistrar"
+msgstr "S'enregistrar"
 
 #, c-format
 msgid "Change Account Registration at %s"
@@ -4111,7 +4094,7 @@
 msgstr "De"
 
 msgid "To"
-msgstr "A"
+msgstr "Destinacion"
 
 msgid "None (To pending)"
 msgstr ""
@@ -4129,13 +4112,11 @@
 msgid "Allow Buzz"
 msgstr ""
 
-#, fuzzy
 msgid "Mood Name"
-msgstr "Nom de grop"
-
-#, fuzzy
+msgstr ""
+
 msgid "Mood Comment"
-msgstr "Entresenhas"
+msgstr ""
 
 #. primitive
 #. ID
@@ -4407,9 +4388,8 @@
 msgid "Unable to initiate media with %s: not subscribed to user presence"
 msgstr ""
 
-#, fuzzy
 msgid "Media Initiation Failed"
-msgstr "L'autentificacion a abocat"
+msgstr ""
 
 #, c-format
 msgid ""
@@ -4505,9 +4485,8 @@
 msgid "Use old-style SSL"
 msgstr ""
 
-#, fuzzy
 msgid "Connection security"
-msgstr "Connexion perduda"
+msgstr ""
 
 msgid "Allow plaintext auth over unencrypted streams"
 msgstr ""
@@ -4525,7 +4504,7 @@
 msgstr ""
 
 msgid "BOSH URL"
-msgstr ""
+msgstr "URL BOSH"
 
 #. this should probably be part of global smiley theme settings later on,
 #. shared with MSN
@@ -4538,7 +4517,7 @@
 
 #, c-format
 msgid "Message from %s"
-msgstr "Messatge de %s"
+msgstr ""
 
 #, c-format
 msgid "%s has set the topic to: %s"
@@ -4596,9 +4575,8 @@
 msgid "_Accept Defaults"
 msgstr ""
 
-#, fuzzy
 msgid "No reason"
-msgstr "Rason desconeguda"
+msgstr "Pas de rason"
 
 #, c-format
 msgid "You have been kicked: (%s)"
@@ -4634,23 +4612,20 @@
 msgid "Please select the resource of %s to which you would like to send a file"
 msgstr ""
 
-#, fuzzy
 msgid "Afraid"
 msgstr "Arab"
 
-#, fuzzy
 msgid "Amazed"
-msgstr "Animar"
+msgstr ""
 
 msgid "Amorous"
 msgstr ""
 
 msgid "Angry"
-msgstr ""
-
-#, fuzzy
+msgstr "Encolerat"
+
 msgid "Annoyed"
-msgstr "Qual que siá"
+msgstr ""
 
 msgid "Anxious"
 msgstr ""
@@ -4664,73 +4639,59 @@
 msgid "Bored"
 msgstr ""
 
-#, fuzzy
 msgid "Brave"
-msgstr "Enregistrar"
-
-#, fuzzy
+msgstr ""
+
 msgid "Calm"
-msgstr "Anullar"
+msgstr ""
 
 msgid "Cautious"
 msgstr ""
 
-#, fuzzy
 msgid "Cold"
-msgstr "Gras"
-
-#, fuzzy
+msgstr ""
+
 msgid "Confident"
-msgstr "Se connectar"
-
-#, fuzzy
+msgstr ""
+
 msgid "Confused"
-msgstr "Contunhar"
-
-#, fuzzy
+msgstr ""
+
 msgid "Contemplative"
-msgstr "Se connectar"
-
-#, fuzzy
+msgstr ""
+
 msgid "Contented"
-msgstr "Connectat"
-
-#, fuzzy
+msgstr ""
+
 msgid "Cranky"
-msgstr "Entrepresa"
+msgstr ""
 
 msgid "Crazy"
 msgstr ""
 
-#, fuzzy
 msgid "Creative"
-msgstr "Crear"
+msgstr ""
 
 msgid "Curious"
 msgstr ""
 
-#, fuzzy
 msgid "Dejected"
-msgstr "executar"
-
-#, fuzzy
+msgstr ""
+
 msgid "Depressed"
-msgstr "Suprimir"
-
-#, fuzzy
+msgstr ""
+
 msgid "Disappointed"
-msgstr "_Desactivar"
+msgstr ""
 
 msgid "Disgusted"
 msgstr ""
 
-#, fuzzy
 msgid "Dismayed"
-msgstr "_Desactivar"
-
-#, fuzzy
+msgstr ""
+
 msgid "Distracted"
-msgstr "_Desactivar"
+msgstr ""
 
 msgid "Embarrassed"
 msgstr ""
@@ -4744,9 +4705,8 @@
 msgid "Flirtatious"
 msgstr ""
 
-#, fuzzy
 msgid "Frustrated"
-msgstr "Pichon nom"
+msgstr ""
 
 msgid "Grateful"
 msgstr ""
@@ -4754,13 +4714,11 @@
 msgid "Grieving"
 msgstr ""
 
-#, fuzzy
 msgid "Grumpy"
-msgstr "Grop"
-
-#, fuzzy
+msgstr ""
+
 msgid "Guilty"
-msgstr "Ciutat"
+msgstr ""
 
 msgid "Happy"
 msgstr ""
@@ -4768,9 +4726,8 @@
 msgid "Hopeful"
 msgstr ""
 
-#, fuzzy
 msgid "Hot"
-msgstr "_Òste :"
+msgstr "Caud"
 
 msgid "Humbled"
 msgstr ""
@@ -4778,9 +4735,8 @@
 msgid "Humiliated"
 msgstr ""
 
-#, fuzzy
 msgid "Hungry"
-msgstr "Ongrés"
+msgstr ""
 
 msgid "Hurt"
 msgstr ""
@@ -4794,17 +4750,14 @@
 msgid "In love"
 msgstr ""
 
-#, fuzzy
 msgid "Indignant"
-msgstr "Indonesian"
-
-#, fuzzy
+msgstr ""
+
 msgid "Interested"
-msgstr "Interfaç"
-
-#, fuzzy
+msgstr "Interessat"
+
 msgid "Intoxicated"
-msgstr "Convidar"
+msgstr ""
 
 msgid "Invincible"
 msgstr ""
@@ -4812,62 +4765,50 @@
 msgid "Jealous"
 msgstr ""
 
-#, fuzzy
 msgid "Lonely"
-msgstr "Pas cap"
-
-#, fuzzy
+msgstr "Sol"
+
 msgid "Lost"
-msgstr "_Òste :"
+msgstr "Ò_ste :"
 
 msgid "Lucky"
 msgstr ""
 
-#, fuzzy
 msgid "Mean"
-msgstr "Aleman"
-
-#, fuzzy
+msgstr ""
+
 msgid "Moody"
-msgstr "Modificar"
+msgstr ""
 
 msgid "Nervous"
 msgstr ""
 
-#, fuzzy
 msgid "Neutral"
-msgstr "Defaut"
-
-#, fuzzy
+msgstr "Neutre"
+
 msgid "Offended"
-msgstr "Desconnectat"
+msgstr ""
 
 msgid "Outraged"
 msgstr ""
 
-#, fuzzy
 msgid "Playful"
-msgstr "Legir"
-
-#, fuzzy
+msgstr ""
+
 msgid "Proud"
-msgstr "Grop"
-
-#, fuzzy
+msgstr ""
+
 msgid "Relaxed"
-msgstr "Renommar"
-
-#, fuzzy
+msgstr ""
+
 msgid "Relieved"
-msgstr "Suprimir"
-
-#, fuzzy
+msgstr ""
+
 msgid "Remorseful"
-msgstr "Suprimir"
-
-#, fuzzy
+msgstr ""
+
 msgid "Restless"
-msgstr "Enregistrar"
+msgstr ""
 
 msgid "Sad"
 msgstr ""
@@ -4878,9 +4819,8 @@
 msgid "Satisfied"
 msgstr ""
 
-#, fuzzy
 msgid "Serious"
-msgstr "Sons"
+msgstr ""
 
 msgid "Shocked"
 msgstr ""
@@ -4888,9 +4828,8 @@
 msgid "Shy"
 msgstr ""
 
-#, fuzzy
 msgid "Sick"
-msgstr "Escais"
+msgstr "Malaut"
 
 #. Sleepy / Tired
 msgid "Sleepy"
@@ -4899,13 +4838,11 @@
 msgid "Spontaneous"
 msgstr ""
 
-#, fuzzy
 msgid "Stressed"
-msgstr "Velocitat :"
-
-#, fuzzy
+msgstr ""
+
 msgid "Strong"
-msgstr "Arrestar"
+msgstr ""
 
 msgid "Surprised"
 msgstr ""
@@ -4916,13 +4853,11 @@
 msgid "Thirsty"
 msgstr ""
 
-#, fuzzy
 msgid "Tired"
-msgstr "Firebird"
-
-#, fuzzy
+msgstr "Las"
+
 msgid "Undefined"
-msgstr "Soslinhat"
+msgstr ""
 
 msgid "Weak"
 msgstr ""
@@ -4984,9 +4919,8 @@
 msgid "Already logged in"
 msgstr ""
 
-#, fuzzy
 msgid "Invalid username"
-msgstr "L'expression es pas valida"
+msgstr ""
 
 msgid "Invalid friendly name"
 msgstr ""
@@ -5190,9 +5124,8 @@
 msgid "Nudging %s..."
 msgstr ""
 
-#, fuzzy
 msgid "Email Address..."
-msgstr "Adreça electronica"
+msgstr "Adreça electronica..."
 
 msgid "Your new MSN friendly name is too long."
 msgstr ""
@@ -5201,23 +5134,20 @@
 msgid "Set friendly name for %s."
 msgstr ""
 
-#, fuzzy
 msgid "Set Friendly Name"
-msgstr "Nom d'ostal"
+msgstr ""
 
 msgid "This is the name that other MSN buddies will see you as."
 msgstr ""
 
-#, fuzzy
 msgid "This Location"
-msgstr "Emplaçament"
+msgstr ""
 
 msgid "This is the name that identifies this location"
 msgstr ""
 
-#, fuzzy
 msgid "Other Locations"
-msgstr "Emplaçament"
+msgstr "Autres emplaçaments"
 
 msgid "You can sign out from other locations here"
 msgstr ""
@@ -5286,9 +5216,8 @@
 msgid "Playing a game"
 msgstr ""
 
-#, fuzzy
 msgid "Working"
-msgstr "Professional"
+msgstr ""
 
 msgid "Has you"
 msgstr ""
@@ -5314,9 +5243,8 @@
 msgid "Out to Lunch"
 msgstr ""
 
-#, fuzzy
 msgid "Game Title"
-msgstr "Títol"
+msgstr ""
 
 msgid "Office Title"
 msgstr ""
@@ -5324,9 +5252,8 @@
 msgid "Set Friendly Name..."
 msgstr ""
 
-#, fuzzy
 msgid "View Locations..."
-msgstr "Emplaçament"
+msgstr ""
 
 msgid "Set Home Phone Number..."
 msgstr ""
@@ -5364,9 +5291,8 @@
 "be valid email addresses."
 msgstr ""
 
-#, fuzzy
 msgid "Unable to Add"
-msgstr "Activat"
+msgstr ""
 
 msgid "Authorization Request Message:"
 msgstr ""
@@ -5435,7 +5361,7 @@
 msgstr ""
 
 msgid "Personal"
-msgstr "Terminal"
+msgstr "Personal"
 
 msgid "Significant Other"
 msgstr ""
@@ -5466,7 +5392,7 @@
 
 #. Business
 msgid "Work"
-msgstr "Professional"
+msgstr ""
 
 msgid "Company"
 msgstr "Entrepresa"
@@ -5569,9 +5495,9 @@
 msgid "The following users are missing from your addressbook"
 msgstr ""
 
-#, fuzzy, c-format
+#, c-format
 msgid "Unknown error (%d): %s"
-msgstr "Error desconeguda"
+msgstr ""
 
 msgid "Unable to add user"
 msgstr ""
@@ -5581,9 +5507,8 @@
 msgid "Unknown error (%d)"
 msgstr ""
 
-#, fuzzy
 msgid "Unable to remove user"
-msgstr "Activat"
+msgstr ""
 
 msgid "Mobile message was not sent because it was too long."
 msgstr ""
@@ -5735,9 +5660,8 @@
 msgid "The PIN is invalid. It should only consist of digits [0-9]."
 msgstr ""
 
-#, fuzzy
 msgid "The two PINs you entered do not match."
-msgstr "Los mots de pas son pas los meteisses."
+msgstr ""
 
 msgid "The Display Name you entered is invalid."
 msgstr ""
@@ -5771,16 +5695,14 @@
 
 #. display name
 #. nick name (required)
-#, fuzzy
 msgid "Display Name"
-msgstr "Nom d'ostal"
+msgstr ""
 
 #. hidden
 msgid "Hide my number"
 msgstr ""
 
 #. mobile number
-#, fuzzy
 msgid "Mobile Number"
 msgstr "Telefòn mobil"
 
@@ -5796,9 +5718,8 @@
 msgid "There is no splash-screen currently available"
 msgstr ""
 
-#, fuzzy
 msgid "About"
-msgstr "A prepaus de %s"
+msgstr "A prepaus"
 
 #. display / change profile
 msgid "Change Profile..."
@@ -5809,9 +5730,8 @@
 msgstr ""
 
 #. display plugin version
-#, fuzzy
 msgid "About..."
-msgstr "A prepaus de %s"
+msgstr "A prepaus..."
 
 #. the file is too big
 msgid "The file you are trying to send is too large!"
@@ -5828,9 +5748,8 @@
 "Unable to connect to the MXit server. Please check your server settings."
 msgstr ""
 
-#, fuzzy
 msgid "Connecting..."
-msgstr "Connexion"
+msgstr "Connexion..."
 
 msgid "The PIN you entered has an invalid length [7-10]."
 msgstr ""
@@ -5881,59 +5800,23 @@
 msgstr ""
 
 #. ask for input (required)
-#, fuzzy
 msgid "Enter Security Code"
-msgstr "Picatz lo mot de pas"
-
-#, fuzzy
+msgstr ""
+
 msgid "Your Country"
-msgstr "País"
+msgstr "Vòstre païs"
 
 msgid "Your Language"
 msgstr ""
 
 #. display the form to the user and wait for his/her input
-#, fuzzy
 msgid "MXit Authorization"
-msgstr "Autorizar"
+msgstr ""
 
 msgid "MXit account validation"
 msgstr ""
 
-#, fuzzy
 msgid "Retrieving User Information..."
-msgstr "Entresenhas sul servidor"
-
-msgid "Loading menu..."
-msgstr ""
-
-#, fuzzy
-msgid "Status Message"
-msgstr "Messatges enviats"
-
-#, fuzzy
-msgid "Rejection Message"
-msgstr "Enviar un messatge"
-
-#. hidden number
-#, fuzzy
-msgid "Hidden Number"
-msgstr "L'expression es pas valida"
-
-msgid "Your MXit ID..."
-msgstr ""
-
-#. Configuration options
-#. WAP server (reference: "libpurple/accountopt.h")
-#, fuzzy
-msgid "WAP Server"
-msgstr "Servidor"
-
-#, fuzzy
-msgid "Connect via HTTP"
-msgstr "Se connectar"
-
-msgid "Enable splash-screen popup"
 msgstr ""
 
 #. you were kicked
@@ -5943,7 +5826,6 @@
 msgid "was kicked"
 msgstr ""
 
-#, fuzzy
 msgid "_Room Name:"
 msgstr "_Sala :"
 
@@ -5951,18 +5833,43 @@
 msgid "You have invited"
 msgstr ""
 
-#, fuzzy
+msgid "Loading menu..."
+msgstr ""
+
+msgid "Status Message"
+msgstr ""
+
+msgid "Rejection Message"
+msgstr ""
+
+#. hidden number
+msgid "Hidden Number"
+msgstr ""
+
+msgid "Your MXit ID..."
+msgstr ""
+
+#. Configuration options
+#. WAP server (reference: "libpurple/accountopt.h")
+msgid "WAP Server"
+msgstr "Servidor WAP"
+
+msgid "Connect via HTTP"
+msgstr ""
+
+msgid "Enable splash-screen popup"
+msgstr ""
+
 msgid "Last Online"
-msgstr "En linha"
+msgstr ""
 
 #. we must have lost the connection, so terminate it so that we can reconnect
 msgid "We have lost the connection to MXit. Please reconnect."
 msgstr ""
 
 #. packet could not be queued for transmission
-#, fuzzy
 msgid "Message Send Error"
-msgstr "Messatge de %s"
+msgstr ""
 
 msgid "Unable to process your request at this time"
 msgstr ""
@@ -5970,18 +5877,16 @@
 msgid "Timeout while waiting for a response from the MXit server."
 msgstr ""
 
-#, fuzzy
 msgid "Successfully Logged In..."
-msgstr "Entresenhas sus l'utilizaire"
+msgstr ""
 
 #, c-format
 msgid ""
 "%s sent you an encrypted message, but it is not supported on this client."
 msgstr ""
 
-#, fuzzy
 msgid "Message Error"
-msgstr "Messatge de %s"
+msgstr ""
 
 msgid "Cannot perform redirect using the specified protocol"
 msgstr ""
@@ -5997,38 +5902,30 @@
 msgid "Logout error: %s (%i)"
 msgstr ""
 
-#, fuzzy
 msgid "Contact Error"
-msgstr "Error de connexion"
+msgstr ""
 
 msgid "Message Sending Error"
 msgstr ""
 
-#, fuzzy
 msgid "Status Error"
-msgstr "Estatut"
-
-#, fuzzy
+msgstr ""
+
 msgid "Mood Error"
-msgstr "Error"
-
-#, fuzzy
+msgstr ""
+
 msgid "Invitation Error"
-msgstr "Error de connexion"
-
-#, fuzzy
+msgstr ""
+
 msgid "Contact Removal Error"
-msgstr "Error de connexion"
-
-#, fuzzy
+msgstr ""
+
 msgid "Subscription Error"
-msgstr "Error de connexion"
-
-#, fuzzy
+msgstr ""
+
 msgid "Contact Update Error"
-msgstr "Error de connexion"
-
-#, fuzzy
+msgstr ""
+
 msgid "File Transfer Error"
 msgstr "Transferiment de fichièr"
 
@@ -6038,9 +5935,8 @@
 msgid "MultiMx Invitation Error"
 msgstr ""
 
-#, fuzzy
 msgid "Profile Error"
-msgstr "Perfil"
+msgstr "Error de perfil"
 
 #. bad packet
 msgid "Invalid packet received from MXit."
@@ -6072,28 +5968,23 @@
 msgid "In Love"
 msgstr ""
 
-#, fuzzy
 msgid "Pending"
-msgstr "Segondas"
-
-#, fuzzy
+msgstr ""
+
 msgid "Invited"
-msgstr "Convidar"
-
-#, fuzzy
+msgstr "Convidat"
+
 msgid "Rejected"
-msgstr "executar"
-
-#, fuzzy
+msgstr ""
+
 msgid "Deleted"
-msgstr "Suprimir"
+msgstr "Suprimit"
 
 msgid "MXit Advertising"
 msgstr ""
 
-#, fuzzy
 msgid "More Information"
-msgstr "Entresenhas"
+msgstr ""
 
 #, c-format
 msgid "No such user: %s"
@@ -6120,9 +6011,8 @@
 msgid "Would you like to set one now? (Note: THIS CANNOT BE CHANGED!)"
 msgstr ""
 
-#, fuzzy
 msgid "Lost connection with server"
-msgstr "Connectat"
+msgstr ""
 
 #. Can't write _()'d strings in array initializers. Workaround.
 #. khc: then use N_() in the array initializer and use _() when they are
@@ -6143,7 +6033,7 @@
 msgstr ""
 
 msgid "MySpace"
-msgstr ""
+msgstr "MySpace"
 
 msgid "IM Friends"
 msgstr ""
@@ -6254,7 +6144,7 @@
 msgstr ""
 
 msgid "Song"
-msgstr ""
+msgstr "Cançon"
 
 msgid "Total Friends"
 msgstr ""
@@ -6519,9 +6409,9 @@
 msgid "Unknown error: 0x%X"
 msgstr ""
 
-#, fuzzy, c-format
+#, c-format
 msgid "Unable to login: %s"
-msgstr "Activat"
+msgstr ""
 
 #, c-format
 msgid "Unable to send message. Could not get details for user (%s)."
@@ -6769,43 +6659,39 @@
 msgid "Bot account reached monthly IM limit"
 msgstr ""
 
-#, fuzzy
 msgid "Unable to receive offline messages"
-msgstr "Impossible de dobrir le fichièr '%s' : %s"
+msgstr ""
 
 msgid "Offline message store full"
 msgstr ""
 
-#, fuzzy, c-format
+#, c-format
 msgid "Unable to send message: %s (%s)"
-msgstr "Impossible de dobrir le fichièr '%s' : %s"
+msgstr ""
 
 #, c-format
 msgid "Unable to send message: %s"
 msgstr ""
 
-#, fuzzy, c-format
+#, c-format
 msgid "Unable to send message to %s: %s (%s)"
-msgstr "Impossible de dobrir le fichièr '%s' : %s"
-
-#, fuzzy, c-format
+msgstr ""
+
+#, c-format
 msgid "Unable to send message to %s: %s"
-msgstr "Impossible de dobrir le fichièr '%s' : %s"
+msgstr ""
 
 msgid "Thinking"
 msgstr ""
 
-#, fuzzy
 msgid "Shopping"
-msgstr "S'arrèsta de picar"
-
-#, fuzzy
+msgstr ""
+
 msgid "Questioning"
-msgstr "Estonian"
-
-#, fuzzy
+msgstr ""
+
 msgid "Eating"
-msgstr "Alèrta"
+msgstr "A manjar"
 
 msgid "Watching a movie"
 msgstr ""
@@ -6825,9 +6711,8 @@
 msgid "Having fun"
 msgstr ""
 
-#, fuzzy
 msgid "Sleeping"
-msgstr "Segondas"
+msgstr "A dormir"
 
 msgid "Using a PDA"
 msgstr ""
@@ -6855,39 +6740,33 @@
 msgstr ""
 
 #. Playing video games
-#, fuzzy
 msgid "Gaming"
-msgstr "Alèrta"
+msgstr ""
 
 msgid "Browsing the web"
 msgstr ""
 
-#, fuzzy
 msgid "Smoking"
-msgstr "Professional"
-
-#, fuzzy
+msgstr ""
+
 msgid "Writing"
-msgstr "Professional"
+msgstr ""
 
 #. Drinking [Alcohol]
-#, fuzzy
 msgid "Drinking"
-msgstr "Professional"
+msgstr ""
 
 msgid "Listening to music"
 msgstr ""
 
-#, fuzzy
 msgid "Studying"
-msgstr "Segondas"
+msgstr "A estudiar"
 
 msgid "In the restroom"
 msgstr ""
 
-#, fuzzy
 msgid "Received invalid data on connection with server"
-msgstr "Connectat"
+msgstr ""
 
 #. *< type
 #. *< ui_requirement
@@ -6965,21 +6844,17 @@
 msgid "Invisible"
 msgstr "Invisible"
 
-#, fuzzy
 msgid "Evil"
-msgstr "Corrièl"
-
-#, fuzzy
+msgstr ""
+
 msgid "Depression"
-msgstr "Mèstier"
-
-#, fuzzy
+msgstr ""
+
 msgid "At home"
-msgstr "A prepaus de %s"
-
-#, fuzzy
+msgstr "A l'ostal"
+
 msgid "At work"
-msgstr "Ret"
+msgstr "Al trabalh"
 
 msgid "At lunch"
 msgstr ""
@@ -7307,7 +7182,7 @@
 msgstr ""
 
 msgid "(no name)"
-msgstr ""
+msgstr "(pas de nom)"
 
 #, c-format
 msgid "Unable to add the buddy %s for an unknown reason."
@@ -7350,9 +7225,8 @@
 msgid "iTunes Music Store Link"
 msgstr ""
 
-#, fuzzy
 msgid "Lunch"
-msgstr "Finch"
+msgstr ""
 
 #, c-format
 msgid "Buddy Comment for %s"
@@ -7383,9 +7257,8 @@
 msgid "Edit Buddy Comment"
 msgstr ""
 
-#, fuzzy
 msgid "Get X-Status Msg"
-msgstr "Messatges enviats"
+msgstr ""
 
 msgid "End Direct IM Session"
 msgstr ""
@@ -7451,17 +7324,15 @@
 msgid "Set Privacy Options..."
 msgstr ""
 
-#, fuzzy
 msgid "Show Visible List"
-msgstr "Tièra de contactes"
-
-#, fuzzy
+msgstr ""
+
 msgid "Show Invisible List"
-msgstr "Invisible"
+msgstr ""
 
 #. AIM actions
 msgid "Confirm Account"
-msgstr ""
+msgstr "Confirmar lo compte"
 
 msgid "Display Currently Registered Email Address"
 msgstr ""
@@ -7511,6 +7382,124 @@
 "considered a privacy risk."
 msgstr ""
 
+#. Label
+msgid "Buddy Icon"
+msgstr ""
+
+msgid "Voice"
+msgstr "Votz"
+
+msgid "AIM Direct IM"
+msgstr ""
+
+msgid "Get File"
+msgstr ""
+
+msgid "Games"
+msgstr "Jòcs"
+
+msgid "ICQ Xtraz"
+msgstr ""
+
+msgid "Add-Ins"
+msgstr ""
+
+msgid "Send Buddy List"
+msgstr ""
+
+msgid "ICQ Direct Connect"
+msgstr ""
+
+msgid "AP User"
+msgstr ""
+
+msgid "ICQ RTF"
+msgstr ""
+
+msgid "Nihilist"
+msgstr ""
+
+msgid "ICQ Server Relay"
+msgstr ""
+
+msgid "Old ICQ UTF8"
+msgstr ""
+
+msgid "Trillian Encryption"
+msgstr ""
+
+msgid "ICQ UTF8"
+msgstr ""
+
+msgid "Hiptop"
+msgstr ""
+
+msgid "Security Enabled"
+msgstr ""
+
+msgid "Video Chat"
+msgstr ""
+
+msgid "iChat AV"
+msgstr ""
+
+msgid "Live Video"
+msgstr ""
+
+msgid "Camera"
+msgstr "Aparelh de fotografiar"
+
+msgid "Screen Sharing"
+msgstr "Nom d'utilisateur"
+
+msgid "IP Address"
+msgstr "Adreça IP"
+
+msgid "Warning Level"
+msgstr ""
+
+msgid "Buddy Comment"
+msgstr ""
+
+#, c-format
+msgid "User information not available: %s"
+msgstr ""
+
+msgid "Mobile Phone"
+msgstr "Telefòn mobil"
+
+msgid "Personal Web Page"
+msgstr ""
+
+#. aim_userinfo_t
+#. use_html_status
+msgid "Additional Information"
+msgstr "Entresenhas suplementàrias"
+
+msgid "Zip Code"
+msgstr "Còdi postal"
+
+msgid "Work Information"
+msgstr ""
+
+msgid "Division"
+msgstr "Division"
+
+msgid "Position"
+msgstr "Posicion"
+
+msgid "Web Page"
+msgstr "Pagina web"
+
+msgid "Online Since"
+msgstr ""
+
+msgid "Member Since"
+msgstr ""
+
+msgid "Capabilities"
+msgstr ""
+
 msgid "Invalid SNAC"
 msgstr ""
 
@@ -7580,125 +7569,6 @@
 msgid "Not while on AOL"
 msgstr ""
 
-#. Label
-msgid "Buddy Icon"
-msgstr ""
-
-msgid "Voice"
-msgstr "Votz"
-
-msgid "AIM Direct IM"
-msgstr ""
-
-msgid "Get File"
-msgstr ""
-
-msgid "Games"
-msgstr "Jòcs"
-
-msgid "ICQ Xtraz"
-msgstr ""
-
-msgid "Add-Ins"
-msgstr ""
-
-msgid "Send Buddy List"
-msgstr ""
-
-msgid "ICQ Direct Connect"
-msgstr ""
-
-msgid "AP User"
-msgstr ""
-
-msgid "ICQ RTF"
-msgstr ""
-
-msgid "Nihilist"
-msgstr ""
-
-msgid "ICQ Server Relay"
-msgstr ""
-
-msgid "Old ICQ UTF8"
-msgstr ""
-
-msgid "Trillian Encryption"
-msgstr ""
-
-msgid "ICQ UTF8"
-msgstr ""
-
-msgid "Hiptop"
-msgstr ""
-
-msgid "Security Enabled"
-msgstr ""
-
-msgid "Video Chat"
-msgstr ""
-
-msgid "iChat AV"
-msgstr ""
-
-msgid "Live Video"
-msgstr ""
-
-msgid "Camera"
-msgstr "Aparelh de fotografiar"
-
-#, fuzzy
-msgid "Screen Sharing"
-msgstr "Nom d'utilisateur"
-
-msgid "IP Address"
-msgstr "Adreça IP"
-
-msgid "Warning Level"
-msgstr ""
-
-msgid "Buddy Comment"
-msgstr ""
-
-#, c-format
-msgid "User information not available: %s"
-msgstr ""
-
-msgid "Mobile Phone"
-msgstr "Telefòn mobil"
-
-msgid "Personal Web Page"
-msgstr ""
-
-#. aim_userinfo_t
-#. use_html_status
-msgid "Additional Information"
-msgstr "Entresenhas suplementàrias"
-
-msgid "Zip Code"
-msgstr "Còdi postal"
-
-msgid "Work Information"
-msgstr ""
-
-msgid "Division"
-msgstr "Division"
-
-msgid "Position"
-msgstr "Posicion"
-
-msgid "Web Page"
-msgstr "Pagina web"
-
-msgid "Online Since"
-msgstr ""
-
-msgid "Member Since"
-msgstr ""
-
-msgid "Capabilities"
-msgstr ""
-
 #. Translators: This string is a menu option that, if selected, will cause
 #. you to appear online to the chosen user even when your status is set to
 #. Invisible.
@@ -7733,16 +7603,14 @@
 "\""
 msgstr ""
 
-#, fuzzy
 msgid "Visible List"
-msgstr "Invisible"
+msgstr "Tièra visibla"
 
 msgid "These buddies will see your status when you switch to \"Invisible\""
 msgstr ""
 
-#, fuzzy
 msgid "Invisible List"
-msgstr "Invisible"
+msgstr "Tièra invisibla"
 
 msgid "These buddies will always see you as offline"
 msgstr ""
@@ -7796,7 +7664,7 @@
 msgstr ""
 
 msgid "Dragon"
-msgstr ""
+msgstr "Dragon"
 
 msgid "Snake"
 msgstr ""
@@ -7805,36 +7673,34 @@
 msgstr ""
 
 msgid "Goat"
-msgstr ""
+msgstr "Cabra"
 
 msgid "Monkey"
-msgstr ""
+msgstr "Monin"
 
 msgid "Rooster"
 msgstr ""
 
 msgid "Dog"
-msgstr ""
+msgstr "Can"
 
 msgid "Pig"
-msgstr ""
+msgstr "Tesson"
 
 msgid "Other"
 msgstr "Autre"
 
-#, fuzzy
 msgid "Visible"
-msgstr "Invisible"
+msgstr "Visible"
 
 msgid "Friend Only"
 msgstr ""
 
-#, fuzzy
 msgid "Private"
-msgstr "Crear"
+msgstr "Privat"
 
 msgid "QQ Number"
-msgstr ""
+msgstr "Numèro QQ"
 
 msgid "Country/Region"
 msgstr ""
@@ -7848,9 +7714,8 @@
 msgid "Phone Number"
 msgstr ""
 
-#, fuzzy
 msgid "Authorize adding"
-msgstr "Autorizar"
+msgstr ""
 
 msgid "Cellphone Number"
 msgstr ""
@@ -7858,7 +7723,6 @@
 msgid "Personal Introduction"
 msgstr ""
 
-#, fuzzy
 msgid "City/Area"
 msgstr "Ciutat"
 
@@ -7874,67 +7738,54 @@
 msgid "Horoscope"
 msgstr ""
 
-#, fuzzy
 msgid "Zodiac"
 msgstr "Signe del zodiac"
 
-#, fuzzy
 msgid "Blood"
-msgstr "Gras"
+msgstr ""
 
 msgid "True"
-msgstr ""
-
-#, fuzzy
+msgstr "Verai"
+
 msgid "False"
-msgstr "Error"
-
-#, fuzzy
+msgstr "Fals"
+
 msgid "Modify Contact"
-msgstr "Entresenhas"
-
-#, fuzzy
+msgstr ""
+
 msgid "Modify Address"
-msgstr "Adreça personala"
-
-#, fuzzy
+msgstr "Modificar l'adreça"
+
 msgid "Modify Extended Information"
-msgstr "Entresenhas"
-
-#, fuzzy
+msgstr ""
+
 msgid "Modify Information"
-msgstr "Entresenhas"
-
-#, fuzzy
+msgstr ""
+
 msgid "Update"
-msgstr "Data"
-
-#, fuzzy
+msgstr ""
+
 msgid "Could not change buddy information."
-msgstr "Entresenhas sus l'utilizaire"
+msgstr ""
 
 msgid "Note"
 msgstr "Nòta"
 
 #. callback
-#, fuzzy
 msgid "Buddy Memo"
-msgstr "Tièra de contactes"
+msgstr ""
 
 msgid "Change his/her memo as you like"
 msgstr ""
 
-#, fuzzy
 msgid "_Modify"
-msgstr "Modificar"
-
-#, fuzzy
+msgstr "_Modificar"
+
 msgid "Memo Modify"
-msgstr "Modificar"
-
-#, fuzzy
+msgstr ""
+
 msgid "Server says:"
-msgstr "_Servidor :"
+msgstr ""
 
 msgid "Your request was accepted."
 msgstr ""
@@ -7946,20 +7797,17 @@
 msgid "%u requires verification: %s"
 msgstr ""
 
-#, fuzzy
 msgid "Add buddy question"
-msgstr "Autorizar"
-
-#, fuzzy
+msgstr ""
+
 msgid "Enter answer here"
-msgstr "Picatz lo mot de pas"
+msgstr ""
 
 msgid "Send"
-msgstr "Segondas"
-
-#, fuzzy
+msgstr "Mandar"
+
 msgid "Invalid answer."
-msgstr "L'expression es pas valida"
+msgstr ""
 
 msgid "Authorization denied message:"
 msgstr ""
@@ -7971,9 +7819,8 @@
 msgid "%u needs authorization"
 msgstr ""
 
-#, fuzzy
 msgid "Add buddy authorize"
-msgstr "Autorizar"
+msgstr ""
 
 msgid "Enter request here"
 msgstr ""
@@ -7981,17 +7828,14 @@
 msgid "Would you be my friend?"
 msgstr ""
 
-#, fuzzy
 msgid "QQ Buddy"
-msgstr "Apondre lo contacte"
-
-#, fuzzy
+msgstr ""
+
 msgid "Add buddy"
-msgstr "Apondre lo contacte"
-
-#, fuzzy
+msgstr "Apondre un contacte"
+
 msgid "Invalid QQ Number"
-msgstr "L'expression es pas valida"
+msgstr ""
 
 msgid "Failed sending authorize"
 msgstr ""
@@ -8021,7 +7865,7 @@
 
 #, c-format
 msgid "Message: %s"
-msgstr ""
+msgstr "Messatge : %s"
 
 msgid "ID: "
 msgstr ""
@@ -8030,7 +7874,7 @@
 msgstr ""
 
 msgid "QQ Qun"
-msgstr ""
+msgstr "QQ Qun"
 
 msgid "Please enter Qun number"
 msgstr ""
@@ -8054,28 +7898,23 @@
 msgstr ""
 
 #. XXX: Should this be "Topic"?
-#, fuzzy
 msgid "Room Title"
-msgstr "Títol"
-
-#, fuzzy
+msgstr ""
+
 msgid "Notice"
-msgstr "Nòta"
-
-#, fuzzy
+msgstr ""
+
 msgid "Detail"
-msgstr "Defaut"
+msgstr ""
 
 msgid "Creator"
 msgstr "Creator"
 
-#, fuzzy
 msgid "About me"
-msgstr "A prepaus de %s"
-
-#, fuzzy
+msgstr "A prepaus de ieu"
+
 msgid "Category"
-msgstr "Creator"
+msgstr "Categoria"
 
 msgid "The Qun does not allow others to join"
 msgstr ""
@@ -8086,9 +7925,9 @@
 msgid "Input request here"
 msgstr ""
 
-#, fuzzy, c-format
+#, c-format
 msgid "Successfully joined Qun %s (%u)"
-msgstr "Entresenhas sus l'utilizaire"
+msgstr ""
 
 msgid "Successfully joined Qun"
 msgstr ""
@@ -8100,16 +7939,14 @@
 msgid "QQ Qun Operation"
 msgstr ""
 
-#, fuzzy
 msgid "Failed:"
-msgstr "Error"
+msgstr ""
 
 msgid "Join Qun, Unknown Reply"
 msgstr ""
 
-#, fuzzy
 msgid "Quit Qun"
-msgstr "Quitar"
+msgstr ""
 
 msgid ""
 "Note, if you are the creator, \n"
@@ -8119,13 +7956,11 @@
 msgid "Sorry, you are not our style"
 msgstr ""
 
-#, fuzzy
 msgid "Successfully changed Qun members"
-msgstr "Entresenhas sus l'utilizaire"
-
-#, fuzzy
+msgstr ""
+
 msgid "Successfully changed Qun information"
-msgstr "Entresenhas sus l'utilizaire"
+msgstr ""
 
 msgid "You have successfully created a Qun"
 msgstr ""
@@ -8152,13 +7987,13 @@
 msgid "<b>Joining Qun %u is approved by admin %u for %s</b>"
 msgstr ""
 
-#, fuzzy, c-format
+#, c-format
 msgid "<b>Removed buddy %u.</b>"
-msgstr "Suprimir un contacte"
-
-#, fuzzy, c-format
+msgstr ""
+
+#, c-format
 msgid "<b>New buddy %u joined.</b>"
-msgstr "Suprimir un contacte"
+msgstr ""
 
 #, c-format
 msgid "Unknown-%d"
@@ -8168,7 +8003,7 @@
 msgstr "Nivèl"
 
 msgid " VIP"
-msgstr ""
+msgstr " VIP"
 
 msgid " TCP"
 msgstr ""
@@ -8180,9 +8015,8 @@
 msgstr ""
 
 msgid " Video"
-msgstr ""
-
-#, fuzzy
+msgstr " Vidèo"
+
 msgid " Zone"
 msgstr "Pas cap"
 
@@ -8193,11 +8027,10 @@
 msgstr ""
 
 msgid "Invalid name"
-msgstr "L'expression es pas valida"
-
-#, fuzzy
+msgstr ""
+
 msgid "Select icon..."
-msgstr "Seleccionar una poliça"
+msgstr ""
 
 #, c-format
 msgid "<b>Login time</b>: %d-%d-%d, %d:%d:%d<br>\n"
@@ -8253,7 +8086,7 @@
 
 #, c-format
 msgid "<b>IP</b>: %s<br>\n"
-msgstr ""
+msgstr "<b>IP</b> : %s<br>\n"
 
 msgid "Login Information"
 msgstr ""
@@ -8282,31 +8115,27 @@
 msgid "<i>Feel free to join us!</i> :)"
 msgstr ""
 
-#, fuzzy, c-format
+#, c-format
 msgid "About OpenQ %s"
-msgstr "A prepaus de %s"
-
-#, fuzzy
+msgstr "A prepaus d'OpenQ %s"
+
 msgid "Change Icon"
-msgstr "Modificar lo mot de pas"
+msgstr ""
 
 msgid "Change Password"
 msgstr "Modificar lo mot de pas"
 
-#, fuzzy
 msgid "Account Information"
-msgstr "Entresenhas"
+msgstr "Entresenhas sul compte"
 
 msgid "Update all QQ Quns"
 msgstr ""
 
-#, fuzzy
 msgid "About OpenQ"
-msgstr "A prepaus de %s"
-
-#, fuzzy
+msgstr "A prepaus d'OpenQ"
+
 msgid "Modify Buddy Memo"
-msgstr "Adreça personala"
+msgstr ""
 
 #. *< type
 #. *< ui_requirement
@@ -8318,34 +8147,29 @@
 #. *< version
 #. *  summary
 #. *  description
-#, fuzzy
 msgid "QQ Protocol Plugin"
-msgstr "Protocòl"
-
-#, fuzzy
+msgstr ""
+
 msgid "Auto"
-msgstr "Autor"
-
-#, fuzzy
+msgstr "Auto"
+
 msgid "Select Server"
-msgstr "Seleccionar un utilizaire"
-
-msgid "QQ2005"
-msgstr ""
-
-msgid "QQ2007"
 msgstr ""
 
 msgid "QQ2008"
-msgstr ""
-
-#, fuzzy
+msgstr "QQ2008"
+
+msgid "QQ2007"
+msgstr "QQ2007"
+
+msgid "QQ2005"
+msgstr "QQ2005"
+
 msgid "Connect by TCP"
-msgstr "Se connectar"
-
-#, fuzzy
+msgstr ""
+
 msgid "Show server notice"
-msgstr "Entresenhas sul servidor"
+msgstr ""
 
 msgid "Show server news"
 msgstr ""
@@ -8356,9 +8180,8 @@
 msgid "Keep alive interval (seconds)"
 msgstr ""
 
-#, fuzzy
 msgid "Update interval (seconds)"
-msgstr "Entresenhas sus l'utilizaire"
+msgstr ""
 
 msgid "Unable to decrypt server reply"
 msgstr ""
@@ -8367,9 +8190,9 @@
 msgid "Failed requesting token, 0x%02X"
 msgstr ""
 
-#, fuzzy, c-format
+#, c-format
 msgid "Invalid token len, %d"
-msgstr "L'expression es pas valida"
+msgstr ""
 
 #. extend redirect used in QQ2006
 msgid "Redirect_EX is not currently supported"
@@ -8378,9 +8201,8 @@
 #. need activation
 #. need activation
 #. need activation
-#, fuzzy
 msgid "Activation required"
-msgstr "L'autentificacion a abocat"
+msgstr "L'activacion a abocat"
 
 #, c-format
 msgid "Unknown reply code when logging in (0x%02X)"
@@ -8395,13 +8217,11 @@
 msgid "Failed captcha verification"
 msgstr ""
 
-#, fuzzy
 msgid "Captcha Image"
-msgstr "Enregistrar l'imatge"
-
-#, fuzzy
+msgstr ""
+
 msgid "Enter code"
-msgstr "Picatz lo mot de pas"
+msgstr ""
 
 msgid "QQ Captcha Verification"
 msgstr ""
@@ -8422,9 +8242,8 @@
 msgid "Socket error"
 msgstr ""
 
-#, fuzzy
 msgid "Getting server"
-msgstr "Connectat"
+msgstr ""
 
 msgid "Requesting token"
 msgstr ""
@@ -8432,33 +8251,30 @@
 msgid "Unable to resolve hostname"
 msgstr ""
 
-#, fuzzy
 msgid "Invalid server or port"
-msgstr "L'expression es pas valida"
-
-#, fuzzy
+msgstr ""
+
 msgid "Connecting to server"
-msgstr "Connectat"
-
-#, fuzzy
+msgstr "Connexion al servidor"
+
 msgid "QQ Error"
-msgstr "Error"
-
-#, fuzzy, c-format
+msgstr "Error QQ"
+
+#, c-format
 msgid ""
 "Server News:\n"
 "%s\n"
 "%s\n"
 "%s"
-msgstr "Servidor"
-
-#, fuzzy, c-format
+msgstr ""
+
+#, c-format
 msgid "%s:%s"
-msgstr "%s (%s)"
-
-#, fuzzy, c-format
+msgstr "%s:%s"
+
+#, c-format
 msgid "From %s:"
-msgstr "De"
+msgstr "De %s :"
 
 #, c-format
 msgid ""
@@ -8466,9 +8282,8 @@
 "%s"
 msgstr ""
 
-#, fuzzy
 msgid "Unknown SERVER CMD"
-msgstr "Rason desconeguda"
+msgstr ""
 
 #, c-format
 msgid ""
@@ -8476,20 +8291,17 @@
 "Room %u, reply 0x%02X"
 msgstr ""
 
-#, fuzzy
 msgid "QQ Qun Command"
-msgstr "Comanda"
+msgstr ""
 
 msgid "Unable to decrypt login reply"
 msgstr ""
 
-#, fuzzy
 msgid "Unknown LOGIN CMD"
-msgstr "Rason desconeguda"
-
-#, fuzzy
+msgstr ""
+
 msgid "Unknown CLIENT CMD"
-msgstr "Rason desconeguda"
+msgstr ""
 
 #, c-format
 msgid "%d has declined the file %s"
@@ -8674,7 +8486,7 @@
 msgstr ""
 
 msgid "Select User"
-msgstr "Seleccionar un utilizaire"
+msgstr "Causir l'utilizaire"
 
 msgid "Unable to add user: user not found"
 msgstr ""
@@ -9209,7 +9021,7 @@
 msgstr ""
 
 msgid "Personal Information"
-msgstr "Entresenhas personalas"
+msgstr ""
 
 msgid "Birth Day"
 msgstr ""
@@ -9308,7 +9120,7 @@
 msgstr ""
 
 msgid "Ping"
-msgstr "Ajuston"
+msgstr "Ping"
 
 msgid "Ping failed"
 msgstr ""
@@ -9367,9 +9179,8 @@
 msgid "Disconnected by server"
 msgstr ""
 
-#, fuzzy
 msgid "Error connecting to SILC Server"
-msgstr "Connectat"
+msgstr ""
 
 msgid "Key Exchange failed"
 msgstr ""
@@ -9417,7 +9228,7 @@
 msgstr "SMS"
 
 msgid "MMS"
-msgstr ""
+msgstr "MMS"
 
 msgid "Video conferencing"
 msgstr ""
@@ -9642,7 +9453,7 @@
 msgstr ""
 
 msgid "HMAC"
-msgstr ""
+msgstr "HMAC"
 
 msgid "Use Perfect Forward Secrecy"
 msgstr ""
@@ -9693,7 +9504,7 @@
 
 #, c-format
 msgid "Country: \t%s\n"
-msgstr ""
+msgstr "Païs : \t%s\n"
 
 #, c-format
 msgid "Algorithm: \t%s\n"
@@ -9705,7 +9516,7 @@
 
 #, c-format
 msgid "Version: \t%s\n"
-msgstr ""
+msgstr "Version : \t%s\n"
 
 #, c-format
 msgid ""
@@ -9810,9 +9621,8 @@
 msgid "Unable to create connection"
 msgstr ""
 
-#, fuzzy
 msgid "Unknown server response"
-msgstr "Rason desconeguda"
+msgstr ""
 
 msgid "Unable to create listen socket"
 msgstr ""
@@ -9820,9 +9630,8 @@
 msgid "SIP usernames may not contain whitespaces or @ symbols"
 msgstr ""
 
-#, fuzzy
 msgid "SIP connect server not specified"
-msgstr "Entresenhas sul servidor"
+msgstr ""
 
 #. *< type
 #. *< ui_requirement
@@ -9879,9 +9688,8 @@
 #. *< version
 #. *  summary
 #. *  description
-#, fuzzy
 msgid "Yahoo! Protocol Plugin"
-msgstr "Protocòl"
+msgstr ""
 
 msgid "Pager port"
 msgstr ""
@@ -9917,9 +9725,8 @@
 #. *< version
 #. *  summary
 #. *  description
-#, fuzzy
 msgid "Yahoo! JAPAN Protocol Plugin"
-msgstr "Protocòl"
+msgstr ""
 
 #, c-format
 msgid "%s has sent you a webcam invite, which is not yet supported."
@@ -9971,9 +9778,8 @@
 msgstr ""
 
 #. username or password missing
-#, fuzzy
 msgid "Username or password missing"
-msgstr "Picatz lo mot de pas"
+msgstr ""
 
 #, c-format
 msgid ""
@@ -9994,9 +9800,8 @@
 msgid "Ignore buddy?"
 msgstr ""
 
-#, fuzzy
 msgid "Invalid username or password"
-msgstr "L'expression es pas valida"
+msgstr ""
 
 msgid ""
 "Your account has been locked due to too many failed login attempts.  Please "
@@ -10030,9 +9835,9 @@
 msgid "Received unexpected HTTP response from server"
 msgstr ""
 
-#, fuzzy, c-format
+#, c-format
 msgid "Lost connection with %s: %s"
-msgstr "Connectat"
+msgstr ""
 
 #, c-format
 msgid "Unable to establish a connection with %s: %s"
@@ -10238,9 +10043,8 @@
 msgid "User Rooms"
 msgstr ""
 
-#, fuzzy
 msgid "Connection problem with the YCHT server"
-msgstr "Connectat"
+msgstr ""
 
 msgid ""
 "(There was an error converting this message.\t Check the 'Encoding' option "
@@ -10259,7 +10063,7 @@
 msgstr ""
 
 msgid "Anyone"
-msgstr "Qual que siá"
+msgstr ""
 
 msgid "_Class:"
 msgstr ""
@@ -10389,7 +10193,7 @@
 #. * A wrapper for purple_request_action() that uses @c Yes and @c No buttons.
 #.
 msgid "_Yes"
-msgstr "_Òc"
+msgstr "Ò_c"
 
 msgid "_No"
 msgstr "_Non"
@@ -10431,17 +10235,15 @@
 msgstr ""
 
 #. Shortcut
-#, fuzzy
 msgid "Shortcut"
-msgstr "Ordenar"
+msgstr "Acorchi"
 
 msgid "The text-shortcut for the smiley"
 msgstr ""
 
 #. Stored Image
-#, fuzzy
 msgid "Stored Image"
-msgstr "Enregistrar l'imatge"
+msgstr ""
 
 msgid "Stored Image. (that'll have to do for now)"
 msgstr ""
@@ -10506,7 +10308,7 @@
 #.
 #, c-format
 msgid "%x %X"
-msgstr ""
+msgstr "%x %X"
 
 msgid "Calculating..."
 msgstr "A calcular..."
@@ -10518,37 +10320,37 @@
 msgid "%d second"
 msgid_plural "%d seconds"
 msgstr[0] "%d segonda"
-msgstr[1] "%d secondes"
+msgstr[1] "%d segondas"
 
 #, c-format
 msgid "%d day"
 msgid_plural "%d days"
 msgstr[0] "%d jorn"
-msgstr[1] "%d jours"
+msgstr[1] "%d jorns"
 
 #, c-format
 msgid "%s, %d hour"
 msgid_plural "%s, %d hours"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%s, %d ora"
+msgstr[1] "%s, %d oras"
 
 #, c-format
 msgid "%d hour"
 msgid_plural "%d hours"
 msgstr[0] "%d ora"
-msgstr[1] "%d heures"
+msgstr[1] "%d oras"
 
 #, c-format
 msgid "%s, %d minute"
 msgid_plural "%s, %d minutes"
-msgstr[0] ""
-msgstr[1] ""
+msgstr[0] "%s, %d minuta"
+msgstr[1] "%s, %d minutas"
 
 #, c-format
 msgid "%d minute"
 msgid_plural "%d minutes"
 msgstr[0] "%d minuta"
-msgstr[1] "%d minutes"
+msgstr[1] "%d minutas"
 
 #, c-format
 msgid "Could not open %s: Redirected too many times"
@@ -10582,11 +10384,11 @@
 
 #, c-format
 msgid " - %s"
-msgstr ""
+msgstr " - %s"
 
 #, c-format
 msgid " (%s)"
-msgstr ""
+msgstr " (%s)"
 
 #. 10053
 msgid "Connection interrupted by other software on your computer."
@@ -10598,11 +10400,11 @@
 
 #. 10060
 msgid "Connection timed out."
-msgstr "Connectat"
+msgstr ""
 
 #. 10061
 msgid "Connection refused."
-msgstr "Connectat"
+msgstr ""
 
 #. 10048
 msgid "Address already in use."
@@ -10636,7 +10438,7 @@
 msgstr ""
 
 msgid "_Username:"
-msgstr "_Nom d'utilizaire :"
+msgstr "Nom d'_utilizaire :"
 
 msgid "Remember pass_word"
 msgstr ""
@@ -10655,9 +10457,8 @@
 msgid "Use this buddy _icon for this account:"
 msgstr ""
 
-#, fuzzy
 msgid "Ad_vanced"
-msgstr "_Avançat"
+msgstr "A_vançat"
 
 msgid "Use GNOME Proxy Settings"
 msgstr ""
@@ -10672,10 +10473,10 @@
 msgstr "HTTP"
 
 msgid "SOCKS 4"
-msgstr ""
+msgstr "SOCKS 4"
 
 msgid "SOCKS 5"
-msgstr ""
+msgstr "SOCKS 5"
 
 msgid "Use Environmental Settings"
 msgstr ""
@@ -10696,7 +10497,7 @@
 msgstr ""
 
 msgid "_Host:"
-msgstr "_Òste :"
+msgstr "Ò_ste :"
 
 msgid "_Port:"
 msgstr "_Pòrt :"
@@ -10719,9 +10520,8 @@
 msgid "Create _this new account on the server"
 msgstr ""
 
-#, fuzzy
 msgid "P_roxy"
-msgstr "Proxy"
+msgstr "P_roxy"
 
 msgid "Enabled"
 msgstr "Activat"
@@ -10753,9 +10553,8 @@
 msgid "The background color for the buddy list"
 msgstr ""
 
-#, fuzzy
 msgid "Layout"
-msgstr "Laossian"
+msgstr ""
 
 msgid "The layout of icons, name, and status of the buddy list"
 msgstr ""
@@ -10763,9 +10562,8 @@
 #. Group
 #. Note to translators: These two strings refer to the background color
 #. of a buddy list group when in its expanded state
-#, fuzzy
 msgid "Expanded Background Color"
-msgstr "Color de fons"
+msgstr ""
 
 msgid "The background color of an expanded group"
 msgstr ""
@@ -10780,9 +10578,8 @@
 
 #. Note to translators: These two strings refer to the background color
 #. of a buddy list group when in its collapsed state
-#, fuzzy
 msgid "Collapsed Background Color"
-msgstr "Color de fons"
+msgstr "Col"
 
 msgid "The background color of a collapsed group"
 msgstr ""
@@ -10798,63 +10595,56 @@
 #. Buddy
 #. Note to translators: These two strings refer to the background color
 #. of a buddy list contact or chat room
-#, fuzzy
 msgid "Contact/Chat Background Color"
-msgstr "Color de fons"
+msgstr ""
 
 msgid "The background color of a contact or chat"
 msgstr ""
 
 #. Note to translators: These two strings refer to the font and color
 #. of a buddy list contact when in its expanded state
-#, fuzzy
 msgid "Contact Text"
-msgstr "Ordenar"
+msgstr ""
 
 msgid "The text information for when a contact is expanded"
 msgstr ""
 
 #. Note to translators: These two strings refer to the font and color
 #. of a buddy list buddy when it is online
-#, fuzzy
 msgid "Online Text"
-msgstr "En linha"
+msgstr ""
 
 msgid "The text information for when a buddy is online"
 msgstr ""
 
 #. Note to translators: These two strings refer to the font and color
 #. of a buddy list buddy when it is away
-#, fuzzy
 msgid "Away Text"
-msgstr "Absent(a)"
+msgstr "Tèxte dels contactes absents"
 
 msgid "The text information for when a buddy is away"
 msgstr ""
 
 #. Note to translators: These two strings refer to the font and color
 #. of a buddy list buddy when it is offline
-#, fuzzy
 msgid "Offline Text"
-msgstr "Desconnectat"
+msgstr ""
 
 msgid "The text information for when a buddy is offline"
 msgstr ""
 
 #. Note to translators: These two strings refer to the font and color
 #. of a buddy list buddy when it is idle
-#, fuzzy
 msgid "Idle Text"
-msgstr "Inactiu"
+msgstr ""
 
 msgid "The text information for when a buddy is idle"
 msgstr ""
 
 #. Note to translators: These two strings refer to the font and color
 #. of a buddy list buddy when they have sent you a new message
-#, fuzzy
 msgid "Message Text"
-msgstr "Messatge"
+msgstr ""
 
 msgid "The text information for when a buddy has an unread message"
 msgstr ""
@@ -10888,9 +10678,8 @@
 msgid "Please update the necessary fields."
 msgstr ""
 
-#, fuzzy
 msgid "A_ccount"
-msgstr "_Compte :"
+msgstr "_Compte"
 
 msgid ""
 "Please enter the appropriate information about the chat you would like to "
@@ -10901,10 +10690,10 @@
 msgstr ""
 
 msgid "_Block"
-msgstr ""
+msgstr "_Blocar"
 
 msgid "Un_block"
-msgstr ""
+msgstr "Des_blocar"
 
 msgid "Move to"
 msgstr ""
@@ -10925,7 +10714,7 @@
 msgstr ""
 
 msgid "_Send File..."
-msgstr "_Enviar lo fichièr..."
+msgstr "_Mandar un fichièr..."
 
 msgid "Add Buddy _Pounce..."
 msgstr ""
@@ -10940,7 +10729,7 @@
 msgstr ""
 
 msgid "_Alias..."
-msgstr ""
+msgstr "_Aliàs..."
 
 msgid "_Remove"
 msgstr "_Suprimir"
@@ -10998,9 +10787,8 @@
 msgid "Please select your mood from the list"
 msgstr ""
 
-#, fuzzy
 msgid "Message (optional)"
-msgstr "Messatge"
+msgstr ""
 
 msgid "Edit User Mood"
 msgstr ""
@@ -11009,7 +10797,7 @@
 #. gtk_blist_key_press_cb to "Get User Info" on the selected buddy.
 #. Buddies menu
 msgid "/_Buddies"
-msgstr ""
+msgstr "/_Contactes"
 
 msgid "/Buddies/New Instant _Message..."
 msgstr ""
@@ -11058,15 +10846,14 @@
 
 #. Accounts menu
 msgid "/_Accounts"
-msgstr "/_Comptse"
-
-#, fuzzy
+msgstr "/_Comptes"
+
 msgid "/Accounts/Manage Accounts"
-msgstr "/Comptes/Gerir"
+msgstr "/Comptes/Gerir los comptes"
 
 #. Tools
 msgid "/_Tools"
-msgstr ""
+msgstr "/_Espleches"
 
 msgid "/Tools/Buddy _Pounces"
 msgstr ""
@@ -11108,20 +10895,17 @@
 msgid "/Help/Online _Help"
 msgstr ""
 
-#, fuzzy
 msgid "/Help/_Build Information"
-msgstr "Entresenhas"
+msgstr ""
 
 msgid "/Help/_Debug Window"
 msgstr ""
 
-#, fuzzy
 msgid "/Help/De_veloper Information"
-msgstr "Entresenhas sul servidor"
-
-#, fuzzy
+msgstr ""
+
 msgid "/Help/_Translator Information"
-msgstr "Entresenhas personalas"
+msgstr ""
 
 msgid "/Help/_About"
 msgstr "/Ajuda/_A prepaus"
@@ -11251,7 +11035,7 @@
 msgstr "<b>Mot de pas :</b>"
 
 msgid "_Login"
-msgstr "Se _connectar"
+msgstr "_Connexion"
 
 msgid "/Accounts"
 msgstr "/Comptes"
@@ -11285,11 +11069,10 @@
 msgstr ""
 
 msgid "Add a buddy.\n"
-msgstr ""
-
-#, fuzzy
+msgstr "Apondre un contacte.\n"
+
 msgid "Buddy's _username:"
-msgstr "_Nom d'utilizaire :"
+msgstr ""
 
 msgid "(Optional) A_lias:"
 msgstr ""
@@ -11311,7 +11094,7 @@
 msgstr ""
 
 msgid "A_lias:"
-msgstr ""
+msgstr "A_liàs :"
 
 msgid "_Group:"
 msgstr "_Grop :"
@@ -11337,9 +11120,8 @@
 msgid "_Edit Account"
 msgstr ""
 
-#, fuzzy
 msgid "Set _Mood..."
-msgstr "Modificar lo mot de pas"
+msgstr ""
 
 msgid "No actions available"
 msgstr ""
@@ -11348,7 +11130,7 @@
 msgstr "_Desactivar"
 
 msgid "/Tools"
-msgstr ""
+msgstr "/Espleches"
 
 msgid "/Buddies/Sort Buddies"
 msgstr ""
@@ -11395,9 +11177,8 @@
 msgid "Get Away Message"
 msgstr ""
 
-#, fuzzy
 msgid "Last Said"
-msgstr "Nom"
+msgstr ""
 
 msgid "Unable to save icon file to disk."
 msgstr ""
@@ -11425,7 +11206,7 @@
 
 #. Conversation menu
 msgid "/_Conversation"
-msgstr ""
+msgstr "/_Charradissa"
 
 msgid "/Conversation/New Instant _Message..."
 msgstr ""
@@ -11460,9 +11241,8 @@
 msgid "/Conversation/Se_nd File..."
 msgstr ""
 
-#, fuzzy
 msgid "/Conversation/Get _Attention"
-msgstr "Connectat"
+msgstr ""
 
 msgid "/Conversation/Add Buddy _Pounce..."
 msgstr ""
@@ -11502,7 +11282,7 @@
 
 #. Options
 msgid "/_Options"
-msgstr ""
+msgstr "/_Opcions"
 
 msgid "/Options/Enable _Logging"
 msgstr ""
@@ -11520,7 +11300,7 @@
 msgstr ""
 
 msgid "/Options"
-msgstr ""
+msgstr "/Opcions"
 
 #. The menubar has been deactivated. Make sure the 'More' submenu is regenerated next time
 #. * the 'Conversation' menu pops up.
@@ -11528,7 +11308,7 @@
 #. * the 'Conversation' menu pops up because the entries can change after the
 #. * conversation is created.
 msgid "/Conversation"
-msgstr ""
+msgstr "/Charradissa"
 
 msgid "/Conversation/View Log"
 msgstr ""
@@ -11545,9 +11325,8 @@
 msgid "/Conversation/Send File..."
 msgstr ""
 
-#, fuzzy
 msgid "/Conversation/Get Attention"
-msgstr "Connectat"
+msgstr ""
 
 msgid "/Conversation/Add Buddy Pounce..."
 msgstr ""
@@ -11605,19 +11384,17 @@
 msgstr ""
 
 msgid "_Send"
-msgstr "_Enviar"
+msgstr "_Mandar"
 
 #. Setup the label telling how many people are in the room.
 msgid "0 people in room"
 msgstr "0 persona dins la sala"
 
-#, fuzzy
 msgid "Close Find bar"
-msgstr "Tampar l'onglet"
-
-#, fuzzy
+msgstr ""
+
 msgid "Find:"
-msgstr "Recercar"
+msgstr "Recercar :"
 
 #, c-format
 msgid "%d person in room"
@@ -11650,7 +11427,7 @@
 msgstr ""
 
 msgid "Close all tabs"
-msgstr ""
+msgstr "Tampar totes los onglets"
 
 msgid "Detach this tab"
 msgstr ""
@@ -11659,7 +11436,7 @@
 msgstr "Tampar l'onglet"
 
 msgid "Close conversation"
-msgstr ""
+msgstr "Tampar la charradissa"
 
 msgid "Last created window"
 msgstr ""
@@ -11671,10 +11448,10 @@
 msgstr ""
 
 msgid "By group"
-msgstr ""
+msgstr "Per grop"
 
 msgid "By account"
-msgstr ""
+msgstr "Per compte"
 
 msgid "Find"
 msgstr "Recercar"
@@ -11707,13 +11484,13 @@
 msgstr ""
 
 msgid "Level "
-msgstr ""
+msgstr "Nivèl "
 
 msgid "Select the debug filter level."
 msgstr ""
 
 msgid "All"
-msgstr "Totes"
+msgstr "Tot"
 
 msgid "Misc"
 msgstr ""
@@ -11722,17 +11499,13 @@
 msgstr "Alèrta"
 
 msgid "Error "
-msgstr ""
+msgstr "Error "
 
 msgid "Fatal Error"
 msgstr ""
 
-msgid "bug master"
-msgstr ""
-
-#, fuzzy
 msgid "artist"
-msgstr "Artista"
+msgstr "artista"
 
 #. feel free to not translate this
 msgid "Ka-Hing Cheung"
@@ -11764,7 +11537,7 @@
 msgstr ""
 
 msgid "XMPP"
-msgstr ""
+msgstr "XMPP"
 
 msgid "original author"
 msgstr ""
@@ -11781,9 +11554,8 @@
 msgid "Arabic"
 msgstr "Arab"
 
-#, fuzzy
 msgid "Assamese"
-msgstr "Jòcs"
+msgstr ""
 
 msgid "Belarusian Latin"
 msgstr "Bielorus latin"
@@ -11794,9 +11566,8 @@
 msgid "Bengali"
 msgstr "Bengalí"
 
-#, fuzzy
 msgid "Bengali-India"
-msgstr "Bengalí"
+msgstr "Bengalí indian"
 
 msgid "Bosnian"
 msgstr "Bosniac"
@@ -11852,9 +11623,8 @@
 msgid "French"
 msgstr "Francés"
 
-#, fuzzy
 msgid "Irish"
-msgstr "Curd"
+msgstr "Irlandés"
 
 msgid "Galician"
 msgstr "Galician"
@@ -11874,9 +11644,8 @@
 msgid "Hungarian"
 msgstr "Ongrés"
 
-#, fuzzy
 msgid "Armenian"
-msgstr "Romanian"
+msgstr ""
 
 msgid "Indonesian"
 msgstr "Indonesian"
@@ -11893,9 +11662,8 @@
 msgid "Ubuntu Georgian Translators"
 msgstr ""
 
-#, fuzzy
 msgid "Khmer"
-msgstr "Autre"
+msgstr ""
 
 msgid "Kannada"
 msgstr "Kannadà"
@@ -11915,24 +11683,23 @@
 msgid "Maithili"
 msgstr ""
 
+msgid "Meadow Mari"
+msgstr ""
+
 msgid "Macedonian"
 msgstr "Macedonian"
 
-#, fuzzy
 msgid "Malayalam"
-msgstr "Òme"
-
-#, fuzzy
+msgstr ""
+
 msgid "Mongolian"
-msgstr "Macedonian"
-
-#, fuzzy
+msgstr ""
+
 msgid "Marathi"
-msgstr "Gujarati"
-
-#, fuzzy
+msgstr ""
+
 msgid "Malay"
-msgstr "Òme"
+msgstr ""
 
 msgid "Bokmål Norwegian"
 msgstr ""
@@ -11947,11 +11714,10 @@
 msgstr "Nòrvegian (Nynorsk)"
 
 msgid "Occitan"
-msgstr ""
-
-#, fuzzy
+msgstr "Occitan"
+
 msgid "Oriya"
-msgstr "Opcions"
+msgstr ""
 
 msgid "Punjabi"
 msgstr "Punjabi"
@@ -12007,7 +11773,6 @@
 msgid "Turkish"
 msgstr "Turc"
 
-#, fuzzy
 msgid "Ukranian"
 msgstr "Ukrainien"
 
@@ -12068,14 +11833,13 @@
 msgid "About %s"
 msgstr "A prepaus de %s"
 
-#, fuzzy
 msgid "Build Information"
-msgstr "Entresenhas"
+msgstr ""
 
 #. End of not to be translated section
-#, fuzzy, c-format
+#, c-format
 msgid "%s Build Information"
-msgstr "Entresenhas sus l'utilizaire"
+msgstr ""
 
 msgid "Current Developers"
 msgstr ""
@@ -12089,9 +11853,9 @@
 msgid "Retired Crazy Patch Writers"
 msgstr ""
 
-#, fuzzy, c-format
+#, c-format
 msgid "%s Developer Information"
-msgstr "Entresenhas sul servidor"
+msgstr ""
 
 msgid "Current Translators"
 msgstr ""
@@ -12099,9 +11863,9 @@
 msgid "Past Translators"
 msgstr ""
 
-#, fuzzy, c-format
+#, c-format
 msgid "%s Translator Information"
-msgstr "Entresenhas"
+msgstr ""
 
 msgid "_Name"
 msgstr "_Nom"
@@ -12205,44 +11969,35 @@
 msgid "Right-click for more unread messages...\n"
 msgstr ""
 
-#, fuzzy
 msgid "_Change Status"
-msgstr "Modificar lo mot de pas"
-
-#, fuzzy
+msgstr ""
+
 msgid "Show Buddy _List"
-msgstr "Tièra de contactes"
-
-#, fuzzy
+msgstr ""
+
 msgid "_Unread Messages"
-msgstr "Messatges pas legits"
-
-#, fuzzy
+msgstr "Messatges _pas legits"
+
 msgid "New _Message..."
-msgstr "Enviar un messatge"
-
-#, fuzzy
+msgstr "_Messatge novèl..."
+
 msgid "_Accounts"
-msgstr "/_Comptse"
-
-#, fuzzy
+msgstr "/_Comptes"
+
 msgid "Plu_gins"
-msgstr "Ajustons"
-
-#, fuzzy
+msgstr "A_justons"
+
 msgid "Pr_eferences"
-msgstr "Preferéncias"
-
-#, fuzzy
+msgstr "Pr_eferéncias"
+
 msgid "Mute _Sounds"
-msgstr "Sons"
+msgstr ""
 
 msgid "_Blink on New Message"
 msgstr ""
 
-#, fuzzy
 msgid "_Quit"
-msgstr "Quitar"
+msgstr "_Quitar"
 
 msgid "Not started"
 msgstr ""
@@ -12403,7 +12158,7 @@
 msgstr ""
 
 msgid "Select Font"
-msgstr "Seleccionar una poliça"
+msgstr ""
 
 msgid "Select Text Color"
 msgstr ""
@@ -12412,7 +12167,7 @@
 msgstr ""
 
 msgid "_URL"
-msgstr ""
+msgstr "_URL"
 
 msgid "_Description"
 msgstr "_Descripcion"
@@ -12495,15 +12250,14 @@
 msgid "Insert Smiley"
 msgstr ""
 
-#, fuzzy
 msgid "Send Attention"
-msgstr "Attention !"
+msgstr ""
 
 msgid "<b>_Bold</b>"
 msgstr ""
 
 msgid "<i>_Italic</i>"
-msgstr ""
+msgstr "<i>_Italic</i>"
 
 msgid "<u>_Underline</u>"
 msgstr ""
@@ -12536,7 +12290,7 @@
 msgstr "_Imatge"
 
 msgid "_Link"
-msgstr ""
+msgstr "_Ligam"
 
 msgid "_Horizontal rule"
 msgstr ""
@@ -12544,9 +12298,8 @@
 msgid "_Smile!"
 msgstr ""
 
-#, fuzzy
 msgid "_Attention!"
-msgstr "Attention !"
+msgstr "_Atencion !"
 
 msgid "Log Deletion Failed"
 msgstr ""
@@ -12622,7 +12375,7 @@
 msgstr ""
 
 msgid "NAME"
-msgstr ""
+msgstr "NOM"
 
 msgid ""
 "enable specified account(s) (optional argument NAME\n"
@@ -12703,12 +12456,11 @@
 "The 'Manual' browser command has been chosen, but no command has been set."
 msgstr ""
 
-#, fuzzy
 msgid "No message"
-msgstr "Messatge"
+msgstr ""
 
 msgid "Open All Messages"
-msgstr ""
+msgstr "Dobrir totes los messatges"
 
 msgid "<span weight=\"bold\" size=\"larger\">You have mail!</span>"
 msgstr ""
@@ -12754,9 +12506,8 @@
 msgid "<b>Web site:</b>"
 msgstr ""
 
-#, fuzzy
 msgid "<b>Filename:</b>"
-msgstr "Nom de fichièr :"
+msgstr "<b>Nom de fichièr :</b>"
 
 msgid "Configure Pl_ugin"
 msgstr ""
@@ -12765,11 +12516,10 @@
 msgstr ""
 
 msgid "Select a file"
-msgstr "Seleccionar un fichièr"
-
-#, fuzzy
+msgstr ""
+
 msgid "Modify Buddy Pounce"
-msgstr "Entresenhas"
+msgstr ""
 
 #. Create the "Pounce on Whom" frame.
 msgid "Pounce on Whom"
@@ -12818,7 +12568,7 @@
 msgstr ""
 
 msgid "Send a _message"
-msgstr ""
+msgstr "Mandar un _messatge"
 
 msgid "E_xecute a command"
 msgstr ""
@@ -12844,13 +12594,11 @@
 msgid "Pounce Target"
 msgstr ""
 
-#, fuzzy
 msgid "Started typing"
-msgstr "Comença a picar"
-
-#, fuzzy
+msgstr ""
+
 msgid "Paused while typing"
-msgstr "L'utilizaire es a picar..."
+msgstr ""
 
 msgid "Signed on"
 msgstr ""
@@ -12861,23 +12609,20 @@
 msgid "Returned from being away"
 msgstr ""
 
-#, fuzzy
 msgid "Stopped typing"
 msgstr "S'arrèsta de picar"
 
 msgid "Signed off"
 msgstr ""
 
-#, fuzzy
 msgid "Became idle"
-msgstr "Enregistrar lo fichièr"
+msgstr ""
 
 msgid "Went away"
 msgstr ""
 
-#, fuzzy
 msgid "Sent a message"
-msgstr "Messatges enviats"
+msgstr ""
 
 msgid "Unknown.... Please report this!"
 msgstr ""
@@ -12891,9 +12636,8 @@
 msgid "The default Pidgin sound theme"
 msgstr ""
 
-#, fuzzy
 msgid "The default Pidgin buddy list theme"
-msgstr "Tièra de contactes"
+msgstr ""
 
 msgid "The default Pidgin status icon theme"
 msgstr ""
@@ -12907,9 +12651,8 @@
 msgid "Theme failed to copy."
 msgstr ""
 
-#, fuzzy
 msgid "Theme Selections"
-msgstr "Seleccionar una poliça"
+msgstr ""
 
 #. Instructions
 msgid ""
@@ -12918,20 +12661,17 @@
 "list."
 msgstr ""
 
-#, fuzzy
 msgid "Buddy List Theme:"
-msgstr "Tièra de contactes"
-
-#, fuzzy
+msgstr ""
+
 msgid "Status Icon Theme:"
-msgstr "Estatut"
+msgstr ""
 
 msgid "Sound Theme:"
 msgstr ""
 
-#, fuzzy
 msgid "Smiley Theme:"
-msgstr "Enregistrar l'imatge"
+msgstr ""
 
 msgid "Keyboard Shortcuts"
 msgstr ""
@@ -12949,9 +12689,8 @@
 msgid "On unread messages"
 msgstr ""
 
-#, fuzzy
 msgid "Conversation Window"
-msgstr "Connectat"
+msgstr ""
 
 msgid "_Hide new IM conversations:"
 msgstr ""
@@ -12976,10 +12715,10 @@
 msgstr ""
 
 msgid "Top"
-msgstr "Superior"
+msgstr "Naut"
 
 msgid "Bottom"
-msgstr "Inferior"
+msgstr "Bais"
 
 msgid "Left"
 msgstr "Esquèrra"
@@ -13046,17 +12785,15 @@
 msgid "Cannot start browser configuration program."
 msgstr ""
 
-#, fuzzy
 msgid "Disabled"
-msgstr "_Desactivar"
+msgstr "Desactivat"
 
 #, c-format
 msgid "Use _automatically detected IP address: %s"
 msgstr ""
 
-#, fuzzy
 msgid "ST_UN server:"
-msgstr "_Servidor :"
+msgstr "Servidor ST_UN :"
 
 msgid "<span style=\"italic\">Example: stunserver.org</span>"
 msgstr ""
@@ -13073,42 +12810,36 @@
 msgid "_Manually specify range of ports to listen on:"
 msgstr ""
 
-#, fuzzy
 msgid "_Start:"
-msgstr "Estat :"
-
-#, fuzzy
+msgstr ""
+
 msgid "_End:"
-msgstr "_Enviar"
+msgstr "_Fin :"
 
 #. TURN server
 msgid "Relay Server (TURN)"
 msgstr ""
 
-#, fuzzy
 msgid "_TURN server:"
-msgstr "_Servidor :"
-
-#, fuzzy
+msgstr "Servidor _TURN :"
+
 msgid "_UDP Port:"
-msgstr "_Pòrt :"
-
-#, fuzzy
+msgstr "Pòrt _UDP :"
+
 msgid "Use_rname:"
-msgstr "_Nom d'utilizaire :"
-
-#, fuzzy
+msgstr "Nom d'utilizai_re :"
+
 msgid "Pass_word:"
-msgstr "Mot de pas :"
+msgstr "Mot de _pas :"
 
 msgid "Seamonkey"
-msgstr ""
+msgstr "Seamonkey"
 
 msgid "Opera"
-msgstr "Opcions"
+msgstr "Opera"
 
 msgid "Netscape"
-msgstr ""
+msgstr "Netscape"
 
 msgid "Mozilla"
 msgstr "Mozilla"
@@ -13117,7 +12848,7 @@
 msgstr "Konqueror"
 
 msgid "Google Chrome"
-msgstr ""
+msgstr "Google Chrome"
 
 #. Do not move the line below.  Code below expects gnome-open to be in
 #. * this list immediately after xdg-open!
@@ -13163,7 +12894,7 @@
 msgstr ""
 
 msgid "_Browser:"
-msgstr ""
+msgstr "_Navigador :"
 
 msgid "_Open link in:"
 msgstr ""
@@ -13206,11 +12937,9 @@
 msgid "No proxy"
 msgstr ""
 
-#, fuzzy
 msgid "P_ort:"
 msgstr "_Pòrt :"
 
-#, fuzzy
 msgid "User_name:"
 msgstr "_Nom d'utilizaire :"
 
@@ -13274,24 +13003,20 @@
 msgid "Sounds when conversation has _focus"
 msgstr ""
 
-#, fuzzy
 msgid "_Enable sounds:"
-msgstr "Activat"
-
-#, fuzzy
+msgstr "A_ctivar los sons :"
+
 msgid "V_olume:"
-msgstr "Volum :"
+msgstr "V_olum :"
 
 msgid "Play"
 msgstr "Legir"
 
-#, fuzzy
 msgid "_Browse..."
-msgstr "Navegador"
-
-#, fuzzy
+msgstr ""
+
 msgid "_Reset"
-msgstr "Reinicializar"
+msgstr "_Reinicializar"
 
 msgid "_Report idle time:"
 msgstr ""
@@ -13325,14 +13050,13 @@
 msgstr "Interfaç"
 
 msgid "Browser"
-msgstr "Navegador"
+msgstr "Navigador"
 
 msgid "Status / Idle"
 msgstr ""
 
-#, fuzzy
 msgid "Themes"
-msgstr "Tèst"
+msgstr "Tèmas"
 
 msgid "Allow all users to contact me"
 msgstr ""
@@ -13344,7 +13068,7 @@
 msgstr ""
 
 msgid "Block all users"
-msgstr ""
+msgstr "Blocar totes los utilizaires"
 
 msgid "Block only the users below"
 msgstr ""
@@ -13383,7 +13107,7 @@
 msgstr ""
 
 msgid "Block User"
-msgstr ""
+msgstr "Blocar un utilizaire"
 
 msgid "Type a user to block."
 msgstr ""
@@ -13393,7 +13117,7 @@
 
 #, c-format
 msgid "Block %s?"
-msgstr ""
+msgstr "Blocar %s ?"
 
 #, c-format
 msgid "Are you sure you want to block %s?"
@@ -13473,29 +13197,24 @@
 msgid "Add Smiley"
 msgstr ""
 
-#, fuzzy
 msgid "_Image:"
-msgstr "_Imatge"
+msgstr "_Imatge :"
 
 #. Shortcut text
-#, fuzzy
 msgid "S_hortcut text:"
-msgstr "Ordenar"
-
-#, fuzzy
+msgstr ""
+
 msgid "Smiley"
-msgstr "Talha"
-
-#, fuzzy
+msgstr ""
+
 msgid "Shortcut Text"
-msgstr "Ordenar"
+msgstr ""
 
 msgid "Custom Smiley Manager"
 msgstr ""
 
-#, fuzzy
 msgid "Select Buddy Icon"
-msgstr "Seleccionar una poliça"
+msgstr ""
 
 msgid "Click to change your buddyicon for this account."
 msgstr ""
@@ -13516,7 +13235,7 @@
 msgstr ""
 
 msgid "Google Talk"
-msgstr ""
+msgstr "Google Talk"
 
 msgid "Facebook (XMPP)"
 msgstr ""
@@ -13601,9 +13320,8 @@
 msgid "Could not set icon"
 msgstr ""
 
-#, fuzzy
 msgid "_Open Link"
-msgstr "_Dobrir lo ligam dins lo navegaire"
+msgstr "D_obrir lo ligam"
 
 msgid "_Copy Link Location"
 msgstr "_Copiar l'emplaçament del ligam"
@@ -13611,9 +13329,8 @@
 msgid "_Copy Email Address"
 msgstr ""
 
-#, fuzzy
 msgid "_Open File"
-msgstr "_Enviar un fichièr"
+msgstr "D_obrir lo fichièr"
 
 msgid "Open _Containing Directory"
 msgstr ""
@@ -13621,19 +13338,17 @@
 msgid "Save File"
 msgstr "Enregistrar lo fichièr"
 
-#, fuzzy
 msgid "_Play Sound"
-msgstr "Legir un son"
-
-#, fuzzy
+msgstr "_Legir un son"
+
 msgid "_Save File"
-msgstr "Enregistrar lo fichièr"
+msgstr "Enregi_strar lo fichièr"
 
 msgid "Do you really want to clear?"
 msgstr ""
 
 msgid "Select color"
-msgstr "Seleccionar una color"
+msgstr ""
 
 #. Translators may want to transliterate the name.
 #. It is not to be translated.
@@ -13641,7 +13356,7 @@
 msgstr "Pidgin"
 
 msgid "_Alias"
-msgstr ""
+msgstr "_Aliàs"
 
 msgid "Close _tabs"
 msgstr ""
@@ -13650,22 +13365,19 @@
 msgstr ""
 
 msgid "_Invite"
-msgstr ""
-
-#, fuzzy
+msgstr "Conv_idar"
+
 msgid "_Modify..."
-msgstr "_Modificar"
-
-#, fuzzy
+msgstr "_Modificar..."
+
 msgid "_Add..."
-msgstr "_Apondre"
+msgstr "_Apondre..."
 
 msgid "_Open Mail"
 msgstr ""
 
-#, fuzzy
 msgid "_Edit"
-msgstr "Edicion"
+msgstr "_Edicion"
 
 msgid "Pidgin Tooltip"
 msgstr ""
@@ -13679,9 +13391,8 @@
 msgid "none"
 msgstr "pas cap"
 
-#, fuzzy
 msgid "Small"
-msgstr "Corrièl"
+msgstr "Pichons"
 
 msgid "Smaller versions of the default smileys"
 msgstr ""
@@ -13793,7 +13504,7 @@
 msgstr ""
 
 msgid "Sent Messages"
-msgstr "Messatges enviats"
+msgstr "Messatges mandats"
 
 msgid "Received Messages"
 msgstr ""
@@ -13813,13 +13524,11 @@
 
 #. Note to translators: The string "Enter an XMPP Server" is asking the
 #. user to type the name of an XMPP server which will then be queried
-#, fuzzy
 msgid "Server name request"
 msgstr "Nom d'utilisateur envoyé"
 
-#, fuzzy
 msgid "Enter an XMPP Server"
-msgstr "Picatz lo mot de pas"
+msgstr ""
 
 msgid "Select an XMPP server to query"
 msgstr ""
@@ -13827,16 +13536,14 @@
 msgid "Find Services"
 msgstr ""
 
-#, fuzzy
 msgid "Add to Buddy List"
-msgstr "Tièra de contactes"
+msgstr "Apondre a la tièra de contactes"
 
 msgid "Gateway"
 msgstr ""
 
-#, fuzzy
 msgid "Directory"
-msgstr "Creator"
+msgstr ""
 
 msgid "PubSub Collection"
 msgstr ""
@@ -13844,19 +13551,19 @@
 msgid "PubSub Leaf"
 msgstr ""
 
-#, fuzzy
 msgid ""
 "\n"
 "<b>Description:</b> "
-msgstr "Descripcion"
+msgstr ""
+"\n"
+"<b>Descripcion :</b> "
 
 #. Create the window.
 msgid "Service Discovery"
 msgstr ""
 
-#, fuzzy
 msgid "_Browse"
-msgstr "Navegador"
+msgstr ""
 
 msgid "Server does not exist"
 msgstr ""
@@ -14034,13 +13741,13 @@
 
 #. Optional Information section
 msgid "Optional information:"
-msgstr "Entresenhas opcionalas :"
+msgstr ""
 
 msgid "First name:"
 msgstr "Pichon nom :"
 
 msgid "Last name:"
-msgstr "Nom :"
+msgstr "Nom d'ostal :"
 
 msgid "Email:"
 msgstr ""
@@ -14281,9 +13988,8 @@
 msgid "Conversation Entry"
 msgstr ""
 
-#, fuzzy
 msgid "Conversation History"
-msgstr "Connectat"
+msgstr ""
 
 msgid "Request Dialog"
 msgstr ""
@@ -14292,7 +13998,7 @@
 msgstr ""
 
 msgid "Select Color"
-msgstr "Seleccionar una color"
+msgstr ""
 
 #, c-format
 msgid "Select Interface Font"
@@ -14314,9 +14020,8 @@
 msgid "GTK+ Theme Control Settings"
 msgstr ""
 
-#, fuzzy
 msgid "Colors"
-msgstr "Tampar"
+msgstr "Colors"
 
 msgid "Fonts"
 msgstr "Poliças"
@@ -14358,9 +14063,8 @@
 msgid "New Version Available"
 msgstr ""
 
-#, fuzzy
 msgid "Later"
-msgstr "Data"
+msgstr "Pus tard"
 
 msgid "Download Now"
 msgstr ""
@@ -14399,9 +14103,8 @@
 
 #. *< name
 #. *< version
-#, fuzzy
 msgid "Conversation Window Send Button."
-msgstr "Connectat"
+msgstr ""
 
 #. *< summary
 msgid ""
@@ -14472,34 +14175,29 @@
 msgid "Icon for Chat"
 msgstr ""
 
-#, fuzzy
 msgid "Ignored"
-msgstr "Ignorar"
-
-#, fuzzy
+msgstr "Ignorat"
+
 msgid "Founder"
-msgstr "Expeditor"
+msgstr ""
 
 #. A user in a chat room who has special privileges.
-#, fuzzy
 msgid "Operator"
-msgstr "Opcions"
+msgstr "Operador"
 
 #. A half operator is someone who has a subset of the privileges
 #. that an operator has.
 msgid "Half Operator"
 msgstr ""
 
-#, fuzzy
 msgid "Authorization dialog"
-msgstr "Autorizar"
+msgstr ""
 
 msgid "Error dialog"
 msgstr ""
 
-#, fuzzy
 msgid "Information dialog"
-msgstr "Entresenhas"
+msgstr ""
 
 msgid "Mail dialog"
 msgstr ""
@@ -14507,38 +14205,32 @@
 msgid "Question dialog"
 msgstr ""
 
-#, fuzzy
 msgid "Warning dialog"
-msgstr "Alèrta"
+msgstr ""
 
 msgid "What kind of dialog is this?"
 msgstr ""
 
-#, fuzzy
 msgid "Status Icons"
-msgstr "Estatut"
+msgstr ""
 
 msgid "Chatroom Emblems"
 msgstr ""
 
-#, fuzzy
 msgid "Dialog Icons"
-msgstr "Modificar lo mot de pas"
+msgstr ""
 
 msgid "Pidgin Icon Theme Editor"
 msgstr ""
 
-#, fuzzy
 msgid "Contact"
-msgstr "Se connectar"
-
-#, fuzzy
+msgstr "Contacte"
+
 msgid "Pidgin Buddylist Theme Editor"
-msgstr "Tièra de contactes"
-
-#, fuzzy
+msgstr ""
+
 msgid "Edit Buddylist Theme"
-msgstr "Tièra de contactes"
+msgstr ""
 
 msgid "Edit Icon Theme"
 msgstr ""
@@ -14608,10 +14300,10 @@
 msgstr ""
 
 msgid "12 hour time format"
-msgstr ""
+msgstr "Format 12 oras"
 
 msgid "24 hour time format"
-msgstr ""
+msgstr "Format 24 oras"
 
 msgid "Show dates in..."
 msgstr ""
@@ -14649,35 +14341,29 @@
 "timestamp formats."
 msgstr ""
 
-#, fuzzy
 msgid "Audio"
-msgstr "Autor"
-
-#, fuzzy
+msgstr ""
+
 msgid "Video"
-msgstr "Votz"
+msgstr "Vidèo"
 
 msgid "Output"
 msgstr ""
 
-#, fuzzy
 msgid "_Plugin"
-msgstr "Ajustons"
-
-#, fuzzy
+msgstr "A_juston"
+
 msgid "_Device"
-msgstr "Periferic"
+msgstr "_Periferic"
 
 msgid "Input"
 msgstr ""
 
-#, fuzzy
 msgid "P_lugin"
-msgstr "Ajustons"
-
-#, fuzzy
+msgstr "A_juston"
+
 msgid "D_evice"
-msgstr "Periferic"
+msgstr "P_eriferic"
 
 #. *< magic
 #. *< major version
@@ -14800,7 +14486,7 @@
 msgstr ""
 
 msgid "Account: "
-msgstr ""
+msgstr "Compte : "
 
 msgid "<font color='#777777'>Not connected to XMPP</font>"
 msgstr ""
@@ -14876,13 +14562,12 @@
 msgstr ""
 
 #. Installer Subsection Text
-#, fuzzy
 msgid "Localizations"
-msgstr "Emplaçament"
+msgstr "Traduccions"
 
 #. "Next >" appears on a button on the License Page of the Installer
 msgid "Next >"
-msgstr ""
+msgstr "Seguent >"
 
 #. Installer Subsection Text
 msgid "Pidgin Instant Messaging Client (required)"
@@ -14895,9 +14580,8 @@
 msgstr ""
 
 #. Installer Subsection Text
-#, fuzzy
 msgid "Shortcuts"
-msgstr "Ordenar"
+msgstr "Acorchis"
 
 #. Installer Subsection Detailed Description
 msgid "Shortcuts for starting Pidgin"
@@ -14908,9 +14592,8 @@
 msgstr ""
 
 #. Installer Subsection Text
-#, fuzzy
 msgid "Start Menu"
-msgstr "Data de debuta"
+msgstr ""
 
 #. Installer Subsection Detailed Description
 msgid ""
--- a/po/pl.po	Tue Dec 21 21:05:26 2010 +0900
+++ b/po/pl.po	Sat Feb 12 04:17:09 2011 +0900
@@ -13,8 +13,8 @@
 msgstr ""
 "Project-Id-Version: Pidgin Polish translation\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-12-19 13:34-0500\n"
-"PO-Revision-Date: 2010-12-14 13:40+0100\n"
+"POT-Creation-Date: 2011-02-02 23:34-0500\n"
+"PO-Revision-Date: 2011-01-25 11:04+0100\n"
 "Last-Translator: Piotr Drąg <piotrdrag@gmail.com>\n"
 "Language-Team: Polish <pl@li.org>\n"
 "Language: pl\n"
@@ -2372,8 +2372,12 @@
 "Ścieżka do zapisywania plików w\n"
 "(proszę podać pełną ścieżkę)"
 
-msgid "Automatically reject from users not in buddy list"
-msgstr "Automatyczne odrzucanie od użytkowników spoza listy znajomych"
+msgid ""
+"When a file-transfer request arrives from a user who is\n"
+"*not* on your buddy list:"
+msgstr ""
+"Kiedy żądanie przesłania pliku zostaje odebrane od\n"
+"użytkownika, który *nie* jest na liście znajomych:"
 
 msgid ""
 "Notify with a popup when an autoaccepted file transfer is complete\n"
@@ -2385,6 +2389,9 @@
 msgid "Create a new directory for each user"
 msgstr "Utworzenie nowego katalogu dla każdego użytkownika"
 
+msgid "Escape the filenames"
+msgstr "Sekwencja sterująca przed nazwami plików"
+
 msgid "Notes"
 msgstr "Notatki"
 
@@ -3852,7 +3859,10 @@
 "Serwer wymaga uwierzytelnienia w zwykłym tekście za pośrednictwem "
 "niezaszyfrowanego strumienia"
 
-#. This should never happen!
+#. This happens when the server sends back jibberish
+#. * in the "additional data with success" case.
+#. * Seen with Wildfire 3.0.1.
+#.
 msgid "Invalid response from server"
 msgstr "Nieprawidłowa odpowiedź z serwera"
 
@@ -6181,6 +6191,20 @@
 msgid "Retrieving User Information..."
 msgstr "Pobieranie informacji o użytkowniku..."
 
+#. you were kicked
+msgid "You have been kicked from this MultiMX."
+msgstr "Użytkownik został wyrzucony z tego MultiMX."
+
+msgid "was kicked"
+msgstr "został wyrzucony"
+
+msgid "_Room Name:"
+msgstr "_Nazwa pokoju:"
+
+#. Display system message in chat window
+msgid "You have invited"
+msgstr "Zaproszono"
+
 msgid "Loading menu..."
 msgstr "Wczytywanie menu..."
 
@@ -6208,20 +6232,6 @@
 msgid "Enable splash-screen popup"
 msgstr "Włączenie wyskakującego ekranu powitalnego"
 
-#. you were kicked
-msgid "You have been kicked from this MultiMX."
-msgstr "Użytkownik został wyrzucony z tego MultiMX."
-
-msgid "was kicked"
-msgstr "został wyrzucony"
-
-msgid "_Room Name:"
-msgstr "_Nazwa pokoju:"
-
-#. Display system message in chat window
-msgid "You have invited"
-msgstr "Zaproszono"
-
 msgid "Last Online"
 msgstr "Ostatnio online"
 
@@ -7910,75 +7920,6 @@
 "niezbędne dla obrazów komunikatora. Ponieważ adres IP zostanie ujawniony, "
 "może się to wiązać z zagrożeniem prywatności."
 
-msgid "Invalid SNAC"
-msgstr "Nieprawidłowe SNAC"
-
-msgid "Server rate limit exceeded"
-msgstr "Przekroczono ograniczenie prędkości serwera"
-
-msgid "Client rate limit exceeded"
-msgstr "Przekroczono ograniczenie prędkości klienta"
-
-msgid "Service unavailable"
-msgstr "Usługa jest niedostępna"
-
-msgid "Service not defined"
-msgstr "Nie określono usługi"
-
-msgid "Obsolete SNAC"
-msgstr "Przestarzałe SNAC"
-
-msgid "Not supported by host"
-msgstr "Nieobsługiwane przez serwer"
-
-msgid "Not supported by client"
-msgstr "Nieobsługiwane przez klienta"
-
-msgid "Refused by client"
-msgstr "Odmowa klienta"
-
-msgid "Reply too big"
-msgstr "Odpowiedź jest za duża"
-
-msgid "Responses lost"
-msgstr "Utracono odpowiedzi"
-
-msgid "Request denied"
-msgstr "Odrzucono prośby"
-
-msgid "Busted SNAC payload"
-msgstr "Uszkodzone dane SNAC"
-
-msgid "Insufficient rights"
-msgstr "Niewystarczające uprawnienia"
-
-msgid "In local permit/deny"
-msgstr "W lokalnym pozwoleniu/odmowie"
-
-msgid "Warning level too high (sender)"
-msgstr "Poziom ostrzeżenia jest za wysoki (nadawca)"
-
-msgid "Warning level too high (receiver)"
-msgstr "Poziom ostrzeżenia jest za wysoki (odbiorca)"
-
-msgid "User temporarily unavailable"
-msgstr "Użytkownik jest tymczasowo niedostępny"
-
-msgid "No match"
-msgstr "Brak wyników"
-
-msgid "List overflow"
-msgstr "Lista jest pełna"
-
-msgid "Request ambiguous"
-msgstr "Niejednoznaczna prośba"
-
-msgid "Queue full"
-msgstr "Kolejka jest pełna"
-
-msgid "Not while on AOL"
-msgstr "Nie podczas używania AOL"
-
 #. Label
 msgid "Buddy Icon"
 msgstr "Ikona znajomego"
@@ -8097,6 +8038,75 @@
 msgid "Capabilities"
 msgstr "Możliwości"
 
+msgid "Invalid SNAC"
+msgstr "Nieprawidłowe SNAC"
+
+msgid "Server rate limit exceeded"
+msgstr "Przekroczono ograniczenie prędkości serwera"
+
+msgid "Client rate limit exceeded"
+msgstr "Przekroczono ograniczenie prędkości klienta"
+
+msgid "Service unavailable"
+msgstr "Usługa jest niedostępna"
+
+msgid "Service not defined"
+msgstr "Nie określono usługi"
+
+msgid "Obsolete SNAC"
+msgstr "Przestarzałe SNAC"
+
+msgid "Not supported by host"
+msgstr "Nieobsługiwane przez serwer"
+
+msgid "Not supported by client"
+msgstr "Nieobsługiwane przez klienta"
+
+msgid "Refused by client"
+msgstr "Odmowa klienta"
+
+msgid "Reply too big"
+msgstr "Odpowiedź jest za duża"
+
+msgid "Responses lost"
+msgstr "Utracono odpowiedzi"
+
+msgid "Request denied"
+msgstr "Odrzucono prośby"
+
+msgid "Busted SNAC payload"
+msgstr "Uszkodzone dane SNAC"
+
+msgid "Insufficient rights"
+msgstr "Niewystarczające uprawnienia"
+
+msgid "In local permit/deny"
+msgstr "W lokalnym pozwoleniu/odmowie"
+
+msgid "Warning level too high (sender)"
+msgstr "Poziom ostrzeżenia jest za wysoki (nadawca)"
+
+msgid "Warning level too high (receiver)"
+msgstr "Poziom ostrzeżenia jest za wysoki (odbiorca)"
+
+msgid "User temporarily unavailable"
+msgstr "Użytkownik jest tymczasowo niedostępny"
+
+msgid "No match"
+msgstr "Brak wyników"
+
+msgid "List overflow"
+msgstr "Lista jest pełna"
+
+msgid "Request ambiguous"
+msgstr "Niejednoznaczna prośba"
+
+msgid "Queue full"
+msgstr "Kolejka jest pełna"
+
+msgid "Not while on AOL"
+msgstr "Nie podczas używania AOL"
+
 #. Translators: This string is a menu option that, if selected, will cause
 #. you to appear online to the chosen user even when your status is set to
 #. Invisible.
@@ -8692,14 +8702,14 @@
 msgid "Select Server"
 msgstr "Wybór serwera"
 
-msgid "QQ2005"
-msgstr "QQ2005"
+msgid "QQ2008"
+msgstr "QQ2008"
 
 msgid "QQ2007"
 msgstr "QQ2007"
 
-msgid "QQ2008"
-msgstr "QQ2008"
+msgid "QQ2005"
+msgstr "QQ2005"
 
 msgid "Connect by TCP"
 msgstr "Połączenie przez TCP"
@@ -12252,9 +12262,6 @@
 msgid "Fatal Error"
 msgstr "Błąd krytyczny"
 
-msgid "bug master"
-msgstr "władca błędów"
-
 msgid "artist"
 msgstr "artysta"
 
@@ -12434,6 +12441,9 @@
 msgid "Maithili"
 msgstr "maithili"
 
+msgid "Meadow Mari"
+msgstr "maryjski"
+
 msgid "Macedonian"
 msgstr "macedoński"
 
--- a/po/ro.po	Tue Dec 21 21:05:26 2010 +0900
+++ b/po/ro.po	Sat Feb 12 04:17:09 2011 +0900
@@ -1,15 +1,16 @@
 # Pidgin Romanian translation
 # This file is distributed under the same license as the Pidgin package.
-# 2002-2010, Mișu Moldovan <dumol@gnome.org>
+# 2002-2011, Mișu Moldovan <dumol@gnome.org>
 # 2009, Andrei Popescu <andreimpopescu@gmail.com>
 # Contributions: 2007, Alexandru Szasz <alexxed@gmail.com>
-msgid ""
-msgstr ""
-"Project-Id-Version: pidgin-2.7.8\n"
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: pidgin-2.7.9\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-12-19 13:34-0500\n"
-"PO-Revision-Date: 2010-12-17 18:47+0200\n"
-"Last-Translator: Mișu Moldovan <dumol@l10n.ro>\n"
+"POT-Creation-Date: 2011-02-02 23:34-0500\n"
+"PO-Revision-Date: 2011-01-31 00:11+0200\n"
+"Last-Translator: Mișu Moldovan <dumol@gnome.org>\n"
 "Language-Team: Romanian <debian-l10n-romanian@lists.debian.org>\n"
 "Language: ro\n"
 "MIME-Version: 1.0\n"
@@ -96,7 +97,7 @@
 msgstr "(Probabil ați uitat să faceți „make install”.)"
 
 msgid "Modify Account"
-msgstr "Modificare cont"
+msgstr "Editare cont"
 
 msgid "New Account"
 msgstr "Cont nou"
@@ -105,7 +106,7 @@
 msgstr "Protocol:"
 
 msgid "Username:"
-msgstr "Nume utilizator:"
+msgstr "Nume de utilizator:"
 
 msgid "Password:"
 msgstr "Parolă:"
@@ -212,7 +213,7 @@
 msgstr "Eroare la adăugarea contactului"
 
 msgid "Username"
-msgstr "Nume utilizator"
+msgstr "Nume de utilizator"
 
 msgid "Alias (optional)"
 msgstr "Alias (opțional)"
@@ -285,7 +286,7 @@
 msgstr "Detalii"
 
 msgid "Add Buddy Pounce"
-msgstr "Adăugare întâmpinare"
+msgstr "Adăugați o întâmpinare"
 
 msgid "Send File"
 msgstr "Trimitere fișier"
@@ -637,7 +638,7 @@
 msgstr "Arată marcaje de timp"
 
 msgid "Add Buddy Pounce..."
-msgstr "Adăugare întâmpinare..."
+msgstr "Adăugați o întâmpinare..."
 
 msgid "Invite..."
 msgstr "Invită..."
@@ -1112,7 +1113,7 @@
 msgstr "Întâmpinare doar în starea de indisponibilitate"
 
 msgid "Recurring"
-msgstr "Recurentă"
+msgstr "Recurență"
 
 msgid "Cannot create pounce"
 msgstr "Nu se poate crea întâmpinarea"
@@ -1128,7 +1129,7 @@
 msgstr "Sigur doriți să ștergeți întâmpinarea la %s pentru %s?"
 
 msgid "Buddy Pounces"
-msgstr "Întâmpinări contacte"
+msgstr "Întâmpinări pentru contacte"
 
 #, c-format
 msgid "%s has started typing to you (%s)"
@@ -1247,7 +1248,7 @@
 
 #. Create the window.
 msgid "Room List"
-msgstr "Listă camere de chat"
+msgstr "Lista camerelor de chat"
 
 msgid "Buddy logs in"
 msgstr "Un contact se autentifică"
@@ -1551,10 +1552,10 @@
 
 #, c-format
 msgid "TinyURL for above: %s"
-msgstr "TinyURL pentru linkul de mai sus: %s"
+msgstr "TinyURL pentru adresa de mai sus: %s"
 
 msgid "Please wait while TinyURL fetches a shorter URL ..."
-msgstr "Aștepați până când TinyURL oferă un link mai scurt..."
+msgstr "Așteptați ca TinyURL să genereze o adresă mai scurtă..."
 
 msgid "Only create TinyURL for URLs of this length or greater"
 msgstr "Creează TinyURL doar pentru URL-uri de această lungime sau mai mari"
@@ -2322,9 +2323,7 @@
 msgstr "Auto-acceptare"
 
 msgid "Auto-accept file transfer requests from selected users."
-msgstr ""
-"Permite acceptarea automată a transferurilor de fișiere inițiate de anumiți "
-"utilizatori."
+msgstr "Acceptare automată pentru anumite transferuri de fișiere."
 
 #, c-format
 msgid "Autoaccepted file transfer of \"%s\" from \"%s\" completed."
@@ -2367,9 +2366,12 @@
 "Cale pentru salvarea fișierelor:\n"
 "(Precizați calea completă)"
 
-msgid "Automatically reject from users not in buddy list"
-msgstr ""
-"Refuză automat pentru utilizatorii ce nu fac parte din lista de contacte"
+msgid ""
+"When a file-transfer request arrives from a user who is\n"
+"*not* on your buddy list:"
+msgstr ""
+"Când se primește o cerere de transfer de fișiere de la un\n"
+"utilizator ce NU e în lista de contacte:"
 
 msgid ""
 "Notify with a popup when an autoaccepted file transfer is complete\n"
@@ -2381,6 +2383,9 @@
 msgid "Create a new directory for each user"
 msgstr "Creează un nou director pentru fiecare utilizator"
 
+msgid "Escape the filenames"
+msgstr "Evită interpretarea caracterelor speciale în nume"
+
 msgid "Notes"
 msgstr "Notițe"
 
@@ -2441,7 +2446,7 @@
 #. *  summary
 #. *  description
 msgid "DBus Plugin Example"
-msgstr "Exemplu de modul DBus"
+msgstr "Exemplu de modul DBus."
 
 #. *< type
 #. *< ui_requirement
@@ -2650,7 +2655,7 @@
 
 #. Add general preferences.
 msgid "General Log Reading Configuration"
-msgstr "Opțiuni de citire a înregistrărilor"
+msgstr "Opțiuni de import a înregistrărilor"
 
 msgid "Fast size calculations"
 msgstr "Calcul rapid mărime"
@@ -2669,7 +2674,7 @@
 #. *< priority
 #. *< id
 msgid "Log Reader"
-msgstr "Citire înregistrări"
+msgstr "Import de înregistrări"
 
 #. *< name
 #. *< version
@@ -2728,7 +2733,7 @@
 "apară dedesubtul numelui de utilizator în fereastra de discuții."
 
 msgid "Offline Message Emulation"
-msgstr "Emulare mesaje offline"
+msgstr "Emulare de mesaje offline"
 
 msgid "Save messages sent to an offline user as pounce."
 msgstr "Salvează ca întâmpinare mesajele trimise unui utilizator offline."
@@ -2738,7 +2743,7 @@
 "pounce from the `Buddy Pounce' dialog."
 msgstr ""
 "Restul de mesaje vor fi salvate ca întâmpinare. Puteți apoi edita sau șterge "
-"întâmpinarea din fereastra „Întâmpinări contacte”."
+"întâmpinarea din fereastra „Întâmpinări pentru contacte”."
 
 #, c-format
 msgid ""
@@ -2754,7 +2759,8 @@
 
 msgid "You can edit/delete the pounce from the `Buddy Pounces' dialog"
 msgstr ""
-"Puteți edita ori șterge întâmpinarea din fereastra „Întâmpinări contacte"
+"Puteți edita ori șterge întâmpinarea din fereastra „Întâmpinări pentru "
+"contacte”"
 
 msgid "Yes"
 msgstr "Da"
@@ -2962,7 +2968,7 @@
 #. *< priority
 #. *< id
 msgid "Buddy State Notification"
-msgstr "Notificări stări contacte"
+msgstr "Notificări pentru stările contactelor"
 
 #. *< name
 #. *< version
@@ -3628,7 +3634,7 @@
 "away [message]:  Set an away message, or use no message to return from being "
 "away."
 msgstr ""
-"away [mesaj]:  Setați un mesaj în absență sau, dacă nu precizați un mesaj, "
+"away [mesaj]:  Definiți un mesaj în absență sau, dacă nu precizați un mesaj, "
 "reveniți din absență."
 
 msgid "ctcp <nick> <msg>: sends ctcp msg to nick."
@@ -3700,8 +3706,8 @@
 "mode &lt;+|-&gt;&lt;A-Za-z&gt; &lt;nick|channel&gt;:  Set or unset a channel "
 "or user mode."
 msgstr ""
-"mode &lt;+|-&gt;&lt;A-Za-z&gt; &lt;pseudonim|chat&gt;:  Setați sau resetați "
-"un chat sau un mod utilizator."
+"mode &lt;+|-&gt;&lt;A-Za-z&gt; &lt;pseudonim|chat&gt;:  Inițializați sau "
+"reinițializați un chat sau un mod pentru utilizator."
 
 msgid ""
 "msg &lt;nick&gt; &lt;message&gt;:  Send a private message to a user (as "
@@ -3782,7 +3788,8 @@
 
 msgid "umode &lt;+|-&gt;&lt;A-Za-z&gt;:  Set or unset a user mode."
 msgstr ""
-"umode &lt;+|-&gt;&lt;A-Za-z&gt;:  Setați sau resetați un mod utilizator."
+"umode &lt;+|-&gt;&lt;A-Za-z&gt;:  Inițializați sau reinițializați un mod "
+"pentru utilizator."
 
 msgid "version [nick]: send CTCP VERSION request to a user"
 msgstr ""
@@ -3835,7 +3842,10 @@
 msgid "Server requires plaintext authentication over an unencrypted stream"
 msgstr "Serverul necesită autentificare în clar printr-o conexiune necriptată"
 
-#. This should never happen!
+#. This happens when the server sends back jibberish
+#. * in the "additional data with success" case.
+#. * Seen with Wildfire 3.0.1.
+#.
 msgid "Invalid response from server"
 msgstr "Răspuns nevalid de la server."
 
@@ -4151,7 +4161,7 @@
 msgstr "Ca_meră:"
 
 msgid "_Server:"
-msgstr "_Server:"
+msgstr "Ser_ver:"
 
 msgid "_Handle:"
 msgstr "A_dministrare:"
@@ -4595,7 +4605,7 @@
 
 #, c-format
 msgid "Unable to set role \"%s\" for user: %s"
-msgstr "Nu se poate seta rolul „%s” pentru utilizatorul: %s"
+msgstr "Nu se poate defini rolul „%s” pentru utilizatorul: %s"
 
 #, c-format
 msgid "Unable to kick user %s"
@@ -4682,14 +4692,15 @@
 
 msgid "ban &lt;user&gt; [reason]:  Ban a user from the room."
 msgstr ""
-"ban &lt;nume utilizator&gt; [chat]:  Blocați accesul unui utilizator în chat."
+"ban &lt;nume de utilizator&gt; [chat]:  Blocați accesul unui utilizator în "
+"chat."
 
 msgid ""
 "affiliate &lt;owner|admin|member|outcast|none&gt; [nick1] [nick2] ...: Get "
 "the users with an affiliation or set users' affiliation with the room."
 msgstr ""
 "affiliate &lt;deținător|administrator|membru|renegat|nimic&gt; [pseudonim1] "
-"[pseudonim2] ...: Aflați utilizatorii cu o afiliere sau setați afilierea "
+"[pseudonim2] ...: Aflați utilizatorii cu o afiliere sau definiți afilierea "
 "utilizatorilor față de camera de chat."
 
 msgid ""
@@ -5502,10 +5513,10 @@
 msgstr "Pagină"
 
 msgid "Playing a game"
-msgstr "Joacă ceva"
+msgstr "Mă joc"
 
 msgid "Working"
-msgstr "Lucrează"
+msgstr "Lucrez"
 
 msgid "Has you"
 msgstr "Vă are în listă"
@@ -6152,6 +6163,20 @@
 msgid "Retrieving User Information..."
 msgstr "Se obțin detaliile utilizatorului..."
 
+#. you were kicked
+msgid "You have been kicked from this MultiMX."
+msgstr "Ați fost dat afară din acest MultiMX."
+
+msgid "was kicked"
+msgstr "a fost dat afară"
+
+msgid "_Room Name:"
+msgstr "Numele came_rei:"
+
+#. Display system message in chat window
+msgid "You have invited"
+msgstr "Ați fost invitat"
+
 msgid "Loading menu..."
 msgstr "Se încarcă meniul..."
 
@@ -6179,20 +6204,6 @@
 msgid "Enable splash-screen popup"
 msgstr "Activare popup pentru imaginea de pornire"
 
-#. you were kicked
-msgid "You have been kicked from this MultiMX."
-msgstr "Ați fost dat afară din acest MultiMX."
-
-msgid "was kicked"
-msgstr "a fost dat afară"
-
-msgid "_Room Name:"
-msgstr "Nume came_ră:"
-
-#. Display system message in chat window
-msgid "You have invited"
-msgstr "Ați fost invitat"
-
 msgid "Last Online"
 msgstr "Ultima oară online"
 
@@ -7063,16 +7074,16 @@
 msgstr "Nu se poate trimite mesajul către %s: %s"
 
 msgid "Thinking"
-msgstr "Mă gândesc"
+msgstr "Pe gânduri"
 
 msgid "Shopping"
 msgstr "La cumpărături"
 
 msgid "Questioning"
-msgstr "Pun întrebări"
+msgstr "În dubiu"
 
 msgid "Eating"
-msgstr "Mănânc"
+msgstr "La masă"
 
 msgid "Watching a movie"
 msgstr "Văd un film"
@@ -7096,7 +7107,7 @@
 msgstr "Dorm"
 
 msgid "Using a PDA"
-msgstr "Folosesc un PDA"
+msgstr "Sunt pe PDA"
 
 msgid "Meeting friends"
 msgstr "Cu prietenii"
@@ -7109,10 +7120,10 @@
 
 #. "I am mobile." / "John is mobile."
 msgid "Mobile"
-msgstr "Mobil"
+msgstr "Pe mobil"
 
 msgid "Searching the web"
-msgstr "Caut pe net"
+msgstr "Mă dau pe net"
 
 msgid "At a party"
 msgstr "La o petrecere"
@@ -7571,16 +7582,16 @@
 "posibilă trimiterea de imagini IM."
 
 msgid "Unable to set AIM profile."
-msgstr "Nu se poate seta profilul AIM."
+msgstr "Nu se poate inițializa profilul AIM."
 
 msgid ""
 "You have probably requested to set your profile before the login procedure "
 "completed.  Your profile remains unset; try setting it again when you are "
 "fully connected."
 msgstr ""
-"Se pare că ați cerut să setați profilul înainte de a vă autentifica. "
-"Profilul vă va rămâne la fel. Încercați să-l setați din nou după o conectare "
-"pe deplin reușită."
+"Se pare că ați cerut să vă inițializați profilul înainte de a vă "
+"autentifica. Profilul vă va rămâne neschimbat și încercați să-l "
+"reinițializați după o conectare pe deplin reușită."
 
 #, c-format
 msgid ""
@@ -7710,10 +7721,10 @@
 
 #, c-format
 msgid "Buddy Comment for %s"
-msgstr "Comentariu contact pentru %s"
+msgstr "Comentariu pentru contactul %s"
 
 msgid "Buddy Comment:"
-msgstr "Comentariu contact:"
+msgstr "Comentariu pentru contact:"
 
 #, c-format
 msgid "You have selected to open a Direct IM connection with %s."
@@ -7836,7 +7847,7 @@
 msgstr "Nu utiliza criptare"
 
 msgid "Use clientLogin"
-msgstr "Utilizați clientLogin"
+msgstr "Utilizează clientLogin"
 
 msgid ""
 "Always use AIM/ICQ proxy server for\n"
@@ -7875,75 +7886,6 @@
 "necesară pentru imaginile IM. Pentru că adresa IP vă va fi expusă, luați în "
 "considerare riscurile la care vă expuneți."
 
-msgid "Invalid SNAC"
-msgstr "SNAC nevalid"
-
-msgid "Server rate limit exceeded"
-msgstr "S-a depășit limitarea de server"
-
-msgid "Client rate limit exceeded"
-msgstr "S-a depășit limitarea de client"
-
-msgid "Service unavailable"
-msgstr "Serviciu indisponibil"
-
-msgid "Service not defined"
-msgstr "Serviciu nedefinit"
-
-msgid "Obsolete SNAC"
-msgstr "SNAC învechit"
-
-msgid "Not supported by host"
-msgstr "Nesuportat de către server"
-
-msgid "Not supported by client"
-msgstr "Nesuportat de către client"
-
-msgid "Refused by client"
-msgstr "Refuzat de către client"
-
-msgid "Reply too big"
-msgstr "Răspuns supradimensionat"
-
-msgid "Responses lost"
-msgstr "Răspunsuri pierdute"
-
-msgid "Request denied"
-msgstr "Cerere respinsă"
-
-msgid "Busted SNAC payload"
-msgstr "Încărcătură SNAC nevalidă"
-
-msgid "Insufficient rights"
-msgstr "Drepturi insuficiente"
-
-msgid "In local permit/deny"
-msgstr "În lista permiși/refuzați locală"
-
-msgid "Warning level too high (sender)"
-msgstr "Nivel de avertizare prea ridicat (pentru expeditor)"
-
-msgid "Warning level too high (receiver)"
-msgstr "Nivel de avertizare prea ridicat (pentru destinatar)"
-
-msgid "User temporarily unavailable"
-msgstr "Utilizatorul este temporar indisponibil."
-
-msgid "No match"
-msgstr "Nicio potrivire"
-
-msgid "List overflow"
-msgstr "Listă suprasaturată"
-
-msgid "Request ambiguous"
-msgstr "Cerere ambiguă"
-
-msgid "Queue full"
-msgstr "Coadă plină"
-
-msgid "Not while on AOL"
-msgstr "Nu (cât timp e pe AOL)"
-
 #. Label
 msgid "Buddy Icon"
 msgstr "Avatar"
@@ -8021,7 +7963,7 @@
 msgstr "Nivel de avertizare"
 
 msgid "Buddy Comment"
-msgstr "Comentariu contact"
+msgstr "Comentariu pentru contact"
 
 #, c-format
 msgid "User information not available: %s"
@@ -8062,6 +8004,75 @@
 msgid "Capabilities"
 msgstr "Facilități"
 
+msgid "Invalid SNAC"
+msgstr "SNAC nevalid"
+
+msgid "Server rate limit exceeded"
+msgstr "S-a depășit limitarea de server"
+
+msgid "Client rate limit exceeded"
+msgstr "S-a depășit limitarea de client"
+
+msgid "Service unavailable"
+msgstr "Serviciu indisponibil"
+
+msgid "Service not defined"
+msgstr "Serviciu nedefinit"
+
+msgid "Obsolete SNAC"
+msgstr "SNAC învechit"
+
+msgid "Not supported by host"
+msgstr "Nesuportat de către server"
+
+msgid "Not supported by client"
+msgstr "Nesuportat de către client"
+
+msgid "Refused by client"
+msgstr "Refuzat de către client"
+
+msgid "Reply too big"
+msgstr "Răspuns supradimensionat"
+
+msgid "Responses lost"
+msgstr "Răspunsuri pierdute"
+
+msgid "Request denied"
+msgstr "Cerere respinsă"
+
+msgid "Busted SNAC payload"
+msgstr "Încărcătură SNAC nevalidă"
+
+msgid "Insufficient rights"
+msgstr "Drepturi insuficiente"
+
+msgid "In local permit/deny"
+msgstr "În lista permiși/refuzați locală"
+
+msgid "Warning level too high (sender)"
+msgstr "Nivel de avertizare prea ridicat (pentru expeditor)"
+
+msgid "Warning level too high (receiver)"
+msgstr "Nivel de avertizare prea ridicat (pentru destinatar)"
+
+msgid "User temporarily unavailable"
+msgstr "Utilizatorul este temporar indisponibil."
+
+msgid "No match"
+msgstr "Nicio potrivire"
+
+msgid "List overflow"
+msgstr "Listă suprasaturată"
+
+msgid "Request ambiguous"
+msgstr "Cerere ambiguă"
+
+msgid "Queue full"
+msgstr "Coadă plină"
+
+msgid "Not while on AOL"
+msgstr "Nu (cât timp e pe AOL)"
+
 #. Translators: This string is a menu option that, if selected, will cause
 #. you to appear online to the chosen user even when your status is set to
 #. Invisible.
@@ -8654,14 +8665,14 @@
 msgid "Select Server"
 msgstr "Selectați serverul"
 
-msgid "QQ2005"
-msgstr "QQ2005"
+msgid "QQ2008"
+msgstr "QQ2008"
 
 msgid "QQ2007"
 msgstr "QQ2007"
 
-msgid "QQ2008"
-msgstr "QQ2008"
+msgid "QQ2005"
+msgstr "QQ2005"
 
 msgid "Connect by TCP"
 msgstr "Conectare folosind TCP"
@@ -8986,7 +8997,7 @@
 msgstr "Ultim client cunoscut"
 
 msgid "User Name"
-msgstr "Nume utilizator"
+msgstr "Nume de utilizator"
 
 msgid "Sametime ID"
 msgstr "ID Sametime"
@@ -9217,7 +9228,7 @@
 msgstr "IM parolat"
 
 msgid "Cannot set IM key"
-msgstr "Nu se poate seta cheia IM"
+msgstr "Nu se poate inițializa cheia IM"
 
 msgid "Set IM Password"
 msgstr "Introducere parolă IM"
@@ -9438,7 +9449,8 @@
 
 msgid "Set user limit on channel. Set to zero to reset user limit."
 msgstr ""
-"Setați numărul maxim de utilizatori în chat. Zero pentru număr nelimitat."
+"Definiți numărul maxim de utilizatori în chat. Zero pentru un număr "
+"nelimitat."
 
 msgid "Invite List"
 msgstr "Listă invitații"
@@ -9546,7 +9558,7 @@
 
 #, c-format
 msgid "<I>%s</I> set channel <I>%s</I> modes to: %s"
-msgstr "<I>%s</I> a setat modurile chat-ului <I>%s</I> astfel: %s"
+msgstr "<I>%s</I> a definit modurile chat-ului <I>%s</I> astfel: %s"
 
 #, c-format
 msgid "<I>%s</I> removed all channel <I>%s</I> modes"
@@ -9554,7 +9566,7 @@
 
 #, c-format
 msgid "<I>%s</I> set <I>%s's</I> modes to: %s"
-msgstr "<I>%s</I> a setat modurile pentru <I>%s</I> astfel: %s"
+msgstr "<I>%s</I> a definit modurile pentru <I>%s</I> astfel: %s"
 
 #, c-format
 msgid "<I>%s</I> removed all <I>%s's</I> modes"
@@ -9906,11 +9918,11 @@
 
 #, c-format
 msgid "no channel modes are set on %s"
-msgstr "chat-ul %s nu are setat niciun mod"
+msgstr "chat-ul %s nu are niciun mod definit"
 
 #, c-format
 msgid "Failed to set cmodes for %s"
-msgstr "Nu s-au putut seta modurile chat-ului %s"
+msgstr "Nu s-au putut defini modurile chat-ului %s"
 
 #, c-format
 msgid "Unknown command: %s, (may be a client bug)"
@@ -10091,7 +10103,7 @@
 
 #, c-format
 msgid "User Name: \t%s\n"
-msgstr "Nume utilizator: \t%s\n"
+msgstr "Nume de utilizator: \t%s\n"
 
 #, c-format
 msgid "Email: \t\t%s\n"
@@ -10324,7 +10336,7 @@
 msgstr "Utilizează proxy-ul contului pentru conexiuni HTTP și HTTPS"
 
 msgid "Chat room list URL"
-msgstr "Adresă listă camere de chat"
+msgstr "Adresa listei camerelor de chat"
 
 msgid "Yahoo JAPAN ID..."
 msgstr "Identitate Yahoo Japonia..."
@@ -10743,13 +10755,14 @@
 
 msgid "instance &lt;instance&gt;: Set the instance to be used on this class"
 msgstr ""
-"instance &lt;instanță&gt;:  Setați instanța de utilizat în această clasă"
+"instance &lt;instanță&gt;:  Definiți instanța de utilizat în această clasă"
 
 msgid "inst &lt;instance&gt;: Set the instance to be used on this class"
-msgstr "inst &lt;instanță&gt;:  Setați instanța de utilizat în această clasă"
+msgstr "inst &lt;instanță&gt;:  Definiți instanța de utilizat în această clasă"
 
 msgid "topic &lt;instance&gt;: Set the instance to be used on this class"
-msgstr "topic &lt;instanță&gt;:  Setați instanța de utilizat în această clasă"
+msgstr ""
+"topic &lt;instanță&gt;:  Definiți instanța de utilizat în această clasă"
 
 msgid "sub &lt;class&gt; &lt;instance&gt; &lt;recipient&gt;: Join a new chat"
 msgstr ""
@@ -10932,7 +10945,7 @@
 msgstr "Eroare SSL necunoscută"
 
 msgid "Unset"
-msgstr "Nesetat"
+msgstr "Nedefinit"
 
 msgid "Do not disturb"
 msgstr "Nu deranjați"
@@ -11084,7 +11097,7 @@
 
 #. 10061
 msgid "Connection refused."
-msgstr "Conexiune resetată."
+msgstr "Conexiune refuzată."
 
 #. 10048
 msgid "Address already in use."
@@ -11124,14 +11137,14 @@
 msgstr "Nume _utilizator:"
 
 msgid "Remember pass_word"
-msgstr "_Salvare parolă"
+msgstr "Sal_vare parolă"
 
 #. Build the user options frame.
 msgid "User Options"
 msgstr "Opțiuni personale"
 
 msgid "_Local alias:"
-msgstr "_Alias local:"
+msgstr "Alias l_ocal:"
 
 msgid "New _mail notifications"
 msgstr "Notificare la _mail nou"
@@ -11186,7 +11199,7 @@
 msgstr "P_ort:"
 
 msgid "Pa_ssword:"
-msgstr "Pa_rolă:"
+msgstr "_Parolă:"
 
 msgid "Unable to save new account"
 msgstr "Nu se poate salva noul cont"
@@ -11232,8 +11245,8 @@
 "<b>Adaugă...</b> de câte ori doriți.\n"
 "\n"
 "Veți putea reveni la această fereastră pentru a adăuga, edita sau șterge "
-"conturi utilizând <b>Conturi->Administrare conturi</b> în fereastra listei "
-"de contacte."
+"conturi utilizând <b>Conturi->Administrare</b> în fereastra listei de "
+"contacte."
 
 #, c-format
 msgid "%s%s%s%s wants to add you (%s) to his or her buddy list%s%s"
@@ -11242,7 +11255,7 @@
 
 #. Buddy List
 msgid "Background Color"
-msgstr "Culoare fundal"
+msgstr "Culoarea fundalului"
 
 msgid "The background color for the buddy list"
 msgstr "Culoarea de fundal pentru lista de contacte"
@@ -11257,7 +11270,7 @@
 #. Note to translators: These two strings refer to the background color
 #. of a buddy list group when in its expanded state
 msgid "Expanded Background Color"
-msgstr "Culoare fundal la desfacere"
+msgstr "Culoarea fundalului la desfacere"
 
 msgid "The background color of an expanded group"
 msgstr "Culoarea de fundal a unui grup desfăcut"
@@ -11265,15 +11278,15 @@
 #. Note to translators: These two strings refer to the font and color
 #. of a buddy list group when in its expanded state
 msgid "Expanded Text"
-msgstr "Text text la desfacere"
+msgstr "Culoarea textului la desfacere"
 
 msgid "The text information for when a group is expanded"
-msgstr "Informația text pentru un grup desfăcut"
+msgstr "Detaliile textului pentru un grup desfăcut"
 
 #. Note to translators: These two strings refer to the background color
 #. of a buddy list group when in its collapsed state
 msgid "Collapsed Background Color"
-msgstr "Culoare fundal la strângere"
+msgstr "Culoarea fundalului la strângere"
 
 msgid "The background color of a collapsed group"
 msgstr "Culoarea de fundal a unui grup strâns"
@@ -11284,13 +11297,13 @@
 msgstr "Text la strângere"
 
 msgid "The text information for when a group is collapsed"
-msgstr "Informația text pentru un grup strâns"
+msgstr "Detaliile textului pentru un grup strâns"
 
 #. Buddy
 #. Note to translators: These two strings refer to the background color
 #. of a buddy list contact or chat room
 msgid "Contact/Chat Background Color"
-msgstr "Culoare fundal contact/chat"
+msgstr "Culoarea fundalului pentru contacte și chat-uri"
 
 msgid "The background color of a contact or chat"
 msgstr "Culoarea de fundal a unui contact sau chat"
@@ -11298,64 +11311,65 @@
 #. Note to translators: These two strings refer to the font and color
 #. of a buddy list contact when in its expanded state
 msgid "Contact Text"
-msgstr "Text contact"
+msgstr "Textul contactului"
 
 msgid "The text information for when a contact is expanded"
-msgstr "Informația text pentru un contact strâns"
+msgstr "Detaliile textului pentru un contact desfăcut"
 
 #. Note to translators: These two strings refer to the font and color
 #. of a buddy list buddy when it is online
 msgid "Online Text"
-msgstr "Text online"
+msgstr "Textul contactelor online"
 
 msgid "The text information for when a buddy is online"
-msgstr "Informația text pentru un contact online"
+msgstr "Detaliile textului pentru contacte online"
 
 #. Note to translators: These two strings refer to the font and color
 #. of a buddy list buddy when it is away
 msgid "Away Text"
-msgstr "Text absent"
+msgstr "Textul contactelor absente"
 
 msgid "The text information for when a buddy is away"
-msgstr "Informația text pentru un contact absent"
+msgstr "Detaliile textului pentru contacte absente"
 
 #. Note to translators: These two strings refer to the font and color
 #. of a buddy list buddy when it is offline
 msgid "Offline Text"
-msgstr "Text offline"
+msgstr "Textul contactelor offline"
 
 msgid "The text information for when a buddy is offline"
-msgstr "Informația text pentru un contact offline"
+msgstr "Detaliile textului pentru contacte offline"
 
 #. Note to translators: These two strings refer to the font and color
 #. of a buddy list buddy when it is idle
 msgid "Idle Text"
-msgstr "Text inactiv"
+msgstr "Textul contactelor inactive"
 
 msgid "The text information for when a buddy is idle"
-msgstr "Informația text pentru un contact inactiv"
+msgstr "Detaliile textului pentru contacte inactive"
 
 #. Note to translators: These two strings refer to the font and color
 #. of a buddy list buddy when they have sent you a new message
 msgid "Message Text"
-msgstr "Text mesaj"
+msgstr "Textul mesajelor necitite"
 
 msgid "The text information for when a buddy has an unread message"
-msgstr "Informația text pentru un contact cu un mesaj necitit"
+msgstr "Detaliile textului pentru contacte cu mesaje necitite"
 
 #. Note to translators: These two strings refer to the font and color
 #. of a buddy list buddy when they have sent you a new message
 msgid "Message (Nick Said) Text"
-msgstr "Textul mesajului (utilizatorul a spus)"
+msgstr "Textul mesajelor noi"
 
 msgid ""
 "The text information for when a chat has an unread message that mentions "
 "your nickname"
 msgstr ""
-"Informația text pentru un chat cu un mesaj necitit ce vă menționează numele"
+"Detaliile textului pentru un chat cu un mesaj necitit ce vă menționează "
+"numele"
 
 msgid "The text information for a buddy's status"
-msgstr "Informația text pentru starea unui contact"
+msgstr "Detaliile textului pentru statusul unui contact"
 
 #, c-format
 msgid "You have %d contact named %s. Would you like to merge them?"
@@ -11383,8 +11397,7 @@
 msgid ""
 "Please enter the appropriate information about the chat you would like to "
 "join.\n"
-msgstr ""
-"Introduceți informațiile despre chat-ul în care doriți să participați.\n"
+msgstr "Introduceți detaliile chat-ului în care doriți intrați.\n"
 
 msgid "Room _List"
 msgstr "_Listă de camere"
@@ -11493,7 +11506,7 @@
 msgstr "Mesaj (opțional)"
 
 msgid "Edit User Mood"
-msgstr "Schimbare a propriei dispoziții"
+msgstr "Schimbați-vă dispoziția"
 
 #. NOTE: Do not set any accelerator to Control+O. It is mapped by
 #. gtk_blist_key_press_cb to "Get User Info" on the selected buddy.
@@ -11551,14 +11564,14 @@
 msgstr "/_Conturi"
 
 msgid "/Accounts/Manage Accounts"
-msgstr "/Conturi/Administrare conturi"
+msgstr "/Conturi/Administrare"
 
 #. Tools
 msgid "/_Tools"
 msgstr "/_Unelte"
 
 msgid "/Tools/Buddy _Pounces"
-msgstr "/Unelte/Î_ntâmpinări contacte"
+msgstr "/Unelte/Î_ntâmpinări pentru contacte"
 
 msgid "/Tools/_Certificates"
 msgstr "/Unelte/_Certificate"
@@ -11582,7 +11595,7 @@
 msgstr "/Unelte/_Transfer de fișiere"
 
 msgid "/Tools/R_oom List"
-msgstr "/Unelte/_Listă camere de chat"
+msgstr "/Unelte/_Lista camerelor de chat"
 
 msgid "/Tools/System _Log"
 msgstr "/Unelte/În_registrări de sistem"
@@ -11690,7 +11703,7 @@
 msgstr "/Unelte/Securitate"
 
 msgid "/Tools/Room List"
-msgstr "/Unelte/Listă camere de chat"
+msgstr "/Unelte/Lista camerelor de chat"
 
 #, c-format
 msgid "%d unread message from %s\n"
@@ -11741,7 +11754,7 @@
 "parte:"
 
 msgid "<b>Username:</b>"
-msgstr "<b>Nume utilizator:</b>"
+msgstr "<b>Nume de utilizator:</b>"
 
 msgid "<b>Password:</b>"
 msgstr "<b>Parolă:</b>"
@@ -11764,8 +11777,8 @@
 "<span weight='bold' size='larger'>Bun venit în %s!</span>\n"
 "\n"
 "Nu aveți niciun cont activ. Activați-vă conturile de mesagerie instant în "
-"fereastra <b>Conturi</b>, accesibilă pe calea <b>Conturi->Administrare "
-"conturi</b>. Abia după activare veți putea utiliza conturile definite."
+"fereastra <b>Conturi</b>, accesibilă pe calea <b>Conturi->Administrare</b>. "
+"Abia după activare veți putea utiliza conturile definite."
 
 #. set the Show Offline Buddies option. must be done
 #. * after the treeview or faceprint gets mad. -Robot101
@@ -11786,16 +11799,16 @@
 msgstr "/Contacte/Arată/Iconițele de protocol"
 
 msgid "Add a buddy.\n"
-msgstr "Adaugă un contact.\n"
+msgstr "Adăugați un contact.\n"
 
 msgid "Buddy's _username:"
-msgstr "Nume de _utilizator:"
+msgstr "_Nume de utilizator:"
 
 msgid "(Optional) A_lias:"
-msgstr "A_lias (opțional):"
+msgstr "_Alias (opțional):"
 
 msgid "Add buddy to _group:"
-msgstr "Adaugă contactul în _grupul:"
+msgstr "_Grup:"
 
 msgid "This protocol does not support chat rooms."
 msgstr "Acest protocol nu suportă camere de chat."
@@ -11810,20 +11823,20 @@
 "Please enter an alias, and the appropriate information about the chat you "
 "would like to add to your buddy list.\n"
 msgstr ""
-"Introduceți un alias și informațiile necesare pentru acel chat pe care "
-"doriți să-l adăugați în lista de contacte.\n"
+"Introduceți un alias și informațiile necesare pentru chat-ul pe care doriți "
+"să-l adăugați în lista de contacte.\n"
 
 msgid "A_lias:"
-msgstr "A_lias:"
+msgstr "_Alias:"
 
 msgid "_Group:"
 msgstr "_Grup:"
 
 msgid "Auto_join when account connects."
-msgstr "Intră a_utomat la autentificarea contului."
+msgstr "I_ntră automat la autentificarea contului."
 
 msgid "_Remain in chat after window is closed."
-msgstr "_Rămâi în chat după închiderea ferestrei."
+msgstr "Rămâi în chat _după închiderea ferestrei."
 
 msgid "Please enter the name of the group to be added."
 msgstr "Introduceți numele grupului de adăugat."
@@ -11934,7 +11947,7 @@
 msgstr "/Discuție/_Mesaj nou..."
 
 msgid "/Conversation/Join a _Chat..."
-msgstr "/Discuție/Intrare într-un _chat..."
+msgstr "/Discuție/Intrare într-un c_hat..."
 
 msgid "/Conversation/_Find..."
 msgstr "/Discuție/C_aută..."
@@ -11961,10 +11974,10 @@
 msgstr "/Discuție/Media/Ap_el audio\\/video"
 
 msgid "/Conversation/Se_nd File..."
-msgstr "/Discuție/_Trimite un fișier..."
+msgstr "/Discuție/Trimite un _fișier..."
 
 msgid "/Conversation/Get _Attention"
-msgstr "/Discuție/Cere _atenție"
+msgstr "/Discuție/Cere a_tenție"
 
 msgid "/Conversation/Add Buddy _Pounce..."
 msgstr "/Discuție/Adaugă î_ntâmpinare..."
@@ -11979,7 +11992,7 @@
 msgstr "/Discuție/Mai m_ult"
 
 msgid "/Conversation/Al_ias..."
-msgstr "/Discuție/Al_ias..."
+msgstr "/Discuție/A_lias..."
 
 msgid "/Conversation/_Block..."
 msgstr "/Discuție/_Blochează..."
@@ -12170,7 +12183,7 @@
 msgstr "Nu în fereastra chat-urilor"
 
 msgid "New window"
-msgstr "În fereastră nouă"
+msgstr "În ferestre noi"
 
 msgid "By group"
 msgstr "După grup"
@@ -12229,9 +12242,6 @@
 msgid "Fatal Error"
 msgstr "Erori fatale"
 
-msgid "bug master"
-msgstr "admin al rapoartelor de erori"
-
 msgid "artist"
 msgstr "artist"
 
@@ -12411,6 +12421,9 @@
 msgid "Maithili"
 msgstr "Maithili"
 
+msgid "Meadow Mari"
+msgstr "Meadow Mari"
+
 msgid "Macedonian"
 msgstr "Macedoneană"
 
@@ -12826,64 +12839,64 @@
 msgstr "Fără iconițe în _selecție"
 
 msgid "Hyperlink color"
-msgstr "Culoare adresă"
+msgstr "Culoarea adreselor web"
 
 msgid "Color to draw hyperlinks."
-msgstr "Culoare pentru afișarea adreselor."
+msgstr "Culoarea pentru afișarea adreselor web."
 
 msgid "Hyperlink visited color"
-msgstr "Culoare adresă web"
+msgstr "Culoarea adreselor web vizitate"
 
 msgid "Color to draw hyperlink after it has been visited (or activated)."
-msgstr "Culoare pentru afișarea adreselor web vizitate (ori activate)."
+msgstr "Culoarea pentru afișarea adreselor web vizitate (ori activate)."
 
 msgid "Hyperlink prelight color"
-msgstr "Culoare evidențiere adresă"
+msgstr "Culoarea de evidențiere a adresei"
 
 msgid "Color to draw hyperlinks when mouse is over them."
-msgstr "Culoare pentru afișarea adreselor sub cursorul de maus."
+msgstr "Culoarea de afișare a adreselor web sub cursorul de maus."
 
 msgid "Sent Message Name Color"
-msgstr "Culoare pentru mesaje trimise"
+msgstr "Culoarea mesajelor trimise"
 
 msgid "Color to draw the name of a message you sent."
-msgstr "Culoare de utilizat pentru numele mesajelor pe care le trimiteți."
+msgstr "Culoarea de utilizat pentru numele mesajelor pe care le trimiteți."
 
 msgid "Received Message Name Color"
-msgstr "Culoare pentru mesaje primite"
+msgstr "Culoarea mesajelor primite"
 
 msgid "Color to draw the name of a message you received."
-msgstr "Culoare de utilizat pentru numele mesajelor pe care le primiți."
+msgstr "Culoarea de utilizat pentru numele mesajelor pe care le primiți."
 
 msgid "\"Attention\" Name Color"
-msgstr "Culoare de atenționare"
+msgstr "Culoarea de atenționare"
 
 msgid "Color to draw the name of a message you received containing your name."
-msgstr "Culoare de utilizat pentru numele mesajelor ce vă pomenesc numele."
+msgstr "Culoarea de utilizat pentru numele mesajelor ce vă pomenesc numele."
 
 msgid "Action Message Name Color"
-msgstr "Culoare pentru mesajele comenzi"
+msgstr "Culoarea pentru mesajele comenzi"
 
 msgid "Color to draw the name of an action message."
-msgstr "Culoare de utilizat pentru numele mesajelor de tip comandă."
+msgstr "Culoarea de utilizat pentru numele mesajelor de tip comandă."
 
 msgid "Action Message Name Color for Whispered Message"
-msgstr "Culoare pentru mesajele comenzi în mod discret"
+msgstr "Culoarea pentru mesajele comenzi în mod discret"
 
 msgid "Color to draw the name of a whispered action message."
-msgstr "Culoare de utilizat pentru numele mesajelor discrete de acțiune."
+msgstr "Culoarea de utilizat pentru numele mesajelor discrete de acțiune."
 
 msgid "Whisper Message Name Color"
-msgstr "Culoare pentru mesajele discrete"
+msgstr "Culoarea mesajelor discrete"
 
 msgid "Color to draw the name of a whispered message."
-msgstr "Culoare de utilizat pentru numele mesajelor discrete."
+msgstr "Culoarea de utilizat pentru numele mesajelor discrete."
 
 msgid "Typing notification color"
 msgstr "Culoarea mesajelor de notificare"
 
 msgid "The color to use for the typing notification"
-msgstr "Culoare de utilizat pentru notificarea tastării"
+msgstr "Culoarea de utilizat pentru notificările de tastare"
 
 msgid "Typing notification font"
 msgstr "Fontul mesajelor de notificare"
@@ -12951,7 +12964,7 @@
 msgstr "Inserare adresă"
 
 msgid "_Insert"
-msgstr "Inserea_ză"
+msgstr "Ins_erare"
 
 #, c-format
 msgid "Failed to store image: %s\n"
@@ -13009,7 +13022,7 @@
 msgstr "Nume font"
 
 msgid "Foreground Color"
-msgstr "Culoare text"
+msgstr "Culoarea textului"
 
 msgid "Reset Formatting"
 msgstr "Fără formatare"
@@ -13051,16 +13064,16 @@
 msgstr "_Nume font"
 
 msgid "Foreground _color"
-msgstr "Culoare te_xt"
+msgstr "Culoarea te_xtului"
 
 msgid "Bac_kground color"
-msgstr "Culoare f_undal"
+msgstr "Culoarea f_undalului"
 
 msgid "_Image"
 msgstr "_Imagine"
 
 msgid "_Link"
-msgstr "_Link"
+msgstr "_Adresă web"
 
 msgid "_Horizontal rule"
 msgstr "Linie _orizontală"
@@ -13360,13 +13373,13 @@
 msgstr "O_prirea din tastare"
 
 msgid "Sends a _message"
-msgstr "Trimiterea unui _mesaj"
+msgstr "Tr_imiterea unui mesaj"
 
 msgid "Ope_n an IM window"
 msgstr "Desc_hide o discuție"
 
 msgid "_Pop up a notification"
-msgstr "Deschide _o fereastră de notificare"
+msgstr "De_schide o fereastră de notificare"
 
 msgid "Send a _message"
 msgstr "Trimite un mesa_j"
@@ -13387,13 +13400,13 @@
 msgstr "_Testare"
 
 msgid "P_ounce only when my status is not Available"
-msgstr "Întâmpinare doar în starea de _indisponibilitate"
+msgstr "Întâmpinare doar în starea de indisponibi_litate"
 
 msgid "_Recurring"
 msgstr "Re_curentă"
 
 msgid "Pounce Target"
-msgstr "Țintă întâmpinare"
+msgstr "Ținta întâmpinării"
 
 msgid "Started typing"
 msgstr "A început să tasteze"
@@ -13493,7 +13506,7 @@
 msgstr "Pentru mesajele necitite"
 
 msgid "Conversation Window"
-msgstr "Fereastra de discuții"
+msgstr "Fereastră de discuții"
 
 msgid "_Hide new IM conversations:"
 msgstr "Ascunde discuțiile _noi:"
@@ -13515,7 +13528,7 @@
 msgstr "Arată _butoanele de închidere a taburilor"
 
 msgid "_Placement:"
-msgstr "_Plasament:"
+msgstr "_Plasare:"
 
 msgid "Top"
 msgstr "Sus"
@@ -13536,7 +13549,7 @@
 msgstr "Vertical in dreapta"
 
 msgid "N_ew conversations:"
-msgstr "D_iscuții noi:"
+msgstr "Di_scuții noi:"
 
 msgid "Show _formatting on incoming messages"
 msgstr "_Păstrează formatarea mesajelor primite"
@@ -13554,7 +13567,7 @@
 msgstr "Notifică contactele când le scri_u"
 
 msgid "Highlight _misspelled words"
-msgstr "_Evidențiază greșelile de ortografie"
+msgstr "E_vidențiază greșelile de ortografie"
 
 msgid "Use smooth-scrolling"
 msgstr "Derulare cu efect"
@@ -13598,7 +13611,7 @@
 msgstr "Utilizează adresa IP _autodetectată: %s"
 
 msgid "ST_UN server:"
-msgstr "Server ST_UN:"
+msgstr "Ser_ver STUN:"
 
 msgid "<span style=\"italic\">Example: stunserver.org</span>"
 msgstr "<span style=\"italic\">Exemplu: stunserver.org</span>"
@@ -13610,7 +13623,7 @@
 msgstr "Porturi"
 
 msgid "_Enable automatic router port forwarding"
-msgstr "Acti_vează automat „port forwarding” în ruter"
+msgstr "Activea_ză automat „port forwarding” în ruter"
 
 msgid "_Manually specify range of ports to listen on:"
 msgstr "_Specificați intervalul de porturi:"
@@ -13632,7 +13645,7 @@
 msgstr "Port _UDP:"
 
 msgid "Use_rname:"
-msgstr "_Nume utilizator:"
+msgstr "_Nume de utilizator:"
 
 msgid "Pass_word:"
 msgstr "_Parolă:"
@@ -13684,7 +13697,7 @@
 msgstr "Chromium (chrome)"
 
 msgid "Manual"
-msgstr "Manual"
+msgstr "Personalizat"
 
 msgid "Browser Selection"
 msgstr "Navigator preferat"
@@ -13702,23 +13715,23 @@
 msgstr "_Navigator:"
 
 msgid "_Open link in:"
-msgstr "_Deschide adresa:"
+msgstr "_Deschide adresele web:"
 
 msgid "Browser default"
-msgstr "După cum e setat navigatorul"
+msgstr "Respectând opțiunile navigatorului"
 
 msgid "Existing window"
-msgstr "Într-o fereastră existentă"
+msgstr "În ferestre existente"
 
 msgid "New tab"
-msgstr "Într-un tab nou"
+msgstr "În taburi noi"
 
 #, c-format
 msgid ""
 "_Manual:\n"
 "(%s for URL)"
 msgstr ""
-"_Manual:\n"
+"_Personalizat:\n"
 "(%s pentru adresă)"
 
 msgid "Proxy Server"
@@ -13748,7 +13761,7 @@
 msgstr "P_ort:"
 
 msgid "User_name:"
-msgstr "_Nume utilizator:"
+msgstr "_Nume de utilizator:"
 
 msgid "Log _format:"
 msgstr "_Formatul înregistrărilor:"
@@ -13803,7 +13816,7 @@
 "Sound c_ommand:\n"
 "(%s for filename)"
 msgstr ""
-"Comandă de _redare sunet\n"
+"Comandă de _redare audio\n"
 "(%s pentru numele fișierului)"
 
 msgid "M_ute sounds"
@@ -13853,7 +13866,7 @@
 msgstr "Utilizează _ultimul status"
 
 msgid "Status to a_pply at startup:"
-msgstr "Status de utilizat la _pornire:"
+msgstr "Status de utili_zat la pornire:"
 
 msgid "Interface"
 msgstr "Interfață"
@@ -14006,7 +14019,7 @@
 msgstr "Editare iconiță simbolică"
 
 msgid "Add Smiley"
-msgstr "Adăugare iconiță simbolică"
+msgstr "Adăugați o iconiță simbolică"
 
 msgid "_Image:"
 msgstr "_Imagine:"
@@ -14016,7 +14029,7 @@
 msgstr "_Textul combinației de semne"
 
 msgid "Smiley"
-msgstr "Iconiță simbolice"
+msgstr "Iconiță simbolică"
 
 msgid "Shortcut Text"
 msgstr "Textul combinației de semne"
@@ -14078,7 +14091,7 @@
 "use it as the buddy icon for this user."
 msgstr ""
 "Puteți trimite această imagine printr-un transfer de fișiere, o puteți "
-"insera în acest mesaj sau o puteți seta ca avatar pentru acest contact."
+"insera în acest mesaj sau o puteți utiliza ca avatar pentru acest contact."
 
 msgid "Set as buddy icon"
 msgstr "Utilizează ca avatar"
@@ -14090,20 +14103,20 @@
 msgstr "Inserează în mesaj"
 
 msgid "Would you like to set it as the buddy icon for this user?"
-msgstr "Doriți să o setați ca avatar pentru acest contact?"
+msgstr "Doriți să o utilizați ca avatar pentru acest contact?"
 
 msgid ""
 "You can send this image as a file transfer, or use it as the buddy icon for "
 "this user."
 msgstr ""
 "Puteți trimite această imagine printr-un transfer de fișiere sau o puteți "
-"seta ca avatar pentru acest contact."
+"utiliza ca avatar pentru acest contact."
 
 msgid ""
 "You can insert this image into this message, or use it as the buddy icon for "
 "this user"
 msgstr ""
-"Puteți insera imaginea în acest mesaj sau o puteți seta ca avatar pentru "
+"Puteți insera imaginea în acest mesaj sau o puteți utiliza ca avatar pentru "
 "acest contact."
 
 #. I don't know if we really want to do anything here.  Most of
@@ -14145,7 +14158,7 @@
 msgstr "Nu s-a putut utiliza iconița"
 
 msgid "_Open Link"
-msgstr "_Deschide linkul"
+msgstr "_Deschide adresa"
 
 msgid "_Copy Link Location"
 msgstr "_Copiază adresa"
@@ -14192,7 +14205,7 @@
 msgstr "_Invită"
 
 msgid "_Modify..."
-msgstr "_Modifică..."
+msgstr "E_ditare..."
 
 msgid "_Add..."
 msgstr "_Adaugă..."
@@ -14254,7 +14267,7 @@
 #. *< name
 #. *< version
 msgid "Contact Availability Prediction plugin."
-msgstr "Modul pentru disponibilitatea contactelor"
+msgstr "Modul pentru prevederea disponibilității contactelor."
 
 #. *  summary
 msgid "Displays statistical information about your buddies' availability"
@@ -14391,7 +14404,7 @@
 msgstr "Descoperire de servicii"
 
 msgid "_Browse"
-msgstr "_Navigare:"
+msgstr "_Navigare"
 
 msgid "Server does not exist"
 msgstr "Server inexistent"
@@ -14403,7 +14416,7 @@
 msgstr "Descoperire de servicii XMPP"
 
 msgid "Allows browsing and registering services."
-msgstr "Permite navigarea și înregistrarea serviciilor"
+msgstr "Permite navigarea și înregistrarea de servicii XMPP."
 
 msgid ""
 "This plugin is useful for registering with legacy transports or other XMPP "
@@ -14416,7 +14429,7 @@
 msgstr "După numărul discuțiilor"
 
 msgid "Conversation Placement"
-msgstr "Plasament discuții"
+msgstr "Plasarea discuțiilor"
 
 #. Translators: "New conversations" should match the text in the preferences dialog and "By conversation count" should be the same text used above
 msgid ""
@@ -14440,12 +14453,12 @@
 #. *< priority
 #. *< id
 msgid "ExtPlacement"
-msgstr "Ferestre extra"
+msgstr "Plasare extra"
 
 #. *< name
 #. *< version
 msgid "Extra conversation placement options."
-msgstr "Opțiuni de plasare a discuțiilor în plus."
+msgstr "Opțiuni suplimentare de plasare a discuțiilor."
 
 #. *< summary
 #. *  description
@@ -14651,7 +14664,7 @@
 msgstr "Adaugă o căsuță în lista de contacte care vă anunță mailurile noi."
 
 msgid "Markerline"
-msgstr "Marcaj mesaje noi"
+msgstr "Marcaj pentru mesaje noi"
 
 msgid "Draw a line to indicate new messages in a conversation."
 msgstr "Marchează cu o linie mesajele noi dintr-o discuție."
@@ -14790,7 +14803,7 @@
 #. *< priority
 #. *< id
 msgid "Message Notification"
-msgstr "Notificări mesaje"
+msgstr "Notificări pentru mesaje"
 
 #. *< name
 #. *< version
@@ -14827,10 +14840,10 @@
 "- Trimite un mesaj contactelor din listă atunci când se autentifică."
 
 msgid "Hyperlink Color"
-msgstr "Culoare adresă web"
+msgstr "Culoarea adresei web"
 
 msgid "Visited Hyperlink Color"
-msgstr "Culoare adresă web vizitată"
+msgstr "Culoarea adresei web vizitate"
 
 msgid "Highlighted Message Name Color"
 msgstr "Numele culorii pentru evidențierea mesajelor"
@@ -14845,13 +14858,13 @@
 msgstr "Introducere text"
 
 msgid "Conversation History"
-msgstr "Istoricul discuției"
+msgstr "Înregistrări de discuții"
 
 msgid "Request Dialog"
-msgstr "Dialog cerere"
+msgstr "Fereastră de dialog"
 
 msgid "Notify Dialog"
-msgstr "Dialog notificare"
+msgstr "Fereastră de notificare"
 
 msgid "Select Color"
 msgstr "Alegeți o culoare"
@@ -14865,10 +14878,10 @@
 msgstr "Alegeți un font pentru %s"
 
 msgid "GTK+ Interface Font"
-msgstr "Font interfață GTK+"
+msgstr "Fontul interfeței GTK+"
 
 msgid "GTK+ Text Shortcut Theme"
-msgstr "Temă combinații de taste GTK+ Text"
+msgstr "Tema de combinații de taste GTK+ Text"
 
 msgid "Disable Typing Notification Text"
 msgstr "Dezactivează textul notificării la tastare"
@@ -14896,7 +14909,7 @@
 msgstr "Recitește fișierele gtkrc"
 
 msgid "Pidgin GTK+ Theme Control"
-msgstr "Control temă GTK+ Pidgin"
+msgstr "Modificare a temei GTK+ în Pidgin"
 
 msgid "Provides access to commonly used gtkrc settings."
 msgstr "Permite accesul la cele mai uzuale opțiuni gtkrc."
@@ -14935,7 +14948,7 @@
 #. *< priority
 #. *< id
 msgid "Release Notification"
-msgstr "Notificări versiuni noi"
+msgstr "Notificări pentru versiuni noi"
 
 #. *< name
 #. *< version
@@ -14965,7 +14978,7 @@
 #. *< name
 #. *< version
 msgid "Conversation Window Send Button."
-msgstr "Buton de trimitere în fereastra de discuții"
+msgstr "Buton de trimitere în fereastra de discuții."
 
 #. *< summary
 msgid ""
@@ -15019,10 +15032,10 @@
 msgstr "Activează corectarea ultimului cuvânt la trimitere"
 
 msgid "Text replacement"
-msgstr "Corecturi text"
+msgstr "Corecturi de text"
 
 msgid "Replaces text in outgoing messages according to user-defined rules."
-msgstr "Schimbă mesajele trimise după reguli predefinite de utilizator."
+msgstr "Schimbă mesajele trimise după reguli predefinite."
 
 msgid "Just logged in"
 msgstr "Tocmai s-a autentificat"
@@ -15148,7 +15161,7 @@
 #. *< version
 #. *  summary
 msgid "Display iChat-style timestamps"
-msgstr "Marcaje de timp în stil iChat"
+msgstr "Marcaje de timp în stil iChat."
 
 #. *  description
 msgid "Display iChat-style timestamps every N minutes."
@@ -15192,7 +15205,7 @@
 #. *< priority
 #. *< id
 msgid "Message Timestamp Formats"
-msgstr "Formatare marcaje de timp"
+msgstr "Formatare pentru marcajele de timp"
 
 #. *< name
 #. *< version
@@ -15370,7 +15383,7 @@
 #. *< version
 #. *  summary
 msgid "Send and receive raw XMPP stanzas."
-msgstr "Trimitere și primire blocuri XMPP brute"
+msgstr "Trimitere și primire de blocuri XMPP brute"
 
 #. *  description
 msgid "This plugin is useful for debugging XMPP servers or clients."
@@ -15519,6 +15532,13 @@
 msgid "You do not have permission to uninstall this application."
 msgstr "Nu aveţi drepturile de acces necesare dezinstalării acestei aplicaţii."
 
+#~ msgid "Automatically reject from users not in buddy list"
+#~ msgstr ""
+#~ "Refuză automat pentru utilizatorii ce nu fac parte din lista de contacte"
+
+#~ msgid "bug master"
+#~ msgstr "admin al rapoartelor de erori"
+
 #~ msgid "Error requesting %s"
 #~ msgstr "Eroare la cererea %s"
 
--- a/po/ru.po	Tue Dec 21 21:05:26 2010 +0900
+++ b/po/ru.po	Sat Feb 12 04:17:09 2011 +0900
@@ -3,14 +3,14 @@
 # Sergey Volozhanin <svo@asplinux.ru>, 2001.
 # Alexandre Prokoudine <avp@altlinux.ru>, 2003, 2004.
 # Dmitry Beloglazov <dmaa@users.sf.net>, 2004-2008.
-# Антон Самохвалов <samant.ua@mail.ru>, 2008-2010.
+# Антон Самохвалов <samant.ua@mail.ru>, 2008-2011.
 #
 #
 msgid ""
 msgstr ""
 "Project-Id-Version: ru\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-12-19 13:34-0500\n"
+"POT-Creation-Date: 2011-02-02 23:34-0500\n"
 "PO-Revision-Date: 2008-05-14 15:00+0400\n"
 "Last-Translator: Антон Самохвалов <samant.ua@mail.ru>\n"
 "Language-Team: \n"
@@ -1277,9 +1277,8 @@
 msgid "Someone says your username in chat"
 msgstr "Кто-то произносит ваше имя пользователя в чате"
 
-#, fuzzy
 msgid "Attention received"
-msgstr "Требуется активация"
+msgstr "Получено внимание"
 
 msgid "GStreamer Failure"
 msgstr "Ошибка GStreamer"
@@ -1566,10 +1565,10 @@
 msgid "TinyURL plugin"
 msgstr "Модуль TinyURL"
 
-#, fuzzy
 msgid "When receiving a message with URL(s), use TinyURL for easier copying"
 msgstr ""
-"При получении сообщения с адресами URL, TinyURL для облегчённого копирования"
+"При получении сообщения с адресами URL, использовать TinyURL для облегчения "
+"копирования"
 
 msgid "Online"
 msgstr "В сети"
@@ -1667,13 +1666,11 @@
 msgid "Set User Info"
 msgstr "Установить пользовательскую информацию"
 
-#, fuzzy
 msgid "This protocol does not support setting a public alias."
-msgstr "Этот протокол не поддерживает чаты."
-
-#, fuzzy
+msgstr "Этот протокол не поддерживает установку общего доменного имени."
+
 msgid "This protocol does not support fetching the public alias."
-msgstr "Этот протокол не поддерживает чаты."
+msgstr "Этот протокол не поддерживает получение общего доменного имени."
 
 msgid "Unknown"
 msgstr "Неизвестно"
@@ -1702,13 +1699,12 @@
 "Сертификат ещё не подтверждён.  Проверьте правильность даты и времени на "
 "вашем компьютере."
 
-#, fuzzy
 msgid ""
 "The certificate has expired and should not be considered valid.  Check that "
 "your computer's date and time are accurate."
 msgstr ""
-"Сертификат ещё не подтверждён.  Проверьте правильность даты и времени на "
-"вашем компьютере."
+"Срок сертификата истёк и его больше нельзя считать действительным.  "
+"Проверьте правильность времени и даты на вашем компьютере."
 
 #. Translators: "domain" refers to a DNS domain (e.g. talk.google.com)
 msgid "The certificate presented is not issued to this domain."
@@ -2361,8 +2357,11 @@
 "Сохранять файлы в\n"
 "(укажите полный путь)"
 
-msgid "Automatically reject from users not in buddy list"
-msgstr "Отвергать автоматически от пользователей не из списка собеседников"
+#, fuzzy
+msgid ""
+"When a file-transfer request arrives from a user who is\n"
+"*not* on your buddy list:"
+msgstr "При поступлении запроса передачи файлов от %s"
 
 msgid ""
 "Notify with a popup when an autoaccepted file transfer is complete\n"
@@ -2375,6 +2374,10 @@
 msgid "Create a new directory for each user"
 msgstr "Создайте для каждого пользователя новую папку"
 
+#, fuzzy
+msgid "Escape the filenames"
+msgstr "%s отменил передачу файла"
+
 msgid "Notes"
 msgstr "Заметки"
 
@@ -3838,7 +3841,10 @@
 msgstr ""
 "Сервер требует аутентификацию простым текстом через нешифрованный поток"
 
-#. This should never happen!
+#. This happens when the server sends back jibberish
+#. * in the "additional data with success" case.
+#. * Seen with Wildfire 3.0.1.
+#.
 msgid "Invalid response from server"
 msgstr "Неверный отклик от сервера"
 
@@ -3900,21 +3906,20 @@
 "The server does support channel binding, but did not appear to advertise "
 "it.  This indicates a likely MITM attack"
 msgstr ""
-
-#, fuzzy
+"Этот сервер не поддерживает привязку канала, но не выглядит его рекламой. "
+"Это говорит о возможной MITM атаке"
+
 msgid "Server does not support channel binding"
-msgstr "Сервер не поддерживает блокировку"
-
-#, fuzzy
+msgstr "Сервер не поддерживает привязку канала"
+
 msgid "Unsupported channel binding method"
-msgstr "Неподдерживаемая кодировка"
+msgstr "Неподдерживаемый метод привязки канала"
 
 msgid "User not found"
 msgstr "Пользователь не найден"
 
-#, fuzzy
 msgid "Invalid Username Encoding"
-msgstr "Неверное имя пользователя"
+msgstr "Неверная кодировка имя пользователя"
 
 msgid "Resource Constraint"
 msgstr "Недостаток ресурсов"
@@ -4367,15 +4372,13 @@
 msgstr "Текст настроения"
 
 msgid "Allow Buzz"
-msgstr "Разрешить сплетни"
-
-#, fuzzy
+msgstr "Разрешить оклики"
+
 msgid "Mood Name"
-msgstr "Отчество"
-
-#, fuzzy
+msgstr "Имя настроения"
+
 msgid "Mood Comment"
-msgstr "Комментарий собеседника"
+msgstr "Комментарий настроения"
 
 #. primitive
 #. ID
@@ -4631,7 +4634,7 @@
 
 #, c-format
 msgid "%s has buzzed you!"
-msgstr "%s позвал вас!"
+msgstr "%s окликнул вас!"
 
 #, c-format
 msgid "Buzzing %s..."
@@ -4645,19 +4648,18 @@
 msgid "Unable to initiate media with %s: user is not online"
 msgstr "Обмен файлами с %s не удаётся: пользователь не в сети"
 
-#, fuzzy, c-format
+#, c-format
 msgid "Unable to initiate media with %s: not subscribed to user presence"
-msgstr ""
-"Обмен файлами с %s не удаётся: нет подписки на присутствие пользователя"
+msgstr "Обмен файлами с %s не удался: нет подписки на присутствие пользователя"
 
 msgid "Media Initiation Failed"
 msgstr "Обмен файлами не удался"
 
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "Please select the resource of %s with which you would like to start a media "
 "session."
-msgstr "Выберите ресурс %s, которому вы хотели бы отправить файл"
+msgstr "Выберите ресурс %s, с которым вы хотели бы начать обмен файлами"
 
 msgid "Select a Resource"
 msgstr "Выбрать ресурс"
@@ -4723,11 +4725,10 @@
 msgstr "прозвон &lt;jid&gt;:\tПрозвонить пользователя/компонент/сервер."
 
 msgid "buzz: Buzz a user to get their attention"
-msgstr "трёп: окликнуть пользователя, чтобы привлечь его внимание"
-
-#, fuzzy
+msgstr "оклик: окликнуть пользователя, чтобы привлечь его внимание"
+
 msgid "mood: Set current user mood"
-msgstr "Выберите корректного пользователя"
+msgstr "настроение: Установите текущее настроение пользователя"
 
 msgid "Extended Away"
 msgstr "Расширенный \"Отошёл\""
@@ -4749,20 +4750,17 @@
 msgid "Domain"
 msgstr "Домен"
 
-#, fuzzy
 msgid "Require encryption"
-msgstr "Требовать авторизацию"
-
-#, fuzzy
+msgstr "Требовать шифрование"
+
 msgid "Use encryption if available"
-msgstr "Пользовательская информация для %s недоступна"
+msgstr "Если доступно, использовать шифрование"
 
 msgid "Use old-style SSL"
-msgstr ""
-
-#, fuzzy
+msgstr "Использовать SSL старого образца"
+
 msgid "Connection security"
-msgstr "Сброс соединения"
+msgstr "Безопасность соединения"
 
 msgid "Allow plaintext auth over unencrypted streams"
 msgstr "Разрешить идентификацию простым текстом через нешифрованные потоки"
@@ -4892,31 +4890,26 @@
 msgid "Please select the resource of %s to which you would like to send a file"
 msgstr "Выберите ресурс %s, которому вы хотели бы отправить файл"
 
-#, fuzzy
 msgid "Afraid"
-msgstr "Арабский"
-
-#, fuzzy
+msgstr "Боязливый"
+
 msgid "Amazed"
-msgstr "Стыдящийся"
-
-#, fuzzy
+msgstr "Изумлённый"
+
 msgid "Amorous"
-msgstr "Великолепный"
+msgstr "Влюбчивый"
 
 msgid "Angry"
 msgstr "Рассерженный"
 
-#, fuzzy
 msgid "Annoyed"
-msgstr "Изгнан"
+msgstr "Раздражённый"
 
 msgid "Anxious"
 msgstr "Озабоченный"
 
-#, fuzzy
 msgid "Aroused"
-msgstr "Вы отправляете"
+msgstr "Возбуждённый"
 
 msgid "Ashamed"
 msgstr "Стыдящийся"
@@ -4924,82 +4917,65 @@
 msgid "Bored"
 msgstr "Скучающий"
 
-#, fuzzy
 msgid "Brave"
-msgstr "Сохранить"
-
-#, fuzzy
+msgstr "Храбрый"
+
 msgid "Calm"
-msgstr "Сфера"
-
-#, fuzzy
+msgstr "Тихий"
+
 msgid "Cautious"
-msgstr "Чаты"
-
-#, fuzzy
+msgstr "Осторожный"
+
 msgid "Cold"
-msgstr "Жирный"
-
-#, fuzzy
+msgstr "Холодный"
+
 msgid "Confident"
-msgstr "Конфликт"
-
-#, fuzzy
+msgstr "Уверенный"
+
 msgid "Confused"
-msgstr "Продолжить"
-
-#, fuzzy
+msgstr "Обескураженный"
+
 msgid "Contemplative"
-msgstr "Контакт"
-
-#, fuzzy
+msgstr "Задумчивый"
+
 msgid "Contented"
-msgstr "Соединение установлено"
-
-#, fuzzy
+msgstr "Довольный"
+
 msgid "Cranky"
-msgstr "Компания"
+msgstr "Капризный"
 
 msgid "Crazy"
-msgstr ""
-
-#, fuzzy
+msgstr "Сумасшедший"
+
 msgid "Creative"
-msgstr "Создать"
-
-#, fuzzy
+msgstr "Творческий"
+
 msgid "Curious"
-msgstr "Великолепный"
-
-#, fuzzy
+msgstr "Любопытный"
+
 msgid "Dejected"
-msgstr "Отклонено"
-
-#, fuzzy
+msgstr "Удручённый"
+
 msgid "Depressed"
-msgstr "Удалено"
-
-#, fuzzy
+msgstr "Подавленный"
+
 msgid "Disappointed"
-msgstr "Соединение разорвано."
+msgstr "Разочарованный"
 
 msgid "Disgusted"
-msgstr ""
-
-#, fuzzy
+msgstr "Отвращающий"
+
 msgid "Dismayed"
-msgstr "Отключено"
-
-#, fuzzy
+msgstr "Встревоженный"
+
 msgid "Distracted"
-msgstr "Независимый"
+msgstr "Рассеянный"
 
 msgid "Embarrassed"
-msgstr ""
-
-#, fuzzy
+msgstr "Стеснительный"
+
 msgid "Envious"
-msgstr "Озабоченный"
+msgstr "Завистливый"
 
 msgid "Excited"
 msgstr "Возбуждённый"
@@ -5469,9 +5445,8 @@
 msgid "Other Locations"
 msgstr "Местоположение пользователя"
 
-#, fuzzy
 msgid "You can sign out from other locations here"
-msgstr "Вы уже откуда-то подключены"
+msgstr "Здесь Вы можете отключиться из других мест"
 
 #. TODO: Due to limitations in our current request field API, the
 #. following string will show up with a trailing colon.  This should
@@ -5479,18 +5454,16 @@
 #. a separate purple_request_field_label_new_without_colon function,
 #. or by never automatically adding the colon and requiring that
 #. callers add the colon themselves.
-#, fuzzy
 msgid "You are not signed in from any other locations."
-msgstr "Вы уже откуда-то подключены"
-
-#, fuzzy
+msgstr "Вы ниоткуда не вошли в сеть."
+
 msgid "Allow multiple logins?"
-msgstr "Разрешить одновременный вход с разных мест"
+msgstr "Разрешить одновременные входы с разных мест?"
 
 msgid ""
 "Do you want to allow or disallow connecting from multiple locations "
 "simultaneously?"
-msgstr ""
+msgstr "Вы разрешаете одновременный вход в сеть из разных мест или нет?"
 
 msgid "Allow"
 msgstr "Разрешить"
@@ -5812,12 +5785,11 @@
 msgid "Show custom smileys"
 msgstr "Показать свои смайлики"
 
-#, fuzzy
 msgid "Allow direct connections"
-msgstr "Не удаётся создать соединение"
+msgstr "Разрешить прямые соединения"
 
 msgid "Allow connecting from multiple locations"
-msgstr ""
+msgstr "Разрешить соединения из нескольких мест"
 
 msgid "nudge: nudge a user to get their attention"
 msgstr "подталкивание: подтолкнуть пользователя, чтобы привлечь его внимание"
@@ -5825,13 +5797,11 @@
 msgid "Windows Live ID authentication:Unable to connect"
 msgstr "Аутентификация Windows Live ID: не могу соединиться"
 
-#, fuzzy
 msgid "Windows Live ID authentication:Invalid response"
-msgstr "Аутентификация Windows Live ID: неверный ответ"
-
-#, fuzzy
+msgstr "Аутентификация Windows Live ID:некорректный ответ"
+
 msgid "The following users are missing from your addressbook"
-msgstr "Следующие пользователи отсутствуют в вашей адресной книге"
+msgstr "Следующие пользователи из вашей адресной книги отсутствуют"
 
 #, c-format
 msgid "Unknown error (%d): %s"
@@ -6043,9 +6013,8 @@
 msgid "The two PINs you entered do not match."
 msgstr "Два введённых PIN-кода не совпадают."
 
-#, fuzzy
 msgid "The Display Name you entered is invalid."
-msgstr "Введённое имя неправильное."
+msgstr "Введённое Вами имя отображения некорректно."
 
 msgid ""
 "The birthday you entered is invalid. The correct format is: 'YYYY-MM-DD'."
@@ -6065,7 +6034,7 @@
 "Информация о вашем профиле ещё не получена. Пожалуйста, попробуйте позже."
 
 msgid "Your UID"
-msgstr ""
+msgstr "Ваш UID"
 
 #. pin
 #. pin (required)
@@ -6128,26 +6097,23 @@
 msgid "Logging In..."
 msgstr "Входит в сеть..."
 
-#, fuzzy
 msgid ""
 "Unable to connect to the MXit server. Please check your server settings."
 msgstr ""
-"Не удаётся соединиться с сервером MXit. Пожалуйста, проверьте ваши настройки "
-"сервера."
+"Не удаётся соединиться с сервером MXit. Пожалуйста, проверьте настройки "
+"вашего сервера."
 
 msgid "Connecting..."
 msgstr "Соединение..."
 
-#, fuzzy
 msgid "The PIN you entered has an invalid length [7-10]."
-msgstr "Введённый ключ SecurID неверный."
+msgstr "Введённый Вами PIN-код неправильной длины [7-10]."
 
 #. mxit login name
 msgid "MXit ID"
-msgstr ""
+msgstr "MXit ID"
 
 #. show the form to the user to complete
-#, fuzzy
 msgid "Register New MXit Account"
 msgstr "Зарегистрировать новую учётную запись MXit"
 
@@ -6212,6 +6178,24 @@
 msgid "Retrieving User Information..."
 msgstr "Получение информации о пользователе..."
 
+#. you were kicked
+#, fuzzy
+msgid "You have been kicked from this MultiMX."
+msgstr "Вас выгнали: (%s)"
+
+#, fuzzy
+msgid "was kicked"
+msgstr "Неверный билет"
+
+#, fuzzy
+msgid "_Room Name:"
+msgstr "_Комната:"
+
+#. Display system message in chat window
+#, fuzzy
+msgid "You have invited"
+msgstr "Вам пришла почта!"
+
 msgid "Loading menu..."
 msgstr "Загрузка меню..."
 
@@ -6241,24 +6225,6 @@
 msgid "Enable splash-screen popup"
 msgstr "Включить контекстное меню экрана-заставки"
 
-#. you were kicked
-#, fuzzy
-msgid "You have been kicked from this MultiMX."
-msgstr "Вас выгнали: (%s)"
-
-#, fuzzy
-msgid "was kicked"
-msgstr "Неверный билет"
-
-#, fuzzy
-msgid "_Room Name:"
-msgstr "_Комната:"
-
-#. Display system message in chat window
-#, fuzzy
-msgid "You have invited"
-msgstr "Вам пришла почта!"
-
 #, fuzzy
 msgid "Last Online"
 msgstr "В сети"
@@ -7047,6 +7013,8 @@
 "You required encryption in your account settings, but one of the servers "
 "doesn't support it."
 msgstr ""
+"Вы запросили шифрование настройками учётной записи, но один из серверов его "
+"не поддерживает"
 
 #. Note to translators: The first %s is a URL, the second is an
 #. error message.
@@ -7054,9 +7022,8 @@
 msgid "Error requesting %s: %s"
 msgstr "Ошибка запроса %s: %s"
 
-#, fuzzy
 msgid "The server returned an empty response"
-msgstr "Не удаётся соединиться: сервер вернул пустой ответ."
+msgstr "Сервер ответил тишиной"
 
 msgid ""
 "Server requested that you fill out a CAPTCHA in order to sign in, but this "
@@ -7365,6 +7332,8 @@
 "You required encryption in your account settings, but encryption is not "
 "supported by your system."
 msgstr ""
+"Вы запросили шифрование настройками учётной записи, но ваша система не "
+"поддерживает его."
 
 #, c-format
 msgid "You may be disconnected shortly.  If so, check %s for updates."
@@ -7973,75 +7942,6 @@
 "Картинок IM. Поскольку ваш IP-адрес будет открыт, это может повлечь угрозу "
 "конфиденциальности."
 
-msgid "Invalid SNAC"
-msgstr "Неверный SNAC"
-
-msgid "Server rate limit exceeded"
-msgstr "Превышен предел скорости сервера"
-
-msgid "Client rate limit exceeded"
-msgstr "Превышен предел скорости клиента"
-
-msgid "Service unavailable"
-msgstr "Служба недоступна"
-
-msgid "Service not defined"
-msgstr "Служба не определена"
-
-msgid "Obsolete SNAC"
-msgstr "Устаревший SNAC"
-
-msgid "Not supported by host"
-msgstr "Не поддерживается узлом"
-
-msgid "Not supported by client"
-msgstr "Не поддерживается клиентом"
-
-msgid "Refused by client"
-msgstr "Отвергнуто клиентом"
-
-msgid "Reply too big"
-msgstr "Ответ слишком велик"
-
-msgid "Responses lost"
-msgstr "Отклики потеряны"
-
-msgid "Request denied"
-msgstr "Запрос отвергнут"
-
-msgid "Busted SNAC payload"
-msgstr "Сломана полезная нагрузка SNAC"
-
-msgid "Insufficient rights"
-msgstr "Недостаточные права"
-
-msgid "In local permit/deny"
-msgstr "В местном разрешении/запрете"
-
-msgid "Warning level too high (sender)"
-msgstr "Уровень предупреждения слишком высок (отправитель)"
-
-msgid "Warning level too high (receiver)"
-msgstr "Уровень предупреждения слишком высок (получатель)"
-
-msgid "User temporarily unavailable"
-msgstr "Пользователь временно недоступен"
-
-msgid "No match"
-msgstr "Нет совпадения"
-
-msgid "List overflow"
-msgstr "Переполнение списка"
-
-msgid "Request ambiguous"
-msgstr "Неясный запрос"
-
-msgid "Queue full"
-msgstr "Очередь полна"
-
-msgid "Not while on AOL"
-msgstr "Не в AOL"
-
 #. Label
 msgid "Buddy Icon"
 msgstr "Значок собеседника"
@@ -8160,58 +8060,122 @@
 msgid "Capabilities"
 msgstr "Возможности"
 
+msgid "Invalid SNAC"
+msgstr "Неверный SNAC"
+
+msgid "Server rate limit exceeded"
+msgstr "Превышен предел скорости сервера"
+
+msgid "Client rate limit exceeded"
+msgstr "Превышен предел скорости клиента"
+
+msgid "Service unavailable"
+msgstr "Служба недоступна"
+
+msgid "Service not defined"
+msgstr "Служба не определена"
+
+msgid "Obsolete SNAC"
+msgstr "Устаревший SNAC"
+
+msgid "Not supported by host"
+msgstr "Не поддерживается узлом"
+
+msgid "Not supported by client"
+msgstr "Не поддерживается клиентом"
+
+msgid "Refused by client"
+msgstr "Отвергнуто клиентом"
+
+msgid "Reply too big"
+msgstr "Ответ слишком велик"
+
+msgid "Responses lost"
+msgstr "Отклики потеряны"
+
+msgid "Request denied"
+msgstr "Запрос отвергнут"
+
+msgid "Busted SNAC payload"
+msgstr "Сломана полезная нагрузка SNAC"
+
+msgid "Insufficient rights"
+msgstr "Недостаточные права"
+
+msgid "In local permit/deny"
+msgstr "В местном разрешении/запрете"
+
+msgid "Warning level too high (sender)"
+msgstr "Уровень предупреждения слишком высок (отправитель)"
+
+msgid "Warning level too high (receiver)"
+msgstr "Уровень предупреждения слишком высок (получатель)"
+
+msgid "User temporarily unavailable"
+msgstr "Пользователь временно недоступен"
+
+msgid "No match"
+msgstr "Нет совпадения"
+
+msgid "List overflow"
+msgstr "Переполнение списка"
+
+msgid "Request ambiguous"
+msgstr "Неясный запрос"
+
+msgid "Queue full"
+msgstr "Очередь полна"
+
+msgid "Not while on AOL"
+msgstr "Не в AOL"
+
 #. Translators: This string is a menu option that, if selected, will cause
 #. you to appear online to the chosen user even when your status is set to
 #. Invisible.
 msgid "Appear Online"
-msgstr "Появляется в сети"
+msgstr "Видимый для всех"
 
 #. Translators: This string is a menu option that, if selected, will cause
 #. you to appear offline to the chosen user when your status is set to
 #. Invisible (this is the default).
-#, fuzzy
 msgid "Don't Appear Online"
-msgstr "Появляется в сети"
+msgstr "Невидимый лишь для избранных"
 
 #. Translators: This string is a menu option that, if selected, will cause
 #. you to always appear offline to the chosen user (even when your status
 #. isn't Invisible).
 msgid "Appear Offline"
-msgstr "Вероятно не в сети"
+msgstr "Невидимый для всех"
 
 #. Translators: This string is a menu option that, if selected, will cause
 #. you to appear offline to the chosen user if you are invisible, and
 #. appear online to the chosen user if you are not invisible (this is the
 #. default).
-#, fuzzy
 msgid "Don't Appear Offline"
-msgstr "Вероятно не в сети"
-
-#, fuzzy
+msgstr "Невидимый для избранных"
+
 msgid "you have no buddies on this list"
-msgstr "Вас выгнали: (%s)"
-
-#, fuzzy, c-format
+msgstr "в этом списке у вас нет собеседников"
+
+#, c-format
 msgid ""
 "You can add a buddy to this list by right-clicking on them and selecting \"%s"
 "\""
 msgstr ""
-"Вы можете запросить авторизацию от этих собеседников повторно, щёлкнув на "
-"них правой кнопкой мыши и выбрав \"Повторный запрос авторизации\"."
-
-#, fuzzy
+"Вы можете добавить собеседника в этот список правым щелчком мыши, выбрав "
+"затем \"%s\""
+
 msgid "Visible List"
-msgstr "Видимый"
+msgstr "Список видимости"
 
 msgid "These buddies will see your status when you switch to \"Invisible\""
-msgstr ""
-
-#, fuzzy
+msgstr "Эти собеседники увидят ваш статус при переключении в \"Невидимый\""
+
 msgid "Invisible List"
-msgstr "Список приглашённых"
+msgstr "Список невидимости"
 
 msgid "These buddies will always see you as offline"
-msgstr ""
+msgstr "Эти собеседники никогда не увидят вас в сети"
 
 msgid "Aquarius"
 msgstr "Водолей"
@@ -8811,14 +8775,14 @@
 msgid "Select Server"
 msgstr "Выберите сервер"
 
-msgid "QQ2005"
-msgstr "QQ2005"
+msgid "QQ2008"
+msgstr "QQ2008"
 
 msgid "QQ2007"
 msgstr "QQ2007"
 
-msgid "QQ2008"
-msgstr "QQ2008"
+msgid "QQ2005"
+msgstr "QQ2005"
 
 msgid "Connect by TCP"
 msgstr "Соединение по TCP"
@@ -11768,9 +11732,8 @@
 msgid "/Tools/Pr_ivacy"
 msgstr "/Средства/К_онфиденциальность"
 
-#, fuzzy
 msgid "/Tools/Set _Mood"
-msgstr "/Средства/Системный _журнал"
+msgstr "/Средства/Установить н_астроение"
 
 msgid "/Tools/_File Transfers"
 msgstr "/Средства/Передача _файлов"
@@ -11791,20 +11754,17 @@
 msgid "/Help/Online _Help"
 msgstr "/Помощь/Помощь в _сети"
 
-#, fuzzy
 msgid "/Help/_Build Information"
-msgstr "Информация о собеседнике"
+msgstr "/Помощь/Информация о с_борке"
 
 msgid "/Help/_Debug Window"
 msgstr "/Помощь/Окно _отладки"
 
-#, fuzzy
 msgid "/Help/De_veloper Information"
-msgstr "Информация о сервере"
-
-#, fuzzy
+msgstr "/Помощь/Информация о разработ_чике"
+
 msgid "/Help/_Translator Information"
-msgstr "Персональная информация"
+msgstr "/Помощь/Информация о перево_дчике"
 
 msgid "/Help/_About"
 msgstr "/Помощь/О _программе"
@@ -12426,9 +12386,6 @@
 msgid "Fatal Error"
 msgstr "Неисправимая ошибка"
 
-msgid "bug master"
-msgstr "мастер глюков"
-
 msgid "artist"
 msgstr "исполнитель"
 
@@ -12611,6 +12568,10 @@
 msgid "Maithili"
 msgstr "Суахили"
 
+#, fuzzy
+msgid "Meadow Mari"
+msgstr "Новая почта"
+
 msgid "Macedonian"
 msgstr "Македонский"
 
@@ -12727,7 +12688,7 @@
 msgid "Lithuanian"
 msgstr "Литовский"
 
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "%s is a messaging client based on libpurple which is capable of connecting "
 "to multiple messaging services at once.  %s is written in C using GTK+.  %s "
@@ -12736,15 +12697,12 @@
 "copyrighted by its contributors, a list of whom is also distributed with "
 "%s.  There is no warranty for %s.<BR><BR>"
 msgstr ""
-"%s - графический модульный клиент обмена сообщениями, основывающийся на "
-"библиотеке libpurple, позволяющей использовать AIM, MSN, Yahoo!, XMPP, ICQ, "
-"IRC, SILC, SIP/SIMPLE, Novell GroupWise, Lotus Sametime, Bonjour, Zephyr, "
-"MySpaceIM, Gadu-Gadu и QQ одновременно.  Написан с использованием GTK+."
-"<BR><BR>Вы можете изменять и распространять программу по условиям GPL "
-"(версии 2 или более поздней).  Копия GPL содержится в файле 'COPYING', "
-"распространяемом с %s.  Авторские права на %s принадлежат участникам "
-"проекта.  Полный список участников проекта смотрите в файле 'COPYRIGHT'.  Мы "
-"не предоставляем никаких гарантий на эту программу.<BR><BR>"
+"%s - клиент обмена сообщениями, основанный на библиотеке libpurple, которая "
+"позволяет одновременно подключаться по нескольким службам. %s написан на С с "
+"использованием GTK+. %s выпущен, и может быть изменён или перераспределён, "
+"по условиям GPL версии 2 (или поздней).  Копия GPL распространяется вместе с "
+"%s. Права на %s защищены его участниками, список которых также "
+"распространяется с %s.  Гарантия на %s не предоставляется. <BR><BR>"
 
 #, c-format
 msgid ""
@@ -12753,8 +12711,11 @@
 "Channel: #pidgin on irc.freenode.net<BR>\tXMPP MUC: devel@conference.pidgin."
 "im<BR><BR>"
 msgstr ""
-
-#, fuzzy, c-format
+"<FONT SIZE=\"4\"><B>Полезные ресурсы</B></FONT><BR>\t<A HREF=\"%s\">Веб-"
+"сайт</A><BR>\t<A HREF=\"%s\">Часто задаваемые вопросы</A><BR>\tIRC канал: "
+"#pidgin на irc.freenode.net<BR>\tXMPP MUC: devel@conference.pidgin.im<BR><BR>"
+
+#, c-format
 msgid ""
 "<font size=\"4\"><b>Help from other Pidgin users</b></font> is available by "
 "e-mailing <a href=\"mailto:support@pidgin.im\">support@pidgin.im</a><br/"
@@ -12764,25 +12725,25 @@
 "welcome to post in another language, but the responses may be less helpful."
 "<br/>"
 msgstr ""
-"<font size=\"4\">Помощь от других пользователей Pidgin:</font> <a href="
-"\"mailto:support@pidgin.im\">support@pidgin.im</a><br/>Это <b>публичная</b> "
-"почтовая рассылка! (<a href=\"http://pidgin.im/pipermail/support/\">архив</"
-"a>)<br/>Мы не можем помочь по сторонним протоколам или модулям!<br/>Основной "
-"язык этой рассылки - <b>английский</b>.  Вы, конечно, можете писать на "
-"другом языке, но ответы могут быть менее полезными.<br/><br/>"
+"<font size=\"4\"><b>Помощь от других пользователей Pidgin</b></font> "
+"доступна по эл.почте <a href=\"mailto:support@pidgin.im\">support@pidgin.im</"
+"a><br/>Это <b>публичная</b> почтовая рассылка! (<a href=\"http://pidgin.im/"
+"pipermail/support/\">архив</a>)<br/>Мы не можем помочь по протоколам или "
+"модулям третьих лиц!<br/>Основной язык этой рассылки - <b>английский</b>.  "
+"Вы, конечно, можете писать на другом языке, но ответы могут оказаться менее "
+"полезными.<br/>"
 
 #, c-format
 msgid "About %s"
 msgstr "О %s"
 
-#, fuzzy
 msgid "Build Information"
-msgstr "Информация о собеседнике"
+msgstr "Информация о сборке"
 
 #. End of not to be translated section
-#, fuzzy, c-format
+#, c-format
 msgid "%s Build Information"
-msgstr "Информация о собеседнике"
+msgstr "Информация о сборке %s"
 
 msgid "Current Developers"
 msgstr "Текущие разработчики"
@@ -13210,7 +13171,7 @@
 msgstr "Уменьшить размер шрифта"
 
 msgid "Font Face"
-msgstr "Облик шрифта"
+msgstr "Вид шрифта"
 
 msgid "Foreground Color"
 msgstr "Цвет текста"
@@ -13224,9 +13185,8 @@
 msgid "Insert Smiley"
 msgstr "Вставить смайлик"
 
-#, fuzzy
 msgid "Send Attention"
-msgstr "Кнопка отправки"
+msgstr "Обратить внимание"
 
 msgid "<b>_Bold</b>"
 msgstr "<b>_Жирный</b>"
@@ -13253,7 +13213,7 @@
 #. * need to update them when formatting changes. The above items don't need
 #. * no updating nor nothin'
 msgid "_Font face"
-msgstr "_Облик шрифта"
+msgstr "_Вид шрифта"
 
 msgid "Foreground _color"
 msgstr "Цвет _текста"
@@ -13405,13 +13365,11 @@
 msgid "Exiting because another libpurple client is already running.\n"
 msgstr "Выхожу, потому что уже запущен другой клиент libpurple.\n"
 
-#, fuzzy
 msgid "_Media"
 msgstr "/_Медиа"
 
-#, fuzzy
 msgid "_Hangup"
-msgstr "Приостановить разговор"
+msgstr "_Удержать звонок"
 
 #, c-format
 msgid "%s wishes to start an audio/video session with you."
@@ -13471,9 +13429,8 @@
 msgid "Dismiss"
 msgstr "Распустить"
 
-#, fuzzy
 msgid "<span weight=\"bold\" size=\"larger\">You have pounced!</span>"
-msgstr "<span weight=\"bold\" size=\"larger\">Вам пришла почта!</span>"
+msgstr "<span weight=\"bold\" size=\"larger\">На вас набросились!</span>"
 
 msgid "The following plugins will be unloaded."
 msgstr "Следующие модули будут выгружены."
@@ -13660,14 +13617,13 @@
 msgstr "Выборы тем"
 
 #. Instructions
-#, fuzzy
 msgid ""
 "Select a theme that you would like to use from the lists below.\n"
 "New themes can be installed by dragging and dropping them onto the theme "
 "list."
 msgstr ""
-"Из списка ниже, выберите тему смайликов, которую вы бы хотели использовать.\n"
-" Новые темы можно установить перетаскиванием их в список тем."
+"Из списка ниже выберите тему, которую вы хотели бы использовать.\n"
+"Новые темы можно установить перетаскиванием их в список тем."
 
 msgid "Buddy List Theme:"
 msgstr "Тема Списка собеседников:"
@@ -13817,9 +13773,8 @@
 msgid "_Enable automatic router port forwarding"
 msgstr "_Разрешить автоматическую переадресацию портов маршрутизатора"
 
-#, fuzzy
 msgid "_Manually specify range of ports to listen on:"
-msgstr "Указать диапазон прослушиваемых портов _вручную"
+msgstr "Указать диапазон прослушивае_мых портов вручную:"
 
 msgid "_Start:"
 msgstr "_Начало:"
@@ -13834,9 +13789,8 @@
 msgid "_TURN server:"
 msgstr "_TURN сервер:"
 
-#, fuzzy
 msgid "_UDP Port:"
-msgstr "П_орт:"
+msgstr "_UDP порт:"
 
 msgid "Use_rname:"
 msgstr "Им_я пользователя:"
@@ -13860,7 +13814,7 @@
 msgstr "Konqueror"
 
 msgid "Google Chrome"
-msgstr ""
+msgstr "Google Chrome"
 
 #. Do not move the line below.  Code below expects gnome-open to be in
 #. * this list immediately after xdg-open!
@@ -13884,11 +13838,11 @@
 
 #. Translators: please do not translate "chromium-browser" here!
 msgid "Chromium (chromium-browser)"
-msgstr ""
+msgstr "Chromium (chromium-browser)"
 
 #. Translators: please do not translate "chrome" here!
 msgid "Chromium (chrome)"
-msgstr ""
+msgstr "Chromium (chrome)"
 
 msgid "Manual"
 msgstr "Другой"
@@ -13931,7 +13885,6 @@
 msgid "Proxy Server"
 msgstr "Прокси-сервер"
 
-#, fuzzy
 msgid "Proxy preferences are configured in GNOME preferences"
 msgstr "Настройки прокси выставляются в настройках GNOME"
 
@@ -14236,13 +14189,11 @@
 msgid "Select Buddy Icon"
 msgstr "Выбрать иконку собеседника"
 
-#, fuzzy
 msgid "Click to change your buddyicon for this account."
-msgstr "Щёлкните, чтобы изменить свою иконку для этой учётной записи."
-
-#, fuzzy
+msgstr "Щёлкните, чтобы изменить иконку для этой учётной записи."
+
 msgid "Click to change your buddyicon for all accounts."
-msgstr "Щёлкните, чтобы изменить свою иконку для всех учётных записей."
+msgstr "Щёлкните, чтобы изменить иконку для всех учётных записей."
 
 msgid "Waiting for network connection"
 msgstr "Ожидание сетевого соединения"
@@ -14260,7 +14211,7 @@
 msgstr "Google-общение"
 
 msgid "Facebook (XMPP)"
-msgstr ""
+msgstr "Facebook (XMPP)"
 
 #, c-format
 msgid "The following error has occurred loading %s: %s"
@@ -14328,13 +14279,12 @@
 msgid "Cannot send launcher"
 msgstr "Нельзя отправить ярлык"
 
-#, fuzzy
 msgid ""
 "You dragged a desktop launcher. Most likely you wanted to send the target of "
 "this launcher instead of this launcher itself."
 msgstr ""
-"Вы перетянули кнопку запуска рабочего стола. Скорее всего вы хотели "
-"отправить то, на что эта кнопка ссылается, а не саму её."
+"Вы перетянули значок запуска с рабочего стола. Скорее всего вы хотели "
+"отправить то, на что этот значок ссылается, а не его самого."
 
 #, c-format
 msgid ""
@@ -14357,7 +14307,6 @@
 msgid "Could not set icon"
 msgstr "Не удалось установить значок"
 
-#, fuzzy
 msgid "_Open Link"
 msgstr "_Открыть ссылку"
 
@@ -14367,28 +14316,23 @@
 msgid "_Copy Email Address"
 msgstr "_Скопировать адрес email"
 
-#, fuzzy
 msgid "_Open File"
-msgstr "Открыть файл..."
-
-#, fuzzy
+msgstr "_Открыть файл"
+
 msgid "Open _Containing Directory"
-msgstr "Открыть содержащий каталог"
+msgstr "Открыть _содержащую папку"
 
 msgid "Save File"
 msgstr "Сохранить файл"
 
-#, fuzzy
 msgid "_Play Sound"
-msgstr "Воспроизвести звук"
-
-#, fuzzy
+msgstr "_Воспроизводить звук"
+
 msgid "_Save File"
-msgstr "Сохранить файл"
-
-#, fuzzy
+msgstr "_Сохранить файл"
+
 msgid "Do you really want to clear?"
-msgstr "Вы действительно хотите удалить %s?"
+msgstr "Вы действительно хотите очистить?"
 
 msgid "Select color"
 msgstr "Выбрать цвет"
@@ -14413,7 +14357,6 @@
 msgid "_Modify..."
 msgstr "_Изменить..."
 
-#, fuzzy
 msgid "_Add..."
 msgstr "_Добавить..."
 
@@ -14438,9 +14381,8 @@
 msgid "Small"
 msgstr "Маленький"
 
-#, fuzzy
 msgid "Smaller versions of the default smileys"
-msgstr "Меньшие версии смайликов по умолчанию"
+msgstr "Уменьшенные версии смайликов по умолчанию"
 
 msgid "Response Probability:"
 msgstr "Вероятность отклика:"
@@ -14628,11 +14570,12 @@
 msgid "Allows browsing and registering services."
 msgstr "Позволяет просматривать и регистрировать службы."
 
-#, fuzzy
 msgid ""
 "This plugin is useful for registering with legacy transports or other XMPP "
 "services."
-msgstr "Этот модуль полезен для отладки XMPP серверов или клиентов."
+msgstr ""
+"Этот модуль полезен для регистрации с базовыми транспортными или другими "
+"XMPP службами."
 
 msgid "By conversation count"
 msgstr "По количеству бесед"
@@ -14934,14 +14877,13 @@
 msgstr "Модуль музыкальной переписки для совместного сочинения"
 
 #. *  summary
-#, fuzzy
 msgid ""
 "The Music Messaging Plugin allows a number of users to simultaneously work "
 "on a piece of music by editing a common score in real-time."
 msgstr ""
-"Модуль музыкальной переписки позволяет нескольким пользователям совместно "
-"работать над кусочком мелодии путём редактирования общих результатов в "
-"реальном времени."
+"Модуль музыкальной переписки позволяет нескольким пользователям одновременно "
+"работать над кусочком мелодии путём редактирования общих данных в реальном "
+"времени."
 
 #. ---------- "Notify For" ----------
 msgid "Notify For"
@@ -14972,7 +14914,6 @@
 msgid "Set window manager \"_URGENT\" hint"
 msgstr "Установить подсказку \"С_РОЧНО\" оконного менеджера"
 
-#, fuzzy
 msgid "_Flash window"
 msgstr "_Мигающее окно"
 
@@ -14981,9 +14922,8 @@
 msgstr "_Поднимать окно беседы"
 
 #. Present conversation method button
-#, fuzzy
 msgid "_Present conversation window"
-msgstr "_Поднимать окно беседы"
+msgstr "_Показать окно беседы"
 
 #. ---------- "Notification Removals" ----------
 msgid "Notification Removal"
@@ -15058,17 +14998,14 @@
 msgid "Hyperlink Color"
 msgstr "Цвет гиперссылки"
 
-#, fuzzy
 msgid "Visited Hyperlink Color"
 msgstr "Цвет посещённой гиперссылки"
 
-#, fuzzy
 msgid "Highlighted Message Name Color"
-msgstr "Цвет надписи подсвеченного сообщения"
-
-#, fuzzy
+msgstr "Цвет имени подсвеченного сообщения"
+
 msgid "Typing Notification Color"
-msgstr "Цвет набора уведомления"
+msgstr "Цвет уведомления о печатании"
 
 msgid "GtkTreeView Horizontal Separation"
 msgstr "Горизонтальное разделение GtkTreeView"
@@ -15076,7 +15013,6 @@
 msgid "Conversation Entry"
 msgstr "Область ввода окна беседы"
 
-#, fuzzy
 msgid "Conversation History"
 msgstr "История общения"
 
@@ -15203,7 +15139,6 @@
 msgstr "Кнопка отправки окна беседы."
 
 #. *< summary
-#, fuzzy
 msgid ""
 "Adds a Send button to the entry area of the conversation window. Intended "
 "for use when no physical keyboard is present."
@@ -15395,21 +15330,19 @@
 msgid "Timestamp Format Options"
 msgstr "Параметры формата времени"
 
-#, fuzzy, c-format
+#, c-format
 msgid "_Force timestamp format:"
-msgstr "_Принудительно использовать 24-часовой формат времени"
-
-#, fuzzy
+msgstr "_Принудительно использовать формат времени:"
+
 msgid "Use system default"
-msgstr "Используемый по умолчанию"
-
-#, fuzzy
+msgstr "Использовать системный по умолчанию"
+
 msgid "12 hour time format"
-msgstr "_Принудительно использовать 24-часовой формат времени"
+msgstr "12-часовой формат времени"
 
 #, fuzzy
 msgid "24 hour time format"
-msgstr "_Принудительно использовать 24-часовой формат времени"
+msgstr "24-часовой формат времени"
 
 msgid "Show dates in..."
 msgstr "Показывать дату..."
@@ -15485,9 +15418,8 @@
 msgid "Voice/Video Settings"
 msgstr "Голосовые/Видео настройки"
 
-#, fuzzy
 msgid "Voice and Video Settings"
-msgstr "Голосовые/Видео настройки"
+msgstr "Голосовые и видео настройки"
 
 #. *< name
 #. *< version
@@ -15757,6 +15689,12 @@
 msgid "You do not have permission to uninstall this application."
 msgstr "У Вас нет прав на удаление этого приложения."
 
+#~ msgid "Automatically reject from users not in buddy list"
+#~ msgstr "Отвергать автоматически от пользователей не из списка собеседников"
+
+#~ msgid "bug master"
+#~ msgstr "мастер глюков"
+
 #, fuzzy
 #~ msgid "An error occurred on the in-band bytestream transfer\n"
 #~ msgstr "Произошла ошибка при передаче внутриполосного потока байт\n"
@@ -15879,12 +15817,11 @@
 #~ msgid "Unable to listen on socket: %s"
 #~ msgstr "Не удаётся прослушивать сокет: %s"
 
-#, fuzzy
 #~ msgid "%s just sent you a Nudge!"
 #~ msgstr "%s просто подтолкнул вас!"
 
 #~ msgid "Friendly name changes too rapidly"
-#~ msgstr "Дружественные изменения именни слишком быстры"
+#~ msgstr "Дружественное имя изменяется слишком быстро"
 
 #~ msgid "This Hotmail account may not be active."
 #~ msgstr "Эта учётная запись горячей почты может быть неактивна."
@@ -15934,13 +15871,12 @@
 #~ msgid "%s has removed you from his or her buddy list."
 #~ msgstr "%s удалил вас из своего списка собеседников."
 
-#, fuzzy
 #~ msgid ""
 #~ "The last action you attempted could not be performed because you are over "
 #~ "the rate limit. Please wait 10 seconds and try again.\n"
 #~ msgstr ""
 #~ "Последнее предпринятое вами действие не может быть выполнено, так как вы "
-#~ "превысили предел. Подождите 10 секунд и попытайтесь снова."
+#~ "превысили предел частоты. Пожалуйста, попробуйте снова через 10 секунд."
 
 #~ msgid ""
 #~ "<FONT SIZE=\"4\">FAQ:</FONT> <A HREF=\"http://developer.pidgin.im/wiki/FAQ"
@@ -15949,13 +15885,11 @@
 #~ "<FONT SIZE=\"4\">ЧаВо:</FONT> <A HREF=\"http://developer.pidgin.im/wiki/"
 #~ "FAQ\">http://developer.pidgin.im/wiki/FAQ</A><BR/><BR/>"
 
-#, fuzzy
 #~ msgid ""
 #~ "<FONT SIZE=\"4\">IRC Channel:</FONT> #pidgin on irc.freenode.net<BR><BR>"
 #~ msgstr ""
 #~ "<FONT SIZE=\"4\">IRC канал:</FONT> #pidgin на irc.freenode.net<BR><BR>"
 
-#, fuzzy
 #~ msgid "<FONT SIZE=\"4\">XMPP MUC:</FONT> devel@conference.pidgin.im<BR><BR>"
 #~ msgstr ""
 #~ "<FONT SIZE=\"4\">XMPP MUC:</FONT> devel@conference.pidgin.im<BR><BR>"
--- a/po/stats.pl	Tue Dec 21 21:05:26 2010 +0900
+++ b/po/stats.pl	Sat Feb 12 04:17:09 2011 +0900
@@ -32,6 +32,7 @@
 $lang{en_CA} = "English (Canadian)";
 $lang{en_GB} = "English (British)";
 $lang{mai} = "Maithili";
+$lang{mhr} = "Meadow Mari";
 $lang{ms_MY} = "Malay";
 $lang{my_MM} = "Burmese (Myanmar)";
 $lang{pt_BR} = "Portuguese (Brazilian)";
--- a/po/ta.po	Tue Dec 21 21:05:26 2010 +0900
+++ b/po/ta.po	Sat Feb 12 04:17:09 2011 +0900
@@ -19,7 +19,7 @@
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"Plural-Forms: Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
 "X-Poedit-Country: INDIA\n"
 "X-Generator: Lokalize 1.0\n"
 "X-Poedit-Bookmarks: -1,470,-1,-1,-1,-1,-1,-1,-1,1715\n"
--- a/po/uk.po	Tue Dec 21 21:05:26 2010 +0900
+++ b/po/uk.po	Sat Feb 12 04:17:09 2011 +0900
@@ -3,14 +3,14 @@
 # This file is distributed under the same license as the Pidgin package.
 #
 # Maxim V. Dziumanenko <mvd@mylinux.com.ua>, 2004-2005.
-# Oleksandr Kovalenko <alx.kovalenko@gmail.com>, 2009-2010.
+# Oleksandr Kovalenko <alx.kovalenko@gmail.com>, 2009-2011.
 #
 msgid ""
 msgstr ""
 "Project-Id-Version: Pidgin\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-12-19 13:34-0500\n"
-"PO-Revision-Date: 2010-11-17 22:25+0300\n"
+"POT-Creation-Date: 2011-02-02 23:34-0500\n"
+"PO-Revision-Date: 2011-01-30 21:27+0300\n"
 "Last-Translator: Oleksandr Kovalenko <alx.kovalenko@gmail.com>\n"
 "Language-Team: Ukrainian <uk@li.org>\n"
 "Language: uk\n"
@@ -2360,8 +2360,12 @@
 "Шлях де зберігати файли\n"
 "(Будь ласка, вкажіть повний шлях)"
 
-msgid "Automatically reject from users not in buddy list"
-msgstr "Автоматично відхилити від користувачів, які не в переліку контактів"
+msgid ""
+"When a file-transfer request arrives from a user who is\n"
+"*not* on your buddy list:"
+msgstr ""
+"Коли запит на передавання файлу надходить від користувача,\n"
+"який *не* в вашому переліку контактів"
 
 msgid ""
 "Notify with a popup when an autoaccepted file transfer is complete\n"
@@ -2374,6 +2378,9 @@
 msgid "Create a new directory for each user"
 msgstr "Створити нову теку для кожного користувача"
 
+msgid "Escape the filenames"
+msgstr "Екранувати назви файлів"
+
 msgid "Notes"
 msgstr "Примітки"
 
@@ -3832,7 +3839,10 @@
 msgstr ""
 "Сервер вимагає автентифікацію звичайним текстом через нешифрований потік"
 
-#. This should never happen!
+#. This happens when the server sends back jibberish
+#. * in the "additional data with success" case.
+#. * Seen with Wildfire 3.0.1.
+#.
 msgid "Invalid response from server"
 msgstr "Неправильна відповідь від сервера"
 
@@ -5433,18 +5443,18 @@
 #. a separate purple_request_field_label_new_without_colon function,
 #. or by never automatically adding the colon and requiring that
 #. callers add the colon themselves.
-#, fuzzy
 msgid "You are not signed in from any other locations."
-msgstr "Ви увійшли з іншого місця"
-
-#, fuzzy
+msgstr "Ви не увійшли з жодного іншого місцезнаходження."
+
 msgid "Allow multiple logins?"
-msgstr "Дозволити декілька екземплярів"
+msgstr "Дозволити декілька входів?"
 
 msgid ""
 "Do you want to allow or disallow connecting from multiple locations "
 "simultaneously?"
 msgstr ""
+"Ви хочете дозволити чи заборонити з'єднання з декількох місцезнаходжень "
+"одночасно?"
 
 msgid "Allow"
 msgstr "Дозволити"
@@ -5547,9 +5557,8 @@
 msgid "Enable/Disable Mobile Devices..."
 msgstr "Увімкнути чи вимкнути мобільні пристрої..."
 
-#, fuzzy
 msgid "Allow/Disallow Multiple Logins..."
-msgstr "Дозволити чи заборонити мобільні сторінки..."
+msgstr "Дозволити/Заборонити декілька входів..."
 
 msgid "Allow/Disallow Mobile Pages..."
 msgstr "Дозволити чи заборонити мобільні сторінки..."
@@ -5771,7 +5780,7 @@
 msgstr "Дозволити прямі з'єднання"
 
 msgid "Allow connecting from multiple locations"
-msgstr ""
+msgstr "Дозволити з'єднання з декількох місцезнаходжень"
 
 msgid "nudge: nudge a user to get their attention"
 msgstr "nudge: штовхнути користувача, щоб привернути його увагу"
@@ -6142,6 +6151,20 @@
 msgid "Retrieving User Information..."
 msgstr "Отримання відомостей про користувача..."
 
+#. you were kicked
+msgid "You have been kicked from this MultiMX."
+msgstr "Вас викинули з цього MultiMX."
+
+msgid "was kicked"
+msgstr "був викинутий"
+
+msgid "_Room Name:"
+msgstr "_Назва кімнати:"
+
+#. Display system message in chat window
+msgid "You have invited"
+msgstr "Вас запросили"
+
 msgid "Loading menu..."
 msgstr "Завантаження меню..."
 
@@ -6169,20 +6192,6 @@
 msgid "Enable splash-screen popup"
 msgstr "Увімкнути виринаючу екранну заставку"
 
-#. you were kicked
-msgid "You have been kicked from this MultiMX."
-msgstr "Вас викинули з цього MultiMX."
-
-msgid "was kicked"
-msgstr "був викинутий"
-
-msgid "_Room Name:"
-msgstr "_Назва кімнати:"
-
-#. Display system message in chat window
-msgid "You have invited"
-msgstr "Вас запросили"
-
 msgid "Last Online"
 msgstr "Востаннє в мережі"
 
@@ -6964,9 +6973,8 @@
 msgid "Error requesting %s: %s"
 msgstr "Помилка запиту %s: %s"
 
-#, fuzzy
 msgid "The server returned an empty response"
-msgstr "Не вдається з'єднатися. Сервер повертає порожню відповідь."
+msgstr "Сервер повернув порожню відповідь"
 
 msgid ""
 "Server requested that you fill out a CAPTCHA in order to sign in, but this "
@@ -7872,75 +7880,6 @@
 "та є необхідним для передавання зображень. Так як ваша ІР адреса буде "
 "розкрита, це може вважатись загрозою безпеці."
 
-msgid "Invalid SNAC"
-msgstr "Неправильний SNAC"
-
-msgid "Server rate limit exceeded"
-msgstr "Досягнуто обмеження швидкості сервера"
-
-msgid "Client rate limit exceeded"
-msgstr "Досягнуто обмеження швидкості клієнта"
-
-msgid "Service unavailable"
-msgstr "Послуга недоступна"
-
-msgid "Service not defined"
-msgstr "Послуга не визначена"
-
-msgid "Obsolete SNAC"
-msgstr "Застарілий SNAC"
-
-msgid "Not supported by host"
-msgstr "Не підтримується вузлом"
-
-msgid "Not supported by client"
-msgstr "Не підтримується клієнтом"
-
-msgid "Refused by client"
-msgstr "Відкинута клієнтом"
-
-msgid "Reply too big"
-msgstr "Відповідь завелика"
-
-msgid "Responses lost"
-msgstr "Відповіді втрачені"
-
-msgid "Request denied"
-msgstr "Запит відхилений"
-
-msgid "Busted SNAC payload"
-msgstr "Зіпсовані дані SNAC"
-
-msgid "Insufficient rights"
-msgstr "Недостатньо прав"
-
-msgid "In local permit/deny"
-msgstr "В місцевому переліку дозволених/заборонених"
-
-msgid "Warning level too high (sender)"
-msgstr "Рівень попередження дуже високий (відправник)"
-
-msgid "Warning level too high (receiver)"
-msgstr "Рівень попередження дуже високий (отримувач)"
-
-msgid "User temporarily unavailable"
-msgstr "Користувач тимчасово недоступний"
-
-msgid "No match"
-msgstr "Немає збігів"
-
-msgid "List overflow"
-msgstr "Перелік переповнений"
-
-msgid "Request ambiguous"
-msgstr "Запит незрозумілий"
-
-msgid "Queue full"
-msgstr "Черга переповнена"
-
-msgid "Not while on AOL"
-msgstr "Не тоді, коли у AOL"
-
 #. Label
 msgid "Buddy Icon"
 msgstr "Значок користувача"
@@ -8059,6 +7998,75 @@
 msgid "Capabilities"
 msgstr "Можливості"
 
+msgid "Invalid SNAC"
+msgstr "Неправильний SNAC"
+
+msgid "Server rate limit exceeded"
+msgstr "Досягнуто обмеження швидкості сервера"
+
+msgid "Client rate limit exceeded"
+msgstr "Досягнуто обмеження швидкості клієнта"
+
+msgid "Service unavailable"
+msgstr "Послуга недоступна"
+
+msgid "Service not defined"
+msgstr "Послуга не визначена"
+
+msgid "Obsolete SNAC"
+msgstr "Застарілий SNAC"
+
+msgid "Not supported by host"
+msgstr "Не підтримується вузлом"
+
+msgid "Not supported by client"
+msgstr "Не підтримується клієнтом"
+
+msgid "Refused by client"
+msgstr "Відкинута клієнтом"
+
+msgid "Reply too big"
+msgstr "Відповідь завелика"
+
+msgid "Responses lost"
+msgstr "Відповіді втрачені"
+
+msgid "Request denied"
+msgstr "Запит відхилений"
+
+msgid "Busted SNAC payload"
+msgstr "Зіпсовані дані SNAC"
+
+msgid "Insufficient rights"
+msgstr "Недостатньо прав"
+
+msgid "In local permit/deny"
+msgstr "В місцевому переліку дозволених/заборонених"
+
+msgid "Warning level too high (sender)"
+msgstr "Рівень попередження дуже високий (відправник)"
+
+msgid "Warning level too high (receiver)"
+msgstr "Рівень попередження дуже високий (отримувач)"
+
+msgid "User temporarily unavailable"
+msgstr "Користувач тимчасово недоступний"
+
+msgid "No match"
+msgstr "Немає збігів"
+
+msgid "List overflow"
+msgstr "Перелік переповнений"
+
+msgid "Request ambiguous"
+msgstr "Запит незрозумілий"
+
+msgid "Queue full"
+msgstr "Черга переповнена"
+
+msgid "Not while on AOL"
+msgstr "Не тоді, коли у AOL"
+
 #. Translators: This string is a menu option that, if selected, will cause
 #. you to appear online to the chosen user even when your status is set to
 #. Invisible.
@@ -8650,14 +8658,14 @@
 msgid "Select Server"
 msgstr "Виберіть сервер"
 
-msgid "QQ2005"
-msgstr "QQ2005"
+msgid "QQ2008"
+msgstr "QQ2008"
 
 msgid "QQ2007"
 msgstr "QQ2007"
 
-msgid "QQ2008"
-msgstr "QQ2008"
+msgid "QQ2005"
+msgstr "QQ2005"
 
 msgid "Connect by TCP"
 msgstr "З'єднання по TCP"
@@ -12224,9 +12232,6 @@
 msgid "Fatal Error"
 msgstr "Фатальна помилка"
 
-msgid "bug master"
-msgstr "спеціаліст з вад"
-
 msgid "artist"
 msgstr "виконавець"
 
@@ -12406,6 +12411,9 @@
 msgid "Maithili"
 msgstr "Майтхілі"
 
+msgid "Meadow Mari"
+msgstr "Луговомарійська"
+
 msgid "Macedonian"
 msgstr "Македонська"
 
@@ -14035,7 +14043,7 @@
 msgstr "Google Talk"
 
 msgid "Facebook (XMPP)"
-msgstr ""
+msgstr "Facebook (XMPP)"
 
 #, c-format
 msgid "The following error has occurred loading %s: %s"
@@ -15506,5 +15514,11 @@
 msgid "You do not have permission to uninstall this application."
 msgstr "Ви не маєте права на видалення цієї програми."
 
+#~ msgid "bug master"
+#~ msgstr "спеціаліст з вад"
+
+#~ msgid "Automatically reject from users not in buddy list"
+#~ msgstr "Автоматично відхилити від користувачів, які не в переліку контактів"
+
 #~ msgid "Error requesting %s"
 #~ msgstr "Помилка запиту %s"
--- a/po/zh_HK.po	Tue Dec 21 21:05:26 2010 +0900
+++ b/po/zh_HK.po	Sat Feb 12 04:17:09 2011 +0900
@@ -1,14 +1,14 @@
 # NOTE: This file is generated from zh_TW.po by mkzhhk.pl,v 1.27 2010/12/17 01:08:13 acli Exp
 # ---
 # Pidgin's Traditional Chinese translation
-# Copyright (C) 2002-2010, Paladin R. Liu <paladin@ms1.hinet.net>
-# Copyright (C) 2003-2010, Ambrose C. Li <ambrose.li@gmail.com>
+# Copyright (C) 2002-2011, Paladin R. Liu <paladin@ms1.hinet.net>
+# Copyright (C) 2003-2011, Ambrose C. Li <ambrose.li@gmail.com>
 #
 # PLEASE DO NOT ATTEMPT TO UPDATE THIS FILE IF THERE ARE NO
 # LINE NUMBERS (LINES BEGINNING WITH #:) IN THIS FILE.
 #
 # This file is distributed under the same license as the "Pidgin" package.
-# $InternalId: zh_TW.po,v 1.659 2010/12/17 03:16:38 acli Exp $
+# $InternalId: zh_TW.po,v 1.661 2011/02/01 04:45:39 acli Exp $
 #
 # ----------------------------------------------------------
 # For internal use only:
@@ -60,9 +60,9 @@
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: Pidgin 2.7.8\n"
+"Project-Id-Version: Pidgin 2.7.9\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-12-19 13:34-0500\n"
+"POT-Creation-Date: 2011-02-02 23:34-0500\n"
 "PO-Revision-Date: 2010-12-16 19:32-0500\n"
 "Last-Translator: Ambrose Li <ambrose.li@gmail.com>\n"
 "Language-Team: Chinese (Hong Kong) <community@linuxhall.org>\n"
@@ -2439,8 +2439,10 @@
 "檔案儲存路徑\n"
 "(請提供完整路徑)"
 
-msgid "Automatically reject from users not in buddy list"
-msgstr "自動拒絕非來自好友清單中的使用者"
+msgid ""
+"When a file-transfer request arrives from a user who is\n"
+"*not* on your buddy list:"
+msgstr "當一個不在你好友清單內的使用者要求檔案傳輸時"
 
 msgid ""
 "Notify with a popup when an autoaccepted file transfer is complete\n"
@@ -2453,6 +2455,9 @@
 msgid "Create a new directory for each user"
 msgstr "給每個使用者建立該使用者專用的目綠"
 
+msgid "Escape the filenames"
+msgstr "逸出檔案名稱中的特別字符"
+
 msgid "Notes"
 msgstr "備註"
 
@@ -3920,7 +3925,10 @@
 msgid "Server requires plaintext authentication over an unencrypted stream"
 msgstr "伺服器需要經由未經加密的串流進行明文認證"
 
-#. This should never happen!
+#. This happens when the server sends back jibberish
+#. * in the "additional data with success" case.
+#. * Seen with Wildfire 3.0.1.
+#.
 msgid "Invalid response from server"
 msgstr "伺服器送來了無效的回應"
 
@@ -6434,6 +6442,21 @@
 msgid "Retrieving User Information..."
 msgstr "讀取使用者資訊中..."
 
+#. you were kicked
+msgid "You have been kicked from this MultiMX."
+msgstr "你已經從MultiMX中被踢出。"
+
+msgid "was kicked"
+msgstr "被踢出"
+
+msgid "_Room Name:"
+msgstr "聊天室名稱(_R):"
+
+# NOTE 很差的原文,其實整合上下文後是「You have invited: %s」(%s 是被邀請者)
+#. Display system message in chat window
+msgid "You have invited"
+msgstr "你邀請了"
+
 msgid "Loading menu..."
 msgstr "載入清單中..."
 
@@ -6462,21 +6485,6 @@
 msgid "Enable splash-screen popup"
 msgstr "啟用啟動畫面彈出視窗"
 
-#. you were kicked
-msgid "You have been kicked from this MultiMX."
-msgstr "你已經從MultiMX中被踢出。"
-
-msgid "was kicked"
-msgstr "被踢出"
-
-msgid "_Room Name:"
-msgstr "聊天室名稱(_R):"
-
-# NOTE 很差的原文,其實整合上下文後是「You have invited: %s」(%s 是被邀請者)
-#. Display system message in chat window
-msgid "You have invited"
-msgstr "你邀請了"
-
 msgid "Last Online"
 msgstr "最近上線"
 
@@ -8126,90 +8134,6 @@
 "這個要求將會在兩部電腦間建立起直接連線,而這是在傳送即時訊息圖像時所必須的。"
 "這樣將會曝露你的 IP 位址,因此可能會有私隱方面的風險。"
 
-msgid "Invalid SNAC"
-msgstr "無效的 SNAC"
-
-msgid "Server rate limit exceeded"
-msgstr "超出了伺服器端的速率上限"
-
-msgid "Client rate limit exceeded"
-msgstr "超出了用戶端的速率上限"
-
-# NOTE SNAC 錯誤代碼5,見 http://iserverd.khstu.ru/oscar/errorlist.html
-# NOTE 應係指給定了一個已定義的服務 (Service, Family),但因某種原因,伺服器暫時無法提供該服務
-msgid "Service unavailable"
-msgstr "服務不存在"
-
-msgid "Service not defined"
-msgstr "服務未定義"
-
-# XXX 譯文有待改進 - acli 20100809
-msgid "Obsolete SNAC"
-msgstr "已作廢的舊式 SNAC"
-
-msgid "Not supported by host"
-msgstr "伺服器不支援"
-
-msgid "Not supported by client"
-msgstr "用戶端不支援"
-
-msgid "Refused by client"
-msgstr "被用戶端拒絕"
-
-# XXX 譯文有待改進 - acli 20100809
-msgid "Reply too big"
-msgstr "回應太大"
-
-msgid "Responses lost"
-msgstr "遺失回應"
-
-msgid "Request denied"
-msgstr "請求被拒"
-
-# NOTE SNAC 錯誤代碼14 (0x0e),見 http://iserverd.khstu.ru/oscar/errorlist.html,指 SNAC 負載內出現了格式上的錯誤
-# XXX 譯文有待改進 - acli 20100809
-msgid "Busted SNAC payload"
-msgstr "畸型的 SNAC 負載"
-
-msgid "Insufficient rights"
-msgstr "權限不夠"
-
-# NOTE SNAC 錯誤代碼16 (0x10),見 http://iserverd.khstu.ru/oscar/errorlist.html
-# XXX 譯文有待改進 - acli 20100809
-msgid "In local permit/deny"
-msgstr "在本地端的允許/拒絕清單內"
-
-# NOTE SNAC 錯誤代碼17 (0x11),見 http://iserverd.khstu.ru/oscar/errorlist.html,參見其他涉及「warning level」的譯文
-msgid "Warning level too high (sender)"
-msgstr "(發送者)警告等級過高"
-
-# NOTE SNAC 錯誤代碼18 (0x12),見 http://iserverd.khstu.ru/oscar/errorlist.html,參見其他涉及「warning level」的譯文
-msgid "Warning level too high (receiver)"
-msgstr "(接收者)警告等級過高"
-
-msgid "User temporarily unavailable"
-msgstr "使用者暫時不在線上"
-
-msgid "No match"
-msgstr "沒有相符的記錄"
-
-# NOTE SNAC 錯誤代碼21 (0x15),見 http://iserverd.khstu.ru/oscar/errorlist.html
-# NOTE OSCAR 協定至少有三種「List」,譯成「好友清單」可能不對
-msgid "List overflow"
-msgstr "清單已滿"
-
-msgid "Request ambiguous"
-msgstr "不明確的請求"
-
-msgid "Queue full"
-msgstr "佇列已滿"
-
-# NOTE SNAC 錯誤代碼24 (0x18),見 http://iserverd.khstu.ru/oscar/errorlist.html
-# NOTE 可能是指在 AOL 裏要求了一種 ICQ 的服務
-# XXX 譯文有待改進 - acli 20100809
-msgid "Not while on AOL"
-msgstr "不適合於 AOL"
-
 #. Label
 msgid "Buddy Icon"
 msgstr "好友圖示"
@@ -8344,6 +8268,90 @@
 msgid "Capabilities"
 msgstr "兼容性"
 
+msgid "Invalid SNAC"
+msgstr "無效的 SNAC"
+
+msgid "Server rate limit exceeded"
+msgstr "超出了伺服器端的速率上限"
+
+msgid "Client rate limit exceeded"
+msgstr "超出了用戶端的速率上限"
+
+# NOTE SNAC 錯誤代碼5,見 http://iserverd.khstu.ru/oscar/errorlist.html
+# NOTE 應係指給定了一個已定義的服務 (Service, Family),但因某種原因,伺服器暫時無法提供該服務
+msgid "Service unavailable"
+msgstr "服務不存在"
+
+msgid "Service not defined"
+msgstr "服務未定義"
+
+# XXX 譯文有待改進 - acli 20100809
+msgid "Obsolete SNAC"
+msgstr "已作廢的舊式 SNAC"
+
+msgid "Not supported by host"
+msgstr "伺服器不支援"
+
+msgid "Not supported by client"
+msgstr "用戶端不支援"
+
+msgid "Refused by client"
+msgstr "被用戶端拒絕"
+
+# XXX 譯文有待改進 - acli 20100809
+msgid "Reply too big"
+msgstr "回應太大"
+
+msgid "Responses lost"
+msgstr "遺失回應"
+
+msgid "Request denied"
+msgstr "請求被拒"
+
+# NOTE SNAC 錯誤代碼14 (0x0e),見 http://iserverd.khstu.ru/oscar/errorlist.html,指 SNAC 負載內出現了格式上的錯誤
+# XXX 譯文有待改進 - acli 20100809
+msgid "Busted SNAC payload"
+msgstr "畸型的 SNAC 負載"
+
+msgid "Insufficient rights"
+msgstr "權限不夠"
+
+# NOTE SNAC 錯誤代碼16 (0x10),見 http://iserverd.khstu.ru/oscar/errorlist.html
+# XXX 譯文有待改進 - acli 20100809
+msgid "In local permit/deny"
+msgstr "在本地端的允許/拒絕清單內"
+
+# NOTE SNAC 錯誤代碼17 (0x11),見 http://iserverd.khstu.ru/oscar/errorlist.html,參見其他涉及「warning level」的譯文
+msgid "Warning level too high (sender)"
+msgstr "(發送者)警告等級過高"
+
+# NOTE SNAC 錯誤代碼18 (0x12),見 http://iserverd.khstu.ru/oscar/errorlist.html,參見其他涉及「warning level」的譯文
+msgid "Warning level too high (receiver)"
+msgstr "(接收者)警告等級過高"
+
+msgid "User temporarily unavailable"
+msgstr "使用者暫時不在線上"
+
+msgid "No match"
+msgstr "沒有相符的記錄"
+
+# NOTE SNAC 錯誤代碼21 (0x15),見 http://iserverd.khstu.ru/oscar/errorlist.html
+# NOTE OSCAR 協定至少有三種「List」,譯成「好友清單」可能不對
+msgid "List overflow"
+msgstr "清單已滿"
+
+msgid "Request ambiguous"
+msgstr "不明確的請求"
+
+msgid "Queue full"
+msgstr "佇列已滿"
+
+# NOTE SNAC 錯誤代碼24 (0x18),見 http://iserverd.khstu.ru/oscar/errorlist.html
+# NOTE 可能是指在 AOL 裏要求了一種 ICQ 的服務
+# XXX 譯文有待改進 - acli 20100809
+msgid "Not while on AOL"
+msgstr "不適合於 AOL"
+
 #  NOTE 這四個字串在 Oscar (ICQ) 的解釋在此:http://pidgin.im/pipermail/translators/2010-November/000554.html
 #  NOTE Oscar: 把好友新增到 Visible List 內
 #  NOTE Yahoo: 狀態為「隱身」時,對某指定的好友報稱上線
@@ -8988,14 +8996,14 @@
 msgid "Select Server"
 msgstr "選擇伺服器"
 
-msgid "QQ2005"
-msgstr "QQ2005"
+msgid "QQ2008"
+msgstr "QQ2008"
 
 msgid "QQ2007"
 msgstr "QQ2007"
 
-msgid "QQ2008"
-msgstr "QQ2008"
+msgid "QQ2005"
+msgstr "QQ2005"
 
 msgid "Connect by TCP"
 msgstr "使用 TCP 連線"
@@ -12626,10 +12634,6 @@
 msgid "Fatal Error"
 msgstr "嚴重錯誤訊息"
 
-# XXX 暫譯 - 20090226 acli
-msgid "bug master"
-msgstr "除錯主管"
-
 # NOTE 這個「artist」(有別於其他的「Artist」字串)係指設計pidgin圖示的「graphic designer」,絕對不可譯成「藝人」
 msgid "artist"
 msgstr "平面設計"
@@ -12835,6 +12839,11 @@
 msgid "Maithili"
 msgstr "邁蒂利文"
 
+#  NOTE 代碼 mhr,一種芬蘭語系的東歐語文,維基百科譯「平地馬里語」
+#  XXX 找不到正式的台灣譯文,參閱 http://zh.wikipedia.org/zh/马里语
+msgid "Meadow Mari"
+msgstr "平地馬里文"
+
 #  NOTE「馬其頓文」是一種東歐語文,跟希臘的馬其頓並無關係
 msgid "Macedonian"
 msgstr "馬其頓文"
@@ -16027,6 +16036,13 @@
 msgid "You do not have permission to uninstall this application."
 msgstr "你沒有權限移除程式。"
 
+#~ msgid "Automatically reject from users not in buddy list"
+#~ msgstr "自動拒絕非來自好友清單中的使用者"
+
+# XXX 暫譯 - 20090226 acli
+#~ msgid "bug master"
+#~ msgstr "除錯主管"
+
 #~ msgid "An error occurred on the in-band bytestream transfer\n"
 #~ msgstr "帶內位元組流傳輸途中發生錯誤\n"
 
--- a/po/zh_TW.po	Tue Dec 21 21:05:26 2010 +0900
+++ b/po/zh_TW.po	Sat Feb 12 04:17:09 2011 +0900
@@ -1,12 +1,12 @@
 # Pidgin's Traditional Chinese translation
-# Copyright (C) 2002-2010, Paladin R. Liu <paladin@ms1.hinet.net>
-# Copyright (C) 2003-2010, Ambrose C. Li <ambrose.li@gmail.com>
+# Copyright (C) 2002-2011, Paladin R. Liu <paladin@ms1.hinet.net>
+# Copyright (C) 2003-2011, Ambrose C. Li <ambrose.li@gmail.com>
 #
 # PLEASE DO NOT ATTEMPT TO UPDATE THIS FILE IF THERE ARE NO
 # LINE NUMBERS (LINES BEGINNING WITH #:) IN THIS FILE.
 #
 # This file is distributed under the same license as the "Pidgin" package.
-# $InternalId: zh_TW.po,v 1.659 2010/12/17 03:16:38 acli Exp $
+# $InternalId: zh_TW.po,v 1.661 2011/02/01 04:45:39 acli Exp $
 #
 # ----------------------------------------------------------
 # For internal use only:
@@ -58,9 +58,9 @@
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: Pidgin 2.7.8\n"
+"Project-Id-Version: Pidgin 2.7.9\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2010-12-19 13:34-0500\n"
+"POT-Creation-Date: 2011-02-02 23:34-0500\n"
 "PO-Revision-Date: 2010-12-16 19:32-0500\n"
 "Last-Translator: Ambrose Li <ambrose.li@gmail.com>\n"
 "Language-Team: Chinese (Traditional) <zh-l10n@linux.org.tw>\n"
@@ -2437,8 +2437,10 @@
 "檔案儲存路徑\n"
 "(請提供完整路徑)"
 
-msgid "Automatically reject from users not in buddy list"
-msgstr "自動拒絕非來自好友清單中的使用者"
+msgid ""
+"When a file-transfer request arrives from a user who is\n"
+"*not* on your buddy list:"
+msgstr "當一個不在您好友清單內的使用者要求檔案傳輸時"
 
 msgid ""
 "Notify with a popup when an autoaccepted file transfer is complete\n"
@@ -2451,6 +2453,9 @@
 msgid "Create a new directory for each user"
 msgstr "給每個使用者建立該使用者專用的目綠"
 
+msgid "Escape the filenames"
+msgstr "逸出檔案名稱中的特別字元"
+
 msgid "Notes"
 msgstr "備註"
 
@@ -3918,7 +3923,10 @@
 msgid "Server requires plaintext authentication over an unencrypted stream"
 msgstr "伺服器需要經由未經加密的串流進行明文認證"
 
-#. This should never happen!
+#. This happens when the server sends back jibberish
+#. * in the "additional data with success" case.
+#. * Seen with Wildfire 3.0.1.
+#.
 msgid "Invalid response from server"
 msgstr "伺服器送來了無效的回應"
 
@@ -6432,6 +6440,21 @@
 msgid "Retrieving User Information..."
 msgstr "讀取使用者資訊中..."
 
+#. you were kicked
+msgid "You have been kicked from this MultiMX."
+msgstr "您已經從MultiMX中被踢出。"
+
+msgid "was kicked"
+msgstr "被踢出"
+
+msgid "_Room Name:"
+msgstr "聊天室名稱(_R):"
+
+# NOTE 很差的原文,其實整合上下文後是「You have invited: %s」(%s 是被邀請者)
+#. Display system message in chat window
+msgid "You have invited"
+msgstr "您邀請了"
+
 msgid "Loading menu..."
 msgstr "載入清單中..."
 
@@ -6460,21 +6483,6 @@
 msgid "Enable splash-screen popup"
 msgstr "啟用啟動畫面彈出視窗"
 
-#. you were kicked
-msgid "You have been kicked from this MultiMX."
-msgstr "您已經從MultiMX中被踢出。"
-
-msgid "was kicked"
-msgstr "被踢出"
-
-msgid "_Room Name:"
-msgstr "聊天室名稱(_R):"
-
-# NOTE 很差的原文,其實整合上下文後是「You have invited: %s」(%s 是被邀請者)
-#. Display system message in chat window
-msgid "You have invited"
-msgstr "您邀請了"
-
 msgid "Last Online"
 msgstr "最後上線"
 
@@ -8124,90 +8132,6 @@
 "這個要求將會在兩部電腦間建立起直接連線,而這是在傳送即時訊息影像時所必須的。"
 "這樣將會曝露您的 IP 位址,因此可能會有隱私方面的風險。"
 
-msgid "Invalid SNAC"
-msgstr "無效的 SNAC"
-
-msgid "Server rate limit exceeded"
-msgstr "超出了伺服器端的速率上限"
-
-msgid "Client rate limit exceeded"
-msgstr "超出了用戶端的速率上限"
-
-# NOTE SNAC 錯誤代碼5,見 http://iserverd.khstu.ru/oscar/errorlist.html
-# NOTE 應係指給定了一個已定義的服務 (Service, Family),但因某種原因,伺服器暫時無法提供該服務
-msgid "Service unavailable"
-msgstr "服務不存在"
-
-msgid "Service not defined"
-msgstr "服務未定義"
-
-# XXX 譯文有待改進 - acli 20100809
-msgid "Obsolete SNAC"
-msgstr "已作廢的舊式 SNAC"
-
-msgid "Not supported by host"
-msgstr "伺服器不支援"
-
-msgid "Not supported by client"
-msgstr "用戶端不支援"
-
-msgid "Refused by client"
-msgstr "被用戶端拒絕"
-
-# XXX 譯文有待改進 - acli 20100809
-msgid "Reply too big"
-msgstr "回應太大"
-
-msgid "Responses lost"
-msgstr "遺失回應"
-
-msgid "Request denied"
-msgstr "請求被拒"
-
-# NOTE SNAC 錯誤代碼14 (0x0e),見 http://iserverd.khstu.ru/oscar/errorlist.html,指 SNAC 負載內出現了格式上的錯誤
-# XXX 譯文有待改進 - acli 20100809
-msgid "Busted SNAC payload"
-msgstr "畸型的 SNAC 負載"
-
-msgid "Insufficient rights"
-msgstr "權限不夠"
-
-# NOTE SNAC 錯誤代碼16 (0x10),見 http://iserverd.khstu.ru/oscar/errorlist.html
-# XXX 譯文有待改進 - acli 20100809
-msgid "In local permit/deny"
-msgstr "在本地端的允許/拒絕清單內"
-
-# NOTE SNAC 錯誤代碼17 (0x11),見 http://iserverd.khstu.ru/oscar/errorlist.html,參見其他涉及「warning level」的譯文
-msgid "Warning level too high (sender)"
-msgstr "(發送者)警告等級過高"
-
-# NOTE SNAC 錯誤代碼18 (0x12),見 http://iserverd.khstu.ru/oscar/errorlist.html,參見其他涉及「warning level」的譯文
-msgid "Warning level too high (receiver)"
-msgstr "(接收者)警告等級過高"
-
-msgid "User temporarily unavailable"
-msgstr "使用者暫時不在線上"
-
-msgid "No match"
-msgstr "沒有相符的記錄"
-
-# NOTE SNAC 錯誤代碼21 (0x15),見 http://iserverd.khstu.ru/oscar/errorlist.html
-# NOTE OSCAR 協定至少有三種「List」,譯成「好友清單」可能不對
-msgid "List overflow"
-msgstr "清單已滿"
-
-msgid "Request ambiguous"
-msgstr "不明確的請求"
-
-msgid "Queue full"
-msgstr "佇列已滿"
-
-# NOTE SNAC 錯誤代碼24 (0x18),見 http://iserverd.khstu.ru/oscar/errorlist.html
-# NOTE 可能是指在 AOL 裏要求了一種 ICQ 的服務
-# XXX 譯文有待改進 - acli 20100809
-msgid "Not while on AOL"
-msgstr "不適合於 AOL"
-
 #. Label
 msgid "Buddy Icon"
 msgstr "好友圖示"
@@ -8342,6 +8266,90 @@
 msgid "Capabilities"
 msgstr "相容性"
 
+msgid "Invalid SNAC"
+msgstr "無效的 SNAC"
+
+msgid "Server rate limit exceeded"
+msgstr "超出了伺服器端的速率上限"
+
+msgid "Client rate limit exceeded"
+msgstr "超出了用戶端的速率上限"
+
+# NOTE SNAC 錯誤代碼5,見 http://iserverd.khstu.ru/oscar/errorlist.html
+# NOTE 應係指給定了一個已定義的服務 (Service, Family),但因某種原因,伺服器暫時無法提供該服務
+msgid "Service unavailable"
+msgstr "服務不存在"
+
+msgid "Service not defined"
+msgstr "服務未定義"
+
+# XXX 譯文有待改進 - acli 20100809
+msgid "Obsolete SNAC"
+msgstr "已作廢的舊式 SNAC"
+
+msgid "Not supported by host"
+msgstr "伺服器不支援"
+
+msgid "Not supported by client"
+msgstr "用戶端不支援"
+
+msgid "Refused by client"
+msgstr "被用戶端拒絕"
+
+# XXX 譯文有待改進 - acli 20100809
+msgid "Reply too big"
+msgstr "回應太大"
+
+msgid "Responses lost"
+msgstr "遺失回應"
+
+msgid "Request denied"
+msgstr "請求被拒"
+
+# NOTE SNAC 錯誤代碼14 (0x0e),見 http://iserverd.khstu.ru/oscar/errorlist.html,指 SNAC 負載內出現了格式上的錯誤
+# XXX 譯文有待改進 - acli 20100809
+msgid "Busted SNAC payload"
+msgstr "畸型的 SNAC 負載"
+
+msgid "Insufficient rights"
+msgstr "權限不夠"
+
+# NOTE SNAC 錯誤代碼16 (0x10),見 http://iserverd.khstu.ru/oscar/errorlist.html
+# XXX 譯文有待改進 - acli 20100809
+msgid "In local permit/deny"
+msgstr "在本地端的允許/拒絕清單內"
+
+# NOTE SNAC 錯誤代碼17 (0x11),見 http://iserverd.khstu.ru/oscar/errorlist.html,參見其他涉及「warning level」的譯文
+msgid "Warning level too high (sender)"
+msgstr "(發送者)警告等級過高"
+
+# NOTE SNAC 錯誤代碼18 (0x12),見 http://iserverd.khstu.ru/oscar/errorlist.html,參見其他涉及「warning level」的譯文
+msgid "Warning level too high (receiver)"
+msgstr "(接收者)警告等級過高"
+
+msgid "User temporarily unavailable"
+msgstr "使用者暫時不在線上"
+
+msgid "No match"
+msgstr "沒有相符的記錄"
+
+# NOTE SNAC 錯誤代碼21 (0x15),見 http://iserverd.khstu.ru/oscar/errorlist.html
+# NOTE OSCAR 協定至少有三種「List」,譯成「好友清單」可能不對
+msgid "List overflow"
+msgstr "清單已滿"
+
+msgid "Request ambiguous"
+msgstr "不明確的請求"
+
+msgid "Queue full"
+msgstr "佇列已滿"
+
+# NOTE SNAC 錯誤代碼24 (0x18),見 http://iserverd.khstu.ru/oscar/errorlist.html
+# NOTE 可能是指在 AOL 裏要求了一種 ICQ 的服務
+# XXX 譯文有待改進 - acli 20100809
+msgid "Not while on AOL"
+msgstr "不適合於 AOL"
+
 #  NOTE 這四個字串在 Oscar (ICQ) 的解釋在此:http://pidgin.im/pipermail/translators/2010-November/000554.html
 #  NOTE Oscar: 把好友新增到 Visible List 內
 #  NOTE Yahoo: 狀態為「隱身」時,對某指定的好友報稱上線
@@ -8986,14 +8994,14 @@
 msgid "Select Server"
 msgstr "選擇伺服器"
 
-msgid "QQ2005"
-msgstr "QQ2005"
+msgid "QQ2008"
+msgstr "QQ2008"
 
 msgid "QQ2007"
 msgstr "QQ2007"
 
-msgid "QQ2008"
-msgstr "QQ2008"
+msgid "QQ2005"
+msgstr "QQ2005"
 
 msgid "Connect by TCP"
 msgstr "使用 TCP 連線"
@@ -12620,10 +12628,6 @@
 msgid "Fatal Error"
 msgstr "嚴重錯誤訊息"
 
-# XXX 暫譯 - 20090226 acli
-msgid "bug master"
-msgstr "除錯主管"
-
 # NOTE 這個「artist」(有別於其他的「Artist」字串)係指設計pidgin圖示的「graphic designer」,絕對不可譯成「藝人」
 msgid "artist"
 msgstr "平面設計"
@@ -12829,6 +12833,11 @@
 msgid "Maithili"
 msgstr "邁蒂利文"
 
+#  NOTE 代碼 mhr,一種芬蘭語系的東歐語文,維基百科譯「平地馬里語」
+#  XXX 找不到正式的台灣譯文,參閱 http://zh.wikipedia.org/zh/马里语
+msgid "Meadow Mari"
+msgstr "平地馬里文"
+
 #  NOTE「馬其頓文」是一種東歐語文,跟希臘的馬其頓並無關係
 msgid "Macedonian"
 msgstr "馬其頓文"
@@ -16021,6 +16030,13 @@
 msgid "You do not have permission to uninstall this application."
 msgstr "您沒有權限移除程式。"
 
+#~ msgid "Automatically reject from users not in buddy list"
+#~ msgstr "自動拒絕非來自好友清單中的使用者"
+
+# XXX 暫譯 - 20090226 acli
+#~ msgid "bug master"
+#~ msgstr "除錯主管"
+
 #~ msgid "An error occurred on the in-band bytestream transfer\n"
 #~ msgstr "帶內位元組流傳輸途中發生錯誤\n"
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/share/ca-certs/AddTrust_External_Root.pem	Sat Feb 12 04:17:09 2011 +0900
@@ -0,0 +1,25 @@
+-----BEGIN CERTIFICATE-----
+MIIENjCCAx6gAwIBAgIBATANBgkqhkiG9w0BAQUFADBvMQswCQYDVQQGEwJTRTEU
+MBIGA1UEChMLQWRkVHJ1c3QgQUIxJjAkBgNVBAsTHUFkZFRydXN0IEV4dGVybmFs
+IFRUUCBOZXR3b3JrMSIwIAYDVQQDExlBZGRUcnVzdCBFeHRlcm5hbCBDQSBSb290
+MB4XDTAwMDUzMDEwNDgzOFoXDTIwMDUzMDEwNDgzOFowbzELMAkGA1UEBhMCU0Ux
+FDASBgNVBAoTC0FkZFRydXN0IEFCMSYwJAYDVQQLEx1BZGRUcnVzdCBFeHRlcm5h
+bCBUVFAgTmV0d29yazEiMCAGA1UEAxMZQWRkVHJ1c3QgRXh0ZXJuYWwgQ0EgUm9v
+dDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALf3GjPm8gAELTngTlvt
+H7xsD821+iO2zt6bETOXpClMfZOfvUq8k+0DGuOPz+VtUFrWlymUWoCwSXrbLpX9
+uMq/NzgtHj6RQa1wVsfwTz/oMp50ysiQVOnGXw94nZpAPA6sYapeFI+eh6FqUNzX
+mk6vBbOmcZSccbNQYArHE504B4YCqOmoaSYYkKtMsE8jqzpPhNjfzp/haW+710LX
+a0Tkx63ubUFfclpxCDezeWWkWaCUN/cALw3CknLa0Dhy2xSoRcRdKn23tNbE7qzN
+E0S3ySvdQwAl+mG5aWpYIxG3pzOPVnVZ9c0p10a3CitlttNCbxWyuHv77+ldU9U0
+WicCAwEAAaOB3DCB2TAdBgNVHQ4EFgQUrb2YejS0Jvf6xCZU7wO94CTLVBowCwYD
+VR0PBAQDAgEGMA8GA1UdEwEB/wQFMAMBAf8wgZkGA1UdIwSBkTCBjoAUrb2YejS0
+Jvf6xCZU7wO94CTLVBqhc6RxMG8xCzAJBgNVBAYTAlNFMRQwEgYDVQQKEwtBZGRU
+cnVzdCBBQjEmMCQGA1UECxMdQWRkVHJ1c3QgRXh0ZXJuYWwgVFRQIE5ldHdvcmsx
+IjAgBgNVBAMTGUFkZFRydXN0IEV4dGVybmFsIENBIFJvb3SCAQEwDQYJKoZIhvcN
+AQEFBQADggEBALCb4IUlwtYj4g+WBpKdQZic2YR5gdkeWxQHIzZlj7DYd7usQWxH
+YINRsPkyPef89iYTx4AWpb9a/IfPeHmJIZriTAcKhjW88t5RxNKWt9x+Tu5w/Rw5
+6wwCURQtjr0W4MHfRnXnJK3s9EK0hZNwEGe6nQY1ShjTK3rMUUKhemPR5ruhxSvC
+Nr4TDea9Y355e6cJDUCrat2PisP29owaQgVR1EX1n6diIWgVIEM8med8vSTYqZEX
+c4g/VhsxOBi0cQ+azcgOno4uG+GMmIPLHzHxREzGBHNJdmAPx/i9F4BrLunMTA5a
+mnkPIAou1Z5jJh5VkpTYghdae9C8x49OhgQ=
+-----END CERTIFICATE-----
--- a/share/ca-certs/Makefile.am	Tue Dec 21 21:05:26 2010 +0900
+++ b/share/ca-certs/Makefile.am	Sat Feb 12 04:17:09 2011 +0900
@@ -1,4 +1,5 @@
 CERTIFICATES = \
+		AddTrust_External_Root.pem \
 		America_Online_Root_Certification_Authority_1.pem \
 		CAcert_Root.pem \
 		CAcert_Class3.pem \